diff --git a/.gitignore b/.gitignore
index eba4a7c0..0c09563e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -196,3 +196,5 @@ venv/
output/
.idea
+
+branch/
\ No newline at end of file
diff --git a/Live2D/README.md b/Live2D/README.md
new file mode 100644
index 00000000..a888f525
--- /dev/null
+++ b/Live2D/README.md
@@ -0,0 +1,46 @@
+# CyberWaifu Server - Live2D
+
+## Getting Started
+
+```shell
+cd CyberWaifu/Server/Live2D
+
+python -m http.server
+# http://127.0.0.1:8000
+```
+
+## Custom Live2D Model
+
+Put your Live2D model in `live2d-model/` as a directory
+
+Open `js/bundle.js`
+
+```javascript
+// At Line 1163 (You can also search "Hiyori" in this file to locate)
+// ............
+e.ModelDir = ["Hiyori"]
+// ............
+```
+
+Modify it
+
+```javascript
+e.ModelDir = [""]
+```
+
+Re-run the http server to check if it works properly
+
+```shell
+python -m http.server
+# http://127.0.0.1:8000
+```
+
+## References
+
+[Download Live2D Cubism SDK for Web - Live2D Cubism](https://www.live2d.com/en/download/cubism-sdk/download-web/)
+
+[Live2D Sample Model Collection - Live2D Cubism](https://www.live2d.com/en/download/sample-data/)
+
+......and more, thanks.
+
+*I am because we are.*
diff --git a/Live2D/css/live2d.css b/Live2D/css/live2d.css
new file mode 100644
index 00000000..bfae4eac
--- /dev/null
+++ b/Live2D/css/live2d.css
@@ -0,0 +1,288 @@
+#option1,#option2,#option3 {
+ display: none;
+}
+#controller {
+ position: absolute;
+ right: 50px;
+ top: 10px;
+}
+
+#controller div {
+ background: #ffaaa5;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ cursor: pointer;
+ text-align: center;
+ transition: all .2s linear;
+ margin-top: 10px;
+}
+#controller :first-child {
+ margin-top: 0;
+}
+#controller div:hover {
+ box-shadow: 0px 2px 6px #ccc;
+}
+#controller div span {
+ color: azure;
+ font-size: 14px;
+ line-height: 24px;
+}
+
+#landlord {
+ user-select: none;
+ /* position: fixed;
+ left: 30px;
+ bottom: 0; */
+ z-index: 10000;
+ font-size: 0;
+ transition: all .3s ease-in-out;
+ /* width: 560px;
+ height: 500px; */
+ width: 320px;
+ height: 380px;
+ /* width: 100% !important;
+ height: 100% !important; */
+ margin: 0 auto;
+ background-color: #1E1E1E00;
+}
+
+html{
+ overflow-y: hidden;
+ overflow-x: hidden;
+ margin:0;
+}
+
+body{
+ overflow-y: hidden;
+ overflow-x: hidden;
+ margin:0;
+}
+
+.message {
+ opacity: 0;
+ width: 300px;
+ height: auto;
+ margin: auto;
+ padding: 7px;
+ top: -20px;
+ left: 50%;
+ margin-left: -150px;
+ text-align: center;
+ border: 1px solid rgba(255,137,255,.4);
+ border-radius: 12px;
+ background-color: rgba(255,137,255,.2);
+ box-shadow: 0 3px 15px 2px rgba(255,137,255,.4);
+ font-size: 13px;
+ font-weight: 400;
+ text-overflow: ellipsis;
+ text-transform: uppercase;
+ overflow: hidden;
+ position: absolute;
+ animation-delay: 5s;
+ animation-duration: 50s;
+ animation-iteration-count: infinite;
+ animation-name: shake;
+ animation-timing-function: ease-in-out;
+}
+@keyframes shake {
+ 2% {
+ transform: translate(0.5px, -1.5px) rotate(-0.5deg);
+ }
+
+ 4% {
+ transform: translate(0.5px, 1.5px) rotate(1.5deg);
+ }
+
+ 6% {
+ transform: translate(1.5px, 1.5px) rotate(1.5deg);
+ }
+
+ 8% {
+ transform: translate(2.5px, 1.5px) rotate(0.5deg);
+ }
+
+ 10% {
+ transform: translate(0.5px, 2.5px) rotate(0.5deg);
+ }
+
+ 12% {
+ transform: translate(1.5px, 1.5px) rotate(0.5deg);
+ }
+
+ 14% {
+ transform: translate(0.5px, 0.5px) rotate(0.5deg);
+ }
+
+ 16% {
+ transform: translate(-1.5px, -0.5px) rotate(1.5deg);
+ }
+
+ 18% {
+ transform: translate(0.5px, 0.5px) rotate(1.5deg);
+ }
+
+ 20% {
+ transform: translate(2.5px, 2.5px) rotate(1.5deg);
+ }
+
+ 22% {
+ transform: translate(0.5px, -1.5px) rotate(1.5deg);
+ }
+
+ 24% {
+ transform: translate(-1.5px, 1.5px) rotate(-0.5deg);
+ }
+
+ 26% {
+ transform: translate(1.5px, 0.5px) rotate(1.5deg);
+ }
+
+ 28% {
+ transform: translate(-0.5px, -0.5px) rotate(-0.5deg);
+ }
+
+ 30% {
+ transform: translate(1.5px, -0.5px) rotate(-0.5deg);
+ }
+
+ 32% {
+ transform: translate(2.5px, -1.5px) rotate(1.5deg);
+ }
+
+ 34% {
+ transform: translate(2.5px, 2.5px) rotate(-0.5deg);
+ }
+
+ 36% {
+ transform: translate(0.5px, -1.5px) rotate(0.5deg);
+ }
+
+ 38% {
+ transform: translate(2.5px, -0.5px) rotate(-0.5deg);
+ }
+
+ 40% {
+ transform: translate(-0.5px, 2.5px) rotate(0.5deg);
+ }
+
+ 42% {
+ transform: translate(-1.5px, 2.5px) rotate(0.5deg);
+ }
+
+ 44% {
+ transform: translate(-1.5px, 1.5px) rotate(0.5deg);
+ }
+
+ 46% {
+ transform: translate(1.5px, -0.5px) rotate(-0.5deg);
+ }
+
+ 48% {
+ transform: translate(2.5px, -0.5px) rotate(0.5deg);
+ }
+
+ 50% {
+ transform: translate(-1.5px, 1.5px) rotate(0.5deg);
+ }
+
+ 52% {
+ transform: translate(-0.5px, 1.5px) rotate(0.5deg);
+ }
+
+ 54% {
+ transform: translate(-1.5px, 1.5px) rotate(0.5deg);
+ }
+
+ 56% {
+ transform: translate(0.5px, 2.5px) rotate(1.5deg);
+ }
+
+ 58% {
+ transform: translate(2.5px, 2.5px) rotate(0.5deg);
+ }
+
+ 60% {
+ transform: translate(2.5px, -1.5px) rotate(1.5deg);
+ }
+
+ 62% {
+ transform: translate(-1.5px, 0.5px) rotate(1.5deg);
+ }
+
+ 64% {
+ transform: translate(-1.5px, 1.5px) rotate(1.5deg);
+ }
+
+ 66% {
+ transform: translate(0.5px, 2.5px) rotate(1.5deg);
+ }
+
+ 68% {
+ transform: translate(2.5px, -1.5px) rotate(1.5deg);
+ }
+
+ 70% {
+ transform: translate(2.5px, 2.5px) rotate(0.5deg);
+ }
+
+ 72% {
+ transform: translate(-0.5px, -1.5px) rotate(1.5deg);
+ }
+
+ 74% {
+ transform: translate(-1.5px, 2.5px) rotate(1.5deg);
+ }
+
+ 76% {
+ transform: translate(-1.5px, 2.5px) rotate(1.5deg);
+ }
+
+ 78% {
+ transform: translate(-1.5px, 2.5px) rotate(0.5deg);
+ }
+
+ 80% {
+ transform: translate(-1.5px, 0.5px) rotate(-0.5deg);
+ }
+
+ 82% {
+ transform: translate(-1.5px, 0.5px) rotate(-0.5deg);
+ }
+
+ 84% {
+ transform: translate(-0.5px, 0.5px) rotate(1.5deg);
+ }
+
+ 86% {
+ transform: translate(2.5px, 1.5px) rotate(0.5deg);
+ }
+
+ 88% {
+ transform: translate(-1.5px, 0.5px) rotate(1.5deg);
+ }
+
+ 90% {
+ transform: translate(-1.5px, -0.5px) rotate(-0.5deg);
+ }
+
+ 92% {
+ transform: translate(-1.5px, -1.5px) rotate(1.5deg);
+ }
+
+ 94% {
+ transform: translate(0.5px, 0.5px) rotate(-0.5deg);
+ }
+
+ 96% {
+ transform: translate(2.5px, -0.5px) rotate(-0.5deg);
+ }
+
+ 98% {
+ transform: translate(-1.5px, -1.5px) rotate(-0.5deg);
+ }
+
+ 0%, 100% {
+ transform: translate(0, 0) rotate(0);
+ }
+}
diff --git a/Live2D/font/iconfont.css b/Live2D/font/iconfont.css
new file mode 100644
index 00000000..644350fb
--- /dev/null
+++ b/Live2D/font/iconfont.css
@@ -0,0 +1,273 @@
+@font-face {font-family: "iconfont";
+ src: url('iconfont.eot?t=1592711003559'); /* IE9 */
+ src: url('iconfont.eot?t=1592711003559#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'),
+ url('iconfont.woff?t=1592711003559') format('woff'),
+ url('iconfont.ttf?t=1592711003559') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
+ url('iconfont.svg?t=1592711003559#iconfont') format('svg'); /* iOS 4.1- */
+}
+
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icontixing:before {
+ content: "\e6cc";
+}
+
+.icontixing1:before {
+ content: "\e639";
+}
+
+.icontixing2:before {
+ content: "\e7d1";
+}
+
+.iconqiuxie:before {
+ content: "\e600";
+}
+
+.icontixing3:before {
+ content: "\e762";
+}
+
+.icontixing4:before {
+ content: "\e65f";
+}
+
+.iconicon-:before {
+ content: "\e668";
+}
+
+.iconxinxi:before {
+ content: "\e635";
+}
+
+.iconxinxi1:before {
+ content: "\e62f";
+}
+
+.iconicon-test1:before {
+ content: "\e61e";
+}
+
+.iconxinxi2:before {
+ content: "\e7ad";
+}
+
+.icontuding:before {
+ content: "\e637";
+}
+
+.iconquanjing-m:before {
+ content: "\e616";
+}
+
+.iconvr-m:before {
+ content: "\e617";
+}
+
+.icontag-m:before {
+ content: "\e61b";
+}
+
+.iconhudong:before {
+ content: "\e6f9";
+}
+
+.iconyingxiaohudong:before {
+ content: "\e61c";
+}
+
+.icontool:before {
+ content: "\e64d";
+}
+
+.icontool1:before {
+ content: "\e69f";
+}
+
+.icongongju:before {
+ content: "\e607";
+}
+
+.icongongju1:before {
+ content: "\e605";
+}
+
+.icongongju2:before {
+ content: "\e614";
+}
+
+.icongongju3:before {
+ content: "\e615";
+}
+
+.icongongju4:before {
+ content: "\e60a";
+}
+
+.icongongju5:before {
+ content: "\e608";
+}
+
+.icondownload-1-copy:before {
+ content: "\e60d";
+}
+
+.iconshangchuan:before {
+ content: "\e64a";
+}
+
+.iconshangchuan1:before {
+ content: "\e688";
+}
+
+.iconxiazai:before {
+ content: "\e61d";
+}
+
+.iconxiazai1:before {
+ content: "\e6cd";
+}
+
+.iconxiazai2:before {
+ content: "\e618";
+}
+
+.iconupload-fill:before {
+ content: "\e63e";
+}
+
+.iconxiazai3:before {
+ content: "\e62d";
+}
+
+.iconiconset0343:before {
+ content: "\e6f2";
+}
+
+.icongengxin:before {
+ content: "\e619";
+}
+
+.icongengxin1:before {
+ content: "\e604";
+}
+
+.icongengxin2:before {
+ content: "\e646";
+}
+
+.icongengxin3:before {
+ content: "\e613";
+}
+
+.iconzhuye:before {
+ content: "\e65e";
+}
+
+.iconzhuye1:before {
+ content: "\e627";
+}
+
+.iconzhuye2:before {
+ content: "\e658";
+}
+
+.iconpengyou:before {
+ content: "\e609";
+}
+
+.iconpengyouquan:before {
+ content: "\e61f";
+}
+
+.icontongxun:before {
+ content: "\e60f";
+}
+
+.iconicon-test:before {
+ content: "\e62e";
+}
+
+.icontongxun1:before {
+ content: "\e7c4";
+}
+
+.iconqq:before {
+ content: "\e630";
+}
+
+.iconxin:before {
+ content: "\e6af";
+}
+
+.iconshu:before {
+ content: "\e60c";
+}
+
+.iconshu1:before {
+ content: "\e611";
+}
+
+.iconshu2:before {
+ content: "\e612";
+}
+
+.iconxin1:before {
+ content: "\e60b";
+}
+
+.iconliaotian:before {
+ content: "\e6cb";
+}
+
+.iconhuishouzhan:before {
+ content: "\e61a";
+}
+
+.icontubiaozhizuomoban:before {
+ content: "\e610";
+}
+
+.iconaixin:before {
+ content: "\e654";
+}
+
+.iconfeiji:before {
+ content: "\e90a";
+}
+
+.iconwenjianjia:before {
+ content: "\e73a";
+}
+
+.iconcibiaoquanyi:before {
+ content: "\e671";
+}
+
+.iconz:before {
+ content: "\e631";
+}
+
+.iconbofang:before {
+ content: "\e626";
+}
+
+.iconzanting:before {
+ content: "\e60e";
+}
+
+.icontuodong:before {
+ content: "\e6a8";
+}
+
+.iconqiehuan:before {
+ content: "\e606";
+}
+
diff --git a/Live2D/font/iconfont.eot b/Live2D/font/iconfont.eot
new file mode 100644
index 00000000..aa6beeb3
Binary files /dev/null and b/Live2D/font/iconfont.eot differ
diff --git a/Live2D/font/iconfont.js b/Live2D/font/iconfont.js
new file mode 100644
index 00000000..bf40f017
--- /dev/null
+++ b/Live2D/font/iconfont.js
@@ -0,0 +1 @@
+!function(c){var l,a,h,t,i,o,s,p='',z=(l=document.getElementsByTagName("script"))[l.length-1].getAttribute("data-injectcss");if(z&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}function d(){o||(o=!0,t())}a=function(){var c,l,a,h,t,i=document.createElement("div");i.innerHTML=p,p=null,(c=i.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",l=c,(a=document.body).firstChild?(h=l,(t=a.firstChild).parentNode.insertBefore(h,t)):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(h=function(){document.removeEventListener("DOMContentLoaded",h,!1),a()},document.addEventListener("DOMContentLoaded",h,!1)):document.attachEvent&&(t=a,i=c.document,o=!1,(s=function(){try{i.documentElement.doScroll("left")}catch(c){return void setTimeout(s,50)}d()})(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,d())})}(window);
\ No newline at end of file
diff --git a/Live2D/font/iconfont.json b/Live2D/font/iconfont.json
new file mode 100644
index 00000000..cd5c6c95
--- /dev/null
+++ b/Live2D/font/iconfont.json
@@ -0,0 +1,457 @@
+{
+ "id": "1896869",
+ "name": "utools-live2d",
+ "font_family": "iconfont",
+ "css_prefix_text": "icon",
+ "description": "",
+ "glyphs": [
+ {
+ "icon_id": "673801",
+ "name": "提醒",
+ "font_class": "tixing",
+ "unicode": "e6cc",
+ "unicode_decimal": 59084
+ },
+ {
+ "icon_id": "955123",
+ "name": "提醒",
+ "font_class": "tixing1",
+ "unicode": "e639",
+ "unicode_decimal": 58937
+ },
+ {
+ "icon_id": "4514266",
+ "name": "提醒",
+ "font_class": "tixing2",
+ "unicode": "e7d1",
+ "unicode_decimal": 59345
+ },
+ {
+ "icon_id": "5220745",
+ "name": "球鞋",
+ "font_class": "qiuxie",
+ "unicode": "e600",
+ "unicode_decimal": 58880
+ },
+ {
+ "icon_id": "7122018",
+ "name": "提醒",
+ "font_class": "tixing3",
+ "unicode": "e762",
+ "unicode_decimal": 59234
+ },
+ {
+ "icon_id": "7256999",
+ "name": "提醒",
+ "font_class": "tixing4",
+ "unicode": "e65f",
+ "unicode_decimal": 58975
+ },
+ {
+ "icon_id": "12687407",
+ "name": "球",
+ "font_class": "icon-",
+ "unicode": "e668",
+ "unicode_decimal": 58984
+ },
+ {
+ "icon_id": "356484",
+ "name": "信息",
+ "font_class": "xinxi",
+ "unicode": "e635",
+ "unicode_decimal": 58933
+ },
+ {
+ "icon_id": "2155089",
+ "name": "信息",
+ "font_class": "xinxi1",
+ "unicode": "e62f",
+ "unicode_decimal": 58927
+ },
+ {
+ "icon_id": "3761541",
+ "name": "信息",
+ "font_class": "icon-test1",
+ "unicode": "e61e",
+ "unicode_decimal": 58910
+ },
+ {
+ "icon_id": "5330653",
+ "name": "信息",
+ "font_class": "xinxi2",
+ "unicode": "e7ad",
+ "unicode_decimal": 59309
+ },
+ {
+ "icon_id": "3874045",
+ "name": "图钉",
+ "font_class": "tuding",
+ "unicode": "e637",
+ "unicode_decimal": 58935
+ },
+ {
+ "icon_id": "949686",
+ "name": "全景-互动",
+ "font_class": "quanjing-m",
+ "unicode": "e616",
+ "unicode_decimal": 58902
+ },
+ {
+ "icon_id": "949819",
+ "name": "VR-互动",
+ "font_class": "vr-m",
+ "unicode": "e617",
+ "unicode_decimal": 58903
+ },
+ {
+ "icon_id": "1448532",
+ "name": "内容标签-互动",
+ "font_class": "tag-m",
+ "unicode": "e61b",
+ "unicode_decimal": 58907
+ },
+ {
+ "icon_id": "7424071",
+ "name": "互动",
+ "font_class": "hudong",
+ "unicode": "e6f9",
+ "unicode_decimal": 59129
+ },
+ {
+ "icon_id": "14583236",
+ "name": "营销互动",
+ "font_class": "yingxiaohudong",
+ "unicode": "e61c",
+ "unicode_decimal": 58908
+ },
+ {
+ "icon_id": "1800707",
+ "name": "工具",
+ "font_class": "tool",
+ "unicode": "e64d",
+ "unicode_decimal": 58957
+ },
+ {
+ "icon_id": "1986738",
+ "name": "工具",
+ "font_class": "tool1",
+ "unicode": "e69f",
+ "unicode_decimal": 59039
+ },
+ {
+ "icon_id": "3239730",
+ "name": "工具",
+ "font_class": "gongju",
+ "unicode": "e607",
+ "unicode_decimal": 58887
+ },
+ {
+ "icon_id": "4572454",
+ "name": "工具",
+ "font_class": "gongju1",
+ "unicode": "e605",
+ "unicode_decimal": 58885
+ },
+ {
+ "icon_id": "5073229",
+ "name": "工具",
+ "font_class": "gongju2",
+ "unicode": "e614",
+ "unicode_decimal": 58900
+ },
+ {
+ "icon_id": "8922373",
+ "name": "工具",
+ "font_class": "gongju3",
+ "unicode": "e615",
+ "unicode_decimal": 58901
+ },
+ {
+ "icon_id": "10378109",
+ "name": "工具",
+ "font_class": "gongju4",
+ "unicode": "e60a",
+ "unicode_decimal": 58890
+ },
+ {
+ "icon_id": "12809772",
+ "name": "工具",
+ "font_class": "gongju5",
+ "unicode": "e608",
+ "unicode_decimal": 58888
+ },
+ {
+ "icon_id": "1029205",
+ "name": "下载",
+ "font_class": "download-1-copy",
+ "unicode": "e60d",
+ "unicode_decimal": 58893
+ },
+ {
+ "icon_id": "1703540",
+ "name": "上传",
+ "font_class": "shangchuan",
+ "unicode": "e64a",
+ "unicode_decimal": 58954
+ },
+ {
+ "icon_id": "1766316",
+ "name": "操作-上传-upload",
+ "font_class": "shangchuan1",
+ "unicode": "e688",
+ "unicode_decimal": 59016
+ },
+ {
+ "icon_id": "4166162",
+ "name": "下载",
+ "font_class": "xiazai",
+ "unicode": "e61d",
+ "unicode_decimal": 58909
+ },
+ {
+ "icon_id": "8763665",
+ "name": "下载",
+ "font_class": "xiazai1",
+ "unicode": "e6cd",
+ "unicode_decimal": 59085
+ },
+ {
+ "icon_id": "8767555",
+ "name": "下载",
+ "font_class": "xiazai2",
+ "unicode": "e618",
+ "unicode_decimal": 58904
+ },
+ {
+ "icon_id": "9512690",
+ "name": "上传",
+ "font_class": "upload-fill",
+ "unicode": "e63e",
+ "unicode_decimal": 58942
+ },
+ {
+ "icon_id": "13515730",
+ "name": "下载",
+ "font_class": "xiazai3",
+ "unicode": "e62d",
+ "unicode_decimal": 58925
+ },
+ {
+ "icon_id": "554396",
+ "name": "更新",
+ "font_class": "iconset0343",
+ "unicode": "e6f2",
+ "unicode_decimal": 59122
+ },
+ {
+ "icon_id": "1638603",
+ "name": "更新",
+ "font_class": "gengxin",
+ "unicode": "e619",
+ "unicode_decimal": 58905
+ },
+ {
+ "icon_id": "6318168",
+ "name": "更新",
+ "font_class": "gengxin1",
+ "unicode": "e604",
+ "unicode_decimal": 58884
+ },
+ {
+ "icon_id": "8190093",
+ "name": "更新",
+ "font_class": "gengxin2",
+ "unicode": "e646",
+ "unicode_decimal": 58950
+ },
+ {
+ "icon_id": "11746924",
+ "name": "更新",
+ "font_class": "gengxin3",
+ "unicode": "e613",
+ "unicode_decimal": 58899
+ },
+ {
+ "icon_id": "376667",
+ "name": "主页",
+ "font_class": "zhuye",
+ "unicode": "e65e",
+ "unicode_decimal": 58974
+ },
+ {
+ "icon_id": "2380692",
+ "name": "主页",
+ "font_class": "zhuye1",
+ "unicode": "e627",
+ "unicode_decimal": 58919
+ },
+ {
+ "icon_id": "9540064",
+ "name": "主页",
+ "font_class": "zhuye2",
+ "unicode": "e658",
+ "unicode_decimal": 58968
+ },
+ {
+ "icon_id": "2551724",
+ "name": "朋友",
+ "font_class": "pengyou",
+ "unicode": "e609",
+ "unicode_decimal": 58889
+ },
+ {
+ "icon_id": "2552071",
+ "name": "朋友圈",
+ "font_class": "pengyouquan",
+ "unicode": "e61f",
+ "unicode_decimal": 58911
+ },
+ {
+ "icon_id": "4838216",
+ "name": "通讯",
+ "font_class": "tongxun",
+ "unicode": "e60f",
+ "unicode_decimal": 58895
+ },
+ {
+ "icon_id": "5609564",
+ "name": "通讯",
+ "font_class": "icon-test",
+ "unicode": "e62e",
+ "unicode_decimal": 58926
+ },
+ {
+ "icon_id": "11458205",
+ "name": "通讯",
+ "font_class": "tongxun1",
+ "unicode": "e7c4",
+ "unicode_decimal": 59332
+ },
+ {
+ "icon_id": "813722",
+ "name": "QQ",
+ "font_class": "qq",
+ "unicode": "e630",
+ "unicode_decimal": 58928
+ },
+ {
+ "icon_id": "827984",
+ "name": "心",
+ "font_class": "xin",
+ "unicode": "e6af",
+ "unicode_decimal": 59055
+ },
+ {
+ "icon_id": "2571142",
+ "name": "书",
+ "font_class": "shu",
+ "unicode": "e60c",
+ "unicode_decimal": 58892
+ },
+ {
+ "icon_id": "5163436",
+ "name": "书",
+ "font_class": "shu1",
+ "unicode": "e611",
+ "unicode_decimal": 58897
+ },
+ {
+ "icon_id": "6607926",
+ "name": "书",
+ "font_class": "shu2",
+ "unicode": "e612",
+ "unicode_decimal": 58898
+ },
+ {
+ "icon_id": "7192329",
+ "name": "心",
+ "font_class": "xin1",
+ "unicode": "e60b",
+ "unicode_decimal": 58891
+ },
+ {
+ "icon_id": "8361827",
+ "name": "聊天",
+ "font_class": "liaotian",
+ "unicode": "e6cb",
+ "unicode_decimal": 59083
+ },
+ {
+ "icon_id": "1376050",
+ "name": "回收站",
+ "font_class": "huishouzhan",
+ "unicode": "e61a",
+ "unicode_decimal": 58906
+ },
+ {
+ "icon_id": "1440210",
+ "name": "个人",
+ "font_class": "tubiaozhizuomoban",
+ "unicode": "e610",
+ "unicode_decimal": 58896
+ },
+ {
+ "icon_id": "6185482",
+ "name": "爱心",
+ "font_class": "aixin",
+ "unicode": "e654",
+ "unicode_decimal": 58964
+ },
+ {
+ "icon_id": "12387128",
+ "name": "飞机",
+ "font_class": "feiji",
+ "unicode": "e90a",
+ "unicode_decimal": 59658
+ },
+ {
+ "icon_id": "14145087",
+ "name": "文件夹",
+ "font_class": "wenjianjia",
+ "unicode": "e73a",
+ "unicode_decimal": 59194
+ },
+ {
+ "icon_id": "777253",
+ "name": "词表权益",
+ "font_class": "cibiaoquanyi",
+ "unicode": "e671",
+ "unicode_decimal": 58993
+ },
+ {
+ "icon_id": "5423610",
+ "name": "播放",
+ "font_class": "z",
+ "unicode": "e631",
+ "unicode_decimal": 58929
+ },
+ {
+ "icon_id": "9407947",
+ "name": "播放",
+ "font_class": "bofang",
+ "unicode": "e626",
+ "unicode_decimal": 58918
+ },
+ {
+ "icon_id": "10143249",
+ "name": "暂停",
+ "font_class": "zanting",
+ "unicode": "e60e",
+ "unicode_decimal": 58894
+ },
+ {
+ "icon_id": "1788974",
+ "name": "拖动",
+ "font_class": "tuodong",
+ "unicode": "e6a8",
+ "unicode_decimal": 59048
+ },
+ {
+ "icon_id": "5643521",
+ "name": "切换",
+ "font_class": "qiehuan",
+ "unicode": "e606",
+ "unicode_decimal": 58886
+ }
+ ]
+}
diff --git a/Live2D/font/iconfont.svg b/Live2D/font/iconfont.svg
new file mode 100644
index 00000000..c2f13840
--- /dev/null
+++ b/Live2D/font/iconfont.svg
@@ -0,0 +1,218 @@
+
+
+
+
diff --git a/Live2D/font/iconfont.ttf b/Live2D/font/iconfont.ttf
new file mode 100644
index 00000000..715aea1e
Binary files /dev/null and b/Live2D/font/iconfont.ttf differ
diff --git a/Live2D/font/iconfont.woff b/Live2D/font/iconfont.woff
new file mode 100644
index 00000000..31415028
Binary files /dev/null and b/Live2D/font/iconfont.woff differ
diff --git a/Live2D/font/iconfont.woff2 b/Live2D/font/iconfont.woff2
new file mode 100644
index 00000000..93aa7881
Binary files /dev/null and b/Live2D/font/iconfont.woff2 differ
diff --git a/Live2D/index.html b/Live2D/index.html
new file mode 100644
index 00000000..e83a75c2
--- /dev/null
+++ b/Live2D/index.html
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+ Live2D
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Live2D/index.html.bak b/Live2D/index.html.bak
new file mode 100644
index 00000000..f613951d
--- /dev/null
+++ b/Live2D/index.html.bak
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+ TypeScript HTML App
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
X
+
X
+
X
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Live2D/js/all.min.js b/Live2D/js/all.min.js
new file mode 100644
index 00000000..c1a7041b
--- /dev/null
+++ b/Live2D/js/all.min.js
@@ -0,0 +1,5 @@
+/*!
+ * Font Awesome Free 5.11.2 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */
+!function(){"use strict";var c={},l={};try{"undefined"!=typeof window&&(c=window),"undefined"!=typeof document&&(l=document)}catch(c){}var h=(c.navigator||{}).userAgent,z=void 0===h?"":h,v=c,a=l,m=(v.document,!!a.documentElement&&!!a.head&&"function"==typeof a.addEventListener&&a.createElement,~z.indexOf("MSIE")||z.indexOf("Trident/"),"___FONT_AWESOME___"),s=function(){try{return!0}catch(c){return!1}}();var e=v||{};e[m]||(e[m]={}),e[m].styles||(e[m].styles={}),e[m].hooks||(e[m].hooks={}),e[m].shims||(e[m].shims=[]);var t=e[m];function M(c,z){var l=(2>>0;h--;)l[h]=c[h];return l}function gc(c){return c.classList?bc(c.classList):(c.getAttribute("class")||"").split(" ").filter(function(c){return c})}function Sc(c,l){var h,z=l.split("-"),v=z[0],a=z.slice(1).join("-");return v!==c||""===a||(h=a,~T.indexOf(h))?null:a}function yc(c){return"".concat(c).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function wc(h){return Object.keys(h||{}).reduce(function(c,l){return c+"".concat(l,": ").concat(h[l],";")},"")}function Ac(c){return c.size!==Lc.size||c.x!==Lc.x||c.y!==Lc.y||c.rotate!==Lc.rotate||c.flipX||c.flipY}function kc(c){var l=c.transform,h=c.containerWidth,z=c.iconWidth,v={transform:"translate(".concat(h/2," 256)")},a="translate(".concat(32*l.x,", ").concat(32*l.y,") "),m="scale(".concat(l.size/16*(l.flipX?-1:1),", ").concat(l.size/16*(l.flipY?-1:1),") "),s="rotate(".concat(l.rotate," 0 0)");return{outer:v,inner:{transform:"".concat(a," ").concat(m," ").concat(s)},path:{transform:"translate(".concat(z/2*-1," -256)")}}}var xc={x:0,y:0,width:"100%",height:"100%"};function qc(c){var l=!(1").concat(m.map(Jc).join(""),"").concat(l,">")}var $c=function(){};function cl(c){return"string"==typeof(c.getAttribute?c.getAttribute(Q):null)}var ll={replace:function(c){var l=c[0],h=c[1].map(function(c){return Jc(c)}).join("\n");if(l.parentNode&&l.outerHTML)l.outerHTML=h+(K.keepOriginalSource&&"svg"!==l.tagName.toLowerCase()?"\x3c!-- ".concat(l.outerHTML," --\x3e"):"");else if(l.parentNode){var z=document.createElement("span");l.parentNode.replaceChild(z,l),z.outerHTML=h}},nest:function(c){var l=c[0],h=c[1];if(~gc(l).indexOf(K.replacementClass))return ll.replace(c);var z=new RegExp("".concat(K.familyPrefix,"-.*"));delete h[0].attributes.style,delete h[0].attributes.id;var v=h[0].attributes.class.split(" ").reduce(function(c,l){return l===K.replacementClass||l.match(z)?c.toSvg.push(l):c.toNode.push(l),c},{toNode:[],toSvg:[]});h[0].attributes.class=v.toSvg.join(" ");var a=h.map(function(c){return Jc(c)}).join("\n");l.setAttribute("class",v.toNode.join(" ")),l.setAttribute(Q,""),l.innerHTML=a}};function hl(c){c()}function zl(h,c){var z="function"==typeof c?c:$c;if(0===h.length)z();else{var l=hl;K.mutateApproach===w&&(l=o.requestAnimationFrame||hl),l(function(){var c=!0===K.autoReplaceSvg?ll.replace:ll[K.autoReplaceSvg]||ll.replace,l=Rc.begin("mutate");h.map(c),l(),z()})}}var vl=!1;function al(){vl=!1}var ml=null;function sl(c){if(t&&K.observeMutations){var v=c.treeCallback,a=c.nodeCallback,m=c.pseudoElementsCallback,l=c.observeMutationsRoot,h=void 0===l?V:l;ml=new t(function(c){vl||bc(c).forEach(function(c){if("childList"===c.type&&0> 24,
+ n = (16711680 & i) >> 16,
+ s = 65535 & i,
+ u = i;
+ a.CubismLogInfo("Live2D Cubism Core version: {0}.{1}.{2} ({3})", ("00" + o).slice(-2), ("00" + n).slice(-2), ("0000" + s).slice(-4), u)
+ }
+ return a.CubismLogInfo("CubismFramework.startUp() is complete."), e
+ }, t.cleanUp = function () {
+ e = !1, i = !1, r = null, o = null
+ }, t.initialize = function () {
+ a.CSM_ASSERT(e), e ? i ? a.CubismLogWarning("CubismFramework.initialize() skipped, already initialized.") : (s.staticInitializeNotForClientCall(), o = new u, i = !0, a.CubismLogInfo("CubismFramework.initialize() is complete.")) : a.CubismLogWarning("CubismFramework is not started.")
+ }, t.dispose = function () {
+ a.CSM_ASSERT(e), e ? i ? (s.staticReleaseNotForClientCall(), o.release(), o = null, l.staticRelease(), i = !1, a.CubismLogInfo("CubismFramework.dispose() is complete.")) : a.CubismLogWarning("CubismFramework.dispose() skipped, not initialized.") : a.CubismLogWarning("CubismFramework is not started.")
+ }, t.isStarted = function () {
+ return e
+ }, t.isInitialized = function () {
+ return i
+ }, t.coreLogFunction = function (t) {
+ Live2DCubismCore.Logging.csmGetLogFunction() && Live2DCubismCore.Logging.csmGetLogFunction()(t)
+ }, t.getLoggingLevel = function () {
+ return null != r ? r.loggingLevel : h.LogLevel_Off
+ }, t.getIdManager = function () {
+ return o
+ }, t
+ }();
+ t.CubismFramework = n
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}));
+ var h, p = function () {};
+ e.Option = p,
+ function (t) {
+ t[t.LogLevel_Verbose = 0] = "LogLevel_Verbose", t[t.LogLevel_Debug = 1] = "LogLevel_Debug", t[t.LogLevel_Info = 2] = "LogLevel_Info", t[t.LogLevel_Warning = 3] = "LogLevel_Warning", t[t.LogLevel_Error = 4] = "LogLevel_Error", t[t.LogLevel_Off = 5] = "LogLevel_Off"
+ }(h = e.LogLevel || (e.LogLevel = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ function (t) {
+ var e = function () {
+ function t(t) {
+ void 0 === t && (t = 0), t < 1 ? (this._ptr = [], this._capacity = 0, this._size = 0) : (this._ptr = new Array(t), this._capacity = t, this._size = 0)
+ }
+ return t.prototype.at = function (t) {
+ return this._ptr[t]
+ }, t.prototype.set = function (t, e) {
+ this._ptr[t] = e
+ }, t.prototype.get = function (t) {
+ void 0 === t && (t = 0);
+ for (var e = new Array, i = t; i < this._size; i++) e.push(this._ptr[i]);
+ return e
+ }, t.prototype.pushBack = function (e) {
+ this._size >= this._capacity && this.prepareCapacity(0 == this._capacity ? t.s_defaultSize : 2 * this._capacity), this._ptr[this._size++] = e
+ }, t.prototype.clear = function () {
+ this._ptr.length = 0, this._size = 0
+ }, t.prototype.getSize = function () {
+ return this._size
+ }, t.prototype.assign = function (t, e) {
+ this._size < t && this.prepareCapacity(t);
+ for (var i = 0; i < t; i++) this._ptr[i] = e;
+ this._size = t
+ }, t.prototype.resize = function (t, e) {
+ void 0 === e && (e = null), this.updateSize(t, e, !0)
+ }, t.prototype.updateSize = function (t, e, i) {
+ if (void 0 === e && (e = null), void 0 === i && (i = !0), this._size < t)
+ if (this.prepareCapacity(t), i)
+ for (var r = this._size; r < t; r++) this._ptr[r] = "function" == typeof e ? JSON.parse(JSON.stringify(new e)) : e;
+ else
+ for (r = this._size; r < t; r++) this._ptr[r] = e;
+ else {
+ var o = this._size - t;
+ this._ptr.splice(this._size - o, o)
+ }
+ this._size = t
+ }, t.prototype.insert = function (t, e, i) {
+ var r = t._index,
+ o = e._index,
+ n = i._index,
+ a = n - o;
+ this.prepareCapacity(this._size + a);
+ var s = this._size - r;
+ if (s > 0)
+ for (var u = 0; u < s; u++) this._ptr.splice(r + u, 0, null);
+ for (u = o; u < n; u++, r++) this._ptr[r] = e._vector._ptr[u];
+ this._size = this._size + a
+ }, t.prototype.remove = function (t) {
+ return !(t < 0 || this._size <= t) && (this._ptr.splice(t, 1), --this._size, !0)
+ }, t.prototype.erase = function (t) {
+ var e = t._index;
+ return e < 0 || this._size <= e ? t : (this._ptr.splice(e, 1), --this._size, new i(this, e))
+ }, t.prototype.prepareCapacity = function (t) {
+ t > this._capacity && (0 == this._capacity ? (this._ptr = new Array(t), this._capacity = t) : (this._ptr.length = t, this._capacity = t))
+ }, t.prototype.begin = function () {
+ return 0 == this._size ? this.end() : new i(this, 0)
+ }, t.prototype.end = function () {
+ return new i(this, this._size)
+ }, t.prototype.getOffset = function (e) {
+ var i = new t;
+ return i._ptr = this.get(e), i._size = this.get(e).length, i._capacity = this.get(e).length, i
+ }, t.s_defaultSize = 10, t
+ }();
+ t.csmVector = e;
+ var i = function () {
+ function t(t, e) {
+ this._vector = null != t ? t : null, this._index = null != e ? e : 0
+ }
+ return t.prototype.set = function (t) {
+ return this._index = t._index, this._vector = t._vector, this
+ }, t.prototype.preIncrement = function () {
+ return ++this._index, this
+ }, t.prototype.preDecrement = function () {
+ return --this._index, this
+ }, t.prototype.increment = function () {
+ var e = new t(this._vector, this._index++);
+ return this._vector = e._vector, this._index = e._index, this
+ }, t.prototype.decrement = function () {
+ var e = new t(this._vector, this._index--);
+ return this._vector = e._vector, this._index = e._index, this
+ }, t.prototype.ptr = function () {
+ return this._vector._ptr[this._index]
+ }, t.prototype.substitution = function (t) {
+ return this._index = t._index, this._vector = t._vector, this
+ }, t.prototype.notEqual = function (t) {
+ return this._index != t._index || this._vector != t._vector
+ }, t
+ }();
+ t.iterator = i
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r, o = i(0),
+ n = i(19);
+ e.CubismLogPrint = function (t, e, i) {
+ r.CubismDebug.print(t, "[CSM]" + e, i)
+ }, e.CubismLogPrintIn = function (t, i, r) {
+ e.CubismLogPrint(t, i + "\n", r)
+ }, e.CSM_ASSERT = function (t) {
+ console.assert(t)
+ }, n.CSM_LOG_LEVEL <= n.CSM_LOG_LEVEL_VERBOSE ? (e.CubismLogVerbose = function (t) {
+ for (var i = [], r = 1; r < arguments.length; r++) i[r - 1] = arguments[r];
+ e.CubismLogPrintIn(o.LogLevel.LogLevel_Verbose, "[V]" + t, i)
+ }, e.CubismLogDebug = function (t) {
+ for (var i = [], r = 1; r < arguments.length; r++) i[r - 1] = arguments[r];
+ e.CubismLogPrintIn(o.LogLevel.LogLevel_Debug, "[D]" + t, i)
+ }, e.CubismLogInfo = function (t) {
+ for (var i = [], r = 1; r < arguments.length; r++) i[r - 1] = arguments[r];
+ e.CubismLogPrintIn(o.LogLevel.LogLevel_Info, "[I]" + t, i)
+ }, e.CubismLogWarning = function (t) {
+ for (var i = [], r = 1; r < arguments.length; r++) i[r - 1] = arguments[r];
+ e.CubismLogPrintIn(o.LogLevel.LogLevel_Warning, "[W]" + t, i)
+ }, e.CubismLogError = function (t) {
+ for (var i = [], r = 1; r < arguments.length; r++) i[r - 1] = arguments[r];
+ e.CubismLogPrintIn(o.LogLevel.LogLevel_Error, "[E]" + t, i)
+ }) : n.CSM_LOG_LEVEL == n.CSM_LOG_LEVEL_DEBUG ? (e.CubismLogDebug = function (t) {
+ for (var i = [], r = 1; r < arguments.length; r++) i[r - 1] = arguments[r];
+ e.CubismLogPrintIn(o.LogLevel.LogLevel_Debug, "[D]" + t, i)
+ }, e.CubismLogInfo = function (t) {
+ for (var i = [], r = 1; r < arguments.length; r++) i[r - 1] = arguments[r];
+ e.CubismLogPrintIn(o.LogLevel.LogLevel_Info, "[I]" + t, i)
+ }, e.CubismLogWarning = function (t) {
+ for (var i = [], r = 1; r < arguments.length; r++) i[r - 1] = arguments[r];
+ e.CubismLogPrintIn(o.LogLevel.LogLevel_Warning, "[W]" + t, i)
+ }, e.CubismLogError = function (t) {
+ for (var i = [], r = 1; r < arguments.length; r++) i[r - 1] = arguments[r];
+ e.CubismLogPrintIn(o.LogLevel.LogLevel_Error, "[E]" + t, i)
+ }) : n.CSM_LOG_LEVEL == n.CSM_LOG_LEVEL_INFO ? (e.CubismLogInfo = function (t) {
+ for (var i = [], r = 1; r < arguments.length; r++) i[r - 1] = arguments[r];
+ e.CubismLogPrintIn(o.LogLevel.LogLevel_Info, "[I]" + t, i)
+ }, e.CubismLogWarning = function (t) {
+ for (var i = [], r = 1; r < arguments.length; r++) i[r - 1] = arguments[r];
+ e.CubismLogPrintIn(o.LogLevel.LogLevel_Warning, "[W]" + t, i)
+ }, e.CubismLogError = function (t) {
+ for (var i = [], r = 1; r < arguments.length; r++) i[r - 1] = arguments[r];
+ e.CubismLogPrintIn(o.LogLevel.LogLevel_Error, "[E]" + t, i)
+ }) : n.CSM_LOG_LEVEL == n.CSM_LOG_LEVEL_WARNING ? (e.CubismLogWarning = function (t) {
+ for (var i = [], r = 1; r < arguments.length; r++) i[r - 1] = arguments[r];
+ e.CubismLogPrintIn(o.LogLevel.LogLevel_Warning, "[W]" + t, i)
+ }, e.CubismLogError = function (t) {
+ for (var i = [], r = 1; r < arguments.length; r++) i[r - 1] = arguments[r];
+ e.CubismLogPrintIn(o.LogLevel.LogLevel_Error, "[E]" + t, i)
+ }) : n.CSM_LOG_LEVEL == n.CSM_LOG_LEVEL_ERROR && (e.CubismLogError = function (t) {
+ for (var i = [], r = 1; r < arguments.length; r++) i[r - 1] = arguments[r];
+ e.CubismLogPrintIn(o.LogLevel.LogLevel_Error, "[E]" + t, i)
+ }),
+ function (t) {
+ var e = function () {
+ function t() {}
+ return t.print = function (t, e, i) {
+ if (!(t < o.Live2DCubismFramework.CubismFramework.getLoggingLevel())) {
+ var r = o.Live2DCubismFramework.CubismFramework.coreLogFunction;
+ if (r) r(e.replace(/\{(\d+)\}/g, (function (t, e) {
+ return i[e]
+ })))
+ }
+ }, t.dumpBytes = function (t, e, i) {
+ for (var r = 0; r < i; r++) r % 16 == 0 && r > 0 ? this.print(t, "\n") : r % 8 == 0 && r > 0 && this.print(t, " "), this.print(t, "{0} ", [255 & e[r]]);
+ this.print(t, "\n")
+ }, t
+ }();
+ t.CubismDebug = e
+ }(r = e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ var r, o = this && this.__extends || (r = function (t, e) {
+ return (r = Object.setPrototypeOf || {
+ __proto__: []
+ }
+ instanceof Array && function (t, e) {
+ t.__proto__ = e
+ } || function (t, e) {
+ for (var i in e) e.hasOwnProperty(i) && (t[i] = e[i])
+ })(t, e)
+ }, function (t, e) {
+ function i() {
+ this.constructor = t
+ }
+ r(t, e), t.prototype = null === e ? Object.create(e) : (i.prototype = e.prototype, new i)
+ });
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var n = i(6),
+ a = i(7),
+ s = i(1),
+ u = i(2),
+ l = i(0),
+ h = s.Live2DCubismFramework.csmVector,
+ p = a.Live2DCubismFramework.csmMap,
+ g = n.Live2DCubismFramework.csmString;
+ ! function (t) {
+ var e = function () {
+ function t() {}
+ return t.prototype.getRawString = function (t, e) {
+ return this.getString(t, e)
+ }, t.prototype.toInt = function (t) {
+ return void 0 === t && (t = 0), t
+ }, t.prototype.toFloat = function (t) {
+ return void 0 === t && (t = 0), t
+ }, t.prototype.toBoolean = function (t) {
+ return void 0 === t && (t = !1), t
+ }, t.prototype.getSize = function () {
+ return 0
+ }, t.prototype.getArray = function (t) {
+ return void 0 === t && (t = null), t
+ }, t.prototype.getVector = function (t) {
+ return t
+ }, t.prototype.getMap = function (t) {
+ return t
+ }, t.prototype.getValueByIndex = function (e) {
+ return t.errorValue.setErrorNotForClientCall("Error: type mismatch")
+ }, t.prototype.getValueByString = function (e) {
+ return t.nullValue.setErrorNotForClientCall("Error: type mismatch")
+ }, t.prototype.getKeys = function () {
+ return t.s_dummyKeys
+ }, t.prototype.isError = function () {
+ return !1
+ }, t.prototype.isNull = function () {
+ return !1
+ }, t.prototype.isBool = function () {
+ return !1
+ }, t.prototype.isFloat = function () {
+ return !1
+ }, t.prototype.isString = function () {
+ return !1
+ }, t.prototype.isArray = function () {
+ return !1
+ }, t.prototype.isMap = function () {
+ return !1
+ }, t.prototype.equals = function (t) {
+ return !1
+ }, t.prototype.isStatic = function () {
+ return !1
+ }, t.prototype.setErrorNotForClientCall = function (t) {
+ return s.errorValue
+ }, t.staticInitializeNotForClientCall = function () {
+ n.trueValue = new n(!0), n.falseValue = new n(!1), s.errorValue = new s("ERROR", !0), this.nullValue = new c, t.s_dummyKeys = new h
+ }, t.staticReleaseNotForClientCall = function () {
+ n.trueValue = null, n.falseValue = null, s.errorValue = null, t.nullValue = null, t.s_dummyKeys = null, n.trueValue = null, n.falseValue = null, s.errorValue = null, t.nullValue = null, t.s_dummyKeys = null
+ }, t
+ }();
+ t.Value = e;
+ var i = function () {
+ function t(t, e) {
+ this._error = null, this._lineCount = 0, this._root = null, null != t && this.parseBytes(t, e)
+ }
+ return t.create = function (e, i) {
+ var r = new t;
+ return r.parseBytes(e, i) ? r : (t.delete(r), null)
+ }, t.delete = function (t) {
+ null
+ }, t.prototype.getRoot = function () {
+ return this._root
+ }, t.prototype.arrayBufferToString = function (t) {
+ for (var e = new Uint8Array(t), i = "", r = 0, o = e.length; r < o; ++r) i += "%" + this.pad(e[r].toString(16));
+ return i = decodeURIComponent(i)
+ }, t.prototype.pad = function (t) {
+ return t.length < 2 ? "0" + t : t
+ }, t.prototype.parseBytes = function (t, e) {
+ var i = new Array(1),
+ r = this.arrayBufferToString(t);
+ if (this._root = this.parseValue(r, e, 0, i), this._error) {
+ var o;
+ return o = "Json parse error : @line " + (this._lineCount + 1) + "\n", this._root = new a(o), u.CubismLogInfo("{0}", this._root.getRawString()), !1
+ }
+ return null != this._root || (this._root = new s(new g(this._error), !1), !1)
+ }, t.prototype.getParseError = function () {
+ return this._error
+ }, t.prototype.checkEndOfFile = function () {
+ return this._root.getArray()[1].equals("EOF")
+ }, t.prototype.parseValue = function (t, e, i, o) {
+ if (this._error) return null;
+ for (var s, u = null, h = i; h < e; h++) {
+ switch (t[h]) {
+ case "-":
+ case ".":
+ case "0":
+ case "1":
+ case "2":
+ case "3":
+ case "4":
+ case "5":
+ case "6":
+ case "7":
+ case "8":
+ case "9":
+ var p = new Array(1);
+ return s = l.strtod(t.slice(h), p), o[0] = t.indexOf(p[0]), new r(s);
+ case '"':
+ return new a(this.parseString(t, e, h + 1, o));
+ case "[":
+ return u = this.parseArray(t, e, h + 1, o);
+ case "{":
+ return u = this.parseObject(t, e, h + 1, o);
+ case "n":
+ return h + 3 < e ? (u = new c, o[0] = h + 4) : this._error = "parse null", u;
+ case "t":
+ return h + 3 < e ? (u = n.trueValue, o[0] = h + 4) : this._error = "parse true", u;
+ case "f":
+ return h + 4 < e ? (u = n.falseValue, o[0] = h + 5) : this._error = "illegal ',' position", u;
+ case ",":
+ return this._error = "illegal ',' position", null;
+ case "]":
+ return o[0] = h, null;
+ case "\n":
+ this._lineCount++
+ }
+ }
+ return this._error = "illegal end of value", null
+ }, t.prototype.parseString = function (t, e, i, r) {
+ if (this._error) return null;
+ for (var o = i, n = new g(""), a = i; o < e; o++) switch (t[o]) {
+ case '"':
+ return r[0] = o + 1, n.append(t.slice(a), o - a), n.s;
+ case "//":
+ if (++o - 1 > a && n.append(t.slice(a), o - a), a = o + 1, o < e) switch (t[o]) {
+ case "\\":
+ n.expansion(1, "\\");
+ break;
+ case '"':
+ n.expansion(1, '"');
+ break;
+ case "/":
+ n.expansion(1, "/");
+ break;
+ case "b":
+ n.expansion(1, "\b");
+ break;
+ case "f":
+ n.expansion(1, "\f");
+ break;
+ case "n":
+ n.expansion(1, "\n");
+ break;
+ case "r":
+ n.expansion(1, "\r");
+ break;
+ case "t":
+ n.expansion(1, "\t");
+ break;
+ case "u":
+ this._error = "parse string/unicord escape not supported"
+ } else this._error = "parse string/escape error"
+ }
+ return this._error = "parse string/illegal end", null
+ }, t.prototype.parseObject = function (t, e, i, r) {
+ if (this._error) return null;
+ for (var o = new _, n = "", a = i, s = Array(1), u = !1; a < e; a++) {
+ t: for (; a < e; a++) switch (t[a]) {
+ case '"':
+ if (n = this.parseString(t, e, a + 1, s), this._error) return null;
+ a = s[0], u = !0;
+ break t;
+ case "}":
+ return r[0] = a + 1, o;
+ case ":":
+ this._error = "illegal ':' position";
+ break;
+ case "\n":
+ this._lineCount++
+ }
+ if (!u) return this._error = "key not found",
+ null;u = !1;t: for (; a < e; a++) switch (t[a]) {
+ case ":":
+ u = !0, a++;
+ break t;
+ case "}":
+ this._error = "illegal '}' position";
+ break;
+ case "\n":
+ this._lineCount++
+ }
+ if (!u) return this._error = "':' not found",
+ null;
+ var l = this.parseValue(t, e, a, s);
+ if (this._error) return null;a = s[0],
+ o.put(n, l);t: for (; a < e; a++) switch (t[a]) {
+ case ",":
+ break t;
+ case "}":
+ return r[0] = a + 1, o;
+ case "\n":
+ this._lineCount++
+ }
+ }
+ return this._error = "illegal end of perseObject", null
+ }, t.prototype.parseArray = function (t, e, i, r) {
+ if (this._error) return null;
+ for (var o = new d, n = i, a = new Array(1); n < e; n++) {
+ var s = this.parseValue(t, e, n, a);
+ if (this._error) return null;
+ n = a[0], s && o.add(s);
+ t: for (; n < e; n++) switch (t[n]) {
+ case ",":
+ break t;
+ case "]":
+ return r[0] = n + 1, o;
+ case "\n":
+ ++this._lineCount
+ }
+ }
+ return o = void 0, this._error = "illegal end of parseObject", null
+ }, t
+ }();
+ t.CubismJson = i;
+ var r = function (t) {
+ function e(e) {
+ var i = t.call(this) || this;
+ return i._value = e, i
+ }
+ return o(e, t), e.prototype.isFloat = function () {
+ return !0
+ }, e.prototype.getString = function (t, e) {
+ return this._value = parseFloat("\0"), this._stringBuffer = "\0", this._stringBuffer
+ }, e.prototype.toInt = function (t) {
+ return void 0 === t && (t = 0), parseInt(this._value.toString())
+ }, e.prototype.toFloat = function (t) {
+ return void 0 === t && (t = 0), this._value
+ }, e.prototype.equals = function (t) {
+ return "number" == typeof t && (!Math.round(t) && t == this._value)
+ }, e
+ }(e);
+ t.JsonFloat = r;
+ var n = function (t) {
+ function e(e) {
+ var i = t.call(this) || this;
+ return i._boolValue = e, i
+ }
+ return o(e, t), e.prototype.isBool = function () {
+ return !0
+ }, e.prototype.toBoolean = function (t) {
+ return void 0 === t && (t = !1), this._boolValue
+ }, e.prototype.getString = function (t, e) {
+ return this._stringBuffer = this._boolValue ? "true" : "false", this._stringBuffer
+ }, e.prototype.equals = function (t) {
+ return "boolean" == typeof t && t == this._boolValue
+ }, e.prototype.isStatic = function () {
+ return !0
+ }, e
+ }(e);
+ t.JsonBoolean = n;
+ var a = function (t) {
+ function e(e) {
+ var i = t.call(this) || this;
+ return "string" == typeof e && (i._stringBuffer = e), e instanceof g && (i._stringBuffer = e.s), i
+ }
+ return o(e, t), e.prototype.isString = function () {
+ return !0
+ }, e.prototype.getString = function (t, e) {
+ return this._stringBuffer
+ }, e.prototype.equals = function (t) {
+ return "string" == typeof t ? this._stringBuffer == t : t instanceof g && this._stringBuffer == t.s
+ }, e
+ }(e);
+ t.JsonString = a;
+ var s = function (t) {
+ function e(e, i) {
+ var r = this;
+ return (r = t.call(this, e) || this)._isStatic = i, r
+ }
+ return o(e, t), e.prototype.isStatic = function () {
+ return this._isStatic
+ }, e.prototype.setErrorNotForClientCall = function (t) {
+ return this._stringBuffer = t, this
+ }, e.prototype.isError = function () {
+ return !0
+ }, e
+ }(a);
+ t.JsonError = s;
+ var c = function (t) {
+ function e() {
+ var e = t.call(this) || this;
+ return e._stringBuffer = "NullValue", e
+ }
+ return o(e, t), e.prototype.isNull = function () {
+ return !0
+ }, e.prototype.getString = function (t, e) {
+ return this._stringBuffer
+ }, e.prototype.isStatic = function () {
+ return !0
+ }, e
+ }(e);
+ t.JsonNullvalue = c;
+ var d = function (t) {
+ function i() {
+ var e = t.call(this) || this;
+ return e._array = new h, e
+ }
+ return o(i, t), i.prototype.release = function () {
+ for (var t = this._array.begin(); t.notEqual(this._array.end()); t.preIncrement()) {
+ var e = t.ptr();
+ e && !e.isStatic() && (e = void 0, e = null)
+ }
+ }, i.prototype.isArray = function () {
+ return !0
+ }, i.prototype.getValueByIndex = function (t) {
+ if (t < 0 || this._array.getSize() <= t) return e.errorValue.setErrorNotForClientCall("Error: index out of bounds");
+ var i = this._array.at(t);
+ return null == i ? e.nullValue : i
+ }, i.prototype.getValueByString = function (t) {
+ return e.errorValue.setErrorNotForClientCall("Error: type mismatch")
+ }, i.prototype.getString = function (t, e) {
+ for (var i = e + "[\n", r = this._array.begin(); r.notEqual(this._array.end()); r.increment()) {
+ var o = r.ptr();
+ this._stringBuffer += e + "" + o.getString(e + " ") + "\n"
+ }
+ return this._stringBuffer = i + e + "]\n", this._stringBuffer
+ }, i.prototype.add = function (t) {
+ this._array.pushBack(t)
+ }, i.prototype.getVector = function (t) {
+ return void 0 === t && (t = null), this._array
+ }, i.prototype.getSize = function () {
+ return this._array.getSize()
+ }, i
+ }(e);
+ t.JsonArray = d;
+ var _ = function (t) {
+ function i() {
+ var e = t.call(this) || this;
+ return e._map = new p, e
+ }
+ return o(i, t), i.prototype.release = function () {
+ for (var t = this._map.begin(); t.notEqual(this._map.end());) {
+ var e = t.ptr().second;
+ e && !e.isStatic() && (e = void 0, e = null), t.preIncrement()
+ }
+ }, i.prototype.isMap = function () {
+ return !0
+ }, i.prototype.getValueByString = function (t) {
+ if (t instanceof g) {
+ var i = this._map.getValue(t.s);
+ return null == i ? e.nullValue : i
+ }
+ for (var r = this._map.begin(); r.notEqual(this._map.end()); r.preIncrement())
+ if (r.ptr().first == t) return null == r.ptr().second ? e.nullValue : r.ptr().second;
+ return e.nullValue
+ }, i.prototype.getValueByIndex = function (t) {
+ return e.errorValue.setErrorNotForClientCall("Error: type mismatch")
+ }, i.prototype.getString = function (t, e) {
+ this._stringBuffer = e + "{\n";
+ for (var i = this._map.begin(); i.notEqual(this._map.end());) {
+ var r = i.ptr().first,
+ o = i.ptr().second;
+ this._stringBuffer += e + " " + r + " : " + o.getString(e + " ") + " \n", i.preIncrement()
+ }
+ return this._stringBuffer += e + "}\n", this._stringBuffer
+ }, i.prototype.getMap = function (t) {
+ return this._map
+ }, i.prototype.put = function (t, e) {
+ this._map.setValue(t, e)
+ }, i.prototype.getKeys = function () {
+ if (!this._keys) {
+ this._keys = new h;
+ for (var t = this._map.begin(); t.notEqual(this._map.end());) {
+ var e = t.ptr().first;
+ this._keys.pushBack(e), t.preIncrement()
+ }
+ }
+ return this._keys
+ }, i.prototype.getSize = function () {
+ return this._keys.getSize()
+ }, i
+ }(e);
+ t.JsonMap = _
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ function (t) {
+ var e = function () {
+ function t() {
+ this._tr = new Float32Array(16), this.loadIdentity()
+ }
+ return t.multiply = function (t, e, i) {
+ for (var r = new Float32Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), o = 0; o < 4; ++o)
+ for (var n = 0; n < 4; ++n)
+ for (var a = 0; a < 4; ++a) r[n + 4 * o] += t[a + 4 * o] * e[n + 4 * a];
+ for (o = 0; o < 16; ++o) i[o] = r[o]
+ }, t.prototype.loadIdentity = function () {
+ var t = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
+ this.setMatrix(t)
+ }, t.prototype.setMatrix = function (t) {
+ for (var e = 0; e < 16; ++e) this._tr[e] = t[e]
+ }, t.prototype.getArray = function () {
+ return this._tr
+ }, t.prototype.getScaleX = function () {
+ return this._tr[0]
+ }, t.prototype.getScaleY = function () {
+ return this._tr[5]
+ }, t.prototype.getTranslateX = function () {
+ return this._tr[12]
+ }, t.prototype.getTranslateY = function () {
+ return this._tr[13]
+ }, t.prototype.transformX = function (t) {
+ return this._tr[0] * t + this._tr[12]
+ }, t.prototype.transformY = function (t) {
+ return this._tr[5] * t + this._tr[13]
+ }, t.prototype.invertTransformX = function (t) {
+ return (t - this._tr[12]) / this._tr[0]
+ }, t.prototype.invertTransformY = function (t) {
+ return (t - this._tr[13]) / this._tr[5]
+ }, t.prototype.translateRelative = function (e, i) {
+ var r = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, e, i, 0, 1]);
+ t.multiply(r, this._tr, this._tr)
+ }, t.prototype.translate = function (t, e) {
+ this._tr[12] = t, this._tr[13] = e
+ }, t.prototype.translateX = function (t) {
+ this._tr[12] = t
+ }, t.prototype.translateY = function (t) {
+ this._tr[13] = t
+ }, t.prototype.scaleRelative = function (e, i) {
+ var r = new Float32Array([e, 0, 0, 0, 0, i, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
+ t.multiply(r, this._tr, this._tr)
+ }, t.prototype.scale = function (t, e) {
+ this._tr[0] = t, this._tr[5] = e
+ }, t.prototype.multiplyByMatrix = function (e) {
+ t.multiply(e.getArray(), this._tr, this._tr)
+ }, t.prototype.clone = function () {
+ for (var e = new t, i = 0; i < this._tr.length; i++) e._tr[i] = this._tr[i];
+ return e
+ }, t
+ }();
+ t.CubismMatrix44 = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ var r = this && this.__importStar || function (t) {
+ if (t && t.__esModule) return t;
+ var e = {};
+ if (null != t)
+ for (var i in t) Object.hasOwnProperty.call(t, i) && (e[i] = t[i]);
+ return e.default = t, e
+ };
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var o = i(0),
+ n = o.Live2DCubismFramework.CubismFramework,
+ a = i(22),
+ s = i(11),
+ u = i(49),
+ l = i(14),
+ h = r(i(12));
+ e.canvas = null, e.s_instance = null, e.gl = null, e.frameBuffer = null;
+ var p = function () {
+ function t() {
+ this._captured = !1, this._mouseX = 0, this._mouseY = 0, this._isEnd = !1, this._cubismOption = new o.Option, this._view = new a.LAppView, this._textureManager = new u.LAppTextureManager
+ }
+ return t.getInstance = function () {
+ return null == e.s_instance && (e.s_instance = new t), e.s_instance
+ }, t.releaseInstance = function () {
+ null != e.s_instance && e.s_instance.release(), e.s_instance = null
+ }, t.prototype.initialize = function () {
+ var t = this;
+ return e.canvas = document.getElementById("live2d"), document.nextScene = function () {
+ l.LAppLive2DManager.getInstance().nextScene()
+ }, document.addEventListener("mouseout", this.mouseout, !1), document.live2d_release = function () {
+ e.canvas = null, document.removeEventListener("mouseout", t.mouseout), t.release()
+ }, e.gl = e.canvas.getContext("webgl") || e.canvas.getContext("experimental-webgl"), e.gl ? (e.frameBuffer || (e.frameBuffer = e.gl.getParameter(e.gl.FRAMEBUFFER_BINDING)), e.gl.enable(e.gl.BLEND), e.gl.blendFunc(e.gl.SRC_ALPHA, e.gl.ONE_MINUS_SRC_ALPHA), "ontouchend" in e.canvas ? (e.canvas.ontouchstart = _, e.canvas.ontouchmove = m, e.canvas.ontouchend = f, e.canvas.ontouchcancel = y) : (e.canvas.onmousedown = g, e.canvas.onmousemove = c, e.canvas.onmouseup = d), this._view.initialize(), this.initializeCubism(), !0) : (alert("Cannot initialize WebGL. This browser does not support."), e.gl = null, document.body.innerHTML = "This browser does not support the <canvas>
element.", !1)
+ }, t.prototype.mouseout = function () {
+ l.LAppLive2DManager.getInstance().onDrag(0, 0)
+ }, t.prototype.release = function () {
+ this._textureManager && this._textureManager.release(), this._textureManager = null, this._view && this._view.release(), this._view = null, l.LAppLive2DManager.releaseInstance(), n.dispose()
+ }, t.prototype.run = function () {
+ var t = this,
+ i = function () {
+ null != e.s_instance && (s.LAppPal.updateTime(), e.gl.clearColor(0, 0, 0, 0), e.gl.enable(e.gl.DEPTH_TEST), e.gl.depthFunc(e.gl.LEQUAL), e.gl.clear(e.gl.COLOR_BUFFER_BIT | e.gl.DEPTH_BUFFER_BIT), e.gl.clearDepth(1), e.gl.enable(e.gl.BLEND), e.gl.blendFunc(e.gl.SRC_ALPHA, e.gl.ONE_MINUS_SRC_ALPHA), t._view.render(), requestAnimationFrame(i))
+ };
+ i()
+ }, t.prototype.createShader = function () {
+ var t = e.gl.createShader(e.gl.VERTEX_SHADER);
+ if (null == t) return s.LAppPal.printMessage("failed to create vertexShader"), null;
+ e.gl.shaderSource(t, "precision mediump float;attribute vec3 position;attribute vec2 uv;varying vec2 vuv;void main(void){ gl_Position = vec4(position, 1.0); vuv = uv;}"), e.gl.compileShader(t);
+ var i = e.gl.createShader(e.gl.FRAGMENT_SHADER);
+ if (null == i) return s.LAppPal.printMessage("failed to create fragmentShader"), null;
+ e.gl.shaderSource(i, "precision mediump float;varying vec2 vuv;uniform sampler2D texture;void main(void){ gl_FragColor = texture2D(texture, vuv);}"), e.gl.compileShader(i);
+ var r = e.gl.createProgram();
+ return e.gl.attachShader(r, t), e.gl.attachShader(r, i), e.gl.deleteShader(t), e.gl.deleteShader(i), e.gl.linkProgram(r), e.gl.useProgram(r), r
+ }, t.prototype.getView = function () {
+ return this._view
+ }, t.prototype.getTextureManager = function () {
+ return this._textureManager
+ }, t.prototype.initializeCubism = function () {
+ this._cubismOption.logFunction = s.LAppPal.printMessage, this._cubismOption.loggingLevel = h.CubismLoggingLevel, n.startUp(this._cubismOption), n.initialize(), l.LAppLive2DManager.getInstance(), s.LAppPal.updateTime(), this._view.initializeSprite()
+ }, t
+ }();
+
+ function g(t) {
+ if (p.getInstance()._view) {
+ p.getInstance()._captured = !0;
+ var e = t.pageX,
+ i = t.pageY;
+ p.getInstance()._view.onTouchesBegan(e, i)
+ } else s.LAppPal.printMessage("view notfound")
+ }
+
+ function c(t) {
+ if (p.getInstance()._captured)
+ if (p.getInstance()._view) {
+ var e = t.target.getBoundingClientRect(),
+ i = t.clientX - e.left,
+ r = t.clientY - e.top;
+ p.getInstance()._view.onTouchesMoved(i, r)
+ } else s.LAppPal.printMessage("view notfound")
+ }
+
+ function d(t) {
+ if (p.getInstance()._captured = !1, p.getInstance()._view) {
+ var e = t.target.getBoundingClientRect(),
+ i = t.clientX - e.left,
+ r = t.clientY - e.top;
+ p.getInstance()._view.onTouchesEnded(i, r)
+ } else s.LAppPal.printMessage("view notfound")
+ }
+
+ function _(t) {
+ if (p.getInstance()._view) {
+ p.getInstance()._captured = !0;
+ var e = t.changedTouches[0].pageX,
+ i = t.changedTouches[0].pageY;
+ p.getInstance()._view.onTouchesBegan(e, i)
+ } else s.LAppPal.printMessage("view notfound")
+ }
+
+ function m(t) {
+ if (p.getInstance()._captured)
+ if (p.getInstance()._view) {
+ var e = t.target.getBoundingClientRect(),
+ i = t.changedTouches[0].clientX - e.left,
+ r = t.changedTouches[0].clientY - e.top;
+ p.getInstance()._view.onTouchesMoved(i, r)
+ } else s.LAppPal.printMessage("view notfound")
+ }
+
+ function f(t) {
+ if (p.getInstance()._captured = !1, p.getInstance()._view) {
+ var e = t.target.getBoundingClientRect(),
+ i = t.changedTouches[0].clientX - e.left,
+ r = t.changedTouches[0].clientY - e.top;
+ p.getInstance()._view.onTouchesEnded(i, r)
+ } else s.LAppPal.printMessage("view notfound")
+ }
+
+ function y(t) {
+ if (p.getInstance()._captured = !1, p.getInstance()._view) {
+ var e = t.target.getBoundingClientRect(),
+ i = t.changedTouches[0].clientX - e.left,
+ r = t.changedTouches[0].clientY - e.top;
+ p.getInstance()._view.onTouchesEnded(i, r)
+ } else s.LAppPal.printMessage("view notfound")
+ }
+ e.LAppDelegate = p
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ function (t) {
+ var e = function () {
+ function t(t) {
+ this.s = t
+ }
+ return t.prototype.append = function (t, e) {
+ return this.s += void 0 !== e ? t.substr(0, e) : t, this
+ }, t.prototype.expansion = function (t, e) {
+ for (var i = 0; i < t; i++) this.append(e);
+ return this
+ }, t.prototype.getBytes = function () {
+ return encodeURIComponent(this.s).replace(/%../g, "x").length
+ }, t.prototype.getLength = function () {
+ return this.s.length
+ }, t.prototype.isLess = function (t) {
+ return this.s < t.s
+ }, t.prototype.isGreat = function (t) {
+ return this.s > t.s
+ }, t.prototype.isEqual = function (t) {
+ return this.s == t
+ }, t.prototype.isEmpty = function () {
+ return 0 == this.s.length
+ }, t
+ }();
+ t.csmString = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(2);
+ ! function (t) {
+ var e = function (t, e) {
+ this.first = null == t ? null : t, this.second = null == e ? null : e
+ };
+ t.csmPair = e;
+ var i = function () {
+ function t(t) {
+ null != t ? t < 1 ? (this._keyValues = [], this._dummyValue = null, this._size = 0) : (this._keyValues = new Array(t), this._size = t) : (this._keyValues = [], this._dummyValue = null, this._size = 0)
+ }
+ return t.prototype.release = function () {
+ this.clear()
+ }, t.prototype.appendKey = function (t) {
+ this.prepareCapacity(this._size + 1, !1), this._keyValues[this._size] = new e(t), this._size += 1
+ }, t.prototype.getValue = function (t) {
+ for (var e = -1, i = 0; i < this._size; i++)
+ if (this._keyValues[i].first == t) {
+ e = i;
+ break
+ } return e >= 0 ? this._keyValues[e].second : (this.appendKey(t), this._keyValues[this._size - 1].second)
+ }, t.prototype.setValue = function (t, e) {
+ for (var i = -1, r = 0; r < this._size; r++)
+ if (this._keyValues[r].first == t) {
+ i = r;
+ break
+ } i >= 0 ? this._keyValues[i].second = e : (this.appendKey(t), this._keyValues[this._size - 1].second = e)
+ }, t.prototype.isExist = function (t) {
+ for (var e = 0; e < this._size; e++)
+ if (this._keyValues[e].first == t) return !0;
+ return !1
+ }, t.prototype.clear = function () {
+ this._keyValues = void 0, this._keyValues = null, this._keyValues = [], this._size = 0
+ }, t.prototype.getSize = function () {
+ return this._size
+ }, t.prototype.prepareCapacity = function (e, i) {
+ e > this._keyValues.length && (0 == this._keyValues.length ? (!i && e < t.DefaultSize && (e = t.DefaultSize), this._keyValues.length = e) : (!i && e < 2 * this._keyValues.length && (e = 2 * this._keyValues.length), this._keyValues.length = e))
+ }, t.prototype.begin = function () {
+ return new o(this, 0)
+ }, t.prototype.end = function () {
+ return new o(this, this._size)
+ }, t.prototype.erase = function (t) {
+ var e = t._index;
+ return e < 0 || this._size <= e ? t : (this._keyValues.splice(e, 1), --this._size, new o(this, e))
+ }, t.prototype.dumpAsInt = function () {
+ for (var t = 0; t < this._size; t++) r.CubismLogDebug("{0} ,", this._keyValues[t]), r.CubismLogDebug("\n")
+ }, t.DefaultSize = 10, t
+ }();
+ t.csmMap = i;
+ var o = function () {
+ function t(t, e) {
+ this._map = null != t ? t : new i, this._index = null != e ? e : 0
+ }
+ return t.prototype.set = function (t) {
+ return this._index = t._index, this._map = t._map, this
+ }, t.prototype.preIncrement = function () {
+ return ++this._index, this
+ }, t.prototype.preDecrement = function () {
+ return --this._index, this
+ }, t.prototype.increment = function () {
+ var e = new t(this._map, this._index++);
+ return this._map = e._map, this._index = e._index, this
+ }, t.prototype.decrement = function () {
+ var e = new t(this._map, this._index);
+ return this._map = e._map, this._index = e._index, this
+ }, t.prototype.ptr = function () {
+ return this._map._keyValues[this._index]
+ }, t.prototype.notEqual = function (t) {
+ return this._index != t._index || this._map != t._map
+ }, t
+ }();
+ t.iterator = o
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(9),
+ o = i(1),
+ n = i(2),
+ a = o.Live2DCubismFramework.csmVector,
+ s = r.Live2DCubismFramework.CubismMath;
+ ! function (t) {
+ var e = function () {
+ function t() {
+ var t = this;
+ this.setFinishedMotionHandler = function (e) {
+ return t._onFinishedMotion = e
+ }, this.getFinishedMotionHandler = function () {
+ return t._onFinishedMotion
+ }, this._fadeInSeconds = -1, this._fadeOutSeconds = -1, this._weight = 1, this._offsetSeconds = 0, this._firedEventValues = new a
+ }
+ return t.delete = function (t) {
+ t.release(), t = void 0, t = null
+ }, t.prototype.release = function () {
+ this._weight = 0
+ }, t.prototype.updateParameters = function (t, e, i) {
+ if (e.isAvailable() && !e.isFinished()) {
+ if (!e.isStarted()) {
+ e.setIsStarted(!0), e.setStartTime(i - this._offsetSeconds), e.setFadeInStartTime(i);
+ var r = this.getDuration();
+ e.getEndTime() < 0 && e.setEndTime(r <= 0 ? -1 : e.getStartTime() + r)
+ }
+ var o = this._weight;
+ o = o * (0 == this._fadeInSeconds ? 1 : s.getEasingSine((i - e.getFadeInStartTime()) / this._fadeInSeconds)) * (0 == this._fadeOutSeconds || e.getEndTime() < 0 ? 1 : s.getEasingSine((e.getEndTime() - i) / this._fadeOutSeconds)), e.setState(i, o), n.CSM_ASSERT(0 <= o && o <= 1), this.doUpdateParameters(t, i, o, e), e.getEndTime() > 0 && e.getEndTime() < i && e.setIsFinished(!0)
+ }
+ }, t.prototype.setFadeInTime = function (t) {
+ this._fadeInSeconds = t
+ }, t.prototype.setFadeOutTime = function (t) {
+ this._fadeOutSeconds = t
+ }, t.prototype.getFadeOutTime = function () {
+ return this._fadeOutSeconds
+ }, t.prototype.getFadeInTime = function () {
+ return this._fadeInSeconds
+ }, t.prototype.setWeight = function (t) {
+ this._weight = t
+ }, t.prototype.getWeight = function () {
+ return this._weight
+ }, t.prototype.getDuration = function () {
+ return -1
+ }, t.prototype.getLoopDuration = function () {
+ return -1
+ }, t.prototype.setOffsetTime = function (t) {
+ this._offsetSeconds = t
+ }, t.prototype.getFiredEvent = function (t, e) {
+ return this._firedEventValues
+ }, t
+ }();
+ t.ACubismMotion = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(10).Live2DCubismFramework.CubismVector2;
+ ! function (t) {
+ var e = function () {
+ function t() {}
+ return t.range = function (t, e, i) {
+ return t < e ? t = e : t > i && (t = i), t
+ }, t.sin = function (t) {
+ return Math.sin(t)
+ }, t.cos = function (t) {
+ return Math.cos(t)
+ }, t.abs = function (t) {
+ return Math.abs(t)
+ }, t.sqrt = function (t) {
+ return Math.sqrt(t)
+ }, t.getEasingSine = function (t) {
+ return t < 0 ? 0 : t > 1 ? 1 : .5 - .5 * this.cos(t * Math.PI)
+ }, t.max = function (t, e) {
+ return t > e ? t : e
+ }, t.min = function (t, e) {
+ return t > e ? e : t
+ }, t.degreesToRadian = function (t) {
+ return t / 180 * Math.PI
+ }, t.radianToDegrees = function (t) {
+ return 180 * t / Math.PI
+ }, t.directionToRadian = function (t, e) {
+ for (var i = Math.atan2(e.y, e.x) - Math.atan2(t.y, t.x); i < -Math.PI;) i += 2 * Math.PI;
+ for (; i > Math.PI;) i -= 2 * Math.PI;
+ return i
+ }, t.directionToDegrees = function (t, e) {
+ var i = this.directionToRadian(t, e),
+ r = this.radianToDegrees(i);
+ return e.x - t.x > 0 && (r = -r), r
+ }, t.radianToDirection = function (t) {
+ var e = new r;
+ return e.x = this.sin(t), e.y = this.cos(t), e
+ }, t
+ }();
+ t.CubismMath = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ function (t) {
+ var e = function () {
+ function t(t, e) {
+ this.x = t, this.y = e, this.x = null == t ? 0 : t, this.y = null == e ? 0 : e
+ }
+ return t.prototype.add = function (e) {
+ var i = new t(0, 0);
+ return i.x = this.x + e.x, i.y = this.y + e.y, i
+ }, t.prototype.substract = function (e) {
+ var i = new t(0, 0);
+ return i.x = this.x - e.x, i.y = this.y - e.y, i
+ }, t.prototype.multiply = function (e) {
+ var i = new t(0, 0);
+ return i.x = this.x * e.x, i.y = this.y * e.y, i
+ }, t.prototype.multiplyByScaler = function (e) {
+ return this.multiply(new t(e, e))
+ }, t.prototype.division = function (e) {
+ var i = new t(0, 0);
+ return i.x = this.x / e.x, i.y = this.y / e.y, i
+ }, t.prototype.divisionByScalar = function (e) {
+ return this.division(new t(e, e))
+ }, t.prototype.getLength = function () {
+ return Math.sqrt(this.x * this.x + this.y * this.y)
+ }, t.prototype.getDistanceWith = function (t) {
+ return Math.sqrt((this.x - t.x) * (this.x - t.x) + (this.y - t.y) * (this.y - t.y))
+ }, t.prototype.dot = function (t) {
+ return this.x * t.x + this.y * t.y
+ }, t.prototype.normalize = function () {
+ var t = Math.pow(this.x * this.x + this.y * this.y, .5);
+ this.x = this.x / t, this.y = this.y / t
+ }, t.prototype.isEqual = function (t) {
+ return this.x == t.x && this.y == t.y
+ }, t.prototype.isNotEqual = function (t) {
+ return !this.isEqual(t)
+ }, t
+ }();
+ t.CubismVector2 = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = function () {
+ function t() {}
+ return t.loadFileAsBytes = function (t, e) {
+ fetch(t).then((function (t) {
+ return t.arrayBuffer()
+ })).then((function (t) {
+ return e(t, t.byteLength)
+ }))
+ }, t.getDeltaTime = function () {
+ return this.s_deltaTime
+ }, t.updateTime = function () {
+ this.s_currentFrame = Date.now(), this.s_deltaTime = (this.s_currentFrame - this.s_lastFrame) / 1e3, this.s_lastFrame = this.s_currentFrame
+ }, t.printMessage = function (t) {
+ console.log(t)
+ }, t.lastUpdate = Date.now(), t.s_currentFrame = 0, t.s_lastFrame = 0, t.s_deltaTime = 0, t
+ }();
+ e.LAppPal = r
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(0);
+ e.ViewMaxScale = 2, e.ViewMinScale = .8, e.ViewLogicalLeft = -1, e.ViewLogicalRight = 1, e.ViewLogicalMaxLeft = -2, e.ViewLogicalMaxRight = 2, e.ViewLogicalMaxBottom = -2, e.ViewLogicalMaxTop = 2, e.ResourcesPath = "live2d-model/", e.BackImageName = "back_class_normal.png", e.ModelDir = ["Hiyori"], e.ModelDirSize = e.ModelDir.length, e.MotionGroupIdle = "Idle", e.MotionGroupTapBody = "TapBody", e.MotionGroupTapHead = "TapHead", e.HitAreaNameHead = "Head", e.HitAreaNameBody = "Body", e.PriorityNone = 0, e.PriorityIdle = 1, e.PriorityNormal = 2, e.PriorityForce = 3, e.DebugLogEnable = !0, e.DebugTouchLogEnable = !1, e.CubismLoggingLevel = r.LogLevel.LogLevel_Verbose
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(4).Live2DCubismFramework.CubismMatrix44;
+ ! function (t) {
+ var e = function () {
+ function t() {
+ this._isCulling = !1, this._isPremultipliedAlpha = !1, this._anisortopy = 0, this._model = null, this._modelColor = new i, this._mvpMatrix4x4 = new r, this._mvpMatrix4x4.loadIdentity()
+ }
+ return t.create = function () {
+ return null
+ }, t.delete = function (t) {
+ null
+ }, t.prototype.initialize = function (t) {
+ this._model = t
+ }, t.prototype.drawModel = function () {
+ null != this.getModel() && this.doDrawModel()
+ }, t.prototype.setMvpMatrix = function (t) {
+ this._mvpMatrix4x4.setMatrix(t.getArray())
+ }, t.prototype.getMvpMatrix = function () {
+ return this._mvpMatrix4x4
+ }, t.prototype.setModelColor = function (t, e, i, r) {
+ t < 0 ? t = 0 : t > 1 && (t = 1), e < 0 ? e = 0 : e > 1 && (e = 1), i < 0 ? i = 0 : i > 1 && (i = 1), r < 0 ? r = 0 : r > 1 && (r = 1), this._modelColor.R = t, this._modelColor.G = e, this._modelColor.B = i, this._modelColor.A = r
+ }, t.prototype.getModelColor = function () {
+ return JSON.parse(JSON.stringify(this._modelColor))
+ }, t.prototype.setIsPremultipliedAlpha = function (t) {
+ this._isPremultipliedAlpha = t
+ }, t.prototype.isPremultipliedAlpha = function () {
+ return this._isPremultipliedAlpha
+ }, t.prototype.setIsCulling = function (t) {
+ this._isCulling = t
+ }, t.prototype.isCulling = function () {
+ return this._isCulling
+ }, t.prototype.setAnisotropy = function (t) {
+ this._anisortopy = t
+ }, t.prototype.getAnisotropy = function () {
+ return this._anisortopy
+ }, t.prototype.getModel = function () {
+ return this._model
+ }, t
+ }();
+ t.CubismRenderer = e,
+ function (t) {
+ t[t.CubismBlendMode_Normal = 0] = "CubismBlendMode_Normal", t[t.CubismBlendMode_Additive = 1] = "CubismBlendMode_Additive", t[t.CubismBlendMode_Multiplicative = 2] = "CubismBlendMode_Multiplicative"
+ }(t.CubismBlendMode || (t.CubismBlendMode = {}));
+ var i = function () {
+ this.R = 1, this.G = 1, this.B = 1, this.A = 1
+ };
+ t.CubismTextureColor = i
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ var r = this && this.__importStar || function (t) {
+ if (t && t.__esModule) return t;
+ var e = {};
+ if (null != t)
+ for (var i in t) Object.hasOwnProperty.call(t, i) && (e[i] = t[i]);
+ return e.default = t, e
+ };
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var o = i(4),
+ n = i(1).Live2DCubismFramework.csmVector,
+ a = o.Live2DCubismFramework.CubismMatrix44,
+ s = i(25),
+ u = i(11),
+ l = i(5),
+ h = r(i(12));
+ e.s_instance = null;
+ var p = function () {
+ function t() {
+ this._finishedMotion = function (t) {
+ u.LAppPal.printMessage("Motion Finished:"), console.log(t)
+ }, this._viewMatrix = new a, this._models = new n, this._sceneIndex = 0, this.changeScene(this._sceneIndex)
+ }
+ return t.getInstance = function () {
+ return null == e.s_instance && (e.s_instance = new t), e.s_instance
+ }, t.releaseInstance = function () {
+ null != e.s_instance && (e.s_instance = void 0), e.s_instance = null
+ }, t.prototype.getModel = function (t) {
+ return t < this._models.getSize() ? this._models.at(t) : null
+ }, t.prototype.releaseAllModel = function () {
+ for (var t = 0; t < this._models.getSize(); t++) this._models.at(t).release(), this._models.set(t, null);
+ this._models.clear()
+ }, t.prototype.onDrag = function (t, e) {
+ for (var i = 0; i < this._models.getSize(); i++) {
+ var r = this.getModel(i);
+ r && r.setDragging(t, e)
+ }
+ }, t.prototype.onTap = function (t, e) {
+ console.log(t, e), h.DebugLogEnable && u.LAppPal.printMessage("[APP]tap point: {x: " + t.toFixed(2) + " y: " + e.toFixed(2) + "}");
+ for (var i = 0; i < this._models.getSize(); i++) this._models.at(i).hitTest(h.HitAreaNameHead, t, e) ? (h.DebugLogEnable && u.LAppPal.printMessage("[APP]hit area: [" + h.HitAreaNameHead + "]"), this._models.at(i).setRandomExpression()) : this._models.at(i).hitTest(h.HitAreaNameBody, t, e) ? (h.DebugLogEnable && (u.LAppPal.printMessage("[APP]hit area: [" + h.HitAreaNameBody + "]"), document.touchBodyHandler()), this._models.at(i).startRandomMotion(h.MotionGroupTapBody, h.PriorityNormal, this._finishedMotion)) : this.currentPosition(t, e) === h.HitAreaNameHead ? this._models.at(i).startRandomMotion(h.MotionGroupTapHead, h.PriorityNormal) : this._models.at(i).startRandomMotion(h.MotionGroupTapBody, h.PriorityNormal)
+ }, t.prototype.currentPosition = function (t, e, i) {
+ if (void 0 === i && (i = "end"), t > -1 && t < 1 && e < 1 && e > -1) {
+ if (console.log("--------lapplive2dmanager.ts --- 您点击到了canvas区域-------"), t > -.2 && t < .2 && e > .2 && e < .8) return console.log("--------lapplive2dmanager.ts --- 您点击到了人物的头部区域-------"), document.touchHeadHandler(), h.HitAreaNameHead;
+ if (t > -.2 && t < .2 && e > -1 && e < .1) return document.touchBodyHandler(), console.log("--------lapplive2dmanager.ts --- 您点击到了人物的身体区域-------"), h.HitAreaNameBody
+ }
+ }, t.prototype.onUpdate = function () {
+ var t = new a,
+ e = l.canvas.width,
+ i = l.canvas.height;
+ t.scale(1, e / i), null != this._viewMatrix && t.multiplyByMatrix(this._viewMatrix);
+ for (var r = t.clone(), o = this._models.getSize(), n = 0; n < o; ++n) {
+ var s = this.getModel(n);
+ t = r.clone(), s.update(), s.draw(t)
+ }
+ }, t.prototype.nextScene = function () {
+ var t = (this._sceneIndex + 1) % h.ModelDirSize;
+ this.changeScene(t)
+ }, t.prototype.changeScene = function (t) {
+ this._sceneIndex = t, h.DebugLogEnable && u.LAppPal.printMessage("[APP]model index: " + this._sceneIndex);
+ var e = h.ModelDir[t],
+ i = h.ResourcesPath + e + '/',
+ r = h.ModelDir[t];
+ r += ".model3.json", this.releaseAllModel(), this._models.pushBack(new s.LAppModel), this._models.at(0).loadAssets(i, r)
+ }, t
+ }();
+ e.LAppLive2DManager = p
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(28),
+ o = i(1).Live2DCubismFramework.csmVector,
+ n = r.Live2DCubismFramework.CubismMotionQueueEntry;
+ ! function (t) {
+ var e = function () {
+ function e() {
+ this._userTimeSeconds = 0, this._eventCallBack = null, this._eventCustomData = null, this._motions = new o
+ }
+ return e.prototype.release = function () {
+ for (var t = 0; t < this._motions.getSize(); ++t) this._motions.at(t) && (this._motions.at(t).release(), this._motions.set(t, void 0), this._motions.set(t, null));
+ this._motions = null
+ }, e.prototype.startMotion = function (e, i, r) {
+ if (null == e) return t.InvalidMotionQueueEntryHandleValue;
+ for (var o = null, a = 0; a < this._motions.getSize(); ++a) null != (o = this._motions.at(a)) && o.startFadeout(o._motion.getFadeOutTime(), r);
+ return (o = new n)._autoDelete = i, o._motion = e, this._motions.pushBack(o), o._motionQueueEntryHandle
+ }, e.prototype.isFinished = function () {
+ for (var t = this._motions.begin(); t.notEqual(this._motions.end());) {
+ var e = t.ptr();
+ if (null != e)
+ if (null != e._motion) {
+ if (!e.isFinished()) return !1;
+ t.preIncrement()
+ } else e.release(), e = void 0, e = null, t = this._motions.erase(t);
+ else t = this._motions.erase(t)
+ }
+ return !0
+ }, e.prototype.isFinishedByHandle = function (t) {
+ for (var e = this._motions.begin(); e.notEqual(this._motions.end()); e.increment()) {
+ var i = e.ptr();
+ if (null != i && (i._motionQueueEntryHandle == t && !i.isFinished())) return !1
+ }
+ return !0
+ }, e.prototype.stopAllMotions = function () {
+ for (var t = this._motions.begin(); t.notEqual(this._motions.end());) {
+ var e = t.ptr();
+ null != e ? (e.release(), e = void 0, e = null, t = this._motions.erase(t)) : t = this._motions.erase(t)
+ }
+ }, e.prototype.getCubismMotionQueueEntry = function (t) {
+ for (var e = this._motions.begin(); e.notEqual(this._motions.end()); e.preIncrement()) {
+ var i = e.ptr();
+ if (null != i && i._motionQueueEntryHandle == t) return i
+ }
+ return null
+ }, e.prototype.setEventCallback = function (t, e) {
+ void 0 === e && (e = null), this._eventCallBack = t, this._eventCustomData = e
+ }, e.prototype.doUpdateMotion = function (t, e) {
+ for (var i = !1, r = this._motions.begin(); r.notEqual(this._motions.end());) {
+ var o = r.ptr();
+ if (null != o) {
+ var n = o._motion;
+ if (null != n) {
+ n.updateParameters(t, o, e), i = !0;
+ for (var a = n.getFiredEvent(o.getLastCheckEventTime() - o.getStartTime(), e - o.getStartTime()), s = 0; s < a.getSize(); ++s) this._eventCallBack(this, a.at(s), this._eventCustomData);
+ o.setLastCheckEventTime(e), o.isFinished() ? (o.release(), o = void 0, o = null, r = this._motions.erase(r)) : r.preIncrement()
+ } else o.release(), o = void 0, o = null, r = this._motions.erase(r)
+ } else r = this._motions.erase(r)
+ }
+ return i
+ }, e
+ }();
+ t.CubismMotionQueueManager = e, t.InvalidMotionQueueEntryHandleValue = -1
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ function (t) {
+ var e = function () {
+ function t() {
+ this._currentTime = 0
+ }
+ return t.create = function () {
+ return new t
+ }, t.delete = function (t) {
+ null != t && (t = null)
+ }, t.prototype.setParameters = function (t) {
+ this._breathParameters = t
+ }, t.prototype.getParameters = function () {
+ return this._breathParameters
+ }, t.prototype.updateParameters = function (t, e) {
+ this._currentTime += e;
+ for (var i = 2 * this._currentTime * 3.14159, r = 0; r < this._breathParameters.getSize(); ++r) {
+ var o = this._breathParameters.at(r);
+ t.addParameterValueById(o.parameterId, o.offset + o.peak * Math.sin(i / o.cycle), o.weight)
+ }
+ }, t
+ }();
+ t.CubismBreath = e;
+ var i = function (t, e, i, r, o) {
+ this.parameterId = null == t ? null : t, this.offset = null == e ? 0 : e, this.peak = null == i ? 0 : i, this.cycle = null == r ? 0 : r, this.weight = null == o ? 0 : o
+ };
+ t.BreathParameterData = i
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(1).Live2DCubismFramework.csmVector;
+ ! function (t) {
+ var e, i = function () {
+ function t(t) {
+ if (this._blinkingState = e.EyeState_First, this._nextBlinkingTime = 0, this._stateStartTimeSeconds = 0, this._blinkingIntervalSeconds = 4, this._closingSeconds = .1, this._closedSeconds = .05, this._openingSeconds = .15, this._userTimeSeconds = 0, this._parameterIds = new r, null != t)
+ for (var i = 0; i < t.getEyeBlinkParameterCount(); ++i) this._parameterIds.pushBack(t.getEyeBlinkParameterId(i))
+ }
+ return t.create = function (e) {
+ return void 0 === e && (e = null), new t(e)
+ }, t.delete = function (t) {
+ null != t && (t = null)
+ }, t.prototype.setBlinkingInterval = function (t) {
+ this._blinkingIntervalSeconds = t
+ }, t.prototype.setBlinkingSetting = function (t, e, i) {
+ this._closingSeconds = t, this._closedSeconds = e, this._openingSeconds = i
+ }, t.prototype.setParameterIds = function (t) {
+ this._parameterIds = t
+ }, t.prototype.getParameterIds = function () {
+ return this._parameterIds
+ }, t.prototype.updateParameters = function (i, r) {
+ var o;
+ this._userTimeSeconds += r;
+ var n = 0;
+ switch (this._blinkingState) {
+ case e.EyeState_Closing:
+ (n = (this._userTimeSeconds - this._stateStartTimeSeconds) / this._closingSeconds) >= 1 && (n = 1, this._blinkingState = e.EyeState_Closed, this._stateStartTimeSeconds = this._userTimeSeconds), o = 1 - n;
+ break;
+ case e.EyeState_Closed:
+ (n = (this._userTimeSeconds - this._stateStartTimeSeconds) / this._closedSeconds) >= 1 && (this._blinkingState = e.EyeState_Opening, this._stateStartTimeSeconds = this._userTimeSeconds), o = 0;
+ break;
+ case e.EyeState_Opening:
+ (n = (this._userTimeSeconds - this._stateStartTimeSeconds) / this._openingSeconds) >= 1 && (n = 1, this._blinkingState = e.EyeState_Interval, this._nextBlinkingTime = this.determinNextBlinkingTiming()), o = n;
+ break;
+ case e.EyeState_Interval:
+ this._nextBlinkingTime < this._userTimeSeconds && (this._blinkingState = e.EyeState_Closing, this._stateStartTimeSeconds = this._userTimeSeconds), o = 1;
+ break;
+ case e.EyeState_First:
+ default:
+ this._blinkingState = e.EyeState_Interval, this._nextBlinkingTime = this.determinNextBlinkingTiming(), o = 1
+ }
+ t.CloseIfZero || (o = -o);
+ for (var a = 0; a < this._parameterIds.getSize(); ++a) i.setParameterValueById(this._parameterIds.at(a), o)
+ }, t.prototype.determinNextBlinkingTiming = function () {
+ var t = Math.random();
+ return this._userTimeSeconds + t * (2 * this._blinkingIntervalSeconds - 1)
+ }, t.CloseIfZero = !0, t
+ }();
+ t.CubismEyeBlink = i,
+ function (t) {
+ t[t.EyeState_First = 0] = "EyeState_First", t[t.EyeState_Interval = 1] = "EyeState_Interval", t[t.EyeState_Closing = 2] = "EyeState_Closing", t[t.EyeState_Closed = 3] = "EyeState_Closed", t[t.EyeState_Opening = 4] = "EyeState_Opening"
+ }(e = t.EyeState || (t.EyeState = {}))
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(5);
+ window.onload = function () {
+ 0 != r.LAppDelegate.getInstance().initialize() && r.LAppDelegate.getInstance().run()
+ }, window.onbeforeunload = function () {
+ return r.LAppDelegate.releaseInstance()
+ }
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }), e.CSM_LOG_LEVEL_VERBOSE = 0, e.CSM_LOG_LEVEL_DEBUG = 1, e.CSM_LOG_LEVEL_INFO = 2, e.CSM_LOG_LEVEL_WARNING = 3, e.CSM_LOG_LEVEL_ERROR = 4, e.CSM_LOG_LEVEL_OFF = 5, e.CSM_LOG_LEVEL = e.CSM_LOG_LEVEL_VERBOSE
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(1),
+ o = i(21).Live2DCubismFramework.CubismId,
+ n = r.Live2DCubismFramework.csmVector;
+ ! function (t) {
+ var e = function () {
+ function t() {
+ this._ids = new n
+ }
+ return t.prototype.release = function () {
+ for (var t = 0; t < this._ids.getSize(); ++t) this._ids.set(t, void 0);
+ this._ids = null
+ }, t.prototype.registerIds = function (t) {
+ for (var e = 0; e < t.length; e++) this.registerId(t[e])
+ }, t.prototype.registerId = function (t) {
+ var e = null;
+ return "string" != typeof t ? this.registerId(t.s) : null != (e = this.findId(t)) ? e : (e = new o(t), this._ids.pushBack(e), e)
+ }, t.prototype.getId = function (t) {
+ return this.registerId(t)
+ }, t.prototype.isExist = function (t) {
+ return "string" == typeof t ? null != this.findId(t) : this.isExist(t.s)
+ }, t.prototype.findId = function (t) {
+ for (var e = 0; e < this._ids.getSize(); ++e)
+ if (this._ids.at(e).getString().isEqual(t)) return this._ids.at(e);
+ return null
+ }, t
+ }();
+ t.CubismIdManager = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(6).Live2DCubismFramework.csmString;
+ ! function (t) {
+ var e = function () {
+ function t(t) {
+ this._id = "string" != typeof t ? t : new r(t)
+ }
+ return t.prototype.getString = function () {
+ return this._id
+ }, t.prototype.isEqual = function (e) {
+ return "string" == typeof e ? this._id.isEqual(e) : e instanceof r ? this._id.isEqual(e.s) : e instanceof t && this._id.isEqual(e._id.s)
+ }, t.prototype.isNotEqual = function (e) {
+ return "string" == typeof e ? !this._id.isEqual(e) : e instanceof r ? !this._id.isEqual(e.s) : e instanceof t && !this._id.isEqual(e._id.s)
+ }, t
+ }();
+ t.CubismId = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ var r = this && this.__importStar || function (t) {
+ if (t && t.__esModule) return t;
+ var e = {};
+ if (null != t)
+ for (var i in t) Object.hasOwnProperty.call(t, i) && (e[i] = t[i]);
+ return e.default = t, e
+ };
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var o = i(4),
+ n = i(23).Live2DCubismFramework.CubismViewMatrix,
+ a = o.Live2DCubismFramework.CubismMatrix44,
+ s = i(24),
+ u = i(14),
+ l = i(5),
+ h = i(11),
+ p = r(i(12)),
+ g = function () {
+ function t() {
+ this._programId = null, this._back = null, this._gear = null, this._touchManager = new s.TouchManager, this._deviceToScreen = new a, this._viewMatrix = new n
+ }
+ return t.prototype.initialize = function () {
+ var t = l.canvas.width,
+ e = l.canvas.height,
+ i = e / t,
+ r = p.ViewLogicalLeft,
+ o = p.ViewLogicalRight,
+ n = -i,
+ a = i;
+ this._viewMatrix.setScreenRect(r, o, n, a);
+ var s = Math.abs(r - o);
+ this._deviceToScreen.scaleRelative(s / t, -s / t), this._deviceToScreen.translateRelative(.5 * -t, .5 * -e), this._viewMatrix.setMaxScale(p.ViewMaxScale), this._viewMatrix.setMinScale(p.ViewMinScale), this._viewMatrix.setMaxScreenRect(p.ViewLogicalMaxLeft, p.ViewLogicalMaxRight, p.ViewLogicalMaxBottom, p.ViewLogicalMaxTop)
+ }, t.prototype.release = function () {
+ this._viewMatrix = null, this._touchManager = null, this._deviceToScreen = null, l.gl.deleteProgram(this._programId), this._programId = null
+ }, t.prototype.render = function () {
+ l.gl.useProgram(this._programId), l.gl.flush(), u.LAppLive2DManager.getInstance().onUpdate()
+ }, t.prototype.initializeSprite = function () {
+ l.canvas.width, l.canvas.height, l.LAppDelegate.getInstance().getTextureManager(), p.ResourcesPath;
+ null == this._programId && (this._programId = l.LAppDelegate.getInstance().createShader())
+ }, t.prototype.onTouchesBegan = function (t, e) {
+ console.log("被触摸的时候调用"), console.log(t, e), this._touchManager.touchesBegan(t, e);
+ u.LAppLive2DManager.getInstance()
+ }, t.prototype.onTouchesMoved = function (t, e) {
+ var i = this.transformViewX(this._touchManager.getX()),
+ r = this.transformViewY(this._touchManager.getY());
+ this._touchManager.touchesMoved(t, e), u.LAppLive2DManager.getInstance().onDrag(i, r)
+ }, t.prototype.onTouchesEnded = function (t, e) {
+ console.log(t, e);
+ var i = u.LAppLive2DManager.getInstance();
+ i.onDrag(0, 0);
+ var r = this._deviceToScreen.transformX(this._touchManager.getX()),
+ o = this._deviceToScreen.transformY(this._touchManager.getY());
+ p.DebugTouchLogEnable && h.LAppPal.printMessage("[APP]touchesEnded x: " + r + " y: " + o), i.onTap(r, o)
+ }, t.prototype.transformViewX = function (t) {
+ var e = this._deviceToScreen.transformX(t);
+ return this._viewMatrix.invertTransformX(e)
+ }, t.prototype.transformViewY = function (t) {
+ var e = this._deviceToScreen.transformY(t);
+ return this._viewMatrix.invertTransformY(e)
+ }, t.prototype.transformScreenX = function (t) {
+ return this._deviceToScreen.transformX(t)
+ }, t.prototype.transformScreenY = function (t) {
+ return this._deviceToScreen.transformY(t)
+ }, t
+ }();
+ e.LAppView = g
+}, function (t, e, i) {
+ "use strict";
+ var r, o = this && this.__extends || (r = function (t, e) {
+ return (r = Object.setPrototypeOf || {
+ __proto__: []
+ }
+ instanceof Array && function (t, e) {
+ t.__proto__ = e
+ } || function (t, e) {
+ for (var i in e) e.hasOwnProperty(i) && (t[i] = e[i])
+ })(t, e)
+ }, function (t, e) {
+ function i() {
+ this.constructor = t
+ }
+ r(t, e), t.prototype = null === e ? Object.create(e) : (i.prototype = e.prototype, new i)
+ });
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var n = i(4).Live2DCubismFramework.CubismMatrix44;
+ ! function (t) {
+ var e = function (t) {
+ function e() {
+ var e = t.call(this) || this;
+ return e._screenLeft = 0, e._screenRight = 0, e._screenTop = 0, e._screenBottom = 0, e._maxLeft = 0, e._maxRight = 0, e._maxTop = 0, e._maxBottom = 0, e._maxScale = 0, e._minScale = 0, e
+ }
+ return o(e, t), e.prototype.adjustTranslate = function (t, e) {
+ this._tr[0] * this._maxLeft + (this._tr[12] + t) > this._screenLeft && (t = this._screenLeft - this._tr[0] * this._maxLeft - this._tr[12]), this._tr[0] * this._maxRight + (this._tr[12] + t) < this._screenRight && (t = this._screenRight - this._tr[0] * this._maxRight - this._tr[12]), this._tr[5] * this._maxTop + (this._tr[13] + e) < this._screenTop && (e = this._screenTop - this._tr[5] * this._maxTop - this._tr[13]), this._tr[5] * this._maxBottom + (this._tr[13] + e) > this._screenBottom && (e = this._screenBottom - this._tr[5] * this._maxBottom - this._tr[13]);
+ var i = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, t, e, 0, 1]);
+ n.multiply(i, this._tr, this._tr)
+ }, e.prototype.adjustScale = function (t, e, i) {
+ var r = this.getMaxScale(),
+ o = this.getMinScale(),
+ a = i * this._tr[0];
+ a < o ? this._tr[0] > 0 && (i = o / this._tr[0]) : a > r && this._tr[0] > 0 && (i = r / this._tr[0]);
+ var s = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, t, e, 0, 1]),
+ u = new Float32Array([i, 0, 0, 0, 0, i, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),
+ l = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -t, -e, 0, 1]);
+ n.multiply(l, this._tr, this._tr), n.multiply(u, this._tr, this._tr), n.multiply(s, this._tr, this._tr)
+ }, e.prototype.setScreenRect = function (t, e, i, r) {
+ this._screenLeft = t, this._screenRight = e, this._screenBottom = i, this._screenTop = r
+ }, e.prototype.setMaxScreenRect = function (t, e, i, r) {
+ this._maxLeft = t, this._maxRight = e, this._maxTop = r, this._maxBottom = i
+ }, e.prototype.setMaxScale = function (t) {
+ this._maxScale = t
+ }, e.prototype.setMinScale = function (t) {
+ this._minScale = t
+ }, e.prototype.getMaxScale = function () {
+ return this._maxScale
+ }, e.prototype.getMinScale = function () {
+ return this._minScale
+ }, e.prototype.isMaxScale = function () {
+ return this.getScaleX() >= this._maxScale
+ }, e.prototype.isMinScale = function () {
+ return this.getScaleX() <= this._minScale
+ }, e.prototype.getScreenLeft = function () {
+ return this._screenLeft
+ }, e.prototype.getScreenRight = function () {
+ return this._screenRight
+ }, e.prototype.getScreenBottom = function () {
+ return this._screenBottom
+ }, e.prototype.getScreenTop = function () {
+ return this._screenTop
+ }, e.prototype.getMaxLeft = function () {
+ return this._maxLeft
+ }, e.prototype.getMaxRight = function () {
+ return this._maxRight
+ }, e.prototype.getMaxBottom = function () {
+ return this._maxBottom
+ }, e.prototype.getMaxTop = function () {
+ return this._maxTop
+ }, e
+ }(n);
+ t.CubismViewMatrix = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = function () {
+ function t() {
+ this._startX = 0, this._startY = 0, this._lastX = 0, this._lastY = 0, this._lastX1 = 0, this._lastY1 = 0, this._lastX2 = 0, this._lastY2 = 0, this._lastTouchDistance = 0, this._deltaX = 0, this._deltaY = 0, this._scale = 1, this._touchSingle = !1, this._flipAvailable = !1
+ }
+ return t.prototype.getCenterX = function () {
+ return this._lastX
+ }, t.prototype.getCenterY = function () {
+ return this._lastY
+ }, t.prototype.getDeltaX = function () {
+ return this._deltaX
+ }, t.prototype.getDeltaY = function () {
+ return this._deltaY
+ }, t.prototype.getStartX = function () {
+ return this._startX
+ }, t.prototype.getStartY = function () {
+ return this._startY
+ }, t.prototype.getScale = function () {
+ return this._scale
+ }, t.prototype.getX = function () {
+ return this._lastX
+ }, t.prototype.getY = function () {
+ return this._lastY
+ }, t.prototype.getX1 = function () {
+ return this._lastX1
+ }, t.prototype.getY1 = function () {
+ return this._lastY1
+ }, t.prototype.getX2 = function () {
+ return this._lastX2
+ }, t.prototype.getY2 = function () {
+ return this._lastY2
+ }, t.prototype.isSingleTouch = function () {
+ return this._touchSingle
+ }, t.prototype.isFlickAvailable = function () {
+ return this._flipAvailable
+ }, t.prototype.disableFlick = function () {
+ this._flipAvailable = !1
+ }, t.prototype.touchesBegan = function (t, e) {
+ this._lastX = t, this._lastY = e, this._startX = t, this._startY = e, this._lastTouchDistance = -1, this._flipAvailable = !0, this._touchSingle = !0
+ }, t.prototype.touchesMoved = function (t, e) {
+ this._lastX = t, this._lastY = e, this._lastTouchDistance = -1, this._touchSingle = !0
+ }, t.prototype.getFlickDistance = function () {
+ return this.calculateDistance(this._startX, this._startY, this._lastX, this._lastY)
+ }, t.prototype.calculateDistance = function (t, e, i, r) {
+ return Math.sqrt((t - i) * (t - i) + (e - r) * (e - r))
+ }, t.prototype.calculateMovingAmount = function (t, e) {
+ if (t > 0 != e > 0) return 0;
+ var i = t > 0 ? 1 : -1,
+ r = Math.abs(t),
+ o = Math.abs(e);
+ return i * (r < o ? r : o)
+ }, t
+ }();
+ e.TouchManager = r
+}, function (t, e, i) {
+ "use strict";
+ var r, o = this && this.__extends || (r = function (t, e) {
+ return (r = Object.setPrototypeOf || {
+ __proto__: []
+ }
+ instanceof Array && function (t, e) {
+ t.__proto__ = e
+ } || function (t, e) {
+ for (var i in e) e.hasOwnProperty(i) && (t[i] = e[i])
+ })(t, e)
+ }, function (t, e) {
+ function i() {
+ this.constructor = t
+ }
+ r(t, e), t.prototype = null === e ? Object.create(e) : (i.prototype = e.prototype, new i)
+ }),
+ n = this && this.__importStar || function (t) {
+ if (t && t.__esModule) return t;
+ var e = {};
+ if (null != t)
+ for (var i in t) Object.hasOwnProperty.call(t, i) && (e[i] = t[i]);
+ return e.default = t, e
+ };
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var a, s = i(0),
+ u = i(26),
+ l = i(45),
+ h = i(47),
+ p = i(8),
+ g = i(17),
+ c = i(16),
+ d = i(1),
+ _ = i(7),
+ m = i(15),
+ f = i(2),
+ y = m.Live2DCubismFramework.InvalidMotionQueueEntryHandleValue,
+ v = _.Live2DCubismFramework.csmMap,
+ S = d.Live2DCubismFramework.csmVector,
+ C = c.Live2DCubismFramework.CubismBreath,
+ b = c.Live2DCubismFramework.BreathParameterData,
+ x = g.Live2DCubismFramework.CubismEyeBlink,
+ M = p.Live2DCubismFramework.ACubismMotion,
+ L = s.Live2DCubismFramework.CubismFramework,
+ P = u.Live2DCubismFramework.CubismUserModel,
+ B = l.Live2DCubismFramework.CubismModelSettingJson,
+ w = h.Live2DCubismFramework,
+ I = i(11),
+ F = i(5),
+ V = n(i(12));
+ i(48),
+ function (t) {
+ t[t.LoadAssets = 0] = "LoadAssets", t[t.LoadModel = 1] = "LoadModel", t[t.WaitLoadModel = 2] = "WaitLoadModel", t[t.LoadExpression = 3] = "LoadExpression", t[t.WaitLoadExpression = 4] = "WaitLoadExpression", t[t.LoadPhysics = 5] = "LoadPhysics", t[t.WaitLoadPhysics = 6] = "WaitLoadPhysics", t[t.LoadPose = 7] = "LoadPose", t[t.WaitLoadPose = 8] = "WaitLoadPose", t[t.SetupEyeBlink = 9] = "SetupEyeBlink", t[t.SetupBreath = 10] = "SetupBreath", t[t.LoadUserData = 11] = "LoadUserData", t[t.WaitLoadUserData = 12] = "WaitLoadUserData", t[t.SetupEyeBlinkIds = 13] = "SetupEyeBlinkIds", t[t.SetupLipSyncIds = 14] = "SetupLipSyncIds", t[t.SetupLayout = 15] = "SetupLayout", t[t.LoadMotion = 16] = "LoadMotion", t[t.WaitLoadMotion = 17] = "WaitLoadMotion", t[t.CompleteInitialize = 18] = "CompleteInitialize", t[t.CompleteSetupModel = 19] = "CompleteSetupModel", t[t.LoadTexture = 20] = "LoadTexture", t[t.WaitLoadTexture = 21] = "WaitLoadTexture", t[t.CompleteSetup = 22] = "CompleteSetup"
+ }(a || (a = {}));
+ var D = function (t) {
+ function e() {
+ var e = t.call(this) || this;
+ return e._modelSetting = null, e._modelHomeDir = null, e._userTimeSeconds = 0, e._eyeBlinkIds = new S, e._lipSyncIds = new S, e._motions = new v, e._expressions = new v, e._hitArea = new S, e._userArea = new S, e._idParamAngleX = L.getIdManager().getId(w.ParamAngleX), e._idParamAngleY = L.getIdManager().getId(w.ParamAngleY), e._idParamAngleZ = L.getIdManager().getId(w.ParamAngleZ), e._idParamEyeBallX = L.getIdManager().getId(w.ParamEyeBallX), e._idParamEyeBallY = L.getIdManager().getId(w.ParamEyeBallY), e._idParamBodyAngleX = L.getIdManager().getId(w.ParamBodyAngleX), e._state = a.LoadAssets, e._expressionCount = 0, e._textureCount = 0, e._motionCount = 0, e._allMotionCount = 0, e
+ }
+ return o(e, t), e.prototype.loadAssets = function (t, e) {
+ var i = this;
+ this._modelHomeDir = t, fetch(this._modelHomeDir + "/" + e).then((function (t) {
+ return t.arrayBuffer()
+ })).then((function (t) {
+ var e = new B(t, t.byteLength);
+ i._state = a.LoadModel, i.setupModel(e)
+ }))
+ }, e.prototype.setupModel = function (t) {
+ var e = this;
+ if (this._updating = !0, this._initialized = !1, this._modelSetting = t, "" != this._modelSetting.getModelFileName()) {
+ var i = this._modelSetting.getModelFileName();
+ fetch(this._modelHomeDir + "/" + i).then((function (t) {
+ return t.arrayBuffer()
+ })).then((function (t) {
+ e.loadModel(t), e._state = a.LoadExpression, r()
+ })), this._state = a.WaitLoadModel
+ } else I.LAppPal.printMessage("Model data does not exist.");
+ var r = function () {
+ if (e._modelSetting.getExpressionCount() > 0) {
+ for (var t = e._modelSetting.getExpressionCount(), i = function (i) {
+ var r = e._modelSetting.getExpressionName(i),
+ n = e._modelSetting.getExpressionFileName(i);
+ fetch(e._modelHomeDir + "/" + n).then((function (t) {
+ return t.arrayBuffer()
+ })).then((function (i) {
+ var n = e.loadExpression(i, i.byteLength, r);
+ null != e._expressions.getValue(r) && (M.delete(e._expressions.getValue(r)), e._expressions.setValue(r, null)), e._expressions.setValue(r, n), e._expressionCount++, e._expressionCount >= t && (e._state = a.LoadPhysics, o())
+ }))
+ }, r = 0; r < t; r++) i(r);
+ e._state = a.WaitLoadExpression
+ } else e._state = a.LoadPhysics, o()
+ },
+ o = function () {
+ if ("" != e._modelSetting.getPhysicsFileName()) {
+ var t = e._modelSetting.getPhysicsFileName();
+ fetch(e._modelHomeDir + "/" + t).then((function (t) {
+ return t.arrayBuffer()
+ })).then((function (t) {
+ e.loadPhysics(t, t.byteLength), e._state = a.LoadPose, n()
+ })), e._state = a.WaitLoadPhysics
+ } else e._state = a.LoadPose, n()
+ },
+ n = function () {
+ if ("" != e._modelSetting.getPoseFileName()) {
+ var t = e._modelSetting.getPoseFileName();
+ fetch(e._modelHomeDir + "/" + t).then((function (t) {
+ return t.arrayBuffer()
+ })).then((function (t) {
+ e.loadPose(t, t.byteLength), e._state = a.SetupEyeBlink, s()
+ })), e._state = a.WaitLoadPose
+ } else e._state = a.SetupEyeBlink, s()
+ },
+ s = function () {
+ e._modelSetting.getEyeBlinkParameterCount() > 0 && (e._eyeBlink = x.create(e._modelSetting), e._state = a.SetupBreath), u()
+ },
+ u = function () {
+ e._breath = C.create();
+ var t = new S;
+ t.pushBack(new b(e._idParamAngleX, 0, 15, 6.5345, .5)), t.pushBack(new b(e._idParamAngleY, 0, 8, 3.5345, .5)), t.pushBack(new b(e._idParamAngleZ, 0, 10, 5.5345, .5)), t.pushBack(new b(e._idParamBodyAngleX, 0, 4, 15.5345, .5)), t.pushBack(new b(L.getIdManager().getId(w.ParamBreath), 0, .5, 3.2345, .5)), e._breath.setParameters(t), e._state = a.LoadUserData, l()
+ },
+ l = function () {
+ if ("" != e._modelSetting.getUserDataFile()) {
+ var t = e._modelSetting.getUserDataFile();
+ fetch(e._modelHomeDir + "/" + t).then((function (t) {
+ return t.arrayBuffer()
+ })).then((function (t) {
+ e.loadUserData(t, t.byteLength), e._state = a.SetupEyeBlinkIds, h()
+ })), e._state = a.WaitLoadUserData
+ } else e._state = a.SetupEyeBlinkIds, h()
+ },
+ h = function () {
+ for (var t = e._modelSetting.getEyeBlinkParameterCount(), i = 0; i < t; ++i) e._eyeBlinkIds.pushBack(e._modelSetting.getEyeBlinkParameterId(i));
+ e._state = a.SetupLipSyncIds, p()
+ },
+ p = function () {
+ for (var t = e._modelSetting.getLipSyncParameterCount(), i = 0; i < t; ++i) e._lipSyncIds.pushBack(e._modelSetting.getLipSyncParameterId(i));
+ e._state = a.SetupLayout, g()
+ },
+ g = function () {
+ var t = new v;
+ e._modelSetting.getLayoutMap(t), e._modelMatrix.setupFromLayout(t), e._state = a.LoadMotion, c()
+ },
+ c = function () {
+ e._state = a.WaitLoadMotion, e._model.saveParameters(), e._allMotionCount = 0, e._motionCount = 0;
+ for (var t = [], i = e._modelSetting.getMotionGroupCount(), r = 0; r < i; r++) t[r] = e._modelSetting.getMotionGroupName(r), e._allMotionCount += e._modelSetting.getMotionCount(t[r]);
+ for (r = 0; r < i; r++) e.preLoadMotionGroup(t[r]);
+ 0 == i && (e._state = a.LoadTexture, e._motionManager.stopAllMotions(), e._updating = !1, e._initialized = !0, e.createRenderer(), e.setupTextures(), e.getRenderer().startUp(F.gl))
+ }
+ }, e.prototype.setupTextures = function () {
+ var t = this;
+ if (this._state == a.LoadTexture) {
+ for (var e = this._modelSetting.getTextureCount(), i = function (i) {
+ if ("" == r._modelSetting.getTextureFileName(i)) return console.log("getTextureFileName null"), "continue";
+ var o = r._modelSetting.getTextureFileName(i);
+ o = r._modelHomeDir + o;
+ F.LAppDelegate.getInstance().getTextureManager().createTextureFromPngFile(o, !0, (function (r) {
+ t.getRenderer().bindTexture(i, r.id), t._textureCount++, t._textureCount >= e && (t._state = a.CompleteSetup)
+ })), r.getRenderer().setIsPremultipliedAlpha(!0)
+ }, r = this, o = 0; o < e; o++) i(o);
+ this._state = a.WaitLoadTexture
+ }
+ }, e.prototype.reloadRenderer = function () {
+ this.deleteRenderer(), this.createRenderer(), this.setupTextures()
+ }, e.prototype.update = function () {
+ if (this._state == a.CompleteSetup) {
+ var t = I.LAppPal.getDeltaTime();
+ this._userTimeSeconds += t, this._dragManager.update(t), this._dragX = this._dragManager.getX(), this._dragY = this._dragManager.getY();
+ var e = !1;
+ if (this._model.loadParameters(), this._motionManager.isFinished() ? this.startRandomMotion(V.MotionGroupIdle, V.PriorityIdle) : e = this._motionManager.updateMotion(this._model, t), this._model.saveParameters(), e || null != this._eyeBlink && this._eyeBlink.updateParameters(this._model, t), null != this._expressionManager && this._expressionManager.updateMotion(this._model, t), this._model.addParameterValueById(this._idParamAngleX, 30 * this._dragX), this._model.addParameterValueById(this._idParamAngleY, 30 * this._dragY), this._model.addParameterValueById(this._idParamAngleZ, this._dragX * this._dragY * -30), this._model.addParameterValueById(this._idParamBodyAngleX, 10 * this._dragX), this._model.addParameterValueById(this._idParamEyeBallX, this._dragX), this._model.addParameterValueById(this._idParamEyeBallY, this._dragY), null != this._breath && this._breath.updateParameters(this._model, t), null != this._physics && this._physics.evaluate(this._model, t), this._lipsync)
+ for (var i = 0; i < this._lipSyncIds.getSize(); ++i) this._model.addParameterValueById(this._lipSyncIds.at(i), 0, .8);
+ null != this._pose && this._pose.updateParameters(this._model, t), this._model.update()
+ }
+ }, e.prototype.startMotion = function (t, e, i, r) {
+ var o = this;
+ if (i == V.PriorityForce) this._motionManager.setReservePriority(i);
+ else if (!this._motionManager.reserveMotion(i)) return this._debugMode && I.LAppPal.printMessage("[APP]can't start motion."), y;
+ var n = this._modelSetting.getMotionFileName(t, e),
+ a = t + "_" + e,
+ s = this._motions.getValue(a),
+ u = !1;
+ return null == s ? fetch(this._modelHomeDir + "/" + n).then((function (t) {
+ return t.arrayBuffer()
+ })).then((function (i) {
+ s = o.loadMotion(i, i.byteLength, null, r);
+ var n = o._modelSetting.getMotionFadeInTimeValue(t, e);
+ n >= 0 && s.setFadeInTime(n), (n = o._modelSetting.getMotionFadeOutTimeValue(t, e)) >= 0 && s.setFadeOutTime(n), s.setEffectIds(o._eyeBlinkIds, o._lipSyncIds), u = !0
+ })) : s.setFinishedMotionHandler(r), this._debugMode && I.LAppPal.printMessage("[APP]start motion: [" + t + "_" + e), this._motionManager.startMotionPriority(s, u, i)
+ }, e.prototype.startRandomMotion = function (t, e, i) {
+ if (0 == this._modelSetting.getMotionCount(t)) return y;
+ var r = Math.floor(Math.random() * this._modelSetting.getMotionCount(t));
+ return this.startMotion(t, r, e, i)
+ }, e.prototype.setExpression = function (t) {
+ var e = this._expressions.getValue(t);
+ this._debugMode && I.LAppPal.printMessage("[APP]expression: [" + t + "]"), null != e ? this._expressionManager.startMotionPriority(e, !1, V.PriorityForce) : this._debugMode && I.LAppPal.printMessage("[APP]expression[" + t + "] is null")
+ }, e.prototype.setRandomExpression = function () {
+ if (0 != this._expressions.getSize())
+ for (var t = Math.floor(Math.random() * this._expressions.getSize()), e = 0; e < this._expressions.getSize(); e++)
+ if (e == t) {
+ var i = this._expressions._keyValues[e].first;
+ return void this.setExpression(i)
+ }
+ }, e.prototype.motionEventFired = function (t) {
+ f.CubismLogInfo("{0} is fired on LAppModel!!", t.s)
+ }, e.prototype.hitTest = function (t, e, i) {
+ if (this._opacity < 1) return !1;
+ for (var r = this._modelSetting.getHitAreasCount(), o = 0; o < r; o++)
+ if (this._modelSetting.getHitAreaName(o) == t) {
+ var n = this._modelSetting.getHitAreaId(o);
+ return this.isHit(n, e, i)
+ } return !1
+ }, e.prototype.preLoadMotionGroup = function (t) {
+ for (var e = this, i = function (i) {
+ var o = r._modelSetting.getMotionFileName(t, i),
+ n = t + "_" + i;
+ r._debugMode && I.LAppPal.printMessage("[APP]load motion: " + o + " => [" + n + "]"), fetch(r._modelHomeDir + "/" + o).then((function (t) {
+ return t.arrayBuffer()
+ })).then((function (r) {
+ var o = e.loadMotion(r, r.byteLength, n),
+ s = e._modelSetting.getMotionFadeInTimeValue(t, i);
+ s >= 0 && o.setFadeInTime(s), (s = e._modelSetting.getMotionFadeOutTimeValue(t, i)) >= 0 && o.setFadeOutTime(s), o.setEffectIds(e._eyeBlinkIds, e._lipSyncIds), null != e._motions.getValue(n) && M.delete(e._motions.getValue(n)), e._motions.setValue(n, o), e._motionCount++, e._motionCount >= e._allMotionCount && (e._state = a.LoadTexture, e._motionManager.stopAllMotions(), e._updating = !1, e._initialized = !0, e.createRenderer(), e.setupTextures(), e.getRenderer().startUp(F.gl))
+ }))
+ }, r = this, o = 0; o < this._modelSetting.getMotionCount(t); o++) i(o)
+ }, e.prototype.releaseMotions = function () {
+ this._motions.clear()
+ }, e.prototype.releaseExpressions = function () {
+ this._expressions.clear()
+ }, e.prototype.doDraw = function () {
+ if (null != this._model) {
+ var t = [0, 0, F.canvas.width, F.canvas.height];
+ this.getRenderer().setRenderState(F.frameBuffer, t), this.getRenderer().drawModel()
+ }
+ }, e.prototype.draw = function (t) {
+ null != this._model && this._state == a.CompleteSetup && (t.multiplyByMatrix(this._modelMatrix), this.getRenderer().setMvpMatrix(t), this.doDraw())
+ }, e
+ }(P);
+ e.LAppModel = D
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(0),
+ o = i(27),
+ n = i(29),
+ a = i(30),
+ s = i(31),
+ u = i(33),
+ l = i(36),
+ h = i(37),
+ p = i(38),
+ g = i(40),
+ c = i(16),
+ d = i(17),
+ _ = i(43),
+ m = i(2),
+ f = _.Live2DCubismFramework.CubismRenderer_WebGL,
+ y = d.Live2DCubismFramework.CubismEyeBlink,
+ v = c.Live2DCubismFramework.CubismBreath,
+ S = r.Live2DCubismFramework.Constant,
+ C = g.Live2DCubismFramework.CubismPhysics,
+ b = p.Live2DCubismFramework.CubismModelUserData,
+ x = h.Live2DCubismFramework.CubismPose,
+ M = l.Live2DCubismFramework.CubismExpressionMotion,
+ L = u.Live2DCubismFramework.CubismMotion,
+ P = s.Live2DCubismFramework.CubismMoc,
+ B = a.Live2DCubismFramework.CubismModelMatrix,
+ w = n.Live2DCubismFramework.CubismTargetPoint,
+ I = o.Live2DCubismFramework.CubismMotionManager;
+ ! function (t) {
+ var e = function () {
+ function t() {
+ this.loadMotion = function (t, e, i, r) {
+ return L.create(t, e, r)
+ }, this._moc = null, this._model = null, this._motionManager = null, this._expressionManager = null, this._eyeBlink = null, this._breath = null, this._modelMatrix = null, this._pose = null, this._dragManager = null, this._physics = null, this._modelUserData = null, this._initialized = !1, this._updating = !1, this._opacity = 1, this._lipsync = !0, this._lastLipSyncValue = 0, this._dragX = 0, this._dragY = 0, this._accelerationX = 0, this._accelerationY = 0, this._accelerationZ = 0, this._debugMode = !1, this._renderer = null, this._motionManager = new I, this._motionManager.setEventCallback(t.cubismDefaultMotionEventCallback, this), this._expressionManager = new I, this._dragManager = new w
+ }
+ return t.prototype.isInitialized = function () {
+ return this._initialized
+ }, t.prototype.setInitialized = function (t) {
+ this._initialized = t
+ }, t.prototype.isUpdating = function () {
+ return this._updating
+ }, t.prototype.setUpdating = function (t) {
+ this._updating = t
+ }, t.prototype.setDragging = function (t, e) {
+ this._dragManager.set(t, e)
+ }, t.prototype.setAcceleration = function (t, e, i) {
+ this._accelerationX = t, this._accelerationY = e, this._accelerationZ = i
+ }, t.prototype.getModelMatrix = function () {
+ return this._modelMatrix
+ }, t.prototype.setOpacity = function (t) {
+ this._opacity = t
+ }, t.prototype.getOpacity = function () {
+ return this._opacity
+ }, t.prototype.loadModel = function (t) {
+ this._moc = P.create(t), this._model = this._moc.createModel(), this._model.saveParameters(), null != this._moc && null != this._model ? (this._modelMatrix = new B(this._model.getCanvasWidth(), this._model.getCanvasHeight()), console.log("1")) : m.CubismLogError("Failed to CreateModel().")
+ }, t.prototype.loadExpression = function (t, e, i) {
+ return M.create(t, e)
+ }, t.prototype.loadPose = function (t, e) {
+ this._pose = x.create(t, e)
+ }, t.prototype.loadUserData = function (t, e) {
+ this._modelUserData = b.create(t, e)
+ }, t.prototype.loadPhysics = function (t, e) {
+ this._physics = C.create(t, e)
+ }, t.prototype.isHit = function (t, e, i) {
+ var r = this._model.getDrawableIndex(t);
+ if (r < 0) return !1;
+ for (var o = this._model.getDrawableVertexCount(r), n = this._model.getDrawableVertices(r), a = n[0], s = n[0], u = n[1], l = n[1], h = 1; h < o; ++h) {
+ var p = n[S.vertexOffset + h * S.vertexStep],
+ g = n[S.vertexOffset + h * S.vertexStep + 1];
+ p < a && (a = p), p > s && (s = p), g < u && (u = g), g > l && (l = g)
+ }
+ var c = this._modelMatrix.invertTransformX(e),
+ d = this._modelMatrix.invertTransformY(i);
+ return a <= c && c <= s && u <= d && d <= l
+ }, t.prototype.getModel = function () {
+ return this._model
+ }, t.prototype.getRenderer = function () {
+ return this._renderer
+ }, t.prototype.createRenderer = function () {
+ this._renderer && this.deleteRenderer(), this._renderer = new f, this._renderer.initialize(this._model)
+ }, t.prototype.deleteRenderer = function () {
+ null != this._renderer && (this._renderer.release(), this._renderer = null)
+ }, t.prototype.motionEventFired = function (t) {
+ m.CubismLogInfo("{0}", t.s)
+ }, t.cubismDefaultMotionEventCallback = function (t, e, i) {
+ null != i && i.motionEventFired(e)
+ }, t.prototype.release = function () {
+ null != this._motionManager && (this._motionManager.release(), this._motionManager = null), null != this._expressionManager && (this._expressionManager.release(), this._expressionManager = null), null != this._moc && (this._moc.deleteModel(this._model), this._moc.release(), this._moc = null), this._modelMatrix = null, x.delete(this._pose), y.delete(this._eyeBlink), v.delete(this._breath), this._dragManager = null, C.delete(this._physics), b.delete(this._modelUserData), this.deleteRenderer()
+ }, t
+ }();
+ t.CubismUserModel = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ var r, o = this && this.__extends || (r = function (t, e) {
+ return (r = Object.setPrototypeOf || {
+ __proto__: []
+ }
+ instanceof Array && function (t, e) {
+ t.__proto__ = e
+ } || function (t, e) {
+ for (var i in e) e.hasOwnProperty(i) && (t[i] = e[i])
+ })(t, e)
+ }, function (t, e) {
+ function i() {
+ this.constructor = t
+ }
+ r(t, e), t.prototype = null === e ? Object.create(e) : (i.prototype = e.prototype, new i)
+ });
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var n = i(15).Live2DCubismFramework.CubismMotionQueueManager;
+ ! function (t) {
+ var e = function (t) {
+ function e() {
+ var e = t.call(this) || this;
+ return e._currentPriority = 0, e._reservePriority = 0, e
+ }
+ return o(e, t), e.prototype.getCurrentPriority = function () {
+ return this._currentPriority
+ }, e.prototype.getReservePriority = function () {
+ return this._reservePriority
+ }, e.prototype.setReservePriority = function (t) {
+ this._reservePriority = t
+ }, e.prototype.startMotionPriority = function (e, i, r) {
+ return r == this._reservePriority && (this._reservePriority = 0), this._currentPriority = r, t.prototype.startMotion.call(this, e, i, this._userTimeSeconds)
+ }, e.prototype.updateMotion = function (e, i) {
+ this._userTimeSeconds += i;
+ var r = t.prototype.doUpdateMotion.call(this, e, this._userTimeSeconds);
+ return this.isFinished() && (this._currentPriority = 0), r
+ }, e.prototype.reserveMotion = function (t) {
+ return !(t <= this._reservePriority || t <= this._currentPriority) && (this._reservePriority = t, !0)
+ }, e
+ }(n);
+ t.CubismMotionManager = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(8).Live2DCubismFramework.ACubismMotion;
+ ! function (t) {
+ var e = function () {
+ function t() {
+ this._autoDelete = !1, this._motion = null, this._available = !0, this._finished = !1, this._started = !1, this._startTimeSeconds = -1, this._fadeInStartTimeSeconds = 0, this._endTimeSeconds = -1, this._stateTimeSeconds = 0, this._stateWeight = 0, this._lastEventCheckSeconds = 0, this._motionQueueEntryHandle = this
+ }
+ return t.prototype.release = function () {
+ this._autoDelete && this._motion && r.delete(this._motion)
+ }, t.prototype.startFadeout = function (t, e) {
+ var i = e + t;
+ (this._endTimeSeconds < 0 || i < this._endTimeSeconds) && (this._endTimeSeconds = i)
+ }, t.prototype.isFinished = function () {
+ return this._finished
+ }, t.prototype.isStarted = function () {
+ return this._started
+ }, t.prototype.getStartTime = function () {
+ return this._startTimeSeconds
+ }, t.prototype.getFadeInStartTime = function () {
+ return this._fadeInStartTimeSeconds
+ }, t.prototype.getEndTime = function () {
+ return this._endTimeSeconds
+ }, t.prototype.setStartTime = function (t) {
+ this._startTimeSeconds = t
+ }, t.prototype.setFadeInStartTime = function (t) {
+ this._fadeInStartTimeSeconds = t
+ }, t.prototype.setEndTime = function (t) {
+ this._endTimeSeconds = t
+ }, t.prototype.setIsFinished = function (t) {
+ this._finished = t
+ }, t.prototype.setIsStarted = function (t) {
+ this._started = t
+ }, t.prototype.isAvailable = function () {
+ return this._available
+ }, t.prototype.setIsAvailable = function (t) {
+ this._available = t
+ }, t.prototype.setState = function (t, e) {
+ this._stateTimeSeconds = t, this._stateWeight = e
+ }, t.prototype.getStateTime = function () {
+ return this._stateTimeSeconds
+ }, t.prototype.getStateWeight = function () {
+ return this._stateWeight
+ }, t.prototype.getLastCheckEventTime = function () {
+ return this._lastEventCheckSeconds
+ }, t.prototype.setLastCheckEventTime = function (t) {
+ this._lastEventCheckSeconds = t
+ }, t
+ }();
+ t.CubismMotionQueueEntry = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(9).Live2DCubismFramework.CubismMath;
+ ! function (t) {
+ var e = function () {
+ function t() {
+ this._faceTargetX = 0, this._faceTargetY = 0, this._faceX = 0, this._faceY = 0, this._faceVX = 0, this._faceVY = 0, this._lastTimeSeconds = 0, this._userTimeSeconds = 0
+ }
+ return t.prototype.update = function (t) {
+ this._userTimeSeconds += t;
+ if (0 != this._lastTimeSeconds) {
+ var e = 30 * (this._userTimeSeconds - this._lastTimeSeconds);
+ this._lastTimeSeconds = this._userTimeSeconds;
+ var i = e * (4 / 30) / 4.5,
+ o = this._faceTargetX - this._faceX,
+ n = this._faceTargetY - this._faceY;
+ if (!(r.abs(o) <= .01 && r.abs(n) <= .01)) {
+ var a = r.sqrt(o * o + n * n),
+ s = 4 / 30 * n / a,
+ u = 4 / 30 * o / a - this._faceVX,
+ l = s - this._faceVY,
+ h = r.sqrt(u * u + l * l);
+ (h < -i || h > i) && (u *= i / h, l *= i / h), this._faceVX += u, this._faceVY += l;
+ var p = .5 * (r.sqrt(i * i + 16 * i * a - 8 * i * a) - i),
+ g = r.sqrt(this._faceVX * this._faceVX + this._faceVY * this._faceVY);
+ g > p && (this._faceVX *= p / g, this._faceVY *= p / g), this._faceX += this._faceVX, this._faceY += this._faceVY
+ }
+ } else this._lastTimeSeconds = this._userTimeSeconds
+ }, t.prototype.getX = function () {
+ return this._faceX
+ }, t.prototype.getY = function () {
+ return this._faceY
+ }, t.prototype.set = function (t, e) {
+ this._faceTargetX = t, this._faceTargetY = e
+ }, t
+ }();
+ t.CubismTargetPoint = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ var r, o = this && this.__extends || (r = function (t, e) {
+ return (r = Object.setPrototypeOf || {
+ __proto__: []
+ }
+ instanceof Array && function (t, e) {
+ t.__proto__ = e
+ } || function (t, e) {
+ for (var i in e) e.hasOwnProperty(i) && (t[i] = e[i])
+ })(t, e)
+ }, function (t, e) {
+ function i() {
+ this.constructor = t
+ }
+ r(t, e), t.prototype = null === e ? Object.create(e) : (i.prototype = e.prototype, new i)
+ });
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var n = i(4).Live2DCubismFramework.CubismMatrix44;
+ ! function (t) {
+ var e = function (t) {
+ function e(e, i) {
+ var r = t.call(this) || this;
+ return r._width = void 0 !== e ? e : 0, r._height = void 0 !== i ? i : 0, r.setHeight(2), r
+ }
+ return o(e, t), e.prototype.setWidth = function (t) {
+ var e = t / this._width,
+ i = e;
+ this.scale(e, i)
+ }, e.prototype.setHeight = function (t) {
+ var e = t / this._height,
+ i = e;
+ this.scale(e, i)
+ }, e.prototype.setPosition = function (t, e) {
+ this.translate(t, e)
+ }, e.prototype.setCenterPosition = function (t, e) {
+ this.centerX(t), this.centerY(e)
+ }, e.prototype.top = function (t) {
+ this.setY(t)
+ }, e.prototype.bottom = function (t) {
+ var e = this._height * this.getScaleY();
+ this.translateY(t - e)
+ }, e.prototype.left = function (t) {
+ this.setX(t)
+ }, e.prototype.right = function (t) {
+ var e = this._width * this.getScaleX();
+ this.translateX(t - e)
+ }, e.prototype.centerX = function (t) {
+ var e = this._width * this.getScaleX();
+ this.translateX(t - e / 2)
+ }, e.prototype.setX = function (t) {
+ this.translateX(t)
+ }, e.prototype.centerY = function (t) {
+ var e = this._height * this.getScaleY();
+ this.translateY(t - e / 2)
+ }, e.prototype.setY = function (t) {
+ this.translateY(t)
+ }, e.prototype.setupFromLayout = function (t) {
+ for (var e = t.begin(); e.notEqual(t.end()); e.preIncrement()) {
+ var i = e.ptr().first,
+ r = e.ptr().second;
+ "width" == i ? this.setWidth(r) : "height" == i && this.setHeight(r)
+ }
+ for (e = t.begin(); e.notEqual(t.end()); e.preIncrement()) {
+ i = e.ptr().first, r = e.ptr().second;
+ "x" == i ? this.setX(r) : "y" == i ? this.setY(r) : "center_x" == i ? this.centerX(r) : "center_y" == i ? this.centerY(r) : "top" == i ? this.top(r) : "bottom" == i ? this.bottom(r) : "left" == i ? this.left(r) : "right" == i && this.right(r)
+ }
+ }, e
+ }(n);
+ t.CubismModelMatrix = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(32).Live2DCubismFramework.CubismModel,
+ o = i(2);
+ ! function (t) {
+ var e = function () {
+ function t(t) {
+ this._moc = t, this._modelCount = 0
+ }
+ return t.create = function (e) {
+ var i = null,
+ r = Live2DCubismCore.Moc.fromArrayBuffer(e);
+ return r && (i = new t(r)), i
+ }, t.delete = function (t) {
+ t._moc._release(), t._moc = null, t = null
+ }, t.prototype.createModel = function () {
+ var t = null,
+ e = Live2DCubismCore.Model.fromMoc(this._moc);
+ return e && ((t = new r(e)).initialize(), ++this._modelCount), t
+ }, t.prototype.deleteModel = function (t) {
+ null != t && (t.release(), t = null, --this._modelCount)
+ }, t.prototype.release = function () {
+ o.CSM_ASSERT(0 == this._modelCount), this._moc._release(), this._moc = null
+ }, t
+ }();
+ t.CubismMoc = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(13),
+ o = i(0),
+ n = i(7),
+ a = i(1),
+ s = i(2),
+ u = o.Live2DCubismFramework.CubismFramework,
+ l = r.Live2DCubismFramework.CubismBlendMode,
+ h = a.Live2DCubismFramework.csmVector,
+ p = n.Live2DCubismFramework.csmMap;
+ ! function (t) {
+ var e = function () {
+ function t(t) {
+ this._model = t, this._parameterValues = null, this._parameterMaximumValues = null, this._parameterMinimumValues = null, this._partOpacities = null, this._savedParameters = new h, this._parameterIds = new h, this._drawableIds = new h, this._partIds = new h, this._notExistPartId = new p, this._notExistParameterId = new p, this._notExistParameterValues = new p, this._notExistPartOpacities = new p
+ }
+ return t.prototype.update = function () {
+ this._model.update(), this._model.drawables.resetDynamicFlags()
+ }, t.prototype.getCanvasWidth = function () {
+ return null == this._model ? 0 : this._model.canvasinfo.CanvasWidth / this._model.canvasinfo.PixelsPerUnit
+ }, t.prototype.getCanvasHeight = function () {
+ return null == this._model ? 0 : this._model.canvasinfo.CanvasHeight / this._model.canvasinfo.PixelsPerUnit
+ }, t.prototype.saveParameters = function () {
+ for (var t = this._model.parameters.count, e = this._savedParameters.getSize(), i = 0; i < t; ++i) i < e ? this._savedParameters.set(i, this._parameterValues[i]) : this._savedParameters.pushBack(this._parameterValues[i])
+ }, t.prototype.getModel = function () {
+ return this._model
+ }, t.prototype.getPartIndex = function (t) {
+ var e, i = this._model.parts.count;
+ for (e = 0; e < i; ++e)
+ if (t == this._partIds.at(e)) return e;
+ return this._notExistPartId.isExist(t) ? this._notExistPartId.getValue(t) : (e = i + this._notExistPartId.getSize(), this._notExistPartId.setValue(t, e), this._notExistPartOpacities.appendKey(e), e)
+ }, t.prototype.getPartCount = function () {
+ return this._model.parts.count
+ }, t.prototype.setPartOpacityByIndex = function (t, e) {
+ this._notExistPartOpacities.isExist(t) ? this._notExistPartOpacities.setValue(t, e) : (s.CSM_ASSERT(0 <= t && t < this.getPartCount()), this._partOpacities[t] = e)
+ }, t.prototype.setPartOpacityById = function (t, e) {
+ var i = this.getPartIndex(t);
+ i < 0 || this.setPartOpacityByIndex(i, e)
+ }, t.prototype.getPartOpacityByIndex = function (t) {
+ return this._notExistPartOpacities.isExist(t) ? this._notExistPartOpacities.getValue(t) : (s.CSM_ASSERT(0 <= t && t < this.getPartCount()), this._partOpacities[t])
+ }, t.prototype.getPartOpacityById = function (t) {
+ var e = this.getPartIndex(t);
+ return e < 0 ? 0 : this.getPartOpacityByIndex(e)
+ }, t.prototype.getParameterIndex = function (t) {
+ var e, i = this._model.parameters.count;
+ for (e = 0; e < i; ++e)
+ if (t == this._parameterIds.at(e)) return e;
+ return this._notExistParameterId.isExist(t) ? this._notExistParameterId.getValue(t) : (e = this._model.parameters.count + this._notExistParameterId.getSize(), this._notExistParameterId.setValue(t, e), this._notExistParameterValues.appendKey(e), e)
+ }, t.prototype.getParameterCount = function () {
+ return this._model.parameters.count
+ }, t.prototype.getParameterMaximumValue = function (t) {
+ return this._model.parameters.maximumValues[t]
+ }, t.prototype.getParameterMinimumValue = function (t) {
+ return this._model.parameters.minimumValues[t]
+ }, t.prototype.getParameterDefaultValue = function (t) {
+ return this._model.parameters.defaultValues[t]
+ }, t.prototype.getParameterValueByIndex = function (t) {
+ return this._notExistParameterValues.isExist(t) ? this._notExistParameterValues.getValue(t) : (s.CSM_ASSERT(0 <= t && t < this.getParameterCount()), this._parameterValues[t])
+ }, t.prototype.getParameterValueById = function (t) {
+ var e = this.getParameterIndex(t);
+ return this.getParameterValueByIndex(e)
+ }, t.prototype.setParameterValueByIndex = function (t, e, i) {
+ void 0 === i && (i = 1), this._notExistParameterValues.isExist(t) ? this._notExistParameterValues.setValue(t, 1 == i ? e : this._notExistParameterValues.getValue(t) * (1 - i) + e * i) : (s.CSM_ASSERT(0 <= t && t < this.getParameterCount()), this._model.parameters.maximumValues[t] < e && (e = this._model.parameters.maximumValues[t]), this._model.parameters.minimumValues[t] > e && (e = this._model.parameters.minimumValues[t]), this._parameterValues[t] = 1 == i ? e : this._parameterValues[t] = this._parameterValues[t] * (1 - i) + e * i)
+ }, t.prototype.setParameterValueById = function (t, e, i) {
+ void 0 === i && (i = 1);
+ var r = this.getParameterIndex(t);
+ this.setParameterValueByIndex(r, e, i)
+ }, t.prototype.addParameterValueByIndex = function (t, e, i) {
+ void 0 === i && (i = 1), this.setParameterValueByIndex(t, this.getParameterValueByIndex(t) + e * i)
+ }, t.prototype.addParameterValueById = function (t, e, i) {
+ void 0 === i && (i = 1);
+ var r = this.getParameterIndex(t);
+ this.addParameterValueByIndex(r, e, i)
+ }, t.prototype.multiplyParameterValueById = function (t, e, i) {
+ void 0 === i && (i = 1);
+ var r = this.getParameterIndex(t);
+ this.multiplyParameterValueByIndex(r, e, i)
+ }, t.prototype.multiplyParameterValueByIndex = function (t, e, i) {
+ void 0 === i && (i = 1), this.setParameterValueByIndex(t, this.getParameterValueByIndex(t) * (1 + (e - 1) * i))
+ }, t.prototype.getDrawableIndex = function (t) {
+ for (var e = this._model.drawables.count, i = 0; i < e; ++i)
+ if (this._drawableIds.at(i) == t) return i;
+ return -1
+ }, t.prototype.getDrawableCount = function () {
+ return this._model.drawables.count
+ }, t.prototype.getDrawableId = function (t) {
+ var e = this._model.drawables.ids;
+ return u.getIdManager().getId(e[t])
+ }, t.prototype.getDrawableRenderOrders = function () {
+ return this._model.drawables.renderOrders
+ }, t.prototype.getDrawableTextureIndices = function (t) {
+ return this._model.drawables.textureIndices[t]
+ }, t.prototype.getDrawableDynamicFlagVertexPositionsDidChange = function (t) {
+ var e = this._model.drawables.dynamicFlags;
+ return Live2DCubismCore.Utils.hasVertexPositionsDidChangeBit(e[t])
+ }, t.prototype.getDrawableVertexIndexCount = function (t) {
+ return this._model.drawables.indexCounts[t]
+ }, t.prototype.getDrawableVertexCount = function (t) {
+ return this._model.drawables.vertexCounts[t]
+ }, t.prototype.getDrawableVertices = function (t) {
+ return this.getDrawableVertexPositions(t)
+ }, t.prototype.getDrawableVertexIndices = function (t) {
+ return this._model.drawables.indices[t]
+ }, t.prototype.getDrawableVertexPositions = function (t) {
+ return this._model.drawables.vertexPositions[t]
+ }, t.prototype.getDrawableVertexUvs = function (t) {
+ return this._model.drawables.vertexUvs[t]
+ }, t.prototype.getDrawableOpacity = function (t) {
+ return this._model.drawables.opacities[t]
+ }, t.prototype.getDrawableCulling = function (t) {
+ var e = this._model.drawables.constantFlags;
+ return !Live2DCubismCore.Utils.hasIsDoubleSidedBit(e[t])
+ }, t.prototype.getDrawableBlendMode = function (t) {
+ var e = this._model.drawables.constantFlags;
+ return Live2DCubismCore.Utils.hasBlendAdditiveBit(e[t]) ? l.CubismBlendMode_Additive : Live2DCubismCore.Utils.hasBlendMultiplicativeBit(e[t]) ? l.CubismBlendMode_Multiplicative : l.CubismBlendMode_Normal
+ }, t.prototype.getDrawableInvertedMaskBit = function (t) {
+ var e = this._model.drawables.constantFlags;
+ return Live2DCubismCore.Utils.hasIsInvertedMaskBit(e[t])
+ }, t.prototype.getDrawableMasks = function () {
+ return this._model.drawables.masks
+ }, t.prototype.getDrawableMaskCounts = function () {
+ return this._model.drawables.maskCounts
+ }, t.prototype.isUsingMasking = function () {
+ for (var t = 0; t < this._model.drawables.count; ++t)
+ if (!(this._model.drawables.maskCounts[t] <= 0)) return !0;
+ return !1
+ }, t.prototype.getDrawableDynamicFlagIsVisible = function (t) {
+ var e = this._model.drawables.dynamicFlags;
+ return Live2DCubismCore.Utils.hasIsVisibleBit(e[t])
+ }, t.prototype.getDrawableDynamicFlagVisibilityDidChange = function (t) {
+ var e = this._model.drawables.dynamicFlags;
+ return Live2DCubismCore.Utils.hasVisibilityDidChangeBit(e[t])
+ }, t.prototype.getDrawableDynamicFlagOpacityDidChange = function (t) {
+ var e = this._model.drawables.dynamicFlags;
+ return Live2DCubismCore.Utils.hasOpacityDidChangeBit(e[t])
+ }, t.prototype.getDrawableDynamicFlagRenderOrderDidChange = function (t) {
+ var e = this._model.drawables.dynamicFlags;
+ return Live2DCubismCore.Utils.hasRenderOrderDidChangeBit(e[t])
+ }, t.prototype.loadParameters = function () {
+ var t = this._model.parameters.count,
+ e = this._savedParameters.getSize();
+ t > e && (t = e);
+ for (var i = 0; i < t; ++i) this._parameterValues[i] = this._savedParameters.at(i)
+ }, t.prototype.initialize = function () {
+ s.CSM_ASSERT(this._model), this._parameterValues = this._model.parameters.values, this._partOpacities = this._model.parts.opacities, this._parameterMaximumValues = this._model.parameters.maximumValues, this._parameterMinimumValues = this._model.parameters.minimumValues;
+ var t = this._model.parameters.ids,
+ e = this._model.parameters.count;
+ this._parameterIds.prepareCapacity(e);
+ for (var i = 0; i < e; ++i) this._parameterIds.pushBack(u.getIdManager().getId(t[i]));
+ var r = this._model.parts.ids,
+ o = this._model.parts.count;
+ this._partIds.prepareCapacity(o);
+ for (i = 0; i < o; ++i) this._partIds.pushBack(u.getIdManager().getId(r[i]));
+ var n = this._model.drawables.ids,
+ a = this._model.drawables.count;
+ this._drawableIds.prepareCapacity(a);
+ for (i = 0; i < a; ++i) this._drawableIds.pushBack(u.getIdManager().getId(n[i]))
+ }, t.prototype.release = function () {
+ this._model.release(), this._model = null
+ }, t
+ }();
+ t.CubismModel = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ var r, o = this && this.__extends || (r = function (t, e) {
+ return (r = Object.setPrototypeOf || {
+ __proto__: []
+ }
+ instanceof Array && function (t, e) {
+ t.__proto__ = e
+ } || function (t, e) {
+ for (var i in e) e.hasOwnProperty(i) && (t[i] = e[i])
+ })(t, e)
+ }, function (t, e) {
+ function i() {
+ this.constructor = t
+ }
+ r(t, e), t.prototype = null === e ? Object.create(e) : (i.prototype = e.prototype, new i)
+ });
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var n = i(34),
+ a = i(35),
+ s = i(8),
+ u = i(0),
+ l = i(9),
+ h = i(6),
+ p = i(2),
+ g = h.Live2DCubismFramework.csmString,
+ c = a.Live2DCubismFramework.CubismMotionData,
+ d = a.Live2DCubismFramework.CubismMotionSegment,
+ _ = a.Live2DCubismFramework.CubismMotionPoint,
+ m = a.Live2DCubismFramework.CubismMotionEvent,
+ f = a.Live2DCubismFramework.CubismMotionSegmentType,
+ y = a.Live2DCubismFramework.CubismMotionCurve,
+ v = a.Live2DCubismFramework.CubismMotionCurveTarget,
+ S = l.Live2DCubismFramework.CubismMath,
+ C = u.Live2DCubismFramework.CubismFramework,
+ b = s.Live2DCubismFramework.ACubismMotion,
+ x = n.Live2DCubismFramework.CubismMotionJson;
+ ! function (t) {
+ function e(t, e, i) {
+ var r = new _;
+ return r.time = t.time + (e.time - t.time) * i, r.value = t.value + (e.value - t.value) * i, r
+ }
+
+ function i(t, e) {
+ var i = (e - t[0].time) / (t[1].time - t[0].time);
+ return i < 0 && (i = 0), t[0].value + (t[1].value - t[0].value) * i
+ }
+
+ function r(t, i) {
+ var r = (i - t[0].time) / (t[3].time - t[0].time);
+ r < 0 && (r = 0);
+ var o = e(t[0], t[1], r),
+ n = e(t[1], t[2], r),
+ a = e(t[2], t[3], r),
+ s = e(o, n, r),
+ u = e(n, a, r);
+ return e(s, u, r).value
+ }
+
+ function n(t, e) {
+ return t[0].value
+ }
+
+ function a(t, e) {
+ return t[1].value
+ }
+
+ function s(t, e, i) {
+ for (var r = t.curves.at(e), o = -1, n = r.baseSegmentIndex + r.segmentCount, a = 0, s = r.baseSegmentIndex; s < n; ++s)
+ if (a = t.segments.at(s).basePointIndex + (t.segments.at(s).segmentType == f.CubismMotionSegmentType_Bezier ? 3 : 1), t.points.at(a).time > i) {
+ o = s;
+ break
+ } if (-1 == o) return t.points.at(a).value;
+ var u = t.segments.at(o);
+ return u.evaluate(t.points.get(u.basePointIndex), i)
+ }
+ var u = function (t) {
+ function e() {
+ var e = t.call(this) || this;
+ return e._sourceFrameRate = 30, e._loopDurationSeconds = -1, e._isLoop = !1, e._isLoopFadeIn = !0, e._lastWeight = 0, e._motionData = null, e._modelCurveIdEyeBlink = null, e._modelCurveIdLipSync = null, e._eyeBlinkParameterIds = null, e._lipSyncParameterIds = null, e
+ }
+ return o(e, t), e.create = function (t, i, r) {
+ var o = new e;
+ return o.parse(t, i), o._sourceFrameRate = o._motionData.fps, o._loopDurationSeconds = o._motionData.duration, o._onFinishedMotion = r, o
+ }, e.prototype.doUpdateParameters = function (t, e, i, r) {
+ null == this._modelCurveIdEyeBlink && (this._modelCurveIdEyeBlink = C.getIdManager().getId("EyeBlink")), null == this._modelCurveIdLipSync && (this._modelCurveIdLipSync = C.getIdManager().getId("LipSync"));
+ var o = e - r.getStartTime();
+ o < 0 && (o = 0);
+ var n = Number.MAX_VALUE,
+ a = Number.MAX_VALUE,
+ u = 0,
+ l = 0;
+ this._eyeBlinkParameterIds.getSize() > 64 && p.CubismLogDebug("too many eye blink targets : {0}", this._eyeBlinkParameterIds.getSize()), this._lipSyncParameterIds.getSize() > 64 && p.CubismLogDebug("too many lip sync targets : {0}", this._lipSyncParameterIds.getSize());
+ var h, g, c, d = this._fadeInSeconds <= 0 ? 1 : S.getEasingSine((e - r.getFadeInStartTime()) / this._fadeInSeconds),
+ _ = this._fadeOutSeconds <= 0 || r.getEndTime() < 0 ? 1 : S.getEasingSine((r.getEndTime() - e) / this._fadeOutSeconds),
+ m = o;
+ if (this._isLoop)
+ for (; m > this._motionData.duration;) m -= this._motionData.duration;
+ var f = this._motionData.curves;
+ for (g = 0; g < this._motionData.curveCount && f.at(g).type == v.CubismMotionCurveTarget_Model; ++g) h = s(this._motionData, g, m), f.at(g).id == this._modelCurveIdEyeBlink ? a = h : f.at(g).id == this._modelCurveIdLipSync && (n = h);
+ for (; g < this._motionData.curveCount && f.at(g).type == v.CubismMotionCurveTarget_Parameter; ++g)
+ if (-1 != (c = t.getParameterIndex(f.at(g).id))) {
+ var y = t.getParameterValueByIndex(c);
+ if (h = s(this._motionData, g, m), a != Number.MAX_VALUE)
+ for (var b = 0; b < this._eyeBlinkParameterIds.getSize() && b < 64; ++b)
+ if (this._eyeBlinkParameterIds.at(b) == f.at(g).id) {
+ h *= a, l |= 1 << b;
+ break
+ } if (n != Number.MAX_VALUE)
+ for (b = 0; b < this._lipSyncParameterIds.getSize() && b < 64; ++b)
+ if (this._lipSyncParameterIds.at(b) == f.at(g).id) {
+ h += n, u |= 1 << b;
+ break
+ } var x = void 0;
+ if (f.at(g).fadeInTime < 0 && f.at(g).fadeOutTime < 0) x = y + (h - y) * i;
+ else {
+ var M = void 0,
+ L = void 0;
+ M = f.at(g).fadeInTime < 0 ? d : 0 == f.at(g).fadeInTime ? 1 : S.getEasingSine((e - r.getFadeInStartTime()) / f.at(g).fadeInTime), L = f.at(g).fadeOutTime < 0 ? _ : 0 == f.at(g).fadeOutTime || r.getEndTime() < 0 ? 1 : S.getEasingSine((r.getEndTime() - e) / f.at(g).fadeOutTime), x = y + (h - y) * (this._weight * M * L)
+ }
+ t.setParameterValueByIndex(c, x, 1)
+ } if (a != Number.MAX_VALUE)
+ for (b = 0; b < this._eyeBlinkParameterIds.getSize() && b < 64; ++b) {
+ y = t.getParameterValueById(this._eyeBlinkParameterIds.at(b));
+ if (!(l >> b & 1)) {
+ x = y + (a - y) * i;
+ t.setParameterValueById(this._eyeBlinkParameterIds.at(b), x)
+ }
+ }
+ if (n != Number.MAX_VALUE)
+ for (b = 0; b < this._lipSyncParameterIds.getSize() && b < 64; ++b) {
+ y = t.getParameterValueById(this._lipSyncParameterIds.at(b));
+ if (!(u >> b & 1)) {
+ x = y + (n - y) * i;
+ t.setParameterValueById(this._lipSyncParameterIds.at(b), x)
+ }
+ }
+ for (; g < this._motionData.curveCount && f.at(g).type == v.CubismMotionCurveTarget_PartOpacity; ++g) - 1 != (c = t.getParameterIndex(f.at(g).id)) && (h = s(this._motionData, g, m), t.setParameterValueByIndex(c, h));
+ o >= this._motionData.duration && (this._isLoop ? (r.setStartTime(e), this._isLoopFadeIn && r.setFadeInStartTime(e)) : (this._onFinishedMotion && this._onFinishedMotion(this), r.setIsFinished(!0))), this._lastWeight = i
+ }, e.prototype.setIsLoop = function (t) {
+ this._isLoop = t
+ }, e.prototype.isLoop = function () {
+ return this._isLoop
+ }, e.prototype.setIsLoopFadeIn = function (t) {
+ this._isLoopFadeIn = t
+ }, e.prototype.isLoopFadeIn = function () {
+ return this._isLoopFadeIn
+ }, e.prototype.getDuration = function () {
+ return this._isLoop ? -1 : this._loopDurationSeconds
+ }, e.prototype.getLoopDuration = function () {
+ return this._loopDurationSeconds
+ }, e.prototype.setParameterFadeInTime = function (t, e) {
+ for (var i = this._motionData.curves, r = 0; r < this._motionData.curveCount; ++r)
+ if (t == i.at(r).id) return void(i.at(r).fadeInTime = e)
+ }, e.prototype.setParameterFadeOutTime = function (t, e) {
+ for (var i = this._motionData.curves, r = 0; r < this._motionData.curveCount; ++r)
+ if (t == i.at(r).id) return void(i.at(r).fadeOutTime = e)
+ }, e.prototype.getParameterFadeInTime = function (t) {
+ for (var e = this._motionData.curves, i = 0; i < this._motionData.curveCount; ++i)
+ if (t == e.at(i).id) return e.at(i).fadeInTime;
+ return -1
+ }, e.prototype.getParameterFadeOutTime = function (t) {
+ for (var e = this._motionData.curves, i = 0; i < this._motionData.curveCount; ++i)
+ if (t == e.at(i).id) return e.at(i).fadeOutTime;
+ return -1
+ }, e.prototype.setEffectIds = function (t, e) {
+ this._eyeBlinkParameterIds = t, this._lipSyncParameterIds = e
+ }, e.prototype.release = function () {
+ this._motionData = void 0, this._motionData = null
+ }, e.prototype.parse = function (t, e) {
+ this._motionData = new c;
+ var o = new x(t, e);
+ this._motionData.duration = o.getMotionDuration(), this._motionData.loop = o.isMotionLoop(), this._motionData.curveCount = o.getMotionCurveCount(), this._motionData.fps = o.getMotionFps(), this._motionData.eventCount = o.getEventCount(), o.isExistMotionFadeInTime() ? this._fadeInSeconds = o.getMotionFadeInTime() < 0 ? 1 : o.getMotionFadeInTime() : this._fadeInSeconds = 1, o.isExistMotionFadeOutTime() ? this._fadeOutSeconds = o.getMotionFadeOutTime() < 0 ? 1 : o.getMotionFadeOutTime() : this._fadeOutSeconds = 1, this._motionData.curves.updateSize(this._motionData.curveCount, y, !0), this._motionData.segments.updateSize(o.getMotionTotalSegmentCount(), d, !0), this._motionData.points.updateSize(o.getMotionTotalPointCount(), _, !0), this._motionData.events.updateSize(this._motionData.eventCount, m, !0);
+ for (var s = 0, u = 0, l = 0; l < this._motionData.curveCount; ++l) {
+ "Model" == o.getMotionCurveTarget(l) ? this._motionData.curves.at(l).type = v.CubismMotionCurveTarget_Model : "Parameter" == o.getMotionCurveTarget(l) ? this._motionData.curves.at(l).type = v.CubismMotionCurveTarget_Parameter : "PartOpacity" == o.getMotionCurveTarget(l) && (this._motionData.curves.at(l).type = v.CubismMotionCurveTarget_PartOpacity), this._motionData.curves.at(l).id = o.getMotionCurveId(l), this._motionData.curves.at(l).baseSegmentIndex = u, this._motionData.curves.at(l).fadeInTime = o.isExistMotionCurveFadeInTime(l) ? o.getMotionCurveFadeInTime(l) : -1, this._motionData.curves.at(l).fadeOutTime = o.isExistMotionCurveFadeOutTime(l) ? o.getMotionCurveFadeOutTime(l) : -1;
+ for (var h = 0; h < o.getMotionCurveSegmentCount(l);) {
+ switch (0 == h ? (this._motionData.segments.at(u).basePointIndex = s, this._motionData.points.at(s).time = o.getMotionCurveSegment(l, h), this._motionData.points.at(s).value = o.getMotionCurveSegment(l, h + 1), s += 1, h += 2) : this._motionData.segments.at(u).basePointIndex = s - 1, o.getMotionCurveSegment(l, h)) {
+ case f.CubismMotionSegmentType_Linear:
+ this._motionData.segments.at(u).segmentType = f.CubismMotionSegmentType_Linear, this._motionData.segments.at(u).evaluate = i, this._motionData.points.at(s).time = o.getMotionCurveSegment(l, h + 1), this._motionData.points.at(s).value = o.getMotionCurveSegment(l, h + 2), s += 1, h += 3;
+ break;
+ case f.CubismMotionSegmentType_Bezier:
+ this._motionData.segments.at(u).segmentType = f.CubismMotionSegmentType_Bezier, this._motionData.segments.at(u).evaluate = r, this._motionData.points.at(s).time = o.getMotionCurveSegment(l, h + 1), this._motionData.points.at(s).value = o.getMotionCurveSegment(l, h + 2), this._motionData.points.at(s + 1).time = o.getMotionCurveSegment(l, h + 3), this._motionData.points.at(s + 1).value = o.getMotionCurveSegment(l, h + 4), this._motionData.points.at(s + 2).time = o.getMotionCurveSegment(l, h + 5), this._motionData.points.at(s + 2).value = o.getMotionCurveSegment(l, h + 6), s += 3, h += 7;
+ break;
+ case f.CubismMotionSegmentType_Stepped:
+ this._motionData.segments.at(u).segmentType = f.CubismMotionSegmentType_Stepped, this._motionData.segments.at(u).evaluate = n, this._motionData.points.at(s).time = o.getMotionCurveSegment(l, h + 1), this._motionData.points.at(s).value = o.getMotionCurveSegment(l, h + 2), s += 1, h += 3;
+ break;
+ case f.CubismMotionSegmentType_InverseStepped:
+ this._motionData.segments.at(u).segmentType = f.CubismMotionSegmentType_InverseStepped, this._motionData.segments.at(u).evaluate = a, this._motionData.points.at(s).time = o.getMotionCurveSegment(l, h + 1), this._motionData.points.at(s).value = o.getMotionCurveSegment(l, h + 2), s += 1, h += 3;
+ break;
+ default:
+ p.CSM_ASSERT(0)
+ }++this._motionData.curves.at(l).segmentCount, ++u
+ }
+ }
+ for (var g = 0; g < o.getEventCount(); ++g) this._motionData.events.at(g).fireTime = o.getEventTime(g), this._motionData.events.at(g).value = o.getEventValue(g);
+ o.release(), o = void 0, o = null
+ }, e.prototype.getFiredEvent = function (t, e) {
+ this._firedEventValues.updateSize(0);
+ for (var i = 0; i < this._motionData.eventCount; ++i) this._motionData.events.at(i).fireTime > t && this._motionData.events.at(i).fireTime <= e && this._firedEventValues.pushBack(new g(this._motionData.events.at(i).value.s));
+ return this._firedEventValues
+ }, e
+ }(b);
+ t.CubismMotion = u
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(3),
+ o = i(0),
+ n = i(6).Live2DCubismFramework.csmString,
+ a = o.Live2DCubismFramework.CubismFramework,
+ s = r.Live2DCubismFramework.CubismJson;
+ ! function (t) {
+ var e = "Meta",
+ i = function () {
+ function t(t, e) {
+ this._json = s.create(t, e)
+ }
+ return t.prototype.release = function () {
+ s.delete(this._json)
+ }, t.prototype.getMotionDuration = function () {
+ return this._json.getRoot().getValueByString(e).getValueByString("Duration").toFloat()
+ }, t.prototype.isMotionLoop = function () {
+ return this._json.getRoot().getValueByString(e).getValueByString("Loop").toBoolean()
+ }, t.prototype.getMotionCurveCount = function () {
+ return this._json.getRoot().getValueByString(e).getValueByString("CurveCount").toInt()
+ }, t.prototype.getMotionFps = function () {
+ return this._json.getRoot().getValueByString(e).getValueByString("Fps").toFloat()
+ }, t.prototype.getMotionTotalSegmentCount = function () {
+ return this._json.getRoot().getValueByString(e).getValueByString("TotalSegmentCount").toInt()
+ }, t.prototype.getMotionTotalPointCount = function () {
+ return this._json.getRoot().getValueByString(e).getValueByString("TotalPointCount").toInt()
+ }, t.prototype.isExistMotionFadeInTime = function () {
+ return !this._json.getRoot().getValueByString(e).getValueByString("FadeInTime").isNull()
+ }, t.prototype.isExistMotionFadeOutTime = function () {
+ return !this._json.getRoot().getValueByString(e).getValueByString("FadeOutTime").isNull()
+ }, t.prototype.getMotionFadeInTime = function () {
+ return this._json.getRoot().getValueByString(e).getValueByString("FadeInTime").toFloat()
+ }, t.prototype.getMotionFadeOutTime = function () {
+ return this._json.getRoot().getValueByString(e).getValueByString("FadeOutTime").toFloat()
+ }, t.prototype.getMotionCurveTarget = function (t) {
+ return this._json.getRoot().getValueByString("Curves").getValueByIndex(t).getValueByString("Target").getRawString()
+ }, t.prototype.getMotionCurveId = function (t) {
+ return a.getIdManager().getId(this._json.getRoot().getValueByString("Curves").getValueByIndex(t).getValueByString("Id").getRawString())
+ }, t.prototype.isExistMotionCurveFadeInTime = function (t) {
+ return !this._json.getRoot().getValueByString("Curves").getValueByIndex(t).getValueByString("FadeInTime").isNull()
+ }, t.prototype.isExistMotionCurveFadeOutTime = function (t) {
+ return !this._json.getRoot().getValueByString("Curves").getValueByIndex(t).getValueByString("FadeOutTime").isNull()
+ }, t.prototype.getMotionCurveFadeInTime = function (t) {
+ return this._json.getRoot().getValueByString("Curves").getValueByIndex(t).getValueByString("FadeInTime").toFloat()
+ }, t.prototype.getMotionCurveFadeOutTime = function (t) {
+ return this._json.getRoot().getValueByString("Curves").getValueByIndex(t).getValueByString("FadeOutTime").toFloat()
+ }, t.prototype.getMotionCurveSegmentCount = function (t) {
+ return this._json.getRoot().getValueByString("Curves").getValueByIndex(t).getValueByString("Segments").getVector().getSize()
+ }, t.prototype.getMotionCurveSegment = function (t, e) {
+ return this._json.getRoot().getValueByString("Curves").getValueByIndex(t).getValueByString("Segments").getValueByIndex(e).toFloat()
+ }, t.prototype.getEventCount = function () {
+ return this._json.getRoot().getValueByString(e).getValueByString("UserDataCount").toInt()
+ }, t.prototype.getTotalEventValueSize = function () {
+ return this._json.getRoot().getValueByString(e).getValueByString("TotalUserDataSize").toInt()
+ }, t.prototype.getEventTime = function (t) {
+ return this._json.getRoot().getValueByString("UserData").getValueByIndex(t).getValueByString("Time").toInt()
+ }, t.prototype.getEventValue = function (t) {
+ return new n(this._json.getRoot().getValueByString("UserData").getValueByIndex(t).getValueByString("Value").getRawString())
+ }, t
+ }();
+ t.CubismMotionJson = i
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(1).Live2DCubismFramework.csmVector;
+ ! function (t) {
+ var e;
+ ! function (t) {
+ t[t.CubismMotionCurveTarget_Model = 0] = "CubismMotionCurveTarget_Model", t[t.CubismMotionCurveTarget_Parameter = 1] = "CubismMotionCurveTarget_Parameter", t[t.CubismMotionCurveTarget_PartOpacity = 2] = "CubismMotionCurveTarget_PartOpacity"
+ }(e = t.CubismMotionCurveTarget || (t.CubismMotionCurveTarget = {})),
+ function (t) {
+ t[t.CubismMotionSegmentType_Linear = 0] = "CubismMotionSegmentType_Linear", t[t.CubismMotionSegmentType_Bezier = 1] = "CubismMotionSegmentType_Bezier", t[t.CubismMotionSegmentType_Stepped = 2] = "CubismMotionSegmentType_Stepped", t[t.CubismMotionSegmentType_InverseStepped = 3] = "CubismMotionSegmentType_InverseStepped"
+ }(t.CubismMotionSegmentType || (t.CubismMotionSegmentType = {}));
+ var i = function () {
+ this.time = 0, this.value = 0
+ };
+ t.CubismMotionPoint = i;
+ var o = function () {
+ this.evaluate = null, this.basePointIndex = 0, this.segmentType = 0
+ };
+ t.CubismMotionSegment = o;
+ var n = function () {
+ this.type = e.CubismMotionCurveTarget_Model, this.segmentCount = 0, this.baseSegmentIndex = 0, this.fadeInTime = 0, this.fadeOutTime = 0
+ };
+ t.CubismMotionCurve = n;
+ var a = function () {
+ this.fireTime = 0
+ };
+ t.CubismMotionEvent = a;
+ var s = function () {
+ this.duration = 0, this.loop = !1, this.curveCount = 0, this.eventCount = 0, this.fps = 0, this.curves = new r, this.segments = new r, this.points = new r, this.events = new r
+ };
+ t.CubismMotionData = s
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ var r, o = this && this.__extends || (r = function (t, e) {
+ return (r = Object.setPrototypeOf || {
+ __proto__: []
+ }
+ instanceof Array && function (t, e) {
+ t.__proto__ = e
+ } || function (t, e) {
+ for (var i in e) e.hasOwnProperty(i) && (t[i] = e[i])
+ })(t, e)
+ }, function (t, e) {
+ function i() {
+ this.constructor = t
+ }
+ r(t, e), t.prototype = null === e ? Object.create(e) : (i.prototype = e.prototype, new i)
+ });
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var n = i(8),
+ a = i(3),
+ s = i(0),
+ u = i(1).Live2DCubismFramework.csmVector,
+ l = s.Live2DCubismFramework.CubismFramework,
+ h = a.Live2DCubismFramework.CubismJson,
+ p = n.Live2DCubismFramework.ACubismMotion;
+ ! function (t) {
+ var e, i = function (t) {
+ function i() {
+ var e = t.call(this) || this;
+ return e._parameters = new u, e
+ }
+ return o(i, t), i.create = function (t, o) {
+ var n = new i,
+ a = h.create(t, o),
+ s = a.getRoot();
+ n.setFadeInTime(s.getValueByString("FadeInTime").toFloat(1)), n.setFadeOutTime(s.getValueByString("FadeOutTime").toFloat(1));
+ var u = s.getValueByString("Parameters").getSize();
+ n._parameters.prepareCapacity(u);
+ for (var p = 0; p < u; ++p) {
+ var g = s.getValueByString("Parameters").getValueByIndex(p),
+ c = l.getIdManager().getId(g.getValueByString("Id").getRawString()),
+ d = g.getValueByString("Value").toFloat(),
+ _ = void 0;
+ _ = g.getValueByString("Blend").isNull() || "Add" == g.getValueByString("Blend").getString() ? e.ExpressionBlendType_Add : "Multiply" == g.getValueByString("Blend").getString() ? e.ExpressionBlendType_Multiply : "Overwrite" == g.getValueByString("Blend").getString() ? e.ExpressionBlendType_Overwrite : e.ExpressionBlendType_Add;
+ var m = new r;
+ m.parameterId = c, m.blendType = _, m.value = d, n._parameters.pushBack(m)
+ }
+ return h.delete(a), n
+ }, i.prototype.doUpdateParameters = function (t, i, r, o) {
+ for (var n = 0; n < this._parameters.getSize(); ++n) {
+ var a = this._parameters.at(n);
+ switch (a.blendType) {
+ case e.ExpressionBlendType_Add:
+ t.addParameterValueById(a.parameterId, a.value, r);
+ break;
+ case e.ExpressionBlendType_Multiply:
+ t.multiplyParameterValueById(a.parameterId, a.value, r);
+ break;
+ case e.ExpressionBlendType_Overwrite:
+ t.setParameterValueById(a.parameterId, a.value, r)
+ }
+ }
+ }, i
+ }(p);
+ t.CubismExpressionMotion = i,
+ function (t) {
+ t[t.ExpressionBlendType_Add = 0] = "ExpressionBlendType_Add", t[t.ExpressionBlendType_Multiply = 1] = "ExpressionBlendType_Multiply", t[t.ExpressionBlendType_Overwrite = 2] = "ExpressionBlendType_Overwrite"
+ }(e = t.ExpressionBlendType || (t.ExpressionBlendType = {}));
+ var r = function () {};
+ t.ExpressionParameter = r
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(1),
+ o = i(0),
+ n = i(3),
+ a = r.Live2DCubismFramework.csmVector,
+ s = o.Live2DCubismFramework.CubismFramework,
+ u = n.Live2DCubismFramework.CubismJson;
+ ! function (t) {
+ var e = function () {
+ function t() {
+ this._fadeTimeSeconds = .5, this._lastModel = null, this._partGroups = new a, this._partGroupCounts = new a
+ }
+ return t.create = function (e, r) {
+ var o = new t,
+ n = u.create(e, r),
+ a = n.getRoot();
+ a.getValueByString("FadeInTime").isNull() || (o._fadeTimeSeconds = a.getValueByString("FadeInTime").toFloat(.5), o._fadeTimeSeconds <= 0 && (o._fadeTimeSeconds = .5));
+ for (var l = a.getValueByString("Groups"), h = l.getSize(), p = 0; p < h; ++p) {
+ for (var g = l.getValueByIndex(p), c = g.getSize(), d = 0, _ = 0; _ < c; ++_) {
+ var m = g.getValueByIndex(_),
+ f = new i,
+ y = s.getIdManager().getId(m.getValueByString("Id").getRawString());
+ if (f.partId = y, !m.getValueByString("Link").isNull())
+ for (var v = m.getValueByString("Link"), S = v.getSize(), C = 0; C < S; ++C) {
+ var b = new i,
+ x = s.getIdManager().getId(v.getValueByIndex(C).getString());
+ b.partId = x, f.link.pushBack(b)
+ }
+ o._partGroups.pushBack(f.clone()), ++d
+ }
+ o._partGroupCounts.pushBack(d)
+ }
+ return u.delete(n), o
+ }, t.delete = function (t) {
+ null != t && (t = null)
+ }, t.prototype.updateParameters = function (t, e) {
+ t != this._lastModel && this.reset(t), this._lastModel = t, e < 0 && (e = 0);
+ for (var i = 0, r = 0; r < this._partGroupCounts.getSize(); r++) {
+ var o = this._partGroupCounts.at(r);
+ this.doFade(t, e, i, o), i += o
+ }
+ this.copyPartOpacities(t)
+ }, t.prototype.reset = function (t) {
+ for (var e = 0, i = 0; i < this._partGroupCounts.getSize(); ++i) {
+ for (var r = this._partGroupCounts.at(i), o = e; o < e + r; ++o) {
+ this._partGroups.at(o).initialize(t);
+ var n = this._partGroups.at(o).partIndex,
+ a = this._partGroups.at(o).parameterIndex;
+ if (!(n < 0)) {
+ t.setPartOpacityByIndex(n, o == e ? 1 : 0), t.setParameterValueByIndex(a, o == e ? 1 : 0);
+ for (var s = 0; s < this._partGroups.at(o).link.getSize(); ++s) this._partGroups.at(o).link.at(s).initialize(t)
+ }
+ }
+ e += r
+ }
+ }, t.prototype.copyPartOpacities = function (t) {
+ for (var e = 0; e < this._partGroups.getSize(); ++e) {
+ var i = this._partGroups.at(e);
+ if (0 != i.link.getSize())
+ for (var r = this._partGroups.at(e).partIndex, o = t.getPartOpacityByIndex(r), n = 0; n < i.link.getSize(); ++n) {
+ var a = i.link.at(n).partIndex;
+ a < 0 || t.setPartOpacityByIndex(a, o)
+ }
+ }
+ }, t.prototype.doFade = function (t, e, i, r) {
+ for (var o = -1, n = 1, a = i; a < i + r; ++a) {
+ var s = this._partGroups.at(a).partIndex,
+ u = this._partGroups.at(a).parameterIndex;
+ if (t.getParameterValueByIndex(u) > .001) {
+ if (o >= 0) break;
+ o = a, n = t.getPartOpacityByIndex(s), (n += e / this._fadeTimeSeconds) > 1 && (n = 1)
+ }
+ }
+ o < 0 && (o = 0, n = 1);
+ for (a = i; a < i + r; ++a) {
+ var l = this._partGroups.at(a).partIndex;
+ if (o == a) t.setPartOpacityByIndex(l, n);
+ else {
+ var h = t.getPartOpacityByIndex(l),
+ p = void 0;
+ (1 - (p = n < .5 ? -.5 * n / .5 + 1 : .5 * (1 - n) / .5)) * (1 - n) > .15 && (p = 1 - .15 / (1 - n)), h > p && (h = p), t.setPartOpacityByIndex(l, h)
+ }
+ }
+ }, t
+ }();
+ t.CubismPose = e;
+ var i = function () {
+ function t(t) {
+ if (this.parameterIndex = 0, this.partIndex = 0, this.link = new a, null != t) {
+ this.partId = t.partId;
+ for (var e = t.link.begin(); e.notEqual(t.link.end()); e.preIncrement()) this.link.pushBack(e.ptr().clone())
+ }
+ }
+ return t.prototype.assignment = function (t) {
+ this.partId = t.partId;
+ for (var e = t.link.begin(); e.notEqual(t.link.end()); e.preIncrement()) this.link.pushBack(e.ptr().clone());
+ return this
+ }, t.prototype.initialize = function (t) {
+ this.parameterIndex = t.getParameterIndex(this.partId), this.partIndex = t.getPartIndex(this.partId), t.setParameterValueByIndex(this.parameterIndex, 1)
+ }, t.prototype.clone = function () {
+ var e = new t;
+ e.partId = this.partId, e.parameterIndex = this.parameterIndex, e.partIndex = this.partIndex, e.link = new a;
+ for (var i = this.link.begin(); i.notEqual(this.link.end()); i.increment()) e.link.pushBack(i.ptr().clone());
+ return e
+ }, t
+ }();
+ t.PartData = i
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(39),
+ o = i(6),
+ n = i(1),
+ a = i(0).Live2DCubismFramework.CubismFramework,
+ s = n.Live2DCubismFramework.csmVector,
+ u = o.Live2DCubismFramework.csmString,
+ l = r.Live2DCubismFramework.CubismModelUserDataJson;
+ ! function (t) {
+ var e = function () {};
+ t.CubismModelUserDataNode = e;
+ var i = function () {
+ function t() {
+ this._userDataNodes = new s, this._artMeshUserDataNode = new s
+ }
+ return t.create = function (e, i) {
+ var r = new t;
+ return r.parseUserData(e, i), r
+ }, t.delete = function (t) {
+ null != t && (t.release(), t = null)
+ }, t.prototype.getArtMeshUserDatas = function () {
+ return this._artMeshUserDataNode
+ }, t.prototype.parseUserData = function (t, i) {
+ for (var r = new l(t, i), o = a.getIdManager().getId("ArtMesh"), n = r.getUserDataCount(), s = 0; s < n; s++) {
+ var h = new e;
+ h.targetId = r.getUserDataId(s), h.targetType = a.getIdManager().getId(r.getUserDataTargetType(s)), h.value = new u(r.getUserDataValue(s)), this._userDataNodes.pushBack(h), h.targetType == o && this._artMeshUserDataNode.pushBack(h)
+ }
+ r.release(), r = void 0
+ }, t.prototype.release = function () {
+ for (var t = 0; t < this._userDataNodes.getSize(); ++t) this._userDataNodes.set(t, null);
+ this._userDataNodes = null
+ }, t
+ }();
+ t.CubismModelUserData = i
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(3),
+ o = i(0).Live2DCubismFramework.CubismFramework,
+ n = r.Live2DCubismFramework.CubismJson;
+ ! function (t) {
+ var e = function () {
+ function t(t, e) {
+ this._json = n.create(t, e)
+ }
+ return t.prototype.release = function () {
+ n.delete(this._json)
+ }, t.prototype.getUserDataCount = function () {
+ return this._json.getRoot().getValueByString("Meta").getValueByString("UserDataCount").toInt()
+ }, t.prototype.getTotalUserDataSize = function () {
+ return this._json.getRoot().getValueByString("Meta").getValueByString("TotalUserDataSize").toInt()
+ }, t.prototype.getUserDataTargetType = function (t) {
+ return this._json.getRoot().getValueByString("UserData").getValueByIndex(t).getValueByString("Target").getRawString()
+ }, t.prototype.getUserDataId = function (t) {
+ return o.getIdManager().getId(this._json.getRoot().getValueByString("UserData").getValueByIndex(t).getValueByString("Id").getRawString())
+ }, t.prototype.getUserDataValue = function (t) {
+ return this._json.getRoot().getValueByString("UserData").getValueByIndex(t).getValueByString("Value").getRawString()
+ }, t
+ }();
+ t.CubismModelUserDataJson = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(41),
+ o = i(10),
+ n = i(9),
+ a = i(42).Live2DCubismFramework.CubismPhysicsJson,
+ s = n.Live2DCubismFramework.CubismMath,
+ u = r.Live2DCubismFramework.CubismPhysicsRig,
+ l = r.Live2DCubismFramework.CubismPhysicsSubRig,
+ h = r.Live2DCubismFramework.CubismPhysicsInput,
+ p = r.Live2DCubismFramework.CubismPhysicsOutput,
+ g = r.Live2DCubismFramework.CubismPhysicsParticle,
+ c = r.Live2DCubismFramework.CubismPhysicsSource,
+ d = r.Live2DCubismFramework.CubismPhysicsTargetType,
+ _ = o.Live2DCubismFramework.CubismVector2;
+ ! function (t) {
+ var e = function () {
+ function t() {
+ this._physicsRig = null, this._options = new i, this._options.gravity.y = -1, this._options.gravity.x = 0, this._options.wind.x = 0, this._options.wind.y = 0
+ }
+ return t.create = function (e, i) {
+ var r = new t;
+ return r.parse(e, i), r._physicsRig.gravity.y = 0, r
+ }, t.delete = function (t) {
+ null != t && (t.release(), t = null)
+ }, t.prototype.evaluate = function (t, e) {
+ var i, r, o, n, a, u, l, h, p, g, c, d, m = new _;
+ p = t.getModel().parameters.values, g = t.getModel().parameters.maximumValues, c = t.getModel().parameters.minimumValues, d = t.getModel().parameters.defaultValues;
+ for (var f = 0; f < this._physicsRig.subRigCount; ++f) {
+ i = {
+ angle: 0
+ }, m.x = 0, m.y = 0, a = this._physicsRig.settings.at(f), u = this._physicsRig.inputs.get(a.baseInputIndex), l = this._physicsRig.outputs.get(a.baseOutputIndex), h = this._physicsRig.particles.get(a.baseParticleIndex);
+ for (var y = 0; y < a.inputCount; ++y) r = u[y].weight / 100, -1 == u[y].sourceParameterIndex && (u[y].sourceParameterIndex = t.getParameterIndex(u[y].source.id)), u[y].getNormalizedParameterValue(m, i, p[u[y].sourceParameterIndex], c[u[y].sourceParameterIndex], g[u[y].sourceParameterIndex], d[u[y].sourceParameterIndex], a.normalizationPosition, a.normalizationAngle, u[0].reflect, r);
+ o = s.degreesToRadian(-i.angle), m.x = m.x * s.cos(o) - m.y * s.sin(o), m.y = m.x * s.sin(o) + m.y * s.cos(o), x(h, a.particleCount, m, i.angle, this._options.wind, .001 * a.normalizationPosition.maximum, e, 5);
+ for (y = 0; y < a.outputCount; ++y) {
+ var v = l[y].vertexIndex;
+ if (v < 1 || v >= a.particleCount) break; - 1 == l[y].destinationParameterIndex && (l[y].destinationParameterIndex = t.getParameterIndex(l[y].destination.id));
+ var S = new _;
+ S.x = h[v].position.x - h[v - 1].position.x, S.y = h[v].position.y - h[v - 1].position.y, n = l[y].getValue(S, h, v, l[y].reflect, this._options.gravity);
+ var C = l[y].destinationParameterIndex,
+ b = !Float32Array.prototype.slice && "subarray" in Float32Array.prototype ? JSON.parse(JSON.stringify(p.subarray(C))) : p.slice(C);
+ M(b, c[C], g[C], n, l[y]);
+ for (var L = C, P = 0; L < p.length; L++, P++) p[L] = b[P]
+ }
+ }
+ }, t.prototype.setOptions = function (t) {
+ this._options = t
+ }, t.prototype.getOption = function () {
+ return this._options
+ }, t.prototype.release = function () {
+ this._physicsRig = void 0, this._physicsRig = null
+ }, t.prototype.parse = function (t, e) {
+ this._physicsRig = new u;
+ var i = new a(t, e);
+ this._physicsRig.gravity = i.getGravity(), this._physicsRig.wind = i.getWind(), this._physicsRig.subRigCount = i.getSubRigCount(), this._physicsRig.settings.updateSize(this._physicsRig.subRigCount, l, !0), this._physicsRig.inputs.updateSize(i.getTotalInputCount(), h, !0), this._physicsRig.outputs.updateSize(i.getTotalOutputCount(), p, !0), this._physicsRig.particles.updateSize(i.getVertexCount(), g, !0);
+ for (var s = 0, _ = 0, v = 0, x = 0; x < this._physicsRig.settings.getSize(); ++x) {
+ this._physicsRig.settings.at(x).normalizationPosition.minimum = i.getNormalizationPositionMinimumValue(x), this._physicsRig.settings.at(x).normalizationPosition.maximum = i.getNormalizationPositionMaximumValue(x), this._physicsRig.settings.at(x).normalizationPosition.defalut = i.getNormalizationPositionDefaultValue(x), this._physicsRig.settings.at(x).normalizationAngle.minimum = i.getNormalizationAngleMinimumValue(x), this._physicsRig.settings.at(x).normalizationAngle.maximum = i.getNormalizationAngleMaximumValue(x), this._physicsRig.settings.at(x).normalizationAngle.defalut = i.getNormalizationAngleDefaultValue(x), this._physicsRig.settings.at(x).inputCount = i.getInputCount(x), this._physicsRig.settings.at(x).baseInputIndex = s;
+ for (var M = 0; M < this._physicsRig.settings.at(x).inputCount; ++M) this._physicsRig.inputs.at(s + M).sourceParameterIndex = -1, this._physicsRig.inputs.at(s + M).weight = i.getInputWeight(x, M), this._physicsRig.inputs.at(s + M).reflect = i.getInputReflect(x, M), "X" == i.getInputType(x, M) ? (this._physicsRig.inputs.at(s + M).type = c.CubismPhysicsSource_X, this._physicsRig.inputs.at(s + M).getNormalizedParameterValue = r) : "Y" == i.getInputType(x, M) ? (this._physicsRig.inputs.at(s + M).type = c.CubismPhysicsSource_Y, this._physicsRig.inputs.at(s + M).getNormalizedParameterValue = o) : "Angle" == i.getInputType(x, M) && (this._physicsRig.inputs.at(s + M).type = c.CubismPhysicsSource_Angle, this._physicsRig.inputs.at(s + M).getNormalizedParameterValue = n), this._physicsRig.inputs.at(s + M).source.targetType = d.CubismPhysicsTargetType_Parameter, this._physicsRig.inputs.at(s + M).source.id = i.getInputSourceId(x, M);
+ s += this._physicsRig.settings.at(x).inputCount, this._physicsRig.settings.at(x).outputCount = i.getOutputCount(x), this._physicsRig.settings.at(x).baseOutputIndex = _;
+ for (M = 0; M < this._physicsRig.settings.at(x).outputCount; ++M) this._physicsRig.outputs.at(_ + M).destinationParameterIndex = -1, this._physicsRig.outputs.at(_ + M).vertexIndex = i.getOutputVertexIndex(x, M), this._physicsRig.outputs.at(_ + M).angleScale = i.getOutputAngleScale(x, M), this._physicsRig.outputs.at(_ + M).weight = i.getOutputWeight(x, M), this._physicsRig.outputs.at(_ + M).destination.targetType = d.CubismPhysicsTargetType_Parameter, this._physicsRig.outputs.at(_ + M).destination.id = i.getOutputDestinationId(x, M), "X" == i.getOutputType(x, M) ? (this._physicsRig.outputs.at(_ + M).type = c.CubismPhysicsSource_X, this._physicsRig.outputs.at(_ + M).getValue = m, this._physicsRig.outputs.at(_ + M).getScale = S) : "Y" == i.getOutputType(x, M) ? (this._physicsRig.outputs.at(_ + M).type = c.CubismPhysicsSource_Y, this._physicsRig.outputs.at(_ + M).getValue = f, this._physicsRig.outputs.at(_ + M).getScale = C) : "Angle" == i.getOutputType(x, M) && (this._physicsRig.outputs.at(_ + M).type = c.CubismPhysicsSource_Angle, this._physicsRig.outputs.at(_ + M).getValue = y, this._physicsRig.outputs.at(_ + M).getScale = b), this._physicsRig.outputs.at(_ + M).reflect = i.getOutputReflect(x, M);
+ _ += this._physicsRig.settings.at(x).outputCount, this._physicsRig.settings.at(x).particleCount = i.getParticleCount(x), this._physicsRig.settings.at(x).baseParticleIndex = v;
+ for (M = 0; M < this._physicsRig.settings.at(x).particleCount; ++M) this._physicsRig.particles.at(v + M).mobility = i.getParticleMobility(x, M), this._physicsRig.particles.at(v + M).delay = i.getParticleDelay(x, M), this._physicsRig.particles.at(v + M).acceleration = i.getParticleAcceleration(x, M), this._physicsRig.particles.at(v + M).radius = i.getParticleRadius(x, M), this._physicsRig.particles.at(v + M).position = i.getParticlePosition(x, M);
+ v += this._physicsRig.settings.at(x).particleCount
+ }
+ this.initialize(), i.release(), i = void 0, i = null
+ }, t.prototype.initialize = function () {
+ for (var t, e, i, r = 0; r < this._physicsRig.subRigCount; ++r) {
+ e = this._physicsRig.settings.at(r), (t = this._physicsRig.particles.get(e.baseParticleIndex))[0].initialPosition = new _(0, 0), t[0].lastPosition = new _(t[0].initialPosition.x, t[0].initialPosition.y), t[0].lastGravity = new _(0, -1), t[0].lastGravity.y *= -1, t[0].velocity = new _(0, 0), t[0].force = new _(0, 0);
+ for (var o = 1; o < e.particleCount; ++o)(i = new _(0, 0)).y = t[o].radius, t[o].initialPosition = new _(t[o - 1].initialPosition.x + i.x, t[o - 1].initialPosition.y + i.y), t[o].position = new _(t[o].initialPosition.x, t[o].initialPosition.y), t[o].lastPosition = new _(t[o].initialPosition.x, t[o].initialPosition.y), t[o].lastGravity = new _(0, -1), t[o].lastGravity.y *= -1, t[o].velocity = new _(0, 0), t[o].force = new _(0, 0)
+ }
+ }, t
+ }();
+ t.CubismPhysics = e;
+ var i = function () {
+ this.gravity = new _(0, 0), this.wind = new _(0, 0)
+ };
+
+ function r(t, e, i, r, o, n, a, s, u, l) {
+ t.x += L(i, r, o, n, a.minimum, a.maximum, a.defalut, u) * l
+ }
+
+ function o(t, e, i, r, o, n, a, s, u, l) {
+ t.y += L(i, r, o, n, a.minimum, a.maximum, a.defalut, u) * l
+ }
+
+ function n(t, e, i, r, o, n, a, s, u, l) {
+ e.angle += L(i, r, o, n, s.minimum, s.maximum, s.defalut, u) * l
+ }
+
+ function m(t, e, i, r, o) {
+ var n = t.x;
+ return r && (n *= -1), n
+ }
+
+ function f(t, e, i, r, o) {
+ var n = t.y;
+ return r && (n *= -1), n
+ }
+
+ function y(t, e, i, r, o) {
+ var n;
+ return o = i >= 2 ? e[i - 1].position.substract(e[i - 2].position) : o.multiplyByScaler(-1), n = s.directionToRadian(o, t), r && (n *= -1), n
+ }
+
+ function v(t, e) {
+ return s.min(t, e) + function (t, e) {
+ var i = s.max(t, e),
+ r = s.min(t, e);
+ return s.abs(i - r)
+ }(t, e) / 2
+ }
+
+ function S(t, e) {
+ return JSON.parse(JSON.stringify(t.x))
+ }
+
+ function C(t, e) {
+ return JSON.parse(JSON.stringify(t.y))
+ }
+
+ function b(t, e) {
+ return JSON.parse(JSON.stringify(e))
+ }
+
+ function x(t, e, i, r, o, n, a, u) {
+ var l, h, p, g, c = new _(0, 0),
+ d = new _(0, 0),
+ m = new _(0, 0),
+ f = new _(0, 0);
+ t[0].position = new _(i.x, i.y), l = s.degreesToRadian(r), (g = s.radianToDirection(l)).normalize();
+ for (var y = 1; y < e; ++y) t[y].force = g.multiplyByScaler(t[y].acceleration).add(o), t[y].lastPosition = new _(t[y].position.x, t[y].position.y), h = t[y].delay * a * 30, c = t[y].position.substract(t[y - 1].position), p = s.directionToRadian(t[y].lastGravity, g) / u, c.x = s.cos(p) * c.x - c.y * s.sin(p), c.y = s.sin(p) * c.x + c.y * s.cos(p), t[y].position = t[y - 1].position.add(c), d = t[y].velocity.multiplyByScaler(h), m = t[y].force.multiplyByScaler(h).multiplyByScaler(h), t[y].position = t[y].position.add(d).add(m), (f = t[y].position.substract(t[y - 1].position)).normalize(), t[y].position = t[y - 1].position.add(f.multiplyByScaler(t[y].radius)), s.abs(t[y].position.x) < n && (t[y].position.x = 0), 0 != h && (t[y].velocity = t[y].position.substract(t[y].lastPosition), t[y].velocity = t[y].velocity.divisionByScalar(h), t[y].velocity = t[y].velocity.multiplyByScaler(t[y].mobility)), t[y].force = new _(0, 0), t[y].lastGravity = new _(g.x, g.y)
+ }
+
+ function M(t, e, i, r, o) {
+ var n, a;
+ (n = r * o.getScale(o.translationScale, o.angleScale)) < e ? (n < o.valueBelowMinimum && (o.valueBelowMinimum = n), n = e) : n > i && (n > o.valueExceededMaximum && (o.valueExceededMaximum = n), n = i), (a = o.weight / 100) >= 1 ? t[0] = n : (n = t[0] * (1 - a) + n * a, t[0] = n)
+ }
+
+ function L(t, e, i, r, o, n, a, u) {
+ var l = 0,
+ h = s.max(i, e);
+ h < t && (t = h);
+ var p = s.min(i, e);
+ p > t && (t = p);
+ var g = s.min(o, n),
+ c = s.max(o, n),
+ d = a,
+ _ = v(p, h),
+ m = t - _;
+ switch (function (t) {
+ var e = 0;
+ return t > 0 ? e = 1 : t < 0 && (e = -1), e
+ }(m)) {
+ case 1:
+ var f = c - d;
+ 0 != (y = h - _) && (l = m * (f / y), l += d);
+ break;
+ case -1:
+ var y;
+ f = g - d;
+ 0 != (y = p - _) && (l = m * (f / y), l += d);
+ break;
+ case 0:
+ l = d
+ }
+ return u ? l : -1 * l
+ }
+ t.Options = i
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(10),
+ o = i(1).Live2DCubismFramework.csmVector,
+ n = r.Live2DCubismFramework.CubismVector2;
+ ! function (t) {
+ ! function (t) {
+ t[t.CubismPhysicsTargetType_Parameter = 0] = "CubismPhysicsTargetType_Parameter"
+ }(t.CubismPhysicsTargetType || (t.CubismPhysicsTargetType = {})),
+ function (t) {
+ t[t.CubismPhysicsSource_X = 0] = "CubismPhysicsSource_X", t[t.CubismPhysicsSource_Y = 1] = "CubismPhysicsSource_Y", t[t.CubismPhysicsSource_Angle = 2] = "CubismPhysicsSource_Angle"
+ }(t.CubismPhysicsSource || (t.CubismPhysicsSource = {}));
+ var e = function () {
+ this.gravity = new n(0, 0), this.wind = new n(0, 0)
+ };
+ t.PhysicsJsonEffectiveForces = e;
+ var i = function () {};
+ t.CubismPhysicsParameter = i;
+ var r = function () {};
+ t.CubismPhysicsNormalization = r;
+ var a = function () {
+ this.initialPosition = new n(0, 0), this.position = new n(0, 0), this.lastPosition = new n(0, 0), this.lastGravity = new n(0, 0), this.force = new n(0, 0), this.velocity = new n(0, 0)
+ };
+ t.CubismPhysicsParticle = a;
+ var s = function () {
+ this.normalizationPosition = new r, this.normalizationAngle = new r
+ };
+ t.CubismPhysicsSubRig = s;
+ var u = function () {
+ this.source = new i
+ };
+ t.CubismPhysicsInput = u;
+ var l = function () {
+ this.destination = new i, this.translationScale = new n(0, 0)
+ };
+ t.CubismPhysicsOutput = l;
+ var h = function () {
+ this.settings = new o, this.inputs = new o, this.outputs = new o, this.particles = new o, this.gravity = new n(0, 0), this.wind = new n(0, 0)
+ };
+ t.CubismPhysicsRig = h
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(3),
+ o = i(10),
+ n = i(0).Live2DCubismFramework.CubismFramework,
+ a = o.Live2DCubismFramework.CubismVector2,
+ s = r.Live2DCubismFramework.CubismJson;
+ ! function (t) {
+ var e = "Meta",
+ i = "PhysicsSettings",
+ r = function () {
+ function t(t, e) {
+ this._json = s.create(t, e)
+ }
+ return t.prototype.release = function () {
+ s.delete(this._json)
+ }, t.prototype.getGravity = function () {
+ var t = new a(0, 0);
+ return t.x = this._json.getRoot().getValueByString(e).getValueByString("EffectiveForces").getValueByString("Gravity").getValueByString("X").toFloat(), t.y = this._json.getRoot().getValueByString(e).getValueByString("EffectiveForces").getValueByString("Gravity").getValueByString("Y").toFloat(), t
+ }, t.prototype.getWind = function () {
+ var t = new a(0, 0);
+ return t.x = this._json.getRoot().getValueByString(e).getValueByString("EffectiveForces").getValueByString("Wind").getValueByString("X").toFloat(), t.y = this._json.getRoot().getValueByString(e).getValueByString("EffectiveForces").getValueByString("Wind").getValueByString("Y").toFloat(), t
+ }, t.prototype.getSubRigCount = function () {
+ return this._json.getRoot().getValueByString(e).getValueByString("PhysicsSettingCount").toInt()
+ }, t.prototype.getTotalInputCount = function () {
+ return this._json.getRoot().getValueByString(e).getValueByString("TotalInputCount").toInt()
+ }, t.prototype.getTotalOutputCount = function () {
+ return this._json.getRoot().getValueByString(e).getValueByString("TotalOutputCount").toInt()
+ }, t.prototype.getVertexCount = function () {
+ return this._json.getRoot().getValueByString(e).getValueByString("VertexCount").toInt()
+ }, t.prototype.getNormalizationPositionMinimumValue = function (t) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Normalization").getValueByString("Position").getValueByString("Minimum").toFloat()
+ }, t.prototype.getNormalizationPositionMaximumValue = function (t) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Normalization").getValueByString("Position").getValueByString("Maximum").toFloat()
+ }, t.prototype.getNormalizationPositionDefaultValue = function (t) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Normalization").getValueByString("Position").getValueByString("Default").toFloat()
+ }, t.prototype.getNormalizationAngleMinimumValue = function (t) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Normalization").getValueByString("Angle").getValueByString("Minimum").toFloat()
+ }, t.prototype.getNormalizationAngleMaximumValue = function (t) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Normalization").getValueByString("Angle").getValueByString("Maximum").toFloat()
+ }, t.prototype.getNormalizationAngleDefaultValue = function (t) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Normalization").getValueByString("Angle").getValueByString("Default").toFloat()
+ }, t.prototype.getInputCount = function (t) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Input").getVector().getSize()
+ }, t.prototype.getInputWeight = function (t, e) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Input").getValueByIndex(e).getValueByString("Weight").toFloat()
+ }, t.prototype.getInputReflect = function (t, e) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Input").getValueByIndex(e).getValueByString("Reflect").toBoolean()
+ }, t.prototype.getInputType = function (t, e) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Input").getValueByIndex(e).getValueByString("Type").getRawString()
+ }, t.prototype.getInputSourceId = function (t, e) {
+ return n.getIdManager().getId(this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Input").getValueByIndex(e).getValueByString("Source").getValueByString("Id").getRawString())
+ }, t.prototype.getOutputCount = function (t) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Output").getVector().getSize()
+ }, t.prototype.getOutputVertexIndex = function (t, e) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Output").getValueByIndex(e).getValueByString("VertexIndex").toInt()
+ }, t.prototype.getOutputAngleScale = function (t, e) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Output").getValueByIndex(e).getValueByString("Scale").toFloat()
+ }, t.prototype.getOutputWeight = function (t, e) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Output").getValueByIndex(e).getValueByString("Weight").toFloat()
+ }, t.prototype.getOutputDestinationId = function (t, e) {
+ return n.getIdManager().getId(this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Output").getValueByIndex(e).getValueByString("Destination").getValueByString("Id").getRawString())
+ }, t.prototype.getOutputType = function (t, e) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Output").getValueByIndex(e).getValueByString("Type").getRawString()
+ }, t.prototype.getOutputReflect = function (t, e) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Output").getValueByIndex(e).getValueByString("Reflect").toBoolean()
+ }, t.prototype.getParticleCount = function (t) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Vertices").getVector().getSize()
+ }, t.prototype.getParticleMobility = function (t, e) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Vertices").getValueByIndex(e).getValueByString("Mobility").toFloat()
+ }, t.prototype.getParticleDelay = function (t, e) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Vertices").getValueByIndex(e).getValueByString("Delay").toFloat()
+ }, t.prototype.getParticleAcceleration = function (t, e) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Vertices").getValueByIndex(e).getValueByString("Acceleration").toFloat()
+ }, t.prototype.getParticleRadius = function (t, e) {
+ return this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Vertices").getValueByIndex(e).getValueByString("Radius").toInt()
+ }, t.prototype.getParticlePosition = function (t, e) {
+ var r = new a(0, 0);
+ return r.x = this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Vertices").getValueByIndex(e).getValueByString("Position").getValueByString("X").toFloat(), r.y = this._json.getRoot().getValueByString(i).getValueByIndex(t).getValueByString("Vertices").getValueByIndex(e).getValueByString("Position").getValueByString("Y").toFloat(), r
+ }, t
+ }();
+ t.CubismPhysicsJson = r
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ var r, o = this && this.__extends || (r = function (t, e) {
+ return (r = Object.setPrototypeOf || {
+ __proto__: []
+ }
+ instanceof Array && function (t, e) {
+ t.__proto__ = e
+ } || function (t, e) {
+ for (var i in e) e.hasOwnProperty(i) && (t[i] = e[i])
+ })(t, e)
+ }, function (t, e) {
+ function i() {
+ this.constructor = t
+ }
+ r(t, e), t.prototype = null === e ? Object.create(e) : (i.prototype = e.prototype, new i)
+ });
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var n = i(0),
+ a = i(44),
+ s = i(13),
+ u = i(4),
+ l = i(7),
+ h = i(1),
+ p = i(2),
+ g = n.Live2DCubismFramework.Constant,
+ c = u.Live2DCubismFramework.CubismMatrix44,
+ d = a.Live2DCubismFramework.csmRect,
+ _ = l.Live2DCubismFramework.csmMap,
+ m = h.Live2DCubismFramework.csmVector,
+ f = s.Live2DCubismFramework.CubismRenderer,
+ y = s.Live2DCubismFramework.CubismBlendMode,
+ v = s.Live2DCubismFramework.CubismTextureColor;
+ ! function (t) {
+ var e, i, r, n = function () {
+ function t() {
+ this._maskRenderTexture = null, this._colorBuffer = null, this._currentFrameNo = 0, this._clippingMaskBufferSize = 256, this._clippingContextListForMask = new m, this._clippingContextListForDraw = new m, this._channelColors = new m, this._tmpBoundsOnModel = new d, this._tmpMatrix = new c, this._tmpMatrixForMask = new c, this._tmpMatrixForDraw = new c, this._maskTexture = null;
+ var t = new v;
+ t.R = 1, t.G = 0, t.B = 0, t.A = 0, this._channelColors.pushBack(t), (t = new v).R = 0, t.G = 1, t.B = 0, t.A = 0, this._channelColors.pushBack(t), (t = new v).R = 0, t.G = 0, t.B = 1, t.A = 0, this._channelColors.pushBack(t), (t = new v).R = 0, t.G = 0, t.B = 0, t.A = 1, this._channelColors.pushBack(t)
+ }
+ return t.prototype.getChannelFlagAsColor = function (t) {
+ return this._channelColors.at(t)
+ }, t.prototype.getMaskRenderTexture = function () {
+ var t = 0;
+ if (this._maskTexture && 0 != this._maskTexture.texture && (this._maskTexture.frameNo = this._currentFrameNo, t = this._maskTexture.texture), 0 == t) {
+ var e = this._clippingMaskBufferSize;
+ this._colorBuffer = this.gl.createTexture(), this.gl.bindTexture(this.gl.TEXTURE_2D, this._colorBuffer), this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, e, e, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, null), this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE), this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE), this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR), this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR), this.gl.bindTexture(this.gl.TEXTURE_2D, null), t = this.gl.createFramebuffer(), this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, t), this.gl.framebufferTexture2D(this.gl.FRAMEBUFFER, this.gl.COLOR_ATTACHMENT0, this.gl.TEXTURE_2D, this._colorBuffer, 0), this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, r), this._maskTexture = new a(this._currentFrameNo, t)
+ }
+ return t
+ }, t.prototype.setGL = function (t) {
+ this.gl = t
+ }, t.prototype.calcClippedDrawTotalBounds = function (t, e) {
+ for (var i = Number.MAX_VALUE, r = Number.MAX_VALUE, o = Number.MIN_VALUE, n = Number.MIN_VALUE, a = e._clippedDrawableIndexList.length, s = 0; s < a; s++) {
+ for (var u = e._clippedDrawableIndexList[s], l = t.getDrawableVertexCount(u), h = t.getDrawableVertices(u), p = Number.MAX_VALUE, c = Number.MAX_VALUE, d = Number.MIN_VALUE, _ = Number.MIN_VALUE, m = l * g.vertexStep, f = g.vertexOffset; f < m; f += g.vertexStep) {
+ var y = h[f],
+ v = h[f + 1];
+ y < p && (p = y), y > d && (d = y), v < c && (c = v), v > _ && (_ = v)
+ }
+ if (p != Number.MAX_VALUE)
+ if (p < i && (i = p), c < r && (r = c), d > o && (o = d), _ > n && (n = _), i == Number.MAX_VALUE) e._allClippedDrawRect.x = 0, e._allClippedDrawRect.y = 0, e._allClippedDrawRect.width = 0, e._allClippedDrawRect.height = 0, e._isUsing = !1;
+ else {
+ e._isUsing = !0;
+ var S = o - i,
+ C = n - r;
+ e._allClippedDrawRect.x = i, e._allClippedDrawRect.y = r, e._allClippedDrawRect.width = S, e._allClippedDrawRect.height = C
+ }
+ }
+ }, t.prototype.release = function () {
+ for (var t = 0; t < this._clippingContextListForMask.getSize(); t++) this._clippingContextListForMask.at(t) && (this._clippingContextListForMask.at(t).release(), this._clippingContextListForMask.set(t, void 0)), this._clippingContextListForMask.set(t, null);
+ this._clippingContextListForMask = null;
+ for (t = 0; t < this._clippingContextListForDraw.getSize(); t++) this._clippingContextListForDraw.set(t, null);
+ this._clippingContextListForDraw = null, this._maskTexture && (this.gl.deleteFramebuffer(this._maskTexture.texture), this._maskTexture = null);
+ for (t = 0; t < this._channelColors.getSize(); t++) this._channelColors.set(t, null);
+ this._channelColors = null, this.gl.deleteTexture(this._colorBuffer), this._colorBuffer = null
+ }, t.prototype.initialize = function (t, e, i, r) {
+ for (var o = 0; o < e; o++)
+ if (r[o] <= 0) this._clippingContextListForDraw.pushBack(null);
+ else {
+ var n = this.findSameClip(i[o], r[o]);
+ null == n && (n = new s(this, i[o], r[o]), this._clippingContextListForMask.pushBack(n)), n.addClippedDrawable(o), this._clippingContextListForDraw.pushBack(n)
+ }
+ }, t.prototype.setupClippingContext = function (t, e) {
+ this._currentFrameNo++;
+ for (var o = 0, n = 0; n < this._clippingContextListForMask.getSize(); n++) {
+ var a = this._clippingContextListForMask.at(n);
+ this.calcClippedDrawTotalBounds(t, a), a._isUsing && o++
+ }
+ if (o > 0) {
+ this.gl.viewport(0, 0, this._clippingMaskBufferSize, this._clippingMaskBufferSize), this._maskRenderTexture = this.getMaskRenderTexture();
+ e.getMvpMatrix();
+ e.preDraw(), this.setupLayoutBounds(o), this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this._maskRenderTexture), this.gl.clearColor(1, 1, 1, 1), this.gl.clear(this.gl.COLOR_BUFFER_BIT);
+ for (n = 0; n < this._clippingContextListForMask.getSize(); n++) {
+ var s = this._clippingContextListForMask.at(n),
+ u = s._allClippedDrawRect,
+ l = s._layoutBounds;
+ this._tmpBoundsOnModel.setRect(u), this._tmpBoundsOnModel.expand(.05 * u.width, .05 * u.height);
+ var h = l.width / this._tmpBoundsOnModel.width,
+ p = l.height / this._tmpBoundsOnModel.height;
+ this._tmpMatrix.loadIdentity(), this._tmpMatrix.translateRelative(-1, -1), this._tmpMatrix.scaleRelative(2, 2), this._tmpMatrix.translateRelative(l.x, l.y), this._tmpMatrix.scaleRelative(h, p), this._tmpMatrix.translateRelative(-this._tmpBoundsOnModel.x, -this._tmpBoundsOnModel.y), this._tmpMatrixForMask.setMatrix(this._tmpMatrix.getArray()), this._tmpMatrix.loadIdentity(), this._tmpMatrix.translateRelative(l.x, l.y), this._tmpMatrix.scaleRelative(h, p), this._tmpMatrix.translateRelative(-this._tmpBoundsOnModel.x, -this._tmpBoundsOnModel.y), this._tmpMatrixForDraw.setMatrix(this._tmpMatrix.getArray()), s._matrixForMask.setMatrix(this._tmpMatrixForMask.getArray()), s._matrixForDraw.setMatrix(this._tmpMatrixForDraw.getArray());
+ for (var g = s._clippingIdCount, c = 0; c < g; c++) {
+ var d = s._clippingIdList[c];
+ t.getDrawableDynamicFlagVertexPositionsDidChange(d) && (e.setIsCulling(0 != t.getDrawableCulling(d)), e.setClippingContextBufferForMask(s), e.drawMesh(t.getDrawableTextureIndices(d), t.getDrawableVertexIndexCount(d), t.getDrawableVertexCount(d), t.getDrawableVertexIndices(d), t.getDrawableVertices(d), t.getDrawableVertexUvs(d), t.getDrawableOpacity(d), y.CubismBlendMode_Normal, !1))
+ }
+ }
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, r), e.setClippingContextBufferForMask(null), this.gl.viewport(i[0], i[1], i[2], i[3])
+ }
+ }, t.prototype.findSameClip = function (t, e) {
+ for (var i = 0; i < this._clippingContextListForMask.getSize(); i++) {
+ var r = this._clippingContextListForMask.at(i),
+ o = r._clippingIdCount;
+ if (o == e) {
+ for (var n = 0, a = 0; a < o; a++)
+ for (var s = r._clippingIdList[a], u = 0; u < o; u++)
+ if (t[u] == s) {
+ n++;
+ break
+ } if (n == o) return r
+ }
+ }
+ return null
+ }, t.prototype.setupLayoutBounds = function (t) {
+ var e = t / 4,
+ i = t % 4;
+ e = ~~e, i = ~~i;
+ for (var r = 0, o = 0; o < 4; o++) {
+ var n = e + (o < i ? 1 : 0);
+ if (0 == n);
+ else if (1 == n) {
+ var a = this._clippingContextListForMask.at(r++);
+ a._layoutChannelNo = o, a._layoutBounds.x = 0, a._layoutBounds.y = 0, a._layoutBounds.width = 1, a._layoutBounds.height = 1
+ } else if (2 == n)
+ for (var s = 0; s < n; s++) {
+ u = ~~(u = s % 2), (h = this._clippingContextListForMask.at(r++))._layoutChannelNo = o, h._layoutBounds.x = .5 * u, h._layoutBounds.y = 0, h._layoutBounds.width = .5, h._layoutBounds.height = 1
+ } else if (n <= 4)
+ for (s = 0; s < n; s++) {
+ u = ~~(u = s % 2), l = ~~(l = s / 2), (h = this._clippingContextListForMask.at(r++))._layoutChannelNo = o, h._layoutBounds.x = .5 * u, h._layoutBounds.y = .5 * l, h._layoutBounds.width = .5, h._layoutBounds.height = .5
+ } else if (n <= 9)
+ for (s = 0; s < n; s++) {
+ var u, l, h;
+ u = ~~(u = s % 3), l = ~~(l = s / 3), (h = this._clippingContextListForMask.at(r++))._layoutChannelNo = o, h._layoutBounds.x = u / 3, h._layoutBounds.y = l / 3, h._layoutBounds.width = 1 / 3, h._layoutBounds.height = 1 / 3
+ } else p.CubismLogError("not supported mask count : {0}", n)
+ }
+ }, t.prototype.getColorBuffer = function () {
+ return this._colorBuffer
+ }, t.prototype.getClippingContextListForDraw = function () {
+ return this._clippingContextListForDraw
+ }, t.prototype.setClippingMaskBufferSize = function (t) {
+ this._clippingMaskBufferSize = t
+ }, t.prototype.getClippingMaskBufferSize = function () {
+ return this._clippingMaskBufferSize
+ }, t
+ }();
+ t.CubismClippingManager_WebGL = n;
+ var a = function (t, e) {
+ this.frameNo = t, this.texture = e
+ };
+ t.CubismRenderTextureResource = a;
+ var s = function () {
+ function t(t, e, i) {
+ this._owner = t, this._clippingIdList = e, this._clippingIdCount = i, this._allClippedDrawRect = new d, this._layoutBounds = new d, this._clippedDrawableIndexList = [], this._matrixForMask = new c, this._matrixForDraw = new c
+ }
+ return t.prototype.release = function () {
+ null != this._layoutBounds && (this._layoutBounds = null), null != this._allClippedDrawRect && (this._allClippedDrawRect = null), null != this._clippedDrawableIndexList && (this._clippedDrawableIndexList = null)
+ }, t.prototype.addClippedDrawable = function (t) {
+ this._clippedDrawableIndexList.push(t)
+ }, t.prototype.getClippingManager = function () {
+ return this._owner
+ }, t.prototype.setGl = function (t) {
+ this._owner.setGL(t)
+ }, t
+ }();
+ t.CubismClippingContext = s;
+ var u = function () {
+ function i() {
+ this._shaderSets = new m
+ }
+ return i.getInstance = function () {
+ return null == e ? e = new i : e
+ }, i.deleteInstance = function () {
+ e && (e.release(), e = null)
+ }, i.prototype.release = function () {
+ this.releaseShaderProgram()
+ }, i.prototype.setupShaderProgram = function (t, e, i, r, o, n, a, s, u, g, c, d, _) {
+ var m, f, v, S;
+ if (c || p.CubismLogError("NoPremultipliedAlpha is not allowed"), 0 == this._shaderSets.getSize() && this.generateShaders(), null != t.getClippingContextBufferForMask()) {
+ var C = this._shaderSets.at(l.ShaderNames_SetupMask);
+ this.gl.useProgram(C.shaderProgram), this.gl.activeTexture(this.gl.TEXTURE0), this.gl.bindTexture(this.gl.TEXTURE_2D, e), this.gl.uniform1i(C.samplerTexture0Location, 0), null == a.vertex && (a.vertex = this.gl.createBuffer()), this.gl.bindBuffer(this.gl.ARRAY_BUFFER, a.vertex), this.gl.bufferData(this.gl.ARRAY_BUFFER, r, this.gl.DYNAMIC_DRAW), this.gl.enableVertexAttribArray(C.attributePositionLocation), this.gl.vertexAttribPointer(C.attributePositionLocation, 2, this.gl.FLOAT, !1, 0, 0), null == a.uv && (a.uv = this.gl.createBuffer()), this.gl.bindBuffer(this.gl.ARRAY_BUFFER, a.uv), this.gl.bufferData(this.gl.ARRAY_BUFFER, n, this.gl.DYNAMIC_DRAW), this.gl.enableVertexAttribArray(C.attributeTexCoordLocation), this.gl.vertexAttribPointer(C.attributeTexCoordLocation, 2, this.gl.FLOAT, !1, 0, 0);
+ var b = t.getClippingContextBufferForMask()._layoutChannelNo,
+ x = t.getClippingContextBufferForMask().getClippingManager().getChannelFlagAsColor(b);
+ this.gl.uniform4f(C.uniformChannelFlagLocation, x.R, x.G, x.B, x.A), this.gl.uniformMatrix4fv(C.uniformClipMatrixLocation, !1, t.getClippingContextBufferForMask()._matrixForMask.getArray());
+ var M = t.getClippingContextBufferForMask()._layoutBounds;
+ this.gl.uniform4f(C.uniformBaseColorLocation, 2 * M.x - 1, 2 * M.y - 1, 2 * M.getRight() - 1, 2 * M.getBottom() - 1), m = this.gl.ZERO, f = this.gl.ONE_MINUS_SRC_COLOR, v = this.gl.ZERO, S = this.gl.ONE_MINUS_SRC_ALPHA
+ } else {
+ var L = null != t.getClippingContextBufferForDraw(),
+ P = L ? _ ? 2 : 1 : 0;
+ C = new h;
+ switch (u) {
+ case y.CubismBlendMode_Normal:
+ default:
+ C = this._shaderSets.at(l.ShaderNames_NormalPremultipliedAlpha + P), m = this.gl.ONE, f = this.gl.ONE_MINUS_SRC_ALPHA, v = this.gl.ONE, S = this.gl.ONE_MINUS_SRC_ALPHA;
+ break;
+ case y.CubismBlendMode_Additive:
+ C = this._shaderSets.at(l.ShaderNames_AddPremultipliedAlpha + P), m = this.gl.ONE, f = this.gl.ONE, v = this.gl.ZERO, S = this.gl.ONE;
+ break;
+ case y.CubismBlendMode_Multiplicative:
+ C = this._shaderSets.at(l.ShaderNames_MultPremultipliedAlpha + P), m = this.gl.DST_COLOR, f = this.gl.ONE_MINUS_SRC_ALPHA, v = this.gl.ZERO, S = this.gl.ONE
+ }
+ if (this.gl.useProgram(C.shaderProgram), null == a.vertex && (a.vertex = this.gl.createBuffer()), this.gl.bindBuffer(this.gl.ARRAY_BUFFER, a.vertex), this.gl.bufferData(this.gl.ARRAY_BUFFER, r, this.gl.DYNAMIC_DRAW), this.gl.enableVertexAttribArray(C.attributePositionLocation), this.gl.vertexAttribPointer(C.attributePositionLocation, 2, this.gl.FLOAT, !1, 0, 0), null == a.uv && (a.uv = this.gl.createBuffer()), this.gl.bindBuffer(this.gl.ARRAY_BUFFER, a.uv), this.gl.bufferData(this.gl.ARRAY_BUFFER, n, this.gl.DYNAMIC_DRAW), this.gl.enableVertexAttribArray(C.attributeTexCoordLocation), this.gl.vertexAttribPointer(C.attributeTexCoordLocation, 2, this.gl.FLOAT, !1, 0, 0), L) {
+ this.gl.activeTexture(this.gl.TEXTURE1);
+ var B = t.getClippingContextBufferForDraw().getClippingManager().getColorBuffer();
+ this.gl.bindTexture(this.gl.TEXTURE_2D, B), this.gl.uniform1i(C.samplerTexture1Location, 1), this.gl.uniformMatrix4fv(C.uniformClipMatrixLocation, !1, t.getClippingContextBufferForDraw()._matrixForDraw.getArray());
+ b = t.getClippingContextBufferForDraw()._layoutChannelNo, x = t.getClippingContextBufferForDraw().getClippingManager().getChannelFlagAsColor(b);
+ this.gl.uniform4f(C.uniformChannelFlagLocation, x.R, x.G, x.B, x.A)
+ }
+ this.gl.activeTexture(this.gl.TEXTURE0), this.gl.bindTexture(this.gl.TEXTURE_2D, e), this.gl.uniform1i(C.samplerTexture0Location, 0), this.gl.uniformMatrix4fv(C.uniformMatrixLocation, !1, d.getArray()), this.gl.uniform4f(C.uniformBaseColorLocation, g.R, g.G, g.B, g.A)
+ }
+ null == a.index && (a.index = this.gl.createBuffer()), this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, a.index), this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, o, this.gl.DYNAMIC_DRAW), this.gl.blendFuncSeparate(m, f, v, S)
+ }, i.prototype.releaseShaderProgram = function () {
+ for (var t = 0; t < this._shaderSets.getSize(); t++) this.gl.deleteProgram(this._shaderSets.at(t).shaderProgram), this._shaderSets.at(t).shaderProgram = 0, this._shaderSets.set(t, void 0), this._shaderSets.set(t, null)
+ }, i.prototype.generateShaders = function () {
+ for (var e = 0; e < 10; e++) this._shaderSets.pushBack(new h);
+ this._shaderSets.at(0).shaderProgram = this.loadShaderProgram(t.vertexShaderSrcSetupMask, t.fragmentShaderSrcsetupMask), this._shaderSets.at(1).shaderProgram = this.loadShaderProgram(t.vertexShaderSrc, t.fragmentShaderSrcPremultipliedAlpha), this._shaderSets.at(2).shaderProgram = this.loadShaderProgram(t.vertexShaderSrcMasked, t.fragmentShaderSrcMaskPremultipliedAlpha), this._shaderSets.at(3).shaderProgram = this.loadShaderProgram(t.vertexShaderSrcMasked, t.fragmentShaderSrcMaskInvertedPremultipliedAlpha), this._shaderSets.at(4).shaderProgram = this._shaderSets.at(1).shaderProgram, this._shaderSets.at(5).shaderProgram = this._shaderSets.at(2).shaderProgram, this._shaderSets.at(6).shaderProgram = this._shaderSets.at(3).shaderProgram, this._shaderSets.at(7).shaderProgram = this._shaderSets.at(1).shaderProgram, this._shaderSets.at(8).shaderProgram = this._shaderSets.at(2).shaderProgram, this._shaderSets.at(9).shaderProgram = this._shaderSets.at(3).shaderProgram, this._shaderSets.at(0).attributePositionLocation = this.gl.getAttribLocation(this._shaderSets.at(0).shaderProgram, "a_position"), this._shaderSets.at(0).attributeTexCoordLocation = this.gl.getAttribLocation(this._shaderSets.at(0).shaderProgram, "a_texCoord"), this._shaderSets.at(0).samplerTexture0Location = this.gl.getUniformLocation(this._shaderSets.at(0).shaderProgram, "s_texture0"), this._shaderSets.at(0).uniformClipMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(0).shaderProgram, "u_clipMatrix"), this._shaderSets.at(0).uniformChannelFlagLocation = this.gl.getUniformLocation(this._shaderSets.at(0).shaderProgram, "u_channelFlag"), this._shaderSets.at(0).uniformBaseColorLocation = this.gl.getUniformLocation(this._shaderSets.at(0).shaderProgram, "u_baseColor"), this._shaderSets.at(1).attributePositionLocation = this.gl.getAttribLocation(this._shaderSets.at(1).shaderProgram, "a_position"), this._shaderSets.at(1).attributeTexCoordLocation = this.gl.getAttribLocation(this._shaderSets.at(1).shaderProgram, "a_texCoord"), this._shaderSets.at(1).samplerTexture0Location = this.gl.getUniformLocation(this._shaderSets.at(1).shaderProgram, "s_texture0"), this._shaderSets.at(1).uniformMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(1).shaderProgram, "u_matrix"), this._shaderSets.at(1).uniformBaseColorLocation = this.gl.getUniformLocation(this._shaderSets.at(1).shaderProgram, "u_baseColor"), this._shaderSets.at(2).attributePositionLocation = this.gl.getAttribLocation(this._shaderSets.at(2).shaderProgram, "a_position"), this._shaderSets.at(2).attributeTexCoordLocation = this.gl.getAttribLocation(this._shaderSets.at(2).shaderProgram, "a_texCoord"), this._shaderSets.at(2).samplerTexture0Location = this.gl.getUniformLocation(this._shaderSets.at(2).shaderProgram, "s_texture0"), this._shaderSets.at(2).samplerTexture1Location = this.gl.getUniformLocation(this._shaderSets.at(2).shaderProgram, "s_texture1"), this._shaderSets.at(2).uniformMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(2).shaderProgram, "u_matrix"), this._shaderSets.at(2).uniformClipMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(2).shaderProgram, "u_clipMatrix"), this._shaderSets.at(2).uniformChannelFlagLocation = this.gl.getUniformLocation(this._shaderSets.at(2).shaderProgram, "u_channelFlag"), this._shaderSets.at(2).uniformBaseColorLocation = this.gl.getUniformLocation(this._shaderSets.at(2).shaderProgram, "u_baseColor"), this._shaderSets.at(3).attributePositionLocation = this.gl.getAttribLocation(this._shaderSets.at(3).shaderProgram, "a_position"), this._shaderSets.at(3).attributeTexCoordLocation = this.gl.getAttribLocation(this._shaderSets.at(3).shaderProgram, "a_texCoord"), this._shaderSets.at(3).samplerTexture0Location = this.gl.getUniformLocation(this._shaderSets.at(3).shaderProgram, "s_texture0"), this._shaderSets.at(3).samplerTexture1Location = this.gl.getUniformLocation(this._shaderSets.at(3).shaderProgram, "s_texture1"), this._shaderSets.at(3).uniformMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(3).shaderProgram, "u_matrix"), this._shaderSets.at(3).uniformClipMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(3).shaderProgram, "u_clipMatrix"), this._shaderSets.at(3).uniformChannelFlagLocation = this.gl.getUniformLocation(this._shaderSets.at(3).shaderProgram, "u_channelFlag"), this._shaderSets.at(3).uniformBaseColorLocation = this.gl.getUniformLocation(this._shaderSets.at(3).shaderProgram, "u_baseColor"), this._shaderSets.at(4).attributePositionLocation = this.gl.getAttribLocation(this._shaderSets.at(4).shaderProgram, "a_position"), this._shaderSets.at(4).attributeTexCoordLocation = this.gl.getAttribLocation(this._shaderSets.at(4).shaderProgram, "a_texCoord"), this._shaderSets.at(4).samplerTexture0Location = this.gl.getUniformLocation(this._shaderSets.at(4).shaderProgram, "s_texture0"), this._shaderSets.at(4).uniformMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(4).shaderProgram, "u_matrix"), this._shaderSets.at(4).uniformBaseColorLocation = this.gl.getUniformLocation(this._shaderSets.at(4).shaderProgram, "u_baseColor"), this._shaderSets.at(5).attributePositionLocation = this.gl.getAttribLocation(this._shaderSets.at(5).shaderProgram, "a_position"), this._shaderSets.at(5).attributeTexCoordLocation = this.gl.getAttribLocation(this._shaderSets.at(5).shaderProgram, "a_texCoord"), this._shaderSets.at(5).samplerTexture0Location = this.gl.getUniformLocation(this._shaderSets.at(5).shaderProgram, "s_texture0"), this._shaderSets.at(5).samplerTexture1Location = this.gl.getUniformLocation(this._shaderSets.at(5).shaderProgram, "s_texture1"), this._shaderSets.at(5).uniformMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(5).shaderProgram, "u_matrix"), this._shaderSets.at(5).uniformClipMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(5).shaderProgram, "u_clipMatrix"), this._shaderSets.at(5).uniformChannelFlagLocation = this.gl.getUniformLocation(this._shaderSets.at(5).shaderProgram, "u_channelFlag"), this._shaderSets.at(5).uniformBaseColorLocation = this.gl.getUniformLocation(this._shaderSets.at(5).shaderProgram, "u_baseColor"), this._shaderSets.at(6).attributePositionLocation = this.gl.getAttribLocation(this._shaderSets.at(6).shaderProgram, "a_position"), this._shaderSets.at(6).attributeTexCoordLocation = this.gl.getAttribLocation(this._shaderSets.at(6).shaderProgram, "a_texCoord"), this._shaderSets.at(6).samplerTexture0Location = this.gl.getUniformLocation(this._shaderSets.at(6).shaderProgram, "s_texture0"), this._shaderSets.at(6).samplerTexture1Location = this.gl.getUniformLocation(this._shaderSets.at(6).shaderProgram, "s_texture1"), this._shaderSets.at(6).uniformMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(6).shaderProgram, "u_matrix"), this._shaderSets.at(6).uniformClipMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(6).shaderProgram, "u_clipMatrix"), this._shaderSets.at(6).uniformChannelFlagLocation = this.gl.getUniformLocation(this._shaderSets.at(6).shaderProgram, "u_channelFlag"), this._shaderSets.at(6).uniformBaseColorLocation = this.gl.getUniformLocation(this._shaderSets.at(6).shaderProgram, "u_baseColor"), this._shaderSets.at(7).attributePositionLocation = this.gl.getAttribLocation(this._shaderSets.at(7).shaderProgram, "a_position"), this._shaderSets.at(7).attributeTexCoordLocation = this.gl.getAttribLocation(this._shaderSets.at(7).shaderProgram, "a_texCoord"), this._shaderSets.at(7).samplerTexture0Location = this.gl.getUniformLocation(this._shaderSets.at(7).shaderProgram, "s_texture0"), this._shaderSets.at(7).uniformMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(7).shaderProgram, "u_matrix"), this._shaderSets.at(7).uniformBaseColorLocation = this.gl.getUniformLocation(this._shaderSets.at(7).shaderProgram, "u_baseColor"), this._shaderSets.at(8).attributePositionLocation = this.gl.getAttribLocation(this._shaderSets.at(8).shaderProgram, "a_position"), this._shaderSets.at(8).attributeTexCoordLocation = this.gl.getAttribLocation(this._shaderSets.at(8).shaderProgram, "a_texCoord"), this._shaderSets.at(8).samplerTexture0Location = this.gl.getUniformLocation(this._shaderSets.at(8).shaderProgram, "s_texture0"), this._shaderSets.at(8).samplerTexture1Location = this.gl.getUniformLocation(this._shaderSets.at(8).shaderProgram, "s_texture1"), this._shaderSets.at(8).uniformMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(8).shaderProgram, "u_matrix"), this._shaderSets.at(8).uniformClipMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(8).shaderProgram, "u_clipMatrix"), this._shaderSets.at(8).uniformChannelFlagLocation = this.gl.getUniformLocation(this._shaderSets.at(8).shaderProgram, "u_channelFlag"), this._shaderSets.at(8).uniformBaseColorLocation = this.gl.getUniformLocation(this._shaderSets.at(8).shaderProgram, "u_baseColor"), this._shaderSets.at(9).attributePositionLocation = this.gl.getAttribLocation(this._shaderSets.at(9).shaderProgram, "a_position"), this._shaderSets.at(9).attributeTexCoordLocation = this.gl.getAttribLocation(this._shaderSets.at(9).shaderProgram, "a_texCoord"), this._shaderSets.at(9).samplerTexture0Location = this.gl.getUniformLocation(this._shaderSets.at(9).shaderProgram, "s_texture0"), this._shaderSets.at(9).samplerTexture1Location = this.gl.getUniformLocation(this._shaderSets.at(9).shaderProgram, "s_texture1"), this._shaderSets.at(9).uniformMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(9).shaderProgram, "u_matrix"), this._shaderSets.at(9).uniformClipMatrixLocation = this.gl.getUniformLocation(this._shaderSets.at(9).shaderProgram, "u_clipMatrix"), this._shaderSets.at(9).uniformChannelFlagLocation = this.gl.getUniformLocation(this._shaderSets.at(9).shaderProgram, "u_channelFlag"), this._shaderSets.at(9).uniformBaseColorLocation = this.gl.getUniformLocation(this._shaderSets.at(9).shaderProgram, "u_baseColor")
+ }, i.prototype.loadShaderProgram = function (t, e) {
+ var i = this.gl.createProgram(),
+ r = this.compileShaderSource(this.gl.VERTEX_SHADER, t);
+ if (!r) return p.CubismLogError("Vertex shader compile error!"), 0;
+ var o = this.compileShaderSource(this.gl.FRAGMENT_SHADER, e);
+ return o ? (this.gl.attachShader(i, r), this.gl.attachShader(i, o), this.gl.linkProgram(i), this.gl.getProgramParameter(i, this.gl.LINK_STATUS) ? (this.gl.deleteShader(r), this.gl.deleteShader(o), i) : (p.CubismLogError("Failed to link program: {0}", i), this.gl.deleteShader(r), r = 0, this.gl.deleteShader(o), o = 0, i && (this.gl.deleteProgram(i), i = 0), 0)) : (p.CubismLogError("Vertex shader compile error!"), 0)
+ }, i.prototype.compileShaderSource = function (t, e) {
+ var i = e,
+ r = this.gl.createShader(t);
+ if (this.gl.shaderSource(r, i), this.gl.compileShader(r), !r) {
+ var o = this.gl.getShaderInfoLog(r);
+ p.CubismLogError("Shader compile log: {0} ", o)
+ }
+ return this.gl.getShaderParameter(r, this.gl.COMPILE_STATUS) ? r : (this.gl.deleteShader(r), null)
+ }, i.prototype.setGl = function (t) {
+ this.gl = t
+ }, i
+ }();
+ t.CubismShader_WebGL = u;
+ var l, h = function () {};
+ t.CubismShaderSet = h,
+ function (t) {
+ t[t.ShaderNames_SetupMask = 0] = "ShaderNames_SetupMask", t[t.ShaderNames_NormalPremultipliedAlpha = 1] = "ShaderNames_NormalPremultipliedAlpha", t[t.ShaderNames_NormalMaskedPremultipliedAlpha = 2] = "ShaderNames_NormalMaskedPremultipliedAlpha", t[t.ShaderNames_NomralMaskedInvertedPremultipliedAlpha = 3] = "ShaderNames_NomralMaskedInvertedPremultipliedAlpha", t[t.ShaderNames_AddPremultipliedAlpha = 4] = "ShaderNames_AddPremultipliedAlpha", t[t.ShaderNames_AddMaskedPremultipliedAlpha = 5] = "ShaderNames_AddMaskedPremultipliedAlpha", t[t.ShaderNames_AddMaskedPremultipliedAlphaInverted = 6] = "ShaderNames_AddMaskedPremultipliedAlphaInverted", t[t.ShaderNames_MultPremultipliedAlpha = 7] = "ShaderNames_MultPremultipliedAlpha", t[t.ShaderNames_MultMaskedPremultipliedAlpha = 8] = "ShaderNames_MultMaskedPremultipliedAlpha", t[t.ShaderNames_MultMaskedPremultipliedAlphaInverted = 9] = "ShaderNames_MultMaskedPremultipliedAlphaInverted"
+ }(l = t.ShaderNames || (t.ShaderNames = {})), t.vertexShaderSrcSetupMask = "attribute vec4 a_position;attribute vec2 a_texCoord;varying vec2 v_texCoord;varying vec4 v_myPos;uniform mat4 u_clipMatrix;void main(){ gl_Position = u_clipMatrix * a_position; v_myPos = u_clipMatrix * a_position; v_texCoord = a_texCoord; v_texCoord.y = 1.0 - v_texCoord.y;}", t.fragmentShaderSrcsetupMask = "precision mediump float;varying vec2 v_texCoord;varying vec4 v_myPos;uniform vec4 u_baseColor;uniform vec4 u_channelFlag;uniform sampler2D s_texture0;void main(){ float isInside = step(u_baseColor.x, v_myPos.x/v_myPos.w) * step(u_baseColor.y, v_myPos.y/v_myPos.w) * step(v_myPos.x/v_myPos.w, u_baseColor.z) * step(v_myPos.y/v_myPos.w, u_baseColor.w); gl_FragColor = u_channelFlag * texture2D(s_texture0, v_texCoord).a * isInside;}", t.vertexShaderSrc = "attribute vec4 a_position;attribute vec2 a_texCoord;varying vec2 v_texCoord;uniform mat4 u_matrix;void main(){ gl_Position = u_matrix * a_position; v_texCoord = a_texCoord; v_texCoord.y = 1.0 - v_texCoord.y;}", t.vertexShaderSrcMasked = "attribute vec4 a_position;attribute vec2 a_texCoord;varying vec2 v_texCoord;varying vec4 v_clipPos;uniform mat4 u_matrix;uniform mat4 u_clipMatrix;void main(){ gl_Position = u_matrix * a_position; v_clipPos = u_clipMatrix * a_position; v_texCoord = a_texCoord; v_texCoord.y = 1.0 - v_texCoord.y;}", t.fragmentShaderSrcPremultipliedAlpha = "precision mediump float;varying vec2 v_texCoord;uniform vec4 u_baseColor;uniform sampler2D s_texture0;void main(){ gl_FragColor = texture2D(s_texture0 , v_texCoord) * u_baseColor;}", t.fragmentShaderSrcMaskPremultipliedAlpha = "precision mediump float;varying vec2 v_texCoord;varying vec4 v_clipPos;uniform vec4 u_baseColor;uniform vec4 u_channelFlag;uniform sampler2D s_texture0;uniform sampler2D s_texture1;void main(){ vec4 col_formask = texture2D(s_texture0 , v_texCoord) * u_baseColor; vec4 clipMask = (1.0 - texture2D(s_texture1, v_clipPos.xy / v_clipPos.w)) * u_channelFlag; float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a; col_formask = col_formask * maskVal; gl_FragColor = col_formask;}", t.fragmentShaderSrcMaskInvertedPremultipliedAlpha = "precision mediump float;varying vec2 v_texCoord;varying vec4 v_clipPos;uniform sampler2D s_texture0;uniform sampler2D s_texture1;uniform vec4 u_channelFlag;uniform vec4 u_baseColor;void main(){vec4 col_formask = texture2D(s_texture0, v_texCoord) * u_baseColor;vec4 clipMask = (1.0 - texture2D(s_texture1, v_clipPos.xy / v_clipPos.w)) * u_channelFlag;float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;col_formask = col_formask * (1.0 - maskVal);gl_FragColor = col_formask;}";
+ var S = function (t) {
+ function e() {
+ var e = t.call(this) || this;
+ return e._clippingContextBufferForMask = null, e._clippingContextBufferForDraw = null, e._clippingManager = new n, e.firstDraw = !0, e._textures = new _, e._sortedDrawableIndexList = new m, e._bufferData = {
+ vertex: WebGLBuffer = null,
+ uv: WebGLBuffer = null,
+ index: WebGLBuffer = null
+ }, e._textures.prepareCapacity(32, !0), e
+ }
+ return o(e, t), e.prototype.initialize = function (e) {
+ e.isUsingMasking() && (this._clippingManager = new n, this._clippingManager.initialize(e, e.getDrawableCount(), e.getDrawableMasks(), e.getDrawableMaskCounts())), this._sortedDrawableIndexList.resize(e.getDrawableCount(), 0), t.prototype.initialize.call(this, e)
+ }, e.prototype.bindTexture = function (t, e) {
+ this._textures.setValue(t, e)
+ }, e.prototype.getBindedTextures = function () {
+ return this._textures
+ }, e.prototype.setClippingMaskBufferSize = function (t) {
+ this._clippingManager.release(), this._clippingManager = void 0, this._clippingManager = null, this._clippingManager = new n, this._clippingManager.setClippingMaskBufferSize(t), this._clippingManager.initialize(this.getModel(), this.getModel().getDrawableCount(), this.getModel().getDrawableMasks(), this.getModel().getDrawableMaskCounts())
+ }, e.prototype.getClippingMaskBufferSize = function () {
+ return this._clippingManager.getClippingMaskBufferSize()
+ }, e.prototype.release = function () {
+ this._clippingManager.release(), this._clippingManager = void 0, this._clippingManager = null, this.gl.deleteBuffer(this._bufferData.vertex), this._bufferData.vertex = null, this.gl.deleteBuffer(this._bufferData.uv), this._bufferData.uv = null, this.gl.deleteBuffer(this._bufferData.index), this._bufferData.index = null, this._bufferData = null, this._textures = null
+ }, e.prototype.doDrawModel = function () {
+ null != this._clippingManager && (this.preDraw(), this._clippingManager.setupClippingContext(this.getModel(), this)), this.preDraw();
+ for (var t = this.getModel().getDrawableCount(), e = this.getModel().getDrawableRenderOrders(), i = 0; i < t; ++i) {
+ var r = e[i];
+ this._sortedDrawableIndexList.set(r, i)
+ }
+ for (i = 0; i < t; ++i) {
+ var o = this._sortedDrawableIndexList.at(i);
+ this.getModel().getDrawableDynamicFlagIsVisible(o) && (this.setClippingContextBufferForDraw(null != this._clippingManager ? this._clippingManager.getClippingContextListForDraw().at(o) : null), this.setIsCulling(this.getModel().getDrawableCulling(o)), this.drawMesh(this.getModel().getDrawableTextureIndices(o), this.getModel().getDrawableVertexIndexCount(o), this.getModel().getDrawableVertexCount(o), this.getModel().getDrawableVertexIndices(o), this.getModel().getDrawableVertices(o), this.getModel().getDrawableVertexUvs(o), this.getModel().getDrawableOpacity(o), this.getModel().getDrawableBlendMode(o), this.getModel().getDrawableInvertedMaskBit(o)))
+ }
+ }, e.prototype.drawMesh = function (t, e, i, r, o, n, a, s, l) {
+ this.isCulling() ? this.gl.enable(this.gl.CULL_FACE) : this.gl.disable(this.gl.CULL_FACE), this.gl.frontFace(this.gl.CCW);
+ var h, p = this.getModelColor();
+ null == this.getClippingContextBufferForMask() && (p.A *= a, this.isPremultipliedAlpha() && (p.R *= p.A, p.G *= p.A, p.B *= p.A)), h = null != this._textures.getValue(t) ? this._textures.getValue(t) : null, u.getInstance().setupShaderProgram(this, h, i, o, r, n, this._bufferData, a, s, p, this.isPremultipliedAlpha(), this.getMvpMatrix(), l), this.gl.drawElements(this.gl.TRIANGLES, e, this.gl.UNSIGNED_SHORT, 0), this.gl.useProgram(null), this.setClippingContextBufferForDraw(null), this.setClippingContextBufferForMask(null)
+ }, e.doStaticRelease = function () {
+ u.deleteInstance()
+ }, e.prototype.setRenderState = function (t, e) {
+ r = t, i = e
+ }, e.prototype.preDraw = function () {
+ this.firstDraw && (this.firstDraw = !1, this._anisortopy = this.gl.getExtension("EXT_texture_filter_anisotropic") || this.gl.getExtension("WEBKIT_EXT_texture_filter_anisotropic") || this.gl.getExtension("MOZ_EXT_texture_filter_anisotropic")), this.gl.disable(this.gl.SCISSOR_TEST), this.gl.disable(this.gl.STENCIL_TEST), this.gl.disable(this.gl.DEPTH_TEST), this.gl.frontFace(this.gl.CW), this.gl.enable(this.gl.BLEND), this.gl.colorMask(!0, !0, !0, !0), this.gl.bindBuffer(this.gl.ARRAY_BUFFER, null), this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, null)
+ }, e.prototype.setClippingContextBufferForMask = function (t) {
+ this._clippingContextBufferForMask = t
+ }, e.prototype.getClippingContextBufferForMask = function () {
+ return this._clippingContextBufferForMask
+ }, e.prototype.setClippingContextBufferForDraw = function (t) {
+ this._clippingContextBufferForDraw = t
+ }, e.prototype.getClippingContextBufferForDraw = function () {
+ return this._clippingContextBufferForDraw
+ }, e.prototype.startUp = function (t) {
+ this.gl = t, this._clippingManager.setGL(t), u.getInstance().setGl(t)
+ }, e
+ }(f);
+ t.CubismRenderer_WebGL = S, f.staticRelease = function () {
+ S.doStaticRelease()
+ }
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ function (t) {
+ var e = function () {
+ function t(t, e, i, r) {
+ this.x = t, this.y = e, this.width = i, this.height = r
+ }
+ return t.prototype.getCenterX = function () {
+ return this.x + .5 * this.width
+ }, t.prototype.getCenterY = function () {
+ return this.y + .5 * this.height
+ }, t.prototype.getRight = function () {
+ return this.x + this.width
+ }, t.prototype.getBottom = function () {
+ return this.y + this.height
+ }, t.prototype.setRect = function (t) {
+ this.x = t.x, this.y = t.y, this.width = t.width, this.height = t.height
+ }, t.prototype.expand = function (t, e) {
+ this.x -= t, this.y -= e, this.width += 2 * t, this.height += 2 * e
+ }, t
+ }();
+ t.csmRect = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ var r, o = this && this.__extends || (r = function (t, e) {
+ return (r = Object.setPrototypeOf || {
+ __proto__: []
+ }
+ instanceof Array && function (t, e) {
+ t.__proto__ = e
+ } || function (t, e) {
+ for (var i in e) e.hasOwnProperty(i) && (t[i] = e[i])
+ })(t, e)
+ }, function (t, e) {
+ function i() {
+ this.constructor = t
+ }
+ r(t, e), t.prototype = null === e ? Object.create(e) : (i.prototype = e.prototype, new i)
+ });
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var n = i(0),
+ a = i(46),
+ s = i(3),
+ u = i(1).Live2DCubismFramework.csmVector,
+ l = n.Live2DCubismFramework.CubismFramework,
+ h = s.Live2DCubismFramework.CubismJson,
+ p = a.Live2DCubismFramework.ICubismModelSetting;
+ ! function (t) {
+ var e, i = "Name";
+ ! function (t) {
+ t[t.FrequestNode_Groups = 0] = "FrequestNode_Groups", t[t.FrequestNode_Moc = 1] = "FrequestNode_Moc", t[t.FrequestNode_Motions = 2] = "FrequestNode_Motions", t[t.FrequestNode_Expressions = 3] = "FrequestNode_Expressions", t[t.FrequestNode_Textures = 4] = "FrequestNode_Textures", t[t.FrequestNode_Physics = 5] = "FrequestNode_Physics", t[t.FrequestNode_Pose = 6] = "FrequestNode_Pose", t[t.FrequestNode_HitAreas = 7] = "FrequestNode_HitAreas"
+ }(e || (e = {}));
+ var r = function (t) {
+ function r(e, i) {
+ var r = t.call(this) || this;
+ return r._json = h.create(e, i), r._json && (r._jsonValue = new u, r._jsonValue.pushBack(r._json.getRoot().getValueByString("Groups")), r._jsonValue.pushBack(r._json.getRoot().getValueByString("FileReferences").getValueByString("Moc")), r._jsonValue.pushBack(r._json.getRoot().getValueByString("FileReferences").getValueByString("Motions")), r._jsonValue.pushBack(r._json.getRoot().getValueByString("FileReferences").getValueByString("Expressions")), r._jsonValue.pushBack(r._json.getRoot().getValueByString("FileReferences").getValueByString("Textures")), r._jsonValue.pushBack(r._json.getRoot().getValueByString("FileReferences").getValueByString("Physics")), r._jsonValue.pushBack(r._json.getRoot().getValueByString("FileReferences").getValueByString("Pose")), r._jsonValue.pushBack(r._json.getRoot().getValueByString("HitAreas"))), r
+ }
+ return o(r, t), r.prototype.release = function () {
+ h.delete(this._json), this._jsonValue = null
+ }, r.prototype.GetJson = function () {
+ return this._json
+ }, r.prototype.getModelFileName = function () {
+ return this.isExistModelFile() ? this._jsonValue.at(e.FrequestNode_Moc).getRawString() : ""
+ }, r.prototype.getTextureCount = function () {
+ return this.isExistTextureFiles() ? this._jsonValue.at(e.FrequestNode_Textures).getSize() : 0
+ }, r.prototype.getTextureDirectory = function () {
+ return this._jsonValue.at(e.FrequestNode_Textures).getRawString()
+ }, r.prototype.getTextureFileName = function (t) {
+ return this._jsonValue.at(e.FrequestNode_Textures).getValueByIndex(t).getRawString()
+ }, r.prototype.getHitAreasCount = function () {
+ return this.isExistHitAreas() ? this._jsonValue.at(e.FrequestNode_HitAreas).getSize() : 0
+ }, r.prototype.getHitAreaId = function (t) {
+ return l.getIdManager().getId(this._jsonValue.at(e.FrequestNode_HitAreas).getValueByIndex(t).getValueByString("Id").getRawString())
+ }, r.prototype.getHitAreaName = function (t) {
+ return this._jsonValue.at(e.FrequestNode_HitAreas).getValueByIndex(t).getValueByString(i).getRawString()
+ }, r.prototype.getPhysicsFileName = function () {
+ return this.isExistPhysicsFile() ? this._jsonValue.at(e.FrequestNode_Physics).getRawString() : ""
+ }, r.prototype.getPoseFileName = function () {
+ return this.isExistPoseFile() ? this._jsonValue.at(e.FrequestNode_Pose).getRawString() : ""
+ }, r.prototype.getExpressionCount = function () {
+ return this.isExistExpressionFile() ? this._jsonValue.at(e.FrequestNode_Expressions).getSize() : 0
+ }, r.prototype.getExpressionName = function (t) {
+ return this._jsonValue.at(e.FrequestNode_Expressions).getValueByIndex(t).getValueByString(i).getRawString()
+ }, r.prototype.getExpressionFileName = function (t) {
+ return this._jsonValue.at(e.FrequestNode_Expressions).getValueByIndex(t).getValueByString("File").getRawString()
+ }, r.prototype.getMotionGroupCount = function () {
+ return this.isExistMotionGroups() ? this._jsonValue.at(e.FrequestNode_Motions).getKeys().getSize() : 0
+ }, r.prototype.getMotionGroupName = function (t) {
+ return this.isExistMotionGroups() ? this._jsonValue.at(e.FrequestNode_Motions).getKeys().at(t) : null
+ }, r.prototype.getMotionCount = function (t) {
+ return this.isExistMotionGroupName(t) ? this._jsonValue.at(e.FrequestNode_Motions).getValueByString(t).getSize() : 0
+ }, r.prototype.getMotionFileName = function (t, i) {
+ return this.isExistMotionGroupName(t) ? this._jsonValue.at(e.FrequestNode_Motions).getValueByString(t).getValueByIndex(i).getValueByString("File").getRawString() : ""
+ }, r.prototype.getMotionSoundFileName = function (t, i) {
+ return this.isExistMotionSoundFile(t, i) ? this._jsonValue.at(e.FrequestNode_Motions).getValueByString(t).getValueByIndex(i).getValueByString("Sound").getRawString() : ""
+ }, r.prototype.getMotionFadeInTimeValue = function (t, i) {
+ return this.isExistMotionFadeIn(t, i) ? this._jsonValue.at(e.FrequestNode_Motions).getValueByString(t).getValueByIndex(i).getValueByString("FadeInTime").toFloat() : -1
+ }, r.prototype.getMotionFadeOutTimeValue = function (t, i) {
+ return this.isExistMotionFadeOut(t, i) ? this._jsonValue.at(e.FrequestNode_Motions).getValueByString(t).getValueByIndex(i).getValueByString("FadeOutTime").toFloat() : -1
+ }, r.prototype.getUserDataFile = function () {
+ return this.isExistUserDataFile() ? this._json.getRoot().getValueByString("FileReferences").getValueByString("UserData").getRawString() : ""
+ }, r.prototype.getLayoutMap = function (t) {
+ var e = this._json.getRoot().getValueByString("Layout").getMap();
+ if (null == e) return !1;
+ for (var i = !1, r = e.begin(); r.notEqual(e.end()); r.preIncrement()) t.setValue(r.ptr().first, r.ptr().second.toFloat()), i = !0;
+ return i
+ }, r.prototype.getEyeBlinkParameterCount = function () {
+ if (!this.isExistEyeBlinkParameters()) return 0;
+ for (var t = 0, r = 0; r < this._jsonValue.at(e.FrequestNode_Groups).getSize(); r++) {
+ var o = this._jsonValue.at(e.FrequestNode_Groups).getValueByIndex(r);
+ if (!o.isNull() && !o.isError() && "EyeBlink" == o.getValueByString(i).getRawString()) {
+ t = o.getValueByString("Ids").getVector().getSize();
+ break
+ }
+ }
+ return t
+ }, r.prototype.getEyeBlinkParameterId = function (t) {
+ if (!this.isExistEyeBlinkParameters()) return null;
+ for (var r = 0; r < this._jsonValue.at(e.FrequestNode_Groups).getSize(); r++) {
+ var o = this._jsonValue.at(e.FrequestNode_Groups).getValueByIndex(r);
+ if (!o.isNull() && !o.isError() && "EyeBlink" == o.getValueByString(i).getRawString()) return l.getIdManager().getId(o.getValueByString("Ids").getValueByIndex(t).getRawString())
+ }
+ return null
+ }, r.prototype.getLipSyncParameterCount = function () {
+ if (!this.isExistLipSyncParameters()) return 0;
+ for (var t = 0, r = 0; r < this._jsonValue.at(e.FrequestNode_Groups).getSize(); r++) {
+ var o = this._jsonValue.at(e.FrequestNode_Groups).getValueByIndex(r);
+ if (!o.isNull() && !o.isError() && "LipSync" == o.getValueByString(i).getRawString()) {
+ t = o.getValueByString("Ids").getVector().getSize();
+ break
+ }
+ }
+ return t
+ }, r.prototype.getLipSyncParameterId = function (t) {
+ if (!this.isExistLipSyncParameters()) return null;
+ for (var r = 0; r < this._jsonValue.at(e.FrequestNode_Groups).getSize(); r++) {
+ var o = this._jsonValue.at(e.FrequestNode_Groups).getValueByIndex(r);
+ if (!o.isNull() && !o.isError() && "LipSync" == o.getValueByString(i).getRawString()) return l.getIdManager().getId(o.getValueByString("Ids").getValueByIndex(t).getRawString())
+ }
+ return null
+ }, r.prototype.isExistModelFile = function () {
+ var t = this._jsonValue.at(e.FrequestNode_Moc);
+ return !t.isNull() && !t.isError()
+ }, r.prototype.isExistTextureFiles = function () {
+ var t = this._jsonValue.at(e.FrequestNode_Textures);
+ return !t.isNull() && !t.isError()
+ }, r.prototype.isExistHitAreas = function () {
+ var t = this._jsonValue.at(e.FrequestNode_HitAreas);
+ return !t.isNull() && !t.isError()
+ }, r.prototype.isExistPhysicsFile = function () {
+ var t = this._jsonValue.at(e.FrequestNode_Physics);
+ return !t.isNull() && !t.isError()
+ }, r.prototype.isExistPoseFile = function () {
+ var t = this._jsonValue.at(e.FrequestNode_Pose);
+ return !t.isNull() && !t.isError()
+ }, r.prototype.isExistExpressionFile = function () {
+ var t = this._jsonValue.at(e.FrequestNode_Expressions);
+ return !t.isNull() && !t.isError()
+ }, r.prototype.isExistMotionGroups = function () {
+ var t = this._jsonValue.at(e.FrequestNode_Motions);
+ return !t.isNull() && !t.isError()
+ }, r.prototype.isExistMotionGroupName = function (t) {
+ var i = this._jsonValue.at(e.FrequestNode_Motions).getValueByString(t);
+ return !i.isNull() && !i.isError()
+ }, r.prototype.isExistMotionSoundFile = function (t, i) {
+ var r = this._jsonValue.at(e.FrequestNode_Motions).getValueByString(t).getValueByIndex(i).getValueByString("Sound");
+ return !r.isNull() && !r.isError()
+ }, r.prototype.isExistMotionFadeIn = function (t, i) {
+ var r = this._jsonValue.at(e.FrequestNode_Motions).getValueByString(t).getValueByIndex(i).getValueByString("FadeInTime");
+ return !r.isNull() && !r.isError()
+ }, r.prototype.isExistMotionFadeOut = function (t, i) {
+ var r = this._jsonValue.at(e.FrequestNode_Motions).getValueByString(t).getValueByIndex(i).getValueByString("FadeOutTime");
+ return !r.isNull() && !r.isError()
+ }, r.prototype.isExistUserDataFile = function () {
+ var t = this._json.getRoot().getValueByString("FileReferences").getValueByString("UserData");
+ return !t.isNull() && !t.isError()
+ }, r.prototype.isExistEyeBlinkParameters = function () {
+ if (this._jsonValue.at(e.FrequestNode_Groups).isNull() || this._jsonValue.at(e.FrequestNode_Groups).isError()) return !1;
+ for (var t = 0; t < this._jsonValue.at(e.FrequestNode_Groups).getSize(); ++t)
+ if ("EyeBlink" == this._jsonValue.at(e.FrequestNode_Groups).getValueByIndex(t).getValueByString(i).getRawString()) return !0;
+ return !1
+ }, r.prototype.isExistLipSyncParameters = function () {
+ if (this._jsonValue.at(e.FrequestNode_Groups).isNull() || this._jsonValue.at(e.FrequestNode_Groups).isError()) return !1;
+ for (var t = 0; t < this._jsonValue.at(e.FrequestNode_Groups).getSize(); ++t)
+ if ("LipSync" == this._jsonValue.at(e.FrequestNode_Groups).getValueByIndex(t).getValueByString(i).getRawString()) return !0;
+ return !1
+ }, r
+ }(p);
+ t.CubismModelSettingJson = r
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ function (t) {
+ var e = function () {};
+ t.ICubismModelSetting = e
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ }),
+ function (t) {
+ t.HitAreaPrefix = "HitArea", t.HitAreaHead = "Head", t.HitAreaBody = "Body", t.PartsIdCore = "Parts01Core", t.PartsArmPrefix = "Parts01Arm_", t.PartsArmLPrefix = "Parts01ArmL_", t.PartsArmRPrefix = "Parts01ArmR_", t.ParamAngleX = "ParamAngleX", t.ParamAngleY = "ParamAngleY", t.ParamAngleZ = "ParamAngleZ", t.ParamEyeLOpen = "ParamEyeLOpen", t.ParamEyeLSmile = "ParamEyeLSmile", t.ParamEyeROpen = "ParamEyeROpen", t.ParamEyeRSmile = "ParamEyeRSmile", t.ParamEyeBallX = "ParamEyeBallX", t.ParamEyeBallY = "ParamEyeBallY", t.ParamEyeBallForm = "ParamEyeBallForm", t.ParamBrowLY = "ParamBrowLY", t.ParamBrowRY = "ParamBrowRY", t.ParamBrowLX = "ParamBrowLX", t.ParamBrowRX = "ParamBrowRX", t.ParamBrowLAngle = "ParamBrowLAngle", t.ParamBrowRAngle = "ParamBrowRAngle", t.ParamBrowLForm = "ParamBrowLForm", t.ParamBrowRForm = "ParamBrowRForm", t.ParamMouthForm = "ParamMouthForm", t.ParamMouthOpenY = "ParamMouthOpenY", t.ParamCheek = "ParamCheek", t.ParamBodyAngleX = "ParamBodyAngleX", t.ParamBodyAngleY = "ParamBodyAngleY", t.ParamBodyAngleZ = "ParamBodyAngleZ", t.ParamBreath = "ParamBreath", t.ParamArmLA = "ParamArmLA", t.ParamArmRA = "ParamArmRA", t.ParamArmLB = "ParamArmLB", t.ParamArmRB = "ParamArmRB", t.ParamHandL = "ParamHandL", t.ParamHandR = "ParamHandR", t.ParamHairFront = "ParamHairFront", t.ParamHairSide = "ParamHairSide", t.ParamHairBack = "ParamHairBack", t.ParamHairFluffy = "ParamHairFluffy", t.ParamShoulderY = "ParamShoulderY", t.ParamBustX = "ParamBustX", t.ParamBustY = "ParamBustY", t.ParamBaseX = "ParamBaseX", t.ParamBaseY = "ParamBaseY", t.ParamNONE = "NONE:"
+ }(e.Live2DCubismFramework || (e.Live2DCubismFramework = {}))
+}, function (t, e, i) {
+ "use strict";
+ i.r(e), i.d(e, "Headers", (function () {
+ return c
+ })), i.d(e, "Request", (function () {
+ return S
+ })), i.d(e, "Response", (function () {
+ return b
+ })), i.d(e, "DOMException", (function () {
+ return M
+ })), i.d(e, "fetch", (function () {
+ return L
+ }));
+ var r = "URLSearchParams" in self,
+ o = "Symbol" in self && "iterator" in Symbol,
+ n = "FileReader" in self && "Blob" in self && function () {
+ try {
+ return new Blob, !0
+ } catch (t) {
+ return !1
+ }
+ }(),
+ a = "FormData" in self,
+ s = "ArrayBuffer" in self;
+ if (s) var u = ["[object Int8Array]", "[object Uint8Array]", "[object Uint8ClampedArray]", "[object Int16Array]", "[object Uint16Array]", "[object Int32Array]", "[object Uint32Array]", "[object Float32Array]", "[object Float64Array]"],
+ l = ArrayBuffer.isView || function (t) {
+ return t && u.indexOf(Object.prototype.toString.call(t)) > -1
+ };
+
+ function h(t) {
+ if ("string" != typeof t && (t = String(t)), /[^a-z0-9\-#$%&'*+.^_`|~]/i.test(t)) throw new TypeError("Invalid character in header field name");
+ return t.toLowerCase()
+ }
+
+ function p(t) {
+ return "string" != typeof t && (t = String(t)), t
+ }
+
+ function g(t) {
+ var e = {
+ next: function () {
+ var e = t.shift();
+ return {
+ done: void 0 === e,
+ value: e
+ }
+ }
+ };
+ return o && (e[Symbol.iterator] = function () {
+ return e
+ }), e
+ }
+
+ function c(t) {
+ this.map = {}, t instanceof c ? t.forEach((function (t, e) {
+ this.append(e, t)
+ }), this) : Array.isArray(t) ? t.forEach((function (t) {
+ this.append(t[0], t[1])
+ }), this) : t && Object.getOwnPropertyNames(t).forEach((function (e) {
+ this.append(e, t[e])
+ }), this)
+ }
+
+ function d(t) {
+ if (t.bodyUsed) return Promise.reject(new TypeError("Already read"));
+ t.bodyUsed = !0
+ }
+
+ function _(t) {
+ return new Promise((function (e, i) {
+ t.onload = function () {
+ e(t.result)
+ }, t.onerror = function () {
+ i(t.error)
+ }
+ }))
+ }
+
+ function m(t) {
+ var e = new FileReader,
+ i = _(e);
+ return e.readAsArrayBuffer(t), i
+ }
+
+ function f(t) {
+ if (t.slice) return t.slice(0);
+ var e = new Uint8Array(t.byteLength);
+ return e.set(new Uint8Array(t)), e.buffer
+ }
+
+ function y() {
+ return this.bodyUsed = !1, this._initBody = function (t) {
+ var e;
+ this._bodyInit = t, t ? "string" == typeof t ? this._bodyText = t : n && Blob.prototype.isPrototypeOf(t) ? this._bodyBlob = t : a && FormData.prototype.isPrototypeOf(t) ? this._bodyFormData = t : r && URLSearchParams.prototype.isPrototypeOf(t) ? this._bodyText = t.toString() : s && n && ((e = t) && DataView.prototype.isPrototypeOf(e)) ? (this._bodyArrayBuffer = f(t.buffer), this._bodyInit = new Blob([this._bodyArrayBuffer])) : s && (ArrayBuffer.prototype.isPrototypeOf(t) || l(t)) ? this._bodyArrayBuffer = f(t) : this._bodyText = t = Object.prototype.toString.call(t) : this._bodyText = "", this.headers.get("content-type") || ("string" == typeof t ? this.headers.set("content-type", "text/plain;charset=UTF-8") : this._bodyBlob && this._bodyBlob.type ? this.headers.set("content-type", this._bodyBlob.type) : r && URLSearchParams.prototype.isPrototypeOf(t) && this.headers.set("content-type", "application/x-www-form-urlencoded;charset=UTF-8"))
+ }, n && (this.blob = function () {
+ var t = d(this);
+ if (t) return t;
+ if (this._bodyBlob) return Promise.resolve(this._bodyBlob);
+ if (this._bodyArrayBuffer) return Promise.resolve(new Blob([this._bodyArrayBuffer]));
+ if (this._bodyFormData) throw new Error("could not read FormData body as blob");
+ return Promise.resolve(new Blob([this._bodyText]))
+ }, this.arrayBuffer = function () {
+ return this._bodyArrayBuffer ? d(this) || Promise.resolve(this._bodyArrayBuffer) : this.blob().then(m)
+ }), this.text = function () {
+ var t, e, i, r = d(this);
+ if (r) return r;
+ if (this._bodyBlob) return t = this._bodyBlob, e = new FileReader, i = _(e), e.readAsText(t), i;
+ if (this._bodyArrayBuffer) return Promise.resolve(function (t) {
+ for (var e = new Uint8Array(t), i = new Array(e.length), r = 0; r < e.length; r++) i[r] = String.fromCharCode(e[r]);
+ return i.join("")
+ }(this._bodyArrayBuffer));
+ if (this._bodyFormData) throw new Error("could not read FormData body as text");
+ return Promise.resolve(this._bodyText)
+ }, a && (this.formData = function () {
+ return this.text().then(C)
+ }), this.json = function () {
+ return this.text().then(JSON.parse)
+ }, this
+ }
+ c.prototype.append = function (t, e) {
+ t = h(t), e = p(e);
+ var i = this.map[t];
+ this.map[t] = i ? i + ", " + e : e
+ }, c.prototype.delete = function (t) {
+ delete this.map[h(t)]
+ }, c.prototype.get = function (t) {
+ return t = h(t), this.has(t) ? this.map[t] : null
+ }, c.prototype.has = function (t) {
+ return this.map.hasOwnProperty(h(t))
+ }, c.prototype.set = function (t, e) {
+ this.map[h(t)] = p(e)
+ }, c.prototype.forEach = function (t, e) {
+ for (var i in this.map) this.map.hasOwnProperty(i) && t.call(e, this.map[i], i, this)
+ }, c.prototype.keys = function () {
+ var t = [];
+ return this.forEach((function (e, i) {
+ t.push(i)
+ })), g(t)
+ }, c.prototype.values = function () {
+ var t = [];
+ return this.forEach((function (e) {
+ t.push(e)
+ })), g(t)
+ }, c.prototype.entries = function () {
+ var t = [];
+ return this.forEach((function (e, i) {
+ t.push([i, e])
+ })), g(t)
+ }, o && (c.prototype[Symbol.iterator] = c.prototype.entries);
+ var v = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"];
+
+ function S(t, e) {
+ var i, r, o = (e = e || {}).body;
+ if (t instanceof S) {
+ if (t.bodyUsed) throw new TypeError("Already read");
+ this.url = t.url, this.credentials = t.credentials, e.headers || (this.headers = new c(t.headers)), this.method = t.method, this.mode = t.mode, this.signal = t.signal, o || null == t._bodyInit || (o = t._bodyInit, t.bodyUsed = !0)
+ } else this.url = String(t);
+ if (this.credentials = e.credentials || this.credentials || "same-origin", !e.headers && this.headers || (this.headers = new c(e.headers)), this.method = (i = e.method || this.method || "GET", r = i.toUpperCase(), v.indexOf(r) > -1 ? r : i), this.mode = e.mode || this.mode || null, this.signal = e.signal || this.signal, this.referrer = null, ("GET" === this.method || "HEAD" === this.method) && o) throw new TypeError("Body not allowed for GET or HEAD requests");
+ this._initBody(o)
+ }
+
+ function C(t) {
+ var e = new FormData;
+ return t.trim().split("&").forEach((function (t) {
+ if (t) {
+ var i = t.split("="),
+ r = i.shift().replace(/\+/g, " "),
+ o = i.join("=").replace(/\+/g, " ");
+ e.append(decodeURIComponent(r), decodeURIComponent(o))
+ }
+ })), e
+ }
+
+ function b(t, e) {
+ e || (e = {}), this.type = "default", this.status = void 0 === e.status ? 200 : e.status, this.ok = this.status >= 200 && this.status < 300, this.statusText = "statusText" in e ? e.statusText : "OK", this.headers = new c(e.headers), this.url = e.url || "", this._initBody(t)
+ }
+ S.prototype.clone = function () {
+ return new S(this, {
+ body: this._bodyInit
+ })
+ }, y.call(S.prototype), y.call(b.prototype), b.prototype.clone = function () {
+ return new b(this._bodyInit, {
+ status: this.status,
+ statusText: this.statusText,
+ headers: new c(this.headers),
+ url: this.url
+ })
+ }, b.error = function () {
+ var t = new b(null, {
+ status: 0,
+ statusText: ""
+ });
+ return t.type = "error", t
+ };
+ var x = [301, 302, 303, 307, 308];
+ b.redirect = function (t, e) {
+ if (-1 === x.indexOf(e)) throw new RangeError("Invalid status code");
+ return new b(null, {
+ status: e,
+ headers: {
+ location: t
+ }
+ })
+ };
+ var M = self.DOMException;
+ try {
+ new M
+ } catch (t) {
+ (M = function (t, e) {
+ this.message = t, this.name = e;
+ var i = Error(t);
+ this.stack = i.stack
+ }).prototype = Object.create(Error.prototype), M.prototype.constructor = M
+ }
+
+ function L(t, e) {
+ return new Promise((function (i, r) {
+ var o = new S(t, e);
+ if (o.signal && o.signal.aborted) return r(new M("Aborted", "AbortError"));
+ var a = new XMLHttpRequest;
+
+ function s() {
+ a.abort()
+ }
+ a.onload = function () {
+ var t, e, r = {
+ status: a.status,
+ statusText: a.statusText,
+ headers: (t = a.getAllResponseHeaders() || "", e = new c, t.replace(/\r?\n[\t ]+/g, " ").split(/\r?\n/).forEach((function (t) {
+ var i = t.split(":"),
+ r = i.shift().trim();
+ if (r) {
+ var o = i.join(":").trim();
+ e.append(r, o)
+ }
+ })), e)
+ };
+ r.url = "responseURL" in a ? a.responseURL : r.headers.get("X-Request-URL");
+ var o = "response" in a ? a.response : a.responseText;
+ i(new b(o, r))
+ }, a.onerror = function () {
+ r(new TypeError("Network request failed"))
+ }, a.ontimeout = function () {
+ r(new TypeError("Network request failed"))
+ }, a.onabort = function () {
+ r(new M("Aborted", "AbortError"))
+ }, a.open(o.method, o.url, !0), "include" === o.credentials ? a.withCredentials = !0 : "omit" === o.credentials && (a.withCredentials = !1), "responseType" in a && n && (a.responseType = "blob"), o.headers.forEach((function (t, e) {
+ a.setRequestHeader(e, t)
+ })), o.signal && (o.signal.addEventListener("abort", s), a.onreadystatechange = function () {
+ 4 === a.readyState && o.signal.removeEventListener("abort", s)
+ }), a.send(void 0 === o._bodyInit ? null : o._bodyInit)
+ }))
+ }
+ L.polyfill = !0, self.fetch || (self.fetch = L, self.Headers = c, self.Request = S, self.Response = b)
+}, function (t, e, i) {
+ "use strict";
+ Object.defineProperty(e, "__esModule", {
+ value: !0
+ });
+ var r = i(1).Live2DCubismFramework.csmVector,
+ o = i(5),
+ n = function () {
+ function t() {
+ this._textures = new r
+ }
+ return t.prototype.release = function () {
+ for (var t = this._textures.begin(); t.notEqual(this._textures.end()); t.preIncrement()) o.gl.deleteTexture(t.ptr().id);
+ this._textures = null
+ }, t.prototype.createTextureFromPngFile = function (t, e, i) {
+ for (var r = this, n = function (r) {
+ if (r.ptr().fileName == t && r.ptr().usePremultply == e) return r.ptr().img = new Image, r.ptr().img.onload = function () {
+ return i(r.ptr())
+ }, r.ptr().img.src = t, {
+ value: void 0
+ }
+ }, s = this._textures.begin(); s.notEqual(this._textures.end()); s.preIncrement()) {
+ var u = n(s);
+ if ("object" == typeof u) return u.value
+ }
+ var l = new Image;
+ l.crossOrigin = "", l.onload = function () {
+ var n = o.gl.createTexture();
+ o.gl.bindTexture(o.gl.TEXTURE_2D, n), o.gl.texParameteri(o.gl.TEXTURE_2D, o.gl.TEXTURE_MIN_FILTER, o.gl.LINEAR_MIPMAP_LINEAR), o.gl.texParameteri(o.gl.TEXTURE_2D, o.gl.TEXTURE_MAG_FILTER, o.gl.LINEAR), e && o.gl.pixelStorei(o.gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 1), o.gl.texImage2D(o.gl.TEXTURE_2D, 0, o.gl.RGBA, o.gl.RGBA, o.gl.UNSIGNED_BYTE, l), o.gl.generateMipmap(o.gl.TEXTURE_2D), o.gl.bindTexture(o.gl.TEXTURE_2D, null);
+ var s = new a;
+ null != s && (s.fileName = t, s.width = l.width, s.height = l.height, s.id = n, s.img = l, s.usePremultply = e, r._textures.pushBack(s)), i(s)
+ }, l.src = t
+ }, t.prototype.releaseTextures = function () {
+ for (var t = 0; t < this._textures.getSize(); t++) this._textures.set(t, null);
+ this._textures.clear()
+ }, t.prototype.releaseTextureByTexture = function (t) {
+ for (var e = 0; e < this._textures.getSize(); e++)
+ if (this._textures.at(e).id == t) {
+ this._textures.set(e, null), this._textures.remove(e);
+ break
+ }
+ }, t.prototype.releaseTextureByFilePath = function (t) {
+ for (var e = 0; e < this._textures.getSize(); e++)
+ if (this._textures.at(e).fileName == t) {
+ this._textures.set(e, null), this._textures.remove(e);
+ break
+ }
+ }, t
+ }();
+ e.LAppTextureManager = n;
+ var a = function () {
+ this.id = null, this.width = 0, this.height = 0
+ };
+ e.TextureInfo = a
+}]);
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvbGl2ZTJkY3ViaXNtZnJhbWV3b3JrLnRzIiwid2VicGFjazovLy9EOi9jb2RlL0N1YmlzbVNka0ZvcldlYi00LXIuMS9GcmFtZXdvcmsvc3JjL3R5cGUvY3NtdmVjdG9yLnRzIiwid2VicGFjazovLy9EOi9jb2RlL0N1YmlzbVNka0ZvcldlYi00LXIuMS9GcmFtZXdvcmsvc3JjL3V0aWxzL2N1YmlzbWRlYnVnLnRzIiwid2VicGFjazovLy9EOi9jb2RlL0N1YmlzbVNka0ZvcldlYi00LXIuMS9GcmFtZXdvcmsvc3JjL3V0aWxzL2N1YmlzbWpzb24udHMiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvbWF0aC9jdWJpc21tYXRyaXg0NC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbGFwcGRlbGVnYXRlLnRzIiwid2VicGFjazovLy9EOi9jb2RlL0N1YmlzbVNka0ZvcldlYi00LXIuMS9GcmFtZXdvcmsvc3JjL3R5cGUvY3Ntc3RyaW5nLnRzIiwid2VicGFjazovLy9EOi9jb2RlL0N1YmlzbVNka0ZvcldlYi00LXIuMS9GcmFtZXdvcmsvc3JjL3R5cGUvY3NtbWFwLnRzIiwid2VicGFjazovLy9EOi9jb2RlL0N1YmlzbVNka0ZvcldlYi00LXIuMS9GcmFtZXdvcmsvc3JjL21vdGlvbi9hY3ViaXNtbW90aW9uLnRzIiwid2VicGFjazovLy9EOi9jb2RlL0N1YmlzbVNka0ZvcldlYi00LXIuMS9GcmFtZXdvcmsvc3JjL21hdGgvY3ViaXNtbWF0aC50cyIsIndlYnBhY2s6Ly8vRDovY29kZS9DdWJpc21TZGtGb3JXZWItNC1yLjEvRnJhbWV3b3JrL3NyYy9tYXRoL2N1YmlzbXZlY3RvcjIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xhcHBwYWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xhcHBkZWZpbmUudHMiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvcmVuZGVyaW5nL2N1YmlzbXJlbmRlcmVyLnRzIiwid2VicGFjazovLy8uL3NyYy9sYXBwbGl2ZTJkbWFuYWdlci50cyIsIndlYnBhY2s6Ly8vRDovY29kZS9DdWJpc21TZGtGb3JXZWItNC1yLjEvRnJhbWV3b3JrL3NyYy9tb3Rpb24vY3ViaXNtbW90aW9ucXVldWVtYW5hZ2VyLnRzIiwid2VicGFjazovLy9EOi9jb2RlL0N1YmlzbVNka0ZvcldlYi00LXIuMS9GcmFtZXdvcmsvc3JjL2VmZmVjdC9jdWJpc21icmVhdGgudHMiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvZWZmZWN0L2N1YmlzbWV5ZWJsaW5rLnRzIiwid2VicGFjazovLy8uL3NyYy9tYWluLnRzIiwid2VicGFjazovLy9EOi9jb2RlL0N1YmlzbVNka0ZvcldlYi00LXIuMS9GcmFtZXdvcmsvc3JjL2N1YmlzbWZyYW1ld29ya2NvbmZpZy50cyIsIndlYnBhY2s6Ly8vRDovY29kZS9DdWJpc21TZGtGb3JXZWItNC1yLjEvRnJhbWV3b3JrL3NyYy9pZC9jdWJpc21pZG1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvaWQvY3ViaXNtaWQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xhcHB2aWV3LnRzIiwid2VicGFjazovLy9EOi9jb2RlL0N1YmlzbVNka0ZvcldlYi00LXIuMS9GcmFtZXdvcmsvc3JjL21hdGgvY3ViaXNtdmlld21hdHJpeC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdG91Y2htYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9sYXBwbW9kZWwudHMiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvbW9kZWwvY3ViaXNtdXNlcm1vZGVsLnRzIiwid2VicGFjazovLy9EOi9jb2RlL0N1YmlzbVNka0ZvcldlYi00LXIuMS9GcmFtZXdvcmsvc3JjL21vdGlvbi9jdWJpc21tb3Rpb25tYW5hZ2VyLnRzIiwid2VicGFjazovLy9EOi9jb2RlL0N1YmlzbVNka0ZvcldlYi00LXIuMS9GcmFtZXdvcmsvc3JjL21vdGlvbi9jdWJpc21tb3Rpb25xdWV1ZWVudHJ5LnRzIiwid2VicGFjazovLy9EOi9jb2RlL0N1YmlzbVNka0ZvcldlYi00LXIuMS9GcmFtZXdvcmsvc3JjL21hdGgvY3ViaXNtdGFyZ2V0cG9pbnQudHMiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvbWF0aC9jdWJpc21tb2RlbG1hdHJpeC50cyIsIndlYnBhY2s6Ly8vRDovY29kZS9DdWJpc21TZGtGb3JXZWItNC1yLjEvRnJhbWV3b3JrL3NyYy9tb2RlbC9jdWJpc21tb2MudHMiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvbW9kZWwvY3ViaXNtbW9kZWwudHMiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvbW90aW9uL2N1YmlzbW1vdGlvbi50cyIsIndlYnBhY2s6Ly8vRDovY29kZS9DdWJpc21TZGtGb3JXZWItNC1yLjEvRnJhbWV3b3JrL3NyYy9tb3Rpb24vY3ViaXNtbW90aW9uanNvbi50cyIsIndlYnBhY2s6Ly8vRDovY29kZS9DdWJpc21TZGtGb3JXZWItNC1yLjEvRnJhbWV3b3JrL3NyYy9tb3Rpb24vY3ViaXNtbW90aW9uaW50ZXJuYWwudHMiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvbW90aW9uL2N1YmlzbWV4cHJlc3Npb25tb3Rpb24udHMiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvZWZmZWN0L2N1YmlzbXBvc2UudHMiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvbW9kZWwvY3ViaXNtbW9kZWx1c2VyZGF0YS50cyIsIndlYnBhY2s6Ly8vRDovY29kZS9DdWJpc21TZGtGb3JXZWItNC1yLjEvRnJhbWV3b3JrL3NyYy9tb2RlbC9jdWJpc21tb2RlbHVzZXJkYXRhanNvbi50cyIsIndlYnBhY2s6Ly8vRDovY29kZS9DdWJpc21TZGtGb3JXZWItNC1yLjEvRnJhbWV3b3JrL3NyYy9waHlzaWNzL2N1YmlzbXBoeXNpY3MudHMiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvcGh5c2ljcy9jdWJpc21waHlzaWNzaW50ZXJuYWwudHMiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvcGh5c2ljcy9jdWJpc21waHlzaWNzanNvbi50cyIsIndlYnBhY2s6Ly8vRDovY29kZS9DdWJpc21TZGtGb3JXZWItNC1yLjEvRnJhbWV3b3JrL3NyYy9yZW5kZXJpbmcvY3ViaXNtcmVuZGVyZXJfd2ViZ2wudHMiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvdHlwZS9jc21yZWN0Zi50cyIsIndlYnBhY2s6Ly8vRDovY29kZS9DdWJpc21TZGtGb3JXZWItNC1yLjEvRnJhbWV3b3JrL3NyYy9jdWJpc21tb2RlbHNldHRpbmdqc29uLnRzIiwid2VicGFjazovLy9EOi9jb2RlL0N1YmlzbVNka0ZvcldlYi00LXIuMS9GcmFtZXdvcmsvc3JjL2ljdWJpc21tb2RlbHNldHRpbmcudHMiLCJ3ZWJwYWNrOi8vL0Q6L2NvZGUvQ3ViaXNtU2RrRm9yV2ViLTQtci4xL0ZyYW1ld29yay9zcmMvY3ViaXNtZGVmYXVsdHBhcmFtZXRlcmlkLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy93aGF0d2ctZmV0Y2gvZmV0Y2guanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xhcHB0ZXh0dXJlbWFuYWdlci50cyJdLCJuYW1lcyI6WyJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIlZhbHVlIiwiQ3ViaXNtSWRNYW5hZ2VyIiwiQ3ViaXNtUmVuZGVyZXIiLCJlbmRQdHIiLCJpbmRleCIsInRlc3RDIiwic2xpY2UiLCJ0ZXN0Iiwic3Vic3RyaW5nIiwibnVtYmVyIiwiTnVtYmVyIiwiaXNOYU4iLCJwYXJzZUZsb2F0IiwiTmFOIiwiTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIiwic19pc1N0YXJ0ZWQiLCJzX2lzSW5pdGlhbGl6ZWQiLCJzX29wdGlvbiIsInNfY3ViaXNtSWRNYW5hZ2VyIiwiQ29uc3RhbnQiLCJ2ZXJ0ZXhPZmZzZXQiLCJ2ZXJ0ZXhTdGVwIiwiY3NtRGVsZXRlIiwiYWRkcmVzcyIsInN0YXJ0VXAiLCJvcHRpb24iLCJDdWJpc21Mb2dJbmZvIiwiTGl2ZTJEQ3ViaXNtQ29yZSIsIkxvZ2dpbmciLCJjc21TZXRMb2dGdW5jdGlvbiIsImxvZ0Z1bmN0aW9uIiwidmVyc2lvbiIsIlZlcnNpb24iLCJjc21HZXRWZXJzaW9uIiwibWFqb3IiLCJtaW5vciIsInBhdGNoIiwidmVyc2lvbk51bWJlciIsImNsZWFuVXAiLCJpbml0aWFsaXplIiwiQ1NNX0FTU0VSVCIsIkN1YmlzbUxvZ1dhcm5pbmciLCJzdGF0aWNJbml0aWFsaXplTm90Rm9yQ2xpZW50Q2FsbCIsImRpc3Bvc2UiLCJzdGF0aWNSZWxlYXNlTm90Rm9yQ2xpZW50Q2FsbCIsInJlbGVhc2UiLCJzdGF0aWNSZWxlYXNlIiwiaXNTdGFydGVkIiwiaXNJbml0aWFsaXplZCIsImNvcmVMb2dGdW5jdGlvbiIsIm1lc3NhZ2UiLCJjc21HZXRMb2dGdW5jdGlvbiIsImdldExvZ2dpbmdMZXZlbCIsImxvZ2dpbmdMZXZlbCIsIkxvZ0xldmVsIiwiTG9nTGV2ZWxfT2ZmIiwiZ2V0SWRNYW5hZ2VyIiwiQ3ViaXNtRnJhbWV3b3JrIiwiT3B0aW9uIiwiaW5pdGlhbENhcGFjaXR5IiwidGhpcyIsIl9wdHIiLCJfY2FwYWNpdHkiLCJfc2l6ZSIsIkFycmF5IiwiYXQiLCJzZXQiLCJvZmZzZXQiLCJyZXQiLCJwdXNoIiwicHVzaEJhY2siLCJwcmVwYXJlQ2FwYWNpdHkiLCJjc21WZWN0b3IiLCJzX2RlZmF1bHRTaXplIiwiY2xlYXIiLCJsZW5ndGgiLCJnZXRTaXplIiwiYXNzaWduIiwibmV3U2l6ZSIsInJlc2l6ZSIsInVwZGF0ZVNpemUiLCJjYWxsUGxhY2VtZW50TmV3IiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5Iiwic3ViIiwic3BsaWNlIiwiaW5zZXJ0IiwicG9zaXRpb24iLCJiZWdpbiIsImVuZCIsImRzdFNpIiwiX2luZGV4Iiwic3JjU2kiLCJzcmNFaSIsImFkZENvdW50IiwiYWRkU2l6ZSIsIl92ZWN0b3IiLCJyZW1vdmUiLCJlcmFzZSIsIml0ZSIsIml0ZXJhdG9yIiwiZ2V0T2Zmc2V0IiwibmV3VmVjdG9yIiwidiIsInVuZGVmaW5lZCIsInByZUluY3JlbWVudCIsInByZURlY3JlbWVudCIsImluY3JlbWVudCIsIml0ZW9sZCIsImRlY3JlbWVudCIsInB0ciIsInN1YnN0aXR1dGlvbiIsIm5vdEVxdWFsIiwiQ3ViaXNtTG9nUHJpbnQiLCJsZXZlbCIsImZtdCIsImFyZ3MiLCJDdWJpc21EZWJ1ZyIsInByaW50IiwiQ3ViaXNtTG9nUHJpbnRJbiIsImV4cHIiLCJjb25zb2xlIiwiYXNzZXJ0IiwiQ1NNX0xPR19MRVZFTCIsIkNTTV9MT0dfTEVWRUxfVkVSQk9TRSIsIkN1YmlzbUxvZ1ZlcmJvc2UiLCJMb2dMZXZlbF9WZXJib3NlIiwiQ3ViaXNtTG9nRGVidWciLCJMb2dMZXZlbF9EZWJ1ZyIsIkxvZ0xldmVsX0luZm8iLCJMb2dMZXZlbF9XYXJuaW5nIiwiQ3ViaXNtTG9nRXJyb3IiLCJMb2dMZXZlbF9FcnJvciIsIkNTTV9MT0dfTEVWRUxfREVCVUciLCJDU01fTE9HX0xFVkVMX0lORk8iLCJDU01fTE9HX0xFVkVMX1dBUk5JTkciLCJDU01fTE9HX0xFVkVMX0VSUk9SIiwibG9nTGV2ZWwiLCJmb3JtYXQiLCJsb2dQcmludCIsInJlcGxhY2UiLCJrIiwiZHVtcEJ5dGVzIiwiZGF0YSIsImNzbU1hcCIsImNzbVN0cmluZyIsImdldFJhd1N0cmluZyIsImRlZmF1bHRWYWx1ZSIsImluZGVudCIsImdldFN0cmluZyIsInRvSW50IiwidG9GbG9hdCIsInRvQm9vbGVhbiIsImdldEFycmF5IiwiZ2V0VmVjdG9yIiwiZ2V0TWFwIiwiZ2V0VmFsdWVCeUluZGV4IiwiZXJyb3JWYWx1ZSIsInNldEVycm9yTm90Rm9yQ2xpZW50Q2FsbCIsImdldFZhbHVlQnlTdHJpbmciLCJudWxsVmFsdWUiLCJnZXRLZXlzIiwic19kdW1teUtleXMiLCJpc0Vycm9yIiwiaXNOdWxsIiwiaXNCb29sIiwiaXNGbG9hdCIsImlzU3RyaW5nIiwiaXNBcnJheSIsImlzTWFwIiwiZXF1YWxzIiwiaXNTdGF0aWMiLCJlcnJvclN0ciIsIkpzb25FcnJvciIsIkpzb25Cb29sZWFuIiwidHJ1ZVZhbHVlIiwiZmFsc2VWYWx1ZSIsIkpzb25OdWxsdmFsdWUiLCJidWZmZXIiLCJfZXJyb3IiLCJfbGluZUNvdW50IiwiX3Jvb3QiLCJwYXJzZUJ5dGVzIiwic2l6ZSIsImpzb24iLCJDdWJpc21Kc29uIiwiZGVsZXRlIiwiaW5zdGFuY2UiLCJnZXRSb290IiwiYXJyYXlCdWZmZXJUb1N0cmluZyIsInVpbnQ4QXJyYXkiLCJVaW50OEFycmF5Iiwic3RyIiwibGVuIiwicGFkIiwidG9TdHJpbmciLCJkZWNvZGVVUklDb21wb25lbnQiLCJlbmRQb3MiLCJkZWNvZGVCdWZmZXIiLCJwYXJzZVZhbHVlIiwic3RyYnVmIiwiSnNvblN0cmluZyIsImdldFBhcnNlRXJyb3IiLCJjaGVja0VuZE9mRmlsZSIsIm91dEVuZFBvcyIsImYiLCJhZnRlclN0cmluZyIsInN0cnRvZCIsImluZGV4T2YiLCJKc29uRmxvYXQiLCJwYXJzZVN0cmluZyIsInBhcnNlQXJyYXkiLCJwYXJzZU9iamVjdCIsInN0cmluZyIsImJ1ZlN0YXJ0IiwiYXBwZW5kIiwiZXhwYW5zaW9uIiwiSnNvbk1hcCIsImxvY2FsUmV0RW5kUG9zMiIsIm9rIiwiRk9SX0xPT1AiLCJGT1JfTE9PUDIiLCJwdXQiLCJGT1JfTE9PUDMiLCJKc29uQXJyYXkiLCJsb2NhbFJldEVuZHBvczIiLCJhZGQiLCJfdmFsdWUiLCJfc3RyaW5nQnVmZmVyIiwicGFyc2VJbnQiLCJNYXRoIiwicm91bmQiLCJfYm9vbFZhbHVlIiwiX2lzU3RhdGljIiwiX2FycmF5Iiwic3RyaW5nQnVmZmVyIiwiX21hcCIsInNlY29uZCIsImdldFZhbHVlIiwiaXRlciIsImZpcnN0Iiwic2V0VmFsdWUiLCJfa2V5cyIsIl90ciIsIkZsb2F0MzJBcnJheSIsImxvYWRJZGVudGl0eSIsIm11bHRpcGx5IiwiYSIsImIiLCJkc3QiLCJqIiwic2V0TWF0cml4IiwidHIiLCJnZXRTY2FsZVgiLCJnZXRTY2FsZVkiLCJnZXRUcmFuc2xhdGVYIiwiZ2V0VHJhbnNsYXRlWSIsInRyYW5zZm9ybVgiLCJzcmMiLCJ0cmFuc2Zvcm1ZIiwiaW52ZXJ0VHJhbnNmb3JtWCIsImludmVydFRyYW5zZm9ybVkiLCJ0cmFuc2xhdGVSZWxhdGl2ZSIsIngiLCJ5IiwidHIxIiwiQ3ViaXNtTWF0cml4NDQiLCJ0cmFuc2xhdGUiLCJ0cmFuc2xhdGVYIiwidHJhbnNsYXRlWSIsInNjYWxlUmVsYXRpdmUiLCJzY2FsZSIsIm11bHRpcGx5QnlNYXRyaXgiLCJjbG9uZSIsImNsb25lTWF0cml4IiwiQ3NtX0N1YmlzbUZyYW1ld29yayIsImNhbnZhcyIsInNfaW5zdGFuY2UiLCJnbCIsImZyYW1lQnVmZmVyIiwiX2NhcHR1cmVkIiwiX21vdXNlWCIsIl9tb3VzZVkiLCJfaXNFbmQiLCJfY3ViaXNtT3B0aW9uIiwiX3ZpZXciLCJMQXBwVmlldyIsIl90ZXh0dXJlTWFuYWdlciIsIkxBcHBUZXh0dXJlTWFuYWdlciIsImdldEluc3RhbmNlIiwiTEFwcERlbGVnYXRlIiwicmVsZWFzZUluc3RhbmNlIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsIm5leHRTY2VuZSIsIkxBcHBMaXZlMkRNYW5hZ2VyIiwiYWRkRXZlbnRMaXN0ZW5lciIsIm1vdXNlb3V0IiwibGl2ZTJkX3JlbGVhc2UiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiZ2V0Q29udGV4dCIsImdldFBhcmFtZXRlciIsIkZSQU1FQlVGRkVSX0JJTkRJTkciLCJlbmFibGUiLCJCTEVORCIsImJsZW5kRnVuYyIsIlNSQ19BTFBIQSIsIk9ORV9NSU5VU19TUkNfQUxQSEEiLCJvbnRvdWNoc3RhcnQiLCJvblRvdWNoQmVnYW4iLCJvbnRvdWNobW92ZSIsIm9uVG91Y2hNb3ZlZCIsIm9udG91Y2hlbmQiLCJvblRvdWNoRW5kZWQiLCJvbnRvdWNoY2FuY2VsIiwib25Ub3VjaENhbmNlbCIsIm9ubW91c2Vkb3duIiwib25DbGlja0JlZ2FuIiwib25tb3VzZW1vdmUiLCJvbk1vdXNlTW92ZWQiLCJvbm1vdXNldXAiLCJvbkNsaWNrRW5kZWQiLCJpbml0aWFsaXplQ3ViaXNtIiwiYWxlcnQiLCJib2R5IiwiaW5uZXJIVE1MIiwib25EcmFnIiwicnVuIiwibG9vcCIsIkxBcHBQYWwiLCJ1cGRhdGVUaW1lIiwiY2xlYXJDb2xvciIsIkRFUFRIX1RFU1QiLCJkZXB0aEZ1bmMiLCJMRVFVQUwiLCJDT0xPUl9CVUZGRVJfQklUIiwiREVQVEhfQlVGRkVSX0JJVCIsImNsZWFyRGVwdGgiLCJyZW5kZXIiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjcmVhdGVTaGFkZXIiLCJ2ZXJ0ZXhTaGFkZXJJZCIsIlZFUlRFWF9TSEFERVIiLCJwcmludE1lc3NhZ2UiLCJzaGFkZXJTb3VyY2UiLCJjb21waWxlU2hhZGVyIiwiZnJhZ21lbnRTaGFkZXJJZCIsIkZSQUdNRU5UX1NIQURFUiIsInByb2dyYW1JZCIsImNyZWF0ZVByb2dyYW0iLCJhdHRhY2hTaGFkZXIiLCJkZWxldGVTaGFkZXIiLCJsaW5rUHJvZ3JhbSIsInVzZVByb2dyYW0iLCJnZXRWaWV3IiwiZ2V0VGV4dHVyZU1hbmFnZXIiLCJMQXBwRGVmaW5lIiwiQ3ViaXNtTG9nZ2luZ0xldmVsIiwiaW5pdGlhbGl6ZVNwcml0ZSIsImUiLCJwb3NYIiwicGFnZVgiLCJwb3NZIiwicGFnZVkiLCJvblRvdWNoZXNCZWdhbiIsInJlY3QiLCJ0YXJnZXQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJjbGllbnRYIiwibGVmdCIsImNsaWVudFkiLCJ0b3AiLCJvblRvdWNoZXNNb3ZlZCIsIm9uVG91Y2hlc0VuZGVkIiwiY2hhbmdlZFRvdWNoZXMiLCJzdWJzdHIiLCJnZXRCeXRlcyIsImVuY29kZVVSSUNvbXBvbmVudCIsImdldExlbmd0aCIsImlzTGVzcyIsImlzR3JlYXQiLCJpc0VxdWFsIiwiaXNFbXB0eSIsImNzbVBhaXIiLCJfa2V5VmFsdWVzIiwiX2R1bW15VmFsdWUiLCJhcHBlbmRLZXkiLCJmb3VuZCIsImlzRXhpc3QiLCJmaXRUb1NpemUiLCJEZWZhdWx0U2l6ZSIsImR1bXBBc0ludCIsImlkeCIsIkN1YmlzbU1hdGgiLCJzZXRGaW5pc2hlZE1vdGlvbkhhbmRsZXIiLCJvbkZpbmlzaGVkTW90aW9uSGFuZGxlciIsIl9vbkZpbmlzaGVkTW90aW9uIiwiZ2V0RmluaXNoZWRNb3Rpb25IYW5kbGVyIiwiX2ZhZGVJblNlY29uZHMiLCJfZmFkZU91dFNlY29uZHMiLCJfd2VpZ2h0IiwiX29mZnNldFNlY29uZHMiLCJfZmlyZWRFdmVudFZhbHVlcyIsIm1vdGlvbiIsInVwZGF0ZVBhcmFtZXRlcnMiLCJtb2RlbCIsIm1vdGlvblF1ZXVlRW50cnkiLCJ1c2VyVGltZVNlY29uZHMiLCJpc0F2YWlsYWJsZSIsImlzRmluaXNoZWQiLCJzZXRJc1N0YXJ0ZWQiLCJzZXRTdGFydFRpbWUiLCJzZXRGYWRlSW5TdGFydFRpbWUiLCJkdXJhdGlvbiIsImdldER1cmF0aW9uIiwiZ2V0RW5kVGltZSIsInNldEVuZFRpbWUiLCJnZXRTdGFydFRpbWUiLCJmYWRlV2VpZ2h0IiwiZ2V0RWFzaW5nU2luZSIsImdldEZhZGVJblN0YXJ0VGltZSIsInNldFN0YXRlIiwiZG9VcGRhdGVQYXJhbWV0ZXJzIiwic2V0SXNGaW5pc2hlZCIsInNldEZhZGVJblRpbWUiLCJmYWRlSW5TZWNvbmRzIiwic2V0RmFkZU91dFRpbWUiLCJmYWRlT3V0U2Vjb25kcyIsImdldEZhZGVPdXRUaW1lIiwiZ2V0RmFkZUluVGltZSIsInNldFdlaWdodCIsIndlaWdodCIsImdldFdlaWdodCIsImdldExvb3BEdXJhdGlvbiIsInNldE9mZnNldFRpbWUiLCJvZmZzZXRTZWNvbmRzIiwiZ2V0RmlyZWRFdmVudCIsImJlZm9yZUNoZWNrVGltZVNlY29uZHMiLCJtb3Rpb25UaW1lU2Vjb25kcyIsIkFDdWJpc21Nb3Rpb24iLCJDdWJpc21WZWN0b3IyIiwicmFuZ2UiLCJtaW4iLCJtYXgiLCJzaW4iLCJjb3MiLCJhYnMiLCJzcXJ0IiwiUEkiLCJyaWdodCIsImRlZ3JlZXNUb1JhZGlhbiIsImRlZ3JlZXMiLCJyYWRpYW5Ub0RlZ3JlZXMiLCJyYWRpYW4iLCJkaXJlY3Rpb25Ub1JhZGlhbiIsImZyb20iLCJ0byIsImF0YW4yIiwiZGlyZWN0aW9uVG9EZWdyZWVzIiwiZGVncmVlIiwicmFkaWFuVG9EaXJlY3Rpb24iLCJ0b3RhbEFuZ2xlIiwidmVjdG9yMiIsInN1YnN0cmFjdCIsIm11bHRpcGx5QnlTY2FsZXIiLCJzY2FsYXIiLCJkaXZpc2lvbiIsImRpdmlzaW9uQnlTY2FsYXIiLCJnZXREaXN0YW5jZVdpdGgiLCJkb3QiLCJub3JtYWxpemUiLCJwb3ciLCJyaHMiLCJpc05vdEVxdWFsIiwibG9hZEZpbGVBc0J5dGVzIiwiZmlsZVBhdGgiLCJjYWxsYmFjayIsImZldGNoIiwidGhlbiIsInJlc3BvbnNlIiwiYXJyYXlCdWZmZXIiLCJieXRlTGVuZ3RoIiwiZ2V0RGVsdGFUaW1lIiwic19kZWx0YVRpbWUiLCJzX2N1cnJlbnRGcmFtZSIsIkRhdGUiLCJub3ciLCJzX2xhc3RGcmFtZSIsImxvZyIsImxhc3RVcGRhdGUiLCJWaWV3TWF4U2NhbGUiLCJWaWV3TWluU2NhbGUiLCJWaWV3TG9naWNhbExlZnQiLCJWaWV3TG9naWNhbFJpZ2h0IiwiVmlld0xvZ2ljYWxNYXhMZWZ0IiwiVmlld0xvZ2ljYWxNYXhSaWdodCIsIlZpZXdMb2dpY2FsTWF4Qm90dG9tIiwiVmlld0xvZ2ljYWxNYXhUb3AiLCJSZXNvdXJjZXNQYXRoIiwiQmFja0ltYWdlTmFtZSIsIk1vZGVsRGlyIiwiTW9kZWxEaXJTaXplIiwiTW90aW9uR3JvdXBJZGxlIiwiTW90aW9uR3JvdXBUYXBCb2R5IiwiTW90aW9uR3JvdXBUYXBIZWFkIiwiSGl0QXJlYU5hbWVIZWFkIiwiSGl0QXJlYU5hbWVCb2R5IiwiUHJpb3JpdHlOb25lIiwiUHJpb3JpdHlJZGxlIiwiUHJpb3JpdHlOb3JtYWwiLCJQcmlvcml0eUZvcmNlIiwiRGVidWdMb2dFbmFibGUiLCJEZWJ1Z1RvdWNoTG9nRW5hYmxlIiwiX2lzQ3VsbGluZyIsIl9pc1ByZW11bHRpcGxpZWRBbHBoYSIsIl9hbmlzb3J0b3B5IiwiX21vZGVsIiwiX21vZGVsQ29sb3IiLCJDdWJpc21UZXh0dXJlQ29sb3IiLCJfbXZwTWF0cml4NHg0IiwicmVuZGVyZXIiLCJkcmF3TW9kZWwiLCJnZXRNb2RlbCIsImRvRHJhd01vZGVsIiwic2V0TXZwTWF0cml4IiwibWF0cml4NDQiLCJnZXRNdnBNYXRyaXgiLCJzZXRNb2RlbENvbG9yIiwicmVkIiwiZ3JlZW4iLCJibHVlIiwiYWxwaGEiLCJSIiwiRyIsIkIiLCJBIiwiZ2V0TW9kZWxDb2xvciIsInNldElzUHJlbXVsdGlwbGllZEFscGhhIiwiaXNQcmVtdWx0aXBsaWVkQWxwaGEiLCJzZXRJc0N1bGxpbmciLCJjdWxsaW5nIiwiaXNDdWxsaW5nIiwic2V0QW5pc290cm9weSIsImdldEFuaXNvdHJvcHkiLCJDdWJpc21CbGVuZE1vZGUiLCJDc21fY3NtVmVjdG9yIiwiQ3NtX0N1YmlzbU1hdHJpeDQ0IiwiX2ZpbmlzaGVkTW90aW9uIiwic2VsZiIsIl92aWV3TWF0cml4IiwiX21vZGVscyIsIl9zY2VuZUluZGV4IiwiY2hhbmdlU2NlbmUiLCJubyIsInJlbGVhc2VBbGxNb2RlbCIsInNldERyYWdnaW5nIiwib25UYXAiLCJ0b0ZpeGVkIiwiaGl0VGVzdCIsInNldFJhbmRvbUV4cHJlc3Npb24iLCJ0b3VjaEJvZHlIYW5kbGVyIiwic3RhcnRSYW5kb21Nb3Rpb24iLCJjdXJyZW50UG9zaXRpb24iLCJ0eXBlIiwidG91Y2hIZWFkSGFuZGxlciIsIm9uVXBkYXRlIiwicHJvamVjdGlvbiIsIndpZHRoIiwiaGVpZ2h0Iiwic2F2ZVByb2plY3Rpb24iLCJtb2RlbENvdW50IiwidXBkYXRlIiwiZHJhdyIsIm1vZGVsUGF0aCIsIm1vZGVsSnNvbk5hbWUiLCJMQXBwTW9kZWwiLCJsb2FkQXNzZXRzIiwiQ3ViaXNtTW90aW9uUXVldWVFbnRyeSIsIl91c2VyVGltZVNlY29uZHMiLCJfZXZlbnRDYWxsQmFjayIsIl9ldmVudEN1c3RvbURhdGEiLCJfbW90aW9ucyIsInN0YXJ0TW90aW9uIiwiYXV0b0RlbGV0ZSIsIkludmFsaWRNb3Rpb25RdWV1ZUVudHJ5SGFuZGxlVmFsdWUiLCJzdGFydEZhZGVvdXQiLCJfbW90aW9uIiwiX2F1dG9EZWxldGUiLCJfbW90aW9uUXVldWVFbnRyeUhhbmRsZSIsImlzRmluaXNoZWRCeUhhbmRsZSIsIm1vdGlvblF1ZXVlRW50cnlOdW1iZXIiLCJzdG9wQWxsTW90aW9ucyIsImdldEN1YmlzbU1vdGlvblF1ZXVlRW50cnkiLCJzZXRFdmVudENhbGxiYWNrIiwiY3VzdG9tRGF0YSIsImRvVXBkYXRlTW90aW9uIiwidXBkYXRlZCIsImZpcmVkTGlzdCIsImdldExhc3RDaGVja0V2ZW50VGltZSIsInNldExhc3RDaGVja0V2ZW50VGltZSIsIkN1YmlzbU1vdGlvblF1ZXVlTWFuYWdlciIsIl9jdXJyZW50VGltZSIsIkN1YmlzbUJyZWF0aCIsInNldFBhcmFtZXRlcnMiLCJicmVhdGhQYXJhbWV0ZXJzIiwiX2JyZWF0aFBhcmFtZXRlcnMiLCJnZXRQYXJhbWV0ZXJzIiwiZGVsdGFUaW1lU2Vjb25kcyIsImFkZFBhcmFtZXRlclZhbHVlQnlJZCIsInBhcmFtZXRlcklkIiwicGVhayIsImN5Y2xlIiwiQnJlYXRoUGFyYW1ldGVyRGF0YSIsIkV5ZVN0YXRlIiwibW9kZWxTZXR0aW5nIiwiX2JsaW5raW5nU3RhdGUiLCJFeWVTdGF0ZV9GaXJzdCIsIl9uZXh0QmxpbmtpbmdUaW1lIiwiX3N0YXRlU3RhcnRUaW1lU2Vjb25kcyIsIl9ibGlua2luZ0ludGVydmFsU2Vjb25kcyIsIl9jbG9zaW5nU2Vjb25kcyIsIl9jbG9zZWRTZWNvbmRzIiwiX29wZW5pbmdTZWNvbmRzIiwiX3BhcmFtZXRlcklkcyIsImdldEV5ZUJsaW5rUGFyYW1ldGVyQ291bnQiLCJnZXRFeWVCbGlua1BhcmFtZXRlcklkIiwiQ3ViaXNtRXllQmxpbmsiLCJleWVCbGluayIsInNldEJsaW5raW5nSW50ZXJ2YWwiLCJibGlua2luZ0ludGVydmFsIiwic2V0QmxpbmtpbmdTZXR0aW5nIiwiY2xvc2luZyIsImNsb3NlZCIsIm9wZW5pbmciLCJzZXRQYXJhbWV0ZXJJZHMiLCJwYXJhbWV0ZXJJZHMiLCJnZXRQYXJhbWV0ZXJJZHMiLCJwYXJhbWV0ZXJWYWx1ZSIsIkV5ZVN0YXRlX0Nsb3NpbmciLCJFeWVTdGF0ZV9DbG9zZWQiLCJFeWVTdGF0ZV9PcGVuaW5nIiwiRXllU3RhdGVfSW50ZXJ2YWwiLCJkZXRlcm1pbk5leHRCbGlua2luZ1RpbWluZyIsIkNsb3NlSWZaZXJvIiwic2V0UGFyYW1ldGVyVmFsdWVCeUlkIiwicmFuZG9tIiwid2luZG93Iiwib25sb2FkIiwib25iZWZvcmV1bmxvYWQiLCJDU01fTE9HX0xFVkVMX09GRiIsIkN1YmlzbUlkIiwiX2lkcyIsInJlZ2lzdGVySWRzIiwiaWRzIiwicmVnaXN0ZXJJZCIsImlkIiwicmVzdWx0IiwiZmluZElkIiwiZ2V0SWQiLCJfaWQiLCJDc21fQ3ViaXNtVmlld01hdHJpeCIsIkN1YmlzbVZpZXdNYXRyaXgiLCJfcHJvZ3JhbUlkIiwiX2JhY2siLCJfZ2VhciIsIl90b3VjaE1hbmFnZXIiLCJUb3VjaE1hbmFnZXIiLCJfZGV2aWNlVG9TY3JlZW4iLCJyYXRpbyIsImJvdHRvbSIsInNldFNjcmVlblJlY3QiLCJzY3JlZW5XIiwic2V0TWF4U2NhbGUiLCJzZXRNaW5TY2FsZSIsInNldE1heFNjcmVlblJlY3QiLCJkZWxldGVQcm9ncmFtIiwiZmx1c2giLCJwb2ludFgiLCJwb2ludFkiLCJ0b3VjaGVzQmVnYW4iLCJ2aWV3WCIsInRyYW5zZm9ybVZpZXdYIiwiZ2V0WCIsInZpZXdZIiwidHJhbnNmb3JtVmlld1kiLCJnZXRZIiwidG91Y2hlc01vdmVkIiwibGl2ZTJETWFuYWdlciIsImRldmljZVgiLCJzY3JlZW5YIiwiZGV2aWNlWSIsInNjcmVlblkiLCJ0cmFuc2Zvcm1TY3JlZW5YIiwidHJhbnNmb3JtU2NyZWVuWSIsIl9zY3JlZW5MZWZ0IiwiX3NjcmVlblJpZ2h0IiwiX3NjcmVlblRvcCIsIl9zY3JlZW5Cb3R0b20iLCJfbWF4TGVmdCIsIl9tYXhSaWdodCIsIl9tYXhUb3AiLCJfbWF4Qm90dG9tIiwiX21heFNjYWxlIiwiX21pblNjYWxlIiwiYWRqdXN0VHJhbnNsYXRlIiwiYWRqdXN0U2NhbGUiLCJjeCIsImN5IiwibWF4U2NhbGUiLCJnZXRNYXhTY2FsZSIsIm1pblNjYWxlIiwiZ2V0TWluU2NhbGUiLCJ0YXJnZXRTY2FsZSIsInRyMiIsInRyMyIsImlzTWF4U2NhbGUiLCJpc01pblNjYWxlIiwiZ2V0U2NyZWVuTGVmdCIsImdldFNjcmVlblJpZ2h0IiwiZ2V0U2NyZWVuQm90dG9tIiwiZ2V0U2NyZWVuVG9wIiwiZ2V0TWF4TGVmdCIsImdldE1heFJpZ2h0IiwiZ2V0TWF4Qm90dG9tIiwiZ2V0TWF4VG9wIiwiX3N0YXJ0WCIsIl9zdGFydFkiLCJfbGFzdFgiLCJfbGFzdFkiLCJfbGFzdFgxIiwiX2xhc3RZMSIsIl9sYXN0WDIiLCJfbGFzdFkyIiwiX2xhc3RUb3VjaERpc3RhbmNlIiwiX2RlbHRhWCIsIl9kZWx0YVkiLCJfc2NhbGUiLCJfdG91Y2hTaW5nbGUiLCJfZmxpcEF2YWlsYWJsZSIsImdldENlbnRlclgiLCJnZXRDZW50ZXJZIiwiZ2V0RGVsdGFYIiwiZ2V0RGVsdGFZIiwiZ2V0U3RhcnRYIiwiZ2V0U3RhcnRZIiwiZ2V0U2NhbGUiLCJnZXRYMSIsImdldFkxIiwiZ2V0WDIiLCJnZXRZMiIsImlzU2luZ2xlVG91Y2giLCJpc0ZsaWNrQXZhaWxhYmxlIiwiZGlzYWJsZUZsaWNrIiwiZ2V0RmxpY2tEaXN0YW5jZSIsImNhbGN1bGF0ZURpc3RhbmNlIiwieDEiLCJ5MSIsIngyIiwieTIiLCJjYWxjdWxhdGVNb3ZpbmdBbW91bnQiLCJ2MSIsInYyIiwic2lnbiIsImFic29sdXRlVmFsdWUxIiwiYWJzb2x1dGVWYWx1ZTIiLCJMb2FkU3RlcCIsIkN1YmlzbVVzZXJNb2RlbCIsIkN1YmlzbU1vZGVsU2V0dGluZ0pzb24iLCJDdWJpc21EZWZhdWx0UGFyYW1ldGVySWQiLCJfbW9kZWxTZXR0aW5nIiwiX21vZGVsSG9tZURpciIsIl9leWVCbGlua0lkcyIsIl9saXBTeW5jSWRzIiwiX2V4cHJlc3Npb25zIiwiX2hpdEFyZWEiLCJfdXNlckFyZWEiLCJfaWRQYXJhbUFuZ2xlWCIsIlBhcmFtQW5nbGVYIiwiX2lkUGFyYW1BbmdsZVkiLCJQYXJhbUFuZ2xlWSIsIl9pZFBhcmFtQW5nbGVaIiwiUGFyYW1BbmdsZVoiLCJfaWRQYXJhbUV5ZUJhbGxYIiwiUGFyYW1FeWVCYWxsWCIsIl9pZFBhcmFtRXllQmFsbFkiLCJQYXJhbUV5ZUJhbGxZIiwiX2lkUGFyYW1Cb2R5QW5nbGVYIiwiUGFyYW1Cb2R5QW5nbGVYIiwiX3N0YXRlIiwiTG9hZEFzc2V0cyIsIl9leHByZXNzaW9uQ291bnQiLCJfdGV4dHVyZUNvdW50IiwiX21vdGlvbkNvdW50IiwiX2FsbE1vdGlvbkNvdW50IiwiZGlyIiwiZmlsZU5hbWUiLCJzZXR0aW5nIiwiTG9hZE1vZGVsIiwic2V0dXBNb2RlbCIsIl91cGRhdGluZyIsIl9pbml0aWFsaXplZCIsImdldE1vZGVsRmlsZU5hbWUiLCJtb2RlbEZpbGVOYW1lIiwibG9hZE1vZGVsIiwiTG9hZEV4cHJlc3Npb24iLCJsb2FkQ3ViaXNtRXhwcmVzc2lvbiIsIldhaXRMb2FkTW9kZWwiLCJnZXRFeHByZXNzaW9uQ291bnQiLCJleHByZXNzaW9uTmFtZSIsImdldEV4cHJlc3Npb25OYW1lIiwiZXhwcmVzc2lvbkZpbGVOYW1lIiwiZ2V0RXhwcmVzc2lvbkZpbGVOYW1lIiwibG9hZEV4cHJlc3Npb24iLCJMb2FkUGh5c2ljcyIsImxvYWRDdWJpc21QaHlzaWNzIiwiV2FpdExvYWRFeHByZXNzaW9uIiwiZ2V0UGh5c2ljc0ZpbGVOYW1lIiwicGh5c2ljc0ZpbGVOYW1lIiwibG9hZFBoeXNpY3MiLCJMb2FkUG9zZSIsImxvYWRDdWJpc21Qb3NlIiwiV2FpdExvYWRQaHlzaWNzIiwiZ2V0UG9zZUZpbGVOYW1lIiwicG9zZUZpbGVOYW1lIiwibG9hZFBvc2UiLCJTZXR1cEV5ZUJsaW5rIiwic2V0dXBFeWVCbGluayIsIldhaXRMb2FkUG9zZSIsIl9leWVCbGluayIsIlNldHVwQnJlYXRoIiwic2V0dXBCcmVhdGgiLCJfYnJlYXRoIiwiUGFyYW1CcmVhdGgiLCJMb2FkVXNlckRhdGEiLCJsb2FkVXNlckRhdGEiLCJnZXRVc2VyRGF0YUZpbGUiLCJ1c2VyRGF0YUZpbGUiLCJTZXR1cEV5ZUJsaW5rSWRzIiwic2V0dXBFeWVCbGlua0lkcyIsIldhaXRMb2FkVXNlckRhdGEiLCJleWVCbGlua0lkQ291bnQiLCJTZXR1cExpcFN5bmNJZHMiLCJzZXR1cExpcFN5bmNJZHMiLCJsaXBTeW5jSWRDb3VudCIsImdldExpcFN5bmNQYXJhbWV0ZXJDb3VudCIsImdldExpcFN5bmNQYXJhbWV0ZXJJZCIsIlNldHVwTGF5b3V0Iiwic2V0dXBMYXlvdXQiLCJsYXlvdXQiLCJnZXRMYXlvdXRNYXAiLCJfbW9kZWxNYXRyaXgiLCJzZXR1cEZyb21MYXlvdXQiLCJMb2FkTW90aW9uIiwibG9hZEN1YmlzbU1vdGlvbiIsIldhaXRMb2FkTW90aW9uIiwic2F2ZVBhcmFtZXRlcnMiLCJncm91cCIsIm1vdGlvbkdyb3VwQ291bnQiLCJnZXRNb3Rpb25Hcm91cENvdW50IiwiZ2V0TW90aW9uR3JvdXBOYW1lIiwiZ2V0TW90aW9uQ291bnQiLCJwcmVMb2FkTW90aW9uR3JvdXAiLCJMb2FkVGV4dHVyZSIsIl9tb3Rpb25NYW5hZ2VyIiwiY3JlYXRlUmVuZGVyZXIiLCJzZXR1cFRleHR1cmVzIiwiZ2V0UmVuZGVyZXIiLCJnZXRUZXh0dXJlQ291bnQiLCJtb2RlbFRleHR1cmVOdW1iZXIiLCJnZXRUZXh0dXJlRmlsZU5hbWUiLCJ0ZXh0dXJlUGF0aCIsImNyZWF0ZVRleHR1cmVGcm9tUG5nRmlsZSIsInRleHR1cmVJbmZvIiwiYmluZFRleHR1cmUiLCJDb21wbGV0ZVNldHVwIiwiV2FpdExvYWRUZXh0dXJlIiwicmVsb2FkUmVuZGVyZXIiLCJkZWxldGVSZW5kZXJlciIsIl9kcmFnTWFuYWdlciIsIl9kcmFnWCIsIl9kcmFnWSIsIm1vdGlvblVwZGF0ZWQiLCJsb2FkUGFyYW1ldGVycyIsInVwZGF0ZU1vdGlvbiIsIl9leHByZXNzaW9uTWFuYWdlciIsIl9waHlzaWNzIiwiZXZhbHVhdGUiLCJfbGlwc3luYyIsIl9wb3NlIiwicHJpb3JpdHkiLCJzZXRSZXNlcnZlUHJpb3JpdHkiLCJyZXNlcnZlTW90aW9uIiwiX2RlYnVnTW9kZSIsIm1vdGlvbkZpbGVOYW1lIiwiZ2V0TW90aW9uRmlsZU5hbWUiLCJsb2FkTW90aW9uIiwiZmFkZVRpbWUiLCJnZXRNb3Rpb25GYWRlSW5UaW1lVmFsdWUiLCJnZXRNb3Rpb25GYWRlT3V0VGltZVZhbHVlIiwic2V0RWZmZWN0SWRzIiwic3RhcnRNb3Rpb25Qcmlvcml0eSIsImZsb29yIiwic2V0RXhwcmVzc2lvbiIsImV4cHJlc3Npb25JZCIsIm1vdGlvbkV2ZW50RmlyZWQiLCJldmVudFZhbHVlIiwiaGl0QXJlbmFOYW1lIiwiX29wYWNpdHkiLCJjb3VudCIsImdldEhpdEFyZWFzQ291bnQiLCJnZXRIaXRBcmVhTmFtZSIsImRyYXdJZCIsImdldEhpdEFyZWFJZCIsImlzSGl0IiwidG1wTW90aW9uIiwicmVsZWFzZU1vdGlvbnMiLCJyZWxlYXNlRXhwcmVzc2lvbnMiLCJkb0RyYXciLCJ2aWV3cG9ydCIsInNldFJlbmRlclN0YXRlIiwibWF0cml4IiwiQ3ViaXNtUmVuZGVyZXJfV2ViR0wiLCJDdWJpc21QaHlzaWNzIiwiQ3ViaXNtTW9kZWxVc2VyRGF0YSIsIkN1YmlzbVBvc2UiLCJDdWJpc21FeHByZXNzaW9uTW90aW9uIiwiQ3ViaXNtTW90aW9uIiwiQ3ViaXNtTW9jIiwiQ3ViaXNtTW9kZWxNYXRyaXgiLCJDdWJpc21UYXJnZXRQb2ludCIsIkN1YmlzbU1vdGlvbk1hbmFnZXIiLCJfbW9jIiwiX21vZGVsVXNlckRhdGEiLCJfbGFzdExpcFN5bmNWYWx1ZSIsIl9hY2NlbGVyYXRpb25YIiwiX2FjY2VsZXJhdGlvblkiLCJfYWNjZWxlcmF0aW9uWiIsIl9yZW5kZXJlciIsImN1YmlzbURlZmF1bHRNb3Rpb25FdmVudENhbGxiYWNrIiwic2V0SW5pdGlhbGl6ZWQiLCJpc1VwZGF0aW5nIiwic2V0VXBkYXRpbmciLCJzZXRBY2NlbGVyYXRpb24iLCJ6IiwiZ2V0TW9kZWxNYXRyaXgiLCJzZXRPcGFjaXR5IiwiZ2V0T3BhY2l0eSIsImNyZWF0ZU1vZGVsIiwiZ2V0Q2FudmFzV2lkdGgiLCJnZXRDYW52YXNIZWlnaHQiLCJkcmF3YWJsZUlkIiwiZHJhd0luZGV4IiwiZ2V0RHJhd2FibGVJbmRleCIsImdldERyYXdhYmxlVmVydGV4Q291bnQiLCJ2ZXJ0aWNlcyIsImdldERyYXdhYmxlVmVydGljZXMiLCJ0eCIsInR5IiwiY2FsbGVyIiwiZGVsZXRlTW9kZWwiLCJfY3VycmVudFByaW9yaXR5IiwiX3Jlc2VydmVQcmlvcml0eSIsImdldEN1cnJlbnRQcmlvcml0eSIsImdldFJlc2VydmVQcmlvcml0eSIsInZhbCIsIl9hdmFpbGFibGUiLCJfZmluaXNoZWQiLCJfc3RhcnRlZCIsIl9zdGFydFRpbWVTZWNvbmRzIiwiX2ZhZGVJblN0YXJ0VGltZVNlY29uZHMiLCJfZW5kVGltZVNlY29uZHMiLCJfc3RhdGVUaW1lU2Vjb25kcyIsIl9zdGF0ZVdlaWdodCIsIl9sYXN0RXZlbnRDaGVja1NlY29uZHMiLCJmYWRlb3V0U2Vjb25kcyIsIm5ld0VuZFRpbWVTZWNvbmRzIiwic3RhcnRUaW1lIiwiZW5kVGltZSIsInNldElzQXZhaWxhYmxlIiwidGltZVNlY29uZHMiLCJnZXRTdGF0ZVRpbWUiLCJnZXRTdGF0ZVdlaWdodCIsImNoZWNrVGltZSIsIl9mYWNlVGFyZ2V0WCIsIl9mYWNlVGFyZ2V0WSIsIl9mYWNlWCIsIl9mYWNlWSIsIl9mYWNlVlgiLCJfZmFjZVZZIiwiX2xhc3RUaW1lU2Vjb25kcyIsImRlbHRhVGltZVdlaWdodCIsIm1heEEiLCJ0aW1lVG9NYXhTcGVlZCIsImR4IiwiZHkiLCJ2eSIsImF4IiwiYXkiLCJjdXJWIiwidyIsImgiLCJfd2lkdGgiLCJfaGVpZ2h0Iiwic2V0SGVpZ2h0Iiwic2V0V2lkdGgiLCJzY2FsZVgiLCJzY2FsZVkiLCJzZXRQb3NpdGlvbiIsInNldENlbnRlclBvc2l0aW9uIiwiY2VudGVyWCIsImNlbnRlclkiLCJzZXRZIiwic2V0WCIsIkN1YmlzbU1vZGVsIiwibW9jIiwiX21vZGVsQ291bnQiLCJtb2NCeXRlcyIsImN1YmlzbU1vYyIsIk1vYyIsImZyb21BcnJheUJ1ZmZlciIsIl9yZWxlYXNlIiwiY3ViaXNtTW9kZWwiLCJNb2RlbCIsImZyb21Nb2MiLCJfcGFyYW1ldGVyVmFsdWVzIiwiX3BhcmFtZXRlck1heGltdW1WYWx1ZXMiLCJfcGFyYW1ldGVyTWluaW11bVZhbHVlcyIsIl9wYXJ0T3BhY2l0aWVzIiwiX3NhdmVkUGFyYW1ldGVycyIsIl9kcmF3YWJsZUlkcyIsIl9wYXJ0SWRzIiwiX25vdEV4aXN0UGFydElkIiwiX25vdEV4aXN0UGFyYW1ldGVySWQiLCJfbm90RXhpc3RQYXJhbWV0ZXJWYWx1ZXMiLCJfbm90RXhpc3RQYXJ0T3BhY2l0aWVzIiwiZHJhd2FibGVzIiwicmVzZXREeW5hbWljRmxhZ3MiLCJjYW52YXNpbmZvIiwiQ2FudmFzV2lkdGgiLCJQaXhlbHNQZXJVbml0IiwiQ2FudmFzSGVpZ2h0IiwicGFyYW1ldGVyQ291bnQiLCJwYXJhbWV0ZXJzIiwic2F2ZWRQYXJhbWV0ZXJDb3VudCIsImdldFBhcnRJbmRleCIsInBhcnRJZCIsInBhcnRJbmRleCIsInBhcnRDb3VudCIsInBhcnRzIiwiZ2V0UGFydENvdW50Iiwic2V0UGFydE9wYWNpdHlCeUluZGV4Iiwib3BhY2l0eSIsInNldFBhcnRPcGFjaXR5QnlJZCIsImdldFBhcnRPcGFjaXR5QnlJbmRleCIsImdldFBhcnRPcGFjaXR5QnlJZCIsImdldFBhcmFtZXRlckluZGV4IiwicGFyYW1ldGVySW5kZXgiLCJpZENvdW50IiwiZ2V0UGFyYW1ldGVyQ291bnQiLCJnZXRQYXJhbWV0ZXJNYXhpbXVtVmFsdWUiLCJtYXhpbXVtVmFsdWVzIiwiZ2V0UGFyYW1ldGVyTWluaW11bVZhbHVlIiwibWluaW11bVZhbHVlcyIsImdldFBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsImRlZmF1bHRWYWx1ZXMiLCJnZXRQYXJhbWV0ZXJWYWx1ZUJ5SW5kZXgiLCJnZXRQYXJhbWV0ZXJWYWx1ZUJ5SWQiLCJzZXRQYXJhbWV0ZXJWYWx1ZUJ5SW5kZXgiLCJhZGRQYXJhbWV0ZXJWYWx1ZUJ5SW5kZXgiLCJtdWx0aXBseVBhcmFtZXRlclZhbHVlQnlJZCIsIm11bHRpcGx5UGFyYW1ldGVyVmFsdWVCeUluZGV4IiwiZHJhd2FibGVDb3VudCIsImRyYXdhYmxlSW5kZXgiLCJnZXREcmF3YWJsZUNvdW50IiwiZ2V0RHJhd2FibGVJZCIsImdldERyYXdhYmxlUmVuZGVyT3JkZXJzIiwicmVuZGVyT3JkZXJzIiwiZ2V0RHJhd2FibGVUZXh0dXJlSW5kaWNlcyIsInRleHR1cmVJbmRpY2VzIiwiZ2V0RHJhd2FibGVEeW5hbWljRmxhZ1ZlcnRleFBvc2l0aW9uc0RpZENoYW5nZSIsImR5bmFtaWNGbGFncyIsIlV0aWxzIiwiaGFzVmVydGV4UG9zaXRpb25zRGlkQ2hhbmdlQml0IiwiZ2V0RHJhd2FibGVWZXJ0ZXhJbmRleENvdW50IiwiaW5kZXhDb3VudHMiLCJ2ZXJ0ZXhDb3VudHMiLCJnZXREcmF3YWJsZVZlcnRleFBvc2l0aW9ucyIsImdldERyYXdhYmxlVmVydGV4SW5kaWNlcyIsImluZGljZXMiLCJ2ZXJ0ZXhQb3NpdGlvbnMiLCJnZXREcmF3YWJsZVZlcnRleFV2cyIsInZlcnRleFV2cyIsImdldERyYXdhYmxlT3BhY2l0eSIsIm9wYWNpdGllcyIsImdldERyYXdhYmxlQ3VsbGluZyIsImNvbnN0YW50RmxhZ3MiLCJoYXNJc0RvdWJsZVNpZGVkQml0IiwiZ2V0RHJhd2FibGVCbGVuZE1vZGUiLCJoYXNCbGVuZEFkZGl0aXZlQml0IiwiQ3ViaXNtQmxlbmRNb2RlX0FkZGl0aXZlIiwiaGFzQmxlbmRNdWx0aXBsaWNhdGl2ZUJpdCIsIkN1YmlzbUJsZW5kTW9kZV9NdWx0aXBsaWNhdGl2ZSIsIkN1YmlzbUJsZW5kTW9kZV9Ob3JtYWwiLCJnZXREcmF3YWJsZUludmVydGVkTWFza0JpdCIsImhhc0lzSW52ZXJ0ZWRNYXNrQml0IiwiZ2V0RHJhd2FibGVNYXNrcyIsIm1hc2tzIiwiZ2V0RHJhd2FibGVNYXNrQ291bnRzIiwibWFza0NvdW50cyIsImlzVXNpbmdNYXNraW5nIiwiZ2V0RHJhd2FibGVEeW5hbWljRmxhZ0lzVmlzaWJsZSIsImhhc0lzVmlzaWJsZUJpdCIsImdldERyYXdhYmxlRHluYW1pY0ZsYWdWaXNpYmlsaXR5RGlkQ2hhbmdlIiwiaGFzVmlzaWJpbGl0eURpZENoYW5nZUJpdCIsImdldERyYXdhYmxlRHluYW1pY0ZsYWdPcGFjaXR5RGlkQ2hhbmdlIiwiaGFzT3BhY2l0eURpZENoYW5nZUJpdCIsImdldERyYXdhYmxlRHluYW1pY0ZsYWdSZW5kZXJPcmRlckRpZENoYW5nZSIsImhhc1JlbmRlck9yZGVyRGlkQ2hhbmdlQml0IiwidmFsdWVzIiwicGFydElkcyIsImRyYXdhYmxlSWRzIiwiQ3ViaXNtTW90aW9uRGF0YSIsIkN1YmlzbU1vdGlvblNlZ21lbnQiLCJDdWJpc21Nb3Rpb25Qb2ludCIsIkN1YmlzbU1vdGlvbkV2ZW50IiwiQ3ViaXNtTW90aW9uU2VnbWVudFR5cGUiLCJDdWJpc21Nb3Rpb25DdXJ2ZSIsIkN1YmlzbU1vdGlvbkN1cnZlVGFyZ2V0IiwiQ3ViaXNtTW90aW9uSnNvbiIsImxlcnBQb2ludHMiLCJ0aW1lIiwibGluZWFyRXZhbHVhdGUiLCJwb2ludHMiLCJiZXppZXJFdmFsdWF0ZSIsInAwMSIsInAxMiIsInAyMyIsInAwMTIiLCJwMTIzIiwic3RlcHBlZEV2YWx1YXRlIiwiaW52ZXJzZVN0ZXBwZWRFdmFsdWF0ZSIsImV2YWx1YXRlQ3VydmUiLCJtb3Rpb25EYXRhIiwiY3VydmUiLCJjdXJ2ZXMiLCJ0b3RhbFNlZ21lbnRDb3VudCIsImJhc2VTZWdtZW50SW5kZXgiLCJzZWdtZW50Q291bnQiLCJwb2ludFBvc2l0aW9uIiwic2VnbWVudHMiLCJiYXNlUG9pbnRJbmRleCIsInNlZ21lbnRUeXBlIiwiQ3ViaXNtTW90aW9uU2VnbWVudFR5cGVfQmV6aWVyIiwic2VnbWVudCIsIl9zb3VyY2VGcmFtZVJhdGUiLCJfbG9vcER1cmF0aW9uU2Vjb25kcyIsIl9pc0xvb3AiLCJfaXNMb29wRmFkZUluIiwiX2xhc3RXZWlnaHQiLCJfbW90aW9uRGF0YSIsIl9tb2RlbEN1cnZlSWRFeWVCbGluayIsIl9tb2RlbEN1cnZlSWRMaXBTeW5jIiwiX2V5ZUJsaW5rUGFyYW1ldGVySWRzIiwiX2xpcFN5bmNQYXJhbWV0ZXJJZHMiLCJmcHMiLCJ0aW1lT2Zmc2V0U2Vjb25kcyIsImxpcFN5bmNWYWx1ZSIsIk1BWF9WQUxVRSIsImV5ZUJsaW5rVmFsdWUiLCJsaXBTeW5jRmxhZ3MiLCJleWVCbGlua0ZsYWdzIiwidG1wRmFkZUluIiwidG1wRmFkZU91dCIsImN1cnZlQ291bnQiLCJDdWJpc21Nb3Rpb25DdXJ2ZVRhcmdldF9Nb2RlbCIsIkN1YmlzbU1vdGlvbkN1cnZlVGFyZ2V0X1BhcmFtZXRlciIsInNvdXJjZVZhbHVlIiwiZmFkZUluVGltZSIsImZhZGVPdXRUaW1lIiwiZmluIiwiZm91dCIsIkN1YmlzbU1vdGlvbkN1cnZlVGFyZ2V0X1BhcnRPcGFjaXR5Iiwic2V0SXNMb29wIiwiaXNMb29wIiwic2V0SXNMb29wRmFkZUluIiwibG9vcEZhZGVJbiIsImlzTG9vcEZhZGVJbiIsInNldFBhcmFtZXRlckZhZGVJblRpbWUiLCJzZXRQYXJhbWV0ZXJGYWRlT3V0VGltZSIsImdldFBhcmFtZXRlckZhZGVJblRpbWUiLCJnZXRQYXJhbWV0ZXJGYWRlT3V0VGltZSIsImV5ZUJsaW5rUGFyYW1ldGVySWRzIiwibGlwU3luY1BhcmFtZXRlcklkcyIsIm1vdGlvbkpzb24iLCJnZXRNb3Rpb25EdXJhdGlvbiIsImlzTW90aW9uTG9vcCIsImdldE1vdGlvbkN1cnZlQ291bnQiLCJnZXRNb3Rpb25GcHMiLCJldmVudENvdW50IiwiZ2V0RXZlbnRDb3VudCIsImlzRXhpc3RNb3Rpb25GYWRlSW5UaW1lIiwiZ2V0TW90aW9uRmFkZUluVGltZSIsImlzRXhpc3RNb3Rpb25GYWRlT3V0VGltZSIsImdldE1vdGlvbkZhZGVPdXRUaW1lIiwiZ2V0TW90aW9uVG90YWxTZWdtZW50Q291bnQiLCJnZXRNb3Rpb25Ub3RhbFBvaW50Q291bnQiLCJldmVudHMiLCJ0b3RhbFBvaW50Q291bnQiLCJnZXRNb3Rpb25DdXJ2ZVRhcmdldCIsImdldE1vdGlvbkN1cnZlSWQiLCJpc0V4aXN0TW90aW9uQ3VydmVGYWRlSW5UaW1lIiwiZ2V0TW90aW9uQ3VydmVGYWRlSW5UaW1lIiwiaXNFeGlzdE1vdGlvbkN1cnZlRmFkZU91dFRpbWUiLCJnZXRNb3Rpb25DdXJ2ZUZhZGVPdXRUaW1lIiwic2VnbWVudFBvc2l0aW9uIiwiZ2V0TW90aW9uQ3VydmVTZWdtZW50Q291bnQiLCJnZXRNb3Rpb25DdXJ2ZVNlZ21lbnQiLCJDdWJpc21Nb3Rpb25TZWdtZW50VHlwZV9MaW5lYXIiLCJDdWJpc21Nb3Rpb25TZWdtZW50VHlwZV9TdGVwcGVkIiwiQ3ViaXNtTW90aW9uU2VnbWVudFR5cGVfSW52ZXJzZVN0ZXBwZWQiLCJ1c2VyZGF0YWNvdW50IiwiZmlyZVRpbWUiLCJnZXRFdmVudFRpbWUiLCJnZXRFdmVudFZhbHVlIiwidSIsIk1ldGEiLCJfanNvbiIsImN1cnZlSW5kZXgiLCJzZWdtZW50SW5kZXgiLCJnZXRUb3RhbEV2ZW50VmFsdWVTaXplIiwidXNlckRhdGFJbmRleCIsIkV4cHJlc3Npb25CbGVuZFR5cGUiLCJfcGFyYW1ldGVycyIsImV4cHJlc3Npb24iLCJyb290IiwicGFyYW0iLCJibGVuZFR5cGUiLCJFeHByZXNzaW9uQmxlbmRUeXBlX0FkZCIsIkV4cHJlc3Npb25CbGVuZFR5cGVfTXVsdGlwbHkiLCJFeHByZXNzaW9uQmxlbmRUeXBlX092ZXJ3cml0ZSIsIml0ZW0iLCJFeHByZXNzaW9uUGFyYW1ldGVyIiwicGFyYW1ldGVyIiwiX2ZhZGVUaW1lU2Vjb25kcyIsIl9sYXN0TW9kZWwiLCJfcGFydEdyb3VwcyIsIl9wYXJ0R3JvdXBDb3VudHMiLCJwb3NlM2pzb24iLCJwb3NlTGlzdEluZm8iLCJwb3NlQ291bnQiLCJwb3NlSW5kZXgiLCJpZExpc3RJbmZvIiwiZ3JvdXBDb3VudCIsImdyb3VwSW5kZXgiLCJwYXJ0SW5mbyIsInBhcnREYXRhIiwiUGFydERhdGEiLCJsaW5rTGlzdEluZm8iLCJsaW5rQ291bnQiLCJsaW5rSW5kZXgiLCJsaW5rUGFydCIsImxpbmtJZCIsImxpbmsiLCJwb3NlIiwicmVzZXQiLCJiZWdpbkluZGV4IiwicGFydEdyb3VwQ291bnQiLCJkb0ZhZGUiLCJjb3B5UGFydE9wYWNpdGllcyIsInBhcnRzSW5kZXgiLCJwYXJhbUluZGV4IiwibGlua1BhcnRJbmRleCIsInZpc2libGVQYXJ0SW5kZXgiLCJuZXdPcGFjaXR5IiwiYTEiLCJhc3NpZ25tZW50IiwiY2xvbmVQYXJ0RGF0YSIsIkN1YmlzbU1vZGVsVXNlckRhdGFKc29uIiwiQ3ViaXNtTW9kZWxVc2VyRGF0YU5vZGUiLCJfdXNlckRhdGFOb2RlcyIsIl9hcnRNZXNoVXNlckRhdGFOb2RlIiwicGFyc2VVc2VyRGF0YSIsIm1vZGVsVXNlckRhdGEiLCJnZXRBcnRNZXNoVXNlckRhdGFzIiwidHlwZU9mQXJ0TWVzaCIsIm5vZGVDb3VudCIsImdldFVzZXJEYXRhQ291bnQiLCJhZGROb2RlIiwidGFyZ2V0SWQiLCJnZXRVc2VyRGF0YUlkIiwidGFyZ2V0VHlwZSIsImdldFVzZXJEYXRhVGFyZ2V0VHlwZSIsImdldFVzZXJEYXRhVmFsdWUiLCJnZXRUb3RhbFVzZXJEYXRhU2l6ZSIsIkN1YmlzbVBoeXNpY3NKc29uIiwiQ3ViaXNtUGh5c2ljc1JpZyIsIkN1YmlzbVBoeXNpY3NTdWJSaWciLCJDdWJpc21QaHlzaWNzSW5wdXQiLCJDdWJpc21QaHlzaWNzT3V0cHV0IiwiQ3ViaXNtUGh5c2ljc1BhcnRpY2xlIiwiQ3ViaXNtUGh5c2ljc1NvdXJjZSIsIkN1YmlzbVBoeXNpY3NUYXJnZXRUeXBlIiwiX3BoeXNpY3NSaWciLCJfb3B0aW9ucyIsIk9wdGlvbnMiLCJncmF2aXR5Iiwid2luZCIsInBoeXNpY3MiLCJyYWRBbmdsZSIsIm91dHB1dFZhbHVlIiwiY3VycmVudFNldHRpbmciLCJjdXJyZW50SW5wdXQiLCJjdXJyZW50T3V0cHV0IiwiY3VycmVudFBhcnRpY2xlcyIsInBhcmFtZXRlck1heGltdW1WYWx1ZSIsInBhcmFtZXRlck1pbmltdW1WYWx1ZSIsInBhcmFtZXRlckRlZmF1bHRWYWx1ZSIsInRvdGFsVHJhbnNsYXRpb24iLCJzZXR0aW5nSW5kZXgiLCJzdWJSaWdDb3VudCIsImFuZ2xlIiwic2V0dGluZ3MiLCJpbnB1dHMiLCJiYXNlSW5wdXRJbmRleCIsIm91dHB1dHMiLCJiYXNlT3V0cHV0SW5kZXgiLCJwYXJ0aWNsZXMiLCJiYXNlUGFydGljbGVJbmRleCIsImlucHV0Q291bnQiLCJzb3VyY2VQYXJhbWV0ZXJJbmRleCIsInNvdXJjZSIsImdldE5vcm1hbGl6ZWRQYXJhbWV0ZXJWYWx1ZSIsIm5vcm1hbGl6YXRpb25Qb3NpdGlvbiIsIm5vcm1hbGl6YXRpb25BbmdsZSIsInJlZmxlY3QiLCJ1cGRhdGVQYXJ0aWNsZXMiLCJwYXJ0aWNsZUNvdW50IiwibWF4aW11bSIsIm91dHB1dENvdW50IiwicGFydGljbGVJbmRleCIsInZlcnRleEluZGV4IiwiZGVzdGluYXRpb25QYXJhbWV0ZXJJbmRleCIsImRlc3RpbmF0aW9uIiwidHJhbnNsYXRpb24iLCJvdXRQYXJhbWV0ZXJWYWx1ZSIsInN1YmFycmF5IiwidXBkYXRlT3V0cHV0UGFyYW1ldGVyVmFsdWUiLCJvdXRQYXJhbUluZGV4Iiwic2V0T3B0aW9ucyIsIm9wdGlvbnMiLCJnZXRPcHRpb24iLCJwaHlzaWNzSnNvbiIsImdldEdyYXZpdHkiLCJnZXRXaW5kIiwiZ2V0U3ViUmlnQ291bnQiLCJnZXRUb3RhbElucHV0Q291bnQiLCJnZXRUb3RhbE91dHB1dENvdW50IiwiZ2V0VmVydGV4Q291bnQiLCJpbnB1dEluZGV4Iiwib3V0cHV0SW5kZXgiLCJtaW5pbXVtIiwiZ2V0Tm9ybWFsaXphdGlvblBvc2l0aW9uTWluaW11bVZhbHVlIiwiZ2V0Tm9ybWFsaXphdGlvblBvc2l0aW9uTWF4aW11bVZhbHVlIiwiZGVmYWx1dCIsImdldE5vcm1hbGl6YXRpb25Qb3NpdGlvbkRlZmF1bHRWYWx1ZSIsImdldE5vcm1hbGl6YXRpb25BbmdsZU1pbmltdW1WYWx1ZSIsImdldE5vcm1hbGl6YXRpb25BbmdsZU1heGltdW1WYWx1ZSIsImdldE5vcm1hbGl6YXRpb25BbmdsZURlZmF1bHRWYWx1ZSIsImdldElucHV0Q291bnQiLCJnZXRJbnB1dFdlaWdodCIsImdldElucHV0UmVmbGVjdCIsImdldElucHV0VHlwZSIsIkN1YmlzbVBoeXNpY3NTb3VyY2VfWCIsImdldElucHV0VHJhbnNsYXRpb25YRnJvbU5vcm1hbGl6ZWRQYXJhbWV0ZXJWYWx1ZSIsIkN1YmlzbVBoeXNpY3NTb3VyY2VfWSIsImdldElucHV0VHJhbnNsYXRpb25ZRnJvbU5vcm1hbGl6ZWRQYXJhbXRlclZhbHVlIiwiQ3ViaXNtUGh5c2ljc1NvdXJjZV9BbmdsZSIsImdldElucHV0QW5nbGVGcm9tTm9ybWFsaXplZFBhcmFtZXRlclZhbHVlIiwiQ3ViaXNtUGh5c2ljc1RhcmdldFR5cGVfUGFyYW1ldGVyIiwiZ2V0SW5wdXRTb3VyY2VJZCIsImdldE91dHB1dENvdW50IiwiZ2V0T3V0cHV0VmVydGV4SW5kZXgiLCJhbmdsZVNjYWxlIiwiZ2V0T3V0cHV0QW5nbGVTY2FsZSIsImdldE91dHB1dFdlaWdodCIsImdldE91dHB1dERlc3RpbmF0aW9uSWQiLCJnZXRPdXRwdXRUeXBlIiwiZ2V0T3V0cHV0VHJhbnNsYXRpb25YIiwiZ2V0T3V0cHV0U2NhbGVUcmFuc2xhdGlvblgiLCJnZXRPdXRwdXRUcmFuc2xhdGlvblkiLCJnZXRPdXRwdXRTY2FsZVRyYW5zbGF0aW9uWSIsImdldE91dHB1dEFuZ2xlIiwiZ2V0T3V0cHV0U2NhbGVBbmdsZSIsImdldE91dHB1dFJlZmxlY3QiLCJnZXRQYXJ0aWNsZUNvdW50IiwibW9iaWxpdHkiLCJnZXRQYXJ0aWNsZU1vYmlsaXR5IiwiZGVsYXkiLCJnZXRQYXJ0aWNsZURlbGF5IiwiYWNjZWxlcmF0aW9uIiwiZ2V0UGFydGljbGVBY2NlbGVyYXRpb24iLCJyYWRpdXMiLCJnZXRQYXJ0aWNsZVJhZGl1cyIsImdldFBhcnRpY2xlUG9zaXRpb24iLCJzdHJhbmQiLCJpbml0aWFsUG9zaXRpb24iLCJsYXN0UG9zaXRpb24iLCJsYXN0R3Jhdml0eSIsInZlbG9jaXR5IiwiZm9yY2UiLCJ0YXJnZXRUcmFuc2xhdGlvbiIsInRhcmdldEFuZ2xlIiwiaXNJbnZlcnRlZCIsIm5vcm1hbGl6ZVBhcmFtZXRlclZhbHVlIiwibm9ybWFsaXphaXRpb25Qb3NpdGlvbiIsInBhcmVudEdyYXZpdHkiLCJnZXREZWZhdWx0VmFsdWUiLCJtYXhWYWx1ZSIsIm1pblZhbHVlIiwiZ2V0UmFuZ2VWYWx1ZSIsInRyYW5zbGF0aW9uU2NhbGUiLCJzdHJhbmRDb3VudCIsIndpbmREaXJlY3Rpb24iLCJ0aHJlc2hvbGRWYWx1ZSIsImFpclJlc2lzdGFuY2UiLCJ0b3RhbFJhZGlhbiIsImN1cnJlbnRHcmF2aXR5IiwiZGlyZWN0aW9uIiwibmV3RGlyZWN0aW9uIiwicGFyYW1ldGVyVmFsdWVNaW5pbXVtIiwicGFyYW1ldGVyVmFsdWVNYXhpbXVtIiwib3V0cHV0IiwidmFsdWVCZWxvd01pbmltdW0iLCJ2YWx1ZUV4Y2VlZGVkTWF4aW11bSIsInBhcmFtZXRlck1pbmltdW0iLCJwYXJhbWV0ZXJNYXhpbXVtIiwicGFyYW1ldGVyRGVmYXVsdCIsIm5vcm1hbGl6ZWRNaW5pbXVtIiwibm9ybWFsaXplZE1heGltdW0iLCJub3JtYWxpemVkRGVmYXVsdCIsIm1pbk5vcm1WYWx1ZSIsIm1heE5vcm1WYWx1ZSIsIm1pZGRsZU5vcm1WYWx1ZSIsIm1pZGRsZVZhbHVlIiwicGFyYW1WYWx1ZSIsIm5MZW5ndGgiLCJwTGVuZ3RoIiwiUGh5c2ljc0pzb25FZmZlY3RpdmVGb3JjZXMiLCJDdWJpc21QaHlzaWNzUGFyYW1ldGVyIiwiQ3ViaXNtUGh5c2ljc05vcm1hbGl6YXRpb24iLCJQaHlzaWNzU2V0dGluZ3MiLCJwaHlzaWNzU2V0dGluZ0luZGV4IiwiY3NtUmVjdCIsInNfdmlld3BvcnQiLCJzX2ZibyIsIl9tYXNrUmVuZGVyVGV4dHVyZSIsIl9jb2xvckJ1ZmZlciIsIl9jdXJyZW50RnJhbWVObyIsIl9jbGlwcGluZ01hc2tCdWZmZXJTaXplIiwiX2NsaXBwaW5nQ29udGV4dExpc3RGb3JNYXNrIiwiX2NsaXBwaW5nQ29udGV4dExpc3RGb3JEcmF3IiwiX2NoYW5uZWxDb2xvcnMiLCJfdG1wQm91bmRzT25Nb2RlbCIsIl90bXBNYXRyaXgiLCJfdG1wTWF0cml4Rm9yTWFzayIsIl90bXBNYXRyaXhGb3JEcmF3IiwiX21hc2tUZXh0dXJlIiwidG1wIiwiZ2V0Q2hhbm5lbEZsYWdBc0NvbG9yIiwiY2hhbm5lbE5vIiwiZ2V0TWFza1JlbmRlclRleHR1cmUiLCJ0ZXh0dXJlIiwiZnJhbWVObyIsImNyZWF0ZVRleHR1cmUiLCJURVhUVVJFXzJEIiwidGV4SW1hZ2UyRCIsIlJHQkEiLCJVTlNJR05FRF9CWVRFIiwidGV4UGFyYW1ldGVyaSIsIlRFWFRVUkVfV1JBUF9TIiwiQ0xBTVBfVE9fRURHRSIsIlRFWFRVUkVfV1JBUF9UIiwiVEVYVFVSRV9NSU5fRklMVEVSIiwiTElORUFSIiwiVEVYVFVSRV9NQUdfRklMVEVSIiwiY3JlYXRlRnJhbWVidWZmZXIiLCJiaW5kRnJhbWVidWZmZXIiLCJGUkFNRUJVRkZFUiIsImZyYW1lYnVmZmVyVGV4dHVyZTJEIiwiQ09MT1JfQVRUQUNITUVOVDAiLCJDdWJpc21SZW5kZXJUZXh0dXJlUmVzb3VyY2UiLCJzZXRHTCIsImNhbGNDbGlwcGVkRHJhd1RvdGFsQm91bmRzIiwiY2xpcHBpbmdDb250ZXh0IiwiY2xpcHBlZERyYXdUb3RhbE1pblgiLCJjbGlwcGVkRHJhd1RvdGFsTWluWSIsImNsaXBwZWREcmF3VG90YWxNYXhYIiwiTUlOX1ZBTFVFIiwiY2xpcHBlZERyYXdUb3RhbE1heFkiLCJjbGlwcGVkRHJhd0NvdW50IiwiX2NsaXBwZWREcmF3YWJsZUluZGV4TGlzdCIsImNsaXBwZWREcmF3YWJsZUluZGV4IiwiZHJhd2FibGVWZXJ0ZXhDb3VudCIsImRyYXdhYmxlVmVydGV4ZXMiLCJtaW5YIiwibWluWSIsIm1heFgiLCJtYXhZIiwicGkiLCJfYWxsQ2xpcHBlZERyYXdSZWN0IiwiX2lzVXNpbmciLCJkZWxldGVGcmFtZWJ1ZmZlciIsImRlbGV0ZVRleHR1cmUiLCJkcmF3YWJsZU1hc2tzIiwiZHJhd2FibGVNYXNrQ291bnRzIiwiZmluZFNhbWVDbGlwIiwiQ3ViaXNtQ2xpcHBpbmdDb250ZXh0IiwiYWRkQ2xpcHBlZERyYXdhYmxlIiwic2V0dXBDbGlwcGluZ0NvbnRleHQiLCJ1c2luZ0NsaXBDb3VudCIsImNsaXBJbmRleCIsImNjIiwicHJlRHJhdyIsInNldHVwTGF5b3V0Qm91bmRzIiwiY2xpcENvbnRleHQiLCJhbGxDbGlwZWREcmF3UmVjdCIsImxheW91dEJvdW5kc09uVGV4MDEiLCJfbGF5b3V0Qm91bmRzIiwic2V0UmVjdCIsImV4cGFuZCIsIl9tYXRyaXhGb3JNYXNrIiwiX21hdHJpeEZvckRyYXciLCJjbGlwRHJhd0NvdW50IiwiX2NsaXBwaW5nSWRDb3VudCIsImNsaXBEcmF3SW5kZXgiLCJfY2xpcHBpbmdJZExpc3QiLCJzZXRDbGlwcGluZ0NvbnRleHRCdWZmZXJGb3JNYXNrIiwiZHJhd01lc2giLCJzYW1lQ291bnQiLCJjbGlwSWQiLCJkaXYiLCJtb2QiLCJjdXJDbGlwSW5kZXgiLCJsYXlvdXRDb3VudCIsIl9sYXlvdXRDaGFubmVsTm8iLCJ4cG9zIiwieXBvcyIsImdldENvbG9yQnVmZmVyIiwiZ2V0Q2xpcHBpbmdDb250ZXh0TGlzdEZvckRyYXciLCJzZXRDbGlwcGluZ01hc2tCdWZmZXJTaXplIiwiZ2V0Q2xpcHBpbmdNYXNrQnVmZmVyU2l6ZSIsIkN1YmlzbUNsaXBwaW5nTWFuYWdlcl9XZWJHTCIsIm1hbmFnZXIiLCJjbGlwcGluZ0RyYXdhYmxlSW5kaWNlcyIsImNsaXBDb3VudCIsIl9vd25lciIsImdldENsaXBwaW5nTWFuYWdlciIsInNldEdsIiwiX3NoYWRlclNldHMiLCJDdWJpc21TaGFkZXJfV2ViR0wiLCJkZWxldGVJbnN0YW5jZSIsInJlbGVhc2VTaGFkZXJQcm9ncmFtIiwic2V0dXBTaGFkZXJQcm9ncmFtIiwidGV4dHVyZUlkIiwidmVydGV4Q291bnQiLCJ2ZXJ0ZXhBcnJheSIsImluZGV4QXJyYXkiLCJ1dkFycmF5IiwiYnVmZmVyRGF0YSIsImNvbG9yQmxlbmRNb2RlIiwiYmFzZUNvbG9yIiwibWF0cml4NHg0IiwiaW52ZXJ0ZWRNYXNrIiwiU1JDX0NPTE9SIiwiRFNUX0NPTE9SIiwiRFNUX0FMUEhBIiwiZ2VuZXJhdGVTaGFkZXJzIiwiZ2V0Q2xpcHBpbmdDb250ZXh0QnVmZmVyRm9yTWFzayIsInNoYWRlclNldCIsIlNoYWRlck5hbWVzIiwiU2hhZGVyTmFtZXNfU2V0dXBNYXNrIiwic2hhZGVyUHJvZ3JhbSIsImFjdGl2ZVRleHR1cmUiLCJURVhUVVJFMCIsInVuaWZvcm0xaSIsInNhbXBsZXJUZXh0dXJlMExvY2F0aW9uIiwidmVydGV4IiwiY3JlYXRlQnVmZmVyIiwiYmluZEJ1ZmZlciIsIkFSUkFZX0JVRkZFUiIsIkRZTkFNSUNfRFJBVyIsImVuYWJsZVZlcnRleEF0dHJpYkFycmF5IiwiYXR0cmlidXRlUG9zaXRpb25Mb2NhdGlvbiIsInZlcnRleEF0dHJpYlBvaW50ZXIiLCJGTE9BVCIsInV2IiwiYXR0cmlidXRlVGV4Q29vcmRMb2NhdGlvbiIsImNvbG9yQ2hhbm5lbCIsInVuaWZvcm00ZiIsInVuaWZvcm1DaGFubmVsRmxhZ0xvY2F0aW9uIiwidW5pZm9ybU1hdHJpeDRmdiIsInVuaWZvcm1DbGlwTWF0cml4TG9jYXRpb24iLCJ1bmlmb3JtQmFzZUNvbG9yTG9jYXRpb24iLCJnZXRSaWdodCIsImdldEJvdHRvbSIsIlpFUk8iLCJPTkVfTUlOVVNfU1JDX0NPTE9SIiwibWFza2VkIiwiZ2V0Q2xpcHBpbmdDb250ZXh0QnVmZmVyRm9yRHJhdyIsIkN1YmlzbVNoYWRlclNldCIsIlNoYWRlck5hbWVzX05vcm1hbFByZW11bHRpcGxpZWRBbHBoYSIsIk9ORSIsIlNoYWRlck5hbWVzX0FkZFByZW11bHRpcGxpZWRBbHBoYSIsIlNoYWRlck5hbWVzX011bHRQcmVtdWx0aXBsaWVkQWxwaGEiLCJURVhUVVJFMSIsInRleCIsInNhbXBsZXJUZXh0dXJlMUxvY2F0aW9uIiwidW5pZm9ybU1hdHJpeExvY2F0aW9uIiwiRUxFTUVOVF9BUlJBWV9CVUZGRVIiLCJibGVuZEZ1bmNTZXBhcmF0ZSIsImxvYWRTaGFkZXJQcm9ncmFtIiwidmVydGV4U2hhZGVyU3JjU2V0dXBNYXNrIiwiZnJhZ21lbnRTaGFkZXJTcmNzZXR1cE1hc2siLCJ2ZXJ0ZXhTaGFkZXJTcmMiLCJmcmFnbWVudFNoYWRlclNyY1ByZW11bHRpcGxpZWRBbHBoYSIsInZlcnRleFNoYWRlclNyY01hc2tlZCIsImZyYWdtZW50U2hhZGVyU3JjTWFza1ByZW11bHRpcGxpZWRBbHBoYSIsImZyYWdtZW50U2hhZGVyU3JjTWFza0ludmVydGVkUHJlbXVsdGlwbGllZEFscGhhIiwiZ2V0QXR0cmliTG9jYXRpb24iLCJnZXRVbmlmb3JtTG9jYXRpb24iLCJ2ZXJ0ZXhTaGFkZXJTb3VyY2UiLCJmcmFnbWVudFNoYWRlclNvdXJjZSIsInZlcnRTaGFkZXIiLCJjb21waWxlU2hhZGVyU291cmNlIiwiZnJhZ1NoYWRlciIsImdldFByb2dyYW1QYXJhbWV0ZXIiLCJMSU5LX1NUQVRVUyIsInNoYWRlclR5cGUiLCJzaGFkZXIiLCJnZXRTaGFkZXJJbmZvTG9nIiwiZ2V0U2hhZGVyUGFyYW1ldGVyIiwiQ09NUElMRV9TVEFUVVMiLCJfY2xpcHBpbmdDb250ZXh0QnVmZmVyRm9yTWFzayIsIl9jbGlwcGluZ0NvbnRleHRCdWZmZXJGb3JEcmF3IiwiX2NsaXBwaW5nTWFuYWdlciIsImZpcnN0RHJhdyIsIl90ZXh0dXJlcyIsIl9zb3J0ZWREcmF3YWJsZUluZGV4TGlzdCIsIl9idWZmZXJEYXRhIiwiV2ViR0xCdWZmZXIiLCJtb2RlbFRleHR1cmVObyIsImdsVGV4dHVyZSIsImdldEJpbmRlZFRleHR1cmVzIiwiZGVsZXRlQnVmZmVyIiwicmVuZGVyT3JkZXIiLCJvcmRlciIsInNldENsaXBwaW5nQ29udGV4dEJ1ZmZlckZvckRyYXciLCJ0ZXh0dXJlTm8iLCJpbmRleENvdW50IiwiQ1VMTF9GQUNFIiwiZGlzYWJsZSIsImZyb250RmFjZSIsIkNDVyIsImRyYXd0ZXh0dXJlIiwibW9kZWxDb2xvclJHQkEiLCJkcmF3RWxlbWVudHMiLCJUUklBTkdMRVMiLCJVTlNJR05FRF9TSE9SVCIsImRvU3RhdGljUmVsZWFzZSIsImZibyIsImdldEV4dGVuc2lvbiIsIlNDSVNTT1JfVEVTVCIsIlNURU5DSUxfVEVTVCIsIkNXIiwiY29sb3JNYXNrIiwiY2xpcCIsIklDdWJpc21Nb2RlbFNldHRpbmciLCJGcmVxdWVzdE5vZGUiLCJOYW1lIiwiX2pzb25WYWx1ZSIsIkdldEpzb24iLCJpc0V4aXN0TW9kZWxGaWxlIiwiRnJlcXVlc3ROb2RlX01vYyIsImlzRXhpc3RUZXh0dXJlRmlsZXMiLCJGcmVxdWVzdE5vZGVfVGV4dHVyZXMiLCJnZXRUZXh0dXJlRGlyZWN0b3J5IiwiaXNFeGlzdEhpdEFyZWFzIiwiRnJlcXVlc3ROb2RlX0hpdEFyZWFzIiwiaXNFeGlzdFBoeXNpY3NGaWxlIiwiRnJlcXVlc3ROb2RlX1BoeXNpY3MiLCJpc0V4aXN0UG9zZUZpbGUiLCJGcmVxdWVzdE5vZGVfUG9zZSIsImlzRXhpc3RFeHByZXNzaW9uRmlsZSIsIkZyZXF1ZXN0Tm9kZV9FeHByZXNzaW9ucyIsImlzRXhpc3RNb3Rpb25Hcm91cHMiLCJGcmVxdWVzdE5vZGVfTW90aW9ucyIsImdyb3VwTmFtZSIsImlzRXhpc3RNb3Rpb25Hcm91cE5hbWUiLCJnZXRNb3Rpb25Tb3VuZEZpbGVOYW1lIiwiaXNFeGlzdE1vdGlvblNvdW5kRmlsZSIsImlzRXhpc3RNb3Rpb25GYWRlSW4iLCJpc0V4aXN0TW90aW9uRmFkZU91dCIsImlzRXhpc3RVc2VyRGF0YUZpbGUiLCJvdXRMYXlvdXRNYXAiLCJtYXAiLCJpc0V4aXN0RXllQmxpbmtQYXJhbWV0ZXJzIiwibnVtIiwiRnJlcXVlc3ROb2RlX0dyb3VwcyIsInJlZkkiLCJpc0V4aXN0TGlwU3luY1BhcmFtZXRlcnMiLCJub2RlIiwiSGl0QXJlYVByZWZpeCIsIkhpdEFyZWFIZWFkIiwiSGl0QXJlYUJvZHkiLCJQYXJ0c0lkQ29yZSIsIlBhcnRzQXJtUHJlZml4IiwiUGFydHNBcm1MUHJlZml4IiwiUGFydHNBcm1SUHJlZml4IiwiUGFyYW1FeWVMT3BlbiIsIlBhcmFtRXllTFNtaWxlIiwiUGFyYW1FeWVST3BlbiIsIlBhcmFtRXllUlNtaWxlIiwiUGFyYW1FeWVCYWxsRm9ybSIsIlBhcmFtQnJvd0xZIiwiUGFyYW1Ccm93UlkiLCJQYXJhbUJyb3dMWCIsIlBhcmFtQnJvd1JYIiwiUGFyYW1Ccm93TEFuZ2xlIiwiUGFyYW1Ccm93UkFuZ2xlIiwiUGFyYW1Ccm93TEZvcm0iLCJQYXJhbUJyb3dSRm9ybSIsIlBhcmFtTW91dGhGb3JtIiwiUGFyYW1Nb3V0aE9wZW5ZIiwiUGFyYW1DaGVlayIsIlBhcmFtQm9keUFuZ2xlWSIsIlBhcmFtQm9keUFuZ2xlWiIsIlBhcmFtQXJtTEEiLCJQYXJhbUFybVJBIiwiUGFyYW1Bcm1MQiIsIlBhcmFtQXJtUkIiLCJQYXJhbUhhbmRMIiwiUGFyYW1IYW5kUiIsIlBhcmFtSGFpckZyb250IiwiUGFyYW1IYWlyU2lkZSIsIlBhcmFtSGFpckJhY2siLCJQYXJhbUhhaXJGbHVmZnkiLCJQYXJhbVNob3VsZGVyWSIsIlBhcmFtQnVzdFgiLCJQYXJhbUJ1c3RZIiwiUGFyYW1CYXNlWCIsIlBhcmFtQmFzZVkiLCJQYXJhbU5PTkUiLCJzdXBwb3J0IiwiQmxvYiIsInZpZXdDbGFzc2VzIiwiaXNBcnJheUJ1ZmZlclZpZXciLCJBcnJheUJ1ZmZlciIsImlzVmlldyIsIm9iaiIsIm5vcm1hbGl6ZU5hbWUiLCJTdHJpbmciLCJUeXBlRXJyb3IiLCJ0b0xvd2VyQ2FzZSIsIm5vcm1hbGl6ZVZhbHVlIiwiaXRlcmF0b3JGb3IiLCJpdGVtcyIsIm5leHQiLCJzaGlmdCIsImRvbmUiLCJIZWFkZXJzIiwiaGVhZGVycyIsImZvckVhY2giLCJoZWFkZXIiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiY29uc3VtZWQiLCJib2R5VXNlZCIsIlByb21pc2UiLCJyZWplY3QiLCJmaWxlUmVhZGVyUmVhZHkiLCJyZWFkZXIiLCJyZXNvbHZlIiwib25lcnJvciIsImVycm9yIiwicmVhZEJsb2JBc0FycmF5QnVmZmVyIiwiYmxvYiIsIkZpbGVSZWFkZXIiLCJwcm9taXNlIiwicmVhZEFzQXJyYXlCdWZmZXIiLCJidWZmZXJDbG9uZSIsImJ1ZiIsInZpZXciLCJCb2R5IiwiX2luaXRCb2R5IiwiX2JvZHlJbml0IiwiX2JvZHlUZXh0IiwiaXNQcm90b3R5cGVPZiIsIl9ib2R5QmxvYiIsIkZvcm1EYXRhIiwiX2JvZHlGb3JtRGF0YSIsIlVSTFNlYXJjaFBhcmFtcyIsIkRhdGFWaWV3IiwiX2JvZHlBcnJheUJ1ZmZlciIsInJlamVjdGVkIiwiRXJyb3IiLCJ0ZXh0IiwicmVhZEFzVGV4dCIsImNoYXJzIiwiZnJvbUNoYXJDb2RlIiwiam9pbiIsInJlYWRBcnJheUJ1ZmZlckFzVGV4dCIsImZvcm1EYXRhIiwiZGVjb2RlIiwib2xkVmFsdWUiLCJoYXMiLCJ0aGlzQXJnIiwia2V5cyIsImVudHJpZXMiLCJtZXRob2RzIiwiUmVxdWVzdCIsImlucHV0IiwibWV0aG9kIiwidXBjYXNlZCIsInVybCIsImNyZWRlbnRpYWxzIiwic2lnbmFsIiwidG9VcHBlckNhc2UiLCJyZWZlcnJlciIsImZvcm0iLCJ0cmltIiwic3BsaXQiLCJieXRlcyIsIlJlc3BvbnNlIiwiYm9keUluaXQiLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwicmVkaXJlY3RTdGF0dXNlcyIsInJlZGlyZWN0IiwiUmFuZ2VFcnJvciIsImxvY2F0aW9uIiwiRE9NRXhjZXB0aW9uIiwiZXJyIiwic3RhY2siLCJjb25zdHJ1Y3RvciIsImluaXQiLCJyZXF1ZXN0IiwiYWJvcnRlZCIsInhociIsIlhNTEh0dHBSZXF1ZXN0IiwiYWJvcnRYaHIiLCJhYm9ydCIsInJhd0hlYWRlcnMiLCJnZXRBbGxSZXNwb25zZUhlYWRlcnMiLCJsaW5lIiwicmVzcG9uc2VVUkwiLCJyZXNwb25zZVRleHQiLCJvbnRpbWVvdXQiLCJvbmFib3J0Iiwib3BlbiIsIndpdGhDcmVkZW50aWFscyIsInJlc3BvbnNlVHlwZSIsInNldFJlcXVlc3RIZWFkZXIiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwic2VuZCIsInBvbHlmaWxsIiwidXNlUHJlbXVsdGlwbHkiLCJ1c2VQcmVtdWx0cGx5IiwiaW1nIiwiSW1hZ2UiLCJjcm9zc09yaWdpbiIsIkxJTkVBUl9NSVBNQVBfTElORUFSIiwicGl4ZWxTdG9yZWkiLCJVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wiLCJnZW5lcmF0ZU1pcG1hcCIsIlRleHR1cmVJbmZvIiwicmVsZWFzZVRleHR1cmVzIiwicmVsZWFzZVRleHR1cmVCeVRleHR1cmUiLCJyZWxlYXNlVGV4dHVyZUJ5RmlsZVBhdGgiXSwibWFwcGluZ3MiOiJhQUNFLElBQUlBLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVDLFFBR25DLElBQUlDLEVBQVNKLEVBQWlCRSxHQUFZLENBQ3pDRyxFQUFHSCxFQUNISSxHQUFHLEVBQ0hILFFBQVMsSUFVVixPQU5BSSxFQUFRTCxHQUFVTSxLQUFLSixFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTRixHQUcvREcsRUFBT0UsR0FBSSxFQUdKRixFQUFPRCxRQUtmRixFQUFvQlEsRUFBSUYsRUFHeEJOLEVBQW9CUyxFQUFJVixFQUd4QkMsRUFBb0JVLEVBQUksU0FBU1IsRUFBU1MsRUFBTUMsR0FDM0NaLEVBQW9CYSxFQUFFWCxFQUFTUyxJQUNsQ0csT0FBT0MsZUFBZWIsRUFBU1MsRUFBTSxDQUFFSyxZQUFZLEVBQU1DLElBQUtMLEtBS2hFWixFQUFvQmtCLEVBQUksU0FBU2hCLEdBQ1gsb0JBQVhpQixRQUEwQkEsT0FBT0MsYUFDMUNOLE9BQU9DLGVBQWViLEVBQVNpQixPQUFPQyxZQUFhLENBQUVDLE1BQU8sV0FFN0RQLE9BQU9DLGVBQWViLEVBQVMsYUFBYyxDQUFFbUIsT0FBTyxLQVF2RHJCLEVBQW9Cc0IsRUFBSSxTQUFTRCxFQUFPRSxHQUV2QyxHQURVLEVBQVBBLElBQVVGLEVBQVFyQixFQUFvQnFCLElBQy9CLEVBQVBFLEVBQVUsT0FBT0YsRUFDcEIs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akQsVUFBVTdpRCxJQUFJbEcsRUFBRyxNQUN0QjRGLEtBQUttakQsVUFBVTdnRCxPQUFPbEksR0FDdEIsUUFNUixFQXZKQSxHQUFhLEVBQUFpVSxxQkE0SmIsaUJBRUUsS0FBQStXLEdBQW1CLEtBQ25CLEtBQUF4RixNQUFRLEVBQ1IsS0FBQUMsT0FBUyxHQUpFLEVBQUEweEMiLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvZGlzdC9cIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDE4KTtcbiIsIi8qKlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4g5L+d55WZ5omA5pyJ5p2D5Yip44CCXG4gKlxuICog5pys5rqQ56CB55qE5L2/55So5Y+XTGl2ZTJE5byA5pS+6L2v5Lu26K645Y+v6K+B55qE57qm5p2f44CCXG4gKiDlj6/lnKggaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuXG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtanNvbiB9IGZyb20gJy4vdXRpbHMvY3ViaXNtanNvbic7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtaWRtYW5hZ2VyIH0gZnJvbSAnLi9pZC9jdWJpc21pZG1hbmFnZXInO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbXJlbmRlcmVyIH0gZnJvbSAnLi9yZW5kZXJpbmcvY3ViaXNtcmVuZGVyZXInO1xuaW1wb3J0IHtcbiAgQ3ViaXNtTG9nSW5mbyxcbiAgQ3ViaXNtTG9nV2FybmluZyxcbiAgQ1NNX0FTU0VSVFxufSBmcm9tICcuL3V0aWxzL2N1YmlzbWRlYnVnJztcbmltcG9ydCBWYWx1ZSA9IGN1YmlzbWpzb24uVmFsdWU7XG5pbXBvcnQgQ3ViaXNtSWRNYW5hZ2VyID0gY3ViaXNtaWRtYW5hZ2VyLkN1YmlzbUlkTWFuYWdlcjtcbmltcG9ydCBDdWJpc21SZW5kZXJlciA9IGN1YmlzbXJlbmRlcmVyLkN1YmlzbVJlbmRlcmVyO1xuXG5leHBvcnQgZnVuY3Rpb24gc3RydG9kKHM6IHN0cmluZywgZW5kUHRyOiBzdHJpbmdbXSk6IG51bWJlciB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAobGV0IGkgPSAxOyA7IGkrKykge1xuICAgIGNvbnN0IHRlc3RDOiBzdHJpbmcgPSBzLnNsaWNlKGkgLSAxLCBpKTtcblxuICAgIC8vIOWboOS4uuacieaMh+aVsMK36LSf5pWw55qE5Y+v6IO95oCn77yM5omA5Lul6Lez6L+HXG4gICAgaWYgKHRlc3RDID09ICdlJyB8fCB0ZXN0QyA9PSAnLScgfHwgdGVzdEMgPT0gJ0UnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIOaJqeWkp+Wtl+espuS4sueahOiMg+WbtFxuXG4gICAgY29uc3QgdGVzdDogc3RyaW5nID0gcy5zdWJzdHJpbmcoMCwgaSk7XG4gICAgY29uc3QgbnVtYmVyID0gTnVtYmVyKHRlc3QpO1xuICAgIGlmIChpc05hTihudW1iZXIpKSB7XG4gICAgICAvLyDlm6DkuLrlroPkuI3og73ooqvor4bliKvkuLrmlbDlrZfvvIzmiYDku6XlroPnu5PmnZ/kuobjgIJcbiAgICAgIGJyZWFrO1xuICAgIH0gLy8g5pyA5ZCO5a2Y5YKo5L2c5Li65pWw5YC85b2i5oiQ55qEaW5kZXjjgIJcblxuICAgIGluZGV4ID0gaTtcbiAgfVxuICBsZXQgZCA9IHBhcnNlRmxvYXQocyk7IC8vIOino+aekOWQjueahOaVsOWAvFxuXG4gIGlmIChpc05hTihkKSkge1xuICAgIC8vIOWboOS4uuWug+S4jeiDveiiq+ivhuWIq+S4uuaVsOWtl++8jOaJgOS7peWug+e7k+adn+S6huOAglxuICAgIGQgPSBOYU47XG4gIH1cblxuICBlbmRQdHJbMF0gPSBzLnNsaWNlKGluZGV4KTsgLy8g5ZCO57ut55qE5a2X56ym5LiyXG4gIHJldHVybiBkO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIExpdmUyREN1YmlzbUZyYW1ld29yayB7XG4gIC8v5Yid5aeL5YyW5paH5Lu25L2c55So5Z+f5Lit55qE5Y+Y6YePXG5cbiAgbGV0IHNfaXNTdGFydGVkID0gZmFsc2U7XG4gIGxldCBzX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgbGV0IHNfb3B0aW9uOiBPcHRpb24gPSBudWxsO1xuICBsZXQgc19jdWJpc21JZE1hbmFnZXI6IEN1YmlzbUlkTWFuYWdlciA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEZyYW1ld29ya+S4reS9v+eUqOeahOW4uOmHj+WjsOaYjlxuICAgKi9cbiAgZXhwb3J0IG5hbWVzcGFjZSBDb25zdGFudCB7XG4gICAgZXhwb3J0IGNvbnN0IHZlcnRleE9mZnNldCA9IDA7IC8vIOODoeODg+OCt+ODpemggueCueOBruOCquODleOCu+ODg+ODiOWApCDnvZHmoLzpobbngrnnmoTlgY/np7vlgLxcbiAgICBleHBvcnQgY29uc3QgdmVydGV4U3RlcCA9IDI7IC8vIOODoeODg+OCt+ODpemggueCueOBruOCueODhuODg+ODl+WApCDnvZHmoLzpobbngrnnmoTmraXplb/lgLxcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBjc21EZWxldGU8VD4oYWRkcmVzczogVCk6IHZvaWQge1xuICAgIGlmICghYWRkcmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGFkZHJlc3MgPSB2b2lkIDA7XG4gIH1cblxuICAvKipcbiAgICogTGl2ZTJEIEN1YmlzbSBTREsgT3JpZ2luYWwgV29ya2Zsb3cgU0RL44Gu44Ko44Oz44OI44Oq44Od44Kk44Oz44OIXG4gICAqIOWIqeeUqOmWi+Wni+aZguOBr0N1YmlzbUZyYW1ld29yay5pbml0aWFsaXplKCnjgpLlkbzjgbPjgIFDdWJpc21GcmFtZXdvcmsuZGlzcG9zZSgp44Gn57WC5LqG44GZ44KL44CCXG4gICAqIExpdmUyROeri+S9k+S4u+S5iVNESyDljp/liJvlt6XkvZzmtYFTREvliIflhaXngrlcbiAgICog5b2T5L2g5byA5aeL5L2/55So5a6D5pe277yM6LCD55SoQ3ViaXNtRnJhbWV3b3JrLmluaXRpYWxpemUoKeWSjCDnlKhDdWJpc21GcmFtZXdvcmsuZGlzcG9zZSgp6YCA5Ye6XG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtRnJhbWV3b3JrIHtcbiAgICAvKipcbiAgICAgKiBDdWJpc20gRnJhbWV3b3Jr44GuQVBJ44KS5L2/55So5Y+v6IO944Gr44GZ44KL44CCXG4gICAgICogIEFQSeOCkuWun+ihjOOBmeOCi+WJjeOBq+W/heOBmuOBk+OBrumWouaVsOOCkuWun+ihjOOBmeOCi+OBk+OBqOOAglxuICAgICAqICDkuIDluqbmupblgpnjgYzlrozkuobjgZfjgabku6XpmY3jga/jgIHlho3jgbPlrp/ooYzjgZfjgabjgoLlhoXpg6jlh6bnkIbjgYzjgrnjgq3jg4Pjg5fjgZXjgozjgb7jgZnjgIJcbiAgICAgKiAgIOWQr+eUqEN1YmlzbeahhuaetkFQSeOAglxuICAgICAqICAg5Zyo5omn6KGMQVBJ5LmL5YmN77yM5LiA5a6a6KaB6L+Q6KGM6L+Z5Liq5Ye95pWw44CCXG4gICAgICogICDlh4blpIflt6XkvZzlrozmiJDlkI7vvIzlho3mrKHov5DooYzlroPlsIbot7Pov4flhoXpg6jlpITnkIbjgIJcbiAgICAgKlxuICAgICAqIEBwYXJhbSAgICBvcHRpb24gICAgICBPcHRpb27nsbvnmoTlrp7kvotcbiAgICAgKlxuICAgICAqXG4gICAgICogQHJldHVybiAg5b2T5YeG5aSH6L+H56iL5a6M5oiQ5ZCO6L+U5ZueVHJ1ZeOAglxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc3RhcnRVcChvcHRpb246IE9wdGlvbiA9IG51bGwpOiBib29sZWFuIHtcbiAgICAgIGlmIChzX2lzU3RhcnRlZCkge1xuICAgICAgICBDdWJpc21Mb2dJbmZvKCdDdWJpc21GcmFtZXdvcmsuc3RhcnRVcCgpIGlzIGFscmVhZHkgZG9uZS4nKTtcbiAgICAgICAgcmV0dXJuIHNfaXNTdGFydGVkO1xuICAgICAgfVxuXG4gICAgICBzX29wdGlvbiA9IG9wdGlvbjtcblxuICAgICAgaWYgKHNfb3B0aW9uICE9IG51bGwpIHtcbiAgICAgICAgTGl2ZTJEQ3ViaXNtQ29yZS5Mb2dnaW5nLmNzbVNldExvZ0Z1bmN0aW9uKHNfb3B0aW9uLmxvZ0Z1bmN0aW9uKTtcbiAgICAgIH1cblxuICAgICAgc19pc1N0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgICAvLyBMaXZlMkQgQ3ViaXNtIENvcmXjg5Djg7zjgrjjg6fjg7Pmg4XloLHjgpLooajnpLog5p+l55yLTGl2ZTJE56uL5L2T5Li75LmJ5qC45b+D54mI5L+h5oGvXG4gICAgICBpZiAoc19pc1N0YXJ0ZWQpIHtcbiAgICAgICAgY29uc3QgdmVyc2lvbjogbnVtYmVyID0gTGl2ZTJEQ3ViaXNtQ29yZS5WZXJzaW9uLmNzbUdldFZlcnNpb24oKTtcbiAgICAgICAgY29uc3QgbWFqb3I6IG51bWJlciA9ICh2ZXJzaW9uICYgMHhmZjAwMDAwMCkgPj4gMjQ7XG4gICAgICAgIGNvbnN0IG1pbm9yOiBudW1iZXIgPSAodmVyc2lvbiAmIDB4MDBmZjAwMDApID4+IDE2O1xuICAgICAgICBjb25zdCBwYXRjaDogbnVtYmVyID0gdmVyc2lvbiAmIDB4MDAwMGZmZmY7XG4gICAgICAgIGNvbnN0IHZlcnNpb25OdW1iZXI6IG51bWJlciA9IHZlcnNpb247XG5cbiAgICAgICAgQ3ViaXNtTG9nSW5mbyhcbiAgICAgICAgICBgTGl2ZTJEIEN1YmlzbSBDb3JlIHZlcnNpb246IHswfS57MX0uezJ9ICh7M30pYCxcbiAgICAgICAgICAoJzAwJyArIG1ham9yKS5zbGljZSgtMiksXG4gICAgICAgICAgKCcwMCcgKyBtaW5vcikuc2xpY2UoLTIpLFxuICAgICAgICAgICgnMDAwMCcgKyBwYXRjaCkuc2xpY2UoLTQpLFxuICAgICAgICAgIHZlcnNpb25OdW1iZXJcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgQ3ViaXNtTG9nSW5mbygnQ3ViaXNtRnJhbWV3b3JrLnN0YXJ0VXAoKSBpcyBjb21wbGV0ZS4nKTtcblxuICAgICAgcmV0dXJuIHNfaXNTdGFydGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJ0VXAoKeOBp+WIneacn+WMluOBl+OBn0N1YmlzbUZyYW1ld29ya+OBruWQhOODkeODqeODoeODvOOCv+OCkuOCr+ODquOCouOBl+OBvuOBmeOAglxuICAgICAqIOa4hemZpOeUsVN0YXJ0VXAoKeWIneWni+WMlueahEN1YmlzbUZyYW1ld29ya+eahOavj+S4quWPguaVsOOAglxuICAgICAqIERpc3Bvc2UoKeOBl+OBn0N1YmlzbUZyYW1ld29ya+OCkuWGjeWIqeeUqOOBmeOCi+mam+OBq+WIqeeUqOOBl+OBpuOBj+OBoOOBleOBhOOAglxuICAgICAqIOivt+WcqOWGjeasoeWIqeeUqOW3skRpc3Bvc2XnmoRDdWJpc21GcmFtZXdvcmvml7bkvb/nlKjjgIJcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNsZWFuVXAoKTogdm9pZCB7XG4gICAgICBzX2lzU3RhcnRlZCA9IGZhbHNlO1xuICAgICAgc19pc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICBzX29wdGlvbiA9IG51bGw7XG4gICAgICBzX2N1YmlzbUlkTWFuYWdlciA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3ViaXNtIEZyYW1ld29ya+WGheOBruODquOCveODvOOCueOCkuWIneacn+WMluOBl+OBpuODouODh+ODq+OCkuihqOekuuWPr+iDveOBqueKtuaFi+OBq+OBl+OBvuOBmeOAgjxicj5cbiAgICAgKiAgICAg5Yid5aeL5YyWQ3ViaXNtIEZyYW1ld29ya+S4reeahOi1hOa6kO+8jOS9v+aooeWei+WPr+S7peafpeeci+OAglxuICAgICAqICAgICDlho3luqZJbml0aWFsaXplKCnjgZnjgovjgavjga/lhYjjgatEaXNwb3NlKCnjgpLlrp/ooYzjgZnjgovlv4XopoHjgYzjgYLjgorjgb7jgZnjgIJcbiAgICAgKiAgICAg5Li65LqG5YaN5qyh5Yid5aeL5YyWKCnvvIzlv4XpobvlhYjov5DooYxEaXNwb3NlKCnjgIJcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgICBDU01fQVNTRVJUKHNfaXNTdGFydGVkKTtcbiAgICAgIGlmICghc19pc1N0YXJ0ZWQpIHtcbiAgICAgICAgQ3ViaXNtTG9nV2FybmluZygnQ3ViaXNtRnJhbWV3b3JrIGlzIG5vdCBzdGFydGVkLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIC0tLSBzX2lzSW5pdGlhbGl6ZWTjgavjgojjgovpgKPntprliJ3mnJ/ljJbjgqzjg7zjg4kg6YCa6L+Hc19pc0luaXRpYWxpemVk6Ziy5q2i6L+e57ut5Yid5aeL5YyW44CCIC0tLVxuICAgICAgLy8g6YCj57aa44GX44Gm44Oq44K944O844K556K65L+d44GM6KGM44KP44KM44Gq44GE44KI44GG44Gr44GZ44KL44CCIOehruS/nei1hOa6kOS4jei/nue7reOAglxuICAgICAgLy8g5YaN5bqmSW5pdGlhbGl6ZSgp44GZ44KL44Gr44Gv5YWI44GrRGlzcG9zZSgp44KS5a6f6KGM44GZ44KL5b+F6KaB44GM44GC44KL44CCIOWmguaenOS9oOaDs+WGjeasoeWIneWni+WMligp77yM6ZyA6KaB5YWI5omn6KGMRGlzcG9zZSgp44CCXG4gICAgICBpZiAoc19pc0luaXRpYWxpemVkKSB7XG4gICAgICAgIEN1YmlzbUxvZ1dhcm5pbmcoXG4gICAgICAgICAgJ0N1YmlzbUZyYW1ld29yay5pbml0aWFsaXplKCkgc2tpcHBlZCwgYWxyZWFkeSBpbml0aWFsaXplZC4nXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8tLS0tIHN0YXRpYyDliJ3mnJ/ljJYgLS0tLVxuICAgICAgVmFsdWUuc3RhdGljSW5pdGlhbGl6ZU5vdEZvckNsaWVudENhbGwoKTtcblxuICAgICAgc19jdWJpc21JZE1hbmFnZXIgPSBuZXcgQ3ViaXNtSWRNYW5hZ2VyKCk7XG5cbiAgICAgIHNfaXNJbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgIEN1YmlzbUxvZ0luZm8oJ0N1YmlzbUZyYW1ld29yay5pbml0aWFsaXplKCkgaXMgY29tcGxldGUuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3ViaXNtIEZyYW1ld29ya+WGheOBruWFqOOBpuOBruODquOCveODvOOCueOCkuino+aUvuOBl+OBvuOBmeOAglxuICAgICAqICAgICAg44Gf44Gg44GX44CB5aSW6YOo44Gn56K65L+d44GV44KM44Gf44Oq44K944O844K544Gr44Gk44GE44Gm44Gv6Kej5pS+44GX44G+44Gb44KT44CCXG4gICAgICogICAgICDlpJbpg6jjgafpganliIfjgavnoLTmo4TjgZnjgovlv4XopoHjgYzjgYLjgorjgb7jgZnjgIJcbiAgICAgKiAgICAgIOmHiuaUvkN1YmlzbSBGcmFtZXdvcmvkuK3nmoTmiYDmnInotYTmupDjgIJcbiAgICAgKiAgICAgIOS9huaYr++8jOaIkeS7rOS4jeS8mumHiuaUvuWklumDqOi1hOa6kOOAglxuICAgICAqICAgICAg6ZyA6KaB5Zyo5aSW6YOo5aal5ZaE6ZSA5q+B44CCXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgQ1NNX0FTU0VSVChzX2lzU3RhcnRlZCk7XG4gICAgICBpZiAoIXNfaXNTdGFydGVkKSB7XG4gICAgICAgIEN1YmlzbUxvZ1dhcm5pbmcoJ0N1YmlzbUZyYW1ld29yayBpcyBub3Qgc3RhcnRlZC4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyAtLS0gc19pc0luaXRpYWxpemVk5pyq5Yid5aeL5YyW55qE6YeK5pS+5L+d5oqkIC0tLVxuICAgICAgLy8g6KaBZGlzcG9zZSgp77yM6ZyA6KaB5YWI5omn6KGMaW5pdGlhbGl6ZSgp44CCXG4gICAgICBpZiAoIXNfaXNJbml0aWFsaXplZCkge1xuICAgICAgICAvLyBmYWxzZS4uLuODquOCveODvOOCueacqueiuuS/neOBruWgtOWQiCBmYWxzZS7jgILotYTmupDmnKrnoa7kv53nmoTmg4XlhrVcbiAgICAgICAgQ3ViaXNtTG9nV2FybmluZygnQ3ViaXNtRnJhbWV3b3JrLmRpc3Bvc2UoKSBza2lwcGVkLCBub3QgaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgVmFsdWUuc3RhdGljUmVsZWFzZU5vdEZvckNsaWVudENhbGwoKTtcblxuICAgICAgc19jdWJpc21JZE1hbmFnZXIucmVsZWFzZSgpO1xuICAgICAgc19jdWJpc21JZE1hbmFnZXIgPSBudWxsO1xuXG4gICAgICAvLyDjg6zjg7Pjg4Djg6njga7pnZnnmoTjg6rjgr3jg7zjgrnvvIjjgrfjgqfjg7zjg4Djg5fjg63jgrDjg6njg6Dku5bvvInjgpLop6PmlL7jgZnjgotcbiAgICAgIC8vIOmHiuaUvua4suafk+WZqOeahOmdmeaAgei1hOa6kCjnnYDoibLlmajnqIvluo/nrYkpXG4gICAgICBDdWJpc21SZW5kZXJlci5zdGF0aWNSZWxlYXNlKCk7XG5cbiAgICAgIHNfaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICBDdWJpc21Mb2dJbmZvKCdDdWJpc21GcmFtZXdvcmsuZGlzcG9zZSgpIGlzIGNvbXBsZXRlLicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaYr+WQpuW3suWHhuWkh+WlveS9v+eUqEZyYW1ld29yayBBUElcbiAgICAgKiBAcmV0dXJuIOWmguaenOaCqOWHhuWkh+WlveS9v+eUqEFQSe+8jOWImei/lOWbnnRydWXjgIJcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzU3RhcnRlZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBzX2lzU3RhcnRlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDdWJpc20gRnJhbWV3b3Jr44Gu44Oq44K944O844K55Yid5pyf5YyW44GM44GZ44Gn44Gr6KGM44KP44KM44Gm44GE44KL44GL44Gp44GG44GLXG4gICAgICog5omn6KGM5LiA5Liq57uR5a6a5YiwIENvcmUgQVBJIOeahOaXpeW/l+WHveaVsOOAglxuICAgICAqIEByZXR1cm4g5aaC5p6c6LWE5rqQ5YiG6YWN5a6M5oiQ77yM5YiZ6L+U5ZueVHJ1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNJbml0aWFsaXplZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBzX2lzSW5pdGlhbGl6ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29yZSBBUEnjgavjg5DjgqTjg7Pjg4njgZfjgZ/jg63jgrDplqLmlbDjgpLlrp/ooYzjgZnjgotcbiAgICAgKlxuICAgICAqIEBwcmFyYW0gbWVzc2FnZSDjg63jgrDjg6Hjg4Pjgrvjg7zjgrhcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNvcmVMb2dGdW5jdGlvbihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIC8vIFJldHVybiBpZiBsb2dnaW5nIG5vdCBwb3NzaWJsZS5cbiAgICAgIGlmICghTGl2ZTJEQ3ViaXNtQ29yZS5Mb2dnaW5nLmNzbUdldExvZ0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBMaXZlMkRDdWJpc21Db3JlLkxvZ2dpbmcuY3NtR2V0TG9nRnVuY3Rpb24oKShtZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDov5Tlm57lvZPliY3ml6Xlv5fovpPlh7rnuqfliKvorr7nva7nmoTlgLzjgIJcbiAgICAgKlxuICAgICAqIEByZXR1cm4g5b2T5YmN5pel5b+X6L6T5Ye657qn5Yir6K6+572u5YC8XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRMb2dnaW5nTGV2ZWwoKTogTG9nTGV2ZWwge1xuICAgICAgaWYgKHNfb3B0aW9uICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHNfb3B0aW9uLmxvZ2dpbmdMZXZlbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBMb2dMZXZlbC5Mb2dMZXZlbF9PZmY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6I635Y+WSUTnrqHnkIblmajnmoTlrp7kvotcbiAgICAgKiBAcmV0dXJuIEN1YmlzbU1hbmFnZXLnsbvnmoTlrp7kvotcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldElkTWFuYWdlcigpOiBDdWJpc21JZE1hbmFnZXIge1xuICAgICAgcmV0dXJuIHNfY3ViaXNtSWRNYW5hZ2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOengeacieWMluaehOmAoOWZqFxuICAgICAqIOeUqOS9nOmdmeaAgeexu1xuICAgICAqIOS4jeimgeWunuS+i+WMllxuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPcHRpb24ge1xuICBsb2dGdW5jdGlvbjogTGl2ZTJEQ3ViaXNtQ29yZS5jc21Mb2dGdW5jdGlvbjsgLy8g5pel5b+X6L6T5Ye655qE5Yqf6IO95a+56LGhXG4gIGxvZ2dpbmdMZXZlbDogTG9nTGV2ZWw7IC8vIOiuvue9ruaXpeW/l+i+k+WHuue6p+WIq1xufVxuXG4vKipcbiAqIOaXpeW/l+i+k+WHuue6p+WIq1xuICovXG5leHBvcnQgZW51bSBMb2dMZXZlbCB7XG4gIExvZ0xldmVsX1ZlcmJvc2UgPSAwLCAvLyDor6bnu4bml6Xlv5dcbiAgTG9nTGV2ZWxfRGVidWcsIC8vIOiwg+ivleaXpeW/l1xuICBMb2dMZXZlbF9JbmZvLCAvLyDkv6Hmga/ml6Xlv5dcbiAgTG9nTGV2ZWxfV2FybmluZywgLy8g6K2m5ZGK5pel5b+XXG4gIExvZ0xldmVsX0Vycm9yLCAvLyDplJnor6/ml6Xlv5dcbiAgTG9nTGV2ZWxfT2ZmIC8vIOaXpeW/l+i+k+WHuuemgeeUqFxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvKipcbiAgICog44OZ44Kv44K/44O85Z6L77yI5Y+v5aSJ6YWN5YiX5Z6L77yJXG4gICAqL1xuICBleHBvcnQgY2xhc3MgY3NtVmVjdG9yPFQ+IHtcbiAgICAvKipcbiAgICAgKiDlvJXmlbDku5jjgY3jgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICAgKiBAcGFyYW0gaW5paXRhbENhcGFjaXR5IOWIneacn+WMluW+jOOBruOCreODo+ODkeOCt+ODhuOCo+OAguODh+ODvOOCv+OCteOCpOOCuuOBr19jYXBhY2l0eSAqIHNpemVvZihUKVxuICAgICAqIEBwYXJhbSB6ZXJvQ2xlYXIgdHJ1ZeOBquOCieWIneacn+WMluaZguOBq+eiuuS/neOBl+OBn+mgmOWfn+OCkjDjgafln4vjgoHjgotcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihpbml0aWFsQ2FwYWNpdHkgPSAwKSB7XG4gICAgICBpZiAoaW5pdGlhbENhcGFjaXR5IDwgMSkge1xuICAgICAgICB0aGlzLl9wdHIgPSBbXTtcbiAgICAgICAgdGhpcy5fY2FwYWNpdHkgPSAwO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3B0ciA9IG5ldyBBcnJheShpbml0aWFsQ2FwYWNpdHkpO1xuICAgICAgICB0aGlzLl9jYXBhY2l0eSA9IGluaXRpYWxDYXBhY2l0eTtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kk44Oz44OH44OD44Kv44K544Gn5oyH5a6a44GX44Gf6KaB57Sg44KS6L+U44GZXG4gICAgICovXG4gICAgcHVibGljIGF0KGluZGV4OiBudW1iZXIpOiBUIHtcbiAgICAgIHJldHVybiB0aGlzLl9wdHJbaW5kZXhdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOimgee0oOOCkuOCu+ODg+ODiFxuICAgICAqIEBwYXJhbSBpbmRleCDopoHntKDjgpLjgrvjg4Pjg4jjgZnjgovjgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcGFyYW0gdmFsdWUg44K744OD44OI44GZ44KL6KaB57SgXG4gICAgICovXG4gICAgcHVibGljIHNldChpbmRleDogbnVtYmVyLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgICAgdGhpcy5fcHRyW2luZGV4XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCs+ODs+ODhuODiuOCkuWPluW+l+OBmeOCi1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQob2Zmc2V0ID0gMCk6IFRbXSB7XG4gICAgICBjb25zdCByZXQ6IFRbXSA9IG5ldyBBcnJheTxUPigpO1xuICAgICAgZm9yIChsZXQgaSA9IG9mZnNldDsgaSA8IHRoaXMuX3NpemU7IGkrKykge1xuICAgICAgICByZXQucHVzaCh0aGlzLl9wdHJbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwdXNoQmFja+WHpueQhuOAgeOCs+ODs+ODhuODiuOBq+aWsOOBn+OBquimgee0oOOCkui/veWKoOOBmeOCi1xuICAgICAqIEBwYXJhbSB2YWx1ZSBQdXNoQmFja+WHpueQhuOBp+i/veWKoOOBmeOCi+WApFxuICAgICAqL1xuICAgIHB1YmxpYyBwdXNoQmFjayh2YWx1ZTogVCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuX3NpemUgPj0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlQ2FwYWNpdHkoXG4gICAgICAgICAgdGhpcy5fY2FwYWNpdHkgPT0gMCA/IGNzbVZlY3Rvci5zX2RlZmF1bHRTaXplIDogdGhpcy5fY2FwYWNpdHkgKiAyXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3B0clt0aGlzLl9zaXplKytdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kz44Oz44OG44OK44Gu5YWo6KaB57Sg44KS6Kej5pS+44GZ44KLXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgdGhpcy5fcHRyLmxlbmd0aCA9IDA7XG4gICAgICB0aGlzLl9zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjg4bjg4rjga7opoHntKDmlbDjgpLov5TjgZlcbiAgICAgKiBAcmV0dXJuIOOCs+ODs+ODhuODiuOBruimgee0oOaVsFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTaXplKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjg4bjg4rjga7lhajopoHntKDjgavlr77jgZfjgabku6PlhaXlh6bnkIbjgpLooYzjgYZcbiAgICAgKiBAcGFyYW0gbmV3U2l6ZSDku6PlhaXlh6bnkIblvozjga7jgrXjgqTjgrpcbiAgICAgKiBAcGFyYW0gdmFsdWUg6KaB57Sg44Gr5Luj5YWl44GZ44KL5YCkXG4gICAgICovXG4gICAgcHVibGljIGFzc2lnbihuZXdTaXplOiBudW1iZXIsIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgICBjb25zdCBjdXJTaXplID0gdGhpcy5fc2l6ZTtcblxuICAgICAgaWYgKGN1clNpemUgPCBuZXdTaXplKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZUNhcGFjaXR5KG5ld1NpemUpOyAvLyBjYXBhY2l0eeabtOaWsFxuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NpemU7IGkrKykge1xuICAgICAgICB0aGlzLl9wdHJbaV0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2l6ZSA9IG5ld1NpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44K144Kk44K65aSJ5pu0XG4gICAgICovXG4gICAgcHVibGljIHJlc2l6ZShuZXdTaXplOiBudW1iZXIsIHZhbHVlOiBUID0gbnVsbCk6IHZvaWQge1xuICAgICAgdGhpcy51cGRhdGVTaXplKG5ld1NpemUsIHZhbHVlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgrXjgqTjgrrlpInmm7RcbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlU2l6ZShcbiAgICAgIG5ld1NpemU6IG51bWJlcixcbiAgICAgIHZhbHVlOiBhbnkgPSBudWxsLFxuICAgICAgY2FsbFBsYWNlbWVudE5ldyA9IHRydWVcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IGN1clNpemU6IG51bWJlciA9IHRoaXMuX3NpemU7XG5cbiAgICAgIGlmIChjdXJTaXplIDwgbmV3U2l6ZSkge1xuICAgICAgICB0aGlzLnByZXBhcmVDYXBhY2l0eShuZXdTaXplKTsgLy8gY2FwYWNpdHnmm7TmlrBcblxuICAgICAgICBpZiAoY2FsbFBsYWNlbWVudE5ldykge1xuICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHRoaXMuX3NpemU7IGkgPCBuZXdTaXplOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAvLyBuZXdcbiAgICAgICAgICAgICAgdGhpcy5fcHRyW2ldID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShuZXcgdmFsdWUoKSkpO1xuICAgICAgICAgICAgfSAvLyDjg5fjg6rjg5/jg4bjgqPjg5blnovjgarjga7jgaflgKTmuKHjgZdcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9wdHJbaV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gdGhpcy5fc2l6ZTsgaSA8IG5ld1NpemU7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fcHRyW2ldID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBuZXdTaXplIDw9IHRoaXMuX3NpemVcbiAgICAgICAgLy8tLS1cbiAgICAgICAgY29uc3Qgc3ViID0gdGhpcy5fc2l6ZSAtIG5ld1NpemU7XG4gICAgICAgIHRoaXMuX3B0ci5zcGxpY2UodGhpcy5fc2l6ZSAtIHN1Yiwgc3ViKTsgLy8g5LiN6KaB44Gq44Gu44Gn56C05qOE44GZ44KLXG4gICAgICB9XG4gICAgICB0aGlzLl9zaXplID0gbmV3U2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjg4bjg4rjgavjgrPjg7Pjg4bjg4ropoHntKDjgpLmjL/lhaXjgZnjgotcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24g5oy/5YWl44GZ44KL5L2N572uXG4gICAgICogQHBhcmFtIGJlZ2luIOaMv+WFpeOBmeOCi+OCs+ODs+ODhuODiuOBrumWi+Wni+S9jee9rlxuICAgICAqIEBwYXJhbSBlbmQg5oy/5YWl44GZ44KL44Kz44Oz44OG44OK44Gu57WC56uv5L2N572uXG4gICAgICovXG4gICAgcHVibGljIGluc2VydChcbiAgICAgIHBvc2l0aW9uOiBpdGVyYXRvcjxUPixcbiAgICAgIGJlZ2luOiBpdGVyYXRvcjxUPixcbiAgICAgIGVuZDogaXRlcmF0b3I8VD5cbiAgICApOiB2b2lkIHtcbiAgICAgIGxldCBkc3RTaTogbnVtYmVyID0gcG9zaXRpb24uX2luZGV4O1xuICAgICAgY29uc3Qgc3JjU2k6IG51bWJlciA9IGJlZ2luLl9pbmRleDtcbiAgICAgIGNvbnN0IHNyY0VpOiBudW1iZXIgPSBlbmQuX2luZGV4O1xuXG4gICAgICBjb25zdCBhZGRDb3VudDogbnVtYmVyID0gc3JjRWkgLSBzcmNTaTtcblxuICAgICAgdGhpcy5wcmVwYXJlQ2FwYWNpdHkodGhpcy5fc2l6ZSArIGFkZENvdW50KTtcblxuICAgICAgLy8g5oy/5YWl55So44Gu5pei5a2Y44OH44O844K/44KS44K344OV44OI44GX44Gm6ZqZ6ZaT44KS5L2c44KLXG4gICAgICBjb25zdCBhZGRTaXplID0gdGhpcy5fc2l6ZSAtIGRzdFNpO1xuICAgICAgaWYgKGFkZFNpemUgPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkU2l6ZTsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5fcHRyLnNwbGljZShkc3RTaSArIGksIDAsIG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHNyY1NpOyBpIDwgc3JjRWk7IGkrKywgZHN0U2krKykge1xuICAgICAgICB0aGlzLl9wdHJbZHN0U2ldID0gYmVnaW4uX3ZlY3Rvci5fcHRyW2ldO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zaXplID0gdGhpcy5fc2l6ZSArIGFkZENvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCs+ODs+ODhuODiuOBi+OCieOCpOODs+ODh+ODg+OCr+OCueOBp+aMh+WumuOBl+OBn+imgee0oOOCkuWJiumZpOOBmeOCi1xuICAgICAqIEBwYXJhbSBpbmRleCDjgqTjg7Pjg4fjg4Pjgq/jgrnlgKRcbiAgICAgKiBAcmV0dXJuIHRydWUg5YmK6Zmk5a6f6KGMXG4gICAgICogQHJldHVybiBmYWxzZSDliYrpmaTnr4Tlm7LlpJZcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgIGlmIChpbmRleCA8IDAgfHwgdGhpcy5fc2l6ZSA8PSBpbmRleCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIOWJiumZpOevhOWbsuWkllxuICAgICAgfVxuXG4gICAgICB0aGlzLl9wdHIuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIC0tdGhpcy5fc2l6ZTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kz44Oz44OG44OK44GL44KJ6KaB57Sg44KS5YmK6Zmk44GX44Gm5LuW44Gu6KaB57Sg44KS44K344OV44OI44GZ44KLXG4gICAgICogQHBhcmFtIGl0ZSDliYrpmaTjgZnjgovopoHntKBcbiAgICAgKi9cbiAgICBwdWJsaWMgZXJhc2UoaXRlOiBpdGVyYXRvcjxUPik6IGl0ZXJhdG9yPFQ+IHtcbiAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSBpdGUuX2luZGV4O1xuICAgICAgaWYgKGluZGV4IDwgMCB8fCB0aGlzLl9zaXplIDw9IGluZGV4KSB7XG4gICAgICAgIHJldHVybiBpdGU7IC8vIOWJiumZpOevhOWbsuWkllxuICAgICAgfVxuXG4gICAgICAvLyDliYrpmaRcbiAgICAgIHRoaXMuX3B0ci5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgLS10aGlzLl9zaXplO1xuXG4gICAgICBjb25zdCBpdGUyOiBpdGVyYXRvcjxUPiA9IG5ldyBpdGVyYXRvcjxUPih0aGlzLCBpbmRleCk7IC8vIOe1guS6hlxuICAgICAgcmV0dXJuIGl0ZTI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kz44Oz44OG44OK44Gu44Kt44Oj44OR44K344OG44Kj44KS56K65L+d44GZ44KLXG4gICAgICogQHBhcmFtIG5ld1NpemUg5paw44Gf44Gq44Kt44Oj44OR44K344OG44Kj44CC5byV5pWw44Gu5YCk44GM54++5Zyo44Gu44K144Kk44K65pyq5rqA44Gu5aC05ZCI44Gv5L2V44KC44GX44Gq44GELlxuICAgICAqL1xuICAgIHB1YmxpYyBwcmVwYXJlQ2FwYWNpdHkobmV3U2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICBpZiAobmV3U2l6ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgIGlmICh0aGlzLl9jYXBhY2l0eSA9PSAwKSB7XG4gICAgICAgICAgdGhpcy5fcHRyID0gbmV3IEFycmF5KG5ld1NpemUpO1xuICAgICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gbmV3U2l6ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9wdHIubGVuZ3RoID0gbmV3U2l6ZTtcbiAgICAgICAgICB0aGlzLl9jYXBhY2l0eSA9IG5ld1NpemU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjg4bjg4rjga7lhYjpoK3opoHntKDjgpLov5TjgZlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVnaW4oKTogaXRlcmF0b3I8VD4ge1xuICAgICAgY29uc3QgaXRlOiBpdGVyYXRvcjxUPiA9XG4gICAgICAgIHRoaXMuX3NpemUgPT0gMCA/IHRoaXMuZW5kKCkgOiBuZXcgaXRlcmF0b3I8VD4odGhpcywgMCk7XG4gICAgICByZXR1cm4gaXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCs+ODs+ODhuODiuOBrue1guerr+imgee0oOOCkui/lOOBmVxuICAgICAqL1xuICAgIHB1YmxpYyBlbmQoKTogaXRlcmF0b3I8VD4ge1xuICAgICAgY29uc3QgaXRlOiBpdGVyYXRvcjxUPiA9IG5ldyBpdGVyYXRvcjxUPih0aGlzLCB0aGlzLl9zaXplKTtcbiAgICAgIHJldHVybiBpdGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9mZnNldChvZmZzZXQ6IG51bWJlcik6IGNzbVZlY3RvcjxUPiB7XG4gICAgICBjb25zdCBuZXdWZWN0b3IgPSBuZXcgY3NtVmVjdG9yPFQ+KCk7XG4gICAgICBuZXdWZWN0b3IuX3B0ciA9IHRoaXMuZ2V0KG9mZnNldCk7XG4gICAgICBuZXdWZWN0b3IuX3NpemUgPSB0aGlzLmdldChvZmZzZXQpLmxlbmd0aDtcbiAgICAgIG5ld1ZlY3Rvci5fY2FwYWNpdHkgPSB0aGlzLmdldChvZmZzZXQpLmxlbmd0aDtcblxuICAgICAgcmV0dXJuIG5ld1ZlY3RvcjtcbiAgICB9XG5cbiAgICBfcHRyOiBUW107IC8vIOOCs+ODs+ODhuODiuOBruWFiOmgreOCouODieODrOOCuVxuICAgIF9zaXplOiBudW1iZXI7IC8vIOOCs+ODs+ODhuODiuOBruimgee0oOaVsFxuICAgIF9jYXBhY2l0eTogbnVtYmVyOyAvLyDjgrPjg7Pjg4bjg4rjga7jgq3jg6Pjg5Hjgrfjg4bjgqNcblxuICAgIHN0YXRpYyByZWFkb25seSBzX2RlZmF1bHRTaXplID0gMTA7IC8vIOOCs+ODs+ODhuODiuWIneacn+WMluOBruODh+ODleOCqeODq+ODiOOCteOCpOOCulxuICB9XG5cbiAgZXhwb3J0IGNsYXNzIGl0ZXJhdG9yPFQ+IHtcbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3Iodj86IGNzbVZlY3RvcjxUPiwgaW5kZXg/OiBudW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZlY3RvciA9IHYgIT0gdW5kZWZpbmVkID8gdiA6IG51bGw7XG4gICAgICB0aGlzLl9pbmRleCA9IGluZGV4ICE9IHVuZGVmaW5lZCA/IGluZGV4IDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDku6PlhaVcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0KGl0ZTogaXRlcmF0b3I8VD4pOiBpdGVyYXRvcjxUPiB7XG4gICAgICB0aGlzLl9pbmRleCA9IGl0ZS5faW5kZXg7XG4gICAgICB0aGlzLl92ZWN0b3IgPSBpdGUuX3ZlY3RvcjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWJjee9ruOBjSsr5ryU566XXG4gICAgICovXG4gICAgcHVibGljIHByZUluY3JlbWVudCgpOiBpdGVyYXRvcjxUPiB7XG4gICAgICArK3RoaXMuX2luZGV4O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5YmN572u44GNLS3mvJTnrpdcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlRGVjcmVtZW50KCk6IGl0ZXJhdG9yPFQ+IHtcbiAgICAgIC0tdGhpcy5faW5kZXg7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlvoznva7jgY0rK+a8lOeul+WtkFxuICAgICAqL1xuICAgIHB1YmxpYyBpbmNyZW1lbnQoKTogaXRlcmF0b3I8VD4ge1xuICAgICAgY29uc3QgaXRlb2xkID0gbmV3IGl0ZXJhdG9yPFQ+KHRoaXMuX3ZlY3RvciwgdGhpcy5faW5kZXgrKyk7XG4gICAgICB0aGlzLl92ZWN0b3IgPSBpdGVvbGQuX3ZlY3RvcjtcbiAgICAgIHRoaXMuX2luZGV4ID0gaXRlb2xkLl9pbmRleDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOW+jOe9ruOBjS0t5ryU566X5a2QXG4gICAgICovXG4gICAgcHVibGljIGRlY3JlbWVudCgpOiBpdGVyYXRvcjxUPiB7XG4gICAgICBjb25zdCBpdGVvbGQgPSBuZXcgaXRlcmF0b3I8VD4odGhpcy5fdmVjdG9yLCB0aGlzLl9pbmRleC0tKTsgLy8g5Y+k44GE5YCk44KS5L+d5a2YXG4gICAgICB0aGlzLl92ZWN0b3IgPSBpdGVvbGQuX3ZlY3RvcjtcbiAgICAgIHRoaXMuX2luZGV4ID0gaXRlb2xkLl9pbmRleDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHB0clxuICAgICAqL1xuICAgIHB1YmxpYyBwdHIoKTogVCB7XG4gICAgICByZXR1cm4gdGhpcy5fdmVjdG9yLl9wdHJbdGhpcy5faW5kZXhdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqID3mvJTnrpflrZDjga7jgqrjg7zjg5Djg7zjg63jg7zjg4lcbiAgICAgKi9cbiAgICBwdWJsaWMgc3Vic3RpdHV0aW9uKGl0ZTogaXRlcmF0b3I8VD4pOiBpdGVyYXRvcjxUPiB7XG4gICAgICB0aGlzLl9pbmRleCA9IGl0ZS5faW5kZXg7XG4gICAgICB0aGlzLl92ZWN0b3IgPSBpdGUuX3ZlY3RvcjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICE95ryU566X5a2Q44Gu44Kq44O844OQ44O844Ot44O844OJXG4gICAgICovXG4gICAgcHVibGljIG5vdEVxdWFsKGl0ZTogaXRlcmF0b3I8VD4pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbmRleCAhPSBpdGUuX2luZGV4IHx8IHRoaXMuX3ZlY3RvciAhPSBpdGUuX3ZlY3RvcjtcbiAgICB9XG5cbiAgICBfaW5kZXg6IG51bWJlcjsgLy8g44Kz44Oz44OG44OK44Gu44Kk44Oz44OH44OD44Kv44K55YCkXG4gICAgX3ZlY3RvcjogY3NtVmVjdG9yPFQ+OyAvLyDjgrPjg7Pjg4bjg4pcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuaW1wb3J0IHtcbiAgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWZyYW1ld29yayxcbiAgTG9nTGV2ZWxcbn0gZnJvbSAnLi4vbGl2ZTJkY3ViaXNtZnJhbWV3b3JrJztcbmltcG9ydCB7XG4gIENTTV9MT0dfTEVWRUwsXG4gIENTTV9MT0dfTEVWRUxfVkVSQk9TRSxcbiAgQ1NNX0xPR19MRVZFTF9ERUJVRyxcbiAgQ1NNX0xPR19MRVZFTF9JTkZPLFxuICBDU01fTE9HX0xFVkVMX1dBUk5JTkcsXG4gIENTTV9MT0dfTEVWRUxfRVJST1Jcbn0gZnJvbSAnLi4vY3ViaXNtZnJhbWV3b3JrY29uZmlnJztcblxuZXhwb3J0IGNvbnN0IEN1YmlzbUxvZ1ByaW50ID0gKGxldmVsOiBMb2dMZXZlbCwgZm10OiBzdHJpbmcsIGFyZ3M6IGFueVtdKSA9PiB7XG4gIExpdmUyREN1YmlzbUZyYW1ld29yay5DdWJpc21EZWJ1Zy5wcmludChsZXZlbCwgJ1tDU01dJyArIGZtdCwgYXJncyk7XG59O1xuXG5leHBvcnQgY29uc3QgQ3ViaXNtTG9nUHJpbnRJbiA9IChsZXZlbDogTG9nTGV2ZWwsIGZtdDogc3RyaW5nLCBhcmdzOiBhbnlbXSkgPT4ge1xuICBDdWJpc21Mb2dQcmludChsZXZlbCwgZm10ICsgJ1xcbicsIGFyZ3MpO1xufTtcblxuZXhwb3J0IGNvbnN0IENTTV9BU1NFUlQgPSAoZXhwcjogYW55KSA9PiB7XG4gIGNvbnNvbGUuYXNzZXJ0KGV4cHIpO1xufTtcblxuZXhwb3J0IGxldCBDdWJpc21Mb2dWZXJib3NlOiAoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuZXhwb3J0IGxldCBDdWJpc21Mb2dEZWJ1ZzogKGZtdDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbmV4cG9ydCBsZXQgQ3ViaXNtTG9nSW5mbzogKGZtdDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbmV4cG9ydCBsZXQgQ3ViaXNtTG9nV2FybmluZzogKGZtdDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbmV4cG9ydCBsZXQgQ3ViaXNtTG9nRXJyb3I6IChmbXQ6IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG5cbmlmIChDU01fTE9HX0xFVkVMIDw9IENTTV9MT0dfTEVWRUxfVkVSQk9TRSkge1xuICBDdWJpc21Mb2dWZXJib3NlID0gKGZtdDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgIEN1YmlzbUxvZ1ByaW50SW4oTG9nTGV2ZWwuTG9nTGV2ZWxfVmVyYm9zZSwgJ1tWXScgKyBmbXQsIGFyZ3MpO1xuICB9O1xuXG4gIEN1YmlzbUxvZ0RlYnVnID0gKGZtdDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgIEN1YmlzbUxvZ1ByaW50SW4oTG9nTGV2ZWwuTG9nTGV2ZWxfRGVidWcsICdbRF0nICsgZm10LCBhcmdzKTtcbiAgfTtcblxuICBDdWJpc21Mb2dJbmZvID0gKGZtdDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgIEN1YmlzbUxvZ1ByaW50SW4oTG9nTGV2ZWwuTG9nTGV2ZWxfSW5mbywgJ1tJXScgKyBmbXQsIGFyZ3MpO1xuICB9O1xuXG4gIEN1YmlzbUxvZ1dhcm5pbmcgPSAoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgQ3ViaXNtTG9nUHJpbnRJbihMb2dMZXZlbC5Mb2dMZXZlbF9XYXJuaW5nLCAnW1ddJyArIGZtdCwgYXJncyk7XG4gIH07XG5cbiAgQ3ViaXNtTG9nRXJyb3IgPSAoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgQ3ViaXNtTG9nUHJpbnRJbihMb2dMZXZlbC5Mb2dMZXZlbF9FcnJvciwgJ1tFXScgKyBmbXQsIGFyZ3MpO1xuICB9O1xufSBlbHNlIGlmIChDU01fTE9HX0xFVkVMID09IENTTV9MT0dfTEVWRUxfREVCVUcpIHtcbiAgQ3ViaXNtTG9nRGVidWcgPSAoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgQ3ViaXNtTG9nUHJpbnRJbihMb2dMZXZlbC5Mb2dMZXZlbF9EZWJ1ZywgJ1tEXScgKyBmbXQsIGFyZ3MpO1xuICB9O1xuXG4gIEN1YmlzbUxvZ0luZm8gPSAoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgQ3ViaXNtTG9nUHJpbnRJbihMb2dMZXZlbC5Mb2dMZXZlbF9JbmZvLCAnW0ldJyArIGZtdCwgYXJncyk7XG4gIH07XG5cbiAgQ3ViaXNtTG9nV2FybmluZyA9IChmbXQ6IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IHtcbiAgICBDdWJpc21Mb2dQcmludEluKExvZ0xldmVsLkxvZ0xldmVsX1dhcm5pbmcsICdbV10nICsgZm10LCBhcmdzKTtcbiAgfTtcblxuICBDdWJpc21Mb2dFcnJvciA9IChmbXQ6IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IHtcbiAgICBDdWJpc21Mb2dQcmludEluKExvZ0xldmVsLkxvZ0xldmVsX0Vycm9yLCAnW0VdJyArIGZtdCwgYXJncyk7XG4gIH07XG59IGVsc2UgaWYgKENTTV9MT0dfTEVWRUwgPT0gQ1NNX0xPR19MRVZFTF9JTkZPKSB7XG4gIEN1YmlzbUxvZ0luZm8gPSAoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgQ3ViaXNtTG9nUHJpbnRJbihMb2dMZXZlbC5Mb2dMZXZlbF9JbmZvLCAnW0ldJyArIGZtdCwgYXJncyk7XG4gIH07XG5cbiAgQ3ViaXNtTG9nV2FybmluZyA9IChmbXQ6IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IHtcbiAgICBDdWJpc21Mb2dQcmludEluKExvZ0xldmVsLkxvZ0xldmVsX1dhcm5pbmcsICdbV10nICsgZm10LCBhcmdzKTtcbiAgfTtcblxuICBDdWJpc21Mb2dFcnJvciA9IChmbXQ6IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IHtcbiAgICBDdWJpc21Mb2dQcmludEluKExvZ0xldmVsLkxvZ0xldmVsX0Vycm9yLCAnW0VdJyArIGZtdCwgYXJncyk7XG4gIH07XG59IGVsc2UgaWYgKENTTV9MT0dfTEVWRUwgPT0gQ1NNX0xPR19MRVZFTF9XQVJOSU5HKSB7XG4gIEN1YmlzbUxvZ1dhcm5pbmcgPSAoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgQ3ViaXNtTG9nUHJpbnRJbihMb2dMZXZlbC5Mb2dMZXZlbF9XYXJuaW5nLCAnW1ddJyArIGZtdCwgYXJncyk7XG4gIH07XG5cbiAgQ3ViaXNtTG9nRXJyb3IgPSAoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgQ3ViaXNtTG9nUHJpbnRJbihMb2dMZXZlbC5Mb2dMZXZlbF9FcnJvciwgJ1tFXScgKyBmbXQsIGFyZ3MpO1xuICB9O1xufSBlbHNlIGlmIChDU01fTE9HX0xFVkVMID09IENTTV9MT0dfTEVWRUxfRVJST1IpIHtcbiAgQ3ViaXNtTG9nRXJyb3IgPSAoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgQ3ViaXNtTG9nUHJpbnRJbihMb2dMZXZlbC5Mb2dMZXZlbF9FcnJvciwgJ1tFXScgKyBmbXQsIGFyZ3MpO1xuICB9O1xufVxuXG4vLy0tLS0tLS0tLS0tLSBMSVZFMkQgTkFNRVNQQUNFIC0tLS0tLS0tLS0tLVxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvKipcbiAgICog44OH44OQ44OD44Kw55So44Gu44Om44O844OG44Kj44Oq44OG44Kj44Kv44Op44K544CCXG4gICAqIOODreOCsOOBruWHuuWKm+OAgeODkOOCpOODiOOBruODgOODs+ODl+OBquOBqVxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbURlYnVnIHtcbiAgICAvKipcbiAgICAgKiDjg63jgrDjgpLlh7rlipvjgZnjgovjgILnrKzkuIDlvJXmlbDjgavjg63jgrDjg6zjg5njg6vjgpLoqK3lrprjgZnjgovjgIJcbiAgICAgKiBDdWJpc21GcmFtZXdvcmsuaW5pdGlhbGl6ZSgp5pmC44Gr44Kq44OX44K344On44Oz44Gn6Kit5a6a44GV44KM44Gf44Ot44Kw5Ye65Yqb44Os44OZ44Or44KS5LiL5Zue44KL5aC05ZCI44Gv44Ot44Kw44Gr5Ye644GV44Gq44GE44CCXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG9nTGV2ZWwg44Ot44Kw44Os44OZ44Or44Gu6Kit5a6aXG4gICAgICogQHBhcmFtIGZvcm1hdCDmm7jlvI/ku5jjgY3mloflrZfliJdcbiAgICAgKiBAcGFyYW0gYXJncyDlj6/lpInplbflvJXmlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHByaW50KFxuICAgICAgbG9nTGV2ZWw6IExvZ0xldmVsLFxuICAgICAgZm9ybWF0OiBzdHJpbmcsXG4gICAgICBhcmdzPzogYW55W11cbiAgICApOiB2b2lkIHtcbiAgICAgIC8vIOOCquODl+OCt+ODp+ODs+OBp+ioreWumuOBleOCjOOBn+ODreOCsOWHuuWKm+ODrOODmeODq+OCkuS4i+WbnuOCi+WgtOWQiOOBr+ODreOCsOOBq+WHuuOBleOBquOBhFxuICAgICAgaWYgKGxvZ0xldmVsIDwgY3ViaXNtZnJhbWV3b3JrLkN1YmlzbUZyYW1ld29yay5nZXRMb2dnaW5nTGV2ZWwoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvZ1ByaW50OiBMaXZlMkRDdWJpc21Db3JlLmNzbUxvZ0Z1bmN0aW9uID1cbiAgICAgICAgY3ViaXNtZnJhbWV3b3JrLkN1YmlzbUZyYW1ld29yay5jb3JlTG9nRnVuY3Rpb247XG5cbiAgICAgIGlmICghbG9nUHJpbnQpIHJldHVybjtcblxuICAgICAgY29uc3QgYnVmZmVyOiBzdHJpbmcgPSBmb3JtYXQucmVwbGFjZSgvXFx7KFxcZCspXFx9L2csIChtLCBrKSA9PiB7XG4gICAgICAgIHJldHVybiBhcmdzW2tdO1xuICAgICAgfSk7XG4gICAgICBsb2dQcmludChidWZmZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODh+ODvOOCv+OBi+OCieaMh+WumuOBl+OBn+mVt+OBleOBoOOBkeODgOODs+ODl+WHuuWKm+OBmeOCi+OAglxuICAgICAqIEN1YmlzbUZyYW1ld29yay5pbml0aWFsaXplKCnmmYLjgavjgqrjg5fjgrfjg6fjg7PjgafoqK3lrprjgZXjgozjgZ/jg63jgrDlh7rlipvjg6zjg5njg6vjgpLkuIvlm57jgovloLTlkIjjga/jg63jgrDjgavlh7rjgZXjgarjgYTjgIJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb2dMZXZlbCDjg63jgrDjg6zjg5njg6vjga7oqK3lrppcbiAgICAgKiBAcGFyYW0gZGF0YSDjg4Djg7Pjg5fjgZnjgovjg4fjg7zjgr9cbiAgICAgKiBAcGFyYW0gbGVuZ3RoIOODgOODs+ODl+OBmeOCi+mVt+OBlVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZHVtcEJ5dGVzKFxuICAgICAgbG9nTGV2ZWw6IExvZ0xldmVsLFxuICAgICAgZGF0YTogVWludDhBcnJheSxcbiAgICAgIGxlbmd0aDogbnVtYmVyXG4gICAgKTogdm9pZCB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpICUgMTYgPT0gMCAmJiBpID4gMCkgdGhpcy5wcmludChsb2dMZXZlbCwgJ1xcbicpO1xuICAgICAgICBlbHNlIGlmIChpICUgOCA9PSAwICYmIGkgPiAwKSB0aGlzLnByaW50KGxvZ0xldmVsLCAnICAnKTtcbiAgICAgICAgdGhpcy5wcmludChsb2dMZXZlbCwgJ3swfSAnLCBbZGF0YVtpXSAmIDB4ZmZdKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcmludChsb2dMZXZlbCwgJ1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHByaXZhdGUg44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICovXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gIH1cbn1cblxuLy8tLS0tLS0tLS0tLS0gTElWRTJEIE5BTUVTUEFDRSAtLS0tLS0tLS0tLS1cbiIsIi8qKlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGhlIExpdmUyRCBPcGVuIFNvZnR3YXJlIGxpY2Vuc2VcbiAqIHRoYXQgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmxpdmUyZC5jb20vZXVsYS9saXZlMmQtb3Blbi1zb2Z0d2FyZS1saWNlbnNlLWFncmVlbWVudF9lbi5odG1sLlxuICovXG5cbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjc21zdHJpbmcgfSBmcm9tICcuLi90eXBlL2NzbXN0cmluZyc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3NtbWFwIH0gZnJvbSAnLi4vdHlwZS9jc21tYXAnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGNzbXZlY3RvciB9IGZyb20gJy4uL3R5cGUvY3NtdmVjdG9yJztcbmltcG9ydCB7IEN1YmlzbUxvZ0luZm8gfSBmcm9tICcuL2N1YmlzbWRlYnVnJztcbmltcG9ydCB7IHN0cnRvZCB9IGZyb20gJy4uL2xpdmUyZGN1YmlzbWZyYW1ld29yayc7XG5pbXBvcnQgY3NtVmVjdG9yID0gY3NtdmVjdG9yLmNzbVZlY3RvcjtcbmltcG9ydCBjc21WZWN0b3JfaXRlcmF0b3IgPSBjc212ZWN0b3IuaXRlcmF0b3I7XG5pbXBvcnQgY3NtTWFwID0gY3NtbWFwLmNzbU1hcDtcbmltcG9ydCBjc21NYXBfaXRlcmF0b3IgPSBjc21tYXAuaXRlcmF0b3I7XG5pbXBvcnQgY3NtU3RyaW5nID0gY3Ntc3RyaW5nLmNzbVN0cmluZztcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvLyBTdGF0aWNJbml0aWFsaXplTm90Rm9yQ2xpZW50Q2FsbCgp44Gn5Yid5pyf5YyW44GZ44KLXG4gIGNvbnN0IENTTV9KU09OX0VSUk9SX1RZUEVfTUlTTUFUQ0ggPSAnRXJyb3I6IHR5cGUgbWlzbWF0Y2gnO1xuICBjb25zdCBDU01fSlNPTl9FUlJPUl9JTkRFWF9PRl9CT1VORFMgPSAnRXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMnO1xuXG4gIC8qKlxuICAgKiDjg5Hjg7zjgrnjgZfjgZ9KU09O44Ko44Os44Oh44Oz44OI44Gu6KaB57Sg44Gu5Z+65bqV44Kv44Op44K544CCXG4gICAqL1xuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgVmFsdWUge1xuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICAvKipcbiAgICAgKiDopoHntKDjgpLmloflrZfliJflnovjgafov5TjgZkoY3NtU3RyaW5n5Z6LKVxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRTdHJpbmcoZGVmYXVsdFZhbHVlPzogc3RyaW5nLCBpbmRlbnQ/OiBzdHJpbmcpOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiDopoHntKDjgpLmloflrZfliJflnovjgafov5TjgZkoc3RyaW5nKVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSYXdTdHJpbmcoZGVmYXVsdFZhbHVlPzogc3RyaW5nLCBpbmRlbnQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGRlZmF1bHRWYWx1ZSwgaW5kZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDopoHntKDjgpLmlbDlgKTlnovjgafov5TjgZkobnVtYmVyKVxuICAgICAqL1xuICAgIHB1YmxpYyB0b0ludChkZWZhdWx0VmFsdWUgPSAwKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6KaB57Sg44KS5pWw5YCk5Z6L44Gn6L+U44GZKG51bWJlcilcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9GbG9hdChkZWZhdWx0VmFsdWUgPSAwKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6KaB57Sg44KS55yf5YG95YCk44Gn6L+U44GZKGJvb2xlYW4pXG4gICAgICovXG4gICAgcHVibGljIHRvQm9vbGVhbihkZWZhdWx0VmFsdWUgPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgrXjgqTjgrrjgpLov5TjgZlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2l6ZSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6KaB57Sg44KS6YWN5YiX44Gn6L+U44GZKFZhbHVlW10pXG4gICAgICovXG4gICAgcHVibGljIGdldEFycmF5KGRlZmF1bHRWYWx1ZTogVmFsdWVbXSA9IG51bGwpOiBWYWx1ZVtdIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6KaB57Sg44KS44Kz44Oz44OG44OK44Gn6L+U44GZKGFycmF5KVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWZWN0b3IoZGVmYXVsdFZhbHVlPzogY3NtVmVjdG9yPFZhbHVlPik6IGNzbVZlY3RvcjxWYWx1ZT4ge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDopoHntKDjgpLjg57jg4Pjg5fjgafov5TjgZkoY3NtTWFwPGNzbVN0cmluZywgVmFsdWU+KVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNYXAoZGVmYXVsdFZhbHVlPzogY3NtTWFwPHN0cmluZywgVmFsdWU+KTogY3NtTWFwPHN0cmluZywgVmFsdWU+IHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5re75a2X5ryU566X5a2QW2luZGV4XVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZUJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IFZhbHVlIHtcbiAgICAgIHJldHVybiBWYWx1ZS5lcnJvclZhbHVlLnNldEVycm9yTm90Rm9yQ2xpZW50Q2FsbChcbiAgICAgICAgQ1NNX0pTT05fRVJST1JfVFlQRV9NSVNNQVRDSFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmt7vlrZfmvJTnrpflrZBbc3RyaW5nIHwgY3NtU3RyaW5nXVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZUJ5U3RyaW5nKHM6IHN0cmluZyB8IGNzbVN0cmluZyk6IFZhbHVlIHtcbiAgICAgIHJldHVybiBWYWx1ZS5udWxsVmFsdWUuc2V0RXJyb3JOb3RGb3JDbGllbnRDYWxsKFxuICAgICAgICBDU01fSlNPTl9FUlJPUl9UWVBFX01JU01BVENIXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODnuODg+ODl+OBruOCreODvOS4gOimp+OCkuOCs+ODs+ODhuODiuOBp+i/lOOBmVxuICAgICAqXG4gICAgICogQHJldHVybiDjg57jg4Pjg5fjga7jgq3jg7zjga7kuIDopqdcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0S2V5cygpOiBjc21WZWN0b3I8c3RyaW5nPiB7XG4gICAgICByZXR1cm4gVmFsdWUuc19kdW1teUtleXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsdWXjga7nqK7poZ7jgYzjgqjjg6njg7zlgKTjgarjgol0cnVlXG4gICAgICovXG4gICAgcHVibGljIGlzRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsdWXjga7nqK7poZ7jgYxudWxs44Gq44KJdHJ1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBpc051bGwoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsdWXjga7nqK7poZ7jgYznnJ/lgb3lgKTjgarjgol0cnVlXG4gICAgICovXG4gICAgcHVibGljIGlzQm9vbCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWx1ZeOBrueorumhnuOBjOaVsOWApOWei+OBquOCiXRydWVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGbG9hdCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWx1ZeOBrueorumhnuOBjOaWh+Wtl+WIl+OBquOCiXRydWVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdHJpbmcoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsdWXjga7nqK7poZ7jgYzphY3liJfjgarjgol0cnVlXG4gICAgICovXG4gICAgcHVibGljIGlzQXJyYXkoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsdWXjga7nqK7poZ7jgYzjg57jg4Pjg5flnovjgarjgol0cnVlXG4gICAgICovXG4gICAgcHVibGljIGlzTWFwKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOW8leaVsOOBruWApOOBqOetieOBl+OBkeOCjOOBsHRydWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZXF1YWxzKHZhbHVlOiBjc21TdHJpbmcpOiBib29sZWFuO1xuICAgIHB1YmxpYyBlcXVhbHModmFsdWU6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgcHVibGljIGVxdWFscyh2YWx1ZTogbnVtYmVyKTogYm9vbGVhbjtcbiAgICBwdWJsaWMgZXF1YWxzKHZhbHVlOiBib29sZWFuKTogYm9vbGVhbjtcbiAgICBwdWJsaWMgZXF1YWxzKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWx1ZeOBruWApOOBjOmdmeeahOOBquOCiXRydWXjgIHpnZnnmoTjgarjgonop6PmlL7jgZfjgarjgYRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdGF0aWMoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsdWXjgavjgqjjg6njg7zlgKTjgpLjgrvjg4Pjg4jjgZnjgotcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RXJyb3JOb3RGb3JDbGllbnRDYWxsKGVycm9yU3RyOiBzdHJpbmcpOiBWYWx1ZSB7XG4gICAgICByZXR1cm4gSnNvbkVycm9yLmVycm9yVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yid5pyf5YyW55So44Oh44K944OD44OJXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzdGF0aWNJbml0aWFsaXplTm90Rm9yQ2xpZW50Q2FsbCgpOiB2b2lkIHtcbiAgICAgIEpzb25Cb29sZWFuLnRydWVWYWx1ZSA9IG5ldyBKc29uQm9vbGVhbih0cnVlKTtcbiAgICAgIEpzb25Cb29sZWFuLmZhbHNlVmFsdWUgPSBuZXcgSnNvbkJvb2xlYW4oZmFsc2UpO1xuXG4gICAgICBKc29uRXJyb3IuZXJyb3JWYWx1ZSA9IG5ldyBKc29uRXJyb3IoJ0VSUk9SJywgdHJ1ZSk7XG4gICAgICB0aGlzLm51bGxWYWx1ZSA9IG5ldyBKc29uTnVsbHZhbHVlKCk7XG5cbiAgICAgIFZhbHVlLnNfZHVtbXlLZXlzID0gbmV3IGNzbVZlY3RvcjxzdHJpbmc+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oq44Oq44O844K555So44Oh44K944OD44OJXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzdGF0aWNSZWxlYXNlTm90Rm9yQ2xpZW50Q2FsbCgpOiB2b2lkIHtcbiAgICAgIEpzb25Cb29sZWFuLnRydWVWYWx1ZSA9IG51bGw7XG4gICAgICBKc29uQm9vbGVhbi5mYWxzZVZhbHVlID0gbnVsbDtcbiAgICAgIEpzb25FcnJvci5lcnJvclZhbHVlID0gbnVsbDtcbiAgICAgIFZhbHVlLm51bGxWYWx1ZSA9IG51bGw7XG4gICAgICBWYWx1ZS5zX2R1bW15S2V5cyA9IG51bGw7XG5cbiAgICAgIEpzb25Cb29sZWFuLnRydWVWYWx1ZSA9IG51bGw7XG4gICAgICBKc29uQm9vbGVhbi5mYWxzZVZhbHVlID0gbnVsbDtcbiAgICAgIEpzb25FcnJvci5lcnJvclZhbHVlID0gbnVsbDtcbiAgICAgIFZhbHVlLm51bGxWYWx1ZSA9IG51bGw7XG4gICAgICBWYWx1ZS5zX2R1bW15S2V5cyA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9zdHJpbmdCdWZmZXI6IHN0cmluZzsgLy8g5paH5a2X5YiX44OQ44OD44OV44KhXG5cbiAgICBwcml2YXRlIHN0YXRpYyBzX2R1bW15S2V5czogY3NtVmVjdG9yPHN0cmluZz47IC8vIOODgOODn+ODvOOCreODvFxuXG4gICAgcHVibGljIHN0YXRpYyBlcnJvclZhbHVlOiBWYWx1ZTsgLy8g5LiA5pmC55qE44Gq6L+U44KK5YCk44Go44GX44Gm6L+U44GZ44Ko44Op44O844CCIEN1YmlzbUZyYW1ld29yazo6RGlzcG9zZeOBmeOCi+OBvuOBp+OBr2RlbGV0ZeOBl+OBquOBhFxuICAgIHB1YmxpYyBzdGF0aWMgbnVsbFZhbHVlOiBWYWx1ZTsgLy8g5LiA5pmC55qE44Gq6L+U44KK5YCk44Go44GX44Gm6L+U44GZTlVMTOOAgiAgIEN1YmlzbUZyYW1ld29yazo6RGlzcG9zZeOBmeOCi+OBvuOBp+OBr2RlbGV0ZeOBl+OBquOBhFxuICB9XG5cbiAgLyoqXG4gICAqIEFzY2lp5paH5a2X44Gu44G/5a++5b+c44GX44Gf5pyA5bCP6ZmQ44Gu6Lu96YePSlNPTuODkeODvOOCteOAglxuICAgKiDku5Xmp5jjga9KU09O44Gu44K144OW44K744OD44OI44Go44Gq44KL44CCXG4gICAqIOioreWumuODleOCoeOCpOODqyhtb2RlbDMuanNvbinjgarjganjga7jg63jg7zjg4nnlKhcbiAgICpcbiAgICogW+acquWvvuW/nOmgheebrl1cbiAgICog44O75pel5pys6Kqe44Gq44Gp44Gu6Z2eQVNDSUnmloflrZdcbiAgICog44O7ZeOBq+OCiOOCi+aMh+aVsOihqOePvlxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbUpzb24ge1xuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihidWZmZXI/OiBBcnJheUJ1ZmZlciwgbGVuZ3RoPzogbnVtYmVyKSB7XG4gICAgICB0aGlzLl9lcnJvciA9IG51bGw7XG4gICAgICB0aGlzLl9saW5lQ291bnQgPSAwO1xuICAgICAgdGhpcy5fcm9vdCA9IG51bGw7XG5cbiAgICAgIGlmIChidWZmZXIgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucGFyc2VCeXRlcyhidWZmZXIsIGxlbmd0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OQ44Kk44OI44OH44O844K/44GL44KJ55u05o6l44Ot44O844OJ44GX44Gm44OR44O844K544GZ44KLXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnVmZmVyIOODkOODg+ODleOCoVxuICAgICAqIEBwYXJhbSBzaXplIOODkOODg+ODleOCoeOCteOCpOOCulxuICAgICAqIEByZXR1cm4gQ3ViaXNtSnNvbuOCr+ODqeOCueOBruOCpOODs+OCueOCv+ODs+OCueOAguWkseaVl+OBl+OBn+OCiU5VTExcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShidWZmZXI6IEFycmF5QnVmZmVyLCBzaXplOiBudW1iZXIpIHtcbiAgICAgIGNvbnN0IGpzb24gPSBuZXcgQ3ViaXNtSnNvbigpO1xuICAgICAgY29uc3Qgc3VjY2VlZGVkOiBib29sZWFuID0ganNvbi5wYXJzZUJ5dGVzKGJ1ZmZlciwgc2l6ZSk7XG5cbiAgICAgIGlmICghc3VjY2VlZGVkKSB7XG4gICAgICAgIEN1YmlzbUpzb24uZGVsZXRlKGpzb24pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODkeODvOOCueOBl+OBn0pTT07jgqrjg5bjgrjjgqfjgq/jg4jjga7op6PmlL7lh6bnkIZcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBDdWJpc21Kc29u44Kv44Op44K544Gu44Kk44Oz44K544K/44Oz44K5XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkZWxldGUoaW5zdGFuY2U6IEN1YmlzbUpzb24pIHtcbiAgICAgIGluc3RhbmNlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Hjg7zjgrnjgZfjgZ9KU09O44Gu44Or44O844OI6KaB57Sg44KS6L+U44GZXG4gICAgICovXG4gICAgcHVibGljIGdldFJvb3QoKTogVmFsdWUge1xuICAgICAgcmV0dXJuIHRoaXMuX3Jvb3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIFVuaWNvZGXjga7jg5DjgqTjg4rjg6rjgpJTdHJpbmfjgavlpInmj5tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBidWZmZXIg5aSJ5o+b44GZ44KL44OQ44Kk44OK44Oq44OH44O844K/XG4gICAgICogQHJldHVybiDlpInmj5vlvozjga7mloflrZfliJdcbiAgICAgKi9cbiAgICBwdWJsaWMgYXJyYXlCdWZmZXJUb1N0cmluZyhidWZmZXI6IEFycmF5QnVmZmVyKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IHVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgICAgbGV0IHN0ciA9ICcnO1xuXG4gICAgICBmb3IgKGxldCBpID0gMCwgbGVuOiBudW1iZXIgPSB1aW50OEFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgIHN0ciArPSAnJScgKyB0aGlzLnBhZCh1aW50OEFycmF5W2ldLnRvU3RyaW5nKDE2KSk7XG4gICAgICB9XG5cbiAgICAgIHN0ciA9IGRlY29kZVVSSUNvbXBvbmVudChzdHIpO1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgqjjg7PjgrPjg7zjg4njgIHjg5Hjg4fjgqPjg7PjgrBcbiAgICAgKi9cbiAgICBwcml2YXRlIHBhZChuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIG4ubGVuZ3RoIDwgMiA/ICcwJyArIG4gOiBuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEpTT07jga7jg5Hjg7zjgrnjgpLlrp/ooYzjgZnjgotcbiAgICAgKiBAcGFyYW0gYnVmZmVyICAgIOODkeODvOOCueWvvuixoeOBruODh+ODvOOCv+ODkOOCpOODiFxuICAgICAqIEBwYXJhbSBzaXplICAgICAg44OH44O844K/44OQ44Kk44OI44Gu44K144Kk44K6XG4gICAgICogcmV0dXJuIHRydWUgOiDmiJDlip9cbiAgICAgKiByZXR1cm4gZmFsc2U6IOWkseaVl1xuICAgICAqL1xuICAgIHB1YmxpYyBwYXJzZUJ5dGVzKGJ1ZmZlcjogQXJyYXlCdWZmZXIsIHNpemU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgZW5kUG9zOiBudW1iZXJbXSA9IG5ldyBBcnJheSgxKTsgLy8g5Y+C54Wn5rih44GX44Gr44GZ44KL44Gf44KB6YWN5YiXXG4gICAgICBjb25zdCBkZWNvZGVCdWZmZXI6IHN0cmluZyA9IHRoaXMuYXJyYXlCdWZmZXJUb1N0cmluZyhidWZmZXIpO1xuICAgICAgdGhpcy5fcm9vdCA9IHRoaXMucGFyc2VWYWx1ZShkZWNvZGVCdWZmZXIsIHNpemUsIDAsIGVuZFBvcyk7XG5cbiAgICAgIGlmICh0aGlzLl9lcnJvcikge1xuICAgICAgICBsZXQgc3RyYnVmID0gJ1xcMCc7XG4gICAgICAgIHN0cmJ1ZiA9ICdKc29uIHBhcnNlIGVycm9yIDogQGxpbmUgJyArICh0aGlzLl9saW5lQ291bnQgKyAxKSArICdcXG4nO1xuICAgICAgICB0aGlzLl9yb290ID0gbmV3IEpzb25TdHJpbmcoc3RyYnVmKTtcblxuICAgICAgICBDdWJpc21Mb2dJbmZvKCd7MH0nLCB0aGlzLl9yb290LmdldFJhd1N0cmluZygpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9yb290ID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fcm9vdCA9IG5ldyBKc29uRXJyb3IobmV3IGNzbVN0cmluZyh0aGlzLl9lcnJvciksIGZhbHNlKTsgLy8gcm9vdOOBr+ino+aUvuOBleOCjOOCi+OBruOBp+OCqOODqeODvOOCquODluOCuOOCp+OCr+ODiOOCkuWIpemAlOS9nOaIkOOBmeOCi1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Hjg7zjgrnmmYLjga7jgqjjg6njg7zlgKTjgpLov5TjgZlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGFyc2VFcnJvcigpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODq+ODvOODiOimgee0oOOBruasoeOBruimgee0oOOBjOODleOCoeOCpOODq+OBrue1guerr+OBoOOBo+OBn+OCiXRydWXjgpLov5TjgZlcbiAgICAgKi9cbiAgICBwdWJsaWMgY2hlY2tFbmRPZkZpbGUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5fcm9vdC5nZXRBcnJheSgpWzFdLmVxdWFscygnRU9GJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSlNPTuOCqOODrOODoeODs+ODiOOBi+OCiVZhbHVlKGZsb2F0LFN0cmluZyxWYWx1ZSosQXJyYXksbnVsbCx0cnVlLGZhbHNlKeOCkuODkeODvOOCueOBmeOCi1xuICAgICAqIOOCqOODrOODoeODs+ODiOOBruabuOW8j+OBq+W/nOOBmOOBpuWGhemDqOOBp1BhcnNlU3RyaW5nKCksIFBhcnNlT2JqZWN0KCksIFBhcnNlQXJyYXkoKeOCkuWRvOOBtlxuICAgICAqXG4gICAgICogQHBhcmFtICAgYnVmZmVyICAgICAgSlNPTuOCqOODrOODoeODs+ODiOOBruODkOODg+ODleOCoVxuICAgICAqIEBwYXJhbSAgIGxlbmd0aCAgICAgIOODkeODvOOCueOBmeOCi+mVt+OBlVxuICAgICAqIEBwYXJhbSAgIGJlZ2luICAgICAgIOODkeODvOOCueOCkumWi+Wni+OBmeOCi+S9jee9rlxuICAgICAqIEBwYXJhbSAgIG91dEVuZFBvcyAgIOODkeODvOOCuee1guS6huaZguOBruS9jee9rlxuICAgICAqIEByZXR1cm4gICAgICDjg5Hjg7zjgrnjgYvjgonlj5blvpfjgZfjgZ9WYWx1ZeOCquODluOCuOOCp+OCr+ODiFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwYXJzZVZhbHVlKFxuICAgICAgYnVmZmVyOiBzdHJpbmcsXG4gICAgICBsZW5ndGg6IG51bWJlcixcbiAgICAgIGJlZ2luOiBudW1iZXIsXG4gICAgICBvdXRFbmRQb3M6IG51bWJlcltdXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5fZXJyb3IpIHJldHVybiBudWxsO1xuXG4gICAgICBsZXQgbzogVmFsdWUgPSBudWxsO1xuICAgICAgbGV0IGk6IG51bWJlciA9IGJlZ2luO1xuICAgICAgbGV0IGY6IG51bWJlcjtcblxuICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjOiBzdHJpbmcgPSBidWZmZXJbaV07XG4gICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgIGNhc2UgJy0nOlxuICAgICAgICAgIGNhc2UgJy4nOlxuICAgICAgICAgIGNhc2UgJzAnOlxuICAgICAgICAgIGNhc2UgJzEnOlxuICAgICAgICAgIGNhc2UgJzInOlxuICAgICAgICAgIGNhc2UgJzMnOlxuICAgICAgICAgIGNhc2UgJzQnOlxuICAgICAgICAgIGNhc2UgJzUnOlxuICAgICAgICAgIGNhc2UgJzYnOlxuICAgICAgICAgIGNhc2UgJzcnOlxuICAgICAgICAgIGNhc2UgJzgnOlxuICAgICAgICAgIGNhc2UgJzknOiB7XG4gICAgICAgICAgICBjb25zdCBhZnRlclN0cmluZzogc3RyaW5nW10gPSBuZXcgQXJyYXkoMSk7IC8vIOWPgueFp+a4oeOBl+OBq+OBmeOCi+OBn+OCgVxuICAgICAgICAgICAgZiA9IHN0cnRvZChidWZmZXIuc2xpY2UoaSksIGFmdGVyU3RyaW5nKTtcbiAgICAgICAgICAgIG91dEVuZFBvc1swXSA9IGJ1ZmZlci5pbmRleE9mKGFmdGVyU3RyaW5nWzBdKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSnNvbkZsb2F0KGYpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEpzb25TdHJpbmcoXG4gICAgICAgICAgICAgIHRoaXMucGFyc2VTdHJpbmcoYnVmZmVyLCBsZW5ndGgsIGkgKyAxLCBvdXRFbmRQb3MpXG4gICAgICAgICAgICApOyAvLyBcXFwi44Gu5qyh44Gu5paH5a2X44GL44KJXG4gICAgICAgICAgY2FzZSAnWyc6XG4gICAgICAgICAgICBvID0gdGhpcy5wYXJzZUFycmF5KGJ1ZmZlciwgbGVuZ3RoLCBpICsgMSwgb3V0RW5kUG9zKTtcbiAgICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICAgIGNhc2UgJ3snOlxuICAgICAgICAgICAgbyA9IHRoaXMucGFyc2VPYmplY3QoYnVmZmVyLCBsZW5ndGgsIGkgKyAxLCBvdXRFbmRQb3MpO1xuICAgICAgICAgICAgcmV0dXJuIG87XG4gICAgICAgICAgY2FzZSAnbic6IC8vIG51bGzku6XlpJbjgavjgarjgYRcbiAgICAgICAgICAgIGlmIChpICsgMyA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICBvID0gbmV3IEpzb25OdWxsdmFsdWUoKTsgLy8g6Kej5pS+44Gn44GN44KL44KI44GG44Gr44GZ44KLXG4gICAgICAgICAgICAgIG91dEVuZFBvc1swXSA9IGkgKyA0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fZXJyb3IgPSAncGFyc2UgbnVsbCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgICBjYXNlICd0JzogLy8gdHJ1ZeS7peWkluOBq+OBquOBhFxuICAgICAgICAgICAgaWYgKGkgKyAzIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgIG8gPSBKc29uQm9vbGVhbi50cnVlVmFsdWU7XG4gICAgICAgICAgICAgIG91dEVuZFBvc1swXSA9IGkgKyA0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fZXJyb3IgPSAncGFyc2UgdHJ1ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbztcbiAgICAgICAgICBjYXNlICdmJzogLy8gZmFsc2Xku6XlpJbjgavjgarjgYRcbiAgICAgICAgICAgIGlmIChpICsgNCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICBvID0gSnNvbkJvb2xlYW4uZmFsc2VWYWx1ZTtcbiAgICAgICAgICAgICAgb3V0RW5kUG9zWzBdID0gaSArIDU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLl9lcnJvciA9IFwiaWxsZWdhbCAnLCcgcG9zaXRpb25cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICAgIGNhc2UgJywnOiAvLyBBcnJheSBzZXBhcmF0b3JcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gXCJpbGxlZ2FsICcsJyBwb3NpdGlvblwiO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgY2FzZSAnXSc6IC8vIOS4jeato+OBqu+9neOBoOOBjOOCueOCreODg+ODl+OBmeOCi+OAgumFjeWIl+OBruacgOW+jOOBq+S4jeimgeOBqiAsIOOBjOOBguOCi+OBqOaAneOCj+OCjOOCi1xuICAgICAgICAgICAgb3V0RW5kUG9zWzBdID0gaTsgLy8g5ZCM44GY5paH5a2X44KS5YaN5Yem55CGXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICBjYXNlICdcXG4nOlxuICAgICAgICAgICAgdGhpcy5fbGluZUNvdW50Kys7XG4gICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgY2FzZSAnXFx0JzpcbiAgICAgICAgICBjYXNlICdcXHInOlxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyDjgrnjgq3jg4Pjg5dcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2Vycm9yID0gJ2lsbGVnYWwgZW5kIG9mIHZhbHVlJztcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOasoeOBruOAjFwi44CN44G+44Gn44Gu5paH5a2X5YiX44KS44OR44O844K544GZ44KL44CCXG4gICAgICpcbiAgICAgKiBAcGFyYW0gICBzdHJpbmcgIC0+ICDjg5Hjg7zjgrnlr77osaHjga7mloflrZfliJdcbiAgICAgKiBAcGFyYW0gICBsZW5ndGggIC0+ICDjg5Hjg7zjgrnjgZnjgovplbfjgZVcbiAgICAgKiBAcGFyYW0gICBiZWdpbiAgIC0+ICDjg5Hjg7zjgrnjgpLplovlp4vjgZnjgovkvY3nva5cbiAgICAgKiBAcGFyYW0gIG91dEVuZFBvcyAgIC0+ICDjg5Hjg7zjgrnntYLkuobmmYLjga7kvY3nva5cbiAgICAgKiBAcmV0dXJuICAgICAg44OR44O844K544GX44Gf5paHRuWtl+WIl+imgee0oFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwYXJzZVN0cmluZyhcbiAgICAgIHN0cmluZzogc3RyaW5nLFxuICAgICAgbGVuZ3RoOiBudW1iZXIsXG4gICAgICBiZWdpbjogbnVtYmVyLFxuICAgICAgb3V0RW5kUG9zOiBudW1iZXJbXVxuICAgICk6IHN0cmluZyB7XG4gICAgICBpZiAodGhpcy5fZXJyb3IpIHJldHVybiBudWxsO1xuXG4gICAgICBsZXQgaSA9IGJlZ2luO1xuICAgICAgbGV0IGM6IHN0cmluZywgYzI6IHN0cmluZztcbiAgICAgIGNvbnN0IHJldDogY3NtU3RyaW5nID0gbmV3IGNzbVN0cmluZygnJyk7XG4gICAgICBsZXQgYnVmU3RhcnQ6IG51bWJlciA9IGJlZ2luOyAvLyBzYnVm44Gr55m76Yyy44GV44KM44Gm44GE44Gq44GE5paH5a2X44Gu6ZaL5aeL5L2N572uXG5cbiAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYyA9IHN0cmluZ1tpXTtcblxuICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICBjYXNlICdcIic6IHtcbiAgICAgICAgICAgIC8vIOe1guerr+OBruKAneOAgeOCqOOCueOCseODvOODl+aWh+Wtl+OBr+WIpeOBq+WHpueQhuOBleOCjOOCi+OBruOBp+OBk+OBk+OBq+adpeOBquOBhFxuICAgICAgICAgICAgb3V0RW5kUG9zWzBdID0gaSArIDE7IC8vIOKAneOBruasoeOBruaWh+Wtl1xuICAgICAgICAgICAgcmV0LmFwcGVuZChzdHJpbmcuc2xpY2UoYnVmU3RhcnQpLCBpIC0gYnVmU3RhcnQpOyAvLyDliY3jga7mloflrZfjgb7jgafjgpLnmbvpjLLjgZnjgotcbiAgICAgICAgICAgIHJldHVybiByZXQucztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnLy8nOiB7XG4gICAgICAgICAgICAvLyDjgqjjgrnjgrHjg7zjg5fjga7loLTlkIhcbiAgICAgICAgICAgIGkrKzsgLy8g77yS5paH5a2X44KS44K744OD44OI44Gn5omx44GGXG5cbiAgICAgICAgICAgIGlmIChpIC0gMSA+IGJ1ZlN0YXJ0KSB7XG4gICAgICAgICAgICAgIHJldC5hcHBlbmQoc3RyaW5nLnNsaWNlKGJ1ZlN0YXJ0KSwgaSAtIGJ1ZlN0YXJ0KTsgLy8g5YmN44Gu5paH5a2X44G+44Gn44KS55m76Yyy44GZ44KLXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZTdGFydCA9IGkgKyAxOyAvLyDjgqjjgrnjgrHjg7zjg5fvvIjvvJLmloflrZcp44Gu5qyh44Gu5paH5a2X44GL44KJXG5cbiAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGMyID0gc3RyaW5nW2ldO1xuXG4gICAgICAgICAgICAgIHN3aXRjaCAoYzIpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdcXFxcJzpcbiAgICAgICAgICAgICAgICAgIHJldC5leHBhbnNpb24oMSwgJ1xcXFwnKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgICAgICAgIHJldC5leHBhbnNpb24oMSwgJ1wiJyk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICcvJzpcbiAgICAgICAgICAgICAgICAgIHJldC5leHBhbnNpb24oMSwgJy8nKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2InOlxuICAgICAgICAgICAgICAgICAgcmV0LmV4cGFuc2lvbigxLCAnXFxiJyk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdmJzpcbiAgICAgICAgICAgICAgICAgIHJldC5leHBhbnNpb24oMSwgJ1xcZicpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbic6XG4gICAgICAgICAgICAgICAgICByZXQuZXhwYW5zaW9uKDEsICdcXG4nKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3InOlxuICAgICAgICAgICAgICAgICAgcmV0LmV4cGFuc2lvbigxLCAnXFxyJyk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd0JzpcbiAgICAgICAgICAgICAgICAgIHJldC5leHBhbnNpb24oMSwgJ1xcdCcpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICB0aGlzLl9lcnJvciA9ICdwYXJzZSBzdHJpbmcvdW5pY29yZCBlc2NhcGUgbm90IHN1cHBvcnRlZCc7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gJ3BhcnNlIHN0cmluZy9lc2NhcGUgZXJyb3InO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fZXJyb3IgPSAncGFyc2Ugc3RyaW5nL2lsbGVnYWwgZW5kJztcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEpTT07jga7jgqrjg5bjgrjjgqfjgq/jg4jjgqjjg6zjg6Hjg7Pjg4jjgpLjg5Hjg7zjgrnjgZfjgaZWYWx1ZeOCquODluOCuOOCp+OCr+ODiOOCkui/lOOBmVxuICAgICAqXG4gICAgICogQHBhcmFtIGJ1ZmZlciAgICBKU09O44Ko44Os44Oh44Oz44OI44Gu44OQ44OD44OV44KhXG4gICAgICogQHBhcmFtIGxlbmd0aCAgICDjg5Hjg7zjgrnjgZnjgovplbfjgZVcbiAgICAgKiBAcGFyYW0gYmVnaW4gICAgIOODkeODvOOCueOCkumWi+Wni+OBmeOCi+S9jee9rlxuICAgICAqIEBwYXJhbSBvdXRFbmRQb3Mg44OR44O844K557WC5LqG5pmC44Gu5L2N572uXG4gICAgICogQHJldHVybiDjg5Hjg7zjgrnjgYvjgonlj5blvpfjgZfjgZ9WYWx1ZeOCquODluOCuOOCp+OCr+ODiFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwYXJzZU9iamVjdChcbiAgICAgIGJ1ZmZlcjogc3RyaW5nLFxuICAgICAgbGVuZ3RoOiBudW1iZXIsXG4gICAgICBiZWdpbjogbnVtYmVyLFxuICAgICAgb3V0RW5kUG9zOiBudW1iZXJbXVxuICAgICk6IFZhbHVlIHtcbiAgICAgIGlmICh0aGlzLl9lcnJvcikgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCByZXQ6IEpzb25NYXAgPSBuZXcgSnNvbk1hcCgpO1xuXG4gICAgICAvLyBLZXk6IFZhbHVlXG4gICAgICBsZXQga2V5ID0gJyc7XG4gICAgICBsZXQgaTogbnVtYmVyID0gYmVnaW47XG4gICAgICBsZXQgYyA9ICcnO1xuICAgICAgY29uc3QgbG9jYWxSZXRFbmRQb3MyOiBudW1iZXJbXSA9IEFycmF5KDEpO1xuICAgICAgbGV0IG9rID0gZmFsc2U7XG5cbiAgICAgIC8vICwg44GM57aa44GP6ZmQ44KK44Or44O844OXXG4gICAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIEZPUl9MT09QOiBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgYyA9IGJ1ZmZlcltpXTtcblxuICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgY2FzZSAnXCInOlxuICAgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlU3RyaW5nKGJ1ZmZlciwgbGVuZ3RoLCBpICsgMSwgbG9jYWxSZXRFbmRQb3MyKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2Vycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpID0gbG9jYWxSZXRFbmRQb3MyWzBdO1xuICAgICAgICAgICAgICBvayA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrIEZPUl9MT09QOyAvLy0tIGxvb3DjgYvjgonlh7rjgotcbiAgICAgICAgICAgIGNhc2UgJ30nOiAvLyDplonjgZjjgqvjg4PjgrNcbiAgICAgICAgICAgICAgb3V0RW5kUG9zWzBdID0gaSArIDE7XG4gICAgICAgICAgICAgIHJldHVybiByZXQ7IC8vIOepulxuICAgICAgICAgICAgY2FzZSAnOic6XG4gICAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gXCJpbGxlZ2FsICc6JyBwb3NpdGlvblwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1xcbic6XG4gICAgICAgICAgICAgIHRoaXMuX2xpbmVDb3VudCsrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgYnJlYWs7IC8vIOOCueOCreODg+ODl+OBmeOCi+aWh+Wtl1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgdGhpcy5fZXJyb3IgPSAna2V5IG5vdCBmb3VuZCc7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBvayA9IGZhbHNlO1xuXG4gICAgICAgIC8vIDog44KS44OB44Kn44OD44KvXG4gICAgICAgIEZPUl9MT09QMjogZm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgIGMgPSBidWZmZXJbaV07XG5cbiAgICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICAgIGNhc2UgJzonOlxuICAgICAgICAgICAgICBvayA9IHRydWU7XG4gICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgYnJlYWsgRk9SX0xPT1AyO1xuICAgICAgICAgICAgY2FzZSAnfSc6XG4gICAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gXCJpbGxlZ2FsICd9JyBwb3NpdGlvblwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1xcbic6XG4gICAgICAgICAgICAgIHRoaXMuX2xpbmVDb3VudCsrO1xuICAgICAgICAgICAgLy8gY2FzZSAnICc6IGNhc2UgJ1xcdCcgOiBjYXNlICdcXHInOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgYnJlYWs7IC8vIOOCueOCreODg+ODl+OBmeOCi+aWh+Wtl1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICB0aGlzLl9lcnJvciA9IFwiJzonIG5vdCBmb3VuZFwiO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g5YCk44KS44OB44Kn44OD44KvXG4gICAgICAgIGNvbnN0IHZhbHVlOiBWYWx1ZSA9IHRoaXMucGFyc2VWYWx1ZShcbiAgICAgICAgICBidWZmZXIsXG4gICAgICAgICAgbGVuZ3RoLFxuICAgICAgICAgIGksXG4gICAgICAgICAgbG9jYWxSZXRFbmRQb3MyXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLl9lcnJvcikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaSA9IGxvY2FsUmV0RW5kUG9zMlswXTtcblxuICAgICAgICAvLyByZXQucHV0KGtleSwgdmFsdWUpO1xuICAgICAgICByZXQucHV0KGtleSwgdmFsdWUpO1xuXG4gICAgICAgIEZPUl9MT09QMzogZm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgIGMgPSBidWZmZXJbaV07XG5cbiAgICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICAgIGNhc2UgJywnOlxuICAgICAgICAgICAgICBicmVhayBGT1JfTE9PUDM7XG4gICAgICAgICAgICBjYXNlICd9JzpcbiAgICAgICAgICAgICAgb3V0RW5kUG9zWzBdID0gaSArIDE7XG4gICAgICAgICAgICAgIHJldHVybiByZXQ7IC8vIOato+W4uOe1guS6hlxuICAgICAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgICAgICAgdGhpcy5fbGluZUNvdW50Kys7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBicmVhazsgLy8g44K544Kt44OD44OXXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2Vycm9yID0gJ2lsbGVnYWwgZW5kIG9mIHBlcnNlT2JqZWN0JztcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOasoeOBruOAjFwi44CN44G+44Gn44Gu5paH5a2X5YiX44KS44OR44O844K544GZ44KL44CCXG4gICAgICogQHBhcmFtIGJ1ZmZlciAgICBKU09O44Ko44Os44Oh44Oz44OI44Gu44OQ44OD44OV44KhXG4gICAgICogQHBhcmFtIGxlbmd0aCAgICDjg5Hjg7zjgrnjgZnjgovplbfjgZVcbiAgICAgKiBAcGFyYW0gYmVnaW4gICAgIOODkeODvOOCueOCkumWi+Wni+OBmeOCi+S9jee9rlxuICAgICAqIEBwYXJhbSBvdXRFbmRQb3Mg44OR44O844K557WC5LqG5pmC44Gu5L2N572uXG4gICAgICogQHJldHVybiDjg5Hjg7zjgrnjgYvjgonlj5blvpfjgZfjgZ9WYWx1ZeOCquODluOCuOOCp+OCr+ODiFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwYXJzZUFycmF5KFxuICAgICAgYnVmZmVyOiBzdHJpbmcsXG4gICAgICBsZW5ndGg6IG51bWJlcixcbiAgICAgIGJlZ2luOiBudW1iZXIsXG4gICAgICBvdXRFbmRQb3M6IG51bWJlcltdXG4gICAgKTogVmFsdWUge1xuICAgICAgaWYgKHRoaXMuX2Vycm9yKSByZXR1cm4gbnVsbDtcbiAgICAgIGxldCByZXQ6IEpzb25BcnJheSA9IG5ldyBKc29uQXJyYXkoKTtcblxuICAgICAgLy8ga2V5IDogdmFsdWVcbiAgICAgIGxldCBpOiBudW1iZXIgPSBiZWdpbjtcbiAgICAgIGxldCBjOiBzdHJpbmc7XG4gICAgICBjb25zdCBsb2NhbFJldEVuZHBvczI6IG51bWJlcltdID0gbmV3IEFycmF5KDEpO1xuXG4gICAgICAvLyAsIOOBjOe2muOBj+mZkOOCiuODq+ODvOODl1xuICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAvLyA6IOOCkuODgeOCp+ODg+OCr1xuICAgICAgICBjb25zdCB2YWx1ZTogVmFsdWUgPSB0aGlzLnBhcnNlVmFsdWUoXG4gICAgICAgICAgYnVmZmVyLFxuICAgICAgICAgIGxlbmd0aCxcbiAgICAgICAgICBpLFxuICAgICAgICAgIGxvY2FsUmV0RW5kcG9zMlxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aGlzLl9lcnJvcikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGkgPSBsb2NhbFJldEVuZHBvczJbMF07XG5cbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgcmV0LmFkZCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGT1JfTE9PUDM6XG4gICAgICAgIC8vIGJvb2xlYW4gYnJlYWtmbGFnID0gZmFsc2U7XG4gICAgICAgIEZPUl9MT09QOiBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgYyA9IGJ1ZmZlcltpXTtcblxuICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgY2FzZSAnLCc6XG4gICAgICAgICAgICAgIC8vIGJyZWFrZmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgIC8vIGJyZWFrOyAvLyDmrKHjga5LRVksIFZBbFVF44G4XG4gICAgICAgICAgICAgIGJyZWFrIEZPUl9MT09QO1xuICAgICAgICAgICAgY2FzZSAnXSc6XG4gICAgICAgICAgICAgIG91dEVuZFBvc1swXSA9IGkgKyAxO1xuICAgICAgICAgICAgICByZXR1cm4gcmV0OyAvLyDntYLkuoZcbiAgICAgICAgICAgIGNhc2UgJ1xcbic6XG4gICAgICAgICAgICAgICsrdGhpcy5fbGluZUNvdW50O1xuICAgICAgICAgICAgLy9jYXNlICcgJzogY2FzZSAnXFx0JzogY2FzZSAnXFxyJzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGJyZWFrOyAvLyDjgrnjgq3jg4Pjg5dcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0ID0gdm9pZCAwO1xuICAgICAgdGhpcy5fZXJyb3IgPSAnaWxsZWdhbCBlbmQgb2YgcGFyc2VPYmplY3QnO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgX2Vycm9yOiBzdHJpbmc7IC8vIOODkeODvOOCueaZguOBruOCqOODqeODvFxuICAgIF9saW5lQ291bnQ6IG51bWJlcjsgLy8g44Ko44Op44O85aCx5ZGK44Gr55So44GE44KL6KGM5pWw44Kr44Km44Oz44OIXG4gICAgX3Jvb3Q6IFZhbHVlOyAvLyDjg5Hjg7zjgrnjgZXjgozjgZ/jg6vjg7zjg4jopoHntKBcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5Hjg7zjgrnjgZfjgZ9KU09O44Gu6KaB57Sg44KSZmxvYXTlgKTjgajjgZfjgabmibHjgYZcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBKc29uRmxvYXQgZXh0ZW5kcyBWYWx1ZSB7XG4gICAgLyoqXG4gICAgICog44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICovXG4gICAgY29uc3RydWN0b3IodjogbnVtYmVyKSB7XG4gICAgICBzdXBlcigpO1xuXG4gICAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsdWXjga7nqK7poZ7jgYzmlbDlgKTlnovjgarjgol0cnVlXG4gICAgICovXG4gICAgcHVibGljIGlzRmxvYXQoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDopoHntKDjgpLmloflrZfliJfjgafov5TjgZkoY3NtU3RyaW5n5Z6LKVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTdHJpbmcoZGVmYXVsdFZhbHVlOiBzdHJpbmcsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IHN0cmJ1ZiA9ICdcXDAnO1xuICAgICAgdGhpcy5fdmFsdWUgPSBwYXJzZUZsb2F0KHN0cmJ1Zik7XG4gICAgICB0aGlzLl9zdHJpbmdCdWZmZXIgPSBzdHJidWY7XG5cbiAgICAgIHJldHVybiB0aGlzLl9zdHJpbmdCdWZmZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6KaB57Sg44KS5pWw5YCk5Z6L44Gn6L+U44GZKG51bWJlcilcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9JbnQoZGVmYXVsdFZhbHVlID0gMCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5fdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6KaB57Sg44KS5pWw5YCk5Z6L44Gn6L+U44GZKG51bWJlcilcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9GbG9hdChkZWZhdWx0VmFsdWUgPSAwLjApOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOW8leaVsOOBruWApOOBqOetieOBl+OBkeOCjOOBsHRydWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZXF1YWxzKHZhbHVlOiBjc21TdHJpbmcpOiBib29sZWFuO1xuICAgIHB1YmxpYyBlcXVhbHModmFsdWU6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgcHVibGljIGVxdWFscyh2YWx1ZTogbnVtYmVyKTogYm9vbGVhbjtcbiAgICBwdWJsaWMgZXF1YWxzKHZhbHVlOiBib29sZWFuKTogYm9vbGVhbjtcbiAgICBwdWJsaWMgZXF1YWxzKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAgIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIHZhbHVlKSB7XG4gICAgICAgIC8vIGludFxuICAgICAgICBpZiAoTWF0aC5yb3VuZCh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZmxvYXRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlID09IHRoaXMuX3ZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdmFsdWU6IG51bWJlcjsgLy8gSlNPTuimgee0oOOBruWApFxuICB9XG5cbiAgLyoqXG4gICAqIOODkeODvOOCueOBl+OBn0pTT07jga7opoHntKDjgpLnnJ/lgb3lgKTjgajjgZfjgabmibHjgYZcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBKc29uQm9vbGVhbiBleHRlbmRzIFZhbHVlIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZeOBrueorumhnuOBjOecn+WBveWApOOBquOCiXRydWVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNCb29sKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6KaB57Sg44KS55yf5YG95YCk44Gn6L+U44GZKGJvb2xlYW4pXG4gICAgICovXG4gICAgcHVibGljIHRvQm9vbGVhbihkZWZhdWx0VmFsdWUgPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2Jvb2xWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDopoHntKDjgpLmloflrZfliJfjgafov5TjgZkoY3NtU3RyaW5n5Z6LKVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTdHJpbmcoZGVmYXVsdFZhbHVlOiBzdHJpbmcsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHRoaXMuX3N0cmluZ0J1ZmZlciA9IHRoaXMuX2Jvb2xWYWx1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG5cbiAgICAgIHJldHVybiB0aGlzLl9zdHJpbmdCdWZmZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5byV5pWw44Gu5YCk44Go562J44GX44GR44KM44GwdHJ1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBlcXVhbHModmFsdWU6IGNzbVN0cmluZyk6IGJvb2xlYW47XG4gICAgcHVibGljIGVxdWFscyh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgICBwdWJsaWMgZXF1YWxzKHZhbHVlOiBudW1iZXIpOiBib29sZWFuO1xuICAgIHB1YmxpYyBlcXVhbHModmFsdWU6IGJvb2xlYW4pOiBib29sZWFuO1xuICAgIHB1YmxpYyBlcXVhbHModmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKCdib29sZWFuJyA9PT0gdHlwZW9mIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PSB0aGlzLl9ib29sVmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsdWXjga7lgKTjgYzpnZnnmoTjgarjgol0cnVlLCDpnZnnmoTjgarjgonop6PmlL7jgZfjgarjgYRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdGF0aWMoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlvJXmlbDku5jjgY3jgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IodjogYm9vbGVhbikge1xuICAgICAgc3VwZXIoKTtcblxuICAgICAgdGhpcy5fYm9vbFZhbHVlID0gdjtcbiAgICB9XG5cbiAgICBzdGF0aWMgdHJ1ZVZhbHVlOiBKc29uQm9vbGVhbjsgLy8gdHJ1ZVxuICAgIHN0YXRpYyBmYWxzZVZhbHVlOiBKc29uQm9vbGVhbjsgLy8gZmFsc2VcblxuICAgIHByaXZhdGUgX2Jvb2xWYWx1ZTogYm9vbGVhbjsgLy8gSlNPTuimgee0oOOBruWApFxuICB9XG5cbiAgLyoqXG4gICAqIOODkeODvOOCueOBl+OBn0pTT07jga7opoHntKDjgpLmloflrZfliJfjgajjgZfjgabmibHjgYZcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBKc29uU3RyaW5nIGV4dGVuZHMgVmFsdWUge1xuICAgIC8qKlxuICAgICAqIOW8leaVsOS7mOOBjeOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzOiBzdHJpbmcpO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzOiBjc21TdHJpbmcpO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzOiBhbnkpIHtcbiAgICAgIHN1cGVyKCk7XG5cbiAgICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIHMpIHtcbiAgICAgICAgdGhpcy5fc3RyaW5nQnVmZmVyID0gcztcbiAgICAgIH1cblxuICAgICAgaWYgKHMgaW5zdGFuY2VvZiBjc21TdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fc3RyaW5nQnVmZmVyID0gcy5zO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbHVl44Gu56iu6aGe44GM5paH5a2X5YiX44Gq44KJdHJ1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBpc1N0cmluZygpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOimgee0oOOCkuaWh+Wtl+WIl+OBp+i/lOOBmShjc21TdHJpbmflnospXG4gICAgICovXG4gICAgcHVibGljIGdldFN0cmluZyhkZWZhdWx0VmFsdWU6IHN0cmluZywgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0cmluZ0J1ZmZlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlvJXmlbDjga7lgKTjgajnrYnjgZfjgZHjgozjgbB0cnVlXG4gICAgICovXG4gICAgcHVibGljIGVxdWFscyh2YWx1ZTogY3NtU3RyaW5nKTogYm9vbGVhbjtcbiAgICBwdWJsaWMgZXF1YWxzKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuO1xuICAgIHB1YmxpYyBlcXVhbHModmFsdWU6IG51bWJlcik6IGJvb2xlYW47XG4gICAgcHVibGljIGVxdWFscyh2YWx1ZTogYm9vbGVhbik6IGJvb2xlYW47XG4gICAgcHVibGljIGVxdWFscyh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgICBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RyaW5nQnVmZmVyID09IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBjc21TdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmluZ0J1ZmZlciA9PSB2YWx1ZS5zO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEpTT07jg5Hjg7zjgrnmmYLjga7jgqjjg6njg7zntZDmnpzjgILmloflrZfliJflnovjga7jgojjgYbjgavjgbXjgovjgb7jgYZcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBKc29uRXJyb3IgZXh0ZW5kcyBKc29uU3RyaW5nIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZeOBruWApOOBjOmdmeeahOOBquOCiXRydWXjgIHpnZnnmoTjgarjgonop6PmlL7jgZfjgarjgYRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdGF0aWMoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5faXNTdGF0aWM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Ko44Op44O85oOF5aCx44KS44K744OD44OI44GZ44KLXG4gICAgICovXG4gICAgcHVibGljIHNldEVycm9yTm90Rm9yQ2xpZW50Q2FsbChzOiBzdHJpbmcpOiBWYWx1ZSB7XG4gICAgICB0aGlzLl9zdHJpbmdCdWZmZXIgPSBzO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5byV5pWw5LuY44GN44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHM6IGNzbVN0cmluZyB8IHN0cmluZywgaXNTdGF0aWM6IGJvb2xlYW4pIHtcbiAgICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIHMpIHtcbiAgICAgICAgc3VwZXIocyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdXBlcihzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2lzU3RhdGljID0gaXNTdGF0aWM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsdWXjga7nqK7poZ7jgYzjgqjjg6njg7zlgKTjgarjgol0cnVlXG4gICAgICovXG4gICAgcHVibGljIGlzRXJyb3IoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2lzU3RhdGljOiBib29sZWFuOyAvLyDpnZnnmoTjgapWYWx1ZeOBi+OBqeOBhuOBi1xuICB9XG5cbiAgLyoqXG4gICAqIOODkeODvOOCueOBl+OBn0pTT07jga7opoHntKDjgpJOVUxM5YCk44Go44GX44Gm5oyB44GkXG4gICAqL1xuICBleHBvcnQgY2xhc3MgSnNvbk51bGx2YWx1ZSBleHRlbmRzIFZhbHVlIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZeOBrueorumhnuOBjE5VTEzlgKTjgarjgol0cnVlXG4gICAgICovXG4gICAgcHVibGljIGlzTnVsbCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOimgee0oOOCkuaWh+Wtl+WIl+OBp+i/lOOBmShjc21TdHJpbmflnospXG4gICAgICovXG4gICAgcHVibGljIGdldFN0cmluZyhkZWZhdWx0VmFsdWU6IHN0cmluZywgaW5kZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0cmluZ0J1ZmZlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWx1ZeOBruWApOOBjOmdmeeahOOBquOCiXRydWUsIOmdmeeahOOBquOCieino+aUvuOBl+OBquOBhFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1N0YXRpYygpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHN1cGVyKCk7XG5cbiAgICAgIHRoaXMuX3N0cmluZ0J1ZmZlciA9ICdOdWxsVmFsdWUnO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDjg5Hjg7zjgrnjgZfjgZ9KU09O44Gu6KaB57Sg44KS6YWN5YiX44Go44GX44Gm5oyB44GkXG4gICAqL1xuICBleHBvcnQgY2xhc3MgSnNvbkFycmF5IGV4dGVuZHMgVmFsdWUge1xuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICB0aGlzLl9hcnJheSA9IG5ldyBjc21WZWN0b3I8VmFsdWU+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OH44K544OI44Op44Kv44K/55u45b2T44Gu5Yem55CGXG4gICAgICovXG4gICAgcHVibGljIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXRlOiBjc21WZWN0b3JfaXRlcmF0b3I8VmFsdWU+ID0gdGhpcy5fYXJyYXkuYmVnaW4oKTtcbiAgICAgICAgaXRlLm5vdEVxdWFsKHRoaXMuX2FycmF5LmVuZCgpKTtcbiAgICAgICAgaXRlLnByZUluY3JlbWVudCgpXG4gICAgICApIHtcbiAgICAgICAgbGV0IHY6IFZhbHVlID0gaXRlLnB0cigpO1xuXG4gICAgICAgIGlmICh2ICYmICF2LmlzU3RhdGljKCkpIHtcbiAgICAgICAgICB2ID0gdm9pZCAwO1xuICAgICAgICAgIHYgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsdWXjga7nqK7poZ7jgYzphY3liJfjgarjgol0cnVlXG4gICAgICovXG4gICAgcHVibGljIGlzQXJyYXkoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmt7vlrZfmvJTnrpflrZBbaW5kZXhdXG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVlQnlJbmRleChpbmRleDogbnVtYmVyKTogVmFsdWUge1xuICAgICAgaWYgKGluZGV4IDwgMCB8fCB0aGlzLl9hcnJheS5nZXRTaXplKCkgPD0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIFZhbHVlLmVycm9yVmFsdWUuc2V0RXJyb3JOb3RGb3JDbGllbnRDYWxsKFxuICAgICAgICAgIENTTV9KU09OX0VSUk9SX0lOREVYX09GX0JPVU5EU1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2OiBWYWx1ZSA9IHRoaXMuX2FycmF5LmF0KGluZGV4KTtcblxuICAgICAgaWYgKHYgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gVmFsdWUubnVsbFZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmt7vlrZfmvJTnrpflrZBbc3RyaW5nIHwgY3NtU3RyaW5nXVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZUJ5U3RyaW5nKHM6IHN0cmluZyB8IGNzbVN0cmluZyk6IFZhbHVlIHtcbiAgICAgIHJldHVybiBWYWx1ZS5lcnJvclZhbHVlLnNldEVycm9yTm90Rm9yQ2xpZW50Q2FsbChcbiAgICAgICAgQ1NNX0pTT05fRVJST1JfVFlQRV9NSVNNQVRDSFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDopoHntKDjgpLmloflrZfliJfjgafov5TjgZkoY3NtU3RyaW5n5Z6LKVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTdHJpbmcoZGVmYXVsdFZhbHVlOiBzdHJpbmcsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IHN0cmluZ0J1ZmZlcjogc3RyaW5nID0gaW5kZW50ICsgJ1tcXG4nO1xuXG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXRlOiBjc21WZWN0b3JfaXRlcmF0b3I8VmFsdWU+ID0gdGhpcy5fYXJyYXkuYmVnaW4oKTtcbiAgICAgICAgaXRlLm5vdEVxdWFsKHRoaXMuX2FycmF5LmVuZCgpKTtcbiAgICAgICAgaXRlLmluY3JlbWVudCgpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdjogVmFsdWUgPSBpdGUucHRyKCk7XG4gICAgICAgIHRoaXMuX3N0cmluZ0J1ZmZlciArPSBpbmRlbnQgKyAnJyArIHYuZ2V0U3RyaW5nKGluZGVudCArICcgJykgKyAnXFxuJztcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc3RyaW5nQnVmZmVyID0gc3RyaW5nQnVmZmVyICsgaW5kZW50ICsgJ11cXG4nO1xuXG4gICAgICByZXR1cm4gdGhpcy5fc3RyaW5nQnVmZmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmFjeWIl+imgee0oOOCkui/veWKoOOBmeOCi1xuICAgICAqIEBwYXJhbSB2IOi/veWKoOOBmeOCi+imgee0oFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGQodjogVmFsdWUpOiB2b2lkIHtcbiAgICAgIHRoaXMuX2FycmF5LnB1c2hCYWNrKHYpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOimgee0oOOCkuOCs+ODs+ODhuODiuOBp+i/lOOBmShjc21WZWN0b3I8VmFsdWU+KVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWZWN0b3IoZGVmYXVsdFZhbHVlOiBjc21WZWN0b3I8VmFsdWU+ID0gbnVsbCk6IGNzbVZlY3RvcjxWYWx1ZT4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2FycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOimgee0oOOBruaVsOOCkui/lOOBmVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTaXplKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fYXJyYXkuZ2V0U2l6ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FycmF5OiBjc21WZWN0b3I8VmFsdWU+OyAvLyBKU09O6KaB57Sg44Gu5YCkXG4gIH1cblxuICAvKipcbiAgICog44OR44O844K544GX44GfSlNPTuOBruimgee0oOOCkuODnuODg+ODl+OBqOOBl+OBpuaMgeOBpFxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEpzb25NYXAgZXh0ZW5kcyBWYWx1ZSB7XG4gICAgLyoqXG4gICAgICog44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIHRoaXMuX21hcCA9IG5ldyBjc21NYXA8c3RyaW5nLCBWYWx1ZT4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg4fjgrnjg4jjg6njgq/jgr/nm7jlvZPjga7lh6bnkIZcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGl0ZTogY3NtTWFwX2l0ZXJhdG9yPHN0cmluZywgVmFsdWU+ID0gdGhpcy5fbWFwLmJlZ2luKCk7XG5cbiAgICAgIHdoaWxlIChpdGUubm90RXF1YWwodGhpcy5fbWFwLmVuZCgpKSkge1xuICAgICAgICBsZXQgdjogVmFsdWUgPSBpdGUucHRyKCkuc2Vjb25kO1xuXG4gICAgICAgIGlmICh2ICYmICF2LmlzU3RhdGljKCkpIHtcbiAgICAgICAgICB2ID0gdm9pZCAwO1xuICAgICAgICAgIHYgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlLnByZUluY3JlbWVudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbHVl44Gu5YCk44GMTWFw5Z6L44Gq44KJdHJ1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBpc01hcCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOa3u+Wtl+a8lOeul+WtkFtzdHJpbmcgfCBjc21TdHJpbmddXG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVlQnlTdHJpbmcoczogc3RyaW5nIHwgY3NtU3RyaW5nKTogVmFsdWUge1xuICAgICAgaWYgKHMgaW5zdGFuY2VvZiBjc21TdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmV0OiBWYWx1ZSA9IHRoaXMuX21hcC5nZXRWYWx1ZShzLnMpO1xuICAgICAgICBpZiAocmV0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gVmFsdWUubnVsbFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpdGVyOiBjc21NYXBfaXRlcmF0b3I8c3RyaW5nLCBWYWx1ZT4gPSB0aGlzLl9tYXAuYmVnaW4oKTtcbiAgICAgICAgaXRlci5ub3RFcXVhbCh0aGlzLl9tYXAuZW5kKCkpO1xuICAgICAgICBpdGVyLnByZUluY3JlbWVudCgpXG4gICAgICApIHtcbiAgICAgICAgaWYgKGl0ZXIucHRyKCkuZmlyc3QgPT0gcykge1xuICAgICAgICAgIGlmIChpdGVyLnB0cigpLnNlY29uZCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gVmFsdWUubnVsbFZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXRlci5wdHIoKS5zZWNvbmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFZhbHVlLm51bGxWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmt7vlrZfmvJTnrpflrZBbaW5kZXhdXG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVlQnlJbmRleChpbmRleDogbnVtYmVyKTogVmFsdWUge1xuICAgICAgcmV0dXJuIFZhbHVlLmVycm9yVmFsdWUuc2V0RXJyb3JOb3RGb3JDbGllbnRDYWxsKFxuICAgICAgICBDU01fSlNPTl9FUlJPUl9UWVBFX01JU01BVENIXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOimgee0oOOCkuaWh+Wtl+WIl+OBp+i/lOOBmShjc21TdHJpbmflnospXG4gICAgICovXG4gICAgcHVibGljIGdldFN0cmluZyhkZWZhdWx0VmFsdWU6IHN0cmluZywgaW5kZW50OiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuX3N0cmluZ0J1ZmZlciA9IGluZGVudCArICd7XFxuJztcblxuICAgICAgY29uc3QgaXRlOiBjc21NYXBfaXRlcmF0b3I8c3RyaW5nLCBWYWx1ZT4gPSB0aGlzLl9tYXAuYmVnaW4oKTtcbiAgICAgIHdoaWxlIChpdGUubm90RXF1YWwodGhpcy5fbWFwLmVuZCgpKSkge1xuICAgICAgICBjb25zdCBrZXkgPSBpdGUucHRyKCkuZmlyc3Q7XG4gICAgICAgIGNvbnN0IHY6IFZhbHVlID0gaXRlLnB0cigpLnNlY29uZDtcblxuICAgICAgICB0aGlzLl9zdHJpbmdCdWZmZXIgKz1cbiAgICAgICAgICBpbmRlbnQgKyAnICcgKyBrZXkgKyAnIDogJyArIHYuZ2V0U3RyaW5nKGluZGVudCArICcgICAnKSArICcgXFxuJztcbiAgICAgICAgaXRlLnByZUluY3JlbWVudCgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zdHJpbmdCdWZmZXIgKz0gaW5kZW50ICsgJ31cXG4nO1xuXG4gICAgICByZXR1cm4gdGhpcy5fc3RyaW5nQnVmZmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOimgee0oOOCkk1hcOWei+OBp+i/lOOBmVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNYXAoZGVmYXVsdFZhbHVlPzogY3NtTWFwPHN0cmluZywgVmFsdWU+KTogY3NtTWFwPHN0cmluZywgVmFsdWU+IHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFw44Gr6KaB57Sg44KS6L+95Yqg44GZ44KLXG4gICAgICovXG4gICAgcHVibGljIHB1dChrZXk6IHN0cmluZywgdjogVmFsdWUpOiB2b2lkIHtcbiAgICAgIHRoaXMuX21hcC5zZXRWYWx1ZShrZXksIHYpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcOOBi+OCieOCreODvOOBruODquOCueODiOOCkuWPluW+l+OBmeOCi1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRLZXlzKCk6IGNzbVZlY3RvcjxzdHJpbmc+IHtcbiAgICAgIGlmICghdGhpcy5fa2V5cykge1xuICAgICAgICB0aGlzLl9rZXlzID0gbmV3IGNzbVZlY3RvcjxzdHJpbmc+KCk7XG5cbiAgICAgICAgY29uc3QgaXRlOiBjc21NYXBfaXRlcmF0b3I8c3RyaW5nLCBWYWx1ZT4gPSB0aGlzLl9tYXAuYmVnaW4oKTtcblxuICAgICAgICB3aGlsZSAoaXRlLm5vdEVxdWFsKHRoaXMuX21hcC5lbmQoKSkpIHtcbiAgICAgICAgICBjb25zdCBrZXk6IHN0cmluZyA9IGl0ZS5wdHIoKS5maXJzdDtcbiAgICAgICAgICB0aGlzLl9rZXlzLnB1c2hCYWNrKGtleSk7XG4gICAgICAgICAgaXRlLnByZUluY3JlbWVudCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fa2V5cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXDjga7opoHntKDmlbDjgpLlj5blvpfjgZnjgotcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2l6ZSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2tleXMuZ2V0U2l6ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX21hcDogY3NtTWFwPHN0cmluZywgVmFsdWU+OyAvLyBKU09O6KaB57Sg44Gu5YCkXG4gICAgcHJpdmF0ZSBfa2V5czogY3NtVmVjdG9yPHN0cmluZz47IC8vIEpTT07opoHntKDjga7lgKRcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvKipcbiAgICogNHg044Gu6KGM5YiXXG4gICAqXG4gICAqIDR4NOihjOWIl+OBruS+v+WIqeOCr+ODqeOCueOAglxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbU1hdHJpeDQ0IHtcbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl90ciA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpOyAvLyA0ICogNOOBruOCteOCpOOCulxuICAgICAgdGhpcy5sb2FkSWRlbnRpdHkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj5fjgZHlj5bjgaPjgZ/vvJLjgaTjga7ooYzliJfjga7kuZfnrpfjgpLooYzjgYbjgIJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhIOihjOWIl2FcbiAgICAgKiBAcGFyYW0gYiDooYzliJdiXG4gICAgICogQHJldHVybiDkuZfnrpfntZDmnpzjga7ooYzliJdcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIG11bHRpcGx5KFxuICAgICAgYTogRmxvYXQzMkFycmF5LFxuICAgICAgYjogRmxvYXQzMkFycmF5LFxuICAgICAgZHN0OiBGbG9hdDMyQXJyYXlcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IGM6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjBcbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCBuID0gNDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuOyArK2opIHtcbiAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG47ICsraykge1xuICAgICAgICAgICAgY1tqICsgaSAqIDRdICs9IGFbayArIGkgKiA0XSAqIGJbaiArIGsgKiA0XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgIGRzdFtpXSA9IGNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y2Y5L2N6KGM5YiX44Gr5Yid5pyf5YyW44GZ44KLXG4gICAgICovXG4gICAgcHVibGljIGxvYWRJZGVudGl0eSgpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGM6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgICAgICAxLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMS4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDEuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAxLjBcbiAgICAgIF0pO1xuXG4gICAgICB0aGlzLnNldE1hdHJpeChjKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDooYzliJfjgpLoqK3lrppcbiAgICAgKlxuICAgICAqIEBwYXJhbSB0ciAxNuWAi+OBrua1ruWLleWwj+aVsOeCueaVsOOBp+ihqOOBleOCjOOCizR4NOOBruihjOWIl1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRNYXRyaXgodHI6IEZsb2F0MzJBcnJheSk6IHZvaWQge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgIHRoaXMuX3RyW2ldID0gdHJbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6KGM5YiX44KS5rWu5YuV5bCP5pWw54K55pWw44Gu6YWN5YiX44Gn5Y+W5b6XXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIDE25YCL44Gu5rWu5YuV5bCP5pWw54K55pWw44Gn6KGo44GV44KM44KLNHg044Gu6KGM5YiXXG4gICAgICovXG4gICAgcHVibGljIGdldEFycmF5KCk6IEZsb2F0MzJBcnJheSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWOi7uOOBruaLoeWkp+eOh+OCkuWPluW+l1xuICAgICAqIEByZXR1cm4gWOi7uOOBruaLoeWkp+eOh1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTY2FsZVgoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl90clswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBZ6Lu444Gu5ouh5aSn546H44KS5Y+W5b6X44GZ44KLXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFnou7jjga7mi6HlpKfnjodcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2NhbGVZKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJbNV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWOi7uOOBruenu+WLlemHj+OCkuWPluW+l1xuICAgICAqIEByZXR1cm4gWOi7uOOBruenu+WLlemHj1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUcmFuc2xhdGVYKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJbMTJdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFnou7jjga7np7vli5Xph4/jgpLlj5blvpdcbiAgICAgKiBAcmV0dXJuIFnou7jjga7np7vli5Xph49cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VHJhbnNsYXRlWSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyWzEzXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBY6Lu444Gu5YCk44KS54++5Zyo44Gu6KGM5YiX44Gn6KiI566XXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3JjIFjou7jjga7lgKRcbiAgICAgKiBAcmV0dXJuIOePvuWcqOOBruihjOWIl+OBp+ioiOeul+OBleOCjOOBn1jou7jjga7lgKRcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmb3JtWChzcmM6IG51bWJlcik6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJbMF0gKiBzcmMgKyB0aGlzLl90clsxMl07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWei7uOOBruWApOOCkuePvuWcqOOBruihjOWIl+OBp+ioiOeul1xuICAgICAqXG4gICAgICogQHBhcmFtIHNyYyBZ6Lu444Gu5YCkXG4gICAgICogQHJldHVybiDnj77lnKjjga7ooYzliJfjgafoqIjnrpfjgZXjgozjgZ9Z6Lu444Gu5YCkXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZm9ybVkoc3JjOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyWzVdICogc3JjICsgdGhpcy5fdHJbMTNdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFjou7jjga7lgKTjgpLnj77lnKjjga7ooYzliJfjgafpgIboqIjnrpdcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXJ0VHJhbnNmb3JtWChzcmM6IG51bWJlcik6IG51bWJlciB7XG4gICAgICByZXR1cm4gKHNyYyAtIHRoaXMuX3RyWzEyXSkgLyB0aGlzLl90clswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBZ6Lu444Gu5YCk44KS54++5Zyo44Gu6KGM5YiX44Gn6YCG6KiI566XXG4gICAgICovXG4gICAgcHVibGljIGludmVydFRyYW5zZm9ybVkoc3JjOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIChzcmMgLSB0aGlzLl90clsxM10pIC8gdGhpcy5fdHJbNV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog54++5Zyo44Gu6KGM5YiX44Gu5L2N572u44KS6LW354K544Gr44GX44Gm56e75YuVXG4gICAgICpcbiAgICAgKiDnj77lnKjjga7ooYzliJfjga7kvY3nva7jgpLotbfngrnjgavjgZfjgabnm7jlr77nmoTjgavnp7vli5XjgZnjgovjgIJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFjou7jjga7np7vli5Xph49cbiAgICAgKiBAcGFyYW0geSBZ6Lu444Gu56e75YuV6YePXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zbGF0ZVJlbGF0aXZlKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgICBjb25zdCB0cjE6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgICAgICAxLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMS4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDEuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICAwLjAsXG4gICAgICAgIDEuMFxuICAgICAgXSk7XG5cbiAgICAgIEN1YmlzbU1hdHJpeDQ0Lm11bHRpcGx5KHRyMSwgdGhpcy5fdHIsIHRoaXMuX3RyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnj77lnKjjga7ooYzliJfjga7kvY3nva7jgpLnp7vli5VcbiAgICAgKlxuICAgICAqIOePvuWcqOOBruihjOWIl+OBruS9jee9ruOCkuaMh+WumuOBl+OBn+S9jee9ruOBuOenu+WLleOBmeOCi1xuICAgICAqXG4gICAgICogQHBhcmFtIHggWOi7uOOBruenu+WLlemHj1xuICAgICAqIEBwYXJhbSB5IHnou7jjga7np7vli5Xph49cbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNsYXRlKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgICB0aGlzLl90clsxMl0gPSB4O1xuICAgICAgdGhpcy5fdHJbMTNdID0geTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnj77lnKjjga7ooYzliJfjga5Y6Lu444Gu5L2N572u44KS5oyH5a6a44GX44Gf5L2N572u44G456e75YuV44GZ44KLXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBY6Lu444Gu56e75YuV6YePXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zbGF0ZVgoeDogbnVtYmVyKTogdm9pZCB7XG4gICAgICB0aGlzLl90clsxMl0gPSB4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOePvuWcqOOBruihjOWIl+OBrlnou7jjga7kvY3nva7jgpLmjIflrprjgZfjgZ/kvY3nva7jgbjnp7vli5XjgZnjgotcbiAgICAgKlxuICAgICAqIEBwYXJhbSB5IFnou7jjga7np7vli5Xph49cbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNsYXRlWSh5OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHRoaXMuX3RyWzEzXSA9IHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog54++5Zyo44Gu6KGM5YiX44Gu5ouh5aSn546H44KS55u45a++55qE44Gr6Kit5a6a44GZ44KLXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBY6Lu444Gu5ouh5aSn546HXG4gICAgICogQHBhcmFtIHkgWei7uOOBruaLoeWkp+eOh1xuICAgICAqL1xuICAgIHB1YmxpYyBzY2FsZVJlbGF0aXZlKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgICBjb25zdCB0cjE6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgICAgICB4LFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIHksXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMS4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDEuMFxuICAgICAgXSk7XG5cbiAgICAgIEN1YmlzbU1hdHJpeDQ0Lm11bHRpcGx5KHRyMSwgdGhpcy5fdHIsIHRoaXMuX3RyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlsIblvZPliY3nn6npmLXnmoTmlL7lpKfnjoforr7nva7kuLrmjIflrprnmoTlgI3njodcbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFjou7jjga7mi6HlpKfnjodcbiAgICAgKiBAcGFyYW0geSBZ6Lu444Gu5ouh5aSn546HXG4gICAgICovXG4gICAgcHVibGljIHNjYWxlKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgICB0aGlzLl90clswXSA9IHg7XG4gICAgICB0aGlzLl90cls1XSA9IHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog54++5Zyo44Gu6KGM5YiX44Gr6KGM5YiX44KS5LmX566XXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbSDooYzliJdcbiAgICAgKi9cbiAgICBwdWJsaWMgbXVsdGlwbHlCeU1hdHJpeChtOiBDdWJpc21NYXRyaXg0NCk6IHZvaWQge1xuICAgICAgQ3ViaXNtTWF0cml4NDQubXVsdGlwbHkobS5nZXRBcnJheSgpLCB0aGlzLl90ciwgdGhpcy5fdHIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCquODluOCuOOCp+OCr+ODiOOBruOCs+ODlOODvOOCkueUn+aIkOOBmeOCi1xuICAgICAqL1xuICAgIHB1YmxpYyBjbG9uZSgpOiBDdWJpc21NYXRyaXg0NCB7XG4gICAgICBjb25zdCBjbG9uZU1hdHJpeDogQ3ViaXNtTWF0cml4NDQgPSBuZXcgQ3ViaXNtTWF0cml4NDQoKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjbG9uZU1hdHJpeC5fdHJbaV0gPSB0aGlzLl90cltpXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNsb25lTWF0cml4O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdHI6IEZsb2F0MzJBcnJheTsgLy8gNHg06KGM5YiX44OH44O844K/XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4g5L+d55WZ5omA5pyJ5p2D5Yip44CCXG4gKlxuICog5pys5rqQ56CB55qE5L2/55So5Y+XTGl2ZTJE5byA5pS+6L2v5Lu26K645Y+v6K+B55qE57qm5p2f44CCXG4gKiDlj6/lnKggaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuaW1wb3J0IHtcbiAgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGxpdmUyZGN1YmlzbWZyYW1ld29yayxcbiAgT3B0aW9uIGFzIENzbV9PcHRpb25cbn0gZnJvbSAnQGZyYW1ld29yay9saXZlMmRjdWJpc21mcmFtZXdvcmsnO1xuaW1wb3J0IENzbV9DdWJpc21GcmFtZXdvcmsgPSBsaXZlMmRjdWJpc21mcmFtZXdvcmsuQ3ViaXNtRnJhbWV3b3JrO1xuaW1wb3J0IHsgTEFwcFZpZXcgfSBmcm9tICcuL2xhcHB2aWV3JztcbmltcG9ydCB7IExBcHBQYWwgfSBmcm9tICcuL2xhcHBwYWwnO1xuaW1wb3J0IHsgTEFwcFRleHR1cmVNYW5hZ2VyIH0gZnJvbSAnLi9sYXBwdGV4dHVyZW1hbmFnZXInO1xuaW1wb3J0IHsgTEFwcExpdmUyRE1hbmFnZXIgfSBmcm9tICcuL2xhcHBsaXZlMmRtYW5hZ2VyJztcbmltcG9ydCAqIGFzIExBcHBEZWZpbmUgZnJvbSAnLi9sYXBwZGVmaW5lJztcblxuZXhwb3J0IGxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50ID0gbnVsbDtcbmV4cG9ydCBsZXQgc19pbnN0YW5jZTogTEFwcERlbGVnYXRlID0gbnVsbDtcbmV4cG9ydCBsZXQgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCA9IG51bGw7XG5leHBvcnQgbGV0IGZyYW1lQnVmZmVyOiBXZWJHTEZyYW1lYnVmZmVyID0gbnVsbDtcblxuLyoqXG4gKiDlupTnlKjnsbvjgIJcbiAqIOeuoeeQhiBDdWJpc20gU0RL44CCXG4gKi9cbmV4cG9ydCBjbGFzcyBMQXBwRGVsZWdhdGUge1xuICAvKipcbiAgICog6L+U5Zue6K+l57G755qE5LiA5Liq5a6e5L6L77yI5Y2V5L6L77yJ44CCXG4gICAqIOWmguaenOWwmuacquWIm+W7uuWunuS+i++8jOWImeWcqOWGhemDqOWIm+W7uuS4gOS4quWunuS+i+OAglxuICAgKlxuICAgKiBAcmV0dXJuIExBcHBEZWxlZ2F0ZSDnsbvnmoTlrp7kvotcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogTEFwcERlbGVnYXRlIHtcbiAgICBpZiAoc19pbnN0YW5jZSA9PSBudWxsKSB7XG4gICAgICBzX2luc3RhbmNlID0gbmV3IExBcHBEZWxlZ2F0ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBzX2luc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIOmHiuaUvuexu+WunuS+iyhzaW5nbGUgdG9uKeOAglxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWxlYXNlSW5zdGFuY2UoKTogdm9pZCB7XG4gICAgaWYgKHNfaW5zdGFuY2UgIT0gbnVsbCkge1xuICAgICAgc19pbnN0YW5jZS5yZWxlYXNlKCk7XG4gICAgfVxuXG4gICAgc19pbnN0YW5jZSA9IG51bGw7XG4gIH1cblxuICAvLyBAdHMtaWdub3JlXG4gIC8qKlxuICAgKiDliJ3lp4vljJZBUFDpnIDopoHnmoTkuJzopb/jgIJcbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplKCk6IGJvb2xlYW4ge1xuICAgIC8vIOeUu+W4g+eahOWIm+W7ulxuICAgIC8vIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIC8vIGNhbnZhcy53aWR0aCA9IExBcHBEZWZpbmUuUmVuZGVyVGFyZ2V0V2lkdGg7XG4gICAgLy8gY2FudmFzLmhlaWdodCA9IExBcHBEZWZpbmUuUmVuZGVyVGFyZ2V0SGVpZ2h0O1xuICAgIGNhbnZhcyA9IDxIVE1MQ2FudmFzRWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxpdmUyZFwiKTtcbiAgICAvL+a3u+WKoOS7peS4i+WGheWuueWIsOWHveaVsOS9k1xuICAgIC8v6aG16Z2i6byg5qCH56e75Yqo5LqL5Lu255uR5ZCs77yM5oqb5byDU0RL5o+Q5L6b55qE54K55Ye756e75Yqo5LqL5Lu2XG4gICAgLy8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLGZ1bmN0aW9uKGUpe1xuICAgIC8vICAgaWYoIUxBcHBEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLl92aWV3KSB7XG4gICAgLy8gICAgIC8vIExBcHBQYWwucHJpbnRMb2coXCJ2aWV3IG5vdGZvdW5kXCIpO1xuICAgIC8vICAgICBjb25zb2xlLmxvZygndmlldyBub3Rmb3VuZCcpXG4gICAgLy8gICAgIHJldHVybjtcbiAgICAvLyAgIH1cbiAgICAvLyAgIGxldCByZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJsaXZlMmRcIikuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICBsZXQgcG9zWDogbnVtYmVyID0gZS5jbGllbnRYIC1yZWN0LmxlZnQ7XG4gICAgLy8gICBsZXQgcG9zWTogbnVtYmVyID0gZS5jbGllbnRZIC0gcmVjdC50b3AgO1xuICAgIC8vICAgLy8gY29uc29sZS5sb2coXCJvbk1vdXNlTW92ZWQ6IGdhdGXmlofku7bkuK1wb3NZ5YC85Li677yaIOOAkFwiK3Bvc1krXCLjgJEgIGNhbnZhc+eahHRvcOi3neemu+S4uu+8mlwiK3JlY3QudG9wKTtcbiAgICAvLyAgIExBcHBEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLl92aWV3Lm9uVG91Y2hlc01vdmVkKHBvc1gsIHBvc1kpO1xuICAgIC8vIH0sZmFsc2UpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBkb2N1bWVudC5uZXh0U2NlbmUgPSAoKSA9PiB7XG4gICAgICBjb25zdCBsaXZlMkRNYW5hZ2VyOiBMQXBwTGl2ZTJETWFuYWdlciA9IExBcHBMaXZlMkRNYW5hZ2VyLmdldEluc3RhbmNlKClcbiAgICAgIGxpdmUyRE1hbmFnZXIubmV4dFNjZW5lKCk7XG4gICAgfVxuICAgIC8v5Zyo6L+Z6YeM5Yqg5LiK6byg5qCH56a75byA5rWP6KeI5Zmo5ZCO77yM5LiA5YiH5b2S5L2NXG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIix0aGlzLm1vdXNlb3V0LGZhbHNlKTtcbiAgICAvLyDnu5Hlrpog6YeK5pS+6LWE5rqQXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGRvY3VtZW50LmxpdmUyZF9yZWxlYXNlID0gKCkgPT4ge1xuICAgICAgY2FudmFzID0gbnVsbFxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCB0aGlzLm1vdXNlb3V0KVxuICAgICAgdGhpcy5yZWxlYXNlKClcbiAgICB9XG5cbiAgICAvLyBnbCDkuIrkuIvmlofliJ3lp4vljJZcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgZ2wgPSBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnKSB8fCBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJyk7XG5cbiAgICBpZiAoIWdsKSB7XG4gICAgICBhbGVydCgnQ2Fubm90IGluaXRpYWxpemUgV2ViR0wuIFRoaXMgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0LicpO1xuICAgICAgZ2wgPSBudWxsO1xuXG4gICAgICBkb2N1bWVudC5ib2R5LmlubmVySFRNTCA9XG4gICAgICAgICdUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgPGNvZGU+Jmx0O2NhbnZhcyZndDs8L2NvZGU+IGVsZW1lbnQuJztcblxuICAgICAgLy8gZ2zliJ3mnJ/ljJblpLHmlZdcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8g5oqK55S75biD5re75Yqg5YiwRE9NXG4gICAgLy8gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjYW52YXMpO1xuXG4gICAgaWYgKCFmcmFtZUJ1ZmZlcikge1xuICAgICAgZnJhbWVCdWZmZXIgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuRlJBTUVCVUZGRVJfQklORElORyk7XG4gICAgfVxuXG4gICAgLy8g6YCP6YGO6Kit5a6aIOmAj+aYjuW6puiuvuWumlxuICAgIGdsLmVuYWJsZShnbC5CTEVORCk7XG4gICAgZ2wuYmxlbmRGdW5jKGdsLlNSQ19BTFBIQSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG5cbiAgICBjb25zdCBzdXBwb3J0VG91Y2g6IGJvb2xlYW4gPSAnb250b3VjaGVuZCcgaW4gY2FudmFzO1xuXG4gICAgaWYgKHN1cHBvcnRUb3VjaCkge1xuICAgICAgLy8g5LiO6Kem5pG455u45YWz55qE5Zue6LCD5Ye95pWw55m76K6wXG4gICAgICBjYW52YXMub250b3VjaHN0YXJ0ID0gb25Ub3VjaEJlZ2FuO1xuICAgICAgY2FudmFzLm9udG91Y2htb3ZlID0gb25Ub3VjaE1vdmVkO1xuICAgICAgY2FudmFzLm9udG91Y2hlbmQgPSBvblRvdWNoRW5kZWQ7XG4gICAgICBjYW52YXMub250b3VjaGNhbmNlbCA9IG9uVG91Y2hDYW5jZWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOm8oOagh+ebuOWFs+eahOWbnuiwg+WHveaVsOeZu+iusFxuICAgICAgY2FudmFzLm9ubW91c2Vkb3duID0gb25DbGlja0JlZ2FuO1xuICAgICAgY2FudmFzLm9ubW91c2Vtb3ZlID0gb25Nb3VzZU1vdmVkO1xuICAgICAgY2FudmFzLm9ubW91c2V1cCA9IG9uQ2xpY2tFbmRlZDtcbiAgICB9XG5cbiAgICAvLyBBcHBWaWV355qE5Yid5aeL5YyWXG4gICAgdGhpcy5fdmlldy5pbml0aWFsaXplKCk7XG5cbiAgICAvLyBDdWJpc20gU0RL55qE5Yid5aeL5YyWXG4gICAgdGhpcy5pbml0aWFsaXplQ3ViaXNtKCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgbW91c2VvdXQoKTp2b2lkIHtcbiAgICAgIC8v6byg5qCH56a75byAZG9jdW1lbnTlkI7vvIzlsIblhbbkvY3nva7nva7kuLrvvIgw77yMMO+8iVxuICAgICAgbGV0IGxpdmUyRE1hbmFnZXI6IExBcHBMaXZlMkRNYW5hZ2VyID0gTEFwcExpdmUyRE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIGxpdmUyRE1hbmFnZXIub25EcmFnKDAuMCwgMC4wKTtcbiAgfVxuICAvKipcbiAgICog6YeK5pS+XG4gICAqL1xuICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICBpZih0aGlzLl90ZXh0dXJlTWFuYWdlcil7XG4gICAgICB0aGlzLl90ZXh0dXJlTWFuYWdlci5yZWxlYXNlKCk7XG4gICAgfVxuICAgIHRoaXMuX3RleHR1cmVNYW5hZ2VyID0gbnVsbDtcbiAgICBpZih0aGlzLl92aWV3KXtcbiAgICAgIHRoaXMuX3ZpZXcucmVsZWFzZSgpO1xuICAgIH1cbiAgICB0aGlzLl92aWV3ID0gbnVsbDtcblxuICAgIC8vIOmHiuaUvui1hOa6kFxuICAgIExBcHBMaXZlMkRNYW5hZ2VyLnJlbGVhc2VJbnN0YW5jZSgpO1xuXG4gICAgLy8gQ3ViaXNtIFNESyDph4rmlL5cbiAgICBDc21fQ3ViaXNtRnJhbWV3b3JrLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmiafooYzlpITnkIZcbiAgICovXG4gIHB1YmxpYyBydW4oKTogdm9pZCB7XG4gICAgLy/kuLvlvqrnjq9cbiAgICBjb25zdCBsb29wID0gKCk6IHZvaWQgPT4ge1xuICAgICAgLy8g5a6e5L6L55qE5pyJ5peg55qE56Gu6K6kXG4gICAgICBpZiAoc19pbnN0YW5jZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8g5pe26Ze05pu05pawXG4gICAgICBMQXBwUGFsLnVwZGF0ZVRpbWUoKTtcblxuICAgICAgLy8g55S76Z2i55qE5Yid5aeL5YyWXG4gICAgICBnbC5jbGVhckNvbG9yKDAuMCwgMC4wLCAwLjAsIDApO1xuXG4gICAgICAvLyDlkK/nlKjmt7HluqbmtYvor5VcbiAgICAgIGdsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcblxuICAgICAgLy8g6L+R5aSE54mp5L2T5o6p55uW6L+c5aSE54mp5L2TXG4gICAgICBnbC5kZXB0aEZ1bmMoZ2wuTEVRVUFMKTtcblxuICAgICAgLy8g5riF6Zmk6aKc6Imy57yT5Yay5Yy65ZKM5rex5bqm57yT5Yay5Yy6XG4gICAgICBnbC5jbGVhcihnbC5DT0xPUl9CVUZGRVJfQklUIHwgZ2wuREVQVEhfQlVGRkVSX0JJVCk7XG5cbiAgICAgIGdsLmNsZWFyRGVwdGgoMS4wKTtcblxuICAgICAgLy8g6YCP6L+H6K6+5a6aXG4gICAgICBnbC5lbmFibGUoZ2wuQkxFTkQpO1xuICAgICAgZ2wuYmxlbmRGdW5jKGdsLlNSQ19BTFBIQSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSk7XG5cbiAgICAgIC8vIOaPj+eUu+abtOaWsFxuICAgICAgdGhpcy5fdmlldy5yZW5kZXIoKTtcblxuICAgICAgLy8g5b6q546v55qE6YCS5b2S6LCD55SoXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG4gICAgfTtcbiAgICBsb29wKCk7XG4gIH1cblxuICAvKipcbiAgICog5rOo5YaM552A6Imy56iL5bqPXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlU2hhZGVyKCk6IFdlYkdMUHJvZ3JhbSB7XG4gICAgLy8g57yW6K+R6aG254K5552A6Imy5ZmoXG4gICAgY29uc3QgdmVydGV4U2hhZGVySWQgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUik7XG5cbiAgICBpZiAodmVydGV4U2hhZGVySWQgPT0gbnVsbCkge1xuICAgICAgTEFwcFBhbC5wcmludE1lc3NhZ2UoJ2ZhaWxlZCB0byBjcmVhdGUgdmVydGV4U2hhZGVyJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB2ZXJ0ZXhTaGFkZXI6IHN0cmluZyA9XG4gICAgICAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7JyArXG4gICAgICAnYXR0cmlidXRlIHZlYzMgcG9zaXRpb247JyArXG4gICAgICAnYXR0cmlidXRlIHZlYzIgdXY7JyArXG4gICAgICAndmFyeWluZyB2ZWMyIHZ1djsnICtcbiAgICAgICd2b2lkIG1haW4odm9pZCknICtcbiAgICAgICd7JyArXG4gICAgICAnICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAxLjApOycgK1xuICAgICAgJyAgIHZ1diA9IHV2OycgK1xuICAgICAgJ30nO1xuXG4gICAgZ2wuc2hhZGVyU291cmNlKHZlcnRleFNoYWRlcklkLCB2ZXJ0ZXhTaGFkZXIpO1xuICAgIGdsLmNvbXBpbGVTaGFkZXIodmVydGV4U2hhZGVySWQpO1xuXG4gICAgLy8g57yW6K+R56KO54mH552A6Imy5ZmoXG4gICAgY29uc3QgZnJhZ21lbnRTaGFkZXJJZCA9IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpO1xuXG4gICAgaWYgKGZyYWdtZW50U2hhZGVySWQgPT0gbnVsbCkge1xuICAgICAgTEFwcFBhbC5wcmludE1lc3NhZ2UoJ2ZhaWxlZCB0byBjcmVhdGUgZnJhZ21lbnRTaGFkZXInKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyOiBzdHJpbmcgPVxuICAgICAgJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OycgK1xuICAgICAgJ3ZhcnlpbmcgdmVjMiB2dXY7JyArXG4gICAgICAndW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTsnICtcbiAgICAgICd2b2lkIG1haW4odm9pZCknICtcbiAgICAgICd7JyArXG4gICAgICAnICAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHRleHR1cmUsIHZ1dik7JyArXG4gICAgICAnfSc7XG5cbiAgICBnbC5zaGFkZXJTb3VyY2UoZnJhZ21lbnRTaGFkZXJJZCwgZnJhZ21lbnRTaGFkZXIpO1xuICAgIGdsLmNvbXBpbGVTaGFkZXIoZnJhZ21lbnRTaGFkZXJJZCk7XG5cbiAgICAvLyDliJvlu7rnqIvluo/lr7nosaFcbiAgICBjb25zdCBwcm9ncmFtSWQgPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG4gICAgZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW1JZCwgdmVydGV4U2hhZGVySWQpO1xuICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtSWQsIGZyYWdtZW50U2hhZGVySWQpO1xuXG4gICAgZ2wuZGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcklkKTtcbiAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXJJZCk7XG5cbiAgICAvLyDogZTns7tcbiAgICBnbC5saW5rUHJvZ3JhbShwcm9ncmFtSWQpO1xuXG4gICAgZ2wudXNlUHJvZ3JhbShwcm9ncmFtSWQpO1xuXG4gICAgcmV0dXJuIHByb2dyYW1JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDlj5blvpfop4blm77kv6Hmga9cbiAgICovXG4gIHB1YmxpYyBnZXRWaWV3KCk6IExBcHBWaWV3IHtcbiAgICByZXR1cm4gdGhpcy5fdmlldztcbiAgfVxuXG4gIHB1YmxpYyBnZXRUZXh0dXJlTWFuYWdlcigpOiBMQXBwVGV4dHVyZU1hbmFnZXIge1xuICAgIHJldHVybiB0aGlzLl90ZXh0dXJlTWFuYWdlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiDmnoTpgKDlh73mlbBcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2NhcHR1cmVkID0gZmFsc2U7XG4gICAgdGhpcy5fbW91c2VYID0gMC4wO1xuICAgIHRoaXMuX21vdXNlWSA9IDAuMDtcbiAgICB0aGlzLl9pc0VuZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5fY3ViaXNtT3B0aW9uID0gbmV3IENzbV9PcHRpb24oKTtcbiAgICB0aGlzLl92aWV3ID0gbmV3IExBcHBWaWV3KCk7XG4gICAgdGhpcy5fdGV4dHVyZU1hbmFnZXIgPSBuZXcgTEFwcFRleHR1cmVNYW5hZ2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3ViaXNtIFNES+WIneWni+WMllxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemVDdWJpc20oKTogdm9pZCB7XG4gICAgLy8gc2V0dXAgY3ViaXNtXG4gICAgdGhpcy5fY3ViaXNtT3B0aW9uLmxvZ0Z1bmN0aW9uID0gTEFwcFBhbC5wcmludE1lc3NhZ2U7XG4gICAgdGhpcy5fY3ViaXNtT3B0aW9uLmxvZ2dpbmdMZXZlbCA9IExBcHBEZWZpbmUuQ3ViaXNtTG9nZ2luZ0xldmVsO1xuICAgIENzbV9DdWJpc21GcmFtZXdvcmsuc3RhcnRVcCh0aGlzLl9jdWJpc21PcHRpb24pO1xuXG4gICAgLy8gaW5pdGlhbGl6ZSBjdWJpc21cbiAgICBDc21fQ3ViaXNtRnJhbWV3b3JrLmluaXRpYWxpemUoKTtcblxuICAgIC8vIGxvYWQgbW9kZWxcbiAgICBMQXBwTGl2ZTJETWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuXG4gICAgTEFwcFBhbC51cGRhdGVUaW1lKCk7XG5cbiAgICB0aGlzLl92aWV3LmluaXRpYWxpemVTcHJpdGUoKTtcbiAgfVxuXG4gIF9jdWJpc21PcHRpb246IENzbV9PcHRpb247IC8vY3ViaXNtIFNESyDpgInpoblcbiAgX3ZpZXc6IExBcHBWaWV3OyAvLyBWaWV35oOF5aCxXG4gIF9jYXB0dXJlZDogYm9vbGVhbjsgLy8g5piv5ZCm54K55Ye75LqGXG4gIF9tb3VzZVg6IG51bWJlcjsgLy8g6byg5qCHWOWdkOagh1xuICBfbW91c2VZOiBudW1iZXI7IC8vIOm8oOagh1nlnZDmoIdcbiAgX2lzRW5kOiBib29sZWFuOyAvL0FQUOaYr+WQpuWFs+mXrVxuICBfdGV4dHVyZU1hbmFnZXI6IExBcHBUZXh0dXJlTWFuYWdlcjsgLy8g57q555CG566h55CG5ZmoXG59XG5cbi8qKlxuICog44Kv44Oq44OD44Kv44GX44Gf44Go44GN44Gr5ZG844Gw44KM44KL44CCXG4gKiDlnKjljZXlh7vnmoTml7blgJnosIPnlKjnmoTlh73mlbBcbiAqL1xuZnVuY3Rpb24gb25DbGlja0JlZ2FuKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgaWYgKCFMQXBwRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5fdmlldykge1xuICAgIExBcHBQYWwucHJpbnRNZXNzYWdlKCd2aWV3IG5vdGZvdW5kJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIExBcHBEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLl9jYXB0dXJlZCA9IHRydWU7XG5cbiAgY29uc3QgcG9zWDogbnVtYmVyID0gZS5wYWdlWDtcbiAgY29uc3QgcG9zWTogbnVtYmVyID0gZS5wYWdlWTtcblxuICBMQXBwRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5fdmlldy5vblRvdWNoZXNCZWdhbihwb3NYLCBwb3NZKTtcbn1cblxuLyoqXG4gKiDlvZPpvKDmoIfmjIfpkojnp7vliqjml7bvvIzooqvosIPnlKjjgIJcbiAqL1xuZnVuY3Rpb24gb25Nb3VzZU1vdmVkKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgaWYgKCFMQXBwRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5fY2FwdHVyZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIUxBcHBEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLl92aWV3KSB7XG4gICAgTEFwcFBhbC5wcmludE1lc3NhZ2UoJ3ZpZXcgbm90Zm91bmQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZWN0ID0gKGUudGFyZ2V0IGFzIEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBwb3NYOiBudW1iZXIgPSBlLmNsaWVudFggLSByZWN0LmxlZnQ7XG4gIGNvbnN0IHBvc1k6IG51bWJlciA9IGUuY2xpZW50WSAtIHJlY3QudG9wO1xuXG4gIExBcHBEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLl92aWV3Lm9uVG91Y2hlc01vdmVkKHBvc1gsIHBvc1kpO1xufVxuXG4vKipcbiAqIOW9k+eCueWHu+WujOaIkOWQjuS8muiiq+iwg+eUqOOAglxuICovXG5mdW5jdGlvbiBvbkNsaWNrRW5kZWQoZTogTW91c2VFdmVudCk6IHZvaWQge1xuICBMQXBwRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5fY2FwdHVyZWQgPSBmYWxzZTtcbiAgaWYgKCFMQXBwRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5fdmlldykge1xuICAgIExBcHBQYWwucHJpbnRNZXNzYWdlKCd2aWV3IG5vdGZvdW5kJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVjdCA9IChlLnRhcmdldCBhcyBFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgcG9zWDogbnVtYmVyID0gZS5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICBjb25zdCBwb3NZOiBudW1iZXIgPSBlLmNsaWVudFkgLSByZWN0LnRvcDtcblxuICBMQXBwRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5fdmlldy5vblRvdWNoZXNFbmRlZChwb3NYLCBwb3NZKTtcbn1cblxuLyoqXG4gKiDjgr/jg4Pjg4HjgZfjgZ/jgajjgY3jgavlkbzjgbDjgozjgovjgIJcbiAqIOinpuaRuOiwg+eUqFxuICovXG5mdW5jdGlvbiBvblRvdWNoQmVnYW4oZTogVG91Y2hFdmVudCk6IHZvaWQge1xuICBpZiAoIUxBcHBEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLl92aWV3KSB7XG4gICAgTEFwcFBhbC5wcmludE1lc3NhZ2UoJ3ZpZXcgbm90Zm91bmQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBMQXBwRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5fY2FwdHVyZWQgPSB0cnVlO1xuXG4gIGNvbnN0IHBvc1ggPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYO1xuICBjb25zdCBwb3NZID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWTtcblxuICBMQXBwRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5fdmlldy5vblRvdWNoZXNCZWdhbihwb3NYLCBwb3NZKTtcbn1cblxuLyoqXG4gKiDjgrnjg6/jgqTjg5fjgZnjgovjgajlkbzjgbDjgozjgovjgIJcbiAqIOaMieedgOenu+WKqFxuICog5ruR5YqoXG4gKi9cbmZ1bmN0aW9uIG9uVG91Y2hNb3ZlZChlOiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gIGlmICghTEFwcERlbGVnYXRlLmdldEluc3RhbmNlKCkuX2NhcHR1cmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFMQXBwRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5fdmlldykge1xuICAgIExBcHBQYWwucHJpbnRNZXNzYWdlKCd2aWV3IG5vdGZvdW5kJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHJlY3QgPSAoZS50YXJnZXQgYXMgRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgY29uc3QgcG9zWCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgY29uc3QgcG9zWSA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSAtIHJlY3QudG9wO1xuXG4gIExBcHBEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLl92aWV3Lm9uVG91Y2hlc01vdmVkKHBvc1gsIHBvc1kpO1xufVxuXG4vKipcbiAqIOinpuaRuOe7k+adnyDosIPnlKhcbiAqL1xuZnVuY3Rpb24gb25Ub3VjaEVuZGVkKGU6IFRvdWNoRXZlbnQpOiB2b2lkIHtcbiAgTEFwcERlbGVnYXRlLmdldEluc3RhbmNlKCkuX2NhcHR1cmVkID0gZmFsc2U7XG5cbiAgaWYgKCFMQXBwRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5fdmlldykge1xuICAgIExBcHBQYWwucHJpbnRNZXNzYWdlKCd2aWV3IG5vdGZvdW5kJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVjdCA9IChlLnRhcmdldCBhcyBFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICBjb25zdCBwb3NYID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICBjb25zdCBwb3NZID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gcmVjdC50b3A7XG5cbiAgTEFwcERlbGVnYXRlLmdldEluc3RhbmNlKCkuX3ZpZXcub25Ub3VjaGVzRW5kZWQocG9zWCwgcG9zWSk7XG59XG5cbi8qKlxuICog44K/44OD44OB44GM44Kt44Oj44Oz44K744Or44GV44KM44KL44Go5ZG844Gw44KM44KL44CCXG4gKiDop6bmkbjlj5bmtojosIPnlKhcbiAqL1xuZnVuY3Rpb24gb25Ub3VjaENhbmNlbChlOiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gIExBcHBEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLl9jYXB0dXJlZCA9IGZhbHNlO1xuXG4gIGlmICghTEFwcERlbGVnYXRlLmdldEluc3RhbmNlKCkuX3ZpZXcpIHtcbiAgICBMQXBwUGFsLnByaW50TWVzc2FnZSgndmlldyBub3Rmb3VuZCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJlY3QgPSAoZS50YXJnZXQgYXMgRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgY29uc3QgcG9zWCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgY29uc3QgcG9zWSA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSAtIHJlY3QudG9wO1xuXG4gIExBcHBEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLl92aWV3Lm9uVG91Y2hlc0VuZGVkKHBvc1gsIHBvc1kpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvKipcbiAgICog5paH5a2X5YiX44Kv44Op44K544CCXG4gICAqL1xuICBleHBvcnQgY2xhc3MgY3NtU3RyaW5nIHtcbiAgICAvKipcbiAgICAgKiDmloflrZfliJfjgpLlvozmlrnjgavov73liqDjgZnjgotcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjIOi/veWKoOOBmeOCi+aWh+Wtl+WIl1xuICAgICAqIEByZXR1cm4g5pu05paw44GV44KM44Gf5paH5a2X5YiXXG4gICAgICovXG4gICAgcHVibGljIGFwcGVuZChjOiBzdHJpbmcsIGxlbmd0aD86IG51bWJlcik6IGNzbVN0cmluZyB7XG4gICAgICB0aGlzLnMgKz0gbGVuZ3RoICE9PSB1bmRlZmluZWQgPyBjLnN1YnN0cigwLCBsZW5ndGgpIDogYztcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5paH5a2X44K144Kk44K644KS5ouh5by144GX44Gm5paH5a2X44KS5Z+L44KB44KLXG4gICAgICogQHBhcmFtIGxlbmd0aCAgICDmi6HlvLXjgZnjgovmloflrZfmlbBcbiAgICAgKiBAcGFyYW0gdiAgICAgICAgIOWfi+OCgeOCi+aWh+Wtl1xuICAgICAqIEByZXR1cm4g5pu05paw44GV44KM44Gf5paH5a2X5YiXXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuc2lvbihsZW5ndGg6IG51bWJlciwgdjogc3RyaW5nKTogY3NtU3RyaW5nIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5hcHBlbmQodik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaWh+Wtl+WIl+OBrumVt+OBleOCkuODkOOCpOODiOaVsOOBp+WPluW+l+OBmeOCi1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCeXRlcygpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLnMpLnJlcGxhY2UoLyUuLi9nLCAneCcpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmloflrZfliJfjga7plbfjgZXjgpLov5TjgZlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5zLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmloflrZfliJfmr5TovIMgPFxuICAgICAqIEBwYXJhbSBzIOavlOi8g+OBmeOCi+aWh+Wtl+WIl1xuICAgICAqIEByZXR1cm4gdHJ1ZTogICAg5q+U6LyD44GZ44KL5paH5a2X5YiX44KI44KK5bCP44GV44GEXG4gICAgICogQHJldHVybiBmYWxzZTogICDmr5TovIPjgZnjgovmloflrZfliJfjgojjgorlpKfjgY3jgYRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNMZXNzKHM6IGNzbVN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMucyA8IHMucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmloflrZfliJfmr5TovIMgPlxuICAgICAqIEBwYXJhbSBzIOavlOi8g+OBmeOCi+aWh+Wtl+WIl1xuICAgICAqIEByZXR1cm4gdHJ1ZTogICAg5q+U6LyD44GZ44KL5paH5a2X5YiX44KI44KK5aSn44GN44GEXG4gICAgICogQHJldHVybiBmYWxzZTogICDmr5TovIPjgZnjgovmloflrZfliJfjgojjgorlsI/jgZXjgYRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNHcmVhdChzOiBjc21TdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLnMgPiBzLnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5paH5a2X5YiX5q+U6LyDID09XG4gICAgICogQHBhcmFtIHMg5q+U6LyD44GZ44KL5paH5a2X5YiXXG4gICAgICogQHJldHVybiB0cnVlOiAgICDmr5TovIPjgZnjgovmloflrZfliJfjgajnrYnjgZfjgYRcbiAgICAgKiBAcmV0dXJuIGZhbHNlOiAgIOavlOi8g+OBmeOCi+aWh+Wtl+WIl+OBqOeVsOOBquOCi1xuICAgICAqL1xuICAgIHB1YmxpYyBpc0VxdWFsKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMucyA9PSBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaWh+Wtl+WIl+OBjOepuuOBi+OBqeOBhuOBi1xuICAgICAqIEByZXR1cm4gdHJ1ZTog56m644Gu5paH5a2X5YiXXG4gICAgICogQHJldHVybiBmYWxzZTog5YCk44GM6Kit5a6a44GV44KM44Gm44GE44KLXG4gICAgICovXG4gICAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5zLmxlbmd0aCA9PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOW8leaVsOS7mOOBjeOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMucyA9IHM7XG4gICAgfVxuXG4gICAgczogc3RyaW5nO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRoZSBMaXZlMkQgT3BlbiBTb2Z0d2FyZSBsaWNlbnNlXG4gKiB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5saXZlMmQuY29tL2V1bGEvbGl2ZTJkLW9wZW4tc29mdHdhcmUtbGljZW5zZS1hZ3JlZW1lbnRfZW4uaHRtbC5cbiAqL1xuXG5pbXBvcnQgeyBDdWJpc21Mb2dEZWJ1ZyB9IGZyb20gJy4uL3V0aWxzL2N1YmlzbWRlYnVnJztcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvKipcbiAgICogS2V5LVZhbHVl44Gu44Oa44Ki44KS5a6a576p44GZ44KL44Kv44Op44K5XG4gICAqIGNzbU1hcOOCr+ODqeOCueOBruWGhemDqOODh+ODvOOCv+OBp+S9v+eUqOOBmeOCi+OAglxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIGNzbVBhaXI8X0tleVQsIF9WYWxUPiB7XG4gICAgLyoqXG4gICAgICog44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICogQHBhcmFtIGtleSBLZXnjgajjgZfjgabjgrvjg4Pjg4jjgZnjgovlgKRcbiAgICAgKiBAcGFyYW0gdmFsdWUgVmFsdWXjgajjgZfjgabjgrvjg4Pjg4jjgZnjgovlgKRcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3Ioa2V5PzogX0tleVQsIHZhbHVlPzogX1ZhbFQpIHtcbiAgICAgIHRoaXMuZmlyc3QgPSBrZXkgPT0gdW5kZWZpbmVkID8gbnVsbCA6IGtleTtcblxuICAgICAgdGhpcy5zZWNvbmQgPSB2YWx1ZSA9PSB1bmRlZmluZWQgPyBudWxsIDogdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGZpcnN0OiBfS2V5VDsgLy8ga2V544Go44GX44Gm55So44GE44KL5aSJ5pWwXG4gICAgcHVibGljIHNlY29uZDogX1ZhbFQ7IC8vIHZhbHVl44Go44GX44Gm55So44GE44KL5aSJ5pWwXG4gIH1cblxuICAvKipcbiAgICog44Oe44OD44OX5Z6LXG4gICAqL1xuICBleHBvcnQgY2xhc3MgY3NtTWFwPF9LZXlULCBfVmFsVD4ge1xuICAgIC8qKlxuICAgICAqIOW8leaVsOS7mOOBjeOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqIEBwYXJhbSBzaXplIOWIneacn+WMluaZgueCueOBp+eiuuS/neOBmeOCi+OCteOCpOOCulxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzaXplPzogbnVtYmVyKSB7XG4gICAgICBpZiAoc2l6ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHNpemUgPCAxKSB7XG4gICAgICAgICAgdGhpcy5fa2V5VmFsdWVzID0gW107XG4gICAgICAgICAgdGhpcy5fZHVtbXlWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fa2V5VmFsdWVzID0gbmV3IEFycmF5KHNpemUpO1xuICAgICAgICAgIHRoaXMuX3NpemUgPSBzaXplO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9rZXlWYWx1ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fZHVtbXlWYWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODh+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyByZWxlYXNlKCkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCreODvOOCkui/veWKoOOBmeOCi1xuICAgICAqIEBwYXJhbSBrZXkg5paw44Gf44Gr6L+95Yqg44GZ44KL44Kt44O8XG4gICAgICovXG4gICAgcHVibGljIGFwcGVuZEtleShrZXk6IF9LZXlUKTogdm9pZCB7XG4gICAgICAvLyDmlrDjgZfjgY9LZXkvVmFsdWXjga7jg5rjgqLjgpLkvZzjgotcbiAgICAgIHRoaXMucHJlcGFyZUNhcGFjaXR5KHRoaXMuX3NpemUgKyAxLCBmYWxzZSk7IC8vIDHjgaTku6XkuIrlhaXjgovpmpnplpPjgpLkvZzjgotcbiAgICAgIC8vIOaWsOOBl+OBhGtleS92YWx1ZeOBruOCpOODs+ODh+ODg+OCr+OCueOBr19zaXplXG5cbiAgICAgIHRoaXMuX2tleVZhbHVlc1t0aGlzLl9zaXplXSA9IG5ldyBjc21QYWlyPF9LZXlULCBfVmFsVD4oa2V5KTtcbiAgICAgIHRoaXMuX3NpemUgKz0gMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmt7vlrZfmvJTnrpflrZBba2V5XeOBruOCquODvOODkOODvOODreODvOODiShnZXQpXG4gICAgICogQHBhcmFtIGtleSDmt7vlrZfjgYvjgonnibnlrprjgZXjgozjgotWYWx1ZeWApFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZShrZXk6IF9LZXlUKTogX1ZhbFQge1xuICAgICAgbGV0IGZvdW5kID0gLTE7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fc2l6ZTsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLl9rZXlWYWx1ZXNbaV0uZmlyc3QgPT0ga2V5KSB7XG4gICAgICAgICAgZm91bmQgPSBpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3VuZCA+PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9rZXlWYWx1ZXNbZm91bmRdLnNlY29uZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXBwZW5kS2V5KGtleSk7IC8vIOaWsOimj+OCreODvOOCkui/veWKoFxuICAgICAgICByZXR1cm4gdGhpcy5fa2V5VmFsdWVzW3RoaXMuX3NpemUgLSAxXS5zZWNvbmQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5re75a2X5ryU566X5a2QW2tleV3jga7jgqrjg7zjg5Djg7zjg63jg7zjg4koc2V0KVxuICAgICAqIEBwYXJhbSBrZXkg5re75a2X44GL44KJ54m55a6a44GV44KM44KLVmFsdWXlgKRcbiAgICAgKiBAcGFyYW0gdmFsdWUg5Luj5YWl44GZ44KLVmFsdWXlgKRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VmFsdWUoa2V5OiBfS2V5VCwgdmFsdWU6IF9WYWxUKTogdm9pZCB7XG4gICAgICBsZXQgZm91bmQgPSAtMTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9zaXplOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuX2tleVZhbHVlc1tpXS5maXJzdCA9PSBrZXkpIHtcbiAgICAgICAgICBmb3VuZCA9IGk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZvdW5kID49IDApIHtcbiAgICAgICAgdGhpcy5fa2V5VmFsdWVzW2ZvdW5kXS5zZWNvbmQgPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXBwZW5kS2V5KGtleSk7IC8vIOaWsOimj+OCreODvOOCkui/veWKoFxuICAgICAgICB0aGlzLl9rZXlWYWx1ZXNbdGhpcy5fc2l6ZSAtIDFdLnNlY29uZCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOW8leaVsOOBp+a4oeOBl+OBn0tleeOCkuaMgeOBpOimgee0oOOBjOWtmOWcqOOBmeOCi+OBi1xuICAgICAqIEBwYXJhbSBrZXkg5a2Y5Zyo44KS56K66KqN44GZ44KLa2V5XG4gICAgICogQHJldHVybiB0cnVlIOW8leaVsOOBp+a4oeOBl+OBn2tleeOCkuaMgeOBpOimgee0oOOBjOWtmOWcqOOBmeOCi1xuICAgICAqIEByZXR1cm4gZmFsc2Ug5byV5pWw44Gn5rih44GX44Gfa2V544KS5oyB44Gk6KaB57Sg44GM5a2Y5Zyo44GX44Gq44GEXG4gICAgICovXG4gICAgcHVibGljIGlzRXhpc3Qoa2V5OiBfS2V5VCk6IGJvb2xlYW4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9zaXplOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuX2tleVZhbHVlc1tpXS5maXJzdCA9PSBrZXkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGtleVZhbHVl44Gu44Od44Kk44Oz44K/44KS5YWo44Gm6Kej5pS+44GZ44KLXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgdGhpcy5fa2V5VmFsdWVzID0gdm9pZCAwO1xuICAgICAgdGhpcy5fa2V5VmFsdWVzID0gbnVsbDtcbiAgICAgIHRoaXMuX2tleVZhbHVlcyA9IFtdO1xuXG4gICAgICB0aGlzLl9zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjg4bjg4rjga7jgrXjgqTjgrrjgpLlj5blvpfjgZnjgotcbiAgICAgKlxuICAgICAqIEByZXR1cm4g44Kz44Oz44OG44OK44Gu44K144Kk44K6XG4gICAgICovXG4gICAgcHVibGljIGdldFNpemUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCs+ODs+ODhuODiuOBruOCreODo+ODkeOCt+ODhuOCo+OCkueiuuS/neOBmeOCi1xuICAgICAqIEBwYXJhbSBuZXdTaXplIOaWsOOBn+OBquOCreODo+ODkeOCt+ODhuOCo+OAguW8leaVsOOBruWApOOBjOePvuWcqOOBruOCteOCpOOCuuacqua6gOOBruWgtOWQiOOBr+S9leOCguOBl+OBquOBhOOAglxuICAgICAqIEBwYXJhbSBmaXRUb1NpemUgdHJ1ZeOBquOCieaMh+WumuOBl+OBn+OCteOCpOOCuuOBq+WQiOOCj+OBm+OCi+OAgmZhbHNl44Gq44KJ44K144Kk44K644KSMuWAjeeiuuS/neOBl+OBpuOBiuOBj+OAglxuICAgICAqL1xuICAgIHB1YmxpYyBwcmVwYXJlQ2FwYWNpdHkobmV3U2l6ZTogbnVtYmVyLCBmaXRUb1NpemU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIGlmIChuZXdTaXplID4gdGhpcy5fa2V5VmFsdWVzLmxlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy5fa2V5VmFsdWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgaWYgKCFmaXRUb1NpemUgJiYgbmV3U2l6ZSA8IGNzbU1hcC5EZWZhdWx0U2l6ZSlcbiAgICAgICAgICAgIG5ld1NpemUgPSBjc21NYXAuRGVmYXVsdFNpemU7XG4gICAgICAgICAgdGhpcy5fa2V5VmFsdWVzLmxlbmd0aCA9IG5ld1NpemU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFmaXRUb1NpemUgJiYgbmV3U2l6ZSA8IHRoaXMuX2tleVZhbHVlcy5sZW5ndGggKiAyKVxuICAgICAgICAgICAgbmV3U2l6ZSA9IHRoaXMuX2tleVZhbHVlcy5sZW5ndGggKiAyO1xuICAgICAgICAgIHRoaXMuX2tleVZhbHVlcy5sZW5ndGggPSBuZXdTaXplO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kz44Oz44OG44OK44Gu5YWI6aCt6KaB57Sg44KS6L+U44GZXG4gICAgICovXG4gICAgcHVibGljIGJlZ2luKCk6IGl0ZXJhdG9yPF9LZXlULCBfVmFsVD4ge1xuICAgICAgY29uc3QgaXRlOiBpdGVyYXRvcjxfS2V5VCwgX1ZhbFQ+ID0gbmV3IGl0ZXJhdG9yPF9LZXlULCBfVmFsVD4odGhpcywgMCk7XG4gICAgICByZXR1cm4gaXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCs+ODs+ODhuODiuOBrue1guerr+imgee0oOOCkui/lOOBmVxuICAgICAqL1xuICAgIHB1YmxpYyBlbmQoKTogaXRlcmF0b3I8X0tleVQsIF9WYWxUPiB7XG4gICAgICBjb25zdCBpdGU6IGl0ZXJhdG9yPF9LZXlULCBfVmFsVD4gPSBuZXcgaXRlcmF0b3I8X0tleVQsIF9WYWxUPihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5fc2l6ZVxuICAgICAgKTsgLy8g57WC5LqGXG4gICAgICByZXR1cm4gaXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCs+ODs+ODhuODiuOBi+OCieimgee0oOOCkuWJiumZpOOBmeOCi1xuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZSDliYrpmaTjgZnjgovopoHntKBcbiAgICAgKi9cbiAgICBwdWJsaWMgZXJhc2UoaXRlOiBpdGVyYXRvcjxfS2V5VCwgX1ZhbFQ+KTogaXRlcmF0b3I8X0tleVQsIF9WYWxUPiB7XG4gICAgICBjb25zdCBpbmRleDogbnVtYmVyID0gaXRlLl9pbmRleDtcbiAgICAgIGlmIChpbmRleCA8IDAgfHwgdGhpcy5fc2l6ZSA8PSBpbmRleCkge1xuICAgICAgICByZXR1cm4gaXRlOyAvLyDliYrpmaTnr4Tlm7LlpJZcbiAgICAgIH1cblxuICAgICAgLy8g5YmK6ZmkXG4gICAgICB0aGlzLl9rZXlWYWx1ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIC0tdGhpcy5fc2l6ZTtcblxuICAgICAgY29uc3QgaXRlMjogaXRlcmF0b3I8X0tleVQsIF9WYWxUPiA9IG5ldyBpdGVyYXRvcjxfS2V5VCwgX1ZhbFQ+KFxuICAgICAgICB0aGlzLFxuICAgICAgICBpbmRleFxuICAgICAgKTsgLy8g57WC5LqGXG4gICAgICByZXR1cm4gaXRlMjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjg4bjg4rjga7lgKTjgpIzMuODk+ODg+ODiOespuWPt+S7mOOBjeaVtOaVsOWei+OBp+ODgOODs+ODl+OBmeOCi1xuICAgICAqL1xuICAgIHB1YmxpYyBkdW1wQXNJbnQoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3NpemU7IGkrKykge1xuICAgICAgICBDdWJpc21Mb2dEZWJ1ZygnezB9ICwnLCB0aGlzLl9rZXlWYWx1ZXNbaV0pO1xuICAgICAgICBDdWJpc21Mb2dEZWJ1ZygnXFxuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBEZWZhdWx0U2l6ZSA9IDEwOyAvLyDjgrPjg7Pjg4bjg4rjga7liJ3mnJ/ljJbjga7jg4fjg5Xjgqnjg6vjg4jjgrXjgqTjgrpcbiAgICBwdWJsaWMgX2tleVZhbHVlczogY3NtUGFpcjxfS2V5VCwgX1ZhbFQ+W107IC8vIGtleS12YWx1ZeODmuOCouOBrumFjeWIl1xuICAgIHB1YmxpYyBfZHVtbXlWYWx1ZTogX1ZhbFQ7IC8vIOepuuOBruWApOOCkui/lOOBmeeCuuOBruODgOODn+ODvFxuICAgIHB1YmxpYyBfc2l6ZTogbnVtYmVyOyAvLyDjgrPjg7Pjg4bjg4rjga7opoHntKDmlbBcbiAgfVxuXG4gIC8qKlxuICAgKiBjc21NYXA8VD7jga7jgqTjg4bjg6zjg7zjgr9cbiAgICovXG4gIGV4cG9ydCBjbGFzcyBpdGVyYXRvcjxfS2V5VCwgX1ZhbFQ+IHtcbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih2PzogY3NtTWFwPF9LZXlULCBfVmFsVD4sIGlkeD86IG51bWJlcikge1xuICAgICAgdGhpcy5fbWFwID0gdiAhPSB1bmRlZmluZWQgPyB2IDogbmV3IGNzbU1hcDxfS2V5VCwgX1ZhbFQ+KCk7XG5cbiAgICAgIHRoaXMuX2luZGV4ID0gaWR4ICE9IHVuZGVmaW5lZCA/IGlkeCA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPea8lOeul+WtkOOBruOCquODvOODkOODvOODreODvOODiVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQoaXRlOiBpdGVyYXRvcjxfS2V5VCwgX1ZhbFQ+KTogaXRlcmF0b3I8X0tleVQsIF9WYWxUPiB7XG4gICAgICB0aGlzLl9pbmRleCA9IGl0ZS5faW5kZXg7XG4gICAgICB0aGlzLl9tYXAgPSBpdGUuX21hcDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWJjee9ruOBjSsr5ryU566X5a2Q44Gu44Kq44O844OQ44O844Ot44O844OJXG4gICAgICovXG4gICAgcHVibGljIHByZUluY3JlbWVudCgpOiBpdGVyYXRvcjxfS2V5VCwgX1ZhbFQ+IHtcbiAgICAgICsrdGhpcy5faW5kZXg7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDliY3nva7jgY0tLea8lOeul+WtkOOBruOCquODvOODkOODvOODreODvOODiVxuICAgICAqL1xuICAgIHB1YmxpYyBwcmVEZWNyZW1lbnQoKTogaXRlcmF0b3I8X0tleVQsIF9WYWxUPiB7XG4gICAgICAtLXRoaXMuX2luZGV4O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5b6M572u44GNKyvmvJTnrpflrZDjga7jgqrjg7zjg5Djg7zjg63jg7zjg4lcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jcmVtZW50KCk6IGl0ZXJhdG9yPF9LZXlULCBfVmFsVD4ge1xuICAgICAgY29uc3QgaXRlb2xkID0gbmV3IGl0ZXJhdG9yPF9LZXlULCBfVmFsVD4odGhpcy5fbWFwLCB0aGlzLl9pbmRleCsrKTsgLy8g5Y+k44GE5YCk44KS5L+d5a2YXG4gICAgICB0aGlzLl9tYXAgPSBpdGVvbGQuX21hcDtcbiAgICAgIHRoaXMuX2luZGV4ID0gaXRlb2xkLl9pbmRleDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOW+jOe9ruOBjS0t5ryU566X5a2Q44Gu44Kq44O844OQ44O844Ot44O844OJXG4gICAgICovXG4gICAgcHVibGljIGRlY3JlbWVudCgpOiBpdGVyYXRvcjxfS2V5VCwgX1ZhbFQ+IHtcbiAgICAgIGNvbnN0IGl0ZW9sZCA9IG5ldyBpdGVyYXRvcjxfS2V5VCwgX1ZhbFQ+KHRoaXMuX21hcCwgdGhpcy5faW5kZXgpOyAvLyDlj6TjgYTlgKTjgpLkv53lrZhcbiAgICAgIHRoaXMuX21hcCA9IGl0ZW9sZC5fbWFwO1xuICAgICAgdGhpcy5faW5kZXggPSBpdGVvbGQuX2luZGV4O1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKua8lOeul+WtkOOBruOCquODvOODkOODvOODreODvOODiVxuICAgICAqL1xuICAgIHB1YmxpYyBwdHIoKTogY3NtUGFpcjxfS2V5VCwgX1ZhbFQ+IHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXAuX2tleVZhbHVlc1t0aGlzLl9pbmRleF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIT3mvJTnrpdcbiAgICAgKi9cbiAgICBwdWJsaWMgbm90RXF1YWwoaXRlOiBpdGVyYXRvcjxfS2V5VCwgX1ZhbFQ+KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5faW5kZXggIT0gaXRlLl9pbmRleCB8fCB0aGlzLl9tYXAgIT0gaXRlLl9tYXA7XG4gICAgfVxuXG4gICAgX2luZGV4OiBudW1iZXI7IC8vIOOCs+ODs+ODhuODiuOBruOCpOODs+ODh+ODg+OCr+OCueWApFxuICAgIF9tYXA6IGNzbU1hcDxfS2V5VCwgX1ZhbFQ+OyAvLyDjgrPjg7Pjg4bjg4pcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1hdGggfSBmcm9tICcuLi9tYXRoL2N1YmlzbW1hdGgnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvY3ViaXNtbW9kZWwnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vdGlvbnF1ZXVlZW50cnkgfSBmcm9tICcuL2N1YmlzbW1vdGlvbnF1ZXVlZW50cnknO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGNzbXN0cmluZyB9IGZyb20gJy4uL3R5cGUvY3Ntc3RyaW5nJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjc212ZWN0b3IgfSBmcm9tICcuLi90eXBlL2NzbXZlY3Rvcic7XG5pbXBvcnQgeyBDU01fQVNTRVJUIH0gZnJvbSAnLi4vdXRpbHMvY3ViaXNtZGVidWcnO1xuaW1wb3J0IGNzbVZlY3RvciA9IGNzbXZlY3Rvci5jc21WZWN0b3I7XG5pbXBvcnQgY3NtU3RyaW5nID0gY3Ntc3RyaW5nLmNzbVN0cmluZztcbmltcG9ydCBDdWJpc21Nb3Rpb25RdWV1ZUVudHJ5ID0gY3ViaXNtbW90aW9ucXVldWVlbnRyeS5DdWJpc21Nb3Rpb25RdWV1ZUVudHJ5O1xuaW1wb3J0IEN1YmlzbU1vZGVsID0gY3ViaXNtbW9kZWwuQ3ViaXNtTW9kZWw7XG5pbXBvcnQgQ3ViaXNtTWF0aCA9IGN1YmlzbW1hdGguQ3ViaXNtTWF0aDtcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvKiog44Oi44O844K344On44Oz5YaN55Sf57WC5LqG44Kz44O844Or44OQ44OD44Kv6Zai5pWw5a6a576pICovXG4gIGV4cG9ydCB0eXBlIEZpbmlzaGVkTW90aW9uQ2FsbGJhY2sgPSAoc2VsZjogQUN1YmlzbU1vdGlvbikgPT4gdm9pZDtcblxuICAvKipcbiAgICog44Oi44O844K344On44Oz44Gu5oq96LGh5Z+65bqV44Kv44Op44K5XG4gICAqXG4gICAqIOODouODvOOCt+ODp+ODs+OBruaKveixoeWfuuW6leOCr+ODqeOCueOAgk1vdGlvblF1ZXVlTWFuYWdlcuOBq+OCiOOBo+OBpuODouODvOOCt+ODp+ODs+OBruWGjeeUn+OCkueuoeeQhuOBmeOCi+OAglxuICAgKi9cbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFDdWJpc21Nb3Rpb24ge1xuICAgIC8qKlxuICAgICAqIOOCpOODs+OCueOCv+ODs+OCueOBruegtOajhFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZGVsZXRlKG1vdGlvbjogQUN1YmlzbU1vdGlvbik6IHZvaWQge1xuICAgICAgbW90aW9uLnJlbGVhc2UoKTtcbiAgICAgIG1vdGlvbiA9IHZvaWQgMDtcbiAgICAgIG1vdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5fZmFkZUluU2Vjb25kcyA9IC0xLjA7XG4gICAgICB0aGlzLl9mYWRlT3V0U2Vjb25kcyA9IC0xLjA7XG4gICAgICB0aGlzLl93ZWlnaHQgPSAxLjA7XG4gICAgICB0aGlzLl9vZmZzZXRTZWNvbmRzID0gMC4wOyAvLyDlho3nlJ/jga7plovlp4vmmYLliLtcbiAgICAgIHRoaXMuX2ZpcmVkRXZlbnRWYWx1ZXMgPSBuZXcgY3NtVmVjdG9yPGNzbVN0cmluZz4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg4fjgrnjg4jjg6njgq/jgr/nm7jlvZPjga7lh6bnkIZcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuX3dlaWdodCA9IDAuMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg4fjg6vjga7jg5Hjg6njg6Hjg7zjgr9cbiAgICAgKiBAcGFyYW0gbW9kZWwg5a++6LGh44Gu44Oi44OH44OrXG4gICAgICogQHBhcmFtIG1vdGlvblF1ZXVlRW50cnkgQ3ViaXNtTW90aW9uUXVldWVNYW5hZ2Vy44Gn566h55CG44GV44KM44Gm44GE44KL44Oi44O844K344On44OzXG4gICAgICogQHBhcmFtIHVzZXJUaW1lU2Vjb25kcyDjg4fjg6vjgr/mmYLplpPjga7nqY3nrpflgKRb56eSXVxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVQYXJhbWV0ZXJzKFxuICAgICAgbW9kZWw6IEN1YmlzbU1vZGVsLFxuICAgICAgbW90aW9uUXVldWVFbnRyeTogQ3ViaXNtTW90aW9uUXVldWVFbnRyeSxcbiAgICAgIHVzZXJUaW1lU2Vjb25kczogbnVtYmVyXG4gICAgKTogdm9pZCB7XG4gICAgICBpZiAoIW1vdGlvblF1ZXVlRW50cnkuaXNBdmFpbGFibGUoKSB8fCBtb3Rpb25RdWV1ZUVudHJ5LmlzRmluaXNoZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghbW90aW9uUXVldWVFbnRyeS5pc1N0YXJ0ZWQoKSkge1xuICAgICAgICBtb3Rpb25RdWV1ZUVudHJ5LnNldElzU3RhcnRlZCh0cnVlKTtcbiAgICAgICAgbW90aW9uUXVldWVFbnRyeS5zZXRTdGFydFRpbWUodXNlclRpbWVTZWNvbmRzIC0gdGhpcy5fb2Zmc2V0U2Vjb25kcyk7IC8vIOODouODvOOCt+ODp+ODs+OBrumWi+Wni+aZguWIu+OCkuiomOmMslxuICAgICAgICBtb3Rpb25RdWV1ZUVudHJ5LnNldEZhZGVJblN0YXJ0VGltZSh1c2VyVGltZVNlY29uZHMpOyAvLyDjg5Xjgqfjg7zjg4njgqTjg7Pjga7plovlp4vmmYLliLtcblxuICAgICAgICBjb25zdCBkdXJhdGlvbjogbnVtYmVyID0gdGhpcy5nZXREdXJhdGlvbigpO1xuXG4gICAgICAgIGlmIChtb3Rpb25RdWV1ZUVudHJ5LmdldEVuZFRpbWUoKSA8IDApIHtcbiAgICAgICAgICAvLyDplovlp4vjgZfjgabjgYTjgarjgYTjgYbjgaHjgavntYLkuoboqK3lrprjgZfjgabjgYTjgovloLTlkIjjgYzjgYLjgovjgIJcbiAgICAgICAgICBtb3Rpb25RdWV1ZUVudHJ5LnNldEVuZFRpbWUoXG4gICAgICAgICAgICBkdXJhdGlvbiA8PSAwID8gLTEgOiBtb3Rpb25RdWV1ZUVudHJ5LmdldFN0YXJ0VGltZSgpICsgZHVyYXRpb25cbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIGR1cmF0aW9uID09IC0xIOOBruWgtOWQiOOBr+ODq+ODvOODl+OBmeOCi1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBmYWRlV2VpZ2h0OiBudW1iZXIgPSB0aGlzLl93ZWlnaHQ7IC8vIOePvuWcqOOBruWApOOBqOaOm+OBkeWQiOOCj+OBm+OCi+WJsuWQiFxuXG4gICAgICAvLy0tLS0g44OV44Kn44O844OJ44Kk44Oz44O744Ki44Km44OI44Gu5Yem55CGIC0tLS1cbiAgICAgIC8vIOWNmOe0lOOBquOCteOCpOODs+mWouaVsOOBp+OCpOODvOOCuOODs+OCsOOBmeOCi1xuICAgICAgY29uc3QgZmFkZUluOiBudW1iZXIgPVxuICAgICAgICB0aGlzLl9mYWRlSW5TZWNvbmRzID09IDAuMFxuICAgICAgICAgID8gMS4wXG4gICAgICAgICAgOiBDdWJpc21NYXRoLmdldEVhc2luZ1NpbmUoXG4gICAgICAgICAgICAgICh1c2VyVGltZVNlY29uZHMgLSBtb3Rpb25RdWV1ZUVudHJ5LmdldEZhZGVJblN0YXJ0VGltZSgpKSAvXG4gICAgICAgICAgICAgICAgdGhpcy5fZmFkZUluU2Vjb25kc1xuICAgICAgICAgICAgKTtcblxuICAgICAgY29uc3QgZmFkZU91dDogbnVtYmVyID1cbiAgICAgICAgdGhpcy5fZmFkZU91dFNlY29uZHMgPT0gMC4wIHx8IG1vdGlvblF1ZXVlRW50cnkuZ2V0RW5kVGltZSgpIDwgMC4wXG4gICAgICAgICAgPyAxLjBcbiAgICAgICAgICA6IEN1YmlzbU1hdGguZ2V0RWFzaW5nU2luZShcbiAgICAgICAgICAgICAgKG1vdGlvblF1ZXVlRW50cnkuZ2V0RW5kVGltZSgpIC0gdXNlclRpbWVTZWNvbmRzKSAvXG4gICAgICAgICAgICAgICAgdGhpcy5fZmFkZU91dFNlY29uZHNcbiAgICAgICAgICAgICk7XG5cbiAgICAgIGZhZGVXZWlnaHQgPSBmYWRlV2VpZ2h0ICogZmFkZUluICogZmFkZU91dDtcblxuICAgICAgbW90aW9uUXVldWVFbnRyeS5zZXRTdGF0ZSh1c2VyVGltZVNlY29uZHMsIGZhZGVXZWlnaHQpO1xuXG4gICAgICBDU01fQVNTRVJUKDAuMCA8PSBmYWRlV2VpZ2h0ICYmIGZhZGVXZWlnaHQgPD0gMS4wKTtcblxuICAgICAgLy8tLS0tIOWFqOOBpuOBruODkeODqeODoeODvOOCv0lE44KS44Or44O844OX44GZ44KLIC0tLS1cbiAgICAgIHRoaXMuZG9VcGRhdGVQYXJhbWV0ZXJzKFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgdXNlclRpbWVTZWNvbmRzLFxuICAgICAgICBmYWRlV2VpZ2h0LFxuICAgICAgICBtb3Rpb25RdWV1ZUVudHJ5XG4gICAgICApO1xuXG4gICAgICAvLyDlvozlh6bnkIZcbiAgICAgIC8vIOe1guS6huaZguWIu+OCkumBjuOBjuOBn+OCiee1guS6huODleODqeOCsOOCkueri+OBpuOCiyhDdWJpc21Nb3Rpb25RdWV1ZU1hbmFnZXIpXG4gICAgICBpZiAoXG4gICAgICAgIG1vdGlvblF1ZXVlRW50cnkuZ2V0RW5kVGltZSgpID4gMCAmJlxuICAgICAgICBtb3Rpb25RdWV1ZUVudHJ5LmdldEVuZFRpbWUoKSA8IHVzZXJUaW1lU2Vjb25kc1xuICAgICAgKSB7XG4gICAgICAgIG1vdGlvblF1ZXVlRW50cnkuc2V0SXNGaW5pc2hlZCh0cnVlKTsgLy8g57WC5LqGXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OV44Kn44O844OJ44Kk44Oz44Gu5pmC6ZaT44KS6Kit5a6a44GZ44KLXG4gICAgICogQHBhcmFtIGZhZGVJblNlY29uZHMg44OV44Kn44O844OJ44Kk44Oz44Gr44GL44GL44KL5pmC6ZaTW+enkl1cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmFkZUluVGltZShmYWRlSW5TZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHRoaXMuX2ZhZGVJblNlY29uZHMgPSBmYWRlSW5TZWNvbmRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODleOCp+ODvOODieOCouOCpuODiOOBruaZgumWk+OCkuioreWumuOBmeOCi1xuICAgICAqIEBwYXJhbSBmYWRlT3V0U2Vjb25kcyDjg5Xjgqfjg7zjg4njgqLjgqbjg4jjgavjgYvjgYvjgovmmYLplpNb56eSXVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRGYWRlT3V0VGltZShmYWRlT3V0U2Vjb25kczogbnVtYmVyKTogdm9pZCB7XG4gICAgICB0aGlzLl9mYWRlT3V0U2Vjb25kcyA9IGZhZGVPdXRTZWNvbmRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODleOCp+ODvOODieOCouOCpuODiOOBq+OBi+OBi+OCi+aZgumWk+OBruWPluW+l1xuICAgICAqIEByZXR1cm4g44OV44Kn44O844OJ44Ki44Km44OI44Gr44GL44GL44KL5pmC6ZaTW+enkl1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmFkZU91dFRpbWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9mYWRlT3V0U2Vjb25kcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Xjgqfjg7zjg4njgqTjg7PjgavjgYvjgYvjgovmmYLplpPjga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIOODleOCp+ODvOODieOCpOODs+OBq+OBi+OBi+OCi+aZgumWk1vnp5JdXG4gICAgICovXG4gICAgcHVibGljIGdldEZhZGVJblRpbWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9mYWRlSW5TZWNvbmRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+mBqeeUqOOBrumHjeOBv+OBruioreWumlxuICAgICAqIEBwYXJhbSB3ZWlnaHQg6YeN44G/77yIMC4wIC0gMS4w77yJXG4gICAgICovXG4gICAgcHVibGljIHNldFdlaWdodCh3ZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy5fd2VpZ2h0ID0gd2VpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+mBqeeUqOOBrumHjeOBv+OBruWPluW+l1xuICAgICAqIEByZXR1cm4g6YeN44G/77yIMC4wIC0gMS4w77yJXG4gICAgICovXG4gICAgcHVibGljIGdldFdlaWdodCgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX3dlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Pjga7plbfjgZXjga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIOODouODvOOCt+ODp+ODs+OBrumVt+OBlVvnp5JdXG4gICAgICpcbiAgICAgKiBAbm90ZSDjg6vjg7zjg5fjga7mmYLjga/jgIwtMeOAjeOAglxuICAgICAqICAgICAgIOODq+ODvOODl+OBp+OBquOBhOWgtOWQiOOBr+OAgeOCquODvOODkOODvOODqeOCpOODieOBmeOCi+OAglxuICAgICAqICAgICAgIOato+OBruWApOOBruaZguOBr+WPluW+l+OBleOCjOOCi+aZgumWk+OBp+e1guS6huOBmeOCi+OAglxuICAgICAqICAgICAgIOOAjC0x44CN44Gu5pmC44Gv5aSW6YOo44GL44KJ5YGc5q2i5ZG95Luk44GM44Gq44GE6ZmQ44KK57WC44KP44KJ44Gq44GE5Yem55CG44Go44Gq44KL44CCXG4gICAgICovXG4gICAgcHVibGljIGdldER1cmF0aW9uKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gLTEuMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Pjga7jg6vjg7zjg5cx5Zue5YiG44Gu6ZW344GV44Gu5Y+W5b6XXG4gICAgICogQHJldHVybiDjg6Ljg7zjgrfjg6fjg7Pjga7jg6vjg7zjg5fkuIDlm57liIbjga7plbfjgZVb56eSXVxuICAgICAqXG4gICAgICogQG5vdGUg44Or44O844OX44GX44Gq44GE5aC05ZCI44Gv44CBZ2V0RHVyYXRpb24oKeOBqOWQjOOBmOWApOOCkui/lOOBmVxuICAgICAqICAgICAgIOODq+ODvOODl+S4gOWbnuWIhuOBrumVt+OBleOBjOWumue+qeOBp+OBjeOBquOBhOWgtOWQiCjjg5fjg63jgrDjg6njg6DnmoTjgavli5XjgY3ntprjgZHjgovjgrXjg5bjgq/jg6njgrnjgarjgakp44Gu5aC05ZCI44Gv44CMLTHjgI3jgpLov5TjgZlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TG9vcER1cmF0aW9uKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gLTEuMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Plho3nlJ/jga7plovlp4vmmYLliLvjga7oqK3lrppcbiAgICAgKiBAcGFyYW0gb2Zmc2V0U2Vjb25kcyDjg6Ljg7zjgrfjg6fjg7Plho3nlJ/jga7plovlp4vmmYLliLtb56eSXVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRPZmZzZXRUaW1lKG9mZnNldFNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy5fb2Zmc2V0U2Vjb25kcyA9IG9mZnNldFNlY29uZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44OH44Or44Gu44OR44Op44Oh44O844K/5pu05pawXG4gICAgICpcbiAgICAgKiDjgqTjg5njg7Pjg4jnmbrngavjga7jg4Hjgqfjg4Pjgq/jgIJcbiAgICAgKiDlhaXlipvjgZnjgovmmYLplpPjga/lkbzjgbDjgozjgovjg6Ljg7zjgrfjg6fjg7Pjgr/jgqTjg5/jg7PjgrDjgpLvvJDjgajjgZfjgZ/np5LmlbDjgafooYzjgYbjgIJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBiZWZvcmVDaGVja1RpbWVTZWNvbmRzIOWJjeWbnuOBruOCpOODmeODs+ODiOODgeOCp+ODg+OCr+aZgumWk1vnp5JdXG4gICAgICogQHBhcmFtIG1vdGlvblRpbWVTZWNvbmRzIOS7iuWbnuOBruWGjeeUn+aZgumWk1vnp5JdXG4gICAgICovXG4gICAgcHVibGljIGdldEZpcmVkRXZlbnQoXG4gICAgICBiZWZvcmVDaGVja1RpbWVTZWNvbmRzOiBudW1iZXIsXG4gICAgICBtb3Rpb25UaW1lU2Vjb25kczogbnVtYmVyXG4gICAgKTogY3NtVmVjdG9yPGNzbVN0cmluZz4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpcmVkRXZlbnRWYWx1ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz44KS5pu05paw44GX44Gm44CB44Oi44OH44Or44Gr44OR44Op44Oh44O844K/5YCk44KS5Y+N5pig44GZ44KLXG4gICAgICogQHBhcmFtIG1vZGVsIOWvvuixoeOBruODouODh+ODq1xuICAgICAqIEBwYXJhbSB1c2VyVGltZVNlY29uZHMg44OH44Or44K/5pmC6ZaT44Gu56mN566X5YCkW+enkl1cbiAgICAgKiBAcGFyYW0gd2VpZ2h0IOODouODvOOCt+ODp+ODs+OBrumHjeOBv1xuICAgICAqIEBwYXJhbSBtb3Rpb25RdWV1ZUVudHJ5IEN1YmlzbU1vdGlvblF1ZXVlTWFuYWdlcuOBp+euoeeQhuOBleOCjOOBpuOBhOOCi+ODouODvOOCt+ODp+ODs1xuICAgICAqIEByZXR1cm4gdHJ1ZSDjg6Ljg4fjg6vjgbjjg5Hjg6njg6Hjg7zjgr/lgKTjga7lj43mmKDjgYLjgopcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOODouODh+ODq+OBuOOBruODkeODqeODoeODvOOCv+WApOOBruWPjeaYoOOBquOBl++8iOODouODvOOCt+ODp+ODs+OBruWkieWMluOBquOBl++8iVxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBkb1VwZGF0ZVBhcmFtZXRlcnMoXG4gICAgICBtb2RlbDogQ3ViaXNtTW9kZWwsXG4gICAgICB1c2VyVGltZVNlY29uZHM6IG51bWJlcixcbiAgICAgIHdlaWdodDogbnVtYmVyLFxuICAgICAgbW90aW9uUXVldWVFbnRyeTogQ3ViaXNtTW90aW9uUXVldWVFbnRyeVxuICAgICk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Plho3nlJ/ntYLkuobjgrPjg7zjg6vjg5Djg4Pjgq/jga7nmbvpjLJcbiAgICAgKlxuICAgICAqIOODouODvOOCt+ODp+ODs+WGjeeUn+e1guS6huOCs+ODvOODq+ODkOODg+OCr+OCkueZu+mMsuOBmeOCi+OAglxuICAgICAqIGlzRmluaXNoZWTjg5Xjg6njgrDjgpLoqK3lrprjgZnjgovjgr/jgqTjg5/jg7PjgrDjgaflkbzjgbPlh7rjgZXjgozjgovjgIJcbiAgICAgKiDku6XkuIvjga7nirbmhYvjga7pmpvjgavjga/lkbzjgbPlh7rjgZXjgozjgarjgYQ6XG4gICAgICogICAxLiDlho3nlJ/kuK3jga7jg6Ljg7zjgrfjg6fjg7PjgYzjgIzjg6vjg7zjg5fjgI3jgajjgZfjgaboqK3lrprjgZXjgozjgabjgYTjgovjgajjgY1cbiAgICAgKiAgIDIuIOOCs+ODvOODq+ODkOODg+OCr+OBjOeZu+mMsuOBleOCjOOBpuOBhOOBquOBhOaZglxuICAgICAqXG4gICAgICogQHBhcmFtIG9uRmluaXNoZWRNb3Rpb25IYW5kbGVyIOODouODvOOCt+ODp+ODs+WGjeeUn+e1guS6huOCs+ODvOODq+ODkOODg+OCr+mWouaVsFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRGaW5pc2hlZE1vdGlvbkhhbmRsZXIgPSAoXG4gICAgICBvbkZpbmlzaGVkTW90aW9uSGFuZGxlcjogRmluaXNoZWRNb3Rpb25DYWxsYmFja1xuICAgICkgPT4gKHRoaXMuX29uRmluaXNoZWRNb3Rpb24gPSBvbkZpbmlzaGVkTW90aW9uSGFuZGxlcik7XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Plho3nlJ/ntYLkuobjgrPjg7zjg6vjg5Djg4Pjgq/jga7lj5blvpdcbiAgICAgKlxuICAgICAqIOODouODvOOCt+ODp+ODs+WGjeeUn+e1guS6huOCs+ODvOODq+ODkOODg+OCr+OCkuWPluW+l+OBmeOCi+OAglxuICAgICAqXG4gICAgICogQHJldHVybiDnmbvpjLLjgZXjgozjgabjgYTjgovjg6Ljg7zjgrfjg6fjg7Plho3nlJ/ntYLkuobjgrPjg7zjg6vjg5Djg4Pjgq/plqLmlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmluaXNoZWRNb3Rpb25IYW5kbGVyID0gKCkgPT4gdGhpcy5fb25GaW5pc2hlZE1vdGlvbjtcblxuICAgIHB1YmxpYyBfZmFkZUluU2Vjb25kczogbnVtYmVyOyAvLyDjg5Xjgqfjg7zjg4njgqTjg7PjgavjgYvjgYvjgovmmYLplpNb56eSXVxuICAgIHB1YmxpYyBfZmFkZU91dFNlY29uZHM6IG51bWJlcjsgLy8g44OV44Kn44O844OJ44Ki44Km44OI44Gr44GL44GL44KL5pmC6ZaTW+enkl1cbiAgICBwdWJsaWMgX3dlaWdodDogbnVtYmVyOyAvLyDjg6Ljg7zjgrfjg6fjg7Pjga7ph43jgb9cbiAgICBwdWJsaWMgX29mZnNldFNlY29uZHM6IG51bWJlcjsgLy8g44Oi44O844K344On44Oz5YaN55Sf44Gu6ZaL5aeL5pmC6ZaTW+enkl1cblxuICAgIHB1YmxpYyBfZmlyZWRFdmVudFZhbHVlczogY3NtVmVjdG9yPGNzbVN0cmluZz47XG5cbiAgICAvLyDjg6Ljg7zjgrfjg6fjg7Plho3nlJ/ntYLkuobjgrPjg7zjg6vjg5Djg4Pjgq/plqLmlbBcbiAgICBwdWJsaWMgX29uRmluaXNoZWRNb3Rpb24/OiBGaW5pc2hlZE1vdGlvbkNhbGxiYWNrO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRoZSBMaXZlMkQgT3BlbiBTb2Z0d2FyZSBsaWNlbnNlXG4gKiB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5saXZlMmQuY29tL2V1bGEvbGl2ZTJkLW9wZW4tc29mdHdhcmUtbGljZW5zZS1hZ3JlZW1lbnRfZW4uaHRtbC5cbiAqL1xuXG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtdmVjdG9yMiB9IGZyb20gJy4vY3ViaXNtdmVjdG9yMic7XG5pbXBvcnQgQ3ViaXNtVmVjdG9yMiA9IGN1YmlzbXZlY3RvcjIuQ3ViaXNtVmVjdG9yMjtcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvKipcbiAgICog5pWw5YCk6KiI566X44Gq44Gp44Gr5L2/55So44GZ44KL44Om44O844OG44Kj44Oq44OG44Kj44Kv44Op44K5XG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtTWF0aCB7XG4gICAgLyoqXG4gICAgICog56ys5LiA5byV5pWw44Gu5YCk44KS5pyA5bCP5YCk44Go5pyA5aSn5YCk44Gu56+E5Zuy44Gr5Y+O44KB44Gf5YCk44KS6L+U44GZXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUg5Y+O44KB44KJ44KM44KL5YCkXG4gICAgICogQHBhcmFtIG1pbiAgIOevhOWbsuOBruacgOWwj+WApFxuICAgICAqIEBwYXJhbSBtYXggICDnr4Tlm7Ljga7mnIDlpKflgKRcbiAgICAgKiBAcmV0dXJuIOacgOWwj+WApOOBqOacgOWkp+WApOOBruevhOWbsuOBq+WPjuOCgeOBn+WApFxuICAgICAqL1xuICAgIHN0YXRpYyByYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgaWYgKHZhbHVlIDwgbWluKSB7XG4gICAgICAgIHZhbHVlID0gbWluO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IG1heCkge1xuICAgICAgICB2YWx1ZSA9IG1heDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCteOCpOODs+mWouaVsOOBruWApOOCkuaxguOCgeOCi1xuICAgICAqXG4gICAgICogQHBhcmFtIHgg6KeS5bqm5YCk77yI44Op44K444Ki44Oz77yJXG4gICAgICogQHJldHVybiDjgrXjgqTjg7PplqLmlbBzaW4oeCnjga7lgKRcbiAgICAgKi9cbiAgICBzdGF0aWMgc2luKHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICByZXR1cm4gTWF0aC5zaW4oeCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kz44K144Kk44Oz6Zai5pWw44Gu5YCk44KS5rGC44KB44KLXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCDop5LluqblgKQo44Op44K444Ki44OzKVxuICAgICAqIEByZXR1cm4g44Kz44K144Kk44Oz6Zai5pWwY29zKHgp44Gu5YCkXG4gICAgICovXG4gICAgc3RhdGljIGNvcyh4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIE1hdGguY29zKHgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWApOOBrue1tuWvvuWApOOCkuaxguOCgeOCi1xuICAgICAqXG4gICAgICogQHBhcmFtIHgg57W25a++5YCk44KS5rGC44KB44KL5YCkXG4gICAgICogQHJldHVybiDlgKTjga7ntbblr77lgKRcbiAgICAgKi9cbiAgICBzdGF0aWMgYWJzKHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICByZXR1cm4gTWF0aC5hYnMoeCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5bmz5pa55qC5KOODq+ODvOODiCnjgpLmsYLjgoHjgotcbiAgICAgKiBAcGFyYW0geCAtPiDlubPmlrnmoLnjgpLmsYLjgoHjgovlgKRcbiAgICAgKiBAcmV0dXJuIOWApOOBruW5s+aWueaguVxuICAgICAqL1xuICAgIHN0YXRpYyBzcXJ0KHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICByZXR1cm4gTWF0aC5zcXJ0KHgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCpOODvOOCuOODs+OCsOWHpueQhuOBleOCjOOBn+OCteOCpOODs+OCkuaxguOCgeOCi1xuICAgICAqIOODleOCp+ODvOODieOCpOODs+ODu+OCouOCpuODiOaZguOBruOCpOODvOOCuOODs+OCsOOBq+WIqeeUqOOBp+OBjeOCi1xuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIOOCpOODvOOCuOODs+OCsOOCkuihjOOBhuWApFxuICAgICAqIEByZXR1cm4g44Kk44O844K444Oz44Kw5Yem55CG44GV44KM44Gf44K144Kk44Oz5YCkXG4gICAgICovXG4gICAgc3RhdGljIGdldEVhc2luZ1NpbmUodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICBpZiAodmFsdWUgPCAwLjApIHtcbiAgICAgICAgcmV0dXJuIDAuMDtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgPiAxLjApIHtcbiAgICAgICAgcmV0dXJuIDEuMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDAuNSAtIDAuNSAqIHRoaXMuY29zKHZhbHVlICogTWF0aC5QSSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5aSn44GN44GE5pa544Gu5YCk44KS6L+U44GZXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVmdCDlt6bovrrjga7lgKRcbiAgICAgKiBAcGFyYW0gcmlnaHQg5Y+z6L6644Gu5YCkXG4gICAgICogQHJldHVybiDlpKfjgY3jgYTmlrnjga7lgKRcbiAgICAgKi9cbiAgICBzdGF0aWMgbWF4KGxlZnQ6IG51bWJlciwgcmlnaHQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICByZXR1cm4gbGVmdCA+IHJpZ2h0ID8gbGVmdCA6IHJpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWwj+OBleOBhOaWueOBruWApOOCkui/lOOBmVxuICAgICAqXG4gICAgICogQHBhcmFtIGxlZnQgIOW3pui+uuOBruWApFxuICAgICAqIEBwYXJhbSByaWdodCDlj7Povrrjga7lgKRcbiAgICAgKiBAcmV0dXJuIOWwj+OBleOBhOaWueOBruWApFxuICAgICAqL1xuICAgIHN0YXRpYyBtaW4obGVmdDogbnVtYmVyLCByaWdodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiBsZWZ0ID4gcmlnaHQgPyByaWdodCA6IGxlZnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6KeS5bqm5YCk44KS44Op44K444Ki44Oz5YCk44Gr5aSJ5o+b44GZ44KLXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVncmVlcyAgIOinkuW6puWApFxuICAgICAqIEByZXR1cm4g6KeS5bqm5YCk44GL44KJ5aSJ5o+b44GX44Gf44Op44K444Ki44Oz5YCkXG4gICAgICovXG4gICAgc3RhdGljIGRlZ3JlZXNUb1JhZGlhbihkZWdyZWVzOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIChkZWdyZWVzIC8gMTgwLjApICogTWF0aC5QSTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6njgrjjgqLjg7PlgKTjgpLop5LluqblgKTjgavlpInmj5vjgZnjgotcbiAgICAgKlxuICAgICAqIEBwYXJhbSByYWRpYW4gICAg44Op44K444Ki44Oz5YCkXG4gICAgICogQHJldHVybiDjg6njgrjjgqLjg7PlgKTjgYvjgonlpInmj5vjgZfjgZ/op5LluqblgKRcbiAgICAgKi9cbiAgICBzdGF0aWMgcmFkaWFuVG9EZWdyZWVzKHJhZGlhbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiAocmFkaWFuICogMTgwLjApIC8gTWF0aC5QSTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDvvJLjgaTjga7jg5njgq/jg4jjg6vjgYvjgonjg6njgrjjgqLjg7PlgKTjgpLmsYLjgoHjgotcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmcm9tICDlp4vngrnjg5njgq/jg4jjg6tcbiAgICAgKiBAcGFyYW0gdG8gICAg57WC54K544OZ44Kv44OI44OrXG4gICAgICogQHJldHVybiDjg6njgrjjgqLjg7PlgKTjgYvjgonmsYLjgoHjgZ/mlrnlkJHjg5njgq/jg4jjg6tcbiAgICAgKi9cbiAgICBzdGF0aWMgZGlyZWN0aW9uVG9SYWRpYW4oZnJvbTogQ3ViaXNtVmVjdG9yMiwgdG86IEN1YmlzbVZlY3RvcjIpOiBudW1iZXIge1xuICAgICAgY29uc3QgcTE6IG51bWJlciA9IE1hdGguYXRhbjIodG8ueSwgdG8ueCk7XG4gICAgICBjb25zdCBxMjogbnVtYmVyID0gTWF0aC5hdGFuMihmcm9tLnksIGZyb20ueCk7XG5cbiAgICAgIGxldCByZXQ6IG51bWJlciA9IHExIC0gcTI7XG5cbiAgICAgIHdoaWxlIChyZXQgPCAtTWF0aC5QSSkge1xuICAgICAgICByZXQgKz0gTWF0aC5QSSAqIDIuMDtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHJldCA+IE1hdGguUEkpIHtcbiAgICAgICAgcmV0IC09IE1hdGguUEkgKiAyLjA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog77yS44Gk44Gu44OZ44Kv44OI44Or44GL44KJ6KeS5bqm5YCk44KS5rGC44KB44KLXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZnJvbSAg5aeL54K544OZ44Kv44OI44OrXG4gICAgICogQHBhcmFtIHRvICAgIOe1gueCueODmeOCr+ODiOODq1xuICAgICAqIEByZXR1cm4g6KeS5bqm5YCk44GL44KJ5rGC44KB44Gf5pa55ZCR44OZ44Kv44OI44OrXG4gICAgICovXG4gICAgc3RhdGljIGRpcmVjdGlvblRvRGVncmVlcyhmcm9tOiBDdWJpc21WZWN0b3IyLCB0bzogQ3ViaXNtVmVjdG9yMik6IG51bWJlciB7XG4gICAgICBjb25zdCByYWRpYW46IG51bWJlciA9IHRoaXMuZGlyZWN0aW9uVG9SYWRpYW4oZnJvbSwgdG8pO1xuICAgICAgbGV0IGRlZ3JlZTogbnVtYmVyID0gdGhpcy5yYWRpYW5Ub0RlZ3JlZXMocmFkaWFuKTtcblxuICAgICAgaWYgKHRvLnggLSBmcm9tLnggPiAwLjApIHtcbiAgICAgICAgZGVncmVlID0gLWRlZ3JlZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlZ3JlZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6njgrjjgqLjg7PlgKTjgpLmlrnlkJHjg5njgq/jg4jjg6vjgavlpInmj5vjgZnjgovjgIJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b3RhbEFuZ2xlICAgIOODqeOCuOOCouODs+WApFxuICAgICAqIEByZXR1cm4g44Op44K444Ki44Oz5YCk44GL44KJ5aSJ5o+b44GX44Gf5pa55ZCR44OZ44Kv44OI44OrXG4gICAgICovXG5cbiAgICBzdGF0aWMgcmFkaWFuVG9EaXJlY3Rpb24odG90YWxBbmdsZTogbnVtYmVyKTogQ3ViaXNtVmVjdG9yMiB7XG4gICAgICBjb25zdCByZXQ6IEN1YmlzbVZlY3RvcjIgPSBuZXcgQ3ViaXNtVmVjdG9yMigpO1xuXG4gICAgICByZXQueCA9IHRoaXMuc2luKHRvdGFsQW5nbGUpO1xuICAgICAgcmV0LnkgPSB0aGlzLmNvcyh0b3RhbEFuZ2xlKTtcblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvKipcbiAgICogMuasoeWFg+ODmeOCr+ODiOODq+Wei1xuICAgKlxuICAgKiAy5qyh5YWD44OZ44Kv44OI44Or5Z6L44Gu5qmf6IO944KS5o+Q5L6b44GZ44KL44CCXG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtVmVjdG9yMiB7XG4gICAgLyoqXG4gICAgICog44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyB4PzogbnVtYmVyLCBwdWJsaWMgeT86IG51bWJlcikge1xuICAgICAgdGhpcy54ID0geCA9PSB1bmRlZmluZWQgPyAwLjAgOiB4O1xuXG4gICAgICB0aGlzLnkgPSB5ID09IHVuZGVmaW5lZCA/IDAuMCA6IHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OZ44Kv44OI44Or44Gu5Yqg566XXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmVjdG9yMiDliqDnrpfjgZnjgovjg5njgq/jg4jjg6vlgKRcbiAgICAgKiBAcmV0dXJuIOWKoOeul+e1kOaenCDjg5njgq/jg4jjg6vlgKRcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkKHZlY3RvcjI6IEN1YmlzbVZlY3RvcjIpOiBDdWJpc21WZWN0b3IyIHtcbiAgICAgIGNvbnN0IHJldDogQ3ViaXNtVmVjdG9yMiA9IG5ldyBDdWJpc21WZWN0b3IyKDAuMCwgMC4wKTtcbiAgICAgIHJldC54ID0gdGhpcy54ICsgdmVjdG9yMi54O1xuICAgICAgcmV0LnkgPSB0aGlzLnkgKyB2ZWN0b3IyLnk7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODmeOCr+ODiOODq+OBrua4m+eul1xuICAgICAqXG4gICAgICogQHBhcmFtIHZlY3RvcjIg5rib566X44GZ44KL44OZ44Kv44OI44Or5YCkXG4gICAgICogQHJldHVybiDmuJvnrpfntZDmnpwg44OZ44Kv44OI44Or5YCkXG4gICAgICovXG4gICAgcHVibGljIHN1YnN0cmFjdCh2ZWN0b3IyOiBDdWJpc21WZWN0b3IyKTogQ3ViaXNtVmVjdG9yMiB7XG4gICAgICBjb25zdCByZXQ6IEN1YmlzbVZlY3RvcjIgPSBuZXcgQ3ViaXNtVmVjdG9yMigwLjAsIDAuMCk7XG4gICAgICByZXQueCA9IHRoaXMueCAtIHZlY3RvcjIueDtcbiAgICAgIHJldC55ID0gdGhpcy55IC0gdmVjdG9yMi55O1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5njgq/jg4jjg6vjga7kuZfnrpdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2ZWN0b3IyIOS5l+eul+OBmeOCi+ODmeOCr+ODiOODq+WApFxuICAgICAqIEByZXR1cm4g5LmX566X57WQ5p6cIOODmeOCr+ODiOODq+WApFxuICAgICAqL1xuICAgIHB1YmxpYyBtdWx0aXBseSh2ZWN0b3IyOiBDdWJpc21WZWN0b3IyKTogQ3ViaXNtVmVjdG9yMiB7XG4gICAgICBjb25zdCByZXQ6IEN1YmlzbVZlY3RvcjIgPSBuZXcgQ3ViaXNtVmVjdG9yMigwLjAsIDAuMCk7XG4gICAgICByZXQueCA9IHRoaXMueCAqIHZlY3RvcjIueDtcbiAgICAgIHJldC55ID0gdGhpcy55ICogdmVjdG9yMi55O1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5njgq/jg4jjg6vjga7kuZfnrpco44K544Kr44Op44O8KVxuICAgICAqXG4gICAgICogQHBhcmFtIHNjYWxhciDkuZfnrpfjgZnjgovjgrnjgqvjg6njg7zlgKRcbiAgICAgKiBAcmV0dXJuIOS5l+eul+e1kOaenCDjg5njgq/jg4jjg6vlgKRcbiAgICAgKi9cbiAgICBwdWJsaWMgbXVsdGlwbHlCeVNjYWxlcihzY2FsYXI6IG51bWJlcik6IEN1YmlzbVZlY3RvcjIge1xuICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbHkobmV3IEN1YmlzbVZlY3RvcjIoc2NhbGFyLCBzY2FsYXIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5njgq/jg4jjg6vjga7pmaTnrpdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2ZWN0b3IyIOmZpOeul+OBmeOCi+ODmeOCr+ODiOODq+WApFxuICAgICAqIEByZXR1cm4g6Zmk566X57WQ5p6cIOODmeOCr+ODiOODq+WApFxuICAgICAqL1xuICAgIHB1YmxpYyBkaXZpc2lvbih2ZWN0b3IyOiBDdWJpc21WZWN0b3IyKTogQ3ViaXNtVmVjdG9yMiB7XG4gICAgICBjb25zdCByZXQ6IEN1YmlzbVZlY3RvcjIgPSBuZXcgQ3ViaXNtVmVjdG9yMigwLjAsIDAuMCk7XG4gICAgICByZXQueCA9IHRoaXMueCAvIHZlY3RvcjIueDtcbiAgICAgIHJldC55ID0gdGhpcy55IC8gdmVjdG9yMi55O1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5njgq/jg4jjg6vjga7pmaTnrpco44K544Kr44Op44O8KVxuICAgICAqXG4gICAgICogQHBhcmFtIHNjYWxhciDpmaTnrpfjgZnjgovjgrnjgqvjg6njg7zlgKRcbiAgICAgKiBAcmV0dXJuIOmZpOeul+e1kOaenCDjg5njgq/jg4jjg6vlgKRcbiAgICAgKi9cbiAgICBwdWJsaWMgZGl2aXNpb25CeVNjYWxhcihzY2FsYXI6IG51bWJlcik6IEN1YmlzbVZlY3RvcjIge1xuICAgICAgcmV0dXJuIHRoaXMuZGl2aXNpb24obmV3IEN1YmlzbVZlY3RvcjIoc2NhbGFyLCBzY2FsYXIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5njgq/jg4jjg6vjga7plbfjgZXjgpLlj5blvpfjgZnjgotcbiAgICAgKlxuICAgICAqIEByZXR1cm4g44OZ44Kv44OI44Or44Gu6ZW344GVXG4gICAgICovXG4gICAgcHVibGljIGdldExlbmd0aCgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODmeOCr+ODiOODq+OBrui3nembouOBruWPluW+l1xuICAgICAqXG4gICAgICogQHBhcmFtIGEg54K5XG4gICAgICogQHJldHVybiDjg5njgq/jg4jjg6vjga7ot53pm6JcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGlzdGFuY2VXaXRoKGE6IEN1YmlzbVZlY3RvcjIpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIE1hdGguc3FydChcbiAgICAgICAgKHRoaXMueCAtIGEueCkgKiAodGhpcy54IC0gYS54KSArICh0aGlzLnkgLSBhLnkpICogKHRoaXMueSAtIGEueSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OJ44OD44OI56mN44Gu6KiI566XXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYSDlgKRcbiAgICAgKiBAcmV0dXJuIOe1kOaenFxuICAgICAqL1xuICAgIHB1YmxpYyBkb3QoYTogQ3ViaXNtVmVjdG9yMik6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy54ICogYS54ICsgdGhpcy55ICogYS55O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOato+imj+WMluOBrumBqeeUqFxuICAgICAqL1xuICAgIHB1YmxpYyBub3JtYWxpemUoKTogdm9pZCB7XG4gICAgICBjb25zdCBsZW5ndGg6IG51bWJlciA9IE1hdGgucG93KHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSwgMC41KTtcblxuICAgICAgdGhpcy54ID0gdGhpcy54IC8gbGVuZ3RoO1xuICAgICAgdGhpcy55ID0gdGhpcy55IC8gbGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOetieOBl+OBleOBrueiuuiqje+8iOetieOBl+OBhOOBi++8n++8iVxuICAgICAqXG4gICAgICog5YCk44GM562J44GX44GE44GL77yfXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmhzIOeiuuiqjeOBmeOCi+WApFxuICAgICAqIEByZXR1cm4gdHJ1ZSDlgKTjga/nrYnjgZfjgYRcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOWApOOBr+etieOBl+OBj+OBquOBhFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VxdWFsKHJoczogQ3ViaXNtVmVjdG9yMik6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMueCA9PSByaHMueCAmJiB0aGlzLnkgPT0gcmhzLnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog562J44GX44GV44Gu56K66KqN77yI562J44GX44GP44Gq44GE44GL77yf77yJXG4gICAgICpcbiAgICAgKiDlgKTjgYznrYnjgZfjgY/jgarjgYTjgYvvvJ9cbiAgICAgKlxuICAgICAqIEBwYXJhbSByaHMg56K66KqN44GZ44KL5YCkXG4gICAgICogQHJldHVybiB0cnVlIOWApOOBr+etieOBl+OBj+OBquOBhFxuICAgICAqIEByZXR1cm4gZmFsc2Ug5YCk44Gv562J44GX44GEXG4gICAgICovXG4gICAgcHVibGljIGlzTm90RXF1YWwocmhzOiBDdWJpc21WZWN0b3IyKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gIXRoaXMuaXNFcXVhbChyaHMpO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuLyoqXG4gKiDjg5fjg6njg4Pjg4jjg5Xjgqnjg7zjg6Dkvp3lrZjmqZ/og73jgpLmir3osaHljJbjgZnjgosgQ3ViaXNtIFBsYXRmb3JtIEFic3RyYWN0aW9uIExheWVyLlxuICpcbiAqIOODleOCoeOCpOODq+iqreOBv+i+vOOBv+OChOaZguWIu+WPluW+l+etieOBruODl+ODqeODg+ODiOODleOCqeODvOODoOOBq+S+neWtmOOBmeOCi+mWouaVsOOCkuOBvuOBqOOCgeOCi+OAglxuICog55So5oi35bCG5L2/55So55qE5a6e6ZmF5qih5Z6L55qE5a6e546w57G7PGJyPuOAglxuICog5omn6KGM5qih5Z6L55Sf5oiQ44CB5Yqf6IO957uE5Lu255Sf5oiQ44CB5pu05paw6L+H56iL5ZKM5riy5p+T6LCD55So44CCXG4gKi9cbmV4cG9ydCBjbGFzcyBMQXBwUGFsIHtcbiAgLyoqXG4gICAqIOODleOCoeOCpOODq+OCkuODkOOCpOODiOODh+ODvOOCv+OBqOOBl+OBpuiqreOBv+OBk+OCgFxuICAgKiDlsIbmlofku7bkvZzkuLrlrZfoioLmlbDmja7or7vlj5bjgIJcbiAgICpcbiAgICogQHBhcmFtIGZpbGVQYXRoIOivu+WPluebruagh+aWh+S7tueahOi3r+W+hFxuICAgKiBAcmV0dXJuXG4gICAqIHtcbiAgICogICAgICBidWZmZXIsICAg6K+75Y+W55qE5a2X6IqC5pWw5o2uXG4gICAqICAgICAgc2l6ZSAgICAgICAg5paH5Lu25aSn5bCPXG4gICAqIH1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbG9hZEZpbGVBc0J5dGVzKFxuICAgIGZpbGVQYXRoOiBzdHJpbmcsXG4gICAgY2FsbGJhY2s6IChhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXIsIHNpemU6IG51bWJlcikgPT4gdm9pZFxuICApOiB2b2lkIHtcbiAgICBmZXRjaChmaWxlUGF0aClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpXG4gICAgICAudGhlbihhcnJheUJ1ZmZlciA9PiBjYWxsYmFjayhhcnJheUJ1ZmZlciwgYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODh+ODq+OCv+aZgumWk++8iOWJjeWbnuODleODrOODvOODoOOBqOOBruW3ruWIhu+8ieOCkuWPluW+l+OBmeOCi1xuICAgKiDojrflj5blop7ph4/ml7bpl7Qo5LiO5LiK5LiA5bin55qE5beu5YC8KVxuICAgKiBAcmV0dXJuIOWinumHj+aXtumXtFttc11cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RGVsdGFUaW1lKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc19kZWx0YVRpbWU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHVwZGF0ZVRpbWUoKTogdm9pZCB7XG4gICAgdGhpcy5zX2N1cnJlbnRGcmFtZSA9IERhdGUubm93KCk7XG4gICAgdGhpcy5zX2RlbHRhVGltZSA9ICh0aGlzLnNfY3VycmVudEZyYW1lIC0gdGhpcy5zX2xhc3RGcmFtZSkgLyAxMDAwO1xuICAgIHRoaXMuc19sYXN0RnJhbWUgPSB0aGlzLnNfY3VycmVudEZyYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIOi+k+WHuuS/oeaBr1xuICAgKiBAcGFyYW0gbWVzc2FnZSDmloflrZfliJdcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcHJpbnRNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICB9XG5cbiAgc3RhdGljIGxhc3RVcGRhdGUgPSBEYXRlLm5vdygpO1xuXG4gIHN0YXRpYyBzX2N1cnJlbnRGcmFtZSA9IDAuMDtcbiAgc3RhdGljIHNfbGFzdEZyYW1lID0gMC4wO1xuICBzdGF0aWMgc19kZWx0YVRpbWUgPSAwLjA7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIOS/neeVmeaJgOacieadg+WIqeOAglxuICpcbiAqIOacrOa6kOeggeeahOS9v+eUqOWPl0xpdmUyROW8gOaUvui9r+S7tuiuuOWPr+ivgeeahOe6puadn+OAglxuICog5Y+v5ZyoIGh0dHBzOi8vd3d3LmxpdmUyZC5jb20vZXVsYS9saXZlMmQtb3Blbi1zb2Z0d2FyZS1saWNlbnNlLWFncmVlbWVudF9lbi5odG1sLlxuICovXG5cblxuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tICdAZnJhbWV3b3JrL2xpdmUyZGN1YmlzbWZyYW1ld29yayc7XG5cbi8qKlxuICogU2FtcGxlIEFwcOOBp+S9v+eUqOOBmeOCi+WumuaVsFxuICog5bqU55So56iL5bqP5Lit5L2/55So55qE5bi46YePXG4gKi9cbi8vIOeUu+mdolxuZXhwb3J0IGNvbnN0IFZpZXdNYXhTY2FsZSA9IDIuMDtcbmV4cG9ydCBjb25zdCBWaWV3TWluU2NhbGUgPSAwLjg7XG5cbmV4cG9ydCBjb25zdCBWaWV3TG9naWNhbExlZnQgPSAtMS4wO1xuZXhwb3J0IGNvbnN0IFZpZXdMb2dpY2FsUmlnaHQgPSAxLjA7XG5cbmV4cG9ydCBjb25zdCBWaWV3TG9naWNhbE1heExlZnQgPSAtMi4wO1xuZXhwb3J0IGNvbnN0IFZpZXdMb2dpY2FsTWF4UmlnaHQgPSAyLjA7XG5leHBvcnQgY29uc3QgVmlld0xvZ2ljYWxNYXhCb3R0b20gPSAtMi4wO1xuZXhwb3J0IGNvbnN0IFZpZXdMb2dpY2FsTWF4VG9wID0gMi4wO1xuXG4vLyDnm7jlr7not6/lvoRcbi8vIOaUr+aMgee9kee7nOWcsOWdgFxuZXhwb3J0IGNvbnN0IFJlc291cmNlc1BhdGggPSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL3hpYW91NTIwL0xpdmUyZC1tb2RlbEB2MC4wLjEvJztcblxuLy8g5qih5Z6L5ZCO6Z2i55qE6IOM5pmv5Zu+54mH5paH5Lu2XG5leHBvcnQgY29uc3QgQmFja0ltYWdlTmFtZSA9ICdiYWNrX2NsYXNzX25vcm1hbC5wbmcnO1xuXG4vLyDmra/ou4ogIOm9v+i9ruOAglxuLy8gZXhwb3J0IGNvbnN0IEdlYXJJbWFnZU5hbWUgPSAnaWNvbl9nZWFyLnBuZyc7XG5cbi8vIOmAgOWcuumUrlxuLy8gZXhwb3J0IGNvbnN0IFBvd2VySW1hZ2VOYW1lID0gJ0Nsb3NlTm9ybWFsLnBuZyc7XG5cbi8vIOaooeWei+WumuS5iS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8g5qih5Z6L5omA5Zyo55qE55uu5b2V5ZCN56ew55qE5pWw57uE44CCXG4vLyDjg4fjgqPjg6zjgq/jg4jjg6rlkI3jgahtb2RlbDMuanNvbuOBruWQjeWJjeOCkuS4gOiHtOOBleOBm+OBpuOBiuOBj+OBk+OBqFxuLy8g55uu5b2V5ZCN56ew5b+F6aG75LiObW9kZWwzLmpzb27nmoTlkI3np7DkuIDoh7TjgIJcbmV4cG9ydCBjb25zdCBNb2RlbERpcjogc3RyaW5nW10gPSBbJ0hpeW9yaScsJ2tlc3Nob3ViYW4nXTtcbmV4cG9ydCBjb25zdCBNb2RlbERpclNpemU6IG51bWJlciA9IE1vZGVsRGlyLmxlbmd0aDtcblxuLy8g5LiO5aSW6YOo5a6a5LmJ5paH5Lu2KGpzb24p57uT5ZCI44CCXG5leHBvcnQgY29uc3QgTW90aW9uR3JvdXBJZGxlID0gJ0lkbGUnOyAvLyDjgqLjgqTjg4njg6rjg7PjgrAg56m66L2sIOepuumXslxuZXhwb3J0IGNvbnN0IE1vdGlvbkdyb3VwVGFwQm9keSA9ICdUYXBCb2R5JzsgLy8g54K55Ye76Lqr5L2T44CCXG5leHBvcnQgY29uc3QgTW90aW9uR3JvdXBUYXBIZWFkID0gJ1RhcEhlYWQnO1xuXG4vLyDlpJbpg6jlrprnvqnjg5XjgqHjgqTjg6vvvIhqc29u77yJ44Go5ZCI44KP44Gb44KLIOS4juWklumDqOWumuS5ieaWh+S7tihqc29uKee7k+WQiOOAglxuZXhwb3J0IGNvbnN0IEhpdEFyZWFOYW1lSGVhZCA9ICdIZWFkJztcbmV4cG9ydCBjb25zdCBIaXRBcmVhTmFtZUJvZHkgPSAnQm9keSc7XG5cbi8vIOi/kOWKqOS8mOWFiOadg+W4uOaVsFxuZXhwb3J0IGNvbnN0IFByaW9yaXR5Tm9uZSA9IDA7XG5leHBvcnQgY29uc3QgUHJpb3JpdHlJZGxlID0gMTtcbmV4cG9ydCBjb25zdCBQcmlvcml0eU5vcm1hbCA9IDI7XG5leHBvcnQgY29uc3QgUHJpb3JpdHlGb3JjZSA9IDM7XG5cbi8vIOiwg+ivleaXpeW/l+eahOaYvuekuumAiemhuVxuZXhwb3J0IGNvbnN0IERlYnVnTG9nRW5hYmxlID0gdHJ1ZTtcbmV4cG9ydCBjb25zdCBEZWJ1Z1RvdWNoTG9nRW5hYmxlID0gZmFsc2U7XG5cbi8vIOiuvue9ruahhuaetueahOaXpeW/l+i+k+WHuuawtOW5s+OAglxuZXhwb3J0IGNvbnN0IEN1YmlzbUxvZ2dpbmdMZXZlbDogTG9nTGV2ZWwgPSBMb2dMZXZlbC5Mb2dMZXZlbF9WZXJib3NlO1xuXG4vLyDpu5jorqTmuLLmn5Pnm67moIflsLrlr7hcbi8vIGV4cG9ydCBjb25zdCBSZW5kZXJUYXJnZXRXaWR0aCA9IDEwMDAwO1xuLy8gZXhwb3J0IGNvbnN0IFJlbmRlclRhcmdldEhlaWdodCA9IDEwMDtcbiIsIi8qKlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGhlIExpdmUyRCBPcGVuIFNvZnR3YXJlIGxpY2Vuc2VcbiAqIHRoYXQgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmxpdmUyZC5jb20vZXVsYS9saXZlMmQtb3Blbi1zb2Z0d2FyZS1saWNlbnNlLWFncmVlbWVudF9lbi5odG1sLlxuICovXG5cbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21tYXRyaXg0NCB9IGZyb20gJy4uL21hdGgvY3ViaXNtbWF0cml4NDQnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvY3ViaXNtbW9kZWwnO1xuaW1wb3J0IEN1YmlzbU1vZGVsID0gY3ViaXNtbW9kZWwuQ3ViaXNtTW9kZWw7XG5pbXBvcnQgQ3ViaXNtTWF0cml4NDQgPSBjdWJpc21tYXRyaXg0NC5DdWJpc21NYXRyaXg0NDtcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvKipcbiAgICog44Oi44OH44Or5o+P55S744KS5Yem55CG44GZ44KL44Os44Oz44OA44OpXG4gICAqXG4gICAqIOOCteODluOCr+ODqeOCueOBq+eSsOWig+S+neWtmOOBruaPj+eUu+WRveS7pOOCkuiomOi/sOOBmeOCi+OAglxuICAgKi9cbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIEN1YmlzbVJlbmRlcmVyIHtcbiAgICAvKipcbiAgICAgKiDjg6zjg7Pjg4Djg6njga7jgqTjg7Pjgrnjgr/jg7PjgrnjgpLnlJ/miJDjgZfjgablj5blvpfjgZnjgotcbiAgICAgKlxuICAgICAqIEByZXR1cm4g44Os44Oz44OA44Op44Gu44Kk44Oz44K544K/44Oz44K5XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUoKTogQ3ViaXNtUmVuZGVyZXIge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Os44Oz44OA44Op44Gu44Kk44Oz44K544K/44Oz44K544KS6Kej5pS+44GZ44KLXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkZWxldGUocmVuZGVyZXI6IEN1YmlzbVJlbmRlcmVyKTogdm9pZCB7XG4gICAgICByZW5kZXJlciA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Os44Oz44OA44Op44Gu5Yid5pyf5YyW5Yem55CG44KS5a6f6KGM44GZ44KLXG4gICAgICog5byV5pWw44Gr5rih44GX44Gf44Oi44OH44Or44GL44KJ44Os44Oz44OA44Op44Gu5Yid5pyf5YyW5Yem55CG44Gr5b+F6KaB44Gq5oOF5aCx44KS5Y+W44KK5Ye644GZ44GT44Go44GM44Gn44GN44KLXG4gICAgICogQHBhcmFtIG1vZGVsIOODouODh+ODq+OBruOCpOODs+OCueOCv+ODs+OCuVxuICAgICAqL1xuICAgIHB1YmxpYyBpbml0aWFsaXplKG1vZGVsOiBDdWJpc21Nb2RlbCk6IHZvaWQge1xuICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg4fjg6vjgpLmj4/nlLvjgZnjgotcbiAgICAgKi9cbiAgICBwdWJsaWMgZHJhd01vZGVsKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuZ2V0TW9kZWwoKSA9PSBudWxsKSByZXR1cm47XG5cbiAgICAgIHRoaXMuZG9EcmF3TW9kZWwoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb2RlbC1WaWV3LVByb2plY3Rpb24g6KGM5YiX44KS44K744OD44OI44GZ44KLXG4gICAgICog6YWN5YiX44Gv6KSH6KO944GV44KM44KL44Gu44Gn44CB5YWD44Gu6YWN5YiX44Gv5aSW44Gn56C05qOE44GX44Gm6Imv44GEXG4gICAgICogQHBhcmFtIG1hdHJpeDQ0IE1vZGVsLVZpZXctUHJvamVjdGlvbiDooYzliJdcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TXZwTWF0cml4KG1hdHJpeDQ0OiBDdWJpc21NYXRyaXg0NCk6IHZvaWQge1xuICAgICAgdGhpcy5fbXZwTWF0cml4NHg0LnNldE1hdHJpeChtYXRyaXg0NC5nZXRBcnJheSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb2RlbC1WaWV3LVByb2plY3Rpb24g6KGM5YiX44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiBNb2RlbC1WaWV3LVByb2plY3Rpb24g6KGM5YiXXG4gICAgICovXG4gICAgcHVibGljIGdldE12cE1hdHJpeCgpOiBDdWJpc21NYXRyaXg0NCB7XG4gICAgICByZXR1cm4gdGhpcy5fbXZwTWF0cml4NHg0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODh+ODq+OBruiJsuOCkuOCu+ODg+ODiOOBmeOCi1xuICAgICAqIOWQhOiJsjAuMH4xLjDjga7plpPjgafmjIflrprjgZnjgovvvIgxLjDjgYzmqJnmupbjga7nirbmhYvvvIlcbiAgICAgKiBAcGFyYW0gcmVkIOi1pOODgeODo+ODs+ODjeODq+OBruWApFxuICAgICAqIEBwYXJhbSBncmVlbiDnt5Hjg4Hjg6Pjg7Pjg43jg6vjga7lgKRcbiAgICAgKiBAcGFyYW0gYmx1ZSDpnZLjg4Hjg6Pjg7Pjg43jg6vjga7lgKRcbiAgICAgKiBAcGFyYW0gYWxwaGEgzrHjg4Hjg6Pjg7Pjg43jg6vjga7lgKRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TW9kZWxDb2xvcihcbiAgICAgIHJlZDogbnVtYmVyLFxuICAgICAgZ3JlZW46IG51bWJlcixcbiAgICAgIGJsdWU6IG51bWJlcixcbiAgICAgIGFscGhhOiBudW1iZXJcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmIChyZWQgPCAwLjApIHtcbiAgICAgICAgcmVkID0gMC4wO1xuICAgICAgfSBlbHNlIGlmIChyZWQgPiAxLjApIHtcbiAgICAgICAgcmVkID0gMS4wO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ3JlZW4gPCAwLjApIHtcbiAgICAgICAgZ3JlZW4gPSAwLjA7XG4gICAgICB9IGVsc2UgaWYgKGdyZWVuID4gMS4wKSB7XG4gICAgICAgIGdyZWVuID0gMS4wO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmx1ZSA8IDAuMCkge1xuICAgICAgICBibHVlID0gMC4wO1xuICAgICAgfSBlbHNlIGlmIChibHVlID4gMS4wKSB7XG4gICAgICAgIGJsdWUgPSAxLjA7XG4gICAgICB9XG5cbiAgICAgIGlmIChhbHBoYSA8IDAuMCkge1xuICAgICAgICBhbHBoYSA9IDAuMDtcbiAgICAgIH0gZWxzZSBpZiAoYWxwaGEgPiAxLjApIHtcbiAgICAgICAgYWxwaGEgPSAxLjA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX21vZGVsQ29sb3IuUiA9IHJlZDtcbiAgICAgIHRoaXMuX21vZGVsQ29sb3IuRyA9IGdyZWVuO1xuICAgICAgdGhpcy5fbW9kZWxDb2xvci5CID0gYmx1ZTtcbiAgICAgIHRoaXMuX21vZGVsQ29sb3IuQSA9IGFscGhhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODh+ODq+OBruiJsuOCkuWPluW+l+OBmeOCi1xuICAgICAqIOWQhOiJsjAuMH4xLjDjga7plpPjgafmjIflrprjgZnjgosoMS4w44GM5qiZ5rqW44Gu54q25oWLKVxuICAgICAqXG4gICAgICogQHJldHVybiBSR0JB44Gu44Kr44Op44O85oOF5aCxXG4gICAgICovXG4gICAgcHVibGljIGdldE1vZGVsQ29sb3IoKTogQ3ViaXNtVGV4dHVyZUNvbG9yIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuX21vZGVsQ29sb3IpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDkuZfnrpfmuIjjgb/OseOBruacieWKueODu+eEoeWKueOCkuOCu+ODg+ODiOOBmeOCi1xuICAgICAqIOacieWKueOBq+OBmeOCi+OBquOCiXRydWXjgIHnhKHlirnjgavjgZnjgovjgarjgolmYWxzZeOCkuOCu+ODg+ODiOOBmeOCi1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRJc1ByZW11bHRpcGxpZWRBbHBoYShlbmFibGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHRoaXMuX2lzUHJlbXVsdGlwbGllZEFscGhhID0gZW5hYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS5l+eul+a4iOOBv86x44Gu5pyJ5Yq544O754Sh5Yq544KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiB0cnVlIOS5l+eul+a4iOOBv+OBrs6x5pyJ5Yq5XG4gICAgICogQHJldHVybiBmYWxzZSDkuZfnrpfmuIjjgb/jga7OseeEoeWKuVxuICAgICAqL1xuICAgIHB1YmxpYyBpc1ByZW11bHRpcGxpZWRBbHBoYSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9pc1ByZW11bHRpcGxpZWRBbHBoYTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgqvjg6rjg7PjgrDvvIjniYfpnaLmj4/nlLvvvInjga7mnInlirnjg7vnhKHlirnjgpLjgrvjg4Pjg4jjgZnjgovjgIJcbiAgICAgKiDmnInlirnjgavjgZnjgovjgarjgol0cnVl44CB54Sh5Yq544Gr44GZ44KL44Gq44KJZmFsc2XjgpLjgrvjg4Pjg4jjgZnjgotcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0SXNDdWxsaW5nKGN1bGxpbmc6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHRoaXMuX2lzQ3VsbGluZyA9IGN1bGxpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kr44Oq44Oz44Kw77yI54mH6Z2i5o+P55S777yJ44Gu5pyJ5Yq544O754Sh5Yq544KS5Y+W5b6X44GZ44KL44CCXG4gICAgICogQHJldHVybiB0cnVlIOOCq+ODquODs+OCsOacieWKuVxuICAgICAqIEByZXR1cm4gZmFsc2Ug44Kr44Oq44Oz44Kw54Sh5Yq5XG4gICAgICovXG4gICAgcHVibGljIGlzQ3VsbGluZygpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9pc0N1bGxpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OG44Kv44K544OB44Oj44Gu55Ww5pa55oCn44OV44Kj44Or44K/44Oq44Oz44Kw44Gu44OR44Op44Oh44O844K/44KS44K744OD44OI44GZ44KLXG4gICAgICog44OR44Op44Oh44O844K/5YCk44Gu5b2x6Z+/5bqm44Gv44Os44Oz44OA44Op44Gu5a6f6KOF44Gr5L6d5a2Y44GZ44KLXG4gICAgICogQHBhcmFtIG4g44OR44Op44Oh44O844K/44Gu5YCkXG4gICAgICovXG4gICAgcHVibGljIHNldEFuaXNvdHJvcHkobjogbnVtYmVyKTogdm9pZCB7XG4gICAgICB0aGlzLl9hbmlzb3J0b3B5ID0gbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg4bjgq/jgrnjg4Hjg6Pjga7nlbDmlrnmgKfjg5XjgqPjg6vjgr/jg6rjg7PjgrDjga7jg5Hjg6njg6Hjg7zjgr/jgpLjgrvjg4Pjg4jjgZnjgotcbiAgICAgKiBAcmV0dXJuIOeVsOaWueaAp+ODleOCo+ODq+OCv+ODquODs+OCsOOBruODkeODqeODoeODvOOCv1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBbmlzb3Ryb3B5KCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fYW5pc29ydG9weTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6zjg7Pjg4Djg6rjg7PjgrDjgZnjgovjg6Ljg4fjg6vjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJuIOODrOODs+ODgOODquODs+OCsOOBmeOCi+ODouODh+ODq1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNb2RlbCgpOiBDdWJpc21Nb2RlbCB7XG4gICAgICByZXR1cm4gdGhpcy5fbW9kZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5faXNDdWxsaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLl9pc1ByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlO1xuICAgICAgdGhpcy5fYW5pc29ydG9weSA9IDAuMDtcbiAgICAgIHRoaXMuX21vZGVsID0gbnVsbDtcbiAgICAgIHRoaXMuX21vZGVsQ29sb3IgPSBuZXcgQ3ViaXNtVGV4dHVyZUNvbG9yKCk7XG5cbiAgICAgIC8vIOWNmOS9jeihjOWIl+OBq+WIneacn+WMllxuICAgICAgdGhpcy5fbXZwTWF0cml4NHg0ID0gbmV3IEN1YmlzbU1hdHJpeDQ0KCk7XG4gICAgICB0aGlzLl9tdnBNYXRyaXg0eDQubG9hZElkZW50aXR5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44OH44Or5o+P55S744Gu5a6f6KOFXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGRvRHJhd01vZGVsKCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiDmj4/nlLvjgqrjg5bjgrjjgqfjgq/jg4jvvIjjgqLjg7zjg4jjg6Hjg4Pjgrfjg6XvvInjgpLmj4/nlLvjgZnjgotcbiAgICAgKiDjg53jg6rjgrTjg7Pjg6Hjg4Pjgrfjg6Xjgajjg4bjgq/jgrnjg4Hjg6Pnlarlj7fjgpLjgrvjg4Pjg4jjgafmuKHjgZnjgIJcbiAgICAgKiBAcGFyYW0gdGV4dHVyZU5vIOaPj+eUu+OBmeOCi+ODhuOCr+OCueODgeODo+eVquWPt1xuICAgICAqIEBwYXJhbSBpbmRleENvdW50IOaPj+eUu+OCquODluOCuOOCp+OCr+ODiOOBruOCpOODs+ODh+ODg+OCr+OCueWApFxuICAgICAqIEBwYXJhbSB2ZXJ0ZXhDb3VudCDjg53jg6rjgrTjg7Pjg6Hjg4Pjgrfjg6Xjga7poILngrnmlbBcbiAgICAgKiBAcGFyYW0gaW5kZXhBcnJheSDjg53jg6rjgrTjg7Pjg6Hjg4Pjgrfjg6XpoILngrnjga7jgqTjg7Pjg4fjg4Pjgq/jgrnphY3liJdcbiAgICAgKiBAcGFyYW0gdmVydGV4QXJyYXkg44Od44Oq44K044Oz44Oh44OD44K344Ol44Gu6aCC54K56YWN5YiXXG4gICAgICogQHBhcmFtIHV2QXJyYXkgdXbphY3liJdcbiAgICAgKiBAcGFyYW0gb3BhY2l0eSDkuI3pgI/mmI7luqZcbiAgICAgKiBAcGFyYW0gY29sb3JCbGVuZE1vZGUg44Kr44Op44O844OW44Os44Oz44OH44Kj44Oz44Kw44Gu44K/44Kk44OXXG4gICAgICogQHBhcmFtIGludmVydGVkTWFzayDjg57jgrnjgq/kvb/nlKjmmYLjga7jg57jgrnjgq/jga7lj43ou6Lkvb/nlKhcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZHJhd01lc2goXG4gICAgICB0ZXh0dXJlTm86IG51bWJlcixcbiAgICAgIGluZGV4Q291bnQ6IG51bWJlcixcbiAgICAgIHZlcnRleENvdW50OiBudW1iZXIsXG4gICAgICBpbmRleEFycmF5OiBVaW50MTZBcnJheSxcbiAgICAgIHZlcnRleEFycmF5OiBGbG9hdDMyQXJyYXksXG4gICAgICB1dkFycmF5OiBGbG9hdDMyQXJyYXksXG4gICAgICBvcGFjaXR5OiBudW1iZXIsXG4gICAgICBjb2xvckJsZW5kTW9kZTogQ3ViaXNtQmxlbmRNb2RlLFxuICAgICAgaW52ZXJ0ZWRNYXNrOiBib29sZWFuXG4gICAgKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIOODrOODs+ODgOODqeOBjOS/neaMgeOBmeOCi+mdmeeahOOBquODquOCveODvOOCueOCkumWi+aUvuOBmeOCi1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc3RhdGljUmVsZWFzZTogRnVuY3Rpb247XG5cbiAgICBwcm90ZWN0ZWQgX212cE1hdHJpeDR4NDogQ3ViaXNtTWF0cml4NDQ7IC8vIE1vZGVsLVZpZXctUHJvamVjdGlvbiDooYzliJdcbiAgICBwcm90ZWN0ZWQgX21vZGVsQ29sb3I6IEN1YmlzbVRleHR1cmVDb2xvcjsgLy8g44Oi44OH44Or6Ieq5L2T44Gu44Kr44Op44O877yIUkdCQe+8iVxuICAgIHByb3RlY3RlZCBfaXNDdWxsaW5nOiBib29sZWFuOyAvLyDjgqvjg6rjg7PjgrDjgYzmnInlirnjgarjgol0cnVlXG4gICAgcHJvdGVjdGVkIF9pc1ByZW11bHRpcGxpZWRBbHBoYTogYm9vbGVhbjsgLy8g5LmX566X5riI44G/zrHjgarjgol0cnVlXG4gICAgcHJvdGVjdGVkIF9hbmlzb3J0b3B5OiBhbnk7IC8vIOODhuOCr+OCueODgeODo+OBrueVsOaWueaAp+ODleOCo+ODq+OCv+ODquODs+OCsOOBruODkeODqeODoeODvOOCv1xuICAgIHByb3RlY3RlZCBfbW9kZWw6IEN1YmlzbU1vZGVsOyAvLyDjg6zjg7Pjg4Djg6rjg7PjgrDlr77osaHjga7jg6Ljg4fjg6tcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIEN1YmlzbUJsZW5kTW9kZSB7XG4gICAgQ3ViaXNtQmxlbmRNb2RlX05vcm1hbCA9IDAsIC8vIOmAmuW4uFxuICAgIEN1YmlzbUJsZW5kTW9kZV9BZGRpdGl2ZSA9IDEsIC8vIOWKoOeul1xuICAgIEN1YmlzbUJsZW5kTW9kZV9NdWx0aXBsaWNhdGl2ZSA9IDIgLy8g5LmX566XXG4gIH1cblxuICAvKipcbiAgICog44OG44Kv44K544OB44Oj44Gu6Imy44KSUkdCQeOBp+aJseOBhuOBn+OCgeOBruOCr+ODqeOCuVxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbVRleHR1cmVDb2xvciB7XG4gICAgLyoqXG4gICAgICog44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLlIgPSAxLjA7XG4gICAgICB0aGlzLkcgPSAxLjA7XG4gICAgICB0aGlzLkIgPSAxLjA7XG4gICAgICB0aGlzLkEgPSAxLjA7XG4gICAgfVxuXG4gICAgUjogbnVtYmVyOyAvLyDotaTjg4Hjg6Pjg7Pjg43jg6tcbiAgICBHOiBudW1iZXI7IC8vIOe3keODgeODo+ODs+ODjeODq1xuICAgIEI6IG51bWJlcjsgLy8g6Z2S44OB44Oj44Oz44ON44OrXG4gICAgQTogbnVtYmVyOyAvLyDOseODgeODo+ODs+ODjeODq1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIOS/neeVmeaJgOacieadg+WIqeOAglxuICpcbiAqIOacrOa6kOeggeeahOS9v+eUqOWPl0xpdmUyROW8gOaUvui9r+S7tuiuuOWPr+ivgeeahOe6puadn+OAglxuICog5Y+v5ZyoIGh0dHBzOi8vd3d3LmxpdmUyZC5jb20vZXVsYS9saXZlMmQtb3Blbi1zb2Z0d2FyZS1saWNlbnNlLWFncmVlbWVudF9lbi5odG1sLlxuICovXG5cblxuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1hdHJpeDQ0IH0gZnJvbSAnQGZyYW1ld29yay9tYXRoL2N1YmlzbW1hdHJpeDQ0JztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjc212ZWN0b3IgfSBmcm9tICdAZnJhbWV3b3JrL3R5cGUvY3NtdmVjdG9yJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBhY3ViaXNtbW90aW9uIH0gZnJvbSAnQGZyYW1ld29yay9tb3Rpb24vYWN1YmlzbW1vdGlvbic7XG5pbXBvcnQgQ3NtX2NzbVZlY3RvciA9IGNzbXZlY3Rvci5jc21WZWN0b3I7XG5pbXBvcnQgQ3NtX0N1YmlzbU1hdHJpeDQ0ID0gY3ViaXNtbWF0cml4NDQuQ3ViaXNtTWF0cml4NDQ7XG5pbXBvcnQgQUN1YmlzbU1vdGlvbiA9IGFjdWJpc21tb3Rpb24uQUN1YmlzbU1vdGlvbjtcblxuaW1wb3J0IHsgTEFwcE1vZGVsIH0gZnJvbSAnLi9sYXBwbW9kZWwnO1xuaW1wb3J0IHsgTEFwcFBhbCB9IGZyb20gJy4vbGFwcHBhbCc7XG5pbXBvcnQgeyBjYW52YXMgfSBmcm9tICcuL2xhcHBkZWxlZ2F0ZSc7XG5pbXBvcnQgKiBhcyBMQXBwRGVmaW5lIGZyb20gJy4vbGFwcGRlZmluZSc7XG5cbmV4cG9ydCBsZXQgc19pbnN0YW5jZTogTEFwcExpdmUyRE1hbmFnZXIgPSBudWxsO1xuXG4vKipcbiAqIOOCteODs+ODl+ODq+OCouODl+ODquOCseODvOOCt+ODp+ODs+OBq+OBiuOBhOOBpkN1YmlzbU1vZGVs44KS566h55CG44GZ44KL44Kv44Op44K5XG4gKiDjg6Ljg4fjg6vnlJ/miJDjgajnoLTmo4TjgIHjgr/jg4Pjg5fjgqTjg5njg7Pjg4jjga7lh6bnkIbjgIHjg6Ljg4fjg6vliIfjgormm7/jgYjjgpLooYzjgYbjgIJcbiAqIOWcqOekuuS+i+W6lOeUqOeoi+W6j+S4reeUqOS6jueuoeeQhkN1YmlzbU1vZGVs55qE57G744CCXG4gKiDliJvlu7rlkozplIDmr4HmqKHlnovvvIzlpITnkIbngrnlh7vkuovku7bvvIzku6Xlj4rliIfmjaLmqKHlnovjgIJcbiAqL1xuZXhwb3J0IGNsYXNzIExBcHBMaXZlMkRNYW5hZ2VyIHtcbiAgLyoqXG4gICAqIOi/lOWbnuivpeexu+eahOS4gOS4quWunuS+i++8iOWNleS+i++8ieOAglxuICAgKiDlpoLmnpzlrp7kvovov5jmsqHmnInliJvlu7rvvIzliJnlnKjlhoXpg6jliJvlu7pcbiAgICpcbiAgICogQHJldHVybiBMQXBwTGl2ZTJETWFuYWdlciDnsbvnmoTlrp7kvotcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogTEFwcExpdmUyRE1hbmFnZXIge1xuICAgIGlmIChzX2luc3RhbmNlID09IG51bGwpIHtcbiAgICAgIHNfaW5zdGFuY2UgPSBuZXcgTEFwcExpdmUyRE1hbmFnZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc19pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjgq/jg6njgrnjga7jgqTjg7Pjgrnjgr/jg7PjgrnvvIjjgrfjg7PjgrDjg6vjg4jjg7PvvInjgpLop6PmlL7jgZnjgovjgIJcbiAgICog6YeK5pS+5LiA5Liq57G755qE5a6e5L6L77yI5Y2V5L6L77yJXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlbGVhc2VJbnN0YW5jZSgpOiB2b2lkIHtcbiAgICBpZiAoc19pbnN0YW5jZSAhPSBudWxsKSB7XG4gICAgICBzX2luc3RhbmNlID0gdm9pZCAwO1xuICAgIH1cblxuICAgIHNfaW5zdGFuY2UgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOePvuWcqOOBruOCt+ODvOODs+OBp+S/neaMgeOBl+OBpuOBhOOCi+ODouODh+ODq+OCkui/lOOBmeOAglxuICAgKiDov5Tlm57lvZPliY3lnLrmma/kuK3mjIHmnInnmoTmqKHlnovjgIJcbiAgICpcbiAgICogQHBhcmFtIG5vIOaooeWei+WIl+ihqOeahOe0ouW8leWAvFxuICAgKiBAcmV0dXJuIOi/lOWbnuaooeWei+eahOS4gOS4quWunuS+i+OAgiDlpoLmnpzntKLlvJXlgLzotoXlh7rojIPlm7TvvIzliJnkuLpOVUxM44CCXG4gICAqL1xuICBwdWJsaWMgZ2V0TW9kZWwobm86IG51bWJlcik6IExBcHBNb2RlbCB7XG4gICAgaWYgKG5vIDwgdGhpcy5fbW9kZWxzLmdldFNpemUoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21vZGVscy5hdChubyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICog6YeK5pS+5b2T5YmN5Zy65pmv5Lit55qE5omA5pyJ5qih5Z6LXG4gICAqL1xuICBwdWJsaWMgcmVsZWFzZUFsbE1vZGVsKCk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbW9kZWxzLmdldFNpemUoKTsgaSsrKSB7XG4gICAgICB0aGlzLl9tb2RlbHMuYXQoaSkucmVsZWFzZSgpO1xuICAgICAgdGhpcy5fbW9kZWxzLnNldChpLCBudWxsKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tb2RlbHMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnlLvpnaLjgpLjg4njg6njg4PjgrDjgZfjgZ/mmYLjga7lh6bnkIZcbiAgICog5ouW5Yqo55S76Z2i5pe255qE5aSE55CGXG4gICAqXG4gICAqIEBwYXJhbSB4IOeUu+mdoueahHjlnZDmoIdcbiAgICogQHBhcmFtIHkg55S76Z2i55qEWeWdkOagh1xuICAgKi9cbiAgcHVibGljIG9uRHJhZyh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIGNvbnNvbGUubG9nKCfmi5bliqjnlLvpnaLml7bnmoTlpITnkIYnKVxuICAgIC8vIGNvbnNvbGUubG9nKHgseSlcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX21vZGVscy5nZXRTaXplKCk7IGkrKykge1xuICAgICAgY29uc3QgbW9kZWw6IExBcHBNb2RlbCA9IHRoaXMuZ2V0TW9kZWwoaSk7XG5cbiAgICAgIGlmIChtb2RlbCkge1xuICAgICAgICBtb2RlbC5zZXREcmFnZ2luZyh4LCB5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog55S76Z2i44KS44K/44OD44OX44GX44Gf5pmC44Gu5Yem55CGXG4gICAqIOeCueWHu+Wxj+W5leaXtueahOWkhOeQhlxuICAgKlxuICAgKiBAcGFyYW0geCDnlLvpnaLnmoR45Z2Q5qCHXG4gICAqIEBwYXJhbSB5IOeUu+mdoueahFnlnZDmoIdcbiAgICovXG4gIHB1YmxpYyBvblRhcCh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKHgseSlcbiAgICBpZiAoTEFwcERlZmluZS5EZWJ1Z0xvZ0VuYWJsZSkge1xuICAgICAgTEFwcFBhbC5wcmludE1lc3NhZ2UoXG4gICAgICAgIGBbQVBQXXRhcCBwb2ludDoge3g6ICR7eC50b0ZpeGVkKDIpfSB5OiAke3kudG9GaXhlZCgyKX19YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX21vZGVscy5nZXRTaXplKCk7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX21vZGVscy5hdChpKS5oaXRUZXN0KExBcHBEZWZpbmUuSGl0QXJlYU5hbWVIZWFkLCB4LCB5KSkge1xuICAgICAgICBpZiAoTEFwcERlZmluZS5EZWJ1Z0xvZ0VuYWJsZSkge1xuICAgICAgICAgIExBcHBQYWwucHJpbnRNZXNzYWdlKFxuICAgICAgICAgICAgYFtBUFBdaGl0IGFyZWE6IFske0xBcHBEZWZpbmUuSGl0QXJlYU5hbWVIZWFkfV1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tb2RlbHMuYXQoaSkuc2V0UmFuZG9tRXhwcmVzc2lvbigpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9tb2RlbHMuYXQoaSkuaGl0VGVzdChMQXBwRGVmaW5lLkhpdEFyZWFOYW1lQm9keSwgeCwgeSkpIHtcbiAgICAgICAgaWYgKExBcHBEZWZpbmUuRGVidWdMb2dFbmFibGUpIHtcbiAgICAgICAgICBMQXBwUGFsLnByaW50TWVzc2FnZShcbiAgICAgICAgICAgIGBbQVBQXWhpdCBhcmVhOiBbJHtMQXBwRGVmaW5lLkhpdEFyZWFOYW1lQm9keX1dYFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGRvY3VtZW50LnRvdWNoQm9keUhhbmRsZXIoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21vZGVsc1xuICAgICAgICAgIC5hdChpKVxuICAgICAgICAgIC5zdGFydFJhbmRvbU1vdGlvbihcbiAgICAgICAgICAgIExBcHBEZWZpbmUuTW90aW9uR3JvdXBUYXBCb2R5LFxuICAgICAgICAgICAgTEFwcERlZmluZS5Qcmlvcml0eU5vcm1hbCxcbiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkTW90aW9uXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7Ly/lvZPku6XkuIrkuovku7bpg73kuI3mmK/ml7bvvIzmiJHku6zlj6/ku6XlnKjov5nph4zoh6rlrprkuYnoh6rlt7HnmoTngrnlh7vop6blj5Hkuovku7bvvIx4Wy3ml6DnqbcsK+aXoOept10gIHkgWy3ml6DnqbcsK+aXoOept11cbiAgICAgICAgLy/ku6Pooajngrnlh7vnmoTmmK/mqKHlnovnmoRjYW52YXPmiYDlnKjljLrln59cbiAgICAgICAgaWYodGhpcy5jdXJyZW50UG9zaXRpb24oeCwgeSkgPT09IExBcHBEZWZpbmUuSGl0QXJlYU5hbWVIZWFkKXtcbiAgICAgICAgICAvL+i/memHjOaYr+WktOmDqOWMuuWfn++8jOWcqOS4i+aWueiuvue9ruWvueW6lOihqOaDheWKqOS9nFxuICAgICAgICAgIC8v6L+Z5Liq5bi46YeP5piv5oiR6Ieq5bex5a6a5LmJ55qE77yM5b+Y6K6w5Yqg5LiK5LqGXG4gICAgICAgICAgdGhpcy5fbW9kZWxzLmF0KGkpLnN0YXJ0UmFuZG9tTW90aW9uKExBcHBEZWZpbmUuTW90aW9uR3JvdXBUYXBIZWFkLCBMQXBwRGVmaW5lLlByaW9yaXR5Tm9ybWFsKTtcbiAgICAgICAgfWVsc2Uge1xuICAgICAgICAgIC8v6L+Z6YeM5piv6Lqr5L2T5Yy65Z+f77yM6K6+572u5a+55bqU5Yqo5L2cXG4gICAgICAgICAgdGhpcy5fbW9kZWxzLmF0KGkpLnN0YXJ0UmFuZG9tTW90aW9uKExBcHBEZWZpbmUuTW90aW9uR3JvdXBUYXBCb2R5LCBMQXBwRGVmaW5lLlByaW9yaXR5Tm9ybWFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgY3VycmVudFBvc2l0aW9uKHg6IG51bWJlciwgeTogbnVtYmVyLCB0eXBlPSdlbmQnKXtcbiAgICBpZih4ID4gLTEgJiYgeDwxJiZ5PDEmJnk+LTEpe1xuICAgICAgLy/kvYblj6rmnInngrnlh7tjYW52YXPljLrln5/miY3mnInmlYjvvIzmnInmlYjojIPlm7TkuLogeFstMSwxXSAgeSBbLTEsMV1cbiAgICAgIGNvbnNvbGUubG9nKFwiLS0tLS0tLS1sYXBwbGl2ZTJkbWFuYWdlci50cyAtLS0gIOaCqOeCueWHu+WIsOS6hmNhbnZhc+WMuuWfny0tLS0tLS1cIik7XG4gICAgICBpZih4ID4gLTAuMjAgJiYgeCA8IDAuMjAgJiYgeT4wLjIwICYmIHk8IDAuOCl7XG4gICAgICAgIC8v6L+Z6YeM5piv5aS06YOo5Yy65Z+f77yMXG4gICAgICAgIGNvbnNvbGUubG9nKFwiLS0tLS0tLS1sYXBwbGl2ZTJkbWFuYWdlci50cyAtLS0gIOaCqOeCueWHu+WIsOS6huS6uueJqeeahOWktOmDqOWMuuWfny0tLS0tLS1cIik7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZG9jdW1lbnQudG91Y2hIZWFkSGFuZGxlcigpXG4gICAgICAgIHJldHVybiBMQXBwRGVmaW5lLkhpdEFyZWFOYW1lSGVhZFxuICAgICAgfVxuICAgICAgaWYoeCA+IC0wLjIwICYmIHggPCAwLjIwICYmIHk+LTEuMCAmJiB5PCAwLjEpe1xuICAgICAgICAvL+i/memHjOaYr+i6q+S9k+WMuuWfn++8jFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGRvY3VtZW50LnRvdWNoQm9keUhhbmRsZXIoKVxuICAgICAgICBjb25zb2xlLmxvZyhcIi0tLS0tLS0tbGFwcGxpdmUyZG1hbmFnZXIudHMgLS0tICDmgqjngrnlh7vliLDkuobkurrniannmoTouqvkvZPljLrln58tLS0tLS0tXCIpO1xuICAgICAgICByZXR1cm4gTEFwcERlZmluZS5IaXRBcmVhTmFtZUJvZHlcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIOabtOaWsOeUu+mdouaXtueahOWkhOeQhlxuICAgKiDov5vooYzmqKHlnovnmoTmm7TmlrDlpITnkIblj4rmj4/nu5jlpITnkIZcbiAgICovXG4gIHB1YmxpYyBvblVwZGF0ZSgpOiB2b2lkIHtcbiAgICBsZXQgcHJvamVjdGlvbjogQ3NtX0N1YmlzbU1hdHJpeDQ0ID0gbmV3IENzbV9DdWJpc21NYXRyaXg0NCgpO1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY2FudmFzO1xuICAgIC8vIGNvbnNvbGUubG9nKHdpZHRoLCBoZWlnaHQpXG4gICAgcHJvamVjdGlvbi5zY2FsZSgxLjAsICB3aWR0aCAvIGhlaWdodCk7XG4gICAgaWYgKHRoaXMuX3ZpZXdNYXRyaXggIT0gbnVsbCkge1xuICAgICAgcHJvamVjdGlvbi5tdWx0aXBseUJ5TWF0cml4KHRoaXMuX3ZpZXdNYXRyaXgpO1xuICAgIH1cblxuICAgIGNvbnN0IHNhdmVQcm9qZWN0aW9uOiBDc21fQ3ViaXNtTWF0cml4NDQgPSBwcm9qZWN0aW9uLmNsb25lKCk7XG4gICAgY29uc3QgbW9kZWxDb3VudDogbnVtYmVyID0gdGhpcy5fbW9kZWxzLmdldFNpemUoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9kZWxDb3VudDsgKytpKSB7XG4gICAgICBjb25zdCBtb2RlbDogTEFwcE1vZGVsID0gdGhpcy5nZXRNb2RlbChpKTtcbiAgICAgIHByb2plY3Rpb24gPSBzYXZlUHJvamVjdGlvbi5jbG9uZSgpO1xuXG4gICAgICBtb2RlbC51cGRhdGUoKTtcbiAgICAgIG1vZGVsLmRyYXcocHJvamVjdGlvbik7IC8vIOWPgueFp+a4oeOBl+OBquOBruOBp3Byb2plY3Rpb27jga/lpInos6rjgZnjgovjgIIg55Sx5LqO5piv5Y+C54Wn5Lyg6YCS77yM5omA5LulcHJvamVjdGlvbuWPmOi0qCA/P1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmjaLmiJDkuIvkuIDkuKrlnLrmma9cbiAgICog5Zyo56S65L6L5bqU55So56iL5bqP5Lit5YiH5o2i5qih5Z6L6ZuG44CCXG4gICAqL1xuICBwdWJsaWMgbmV4dFNjZW5lKCk6IHZvaWQge1xuICAgIGNvbnN0IG5vOiBudW1iZXIgPSAodGhpcy5fc2NlbmVJbmRleCArIDEpICUgTEFwcERlZmluZS5Nb2RlbERpclNpemU7XG4gICAgdGhpcy5jaGFuZ2VTY2VuZShubyk7XG4gIH1cblxuICAvKipcbiAgICog5YiH5o2i5Zy65pmvLlxuICAgKiDlnKjnpLrkvovlupTnlKjnqIvluo/kuK3liIfmjaLmqKHlnovpm4bjgIJcbiAgICpcbiAgICogQHBhcmFtIGluZGV4IOWcuuaZr+eahOe0ouW8leWAvFxuICAgKi9cbiAgcHVibGljIGNoYW5nZVNjZW5lKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9zY2VuZUluZGV4ID0gaW5kZXg7XG4gICAgaWYgKExBcHBEZWZpbmUuRGVidWdMb2dFbmFibGUpIHtcbiAgICAgIExBcHBQYWwucHJpbnRNZXNzYWdlKGBbQVBQXW1vZGVsIGluZGV4OiAke3RoaXMuX3NjZW5lSW5kZXh9YCk7XG4gICAgfVxuXG4gICAgLy8g5LuOTW9kZWxEaXJbXeS4reS/neeVmeeahOebruW9leWQjeensFxuICAgIC8vIOehruWumm1vZGVsMy5qc29u55qE6Lev5b6E44CCXG4gICAgLy8g5L2/55uu5b2V5ZCN56ew5LiObW9kZWwzLmpzb27nmoTlkI3np7DljLnphY3jgIJcbiAgICBjb25zdCBtb2RlbDogc3RyaW5nID0gTEFwcERlZmluZS5Nb2RlbERpcltpbmRleF07XG4gICAgY29uc3QgbW9kZWxQYXRoOiBzdHJpbmcgPSBMQXBwRGVmaW5lLlJlc291cmNlc1BhdGggKyBtb2RlbCArICcvJztcbiAgICBsZXQgbW9kZWxKc29uTmFtZTogc3RyaW5nID0gTEFwcERlZmluZS5Nb2RlbERpcltpbmRleF07XG4gICAgbW9kZWxKc29uTmFtZSArPSAnLm1vZGVsMy5qc29uJztcblxuICAgIHRoaXMucmVsZWFzZUFsbE1vZGVsKCk7XG4gICAgdGhpcy5fbW9kZWxzLnB1c2hCYWNrKG5ldyBMQXBwTW9kZWwoKSk7XG4gICAgdGhpcy5fbW9kZWxzLmF0KDApLmxvYWRBc3NldHMobW9kZWxQYXRoLCBtb2RlbEpzb25OYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmnoTpgKDlh73mlbBcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3ZpZXdNYXRyaXggPSBuZXcgQ3NtX0N1YmlzbU1hdHJpeDQ0KCk7XG4gICAgdGhpcy5fbW9kZWxzID0gbmV3IENzbV9jc21WZWN0b3I8TEFwcE1vZGVsPigpO1xuICAgIHRoaXMuX3NjZW5lSW5kZXggPSAwO1xuICAgIHRoaXMuY2hhbmdlU2NlbmUodGhpcy5fc2NlbmVJbmRleCk7XG4gIH1cblxuICBfdmlld01hdHJpeDogQ3NtX0N1YmlzbU1hdHJpeDQ0OyAvLyDnlKjkuo7nu5jliLbmqKHlnovnmoTop4blm77nn6npmLVcbiAgX21vZGVsczogQ3NtX2NzbVZlY3RvcjxMQXBwTW9kZWw+OyAvLyDmqKHlnovlrp7kvovnmoTlrrnlmahcbiAgX3NjZW5lSW5kZXg6IG51bWJlcjsgLy8g6KaB5pi+56S65Zy65pmv55qE57Si5byV5YC8XG4gIC8vIOWKqOS9nOWbnuaUvue7k+adn+aXtueahOWbnuiwg+WKn+iDvVxuICBfZmluaXNoZWRNb3Rpb24gPSAoc2VsZjogQUN1YmlzbU1vdGlvbik6IHZvaWQgPT4ge1xuICAgIExBcHBQYWwucHJpbnRNZXNzYWdlKCdNb3Rpb24gRmluaXNoZWQ6Jyk7XG4gICAgY29uc29sZS5sb2coc2VsZik7XG4gIH07XG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRoZSBMaXZlMkQgT3BlbiBTb2Z0d2FyZSBsaWNlbnNlXG4gKiB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5saXZlMmQuY29tL2V1bGEvbGl2ZTJkLW9wZW4tc29mdHdhcmUtbGljZW5zZS1hZ3JlZW1lbnRfZW4uaHRtbC5cbiAqL1xuXG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgYWN1YmlzbW1vdGlvbiB9IGZyb20gJy4vYWN1YmlzbW1vdGlvbic7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtbW90aW9ucXVldWVlbnRyeSB9IGZyb20gJy4vY3ViaXNtbW90aW9ucXVldWVlbnRyeSc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3NtdmVjdG9yIH0gZnJvbSAnLi4vdHlwZS9jc212ZWN0b3InO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvY3ViaXNtbW9kZWwnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGNzbXN0cmluZyB9IGZyb20gJy4uL3R5cGUvY3Ntc3RyaW5nJztcbmltcG9ydCBjc21TdHJpbmcgPSBjc21zdHJpbmcuY3NtU3RyaW5nO1xuaW1wb3J0IEN1YmlzbU1vZGVsID0gY3ViaXNtbW9kZWwuQ3ViaXNtTW9kZWw7XG5pbXBvcnQgY3NtVmVjdG9yID0gY3NtdmVjdG9yLmNzbVZlY3RvcjtcbmltcG9ydCBpdGVyYXRvciA9IGNzbXZlY3Rvci5pdGVyYXRvcjtcbmltcG9ydCBDdWJpc21Nb3Rpb25RdWV1ZUVudHJ5ID0gY3ViaXNtbW90aW9ucXVldWVlbnRyeS5DdWJpc21Nb3Rpb25RdWV1ZUVudHJ5O1xuaW1wb3J0IEFDdWJpc21Nb3Rpb24gPSBhY3ViaXNtbW90aW9uLkFDdWJpc21Nb3Rpb247XG5cbmV4cG9ydCBuYW1lc3BhY2UgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIHtcbiAgLyoqXG4gICAqIOODouODvOOCt+ODp+ODs+WGjeeUn+OBrueuoeeQhlxuICAgKlxuICAgKiDjg6Ljg7zjgrfjg6fjg7Plho3nlJ/jga7nrqHnkIbnlKjjgq/jg6njgrnjgIJDdWJpc21Nb3Rpb27jg6Ljg7zjgrfjg6fjg7PjgarjgalBQ3ViaXNtTW90aW9u44Gu44K144OW44Kv44Op44K544KS5YaN55Sf44GZ44KL44Gf44KB44Gr5L2/55So44GZ44KL44CCXG4gICAqXG4gICAqIEBub3RlIOWGjeeUn+S4reOBq+WIpeOBruODouODvOOCt+ODp+ODs+OBjCBTdGFydE1vdGlvbigp44GV44KM44Gf5aC05ZCI44Gv44CB5paw44GX44GE44Oi44O844K344On44Oz44Gr5ruR44KJ44GL44Gr5aSJ5YyW44GX5pen44Oi44O844K344On44Oz44Gv5Lit5pat44GZ44KL44CCXG4gICAqICAgICAgIOihqOaDheeUqOODouODvOOCt+ODp+ODs+OAgeS9k+eUqOODouODvOOCt+ODp+ODs+OBquOBqeOCkuWIhuOBkeOBpuODouODvOOCt+ODp+ODs+WMluOBl+OBn+WgtOWQiOOBquOBqeOAgVxuICAgKiAgICAgICDopIfmlbDjga7jg6Ljg7zjgrfjg6fjg7PjgpLlkIzmmYLjgavlho3nlJ/jgZXjgZvjgovloLTlkIjjga/jgIHopIfmlbDjga5DdWJpc21Nb3Rpb25RdWV1ZU1hbmFnZXLjgqTjg7Pjgrnjgr/jg7PjgrnjgpLkvb/nlKjjgZnjgovjgIJcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBDdWJpc21Nb3Rpb25RdWV1ZU1hbmFnZXIge1xuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuX3VzZXJUaW1lU2Vjb25kcyA9IDAuMDtcbiAgICAgIHRoaXMuX2V2ZW50Q2FsbEJhY2sgPSBudWxsO1xuICAgICAgdGhpcy5fZXZlbnRDdXN0b21EYXRhID0gbnVsbDtcbiAgICAgIHRoaXMuX21vdGlvbnMgPSBuZXcgY3NtVmVjdG9yPEN1YmlzbU1vdGlvblF1ZXVlRW50cnk+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OH44K544OI44Op44Kv44K/XG4gICAgICovXG4gICAgcHVibGljIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX21vdGlvbnMuZ2V0U2l6ZSgpOyArK2kpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vdGlvbnMuYXQoaSkpIHtcbiAgICAgICAgICB0aGlzLl9tb3Rpb25zLmF0KGkpLnJlbGVhc2UoKTtcbiAgICAgICAgICB0aGlzLl9tb3Rpb25zLnNldChpLCB2b2lkIDApO1xuICAgICAgICAgIHRoaXMuX21vdGlvbnMuc2V0KGksIG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX21vdGlvbnMgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaMh+WumuOBl+OBn+ODouODvOOCt+ODp+ODs+OBrumWi+Wni1xuICAgICAqXG4gICAgICog5oyH5a6a44GX44Gf44Oi44O844K344On44Oz44KS6ZaL5aeL44GZ44KL44CC5ZCM44GY44K/44Kk44OX44Gu44Oi44O844K344On44Oz44GM5pei44Gr44GC44KL5aC05ZCI44Gv44CB5pei5a2Y44Gu44Oi44O844K344On44Oz44Gr57WC5LqG44OV44Op44Kw44KS56uL44Gm44CB44OV44Kn44O844OJ44Ki44Km44OI44KS6ZaL5aeL44GV44Gb44KL44CCXG4gICAgICpcbiAgICAgKiBAcGFyYW0gICBtb3Rpb24gICAgICAgICAg6ZaL5aeL44GZ44KL44Oi44O844K344On44OzXG4gICAgICogQHBhcmFtICAgYXV0b0RlbGV0ZSAgICAgIOWGjeeUn+OBjOe1guS6huOBl+OBn+ODouODvOOCt+ODp+ODs+OBruOCpOODs+OCueOCv+ODs+OCueOCkuWJiumZpOOBmeOCi+OBquOCiSB0cnVlXG4gICAgICogQHBhcmFtICAgdXNlclRpbWVTZWNvbmRzIOODh+ODq+OCv+aZgumWk+OBruepjeeul+WApFvnp5JdXG4gICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICDplovlp4vjgZfjgZ/jg6Ljg7zjgrfjg6fjg7Pjga7orZjliKXnlarlj7fjgpLov5TjgZnjgILlgIvliKXjga7jg6Ljg7zjgrfjg6fjg7PjgYzntYLkuobjgZfjgZ/jgYvlkKbjgYvjgpLliKTlrprjgZnjgotJc0ZpbmlzaGVkKCnjga7lvJXmlbDjgafkvb/nlKjjgZnjgovjgILplovlp4vjgafjgY3jgarjgYTmmYLjga/jgIwtMeOAjVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGFydE1vdGlvbihcbiAgICAgIG1vdGlvbjogQUN1YmlzbU1vdGlvbixcbiAgICAgIGF1dG9EZWxldGU6IGJvb2xlYW4sXG4gICAgICB1c2VyVGltZVNlY29uZHM6IG51bWJlclxuICAgICk6IEN1YmlzbU1vdGlvblF1ZXVlRW50cnlIYW5kbGUge1xuICAgICAgaWYgKG1vdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBJbnZhbGlkTW90aW9uUXVldWVFbnRyeUhhbmRsZVZhbHVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgbW90aW9uUXVldWVFbnRyeTogQ3ViaXNtTW90aW9uUXVldWVFbnRyeSA9IG51bGw7XG5cbiAgICAgIC8vIOaXouOBq+ODouODvOOCt+ODp+ODs+OBjOOBguOCjOOBsOe1guS6huODleODqeOCsOOCkueri+OBpuOCi1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9tb3Rpb25zLmdldFNpemUoKTsgKytpKSB7XG4gICAgICAgIG1vdGlvblF1ZXVlRW50cnkgPSB0aGlzLl9tb3Rpb25zLmF0KGkpO1xuICAgICAgICBpZiAobW90aW9uUXVldWVFbnRyeSA9PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBtb3Rpb25RdWV1ZUVudHJ5LnN0YXJ0RmFkZW91dChcbiAgICAgICAgICBtb3Rpb25RdWV1ZUVudHJ5Ll9tb3Rpb24uZ2V0RmFkZU91dFRpbWUoKSxcbiAgICAgICAgICB1c2VyVGltZVNlY29uZHNcbiAgICAgICAgKTsgLy8g44OV44Kn44O844OJ44Ki44Km44OI44KS6ZaL5aeL44GX57WC5LqG44GZ44KLXG4gICAgICB9XG5cbiAgICAgIG1vdGlvblF1ZXVlRW50cnkgPSBuZXcgQ3ViaXNtTW90aW9uUXVldWVFbnRyeSgpOyAvLyDntYLkuobmmYLjgavnoLTmo4TjgZnjgotcbiAgICAgIG1vdGlvblF1ZXVlRW50cnkuX2F1dG9EZWxldGUgPSBhdXRvRGVsZXRlO1xuICAgICAgbW90aW9uUXVldWVFbnRyeS5fbW90aW9uID0gbW90aW9uO1xuXG4gICAgICB0aGlzLl9tb3Rpb25zLnB1c2hCYWNrKG1vdGlvblF1ZXVlRW50cnkpO1xuXG4gICAgICByZXR1cm4gbW90aW9uUXVldWVFbnRyeS5fbW90aW9uUXVldWVFbnRyeUhhbmRsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlhajjgabjga7jg6Ljg7zjgrfjg6fjg7Pjga7ntYLkuobjga7norroqo1cbiAgICAgKiBAcmV0dXJuIHRydWUg5YWo44Gm57WC5LqG44GX44Gm44GE44KLXG4gICAgICogQHJldHVybiBmYWxzZSDntYLkuobjgZfjgabjgYTjgarjgYRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGaW5pc2hlZCgpOiBib29sZWFuIHtcbiAgICAgIC8vIC0tLS0tLS0g5Yem55CG44KS6KGM44GGIC0tLS0tLS1cbiAgICAgIC8vIOaXouOBq+ODouODvOOCt+ODp+ODs+OBjOOBguOCjOOBsOe1guS6huODleODqeOCsOOCkueri+OBpuOCi1xuXG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXRlOiBpdGVyYXRvcjxDdWJpc21Nb3Rpb25RdWV1ZUVudHJ5PiA9IHRoaXMuX21vdGlvbnMuYmVnaW4oKTtcbiAgICAgICAgaXRlLm5vdEVxdWFsKHRoaXMuX21vdGlvbnMuZW5kKCkpO1xuXG4gICAgICApIHtcbiAgICAgICAgbGV0IG1vdGlvblF1ZXVlRW50cnk6IEN1YmlzbU1vdGlvblF1ZXVlRW50cnkgPSBpdGUucHRyKCk7XG5cbiAgICAgICAgaWYgKG1vdGlvblF1ZXVlRW50cnkgPT0gbnVsbCkge1xuICAgICAgICAgIGl0ZSA9IHRoaXMuX21vdGlvbnMuZXJhc2UoaXRlKTsgLy8g5YmK6ZmkXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb3Rpb246IEFDdWJpc21Nb3Rpb24gPSBtb3Rpb25RdWV1ZUVudHJ5Ll9tb3Rpb247XG5cbiAgICAgICAgaWYgKG1vdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgbW90aW9uUXVldWVFbnRyeS5yZWxlYXNlKCk7XG4gICAgICAgICAgbW90aW9uUXVldWVFbnRyeSA9IHZvaWQgMDtcbiAgICAgICAgICBtb3Rpb25RdWV1ZUVudHJ5ID0gbnVsbDtcbiAgICAgICAgICBpdGUgPSB0aGlzLl9tb3Rpb25zLmVyYXNlKGl0ZSk7IC8vIOWJiumZpFxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLS0tLS0g57WC5LqG5riI44G/44Gu5Yem55CG44GM44GC44KM44Gw5YmK6Zmk44GZ44KLIC0tLS0tLVxuICAgICAgICBpZiAoIW1vdGlvblF1ZXVlRW50cnkuaXNGaW5pc2hlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZS5wcmVJbmNyZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmjIflrprjgZfjgZ/jg6Ljg7zjgrfjg6fjg7Pjga7ntYLkuobjga7norroqo1cbiAgICAgKiBAcGFyYW0gbW90aW9uUXVldWVFbnRyeU51bWJlciDjg6Ljg7zjgrfjg6fjg7Pjga7orZjliKXnlarlj7dcbiAgICAgKiBAcmV0dXJuIHRydWUg5YWo44Gm57WC5LqG44GX44Gm44GE44KLXG4gICAgICogQHJldHVybiBmYWxzZSDntYLkuobjgZfjgabjgYTjgarjgYRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGaW5pc2hlZEJ5SGFuZGxlKFxuICAgICAgbW90aW9uUXVldWVFbnRyeU51bWJlcjogQ3ViaXNtTW90aW9uUXVldWVFbnRyeUhhbmRsZVxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgLy8g5pei44Gr44Oi44O844K344On44Oz44GM44GC44KM44Gw57WC5LqG44OV44Op44Kw44KS56uL44Gm44KLXG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaXRlOiBpdGVyYXRvcjxDdWJpc21Nb3Rpb25RdWV1ZUVudHJ5PiA9IHRoaXMuX21vdGlvbnMuYmVnaW4oKTtcbiAgICAgICAgaXRlLm5vdEVxdWFsKHRoaXMuX21vdGlvbnMuZW5kKCkpO1xuICAgICAgICBpdGUuaW5jcmVtZW50KClcbiAgICAgICkge1xuICAgICAgICBjb25zdCBtb3Rpb25RdWV1ZUVudHJ5OiBDdWJpc21Nb3Rpb25RdWV1ZUVudHJ5ID0gaXRlLnB0cigpO1xuXG4gICAgICAgIGlmIChtb3Rpb25RdWV1ZUVudHJ5ID09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBtb3Rpb25RdWV1ZUVudHJ5Ll9tb3Rpb25RdWV1ZUVudHJ5SGFuZGxlID09IG1vdGlvblF1ZXVlRW50cnlOdW1iZXIgJiZcbiAgICAgICAgICAhbW90aW9uUXVldWVFbnRyeS5pc0ZpbmlzaGVkKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlhajjgabjga7jg6Ljg7zjgrfjg6fjg7PjgpLlgZzmraLjgZnjgotcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RvcEFsbE1vdGlvbnMoKTogdm9pZCB7XG4gICAgICAvLyAtLS0tLS0tIOWHpueQhuOCkuihjOOBhiAtLS0tLS0tXG4gICAgICAvLyDml6Ljgavjg6Ljg7zjgrfjg6fjg7PjgYzjgYLjgozjgbDntYLkuobjg5Xjg6njgrDjgpLnq4vjgabjgotcblxuICAgICAgZm9yIChcbiAgICAgICAgbGV0IGl0ZTogaXRlcmF0b3I8Q3ViaXNtTW90aW9uUXVldWVFbnRyeT4gPSB0aGlzLl9tb3Rpb25zLmJlZ2luKCk7XG4gICAgICAgIGl0ZS5ub3RFcXVhbCh0aGlzLl9tb3Rpb25zLmVuZCgpKTtcblxuICAgICAgKSB7XG4gICAgICAgIGxldCBtb3Rpb25RdWV1ZUVudHJ5OiBDdWJpc21Nb3Rpb25RdWV1ZUVudHJ5ID0gaXRlLnB0cigpO1xuXG4gICAgICAgIGlmIChtb3Rpb25RdWV1ZUVudHJ5ID09IG51bGwpIHtcbiAgICAgICAgICBpdGUgPSB0aGlzLl9tb3Rpb25zLmVyYXNlKGl0ZSk7XG5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tLS0tIOe1guS6hua4iOOBv+OBruWHpueQhuOBjOOBguOCjOOBsOWJiumZpOOBmeOCiyAtLS0tLS1cbiAgICAgICAgbW90aW9uUXVldWVFbnRyeS5yZWxlYXNlKCk7XG4gICAgICAgIG1vdGlvblF1ZXVlRW50cnkgPSB2b2lkIDA7XG4gICAgICAgIG1vdGlvblF1ZXVlRW50cnkgPSBudWxsO1xuICAgICAgICBpdGUgPSB0aGlzLl9tb3Rpb25zLmVyYXNlKGl0ZSk7IC8vIOWJiumZpFxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiDmjIflrprjgZfjgZ9DdWJpc21Nb3Rpb25RdWV1ZUVudHJ544Gu5Y+W5b6XXG5cbiAgICAgICAgICogQHBhcmFtICAgbW90aW9uUXVldWVFbnRyeU51bWJlciAg44Oi44O844K344On44Oz44Gu6K2Y5Yil55Wq5Y+3XG4gICAgICAgICAqIEByZXR1cm4gIOaMh+WumuOBl+OBn0N1YmlzbU1vdGlvblF1ZXVlRW50cnlcbiAgICAgICAgICogQHJldHVybiAgbnVsbCAgIOimi+OBpOOBi+OCieOBquOBi+OBo+OBn1xuICAgICAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q3ViaXNtTW90aW9uUXVldWVFbnRyeShcbiAgICAgIG1vdGlvblF1ZXVlRW50cnlOdW1iZXI6IGFueVxuICAgICk6IEN1YmlzbU1vdGlvblF1ZXVlRW50cnkge1xuICAgICAgLy8tLS0tLS0tIOWHpueQhuOCkuihjOOBhiAtLS0tLS0tXG4gICAgICAvLyDml6Ljgavjg6Ljg7zjgrfjg6fjg7PjgYzjgYLjgozjgbDntYLkuobjg5Xjg6njgrDjgpLnq4vjgabjgotcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpdGU6IGl0ZXJhdG9yPEN1YmlzbU1vdGlvblF1ZXVlRW50cnk+ID0gdGhpcy5fbW90aW9ucy5iZWdpbigpO1xuICAgICAgICBpdGUubm90RXF1YWwodGhpcy5fbW90aW9ucy5lbmQoKSk7XG4gICAgICAgIGl0ZS5wcmVJbmNyZW1lbnQoKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG1vdGlvblF1ZXVlRW50cnk6IEN1YmlzbU1vdGlvblF1ZXVlRW50cnkgPSBpdGUucHRyKCk7XG5cbiAgICAgICAgaWYgKG1vdGlvblF1ZXVlRW50cnkgPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1vdGlvblF1ZXVlRW50cnkuX21vdGlvblF1ZXVlRW50cnlIYW5kbGUgPT0gbW90aW9uUXVldWVFbnRyeU51bWJlclxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gbW90aW9uUXVldWVFbnRyeTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgqTjg5njg7Pjg4jjgpLlj5fjgZHlj5bjgotDYWxsYmFja+OBrueZu+mMslxuICAgICAqXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIOOCs+ODvOODq+ODkOODg+OCr+mWouaVsFxuICAgICAqIEBwYXJhbSBjdXN0b21EYXRhIOOCs+ODvOODq+ODkOODg+OCr+OBq+i/lOOBleOCjOOCi+ODh+ODvOOCv1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRFdmVudENhbGxiYWNrKFxuICAgICAgY2FsbGJhY2s6IEN1YmlzbU1vdGlvbkV2ZW50RnVuY3Rpb24sXG4gICAgICBjdXN0b21EYXRhOiBhbnkgPSBudWxsXG4gICAgKTogdm9pZCB7XG4gICAgICB0aGlzLl9ldmVudENhbGxCYWNrID0gY2FsbGJhY2s7XG4gICAgICB0aGlzLl9ldmVudEN1c3RvbURhdGEgPSBjdXN0b21EYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+OCkuabtOaWsOOBl+OBpuOAgeODouODh+ODq+OBq+ODkeODqeODoeODvOOCv+WApOOCkuWPjeaYoOOBmeOCi+OAglxuICAgICAqXG4gICAgICogQHBhcmFtICAgbW9kZWwgICDlr77osaHjga7jg6Ljg4fjg6tcbiAgICAgKiBAcGFyYW0gICB1c2VyVGltZVNlY29uZHMgICDjg4fjg6vjgr/mmYLplpPjga7nqY3nrpflgKRb56eSXVxuICAgICAqIEByZXR1cm4gIHRydWUgICAg44Oi44OH44Or44G444OR44Op44Oh44O844K/5YCk44Gu5Y+N5pig44GC44KKXG4gICAgICogQHJldHVybiAgZmFsc2UgICDjg6Ljg4fjg6vjgbjjg5Hjg6njg6Hjg7zjgr/lgKTjga7lj43mmKDjgarjgZco44Oi44O844K344On44Oz44Gu5aSJ5YyW44Gq44GXKVxuICAgICAqL1xuICAgIHB1YmxpYyBkb1VwZGF0ZU1vdGlvbihcbiAgICAgIG1vZGVsOiBDdWJpc21Nb2RlbCxcbiAgICAgIHVzZXJUaW1lU2Vjb25kczogbnVtYmVyXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xuXG4gICAgICAvLyAtLS0tLS0tIOWHpueQhuOCkuihjOOBhiAtLS0tLS0tLVxuICAgICAgLy8g5pei44Gr44Oi44O844K344On44Oz44GM44GC44KM44Gw57WC5LqG44OV44Op44Kw44KS56uL44Gm44KLXG5cbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpdGU6IGl0ZXJhdG9yPEN1YmlzbU1vdGlvblF1ZXVlRW50cnk+ID0gdGhpcy5fbW90aW9ucy5iZWdpbigpO1xuICAgICAgICBpdGUubm90RXF1YWwodGhpcy5fbW90aW9ucy5lbmQoKSk7XG5cbiAgICAgICkge1xuICAgICAgICBsZXQgbW90aW9uUXVldWVFbnRyeTogQ3ViaXNtTW90aW9uUXVldWVFbnRyeSA9IGl0ZS5wdHIoKTtcblxuICAgICAgICBpZiAobW90aW9uUXVldWVFbnRyeSA9PSBudWxsKSB7XG4gICAgICAgICAgaXRlID0gdGhpcy5fbW90aW9ucy5lcmFzZShpdGUpOyAvLyDliYrpmaRcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vdGlvbjogQUN1YmlzbU1vdGlvbiA9IG1vdGlvblF1ZXVlRW50cnkuX21vdGlvbjtcblxuICAgICAgICBpZiAobW90aW9uID09IG51bGwpIHtcbiAgICAgICAgICBtb3Rpb25RdWV1ZUVudHJ5LnJlbGVhc2UoKTtcbiAgICAgICAgICBtb3Rpb25RdWV1ZUVudHJ5ID0gdm9pZCAwO1xuICAgICAgICAgIG1vdGlvblF1ZXVlRW50cnkgPSBudWxsO1xuICAgICAgICAgIGl0ZSA9IHRoaXMuX21vdGlvbnMuZXJhc2UoaXRlKTsgLy8g5YmK6ZmkXG5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tLS0tLSDlgKTjgpLlj43mmKDjgZnjgosgLS0tLS0tXG4gICAgICAgIG1vdGlvbi51cGRhdGVQYXJhbWV0ZXJzKG1vZGVsLCBtb3Rpb25RdWV1ZUVudHJ5LCB1c2VyVGltZVNlY29uZHMpO1xuICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcblxuICAgICAgICAvLyAtLS0tLS0g44Om44O844K244OI44Oq44Ks44O844Kk44OZ44Oz44OI44KS5qSc5p+744GZ44KLIC0tLS1cbiAgICAgICAgY29uc3QgZmlyZWRMaXN0OiBjc21WZWN0b3I8Y3NtU3RyaW5nPiA9IG1vdGlvbi5nZXRGaXJlZEV2ZW50KFxuICAgICAgICAgIG1vdGlvblF1ZXVlRW50cnkuZ2V0TGFzdENoZWNrRXZlbnRUaW1lKCkgLVxuICAgICAgICAgICAgbW90aW9uUXVldWVFbnRyeS5nZXRTdGFydFRpbWUoKSxcbiAgICAgICAgICB1c2VyVGltZVNlY29uZHMgLSBtb3Rpb25RdWV1ZUVudHJ5LmdldFN0YXJ0VGltZSgpXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXJlZExpc3QuZ2V0U2l6ZSgpOyArK2kpIHtcbiAgICAgICAgICB0aGlzLl9ldmVudENhbGxCYWNrKHRoaXMsIGZpcmVkTGlzdC5hdChpKSwgdGhpcy5fZXZlbnRDdXN0b21EYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vdGlvblF1ZXVlRW50cnkuc2V0TGFzdENoZWNrRXZlbnRUaW1lKHVzZXJUaW1lU2Vjb25kcyk7XG5cbiAgICAgICAgLy8gLS0tLS0tIOe1guS6hua4iOOBv+OBruWHpueQhuOBjOOBguOCjOOBsOWJiumZpOOBmeOCiyAtLS0tLS1cbiAgICAgICAgaWYgKG1vdGlvblF1ZXVlRW50cnkuaXNGaW5pc2hlZCgpKSB7XG4gICAgICAgICAgbW90aW9uUXVldWVFbnRyeS5yZWxlYXNlKCk7XG4gICAgICAgICAgbW90aW9uUXVldWVFbnRyeSA9IHZvaWQgMDtcbiAgICAgICAgICBtb3Rpb25RdWV1ZUVudHJ5ID0gbnVsbDtcbiAgICAgICAgICBpdGUgPSB0aGlzLl9tb3Rpb25zLmVyYXNlKGl0ZSk7IC8vIOWJiumZpFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZS5wcmVJbmNyZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9XG4gICAgX3VzZXJUaW1lU2Vjb25kczogbnVtYmVyOyAvLyDjg4fjg6vjgr/mmYLplpPjga7nqY3nrpflgKRb56eSXVxuXG4gICAgX21vdGlvbnM6IGNzbVZlY3RvcjxDdWJpc21Nb3Rpb25RdWV1ZUVudHJ5PjsgLy8g44Oi44O844K344On44OzXG4gICAgX2V2ZW50Q2FsbEJhY2s6IEN1YmlzbU1vdGlvbkV2ZW50RnVuY3Rpb247IC8vIOOCs+ODvOODq+ODkOODg+OCr+mWouaVsFxuICAgIF9ldmVudEN1c3RvbURhdGE6IGFueTsgLy8g44Kz44O844Or44OQ44OD44Kv44Gr5oi744GV44KM44KL44OH44O844K/XG4gIH1cblxuICAvKipcbiAgICog44Kk44OZ44Oz44OI44Gu44Kz44O844Or44OQ44OD44Kv6Zai5pWw44KS5a6a576pXG4gICAqXG4gICAqIOOCpOODmeODs+ODiOOBruOCs+ODvOODq+ODkOODg+OCr+OBq+eZu+mMsuOBp+OBjeOCi+mWouaVsOOBruWei+aDheWgsVxuICAgKiBAcGFyYW0gY2FsbGVyICAgICAgICDnmbrngavjgZfjgZ/jgqTjg5njg7Pjg4jjgpLlho3nlJ/jgZXjgZvjgZ9DdWJpc21Nb3Rpb25RdWV1ZU1hbmFnZXJcbiAgICogQHBhcmFtIGV2ZW50VmFsdWUgICAg55m654Gr44GX44Gf44Kk44OZ44Oz44OI44Gu5paH5a2X5YiX44OH44O844K/XG4gICAqIEBwYXJhbSBjdXN0b21EYXRhICAg44Kz44O844Or44OQ44OD44Kv44Gr6L+U44GV44KM44KL55m76Yyy5pmC44Gr5oyH5a6a44GV44KM44Gf44OH44O844K/XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEN1YmlzbU1vdGlvbkV2ZW50RnVuY3Rpb24ge1xuICAgIChcbiAgICAgIGNhbGxlcjogQ3ViaXNtTW90aW9uUXVldWVNYW5hZ2VyLFxuICAgICAgZXZlbnRWYWx1ZTogY3NtU3RyaW5nLFxuICAgICAgY3VzdG9tRGF0YTogYW55XG4gICAgKTogdm9pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6Ljg7zjgrfjg6fjg7Pjga7orZjliKXnlarlj7dcbiAgICpcbiAgICog44Oi44O844K344On44Oz44Gu6K2Y5Yil55Wq5Y+344Gu5a6a576pXG4gICAqL1xuICBleHBvcnQgZGVjbGFyZSB0eXBlIEN1YmlzbU1vdGlvblF1ZXVlRW50cnlIYW5kbGUgPSBhbnk7XG4gIGV4cG9ydCBjb25zdCBJbnZhbGlkTW90aW9uUXVldWVFbnRyeUhhbmRsZVZhbHVlOiBDdWJpc21Nb3Rpb25RdWV1ZUVudHJ5SGFuZGxlID0gLTE7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRoZSBMaXZlMkQgT3BlbiBTb2Z0d2FyZSBsaWNlbnNlXG4gKiB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5saXZlMmQuY29tL2V1bGEvbGl2ZTJkLW9wZW4tc29mdHdhcmUtbGljZW5zZS1hZ3JlZW1lbnRfZW4uaHRtbC5cbiAqL1xuXG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3NtdmVjdG9yIH0gZnJvbSAnLi4vdHlwZS9jc212ZWN0b3InO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvY3ViaXNtbW9kZWwnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWlkIH0gZnJvbSAnLi4vaWQvY3ViaXNtaWQnO1xuaW1wb3J0IEN1YmlzbUlkSGFuZGxlID0gY3ViaXNtaWQuQ3ViaXNtSWRIYW5kbGU7XG5pbXBvcnQgQ3ViaXNtTW9kZWwgPSBjdWJpc21tb2RlbC5DdWJpc21Nb2RlbDtcbmltcG9ydCBjc21WZWN0b3IgPSBjc212ZWN0b3IuY3NtVmVjdG9yO1xuXG5leHBvcnQgbmFtZXNwYWNlIExpdmUyREN1YmlzbUZyYW1ld29yayB7XG4gIC8qKlxuICAgKiDlkbzlkLjmqZ/og71cbiAgICpcbiAgICog5ZG85ZC45qmf6IO944KS5o+Q5L6b44GZ44KL44CCXG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtQnJlYXRoIHtcbiAgICAvKipcbiAgICAgKiDjgqTjg7Pjgrnjgr/jg7Pjgrnjga7kvZzmiJBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZSgpOiBDdWJpc21CcmVhdGgge1xuICAgICAgcmV0dXJuIG5ldyBDdWJpc21CcmVhdGgoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgqTjg7Pjgrnjgr/jg7Pjgrnjga7noLTmo4RcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2Ug5a++6LGh44GuQ3ViaXNtQnJlYXRoXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkZWxldGUoaW5zdGFuY2U6IEN1YmlzbUJyZWF0aCk6IHZvaWQge1xuICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwpIHtcbiAgICAgICAgaW5zdGFuY2UgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWRvOWQuOOBruODkeODqeODoeODvOOCv+OBrue0kOOBpeOBkVxuICAgICAqIEBwYXJhbSBicmVhdGhQYXJhbWV0ZXJzIOWRvOWQuOOCkue0kOOBpeOBkeOBn+OBhOODkeODqeODoeODvOOCv+OBruODquOCueODiFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQYXJhbWV0ZXJzKFxuICAgICAgYnJlYXRoUGFyYW1ldGVyczogY3NtVmVjdG9yPEJyZWF0aFBhcmFtZXRlckRhdGE+XG4gICAgKTogdm9pZCB7XG4gICAgICB0aGlzLl9icmVhdGhQYXJhbWV0ZXJzID0gYnJlYXRoUGFyYW1ldGVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlkbzlkLjjgavntJDjgaXjgYTjgabjgYTjgovjg5Hjg6njg6Hjg7zjgr/jga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIOWRvOWQuOOBq+e0kOOBpeOBhOOBpuOBhOOCi+ODkeODqeODoeODvOOCv+OBruODquOCueODiFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJzKCk6IGNzbVZlY3RvcjxCcmVhdGhQYXJhbWV0ZXJEYXRhPiB7XG4gICAgICByZXR1cm4gdGhpcy5fYnJlYXRoUGFyYW1ldGVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg4fjg6vjga7jg5Hjg6njg6Hjg7zjgr/jga7mm7TmlrBcbiAgICAgKiBAcGFyYW0gbW9kZWwg5a++6LGh44Gu44Oi44OH44OrXG4gICAgICogQHBhcmFtIGRlbHRhVGltZVNlY29uZHMg44OH44Or44K/5pmC6ZaTW+enkl1cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlUGFyYW1ldGVycyhcbiAgICAgIG1vZGVsOiBDdWJpc21Nb2RlbCxcbiAgICAgIGRlbHRhVGltZVNlY29uZHM6IG51bWJlclxuICAgICk6IHZvaWQge1xuICAgICAgdGhpcy5fY3VycmVudFRpbWUgKz0gZGVsdGFUaW1lU2Vjb25kcztcblxuICAgICAgY29uc3QgdDogbnVtYmVyID0gdGhpcy5fY3VycmVudFRpbWUgKiAyLjAgKiAzLjE0MTU5O1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2JyZWF0aFBhcmFtZXRlcnMuZ2V0U2l6ZSgpOyArK2kpIHtcbiAgICAgICAgY29uc3QgZGF0YTogQnJlYXRoUGFyYW1ldGVyRGF0YSA9IHRoaXMuX2JyZWF0aFBhcmFtZXRlcnMuYXQoaSk7XG5cbiAgICAgICAgbW9kZWwuYWRkUGFyYW1ldGVyVmFsdWVCeUlkKFxuICAgICAgICAgIGRhdGEucGFyYW1ldGVySWQsXG4gICAgICAgICAgZGF0YS5vZmZzZXQgKyBkYXRhLnBlYWsgKiBNYXRoLnNpbih0IC8gZGF0YS5jeWNsZSksXG4gICAgICAgICAgZGF0YS53ZWlnaHRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl9jdXJyZW50VGltZSA9IDAuMDtcbiAgICB9XG5cbiAgICBfYnJlYXRoUGFyYW1ldGVyczogY3NtVmVjdG9yPEJyZWF0aFBhcmFtZXRlckRhdGE+OyAvLyDlkbzlkLjjgavjgbLjgoLjgaXjgYTjgabjgYTjgovjg5Hjg6njg6Hjg7zjgr/jga7jg6rjgrnjg4hcbiAgICBfY3VycmVudFRpbWU6IG51bWJlcjsgLy8g56mN566X5pmC6ZaTW+enkl1cbiAgfVxuXG4gIC8qKlxuICAgKiDlkbzlkLjjga7jg5Hjg6njg6Hjg7zjgr/mg4XloLFcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBCcmVhdGhQYXJhbWV0ZXJEYXRhIHtcbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVySWQgICDlkbzlkLjjgpLjgbLjgoLjgaXjgZHjgovjg5Hjg6njg6Hjg7zjgr9JRFxuICAgICAqIEBwYXJhbSBvZmZzZXQgICAgICAgIOWRvOWQuOOCkuato+W8puazouOBqOOBl+OBn+OBqOOBjeOBruOAgeazouOBruOCquODleOCu+ODg+ODiFxuICAgICAqIEBwYXJhbSBwZWFrICAgICAgICAgIOWRvOWQuOOCkuato+W8puazouOBqOOBl+OBn+OBqOOBjeOBruOAgeazouOBrumrmOOBlVxuICAgICAqIEBwYXJhbSBjeWNsZSAgICAgICAgIOWRvOWQuOOCkuato+W8puazouOBqOOBl+OBn+OBqOOBjeOBruOAgeazouOBruWRqOacn1xuICAgICAqIEBwYXJhbSB3ZWlnaHQgICAgICAgIOODkeODqeODoeODvOOCv+OBuOOBrumHjeOBv1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgcGFyYW1ldGVySWQ/OiBDdWJpc21JZEhhbmRsZSxcbiAgICAgIG9mZnNldD86IG51bWJlcixcbiAgICAgIHBlYWs/OiBudW1iZXIsXG4gICAgICBjeWNsZT86IG51bWJlcixcbiAgICAgIHdlaWdodD86IG51bWJlclxuICAgICkge1xuICAgICAgdGhpcy5wYXJhbWV0ZXJJZCA9IHBhcmFtZXRlcklkID09IHVuZGVmaW5lZCA/IG51bGwgOiBwYXJhbWV0ZXJJZDtcbiAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0ID09IHVuZGVmaW5lZCA/IDAuMCA6IG9mZnNldDtcbiAgICAgIHRoaXMucGVhayA9IHBlYWsgPT0gdW5kZWZpbmVkID8gMC4wIDogcGVhaztcbiAgICAgIHRoaXMuY3ljbGUgPSBjeWNsZSA9PSB1bmRlZmluZWQgPyAwLjAgOiBjeWNsZTtcbiAgICAgIHRoaXMud2VpZ2h0ID0gd2VpZ2h0ID09IHVuZGVmaW5lZCA/IDAuMCA6IHdlaWdodDtcbiAgICB9XG5cbiAgICBwYXJhbWV0ZXJJZDogQ3ViaXNtSWRIYW5kbGU7IC8vIOWRvOWQuOOCkuOBsuOCguOBpeOBkeOCi+ODkeODqeODoeODvOOCv0lEXFxcbiAgICBvZmZzZXQ6IG51bWJlcjsgLy8g5ZG85ZC444KS5q2j5bym5rOi44Go44GX44Gf44Go44GN44Gu44CB5rOi44Gu44Kq44OV44K744OD44OIXG4gICAgcGVhazogbnVtYmVyOyAvLyDlkbzlkLjjgpLmraPlvKbms6LjgajjgZfjgZ/jgajjgY3jga7jgIHms6Ljga7pq5jjgZVcbiAgICBjeWNsZTogbnVtYmVyOyAvLyDlkbzlkLjjgpLmraPlvKbms6LjgajjgZfjgZ/jgajjgY3jga7jgIHms6Ljga7lkajmnJ9cbiAgICB3ZWlnaHQ6IG51bWJlcjsgLy8g44OR44Op44Oh44O844K/44G444Gu6YeN44G/XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGhlIExpdmUyRCBPcGVuIFNvZnR3YXJlIGxpY2Vuc2VcbiAqIHRoYXQgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmxpdmUyZC5jb20vZXVsYS9saXZlMmQtb3Blbi1zb2Z0d2FyZS1saWNlbnNlLWFncmVlbWVudF9lbi5odG1sLlxuICovXG5cbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjc212ZWN0b3IgfSBmcm9tICcuLi90eXBlL2NzbXZlY3Rvcic7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgaWN1YmlzbW1vZGVsc2V0dGluZyB9IGZyb20gJy4uL2ljdWJpc21tb2RlbHNldHRpbmcnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWlkIH0gZnJvbSAnLi4vaWQvY3ViaXNtaWQnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvY3ViaXNtbW9kZWwnO1xuaW1wb3J0IEN1YmlzbU1vZGVsID0gY3ViaXNtbW9kZWwuQ3ViaXNtTW9kZWw7XG5pbXBvcnQgQ3ViaXNtSWRIYW5kbGUgPSBjdWJpc21pZC5DdWJpc21JZEhhbmRsZTtcbmltcG9ydCBJQ3ViaXNtTW9kZWxTZXR0aW5nID0gaWN1YmlzbW1vZGVsc2V0dGluZy5JQ3ViaXNtTW9kZWxTZXR0aW5nO1xuaW1wb3J0IGNzbVZlY3RvciA9IGNzbXZlY3Rvci5jc21WZWN0b3I7XG5cbmV4cG9ydCBuYW1lc3BhY2UgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIHtcbiAgLyoqXG4gICAqIOiHquWLleOBvuOBsOOBn+OBjeapn+iDvVxuICAgKlxuICAgKiDoh6rli5Xjgb7jgbDjgZ/jgY3mqZ/og73jgpLmj5DkvpvjgZnjgovjgIJcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBDdWJpc21FeWVCbGluayB7XG4gICAgLyoqXG4gICAgICog44Kk44Oz44K544K/44Oz44K544KS5L2c5oiQ44GZ44KLXG4gICAgICogQHBhcmFtIG1vZGVsU2V0dGluZyDjg6Ljg4fjg6vjga7oqK3lrprmg4XloLFcbiAgICAgKiBAcmV0dXJuIOS9nOaIkOOBleOCjOOBn+OCpOODs+OCueOCv+ODs+OCuVxuICAgICAqIEBub3RlIOW8leaVsOOBjE5VTEzjga7loLTlkIjjgIHjg5Hjg6njg6Hjg7zjgr9JROOBjOioreWumuOBleOCjOOBpuOBhOOBquOBhOepuuOBruOCpOODs+OCueOCv+ODs+OCueOCkuS9nOaIkOOBmeOCi+OAglxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKFxuICAgICAgbW9kZWxTZXR0aW5nOiBJQ3ViaXNtTW9kZWxTZXR0aW5nID0gbnVsbFxuICAgICk6IEN1YmlzbUV5ZUJsaW5rIHtcbiAgICAgIHJldHVybiBuZXcgQ3ViaXNtRXllQmxpbmsobW9kZWxTZXR0aW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgqTjg7Pjgrnjgr/jg7Pjgrnjga7noLTmo4RcbiAgICAgKiBAcGFyYW0gZXllQmxpbmsg5a++6LGh44GuQ3ViaXNtRXllQmxpbmtcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGRlbGV0ZShleWVCbGluazogQ3ViaXNtRXllQmxpbmspOiB2b2lkIHtcbiAgICAgIGlmIChleWVCbGluayAhPSBudWxsKSB7XG4gICAgICAgIGV5ZUJsaW5rID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgb7jgbDjgZ/jgY3jga7plpPpmpTjga7oqK3lrppcbiAgICAgKiBAcGFyYW0gYmxpbmtpbmdJbnRlcnZhbCDjgb7jgbDjgZ/jgY3jga7plpPpmpTjga7mmYLplpNb56eSXVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRCbGlua2luZ0ludGVydmFsKGJsaW5raW5nSW50ZXJ2YWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy5fYmxpbmtpbmdJbnRlcnZhbFNlY29uZHMgPSBibGlua2luZ0ludGVydmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOBvuOBsOOBn+OBjeOBruODouODvOOCt+ODp+ODs+OBruips+e0sOioreWumlxuICAgICAqIEBwYXJhbSBjbG9zaW5nICAg44G+44G244Gf44KS6ZaJ44GY44KL5YuV5L2c44Gu5omA6KaB5pmC6ZaTW+enkl1cbiAgICAgKiBAcGFyYW0gY2xvc2VkICAgIOOBvuOBtuOBn+OCkumWieOBmOOBpuOBhOOCi+WLleS9nOOBruaJgOimgeaZgumWk1vnp5JdXG4gICAgICogQHBhcmFtIG9wZW5pbmcgICDjgb7jgbbjgZ/jgpLplovjgY/li5XkvZzjga7miYDopoHmmYLplpNb56eSXVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRCbGlua2luZ1NldHRpbmcoXG4gICAgICBjbG9zaW5nOiBudW1iZXIsXG4gICAgICBjbG9zZWQ6IG51bWJlcixcbiAgICAgIG9wZW5pbmc6IG51bWJlclxuICAgICk6IHZvaWQge1xuICAgICAgdGhpcy5fY2xvc2luZ1NlY29uZHMgPSBjbG9zaW5nO1xuICAgICAgdGhpcy5fY2xvc2VkU2Vjb25kcyA9IGNsb3NlZDtcbiAgICAgIHRoaXMuX29wZW5pbmdTZWNvbmRzID0gb3BlbmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgb7jgbDjgZ/jgY3jgZXjgZvjgovjg5Hjg6njg6Hjg7zjgr9JROOBruODquOCueODiOOBruioreWumlxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJZHMg44OR44Op44Oh44O844K/44GuSUTjga7jg6rjgrnjg4hcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UGFyYW1ldGVySWRzKHBhcmFtZXRlcklkczogY3NtVmVjdG9yPEN1YmlzbUlkSGFuZGxlPik6IHZvaWQge1xuICAgICAgdGhpcy5fcGFyYW1ldGVySWRzID0gcGFyYW1ldGVySWRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOBvuOBsOOBn+OBjeOBleOBm+OCi+ODkeODqeODoeODvOOCv0lE44Gu44Oq44K544OI44Gu5Y+W5b6XXG4gICAgICogQHJldHVybiDjg5Hjg6njg6Hjg7zjgr9JROOBruODquOCueODiFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJJZHMoKTogY3NtVmVjdG9yPEN1YmlzbUlkSGFuZGxlPiB7XG4gICAgICByZXR1cm4gdGhpcy5fcGFyYW1ldGVySWRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODh+ODq+OBruODkeODqeODoeODvOOCv+OBruabtOaWsFxuICAgICAqIEBwYXJhbSBtb2RlbCDlr77osaHjga7jg6Ljg4fjg6tcbiAgICAgKiBAcGFyYW0gZGVsdGFUaW1lU2Vjb25kcyDjg4fjg6vjgr/mmYLplpNb56eSXVxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVQYXJhbWV0ZXJzKFxuICAgICAgbW9kZWw6IEN1YmlzbU1vZGVsLFxuICAgICAgZGVsdGFUaW1lU2Vjb25kczogbnVtYmVyXG4gICAgKTogdm9pZCB7XG4gICAgICB0aGlzLl91c2VyVGltZVNlY29uZHMgKz0gZGVsdGFUaW1lU2Vjb25kcztcbiAgICAgIGxldCBwYXJhbWV0ZXJWYWx1ZTogbnVtYmVyO1xuICAgICAgbGV0IHQgPSAwLjA7XG5cbiAgICAgIHN3aXRjaCAodGhpcy5fYmxpbmtpbmdTdGF0ZSkge1xuICAgICAgICBjYXNlIEV5ZVN0YXRlLkV5ZVN0YXRlX0Nsb3Npbmc6XG4gICAgICAgICAgdCA9XG4gICAgICAgICAgICAodGhpcy5fdXNlclRpbWVTZWNvbmRzIC0gdGhpcy5fc3RhdGVTdGFydFRpbWVTZWNvbmRzKSAvXG4gICAgICAgICAgICB0aGlzLl9jbG9zaW5nU2Vjb25kcztcblxuICAgICAgICAgIGlmICh0ID49IDEuMCkge1xuICAgICAgICAgICAgdCA9IDEuMDtcbiAgICAgICAgICAgIHRoaXMuX2JsaW5raW5nU3RhdGUgPSBFeWVTdGF0ZS5FeWVTdGF0ZV9DbG9zZWQ7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZVN0YXJ0VGltZVNlY29uZHMgPSB0aGlzLl91c2VyVGltZVNlY29uZHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFyYW1ldGVyVmFsdWUgPSAxLjAgLSB0O1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRXllU3RhdGUuRXllU3RhdGVfQ2xvc2VkOlxuICAgICAgICAgIHQgPVxuICAgICAgICAgICAgKHRoaXMuX3VzZXJUaW1lU2Vjb25kcyAtIHRoaXMuX3N0YXRlU3RhcnRUaW1lU2Vjb25kcykgL1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VkU2Vjb25kcztcblxuICAgICAgICAgIGlmICh0ID49IDEuMCkge1xuICAgICAgICAgICAgdGhpcy5fYmxpbmtpbmdTdGF0ZSA9IEV5ZVN0YXRlLkV5ZVN0YXRlX09wZW5pbmc7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZVN0YXJ0VGltZVNlY29uZHMgPSB0aGlzLl91c2VyVGltZVNlY29uZHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFyYW1ldGVyVmFsdWUgPSAwLjA7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFeWVTdGF0ZS5FeWVTdGF0ZV9PcGVuaW5nOlxuICAgICAgICAgIHQgPVxuICAgICAgICAgICAgKHRoaXMuX3VzZXJUaW1lU2Vjb25kcyAtIHRoaXMuX3N0YXRlU3RhcnRUaW1lU2Vjb25kcykgL1xuICAgICAgICAgICAgdGhpcy5fb3BlbmluZ1NlY29uZHM7XG5cbiAgICAgICAgICBpZiAodCA+PSAxLjApIHtcbiAgICAgICAgICAgIHQgPSAxLjA7XG4gICAgICAgICAgICB0aGlzLl9ibGlua2luZ1N0YXRlID0gRXllU3RhdGUuRXllU3RhdGVfSW50ZXJ2YWw7XG4gICAgICAgICAgICB0aGlzLl9uZXh0QmxpbmtpbmdUaW1lID0gdGhpcy5kZXRlcm1pbk5leHRCbGlua2luZ1RpbWluZygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmFtZXRlclZhbHVlID0gdDtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEV5ZVN0YXRlLkV5ZVN0YXRlX0ludGVydmFsOlxuICAgICAgICAgIGlmICh0aGlzLl9uZXh0QmxpbmtpbmdUaW1lIDwgdGhpcy5fdXNlclRpbWVTZWNvbmRzKSB7XG4gICAgICAgICAgICB0aGlzLl9ibGlua2luZ1N0YXRlID0gRXllU3RhdGUuRXllU3RhdGVfQ2xvc2luZztcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlU3RhcnRUaW1lU2Vjb25kcyA9IHRoaXMuX3VzZXJUaW1lU2Vjb25kcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZSA9IDEuMDtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEV5ZVN0YXRlLkV5ZVN0YXRlX0ZpcnN0OlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMuX2JsaW5raW5nU3RhdGUgPSBFeWVTdGF0ZS5FeWVTdGF0ZV9JbnRlcnZhbDtcbiAgICAgICAgICB0aGlzLl9uZXh0QmxpbmtpbmdUaW1lID0gdGhpcy5kZXRlcm1pbk5leHRCbGlua2luZ1RpbWluZygpO1xuXG4gICAgICAgICAgcGFyYW1ldGVyVmFsdWUgPSAxLjA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICghQ3ViaXNtRXllQmxpbmsuQ2xvc2VJZlplcm8pIHtcbiAgICAgICAgcGFyYW1ldGVyVmFsdWUgPSAtcGFyYW1ldGVyVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fcGFyYW1ldGVySWRzLmdldFNpemUoKTsgKytpKSB7XG4gICAgICAgIG1vZGVsLnNldFBhcmFtZXRlclZhbHVlQnlJZCh0aGlzLl9wYXJhbWV0ZXJJZHMuYXQoaSksIHBhcmFtZXRlclZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICAgKiBAcGFyYW0gbW9kZWxTZXR0aW5nIOODouODh+ODq+OBruioreWumuaDheWgsVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RlbFNldHRpbmc6IElDdWJpc21Nb2RlbFNldHRpbmcpIHtcbiAgICAgIHRoaXMuX2JsaW5raW5nU3RhdGUgPSBFeWVTdGF0ZS5FeWVTdGF0ZV9GaXJzdDtcbiAgICAgIHRoaXMuX25leHRCbGlua2luZ1RpbWUgPSAwLjA7XG4gICAgICB0aGlzLl9zdGF0ZVN0YXJ0VGltZVNlY29uZHMgPSAwLjA7XG4gICAgICB0aGlzLl9ibGlua2luZ0ludGVydmFsU2Vjb25kcyA9IDQuMDtcbiAgICAgIHRoaXMuX2Nsb3NpbmdTZWNvbmRzID0gMC4xO1xuICAgICAgdGhpcy5fY2xvc2VkU2Vjb25kcyA9IDAuMDU7XG4gICAgICB0aGlzLl9vcGVuaW5nU2Vjb25kcyA9IDAuMTU7XG4gICAgICB0aGlzLl91c2VyVGltZVNlY29uZHMgPSAwLjA7XG4gICAgICB0aGlzLl9wYXJhbWV0ZXJJZHMgPSBuZXcgY3NtVmVjdG9yPEN1YmlzbUlkSGFuZGxlPigpO1xuXG4gICAgICBpZiAobW9kZWxTZXR0aW5nID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZGVsU2V0dGluZy5nZXRFeWVCbGlua1BhcmFtZXRlckNvdW50KCk7ICsraSkge1xuICAgICAgICB0aGlzLl9wYXJhbWV0ZXJJZHMucHVzaEJhY2sobW9kZWxTZXR0aW5nLmdldEV5ZUJsaW5rUGFyYW1ldGVySWQoaSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOasoeOBrueerOOBjeOBruOCv+OCpOODn+ODs+OCsOOBruaxuuWumlxuICAgICAqXG4gICAgICogQHJldHVybiDmrKHjga7jgb7jgbDjgZ/jgY3jgpLooYzjgYbmmYLliLtb56eSXVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRlcm1pbk5leHRCbGlua2luZ1RpbWluZygpOiBudW1iZXIge1xuICAgICAgY29uc3QgcjogbnVtYmVyID0gTWF0aC5yYW5kb20oKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuX3VzZXJUaW1lU2Vjb25kcyArIHIgKiAoMi4wICogdGhpcy5fYmxpbmtpbmdJbnRlcnZhbFNlY29uZHMgLSAxLjApXG4gICAgICApO1xuICAgIH1cblxuICAgIF9ibGlua2luZ1N0YXRlOiBudW1iZXI7IC8vIOePvuWcqOOBrueKtuaFi1xuICAgIF9wYXJhbWV0ZXJJZHM6IGNzbVZlY3RvcjxDdWJpc21JZEhhbmRsZT47IC8vIOaTjeS9nOWvvuixoeOBruODkeODqeODoeODvOOCv+OBrklE44Gu44Oq44K544OIXG4gICAgX25leHRCbGlua2luZ1RpbWU6IG51bWJlcjsgLy8g5qyh44Gu44G+44Gw44Gf44GN44Gu5pmC5Yi7W+enkl1cbiAgICBfc3RhdGVTdGFydFRpbWVTZWNvbmRzOiBudW1iZXI7IC8vIOePvuWcqOOBrueKtuaFi+OBjOmWi+Wni+OBl+OBn+aZguWIu1vnp5JdXG4gICAgX2JsaW5raW5nSW50ZXJ2YWxTZWNvbmRzOiBudW1iZXI7IC8vIOOBvuOBsOOBn+OBjeOBrumWk+malFvnp5JdXG4gICAgX2Nsb3NpbmdTZWNvbmRzOiBudW1iZXI7IC8vIOOBvuOBtuOBn+OCkumWieOBmOOCi+WLleS9nOOBruaJgOimgeaZgumWk1vnp5JdXG4gICAgX2Nsb3NlZFNlY29uZHM6IG51bWJlcjsgLy8g44G+44G244Gf44KS6ZaJ44GY44Gm44GE44KL5YuV5L2c44Gu5omA6KaB5pmC6ZaTW+enkl1cbiAgICBfb3BlbmluZ1NlY29uZHM6IG51bWJlcjsgLy8g44G+44G244Gf44KS6ZaL44GP5YuV5L2c44Gu5omA6KaB5pmC6ZaTW+enkl1cbiAgICBfdXNlclRpbWVTZWNvbmRzOiBudW1iZXI7IC8vIOODh+ODq+OCv+aZgumWk+OBruepjeeul+WApFvnp5JdXG5cbiAgICAvKipcbiAgICAgKiBJROOBp+aMh+WumuOBleOCjOOBn+ebruOBruODkeODqeODoeODvOOCv+OBjOOAgTDjga7jgajjgY3jgavplonjgZjjgovjgarjgokgdHJ1ZSDjgIEx44Gu5pmC44Gr6ZaJ44GY44KL44Gq44KJIGZhbHNlIOOAglxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBDbG9zZUlmWmVybzogYm9vbGVhbiA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICog44G+44Gw44Gf44GN44Gu54q25oWLXG4gICAqXG4gICAqIOOBvuOBsOOBn+OBjeOBrueKtuaFi+OCkuihqOOBmeWIl+aMmeWei1xuICAgKi9cbiAgZXhwb3J0IGVudW0gRXllU3RhdGUge1xuICAgIEV5ZVN0YXRlX0ZpcnN0ID0gMCwgLy8g5Yid5pyf54q25oWLXG4gICAgRXllU3RhdGVfSW50ZXJ2YWwsIC8vIOOBvuOBsOOBn+OBjeOBl+OBpuOBhOOBquOBhOeKtuaFi1xuICAgIEV5ZVN0YXRlX0Nsb3NpbmcsIC8vIOOBvuOBtuOBn+OBjOmWieOBmOOBpuOBhOOBj+mAlOS4reOBrueKtuaFi1xuICAgIEV5ZVN0YXRlX0Nsb3NlZCwgLy8g44G+44G244Gf44GM6ZaJ44GY44Gm44GE44KL54q25oWLXG4gICAgRXllU3RhdGVfT3BlbmluZyAvLyDjgb7jgbbjgZ/jgYzplovjgYTjgabjgYTjgY/pgJTkuK3jga7nirbmhYtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuaW1wb3J0IHsgTEFwcERlbGVnYXRlIH0gZnJvbSAnLi9sYXBwZGVsZWdhdGUnO1xuXG4vKipcbiAqIOa4uOiniOWZqOWKoOi9veS5i+WQjuWkhOeQhlxuICovXG53aW5kb3cub25sb2FkID0gKCk6IHZvaWQgPT4ge1xuICAvLyBjcmVhdGUgdGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlXG4gIGlmIChMQXBwRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5pbml0aWFsaXplKCkgPT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBMQXBwRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5ydW4oKTtcbn07XG5cbi8qKlxuICog5ri46KeI5Zmo57uT5p2f5LmL5ZCO5aSE55CGXG4gKi9cbndpbmRvdy5vbmJlZm9yZXVubG9hZCA9ICgpOiB2b2lkID0+IExBcHBEZWxlZ2F0ZS5yZWxlYXNlSW5zdGFuY2UoKTtcbiIsIi8qKlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGhlIExpdmUyRCBPcGVuIFNvZnR3YXJlIGxpY2Vuc2VcbiAqIHRoYXQgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmxpdmUyZC5jb20vZXVsYS9saXZlMmQtb3Blbi1zb2Z0d2FyZS1saWNlbnNlLWFncmVlbWVudF9lbi5odG1sLlxuICovXG5cbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vICDjg63jgrDlh7rlipvplqLmlbDjga7oqK3lrppcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8tLS0tLS0tLS0tIOODreOCsOWHuuWKm+ODrOODmeODqyDpgbjmip7poIXnm64g5a6a576pIC0tLS0tLS0tLS1cbi8vIOips+e0sOODreOCsOWHuuWKm+ioreWumlxuZXhwb3J0IGNvbnN0IENTTV9MT0dfTEVWRUxfVkVSQk9TRSA9IDA7XG4vLyDjg4fjg5Djg4PjgrDjg63jgrDlh7rlipvoqK3lrppcbmV4cG9ydCBjb25zdCBDU01fTE9HX0xFVkVMX0RFQlVHID0gMTtcbi8vIEluZm/jg63jgrDlh7rlipvoqK3lrppcbmV4cG9ydCBjb25zdCBDU01fTE9HX0xFVkVMX0lORk8gPSAyO1xuLy8g6K2m5ZGK44Ot44Kw5Ye65Yqb6Kit5a6aXG5leHBvcnQgY29uc3QgQ1NNX0xPR19MRVZFTF9XQVJOSU5HID0gMztcbi8vIOOCqOODqeODvOODreOCsOWHuuWKm+ioreWumlxuZXhwb3J0IGNvbnN0IENTTV9MT0dfTEVWRUxfRVJST1IgPSA0O1xuLy8g44Ot44Kw5Ye65Yqb44Kq44OV6Kit5a6aXG5leHBvcnQgY29uc3QgQ1NNX0xPR19MRVZFTF9PRkYgPSA1O1xuXG4vKipcbiAqIOODreOCsOWHuuWKm+ODrOODmeODq+ioreWumuOAglxuICpcbiAqIOW8t+WItueahOOBq+ODreOCsOWHuuWKm+ODrOODmeODq+OCkuWkieOBiOOCi+aZguOBq+Wumue+qeOCkuacieWKueOBq+OBmeOCi+OAglxuICogQ1NNX0xPR19MRVZFTF9WRVJCT1NFIO+9niBDU01fTE9HX0xFVkVMX09GRiDjgpLpgbjmip7jgZnjgovjgIJcbiAqL1xuZXhwb3J0IGNvbnN0IENTTV9MT0dfTEVWRUw6IG51bWJlciA9IENTTV9MT0dfTEVWRUxfVkVSQk9TRTtcbiIsIi8qKlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGhlIExpdmUyRCBPcGVuIFNvZnR3YXJlIGxpY2Vuc2VcbiAqIHRoYXQgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmxpdmUyZC5jb20vZXVsYS9saXZlMmQtb3Blbi1zb2Z0d2FyZS1saWNlbnNlLWFncmVlbWVudF9lbi5odG1sLlxuICovXG5cbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjc212ZWN0b3IgfSBmcm9tICcuLi90eXBlL2NzbXZlY3Rvcic7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtaWQgfSBmcm9tICcuL2N1YmlzbWlkJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjc21zdHJpbmcgfSBmcm9tICcuLi90eXBlL2NzbXN0cmluZyc7XG5pbXBvcnQgY3NtU3RyaW5nID0gY3Ntc3RyaW5nLmNzbVN0cmluZztcbmltcG9ydCBDdWJpc21JZCA9IGN1YmlzbWlkLkN1YmlzbUlkO1xuaW1wb3J0IGNzbVZlY3RvciA9IGNzbXZlY3Rvci5jc21WZWN0b3I7XG5cbmV4cG9ydCBuYW1lc3BhY2UgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIHtcbiAgLyoqXG4gICAqIElE5ZCN44Gu566h55CGXG4gICAqXG4gICAqIElE5ZCN44KS566h55CG44GZ44KL44CCXG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtSWRNYW5hZ2VyIHtcbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl9pZHMgPSBuZXcgY3NtVmVjdG9yPEN1YmlzbUlkPigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODh+OCueODiOODqeOCr+OCv+ebuOW9k+OBruWHpueQhlxuICAgICAqL1xuICAgIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9pZHMuZ2V0U2l6ZSgpOyArK2kpIHtcbiAgICAgICAgdGhpcy5faWRzLnNldChpLCB2b2lkIDApO1xuICAgICAgfVxuICAgICAgdGhpcy5faWRzID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJROWQjeOCkuODquOCueODiOOBi+OCieeZu+mMslxuICAgICAqXG4gICAgICogQHBhcmFtIGlkcyBJROWQjeODquOCueODiFxuICAgICAqIEBwYXJhbSBjb3VudCBJROOBruWAi+aVsFxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3RlcklkcyhpZHM6IHN0cmluZ1tdIHwgY3NtU3RyaW5nW10pOiB2b2lkIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJJZChpZHNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElE5ZCN44KS55m76YyyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgSUTlkI1cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJJZChpZDogc3RyaW5nIHwgY3NtU3RyaW5nKTogQ3ViaXNtSWQge1xuICAgICAgbGV0IHJlc3VsdDogQ3ViaXNtSWQgPSBudWxsO1xuXG4gICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGlkKSB7XG4gICAgICAgIGlmICgocmVzdWx0ID0gdGhpcy5maW5kSWQoaWQpKSAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9IG5ldyBDdWJpc21JZChpZCk7XG4gICAgICAgIHRoaXMuX2lkcy5wdXNoQmFjayhyZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJJZChpZC5zKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJROWQjeOBi+OCiUlE44KS5Y+W5b6X44GZ44KLXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgSUTlkI1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SWQoaWQ6IGNzbVN0cmluZyB8IHN0cmluZyk6IEN1YmlzbUlkIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVySWQoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElE5ZCN44GL44KJSUTjga7norroqo1cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdHJ1ZSDlrZjlnKjjgZnjgotcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOWtmOWcqOOBl+OBquOBhFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0V4aXN0KGlkOiBjc21TdHJpbmcgfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZElkKGlkKSAhPSBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuaXNFeGlzdChpZC5zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJROWQjeOBi+OCiUlE44KS5qSc57Si44GZ44KL44CCXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaWQgSUTlkI1cbiAgICAgKiBAcmV0dXJuIOeZu+mMsuOBleOCjOOBpuOBhOOCi0lE44CC44Gq44GR44KM44GwTlVMTOOAglxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZElkKGlkOiBzdHJpbmcpOiBDdWJpc21JZCB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2lkcy5nZXRTaXplKCk7ICsraSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5faWRzXG4gICAgICAgICAgICAuYXQoaSlcbiAgICAgICAgICAgIC5nZXRTdHJpbmcoKVxuICAgICAgICAgICAgLmlzRXF1YWwoaWQpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9pZHMuYXQoaSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaWRzOiBjc21WZWN0b3I8Q3ViaXNtSWQ+OyAvLyDnmbvpjLLjgZXjgozjgabjgYTjgotJROOBruODquOCueODiFxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRoZSBMaXZlMkQgT3BlbiBTb2Z0d2FyZSBsaWNlbnNlXG4gKiB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5saXZlMmQuY29tL2V1bGEvbGl2ZTJkLW9wZW4tc29mdHdhcmUtbGljZW5zZS1hZ3JlZW1lbnRfZW4uaHRtbC5cbiAqL1xuXG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3Ntc3RyaW5nIH0gZnJvbSAnLi4vdHlwZS9jc21zdHJpbmcnO1xuaW1wb3J0IGNzbVN0cmluZyA9IGNzbXN0cmluZy5jc21TdHJpbmc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIHtcbiAgLyoqXG4gICAqIOODkeODqeODoeODvOOCv+WQjeODu+ODkeODvOODhOWQjeODu0RyYXdhYmxl5ZCN44KS5L+d5oyBXG4gICAqXG4gICAqIOODkeODqeODoeODvOOCv+WQjeODu+ODkeODvOODhOWQjeODu0RyYXdhYmxl5ZCN44KS5L+d5oyB44GZ44KL44Kv44Op44K544CCXG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtSWQge1xuICAgIC8qKlxuICAgICAqIElE5ZCN44KS5Y+W5b6X44GZ44KLXG4gICAgICovXG4gICAgcHVibGljIGdldFN0cmluZygpOiBjc21TdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX2lkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihpZDogc3RyaW5nIHwgY3NtU3RyaW5nKSB7XG4gICAgICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLl9pZCA9IG5ldyBjc21TdHJpbmcoaWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lkID0gaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogaWTjgpLmr5TovINcbiAgICAgKiBAcGFyYW0gYyDmr5TovIPjgZnjgotpZFxuICAgICAqIEByZXR1cm4g5ZCM44GY44Gq44KJ44GwdHJ1ZSznlbDjgarjgaPjgabjgYTjgozjgbBmYWxzZeOCkui/lOOBmVxuICAgICAqL1xuICAgIHB1YmxpYyBpc0VxdWFsKGM6IHN0cmluZyB8IGNzbVN0cmluZyB8IEN1YmlzbUlkKTogYm9vbGVhbiB7XG4gICAgICBpZiAodHlwZW9mIGMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZC5pc0VxdWFsKGMpO1xuICAgICAgfSBlbHNlIGlmIChjIGluc3RhbmNlb2YgY3NtU3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZC5pc0VxdWFsKGMucyk7XG4gICAgICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBDdWJpc21JZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faWQuaXNFcXVhbChjLl9pZC5zKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBpZOOCkuavlOi8g1xuICAgICAqIEBwYXJhbSBjIOavlOi8g+OBmeOCi2lkXG4gICAgICogQHJldHVybiDlkIzjgZjjgarjgonjgbB0cnVlLOeVsOOBquOBo+OBpuOBhOOCjOOBsGZhbHNl44KS6L+U44GZXG4gICAgICovXG4gICAgcHVibGljIGlzTm90RXF1YWwoYzogc3RyaW5nIHwgY3NtU3RyaW5nIHwgQ3ViaXNtSWQpOiBib29sZWFuIHtcbiAgICAgIGlmICh0eXBlb2YgYyA9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gIXRoaXMuX2lkLmlzRXF1YWwoYyk7XG4gICAgICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBjc21TdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9pZC5pc0VxdWFsKGMucyk7XG4gICAgICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBDdWJpc21JZCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuX2lkLmlzRXF1YWwoYy5faWQucyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaWQ6IGNzbVN0cmluZzsgLy8gSUTlkI1cbiAgfVxuXG4gIGV4cG9ydCBkZWNsYXJlIHR5cGUgQ3ViaXNtSWRIYW5kbGUgPSBDdWJpc21JZDtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGhlIExpdmUyRCBPcGVuIFNvZnR3YXJlIGxpY2Vuc2VcbiAqIHRoYXQgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmxpdmUyZC5jb20vZXVsYS9saXZlMmQtb3Blbi1zb2Z0d2FyZS1saWNlbnNlLWFncmVlbWVudF9lbi5odG1sLlxuICovXG5cbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21NYXRyaXg0NCB9IGZyb20gJ0BmcmFtZXdvcmsvbWF0aC9jdWJpc21tYXRyaXg0NCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtdmlld21hdHJpeCB9IGZyb20gJ0BmcmFtZXdvcmsvbWF0aC9jdWJpc212aWV3bWF0cml4JztcbmltcG9ydCBDc21fQ3ViaXNtVmlld01hdHJpeCA9IGN1YmlzbXZpZXdtYXRyaXguQ3ViaXNtVmlld01hdHJpeDtcbmltcG9ydCBDc21fQ3ViaXNtTWF0cml4NDQgPSBjdWJpc21NYXRyaXg0NC5DdWJpc21NYXRyaXg0NDtcbmltcG9ydCB7IFRvdWNoTWFuYWdlciB9IGZyb20gJy4vdG91Y2htYW5hZ2VyJztcbmltcG9ydCB7IExBcHBMaXZlMkRNYW5hZ2VyIH0gZnJvbSAnLi9sYXBwbGl2ZTJkbWFuYWdlcic7XG5pbXBvcnQgeyBMQXBwRGVsZWdhdGUsIGNhbnZhcywgZ2wgfSBmcm9tICcuL2xhcHBkZWxlZ2F0ZSc7XG5pbXBvcnQgeyBMQXBwU3ByaXRlIH0gZnJvbSAnLi9sYXBwc3ByaXRlJztcbmltcG9ydCB7IFRleHR1cmVJbmZvIH0gZnJvbSAnLi9sYXBwdGV4dHVyZW1hbmFnZXInO1xuaW1wb3J0IHsgTEFwcFBhbCB9IGZyb20gJy4vbGFwcHBhbCc7XG5pbXBvcnQgKiBhcyBMQXBwRGVmaW5lIGZyb20gJy4vbGFwcGRlZmluZSc7XG5cbi8qKlxuICog5o+P55S744Kv44Op44K544CCXG4gKiDnu5jlm77nsbvjgIJcbiAqL1xuZXhwb3J0IGNsYXNzIExBcHBWaWV3IHtcbiAgLyoqXG4gICAqIOaehOmAoOWHveaVsFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fcHJvZ3JhbUlkID0gbnVsbDtcbiAgICB0aGlzLl9iYWNrID0gbnVsbDtcbiAgICB0aGlzLl9nZWFyID0gbnVsbDtcblxuICAgIC8vIOinpuaRuOWFs+ezu+eahOS6i+S7tueuoeeQhlxuICAgIHRoaXMuX3RvdWNoTWFuYWdlciA9IG5ldyBUb3VjaE1hbmFnZXIoKTtcblxuICAgIC8vIOWwhuiuvuWkh+WdkOagh+i9rOaNouS4uuWxj+W5leWdkOagh+OAglxuICAgIHRoaXMuX2RldmljZVRvU2NyZWVuID0gbmV3IENzbV9DdWJpc21NYXRyaXg0NCgpO1xuXG4gICAgLy8g55So5LqO5pS+5aSnL+e8qeWwj+Wxj+W5leaYvuekuuaIlui9rOaNouenu+WKqOeahOefqemYtVxuICAgIHRoaXMuX3ZpZXdNYXRyaXggPSBuZXcgQ3NtX0N1YmlzbVZpZXdNYXRyaXgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliJ3lp4vljJbjgIJcbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY2FudmFzO1xuXG4gICAgY29uc3QgcmF0aW86IG51bWJlciA9IGhlaWdodCAvIHdpZHRoO1xuICAgIGNvbnN0IGxlZnQ6IG51bWJlciA9IExBcHBEZWZpbmUuVmlld0xvZ2ljYWxMZWZ0O1xuICAgIGNvbnN0IHJpZ2h0OiBudW1iZXIgPSBMQXBwRGVmaW5lLlZpZXdMb2dpY2FsUmlnaHQ7XG4gICAgY29uc3QgYm90dG9tOiBudW1iZXIgPSAtcmF0aW87XG4gICAgY29uc3QgdG9wOiBudW1iZXIgPSByYXRpbztcblxuICAgIHRoaXMuX3ZpZXdNYXRyaXguc2V0U2NyZWVuUmVjdChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3ApOyAvLyDorr7lpIflr7nlupTnmoTlsY/luZXojIPlm7TjgIJY55qE5bem56uv44CBWOeahOWPs+err+OAgVnnmoTkuIvnq6/jgIFZ55qE5LiK56uvXG5cbiAgICBjb25zdCBzY3JlZW5XOiBudW1iZXIgPSBNYXRoLmFicyhsZWZ0IC0gcmlnaHQpO1xuICAgIHRoaXMuX2RldmljZVRvU2NyZWVuLnNjYWxlUmVsYXRpdmUoc2NyZWVuVyAvIHdpZHRoLCAtc2NyZWVuVyAvIHdpZHRoKTtcbiAgICB0aGlzLl9kZXZpY2VUb1NjcmVlbi50cmFuc2xhdGVSZWxhdGl2ZSgtd2lkdGggKiAwLjUsIC1oZWlnaHQgKiAwLjUpO1xuXG4gICAgLy8g5pi+56S66IyD5Zu06K6+572uXG4gICAgdGhpcy5fdmlld01hdHJpeC5zZXRNYXhTY2FsZShMQXBwRGVmaW5lLlZpZXdNYXhTY2FsZSk7IC8vIOi+uemZheiGqOiDgOezu+aVsCDmnIDlpKfmmL7npLrojIPlm7RcbiAgICB0aGlzLl92aWV3TWF0cml4LnNldE1pblNjYWxlKExBcHBEZWZpbmUuVmlld01pblNjYWxlKTsgLy8g6L656ZmF5pS257yp546HIOacgOWwj+aYvuekuuiMg+WbtFxuXG4gICAgLy8g5pyA5aSn5pi+56S66IyD5Zu0XG4gICAgdGhpcy5fdmlld01hdHJpeC5zZXRNYXhTY3JlZW5SZWN0KFxuICAgICAgTEFwcERlZmluZS5WaWV3TG9naWNhbE1heExlZnQsXG4gICAgICBMQXBwRGVmaW5lLlZpZXdMb2dpY2FsTWF4UmlnaHQsXG4gICAgICBMQXBwRGVmaW5lLlZpZXdMb2dpY2FsTWF4Qm90dG9tLFxuICAgICAgTEFwcERlZmluZS5WaWV3TG9naWNhbE1heFRvcFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog6Kej5pS+44GZ44KLXG4gICAqIOmHiuaUvlxuICAgKi9cbiAgcHVibGljIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgdGhpcy5fdmlld01hdHJpeCA9IG51bGw7XG4gICAgdGhpcy5fdG91Y2hNYW5hZ2VyID0gbnVsbDtcbiAgICB0aGlzLl9kZXZpY2VUb1NjcmVlbiA9IG51bGw7XG4gICAgZ2wuZGVsZXRlUHJvZ3JhbSh0aGlzLl9wcm9ncmFtSWQpO1xuICAgIHRoaXMuX3Byb2dyYW1JZCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICog5o+P55S744GZ44KL44CCXG4gICAqIOe7mOWItuOAglxuICAgKi9cbiAgcHVibGljIHJlbmRlcigpOiB2b2lkIHtcbiAgICBnbC51c2VQcm9ncmFtKHRoaXMuX3Byb2dyYW1JZCk7XG4gICAgZ2wuZmx1c2goKTtcblxuICAgIGNvbnN0IGxpdmUyRE1hbmFnZXI6IExBcHBMaXZlMkRNYW5hZ2VyID0gTEFwcExpdmUyRE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcblxuICAgIGxpdmUyRE1hbmFnZXIub25VcGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDov5vooYzlm77lg4/nmoTliJ3lp4vljJbjgIJcbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplU3ByaXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBjYW52YXMud2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSBjYW52YXMuaGVpZ2h0O1xuXG4gICAgY29uc3QgdGV4dHVyZU1hbmFnZXIgPSBMQXBwRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5nZXRUZXh0dXJlTWFuYWdlcigpO1xuICAgIGNvbnN0IHJlc291cmNlc1BhdGggPSBMQXBwRGVmaW5lLlJlc291cmNlc1BhdGg7XG5cbiAgICBsZXQgaW1hZ2VOYW1lID0gJyc7XG5cbiAgICAvKi8vIOiDjOaZr+eUu+WDj+WIneacn+WMllxuICAgIGltYWdlTmFtZSA9IExBcHBEZWZpbmUuQmFja0ltYWdlTmFtZTtcblxuICAgIC8vIOmdnuWQjOacn+OBquOBruOBp+OCs+ODvOODq+ODkOODg+OCr+mWouaVsOOCkuS9nOaIkCDliJvlu7rkuIDkuKrlm57osIPlh73mlbDvvIzlm6DkuLrlroPmmK/lvILmraXnmoRcbiAgICBjb25zdCBpbml0QmFja0dyb3VuZFRleHR1cmUgPSAodGV4dHVyZUluZm86IFRleHR1cmVJbmZvKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB4OiBudW1iZXIgPSB3aWR0aCAqIDAuNTtcbiAgICAgIGNvbnN0IHk6IG51bWJlciA9IGhlaWdodCAqIDAuNTtcblxuICAgICAgY29uc3QgZndpZHRoID0gdGV4dHVyZUluZm8ud2lkdGggKiAyLjA7XG4gICAgICBjb25zdCBmaGVpZ2h0ID0gaGVpZ2h0ICogMC45NTtcbiAgICAgIHRoaXMuX2JhY2sgPSBuZXcgTEFwcFNwcml0ZSh4LCB5LCBmd2lkdGgsIGZoZWlnaHQsIHRleHR1cmVJbmZvLmlkKTtcbiAgICB9O1xuXG4gICAgdGV4dHVyZU1hbmFnZXIuY3JlYXRlVGV4dHVyZUZyb21QbmdGaWxlKFxuICAgICAgcmVzb3VyY2VzUGF0aCArIGltYWdlTmFtZSxcbiAgICAgIGZhbHNlLFxuICAgICAgaW5pdEJhY2tHcm91bmRUZXh0dXJlXG4gICAgKTtcblxuICAgIC8vIOm9v+i9ruWbvuWDj+eahOWIneWni+WMllxuICAgIGltYWdlTmFtZSA9IExBcHBEZWZpbmUuR2VhckltYWdlTmFtZTtcbiAgICBjb25zdCBpbml0R2VhclRleHR1cmUgPSAodGV4dHVyZUluZm86IFRleHR1cmVJbmZvKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB4ID0gd2lkdGggLSB0ZXh0dXJlSW5mby53aWR0aCAqIDAuNTtcbiAgICAgIGNvbnN0IHkgPSBoZWlnaHQgLSB0ZXh0dXJlSW5mby5oZWlnaHQgKiAwLjU7XG4gICAgICBjb25zdCBmd2lkdGggPSB0ZXh0dXJlSW5mby53aWR0aDtcbiAgICAgIGNvbnN0IGZoZWlnaHQgPSB0ZXh0dXJlSW5mby5oZWlnaHQ7XG4gICAgICB0aGlzLl9nZWFyID0gbmV3IExBcHBTcHJpdGUoeCwgeSwgZndpZHRoLCBmaGVpZ2h0LCB0ZXh0dXJlSW5mby5pZCk7XG4gICAgfTtcblxuICAgIHRleHR1cmVNYW5hZ2VyLmNyZWF0ZVRleHR1cmVGcm9tUG5nRmlsZShcbiAgICAgIHJlc291cmNlc1BhdGggKyBpbWFnZU5hbWUsXG4gICAgICBmYWxzZSxcbiAgICAgIGluaXRHZWFyVGV4dHVyZVxuICAgICk7Ki9cblxuICAgIC8vIOOCt+OCp+ODvOODgOODvOOCkuS9nOaIkCDliJvlu7rnnYDoibLlmajjgIJcbiAgICBpZiAodGhpcy5fcHJvZ3JhbUlkID09IG51bGwpIHtcbiAgICAgIHRoaXMuX3Byb2dyYW1JZCA9IExBcHBEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVNoYWRlcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDjgr/jg4Pjg4HjgZXjgozjgZ/mmYLjgavlkbzjgbDjgozjgovjgIJcbiAgICog6KKr6Kem5pG455qE5pe25YCZ6LCD55SoXG4gICAqXG4gICAqIEBwYXJhbSBwb2ludFgg5bGP5bmVWOWdkOagh1xuICAgKiBAcGFyYW0gcG9pbnRZIOWxj+W5lVnlnZDmoIdcbiAgICovXG4gIHB1YmxpYyBvblRvdWNoZXNCZWdhbihwb2ludFg6IG51bWJlciwgcG9pbnRZOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygn6KKr6Kem5pG455qE5pe25YCZ6LCD55SoJylcbiAgICBjb25zb2xlLmxvZyhwb2ludFgsIHBvaW50WSlcbiAgICB0aGlzLl90b3VjaE1hbmFnZXIudG91Y2hlc0JlZ2FuKHBvaW50WCwgcG9pbnRZKTtcbiAgICBjb25zdCBsaXZlMkRNYW5hZ2VyOiBMQXBwTGl2ZTJETWFuYWdlciA9IExBcHBMaXZlMkRNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gIH1cblxuICAvKipcbiAgICog44K/44OD44OB44GX44Gm44GE44KL44Go44GN44Gr44Od44Kk44Oz44K/44GM5YuV44GE44Gf44KJ5ZG844Gw44KM44KL44CCXG4gICAqIOa7keWKqOaXtuWAmeiwg+eUqCjop6bmkbjnp7vliqgpXG4gICAqXG4gICAqIEBwYXJhbSBwb2ludFgg5bGP5bmVWOWdkOagh1xuICAgKiBAcGFyYW0gcG9pbnRZIOWxj+W5lVnlnZDmoIdcbiAgICovXG4gIHB1YmxpYyBvblRvdWNoZXNNb3ZlZChwb2ludFg6IG51bWJlciwgcG9pbnRZOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3WDogbnVtYmVyID0gdGhpcy50cmFuc2Zvcm1WaWV3WCh0aGlzLl90b3VjaE1hbmFnZXIuZ2V0WCgpKTtcbiAgICBjb25zdCB2aWV3WTogbnVtYmVyID0gdGhpcy50cmFuc2Zvcm1WaWV3WSh0aGlzLl90b3VjaE1hbmFnZXIuZ2V0WSgpKTtcblxuICAgIHRoaXMuX3RvdWNoTWFuYWdlci50b3VjaGVzTW92ZWQocG9pbnRYLCBwb2ludFkpO1xuXG4gICAgY29uc3QgbGl2ZTJETWFuYWdlcjogTEFwcExpdmUyRE1hbmFnZXIgPSBMQXBwTGl2ZTJETWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIGxpdmUyRE1hbmFnZXIub25EcmFnKHZpZXdYLCB2aWV3WSk7XG4gIH1cblxuICAvKipcbiAgICog44K/44OD44OB44GM57WC5LqG44GX44Gf44KJ5ZG844Gw44KM44KL44CCXG4gICAqIOinpuaRuOe7k+adn+WQjuiwg+eUqFxuICAgKlxuICAgKiBAcGFyYW0gcG9pbnRYIOWxj+W5lVjlnZDmoIdcbiAgICogQHBhcmFtIHBvaW50WSDlsY/luZVZ5Z2Q5qCHXG4gICAqL1xuICBwdWJsaWMgb25Ub3VjaGVzRW5kZWQocG9pbnRYOiBudW1iZXIsIHBvaW50WTogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8g44K/44OD44OB57WC5LqGXG4gICAgY29uc29sZS5sb2cocG9pbnRYLHBvaW50WSlcbiAgICBjb25zdCBsaXZlMkRNYW5hZ2VyOiBMQXBwTGl2ZTJETWFuYWdlciA9IExBcHBMaXZlMkRNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgbGl2ZTJETWFuYWdlci5vbkRyYWcoMC4wLCAwLjApO1xuICAgIHtcbiAgICAgIC8vIOOCt+ODs+OCsOODq+OCv+ODg+ODlyDljZXmi41cbiAgICAgIGNvbnN0IHg6IG51bWJlciA9IHRoaXMuX2RldmljZVRvU2NyZWVuLnRyYW5zZm9ybVgoXG4gICAgICAgIHRoaXMuX3RvdWNoTWFuYWdlci5nZXRYKClcbiAgICAgICk7IC8vIOiOt+WPlumAu+i+keWdkOagh+i9rOaNouWQjueahOWdkOagh+OAglxuICAgICAgY29uc3QgeTogbnVtYmVyID0gdGhpcy5fZGV2aWNlVG9TY3JlZW4udHJhbnNmb3JtWShcbiAgICAgICAgdGhpcy5fdG91Y2hNYW5hZ2VyLmdldFkoKVxuICAgICAgKTsgLy8g6I635Y+W6YC76L6R5Z2Q5qCH5Y+Y5YyW55qE5Z2Q5qCH44CCXG5cbiAgICAgIGlmIChMQXBwRGVmaW5lLkRlYnVnVG91Y2hMb2dFbmFibGUpIHtcbiAgICAgICAgTEFwcFBhbC5wcmludE1lc3NhZ2UoYFtBUFBddG91Y2hlc0VuZGVkIHg6ICR7eH0geTogJHt5fWApO1xuICAgICAgfVxuICAgICAgbGl2ZTJETWFuYWdlci5vblRhcCh4LCB5KTtcbiAgICAgLyogLy8g5L2g5pWy5Yiw6b2/6L2u5LiK5LqG5ZCX77yfXG4gICAgICBpZiAodGhpcy5fZ2Vhci5pc0hpdChwb2ludFgsIHBvaW50WSkpIHtcbiAgICAgICAgbGl2ZTJETWFuYWdlci5uZXh0U2NlbmUoKTtcbiAgICAgIH0qL1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlsIZY5Z2Q5qCH6L2s5o2i5Li6Vmlld+WdkOagh+OAglxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlWCDorr7lpIdY5Z2Q5qCHXG4gICAqL1xuICBwdWJsaWMgdHJhbnNmb3JtVmlld1goZGV2aWNlWDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBzY3JlZW5YOiBudW1iZXIgPSB0aGlzLl9kZXZpY2VUb1NjcmVlbi50cmFuc2Zvcm1YKGRldmljZVgpOyAvLyDojrflj5bpgLvovpHlnZDmoIfovazmjaLlkI7nmoTlnZDmoIfjgIJcbiAgICByZXR1cm4gdGhpcy5fdmlld01hdHJpeC5pbnZlcnRUcmFuc2Zvcm1YKHNjcmVlblgpOyAvLyDmlL7lpKfjgIHnvKnlsI/jgIHnp7vliqjlkI7nmoTmlbDlgLxcbiAgfVxuXG4gIC8qKlxuICAgKuWwhlnlnZDmoIfovazmjaLkuLpWaWV35Z2Q5qCH44CCXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VZIOiuvuWkh1nlnZDmoIdcbiAgICovXG4gIHB1YmxpYyB0cmFuc2Zvcm1WaWV3WShkZXZpY2VZOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHNjcmVlblk6IG51bWJlciA9IHRoaXMuX2RldmljZVRvU2NyZWVuLnRyYW5zZm9ybVkoZGV2aWNlWSk7IC8vIOiOt+WPlumAu+i+keWdkOagh+i9rOaNouWQjueahOWdkOagh+OAglxuICAgIHJldHVybiB0aGlzLl92aWV3TWF0cml4LmludmVydFRyYW5zZm9ybVkoc2NyZWVuWSk7XG4gIH1cblxuICAvKipcbiAgICog5bCGWOWdkOagh+i9rOaNouS4uuWxj+W5leWdkOagh+OAglxuICAgKiBAcGFyYW0gZGV2aWNlWCDorr7lpIdY5Z2Q5qCHXG4gICAqL1xuICBwdWJsaWMgdHJhbnNmb3JtU2NyZWVuWChkZXZpY2VYOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kZXZpY2VUb1NjcmVlbi50cmFuc2Zvcm1YKGRldmljZVgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFnluqfmqJnjgpJTY3JlZW7luqfmqJnjgavlpInmj5vjgZnjgovjgIJcbiAgICog5bCGWeWdkOagh+i9rOaNouS4uuWxj+W5leWdkOagh+OAglxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlWSDorr7lpIdZ5Z2Q5qCHXG4gICAqL1xuICBwdWJsaWMgdHJhbnNmb3JtU2NyZWVuWShkZXZpY2VZOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kZXZpY2VUb1NjcmVlbi50cmFuc2Zvcm1ZKGRldmljZVkpO1xuICB9XG5cbiAgX3RvdWNoTWFuYWdlcjogVG91Y2hNYW5hZ2VyOyAvLyDjgr/jg4Pjg4Hjg57jg43jg7zjgrjjg6Pjg7wg6Kem5o6n566h55CGXG4gIF9kZXZpY2VUb1NjcmVlbjogQ3NtX0N1YmlzbU1hdHJpeDQ0OyAvLyDorr7lpIfliLDlsY/luZXnn6npmLVcbiAgX3ZpZXdNYXRyaXg6IENzbV9DdWJpc21WaWV3TWF0cml4OyAvLyB2aWV3TWF0cml4XG4gIF9wcm9ncmFtSWQ6IFdlYkdMUHJvZ3JhbTsgLy8g6KeG5Zu+55+p6Zi1XG4gIF9iYWNrOiBMQXBwU3ByaXRlOyAvLyDog4zmma/nlLvlg49cbiAgX2dlYXI6IExBcHBTcHJpdGU7IC8vIOm9kui8quW9ouixoVxuICBfY2hhbmdlTW9kZWw6IGJvb2xlYW47IC8vIOaooeWei+WIh+aNouagh+W/l1xuICBfaXNDbGljazogYm9vbGVhbjsgLy8g54K55Ye744CCXG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRoZSBMaXZlMkQgT3BlbiBTb2Z0d2FyZSBsaWNlbnNlXG4gKiB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5saXZlMmQuY29tL2V1bGEvbGl2ZTJkLW9wZW4tc29mdHdhcmUtbGljZW5zZS1hZ3JlZW1lbnRfZW4uaHRtbC5cbiAqL1xuXG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtbWF0cml4NDQgfSBmcm9tICcuL2N1YmlzbW1hdHJpeDQ0JztcbmltcG9ydCBDdWJpc21NYXRyaXg0NCA9IGN1YmlzbW1hdHJpeDQ0LkN1YmlzbU1hdHJpeDQ0O1xuXG5leHBvcnQgbmFtZXNwYWNlIExpdmUyREN1YmlzbUZyYW1ld29yayB7XG4gIC8qKlxuICAgKiDjgqvjg6Hjg6njga7kvY3nva7lpInmm7Tjgavkvb/jgYbjgajkvr/liKnjgao0eDTooYzliJdcbiAgICpcbiAgICog44Kr44Oh44Op44Gu5L2N572u5aSJ5pu044Gr5L2/44GG44Go5L6/5Yip44GqNHg06KGM5YiX44Gu44Kv44Op44K544CCXG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtVmlld01hdHJpeCBleHRlbmRzIEN1YmlzbU1hdHJpeDQ0IHtcbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgdGhpcy5fc2NyZWVuTGVmdCA9IDAuMDtcbiAgICAgIHRoaXMuX3NjcmVlblJpZ2h0ID0gMC4wO1xuICAgICAgdGhpcy5fc2NyZWVuVG9wID0gMC4wO1xuICAgICAgdGhpcy5fc2NyZWVuQm90dG9tID0gMC4wO1xuICAgICAgdGhpcy5fbWF4TGVmdCA9IDAuMDtcbiAgICAgIHRoaXMuX21heFJpZ2h0ID0gMC4wO1xuICAgICAgdGhpcy5fbWF4VG9wID0gMC4wO1xuICAgICAgdGhpcy5fbWF4Qm90dG9tID0gMC4wO1xuICAgICAgdGhpcy5fbWF4U2NhbGUgPSAwLjA7XG4gICAgICB0aGlzLl9taW5TY2FsZSA9IDAuMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnp7vli5XjgpLoqr/mlbRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFjou7jjga7np7vli5Xph49cbiAgICAgKiBAcGFyYW0geSBZ6Lu444Gu56e75YuV6YePXG4gICAgICovXG4gICAgcHVibGljIGFkanVzdFRyYW5zbGF0ZSh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuX3RyWzBdICogdGhpcy5fbWF4TGVmdCArICh0aGlzLl90clsxMl0gKyB4KSA+IHRoaXMuX3NjcmVlbkxlZnQpIHtcbiAgICAgICAgeCA9IHRoaXMuX3NjcmVlbkxlZnQgLSB0aGlzLl90clswXSAqIHRoaXMuX21heExlZnQgLSB0aGlzLl90clsxMl07XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fdHJbMF0gKiB0aGlzLl9tYXhSaWdodCArICh0aGlzLl90clsxMl0gKyB4KSA8XG4gICAgICAgIHRoaXMuX3NjcmVlblJpZ2h0XG4gICAgICApIHtcbiAgICAgICAgeCA9IHRoaXMuX3NjcmVlblJpZ2h0IC0gdGhpcy5fdHJbMF0gKiB0aGlzLl9tYXhSaWdodCAtIHRoaXMuX3RyWzEyXTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3RyWzVdICogdGhpcy5fbWF4VG9wICsgKHRoaXMuX3RyWzEzXSArIHkpIDwgdGhpcy5fc2NyZWVuVG9wKSB7XG4gICAgICAgIHkgPSB0aGlzLl9zY3JlZW5Ub3AgLSB0aGlzLl90cls1XSAqIHRoaXMuX21heFRvcCAtIHRoaXMuX3RyWzEzXTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl90cls1XSAqIHRoaXMuX21heEJvdHRvbSArICh0aGlzLl90clsxM10gKyB5KSA+XG4gICAgICAgIHRoaXMuX3NjcmVlbkJvdHRvbVxuICAgICAgKSB7XG4gICAgICAgIHkgPSB0aGlzLl9zY3JlZW5Cb3R0b20gLSB0aGlzLl90cls1XSAqIHRoaXMuX21heEJvdHRvbSAtIHRoaXMuX3RyWzEzXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHIxOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAgICAgMS4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDEuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAxLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgMC4wLFxuICAgICAgICAxLjBcbiAgICAgIF0pO1xuXG4gICAgICBDdWJpc21NYXRyaXg0NC5tdWx0aXBseSh0cjEsIHRoaXMuX3RyLCB0aGlzLl90cik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5ouh5aSn546H44KS6Kq/5pW0XG4gICAgICpcbiAgICAgKiBAcGFyYW0gY3gg5ouh5aSn44KS6KGM44GGWOi7uOOBruS4reW/g+S9jee9rlxuICAgICAqIEBwYXJhbSBjeSDmi6HlpKfjgpLooYzjgYZZ6Lu444Gu5Lit5b+D5L2N572uXG4gICAgICogQHBhcmFtIHNjYWxlIOaLoeWkp+eOh1xuICAgICAqL1xuICAgIHB1YmxpYyBhZGp1c3RTY2FsZShjeDogbnVtYmVyLCBjeTogbnVtYmVyLCBzY2FsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICBjb25zdCBtYXhTY2FsZTogbnVtYmVyID0gdGhpcy5nZXRNYXhTY2FsZSgpO1xuICAgICAgY29uc3QgbWluU2NhbGU6IG51bWJlciA9IHRoaXMuZ2V0TWluU2NhbGUoKTtcblxuICAgICAgY29uc3QgdGFyZ2V0U2NhbGUgPSBzY2FsZSAqIHRoaXMuX3RyWzBdO1xuXG4gICAgICBpZiAodGFyZ2V0U2NhbGUgPCBtaW5TY2FsZSkge1xuICAgICAgICBpZiAodGhpcy5fdHJbMF0gPiAwLjApIHtcbiAgICAgICAgICBzY2FsZSA9IG1pblNjYWxlIC8gdGhpcy5fdHJbMF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0U2NhbGUgPiBtYXhTY2FsZSkge1xuICAgICAgICBpZiAodGhpcy5fdHJbMF0gPiAwLjApIHtcbiAgICAgICAgICBzY2FsZSA9IG1heFNjYWxlIC8gdGhpcy5fdHJbMF07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdHIxOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KFtcbiAgICAgICAgMS4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDEuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAxLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgY3gsXG4gICAgICAgIGN5LFxuICAgICAgICAwLjAsXG4gICAgICAgIDEuMFxuICAgICAgXSk7XG5cbiAgICAgIGNvbnN0IHRyMjogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheShbXG4gICAgICAgIHNjYWxlLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIHNjYWxlLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDEuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAxLjBcbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCB0cjM6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgICAgICAxLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMS4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDAuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAwLjAsXG4gICAgICAgIDEuMCxcbiAgICAgICAgMC4wLFxuICAgICAgICAtY3gsXG4gICAgICAgIC1jeSxcbiAgICAgICAgMC4wLFxuICAgICAgICAxLjBcbiAgICAgIF0pO1xuXG4gICAgICBDdWJpc21NYXRyaXg0NC5tdWx0aXBseSh0cjMsIHRoaXMuX3RyLCB0aGlzLl90cik7XG4gICAgICBDdWJpc21NYXRyaXg0NC5tdWx0aXBseSh0cjIsIHRoaXMuX3RyLCB0aGlzLl90cik7XG4gICAgICBDdWJpc21NYXRyaXg0NC5tdWx0aXBseSh0cjEsIHRoaXMuX3RyLCB0aGlzLl90cik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OH44OQ44Kk44K544Gr5a++5b+c44GZ44KL6KuW55CG5bqn6aSK55Sf44Gu56+E5Zuy44Gu6Kit5a6aXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVmdCAgICAgIOW3pui+uuOBrljou7jjga7kvY3nva5cbiAgICAgKiBAcGFyYW0gcmlnaHQgICAgIOWPs+i+uuOBrljou7jjga7kvY3nva5cbiAgICAgKiBAcGFyYW0gYm90dG9tICAgIOS4i+i+uuOBrlnou7jjga7kvY3nva5cbiAgICAgKiBAcGFyYW0gdG9wICAgICAgIOS4iui+uuOBrlnou7jjga7kvY3nva5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U2NyZWVuUmVjdChcbiAgICAgIGxlZnQ6IG51bWJlcixcbiAgICAgIHJpZ2h0OiBudW1iZXIsXG4gICAgICBib3R0b206IG51bWJlcixcbiAgICAgIHRvcDogbnVtYmVyXG4gICAgKTogdm9pZCB7XG4gICAgICB0aGlzLl9zY3JlZW5MZWZ0ID0gbGVmdDtcbiAgICAgIHRoaXMuX3NjcmVlblJpZ2h0ID0gcmlnaHQ7XG4gICAgICB0aGlzLl9zY3JlZW5Cb3R0b20gPSBib3R0b207XG4gICAgICB0aGlzLl9zY3JlZW5Ub3AgPSB0b3A7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OH44OQ44Kk44K544Gr5a++5b+c44GZ44KL6KuW55CG5bqn5qiZ5LiK44Gu56e75YuV5Y+v6IO956+E5Zuy44Gu6Kit5a6aXG4gICAgICogQHBhcmFtIGxlZnQgICAgICDlt6bovrrjga5Y6Lu444Gu5L2N572uXG4gICAgICogQHBhcmFtIHJpZ2h0ICAgICDlj7Povrrjga5Y6Lu444Gu5L2N572uXG4gICAgICogQHBhcmFtIGJvdHRvbSAgICDkuIvovrrjga5Z6Lu444Gu5L2N572uXG4gICAgICogQHBhcmFtIHRvcCAgICAgICDkuIrovrrjga5Z6Lu444Gu5L2N572uXG4gICAgICovXG4gICAgcHVibGljIHNldE1heFNjcmVlblJlY3QoXG4gICAgICBsZWZ0OiBudW1iZXIsXG4gICAgICByaWdodDogbnVtYmVyLFxuICAgICAgYm90dG9tOiBudW1iZXIsXG4gICAgICB0b3A6IG51bWJlclxuICAgICk6IHZvaWQge1xuICAgICAgdGhpcy5fbWF4TGVmdCA9IGxlZnQ7XG4gICAgICB0aGlzLl9tYXhSaWdodCA9IHJpZ2h0O1xuICAgICAgdGhpcy5fbWF4VG9wID0gdG9wO1xuICAgICAgdGhpcy5fbWF4Qm90dG9tID0gYm90dG9tO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOacgOWkp+aLoeWkp+eOh+OBruioreWumlxuICAgICAqIEBwYXJhbSBtYXhTY2FsZSDmnIDlpKfmi6HlpKfnjodcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0TWF4U2NhbGUobWF4U2NhbGU6IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy5fbWF4U2NhbGUgPSBtYXhTY2FsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmnIDlsI/mi6HlpKfnjofjga7oqK3lrppcbiAgICAgKiBAcGFyYW0gbWluU2NhbGUg5pyA5bCP5ouh5aSn546HXG4gICAgICovXG4gICAgcHVibGljIHNldE1pblNjYWxlKG1pblNjYWxlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHRoaXMuX21pblNjYWxlID0gbWluU2NhbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5pyA5aSn5ouh5aSn546H44Gu5Y+W5b6XXG4gICAgICogQHJldHVybiDmnIDlpKfmi6HlpKfnjodcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWF4U2NhbGUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXhTY2FsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmnIDlsI/mi6HlpKfnjofjga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIOacgOWwj+aLoeWkp+eOh1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNaW5TY2FsZSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX21pblNjYWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaLoeWkp+eOh+OBjOacgOWkp+OBq+OBquOBo+OBpuOBhOOCi+OBi+OCkueiuuiqjeOBmeOCi1xuICAgICAqXG4gICAgICogQHJldHVybiB0cnVlIOaLoeWkp+eOh+OBr+acgOWkp1xuICAgICAqIEByZXR1cm4gZmFsc2Ug5ouh5aSn546H44Gv5pyA5aSn44Gn44Gv44Gq44GEXG4gICAgICovXG4gICAgcHVibGljIGlzTWF4U2NhbGUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRTY2FsZVgoKSA+PSB0aGlzLl9tYXhTY2FsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmi6HlpKfnjofjgYzmnIDlsI/jgavjgarjgaPjgabjgYTjgovjgYvjgpLnorroqo3jgZnjgotcbiAgICAgKlxuICAgICAqIEByZXR1cm4gdHJ1ZSDmi6HlpKfnjofjga/mnIDlsI9cbiAgICAgKiBAcmV0dXJuIGZhbHNlIOaLoeWkp+eOh+OBr+acgOWwj+OBp+OBr+OBquOBhFxuICAgICAqL1xuICAgIHB1YmxpYyBpc01pblNjYWxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U2NhbGVYKCkgPD0gdGhpcy5fbWluU2NhbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OH44OQ44Kk44K544Gr5a++5b+c44GZ44KL6KuW55CG5bqn5qiZ44Gu5bem6L6644Gu77y46Lu45L2N572u44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDjg4fjg5DjgqTjgrnjgavlr77lv5zjgZnjgovoq5bnkIbluqfmqJnjga7lt6bovrrjga5Y6Lu45L2N572uXG4gICAgICovXG4gICAgcHVibGljIGdldFNjcmVlbkxlZnQoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9zY3JlZW5MZWZ0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODh+ODkOOCpOOCueOBq+WvvuW/nOOBmeOCi+irlueQhuW6p+aomeOBruWPs+i+uuOBru+8uOi7uOS9jee9ruOCkuWPluW+l+OBmeOCi1xuICAgICAqIEByZXR1cm4g44OH44OQ44Kk44K544Gr5a++5b+c44GZ44KL6KuW55CG5bqn5qiZ44Gu5Y+z6L6644GuWOi7uOS9jee9rlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTY3JlZW5SaWdodCgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX3NjcmVlblJpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODh+ODkOOCpOOCueOBq+WvvuW/nOOBmeOCi+irlueQhuW6p+aomeOBruS4i+i+uuOBrlnou7jkvY3nva7jgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJuIOODh+ODkOOCpOOCueOBq+WvvuW/nOOBmeOCi+irlueQhuW6p+aomeOBruS4i+i+uuOBrlnou7jkvY3nva5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2NyZWVuQm90dG9tKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fc2NyZWVuQm90dG9tO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODh+ODkOOCpOOCueOBq+WvvuW/nOOBmeOCi+irlueQhuW6p+aomeOBruS4iui+uuOBrlnou7jkvY3nva7jgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJuIOODh+ODkOOCpOOCueOBq+WvvuW/nOOBmeOCi+irlueQhuW6p+aomeOBruS4iui+uuOBrlnou7jkvY3nva5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2NyZWVuVG9wKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fc2NyZWVuVG9wO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOW3pui+uuOBrljou7jkvY3nva7jga7mnIDlpKflgKTjga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIOW3pui+uuOBrljou7jkvY3nva7jga7mnIDlpKflgKRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWF4TGVmdCgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX21heExlZnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y+z6L6644GuWOi7uOS9jee9ruOBruacgOWkp+WApOOBruWPluW+l1xuICAgICAqIEByZXR1cm4g5Y+z6L6644GuWOi7uOS9jee9ruOBruacgOWkp+WApFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNYXhSaWdodCgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX21heFJpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS4i+i+uuOBrlnou7jkvY3nva7jga7mnIDlpKflgKTjga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIOS4i+i+uuOBrlnou7jkvY3nva7jga7mnIDlpKflgKRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWF4Qm90dG9tKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fbWF4Qm90dG9tO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS4iui+uuOBrlnou7jkvY3nva7jga7mnIDlpKflgKTjga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIOS4iui+uuOBrlnou7jkvY3nva7jga7mnIDlpKflgKRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWF4VG9wKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fbWF4VG9wO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NjcmVlbkxlZnQ6IG51bWJlcjsgLy8g44OH44OQ44Kk44K544Gr5a++5b+c44GZ44KL6KuW55CG5bqn5qiZ5LiK44Gu56+E5Zuy77yI5bem6L66WOi7uOS9jee9ru+8iVxuICAgIHByaXZhdGUgX3NjcmVlblJpZ2h0OiBudW1iZXI7IC8vIOODh+ODkOOCpOOCueOBq+WvvuW/nOOBmeOCi+irlueQhuW6p+aomeS4iuOBruevhOWbsu+8iOWPs+i+uljou7jkvY3nva7vvIlcbiAgICBwcml2YXRlIF9zY3JlZW5Ub3A6IG51bWJlcjsgLy8g44OH44OQ44Kk44K544Gr5a++5b+c44GZ44KL6KuW55CG5bqn5qiZ5LiK44Gu56+E5Zuy77yI5LiK6L66Wei7uOS9jee9ru+8iVxuICAgIHByaXZhdGUgX3NjcmVlbkJvdHRvbTogbnVtYmVyOyAvLyDjg4fjg5DjgqTjgrnjgavlr77lv5zjgZnjgovoq5bnkIbluqfmqJnkuIrjga7nr4Tlm7LvvIjkuIvovrpZ6Lu45L2N572u77yJXG4gICAgcHJpdmF0ZSBfbWF4TGVmdDogbnVtYmVyOyAvLyDoq5bnkIbluqfmqJnkuIrjga7np7vli5Xlj6/og73nr4Tlm7LvvIjlt6bovrpY6Lu45L2N572u77yJXG4gICAgcHJpdmF0ZSBfbWF4UmlnaHQ6IG51bWJlcjsgLy8g6KuW55CG5bqn5qiZ5LiK44Gu56e75YuV5Y+v6IO956+E5Zuy77yI5Y+z6L66WOi7uOS9jee9ru+8iVxuICAgIHByaXZhdGUgX21heFRvcDogbnVtYmVyOyAvLyDoq5bnkIbluqfmqJnkuIrjga7np7vli5Xlj6/og73nr4Tlm7LvvIjkuIrovrpZ6Lu45L2N572u77yJXG4gICAgcHJpdmF0ZSBfbWF4Qm90dG9tOiBudW1iZXI7IC8vIOirlueQhuW6p+aomeS4iuOBruenu+WLleWPr+iDveevhOWbsu+8iOS4i+i+ulnou7jkvY3nva7vvIlcbiAgICBwcml2YXRlIF9tYXhTY2FsZTogbnVtYmVyOyAvLyDmi6HlpKfnjofjga7mnIDlpKflgKRcbiAgICBwcml2YXRlIF9taW5TY2FsZTogbnVtYmVyOyAvLyDmi6HlpKfnjofjga7mnIDlsI/lgKRcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuZXhwb3J0IGNsYXNzIFRvdWNoTWFuYWdlciB7XG4gIC8qKlxuICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3N0YXJ0WCA9IDAuMDtcbiAgICB0aGlzLl9zdGFydFkgPSAwLjA7XG4gICAgdGhpcy5fbGFzdFggPSAwLjA7XG4gICAgdGhpcy5fbGFzdFkgPSAwLjA7XG4gICAgdGhpcy5fbGFzdFgxID0gMC4wO1xuICAgIHRoaXMuX2xhc3RZMSA9IDAuMDtcbiAgICB0aGlzLl9sYXN0WDIgPSAwLjA7XG4gICAgdGhpcy5fbGFzdFkyID0gMC4wO1xuICAgIHRoaXMuX2xhc3RUb3VjaERpc3RhbmNlID0gMC4wO1xuICAgIHRoaXMuX2RlbHRhWCA9IDAuMDtcbiAgICB0aGlzLl9kZWx0YVkgPSAwLjA7XG4gICAgdGhpcy5fc2NhbGUgPSAxLjA7XG4gICAgdGhpcy5fdG91Y2hTaW5nbGUgPSBmYWxzZTtcbiAgICB0aGlzLl9mbGlwQXZhaWxhYmxlID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2VudGVyWCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9sYXN0WDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDZW50ZXJZKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2xhc3RZO1xuICB9XG5cbiAgcHVibGljIGdldERlbHRhWCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kZWx0YVg7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVsdGFZKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RlbHRhWTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdGFydFgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRYO1xuICB9XG5cbiAgcHVibGljIGdldFN0YXJ0WSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zdGFydFk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2NhbGUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2NhbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0WCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9sYXN0WDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRZKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2xhc3RZO1xuICB9XG5cbiAgcHVibGljIGdldFgxKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2xhc3RYMTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRZMSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9sYXN0WTE7XG4gIH1cblxuICBwdWJsaWMgZ2V0WDIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbGFzdFgyO1xuICB9XG5cbiAgcHVibGljIGdldFkyKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2xhc3RZMjtcbiAgfVxuXG4gIHB1YmxpYyBpc1NpbmdsZVRvdWNoKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl90b3VjaFNpbmdsZTtcbiAgfVxuXG4gIHB1YmxpYyBpc0ZsaWNrQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9mbGlwQXZhaWxhYmxlO1xuICB9XG5cbiAgcHVibGljIGRpc2FibGVGbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLl9mbGlwQXZhaWxhYmxlID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICog44K/44OD44OB6ZaL5aeL5pmC44Kk44OZ44Oz44OIXG4gICAqIEBwYXJhbSBkZXZpY2VYIOOCv+ODg+ODgeOBl+OBn+eUu+mdouOBrnjjga7lgKRcbiAgICogQHBhcmFtIGRldmljZVkg44K/44OD44OB44GX44Gf55S76Z2i44GueeOBruWApFxuICAgKi9cbiAgcHVibGljIHRvdWNoZXNCZWdhbihkZXZpY2VYOiBudW1iZXIsIGRldmljZVk6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2xhc3RYID0gZGV2aWNlWDtcbiAgICB0aGlzLl9sYXN0WSA9IGRldmljZVk7XG4gICAgdGhpcy5fc3RhcnRYID0gZGV2aWNlWDtcbiAgICB0aGlzLl9zdGFydFkgPSBkZXZpY2VZO1xuICAgIHRoaXMuX2xhc3RUb3VjaERpc3RhbmNlID0gLTEuMDtcbiAgICB0aGlzLl9mbGlwQXZhaWxhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLl90b3VjaFNpbmdsZSA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICog44OJ44Op44OD44Kw5pmC44Gu44Kk44OZ44Oz44OIXG4gICAqIEBwYXJhbSBkZXZpY2VYIOOCv+ODg+ODgeOBl+OBn+eUu+mdouOBrnjjga7lgKRcbiAgICogQHBhcmFtIGRldmljZVkg44K/44OD44OB44GX44Gf55S76Z2i44GueeOBruWApFxuICAgKi9cbiAgcHVibGljIHRvdWNoZXNNb3ZlZChkZXZpY2VYOiBudW1iZXIsIGRldmljZVk6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2xhc3RYID0gZGV2aWNlWDtcbiAgICB0aGlzLl9sYXN0WSA9IGRldmljZVk7XG4gICAgdGhpcy5fbGFzdFRvdWNoRGlzdGFuY2UgPSAtMS4wO1xuICAgIHRoaXMuX3RvdWNoU2luZ2xlID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg5Xjg6rjg4Pjgq/jga7ot53pm6LmuKzlrppcbiAgICogQHJldHVybiDjg5Xjg6rjg4Pjgq/ot53pm6JcbiAgICovXG4gIHB1YmxpYyBnZXRGbGlja0Rpc3RhbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlRGlzdGFuY2UoXG4gICAgICB0aGlzLl9zdGFydFgsXG4gICAgICB0aGlzLl9zdGFydFksXG4gICAgICB0aGlzLl9sYXN0WCxcbiAgICAgIHRoaXMuX2xhc3RZXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDngrnvvJHjgYvjgonngrnvvJLjgbjjga7ot53pm6LjgpLmsYLjgoHjgotcbiAgICpcbiAgICogQHBhcmFtIHgxIO+8keOBpOebruOBruOCv+ODg+ODgeOBl+OBn+eUu+mdouOBrnjjga7lgKRcbiAgICogQHBhcmFtIHkxIO+8keOBpOebruOBruOCv+ODg+ODgeOBl+OBn+eUu+mdouOBrnnjga7lgKRcbiAgICogQHBhcmFtIHgyIO+8kuOBpOebruOBruOCv+ODg+ODgeOBl+OBn+eUu+mdouOBrnjjga7lgKRcbiAgICogQHBhcmFtIHkyIO+8kuOBpOebruOBruOCv+ODg+ODgeOBl+OBn+eUu+mdouOBrnnjga7lgKRcbiAgICovXG4gIHB1YmxpYyBjYWxjdWxhdGVEaXN0YW5jZShcbiAgICB4MTogbnVtYmVyLFxuICAgIHkxOiBudW1iZXIsXG4gICAgeDI6IG51bWJlcixcbiAgICB5MjogbnVtYmVyXG4gICk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguc3FydCgoeDEgLSB4MikgKiAoeDEgLSB4MikgKyAoeTEgLSB5MikgKiAoeTEgLSB5MikpO1xuICB9XG5cbiAgLyoqXG4gICAqIO+8kuOBpOebruOBruWApOOBi+OCieOAgeenu+WLlemHj+OCkuaxguOCgeOCi+OAglxuICAgKiDpgZXjgYbmlrnlkJHjga7loLTlkIjjga/np7vli5Xph4/vvJDjgILlkIzjgZjmlrnlkJHjga7loLTlkIjjga/jgIHntbblr77lgKTjgYzlsI/jgZXjgYTmlrnjga7lgKTjgpLlj4LnhafjgZnjgovjgIJcbiAgICpcbiAgICogQHBhcmFtIHYxIO+8keOBpOebruOBruenu+WLlemHj1xuICAgKiBAcGFyYW0gdjIg77yS44Gk55uu44Gu56e75YuV6YePXG4gICAqXG4gICAqIEByZXR1cm4g5bCP44GV44GE5pa544Gu56e75YuV6YePXG4gICAqL1xuICBwdWJsaWMgY2FsY3VsYXRlTW92aW5nQW1vdW50KHYxOiBudW1iZXIsIHYyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh2MSA+IDAuMCAhPSB2MiA+IDAuMCkge1xuICAgICAgcmV0dXJuIDAuMDtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduOiBudW1iZXIgPSB2MSA+IDAuMCA/IDEuMCA6IC0xLjA7XG4gICAgY29uc3QgYWJzb2x1dGVWYWx1ZTEgPSBNYXRoLmFicyh2MSk7XG4gICAgY29uc3QgYWJzb2x1dGVWYWx1ZTIgPSBNYXRoLmFicyh2Mik7XG4gICAgcmV0dXJuIChcbiAgICAgIHNpZ24gKiAoYWJzb2x1dGVWYWx1ZTEgPCBhYnNvbHV0ZVZhbHVlMiA/IGFic29sdXRlVmFsdWUxIDogYWJzb2x1dGVWYWx1ZTIpXG4gICAgKTtcbiAgfVxuXG4gIF9zdGFydFk6IG51bWJlcjsgLy8g44K/44OD44OB44KS6ZaL5aeL44GX44Gf5pmC44GueOOBruWApFxuICBfc3RhcnRYOiBudW1iZXI7IC8vIOOCv+ODg+ODgeOCkumWi+Wni+OBl+OBn+aZguOBrnnjga7lgKRcbiAgX2xhc3RYOiBudW1iZXI7IC8vIOOCt+ODs+OCsOODq+OCv+ODg+ODgeaZguOBrnjjga7lgKRcbiAgX2xhc3RZOiBudW1iZXI7IC8vIOOCt+ODs+OCsOODq+OCv+ODg+ODgeaZguOBrnnjga7lgKRcbiAgX2xhc3RYMTogbnVtYmVyOyAvLyDjg4Djg5bjg6vjgr/jg4Pjg4HmmYLjga7kuIDjgaTnm67jga5444Gu5YCkXG4gIF9sYXN0WTE6IG51bWJlcjsgLy8g44OA44OW44Or44K/44OD44OB5pmC44Gu5LiA44Gk55uu44GueeOBruWApFxuICBfbGFzdFgyOiBudW1iZXI7IC8vIOODgOODluODq+OCv+ODg+ODgeaZguOBruS6jOOBpOebruOBrnjjga7lgKRcbiAgX2xhc3RZMjogbnVtYmVyOyAvLyDjg4Djg5bjg6vjgr/jg4Pjg4HmmYLjga7kuozjgaTnm67jga5544Gu5YCkXG4gIF9sYXN0VG91Y2hEaXN0YW5jZTogbnVtYmVyOyAvLyAy5pys5Lul5LiK44Gn44K/44OD44OB44GX44Gf44Go44GN44Gu5oyH44Gu6Led6ZuiXG4gIF9kZWx0YVg6IG51bWJlcjsgLy8g5YmN5Zue44Gu5YCk44GL44KJ5LuK5Zue44Gu5YCk44G444GueOOBruenu+WLlei3nembouOAglxuICBfZGVsdGFZOiBudW1iZXI7IC8vIOWJjeWbnuOBruWApOOBi+OCieS7iuWbnuOBruWApOOBuOOBrnnjga7np7vli5Xot53pm6LjgIJcbiAgX3NjYWxlOiBudW1iZXI7IC8vIOOBk+OBruODleODrOODvOODoOOBp+aOm+OBkeWQiOOCj+OBm+OCi+aLoeWkp+eOh+OAguaLoeWkp+aTjeS9nOS4reS7peWkluOBrzHjgIJcbiAgX3RvdWNoU2luZ2xlOiBib29sZWFuOyAvLyDjgrfjg7PjgrDjg6vjgr/jg4Pjg4HmmYLjga90cnVlXG4gIF9mbGlwQXZhaWxhYmxlOiBib29sZWFuOyAvLyDjg5Xjg6rjg4Pjg5fjgYzmnInlirnjgYvjganjgYbjgYtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGhlIExpdmUyRCBPcGVuIFNvZnR3YXJlIGxpY2Vuc2VcbiAqIHRoYXQgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmxpdmUyZC5jb20vZXVsYS9saXZlMmQtb3Blbi1zb2Z0d2FyZS1saWNlbnNlLWFncmVlbWVudF9lbi5odG1sLlxuICovXG5cbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBsaXZlMmRjdWJpc21mcmFtZXdvcmsgfSBmcm9tICdAZnJhbWV3b3JrL2xpdmUyZGN1YmlzbWZyYW1ld29yayc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtaWQgfSBmcm9tICdAZnJhbWV3b3JrL2lkL2N1YmlzbWlkJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc211c2VybW9kZWwgfSBmcm9tICdAZnJhbWV3b3JrL21vZGVsL2N1YmlzbXVzZXJtb2RlbCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgaWN1YmlzbW1vZGVsc2V0dGluZyB9IGZyb20gJ0BmcmFtZXdvcmsvaWN1YmlzbW1vZGVsc2V0dGluZyc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtbW9kZWxzZXR0aW5nanNvbiB9IGZyb20gJ0BmcmFtZXdvcmsvY3ViaXNtbW9kZWxzZXR0aW5nanNvbic7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtZGVmYXVsdHBhcmFtZXRlcmlkIH0gZnJvbSAnQGZyYW1ld29yay9jdWJpc21kZWZhdWx0cGFyYW1ldGVyaWQnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGFjdWJpc21tb3Rpb24gfSBmcm9tICdAZnJhbWV3b3JrL21vdGlvbi9hY3ViaXNtbW90aW9uJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21leWVibGluayB9IGZyb20gJ0BmcmFtZXdvcmsvZWZmZWN0L2N1YmlzbWV5ZWJsaW5rJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21icmVhdGggfSBmcm9tICdAZnJhbWV3b3JrL2VmZmVjdC9jdWJpc21icmVhdGgnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGNzbXZlY3RvciB9IGZyb20gJ0BmcmFtZXdvcmsvdHlwZS9jc212ZWN0b3InO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGNzbW1hcCB9IGZyb20gJ0BmcmFtZXdvcmsvdHlwZS9jc21tYXAnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1hdHJpeDQ0IH0gZnJvbSAnQGZyYW1ld29yay9tYXRoL2N1YmlzbW1hdHJpeDQ0JztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21tb3Rpb24gfSBmcm9tICdAZnJhbWV3b3JrL21vdGlvbi9jdWJpc21tb3Rpb24nO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vdGlvbnF1ZXVlbWFuYWdlciB9IGZyb20gJ0BmcmFtZXdvcmsvbW90aW9uL2N1YmlzbW1vdGlvbnF1ZXVlbWFuYWdlcic7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3Ntc3RyaW5nIH0gZnJvbSAnQGZyYW1ld29yay90eXBlL2NzbXN0cmluZyc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3NtcmVjdCB9IGZyb20gJ0BmcmFtZXdvcmsvdHlwZS9jc21yZWN0Zic7XG5pbXBvcnQgeyBDdWJpc21Mb2dJbmZvIH0gZnJvbSAnQGZyYW1ld29yay91dGlscy9jdWJpc21kZWJ1Zyc7XG5pbXBvcnQgY3NtUmVjdCA9IGNzbXJlY3QuY3NtUmVjdDtcbmltcG9ydCBjc21TdHJpbmcgPSBjc21zdHJpbmcuY3NtU3RyaW5nO1xuaW1wb3J0IEludmFsaWRNb3Rpb25RdWV1ZUVudHJ5SGFuZGxlVmFsdWUgPSBjdWJpc21tb3Rpb25xdWV1ZW1hbmFnZXIuSW52YWxpZE1vdGlvblF1ZXVlRW50cnlIYW5kbGVWYWx1ZTtcbmltcG9ydCBDdWJpc21Nb3Rpb25RdWV1ZUVudHJ5SGFuZGxlID0gY3ViaXNtbW90aW9ucXVldWVtYW5hZ2VyLkN1YmlzbU1vdGlvblF1ZXVlRW50cnlIYW5kbGU7XG5pbXBvcnQgQ3ViaXNtTW90aW9uID0gY3ViaXNtbW90aW9uLkN1YmlzbU1vdGlvbjtcbmltcG9ydCBDdWJpc21NYXRyaXg0NCA9IGN1YmlzbW1hdHJpeDQ0LkN1YmlzbU1hdHJpeDQ0O1xuaW1wb3J0IGNzbU1hcCA9IGNzbW1hcC5jc21NYXA7XG5pbXBvcnQgY3NtVmVjdG9yID0gY3NtdmVjdG9yLmNzbVZlY3RvcjtcbmltcG9ydCBDdWJpc21CcmVhdGggPSBjdWJpc21icmVhdGguQ3ViaXNtQnJlYXRoO1xuaW1wb3J0IEJyZWF0aFBhcmFtZXRlckRhdGEgPSBjdWJpc21icmVhdGguQnJlYXRoUGFyYW1ldGVyRGF0YTtcbmltcG9ydCBDdWJpc21FeWVCbGluayA9IGN1YmlzbWV5ZWJsaW5rLkN1YmlzbUV5ZUJsaW5rO1xuaW1wb3J0IEFDdWJpc21Nb3Rpb24gPSBhY3ViaXNtbW90aW9uLkFDdWJpc21Nb3Rpb247XG5pbXBvcnQgRmluaXNoZWRNb3Rpb25DYWxsYmFjayA9IGFjdWJpc21tb3Rpb24uRmluaXNoZWRNb3Rpb25DYWxsYmFjaztcbmltcG9ydCBDdWJpc21GcmFtZXdvcmsgPSBsaXZlMmRjdWJpc21mcmFtZXdvcmsuQ3ViaXNtRnJhbWV3b3JrO1xuaW1wb3J0IEN1YmlzbUlkSGFuZGxlID0gY3ViaXNtaWQuQ3ViaXNtSWRIYW5kbGU7XG5pbXBvcnQgQ3ViaXNtVXNlck1vZGVsID0gY3ViaXNtdXNlcm1vZGVsLkN1YmlzbVVzZXJNb2RlbDtcbmltcG9ydCBJQ3ViaXNtTW9kZWxTZXR0aW5nID0gaWN1YmlzbW1vZGVsc2V0dGluZy5JQ3ViaXNtTW9kZWxTZXR0aW5nO1xuaW1wb3J0IEN1YmlzbU1vZGVsU2V0dGluZ0pzb24gPSBjdWJpc21tb2RlbHNldHRpbmdqc29uLkN1YmlzbU1vZGVsU2V0dGluZ0pzb247XG5pbXBvcnQgQ3ViaXNtRGVmYXVsdFBhcmFtZXRlcklkID0gY3ViaXNtZGVmYXVsdHBhcmFtZXRlcmlkO1xuXG5pbXBvcnQgeyBMQXBwUGFsIH0gZnJvbSAnLi9sYXBwcGFsJztcbmltcG9ydCB7IGdsLCBjYW52YXMsIGZyYW1lQnVmZmVyLCBMQXBwRGVsZWdhdGUgfSBmcm9tICcuL2xhcHBkZWxlZ2F0ZSc7XG5pbXBvcnQgeyBUZXh0dXJlSW5mbyB9IGZyb20gJy4vbGFwcHRleHR1cmVtYW5hZ2VyJztcbmltcG9ydCAqIGFzIExBcHBEZWZpbmUgZnJvbSAnLi9sYXBwZGVmaW5lJztcbmltcG9ydCAnd2hhdHdnLWZldGNoJztcblxuZW51bSBMb2FkU3RlcCB7XG4gIExvYWRBc3NldHMsXG4gIExvYWRNb2RlbCxcbiAgV2FpdExvYWRNb2RlbCxcbiAgTG9hZEV4cHJlc3Npb24sXG4gIFdhaXRMb2FkRXhwcmVzc2lvbixcbiAgTG9hZFBoeXNpY3MsXG4gIFdhaXRMb2FkUGh5c2ljcyxcbiAgTG9hZFBvc2UsXG4gIFdhaXRMb2FkUG9zZSxcbiAgU2V0dXBFeWVCbGluayxcbiAgU2V0dXBCcmVhdGgsXG4gIExvYWRVc2VyRGF0YSxcbiAgV2FpdExvYWRVc2VyRGF0YSxcbiAgU2V0dXBFeWVCbGlua0lkcyxcbiAgU2V0dXBMaXBTeW5jSWRzLFxuICBTZXR1cExheW91dCxcbiAgTG9hZE1vdGlvbixcbiAgV2FpdExvYWRNb3Rpb24sXG4gIENvbXBsZXRlSW5pdGlhbGl6ZSxcbiAgQ29tcGxldGVTZXR1cE1vZGVsLFxuICBMb2FkVGV4dHVyZSxcbiAgV2FpdExvYWRUZXh0dXJlLFxuICBDb21wbGV0ZVNldHVwXG59XG5cbi8qKlxuICog44Om44O844K244O844GM5a6f6Zqb44Gr5L2/55So44GZ44KL44Oi44OH44Or44Gu5a6f6KOF44Kv44Op44K5PGJyPlxuICog44Oi44OH44Or55Sf5oiQ44CB5qmf6IO944Kz44Oz44Od44O844ON44Oz44OI55Sf5oiQ44CB5pu05paw5Yem55CG44Go44Os44Oz44OA44Oq44Oz44Kw44Gu5ZG844Gz5Ye644GX44KS6KGM44GG44CCXG4gKi9cbmV4cG9ydCBjbGFzcyBMQXBwTW9kZWwgZXh0ZW5kcyBDdWJpc21Vc2VyTW9kZWwge1xuICAvKipcbiAgICogbW9kZWwzLmpzb27jgYznva7jgYvjgozjgZ/jg4fjgqPjg6zjgq/jg4jjg6rjgajjg5XjgqHjgqTjg6vjg5HjgrnjgYvjgonjg6Ljg4fjg6vjgpLnlJ/miJDjgZnjgotcbiAgICog5qC55o2u5pS+572u5pyJbW9kZWwzLmpzb27nmoTnm67lvZXlkozmlofku7bot6/lvoTnlJ/miJDmqKHlnotcbiAgICogQHBhcmFtIGRpciB1cmxcbiAgICogQHBhcmFtIGZpbGVOYW1lXG4gICAqL1xuICBwdWJsaWMgbG9hZEFzc2V0cyhkaXI6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX21vZGVsSG9tZURpciA9IGRpcjtcblxuICAgIGZldGNoKGAke3RoaXMuX21vZGVsSG9tZURpcn0vJHtmaWxlTmFtZX1gKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSlcbiAgICAgIC50aGVuKGFycmF5QnVmZmVyID0+IHtcbiAgICAgICAgY29uc3Qgc2V0dGluZzogSUN1YmlzbU1vZGVsU2V0dGluZyA9IG5ldyBDdWJpc21Nb2RlbFNldHRpbmdKc29uKFxuICAgICAgICAgIGFycmF5QnVmZmVyLFxuICAgICAgICAgIGFycmF5QnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgICAgKTtcblxuICAgICAgICAvLyDmm7TmlrDnirbmgIFcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBMb2FkU3RlcC5Mb2FkTW9kZWw7XG5cbiAgICAgICAgLy8g5L+d5a2Y57uT5p6cXG4gICAgICAgIHRoaXMuc2V0dXBNb2RlbChzZXR0aW5nKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIG1vZGVsMy5qc29u44GL44KJ44Oi44OH44Or44KS55Sf5oiQ44GZ44KL44CCXG4gICAqIOS7jm1vZGVsMy5qc29u55Sf5oiQ5qih5Z6L44CCXG4gICAqIG1vZGVsMy5qc29u44Gu6KiY6L+w44Gr5b6T44Gj44Gm44Oi44OH44Or55Sf5oiQ44CB44Oi44O844K344On44Oz44CB54mp55CG5ryU566X44Gq44Gp44Gu44Kz44Oz44Od44O844ON44Oz44OI55Sf5oiQ44KS6KGM44GG44CCXG4gICAqIG1vZGVsMy5qc29uIOagueaNruaPj+i/sOeUn+aIkOivuOWmguaooeWei+OAgeWKqOS9nOOAgeeJqeeQhui/kOeul+S5i+exu+eahOe7hOS7tuOAglxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZyBJQ3ViaXNtTW9kZWxTZXR0aW5n44Gu44Kk44Oz44K544K/44Oz44K5XG4gICAqL1xuICBwcml2YXRlIHNldHVwTW9kZWwoc2V0dGluZzogSUN1YmlzbU1vZGVsU2V0dGluZyk6IHZvaWQge1xuICAgIHRoaXMuX3VwZGF0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5fbW9kZWxTZXR0aW5nID0gc2V0dGluZztcblxuICAgIC8vIEN1YmlzbU1vZGVsXG4gICAgaWYgKHRoaXMuX21vZGVsU2V0dGluZy5nZXRNb2RlbEZpbGVOYW1lKCkgIT0gJycpIHtcbiAgICAgIGNvbnN0IG1vZGVsRmlsZU5hbWUgPSB0aGlzLl9tb2RlbFNldHRpbmcuZ2V0TW9kZWxGaWxlTmFtZSgpO1xuXG4gICAgICBmZXRjaChgJHt0aGlzLl9tb2RlbEhvbWVEaXJ9LyR7bW9kZWxGaWxlTmFtZX1gKVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5hcnJheUJ1ZmZlcigpKVxuICAgICAgICAudGhlbihhcnJheUJ1ZmZlciA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkTW9kZWwoYXJyYXlCdWZmZXIpO1xuICAgICAgICAgIHRoaXMuX3N0YXRlID0gTG9hZFN0ZXAuTG9hZEV4cHJlc3Npb247XG5cbiAgICAgICAgICAvLyBjYWxsYmFja1xuICAgICAgICAgIGxvYWRDdWJpc21FeHByZXNzaW9uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9zdGF0ZSA9IExvYWRTdGVwLldhaXRMb2FkTW9kZWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIExBcHBQYWwucHJpbnRNZXNzYWdlKCdNb2RlbCBkYXRhIGRvZXMgbm90IGV4aXN0LicpO1xuICAgIH1cblxuICAgIC8vIEV4cHJlc3Npb25cbiAgICBjb25zdCBsb2FkQ3ViaXNtRXhwcmVzc2lvbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLl9tb2RlbFNldHRpbmcuZ2V0RXhwcmVzc2lvbkNvdW50KCkgPiAwKSB7XG4gICAgICAgIGNvbnN0IGNvdW50OiBudW1iZXIgPSB0aGlzLl9tb2RlbFNldHRpbmcuZ2V0RXhwcmVzc2lvbkNvdW50KCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXhwcmVzc2lvbk5hbWUgPSB0aGlzLl9tb2RlbFNldHRpbmcuZ2V0RXhwcmVzc2lvbk5hbWUoaSk7XG4gICAgICAgICAgY29uc3QgZXhwcmVzc2lvbkZpbGVOYW1lID0gdGhpcy5fbW9kZWxTZXR0aW5nLmdldEV4cHJlc3Npb25GaWxlTmFtZShcbiAgICAgICAgICAgIGlcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgZmV0Y2goYCR7dGhpcy5fbW9kZWxIb21lRGlyfS8ke2V4cHJlc3Npb25GaWxlTmFtZX1gKVxuICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSlcbiAgICAgICAgICAgIC50aGVuKGFycmF5QnVmZmVyID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbW90aW9uOiBBQ3ViaXNtTW90aW9uID0gdGhpcy5sb2FkRXhwcmVzc2lvbihcbiAgICAgICAgICAgICAgICBhcnJheUJ1ZmZlcixcbiAgICAgICAgICAgICAgICBhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb25OYW1lXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2V4cHJlc3Npb25zLmdldFZhbHVlKGV4cHJlc3Npb25OYW1lKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgQUN1YmlzbU1vdGlvbi5kZWxldGUoXG4gICAgICAgICAgICAgICAgICB0aGlzLl9leHByZXNzaW9ucy5nZXRWYWx1ZShleHByZXNzaW9uTmFtZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuX2V4cHJlc3Npb25zLnNldFZhbHVlKGV4cHJlc3Npb25OYW1lLCBudWxsKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuX2V4cHJlc3Npb25zLnNldFZhbHVlKGV4cHJlc3Npb25OYW1lLCBtb3Rpb24pO1xuXG4gICAgICAgICAgICAgIHRoaXMuX2V4cHJlc3Npb25Db3VudCsrO1xuXG4gICAgICAgICAgICAgIGlmICh0aGlzLl9leHByZXNzaW9uQ291bnQgPj0gY291bnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IExvYWRTdGVwLkxvYWRQaHlzaWNzO1xuXG4gICAgICAgICAgICAgICAgLy8gY2FsbGJhY2tcbiAgICAgICAgICAgICAgICBsb2FkQ3ViaXNtUGh5c2ljcygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSA9IExvYWRTdGVwLldhaXRMb2FkRXhwcmVzc2lvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gTG9hZFN0ZXAuTG9hZFBoeXNpY3M7XG5cbiAgICAgICAgLy8gY2FsbGJhY2tcbiAgICAgICAgbG9hZEN1YmlzbVBoeXNpY3MoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gUGh5c2ljc1xuICAgIGNvbnN0IGxvYWRDdWJpc21QaHlzaWNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMuX21vZGVsU2V0dGluZy5nZXRQaHlzaWNzRmlsZU5hbWUoKSAhPSAnJykge1xuICAgICAgICBjb25zdCBwaHlzaWNzRmlsZU5hbWUgPSB0aGlzLl9tb2RlbFNldHRpbmcuZ2V0UGh5c2ljc0ZpbGVOYW1lKCk7XG5cbiAgICAgICAgZmV0Y2goYCR7dGhpcy5fbW9kZWxIb21lRGlyfS8ke3BoeXNpY3NGaWxlTmFtZX1gKVxuICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpXG4gICAgICAgICAgLnRoZW4oYXJyYXlCdWZmZXIgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkUGh5c2ljcyhhcnJheUJ1ZmZlciwgYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gTG9hZFN0ZXAuTG9hZFBvc2U7XG5cbiAgICAgICAgICAgIC8vIGNhbGxiYWNrXG4gICAgICAgICAgICBsb2FkQ3ViaXNtUG9zZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IExvYWRTdGVwLldhaXRMb2FkUGh5c2ljcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gTG9hZFN0ZXAuTG9hZFBvc2U7XG5cbiAgICAgICAgLy8gY2FsbGJhY2tcbiAgICAgICAgbG9hZEN1YmlzbVBvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gUG9zZVxuICAgIGNvbnN0IGxvYWRDdWJpc21Qb3NlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMuX21vZGVsU2V0dGluZy5nZXRQb3NlRmlsZU5hbWUoKSAhPSAnJykge1xuICAgICAgICBjb25zdCBwb3NlRmlsZU5hbWUgPSB0aGlzLl9tb2RlbFNldHRpbmcuZ2V0UG9zZUZpbGVOYW1lKCk7XG5cbiAgICAgICAgZmV0Y2goYCR7dGhpcy5fbW9kZWxIb21lRGlyfS8ke3Bvc2VGaWxlTmFtZX1gKVxuICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpXG4gICAgICAgICAgLnRoZW4oYXJyYXlCdWZmZXIgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkUG9zZShhcnJheUJ1ZmZlciwgYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gTG9hZFN0ZXAuU2V0dXBFeWVCbGluaztcblxuICAgICAgICAgICAgLy8gY2FsbGJhY2tcbiAgICAgICAgICAgIHNldHVwRXllQmxpbmsoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBMb2FkU3RlcC5XYWl0TG9hZFBvc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IExvYWRTdGVwLlNldHVwRXllQmxpbms7XG5cbiAgICAgICAgLy8gY2FsbGJhY2tcbiAgICAgICAgc2V0dXBFeWVCbGluaygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFeWVCbGlua1xuICAgIGNvbnN0IHNldHVwRXllQmxpbmsgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5fbW9kZWxTZXR0aW5nLmdldEV5ZUJsaW5rUGFyYW1ldGVyQ291bnQoKSA+IDApIHtcbiAgICAgICAgdGhpcy5fZXllQmxpbmsgPSBDdWJpc21FeWVCbGluay5jcmVhdGUodGhpcy5fbW9kZWxTZXR0aW5nKTtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBMb2FkU3RlcC5TZXR1cEJyZWF0aDtcbiAgICAgIH1cblxuICAgICAgLy8gY2FsbGJhY2tcbiAgICAgIHNldHVwQnJlYXRoKCk7XG4gICAgfTtcblxuICAgIC8vIEJyZWF0aFxuICAgIGNvbnN0IHNldHVwQnJlYXRoID0gKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5fYnJlYXRoID0gQ3ViaXNtQnJlYXRoLmNyZWF0ZSgpO1xuXG4gICAgICBjb25zdCBicmVhdGhQYXJhbWV0ZXJzOiBjc21WZWN0b3I8QnJlYXRoUGFyYW1ldGVyRGF0YT4gPSBuZXcgY3NtVmVjdG9yKCk7XG4gICAgICBicmVhdGhQYXJhbWV0ZXJzLnB1c2hCYWNrKFxuICAgICAgICBuZXcgQnJlYXRoUGFyYW1ldGVyRGF0YSh0aGlzLl9pZFBhcmFtQW5nbGVYLCAwLjAsIDE1LjAsIDYuNTM0NSwgMC41KVxuICAgICAgKTtcbiAgICAgIGJyZWF0aFBhcmFtZXRlcnMucHVzaEJhY2soXG4gICAgICAgIG5ldyBCcmVhdGhQYXJhbWV0ZXJEYXRhKHRoaXMuX2lkUGFyYW1BbmdsZVksIDAuMCwgOC4wLCAzLjUzNDUsIDAuNSlcbiAgICAgICk7XG4gICAgICBicmVhdGhQYXJhbWV0ZXJzLnB1c2hCYWNrKFxuICAgICAgICBuZXcgQnJlYXRoUGFyYW1ldGVyRGF0YSh0aGlzLl9pZFBhcmFtQW5nbGVaLCAwLjAsIDEwLjAsIDUuNTM0NSwgMC41KVxuICAgICAgKTtcbiAgICAgIGJyZWF0aFBhcmFtZXRlcnMucHVzaEJhY2soXG4gICAgICAgIG5ldyBCcmVhdGhQYXJhbWV0ZXJEYXRhKHRoaXMuX2lkUGFyYW1Cb2R5QW5nbGVYLCAwLjAsIDQuMCwgMTUuNTM0NSwgMC41KVxuICAgICAgKTtcbiAgICAgIGJyZWF0aFBhcmFtZXRlcnMucHVzaEJhY2soXG4gICAgICAgIG5ldyBCcmVhdGhQYXJhbWV0ZXJEYXRhKFxuICAgICAgICAgIEN1YmlzbUZyYW1ld29yay5nZXRJZE1hbmFnZXIoKS5nZXRJZChcbiAgICAgICAgICAgIEN1YmlzbURlZmF1bHRQYXJhbWV0ZXJJZC5QYXJhbUJyZWF0aFxuICAgICAgICAgICksXG4gICAgICAgICAgMC4wLFxuICAgICAgICAgIDAuNSxcbiAgICAgICAgICAzLjIzNDUsXG4gICAgICAgICAgMC41XG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX2JyZWF0aC5zZXRQYXJhbWV0ZXJzKGJyZWF0aFBhcmFtZXRlcnMpO1xuICAgICAgdGhpcy5fc3RhdGUgPSBMb2FkU3RlcC5Mb2FkVXNlckRhdGE7XG5cbiAgICAgIC8vIGNhbGxiYWNrXG4gICAgICBsb2FkVXNlckRhdGEoKTtcbiAgICB9O1xuXG4gICAgLy8gVXNlckRhdGFcbiAgICBjb25zdCBsb2FkVXNlckRhdGEgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5fbW9kZWxTZXR0aW5nLmdldFVzZXJEYXRhRmlsZSgpICE9ICcnKSB7XG4gICAgICAgIGNvbnN0IHVzZXJEYXRhRmlsZSA9IHRoaXMuX21vZGVsU2V0dGluZy5nZXRVc2VyRGF0YUZpbGUoKTtcblxuICAgICAgICBmZXRjaChgJHt0aGlzLl9tb2RlbEhvbWVEaXJ9LyR7dXNlckRhdGFGaWxlfWApXG4gICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSlcbiAgICAgICAgICAudGhlbihhcnJheUJ1ZmZlciA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRVc2VyRGF0YShhcnJheUJ1ZmZlciwgYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gTG9hZFN0ZXAuU2V0dXBFeWVCbGlua0lkcztcblxuICAgICAgICAgICAgLy8gY2FsbGJhY2tcbiAgICAgICAgICAgIHNldHVwRXllQmxpbmtJZHMoKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9zdGF0ZSA9IExvYWRTdGVwLldhaXRMb2FkVXNlckRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IExvYWRTdGVwLlNldHVwRXllQmxpbmtJZHM7XG5cbiAgICAgICAgLy8gY2FsbGJhY2tcbiAgICAgICAgc2V0dXBFeWVCbGlua0lkcygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFeWVCbGlua0lkc1xuICAgIGNvbnN0IHNldHVwRXllQmxpbmtJZHMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBleWVCbGlua0lkQ291bnQ6IG51bWJlciA9IHRoaXMuX21vZGVsU2V0dGluZy5nZXRFeWVCbGlua1BhcmFtZXRlckNvdW50KCk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXllQmxpbmtJZENvdW50OyArK2kpIHtcbiAgICAgICAgdGhpcy5fZXllQmxpbmtJZHMucHVzaEJhY2soXG4gICAgICAgICAgdGhpcy5fbW9kZWxTZXR0aW5nLmdldEV5ZUJsaW5rUGFyYW1ldGVySWQoaSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc3RhdGUgPSBMb2FkU3RlcC5TZXR1cExpcFN5bmNJZHM7XG5cbiAgICAgIC8vIGNhbGxiYWNrXG4gICAgICBzZXR1cExpcFN5bmNJZHMoKTtcbiAgICB9O1xuXG4gICAgLy8gTGlwU3luY0lkc1xuICAgIGNvbnN0IHNldHVwTGlwU3luY0lkcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGxpcFN5bmNJZENvdW50ID0gdGhpcy5fbW9kZWxTZXR0aW5nLmdldExpcFN5bmNQYXJhbWV0ZXJDb3VudCgpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpcFN5bmNJZENvdW50OyArK2kpIHtcbiAgICAgICAgdGhpcy5fbGlwU3luY0lkcy5wdXNoQmFjayh0aGlzLl9tb2RlbFNldHRpbmcuZ2V0TGlwU3luY1BhcmFtZXRlcklkKGkpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YXRlID0gTG9hZFN0ZXAuU2V0dXBMYXlvdXQ7XG5cbiAgICAgIC8vIGNhbGxiYWNrXG4gICAgICBzZXR1cExheW91dCgpO1xuICAgIH07XG5cbiAgICAvLyBMYXlvdXRcbiAgICBjb25zdCBzZXR1cExheW91dCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGxheW91dDogY3NtTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBjc21NYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICB0aGlzLl9tb2RlbFNldHRpbmcuZ2V0TGF5b3V0TWFwKGxheW91dCk7XG4gICAgICB0aGlzLl9tb2RlbE1hdHJpeC5zZXR1cEZyb21MYXlvdXQobGF5b3V0KTtcbiAgICAgIHRoaXMuX3N0YXRlID0gTG9hZFN0ZXAuTG9hZE1vdGlvbjtcblxuICAgICAgLy8gY2FsbGJhY2tcbiAgICAgIGxvYWRDdWJpc21Nb3Rpb24oKTtcbiAgICB9O1xuXG4gICAgLy8gTW90aW9uXG4gICAgY29uc3QgbG9hZEN1YmlzbU1vdGlvbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMuX3N0YXRlID0gTG9hZFN0ZXAuV2FpdExvYWRNb3Rpb247XG4gICAgICB0aGlzLl9tb2RlbC5zYXZlUGFyYW1ldGVycygpO1xuICAgICAgdGhpcy5fYWxsTW90aW9uQ291bnQgPSAwO1xuICAgICAgdGhpcy5fbW90aW9uQ291bnQgPSAwO1xuICAgICAgY29uc3QgZ3JvdXA6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGNvbnN0IG1vdGlvbkdyb3VwQ291bnQ6IG51bWJlciA9IHRoaXMuX21vZGVsU2V0dGluZy5nZXRNb3Rpb25Hcm91cENvdW50KCk7XG5cbiAgICAgIC8vIOODouODvOOCt+ODp+ODs+OBrue3j+aVsOOCkuaxguOCgeOCi1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb3Rpb25Hcm91cENvdW50OyBpKyspIHtcbiAgICAgICAgZ3JvdXBbaV0gPSB0aGlzLl9tb2RlbFNldHRpbmcuZ2V0TW90aW9uR3JvdXBOYW1lKGkpO1xuICAgICAgICB0aGlzLl9hbGxNb3Rpb25Db3VudCArPSB0aGlzLl9tb2RlbFNldHRpbmcuZ2V0TW90aW9uQ291bnQoZ3JvdXBbaV0pO1xuICAgICAgfVxuXG4gICAgICAvLyDjg6Ljg7zjgrfjg6fjg7Pjga7oqq3jgb/ovrzjgb9cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW90aW9uR3JvdXBDb3VudDsgaSsrKSB7XG4gICAgICAgIHRoaXMucHJlTG9hZE1vdGlvbkdyb3VwKGdyb3VwW2ldKTtcbiAgICAgIH1cblxuICAgICAgLy8g44Oi44O844K344On44Oz44GM44Gq44GE5aC05ZCIXG4gICAgICBpZiAobW90aW9uR3JvdXBDb3VudCA9PSAwKSB7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gTG9hZFN0ZXAuTG9hZFRleHR1cmU7XG5cbiAgICAgICAgLy8g5YWo44Gm44Gu44Oi44O844K344On44Oz44KS5YGc5q2i44GZ44KLXG4gICAgICAgIHRoaXMuX21vdGlvbk1hbmFnZXIuc3RvcEFsbE1vdGlvbnMoKTtcblxuICAgICAgICB0aGlzLl91cGRhdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5jcmVhdGVSZW5kZXJlcigpO1xuICAgICAgICB0aGlzLnNldHVwVGV4dHVyZXMoKTtcbiAgICAgICAgdGhpcy5nZXRSZW5kZXJlcigpLnN0YXJ0VXAoZ2wpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog5Zyo57q555CG5Y2V5YWD5LiK5Yqg6L2957q555CGXG4gICAqL1xuICBwcml2YXRlIHNldHVwVGV4dHVyZXMoKTogdm9pZCB7XG4gICAgLy8gaVBob25l44Gn44Gu44Ki44Or44OV44Kh5ZOB6LOq5ZCR5LiK44Gu44Gf44KBVHlwZXNjcmlwdOOBp+OBr3ByZW11bHRpcGxpZWRBbHBoYeOCkuaOoeeUqFxuICAgIGNvbnN0IHVzZVByZW11bHRpcGx5ID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PSBMb2FkU3RlcC5Mb2FkVGV4dHVyZSkge1xuICAgICAgLy8g44OG44Kv44K544OB44Oj6Kqt44G/6L6844G/55SoXG4gICAgICBjb25zdCB0ZXh0dXJlQ291bnQ6IG51bWJlciA9IHRoaXMuX21vZGVsU2V0dGluZy5nZXRUZXh0dXJlQ291bnQoKTtcblxuICAgICAgZm9yIChcbiAgICAgICAgbGV0IG1vZGVsVGV4dHVyZU51bWJlciA9IDA7XG4gICAgICAgIG1vZGVsVGV4dHVyZU51bWJlciA8IHRleHR1cmVDb3VudDtcbiAgICAgICAgbW9kZWxUZXh0dXJlTnVtYmVyKytcbiAgICAgICkge1xuICAgICAgICAvLyDjg4bjgq/jgrnjg4Hjg6PlkI3jgYznqbrmloflrZfjgaDjgaPjgZ/loLTlkIjjga/jg63jg7zjg4njg7vjg5DjgqTjg7Pjg4nlh6bnkIbjgpLjgrnjgq3jg4Pjg5dcbiAgICAgICAgLy8g5aaC5p6c57q555CG5ZCN56ew5Li656m65a2X56ym77yM5YiZ6Lez6L+H5Yqg6L2957uR5a6a6L+H56iL44CCXG4gICAgICAgIGlmICh0aGlzLl9tb2RlbFNldHRpbmcuZ2V0VGV4dHVyZUZpbGVOYW1lKG1vZGVsVGV4dHVyZU51bWJlcikgPT0gJycpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnZ2V0VGV4dHVyZUZpbGVOYW1lIG51bGwnKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlYkdM44Gu44OG44Kv44K544OB44Oj44Om44OL44OD44OI44Gr44OG44Kv44K544OB44Oj44KS44Ot44O844OJ44GZ44KLXG4gICAgICAgIC8vIOWwhue6ueeQhuWKoOi9veWIsFdlYkdM57q555CG5Y2V5YWD5Lit44CCXG4gICAgICAgIGxldCB0ZXh0dXJlUGF0aCA9IHRoaXMuX21vZGVsU2V0dGluZy5nZXRUZXh0dXJlRmlsZU5hbWUoXG4gICAgICAgICAgbW9kZWxUZXh0dXJlTnVtYmVyXG4gICAgICAgICk7XG4gICAgICAgIHRleHR1cmVQYXRoID0gdGhpcy5fbW9kZWxIb21lRGlyICsgdGV4dHVyZVBhdGg7XG5cbiAgICAgICAgLy8g44Ot44O844OJ5a6M5LqG5pmC44Gr5ZG844Gz5Ye644GZ44Kz44O844Or44OQ44OD44Kv6Zai5pWwXG4gICAgICAgIC8vIOWKoOi9veWujOaIkOaXtuiwg+eUqOeahOWbnuiwg+WHveaVsFxuICAgICAgICBjb25zdCBvbkxvYWQgPSAodGV4dHVyZUluZm86IFRleHR1cmVJbmZvKTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy5nZXRSZW5kZXJlcigpLmJpbmRUZXh0dXJlKG1vZGVsVGV4dHVyZU51bWJlciwgdGV4dHVyZUluZm8uaWQpO1xuXG4gICAgICAgICAgdGhpcy5fdGV4dHVyZUNvdW50Kys7XG5cbiAgICAgICAgICBpZiAodGhpcy5fdGV4dHVyZUNvdW50ID49IHRleHR1cmVDb3VudCkge1xuICAgICAgICAgICAgLy8g5Yqg6L295a6M5oiQXG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IExvYWRTdGVwLkNvbXBsZXRlU2V0dXA7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIOiqreOBv+i+vOOBv1xuICAgICAgICBMQXBwRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKVxuICAgICAgICAgIC5nZXRUZXh0dXJlTWFuYWdlcigpXG4gICAgICAgICAgLmNyZWF0ZVRleHR1cmVGcm9tUG5nRmlsZSh0ZXh0dXJlUGF0aCwgdXNlUHJlbXVsdGlwbHksIG9uTG9hZCk7XG4gICAgICAgIHRoaXMuZ2V0UmVuZGVyZXIoKS5zZXRJc1ByZW11bHRpcGxpZWRBbHBoYSh1c2VQcmVtdWx0aXBseSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3N0YXRlID0gTG9hZFN0ZXAuV2FpdExvYWRUZXh0dXJlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDjg6zjg7Pjg4Djg6njgpLlho3mp4vnr4njgZnjgotcbiAgICog6YeN5bu65riy5p+T5ZmoXG4gICAqL1xuICBwdWJsaWMgcmVsb2FkUmVuZGVyZXIoKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGVSZW5kZXJlcigpO1xuICAgIHRoaXMuY3JlYXRlUmVuZGVyZXIoKTtcbiAgICB0aGlzLnNldHVwVGV4dHVyZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmm7TmlrBcbiAgICovXG4gIHB1YmxpYyB1cGRhdGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3N0YXRlICE9IExvYWRTdGVwLkNvbXBsZXRlU2V0dXApIHJldHVybjtcblxuICAgIGNvbnN0IGRlbHRhVGltZVNlY29uZHM6IG51bWJlciA9IExBcHBQYWwuZ2V0RGVsdGFUaW1lKCk7XG4gICAgdGhpcy5fdXNlclRpbWVTZWNvbmRzICs9IGRlbHRhVGltZVNlY29uZHM7XG5cbiAgICB0aGlzLl9kcmFnTWFuYWdlci51cGRhdGUoZGVsdGFUaW1lU2Vjb25kcyk7XG4gICAgdGhpcy5fZHJhZ1ggPSB0aGlzLl9kcmFnTWFuYWdlci5nZXRYKCk7XG4gICAgdGhpcy5fZHJhZ1kgPSB0aGlzLl9kcmFnTWFuYWdlci5nZXRZKCk7XG4gICAgLy8g44Oi44O844K344On44Oz44Gr44KI44KL44OR44Op44Oh44O844K/5pu05paw44Gu5pyJ54ShXG4gICAgLy8g5pyJ5peg5Z+65LqO6L+Q5Yqo55qE5Y+C5pWw5pu05pawXG4gICAgbGV0IG1vdGlvblVwZGF0ZWQgPSBmYWxzZTtcblxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICB0aGlzLl9tb2RlbC5sb2FkUGFyYW1ldGVycygpOyAvLyDliqDovb3kuIrmrKHkv53lrZjnmoTnirbmgIFcbiAgICBpZiAodGhpcy5fbW90aW9uTWFuYWdlci5pc0ZpbmlzaGVkKCkpIHtcbiAgICAgIC8vIOODouODvOOCt+ODp+ODs+OBruWGjeeUn+OBjOOBquOBhOWgtOWQiOOAgeW+heapn+ODouODvOOCt+ODp+ODs+OBruS4reOBi+OCieODqeODs+ODgOODoOOBp+WGjeeUn+OBmeOCi1xuICAgICAgLy8g5aaC5p6c5rKh5pyJ6KaB5pKt5pS+55qE5Yqo5L2c77yM5YiZ5LuO5b6F5py65Yqo5L2c5Lit6ZqP5py65pKt5pS+44CCXG4gICAgICB0aGlzLnN0YXJ0UmFuZG9tTW90aW9uKFxuICAgICAgICBMQXBwRGVmaW5lLk1vdGlvbkdyb3VwSWRsZSxcbiAgICAgICAgTEFwcERlZmluZS5Qcmlvcml0eUlkbGVcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vdGlvblVwZGF0ZWQgPSB0aGlzLl9tb3Rpb25NYW5hZ2VyLnVwZGF0ZU1vdGlvbihcbiAgICAgICAgdGhpcy5fbW9kZWwsXG4gICAgICAgIGRlbHRhVGltZVNlY29uZHNcbiAgICAgICk7IC8vIOODouODvOOCt+ODp+ODs+OCkuabtOaWsCDmm7TmlrDov5DliqhcbiAgICB9XG4gICAgdGhpcy5fbW9kZWwuc2F2ZVBhcmFtZXRlcnMoKTsgLy8g54q25oWL44KS5L+d5a2YIOS/neWtmOeKtuaAgeOAglxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIC8vIOOBvuOBsOOBn+OBjVxuICAgIGlmICghbW90aW9uVXBkYXRlZCkge1xuICAgICAgaWYgKHRoaXMuX2V5ZUJsaW5rICE9IG51bGwpIHtcbiAgICAgICAgLy8g44Oh44Kk44Oz44Oi44O844K344On44Oz44Gu5pu05paw44GM44Gq44GE44Go44GNXG4gICAgICAgIHRoaXMuX2V5ZUJsaW5rLnVwZGF0ZVBhcmFtZXRlcnModGhpcy5fbW9kZWwsIGRlbHRhVGltZVNlY29uZHMpOyAvLyDnm67jg5Hjg4FcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXhwcmVzc2lvbk1hbmFnZXIgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fZXhwcmVzc2lvbk1hbmFnZXIudXBkYXRlTW90aW9uKHRoaXMuX21vZGVsLCBkZWx0YVRpbWVTZWNvbmRzKTsgLy8g6KGo5oOF44Gn44OR44Op44Oh44O844K/5pu05paw77yI55u45a++5aSJ5YyW77yJXG4gICAgfVxuXG4gICAgLy8g44OJ44Op44OD44Kw44Gr44KI44KL5aSJ5YyWXG4gICAgLy8g44OJ44Op44OD44Kw44Gr44KI44KL6aGU44Gu5ZCR44GN44Gu6Kq/5pW0XG4gICAgdGhpcy5fbW9kZWwuYWRkUGFyYW1ldGVyVmFsdWVCeUlkKHRoaXMuX2lkUGFyYW1BbmdsZVgsIHRoaXMuX2RyYWdYICogMzApOyAvLyAtMzDjgYvjgokzMOOBruWApOOCkuWKoOOBiOOCi1xuICAgIHRoaXMuX21vZGVsLmFkZFBhcmFtZXRlclZhbHVlQnlJZCh0aGlzLl9pZFBhcmFtQW5nbGVZLCB0aGlzLl9kcmFnWSAqIDMwKTtcbiAgICB0aGlzLl9tb2RlbC5hZGRQYXJhbWV0ZXJWYWx1ZUJ5SWQoXG4gICAgICB0aGlzLl9pZFBhcmFtQW5nbGVaLFxuICAgICAgdGhpcy5fZHJhZ1ggKiB0aGlzLl9kcmFnWSAqIC0zMFxuICAgICk7XG5cbiAgICAvLyDjg4njg6njg4PjgrDjgavjgojjgovkvZPjga7lkJHjgY3jga7oqr/mlbRcbiAgICAvLyDpgJrov4fmi5bliqjosIPmlbTovabouqvmlrnlkJFcbiAgICB0aGlzLl9tb2RlbC5hZGRQYXJhbWV0ZXJWYWx1ZUJ5SWQoXG4gICAgICB0aGlzLl9pZFBhcmFtQm9keUFuZ2xlWCxcbiAgICAgIHRoaXMuX2RyYWdYICogMTBcbiAgICApOyAvLyAtMTDjgYvjgokxMOOBruWApOOCkuWKoOOBiOOCiyAvLyDliqDkuIDkuKotMTDnmoTlgLzliLAxMOOAglxuXG4gICAgLy8g44OJ44Op44OD44Kw44Gr44KI44KL55uu44Gu5ZCR44GN44Gu6Kq/5pW0XG4gICAgdGhpcy5fbW9kZWwuYWRkUGFyYW1ldGVyVmFsdWVCeUlkKHRoaXMuX2lkUGFyYW1FeWVCYWxsWCwgdGhpcy5fZHJhZ1gpOyAvLyAtMeOBi+OCiTHjga7lgKTjgpLliqDjgYjjgotcbiAgICB0aGlzLl9tb2RlbC5hZGRQYXJhbWV0ZXJWYWx1ZUJ5SWQodGhpcy5faWRQYXJhbUV5ZUJhbGxZLCB0aGlzLl9kcmFnWSk7XG5cbiAgICAvLyDlkbzlkLjjgarjgalcbiAgICBpZiAodGhpcy5fYnJlYXRoICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX2JyZWF0aC51cGRhdGVQYXJhbWV0ZXJzKHRoaXMuX21vZGVsLCBkZWx0YVRpbWVTZWNvbmRzKTtcbiAgICB9XG5cbiAgICAvLyDniannkIbmvJTnrpfjga7oqK3lrppcbiAgICBpZiAodGhpcy5fcGh5c2ljcyAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9waHlzaWNzLmV2YWx1YXRlKHRoaXMuX21vZGVsLCBkZWx0YVRpbWVTZWNvbmRzKTtcbiAgICB9XG5cbiAgICAvLyDllIfor63lkIzmraXorr7nva5cbiAgICBpZiAodGhpcy5fbGlwc3luYykge1xuICAgICAgY29uc3QgdmFsdWUgPSAwOyAvLyDlpoLmnpzkvaDmg7Pov5vooYzlrp7ml7bnmoTllIfor63lkIjmiJDvvIzku47ns7vnu5/kuK3ojrflj5bpn7Pph4/vvIzlubblnKgw5YiwMeeahOiMg+WbtOWGhei+k+WFpeS4gOS4quWAvOOAglxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xpcFN5bmNJZHMuZ2V0U2l6ZSgpOyArK2kpIHtcbiAgICAgICAgdGhpcy5fbW9kZWwuYWRkUGFyYW1ldGVyVmFsdWVCeUlkKHRoaXMuX2xpcFN5bmNJZHMuYXQoaSksIHZhbHVlLCAwLjgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOODneODvOOCuuOBruioreWumlxuICAgIC8vIOaaguWBnOiuvue9rlxuICAgIGlmICh0aGlzLl9wb3NlICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX3Bvc2UudXBkYXRlUGFyYW1ldGVycyh0aGlzLl9tb2RlbCwgZGVsdGFUaW1lU2Vjb25kcyk7XG4gICAgfVxuXG4gICAgdGhpcy5fbW9kZWwudXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICog5byV5pWw44Gn5oyH5a6a44GX44Gf44Oi44O844K344On44Oz44Gu5YaN55Sf44KS6ZaL5aeL44GZ44KLXG4gICAqIOW8gOWni+aSreaUvueUseWPguaVsOaMh+WumueahOi/kOWKqFxuICAgKiBAcGFyYW0gZ3JvdXAg44Oi44O844K344On44Oz44Kw44Or44O844OX5ZCNXG4gICAqIEBwYXJhbSBubyDjgrDjg6vjg7zjg5flhoXjga7nlarlj7dcbiAgICogQHBhcmFtIHByaW9yaXR5IOWEquWFiOW6plxuICAgKiBAcGFyYW0gb25GaW5pc2hlZE1vdGlvbkhhbmRsZXIg44Oi44O844K344On44Oz5YaN55Sf57WC5LqG5pmC44Gr5ZG844Gz5Ye644GV44KM44KL44Kz44O844Or44OQ44OD44Kv6Zai5pWwXG4gICAqIEByZXR1cm4g6ZaL5aeL44GX44Gf44Oi44O844K344On44Oz44Gu6K2Y5Yil55Wq5Y+344KS6L+U44GZ44CC5YCL5Yil44Gu44Oi44O844K344On44Oz44GM57WC5LqG44GX44Gf44GL5ZCm44GL44KS5Yik5a6a44GZ44KLaXNGaW5pc2hlZCgp44Gu5byV5pWw44Gn5L2/55So44GZ44KL44CC6ZaL5aeL44Gn44GN44Gq44GE5pmC44GvWy0xXVxuICAgKi9cbiAgcHVibGljIHN0YXJ0TW90aW9uKFxuICAgIGdyb3VwOiBzdHJpbmcsXG4gICAgbm86IG51bWJlcixcbiAgICBwcmlvcml0eTogbnVtYmVyLFxuICAgIG9uRmluaXNoZWRNb3Rpb25IYW5kbGVyPzogRmluaXNoZWRNb3Rpb25DYWxsYmFja1xuICApOiBDdWJpc21Nb3Rpb25RdWV1ZUVudHJ5SGFuZGxlIHtcbiAgICBpZiAocHJpb3JpdHkgPT0gTEFwcERlZmluZS5Qcmlvcml0eUZvcmNlKSB7XG4gICAgICB0aGlzLl9tb3Rpb25NYW5hZ2VyLnNldFJlc2VydmVQcmlvcml0eShwcmlvcml0eSk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5fbW90aW9uTWFuYWdlci5yZXNlcnZlTW90aW9uKHByaW9yaXR5KSkge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnTW9kZSkge1xuICAgICAgICBMQXBwUGFsLnByaW50TWVzc2FnZShcIltBUFBdY2FuJ3Qgc3RhcnQgbW90aW9uLlwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBJbnZhbGlkTW90aW9uUXVldWVFbnRyeUhhbmRsZVZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1vdGlvbkZpbGVOYW1lID0gdGhpcy5fbW9kZWxTZXR0aW5nLmdldE1vdGlvbkZpbGVOYW1lKGdyb3VwLCBubyk7XG5cbiAgICAvLyBleCkgaWRsZV8wXG4gICAgY29uc3QgbmFtZSA9IGAke2dyb3VwfV8ke25vfWA7XG4gICAgbGV0IG1vdGlvbjogQ3ViaXNtTW90aW9uID0gdGhpcy5fbW90aW9ucy5nZXRWYWx1ZShuYW1lKSBhcyBDdWJpc21Nb3Rpb247XG4gICAgbGV0IGF1dG9EZWxldGUgPSBmYWxzZTtcblxuICAgIGlmIChtb3Rpb24gPT0gbnVsbCkge1xuICAgICAgZmV0Y2goYCR7dGhpcy5fbW9kZWxIb21lRGlyfS8ke21vdGlvbkZpbGVOYW1lfWApXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpXG4gICAgICAgIC50aGVuKGFycmF5QnVmZmVyID0+IHtcbiAgICAgICAgICBtb3Rpb24gPSB0aGlzLmxvYWRNb3Rpb24oXG4gICAgICAgICAgICBhcnJheUJ1ZmZlcixcbiAgICAgICAgICAgIGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgb25GaW5pc2hlZE1vdGlvbkhhbmRsZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGxldCBmYWRlVGltZTogbnVtYmVyID0gdGhpcy5fbW9kZWxTZXR0aW5nLmdldE1vdGlvbkZhZGVJblRpbWVWYWx1ZShcbiAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgICAgbm9cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGZhZGVUaW1lID49IDAuMCkge1xuICAgICAgICAgICAgbW90aW9uLnNldEZhZGVJblRpbWUoZmFkZVRpbWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZhZGVUaW1lID0gdGhpcy5fbW9kZWxTZXR0aW5nLmdldE1vdGlvbkZhZGVPdXRUaW1lVmFsdWUoZ3JvdXAsIG5vKTtcbiAgICAgICAgICBpZiAoZmFkZVRpbWUgPj0gMC4wKSB7XG4gICAgICAgICAgICBtb3Rpb24uc2V0RmFkZU91dFRpbWUoZmFkZVRpbWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1vdGlvbi5zZXRFZmZlY3RJZHModGhpcy5fZXllQmxpbmtJZHMsIHRoaXMuX2xpcFN5bmNJZHMpO1xuICAgICAgICAgIGF1dG9EZWxldGUgPSB0cnVlOyAvLyDntYLkuobmmYLjgavjg6Hjg6Ljg6rjgYvjgonliYrpmaRcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vdGlvbi5zZXRGaW5pc2hlZE1vdGlvbkhhbmRsZXIob25GaW5pc2hlZE1vdGlvbkhhbmRsZXIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUpIHtcbiAgICAgIExBcHBQYWwucHJpbnRNZXNzYWdlKGBbQVBQXXN0YXJ0IG1vdGlvbjogWyR7Z3JvdXB9XyR7bm99YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9tb3Rpb25NYW5hZ2VyLnN0YXJ0TW90aW9uUHJpb3JpdHkoXG4gICAgICBtb3Rpb24sXG4gICAgICBhdXRvRGVsZXRlLFxuICAgICAgcHJpb3JpdHlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOODqeODs+ODgOODoOOBq+mBuOOBsOOCjOOBn+ODouODvOOCt+ODp+ODs+OBruWGjeeUn+OCkumWi+Wni+OBmeOCi+OAglxuICAgKiDlvIDlp4vmkq3mlL7pmo/mnLrpgInmi6nnmoTliqjkvZzjgIJcbiAgICogQHBhcmFtIGdyb3VwIOODouODvOOCt+ODp+ODs+OCsOODq+ODvOODl+WQjVxuICAgKiBAcGFyYW0gcHJpb3JpdHkg5YSq5YWI5bqmXG4gICAqIEBwYXJhbSBvbkZpbmlzaGVkTW90aW9uSGFuZGxlciDlnKjov5Dliqjlm57mlL7nu5PmnZ/ml7bosIPnlKjnmoTlm57osIPlip/og73jgIJcbiAgICogQHJldHVybiDplovlp4vjgZfjgZ/jg6Ljg7zjgrfjg6fjg7Pjga7orZjliKXnlarlj7fjgpLov5TjgZnjgILlgIvliKXjga7jg6Ljg7zjgrfjg6fjg7PjgYzntYLkuobjgZfjgZ/jgYvlkKbjgYvjgpLliKTlrprjgZnjgotpc0ZpbmlzaGVkKCnjga7lvJXmlbDjgafkvb/nlKjjgZnjgovjgILplovlp4vjgafjgY3jgarjgYTmmYLjga9bLTFdXG4gICAqIEByZXR1cm4g6L+U5Zue5byA5aeL55qE6L+Q5Yqo55qE6K+G5Yir5Y+344CCIOWcqGlzRmluaXNoZWQoKeeahOWPguaVsOS4reS9v+eUqO+8jOeUqOS6juWIpOaWreafkOmhuei/kOWKqOaYr+WQpuW3sue7j+e7k+adn+OAgiDlpoLmnpzkuI3og73lkK/liqjvvIxbLTFd44CCXG4gICAqL1xuICBwdWJsaWMgc3RhcnRSYW5kb21Nb3Rpb24oXG4gICAgZ3JvdXA6IHN0cmluZyxcbiAgICBwcmlvcml0eTogbnVtYmVyLFxuICAgIG9uRmluaXNoZWRNb3Rpb25IYW5kbGVyPzogRmluaXNoZWRNb3Rpb25DYWxsYmFja1xuICApOiBDdWJpc21Nb3Rpb25RdWV1ZUVudHJ5SGFuZGxlIHtcbiAgICBpZiAodGhpcy5fbW9kZWxTZXR0aW5nLmdldE1vdGlvbkNvdW50KGdyb3VwKSA9PSAwKSB7XG4gICAgICByZXR1cm4gSW52YWxpZE1vdGlvblF1ZXVlRW50cnlIYW5kbGVWYWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBubzogbnVtYmVyID0gTWF0aC5mbG9vcihcbiAgICAgIE1hdGgucmFuZG9tKCkgKiB0aGlzLl9tb2RlbFNldHRpbmcuZ2V0TW90aW9uQ291bnQoZ3JvdXApXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLnN0YXJ0TW90aW9uKGdyb3VwLCBubywgcHJpb3JpdHksIG9uRmluaXNoZWRNb3Rpb25IYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlvJXmlbDjgafmjIflrprjgZfjgZ/ooajmg4Xjg6Ljg7zjgrfjg6fjg7PjgpLjgrvjg4Pjg4jjgZnjgotcbiAgICog6K6+572u5Y+C5pWw5oyH5a6a55qE6KGo6L6+5byP6L+Q5YqoXG4gICAqXG4gICAqIEBwYXJhbSBleHByZXNzaW9uSWQg6KGo5oOF44Oi44O844K344On44Oz44GuSURcbiAgICovXG4gIHB1YmxpYyBzZXRFeHByZXNzaW9uKGV4cHJlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbW90aW9uOiBBQ3ViaXNtTW90aW9uID0gdGhpcy5fZXhwcmVzc2lvbnMuZ2V0VmFsdWUoZXhwcmVzc2lvbklkKTtcblxuICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUpIHtcbiAgICAgIExBcHBQYWwucHJpbnRNZXNzYWdlKGBbQVBQXWV4cHJlc3Npb246IFske2V4cHJlc3Npb25JZH1dYCk7XG4gICAgfVxuXG4gICAgaWYgKG1vdGlvbiAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9leHByZXNzaW9uTWFuYWdlci5zdGFydE1vdGlvblByaW9yaXR5KFxuICAgICAgICBtb3Rpb24sXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBMQXBwRGVmaW5lLlByaW9yaXR5Rm9yY2VcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUpIHtcbiAgICAgICAgTEFwcFBhbC5wcmludE1lc3NhZ2UoYFtBUFBdZXhwcmVzc2lvblske2V4cHJlc3Npb25JZH1dIGlzIG51bGxgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog44Op44Oz44OA44Og44Gr6YG444Gw44KM44Gf6KGo5oOF44Oi44O844K344On44Oz44KS44K744OD44OI44GZ44KLXG4gICAqIOiuvue9ruS4gOS4qumaj+acuumAieaLqeeahOihqOaDheWKqOS9nFxuICAgKi9cbiAgcHVibGljIHNldFJhbmRvbUV4cHJlc3Npb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2V4cHJlc3Npb25zLmdldFNpemUoKSA9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm86IG51bWJlciA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuX2V4cHJlc3Npb25zLmdldFNpemUoKSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2V4cHJlc3Npb25zLmdldFNpemUoKTsgaSsrKSB7XG4gICAgICBpZiAoaSA9PSBubykge1xuICAgICAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSB0aGlzLl9leHByZXNzaW9ucy5fa2V5VmFsdWVzW2ldLmZpcnN0O1xuICAgICAgICB0aGlzLnNldEV4cHJlc3Npb24obmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog44Kk44OZ44Oz44OI44Gu55m654Gr44KS5Y+X44GR5Y+W44KLXG4gICAqL1xuICBwdWJsaWMgbW90aW9uRXZlbnRGaXJlZChldmVudFZhbHVlOiBjc21TdHJpbmcpOiB2b2lkIHtcbiAgICBDdWJpc21Mb2dJbmZvKCd7MH0gaXMgZmlyZWQgb24gTEFwcE1vZGVsISEnLCBldmVudFZhbHVlLnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOW9k+OBn+OCiuWIpOWumuODhuOCueODiFxuICAgKiDmjIflrprvvKnvvKTjga7poILngrnjg6rjgrnjg4jjgYvjgonnn6nlvaLjgpLoqIjnrpfjgZfjgIHluqfmqJnjgpLjgYznn6nlvaLnr4Tlm7LlhoXjgYvliKTlrprjgZnjgovjgIJcbiAgICpcbiAgICogQHBhcmFtIGhpdEFyZW5hTmFtZSAg5b2T44Gf44KK5Yik5a6a44KS44OG44K544OI44GZ44KL5a++6LGh44GuSURcbiAgICogQHBhcmFtIHggICAgICAgICAgICAg5Yik5a6a44KS6KGM44GGWOW6p+aomVxuICAgKiBAcGFyYW0geSAgICAgICAgICAgICDliKTlrprjgpLooYzjgYZZ5bqn5qiZXG4gICAqL1xuICBwdWJsaWMgaGl0VGVzdChoaXRBcmVuYU5hbWU6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyDpgI/mmI7mmYLjga/lvZPjgZ/jgorliKTlrprnhKHjgZfjgIJcbiAgICBpZiAodGhpcy5fb3BhY2l0eSA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudDogbnVtYmVyID0gdGhpcy5fbW9kZWxTZXR0aW5nLmdldEhpdEFyZWFzQ291bnQoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX21vZGVsU2V0dGluZy5nZXRIaXRBcmVhTmFtZShpKSA9PSBoaXRBcmVuYU5hbWUpIHtcbiAgICAgICAgY29uc3QgZHJhd0lkOiBDdWJpc21JZEhhbmRsZSA9IHRoaXMuX21vZGVsU2V0dGluZy5nZXRIaXRBcmVhSWQoaSk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSGl0KGRyYXdJZCwgeCwgeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIOODouODvOOCt+ODp+ODs+ODh+ODvOOCv+OCkuOCsOODq+ODvOODl+WQjeOBi+OCieS4gOaLrOOBp+ODreODvOODieOBmeOCi+OAglxuICAgKiDku47nu4TlkI3kuK3mibnph4/liqDovb3ov5DliqjmlbDmja7jgIJcbiAgICog44Oi44O844K344On44Oz44OH44O844K/44Gu5ZCN5YmN44Gv5YaF6YOo44GnTW9kZWxTZXR0aW5n44GL44KJ5Y+W5b6X44GZ44KL44CCXG4gICAqXG4gICAqIEBwYXJhbSBncm91cCDjg6Ljg7zjgrfjg6fjg7Pjg4fjg7zjgr/jga7jgrDjg6vjg7zjg5flkI0g6L+Q5Yqo5pWw5o2u57uE5ZCN56ewXG4gICAqL1xuICBwdWJsaWMgcHJlTG9hZE1vdGlvbkdyb3VwKGdyb3VwOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX21vZGVsU2V0dGluZy5nZXRNb3Rpb25Db3VudChncm91cCk7IGkrKykge1xuICAgICAgY29uc3QgbW90aW9uRmlsZU5hbWUgPSB0aGlzLl9tb2RlbFNldHRpbmcuZ2V0TW90aW9uRmlsZU5hbWUoZ3JvdXAsIGkpO1xuXG4gICAgICAvLyBleCkgaWRsZV8wXG4gICAgICBjb25zdCBuYW1lID0gYCR7Z3JvdXB9XyR7aX1gO1xuICAgICAgaWYgKHRoaXMuX2RlYnVnTW9kZSkge1xuICAgICAgICBMQXBwUGFsLnByaW50TWVzc2FnZShcbiAgICAgICAgICBgW0FQUF1sb2FkIG1vdGlvbjogJHttb3Rpb25GaWxlTmFtZX0gPT4gWyR7bmFtZX1dYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmZXRjaChgJHt0aGlzLl9tb2RlbEhvbWVEaXJ9LyR7bW90aW9uRmlsZU5hbWV9YClcbiAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSlcbiAgICAgICAgLnRoZW4oYXJyYXlCdWZmZXIgPT4ge1xuICAgICAgICAgIGNvbnN0IHRtcE1vdGlvbjogQ3ViaXNtTW90aW9uID0gdGhpcy5sb2FkTW90aW9uKFxuICAgICAgICAgICAgYXJyYXlCdWZmZXIsXG4gICAgICAgICAgICBhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsZXQgZmFkZVRpbWUgPSB0aGlzLl9tb2RlbFNldHRpbmcuZ2V0TW90aW9uRmFkZUluVGltZVZhbHVlKGdyb3VwLCBpKTtcbiAgICAgICAgICBpZiAoZmFkZVRpbWUgPj0gMC4wKSB7XG4gICAgICAgICAgICB0bXBNb3Rpb24uc2V0RmFkZUluVGltZShmYWRlVGltZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmFkZVRpbWUgPSB0aGlzLl9tb2RlbFNldHRpbmcuZ2V0TW90aW9uRmFkZU91dFRpbWVWYWx1ZShncm91cCwgaSk7XG4gICAgICAgICAgaWYgKGZhZGVUaW1lID49IDAuMCkge1xuICAgICAgICAgICAgdG1wTW90aW9uLnNldEZhZGVPdXRUaW1lKGZhZGVUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdG1wTW90aW9uLnNldEVmZmVjdElkcyh0aGlzLl9leWVCbGlua0lkcywgdGhpcy5fbGlwU3luY0lkcyk7XG5cbiAgICAgICAgICBpZiAodGhpcy5fbW90aW9ucy5nZXRWYWx1ZShuYW1lKSAhPSBudWxsKSB7XG4gICAgICAgICAgICBBQ3ViaXNtTW90aW9uLmRlbGV0ZSh0aGlzLl9tb3Rpb25zLmdldFZhbHVlKG5hbWUpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9tb3Rpb25zLnNldFZhbHVlKG5hbWUsIHRtcE1vdGlvbik7XG5cbiAgICAgICAgICB0aGlzLl9tb3Rpb25Db3VudCsrO1xuICAgICAgICAgIGlmICh0aGlzLl9tb3Rpb25Db3VudCA+PSB0aGlzLl9hbGxNb3Rpb25Db3VudCkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBMb2FkU3RlcC5Mb2FkVGV4dHVyZTtcblxuICAgICAgICAgICAgLy8g5YWo44Gm44Gu44Oi44O844K344On44Oz44KS5YGc5q2i44GZ44KLXG4gICAgICAgICAgICB0aGlzLl9tb3Rpb25NYW5hZ2VyLnN0b3BBbGxNb3Rpb25zKCk7XG5cbiAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUmVuZGVyZXIoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBUZXh0dXJlcygpO1xuICAgICAgICAgICAgdGhpcy5nZXRSZW5kZXJlcigpLnN0YXJ0VXAoZ2wpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOOBmeOBueOBpuOBruODouODvOOCt+ODp+ODs+ODh+ODvOOCv+OCkuino+aUvuOBmeOCi+OAglxuICAgKi9cbiAgcHVibGljIHJlbGVhc2VNb3Rpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuX21vdGlvbnMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlhajjgabjga7ooajmg4Xjg4fjg7zjgr/jgpLop6PmlL7jgZnjgovjgIJcbiAgICovXG4gIHB1YmxpYyByZWxlYXNlRXhwcmVzc2lvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fZXhwcmVzc2lvbnMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6Ljg4fjg6vjgpLmj4/nlLvjgZnjgovlh6bnkIbjgILjg6Ljg4fjg6vjgpLmj4/nlLvjgZnjgovnqbrplpPjga5WaWV3LVByb2plY3Rpb27ooYzliJfjgpLmuKHjgZnjgIJcbiAgICovXG4gIHB1YmxpYyBkb0RyYXcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX21vZGVsID09IG51bGwpIHJldHVybjtcblxuICAgIC8vIOOCreODo+ODs+ODkOOCueOCteOCpOOCuuOCkua4oeOBmVxuICAgIGNvbnN0IHZpZXdwb3J0OiBudW1iZXJbXSA9IFswLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHRdO1xuXG4gICAgdGhpcy5nZXRSZW5kZXJlcigpLnNldFJlbmRlclN0YXRlKGZyYW1lQnVmZmVyLCB2aWV3cG9ydCk7XG4gICAgdGhpcy5nZXRSZW5kZXJlcigpLmRyYXdNb2RlbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOODouODh+ODq+OCkuaPj+eUu+OBmeOCi+WHpueQhuOAguODouODh+ODq+OCkuaPj+eUu+OBmeOCi+epuumWk+OBrlZpZXctUHJvamVjdGlvbuihjOWIl+OCkua4oeOBmeOAglxuICAgKi9cbiAgcHVibGljIGRyYXcobWF0cml4OiBDdWJpc21NYXRyaXg0NCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9tb2RlbCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g5ZCE6Kqt44G/6L6844G/57WC5LqG5b6MXG4gICAgaWYgKHRoaXMuX3N0YXRlID09IExvYWRTdGVwLkNvbXBsZXRlU2V0dXApIHtcbiAgICAgIG1hdHJpeC5tdWx0aXBseUJ5TWF0cml4KHRoaXMuX21vZGVsTWF0cml4KTtcblxuICAgICAgdGhpcy5nZXRSZW5kZXJlcigpLnNldE12cE1hdHJpeChtYXRyaXgpO1xuXG4gICAgICB0aGlzLmRvRHJhdygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fbW9kZWxTZXR0aW5nID0gbnVsbDtcbiAgICB0aGlzLl9tb2RlbEhvbWVEaXIgPSBudWxsO1xuICAgIHRoaXMuX3VzZXJUaW1lU2Vjb25kcyA9IDAuMDtcblxuICAgIHRoaXMuX2V5ZUJsaW5rSWRzID0gbmV3IGNzbVZlY3RvcjxDdWJpc21JZEhhbmRsZT4oKTtcbiAgICB0aGlzLl9saXBTeW5jSWRzID0gbmV3IGNzbVZlY3RvcjxDdWJpc21JZEhhbmRsZT4oKTtcblxuICAgIHRoaXMuX21vdGlvbnMgPSBuZXcgY3NtTWFwPHN0cmluZywgQUN1YmlzbU1vdGlvbj4oKTtcbiAgICB0aGlzLl9leHByZXNzaW9ucyA9IG5ldyBjc21NYXA8c3RyaW5nLCBBQ3ViaXNtTW90aW9uPigpO1xuXG4gICAgdGhpcy5faGl0QXJlYSA9IG5ldyBjc21WZWN0b3I8Y3NtUmVjdD4oKTtcbiAgICB0aGlzLl91c2VyQXJlYSA9IG5ldyBjc21WZWN0b3I8Y3NtUmVjdD4oKTtcblxuICAgIHRoaXMuX2lkUGFyYW1BbmdsZVggPSBDdWJpc21GcmFtZXdvcmsuZ2V0SWRNYW5hZ2VyKCkuZ2V0SWQoXG4gICAgICBDdWJpc21EZWZhdWx0UGFyYW1ldGVySWQuUGFyYW1BbmdsZVhcbiAgICApO1xuICAgIHRoaXMuX2lkUGFyYW1BbmdsZVkgPSBDdWJpc21GcmFtZXdvcmsuZ2V0SWRNYW5hZ2VyKCkuZ2V0SWQoXG4gICAgICBDdWJpc21EZWZhdWx0UGFyYW1ldGVySWQuUGFyYW1BbmdsZVlcbiAgICApO1xuICAgIHRoaXMuX2lkUGFyYW1BbmdsZVogPSBDdWJpc21GcmFtZXdvcmsuZ2V0SWRNYW5hZ2VyKCkuZ2V0SWQoXG4gICAgICBDdWJpc21EZWZhdWx0UGFyYW1ldGVySWQuUGFyYW1BbmdsZVpcbiAgICApO1xuICAgIHRoaXMuX2lkUGFyYW1FeWVCYWxsWCA9IEN1YmlzbUZyYW1ld29yay5nZXRJZE1hbmFnZXIoKS5nZXRJZChcbiAgICAgIEN1YmlzbURlZmF1bHRQYXJhbWV0ZXJJZC5QYXJhbUV5ZUJhbGxYXG4gICAgKTtcbiAgICB0aGlzLl9pZFBhcmFtRXllQmFsbFkgPSBDdWJpc21GcmFtZXdvcmsuZ2V0SWRNYW5hZ2VyKCkuZ2V0SWQoXG4gICAgICBDdWJpc21EZWZhdWx0UGFyYW1ldGVySWQuUGFyYW1FeWVCYWxsWVxuICAgICk7XG4gICAgdGhpcy5faWRQYXJhbUJvZHlBbmdsZVggPSBDdWJpc21GcmFtZXdvcmsuZ2V0SWRNYW5hZ2VyKCkuZ2V0SWQoXG4gICAgICBDdWJpc21EZWZhdWx0UGFyYW1ldGVySWQuUGFyYW1Cb2R5QW5nbGVYXG4gICAgKTtcblxuICAgIHRoaXMuX3N0YXRlID0gTG9hZFN0ZXAuTG9hZEFzc2V0cztcbiAgICB0aGlzLl9leHByZXNzaW9uQ291bnQgPSAwO1xuICAgIHRoaXMuX3RleHR1cmVDb3VudCA9IDA7XG4gICAgdGhpcy5fbW90aW9uQ291bnQgPSAwO1xuICAgIHRoaXMuX2FsbE1vdGlvbkNvdW50ID0gMDtcbiAgfVxuXG4gIF9tb2RlbFNldHRpbmc6IElDdWJpc21Nb2RlbFNldHRpbmc7IC8vIOODouODh+ODq+OCu+ODg+ODhuOCo+ODs+OCsOaDheWgsVxuICBfbW9kZWxIb21lRGlyOiBzdHJpbmc7IC8vIOODouODh+ODq+OCu+ODg+ODhuOCo+ODs+OCsOOBjOe9ruOBi+OCjOOBn+ODh+OCo+ODrOOCr+ODiOODqlxuICBfdXNlclRpbWVTZWNvbmRzOiBudW1iZXI7IC8vIOODh+ODq+OCv+aZgumWk+OBruepjeeul+WApFvnp5JdXG5cbiAgX2V5ZUJsaW5rSWRzOiBjc21WZWN0b3I8Q3ViaXNtSWRIYW5kbGU+OyAvLyDjg6Ljg4fjg6vjgavoqK3lrprjgZXjgozjgZ/nnqzjgY3mqZ/og73nlKjjg5Hjg6njg6Hjg7zjgr9JRFxuICBfbGlwU3luY0lkczogY3NtVmVjdG9yPEN1YmlzbUlkSGFuZGxlPjsgLy8g44Oi44OH44Or44Gr6Kit5a6a44GV44KM44Gf44Oq44OD44OX44K344Oz44Kv5qmf6IO955So44OR44Op44Oh44O844K/SURcblxuICBfbW90aW9uczogY3NtTWFwPHN0cmluZywgQUN1YmlzbU1vdGlvbj47IC8vIOiqreOBv+i+vOOBvuOCjOOBpuOBhOOCi+ODouODvOOCt+ODp+ODs+OBruODquOCueODiFxuICBfZXhwcmVzc2lvbnM6IGNzbU1hcDxzdHJpbmcsIEFDdWJpc21Nb3Rpb24+OyAvLyDoqq3jgb/ovrzjgb7jgozjgabjgYTjgovooajmg4Xjga7jg6rjgrnjg4hcblxuICBfaGl0QXJlYTogY3NtVmVjdG9yPGNzbVJlY3Q+O1xuICBfdXNlckFyZWE6IGNzbVZlY3Rvcjxjc21SZWN0PjtcblxuICBfaWRQYXJhbUFuZ2xlWDogQ3ViaXNtSWRIYW5kbGU7IC8vIOODkeODqeODoeODvOOCv0lEOiBQYXJhbUFuZ2xlWFxuICBfaWRQYXJhbUFuZ2xlWTogQ3ViaXNtSWRIYW5kbGU7IC8vIOODkeODqeODoeODvOOCv0lEOiBQYXJhbUFuZ2xlWVxuICBfaWRQYXJhbUFuZ2xlWjogQ3ViaXNtSWRIYW5kbGU7IC8vIOODkeODqeODoeODvOOCv0lEOiBQYXJhbUFuZ2xlWlxuICBfaWRQYXJhbUV5ZUJhbGxYOiBDdWJpc21JZEhhbmRsZTsgLy8g44OR44Op44Oh44O844K/SUQ6IFBhcmFtRXllQmFsbFhcbiAgX2lkUGFyYW1FeWVCYWxsWTogQ3ViaXNtSWRIYW5kbGU7IC8vIOODkeODqeODoeODvOOCv0lEOiBQYXJhbUV5ZUJBbGxZXG4gIF9pZFBhcmFtQm9keUFuZ2xlWDogQ3ViaXNtSWRIYW5kbGU7IC8vIOODkeODqeODoeODvOOCv0lEOiBQYXJhbUJvZHlBbmdsZVhcblxuICBfc3RhdGU6IG51bWJlcjsgLy8g54++5Zyo44Gu44K544OG44O844K/44K5566h55CG55SoXG4gIF9leHByZXNzaW9uQ291bnQ6IG51bWJlcjsgLy8g6KGo5oOF44OH44O844K/44Kr44Km44Oz44OIXG4gIF90ZXh0dXJlQ291bnQ6IG51bWJlcjsgLy8g44OG44Kv44K544OB44Oj44Kr44Km44Oz44OIXG4gIF9tb3Rpb25Db3VudDogbnVtYmVyOyAvLyDjg6Ljg7zjgrfjg6fjg7Pjg4fjg7zjgr/jgqvjgqbjg7Pjg4hcbiAgX2FsbE1vdGlvbkNvdW50OiBudW1iZXI7IC8vIOODouODvOOCt+ODp+ODs+e3j+aVsFxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWZyYW1ld29yayB9IGZyb20gJy4uL2xpdmUyZGN1YmlzbWZyYW1ld29yayc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtbW90aW9ubWFuYWdlciB9IGZyb20gJy4uL21vdGlvbi9jdWJpc21tb3Rpb25tYW5hZ2VyJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc210YXJnZXRwb2ludCB9IGZyb20gJy4uL21hdGgvY3ViaXNtdGFyZ2V0cG9pbnQnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vZGVsbWF0cml4IH0gZnJvbSAnLi4vbWF0aC9jdWJpc21tb2RlbG1hdHJpeCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtbW9jIH0gZnJvbSAnLi9jdWJpc21tb2MnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vZGVsIH0gZnJvbSAnLi9jdWJpc21tb2RlbCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgYWN1YmlzbW1vdGlvbiB9IGZyb20gJy4uL21vdGlvbi9hY3ViaXNtbW90aW9uJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21tb3Rpb24gfSBmcm9tICcuLi9tb3Rpb24vY3ViaXNtbW90aW9uJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21leHByZXNzaW9ubW90aW9uIH0gZnJvbSAnLi4vbW90aW9uL2N1YmlzbWV4cHJlc3Npb25tb3Rpb24nO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbXBvc2UgfSBmcm9tICcuLi9lZmZlY3QvY3ViaXNtcG9zZSc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtbW9kZWx1c2VyZGF0YSB9IGZyb20gJy4vY3ViaXNtbW9kZWx1c2VyZGF0YSc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtcGh5c2ljcyB9IGZyb20gJy4uL3BoeXNpY3MvY3ViaXNtcGh5c2ljcyc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtaWQgfSBmcm9tICcuLi9pZC9jdWJpc21pZCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3Ntc3RyaW5nIH0gZnJvbSAnLi4vdHlwZS9jc21zdHJpbmcnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vdGlvbnF1ZXVlbWFuYWdlciB9IGZyb20gJy4uL21vdGlvbi9jdWJpc21tb3Rpb25xdWV1ZW1hbmFnZXInO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWJyZWF0aCB9IGZyb20gJy4uL2VmZmVjdC9jdWJpc21icmVhdGgnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWV5ZWJsaW5rIH0gZnJvbSAnLi4vZWZmZWN0L2N1YmlzbWV5ZWJsaW5rJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21yZW5kZXJlcl93ZWJnbCB9IGZyb20gJy4uL3JlbmRlcmluZy9jdWJpc21yZW5kZXJlcl93ZWJnbCc7XG5pbXBvcnQgeyBDdWJpc21Mb2dFcnJvciwgQ3ViaXNtTG9nSW5mbyB9IGZyb20gJy4uL3V0aWxzL2N1YmlzbWRlYnVnJztcbmltcG9ydCBDdWJpc21SZW5kZXJlcl9XZWJHTCA9IGN1YmlzbXJlbmRlcmVyX3dlYmdsLkN1YmlzbVJlbmRlcmVyX1dlYkdMO1xuaW1wb3J0IEN1YmlzbUV5ZUJsaW5rID0gY3ViaXNtZXllYmxpbmsuQ3ViaXNtRXllQmxpbms7XG5pbXBvcnQgQ3ViaXNtQnJlYXRoID0gY3ViaXNtYnJlYXRoLkN1YmlzbUJyZWF0aDtcbmltcG9ydCBDdWJpc21Nb3Rpb25RdWV1ZU1hbmFnZXIgPSBjdWJpc21tb3Rpb25xdWV1ZW1hbmFnZXIuQ3ViaXNtTW90aW9uUXVldWVNYW5hZ2VyO1xuaW1wb3J0IGNzbVN0cmluZyA9IGNzbXN0cmluZy5jc21TdHJpbmc7XG5pbXBvcnQgQ29uc3RhbnQgPSBjdWJpc21mcmFtZXdvcmsuQ29uc3RhbnQ7XG5pbXBvcnQgQ3ViaXNtSWRIYW5kbGUgPSBjdWJpc21pZC5DdWJpc21JZEhhbmRsZTtcbmltcG9ydCBDdWJpc21QaHlzaWNzID0gY3ViaXNtcGh5c2ljcy5DdWJpc21QaHlzaWNzO1xuaW1wb3J0IEN1YmlzbU1vZGVsVXNlckRhdGEgPSBjdWJpc21tb2RlbHVzZXJkYXRhLkN1YmlzbU1vZGVsVXNlckRhdGE7XG5pbXBvcnQgQ3ViaXNtUG9zZSA9IGN1YmlzbXBvc2UuQ3ViaXNtUG9zZTtcbmltcG9ydCBDdWJpc21FeHByZXNzaW9uTW90aW9uID0gY3ViaXNtZXhwcmVzc2lvbm1vdGlvbi5DdWJpc21FeHByZXNzaW9uTW90aW9uO1xuaW1wb3J0IEN1YmlzbU1vdGlvbiA9IGN1YmlzbW1vdGlvbi5DdWJpc21Nb3Rpb247XG5pbXBvcnQgQUN1YmlzbU1vdGlvbiA9IGFjdWJpc21tb3Rpb24uQUN1YmlzbU1vdGlvbjtcbmltcG9ydCBGaW5pc2hlZE1vdGlvbkNhbGxiYWNrID0gYWN1YmlzbW1vdGlvbi5GaW5pc2hlZE1vdGlvbkNhbGxiYWNrO1xuaW1wb3J0IEN1YmlzbU1vZGVsID0gY3ViaXNtbW9kZWwuQ3ViaXNtTW9kZWw7XG5pbXBvcnQgQ3ViaXNtTW9jID0gY3ViaXNtbW9jLkN1YmlzbU1vYztcbmltcG9ydCBDdWJpc21Nb2RlbE1hdHJpeCA9IGN1YmlzbW1vZGVsbWF0cml4LkN1YmlzbU1vZGVsTWF0cml4O1xuaW1wb3J0IEN1YmlzbVRhcmdldFBvaW50ID0gY3ViaXNtdGFyZ2V0cG9pbnQuQ3ViaXNtVGFyZ2V0UG9pbnQ7XG5pbXBvcnQgQ3ViaXNtTW90aW9uTWFuYWdlciA9IGN1YmlzbW1vdGlvbm1hbmFnZXIuQ3ViaXNtTW90aW9uTWFuYWdlcjtcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvKipcbiAgICog44Om44O844K244O844GM5a6f6Zqb44Gr5L2/55So44GZ44KL44Oi44OH44OrXG4gICAqIOeUqOaIt+WunumZheS9v+eUqOeahOaooeWei1xuICAgKiDjg6bjg7zjgrbjg7zjgYzlrp/pmpvjgavkvb/nlKjjgZnjgovjg6Ljg4fjg6vjga7ln7rlupXjgq/jg6njgrnjgILjgZPjgozjgpLntpnmib/jgZfjgabjg6bjg7zjgrbjg7zjgYzlrp/oo4XjgZnjgovjgIJcbiAgICog55So5oi35a6e6ZmF5L2/55So55qE5qih5Z6L55qE5Z+657G744CC57un5om/6L+Z5Liq55Sx55So5oi35a6e546w44CCXG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtVXNlck1vZGVsIHtcbiAgICAvKipcbiAgICAgKiDliJ3mnJ/ljJbnirbmhYvjga7lj5blvpdcbiAgICAgKlxuICAgICAqIOWIneacn+WMluOBleOCjOOBpuOBhOOCi+eKtuaFi+OBi++8n1xuICAgICAqXG4gICAgICogQHJldHVybiB0cnVlICAgICDliJ3mnJ/ljJbjgZXjgozjgabjgYTjgotcbiAgICAgKiBAcmV0dXJuIGZhbHNlICAgIOWIneacn+WMluOBleOCjOOBpuOBhOOBquOBhFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0luaXRpYWxpemVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIneacn+WMlueKtuaFi+OBruioreWumlxuICAgICAqXG4gICAgICog5Yid5pyf5YyW54q25oWL44KS6Kit5a6a44GZ44KL44CCXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdiDliJ3mnJ/ljJbnirbmhYtcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0SW5pdGlhbGl6ZWQodjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB2O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOabtOaWsOeKtuaFi+OBruWPluW+l1xuICAgICAqXG4gICAgICog5pu05paw44GV44KM44Gm44GE44KL54q25oWL44GL77yfXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRydWUgICAgIOabtOaWsOOBleOCjOOBpuOBhOOCi1xuICAgICAqIEByZXR1cm4gZmFsc2UgICAg5pu05paw44GV44KM44Gm44GE44Gq44GEXG4gICAgICovXG4gICAgcHVibGljIGlzVXBkYXRpbmcoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5fdXBkYXRpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5pu05paw54q25oWL44Gu6Kit5a6aXG4gICAgICpcbiAgICAgKiDmm7TmlrDnirbmhYvjgpLoqK3lrprjgZnjgotcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2IOabtOaWsOeKtuaFi1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRVcGRhdGluZyh2OiBib29sZWFuKTogdm9pZCB7XG4gICAgICB0aGlzLl91cGRhdGluZyA9IHY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oe44Km44K544OJ44Op44OD44Kw5oOF5aCx44Gu6Kit5a6aXG4gICAgICogQHBhcmFtIOODieODqeODg+OCsOOBl+OBpuOBhOOCi+OCq+ODvOOCveODq+OBrljkvY3nva5cbiAgICAgKiBAcGFyYW0g44OJ44Op44OD44Kw44GX44Gm44GE44KL44Kr44O844K944Or44GuWeS9jee9rlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXREcmFnZ2luZyh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy5fZHJhZ01hbmFnZXIuc2V0KHgsIHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWKoOmAn+W6puOBruaDheWgseOCkuioreWumuOBmeOCi1xuICAgICAqIEBwYXJhbSB4IFjou7jmlrnlkJHjga7liqDpgJ/luqZcbiAgICAgKiBAcGFyYW0geSBZ6Lu45pa55ZCR44Gu5Yqg6YCf5bqmXG4gICAgICogQHBhcmFtIHogWui7uOaWueWQkeOBruWKoOmAn+W6plxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRBY2NlbGVyYXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy5fYWNjZWxlcmF0aW9uWCA9IHg7XG4gICAgICB0aGlzLl9hY2NlbGVyYXRpb25ZID0geTtcbiAgICAgIHRoaXMuX2FjY2VsZXJhdGlvblogPSB6O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODh+ODq+ihjOWIl+OCkuWPluW+l+OBmeOCi1xuICAgICAqIEByZXR1cm4g44Oi44OH44Or6KGM5YiXXG4gICAgICovXG4gICAgcHVibGljIGdldE1vZGVsTWF0cml4KCk6IEN1YmlzbU1vZGVsTWF0cml4IHtcbiAgICAgIHJldHVybiB0aGlzLl9tb2RlbE1hdHJpeDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDkuI3pgI/mmI7luqbjga7oqK3lrppcbiAgICAgKiBAcGFyYW0gYSDkuI3pgI/mmI7luqZcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0T3BhY2l0eShhOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHRoaXMuX29wYWNpdHkgPSBhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS4jemAj+aYjuW6puOBruWPluW+l1xuICAgICAqIEByZXR1cm4g5LiN6YCP5piO5bqmXG4gICAgICovXG4gICAgcHVibGljIGdldE9wYWNpdHkoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9vcGFjaXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODh+ODq+ODh+ODvOOCv+OCkuiqreOBv+i+vOOCgFxuICAgICAqICDor7vlj5bmqKHlnovmlbDmja5cbiAgICAgKiBAcGFyYW0gYnVmZmVyICAgIG1vYzPjg5XjgqHjgqTjg6vjgYzoqq3jgb/ovrzjgb7jgozjgabjgYTjgovjg5Djg4Pjg5XjgqFcbiAgICAgKi9cbiAgICBwdWJsaWMgbG9hZE1vZGVsKGJ1ZmZlcjogQXJyYXlCdWZmZXIpIHtcbiAgICAgIHRoaXMuX21vYyA9IEN1YmlzbU1vYy5jcmVhdGUoYnVmZmVyKTtcbiAgICAgIHRoaXMuX21vZGVsID0gdGhpcy5fbW9jLmNyZWF0ZU1vZGVsKCk7XG4gICAgICB0aGlzLl9tb2RlbC5zYXZlUGFyYW1ldGVycygpO1xuXG4gICAgICBpZiAodGhpcy5fbW9jID09IG51bGwgfHwgdGhpcy5fbW9kZWwgPT0gbnVsbCkge1xuICAgICAgICBDdWJpc21Mb2dFcnJvcignRmFpbGVkIHRvIENyZWF0ZU1vZGVsKCkuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbW9kZWxNYXRyaXggPSBuZXcgQ3ViaXNtTW9kZWxNYXRyaXgoXG4gICAgICAgIHRoaXMuX21vZGVsLmdldENhbnZhc1dpZHRoKCksXG4gICAgICAgIHRoaXMuX21vZGVsLmdldENhbnZhc0hlaWdodCgpXG4gICAgICApO1xuICAgICAgY29uc29sZS5sb2coJzEnKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOivu+WPlui/kOWKqOaVsOaNrlxuICAgICAqIEBwYXJhbSBidWZmZXIgbW90aW9uMy5qc29u44OV44Kh44Kk44Or44GM6Kqt44G/6L6844G+44KM44Gm44GE44KL44OQ44OD44OV44KhXG4gICAgICogQHBhcmFtIHNpemUg44OQ44OD44OV44Kh44Gu44K144Kk44K6XG4gICAgICogQHBhcmFtIG5hbWUg44Oi44O844K344On44Oz44Gu5ZCN5YmNXG4gICAgICogQHBhcmFtIG9uRmluaXNoZWRNb3Rpb25IYW5kbGVyIOODouODvOOCt+ODp+ODs+WGjeeUn+e1guS6huaZguOBq+WRvOOBs+WHuuOBleOCjOOCi+OCs+ODvOODq+ODkOODg+OCr+mWouaVsFxuICAgICAqIEByZXR1cm4g44Oi44O844K344On44Oz44Kv44Op44K5XG4gICAgICovXG4gICAgcHVibGljIGxvYWRNb3Rpb24gPSAoXG4gICAgICBidWZmZXI6IEFycmF5QnVmZmVyLFxuICAgICAgc2l6ZTogbnVtYmVyLFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgb25GaW5pc2hlZE1vdGlvbkhhbmRsZXI/OiBGaW5pc2hlZE1vdGlvbkNhbGxiYWNrXG4gICAgKSA9PiBDdWJpc21Nb3Rpb24uY3JlYXRlKGJ1ZmZlciwgc2l6ZSwgb25GaW5pc2hlZE1vdGlvbkhhbmRsZXIpO1xuXG4gICAgLyoqXG4gICAgICog6KGo5oOF44OH44O844K/44Gu6Kqt44G/6L6844G/XG4gICAgICogQHBhcmFtIGJ1ZmZlciBleHDjg5XjgqHjgqTjg6vjgYzoqq3jgb/ovrzjgb7jgozjgabjgYTjgovjg5Djg4Pjg5XjgqFcbiAgICAgKiBAcGFyYW0gc2l6ZSDjg5Djg4Pjg5XjgqHjga7jgrXjgqTjgrpcbiAgICAgKiBAcGFyYW0gbmFtZSDooajmg4Xjga7lkI3liY1cbiAgICAgKi9cbiAgICBwdWJsaWMgbG9hZEV4cHJlc3Npb24oXG4gICAgICBidWZmZXI6IEFycmF5QnVmZmVyLFxuICAgICAgc2l6ZTogbnVtYmVyLFxuICAgICAgbmFtZTogc3RyaW5nXG4gICAgKTogQUN1YmlzbU1vdGlvbiB7XG4gICAgICByZXR1cm4gQ3ViaXNtRXhwcmVzc2lvbk1vdGlvbi5jcmVhdGUoYnVmZmVyLCBzaXplKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg53jg7zjgrrjg4fjg7zjgr/jga7oqq3jgb/ovrzjgb9cbiAgICAgKiBAcGFyYW0gYnVmZmVyIHBvc2UzLmpzb27jgYzoqq3jgb/ovrzjgb7jgozjgabjgYTjgovjg5Djg4Pjg5XjgqFcbiAgICAgKiBAcGFyYW0gc2l6ZSDjg5Djg4Pjg5XjgqHjga7jgrXjgqTjgrpcbiAgICAgKi9cbiAgICBwdWJsaWMgbG9hZFBvc2UoYnVmZmVyOiBBcnJheUJ1ZmZlciwgc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICB0aGlzLl9wb3NlID0gQ3ViaXNtUG9zZS5jcmVhdGUoYnVmZmVyLCBzaXplKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg4fjg6vjgavku5jlsZ7jgZnjgovjg6bjg7zjgrbjg7zjg4fjg7zjgr/jgpLoqq3jgb/ovrzjgoBcbiAgICAgKiBAcGFyYW0gYnVmZmVyIHVzZXJkYXRhMy5qc29u44GM6Kqt44G/6L6844G+44KM44Gm44GE44KL44OQ44OD44OV44KhXG4gICAgICogQHBhcmFtIHNpemUg44OQ44OD44OV44Kh44Gu44K144Kk44K6XG4gICAgICovXG4gICAgcHVibGljIGxvYWRVc2VyRGF0YShidWZmZXI6IEFycmF5QnVmZmVyLCBzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHRoaXMuX21vZGVsVXNlckRhdGEgPSBDdWJpc21Nb2RlbFVzZXJEYXRhLmNyZWF0ZShidWZmZXIsIHNpemUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOeJqeeQhua8lOeul+ODh+ODvOOCv+OBruiqreOBv+i+vOOBv1xuICAgICAqIEBwYXJhbSBidWZmZXIgIHBoeXNpY3MzLmpzb27jgYzoqq3jgb/ovrzjgb7jgozjgabjgYTjgovjg5Djg4Pjg5XjgqFcbiAgICAgKiBAcGFyYW0gc2l6ZSAgICDjg5Djg4Pjg5XjgqHjga7jgrXjgqTjgrpcbiAgICAgKi9cbiAgICBwdWJsaWMgbG9hZFBoeXNpY3MoYnVmZmVyOiBBcnJheUJ1ZmZlciwgc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICB0aGlzLl9waHlzaWNzID0gQ3ViaXNtUGh5c2ljcy5jcmVhdGUoYnVmZmVyLCBzaXplKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlvZPjgZ/jgorliKTlrprjga7lj5blvpdcbiAgICAgKiBAcGFyYW0gZHJhd2FibGVJZCDmpJzoqLzjgZfjgZ/jgYREcmF3YWJsZeOBrklEXG4gICAgICogQHBhcmFtIHBvaW50WCBY5L2N572uXG4gICAgICogQHBhcmFtIHBvaW50WSBZ5L2N572uXG4gICAgICogQHJldHVybiB0cnVlIOODkuODg+ODiOOBl+OBpuOBhOOCi1xuICAgICAqIEByZXR1cm4gZmFsc2Ug44OS44OD44OI44GX44Gm44GE44Gq44GEXG4gICAgICovXG4gICAgcHVibGljIGlzSGl0KFxuICAgICAgZHJhd2FibGVJZDogQ3ViaXNtSWRIYW5kbGUsXG4gICAgICBwb2ludFg6IG51bWJlcixcbiAgICAgIHBvaW50WTogbnVtYmVyXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBkcmF3SW5kZXg6IG51bWJlciA9IHRoaXMuX21vZGVsLmdldERyYXdhYmxlSW5kZXgoZHJhd2FibGVJZCk7XG5cbiAgICAgIGlmIChkcmF3SW5kZXggPCAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8g5a2Y5Zyo44GX44Gq44GE5aC05ZCI44GvZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3QgY291bnQ6IG51bWJlciA9IHRoaXMuX21vZGVsLmdldERyYXdhYmxlVmVydGV4Q291bnQoZHJhd0luZGV4KTtcbiAgICAgIGNvbnN0IHZlcnRpY2VzOiBGbG9hdDMyQXJyYXkgPSB0aGlzLl9tb2RlbC5nZXREcmF3YWJsZVZlcnRpY2VzKGRyYXdJbmRleCk7XG5cbiAgICAgIGxldCBsZWZ0OiBudW1iZXIgPSB2ZXJ0aWNlc1swXTtcbiAgICAgIGxldCByaWdodDogbnVtYmVyID0gdmVydGljZXNbMF07XG4gICAgICBsZXQgdG9wOiBudW1iZXIgPSB2ZXJ0aWNlc1sxXTtcbiAgICAgIGxldCBib3R0b206IG51bWJlciA9IHZlcnRpY2VzWzFdO1xuXG4gICAgICBmb3IgKGxldCBqID0gMTsgaiA8IGNvdW50OyArK2opIHtcbiAgICAgICAgY29uc3QgeCA9IHZlcnRpY2VzW0NvbnN0YW50LnZlcnRleE9mZnNldCArIGogKiBDb25zdGFudC52ZXJ0ZXhTdGVwXTtcbiAgICAgICAgY29uc3QgeSA9IHZlcnRpY2VzW0NvbnN0YW50LnZlcnRleE9mZnNldCArIGogKiBDb25zdGFudC52ZXJ0ZXhTdGVwICsgMV07XG5cbiAgICAgICAgaWYgKHggPCBsZWZ0KSB7XG4gICAgICAgICAgbGVmdCA9IHg7IC8vIE1pbiB4XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoeCA+IHJpZ2h0KSB7XG4gICAgICAgICAgcmlnaHQgPSB4OyAvLyBNYXggeFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHkgPCB0b3ApIHtcbiAgICAgICAgICB0b3AgPSB5OyAvLyBNaW4geVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHkgPiBib3R0b20pIHtcbiAgICAgICAgICBib3R0b20gPSB5OyAvLyBNYXggeVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR4OiBudW1iZXIgPSB0aGlzLl9tb2RlbE1hdHJpeC5pbnZlcnRUcmFuc2Zvcm1YKHBvaW50WCk7XG4gICAgICBjb25zdCB0eTogbnVtYmVyID0gdGhpcy5fbW9kZWxNYXRyaXguaW52ZXJ0VHJhbnNmb3JtWShwb2ludFkpO1xuXG4gICAgICByZXR1cm4gbGVmdCA8PSB0eCAmJiB0eCA8PSByaWdodCAmJiB0b3AgPD0gdHkgJiYgdHkgPD0gYm90dG9tO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODh+ODq+OBruWPluW+l1xuICAgICAqIEByZXR1cm4g44Oi44OH44OrXG4gICAgICovXG4gICAgcHVibGljIGdldE1vZGVsKCk6IEN1YmlzbU1vZGVsIHtcbiAgICAgIHJldHVybiB0aGlzLl9tb2RlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6zjg7Pjg4Djg6njga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIOODrOODs+ODgOODqVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSZW5kZXJlcigpOiBDdWJpc21SZW5kZXJlcl9XZWJHTCB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVuZGVyZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Os44Oz44OA44Op44KS5L2c5oiQ44GX44Gm5Yid5pyf5YyW44KS5a6f6KGM44GZ44KLXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVJlbmRlcmVyKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuX3JlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuZGVsZXRlUmVuZGVyZXIoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcmVuZGVyZXIgPSBuZXcgQ3ViaXNtUmVuZGVyZXJfV2ViR0woKTtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLmluaXRpYWxpemUodGhpcy5fbW9kZWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODrOODs+ODgOODqeOBruino+aUvlxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVSZW5kZXJlcigpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJlciAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbGVhc2UoKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCpOODmeODs+ODiOeZuueBq+aZguOBruaomea6luWHpueQhlxuICAgICAqXG4gICAgICogRXZlbnTjgYzlho3nlJ/lh6bnkIbmmYLjgavjgYLjgaPjgZ/loLTlkIjjga7lh6bnkIbjgpLjgZnjgovjgIJcbiAgICAgKiDntpnmib/jgafkuIrmm7jjgY3jgZnjgovjgZPjgajjgpLmg7PlrprjgZfjgabjgYTjgovjgIJcbiAgICAgKiDkuIrmm7jjgY3jgZfjgarjgYTloLTlkIjjga/jg63jgrDlh7rlipvjgpLjgZnjgovjgIJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBldmVudFZhbHVlIOeZuueBq+OBl+OBn+OCpOODmeODs+ODiOOBruaWh+Wtl+WIl+ODh+ODvOOCv1xuICAgICAqL1xuICAgIHB1YmxpYyBtb3Rpb25FdmVudEZpcmVkKGV2ZW50VmFsdWU6IGNzbVN0cmluZyk6IHZvaWQge1xuICAgICAgQ3ViaXNtTG9nSW5mbygnezB9JywgZXZlbnRWYWx1ZS5zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgqTjg5njg7Pjg4jnlKjjga7jgrPjg7zjg6vjg5Djg4Pjgq9cbiAgICAgKlxuICAgICAqIEN1YmlzbU1vdGlvblF1ZXVlTWFuYWdlcuOBq+OCpOODmeODs+ODiOeUqOOBq+eZu+mMsuOBmeOCi+OBn+OCgeOBrkNhbGxiYWNr44CCXG4gICAgICogQ3ViaXNtVXNlck1vZGVs44Gu57aZ5om/5YWI44GuRXZlbnRGaXJlZOOCkuWRvOOBtuOAglxuICAgICAqXG4gICAgICogQHBhcmFtIGNhbGxlciDnmbrngavjgZfjgZ/jgqTjg5njg7Pjg4jjgpLnrqHnkIbjgZfjgabjgYTjgZ/jg6Ljg7zjgrfjg6fjg7Pjg57jg43jg7zjgrjjg6Pjg7zjgIHmr5TovIPnlKhcbiAgICAgKiBAcGFyYW0gZXZlbnRWYWx1ZSDnmbrngavjgZfjgZ/jgqTjg5njg7Pjg4jjga7mloflrZfliJfjg4fjg7zjgr9cbiAgICAgKiBAcGFyYW0gY3VzdG9tRGF0YSBDdWJpc21Vc2VyTW9kZWzjgpLntpnmib/jgZfjgZ/jgqTjg7Pjgrnjgr/jg7PjgrnjgpLmg7PlrppcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGN1YmlzbURlZmF1bHRNb3Rpb25FdmVudENhbGxiYWNrKFxuICAgICAgY2FsbGVyOiBDdWJpc21Nb3Rpb25RdWV1ZU1hbmFnZXIsXG4gICAgICBldmVudFZhbHVlOiBjc21TdHJpbmcsXG4gICAgICBjdXN0b21EYXRhOiBDdWJpc21Vc2VyTW9kZWxcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IG1vZGVsOiBDdWJpc21Vc2VyTW9kZWwgPSBjdXN0b21EYXRhO1xuXG4gICAgICBpZiAobW9kZWwgIT0gbnVsbCkge1xuICAgICAgICBtb2RlbC5tb3Rpb25FdmVudEZpcmVkKGV2ZW50VmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIC8vIOWQhOWkieaVsOWIneacn+WMllxuICAgICAgdGhpcy5fbW9jID0gbnVsbDtcbiAgICAgIHRoaXMuX21vZGVsID0gbnVsbDtcbiAgICAgIHRoaXMuX21vdGlvbk1hbmFnZXIgPSBudWxsO1xuICAgICAgdGhpcy5fZXhwcmVzc2lvbk1hbmFnZXIgPSBudWxsO1xuICAgICAgdGhpcy5fZXllQmxpbmsgPSBudWxsO1xuICAgICAgdGhpcy5fYnJlYXRoID0gbnVsbDtcbiAgICAgIHRoaXMuX21vZGVsTWF0cml4ID0gbnVsbDtcbiAgICAgIHRoaXMuX3Bvc2UgPSBudWxsO1xuICAgICAgdGhpcy5fZHJhZ01hbmFnZXIgPSBudWxsO1xuICAgICAgdGhpcy5fcGh5c2ljcyA9IG51bGw7XG4gICAgICB0aGlzLl9tb2RlbFVzZXJEYXRhID0gbnVsbDtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICB0aGlzLl91cGRhdGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5fb3BhY2l0eSA9IDEuMDtcbiAgICAgIHRoaXMuX2xpcHN5bmMgPSB0cnVlO1xuICAgICAgdGhpcy5fbGFzdExpcFN5bmNWYWx1ZSA9IDAuMDtcbiAgICAgIHRoaXMuX2RyYWdYID0gMC4wO1xuICAgICAgdGhpcy5fZHJhZ1kgPSAwLjA7XG4gICAgICB0aGlzLl9hY2NlbGVyYXRpb25YID0gMC4wO1xuICAgICAgdGhpcy5fYWNjZWxlcmF0aW9uWSA9IDAuMDtcbiAgICAgIHRoaXMuX2FjY2VsZXJhdGlvblogPSAwLjA7XG4gICAgICB0aGlzLl9kZWJ1Z01vZGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3JlbmRlcmVyID0gbnVsbDtcblxuICAgICAgLy8g44Oi44O844K344On44Oz44Oe44ON44O844K444Oj44O844KS5L2c5oiQXG4gICAgICB0aGlzLl9tb3Rpb25NYW5hZ2VyID0gbmV3IEN1YmlzbU1vdGlvbk1hbmFnZXIoKTtcbiAgICAgIHRoaXMuX21vdGlvbk1hbmFnZXIuc2V0RXZlbnRDYWxsYmFjayhcbiAgICAgICAgQ3ViaXNtVXNlck1vZGVsLmN1YmlzbURlZmF1bHRNb3Rpb25FdmVudENhbGxiYWNrLFxuICAgICAgICB0aGlzXG4gICAgICApO1xuXG4gICAgICAvLyDooajmg4Xjg57jg43jg7zjgrjjg6Pjg7zjgpLkvZzmiJBcbiAgICAgIHRoaXMuX2V4cHJlc3Npb25NYW5hZ2VyID0gbmV3IEN1YmlzbU1vdGlvbk1hbmFnZXIoKTtcblxuICAgICAgLy8g44OJ44Op44OD44Kw44Gr44KI44KL44Ki44OL44Oh44O844K344On44OzXG4gICAgICB0aGlzLl9kcmFnTWFuYWdlciA9IG5ldyBDdWJpc21UYXJnZXRQb2ludCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODh+OCueODiOODqeOCr+OCv+OBq+ebuOW9k+OBmeOCi+WHpueQhlxuICAgICAqL1xuICAgIHB1YmxpYyByZWxlYXNlKCkge1xuICAgICAgaWYgKHRoaXMuX21vdGlvbk1hbmFnZXIgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9tb3Rpb25NYW5hZ2VyLnJlbGVhc2UoKTtcbiAgICAgICAgdGhpcy5fbW90aW9uTWFuYWdlciA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9leHByZXNzaW9uTWFuYWdlciAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2V4cHJlc3Npb25NYW5hZ2VyLnJlbGVhc2UoKTtcbiAgICAgICAgdGhpcy5fZXhwcmVzc2lvbk1hbmFnZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fbW9jICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbW9jLmRlbGV0ZU1vZGVsKHRoaXMuX21vZGVsKTtcbiAgICAgICAgdGhpcy5fbW9jLnJlbGVhc2UoKTtcbiAgICAgICAgdGhpcy5fbW9jID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbW9kZWxNYXRyaXggPSBudWxsO1xuXG4gICAgICBDdWJpc21Qb3NlLmRlbGV0ZSh0aGlzLl9wb3NlKTtcbiAgICAgIEN1YmlzbUV5ZUJsaW5rLmRlbGV0ZSh0aGlzLl9leWVCbGluayk7XG4gICAgICBDdWJpc21CcmVhdGguZGVsZXRlKHRoaXMuX2JyZWF0aCk7XG5cbiAgICAgIHRoaXMuX2RyYWdNYW5hZ2VyID0gbnVsbDtcblxuICAgICAgQ3ViaXNtUGh5c2ljcy5kZWxldGUodGhpcy5fcGh5c2ljcyk7XG4gICAgICBDdWJpc21Nb2RlbFVzZXJEYXRhLmRlbGV0ZSh0aGlzLl9tb2RlbFVzZXJEYXRhKTtcblxuICAgICAgdGhpcy5kZWxldGVSZW5kZXJlcigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbW9jOiBDdWJpc21Nb2M7IC8vIE1vY+ODh+ODvOOCv1xuICAgIHByb3RlY3RlZCBfbW9kZWw6IEN1YmlzbU1vZGVsOyAvLyBNb2RlbOOCpOODs+OCueOCv+ODs+OCuVxuXG4gICAgcHJvdGVjdGVkIF9tb3Rpb25NYW5hZ2VyOiBDdWJpc21Nb3Rpb25NYW5hZ2VyOyAvLyDjg6Ljg7zjgrfjg6fjg7PnrqHnkIZcbiAgICBwcm90ZWN0ZWQgX2V4cHJlc3Npb25NYW5hZ2VyOiBDdWJpc21Nb3Rpb25NYW5hZ2VyOyAvLyDooajmg4XnrqHnkIZcbiAgICBwcm90ZWN0ZWQgX2V5ZUJsaW5rOiBDdWJpc21FeWVCbGluazsgLy8g6Ieq5YuV44G+44Gw44Gf44GNXG4gICAgcHJvdGVjdGVkIF9icmVhdGg6IEN1YmlzbUJyZWF0aDsgLy8g5ZG85ZC4XG4gICAgcHJvdGVjdGVkIF9tb2RlbE1hdHJpeDogQ3ViaXNtTW9kZWxNYXRyaXg7IC8vIOODouODh+ODq+ihjOWIl1xuICAgIHByb3RlY3RlZCBfcG9zZTogQ3ViaXNtUG9zZTsgLy8g44Od44O844K6566h55CGXG4gICAgcHJvdGVjdGVkIF9kcmFnTWFuYWdlcjogQ3ViaXNtVGFyZ2V0UG9pbnQ7IC8vIOODnuOCpuOCueODieODqeODg+OCsFxuICAgIHByb3RlY3RlZCBfcGh5c2ljczogQ3ViaXNtUGh5c2ljczsgLy8g54mp55CG5ryU566XXG4gICAgcHJvdGVjdGVkIF9tb2RlbFVzZXJEYXRhOiBDdWJpc21Nb2RlbFVzZXJEYXRhOyAvLyDjg6bjg7zjgrbjg7zjg4fjg7zjgr9cblxuICAgIHByb3RlY3RlZCBfaW5pdGlhbGl6ZWQ6IGJvb2xlYW47IC8vIOWIneacn+WMluOBleOCjOOBn+OBi+OBqeOBhuOBi1xuICAgIHByb3RlY3RlZCBfdXBkYXRpbmc6IGJvb2xlYW47IC8vIOabtOaWsOOBleOCjOOBn+OBi+OBqeOBhuOBi1xuICAgIHByb3RlY3RlZCBfb3BhY2l0eTogbnVtYmVyOyAvLyDkuI3pgI/mmI7luqZcbiAgICBwcm90ZWN0ZWQgX2xpcHN5bmM6IGJvb2xlYW47IC8vIOODquODg+ODl+OCt+ODs+OCr+OBmeOCi+OBi+OBqeOBhuOBi1xuICAgIHByb3RlY3RlZCBfbGFzdExpcFN5bmNWYWx1ZTogbnVtYmVyOyAvLyDmnIDlvozjga7jg6rjg4Pjg5fjgrfjg7Pjgq/jga7liLblvqHlnLBcbiAgICBwcm90ZWN0ZWQgX2RyYWdYOiBudW1iZXI7IC8vIOODnuOCpuOCueODieODqeODg+OCsOOBrljkvY3nva5cbiAgICBwcm90ZWN0ZWQgX2RyYWdZOiBudW1iZXI7IC8vIOODnuOCpuOCueODieODqeODg+OCsOOBrlnkvY3nva5cbiAgICBwcm90ZWN0ZWQgX2FjY2VsZXJhdGlvblg6IG51bWJlcjsgLy8gWOi7uOaWueWQkeOBruWKoOmAn+W6plxuICAgIHByb3RlY3RlZCBfYWNjZWxlcmF0aW9uWTogbnVtYmVyOyAvLyBZ6Lu45pa55ZCR44Gu5Yqg6YCf5bqmXG4gICAgcHJvdGVjdGVkIF9hY2NlbGVyYXRpb25aOiBudW1iZXI7IC8vIFrou7jmlrnlkJHjga7liqDpgJ/luqZcbiAgICBwcm90ZWN0ZWQgX2RlYnVnTW9kZTogYm9vbGVhbjsgLy8g44OH44OQ44OD44Kw44Oi44O844OJ44GL44Gp44GG44GLXG5cbiAgICBwcml2YXRlIF9yZW5kZXJlcjogQ3ViaXNtUmVuZGVyZXJfV2ViR0w7IC8vIOODrOODs+ODgOODqVxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRoZSBMaXZlMkQgT3BlbiBTb2Z0d2FyZSBsaWNlbnNlXG4gKiB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5saXZlMmQuY29tL2V1bGEvbGl2ZTJkLW9wZW4tc29mdHdhcmUtbGljZW5zZS1hZ3JlZW1lbnRfZW4uaHRtbC5cbiAqL1xuXG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtbW90aW9ucXVldWVtYW5hZ2VyIH0gZnJvbSAnLi9jdWJpc21tb3Rpb25xdWV1ZW1hbmFnZXInO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGFjdWJpc21tb3Rpb24gfSBmcm9tICcuL2FjdWJpc21tb3Rpb24nO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvY3ViaXNtbW9kZWwnO1xuaW1wb3J0IEN1YmlzbU1vdGlvblF1ZXVlRW50cnlIYW5kbGUgPSBjdWJpc21tb3Rpb25xdWV1ZW1hbmFnZXIuQ3ViaXNtTW90aW9uUXVldWVFbnRyeUhhbmRsZTtcbmltcG9ydCBDdWJpc21Nb2RlbCA9IGN1YmlzbW1vZGVsLkN1YmlzbU1vZGVsO1xuaW1wb3J0IEFDdWJpc21Nb3Rpb24gPSBhY3ViaXNtbW90aW9uLkFDdWJpc21Nb3Rpb247XG5pbXBvcnQgQ3ViaXNtTW90aW9uUXVldWVNYW5hZ2VyID0gY3ViaXNtbW90aW9ucXVldWVtYW5hZ2VyLkN1YmlzbU1vdGlvblF1ZXVlTWFuYWdlcjtcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvKipcbiAgICog44Oi44O844K344On44Oz44Gu566h55CGXG4gICAqXG4gICAqIOODouODvOOCt+ODp+ODs+OBrueuoeeQhuOCkuihjOOBhuOCr+ODqeOCuVxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbU1vdGlvbk1hbmFnZXIgZXh0ZW5kcyBDdWJpc21Nb3Rpb25RdWV1ZU1hbmFnZXIge1xuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICB0aGlzLl9jdXJyZW50UHJpb3JpdHkgPSAwO1xuICAgICAgdGhpcy5fcmVzZXJ2ZVByaW9yaXR5ID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlho3nlJ/kuK3jga7jg6Ljg7zjgrfjg6fjg7Pjga7lhKrlhYjluqbjga7lj5blvpdcbiAgICAgKiBAcmV0dXJuICDjg6Ljg7zjgrfjg6fjg7Pjga7lhKrlhYjluqZcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q3VycmVudFByaW9yaXR5KCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fY3VycmVudFByaW9yaXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS6iOe0hOS4reOBruODouODvOOCt+ODp+ODs+OBruWEquWFiOW6puOCkuWPluW+l+OBmeOCi+OAglxuICAgICAqIEByZXR1cm4gIOODouODvOOCt+ODp+ODs+OBruWEquWFiOW6plxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSZXNlcnZlUHJpb3JpdHkoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXNlcnZlUHJpb3JpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5LqI57SE5Lit44Gu44Oi44O844K344On44Oz44Gu5YSq5YWI5bqm44KS6Kit5a6a44GZ44KL44CCXG4gICAgICogQHBhcmFtICAgdmFsICAgICDlhKrlhYjluqZcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UmVzZXJ2ZVByaW9yaXR5KHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgICB0aGlzLl9yZXNlcnZlUHJpb3JpdHkgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5YSq5YWI5bqm44KS6Kit5a6a44GX44Gm44Oi44O844K344On44Oz44KS6ZaL5aeL44GZ44KL44CCXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW90aW9uICAgICAgICAgIOODouODvOOCt+ODp+ODs1xuICAgICAqIEBwYXJhbSBhdXRvRGVsZXRlICAgICAg5YaN55Sf44GM54up54yf44GX44Gf44Oi44O844K344On44Oz44Gu44Kk44Oz44K544K/44Oz44K544KS5YmK6Zmk44GZ44KL44Gq44KJdHJ1ZVxuICAgICAqIEBwYXJhbSBwcmlvcml0eSAgICAgICAg5YSq5YWI5bqmXG4gICAgICogQHJldHVybiAgICAgICAgICAgICAgICDplovlp4vjgZfjgZ/jg6Ljg7zjgrfjg6fjg7Pjga7orZjliKXnlarlj7fjgpLov5TjgZnjgILlgIvliKXjga7jg6Ljg7zjgrfjg6fjg7PjgYzntYLkuobjgZfjgZ/jgYvlkKbjgYvjgpLliKTlrprjgZnjgotJc0ZpbmlzaGVkKCnjga7lvJXmlbDjgafkvb/nlKjjgZnjgovjgILplovlp4vjgafjgY3jgarjgYTmmYLjga/jgIwtMeOAjVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGFydE1vdGlvblByaW9yaXR5KFxuICAgICAgbW90aW9uOiBBQ3ViaXNtTW90aW9uLFxuICAgICAgYXV0b0RlbGV0ZTogYm9vbGVhbixcbiAgICAgIHByaW9yaXR5OiBudW1iZXJcbiAgICApOiBDdWJpc21Nb3Rpb25RdWV1ZUVudHJ5SGFuZGxlIHtcbiAgICAgIGlmIChwcmlvcml0eSA9PSB0aGlzLl9yZXNlcnZlUHJpb3JpdHkpIHtcbiAgICAgICAgdGhpcy5fcmVzZXJ2ZVByaW9yaXR5ID0gMDsgLy8g5LqI57SE44KS6Kej6ZmkXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2N1cnJlbnRQcmlvcml0eSA9IHByaW9yaXR5OyAvLyDlho3nlJ/kuK3jg6Ljg7zjgrfjg6fjg7Pjga7lhKrlhYjluqbjgpLoqK3lrppcblxuICAgICAgcmV0dXJuIHN1cGVyLnN0YXJ0TW90aW9uKG1vdGlvbiwgYXV0b0RlbGV0ZSwgdGhpcy5fdXNlclRpbWVTZWNvbmRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7PjgpLmm7TmlrDjgZfjgabjgIHjg6Ljg4fjg6vjgavjg5Hjg6njg6Hjg7zjgr/lgKTjgpLlj43mmKDjgZnjgovjgIJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlbCAgIOWvvuixoeOBruODouODh+ODq1xuICAgICAqIEBwYXJhbSBkZWx0YVRpbWVTZWNvbmRzICAgIOODh+ODq+OCv+aZgumWk1vnp5JdXG4gICAgICogQHJldHVybiAgdHJ1ZSAgICDmm7TmlrDjgZXjgozjgabjgYTjgotcbiAgICAgKiBAcmV0dXJuICBmYWxzZSAgIOabtOaWsOOBleOCjOOBpuOBhOOBquOBhFxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVNb3Rpb24obW9kZWw6IEN1YmlzbU1vZGVsLCBkZWx0YVRpbWVTZWNvbmRzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgIHRoaXMuX3VzZXJUaW1lU2Vjb25kcyArPSBkZWx0YVRpbWVTZWNvbmRzO1xuXG4gICAgICBjb25zdCB1cGRhdGVkOiBib29sZWFuID0gc3VwZXIuZG9VcGRhdGVNb3Rpb24oXG4gICAgICAgIG1vZGVsLFxuICAgICAgICB0aGlzLl91c2VyVGltZVNlY29uZHNcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLmlzRmluaXNoZWQoKSkge1xuICAgICAgICB0aGlzLl9jdXJyZW50UHJpb3JpdHkgPSAwOyAvLyDlho3nlJ/kuK3jga7jg6Ljg7zjgrfjg6fjg7Pjga7lhKrlhYjluqbjgpLop6PpmaRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz44KS5LqI57SE44GZ44KL44CCXG4gICAgICpcbiAgICAgKiBAcGFyYW0gICBwcmlvcml0eSAgICDlhKrlhYjluqZcbiAgICAgKiBAcmV0dXJuICB0cnVlICAgIOS6iOe0hOOBp+OBjeOBn1xuICAgICAqIEByZXR1cm4gIGZhbHNlICAg5LqI57SE44Gn44GN44Gq44GL44Gj44GfXG4gICAgICovXG4gICAgcHVibGljIHJlc2VydmVNb3Rpb24ocHJpb3JpdHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgaWYgKFxuICAgICAgICBwcmlvcml0eSA8PSB0aGlzLl9yZXNlcnZlUHJpb3JpdHkgfHxcbiAgICAgICAgcHJpb3JpdHkgPD0gdGhpcy5fY3VycmVudFByaW9yaXR5XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZXNlcnZlUHJpb3JpdHkgPSBwcmlvcml0eTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgX2N1cnJlbnRQcmlvcml0eTogbnVtYmVyOyAvLyDnj77lnKjlho3nlJ/kuK3jga7jg6Ljg7zjgrfjg6fjg7Pjga7lhKrlhYjluqZcbiAgICBfcmVzZXJ2ZVByaW9yaXR5OiBudW1iZXI7IC8vIOWGjeeUn+S6iOWumuOBruODouODvOOCt+ODp+ODs+OBruWEquWFiOW6puOAguWGjeeUn+S4reOBrzDjgavjgarjgovjgILjg6Ljg7zjgrfjg6fjg7Pjg5XjgqHjgqTjg6vjgpLliKXjgrnjg6zjg4Pjg4njgafoqq3jgb/ovrzjgoDjgajjgY3jga7mqZ/og73jgIJcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGFjdWJpc21tb3Rpb24gfSBmcm9tICcuL2FjdWJpc21tb3Rpb24nO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vdGlvbnF1ZXVlbWFuYWdlciB9IGZyb20gJy4vY3ViaXNtbW90aW9ucXVldWVtYW5hZ2VyJztcbmltcG9ydCBDdWJpc21Nb3Rpb25RdWV1ZUVudHJ5SGFuZGxlID0gY3ViaXNtbW90aW9ucXVldWVtYW5hZ2VyLkN1YmlzbU1vdGlvblF1ZXVlRW50cnlIYW5kbGU7XG5pbXBvcnQgQUN1YmlzbU1vdGlvbiA9IGFjdWJpc21tb3Rpb24uQUN1YmlzbU1vdGlvbjtcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvKipcbiAgICogQ3ViaXNtTW90aW9uUXVldWVNYW5hZ2Vy44Gn5YaN55Sf44GX44Gm44GE44KL5ZCE44Oi44O844K344On44Oz44Gu566h55CG44Kv44Op44K544CCXG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtTW90aW9uUXVldWVFbnRyeSB7XG4gICAgLyoqXG4gICAgICog44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5fYXV0b0RlbGV0ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fbW90aW9uID0gbnVsbDtcbiAgICAgIHRoaXMuX2F2YWlsYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLl9maW5pc2hlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5fc3RhcnRUaW1lU2Vjb25kcyA9IC0xLjA7XG4gICAgICB0aGlzLl9mYWRlSW5TdGFydFRpbWVTZWNvbmRzID0gMC4wO1xuICAgICAgdGhpcy5fZW5kVGltZVNlY29uZHMgPSAtMS4wO1xuICAgICAgdGhpcy5fc3RhdGVUaW1lU2Vjb25kcyA9IDAuMDtcbiAgICAgIHRoaXMuX3N0YXRlV2VpZ2h0ID0gMC4wO1xuICAgICAgdGhpcy5fbGFzdEV2ZW50Q2hlY2tTZWNvbmRzID0gMC4wO1xuICAgICAgdGhpcy5fbW90aW9uUXVldWVFbnRyeUhhbmRsZSA9IHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OH44K544OI44Op44Kv44K/55u45b2T44Gu5Yem55CGXG4gICAgICovXG4gICAgcHVibGljIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5fYXV0b0RlbGV0ZSAmJiB0aGlzLl9tb3Rpb24pIHtcbiAgICAgICAgQUN1YmlzbU1vdGlvbi5kZWxldGUodGhpcy5fbW90aW9uKTsgLy9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Xjgqfjg7zjg4njgqLjgqbjg4jjga7plovlp4tcbiAgICAgKiBAcGFyYW0gZmFkZU91dFNlY29uZHMg44OV44Kn44O844OJ44Ki44Km44OI44Gr44GL44GL44KL5pmC6ZaTW+enkl1cbiAgICAgKiBAcGFyYW0gdXNlclRpbWVTZWNvbmRzIOODh+ODq+OCv+aZgumWk+OBruepjeeul+WApFvnp5JdXG4gICAgICovXG4gICAgcHVibGljIHN0YXJ0RmFkZW91dChmYWRlb3V0U2Vjb25kczogbnVtYmVyLCB1c2VyVGltZVNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgICAgY29uc3QgbmV3RW5kVGltZVNlY29uZHM6IG51bWJlciA9IHVzZXJUaW1lU2Vjb25kcyArIGZhZGVvdXRTZWNvbmRzO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX2VuZFRpbWVTZWNvbmRzIDwgMC4wIHx8XG4gICAgICAgIG5ld0VuZFRpbWVTZWNvbmRzIDwgdGhpcy5fZW5kVGltZVNlY29uZHNcbiAgICAgICkge1xuICAgICAgICB0aGlzLl9lbmRUaW1lU2Vjb25kcyA9IG5ld0VuZFRpbWVTZWNvbmRzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+OBrue1guS6huOBrueiuuiqjVxuICAgICAqXG4gICAgICogQHJldHVybiB0cnVlIOODouODvOOCt+ODp+ODs+OBjOe1guS6huOBl+OBn1xuICAgICAqIEByZXR1cm4gZmFsc2Ug57WC5LqG44GX44Gm44GE44Gq44GEXG4gICAgICovXG4gICAgcHVibGljIGlzRmluaXNoZWQoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5fZmluaXNoZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz44Gu6ZaL5aeL44Gu56K66KqNXG4gICAgICogQHJldHVybiB0cnVlIOODouODvOOCt+ODp+ODs+OBjOmWi+Wni+OBl+OBn1xuICAgICAqIEByZXR1cm4gZmFsc2Ug6ZaL5aeL44GX44Gm44GE44Gq44GEXG4gICAgICovXG4gICAgcHVibGljIGlzU3RhcnRlZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdGFydGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+OBrumWi+Wni+aZguWIu+OBruWPluW+l1xuICAgICAqIEByZXR1cm4g44Oi44O844K344On44Oz44Gu6ZaL5aeL5pmC5Yi7W+enkl1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U3RhcnRUaW1lKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhcnRUaW1lU2Vjb25kcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Xjgqfjg7zjg4njgqTjg7Pjga7plovlp4vmmYLliLvjga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIOODleOCp+ODvOODieOCpOODs+OBrumWi+Wni+aZguWIu1vnp5JdXG4gICAgICovXG4gICAgcHVibGljIGdldEZhZGVJblN0YXJ0VGltZSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZhZGVJblN0YXJ0VGltZVNlY29uZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OV44Kn44O844OJ44Kk44Oz44Gu57WC5LqG5pmC5Yi744Gu5Y+W5b6XXG4gICAgICogQHJldHVybiDjg5Xjgqfjg7zjg4njgqTjg7Pjga7ntYLkuobmmYLliLvjga7lj5blvpdcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RW5kVGltZSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2VuZFRpbWVTZWNvbmRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+OBrumWi+Wni+aZguWIu+OBruioreWumlxuICAgICAqIEBwYXJhbSBzdGFydFRpbWUg44Oi44O844K344On44Oz44Gu6ZaL5aeL5pmC5Yi7XG4gICAgICovXG4gICAgcHVibGljIHNldFN0YXJ0VGltZShzdGFydFRpbWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy5fc3RhcnRUaW1lU2Vjb25kcyA9IHN0YXJ0VGltZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Xjgqfjg7zjg4njgqTjg7Pjga7plovlp4vmmYLliLvjga7oqK3lrppcbiAgICAgKiBAcGFyYW0gc3RhcnRUaW1lIOODleOCp+ODvOODieOCpOODs+OBrumWi+Wni+aZguWIu1vnp5JdXG4gICAgICovXG4gICAgcHVibGljIHNldEZhZGVJblN0YXJ0VGltZShzdGFydFRpbWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy5fZmFkZUluU3RhcnRUaW1lU2Vjb25kcyA9IHN0YXJ0VGltZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Xjgqfjg7zjg4njgqTjg7Pjga7ntYLkuobmmYLliLvjga7oqK3lrppcbiAgICAgKiBAcGFyYW0gZW5kVGltZSDjg5Xjgqfjg7zjg4njgqTjg7Pjga7ntYLkuobmmYLliLtb56eSXVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRFbmRUaW1lKGVuZFRpbWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy5fZW5kVGltZVNlY29uZHMgPSBlbmRUaW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+OBrue1guS6huOBruioreWumlxuICAgICAqIEBwYXJhbSBmIHRydWXjgarjgonjg6Ljg7zjgrfjg6fjg7Pjga7ntYLkuoZcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0SXNGaW5pc2hlZChmOiBib29sZWFuKTogdm9pZCB7XG4gICAgICB0aGlzLl9maW5pc2hlZCA9IGY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz6ZaL5aeL44Gu6Kit5a6aXG4gICAgICogQHBhcmFtIGYgdHJ1ZeOBquOCieODouODvOOCt+ODp+ODs+OBrumWi+Wni1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRJc1N0YXJ0ZWQoZjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgdGhpcy5fc3RhcnRlZCA9IGY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz44Gu5pyJ5Yq55oCn44Gu56K66KqNXG4gICAgICogQHJldHVybiB0cnVlIOODouODvOOCt+ODp+ODs+OBr+acieWKuVxuICAgICAqIEByZXR1cm4gZmFsc2Ug44Oi44O844K344On44Oz44Gv54Sh5Yq5XG4gICAgICovXG4gICAgcHVibGljIGlzQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2F2YWlsYWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Pjga7mnInlirnmgKfjga7oqK3lrppcbiAgICAgKiBAcGFyYW0gdiB0cnVl44Gq44KJ44Oi44O844K344On44Oz44Gv5pyJ5Yq5XG4gICAgICovXG4gICAgcHVibGljIHNldElzQXZhaWxhYmxlKHY6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHRoaXMuX2F2YWlsYWJsZSA9IHY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz44Gu54q25oWL44Gu6Kit5a6aXG4gICAgICogQHBhcmFtIHRpbWVTZWNvbmRzIOePvuWcqOaZguWIu1vnp5JdXG4gICAgICogQHBhcmFtIHdlaWdodCDjg6Ljg7zjgrfjg6fjg7PlsL7ph43jgb9cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U3RhdGUodGltZVNlY29uZHM6IG51bWJlciwgd2VpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHRoaXMuX3N0YXRlVGltZVNlY29uZHMgPSB0aW1lU2Vjb25kcztcbiAgICAgIHRoaXMuX3N0YXRlV2VpZ2h0ID0gd2VpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+OBruePvuWcqOaZguWIu+OBruWPluW+l1xuICAgICAqIEByZXR1cm4g44Oi44O844K344On44Oz44Gu54++5Zyo5pmC5Yi7W+enkl1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U3RhdGVUaW1lKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhdGVUaW1lU2Vjb25kcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Pjga7ph43jgb/jga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIOODouODvOOCt+ODp+ODs+OBrumHjeOBv1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTdGF0ZVdlaWdodCgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlV2VpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOacgOW+jOOBq+OCpOODmeODs+ODiOOBrueZuueBq+OCkuODgeOCp+ODg+OCr+OBl+OBn+aZgumWk+OCkuWPluW+l1xuICAgICAqXG4gICAgICogQHJldHVybiDmnIDlvozjgavjgqTjg5njg7Pjg4jjga7nmbrngavjgpLjg4Hjgqfjg4Pjgq/jgZfjgZ/mmYLplpNb56eSXVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMYXN0Q2hlY2tFdmVudFRpbWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9sYXN0RXZlbnRDaGVja1NlY29uZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5pyA5b6M44Gr44Kk44OZ44Oz44OI44KS44OB44Kn44OD44Kv44GX44Gf5pmC6ZaT44KS6Kit5a6aXG4gICAgICogQHBhcmFtIGNoZWNrVGltZSDmnIDlvozjgavjgqTjg5njg7Pjg4jjgpLjg4Hjgqfjg4Pjgq/jgZfjgZ/mmYLplpNb56eSXVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRMYXN0Q2hlY2tFdmVudFRpbWUoY2hlY2tUaW1lOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHRoaXMuX2xhc3RFdmVudENoZWNrU2Vjb25kcyA9IGNoZWNrVGltZTtcbiAgICB9XG5cbiAgICBfYXV0b0RlbGV0ZTogYm9vbGVhbjsgLy8g6Ieq5YuV5YmK6ZmkXG4gICAgX21vdGlvbjogQUN1YmlzbU1vdGlvbjsgLy8g44Oi44O844K344On44OzXG5cbiAgICBfYXZhaWxhYmxlOiBib29sZWFuOyAvLyDmnInlirnljJbjg5Xjg6njgrBcbiAgICBfZmluaXNoZWQ6IGJvb2xlYW47IC8vIOe1guS6huODleODqeOCsFxuICAgIF9zdGFydGVkOiBib29sZWFuOyAvLyDplovlp4vjg5Xjg6njgrBcbiAgICBfc3RhcnRUaW1lU2Vjb25kczogbnVtYmVyOyAvLyDjg6Ljg7zjgrfjg6fjg7Plho3nlJ/plovlp4vmmYLliLtb56eSXVxuICAgIF9mYWRlSW5TdGFydFRpbWVTZWNvbmRzOiBudW1iZXI7IC8vIOODleOCp+ODvOODieOCpOODs+mWi+Wni+aZguWIu++8iOODq+ODvOODl+OBruaZguOBr+WIneWbnuOBruOBv++8iVvnp5JdXG4gICAgX2VuZFRpbWVTZWNvbmRzOiBudW1iZXI7IC8vIOe1guS6huS6iOWumuaZguWIu1vnp5JdXG4gICAgX3N0YXRlVGltZVNlY29uZHM6IG51bWJlcjsgLy8g5pmC5Yi744Gu54q25oWLW+enkl1cbiAgICBfc3RhdGVXZWlnaHQ6IG51bWJlcjsgLy8g6YeN44G/44Gu54q25oWLXG4gICAgX2xhc3RFdmVudENoZWNrU2Vjb25kczogbnVtYmVyOyAvLyDmnIDntYLjga5Nb3Rpb27lgbTjga7jg4Hjgqfjg4Pjgq/jgZfjgZ/mmYLplpNcblxuICAgIF9tb3Rpb25RdWV1ZUVudHJ5SGFuZGxlOiBDdWJpc21Nb3Rpb25RdWV1ZUVudHJ5SGFuZGxlOyAvLyDjgqTjg7Pjgrnjgr/jg7PjgrnjgZTjgajjgavkuIDmhI/jga7lgKTjgpLmjIHjgaTorZjliKXnlarlj7dcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1hdGggfSBmcm9tICcuL2N1YmlzbW1hdGgnO1xuaW1wb3J0IEN1YmlzbU1hdGggPSBjdWJpc21tYXRoLkN1YmlzbU1hdGg7XG5cbmV4cG9ydCBuYW1lc3BhY2UgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIHtcbiAgY29uc3QgRnJhbWVSYXRlID0gMzA7XG4gIGNvbnN0IEVwc2lsb24gPSAwLjAxO1xuXG4gIC8qKlxuICAgKiDpoZTjga7lkJHjgY3jga7liLblvqHmqZ/og71cbiAgICpcbiAgICog6aGU44Gu5ZCR44GN44Gu5Yi25b6h5qmf6IO944KS5o+Q5L6b44GZ44KL44Kv44Op44K544CCXG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtVGFyZ2V0UG9pbnQge1xuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuX2ZhY2VUYXJnZXRYID0gMC4wO1xuICAgICAgdGhpcy5fZmFjZVRhcmdldFkgPSAwLjA7XG4gICAgICB0aGlzLl9mYWNlWCA9IDAuMDtcbiAgICAgIHRoaXMuX2ZhY2VZID0gMC4wO1xuICAgICAgdGhpcy5fZmFjZVZYID0gMC4wO1xuICAgICAgdGhpcy5fZmFjZVZZID0gMC4wO1xuICAgICAgdGhpcy5fbGFzdFRpbWVTZWNvbmRzID0gMC4wO1xuICAgICAgdGhpcy5fdXNlclRpbWVTZWNvbmRzID0gMC4wO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOabtOaWsOWHpueQhlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGUoZGVsdGFUaW1lU2Vjb25kczogbnVtYmVyKTogdm9pZCB7XG4gICAgICAvLyDjg4fjg6vjgr/mmYLplpPjgpLliqDnrpfjgZnjgotcbiAgICAgIHRoaXMuX3VzZXJUaW1lU2Vjb25kcyArPSBkZWx0YVRpbWVTZWNvbmRzO1xuXG4gICAgICAvLyDpppbjgpLkuK3lpK7jgYvjgonlt6blj7PjgavmjK/jgovjgajjgY3jga7lubPlnYfnmoTjgarpgJ/jgZXjga8g56eS6YCf5bqm44CC5Yqg6YCf44O75rib6YCf44KS6ICD5oWu44GX44Gm44CB44Gd44Gu77yS5YCN44KS5pyA6auY6YCf5bqm44Go44GZ44KLXG4gICAgICAvLyDpoZTjga7mjK/jgorlhbflkIjjgpLjgIHkuK3lpK7vvIgwLjDvvInjgYvjgonjgIHlt6blj7Pjga/vvIgrLTEuMO+8ieOBqOOBmeOCi1xuICAgICAgY29uc3QgZmFjZVBhcmFtTWF4VjogbnVtYmVyID0gNDAuMCAvIDEwLjA7IC8vIDcuNeenkumWk+OBqzQw5YiG56e75YuVKDUuMy9zYylcbiAgICAgIGNvbnN0IG1heFY6IG51bWJlciA9IChmYWNlUGFyYW1NYXhWICogMS4wKSAvIEZyYW1lUmF0ZTsgLy8gMWZyYW1l44GC44Gf44KK44Gr5aSJ5YyW44Gn44GN44KL6YCf5bqm44Gu5LiK6ZmQXG5cbiAgICAgIGlmICh0aGlzLl9sYXN0VGltZVNlY29uZHMgPT0gMC4wKSB7XG4gICAgICAgIHRoaXMuX2xhc3RUaW1lU2Vjb25kcyA9IHRoaXMuX3VzZXJUaW1lU2Vjb25kcztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWx0YVRpbWVXZWlnaHQ6IG51bWJlciA9XG4gICAgICAgICh0aGlzLl91c2VyVGltZVNlY29uZHMgLSB0aGlzLl9sYXN0VGltZVNlY29uZHMpICogRnJhbWVSYXRlO1xuICAgICAgdGhpcy5fbGFzdFRpbWVTZWNvbmRzID0gdGhpcy5fdXNlclRpbWVTZWNvbmRzO1xuXG4gICAgICAvLyDmnIDpq5jpgJ/luqbjgavjgarjgovjgb7jgafjga7mmYLplpPjgpJcbiAgICAgIGNvbnN0IHRpbWVUb01heFNwZWVkID0gMC4xNTtcbiAgICAgIGNvbnN0IGZyYW1lVG9NYXhTcGVlZDogbnVtYmVyID0gdGltZVRvTWF4U3BlZWQgKiBGcmFtZVJhdGU7IC8vIHNlYyAqIGZyYW1lL3NlY1xuICAgICAgY29uc3QgbWF4QTogbnVtYmVyID0gKGRlbHRhVGltZVdlaWdodCAqIG1heFYpIC8gZnJhbWVUb01heFNwZWVkOyAvLyAxZnJhbWXjgYLjgZ/jgorjga7liqDpgJ/luqZcblxuICAgICAgLy8g55uu5oyH44GZ5ZCR44GN44Gv44CB77yIZHgsIGR577yJ5pa55ZCR44Gu44OZ44Kv44OI44Or44Go44Gq44KLXG4gICAgICBjb25zdCBkeDogbnVtYmVyID0gdGhpcy5fZmFjZVRhcmdldFggLSB0aGlzLl9mYWNlWDtcbiAgICAgIGNvbnN0IGR5OiBudW1iZXIgPSB0aGlzLl9mYWNlVGFyZ2V0WSAtIHRoaXMuX2ZhY2VZO1xuXG4gICAgICBpZiAoQ3ViaXNtTWF0aC5hYnMoZHgpIDw9IEVwc2lsb24gJiYgQ3ViaXNtTWF0aC5hYnMoZHkpIDw9IEVwc2lsb24pIHtcbiAgICAgICAgcmV0dXJuOyAvLyDlpInljJbjgarjgZdcbiAgICAgIH1cblxuICAgICAgLy8g6YCf5bqm44Gu5pyA5aSn44KI44KK44KC5aSn44GN44GE5aC05ZCI44Gv44CB6YCf5bqm44KS6JC944Go44GZXG4gICAgICBjb25zdCBkOiBudW1iZXIgPSBDdWJpc21NYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuXG4gICAgICAvLyDpgLLooYzmlrnlkJHjga7mnIDlpKfpgJ/luqbjg5njgq/jg4jjg6tcbiAgICAgIGNvbnN0IHZ4OiBudW1iZXIgPSAobWF4ViAqIGR4KSAvIGQ7XG4gICAgICBjb25zdCB2eTogbnVtYmVyID0gKG1heFYgKiBkeSkgLyBkO1xuXG4gICAgICAvLyDnj77lnKjjga7pgJ/luqbjgYvjgonjgIHmlrDopo/pgJ/luqbjgbjjga7lpInljJbvvIjliqDpgJ/luqbvvInjgpLmsYLjgoHjgotcbiAgICAgIGxldCBheDogbnVtYmVyID0gdnggLSB0aGlzLl9mYWNlVlg7XG4gICAgICBsZXQgYXk6IG51bWJlciA9IHZ5IC0gdGhpcy5fZmFjZVZZO1xuXG4gICAgICBjb25zdCBhOiBudW1iZXIgPSBDdWJpc21NYXRoLnNxcnQoYXggKiBheCArIGF5ICogYXkpO1xuXG4gICAgICAvLyDliqDpgJ/jga7jgajjgY1cbiAgICAgIGlmIChhIDwgLW1heEEgfHwgYSA+IG1heEEpIHtcbiAgICAgICAgYXggKj0gbWF4QSAvIGE7XG4gICAgICAgIGF5ICo9IG1heEEgLyBhO1xuICAgICAgfVxuXG4gICAgICAvLyDliqDpgJ/luqbjgpLlhYPjga7pgJ/luqbjgavotrPjgZfjgabjgIHmlrDpgJ/luqbjgajjgZnjgotcbiAgICAgIHRoaXMuX2ZhY2VWWCArPSBheDtcbiAgICAgIHRoaXMuX2ZhY2VWWSArPSBheTtcblxuICAgICAgLy8g55uu55qE44Gu5pa55ZCR44Gr6L+R44Gl44GE44Gf44Go44GN44CB5ruR44KJ44GL44Gr5rib6YCf44GZ44KL44Gf44KB44Gu5Yem55CGXG4gICAgICAvLyDoqK3lrprjgZXjgozjgZ/liqDpgJ/luqbjgafmraLjgb7jgovkuovjga7lh7rmnaXjgovot53pm6LjgajpgJ/luqbjga7plqLkv4LjgYvjgolcbiAgICAgIC8vIOePvuWcqOOBqOOCiuOBhuOCi+acgOmrmOmAn+W6puOCkuioiOeul+OBl+OAgeOBneOCjOS7peS4iuOBruaZguOBr+mAn+W6puOCkuiQveOBqOOBmVxuICAgICAgLy8g4oC75pys5p2l44CB5Lq66ZaT44Gv562L5Yqb44Gn5Yqb77yI5Yqg6YCf5bqm77yJ44KS6Kq/5pW044Gn44GN44KL44Gf44KB44CB44KI44KK6Ieq55Sx5bqm44GM6auY44GE44GM44CB57Ch5Y2Y44Gq5Yem55CG44Gn5riI44G+44Gb44Gm44GE44KLXG4gICAgICB7XG4gICAgICAgIC8vIOWKoOmAn+W6puOAgemAn+W6puOAgei3nembouOBrumWouS/guW8j+OAglxuICAgICAgICAvLyAgICAgICAgICAgIDIgIDYgICAgICAgICAgIDIgICAgICAgICAgICAgICAzXG4gICAgICAgIC8vICAgICAgc3FydChhICB0ICArIDE2IGEgaCB0ICAtIDggYSBoKSAtIGEgdFxuICAgICAgICAvLyB2ID0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIDQgdCAgLSAyXG4gICAgICAgIC8vICh0PTEpXG4gICAgICAgIC8vIFx05pmC5Yi7dOOBr+OAgeOBguOCieOBi+OBmOOCgeWKoOmAn+W6puOAgemAn+W6puOCkjEvNjAo44OV44Os44O844Og44Os44O844OI44CB5Y2Y5L2N44Gq44GXKeOBp1xuICAgICAgICAvLyBcdOiAg+OBiOOBpuOBhOOCi+OBruOBp+OAgXTvvJ3vvJHjgajjgZfjgabmtojjgZfjgabjgojjgYTvvIjigLvmnKrmpJzoqLzvvIlcblxuICAgICAgICBjb25zdCBtYXhWOiBudW1iZXIgPVxuICAgICAgICAgIDAuNSAqXG4gICAgICAgICAgKEN1YmlzbU1hdGguc3FydChtYXhBICogbWF4QSArIDE2LjAgKiBtYXhBICogZCAtIDguMCAqIG1heEEgKiBkKSAtXG4gICAgICAgICAgICBtYXhBKTtcbiAgICAgICAgY29uc3QgY3VyVjogbnVtYmVyID0gQ3ViaXNtTWF0aC5zcXJ0KFxuICAgICAgICAgIHRoaXMuX2ZhY2VWWCAqIHRoaXMuX2ZhY2VWWCArIHRoaXMuX2ZhY2VWWSAqIHRoaXMuX2ZhY2VWWVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjdXJWID4gbWF4Vikge1xuICAgICAgICAgIC8vIOePvuWcqOOBrumAn+W6piA+IOacgOmrmOmAn+W6puOBruOBqOOBjeOAgeacgOmrmOmAn+W6puOBvuOBp+a4m+mAn1xuICAgICAgICAgIHRoaXMuX2ZhY2VWWCAqPSBtYXhWIC8gY3VyVjtcbiAgICAgICAgICB0aGlzLl9mYWNlVlkgKj0gbWF4ViAvIGN1clY7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fZmFjZVggKz0gdGhpcy5fZmFjZVZYO1xuICAgICAgdGhpcy5fZmFjZVkgKz0gdGhpcy5fZmFjZVZZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFjou7jjga7poZTjga7lkJHjgY3jga7lgKTjgpLlj5blvpdcbiAgICAgKlxuICAgICAqIEByZXR1cm4gWOi7uOOBrumhlOOBruWQkeOBjeOBruWApO+8iC0xLjAgfiAxLjDvvIlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0WCgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZhY2VYO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFnou7jjga7poZTjga7lkJHjgY3jga7lgKTjgpLlj5blvpdcbiAgICAgKlxuICAgICAqIEByZXR1cm4gWei7uOOBrumhlOOBruWQkeOBjeOBruWApO+8iC0xLjAgfiAxLjDvvIlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0WSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZhY2VZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmhlOOBruWQkeOBjeOBruebruaomeWApOOCkuioreWumlxuICAgICAqXG4gICAgICogQHBhcmFtIHggWOi7uOOBrumhlOOBruWQkeOBjeOBruWApO+8iC0xLjAgfiAxLjDvvIlcbiAgICAgKiBAcGFyYW0geSBZ6Lu444Gu6aGU44Gu5ZCR44GN44Gu5YCk77yILTEuMCB+IDEuMO+8iVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHRoaXMuX2ZhY2VUYXJnZXRYID0geDtcbiAgICAgIHRoaXMuX2ZhY2VUYXJnZXRZID0geTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9mYWNlVGFyZ2V0WDogbnVtYmVyOyAvLyDpoZTjga7lkJHjgY3jga5Y55uu5qiZ5YCk77yI44GT44Gu5YCk44Gr6L+R44Gl44GE44Gm44GE44GP77yJXG4gICAgcHJpdmF0ZSBfZmFjZVRhcmdldFk6IG51bWJlcjsgLy8g6aGU44Gu5ZCR44GN44GuWeebruaomeWApO+8iOOBk+OBruWApOOBq+i/keOBpeOBhOOBpuOBhOOBj++8iVxuICAgIHByaXZhdGUgX2ZhY2VYOiBudW1iZXI7IC8vIOmhlOOBruWQkeOBjVjvvIgtMS4wIH4gMS4w77yJXG4gICAgcHJpdmF0ZSBfZmFjZVk6IG51bWJlcjsgLy8g6aGU44Gu5ZCR44GNWe+8iC0xLjAgfiAxLjDvvIlcbiAgICBwcml2YXRlIF9mYWNlVlg6IG51bWJlcjsgLy8g6aGU44Gu5ZCR44GN44Gu5aSJ5YyW6YCf5bqmWFxuICAgIHByaXZhdGUgX2ZhY2VWWTogbnVtYmVyOyAvLyDpoZTjga7lkJHjgY3jga7lpInljJbpgJ/luqZZXG4gICAgcHJpdmF0ZSBfbGFzdFRpbWVTZWNvbmRzOiBudW1iZXI7IC8vIOacgOW+jOOBruWun+ihjOaZgumWk1vnp5JdXG4gICAgcHJpdmF0ZSBfdXNlclRpbWVTZWNvbmRzOiBudW1iZXI7IC8vIOODh+ODq+OCv+aZgumWk+OBruepjeeul+WApFvnp5JdXG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGhlIExpdmUyRCBPcGVuIFNvZnR3YXJlIGxpY2Vuc2VcbiAqIHRoYXQgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmxpdmUyZC5jb20vZXVsYS9saXZlMmQtb3Blbi1zb2Z0d2FyZS1saWNlbnNlLWFncmVlbWVudF9lbi5odG1sLlxuICovXG5cbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjc21tYXAgfSBmcm9tICcuLi90eXBlL2NzbW1hcCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtbWF0cml4NDQgfSBmcm9tICcuL2N1YmlzbW1hdHJpeDQ0JztcbmltcG9ydCBjc21NYXAgPSBjc21tYXAuY3NtTWFwO1xuaW1wb3J0IGl0ZXJhdG9yID0gY3NtbWFwLml0ZXJhdG9yO1xuaW1wb3J0IEN1YmlzbU1hdHJpeDQ0ID0gY3ViaXNtbWF0cml4NDQuQ3ViaXNtTWF0cml4NDQ7XG5cbmV4cG9ydCBuYW1lc3BhY2UgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIHtcbiAgLyoqXG4gICAqIOODouODh+ODq+W6p+aomeioreWumueUqOOBrjR4NOihjOWIl1xuICAgKlxuICAgKiDjg6Ljg4fjg6vluqfmqJnoqK3lrprnlKjjga40eDTooYzliJfjgq/jg6njgrlcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBDdWJpc21Nb2RlbE1hdHJpeCBleHRlbmRzIEN1YmlzbU1hdHJpeDQ0IHtcbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3IOaoquW5hVxuICAgICAqIEBwYXJhbSBoIOe4puW5hVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHc/OiBudW1iZXIsIGg/OiBudW1iZXIpIHtcbiAgICAgIHN1cGVyKCk7XG5cbiAgICAgIHRoaXMuX3dpZHRoID0gdyAhPT0gdW5kZWZpbmVkID8gdyA6IDAuMDtcbiAgICAgIHRoaXMuX2hlaWdodCA9IGggIT09IHVuZGVmaW5lZCA/IGggOiAwLjA7XG4gICAgICB0aGlzLnNldEhlaWdodCgyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmqKrluYXjgpLoqK3lrppcbiAgICAgKlxuICAgICAqIEBwYXJhbSB3IOaoquW5hVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRXaWR0aCh3OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHNjYWxlWDogbnVtYmVyID0gdyAvIHRoaXMuX3dpZHRoO1xuICAgICAgY29uc3Qgc2NhbGVZOiBudW1iZXIgPSBzY2FsZVg7XG4gICAgICB0aGlzLnNjYWxlKHNjYWxlWCwgc2NhbGVZICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog57im5bmF44KS6Kit5a6aXG4gICAgICogQHBhcmFtIGgg57im5bmFXG4gICAgICovXG4gICAgcHVibGljIHNldEhlaWdodChoOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHNjYWxlWDogbnVtYmVyID0gaCAvIHRoaXMuX2hlaWdodDtcbiAgICAgIGNvbnN0IHNjYWxlWTogbnVtYmVyID0gc2NhbGVYO1xuICAgICAgdGhpcy5zY2FsZShzY2FsZVgsIHNjYWxlWSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5L2N572u44KS6Kit5a6aXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBY6Lu444Gu5L2N572uXG4gICAgICogQHBhcmFtIHkgWei7uOOBruS9jee9rlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy50cmFuc2xhdGUoeCwgeSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Lit5b+D5L2N572u44KS6Kit5a6aXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBY6Lu444Gu5Lit5b+D5L2N572uXG4gICAgICogQHBhcmFtIHkgWei7uOOBruS4reW/g+S9jee9rlxuICAgICAqXG4gICAgICogQG5vdGUgd2lkdGjjgYtoZWlnaHTjgpLoqK3lrprjgZfjgZ/jgYLjgajjgafjgarjgYTjgajjgIHmi6HlpKfnjofjgYzmraPjgZfjgY/lj5blvpfjgafjgY3jgarjgYTjgZ/jgoHjgZrjgozjgovjgIJcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Q2VudGVyUG9zaXRpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICAgIHRoaXMuY2VudGVyWCh4KTtcbiAgICAgIHRoaXMuY2VudGVyWSh5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDkuIrovrrjga7kvY3nva7jgpLoqK3lrprjgZnjgotcbiAgICAgKlxuICAgICAqIEBwYXJhbSB5IOS4iui+uuOBrlnou7jkvY3nva5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9wKHk6IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy5zZXRZKHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS4i+i+uuOBruS9jee9ruOCkuioreWumuOBmeOCi1xuICAgICAqXG4gICAgICogQHBhcmFtIHkg5LiL6L6644GuWei7uOS9jee9rlxuICAgICAqL1xuICAgIHB1YmxpYyBib3R0b20oeTogbnVtYmVyKSB7XG4gICAgICBjb25zdCBoOiBudW1iZXIgPSB0aGlzLl9oZWlnaHQgKiB0aGlzLmdldFNjYWxlWSgpO1xuXG4gICAgICB0aGlzLnRyYW5zbGF0ZVkoeSAtIGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOW3pui+uuOBruS9jee9ruOCkuioreWumlxuICAgICAqXG4gICAgICogQHBhcmFtIHgg5bem6L6644GuWOi7uOS9jee9rlxuICAgICAqL1xuICAgIHB1YmxpYyBsZWZ0KHg6IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy5zZXRYKHgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWPs+i+uuOBruS9jee9ruOCkuioreWumlxuICAgICAqXG4gICAgICogQHBhcmFtIHgg5Y+z6L6644GuWOi7uOS9jee9rlxuICAgICAqL1xuICAgIHB1YmxpYyByaWdodCh4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHcgPSB0aGlzLl93aWR0aCAqIHRoaXMuZ2V0U2NhbGVYKCk7XG5cbiAgICAgIHRoaXMudHJhbnNsYXRlWCh4IC0gdyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWOi7uOOBruS4reW/g+S9jee9ruOCkuioreWumlxuICAgICAqXG4gICAgICogQHBhcmFtIHggWOi7uOOBruS4reW/g+S9jee9rlxuICAgICAqL1xuICAgIHB1YmxpYyBjZW50ZXJYKHg6IG51bWJlcik6IHZvaWQge1xuICAgICAgY29uc3QgdyA9IHRoaXMuX3dpZHRoICogdGhpcy5nZXRTY2FsZVgoKTtcblxuICAgICAgdGhpcy50cmFuc2xhdGVYKHggLSB3IC8gMi4wKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBY6Lu444Gu5L2N572u44KS6Kit5a6aXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBY6Lu444Gu5L2N572uXG4gICAgICovXG4gICAgcHVibGljIHNldFgoeDogbnVtYmVyKTogdm9pZCB7XG4gICAgICB0aGlzLnRyYW5zbGF0ZVgoeCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWei7uOOBruS4reW/g+S9jee9ruOCkuioreWumlxuICAgICAqXG4gICAgICogQHBhcmFtIHkgWei7uOOBruS4reW/g+S9jee9rlxuICAgICAqL1xuICAgIHB1YmxpYyBjZW50ZXJZKHk6IG51bWJlcik6IHZvaWQge1xuICAgICAgY29uc3QgaDogbnVtYmVyID0gdGhpcy5faGVpZ2h0ICogdGhpcy5nZXRTY2FsZVkoKTtcblxuICAgICAgdGhpcy50cmFuc2xhdGVZKHkgLSBoIC8gMi4wKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBZ6Lu444Gu5L2N572u44KS6Kit5a6a44GZ44KLXG4gICAgICpcbiAgICAgKiBAcGFyYW0geSBZ6Lu444Gu5L2N572uXG4gICAgICovXG4gICAgcHVibGljIHNldFkoeTogbnVtYmVyKTogdm9pZCB7XG4gICAgICB0aGlzLnRyYW5zbGF0ZVkoeSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Os44Kk44Ki44Km44OI5oOF5aCx44GL44KJ5L2N572u44KS6Kit5a6aXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGF5b3V0IOODrOOCpOOCouOCpuODiOaDheWgsVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXR1cEZyb21MYXlvdXQobGF5b3V0OiBjc21NYXA8c3RyaW5nLCBudW1iZXI+KTogdm9pZCB7XG4gICAgICBjb25zdCBrZXlXaWR0aCA9ICd3aWR0aCc7XG4gICAgICBjb25zdCBrZXlIZWlnaHQgPSAnaGVpZ2h0JztcbiAgICAgIGNvbnN0IGtleVggPSAneCc7XG4gICAgICBjb25zdCBrZXlZID0gJ3knO1xuICAgICAgY29uc3Qga2V5Q2VudGVyWCA9ICdjZW50ZXJfeCc7XG4gICAgICBjb25zdCBrZXlDZW50ZXJZID0gJ2NlbnRlcl95JztcbiAgICAgIGNvbnN0IGtleVRvcCA9ICd0b3AnO1xuICAgICAgY29uc3Qga2V5Qm90dG9tID0gJ2JvdHRvbSc7XG4gICAgICBjb25zdCBrZXlMZWZ0ID0gJ2xlZnQnO1xuICAgICAgY29uc3Qga2V5UmlnaHQgPSAncmlnaHQnO1xuXG4gICAgICBmb3IgKFxuICAgICAgICBjb25zdCBpdGU6IGl0ZXJhdG9yPHN0cmluZywgbnVtYmVyPiA9IGxheW91dC5iZWdpbigpO1xuICAgICAgICBpdGUubm90RXF1YWwobGF5b3V0LmVuZCgpKTtcbiAgICAgICAgaXRlLnByZUluY3JlbWVudCgpXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qga2V5OiBzdHJpbmcgPSBpdGUucHRyKCkuZmlyc3Q7XG4gICAgICAgIGNvbnN0IHZhbHVlOiBudW1iZXIgPSBpdGUucHRyKCkuc2Vjb25kO1xuXG4gICAgICAgIGlmIChrZXkgPT0ga2V5V2lkdGgpIHtcbiAgICAgICAgICB0aGlzLnNldFdpZHRoKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0ga2V5SGVpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5zZXRIZWlnaHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoXG4gICAgICAgIGNvbnN0IGl0ZTogaXRlcmF0b3I8c3RyaW5nLCBudW1iZXI+ID0gbGF5b3V0LmJlZ2luKCk7XG4gICAgICAgIGl0ZS5ub3RFcXVhbChsYXlvdXQuZW5kKCkpO1xuICAgICAgICBpdGUucHJlSW5jcmVtZW50KClcbiAgICAgICkge1xuICAgICAgICBjb25zdCBrZXk6IHN0cmluZyA9IGl0ZS5wdHIoKS5maXJzdDtcbiAgICAgICAgY29uc3QgdmFsdWU6IG51bWJlciA9IGl0ZS5wdHIoKS5zZWNvbmQ7XG5cbiAgICAgICAgaWYgKGtleSA9PSBrZXlYKSB7XG4gICAgICAgICAgdGhpcy5zZXRYKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0ga2V5WSkge1xuICAgICAgICAgIHRoaXMuc2V0WSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09IGtleUNlbnRlclgpIHtcbiAgICAgICAgICB0aGlzLmNlbnRlclgodmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PSBrZXlDZW50ZXJZKSB7XG4gICAgICAgICAgdGhpcy5jZW50ZXJZKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0ga2V5VG9wKSB7XG4gICAgICAgICAgdGhpcy50b3AodmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PSBrZXlCb3R0b20pIHtcbiAgICAgICAgICB0aGlzLmJvdHRvbSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09IGtleUxlZnQpIHtcbiAgICAgICAgICB0aGlzLmxlZnQodmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PSBrZXlSaWdodCkge1xuICAgICAgICAgIHRoaXMucmlnaHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfd2lkdGg6IG51bWJlcjsgLy8g5qiq5bmFXG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXI7IC8vIOe4puW5hVxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRoZSBMaXZlMkQgT3BlbiBTb2Z0d2FyZSBsaWNlbnNlXG4gKiB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5saXZlMmQuY29tL2V1bGEvbGl2ZTJkLW9wZW4tc29mdHdhcmUtbGljZW5zZS1hZ3JlZW1lbnRfZW4uaHRtbC5cbiAqL1xuXG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtbW9kZWwgfSBmcm9tICcuL2N1YmlzbW1vZGVsJztcbmltcG9ydCBDdWJpc21Nb2RlbCA9IGN1YmlzbW1vZGVsLkN1YmlzbU1vZGVsO1xuaW1wb3J0IHsgQ1NNX0FTU0VSVCB9IGZyb20gJy4uL3V0aWxzL2N1YmlzbWRlYnVnJztcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvKipcbiAgICogTW9j5pWw5o2u55qE566h55CGXG4gICAqXG4gICAqIOeuoeeQhk1vY+aVsOaNrueahOexu+OAglxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbU1vYyB7XG4gICAgLyoqXG4gICAgICog5Yib5bu6TW9j5pWw5o2uXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUobW9jQnl0ZXM6IEFycmF5QnVmZmVyKTogQ3ViaXNtTW9jIHtcbiAgICAgIGxldCBjdWJpc21Nb2M6IEN1YmlzbU1vYyA9IG51bGw7XG4gICAgICBjb25zdCBtb2M6IExpdmUyREN1YmlzbUNvcmUuTW9jID0gTGl2ZTJEQ3ViaXNtQ29yZS5Nb2MuZnJvbUFycmF5QnVmZmVyKFxuICAgICAgICBtb2NCeXRlc1xuICAgICAgKTtcblxuICAgICAgaWYgKG1vYykge1xuICAgICAgICBjdWJpc21Nb2MgPSBuZXcgQ3ViaXNtTW9jKG1vYyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdWJpc21Nb2M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yig6ZmkTW9j5pWw5o2uXG4gICAgICpcbiAgICAgKiBNb2Pjg4fjg7zjgr/jgpLliYrpmaTjgZnjgotcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGRlbGV0ZShtb2M6IEN1YmlzbU1vYyk6IHZvaWQge1xuICAgICAgbW9jLl9tb2MuX3JlbGVhc2UoKTtcbiAgICAgIG1vYy5fbW9jID0gbnVsbDtcbiAgICAgIG1vYyA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yib5bu65LiA5Liq5qih5Z6L44CCXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIOeUsU1vY+aVsOaNruWIm+W7uueahOaooeWei1xuICAgICAqL1xuICAgIGNyZWF0ZU1vZGVsKCk6IEN1YmlzbU1vZGVsIHtcbiAgICAgIGxldCBjdWJpc21Nb2RlbDogQ3ViaXNtTW9kZWwgPSBudWxsO1xuXG4gICAgICBjb25zdCBtb2RlbDogTGl2ZTJEQ3ViaXNtQ29yZS5Nb2RlbCA9IExpdmUyREN1YmlzbUNvcmUuTW9kZWwuZnJvbU1vYyhcbiAgICAgICAgdGhpcy5fbW9jXG4gICAgICApO1xuXG4gICAgICBpZiAobW9kZWwpIHtcbiAgICAgICAgY3ViaXNtTW9kZWwgPSBuZXcgQ3ViaXNtTW9kZWwobW9kZWwpO1xuICAgICAgICBjdWJpc21Nb2RlbC5pbml0aWFsaXplKCk7XG5cbiAgICAgICAgKyt0aGlzLl9tb2RlbENvdW50O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3ViaXNtTW9kZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44OH44Or44KS5YmK6Zmk44GZ44KLXG4gICAgICog5Yig6Zmk5qih5Z6L44CCXG4gICAgICovXG4gICAgZGVsZXRlTW9kZWwobW9kZWw6IEN1YmlzbU1vZGVsKTogdm9pZCB7XG4gICAgICBpZiAobW9kZWwgIT0gbnVsbCkge1xuICAgICAgICBtb2RlbC5yZWxlYXNlKCk7XG4gICAgICAgIG1vZGVsID0gbnVsbDtcbiAgICAgICAgLS10aGlzLl9tb2RlbENvdW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaehOmAoOWHveaVsFxuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IobW9jOiBMaXZlMkRDdWJpc21Db3JlLk1vYykge1xuICAgICAgdGhpcy5fbW9jID0gbW9jO1xuICAgICAgdGhpcy5fbW9kZWxDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OH44K544OI44Op44Kv44K/55u45b2T44Gu5Yem55CGXG4gICAgICog55u45b2T5LqO5p6Q5p6E5Ye95pWw55qE5aSE55CGXG4gICAgICovXG4gICAgcHVibGljIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgICBDU01fQVNTRVJUKHRoaXMuX21vZGVsQ291bnQgPT0gMCk7XG5cbiAgICAgIHRoaXMuX21vYy5fcmVsZWFzZSgpO1xuICAgICAgdGhpcy5fbW9jID0gbnVsbDtcbiAgICB9XG5cbiAgICBfbW9jOiBMaXZlMkRDdWJpc21Db3JlLk1vYzsgLy8gTW9j5pWw5o2uLlxuICAgIF9tb2RlbENvdW50OiBudW1iZXI7IC8vIOeUsU1vY+aVsOaNruWIm+W7uueahOaooeWei+eahOaVsOmHj1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRoZSBMaXZlMkQgT3BlbiBTb2Z0d2FyZSBsaWNlbnNlXG4gKiB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5saXZlMmQuY29tL2V1bGEvbGl2ZTJkLW9wZW4tc29mdHdhcmUtbGljZW5zZS1hZ3JlZW1lbnRfZW4uaHRtbC5cbiAqL1xuXG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtcmVuZGVyZXIgfSBmcm9tICcuLi9yZW5kZXJpbmcvY3ViaXNtcmVuZGVyZXInO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWlkIH0gZnJvbSAnLi4vaWQvY3ViaXNtaWQnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWZyYW1ld29yayB9IGZyb20gJy4uL2xpdmUyZGN1YmlzbWZyYW1ld29yayc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3NtbWFwIH0gZnJvbSAnLi4vdHlwZS9jc21tYXAnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGNzbXZlY3RvciB9IGZyb20gJy4uL3R5cGUvY3NtdmVjdG9yJztcbmltcG9ydCB7IENTTV9BU1NFUlQgfSBmcm9tICcuLi91dGlscy9jdWJpc21kZWJ1Zyc7XG5pbXBvcnQgQ3ViaXNtRnJhbWV3b3JrID0gY3ViaXNtZnJhbWV3b3JrLkN1YmlzbUZyYW1ld29yaztcbmltcG9ydCBDdWJpc21CbGVuZE1vZGUgPSBjdWJpc21yZW5kZXJlci5DdWJpc21CbGVuZE1vZGU7XG5pbXBvcnQgY3NtVmVjdG9yID0gY3NtdmVjdG9yLmNzbVZlY3RvcjtcbmltcG9ydCBjc21NYXAgPSBjc21tYXAuY3NtTWFwO1xuaW1wb3J0IEN1YmlzbUlkSGFuZGxlID0gY3ViaXNtaWQuQ3ViaXNtSWRIYW5kbGU7XG5cbmV4cG9ydCBuYW1lc3BhY2UgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIHtcbiAgLyoqXG4gICAqIOODouODh+ODq1xuICAgKlxuICAgKiBNb2Pjg4fjg7zjgr/jgYvjgonnlJ/miJDjgZXjgozjgovjg6Ljg4fjg6vjga7jgq/jg6njgrnjgIJcbiAgICog5qC55o2uTW9j5pWw5o2u55Sf5oiQ55qE5qih5Z6L55qE57G75Yir44CCXG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtTW9kZWwge1xuICAgIC8qKlxuICAgICAqIOODouODh+ODq+OBruODkeODqeODoeODvOOCv+OBruabtOaWsFxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGUoKTogdm9pZCB7XG4gICAgICAvLyBVcGRhdGUgbW9kZWxcbiAgICAgIHRoaXMuX21vZGVsLnVwZGF0ZSgpO1xuXG4gICAgICB0aGlzLl9tb2RlbC5kcmF3YWJsZXMucmVzZXREeW5hbWljRmxhZ3MoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgq3jg6Pjg7Pjg5Djgrnjga7luYXjgpLlj5blvpfjgZnjgotcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2FudmFzV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgIGlmICh0aGlzLl9tb2RlbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwLjA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuX21vZGVsLmNhbnZhc2luZm8uQ2FudmFzV2lkdGggL1xuICAgICAgICB0aGlzLl9tb2RlbC5jYW52YXNpbmZvLlBpeGVsc1BlclVuaXRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kt44Oj44Oz44OQ44K544Gu6auY44GV44KS5Y+W5b6X44GZ44KLXG4gICAgICovXG4gICAgcHVibGljIGdldENhbnZhc0hlaWdodCgpOiBudW1iZXIge1xuICAgICAgaWYgKHRoaXMuX21vZGVsID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDAuMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5fbW9kZWwuY2FudmFzaW5mby5DYW52YXNIZWlnaHQgL1xuICAgICAgICB0aGlzLl9tb2RlbC5jYW52YXNpbmZvLlBpeGVsc1BlclVuaXRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OR44Op44Oh44O844K/44KS5L+d5a2Y44GZ44KLXG4gICAgICovXG4gICAgcHVibGljIHNhdmVQYXJhbWV0ZXJzKCk6IHZvaWQge1xuICAgICAgY29uc3QgcGFyYW1ldGVyQ291bnQ6IG51bWJlciA9IHRoaXMuX21vZGVsLnBhcmFtZXRlcnMuY291bnQ7XG4gICAgICBjb25zdCBzYXZlZFBhcmFtZXRlckNvdW50OiBudW1iZXIgPSB0aGlzLl9zYXZlZFBhcmFtZXRlcnMuZ2V0U2l6ZSgpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtZXRlckNvdW50OyArK2kpIHtcbiAgICAgICAgaWYgKGkgPCBzYXZlZFBhcmFtZXRlckNvdW50KSB7XG4gICAgICAgICAgdGhpcy5fc2F2ZWRQYXJhbWV0ZXJzLnNldChpLCB0aGlzLl9wYXJhbWV0ZXJWYWx1ZXNbaV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3NhdmVkUGFyYW1ldGVycy5wdXNoQmFjayh0aGlzLl9wYXJhbWV0ZXJWYWx1ZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44OH44Or44KS5Y+W5b6XXG4gICAgICovXG4gICAgcHVibGljIGdldE1vZGVsKCk6IExpdmUyREN1YmlzbUNvcmUuTW9kZWwge1xuICAgICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODkeODvOODhOOBruOCpOODs+ODh+ODg+OCr+OCueOCkuWPluW+l1xuICAgICAqIEBwYXJhbSBwYXJ0SWQg44OR44O844OE44GuSURcbiAgICAgKiBAcmV0dXJuIOODkeODvOODhOOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYXJ0SW5kZXgocGFydElkOiBDdWJpc21JZEhhbmRsZSk6IG51bWJlciB7XG4gICAgICBsZXQgcGFydEluZGV4OiBudW1iZXI7XG4gICAgICBjb25zdCBwYXJ0Q291bnQ6IG51bWJlciA9IHRoaXMuX21vZGVsLnBhcnRzLmNvdW50O1xuXG4gICAgICBmb3IgKHBhcnRJbmRleCA9IDA7IHBhcnRJbmRleCA8IHBhcnRDb3VudDsgKytwYXJ0SW5kZXgpIHtcbiAgICAgICAgaWYgKHBhcnRJZCA9PSB0aGlzLl9wYXJ0SWRzLmF0KHBhcnRJbmRleCkpIHtcbiAgICAgICAgICByZXR1cm4gcGFydEluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOODouODh+ODq+OBq+WtmOWcqOOBl+OBpuOBhOOBquOBhOWgtOWQiOOAgemdnuWtmOWcqOODkeODvOODhElE44Oq44K544OI5YaF44Gr44GC44KL44GL44KS5qSc57Si44GX44CB44Gd44Gu44Kk44Oz44OH44OD44Kv44K544KS6L+U44GZXG4gICAgICBpZiAodGhpcy5fbm90RXhpc3RQYXJ0SWQuaXNFeGlzdChwYXJ0SWQpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ub3RFeGlzdFBhcnRJZC5nZXRWYWx1ZShwYXJ0SWQpO1xuICAgICAgfVxuXG4gICAgICAvLyDpnZ7lrZjlnKjjg5Hjg7zjg4RJROODquOCueODiOOBq+OBquOBhOWgtOWQiOOAgeaWsOOBl+OBj+imgee0oOOCkui/veWKoOOBmeOCi1xuICAgICAgcGFydEluZGV4ID0gcGFydENvdW50ICsgdGhpcy5fbm90RXhpc3RQYXJ0SWQuZ2V0U2l6ZSgpO1xuICAgICAgdGhpcy5fbm90RXhpc3RQYXJ0SWQuc2V0VmFsdWUocGFydElkLCBwYXJ0SW5kZXgpO1xuICAgICAgdGhpcy5fbm90RXhpc3RQYXJ0T3BhY2l0aWVzLmFwcGVuZEtleShwYXJ0SW5kZXgpO1xuXG4gICAgICByZXR1cm4gcGFydEluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODkeODvOODhOOBruWAi+aVsOOBruWPluW+l1xuICAgICAqIEByZXR1cm4g44OR44O844OE44Gu5YCL5pWwXG4gICAgICovXG4gICAgcHVibGljIGdldFBhcnRDb3VudCgpOiBudW1iZXIge1xuICAgICAgY29uc3QgcGFydENvdW50OiBudW1iZXIgPSB0aGlzLl9tb2RlbC5wYXJ0cy5jb3VudDtcbiAgICAgIHJldHVybiBwYXJ0Q291bnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OR44O844OE44Gu5LiN6YCP5piO5bqm44Gu6Kit5a6aKEluZGV4KVxuICAgICAqIEBwYXJhbSBwYXJ0SW5kZXgg44OR44O844OE44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHBhcmFtIG9wYWNpdHkg5LiN6YCP5piO5bqmXG4gICAgICovXG4gICAgcHVibGljIHNldFBhcnRPcGFjaXR5QnlJbmRleChwYXJ0SW5kZXg6IG51bWJlciwgb3BhY2l0eTogbnVtYmVyKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5fbm90RXhpc3RQYXJ0T3BhY2l0aWVzLmlzRXhpc3QocGFydEluZGV4KSkge1xuICAgICAgICB0aGlzLl9ub3RFeGlzdFBhcnRPcGFjaXRpZXMuc2V0VmFsdWUocGFydEluZGV4LCBvcGFjaXR5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyDjgqTjg7Pjg4fjg4Pjgq/jgrnjga7nr4Tlm7LlhoXmpJznn6VcbiAgICAgIENTTV9BU1NFUlQoMCA8PSBwYXJ0SW5kZXggJiYgcGFydEluZGV4IDwgdGhpcy5nZXRQYXJ0Q291bnQoKSk7XG5cbiAgICAgIHRoaXMuX3BhcnRPcGFjaXRpZXNbcGFydEluZGV4XSA9IG9wYWNpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OR44O844OE44Gu5LiN6YCP5piO5bqm44Gu6Kit5a6aKElkKVxuICAgICAqIEBwYXJhbSBwYXJ0SWQg44OR44O844OE44GuSURcbiAgICAgKiBAcGFyYW0gb3BhY2l0eSDjg5Hjg7zjg4Tjga7kuI3pgI/mmI7luqZcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UGFydE9wYWNpdHlCeUlkKHBhcnRJZDogQ3ViaXNtSWRIYW5kbGUsIG9wYWNpdHk6IG51bWJlcik6IHZvaWQge1xuICAgICAgLy8g6auY6YCf5YyW44Gu44Gf44KB44GrUGFydEluZGV444KS5Y+W5b6X44Gn44GN44KL5qmf5qeL44Gr44Gq44Gj44Gm44GE44KL44GM44CB5aSW6YOo44GL44KJ44Gu6Kit5a6a44Gu5pmC44Gv5ZG844Gz5Ye644GX6aC75bqm44GM5L2O44GE44Gf44KB5LiN6KaBXG4gICAgICBjb25zdCBpbmRleDogbnVtYmVyID0gdGhpcy5nZXRQYXJ0SW5kZXgocGFydElkKTtcblxuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICByZXR1cm47IC8vIOODkeODvOODhOOBjOOBquOBhOOBruOBp+OCueOCreODg+ODl1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldFBhcnRPcGFjaXR5QnlJbmRleChpbmRleCwgb3BhY2l0eSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OR44O844OE44Gu5LiN6YCP5piO5bqm44Gu5Y+W5b6XKGluZGV4KVxuICAgICAqIEBwYXJhbSBwYXJ0SW5kZXgg44OR44O844OE44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiDjg5Hjg7zjg4Tjga7kuI3pgI/mmI7luqZcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGFydE9wYWNpdHlCeUluZGV4KHBhcnRJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgIGlmICh0aGlzLl9ub3RFeGlzdFBhcnRPcGFjaXRpZXMuaXNFeGlzdChwYXJ0SW5kZXgpKSB7XG4gICAgICAgIC8vIOODouODh+ODq+OBq+WtmOWcqOOBl+OBquOBhOODkeODvOODhElE44Gu5aC05ZCI44CB6Z2e5a2Y5Zyo44OR44O844OE44Oq44K544OI44GL44KJ5LiN6YCP5piO5bqm44KS6L+U44GZ44CCXG4gICAgICAgIHJldHVybiB0aGlzLl9ub3RFeGlzdFBhcnRPcGFjaXRpZXMuZ2V0VmFsdWUocGFydEluZGV4KTtcbiAgICAgIH1cblxuICAgICAgLy8g44Kk44Oz44OH44OD44Kv44K544Gu56+E5Zuy5YaF5qSc55+lXG4gICAgICBDU01fQVNTRVJUKDAgPD0gcGFydEluZGV4ICYmIHBhcnRJbmRleCA8IHRoaXMuZ2V0UGFydENvdW50KCkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5fcGFydE9wYWNpdGllc1twYXJ0SW5kZXhdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODkeODvOODhOOBruS4jemAj+aYjuW6puOBruWPluW+lyhpZClcbiAgICAgKiBAcGFyYW0gcGFydElkIOODkeODvOODhOOBru+8qe+9hFxuICAgICAqIEByZXR1cm4g44OR44O844OE44Gu5LiN6YCP5piO5bqmXG4gICAgICovXG4gICAgcHVibGljIGdldFBhcnRPcGFjaXR5QnlJZChwYXJ0SWQ6IEN1YmlzbUlkSGFuZGxlKTogbnVtYmVyIHtcbiAgICAgIC8vIOmrmOmAn+WMluOBruOBn+OCgeOBq1BhcnRJbmRleOOCkuWPluW+l+OBp+OBjeOCi+apn+ani+OBq+OBquOBo+OBpuOBhOOCi+OBjOOAgeWklumDqOOBi+OCieOBruioreWumuOBruaZguOBr+WRvOOBs+WHuuOBl+mgu+W6puOBjOS9juOBhOOBn+OCgeS4jeimgVxuICAgICAgY29uc3QgaW5kZXg6IG51bWJlciA9IHRoaXMuZ2V0UGFydEluZGV4KHBhcnRJZCk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuIDA7IC8vIOODkeODvOODhOOBjOeEoeOBhOOBruOBp+OCueOCreODg+ODl1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5nZXRQYXJ0T3BhY2l0eUJ5SW5kZXgoaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODkeODqeODoeODvOOCv+OBruOCpOODs+ODh+ODg+OCr+OCueOBruWPluW+l1xuICAgICAqIEBwYXJhbSDjg5Hjg6njg6Hjg7zjgr9JRFxuICAgICAqIEByZXR1cm4g44OR44Op44Oh44O844K/44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICovXG4gICAgcHVibGljIGdldFBhcmFtZXRlckluZGV4KHBhcmFtZXRlcklkOiBDdWJpc21JZEhhbmRsZSk6IG51bWJlciB7XG4gICAgICBsZXQgcGFyYW1ldGVySW5kZXg6IG51bWJlcjtcbiAgICAgIGNvbnN0IGlkQ291bnQ6IG51bWJlciA9IHRoaXMuX21vZGVsLnBhcmFtZXRlcnMuY291bnQ7XG5cbiAgICAgIGZvciAocGFyYW1ldGVySW5kZXggPSAwOyBwYXJhbWV0ZXJJbmRleCA8IGlkQ291bnQ7ICsrcGFyYW1ldGVySW5kZXgpIHtcbiAgICAgICAgaWYgKHBhcmFtZXRlcklkICE9IHRoaXMuX3BhcmFtZXRlcklkcy5hdChwYXJhbWV0ZXJJbmRleCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJhbWV0ZXJJbmRleDtcbiAgICAgIH1cblxuICAgICAgLy8g44Oi44OH44Or44Gr5a2Y5Zyo44GX44Gm44GE44Gq44GE5aC05ZCI44CB6Z2e5a2Y5Zyo44OR44Op44Oh44O844K/SUTjg6rjgrnjg4jlhoXjgpLmpJzntKLjgZfjgIHjgZ3jga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgpLov5TjgZlcbiAgICAgIGlmICh0aGlzLl9ub3RFeGlzdFBhcmFtZXRlcklkLmlzRXhpc3QocGFyYW1ldGVySWQpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ub3RFeGlzdFBhcmFtZXRlcklkLmdldFZhbHVlKHBhcmFtZXRlcklkKTtcbiAgICAgIH1cblxuICAgICAgLy8g6Z2e5a2Y5Zyo44OR44Op44Oh44O844K/SUTjg6rjgrnjg4jjgavjgarjgYTloLTlkIjmlrDjgZfjgY/opoHntKDjgpLov73liqDjgZnjgotcbiAgICAgIHBhcmFtZXRlckluZGV4ID1cbiAgICAgICAgdGhpcy5fbW9kZWwucGFyYW1ldGVycy5jb3VudCArIHRoaXMuX25vdEV4aXN0UGFyYW1ldGVySWQuZ2V0U2l6ZSgpO1xuXG4gICAgICB0aGlzLl9ub3RFeGlzdFBhcmFtZXRlcklkLnNldFZhbHVlKHBhcmFtZXRlcklkLCBwYXJhbWV0ZXJJbmRleCk7XG4gICAgICB0aGlzLl9ub3RFeGlzdFBhcmFtZXRlclZhbHVlcy5hcHBlbmRLZXkocGFyYW1ldGVySW5kZXgpO1xuXG4gICAgICByZXR1cm4gcGFyYW1ldGVySW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OR44Op44Oh44O844K/44Gu5YCL5pWw44Gu5Y+W5b6XXG4gICAgICogQHJldHVybiDjg5Hjg6njg6Hjg7zjgr/jga7lgIvmlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVyQ291bnQoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9tb2RlbC5wYXJhbWV0ZXJzLmNvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODkeODqeODoeODvOOCv+OBruacgOWkp+WApOOBruWPluW+l1xuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleCDjg5Hjg6njg6Hjg7zjgr/jga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIOODkeODqeODoeODvOOCv+OBruacgOWkp+WApFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJNYXhpbXVtVmFsdWUocGFyYW1ldGVySW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fbW9kZWwucGFyYW1ldGVycy5tYXhpbXVtVmFsdWVzW3BhcmFtZXRlckluZGV4XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Hjg6njg6Hjg7zjgr/jga7mnIDlsI/lgKTjga7lj5blvpdcbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgg44OR44Op44Oh44O844K/44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiDjg5Hjg6njg6Hjg7zjgr/jga7mnIDlsI/lgKRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGFyYW1ldGVyTWluaW11bVZhbHVlKHBhcmFtZXRlckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX21vZGVsLnBhcmFtZXRlcnMubWluaW11bVZhbHVlc1twYXJhbWV0ZXJJbmRleF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OR44Op44Oh44O844K/44Gu44OH44OV44Kp44Or44OI5YCk44Gu5Y+W5b6XXG4gICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4IOODkeODqeODoeODvOOCv+OBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4g44OR44Op44Oh44O844K/44Gu44OH44OV44Kp44Or44OI5YCkXG4gICAgICovXG4gICAgcHVibGljIGdldFBhcmFtZXRlckRlZmF1bHRWYWx1ZShwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9tb2RlbC5wYXJhbWV0ZXJzLmRlZmF1bHRWYWx1ZXNbcGFyYW1ldGVySW5kZXhdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODkeODqeODoeODvOOCv+OBruWApOOBruWPluW+l1xuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleCAgICDjg5Hjg6njg6Hjg7zjgr/jga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIOODkeODqeODoeODvOOCv+OBruWApFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJWYWx1ZUJ5SW5kZXgocGFyYW1ldGVySW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICBpZiAodGhpcy5fbm90RXhpc3RQYXJhbWV0ZXJWYWx1ZXMuaXNFeGlzdChwYXJhbWV0ZXJJbmRleCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vdEV4aXN0UGFyYW1ldGVyVmFsdWVzLmdldFZhbHVlKHBhcmFtZXRlckluZGV4KTtcbiAgICAgIH1cblxuICAgICAgLy8g44Kk44Oz44OH44OD44Kv44K544Gu56+E5Zuy5YaF5qSc55+lXG4gICAgICBDU01fQVNTRVJUKFxuICAgICAgICAwIDw9IHBhcmFtZXRlckluZGV4ICYmIHBhcmFtZXRlckluZGV4IDwgdGhpcy5nZXRQYXJhbWV0ZXJDb3VudCgpXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gdGhpcy5fcGFyYW1ldGVyVmFsdWVzW3BhcmFtZXRlckluZGV4XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Hjg6njg6Hjg7zjgr/jga7lgKTjga7lj5blvpdcbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVySWQgICAg44OR44Op44Oh44O844K/44GuSURcbiAgICAgKiBAcmV0dXJuIOODkeODqeODoeODvOOCv+OBruWApFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYXJhbWV0ZXJWYWx1ZUJ5SWQocGFyYW1ldGVySWQ6IEN1YmlzbUlkSGFuZGxlKTogbnVtYmVyIHtcbiAgICAgIC8vIOmrmOmAn+WMluOBruOBn+OCgeOBq3BhcmFtZXRlckluZGV444KS5Y+W5b6X44Gn44GN44KL5qmf5qeL44Gr44Gq44Gj44Gm44GE44KL44GM44CB5aSW6YOo44GL44KJ44Gu6Kit5a6a44Gu5pmC44Gv5ZG844Gz5Ye644GX6aC75bqm44GM5L2O44GE44Gf44KB5LiN6KaBXG4gICAgICBjb25zdCBwYXJhbWV0ZXJJbmRleDogbnVtYmVyID0gdGhpcy5nZXRQYXJhbWV0ZXJJbmRleChwYXJhbWV0ZXJJZCk7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXJWYWx1ZUJ5SW5kZXgocGFyYW1ldGVySW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODkeODqeODoeODvOOCv+OBruWApOOBruioreWumlxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleCDjg5Hjg6njg6Hjg7zjgr/jga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcGFyYW0gdmFsdWUg44OR44Op44Oh44O844K/44Gu5YCkXG4gICAgICogQHBhcmFtIHdlaWdodCDph43jgb9cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0UGFyYW1ldGVyVmFsdWVCeUluZGV4KFxuICAgICAgcGFyYW1ldGVySW5kZXg6IG51bWJlcixcbiAgICAgIHZhbHVlOiBudW1iZXIsXG4gICAgICB3ZWlnaHQgPSAxLjBcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLl9ub3RFeGlzdFBhcmFtZXRlclZhbHVlcy5pc0V4aXN0KHBhcmFtZXRlckluZGV4KSkge1xuICAgICAgICB0aGlzLl9ub3RFeGlzdFBhcmFtZXRlclZhbHVlcy5zZXRWYWx1ZShcbiAgICAgICAgICBwYXJhbWV0ZXJJbmRleCxcbiAgICAgICAgICB3ZWlnaHQgPT0gMVxuICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgOiB0aGlzLl9ub3RFeGlzdFBhcmFtZXRlclZhbHVlcy5nZXRWYWx1ZShwYXJhbWV0ZXJJbmRleCkgKlxuICAgICAgICAgICAgICAgICgxIC0gd2VpZ2h0KSArXG4gICAgICAgICAgICAgICAgdmFsdWUgKiB3ZWlnaHRcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIOOCpOODs+ODh+ODg+OCr+OCueOBruevhOWbsuWGheaknOefpVxuICAgICAgQ1NNX0FTU0VSVChcbiAgICAgICAgMCA8PSBwYXJhbWV0ZXJJbmRleCAmJiBwYXJhbWV0ZXJJbmRleCA8IHRoaXMuZ2V0UGFyYW1ldGVyQ291bnQoKVxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMuX21vZGVsLnBhcmFtZXRlcnMubWF4aW11bVZhbHVlc1twYXJhbWV0ZXJJbmRleF0gPCB2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuX21vZGVsLnBhcmFtZXRlcnMubWF4aW11bVZhbHVlc1twYXJhbWV0ZXJJbmRleF07XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fbW9kZWwucGFyYW1ldGVycy5taW5pbXVtVmFsdWVzW3BhcmFtZXRlckluZGV4XSA+IHZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5fbW9kZWwucGFyYW1ldGVycy5taW5pbXVtVmFsdWVzW3BhcmFtZXRlckluZGV4XTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcGFyYW1ldGVyVmFsdWVzW3BhcmFtZXRlckluZGV4XSA9XG4gICAgICAgIHdlaWdodCA9PSAxXG4gICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgIDogKHRoaXMuX3BhcmFtZXRlclZhbHVlc1twYXJhbWV0ZXJJbmRleF0gPVxuICAgICAgICAgICAgICB0aGlzLl9wYXJhbWV0ZXJWYWx1ZXNbcGFyYW1ldGVySW5kZXhdICogKDEgLSB3ZWlnaHQpICtcbiAgICAgICAgICAgICAgdmFsdWUgKiB3ZWlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODkeODqeODoeODvOOCv+OBruWApOOBruioreWumlxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJZCDjg5Hjg6njg6Hjg7zjgr/jga5JRFxuICAgICAqIEBwYXJhbSB2YWx1ZSDjg5Hjg6njg6Hjg7zjgr/jga7lgKRcbiAgICAgKiBAcGFyYW0gd2VpZ2h0IOmHjeOBv1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQYXJhbWV0ZXJWYWx1ZUJ5SWQoXG4gICAgICBwYXJhbWV0ZXJJZDogQ3ViaXNtSWRIYW5kbGUsXG4gICAgICB2YWx1ZTogbnVtYmVyLFxuICAgICAgd2VpZ2h0ID0gMS4wXG4gICAgKTogdm9pZCB7XG4gICAgICBjb25zdCBpbmRleDogbnVtYmVyID0gdGhpcy5nZXRQYXJhbWV0ZXJJbmRleChwYXJhbWV0ZXJJZCk7XG4gICAgICB0aGlzLnNldFBhcmFtZXRlclZhbHVlQnlJbmRleChpbmRleCwgdmFsdWUsIHdlaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OR44Op44Oh44O844K/44Gu5YCk44Gu5Yqg566XKGluZGV4KVxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleCDjg5Hjg6njg6Hjg7zjgr/jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcGFyYW0gdmFsdWUg5Yqg566X44GZ44KL5YCkXG4gICAgICogQHBhcmFtIHdlaWdodCDph43jgb9cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkUGFyYW1ldGVyVmFsdWVCeUluZGV4KFxuICAgICAgcGFyYW1ldGVySW5kZXg6IG51bWJlcixcbiAgICAgIHZhbHVlOiBudW1iZXIsXG4gICAgICB3ZWlnaHQgPSAxLjBcbiAgICApOiB2b2lkIHtcbiAgICAgIHRoaXMuc2V0UGFyYW1ldGVyVmFsdWVCeUluZGV4KFxuICAgICAgICBwYXJhbWV0ZXJJbmRleCxcbiAgICAgICAgdGhpcy5nZXRQYXJhbWV0ZXJWYWx1ZUJ5SW5kZXgocGFyYW1ldGVySW5kZXgpICsgdmFsdWUgKiB3ZWlnaHRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OR44Op44Oh44O844K/44Gu5YCk44Gu5Yqg566XKGlkKVxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJZCDjg5Hjg6njg6Hjg7zjgr/vvKnvvKRcbiAgICAgKiBAcGFyYW0gdmFsdWUg5Yqg566X44GZ44KL5YCkXG4gICAgICogQHBhcmFtIHdlaWdodCDph43jgb9cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkUGFyYW1ldGVyVmFsdWVCeUlkKFxuICAgICAgcGFyYW1ldGVySWQ6IGFueSxcbiAgICAgIHZhbHVlOiBudW1iZXIsXG4gICAgICB3ZWlnaHQgPSAxLjBcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSB0aGlzLmdldFBhcmFtZXRlckluZGV4KHBhcmFtZXRlcklkKTtcbiAgICAgIHRoaXMuYWRkUGFyYW1ldGVyVmFsdWVCeUluZGV4KGluZGV4LCB2YWx1ZSwgd2VpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Hjg6njg6Hjg7zjgr/jga7lgKTjga7kuZfnrpdcbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVySWQg44OR44Op44Oh44O844K/44GuSURcbiAgICAgKiBAcGFyYW0gdmFsdWUg5LmX566X44GZ44KL5YCkXG4gICAgICogQHBhcmFtIHdlaWdodCDph43jgb9cbiAgICAgKi9cbiAgICBwdWJsaWMgbXVsdGlwbHlQYXJhbWV0ZXJWYWx1ZUJ5SWQoXG4gICAgICBwYXJhbWV0ZXJJZDogQ3ViaXNtSWRIYW5kbGUsXG4gICAgICB2YWx1ZTogbnVtYmVyLFxuICAgICAgd2VpZ2h0ID0gMS4wXG4gICAgKTogdm9pZCB7XG4gICAgICBjb25zdCBpbmRleDogbnVtYmVyID0gdGhpcy5nZXRQYXJhbWV0ZXJJbmRleChwYXJhbWV0ZXJJZCk7XG4gICAgICB0aGlzLm11bHRpcGx5UGFyYW1ldGVyVmFsdWVCeUluZGV4KGluZGV4LCB2YWx1ZSwgd2VpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Hjg6njg6Hjg7zjgr/jga7lgKTjga7kuZfnrpdcbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgg44OR44Op44Oh44O844K/44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHBhcmFtIHZhbHVlIOS5l+eul+OBmeOCi+WApFxuICAgICAqIEBwYXJhbSB3ZWlnaHQg6YeN44G/XG4gICAgICovXG4gICAgcHVibGljIG11bHRpcGx5UGFyYW1ldGVyVmFsdWVCeUluZGV4KFxuICAgICAgcGFyYW1ldGVySW5kZXg6IG51bWJlcixcbiAgICAgIHZhbHVlOiBudW1iZXIsXG4gICAgICB3ZWlnaHQgPSAxLjBcbiAgICApOiB2b2lkIHtcbiAgICAgIHRoaXMuc2V0UGFyYW1ldGVyVmFsdWVCeUluZGV4KFxuICAgICAgICBwYXJhbWV0ZXJJbmRleCxcbiAgICAgICAgdGhpcy5nZXRQYXJhbWV0ZXJWYWx1ZUJ5SW5kZXgocGFyYW1ldGVySW5kZXgpICpcbiAgICAgICAgICAoMS4wICsgKHZhbHVlIC0gMS4wKSAqIHdlaWdodClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhd2FibGXjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjga7lj5blvpdcbiAgICAgKiBAcGFyYW0gZHJhd2FibGVJZCBEcmF3YWJsZeOBrklEXG4gICAgICogQHJldHVybiBEcmF3YWJsZeOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcmF3YWJsZUluZGV4KGRyYXdhYmxlSWQ6IEN1YmlzbUlkSGFuZGxlKTogbnVtYmVyIHtcbiAgICAgIGNvbnN0IGRyYXdhYmxlQ291bnQgPSB0aGlzLl9tb2RlbC5kcmF3YWJsZXMuY291bnQ7XG5cbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBkcmF3YWJsZUluZGV4ID0gMDtcbiAgICAgICAgZHJhd2FibGVJbmRleCA8IGRyYXdhYmxlQ291bnQ7XG4gICAgICAgICsrZHJhd2FibGVJbmRleFxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLl9kcmF3YWJsZUlkcy5hdChkcmF3YWJsZUluZGV4KSA9PSBkcmF3YWJsZUlkKSB7XG4gICAgICAgICAgcmV0dXJuIGRyYXdhYmxlSW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXdhYmxl44Gu5YCL5pWw44Gu5Y+W5b6XXG4gICAgICogQHJldHVybiBkcmF3YWJsZeOBruWAi+aVsFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcmF3YWJsZUNvdW50KCk6IG51bWJlciB7XG4gICAgICBjb25zdCBkcmF3YWJsZUNvdW50ID0gdGhpcy5fbW9kZWwuZHJhd2FibGVzLmNvdW50O1xuICAgICAgcmV0dXJuIGRyYXdhYmxlQ291bnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhd2FibGXjga5JROOCkuWPluW+l+OBmeOCi1xuICAgICAqIEBwYXJhbSBkcmF3YWJsZUluZGV4IERyYXdhYmxl44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiBkcmF3YWJsZeOBrklEXG4gICAgICovXG4gICAgcHVibGljIGdldERyYXdhYmxlSWQoZHJhd2FibGVJbmRleDogbnVtYmVyKTogQ3ViaXNtSWRIYW5kbGUge1xuICAgICAgY29uc3QgcGFyYW1ldGVySWRzOiBzdHJpbmdbXSA9IHRoaXMuX21vZGVsLmRyYXdhYmxlcy5pZHM7XG4gICAgICByZXR1cm4gQ3ViaXNtRnJhbWV3b3JrLmdldElkTWFuYWdlcigpLmdldElkKHBhcmFtZXRlcklkc1tkcmF3YWJsZUluZGV4XSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhd2FibGXjga7mj4/nlLvpoIbjg6rjgrnjg4jjga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIERyYXdhYmxl44Gu5o+P55S76aCG44Oq44K544OIXG4gICAgICovXG4gICAgcHVibGljIGdldERyYXdhYmxlUmVuZGVyT3JkZXJzKCk6IEludDMyQXJyYXkge1xuICAgICAgY29uc3QgcmVuZGVyT3JkZXJzOiBJbnQzMkFycmF5ID0gdGhpcy5fbW9kZWwuZHJhd2FibGVzLnJlbmRlck9yZGVycztcbiAgICAgIHJldHVybiByZW5kZXJPcmRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhd2FibGXjga7jg4bjgq/jgrnjg4Hjg6PjgqTjg7Pjg4fjg4Pjgq/jgrnjg6rjgrnjg4jjga7lj5blvpdcbiAgICAgKiBAcGFyYW0gZHJhd2FibGVJbmRleCBEcmF3YWJsZeOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4gZHJhd2FibGXjga7jg4bjgq/jgrnjg4Hjg6PjgqTjg7Pjg4fjg4Pjgq/jgrnjg6rjgrnjg4hcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RHJhd2FibGVUZXh0dXJlSW5kaWNlcyhkcmF3YWJsZUluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgY29uc3QgdGV4dHVyZUluZGljZXM6IEludDMyQXJyYXkgPSB0aGlzLl9tb2RlbC5kcmF3YWJsZXMudGV4dHVyZUluZGljZXM7XG4gICAgICByZXR1cm4gdGV4dHVyZUluZGljZXNbZHJhd2FibGVJbmRleF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhd2FibGXjga5WZXJ0ZXhQb3NpdGlvbnPjga7lpInljJbmg4XloLHjga7lj5blvpdcbiAgICAgKlxuICAgICAqIOebtOi/keOBrkN1YmlzbU1vZGVsLnVwZGF0ZemWouaVsOOBp0RyYXdhYmxl44Gu6aCC54K55oOF5aCx44GM5aSJ5YyW44GX44Gf44GL44KS5Y+W5b6X44GZ44KL44CCXG4gICAgICpcbiAgICAgKiBAcGFyYW0gICBkcmF3YWJsZUluZGV4ICAgRHJhd2FibGXjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dmFsICB0cnVlICAgIERyYXdhYmxl44Gu6aCC54K55oOF5aCx44GM55u06L+R44GuQ3ViaXNtTW9kZWwudXBkYXRl6Zai5pWw44Gn5aSJ5YyW44GX44GfXG4gICAgICogQHJldHZhbCAgZmFsc2UgICBEcmF3YWJsZeOBrumggueCueaDheWgseOBjOebtOi/keOBrkN1YmlzbU1vZGVsLnVwZGF0ZemWouaVsOOBp+WkieWMluOBl+OBpuOBhOOBquOBhFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcmF3YWJsZUR5bmFtaWNGbGFnVmVydGV4UG9zaXRpb25zRGlkQ2hhbmdlKFxuICAgICAgZHJhd2FibGVJbmRleDogbnVtYmVyXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBkeW5hbWljRmxhZ3M6IFVpbnQ4QXJyYXkgPSB0aGlzLl9tb2RlbC5kcmF3YWJsZXMuZHluYW1pY0ZsYWdzO1xuICAgICAgcmV0dXJuIExpdmUyREN1YmlzbUNvcmUuVXRpbHMuaGFzVmVydGV4UG9zaXRpb25zRGlkQ2hhbmdlQml0KFxuICAgICAgICBkeW5hbWljRmxhZ3NbZHJhd2FibGVJbmRleF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhd2FibGXjga7poILngrnjgqTjg7Pjg4fjg4Pjgq/jgrnjga7lgIvmlbDjga7lj5blvpdcbiAgICAgKiBAcGFyYW0gZHJhd2FibGVJbmRleCBEcmF3YWJsZeOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4gZHJhd2FibGXjga7poILngrnjgqTjg7Pjg4fjg4Pjgq/jgrnjga7lgIvmlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RHJhd2FibGVWZXJ0ZXhJbmRleENvdW50KGRyYXdhYmxlSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICBjb25zdCBpbmRleENvdW50czogSW50MzJBcnJheSA9IHRoaXMuX21vZGVsLmRyYXdhYmxlcy5pbmRleENvdW50cztcbiAgICAgIHJldHVybiBpbmRleENvdW50c1tkcmF3YWJsZUluZGV4XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3YWJsZeOBrumggueCueOBruWAi+aVsOOBruWPluW+l1xuICAgICAqIEBwYXJhbSBkcmF3YWJsZUluZGV4IERyYXdhYmxl44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiBkcmF3YWJsZeOBrumggueCueOBruWAi+aVsFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcmF3YWJsZVZlcnRleENvdW50KGRyYXdhYmxlSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICBjb25zdCB2ZXJ0ZXhDb3VudHMgPSB0aGlzLl9tb2RlbC5kcmF3YWJsZXMudmVydGV4Q291bnRzO1xuICAgICAgcmV0dXJuIHZlcnRleENvdW50c1tkcmF3YWJsZUluZGV4XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3YWJsZeOBrumggueCueODquOCueODiOOBruWPluW+l1xuICAgICAqIEBwYXJhbSBkcmF3YWJsZUluZGV4IGRyYXdhYmxl44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiBkcmF3YWJsZeOBrumggueCueODquOCueODiFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcmF3YWJsZVZlcnRpY2VzKGRyYXdhYmxlSW5kZXg6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXREcmF3YWJsZVZlcnRleFBvc2l0aW9ucyhkcmF3YWJsZUluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3YWJsZeOBrumggueCueOCpOODs+ODh+ODg+OCr+OCueODquOCueODiOOBruWPluW+l1xuICAgICAqIEBwYXJhbSBkcmFyYWJsZUluZGV4IERyYXdhYmxl44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiBkcmF3YWJsZeOBrumggueCueOCpOODs+ODh+ODg+OCr+OCueODquOCueODiFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcmF3YWJsZVZlcnRleEluZGljZXMoZHJhd2FibGVJbmRleDogbnVtYmVyKTogVWludDE2QXJyYXkge1xuICAgICAgY29uc3QgaW5kaWNlc0FycmF5OiBVaW50MTZBcnJheVtdID0gdGhpcy5fbW9kZWwuZHJhd2FibGVzLmluZGljZXM7XG4gICAgICByZXR1cm4gaW5kaWNlc0FycmF5W2RyYXdhYmxlSW5kZXhdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXdhYmxl44Gu6aCC54K544Oq44K544OI44Gu5Y+W5b6XXG4gICAgICogQHBhcmFtIGRyYXdhYmxlSW5kZXggRHJhd2FibGXjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIGRyYXdhYmxl44Gu6aCC54K544Oq44K544OIXG4gICAgICovXG4gICAgcHVibGljIGdldERyYXdhYmxlVmVydGV4UG9zaXRpb25zKGRyYXdhYmxlSW5kZXg6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gICAgICBjb25zdCB2ZXJ0aWNlc0FycmF5OiBGbG9hdDMyQXJyYXlbXSA9IHRoaXMuX21vZGVsLmRyYXdhYmxlc1xuICAgICAgICAudmVydGV4UG9zaXRpb25zO1xuICAgICAgcmV0dXJuIHZlcnRpY2VzQXJyYXlbZHJhd2FibGVJbmRleF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhd2FibGXjga7poILngrnjga5VVuODquOCueODiOOBruWPluW+l1xuICAgICAqIEBwYXJhbSBkcmF3YWJsZUluZGV4IERyYXdhYmxl44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiBkcmF3YWJsZeOBrumggueCuVVW44Oq44K544OIXG4gICAgICovXG4gICAgcHVibGljIGdldERyYXdhYmxlVmVydGV4VXZzKGRyYXdhYmxlSW5kZXg6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gICAgICBjb25zdCB1dnNBcnJheTogRmxvYXQzMkFycmF5W10gPSB0aGlzLl9tb2RlbC5kcmF3YWJsZXMudmVydGV4VXZzO1xuICAgICAgcmV0dXJuIHV2c0FycmF5W2RyYXdhYmxlSW5kZXhdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXdhYmxl44Gu5LiN6YCP5piO5bqm44Gu5Y+W5b6XXG4gICAgICogQHBhcmFtIGRyYXdhYmxlSW5kZXggRHJhd2FibGXjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIGRyYXdhYmxl44Gu5LiN6YCP5piO5bqmXG4gICAgICovXG4gICAgcHVibGljIGdldERyYXdhYmxlT3BhY2l0eShkcmF3YWJsZUluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgY29uc3Qgb3BhY2l0aWVzOiBGbG9hdDMyQXJyYXkgPSB0aGlzLl9tb2RlbC5kcmF3YWJsZXMub3BhY2l0aWVzO1xuICAgICAgcmV0dXJuIG9wYWNpdGllc1tkcmF3YWJsZUluZGV4XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3YWJsZeOBruOCq+ODquODs+OCsOaDheWgseOBruWPluW+l1xuICAgICAqIEBwYXJhbSBkcmF3YWJsZUluZGV4IERyYXdhYmxl44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiBkcmF3YWJsZeOBruOCq+ODquODs+OCsOaDheWgsVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcmF3YWJsZUN1bGxpbmcoZHJhd2FibGVJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBjb25zdGFudEZsYWdzID0gdGhpcy5fbW9kZWwuZHJhd2FibGVzLmNvbnN0YW50RmxhZ3M7XG5cbiAgICAgIHJldHVybiAhTGl2ZTJEQ3ViaXNtQ29yZS5VdGlscy5oYXNJc0RvdWJsZVNpZGVkQml0KFxuICAgICAgICBjb25zdGFudEZsYWdzW2RyYXdhYmxlSW5kZXhdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXdhYmxl44Gu44OW44Os44Oz44OJ44Oi44O844OJ44KS5Y+W5b6XXG4gICAgICogQHBhcmFtIGRyYXdhYmxlSW5kZXggRHJhd2FibGXjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIGRyYXdhYmxl44Gu44OW44Os44Oz44OJ44Oi44O844OJXG4gICAgICovXG4gICAgcHVibGljIGdldERyYXdhYmxlQmxlbmRNb2RlKGRyYXdhYmxlSW5kZXg6IG51bWJlcik6IEN1YmlzbUJsZW5kTW9kZSB7XG4gICAgICBjb25zdCBjb25zdGFudEZsYWdzID0gdGhpcy5fbW9kZWwuZHJhd2FibGVzLmNvbnN0YW50RmxhZ3M7XG5cbiAgICAgIHJldHVybiBMaXZlMkRDdWJpc21Db3JlLlV0aWxzLmhhc0JsZW5kQWRkaXRpdmVCaXQoXG4gICAgICAgIGNvbnN0YW50RmxhZ3NbZHJhd2FibGVJbmRleF1cbiAgICAgIClcbiAgICAgICAgPyBDdWJpc21CbGVuZE1vZGUuQ3ViaXNtQmxlbmRNb2RlX0FkZGl0aXZlXG4gICAgICAgIDogTGl2ZTJEQ3ViaXNtQ29yZS5VdGlscy5oYXNCbGVuZE11bHRpcGxpY2F0aXZlQml0KFxuICAgICAgICAgICAgY29uc3RhbnRGbGFnc1tkcmF3YWJsZUluZGV4XVxuICAgICAgICAgIClcbiAgICAgICAgPyBDdWJpc21CbGVuZE1vZGUuQ3ViaXNtQmxlbmRNb2RlX011bHRpcGxpY2F0aXZlXG4gICAgICAgIDogQ3ViaXNtQmxlbmRNb2RlLkN1YmlzbUJsZW5kTW9kZV9Ob3JtYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhd2FibGXjga7jg57jgrnjgq/jga7lj43ou6Lkvb/nlKjjga7lj5blvpdcbiAgICAgKlxuICAgICAqIERyYXdhYmxl44Gu44Oe44K544Kv5L2/55So5pmC44Gu5Y+N6Lui6Kit5a6a44KS5Y+W5b6X44GZ44KL44CCXG4gICAgICog44Oe44K544Kv44KS5L2/55So44GX44Gq44GE5aC05ZCI44Gv54Sh6KaW44GV44KM44KL44CCXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZHJhd2FibGVJbmRleCBEcmF3YWJsZeOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4gRHJhd2FibGXjga7lj43ou6LoqK3lrppcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RHJhd2FibGVJbnZlcnRlZE1hc2tCaXQoZHJhd2FibGVJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBjb25zdGFudEZsYWdzOiBVaW50OEFycmF5ID0gdGhpcy5fbW9kZWwuZHJhd2FibGVzLmNvbnN0YW50RmxhZ3M7XG5cbiAgICAgIHJldHVybiBMaXZlMkRDdWJpc21Db3JlLlV0aWxzLmhhc0lzSW52ZXJ0ZWRNYXNrQml0KFxuICAgICAgICBjb25zdGFudEZsYWdzW2RyYXdhYmxlSW5kZXhdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXdhYmxl44Gu44Kv44Oq44OD44OU44Oz44Kw44Oe44K544Kv44Oq44K544OI44Gu5Y+W5b6XXG4gICAgICogQHJldHVybiBEcmF3YWJsZeOBruOCr+ODquODg+ODlOODs+OCsOODnuOCueOCr+ODquOCueODiFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcmF3YWJsZU1hc2tzKCk6IEludDMyQXJyYXlbXSB7XG4gICAgICBjb25zdCBtYXNrczogSW50MzJBcnJheVtdID0gdGhpcy5fbW9kZWwuZHJhd2FibGVzLm1hc2tzO1xuICAgICAgcmV0dXJuIG1hc2tzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXdhYmxl44Gu44Kv44Oq44OD44OU44Oz44Kw44Oe44K544Kv44Gu5YCL5pWw44Oq44K544OI44Gu5Y+W5b6XXG4gICAgICogQHJldHVybiBEcmF3YWJsZeOBruOCr+ODquODg+ODlOODs+OCsOODnuOCueOCr+OBruWAi+aVsOODquOCueODiFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcmF3YWJsZU1hc2tDb3VudHMoKTogSW50MzJBcnJheSB7XG4gICAgICBjb25zdCBtYXNrQ291bnRzOiBJbnQzMkFycmF5ID0gdGhpcy5fbW9kZWwuZHJhd2FibGVzLm1hc2tDb3VudHM7XG4gICAgICByZXR1cm4gbWFza0NvdW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jga7kvb/nlKjnirbmhYtcbiAgICAgKlxuICAgICAqIEByZXR1cm4gdHJ1ZSDjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jgpLkvb/nlKjjgZfjgabjgYTjgotcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOOCr+ODquODg+ODlOODs+OCsOODnuOCueOCr+OCkuS9v+eUqOOBl+OBpuOBhOOBquOBhFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1VzaW5nTWFza2luZygpOiBib29sZWFuIHtcbiAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgdGhpcy5fbW9kZWwuZHJhd2FibGVzLmNvdW50OyArK2QpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vZGVsLmRyYXdhYmxlcy5tYXNrQ291bnRzW2RdIDw9IDApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcmF3YWJsZeOBruihqOekuuaDheWgseOCkuWPluW+l+OBmeOCi1xuICAgICAqXG4gICAgICogQHBhcmFtIGRyYXdhYmxlSW5kZXggRHJhd2FibGXjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIHRydWUgRHJhd2FibGXjgYzooajnpLpcbiAgICAgKiBAcmV0dXJuIGZhbHNlIERyYXdhYmxl44GM6Z2e6KGo56S6XG4gICAgICovXG4gICAgcHVibGljIGdldERyYXdhYmxlRHluYW1pY0ZsYWdJc1Zpc2libGUoZHJhd2FibGVJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBkeW5hbWljRmxhZ3M6IFVpbnQ4QXJyYXkgPSB0aGlzLl9tb2RlbC5kcmF3YWJsZXMuZHluYW1pY0ZsYWdzO1xuICAgICAgcmV0dXJuIExpdmUyREN1YmlzbUNvcmUuVXRpbHMuaGFzSXNWaXNpYmxlQml0KFxuICAgICAgICBkeW5hbWljRmxhZ3NbZHJhd2FibGVJbmRleF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJhd2FibGXjga5EcmF3T3JkZXLjga7lpInljJbmg4XloLHjga7lj5blvpdcbiAgICAgKlxuICAgICAqIOebtOi/keOBrkN1YmlzbU1vZGVsLnVwZGF0ZemWouaVsOOBp2RyYXdhYmxl44GuZHJhd09yZGVy44GM5aSJ5YyW44GX44Gf44GL44KS5Y+W5b6X44GZ44KL44CCXG4gICAgICogZHJhd09yZGVy44GvYXJ0TWVzaOS4iuOBp+aMh+WumuOBmeOCizDjgYvjgokxMDAw44Gu5oOF5aCxXG4gICAgICogQHBhcmFtIGRyYXdhYmxlSW5kZXggZHJhd2FibGXjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIHRydWUgZHJhd2FibGXjga7kuI3pgI/mmI7luqbjgYznm7Tov5Hjga5DdWJpc21Nb2RlbC51cGRhdGXplqLmlbDjgaflpInljJbjgZfjgZ9cbiAgICAgKiBAcmV0dXJuIGZhbHNlIGRyYXdhYmxl44Gu5LiN6YCP5piO5bqm44GM55u06L+R44GuQ3ViaXNtTW9kZWwudXBkYXRl6Zai5pWw44Gn5aSJ5YyW44GX44Gm44GE44KLXG4gICAgICovXG4gICAgcHVibGljIGdldERyYXdhYmxlRHluYW1pY0ZsYWdWaXNpYmlsaXR5RGlkQ2hhbmdlKFxuICAgICAgZHJhd2FibGVJbmRleDogbnVtYmVyXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBkeW5hbWljRmxhZ3M6IFVpbnQ4QXJyYXkgPSB0aGlzLl9tb2RlbC5kcmF3YWJsZXMuZHluYW1pY0ZsYWdzO1xuICAgICAgcmV0dXJuIExpdmUyREN1YmlzbUNvcmUuVXRpbHMuaGFzVmlzaWJpbGl0eURpZENoYW5nZUJpdChcbiAgICAgICAgZHluYW1pY0ZsYWdzW2RyYXdhYmxlSW5kZXhdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXdhYmxl44Gu5LiN6YCP5piO5bqm44Gu5aSJ5YyW5oOF5aCx44Gu5Y+W5b6XXG4gICAgICpcbiAgICAgKiDnm7Tov5Hjga5DdWJpc21Nb2RlbC51cGRhdGXplqLmlbDjgadkcmF3YWJsZeOBruS4jemAj+aYjuW6puOBjOWkieWMluOBl+OBn+OBi+OCkuWPluW+l+OBmeOCi+OAglxuICAgICAqXG4gICAgICogQHBhcmFtIGRyYXdhYmxlSW5kZXggZHJhd2FibGXjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIHRydWUgRHJhd2FibGXjga7kuI3pgI/mmI7luqbjgYznm7Tov5Hjga5DdWJpc21Nb2RlbC51cGRhdGXplqLmlbDjgaflpInljJbjgZfjgZ9cbiAgICAgKiBAcmV0dXJuIGZhbHNlIERyYXdhYmxl44Gu5LiN6YCP5piO5bqm44GM55u06L+R44GuQ3ViaXNtTW9kZWwudXBkYXRl6Zai5pWw44Gn5aSJ5YyW44GX44Gm44Gq44GEXG4gICAgICovXG4gICAgcHVibGljIGdldERyYXdhYmxlRHluYW1pY0ZsYWdPcGFjaXR5RGlkQ2hhbmdlKFxuICAgICAgZHJhd2FibGVJbmRleDogbnVtYmVyXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBkeW5hbWljRmxhZ3M6IFVpbnQ4QXJyYXkgPSB0aGlzLl9tb2RlbC5kcmF3YWJsZXMuZHluYW1pY0ZsYWdzO1xuICAgICAgcmV0dXJuIExpdmUyREN1YmlzbUNvcmUuVXRpbHMuaGFzT3BhY2l0eURpZENoYW5nZUJpdChcbiAgICAgICAgZHluYW1pY0ZsYWdzW2RyYXdhYmxlSW5kZXhdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyYXdhYmxl44Gu5o+P55S76aCG5bqP44Gu5aSJ5YyW5oOF5aCx44Gu5Y+W5b6XXG4gICAgICpcbiAgICAgKiDnm7Tov5Hjga5DdWJpc21Nb2RlbC51cGRhdGXplqLmlbDjgadEcmF3YWJsZeOBruaPj+eUu+OBrumghuW6j+OBjOWkieWMluOBl+OBn+OBi+OCkuWPluW+l+OBmeOCi+OAglxuICAgICAqXG4gICAgICogQHBhcmFtIGRyYXdhYmxlSW5kZXggRHJhd2FibGXjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIHRydWUgRHJhd2FibGXjga7mj4/nlLvjga7poIbluo/jgYznm7Tov5Hjga5DdWJpc21Nb2RlbC51cGRhdGXplqLmlbDjgaflpInljJbjgZfjgZ9cbiAgICAgKiBAcmV0dXJuIGZhbHNlIERyYXdhYmxl44Gu5o+P55S744Gu6aCG5bqP44GM55u06L+R44GuQ3ViaXNtTW9kZWwudXBkYXRl6Zai5pWw44Gn5aSJ5YyW44GX44Gm44Gq44GEXG4gICAgICovXG4gICAgcHVibGljIGdldERyYXdhYmxlRHluYW1pY0ZsYWdSZW5kZXJPcmRlckRpZENoYW5nZShcbiAgICAgIGRyYXdhYmxlSW5kZXg6IG51bWJlclxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgZHluYW1pY0ZsYWdzOiBVaW50OEFycmF5ID0gdGhpcy5fbW9kZWwuZHJhd2FibGVzLmR5bmFtaWNGbGFncztcbiAgICAgIHJldHVybiBMaXZlMkRDdWJpc21Db3JlLlV0aWxzLmhhc1JlbmRlck9yZGVyRGlkQ2hhbmdlQml0KFxuICAgICAgICBkeW5hbWljRmxhZ3NbZHJhd2FibGVJbmRleF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5L+d5a2Y44GV44KM44Gf44OR44Op44Oh44O844K/44Gu6Kqt44G/6L6844G/XG4gICAgICovXG4gICAgcHVibGljIGxvYWRQYXJhbWV0ZXJzKCk6IHZvaWQge1xuICAgICAgbGV0IHBhcmFtZXRlckNvdW50OiBudW1iZXIgPSB0aGlzLl9tb2RlbC5wYXJhbWV0ZXJzLmNvdW50O1xuICAgICAgY29uc3Qgc2F2ZWRQYXJhbWV0ZXJDb3VudDogbnVtYmVyID0gdGhpcy5fc2F2ZWRQYXJhbWV0ZXJzLmdldFNpemUoKTtcblxuICAgICAgaWYgKHBhcmFtZXRlckNvdW50ID4gc2F2ZWRQYXJhbWV0ZXJDb3VudCkge1xuICAgICAgICBwYXJhbWV0ZXJDb3VudCA9IHNhdmVkUGFyYW1ldGVyQ291bnQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1ldGVyQ291bnQ7ICsraSkge1xuICAgICAgICB0aGlzLl9wYXJhbWV0ZXJWYWx1ZXNbaV0gPSB0aGlzLl9zYXZlZFBhcmFtZXRlcnMuYXQoaSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yid5pyf5YyW44GZ44KLXG4gICAgICovXG4gICAgcHVibGljIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgICBDU01fQVNTRVJUKHRoaXMuX21vZGVsKTtcblxuICAgICAgdGhpcy5fcGFyYW1ldGVyVmFsdWVzID0gdGhpcy5fbW9kZWwucGFyYW1ldGVycy52YWx1ZXM7XG4gICAgICB0aGlzLl9wYXJ0T3BhY2l0aWVzID0gdGhpcy5fbW9kZWwucGFydHMub3BhY2l0aWVzO1xuICAgICAgdGhpcy5fcGFyYW1ldGVyTWF4aW11bVZhbHVlcyA9IHRoaXMuX21vZGVsLnBhcmFtZXRlcnMubWF4aW11bVZhbHVlcztcbiAgICAgIHRoaXMuX3BhcmFtZXRlck1pbmltdW1WYWx1ZXMgPSB0aGlzLl9tb2RlbC5wYXJhbWV0ZXJzLm1pbmltdW1WYWx1ZXM7XG5cbiAgICAgIHtcbiAgICAgICAgY29uc3QgcGFyYW1ldGVySWRzOiBzdHJpbmdbXSA9IHRoaXMuX21vZGVsLnBhcmFtZXRlcnMuaWRzO1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJDb3VudDogbnVtYmVyID0gdGhpcy5fbW9kZWwucGFyYW1ldGVycy5jb3VudDtcblxuICAgICAgICB0aGlzLl9wYXJhbWV0ZXJJZHMucHJlcGFyZUNhcGFjaXR5KHBhcmFtZXRlckNvdW50KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDb3VudDsgKytpKSB7XG4gICAgICAgICAgdGhpcy5fcGFyYW1ldGVySWRzLnB1c2hCYWNrKFxuICAgICAgICAgICAgQ3ViaXNtRnJhbWV3b3JrLmdldElkTWFuYWdlcigpLmdldElkKHBhcmFtZXRlcklkc1tpXSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgY29uc3QgcGFydElkczogc3RyaW5nW10gPSB0aGlzLl9tb2RlbC5wYXJ0cy5pZHM7XG4gICAgICAgIGNvbnN0IHBhcnRDb3VudDogbnVtYmVyID0gdGhpcy5fbW9kZWwucGFydHMuY291bnQ7XG5cbiAgICAgICAgdGhpcy5fcGFydElkcy5wcmVwYXJlQ2FwYWNpdHkocGFydENvdW50KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0Q291bnQ7ICsraSkge1xuICAgICAgICAgIHRoaXMuX3BhcnRJZHMucHVzaEJhY2soXG4gICAgICAgICAgICBDdWJpc21GcmFtZXdvcmsuZ2V0SWRNYW5hZ2VyKCkuZ2V0SWQocGFydElkc1tpXSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgY29uc3QgZHJhd2FibGVJZHM6IHN0cmluZ1tdID0gdGhpcy5fbW9kZWwuZHJhd2FibGVzLmlkcztcbiAgICAgICAgY29uc3QgZHJhd2FibGVDb3VudDogbnVtYmVyID0gdGhpcy5fbW9kZWwuZHJhd2FibGVzLmNvdW50O1xuXG4gICAgICAgIHRoaXMuX2RyYXdhYmxlSWRzLnByZXBhcmVDYXBhY2l0eShkcmF3YWJsZUNvdW50KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkcmF3YWJsZUNvdW50OyArK2kpIHtcbiAgICAgICAgICB0aGlzLl9kcmF3YWJsZUlkcy5wdXNoQmFjayhcbiAgICAgICAgICAgIEN1YmlzbUZyYW1ld29yay5nZXRJZE1hbmFnZXIoKS5nZXRJZChkcmF3YWJsZUlkc1tpXSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICogQHBhcmFtIG1vZGVsIOODouODh+ODq1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RlbDogTGl2ZTJEQ3ViaXNtQ29yZS5Nb2RlbCkge1xuICAgICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcbiAgICAgIHRoaXMuX3BhcmFtZXRlclZhbHVlcyA9IG51bGw7XG4gICAgICB0aGlzLl9wYXJhbWV0ZXJNYXhpbXVtVmFsdWVzID0gbnVsbDtcbiAgICAgIHRoaXMuX3BhcmFtZXRlck1pbmltdW1WYWx1ZXMgPSBudWxsO1xuICAgICAgdGhpcy5fcGFydE9wYWNpdGllcyA9IG51bGw7XG4gICAgICB0aGlzLl9zYXZlZFBhcmFtZXRlcnMgPSBuZXcgY3NtVmVjdG9yPG51bWJlcj4oKTtcbiAgICAgIHRoaXMuX3BhcmFtZXRlcklkcyA9IG5ldyBjc21WZWN0b3I8Q3ViaXNtSWRIYW5kbGU+KCk7XG4gICAgICB0aGlzLl9kcmF3YWJsZUlkcyA9IG5ldyBjc21WZWN0b3I8Q3ViaXNtSWRIYW5kbGU+KCk7XG4gICAgICB0aGlzLl9wYXJ0SWRzID0gbmV3IGNzbVZlY3RvcjxDdWJpc21JZEhhbmRsZT4oKTtcblxuICAgICAgdGhpcy5fbm90RXhpc3RQYXJ0SWQgPSBuZXcgY3NtTWFwPEN1YmlzbUlkSGFuZGxlLCBudW1iZXI+KCk7XG4gICAgICB0aGlzLl9ub3RFeGlzdFBhcmFtZXRlcklkID0gbmV3IGNzbU1hcDxDdWJpc21JZEhhbmRsZSwgbnVtYmVyPigpO1xuICAgICAgdGhpcy5fbm90RXhpc3RQYXJhbWV0ZXJWYWx1ZXMgPSBuZXcgY3NtTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgICAgdGhpcy5fbm90RXhpc3RQYXJ0T3BhY2l0aWVzID0gbmV3IGNzbU1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg4fjgrnjg4jjg6njgq/jgr/nm7jlvZPjga7lh6bnkIZcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuX21vZGVsLnJlbGVhc2UoKTtcbiAgICAgIHRoaXMuX21vZGVsID0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9ub3RFeGlzdFBhcnRPcGFjaXRpZXM6IGNzbU1hcDxudW1iZXIsIG51bWJlcj47IC8vIOWtmOWcqOOBl+OBpuOBhOOBquOBhOODkeODvOODhOOBruS4jemAj+aYjuW6puOBruODquOCueODiFxuICAgIHByaXZhdGUgX25vdEV4aXN0UGFydElkOiBjc21NYXA8Q3ViaXNtSWRIYW5kbGUsIG51bWJlcj47IC8vIOWtmOWcqOOBl+OBpuOBhOOBquOBhOODkeODvOODhElE44Gu44Oq44K544OIXG5cbiAgICBwcml2YXRlIF9ub3RFeGlzdFBhcmFtZXRlclZhbHVlczogY3NtTWFwPG51bWJlciwgbnVtYmVyPjsgLy8g5a2Y5Zyo44GX44Gm44GE44Gq44GE44OR44Op44Oh44O844K/44Gu5YCk44Gu44Oq44K544OIXG4gICAgcHJpdmF0ZSBfbm90RXhpc3RQYXJhbWV0ZXJJZDogY3NtTWFwPEN1YmlzbUlkSGFuZGxlLCBudW1iZXI+OyAvLyDlrZjlnKjjgZfjgabjgYTjgarjgYTjg5Hjg6njg6Hjg7zjgr9JROOBruODquOCueODiFxuXG4gICAgcHJpdmF0ZSBfc2F2ZWRQYXJhbWV0ZXJzOiBjc21WZWN0b3I8bnVtYmVyPjsgLy8g5L+d5a2Y44GV44KM44Gf44OR44Op44Oh44O844K/XG5cbiAgICBwcml2YXRlIF9tb2RlbDogTGl2ZTJEQ3ViaXNtQ29yZS5Nb2RlbDsgLy8g44Oi44OH44OrXG5cbiAgICBwcml2YXRlIF9wYXJhbWV0ZXJWYWx1ZXM6IEZsb2F0MzJBcnJheTsgLy8g44OR44Op44Oh44O844K/44Gu5YCk44Gu44Oq44K544OIXG4gICAgcHJpdmF0ZSBfcGFyYW1ldGVyTWF4aW11bVZhbHVlczogRmxvYXQzMkFycmF5OyAvLyDjg5Hjg6njg6Hjg7zjgr/jga7mnIDlpKflgKTjga7jg6rjgrnjg4hcbiAgICBwcml2YXRlIF9wYXJhbWV0ZXJNaW5pbXVtVmFsdWVzOiBGbG9hdDMyQXJyYXk7IC8vIOODkeODqeODoeODvOOCv+OBruacgOWwj+WApOOBruODquOCueODiFxuXG4gICAgcHJpdmF0ZSBfcGFydE9wYWNpdGllczogRmxvYXQzMkFycmF5OyAvLyDjg5Hjg7zjg4Tjga7kuI3pgI/mmI7luqbjga7jg6rjgrnjg4hcblxuICAgIHByaXZhdGUgX3BhcmFtZXRlcklkczogY3NtVmVjdG9yPEN1YmlzbUlkSGFuZGxlPjtcbiAgICBwcml2YXRlIF9wYXJ0SWRzOiBjc21WZWN0b3I8Q3ViaXNtSWRIYW5kbGU+O1xuICAgIHByaXZhdGUgX2RyYXdhYmxlSWRzOiBjc21WZWN0b3I8Q3ViaXNtSWRIYW5kbGU+O1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRoZSBMaXZlMkQgT3BlbiBTb2Z0d2FyZSBsaWNlbnNlXG4gKiB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5saXZlMmQuY29tL2V1bGEvbGl2ZTJkLW9wZW4tc29mdHdhcmUtbGljZW5zZS1hZ3JlZW1lbnRfZW4uaHRtbC5cbiAqL1xuXG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtbW90aW9uanNvbiB9IGZyb20gJy4vY3ViaXNtbW90aW9uanNvbic7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtbW90aW9uaW50ZXJuYWwgfSBmcm9tICcuL2N1YmlzbW1vdGlvbmludGVybmFsJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBhY3ViaXNtbW90aW9uIH0gZnJvbSAnLi9hY3ViaXNtbW90aW9uJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21tb2RlbCB9IGZyb20gJy4uL21vZGVsL2N1YmlzbW1vZGVsJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21mcmFtZXdvcmsgfSBmcm9tICcuLi9saXZlMmRjdWJpc21mcmFtZXdvcmsnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vdGlvbnF1ZXVlZW50cnkgfSBmcm9tICcuL2N1YmlzbW1vdGlvbnF1ZXVlZW50cnknO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1hdGggfSBmcm9tICcuLi9tYXRoL2N1YmlzbW1hdGgnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGNzbXZlY3RvciB9IGZyb20gJy4uL3R5cGUvY3NtdmVjdG9yJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21pZCB9IGZyb20gJy4uL2lkL2N1YmlzbWlkJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjc21zdHJpbmcgfSBmcm9tICcuLi90eXBlL2NzbXN0cmluZyc7XG5pbXBvcnQgeyBDdWJpc21Mb2dEZWJ1ZywgQ1NNX0FTU0VSVCB9IGZyb20gJy4uL3V0aWxzL2N1YmlzbWRlYnVnJztcbmltcG9ydCBjc21TdHJpbmcgPSBjc21zdHJpbmcuY3NtU3RyaW5nO1xuaW1wb3J0IEN1YmlzbU1vdGlvbkRhdGEgPSBjdWJpc21tb3Rpb25pbnRlcm5hbC5DdWJpc21Nb3Rpb25EYXRhO1xuaW1wb3J0IEN1YmlzbU1vdGlvblNlZ21lbnQgPSBjdWJpc21tb3Rpb25pbnRlcm5hbC5DdWJpc21Nb3Rpb25TZWdtZW50O1xuaW1wb3J0IEN1YmlzbU1vdGlvblBvaW50ID0gY3ViaXNtbW90aW9uaW50ZXJuYWwuQ3ViaXNtTW90aW9uUG9pbnQ7XG5pbXBvcnQgQ3ViaXNtTW90aW9uRXZlbnQgPSBjdWJpc21tb3Rpb25pbnRlcm5hbC5DdWJpc21Nb3Rpb25FdmVudDtcbmltcG9ydCBDdWJpc21Nb3Rpb25TZWdtZW50VHlwZSA9IGN1YmlzbW1vdGlvbmludGVybmFsLkN1YmlzbU1vdGlvblNlZ21lbnRUeXBlO1xuaW1wb3J0IEN1YmlzbUlkSGFuZGxlID0gY3ViaXNtaWQuQ3ViaXNtSWRIYW5kbGU7XG5pbXBvcnQgQ3ViaXNtTW90aW9uQ3VydmUgPSBjdWJpc21tb3Rpb25pbnRlcm5hbC5DdWJpc21Nb3Rpb25DdXJ2ZTtcbmltcG9ydCBDdWJpc21Nb3Rpb25DdXJ2ZVRhcmdldCA9IGN1YmlzbW1vdGlvbmludGVybmFsLkN1YmlzbU1vdGlvbkN1cnZlVGFyZ2V0O1xuaW1wb3J0IGNzbVZlY3RvciA9IGNzbXZlY3Rvci5jc21WZWN0b3I7XG5pbXBvcnQgQ3ViaXNtTWF0aCA9IGN1YmlzbW1hdGguQ3ViaXNtTWF0aDtcbmltcG9ydCBDdWJpc21Nb3Rpb25RdWV1ZUVudHJ5ID0gY3ViaXNtbW90aW9ucXVldWVlbnRyeS5DdWJpc21Nb3Rpb25RdWV1ZUVudHJ5O1xuaW1wb3J0IEN1YmlzbUZyYW1ld29yayA9IGN1YmlzbWZyYW1ld29yay5DdWJpc21GcmFtZXdvcms7XG5pbXBvcnQgQ3ViaXNtTW9kZWwgPSBjdWJpc21tb2RlbC5DdWJpc21Nb2RlbDtcbmltcG9ydCBBQ3ViaXNtTW90aW9uID0gYWN1YmlzbW1vdGlvbi5BQ3ViaXNtTW90aW9uO1xuaW1wb3J0IEZpbmlzaGVkTW90aW9uQ2FsbGJhY2sgPSBhY3ViaXNtbW90aW9uLkZpbmlzaGVkTW90aW9uQ2FsbGJhY2s7XG5pbXBvcnQgQ3ViaXNtTW90aW9uSnNvbiA9IGN1YmlzbW1vdGlvbmpzb24uQ3ViaXNtTW90aW9uSnNvbjtcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICBjb25zdCBFZmZlY3ROYW1lRXllQmxpbmsgPSAnRXllQmxpbmsnO1xuICBjb25zdCBFZmZlY3ROYW1lTGlwU3luYyA9ICdMaXBTeW5jJztcbiAgY29uc3QgVGFyZ2V0TmFtZU1vZGVsID0gJ01vZGVsJztcbiAgY29uc3QgVGFyZ2V0TmFtZVBhcmFtZXRlciA9ICdQYXJhbWV0ZXInO1xuICBjb25zdCBUYXJnZXROYW1lUGFydE9wYWNpdHkgPSAnUGFydE9wYWNpdHknO1xuXG4gIGZ1bmN0aW9uIGxlcnBQb2ludHMoXG4gICAgYTogQ3ViaXNtTW90aW9uUG9pbnQsXG4gICAgYjogQ3ViaXNtTW90aW9uUG9pbnQsXG4gICAgdDogbnVtYmVyXG4gICk6IEN1YmlzbU1vdGlvblBvaW50IHtcbiAgICBjb25zdCByZXN1bHQ6IEN1YmlzbU1vdGlvblBvaW50ID0gbmV3IEN1YmlzbU1vdGlvblBvaW50KCk7XG5cbiAgICByZXN1bHQudGltZSA9IGEudGltZSArIChiLnRpbWUgLSBhLnRpbWUpICogdDtcbiAgICByZXN1bHQudmFsdWUgPSBhLnZhbHVlICsgKGIudmFsdWUgLSBhLnZhbHVlKSAqIHQ7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGluZWFyRXZhbHVhdGUocG9pbnRzOiBDdWJpc21Nb3Rpb25Qb2ludFtdLCB0aW1lOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCB0OiBudW1iZXIgPSAodGltZSAtIHBvaW50c1swXS50aW1lKSAvIChwb2ludHNbMV0udGltZSAtIHBvaW50c1swXS50aW1lKTtcblxuICAgIGlmICh0IDwgMC4wKSB7XG4gICAgICB0ID0gMC4wO1xuICAgIH1cblxuICAgIHJldHVybiBwb2ludHNbMF0udmFsdWUgKyAocG9pbnRzWzFdLnZhbHVlIC0gcG9pbnRzWzBdLnZhbHVlKSAqIHQ7XG4gIH1cblxuICBmdW5jdGlvbiBiZXppZXJFdmFsdWF0ZShwb2ludHM6IEN1YmlzbU1vdGlvblBvaW50W10sIHRpbWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IHQ6IG51bWJlciA9ICh0aW1lIC0gcG9pbnRzWzBdLnRpbWUpIC8gKHBvaW50c1szXS50aW1lIC0gcG9pbnRzWzBdLnRpbWUpO1xuXG4gICAgaWYgKHQgPCAwLjApIHtcbiAgICAgIHQgPSAwLjA7XG4gICAgfVxuXG4gICAgY29uc3QgcDAxOiBDdWJpc21Nb3Rpb25Qb2ludCA9IGxlcnBQb2ludHMocG9pbnRzWzBdLCBwb2ludHNbMV0sIHQpO1xuICAgIGNvbnN0IHAxMjogQ3ViaXNtTW90aW9uUG9pbnQgPSBsZXJwUG9pbnRzKHBvaW50c1sxXSwgcG9pbnRzWzJdLCB0KTtcbiAgICBjb25zdCBwMjM6IEN1YmlzbU1vdGlvblBvaW50ID0gbGVycFBvaW50cyhwb2ludHNbMl0sIHBvaW50c1szXSwgdCk7XG5cbiAgICBjb25zdCBwMDEyOiBDdWJpc21Nb3Rpb25Qb2ludCA9IGxlcnBQb2ludHMocDAxLCBwMTIsIHQpO1xuICAgIGNvbnN0IHAxMjM6IEN1YmlzbU1vdGlvblBvaW50ID0gbGVycFBvaW50cyhwMTIsIHAyMywgdCk7XG5cbiAgICByZXR1cm4gbGVycFBvaW50cyhwMDEyLCBwMTIzLCB0KS52YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0ZXBwZWRFdmFsdWF0ZShwb2ludHM6IEN1YmlzbU1vdGlvblBvaW50W10sIHRpbWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHBvaW50c1swXS52YWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGludmVyc2VTdGVwcGVkRXZhbHVhdGUoXG4gICAgcG9pbnRzOiBDdWJpc21Nb3Rpb25Qb2ludFtdLFxuICAgIHRpbWU6IG51bWJlclxuICApOiBudW1iZXIge1xuICAgIHJldHVybiBwb2ludHNbMV0udmFsdWU7XG4gIH1cblxuICBmdW5jdGlvbiBldmFsdWF0ZUN1cnZlKFxuICAgIG1vdGlvbkRhdGE6IEN1YmlzbU1vdGlvbkRhdGEsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICB0aW1lOiBudW1iZXJcbiAgKTogbnVtYmVyIHtcbiAgICAvLyBGaW5kIHNlZ21lbnQgdG8gZXZhbHVhdGUuXG4gICAgY29uc3QgY3VydmU6IEN1YmlzbU1vdGlvbkN1cnZlID0gbW90aW9uRGF0YS5jdXJ2ZXMuYXQoaW5kZXgpO1xuXG4gICAgbGV0IHRhcmdldCA9IC0xO1xuICAgIGNvbnN0IHRvdGFsU2VnbWVudENvdW50OiBudW1iZXIgPVxuICAgICAgY3VydmUuYmFzZVNlZ21lbnRJbmRleCArIGN1cnZlLnNlZ21lbnRDb3VudDtcbiAgICBsZXQgcG9pbnRQb3NpdGlvbiA9IDA7XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gY3VydmUuYmFzZVNlZ21lbnRJbmRleDsgaSA8IHRvdGFsU2VnbWVudENvdW50OyArK2kpIHtcbiAgICAgIC8vIEdldCBmaXJzdCBwb2ludCBvZiBuZXh0IHNlZ21lbnQuXG4gICAgICBwb2ludFBvc2l0aW9uID1cbiAgICAgICAgbW90aW9uRGF0YS5zZWdtZW50cy5hdChpKS5iYXNlUG9pbnRJbmRleCArXG4gICAgICAgIChtb3Rpb25EYXRhLnNlZ21lbnRzLmF0KGkpLnNlZ21lbnRUeXBlID09XG4gICAgICAgIEN1YmlzbU1vdGlvblNlZ21lbnRUeXBlLkN1YmlzbU1vdGlvblNlZ21lbnRUeXBlX0JlemllclxuICAgICAgICAgID8gM1xuICAgICAgICAgIDogMSk7XG5cbiAgICAgIC8vIEJyZWFrIGlmIHRpbWUgbGllcyB3aXRoaW4gY3VycmVudCBzZWdtZW50LlxuICAgICAgaWYgKG1vdGlvbkRhdGEucG9pbnRzLmF0KHBvaW50UG9zaXRpb24pLnRpbWUgPiB0aW1lKSB7XG4gICAgICAgIHRhcmdldCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0YXJnZXQgPT0gLTEpIHtcbiAgICAgIHJldHVybiBtb3Rpb25EYXRhLnBvaW50cy5hdChwb2ludFBvc2l0aW9uKS52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWdtZW50OiBDdWJpc21Nb3Rpb25TZWdtZW50ID0gbW90aW9uRGF0YS5zZWdtZW50cy5hdCh0YXJnZXQpO1xuXG4gICAgcmV0dXJuIHNlZ21lbnQuZXZhbHVhdGUoXG4gICAgICBtb3Rpb25EYXRhLnBvaW50cy5nZXQoc2VnbWVudC5iYXNlUG9pbnRJbmRleCksXG4gICAgICB0aW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6Ljg7zjgrfjg6fjg7Pjgq/jg6njgrlcbiAgICpcbiAgICog44Oi44O844K344On44Oz44Gu44Kv44Op44K544CCXG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtTW90aW9uIGV4dGVuZHMgQUN1YmlzbU1vdGlvbiB7XG4gICAgLyoqXG4gICAgICog44Kk44Oz44K544K/44Oz44K544KS5L2c5oiQ44GZ44KLXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnVmZmVyIG1vdGlvbjMuanNvbuOBjOiqreOBv+i+vOOBvuOCjOOBpuOBhOOCi+ODkOODg+ODleOCoVxuICAgICAqIEBwYXJhbSBzaXplIOODkOODg+ODleOCoeOBruOCteOCpOOCulxuICAgICAqIEBwYXJhbSBvbkZpbmlzaGVkTW90aW9uSGFuZGxlciDjg6Ljg7zjgrfjg6fjg7Plho3nlJ/ntYLkuobmmYLjgavlkbzjgbPlh7rjgZXjgozjgovjgrPjg7zjg6vjg5Djg4Pjgq/plqLmlbBcbiAgICAgKiBAcmV0dXJuIOS9nOaIkOOBleOCjOOBn+OCpOODs+OCueOCv+ODs+OCuVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKFxuICAgICAgYnVmZmVyOiBBcnJheUJ1ZmZlcixcbiAgICAgIHNpemU6IG51bWJlcixcbiAgICAgIG9uRmluaXNoZWRNb3Rpb25IYW5kbGVyPzogRmluaXNoZWRNb3Rpb25DYWxsYmFja1xuICAgICk6IEN1YmlzbU1vdGlvbiB7XG4gICAgICBjb25zdCByZXQgPSBuZXcgQ3ViaXNtTW90aW9uKCk7XG5cbiAgICAgIHJldC5wYXJzZShidWZmZXIsIHNpemUpO1xuICAgICAgcmV0Ll9zb3VyY2VGcmFtZVJhdGUgPSByZXQuX21vdGlvbkRhdGEuZnBzO1xuICAgICAgcmV0Ll9sb29wRHVyYXRpb25TZWNvbmRzID0gcmV0Ll9tb3Rpb25EYXRhLmR1cmF0aW9uO1xuICAgICAgcmV0Ll9vbkZpbmlzaGVkTW90aW9uID0gb25GaW5pc2hlZE1vdGlvbkhhbmRsZXI7XG5cbiAgICAgIC8vIE5PVEU6IEVkaXRvcuOBp+OBr+ODq+ODvOODl+OBguOCiuOBruODouODvOOCt+ODp+ODs+abuOOBjeWHuuOBl+OBr+mdnuWvvuW/nFxuICAgICAgLy8gcmV0LT5fbG9vcCA9IChyZXQtPl9tb3Rpb25EYXRhLT5Mb29wID4gMCk7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODh+ODq+OBruODkeODqeODoeODvOOCv+OBruabtOaWsOOBruWun+ihjFxuICAgICAqIEBwYXJhbSBtb2RlbCAgICAgICAgICAgICDlr77osaHjga7jg6Ljg4fjg6tcbiAgICAgKiBAcGFyYW0gdXNlclRpbWVTZWNvbmRzICAg54++5Zyo44Gu5pmC5Yi7W+enkl1cbiAgICAgKiBAcGFyYW0gZmFkZVdlaWdodCAgICAgICAg44Oi44O844K344On44Oz44Gu6YeN44G/XG4gICAgICogQHBhcmFtIG1vdGlvblF1ZXVlRW50cnkgIEN1YmlzbU1vdGlvblF1ZXVlTWFuYWdlcuOBp+euoeeQhuOBleOCjOOBpuOBhOOCi+ODouODvOOCt+ODp+ODs1xuICAgICAqL1xuICAgIHB1YmxpYyBkb1VwZGF0ZVBhcmFtZXRlcnMoXG4gICAgICBtb2RlbDogQ3ViaXNtTW9kZWwsXG4gICAgICB1c2VyVGltZVNlY29uZHM6IG51bWJlcixcbiAgICAgIGZhZGVXZWlnaHQ6IG51bWJlcixcbiAgICAgIG1vdGlvblF1ZXVlRW50cnk6IEN1YmlzbU1vdGlvblF1ZXVlRW50cnlcbiAgICApOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLl9tb2RlbEN1cnZlSWRFeWVCbGluayA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX21vZGVsQ3VydmVJZEV5ZUJsaW5rID0gQ3ViaXNtRnJhbWV3b3JrLmdldElkTWFuYWdlcigpLmdldElkKFxuICAgICAgICAgIEVmZmVjdE5hbWVFeWVCbGlua1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fbW9kZWxDdXJ2ZUlkTGlwU3luYyA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX21vZGVsQ3VydmVJZExpcFN5bmMgPSBDdWJpc21GcmFtZXdvcmsuZ2V0SWRNYW5hZ2VyKCkuZ2V0SWQoXG4gICAgICAgICAgRWZmZWN0TmFtZUxpcFN5bmNcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHRpbWVPZmZzZXRTZWNvbmRzOiBudW1iZXIgPVxuICAgICAgICB1c2VyVGltZVNlY29uZHMgLSBtb3Rpb25RdWV1ZUVudHJ5LmdldFN0YXJ0VGltZSgpO1xuXG4gICAgICBpZiAodGltZU9mZnNldFNlY29uZHMgPCAwLjApIHtcbiAgICAgICAgdGltZU9mZnNldFNlY29uZHMgPSAwLjA7IC8vIOOCqOODqeODvOWbnumBv1xuICAgICAgfVxuXG4gICAgICBsZXQgbGlwU3luY1ZhbHVlOiBudW1iZXIgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgbGV0IGV5ZUJsaW5rVmFsdWU6IG51bWJlciA9IE51bWJlci5NQVhfVkFMVUU7XG5cbiAgICAgIC8v44G+44Gw44Gf44GN44CB44Oq44OD44OX44K344Oz44Kv44Gu44GG44Gh44Oi44O844K344On44Oz44Gu6YGp55So44KS5qSc5Ye644GZ44KL44Gf44KB44Gu44OT44OD44OI77yIbWF4RmxhZ0NvdW505YCL44G+44GnXG4gICAgICBjb25zdCBNYXhUYXJnZXRTaXplID0gNjQ7XG4gICAgICBsZXQgbGlwU3luY0ZsYWdzID0gMDtcbiAgICAgIGxldCBleWVCbGlua0ZsYWdzID0gMDtcblxuICAgICAgLy/nnqzjgY3jgIHjg6rjg4Pjg5fjgrfjg7Pjgq/jga7jgr/jg7zjgrLjg4Pjg4jmlbDjgYzkuIrpmZDjgpLotoXjgYjjgabjgYTjgovloLTlkIhcbiAgICAgIGlmICh0aGlzLl9leWVCbGlua1BhcmFtZXRlcklkcy5nZXRTaXplKCkgPiBNYXhUYXJnZXRTaXplKSB7XG4gICAgICAgIEN1YmlzbUxvZ0RlYnVnKFxuICAgICAgICAgICd0b28gbWFueSBleWUgYmxpbmsgdGFyZ2V0cyA6IHswfScsXG4gICAgICAgICAgdGhpcy5fZXllQmxpbmtQYXJhbWV0ZXJJZHMuZ2V0U2l6ZSgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fbGlwU3luY1BhcmFtZXRlcklkcy5nZXRTaXplKCkgPiBNYXhUYXJnZXRTaXplKSB7XG4gICAgICAgIEN1YmlzbUxvZ0RlYnVnKFxuICAgICAgICAgICd0b28gbWFueSBsaXAgc3luYyB0YXJnZXRzIDogezB9JyxcbiAgICAgICAgICB0aGlzLl9saXBTeW5jUGFyYW1ldGVySWRzLmdldFNpemUoKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0bXBGYWRlSW46IG51bWJlciA9XG4gICAgICAgIHRoaXMuX2ZhZGVJblNlY29uZHMgPD0gMC4wXG4gICAgICAgICAgPyAxLjBcbiAgICAgICAgICA6IEN1YmlzbU1hdGguZ2V0RWFzaW5nU2luZShcbiAgICAgICAgICAgICAgKHVzZXJUaW1lU2Vjb25kcyAtIG1vdGlvblF1ZXVlRW50cnkuZ2V0RmFkZUluU3RhcnRUaW1lKCkpIC9cbiAgICAgICAgICAgICAgICB0aGlzLl9mYWRlSW5TZWNvbmRzXG4gICAgICAgICAgICApO1xuXG4gICAgICBjb25zdCB0bXBGYWRlT3V0OiBudW1iZXIgPVxuICAgICAgICB0aGlzLl9mYWRlT3V0U2Vjb25kcyA8PSAwLjAgfHwgbW90aW9uUXVldWVFbnRyeS5nZXRFbmRUaW1lKCkgPCAwLjBcbiAgICAgICAgICA/IDEuMFxuICAgICAgICAgIDogQ3ViaXNtTWF0aC5nZXRFYXNpbmdTaW5lKFxuICAgICAgICAgICAgICAobW90aW9uUXVldWVFbnRyeS5nZXRFbmRUaW1lKCkgLSB1c2VyVGltZVNlY29uZHMpIC9cbiAgICAgICAgICAgICAgICB0aGlzLl9mYWRlT3V0U2Vjb25kc1xuICAgICAgICAgICAgKTtcbiAgICAgIGxldCB2YWx1ZTogbnVtYmVyO1xuICAgICAgbGV0IGM6IG51bWJlciwgcGFyYW1ldGVySW5kZXg6IG51bWJlcjtcblxuICAgICAgLy8gJ1JlcGVhdCcgdGltZSBhcyBuZWNlc3NhcnkuXG4gICAgICBsZXQgdGltZTogbnVtYmVyID0gdGltZU9mZnNldFNlY29uZHM7XG5cbiAgICAgIGlmICh0aGlzLl9pc0xvb3ApIHtcbiAgICAgICAgd2hpbGUgKHRpbWUgPiB0aGlzLl9tb3Rpb25EYXRhLmR1cmF0aW9uKSB7XG4gICAgICAgICAgdGltZSAtPSB0aGlzLl9tb3Rpb25EYXRhLmR1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnZlczogY3NtVmVjdG9yPEN1YmlzbU1vdGlvbkN1cnZlPiA9IHRoaXMuX21vdGlvbkRhdGEuY3VydmVzO1xuXG4gICAgICAvLyBFdmFsdWF0ZSBtb2RlbCBjdXJ2ZXMuXG4gICAgICBmb3IgKFxuICAgICAgICBjID0gMDtcbiAgICAgICAgYyA8IHRoaXMuX21vdGlvbkRhdGEuY3VydmVDb3VudCAmJlxuICAgICAgICBjdXJ2ZXMuYXQoYykudHlwZSA9PVxuICAgICAgICAgIEN1YmlzbU1vdGlvbkN1cnZlVGFyZ2V0LkN1YmlzbU1vdGlvbkN1cnZlVGFyZ2V0X01vZGVsO1xuICAgICAgICArK2NcbiAgICAgICkge1xuICAgICAgICAvLyBFdmFsdWF0ZSBjdXJ2ZSBhbmQgY2FsbCBoYW5kbGVyLlxuICAgICAgICB2YWx1ZSA9IGV2YWx1YXRlQ3VydmUodGhpcy5fbW90aW9uRGF0YSwgYywgdGltZSk7XG5cbiAgICAgICAgaWYgKGN1cnZlcy5hdChjKS5pZCA9PSB0aGlzLl9tb2RlbEN1cnZlSWRFeWVCbGluaykge1xuICAgICAgICAgIGV5ZUJsaW5rVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJ2ZXMuYXQoYykuaWQgPT0gdGhpcy5fbW9kZWxDdXJ2ZUlkTGlwU3luYykge1xuICAgICAgICAgIGxpcFN5bmNWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBwYXJhbWV0ZXJNb3Rpb25DdXJ2ZUNvdW50ID0gMDtcblxuICAgICAgZm9yIChcbiAgICAgICAgO1xuICAgICAgICBjIDwgdGhpcy5fbW90aW9uRGF0YS5jdXJ2ZUNvdW50ICYmXG4gICAgICAgIGN1cnZlcy5hdChjKS50eXBlID09XG4gICAgICAgICAgQ3ViaXNtTW90aW9uQ3VydmVUYXJnZXQuQ3ViaXNtTW90aW9uQ3VydmVUYXJnZXRfUGFyYW1ldGVyO1xuICAgICAgICArK2NcbiAgICAgICkge1xuICAgICAgICBwYXJhbWV0ZXJNb3Rpb25DdXJ2ZUNvdW50Kys7XG5cbiAgICAgICAgLy8gRmluZCBwYXJhbWV0ZXIgaW5kZXguXG4gICAgICAgIHBhcmFtZXRlckluZGV4ID0gbW9kZWwuZ2V0UGFyYW1ldGVySW5kZXgoY3VydmVzLmF0KGMpLmlkKTtcblxuICAgICAgICAvLyBTa2lwIGN1cnZlIGV2YWx1YXRpb24gaWYgbm8gdmFsdWUgaW4gc2luay5cbiAgICAgICAgaWYgKHBhcmFtZXRlckluZGV4ID09IC0xKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VWYWx1ZTogbnVtYmVyID0gbW9kZWwuZ2V0UGFyYW1ldGVyVmFsdWVCeUluZGV4KFxuICAgICAgICAgIHBhcmFtZXRlckluZGV4XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gRXZhbHVhdGUgY3VydmUgYW5kIGFwcGx5IHZhbHVlLlxuICAgICAgICB2YWx1ZSA9IGV2YWx1YXRlQ3VydmUodGhpcy5fbW90aW9uRGF0YSwgYywgdGltZSk7XG5cbiAgICAgICAgaWYgKGV5ZUJsaW5rVmFsdWUgIT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBpIDwgdGhpcy5fZXllQmxpbmtQYXJhbWV0ZXJJZHMuZ2V0U2l6ZSgpICYmIGkgPCBNYXhUYXJnZXRTaXplO1xuICAgICAgICAgICAgKytpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZXllQmxpbmtQYXJhbWV0ZXJJZHMuYXQoaSkgPT0gY3VydmVzLmF0KGMpLmlkKSB7XG4gICAgICAgICAgICAgIHZhbHVlICo9IGV5ZUJsaW5rVmFsdWU7XG4gICAgICAgICAgICAgIGV5ZUJsaW5rRmxhZ3MgfD0gMSA8PCBpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlwU3luY1ZhbHVlICE9IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgaSA8IHRoaXMuX2xpcFN5bmNQYXJhbWV0ZXJJZHMuZ2V0U2l6ZSgpICYmIGkgPCBNYXhUYXJnZXRTaXplO1xuICAgICAgICAgICAgKytpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbGlwU3luY1BhcmFtZXRlcklkcy5hdChpKSA9PSBjdXJ2ZXMuYXQoYykuaWQpIHtcbiAgICAgICAgICAgICAgdmFsdWUgKz0gbGlwU3luY1ZhbHVlO1xuICAgICAgICAgICAgICBsaXBTeW5jRmxhZ3MgfD0gMSA8PCBpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdjogbnVtYmVyO1xuXG4gICAgICAgIC8vIOODkeODqeODoeODvOOCv+OBlOOBqOOBruODleOCp+ODvOODiVxuICAgICAgICBpZiAoY3VydmVzLmF0KGMpLmZhZGVJblRpbWUgPCAwLjAgJiYgY3VydmVzLmF0KGMpLmZhZGVPdXRUaW1lIDwgMC4wKSB7XG4gICAgICAgICAgLy8g44Oi44O844K344On44Oz44Gu44OV44Kn44O844OJ44KS6YGp55SoXG4gICAgICAgICAgdiA9IHNvdXJjZVZhbHVlICsgKHZhbHVlIC0gc291cmNlVmFsdWUpICogZmFkZVdlaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyDjg5Hjg6njg6Hjg7zjgr/jgavlr77jgZfjgabjg5Xjgqfjg7zjg4njgqTjg7PjgYvjg5Xjgqfjg7zjg4njgqLjgqbjg4jjgYzoqK3lrprjgZfjgabjgYLjgovloLTlkIjjga/jgZ3jgaHjgonjgpLpgannlKhcbiAgICAgICAgICBsZXQgZmluOiBudW1iZXI7XG4gICAgICAgICAgbGV0IGZvdXQ6IG51bWJlcjtcblxuICAgICAgICAgIGlmIChjdXJ2ZXMuYXQoYykuZmFkZUluVGltZSA8IDAuMCkge1xuICAgICAgICAgICAgZmluID0gdG1wRmFkZUluO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaW4gPVxuICAgICAgICAgICAgICBjdXJ2ZXMuYXQoYykuZmFkZUluVGltZSA9PSAwLjBcbiAgICAgICAgICAgICAgICA/IDEuMFxuICAgICAgICAgICAgICAgIDogQ3ViaXNtTWF0aC5nZXRFYXNpbmdTaW5lKFxuICAgICAgICAgICAgICAgICAgICAodXNlclRpbWVTZWNvbmRzIC0gbW90aW9uUXVldWVFbnRyeS5nZXRGYWRlSW5TdGFydFRpbWUoKSkgL1xuICAgICAgICAgICAgICAgICAgICAgIGN1cnZlcy5hdChjKS5mYWRlSW5UaW1lXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjdXJ2ZXMuYXQoYykuZmFkZU91dFRpbWUgPCAwLjApIHtcbiAgICAgICAgICAgIGZvdXQgPSB0bXBGYWRlT3V0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3V0ID1cbiAgICAgICAgICAgICAgY3VydmVzLmF0KGMpLmZhZGVPdXRUaW1lID09IDAuMCB8fFxuICAgICAgICAgICAgICBtb3Rpb25RdWV1ZUVudHJ5LmdldEVuZFRpbWUoKSA8IDAuMFxuICAgICAgICAgICAgICAgID8gMS4wXG4gICAgICAgICAgICAgICAgOiBDdWJpc21NYXRoLmdldEVhc2luZ1NpbmUoXG4gICAgICAgICAgICAgICAgICAgIChtb3Rpb25RdWV1ZUVudHJ5LmdldEVuZFRpbWUoKSAtIHVzZXJUaW1lU2Vjb25kcykgL1xuICAgICAgICAgICAgICAgICAgICAgIGN1cnZlcy5hdChjKS5mYWRlT3V0VGltZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBwYXJhbVdlaWdodDogbnVtYmVyID0gdGhpcy5fd2VpZ2h0ICogZmluICogZm91dDtcblxuICAgICAgICAgIC8vIOODkeODqeODoeODvOOCv+OBlOOBqOOBruODleOCp+ODvOODieOCkumBqeeUqFxuICAgICAgICAgIHYgPSBzb3VyY2VWYWx1ZSArICh2YWx1ZSAtIHNvdXJjZVZhbHVlKSAqIHBhcmFtV2VpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgbW9kZWwuc2V0UGFyYW1ldGVyVmFsdWVCeUluZGV4KHBhcmFtZXRlckluZGV4LCB2LCAxLjApO1xuICAgICAgfVxuXG4gICAgICB7XG4gICAgICAgIGlmIChleWVCbGlua1ZhbHVlICE9IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgaSA8IHRoaXMuX2V5ZUJsaW5rUGFyYW1ldGVySWRzLmdldFNpemUoKSAmJiBpIDwgTWF4VGFyZ2V0U2l6ZTtcbiAgICAgICAgICAgICsraVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlVmFsdWU6IG51bWJlciA9IG1vZGVsLmdldFBhcmFtZXRlclZhbHVlQnlJZChcbiAgICAgICAgICAgICAgdGhpcy5fZXllQmxpbmtQYXJhbWV0ZXJJZHMuYXQoaSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIOODouODvOOCt+ODp+ODs+OBp+OBruS4iuabuOOBjeOBjOOBguOBo+OBn+aZguOBq+OBr+OBvuOBsOOBn+OBjeOBr+mBqeeUqOOBl+OBquOBhFxuICAgICAgICAgICAgaWYgKChleWVCbGlua0ZsYWdzID4+IGkpICYgMHgwMSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdjogbnVtYmVyID1cbiAgICAgICAgICAgICAgc291cmNlVmFsdWUgKyAoZXllQmxpbmtWYWx1ZSAtIHNvdXJjZVZhbHVlKSAqIGZhZGVXZWlnaHQ7XG5cbiAgICAgICAgICAgIG1vZGVsLnNldFBhcmFtZXRlclZhbHVlQnlJZCh0aGlzLl9leWVCbGlua1BhcmFtZXRlcklkcy5hdChpKSwgdik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpcFN5bmNWYWx1ZSAhPSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGkgPCB0aGlzLl9saXBTeW5jUGFyYW1ldGVySWRzLmdldFNpemUoKSAmJiBpIDwgTWF4VGFyZ2V0U2l6ZTtcbiAgICAgICAgICAgICsraVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlVmFsdWU6IG51bWJlciA9IG1vZGVsLmdldFBhcmFtZXRlclZhbHVlQnlJZChcbiAgICAgICAgICAgICAgdGhpcy5fbGlwU3luY1BhcmFtZXRlcklkcy5hdChpKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8g44Oi44O844K344On44Oz44Gn44Gu5LiK5pu444GN44GM44GC44Gj44Gf5pmC44Gr44Gv44Oq44OD44OX44K344Oz44Kv44Gv6YGp55So44GX44Gq44GEXG4gICAgICAgICAgICBpZiAoKGxpcFN5bmNGbGFncyA+PiBpKSAmIDB4MDEpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHY6IG51bWJlciA9XG4gICAgICAgICAgICAgIHNvdXJjZVZhbHVlICsgKGxpcFN5bmNWYWx1ZSAtIHNvdXJjZVZhbHVlKSAqIGZhZGVXZWlnaHQ7XG5cbiAgICAgICAgICAgIG1vZGVsLnNldFBhcmFtZXRlclZhbHVlQnlJZCh0aGlzLl9saXBTeW5jUGFyYW1ldGVySWRzLmF0KGkpLCB2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChcbiAgICAgICAgO1xuICAgICAgICBjIDwgdGhpcy5fbW90aW9uRGF0YS5jdXJ2ZUNvdW50ICYmXG4gICAgICAgIGN1cnZlcy5hdChjKS50eXBlID09XG4gICAgICAgICAgQ3ViaXNtTW90aW9uQ3VydmVUYXJnZXQuQ3ViaXNtTW90aW9uQ3VydmVUYXJnZXRfUGFydE9wYWNpdHk7XG4gICAgICAgICsrY1xuICAgICAgKSB7XG4gICAgICAgIC8vIEZpbmQgcGFyYW1ldGVyIGluZGV4LlxuICAgICAgICBwYXJhbWV0ZXJJbmRleCA9IG1vZGVsLmdldFBhcmFtZXRlckluZGV4KGN1cnZlcy5hdChjKS5pZCk7XG5cbiAgICAgICAgLy8gU2tpcCBjdXJ2ZSBldmFsdWF0aW9uIGlmIG5vIHZhbHVlIGluIHNpbmsuXG4gICAgICAgIGlmIChwYXJhbWV0ZXJJbmRleCA9PSAtMSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXZhbHVhdGUgY3VydmUgYW5kIGFwcGx5IHZhbHVlLlxuICAgICAgICB2YWx1ZSA9IGV2YWx1YXRlQ3VydmUodGhpcy5fbW90aW9uRGF0YSwgYywgdGltZSk7XG5cbiAgICAgICAgbW9kZWwuc2V0UGFyYW1ldGVyVmFsdWVCeUluZGV4KHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aW1lT2Zmc2V0U2Vjb25kcyA+PSB0aGlzLl9tb3Rpb25EYXRhLmR1cmF0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0xvb3ApIHtcbiAgICAgICAgICBtb3Rpb25RdWV1ZUVudHJ5LnNldFN0YXJ0VGltZSh1c2VyVGltZVNlY29uZHMpOyAvLyDmnIDliJ3jga7nirbmhYvjgbhcbiAgICAgICAgICBpZiAodGhpcy5faXNMb29wRmFkZUluKSB7XG4gICAgICAgICAgICAvLyDjg6vjg7zjg5flhoXjgafjg6vjg7zjg5fnlKjjg5Xjgqfjg7zjg4njgqTjg7PjgYzmnInlirnjga7mmYLjga/jgIHjg5Xjgqfjg7zjg4njgqTjg7PoqK3lrprjgZfnm7TjgZdcbiAgICAgICAgICAgIG1vdGlvblF1ZXVlRW50cnkuc2V0RmFkZUluU3RhcnRUaW1lKHVzZXJUaW1lU2Vjb25kcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLl9vbkZpbmlzaGVkTW90aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkZpbmlzaGVkTW90aW9uKHRoaXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1vdGlvblF1ZXVlRW50cnkuc2V0SXNGaW5pc2hlZCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fbGFzdFdlaWdodCA9IGZhZGVXZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Or44O844OX5oOF5aCx44Gu6Kit5a6aXG4gICAgICogQHBhcmFtIGxvb3Ag44Or44O844OX5oOF5aCxXG4gICAgICovXG4gICAgcHVibGljIHNldElzTG9vcChsb29wOiBib29sZWFuKTogdm9pZCB7XG4gICAgICB0aGlzLl9pc0xvb3AgPSBsb29wO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODq+ODvOODl+aDheWgseOBruWPluW+l1xuICAgICAqIEByZXR1cm4gdHJ1ZSDjg6vjg7zjg5fjgZnjgotcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOODq+ODvOODl+OBl+OBquOBhFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0xvb3AoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5faXNMb29wO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODq+ODvOODl+aZguOBruODleOCp+ODvOODieOCpOODs+aDheWgseOBruioreWumlxuICAgICAqIEBwYXJhbSBsb29wRmFkZUluICDjg6vjg7zjg5fmmYLjga7jg5Xjgqfjg7zjg4njgqTjg7Pmg4XloLFcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0SXNMb29wRmFkZUluKGxvb3BGYWRlSW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHRoaXMuX2lzTG9vcEZhZGVJbiA9IGxvb3BGYWRlSW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Or44O844OX5pmC44Gu44OV44Kn44O844OJ44Kk44Oz5oOF5aCx44Gu5Y+W5b6XXG4gICAgICpcbiAgICAgKiBAcmV0dXJuICB0cnVlICAgIOOBmeOCi1xuICAgICAqIEByZXR1cm4gIGZhbHNlICAg44GX44Gq44GEXG4gICAgICovXG4gICAgcHVibGljIGlzTG9vcEZhZGVJbigpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9pc0xvb3BGYWRlSW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz44Gu6ZW344GV44KS5Y+W5b6X44GZ44KL44CCXG4gICAgICpcbiAgICAgKiBAcmV0dXJuICDjg6Ljg7zjgrfjg6fjg7Pjga7plbfjgZVb56eSXVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREdXJhdGlvbigpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2lzTG9vcCA/IC0xLjAgOiB0aGlzLl9sb29wRHVyYXRpb25TZWNvbmRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+OBruODq+ODvOODl+aZguOBrumVt+OBleOCkuWPluW+l+OBmeOCi+OAglxuICAgICAqXG4gICAgICogQHJldHVybiAg44Oi44O844K344On44Oz44Gu44Or44O844OX5pmC44Gu6ZW344GVW+enkl1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TG9vcER1cmF0aW9uKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fbG9vcER1cmF0aW9uU2Vjb25kcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Hjg6njg6Hjg7zjgr/jgavlr77jgZnjgovjg5Xjgqfjg7zjg4njgqTjg7Pjga7mmYLplpPjgpLoqK3lrprjgZnjgovjgIJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJZCAgICAg44OR44Op44Oh44O844K/SURcbiAgICAgKiBAcGFyYW0gdmFsdWUgICAgICAgICAgIOODleOCp+ODvOODieOCpOODs+OBq+OBi+OBi+OCi+aZgumWk1vnp5JdXG4gICAgICovXG4gICAgcHVibGljIHNldFBhcmFtZXRlckZhZGVJblRpbWUoXG4gICAgICBwYXJhbWV0ZXJJZDogQ3ViaXNtSWRIYW5kbGUsXG4gICAgICB2YWx1ZTogbnVtYmVyXG4gICAgKTogdm9pZCB7XG4gICAgICBjb25zdCBjdXJ2ZXM6IGNzbVZlY3RvcjxDdWJpc21Nb3Rpb25DdXJ2ZT4gPSB0aGlzLl9tb3Rpb25EYXRhLmN1cnZlcztcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9tb3Rpb25EYXRhLmN1cnZlQ291bnQ7ICsraSkge1xuICAgICAgICBpZiAocGFyYW1ldGVySWQgPT0gY3VydmVzLmF0KGkpLmlkKSB7XG4gICAgICAgICAgY3VydmVzLmF0KGkpLmZhZGVJblRpbWUgPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Hjg6njg6Hjg7zjgr/jgavlr77jgZnjgovjg5Xjgqfjg7zjg4njgqLjgqbjg4jjga7mmYLplpPjga7oqK3lrppcbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVySWQgICAgIOODkeODqeODoeODvOOCv0lEXG4gICAgICogQHBhcmFtIHZhbHVlICAgICAgICAgICDjg5Xjgqfjg7zjg4njgqLjgqbjg4jjgavjgYvjgYvjgovmmYLplpNb56eSXVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRQYXJhbWV0ZXJGYWRlT3V0VGltZShcbiAgICAgIHBhcmFtZXRlcklkOiBDdWJpc21JZEhhbmRsZSxcbiAgICAgIHZhbHVlOiBudW1iZXJcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IGN1cnZlczogY3NtVmVjdG9yPEN1YmlzbU1vdGlvbkN1cnZlPiA9IHRoaXMuX21vdGlvbkRhdGEuY3VydmVzO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX21vdGlvbkRhdGEuY3VydmVDb3VudDsgKytpKSB7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJJZCA9PSBjdXJ2ZXMuYXQoaSkuaWQpIHtcbiAgICAgICAgICBjdXJ2ZXMuYXQoaSkuZmFkZU91dFRpbWUgPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Hjg6njg6Hjg7zjgr/jgavlr77jgZnjgovjg5Xjgqfjg7zjg4njgqTjg7Pjga7mmYLplpPjga7lj5blvpdcbiAgICAgKiBAcGFyYW0gICAgcGFyYW1ldGVySWQgICAgIOODkeODqeODoeODvOOCv0lEXG4gICAgICogQHJldHVybiAgIOODleOCp+ODvOODieOCpOODs+OBq+OBi+OBi+OCi+aZgumWk1vnp5JdXG4gICAgICovXG4gICAgcHVibGljIGdldFBhcmFtZXRlckZhZGVJblRpbWUocGFyYW1ldGVySWQ6IEN1YmlzbUlkSGFuZGxlKTogbnVtYmVyIHtcbiAgICAgIGNvbnN0IGN1cnZlczogY3NtVmVjdG9yPEN1YmlzbU1vdGlvbkN1cnZlPiA9IHRoaXMuX21vdGlvbkRhdGEuY3VydmVzO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX21vdGlvbkRhdGEuY3VydmVDb3VudDsgKytpKSB7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJJZCA9PSBjdXJ2ZXMuYXQoaSkuaWQpIHtcbiAgICAgICAgICByZXR1cm4gY3VydmVzLmF0KGkpLmZhZGVJblRpbWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODkeODqeODoeODvOOCv+OBq+WvvuOBmeOCi+ODleOCp+ODvOODieOCouOCpuODiOOBruaZgumWk+OCkuWPluW+l1xuICAgICAqXG4gICAgICogQHBhcmFtICAgcGFyYW1ldGVySWQgICAgIOODkeODqeODoeODvOOCv0lEXG4gICAgICogQHJldHVybiAgIOODleOCp+ODvOODieOCouOCpuODiOOBq+OBi+OBi+OCi+aZgumWk1vnp5JdXG4gICAgICovXG4gICAgcHVibGljIGdldFBhcmFtZXRlckZhZGVPdXRUaW1lKHBhcmFtZXRlcklkOiBDdWJpc21JZEhhbmRsZSk6IG51bWJlciB7XG4gICAgICBjb25zdCBjdXJ2ZXM6IGNzbVZlY3RvcjxDdWJpc21Nb3Rpb25DdXJ2ZT4gPSB0aGlzLl9tb3Rpb25EYXRhLmN1cnZlcztcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9tb3Rpb25EYXRhLmN1cnZlQ291bnQ7ICsraSkge1xuICAgICAgICBpZiAocGFyYW1ldGVySWQgPT0gY3VydmVzLmF0KGkpLmlkKSB7XG4gICAgICAgICAgcmV0dXJuIGN1cnZlcy5hdChpKS5mYWRlT3V0VGltZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6Ieq5YuV44Ko44OV44Kn44Kv44OI44GM44GL44GL44Gj44Gm44GE44KL44OR44Op44Oh44O844K/SUTjg6rjgrnjg4jjga7oqK3lrppcbiAgICAgKiBAcGFyYW0gZXllQmxpbmtQYXJhbWV0ZXJJZHMgICAg6Ieq5YuV44G+44Gw44Gf44GN44GM44GL44GL44Gj44Gm44GE44KL44OR44Op44Oh44O844K/SUTjga7jg6rjgrnjg4hcbiAgICAgKiBAcGFyYW0gbGlwU3luY1BhcmFtZXRlcklkcyAgICAg44Oq44OD44OX44K344Oz44Kv44GM44GL44GL44Gj44Gm44GE44KL44OR44Op44Oh44O844K/SUTjga7jg6rjgrnjg4hcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RWZmZWN0SWRzKFxuICAgICAgZXllQmxpbmtQYXJhbWV0ZXJJZHM6IGNzbVZlY3RvcjxDdWJpc21JZEhhbmRsZT4sXG4gICAgICBsaXBTeW5jUGFyYW1ldGVySWRzOiBjc21WZWN0b3I8Q3ViaXNtSWRIYW5kbGU+XG4gICAgKTogdm9pZCB7XG4gICAgICB0aGlzLl9leWVCbGlua1BhcmFtZXRlcklkcyA9IGV5ZUJsaW5rUGFyYW1ldGVySWRzO1xuICAgICAgdGhpcy5fbGlwU3luY1BhcmFtZXRlcklkcyA9IGxpcFN5bmNQYXJhbWV0ZXJJZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIHRoaXMuX3NvdXJjZUZyYW1lUmF0ZSA9IDMwLjA7XG4gICAgICB0aGlzLl9sb29wRHVyYXRpb25TZWNvbmRzID0gLTEuMDtcbiAgICAgIHRoaXMuX2lzTG9vcCA9IGZhbHNlOyAvLyB0cnVl44GL44KJIGZhbHNlIOOBuOODh+ODleOCqeODq+ODiOOCkuWkieabtFxuICAgICAgdGhpcy5faXNMb29wRmFkZUluID0gdHJ1ZTsgLy8g44Or44O844OX5pmC44Gr44OV44Kn44O844OJ44Kk44Oz44GM5pyJ5Yq544GL44Gp44GG44GL44Gu44OV44Op44KwXG4gICAgICB0aGlzLl9sYXN0V2VpZ2h0ID0gMC4wO1xuICAgICAgdGhpcy5fbW90aW9uRGF0YSA9IG51bGw7XG4gICAgICB0aGlzLl9tb2RlbEN1cnZlSWRFeWVCbGluayA9IG51bGw7XG4gICAgICB0aGlzLl9tb2RlbEN1cnZlSWRMaXBTeW5jID0gbnVsbDtcbiAgICAgIHRoaXMuX2V5ZUJsaW5rUGFyYW1ldGVySWRzID0gbnVsbDtcbiAgICAgIHRoaXMuX2xpcFN5bmNQYXJhbWV0ZXJJZHMgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODh+OCueODiOODqeOCr+OCv+ebuOW9k+OBruWHpueQhlxuICAgICAqL1xuICAgIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgICAgdGhpcy5fbW90aW9uRGF0YSA9IHZvaWQgMDtcbiAgICAgIHRoaXMuX21vdGlvbkRhdGEgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIG1vdGlvbjMuanNvbuOCkuODkeODvOOCueOBmeOCi+OAglxuICAgICAqXG4gICAgICogQHBhcmFtIG1vdGlvbkpzb24gIG1vdGlvbjMuanNvbuOBjOiqreOBv+i+vOOBvuOCjOOBpuOBhOOCi+ODkOODg+ODleOCoVxuICAgICAqIEBwYXJhbSBzaXplICAgICAgICDjg5Djg4Pjg5XjgqHjga7jgrXjgqTjgrpcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyc2UobW90aW9uSnNvbjogQXJyYXlCdWZmZXIsIHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy5fbW90aW9uRGF0YSA9IG5ldyBDdWJpc21Nb3Rpb25EYXRhKCk7XG5cbiAgICAgIGxldCBqc29uOiBDdWJpc21Nb3Rpb25Kc29uID0gbmV3IEN1YmlzbU1vdGlvbkpzb24obW90aW9uSnNvbiwgc2l6ZSk7XG5cbiAgICAgIHRoaXMuX21vdGlvbkRhdGEuZHVyYXRpb24gPSBqc29uLmdldE1vdGlvbkR1cmF0aW9uKCk7XG4gICAgICB0aGlzLl9tb3Rpb25EYXRhLmxvb3AgPSBqc29uLmlzTW90aW9uTG9vcCgpO1xuICAgICAgdGhpcy5fbW90aW9uRGF0YS5jdXJ2ZUNvdW50ID0ganNvbi5nZXRNb3Rpb25DdXJ2ZUNvdW50KCk7XG4gICAgICB0aGlzLl9tb3Rpb25EYXRhLmZwcyA9IGpzb24uZ2V0TW90aW9uRnBzKCk7XG4gICAgICB0aGlzLl9tb3Rpb25EYXRhLmV2ZW50Q291bnQgPSBqc29uLmdldEV2ZW50Q291bnQoKTtcblxuICAgICAgaWYgKGpzb24uaXNFeGlzdE1vdGlvbkZhZGVJblRpbWUoKSkge1xuICAgICAgICB0aGlzLl9mYWRlSW5TZWNvbmRzID1cbiAgICAgICAgICBqc29uLmdldE1vdGlvbkZhZGVJblRpbWUoKSA8IDAuMCA/IDEuMCA6IGpzb24uZ2V0TW90aW9uRmFkZUluVGltZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZmFkZUluU2Vjb25kcyA9IDEuMDtcbiAgICAgIH1cblxuICAgICAgaWYgKGpzb24uaXNFeGlzdE1vdGlvbkZhZGVPdXRUaW1lKCkpIHtcbiAgICAgICAgdGhpcy5fZmFkZU91dFNlY29uZHMgPVxuICAgICAgICAgIGpzb24uZ2V0TW90aW9uRmFkZU91dFRpbWUoKSA8IDAuMCA/IDEuMCA6IGpzb24uZ2V0TW90aW9uRmFkZU91dFRpbWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2ZhZGVPdXRTZWNvbmRzID0gMS4wO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9tb3Rpb25EYXRhLmN1cnZlcy51cGRhdGVTaXplKFxuICAgICAgICB0aGlzLl9tb3Rpb25EYXRhLmN1cnZlQ291bnQsXG4gICAgICAgIEN1YmlzbU1vdGlvbkN1cnZlLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgdGhpcy5fbW90aW9uRGF0YS5zZWdtZW50cy51cGRhdGVTaXplKFxuICAgICAgICBqc29uLmdldE1vdGlvblRvdGFsU2VnbWVudENvdW50KCksXG4gICAgICAgIEN1YmlzbU1vdGlvblNlZ21lbnQsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICB0aGlzLl9tb3Rpb25EYXRhLnBvaW50cy51cGRhdGVTaXplKFxuICAgICAgICBqc29uLmdldE1vdGlvblRvdGFsUG9pbnRDb3VudCgpLFxuICAgICAgICBDdWJpc21Nb3Rpb25Qb2ludCxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIHRoaXMuX21vdGlvbkRhdGEuZXZlbnRzLnVwZGF0ZVNpemUoXG4gICAgICAgIHRoaXMuX21vdGlvbkRhdGEuZXZlbnRDb3VudCxcbiAgICAgICAgQ3ViaXNtTW90aW9uRXZlbnQsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICAgIGxldCB0b3RhbFBvaW50Q291bnQgPSAwO1xuICAgICAgbGV0IHRvdGFsU2VnbWVudENvdW50ID0gMDtcblxuICAgICAgLy8gQ3VydmVzXG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgY3VydmVDb3VudCA9IDA7XG4gICAgICAgIGN1cnZlQ291bnQgPCB0aGlzLl9tb3Rpb25EYXRhLmN1cnZlQ291bnQ7XG4gICAgICAgICsrY3VydmVDb3VudFxuICAgICAgKSB7XG4gICAgICAgIGlmIChqc29uLmdldE1vdGlvbkN1cnZlVGFyZ2V0KGN1cnZlQ291bnQpID09IFRhcmdldE5hbWVNb2RlbCkge1xuICAgICAgICAgIHRoaXMuX21vdGlvbkRhdGEuY3VydmVzLmF0KGN1cnZlQ291bnQpLnR5cGUgPVxuICAgICAgICAgICAgQ3ViaXNtTW90aW9uQ3VydmVUYXJnZXQuQ3ViaXNtTW90aW9uQ3VydmVUYXJnZXRfTW9kZWw7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAganNvbi5nZXRNb3Rpb25DdXJ2ZVRhcmdldChjdXJ2ZUNvdW50KSA9PSBUYXJnZXROYW1lUGFyYW1ldGVyXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuX21vdGlvbkRhdGEuY3VydmVzLmF0KGN1cnZlQ291bnQpLnR5cGUgPVxuICAgICAgICAgICAgQ3ViaXNtTW90aW9uQ3VydmVUYXJnZXQuQ3ViaXNtTW90aW9uQ3VydmVUYXJnZXRfUGFyYW1ldGVyO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGpzb24uZ2V0TW90aW9uQ3VydmVUYXJnZXQoY3VydmVDb3VudCkgPT0gVGFyZ2V0TmFtZVBhcnRPcGFjaXR5XG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuX21vdGlvbkRhdGEuY3VydmVzLmF0KGN1cnZlQ291bnQpLnR5cGUgPVxuICAgICAgICAgICAgQ3ViaXNtTW90aW9uQ3VydmVUYXJnZXQuQ3ViaXNtTW90aW9uQ3VydmVUYXJnZXRfUGFydE9wYWNpdHk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tb3Rpb25EYXRhLmN1cnZlcy5hdChjdXJ2ZUNvdW50KS5pZCA9IGpzb24uZ2V0TW90aW9uQ3VydmVJZChcbiAgICAgICAgICBjdXJ2ZUNvdW50XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5fbW90aW9uRGF0YS5jdXJ2ZXMuYXQoXG4gICAgICAgICAgY3VydmVDb3VudFxuICAgICAgICApLmJhc2VTZWdtZW50SW5kZXggPSB0b3RhbFNlZ21lbnRDb3VudDtcblxuICAgICAgICB0aGlzLl9tb3Rpb25EYXRhLmN1cnZlcy5hdChcbiAgICAgICAgICBjdXJ2ZUNvdW50XG4gICAgICAgICkuZmFkZUluVGltZSA9IGpzb24uaXNFeGlzdE1vdGlvbkN1cnZlRmFkZUluVGltZShjdXJ2ZUNvdW50KVxuICAgICAgICAgID8ganNvbi5nZXRNb3Rpb25DdXJ2ZUZhZGVJblRpbWUoY3VydmVDb3VudClcbiAgICAgICAgICA6IC0xLjA7XG4gICAgICAgIHRoaXMuX21vdGlvbkRhdGEuY3VydmVzLmF0KFxuICAgICAgICAgIGN1cnZlQ291bnRcbiAgICAgICAgKS5mYWRlT3V0VGltZSA9IGpzb24uaXNFeGlzdE1vdGlvbkN1cnZlRmFkZU91dFRpbWUoY3VydmVDb3VudClcbiAgICAgICAgICA/IGpzb24uZ2V0TW90aW9uQ3VydmVGYWRlT3V0VGltZShjdXJ2ZUNvdW50KVxuICAgICAgICAgIDogLTEuMDtcblxuICAgICAgICAvLyBTZWdtZW50c1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIGxldCBzZWdtZW50UG9zaXRpb24gPSAwO1xuICAgICAgICAgIHNlZ21lbnRQb3NpdGlvbiA8IGpzb24uZ2V0TW90aW9uQ3VydmVTZWdtZW50Q291bnQoY3VydmVDb3VudCk7XG5cbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHNlZ21lbnRQb3NpdGlvbiA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9tb3Rpb25EYXRhLnNlZ21lbnRzLmF0KFxuICAgICAgICAgICAgICB0b3RhbFNlZ21lbnRDb3VudFxuICAgICAgICAgICAgKS5iYXNlUG9pbnRJbmRleCA9IHRvdGFsUG9pbnRDb3VudDtcblxuICAgICAgICAgICAgdGhpcy5fbW90aW9uRGF0YS5wb2ludHMuYXQoXG4gICAgICAgICAgICAgIHRvdGFsUG9pbnRDb3VudFxuICAgICAgICAgICAgKS50aW1lID0ganNvbi5nZXRNb3Rpb25DdXJ2ZVNlZ21lbnQoY3VydmVDb3VudCwgc2VnbWVudFBvc2l0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuX21vdGlvbkRhdGEucG9pbnRzLmF0KFxuICAgICAgICAgICAgICB0b3RhbFBvaW50Q291bnRcbiAgICAgICAgICAgICkudmFsdWUgPSBqc29uLmdldE1vdGlvbkN1cnZlU2VnbWVudChcbiAgICAgICAgICAgICAgY3VydmVDb3VudCxcbiAgICAgICAgICAgICAgc2VnbWVudFBvc2l0aW9uICsgMVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdG90YWxQb2ludENvdW50ICs9IDE7XG4gICAgICAgICAgICBzZWdtZW50UG9zaXRpb24gKz0gMjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbW90aW9uRGF0YS5zZWdtZW50cy5hdCh0b3RhbFNlZ21lbnRDb3VudCkuYmFzZVBvaW50SW5kZXggPVxuICAgICAgICAgICAgICB0b3RhbFBvaW50Q291bnQgLSAxO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNlZ21lbnQ6IG51bWJlciA9IGpzb24uZ2V0TW90aW9uQ3VydmVTZWdtZW50KFxuICAgICAgICAgICAgY3VydmVDb3VudCxcbiAgICAgICAgICAgIHNlZ21lbnRQb3NpdGlvblxuICAgICAgICAgICk7XG4gICAgICAgICAgc3dpdGNoIChzZWdtZW50KSB7XG4gICAgICAgICAgICBjYXNlIEN1YmlzbU1vdGlvblNlZ21lbnRUeXBlLkN1YmlzbU1vdGlvblNlZ21lbnRUeXBlX0xpbmVhcjoge1xuICAgICAgICAgICAgICB0aGlzLl9tb3Rpb25EYXRhLnNlZ21lbnRzLmF0KHRvdGFsU2VnbWVudENvdW50KS5zZWdtZW50VHlwZSA9XG4gICAgICAgICAgICAgICAgQ3ViaXNtTW90aW9uU2VnbWVudFR5cGUuQ3ViaXNtTW90aW9uU2VnbWVudFR5cGVfTGluZWFyO1xuICAgICAgICAgICAgICB0aGlzLl9tb3Rpb25EYXRhLnNlZ21lbnRzLmF0KFxuICAgICAgICAgICAgICAgIHRvdGFsU2VnbWVudENvdW50XG4gICAgICAgICAgICAgICkuZXZhbHVhdGUgPSBsaW5lYXJFdmFsdWF0ZTtcblxuICAgICAgICAgICAgICB0aGlzLl9tb3Rpb25EYXRhLnBvaW50cy5hdChcbiAgICAgICAgICAgICAgICB0b3RhbFBvaW50Q291bnRcbiAgICAgICAgICAgICAgKS50aW1lID0ganNvbi5nZXRNb3Rpb25DdXJ2ZVNlZ21lbnQoXG4gICAgICAgICAgICAgICAgY3VydmVDb3VudCxcbiAgICAgICAgICAgICAgICBzZWdtZW50UG9zaXRpb24gKyAxXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuX21vdGlvbkRhdGEucG9pbnRzLmF0KFxuICAgICAgICAgICAgICAgIHRvdGFsUG9pbnRDb3VudFxuICAgICAgICAgICAgICApLnZhbHVlID0ganNvbi5nZXRNb3Rpb25DdXJ2ZVNlZ21lbnQoXG4gICAgICAgICAgICAgICAgY3VydmVDb3VudCxcbiAgICAgICAgICAgICAgICBzZWdtZW50UG9zaXRpb24gKyAyXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgdG90YWxQb2ludENvdW50ICs9IDE7XG4gICAgICAgICAgICAgIHNlZ21lbnRQb3NpdGlvbiArPSAzO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBDdWJpc21Nb3Rpb25TZWdtZW50VHlwZS5DdWJpc21Nb3Rpb25TZWdtZW50VHlwZV9CZXppZXI6IHtcbiAgICAgICAgICAgICAgdGhpcy5fbW90aW9uRGF0YS5zZWdtZW50cy5hdCh0b3RhbFNlZ21lbnRDb3VudCkuc2VnbWVudFR5cGUgPVxuICAgICAgICAgICAgICAgIEN1YmlzbU1vdGlvblNlZ21lbnRUeXBlLkN1YmlzbU1vdGlvblNlZ21lbnRUeXBlX0JlemllcjtcbiAgICAgICAgICAgICAgdGhpcy5fbW90aW9uRGF0YS5zZWdtZW50cy5hdChcbiAgICAgICAgICAgICAgICB0b3RhbFNlZ21lbnRDb3VudFxuICAgICAgICAgICAgICApLmV2YWx1YXRlID0gYmV6aWVyRXZhbHVhdGU7XG5cbiAgICAgICAgICAgICAgdGhpcy5fbW90aW9uRGF0YS5wb2ludHMuYXQoXG4gICAgICAgICAgICAgICAgdG90YWxQb2ludENvdW50XG4gICAgICAgICAgICAgICkudGltZSA9IGpzb24uZ2V0TW90aW9uQ3VydmVTZWdtZW50KFxuICAgICAgICAgICAgICAgIGN1cnZlQ291bnQsXG4gICAgICAgICAgICAgICAgc2VnbWVudFBvc2l0aW9uICsgMVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLl9tb3Rpb25EYXRhLnBvaW50cy5hdChcbiAgICAgICAgICAgICAgICB0b3RhbFBvaW50Q291bnRcbiAgICAgICAgICAgICAgKS52YWx1ZSA9IGpzb24uZ2V0TW90aW9uQ3VydmVTZWdtZW50KFxuICAgICAgICAgICAgICAgIGN1cnZlQ291bnQsXG4gICAgICAgICAgICAgICAgc2VnbWVudFBvc2l0aW9uICsgMlxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHRoaXMuX21vdGlvbkRhdGEucG9pbnRzLmF0KFxuICAgICAgICAgICAgICAgIHRvdGFsUG9pbnRDb3VudCArIDFcbiAgICAgICAgICAgICAgKS50aW1lID0ganNvbi5nZXRNb3Rpb25DdXJ2ZVNlZ21lbnQoXG4gICAgICAgICAgICAgICAgY3VydmVDb3VudCxcbiAgICAgICAgICAgICAgICBzZWdtZW50UG9zaXRpb24gKyAzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuX21vdGlvbkRhdGEucG9pbnRzLmF0KFxuICAgICAgICAgICAgICAgIHRvdGFsUG9pbnRDb3VudCArIDFcbiAgICAgICAgICAgICAgKS52YWx1ZSA9IGpzb24uZ2V0TW90aW9uQ3VydmVTZWdtZW50KFxuICAgICAgICAgICAgICAgIGN1cnZlQ291bnQsXG4gICAgICAgICAgICAgICAgc2VnbWVudFBvc2l0aW9uICsgNFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHRoaXMuX21vdGlvbkRhdGEucG9pbnRzLmF0KFxuICAgICAgICAgICAgICAgIHRvdGFsUG9pbnRDb3VudCArIDJcbiAgICAgICAgICAgICAgKS50aW1lID0ganNvbi5nZXRNb3Rpb25DdXJ2ZVNlZ21lbnQoXG4gICAgICAgICAgICAgICAgY3VydmVDb3VudCxcbiAgICAgICAgICAgICAgICBzZWdtZW50UG9zaXRpb24gKyA1XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuX21vdGlvbkRhdGEucG9pbnRzLmF0KFxuICAgICAgICAgICAgICAgIHRvdGFsUG9pbnRDb3VudCArIDJcbiAgICAgICAgICAgICAgKS52YWx1ZSA9IGpzb24uZ2V0TW90aW9uQ3VydmVTZWdtZW50KFxuICAgICAgICAgICAgICAgIGN1cnZlQ291bnQsXG4gICAgICAgICAgICAgICAgc2VnbWVudFBvc2l0aW9uICsgNlxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHRvdGFsUG9pbnRDb3VudCArPSAzO1xuICAgICAgICAgICAgICBzZWdtZW50UG9zaXRpb24gKz0gNztcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBDdWJpc21Nb3Rpb25TZWdtZW50VHlwZS5DdWJpc21Nb3Rpb25TZWdtZW50VHlwZV9TdGVwcGVkOiB7XG4gICAgICAgICAgICAgIHRoaXMuX21vdGlvbkRhdGEuc2VnbWVudHMuYXQodG90YWxTZWdtZW50Q291bnQpLnNlZ21lbnRUeXBlID1cbiAgICAgICAgICAgICAgICBDdWJpc21Nb3Rpb25TZWdtZW50VHlwZS5DdWJpc21Nb3Rpb25TZWdtZW50VHlwZV9TdGVwcGVkO1xuICAgICAgICAgICAgICB0aGlzLl9tb3Rpb25EYXRhLnNlZ21lbnRzLmF0KFxuICAgICAgICAgICAgICAgIHRvdGFsU2VnbWVudENvdW50XG4gICAgICAgICAgICAgICkuZXZhbHVhdGUgPSBzdGVwcGVkRXZhbHVhdGU7XG5cbiAgICAgICAgICAgICAgdGhpcy5fbW90aW9uRGF0YS5wb2ludHMuYXQoXG4gICAgICAgICAgICAgICAgdG90YWxQb2ludENvdW50XG4gICAgICAgICAgICAgICkudGltZSA9IGpzb24uZ2V0TW90aW9uQ3VydmVTZWdtZW50KFxuICAgICAgICAgICAgICAgIGN1cnZlQ291bnQsXG4gICAgICAgICAgICAgICAgc2VnbWVudFBvc2l0aW9uICsgMVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLl9tb3Rpb25EYXRhLnBvaW50cy5hdChcbiAgICAgICAgICAgICAgICB0b3RhbFBvaW50Q291bnRcbiAgICAgICAgICAgICAgKS52YWx1ZSA9IGpzb24uZ2V0TW90aW9uQ3VydmVTZWdtZW50KFxuICAgICAgICAgICAgICAgIGN1cnZlQ291bnQsXG4gICAgICAgICAgICAgICAgc2VnbWVudFBvc2l0aW9uICsgMlxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHRvdGFsUG9pbnRDb3VudCArPSAxO1xuICAgICAgICAgICAgICBzZWdtZW50UG9zaXRpb24gKz0gMztcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBDdWJpc21Nb3Rpb25TZWdtZW50VHlwZS5DdWJpc21Nb3Rpb25TZWdtZW50VHlwZV9JbnZlcnNlU3RlcHBlZDoge1xuICAgICAgICAgICAgICB0aGlzLl9tb3Rpb25EYXRhLnNlZ21lbnRzLmF0KHRvdGFsU2VnbWVudENvdW50KS5zZWdtZW50VHlwZSA9XG4gICAgICAgICAgICAgICAgQ3ViaXNtTW90aW9uU2VnbWVudFR5cGUuQ3ViaXNtTW90aW9uU2VnbWVudFR5cGVfSW52ZXJzZVN0ZXBwZWQ7XG4gICAgICAgICAgICAgIHRoaXMuX21vdGlvbkRhdGEuc2VnbWVudHMuYXQoXG4gICAgICAgICAgICAgICAgdG90YWxTZWdtZW50Q291bnRcbiAgICAgICAgICAgICAgKS5ldmFsdWF0ZSA9IGludmVyc2VTdGVwcGVkRXZhbHVhdGU7XG5cbiAgICAgICAgICAgICAgdGhpcy5fbW90aW9uRGF0YS5wb2ludHMuYXQoXG4gICAgICAgICAgICAgICAgdG90YWxQb2ludENvdW50XG4gICAgICAgICAgICAgICkudGltZSA9IGpzb24uZ2V0TW90aW9uQ3VydmVTZWdtZW50KFxuICAgICAgICAgICAgICAgIGN1cnZlQ291bnQsXG4gICAgICAgICAgICAgICAgc2VnbWVudFBvc2l0aW9uICsgMVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0aGlzLl9tb3Rpb25EYXRhLnBvaW50cy5hdChcbiAgICAgICAgICAgICAgICB0b3RhbFBvaW50Q291bnRcbiAgICAgICAgICAgICAgKS52YWx1ZSA9IGpzb24uZ2V0TW90aW9uQ3VydmVTZWdtZW50KFxuICAgICAgICAgICAgICAgIGN1cnZlQ291bnQsXG4gICAgICAgICAgICAgICAgc2VnbWVudFBvc2l0aW9uICsgMlxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHRvdGFsUG9pbnRDb3VudCArPSAxO1xuICAgICAgICAgICAgICBzZWdtZW50UG9zaXRpb24gKz0gMztcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgQ1NNX0FTU0VSVCgwKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgKyt0aGlzLl9tb3Rpb25EYXRhLmN1cnZlcy5hdChjdXJ2ZUNvdW50KS5zZWdtZW50Q291bnQ7XG4gICAgICAgICAgKyt0b3RhbFNlZ21lbnRDb3VudDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgdXNlcmRhdGFjb3VudCA9IDA7XG4gICAgICAgIHVzZXJkYXRhY291bnQgPCBqc29uLmdldEV2ZW50Q291bnQoKTtcbiAgICAgICAgKyt1c2VyZGF0YWNvdW50XG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fbW90aW9uRGF0YS5ldmVudHMuYXQodXNlcmRhdGFjb3VudCkuZmlyZVRpbWUgPSBqc29uLmdldEV2ZW50VGltZShcbiAgICAgICAgICB1c2VyZGF0YWNvdW50XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX21vdGlvbkRhdGEuZXZlbnRzLmF0KHVzZXJkYXRhY291bnQpLnZhbHVlID0ganNvbi5nZXRFdmVudFZhbHVlKFxuICAgICAgICAgIHVzZXJkYXRhY291bnRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAganNvbi5yZWxlYXNlKCk7XG4gICAgICBqc29uID0gdm9pZCAwO1xuICAgICAganNvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44OH44Or44Gu44OR44Op44Oh44O844K/5pu05pawXG4gICAgICpcbiAgICAgKiDjgqTjg5njg7Pjg4jnmbrngavjga7jg4Hjgqfjg4Pjgq/jgIJcbiAgICAgKiDlhaXlipvjgZnjgovmmYLplpPjga/lkbzjgbDjgozjgovjg6Ljg7zjgrfjg6fjg7Pjgr/jgqTjg5/jg7PjgrDjgpLvvJDjgajjgZfjgZ/np5LmlbDjgafooYzjgYbjgIJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBiZWZvcmVDaGVja1RpbWVTZWNvbmRzICAg5YmN5Zue44Gu44Kk44OZ44Oz44OI44OB44Kn44OD44Kv5pmC6ZaTW+enkl1cbiAgICAgKiBAcGFyYW0gbW90aW9uVGltZVNlY29uZHMgICAgICAgIOS7iuWbnuOBruWGjeeUn+aZgumWk1vnp5JdXG4gICAgICovXG4gICAgcHVibGljIGdldEZpcmVkRXZlbnQoXG4gICAgICBiZWZvcmVDaGVja1RpbWVTZWNvbmRzOiBudW1iZXIsXG4gICAgICBtb3Rpb25UaW1lU2Vjb25kczogbnVtYmVyXG4gICAgKTogY3NtVmVjdG9yPGNzbVN0cmluZz4ge1xuICAgICAgdGhpcy5fZmlyZWRFdmVudFZhbHVlcy51cGRhdGVTaXplKDApO1xuXG4gICAgICAvLyDjgqTjg5njg7Pjg4jjga7nmbrngavjg4Hjgqfjg4Pjgq9cbiAgICAgIGZvciAobGV0IHUgPSAwOyB1IDwgdGhpcy5fbW90aW9uRGF0YS5ldmVudENvdW50OyArK3UpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuX21vdGlvbkRhdGEuZXZlbnRzLmF0KHUpLmZpcmVUaW1lID4gYmVmb3JlQ2hlY2tUaW1lU2Vjb25kcyAmJlxuICAgICAgICAgIHRoaXMuX21vdGlvbkRhdGEuZXZlbnRzLmF0KHUpLmZpcmVUaW1lIDw9IG1vdGlvblRpbWVTZWNvbmRzXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuX2ZpcmVkRXZlbnRWYWx1ZXMucHVzaEJhY2soXG4gICAgICAgICAgICBuZXcgY3NtU3RyaW5nKHRoaXMuX21vdGlvbkRhdGEuZXZlbnRzLmF0KHUpLnZhbHVlLnMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fZmlyZWRFdmVudFZhbHVlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgX3NvdXJjZUZyYW1lUmF0ZTogbnVtYmVyOyAvLyDjg63jg7zjg4njgZfjgZ/jg5XjgqHjgqTjg6vjga5GUFPjgILoqJjov7DjgYznhKHjgZHjgozjgbDjg4fjg5Xjgqnjg6vjg4jlgKQxNWZwc+OBqOOBquOCi1xuICAgIHB1YmxpYyBfbG9vcER1cmF0aW9uU2Vjb25kczogbnVtYmVyOyAvLyBtdG7jg5XjgqHjgqTjg6vjgaflrprnvqnjgZXjgozjgovkuIDpgKPjga7jg6Ljg7zjgrfjg6fjg7Pjga7plbfjgZVcbiAgICBwdWJsaWMgX2lzTG9vcDogYm9vbGVhbjsgLy8g44Or44O844OX44GZ44KL44GLP1xuICAgIHB1YmxpYyBfaXNMb29wRmFkZUluOiBib29sZWFuOyAvLyDjg6vjg7zjg5fmmYLjgavjg5Xjgqfjg7zjg4njgqTjg7PjgYzmnInlirnjgYvjganjgYbjgYvjga7jg5Xjg6njgrDjgILliJ3mnJ/lgKTjgafjga/mnInlirnjgIJcbiAgICBwdWJsaWMgX2xhc3RXZWlnaHQ6IG51bWJlcjsgLy8g5pyA5b6M44Gr6Kit5a6a44GV44KM44Gf6YeN44G/XG5cbiAgICBwdWJsaWMgX21vdGlvbkRhdGE6IEN1YmlzbU1vdGlvbkRhdGE7IC8vIOWun+mam+OBruODouODvOOCt+ODp+ODs+ODh+ODvOOCv+acrOS9k1xuXG4gICAgcHVibGljIF9leWVCbGlua1BhcmFtZXRlcklkczogY3NtVmVjdG9yPEN1YmlzbUlkSGFuZGxlPjsgLy8g6Ieq5YuV44G+44Gw44Gf44GN44KS6YGp55So44GZ44KL44OR44Op44Oh44O844K/SUTjg4/jg7Pjg4njg6vjga7jg6rjgrnjg4jjgIIgIOODouODh+ODq++8iOODouODh+ODq+OCu+ODg+ODhuOCo+ODs+OCsO+8ieOBqOODkeODqeODoeODvOOCv+OCkuWvvuW/nOS7mOOBkeOCi+OAglxuICAgIHB1YmxpYyBfbGlwU3luY1BhcmFtZXRlcklkczogY3NtVmVjdG9yPEN1YmlzbUlkSGFuZGxlPjsgLy8g44Oq44OD44OX44K344Oz44Kv44KS6YGp55So44GZ44KL44OR44Op44Oh44O844K/SUTjg4/jg7Pjg4njg6vjga7jg6rjgrnjg4jjgIIgIOODouODh+ODq++8iOODouODh+ODq+OCu+ODg+ODhuOCo+ODs+OCsO+8ieOBqOODkeODqeODoeODvOOCv+OCkuWvvuW/nOS7mOOBkeOCi+OAglxuXG4gICAgcHVibGljIF9tb2RlbEN1cnZlSWRFeWVCbGluazogQ3ViaXNtSWRIYW5kbGU7IC8vIOODouODh+ODq+OBjOaMgeOBpOiHquWLleOBvuOBsOOBn+OBjeeUqOODkeODqeODoeODvOOCv0lE44Gu44OP44Oz44OJ44Or44CCICDjg6Ljg4fjg6vjgajjg6Ljg7zjgrfjg6fjg7PjgpLlr77lv5zku5jjgZHjgovjgIJcbiAgICBwdWJsaWMgX21vZGVsQ3VydmVJZExpcFN5bmM6IEN1YmlzbUlkSGFuZGxlOyAvLyDjg6Ljg4fjg6vjgYzmjIHjgaTjg6rjg4Pjg5fjgrfjg7Pjgq/nlKjjg5Hjg6njg6Hjg7zjgr9JROOBruODj+ODs+ODieODq+OAgiAg44Oi44OH44Or44Go44Oi44O844K344On44Oz44KS5a++5b+c5LuY44GR44KL44CCXG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGhlIExpdmUyRCBPcGVuIFNvZnR3YXJlIGxpY2Vuc2VcbiAqIHRoYXQgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmxpdmUyZC5jb20vZXVsYS9saXZlMmQtb3Blbi1zb2Z0d2FyZS1saWNlbnNlLWFncmVlbWVudF9lbi5odG1sLlxuICovXG5cbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21qc29uIH0gZnJvbSAnLi4vdXRpbHMvY3ViaXNtanNvbic7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtaWQgfSBmcm9tICcuLi9pZC9jdWJpc21pZCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtZnJhbWV3b3JrIH0gZnJvbSAnLi4vbGl2ZTJkY3ViaXNtZnJhbWV3b3JrJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjc21zdHJpbmcgfSBmcm9tICcuLi90eXBlL2NzbXN0cmluZyc7XG5pbXBvcnQgY3NtU3RyaW5nID0gY3Ntc3RyaW5nLmNzbVN0cmluZztcbmltcG9ydCBDdWJpc21GcmFtZXdvcmsgPSBjdWJpc21mcmFtZXdvcmsuQ3ViaXNtRnJhbWV3b3JrO1xuaW1wb3J0IEN1YmlzbUlkSGFuZGxlID0gY3ViaXNtaWQuQ3ViaXNtSWRIYW5kbGU7XG5pbXBvcnQgQ3ViaXNtSnNvbiA9IGN1YmlzbWpzb24uQ3ViaXNtSnNvbjtcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvLyBKU09OIGtleXNcbiAgY29uc3QgTWV0YSA9ICdNZXRhJztcbiAgY29uc3QgRHVyYXRpb24gPSAnRHVyYXRpb24nO1xuICBjb25zdCBMb29wID0gJ0xvb3AnO1xuICBjb25zdCBDdXJ2ZUNvdW50ID0gJ0N1cnZlQ291bnQnO1xuICBjb25zdCBGcHMgPSAnRnBzJztcbiAgY29uc3QgVG90YWxTZWdtZW50Q291bnQgPSAnVG90YWxTZWdtZW50Q291bnQnO1xuICBjb25zdCBUb3RhbFBvaW50Q291bnQgPSAnVG90YWxQb2ludENvdW50JztcbiAgY29uc3QgQ3VydmVzID0gJ0N1cnZlcyc7XG4gIGNvbnN0IFRhcmdldCA9ICdUYXJnZXQnO1xuICBjb25zdCBJZCA9ICdJZCc7XG4gIGNvbnN0IEZhZGVJblRpbWUgPSAnRmFkZUluVGltZSc7XG4gIGNvbnN0IEZhZGVPdXRUaW1lID0gJ0ZhZGVPdXRUaW1lJztcbiAgY29uc3QgU2VnbWVudHMgPSAnU2VnbWVudHMnO1xuICBjb25zdCBVc2VyRGF0YSA9ICdVc2VyRGF0YSc7XG4gIGNvbnN0IFVzZXJEYXRhQ291bnQgPSAnVXNlckRhdGFDb3VudCc7XG4gIGNvbnN0IFRvdGFsVXNlckRhdGFTaXplID0gJ1RvdGFsVXNlckRhdGFTaXplJztcbiAgY29uc3QgVGltZSA9ICdUaW1lJztcbiAgY29uc3QgVmFsdWUgPSAnVmFsdWUnO1xuXG4gIC8qKlxuICAgKiBtb3Rpb24zLmpzb27jga7jgrPjg7Pjg4bjg4rjgIJcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBDdWJpc21Nb3Rpb25Kc29uIHtcbiAgICAvKipcbiAgICAgKiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICAgKiBAcGFyYW0gYnVmZmVyIG1vdGlvbjMuanNvbuOBjOiqreOBv+i+vOOBvuOCjOOBpuOBhOOCi+ODkOODg+ODleOCoVxuICAgICAqIEBwYXJhbSBzaXplIOODkOODg+ODleOCoeOBruOCteOCpOOCulxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihidWZmZXI6IEFycmF5QnVmZmVyLCBzaXplOiBudW1iZXIpIHtcbiAgICAgIHRoaXMuX2pzb24gPSBDdWJpc21Kc29uLmNyZWF0ZShidWZmZXIsIHNpemUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODh+OCueODiOODqeOCr+OCv+ebuOW9k+OBruWHpueQhlxuICAgICAqL1xuICAgIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgICAgQ3ViaXNtSnNvbi5kZWxldGUodGhpcy5fanNvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz44Gu6ZW344GV44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDjg6Ljg7zjgrfjg6fjg7Pjga7plbfjgZVb56eSXVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNb3Rpb25EdXJhdGlvbigpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhNZXRhKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhEdXJhdGlvbilcbiAgICAgICAgLnRvRmxvYXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Pjga7jg6vjg7zjg5fmg4XloLHjga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIHRydWUg44Or44O844OX44GZ44KLXG4gICAgICogQHJldHVybiBmYWxzZSDjg6vjg7zjg5fjgZfjgarjgYRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNNb3Rpb25Mb29wKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhNZXRhKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhMb29wKVxuICAgICAgICAudG9Cb29sZWFuKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz44Kr44O844OW44Gu5YCL5pWw44Gu5Y+W5b6XXG4gICAgICogQHJldHVybiDjg6Ljg7zjgrfjg6fjg7Pjgqvjg7zjg5bjga7lgIvmlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TW90aW9uQ3VydmVDb3VudCgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhNZXRhKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhDdXJ2ZUNvdW50KVxuICAgICAgICAudG9JbnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Pjga7jg5Xjg6zjg7zjg6Djg6zjg7zjg4jjga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIOODleODrOODvOODoOODrOODvOODiFtGUFNdXG4gICAgICovXG4gICAgcHVibGljIGdldE1vdGlvbkZwcygpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhNZXRhKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhGcHMpXG4gICAgICAgIC50b0Zsb2F0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz44Gu44K744Kw44Oh44Oz44OI44Gu57eP5ZCI6KiI44Gu5Y+W5b6XXG4gICAgICogQHJldHVybiDjg6Ljg7zjgrfjg6fjg7Pjga7jgrvjgrDjg6Hjg7Pjg4jjga7lj5blvpdcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TW90aW9uVG90YWxTZWdtZW50Q291bnQoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoTWV0YSlcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoVG90YWxTZWdtZW50Q291bnQpXG4gICAgICAgIC50b0ludCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+OBruOCq+ODvOODluOBruWItuW+oeW6l+OBrue3j+WQiOioiOOBruWPluW+l1xuICAgICAqIEByZXR1cm4g44Oi44O844K344On44Oz44Gu44Kr44O844OW44Gu5Yi25b6h54K544Gu57eP5ZCI6KiIXG4gICAgICovXG4gICAgcHVibGljIGdldE1vdGlvblRvdGFsUG9pbnRDb3VudCgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhNZXRhKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhUb3RhbFBvaW50Q291bnQpXG4gICAgICAgIC50b0ludCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+OBruODleOCp+ODvOODieOCpOODs+aZgumWk+OBruWtmOWcqFxuICAgICAqIEByZXR1cm4gdHJ1ZSDlrZjlnKjjgZnjgotcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOWtmOWcqOOBl+OBquOBhFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0V4aXN0TW90aW9uRmFkZUluVGltZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhdGhpcy5fanNvblxuICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKE1ldGEpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKEZhZGVJblRpbWUpXG4gICAgICAgIC5pc051bGwoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Pjga7jg5Xjgqfjg7zjg4njgqLjgqbjg4jmmYLplpPjga7lrZjlnKhcbiAgICAgKiBAcmV0dXJuIHRydWUg5a2Y5Zyo44GZ44KLXG4gICAgICogQHJldHVybiBmYWxzZSDlrZjlnKjjgZfjgarjgYRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFeGlzdE1vdGlvbkZhZGVPdXRUaW1lKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuICF0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoTWV0YSlcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoRmFkZU91dFRpbWUpXG4gICAgICAgIC5pc051bGwoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Pjga7jg5Xjgqfjg7zjg4njgqTjg7PmmYLplpPjga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIOODleOCp+ODvOODieOCpOODs+aZgumWk1vnp5JdXG4gICAgICovXG4gICAgcHVibGljIGdldE1vdGlvbkZhZGVJblRpbWUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoTWV0YSlcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoRmFkZUluVGltZSlcbiAgICAgICAgLnRvRmxvYXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Pjga7jg5Xjgqfjg7zjg4njgqLjgqbjg4jmmYLplpPjga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIOODleOCp+ODvOODieOCouOCpuODiOaZgumWk1vnp5JdXG4gICAgICovXG4gICAgcHVibGljIGdldE1vdGlvbkZhZGVPdXRUaW1lKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvblxuICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKE1ldGEpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKEZhZGVPdXRUaW1lKVxuICAgICAgICAudG9GbG9hdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+OBruOCq+ODvOODluOBrueorumhnuOBruWPluW+l1xuICAgICAqIEBwYXJhbSBjdXJ2ZUluZGV4IOOCq+ODvOODluOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4g44Kr44O844OW44Gu56iu6aGeXG4gICAgICovXG4gICAgcHVibGljIGdldE1vdGlvbkN1cnZlVGFyZ2V0KGN1cnZlSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvblxuICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKEN1cnZlcylcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChjdXJ2ZUluZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhUYXJnZXQpXG4gICAgICAgIC5nZXRSYXdTdHJpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Pjga7jgqvjg7zjg5bjga5JROOBruWPluW+l1xuICAgICAqIEBwYXJhbSBjdXJ2ZUluZGV4IOOCq+ODvOODluOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4g44Kr44O844OW44GuSURcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TW90aW9uQ3VydmVJZChjdXJ2ZUluZGV4OiBudW1iZXIpOiBDdWJpc21JZEhhbmRsZSB7XG4gICAgICByZXR1cm4gQ3ViaXNtRnJhbWV3b3JrLmdldElkTWFuYWdlcigpLmdldElkKFxuICAgICAgICB0aGlzLl9qc29uXG4gICAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKEN1cnZlcylcbiAgICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KGN1cnZlSW5kZXgpXG4gICAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoSWQpXG4gICAgICAgICAgLmdldFJhd1N0cmluZygpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+OBruOCq+ODvOODluOBruODleOCp+ODvOODieOCpOODs+aZgumWk+OBruWtmOWcqFxuICAgICAqIEBwYXJhbSBjdXJ2ZUluZGV4IOOCq+ODvOODluOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4gdHJ1ZSDlrZjlnKjjgZnjgotcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOWtmOWcqOOBl+OBquOBhFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0V4aXN0TW90aW9uQ3VydmVGYWRlSW5UaW1lKGN1cnZlSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuICF0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoQ3VydmVzKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KGN1cnZlSW5kZXgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKEZhZGVJblRpbWUpXG4gICAgICAgIC5pc051bGwoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Pjga7jgqvjg7zjg5bjga7jg5Xjgqfjg7zjg4njgqLjgqbjg4jmmYLplpPjga7lrZjlnKhcbiAgICAgKiBAcGFyYW0gY3VydmVJbmRleCDjgqvjg7zjg5bjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIHRydWUg5a2Y5Zyo44GZ44KLXG4gICAgICogQHJldHVybiBmYWxzZSDlrZjlnKjjgZfjgarjgYRcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFeGlzdE1vdGlvbkN1cnZlRmFkZU91dFRpbWUoY3VydmVJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gIXRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhDdXJ2ZXMpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgoY3VydmVJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoRmFkZU91dFRpbWUpXG4gICAgICAgIC5pc051bGwoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Pjga7jgqvjg7zjg5bjga7jg5Xjgqfjg7zjg4njgqTjg7PmmYLplpPjga7lj5blvpdcbiAgICAgKiBAcGFyYW0gY3VydmVJbmRleCDjgqvjg7zjg5bjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIOODleOCp+ODvOODieOCpOODs+aZgumWk1vnp5JdXG4gICAgICovXG4gICAgcHVibGljIGdldE1vdGlvbkN1cnZlRmFkZUluVGltZShjdXJ2ZUluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhDdXJ2ZXMpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgoY3VydmVJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoRmFkZUluVGltZSlcbiAgICAgICAgLnRvRmxvYXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Pjga7jgqvjg7zjg5bjga7jg5Xjgqfjg7zjg4njgqLjgqbjg4jmmYLplpPjga7lj5blvpdcbiAgICAgKiBAcGFyYW0gY3VydmVJbmRleCDjgqvjg7zjg5bjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIOODleOCp+ODvOODieOCouOCpuODiOaZgumWk1vnp5JdXG4gICAgICovXG4gICAgcHVibGljIGdldE1vdGlvbkN1cnZlRmFkZU91dFRpbWUoY3VydmVJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoQ3VydmVzKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KGN1cnZlSW5kZXgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKEZhZGVPdXRUaW1lKVxuICAgICAgICAudG9GbG9hdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+OBruOCq+ODvOODluOBruOCu+OCsOODoeODs+ODiOOBruWAi+aVsOOCkuWPluW+l+OBmeOCi1xuICAgICAqIEBwYXJhbSBjdXJ2ZUluZGV4IOOCq+ODvOODluOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4g44Oi44O844K344On44Oz44Gu44Kr44O844OW44Gu44K744Kw44Oh44Oz44OI44Gu5YCL5pWwXG4gICAgICovXG4gICAgcHVibGljIGdldE1vdGlvbkN1cnZlU2VnbWVudENvdW50KGN1cnZlSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvblxuICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKEN1cnZlcylcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChjdXJ2ZUluZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhTZWdtZW50cylcbiAgICAgICAgLmdldFZlY3RvcigpXG4gICAgICAgIC5nZXRTaXplKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz44Gu44Kr44O844OW44Gu44K744Kw44Oh44Oz44OI44Gu5YCk44Gu5Y+W5b6XXG4gICAgICogQHBhcmFtIGN1cnZlSW5kZXgg44Kr44O844OW44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHBhcmFtIHNlZ21lbnRJbmRleCDjgrvjgrDjg6Hjg7Pjg4jjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIOOCu+OCsOODoeODs+ODiOOBruWApFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNb3Rpb25DdXJ2ZVNlZ21lbnQoXG4gICAgICBjdXJ2ZUluZGV4OiBudW1iZXIsXG4gICAgICBzZWdtZW50SW5kZXg6IG51bWJlclxuICAgICk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvblxuICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKEN1cnZlcylcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChjdXJ2ZUluZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhTZWdtZW50cylcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChzZWdtZW50SW5kZXgpXG4gICAgICAgIC50b0Zsb2F0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kk44OZ44Oz44OI44Gu5YCL5pWw44Gu5Y+W5b6XXG4gICAgICogQHJldHVybiDjgqTjg5njg7Pjg4jjga7lgIvmlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RXZlbnRDb3VudCgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhNZXRhKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhVc2VyRGF0YUNvdW50KVxuICAgICAgICAudG9JbnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAg44Kk44OZ44Oz44OI44Gu57eP5paH5a2X5pWw44Gu5Y+W5b6XXG4gICAgICogQHJldHVybiDjgqTjg5njg7Pjg4jjga7nt4/mloflrZfmlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VG90YWxFdmVudFZhbHVlU2l6ZSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhNZXRhKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhUb3RhbFVzZXJEYXRhU2l6ZSlcbiAgICAgICAgLnRvSW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kk44OZ44Oz44OI44Gu5pmC6ZaT44Gu5Y+W5b6XXG4gICAgICogQHBhcmFtIHVzZXJEYXRhSW5kZXgg44Kk44OZ44Oz44OI44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiDjgqTjg5njg7Pjg4jjga7mmYLplpNb56eSXVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRFdmVudFRpbWUodXNlckRhdGFJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoVXNlckRhdGEpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgodXNlckRhdGFJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoVGltZSlcbiAgICAgICAgLnRvSW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kk44OZ44Oz44OI44Gu5Y+W5b6XXG4gICAgICogQHBhcmFtIHVzZXJEYXRhSW5kZXgg44Kk44OZ44Oz44OI44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiDjgqTjg5njg7Pjg4jjga7mloflrZfliJdcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RXZlbnRWYWx1ZSh1c2VyRGF0YUluZGV4OiBudW1iZXIpOiBjc21TdHJpbmcge1xuICAgICAgcmV0dXJuIG5ldyBjc21TdHJpbmcoXG4gICAgICAgIHRoaXMuX2pzb25cbiAgICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoVXNlckRhdGEpXG4gICAgICAgICAgLmdldFZhbHVlQnlJbmRleCh1c2VyRGF0YUluZGV4KVxuICAgICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFZhbHVlKVxuICAgICAgICAgIC5nZXRSYXdTdHJpbmcoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBfanNvbjogQ3ViaXNtSnNvbjsgLy8gbW90aW9uMy5qc29u44Gu44OH44O844K/XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGhlIExpdmUyRCBPcGVuIFNvZnR3YXJlIGxpY2Vuc2VcbiAqIHRoYXQgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmxpdmUyZC5jb20vZXVsYS9saXZlMmQtb3Blbi1zb2Z0d2FyZS1saWNlbnNlLWFncmVlbWVudF9lbi5odG1sLlxuICovXG5cbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21pZCB9IGZyb20gJy4uL2lkL2N1YmlzbWlkJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjc21zdHJpbmcgfSBmcm9tICcuLi90eXBlL2NzbXN0cmluZyc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3NtdmVjdG9yIH0gZnJvbSAnLi4vdHlwZS9jc212ZWN0b3InO1xuaW1wb3J0IGNzbVZlY3RvciA9IGNzbXZlY3Rvci5jc21WZWN0b3I7XG5pbXBvcnQgY3NtU3RyaW5nID0gY3Ntc3RyaW5nLmNzbVN0cmluZztcbmltcG9ydCBDdWJpc21JZEhhbmRsZSA9IGN1YmlzbWlkLkN1YmlzbUlkSGFuZGxlO1xuXG5leHBvcnQgbmFtZXNwYWNlIExpdmUyREN1YmlzbUZyYW1ld29yayB7XG4gIC8qKlxuICAgKiBAYnJpZWYg44Oi44O844K344On44Oz44Kr44O844OW44Gu56iu6aGeXG4gICAqXG4gICAqIOODouODvOOCt+ODp+ODs+OCq+ODvOODluOBrueorumhnuOAglxuICAgKi9cbiAgZXhwb3J0IGVudW0gQ3ViaXNtTW90aW9uQ3VydmVUYXJnZXQge1xuICAgIEN1YmlzbU1vdGlvbkN1cnZlVGFyZ2V0X01vZGVsLCAvLyDjg6Ljg4fjg6vjgavlr77jgZfjgaZcbiAgICBDdWJpc21Nb3Rpb25DdXJ2ZVRhcmdldF9QYXJhbWV0ZXIsIC8vIOODkeODqeODoeODvOOCv+OBq+WvvuOBl+OBplxuICAgIEN1YmlzbU1vdGlvbkN1cnZlVGFyZ2V0X1BhcnRPcGFjaXR5IC8vIOODkeODvOODhOOBruS4jemAj+aYjuW6puOBq+WvvuOBl+OBplxuICB9XG5cbiAgLyoqXG4gICAqIEBicmllZiDjg6Ljg7zjgrfjg6fjg7Pjgqvjg7zjg5bjga7jgrvjgrDjg6Hjg7Pjg4jjga7nqK7poZ5cbiAgICpcbiAgICog44Oi44O844K344On44Oz44Kr44O844OW44Gu44K744Kw44Oh44Oz44OI44Gu56iu6aGe44CCXG4gICAqL1xuICBleHBvcnQgZW51bSBDdWJpc21Nb3Rpb25TZWdtZW50VHlwZSB7XG4gICAgQ3ViaXNtTW90aW9uU2VnbWVudFR5cGVfTGluZWFyID0gMCwgLy8g44Oq44OL44KiXG4gICAgQ3ViaXNtTW90aW9uU2VnbWVudFR5cGVfQmV6aWVyID0gMSwgLy8g44OZ44K444Kn5puy57eaXG4gICAgQ3ViaXNtTW90aW9uU2VnbWVudFR5cGVfU3RlcHBlZCA9IDIsIC8vIOOCueODhuODg+ODl1xuICAgIEN1YmlzbU1vdGlvblNlZ21lbnRUeXBlX0ludmVyc2VTdGVwcGVkID0gMyAvLyDjgqTjg7Pjg5Djg7zjgrnjgrnjg4bjg4Pjg5dcbiAgfVxuXG4gIC8qKlxuICAgKiBAYnJpZWYg44Oi44O844K344On44Oz44Kr44O844OW44Gu5Yi25b6h54K5XG4gICAqXG4gICAqIOODouODvOOCt+ODp+ODs+OCq+ODvOODluOBruWItuW+oeeCueOAglxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbU1vdGlvblBvaW50IHtcbiAgICB0aW1lID0gMC4wOyAvLyDmmYLplpNb56eSXVxuICAgIHZhbHVlID0gMC4wOyAvLyDlgKRcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6Ljg7zjgrfjg6fjg7Pjgqvjg7zjg5bjga7jgrvjgrDjg6Hjg7Pjg4jjga7oqZXkvqHplqLmlbBcbiAgICpcbiAgICogQHBhcmFtICAgcG9pbnRzICAgICAg44Oi44O844K344On44Oz44Kr44O844OW44Gu5Yi25b6h54K544Oq44K544OIXG4gICAqIEBwYXJhbSAgIHRpbWUgICAgICAgIOipleS+oeOBmeOCi+aZgumWk1vnp5JdXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIGNzbU1vdGlvblNlZ21lbnRFdmFsdWF0aW9uRnVuY3Rpb24ge1xuICAgIChwb2ludHM6IEN1YmlzbU1vdGlvblBvaW50W10sIHRpbWU6IG51bWJlcik6IG51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAYnJpZWYg44Oi44O844K344On44Oz44Kr44O844OW44Gu44K744Kw44Oh44Oz44OIXG4gICAqXG4gICAqIOODouODvOOCt+ODp+ODs+OCq+ODvOODluOBruOCu+OCsOODoeODs+ODiOOAglxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbU1vdGlvblNlZ21lbnQge1xuICAgIC8qKlxuICAgICAqIEBicmllZiDjgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICAgKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv+OAglxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuZXZhbHVhdGUgPSBudWxsO1xuICAgICAgdGhpcy5iYXNlUG9pbnRJbmRleCA9IDA7XG4gICAgICB0aGlzLnNlZ21lbnRUeXBlID0gMDtcbiAgICB9XG5cbiAgICBldmFsdWF0ZTogY3NtTW90aW9uU2VnbWVudEV2YWx1YXRpb25GdW5jdGlvbjsgLy8g5L2/55So44GZ44KL6KmV5L6h6Zai5pWwXG4gICAgYmFzZVBvaW50SW5kZXg6IG51bWJlcjsgLy8g5pyA5Yid44Gu44K744Kw44Oh44Oz44OI44G444Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgc2VnbWVudFR5cGU6IG51bWJlcjsgLy8g44K744Kw44Oh44Oz44OI44Gu56iu6aGeXG4gIH1cblxuICAvKipcbiAgICogQGJyaWVmIOODouODvOOCt+ODp+ODs+OCq+ODvOODllxuICAgKlxuICAgKiDjg6Ljg7zjgrfjg6fjg7Pjgqvjg7zjg5bjgIJcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBDdWJpc21Nb3Rpb25DdXJ2ZSB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy50eXBlID0gQ3ViaXNtTW90aW9uQ3VydmVUYXJnZXQuQ3ViaXNtTW90aW9uQ3VydmVUYXJnZXRfTW9kZWw7XG4gICAgICB0aGlzLnNlZ21lbnRDb3VudCA9IDA7XG4gICAgICB0aGlzLmJhc2VTZWdtZW50SW5kZXggPSAwO1xuICAgICAgdGhpcy5mYWRlSW5UaW1lID0gMC4wO1xuICAgICAgdGhpcy5mYWRlT3V0VGltZSA9IDAuMDtcbiAgICB9XG5cbiAgICB0eXBlOiBDdWJpc21Nb3Rpb25DdXJ2ZVRhcmdldDsgLy8g44Kr44O844OW44Gu56iu6aGeXG4gICAgaWQ6IEN1YmlzbUlkSGFuZGxlOyAvLyDjgqvjg7zjg5bjga5JRFxuICAgIHNlZ21lbnRDb3VudDogbnVtYmVyOyAvLyDjgrvjgrDjg6Hjg7Pjg4jjga7lgIvmlbBcbiAgICBiYXNlU2VnbWVudEluZGV4OiBudW1iZXI7IC8vIOacgOWIneOBruOCu+OCsOODoeODs+ODiOOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgIGZhZGVJblRpbWU6IG51bWJlcjsgLy8g44OV44Kn44O844OJ44Kk44Oz44Gr44GL44GL44KL5pmC6ZaTW+enkl1cbiAgICBmYWRlT3V0VGltZTogbnVtYmVyOyAvLyDjg5Xjgqfjg7zjg4njgqLjgqbjg4jjgavjgYvjgYvjgovmmYLplpNb56eSXVxuICB9XG5cbiAgLyoqXG4gICAqIOOCpOODmeODs+ODiOOAglxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbU1vdGlvbkV2ZW50IHtcbiAgICBmaXJlVGltZSA9IDAuMDtcbiAgICB2YWx1ZTogY3NtU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEBicmllZiDjg6Ljg7zjgrfjg6fjg7Pjg4fjg7zjgr9cbiAgICpcbiAgICog44Oi44O844K344On44Oz44OH44O844K/44CCXG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtTW90aW9uRGF0YSB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5kdXJhdGlvbiA9IDAuMDtcbiAgICAgIHRoaXMubG9vcCA9IGZhbHNlO1xuICAgICAgdGhpcy5jdXJ2ZUNvdW50ID0gMDtcbiAgICAgIHRoaXMuZXZlbnRDb3VudCA9IDA7XG4gICAgICB0aGlzLmZwcyA9IDAuMDtcblxuICAgICAgdGhpcy5jdXJ2ZXMgPSBuZXcgY3NtVmVjdG9yPEN1YmlzbU1vdGlvbkN1cnZlPigpO1xuICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBjc21WZWN0b3I8Q3ViaXNtTW90aW9uU2VnbWVudD4oKTtcbiAgICAgIHRoaXMucG9pbnRzID0gbmV3IGNzbVZlY3RvcjxDdWJpc21Nb3Rpb25Qb2ludD4oKTtcbiAgICAgIHRoaXMuZXZlbnRzID0gbmV3IGNzbVZlY3RvcjxDdWJpc21Nb3Rpb25FdmVudD4oKTtcbiAgICB9XG5cbiAgICBkdXJhdGlvbjogbnVtYmVyOyAvLyDjg6Ljg7zjgrfjg6fjg7Pjga7plbfjgZVb56eSXVxuICAgIGxvb3A6IGJvb2xlYW47IC8vIOODq+ODvOODl+OBmeOCi+OBi+OBqeOBhuOBi1xuICAgIGN1cnZlQ291bnQ6IG51bWJlcjsgLy8g44Kr44O844OW44Gu5YCL5pWwXG4gICAgZXZlbnRDb3VudDogbnVtYmVyOyAvLyBVc2VyRGF0YeOBruWAi+aVsFxuICAgIGZwczogbnVtYmVyOyAvLyDjg5Xjg6zjg7zjg6Djg6zjg7zjg4hcbiAgICBjdXJ2ZXM6IGNzbVZlY3RvcjxDdWJpc21Nb3Rpb25DdXJ2ZT47IC8vIOOCq+ODvOODluOBruODquOCueODiFxuICAgIHNlZ21lbnRzOiBjc21WZWN0b3I8Q3ViaXNtTW90aW9uU2VnbWVudD47IC8vIOOCu+OCsOODoeODs+ODiOOBruODquOCueODiFxuICAgIHBvaW50czogY3NtVmVjdG9yPEN1YmlzbU1vdGlvblBvaW50PjsgLy8g44Od44Kk44Oz44OI44Gu44Oq44K544OIXG4gICAgZXZlbnRzOiBjc21WZWN0b3I8Q3ViaXNtTW90aW9uRXZlbnQ+OyAvLyDjgqTjg5njg7Pjg4jjga7jg6rjgrnjg4hcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGFjdWJpc21tb3Rpb24gfSBmcm9tICcuL2FjdWJpc21tb3Rpb24nO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWpzb24gfSBmcm9tICcuLi91dGlscy9jdWJpc21qc29uJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21pZCB9IGZyb20gJy4uL2lkL2N1YmlzbWlkJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21mcmFtZXdvcmsgfSBmcm9tICcuLi9saXZlMmRjdWJpc21mcmFtZXdvcmsnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvY3ViaXNtbW9kZWwnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vdGlvbnF1ZXVlZW50cnkgfSBmcm9tICcuL2N1YmlzbW1vdGlvbnF1ZXVlZW50cnknO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGNzbXZlY3RvciB9IGZyb20gJy4uL3R5cGUvY3NtdmVjdG9yJztcbmltcG9ydCBKc29uRmxvYXQgPSBjdWJpc21qc29uLkpzb25GbG9hdDtcbmltcG9ydCBjc21WZWN0b3IgPSBjc212ZWN0b3IuY3NtVmVjdG9yO1xuaW1wb3J0IEN1YmlzbU1vdGlvblF1ZXVlRW50cnkgPSBjdWJpc21tb3Rpb25xdWV1ZWVudHJ5LkN1YmlzbU1vdGlvblF1ZXVlRW50cnk7XG5pbXBvcnQgQ3ViaXNtTW9kZWwgPSBjdWJpc21tb2RlbC5DdWJpc21Nb2RlbDtcbmltcG9ydCBDdWJpc21GcmFtZXdvcmsgPSBjdWJpc21mcmFtZXdvcmsuQ3ViaXNtRnJhbWV3b3JrO1xuaW1wb3J0IEN1YmlzbUlkSGFuZGxlID0gY3ViaXNtaWQuQ3ViaXNtSWRIYW5kbGU7XG5pbXBvcnQgQ3ViaXNtSnNvbiA9IGN1YmlzbWpzb24uQ3ViaXNtSnNvbjtcbmltcG9ydCBWYWx1ZSA9IGN1YmlzbWpzb24uVmFsdWU7XG5pbXBvcnQgQUN1YmlzbU1vdGlvbiA9IGFjdWJpc21tb3Rpb24uQUN1YmlzbU1vdGlvbjtcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvLyBleHAzLmpzb27jga7jgq3jg7zjgajjg4fjg5Xjgqnjg6vjg4hcbiAgY29uc3QgRXhwcmVzc2lvbktleUZhZGVJbiA9ICdGYWRlSW5UaW1lJztcbiAgY29uc3QgRXhwcmVzc2lvbktleUZhZGVPdXQgPSAnRmFkZU91dFRpbWUnO1xuICBjb25zdCBFeHByZXNzaW9uS2V5UGFyYW1ldGVycyA9ICdQYXJhbWV0ZXJzJztcbiAgY29uc3QgRXhwcmVzc2lvbktleUlkID0gJ0lkJztcbiAgY29uc3QgRXhwcmVzc2lvbktleVZhbHVlID0gJ1ZhbHVlJztcbiAgY29uc3QgRXhwcmVzc2lvbktleUJsZW5kID0gJ0JsZW5kJztcbiAgY29uc3QgQmxlbmRWYWx1ZUFkZCA9ICdBZGQnO1xuICBjb25zdCBCbGVuZFZhbHVlTXVsdGlwbHkgPSAnTXVsdGlwbHknO1xuICBjb25zdCBCbGVuZFZhbHVlT3ZlcndyaXRlID0gJ092ZXJ3cml0ZSc7XG4gIGNvbnN0IERlZmF1bHRGYWRlVGltZSA9IDEuMDtcblxuICAvKipcbiAgICog6KGo5oOF44Gu44Oi44O844K344On44OzXG4gICAqXG4gICAqIOihqOaDheOBruODouODvOOCt+ODp+ODs+OCr+ODqeOCueOAglxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbUV4cHJlc3Npb25Nb3Rpb24gZXh0ZW5kcyBBQ3ViaXNtTW90aW9uIHtcbiAgICAvKipcbiAgICAgKiDjgqTjg7Pjgrnjgr/jg7PjgrnjgpLkvZzmiJDjgZnjgovjgIJcbiAgICAgKiBAcGFyYW0gYnVmZmVyIGV4cOODleOCoeOCpOODq+OBjOiqreOBv+i+vOOBvuOCjOOBpuOBhOOCi+ODkOODg+ODleOCoVxuICAgICAqIEBwYXJhbSBzaXplIOODkOODg+ODleOCoeOBruOCteOCpOOCulxuICAgICAqIEByZXR1cm4g5L2c5oiQ44GV44KM44Gf44Kk44Oz44K544K/44Oz44K5XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUoXG4gICAgICBidWZmZXI6IEFycmF5QnVmZmVyLFxuICAgICAgc2l6ZTogbnVtYmVyXG4gICAgKTogQ3ViaXNtRXhwcmVzc2lvbk1vdGlvbiB7XG4gICAgICBjb25zdCBleHByZXNzaW9uOiBDdWJpc21FeHByZXNzaW9uTW90aW9uID0gbmV3IEN1YmlzbUV4cHJlc3Npb25Nb3Rpb24oKTtcblxuICAgICAgY29uc3QganNvbjogQ3ViaXNtSnNvbiA9IEN1YmlzbUpzb24uY3JlYXRlKGJ1ZmZlciwgc2l6ZSk7XG4gICAgICBjb25zdCByb290OiBWYWx1ZSA9IGpzb24uZ2V0Um9vdCgpO1xuXG4gICAgICBleHByZXNzaW9uLnNldEZhZGVJblRpbWUoXG4gICAgICAgIHJvb3QuZ2V0VmFsdWVCeVN0cmluZyhFeHByZXNzaW9uS2V5RmFkZUluKS50b0Zsb2F0KERlZmF1bHRGYWRlVGltZSlcbiAgICAgICk7IC8vIOODleOCp+ODvOODieOCpOODs1xuICAgICAgZXhwcmVzc2lvbi5zZXRGYWRlT3V0VGltZShcbiAgICAgICAgcm9vdC5nZXRWYWx1ZUJ5U3RyaW5nKEV4cHJlc3Npb25LZXlGYWRlT3V0KS50b0Zsb2F0KERlZmF1bHRGYWRlVGltZSlcbiAgICAgICk7IC8vIOODleOCp+ODvOODieOCouOCpuODiFxuXG4gICAgICAvLyDlkITjg5Hjg6njg6Hjg7zjgr/jgavjgaTjgYTjgaZcbiAgICAgIGNvbnN0IHBhcmFtZXRlckNvdW50ID0gcm9vdFxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhFeHByZXNzaW9uS2V5UGFyYW1ldGVycylcbiAgICAgICAgLmdldFNpemUoKTtcbiAgICAgIGV4cHJlc3Npb24uX3BhcmFtZXRlcnMucHJlcGFyZUNhcGFjaXR5KHBhcmFtZXRlckNvdW50KTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJDb3VudDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtOiBWYWx1ZSA9IHJvb3RcbiAgICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhFeHByZXNzaW9uS2V5UGFyYW1ldGVycylcbiAgICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KGkpO1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJJZDogQ3ViaXNtSWRIYW5kbGUgPSBDdWJpc21GcmFtZXdvcmsuZ2V0SWRNYW5hZ2VyKCkuZ2V0SWQoXG4gICAgICAgICAgcGFyYW0uZ2V0VmFsdWVCeVN0cmluZyhFeHByZXNzaW9uS2V5SWQpLmdldFJhd1N0cmluZygpXG4gICAgICAgICk7IC8vIOODkeODqeODoeODvOOCv0lEXG5cbiAgICAgICAgY29uc3QgdmFsdWU6IG51bWJlciA9IHBhcmFtXG4gICAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoRXhwcmVzc2lvbktleVZhbHVlKVxuICAgICAgICAgIC50b0Zsb2F0KCk7IC8vIOWApFxuXG4gICAgICAgIC8vIOioiOeul+aWueazleOBruioreWumlxuICAgICAgICBsZXQgYmxlbmRUeXBlOiBFeHByZXNzaW9uQmxlbmRUeXBlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBwYXJhbS5nZXRWYWx1ZUJ5U3RyaW5nKEV4cHJlc3Npb25LZXlCbGVuZCkuaXNOdWxsKCkgfHxcbiAgICAgICAgICBwYXJhbS5nZXRWYWx1ZUJ5U3RyaW5nKEV4cHJlc3Npb25LZXlCbGVuZCkuZ2V0U3RyaW5nKCkgPT1cbiAgICAgICAgICAgIEJsZW5kVmFsdWVBZGRcbiAgICAgICAgKSB7XG4gICAgICAgICAgYmxlbmRUeXBlID0gRXhwcmVzc2lvbkJsZW5kVHlwZS5FeHByZXNzaW9uQmxlbmRUeXBlX0FkZDtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBwYXJhbS5nZXRWYWx1ZUJ5U3RyaW5nKEV4cHJlc3Npb25LZXlCbGVuZCkuZ2V0U3RyaW5nKCkgPT1cbiAgICAgICAgICBCbGVuZFZhbHVlTXVsdGlwbHlcbiAgICAgICAgKSB7XG4gICAgICAgICAgYmxlbmRUeXBlID0gRXhwcmVzc2lvbkJsZW5kVHlwZS5FeHByZXNzaW9uQmxlbmRUeXBlX011bHRpcGx5O1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHBhcmFtLmdldFZhbHVlQnlTdHJpbmcoRXhwcmVzc2lvbktleUJsZW5kKS5nZXRTdHJpbmcoKSA9PVxuICAgICAgICAgIEJsZW5kVmFsdWVPdmVyd3JpdGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgYmxlbmRUeXBlID0gRXhwcmVzc2lvbkJsZW5kVHlwZS5FeHByZXNzaW9uQmxlbmRUeXBlX092ZXJ3cml0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyDjgZ3jga7ku5Yg5LuV5qeY44Gr44Gq44GE5YCk44KS6Kit5a6a44GX44Gf5pmC44Gv5Yqg566X44Oi44O844OJ44Gr44GZ44KL44GT44Go44Gn5b6p5penXG4gICAgICAgICAgYmxlbmRUeXBlID0gRXhwcmVzc2lvbkJsZW5kVHlwZS5FeHByZXNzaW9uQmxlbmRUeXBlX0FkZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOioreWumuOCquODluOCuOOCp+OCr+ODiOOCkuS9nOaIkOOBl+OBpuODquOCueODiOOBq+i/veWKoOOBmeOCi1xuICAgICAgICBjb25zdCBpdGVtOiBFeHByZXNzaW9uUGFyYW1ldGVyID0gbmV3IEV4cHJlc3Npb25QYXJhbWV0ZXIoKTtcblxuICAgICAgICBpdGVtLnBhcmFtZXRlcklkID0gcGFyYW1ldGVySWQ7XG4gICAgICAgIGl0ZW0uYmxlbmRUeXBlID0gYmxlbmRUeXBlO1xuICAgICAgICBpdGVtLnZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgZXhwcmVzc2lvbi5fcGFyYW1ldGVycy5wdXNoQmFjayhpdGVtKTtcbiAgICAgIH1cblxuICAgICAgQ3ViaXNtSnNvbi5kZWxldGUoanNvbik7IC8vIEpTT07jg4fjg7zjgr/jga/kuI3opoHjgavjgarjgaPjgZ/jgonliYrpmaTjgZnjgotcbiAgICAgIHJldHVybiBleHByZXNzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODh+ODq+OBruODkeODqeODoeODvOOCv+OBruabtOaWsOOBruWun+ihjFxuICAgICAqIEBwYXJhbSBtb2RlbCDlr77osaHjga7jg6Ljg4fjg6tcbiAgICAgKiBAcGFyYW0gdXNlclRpbWVTZWNvbmRzIOODh+ODq+OCv+aZgumWk+OBruepjeeul+WApFvnp5JdXG4gICAgICogQHBhcmFtIHdlaWdodCDjg6Ljg7zjgrfjg6fjg7Pjga7ph43jgb9cbiAgICAgKiBAcGFyYW0gbW90aW9uUXVldWVFbnRyeSBDdWJpc21Nb3Rpb25RdWV1ZU1hbmFnZXLjgafnrqHnkIbjgZXjgozjgabjgYTjgovjg6Ljg7zjgrfjg6fjg7NcbiAgICAgKi9cbiAgICBwdWJsaWMgZG9VcGRhdGVQYXJhbWV0ZXJzKFxuICAgICAgbW9kZWw6IEN1YmlzbU1vZGVsLFxuICAgICAgdXNlclRpbWVTZWNvbmRzOiBudW1iZXIsXG4gICAgICB3ZWlnaHQ6IG51bWJlcixcbiAgICAgIG1vdGlvblF1ZXVlRW50cnk6IEN1YmlzbU1vdGlvblF1ZXVlRW50cnlcbiAgICApOiB2b2lkIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fcGFyYW1ldGVycy5nZXRTaXplKCk7ICsraSkge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXI6IEV4cHJlc3Npb25QYXJhbWV0ZXIgPSB0aGlzLl9wYXJhbWV0ZXJzLmF0KGkpO1xuXG4gICAgICAgIHN3aXRjaCAocGFyYW1ldGVyLmJsZW5kVHlwZSkge1xuICAgICAgICAgIGNhc2UgRXhwcmVzc2lvbkJsZW5kVHlwZS5FeHByZXNzaW9uQmxlbmRUeXBlX0FkZDoge1xuICAgICAgICAgICAgbW9kZWwuYWRkUGFyYW1ldGVyVmFsdWVCeUlkKFxuICAgICAgICAgICAgICBwYXJhbWV0ZXIucGFyYW1ldGVySWQsXG4gICAgICAgICAgICAgIHBhcmFtZXRlci52YWx1ZSxcbiAgICAgICAgICAgICAgd2VpZ2h0XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgRXhwcmVzc2lvbkJsZW5kVHlwZS5FeHByZXNzaW9uQmxlbmRUeXBlX011bHRpcGx5OiB7XG4gICAgICAgICAgICBtb2RlbC5tdWx0aXBseVBhcmFtZXRlclZhbHVlQnlJZChcbiAgICAgICAgICAgICAgcGFyYW1ldGVyLnBhcmFtZXRlcklkLFxuICAgICAgICAgICAgICBwYXJhbWV0ZXIudmFsdWUsXG4gICAgICAgICAgICAgIHdlaWdodFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIEV4cHJlc3Npb25CbGVuZFR5cGUuRXhwcmVzc2lvbkJsZW5kVHlwZV9PdmVyd3JpdGU6IHtcbiAgICAgICAgICAgIG1vZGVsLnNldFBhcmFtZXRlclZhbHVlQnlJZChcbiAgICAgICAgICAgICAgcGFyYW1ldGVyLnBhcmFtZXRlcklkLFxuICAgICAgICAgICAgICBwYXJhbWV0ZXIudmFsdWUsXG4gICAgICAgICAgICAgIHdlaWdodFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8g5LuV5qeY44Gr44Gq44GE5YCk44KS6Kit5a6a44GX44Gf5pmC44Gv44GZ44Gn44Gr5Yqg566X44Oi44O844OJ44Gr44Gq44Gj44Gm44GE44KLXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcblxuICAgICAgdGhpcy5fcGFyYW1ldGVycyA9IG5ldyBjc21WZWN0b3I8RXhwcmVzc2lvblBhcmFtZXRlcj4oKTtcbiAgICB9XG5cbiAgICBfcGFyYW1ldGVyczogY3NtVmVjdG9yPEV4cHJlc3Npb25QYXJhbWV0ZXI+OyAvLyDooajmg4Xjga7jg5Hjg6njg6Hjg7zjgr/mg4XloLHjg6rjgrnjg4hcbiAgfVxuXG4gIC8qKlxuICAgKiDooajmg4Xjg5Hjg6njg6Hjg7zjgr/lgKTjga7oqIjnrpfmlrnlvI9cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4cHJlc3Npb25CbGVuZFR5cGUge1xuICAgIEV4cHJlc3Npb25CbGVuZFR5cGVfQWRkID0gMCwgLy8g5Yqg566XXG4gICAgRXhwcmVzc2lvbkJsZW5kVHlwZV9NdWx0aXBseSA9IDEsIC8vIOS5l+eul1xuICAgIEV4cHJlc3Npb25CbGVuZFR5cGVfT3ZlcndyaXRlID0gMiAvLyDkuIrmm7jjgY1cbiAgfVxuXG4gIC8qKlxuICAgKiDooajmg4Xjga7jg5Hjg6njg6Hjg7zjgr/mg4XloLFcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBFeHByZXNzaW9uUGFyYW1ldGVyIHtcbiAgICBwYXJhbWV0ZXJJZDogQ3ViaXNtSWRIYW5kbGU7IC8vIOODkeODqeODoeODvOOCv0lEXG4gICAgYmxlbmRUeXBlOiBFeHByZXNzaW9uQmxlbmRUeXBlOyAvLyDjg5Hjg6njg6Hjg7zjgr/jga7mvJTnrpfnqK7poZ5cbiAgICB2YWx1ZTogbnVtYmVyOyAvLyDlgKRcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWlkIH0gZnJvbSAnLi4vaWQvY3ViaXNtaWQnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGNzbXZlY3RvciB9IGZyb20gJy4uL3R5cGUvY3NtdmVjdG9yJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21tb2RlbCB9IGZyb20gJy4uL21vZGVsL2N1YmlzbW1vZGVsJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21mcmFtZXdvcmsgfSBmcm9tICcuLi9saXZlMmRjdWJpc21mcmFtZXdvcmsnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWpzb24gfSBmcm9tICcuLi91dGlscy9jdWJpc21qc29uJztcbmltcG9ydCBDdWJpc21JZEhhbmRsZSA9IGN1YmlzbWlkLkN1YmlzbUlkSGFuZGxlO1xuaW1wb3J0IGNzbVZlY3RvciA9IGNzbXZlY3Rvci5jc21WZWN0b3I7XG5pbXBvcnQgaXRlcmF0b3IgPSBjc212ZWN0b3IuaXRlcmF0b3I7XG5pbXBvcnQgQ3ViaXNtTW9kZWwgPSBjdWJpc21tb2RlbC5DdWJpc21Nb2RlbDtcbmltcG9ydCBDdWJpc21GcmFtZXdvcmsgPSBjdWJpc21mcmFtZXdvcmsuQ3ViaXNtRnJhbWV3b3JrO1xuaW1wb3J0IEN1YmlzbUpzb24gPSBjdWJpc21qc29uLkN1YmlzbUpzb247XG5pbXBvcnQgVmFsdWUgPSBjdWJpc21qc29uLlZhbHVlO1xuXG5leHBvcnQgbmFtZXNwYWNlIExpdmUyREN1YmlzbUZyYW1ld29yayB7XG4gIGNvbnN0IEVwc2lsb24gPSAwLjAwMTtcbiAgY29uc3QgRGVmYXVsdEZhZGVJblNlY29uZHMgPSAwLjU7XG5cbiAgLy8gUG9zZS5qc29u44Gu44K/44KwXG4gIGNvbnN0IEZhZGVJbiA9ICdGYWRlSW5UaW1lJztcbiAgY29uc3QgTGluayA9ICdMaW5rJztcbiAgY29uc3QgR3JvdXBzID0gJ0dyb3Vwcyc7XG4gIGNvbnN0IElkID0gJ0lkJztcblxuICAvKipcbiAgICog44OR44O844OE44Gu5LiN6YCP5piO5bqm44Gu6Kit5a6aXG4gICAqXG4gICAqIOODkeODvOODhOOBruS4jemAj+aYjuW6puOBrueuoeeQhuOBqOioreWumuOCkuihjOOBhuOAglxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbVBvc2Uge1xuICAgIC8qKlxuICAgICAqIOOCpOODs+OCueOCv+ODs+OCueOBruS9nOaIkFxuICAgICAqIEBwYXJhbSBwb3NlM2pzb24gcG9zZTMuanNvbuOBruODh+ODvOOCv1xuICAgICAqIEBwYXJhbSBzaXplIHBvc2UzLmpzb27jga7jg4fjg7zjgr/jga7jgrXjgqTjgrpbYnl0ZV1cbiAgICAgKiBAcmV0dXJuIOS9nOaIkOOBleOCjOOBn+OCpOODs+OCueOCv+ODs+OCuVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKHBvc2UzanNvbjogQXJyYXlCdWZmZXIsIHNpemU6IG51bWJlcik6IEN1YmlzbVBvc2Uge1xuICAgICAgY29uc3QgcmV0OiBDdWJpc21Qb3NlID0gbmV3IEN1YmlzbVBvc2UoKTtcbiAgICAgIGNvbnN0IGpzb246IEN1YmlzbUpzb24gPSBDdWJpc21Kc29uLmNyZWF0ZShwb3NlM2pzb24sIHNpemUpO1xuICAgICAgY29uc3Qgcm9vdDogVmFsdWUgPSBqc29uLmdldFJvb3QoKTtcblxuICAgICAgLy8g44OV44Kn44O844OJ5pmC6ZaT44Gu5oyH5a6aXG4gICAgICBpZiAoIXJvb3QuZ2V0VmFsdWVCeVN0cmluZyhGYWRlSW4pLmlzTnVsbCgpKSB7XG4gICAgICAgIHJldC5fZmFkZVRpbWVTZWNvbmRzID0gcm9vdFxuICAgICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKEZhZGVJbilcbiAgICAgICAgICAudG9GbG9hdChEZWZhdWx0RmFkZUluU2Vjb25kcyk7XG5cbiAgICAgICAgaWYgKHJldC5fZmFkZVRpbWVTZWNvbmRzIDw9IDAuMCkge1xuICAgICAgICAgIHJldC5fZmFkZVRpbWVTZWNvbmRzID0gRGVmYXVsdEZhZGVJblNlY29uZHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g44OR44O844OE44Kw44Or44O844OXXG4gICAgICBjb25zdCBwb3NlTGlzdEluZm86IFZhbHVlID0gcm9vdC5nZXRWYWx1ZUJ5U3RyaW5nKEdyb3Vwcyk7XG4gICAgICBjb25zdCBwb3NlQ291bnQ6IG51bWJlciA9IHBvc2VMaXN0SW5mby5nZXRTaXplKCk7XG5cbiAgICAgIGZvciAobGV0IHBvc2VJbmRleCA9IDA7IHBvc2VJbmRleCA8IHBvc2VDb3VudDsgKytwb3NlSW5kZXgpIHtcbiAgICAgICAgY29uc3QgaWRMaXN0SW5mbzogVmFsdWUgPSBwb3NlTGlzdEluZm8uZ2V0VmFsdWVCeUluZGV4KHBvc2VJbmRleCk7XG4gICAgICAgIGNvbnN0IGlkQ291bnQ6IG51bWJlciA9IGlkTGlzdEluZm8uZ2V0U2l6ZSgpO1xuICAgICAgICBsZXQgZ3JvdXBDb3VudCA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgZ3JvdXBJbmRleCA9IDA7IGdyb3VwSW5kZXggPCBpZENvdW50OyArK2dyb3VwSW5kZXgpIHtcbiAgICAgICAgICBjb25zdCBwYXJ0SW5mbzogVmFsdWUgPSBpZExpc3RJbmZvLmdldFZhbHVlQnlJbmRleChncm91cEluZGV4KTtcbiAgICAgICAgICBjb25zdCBwYXJ0RGF0YTogUGFydERhdGEgPSBuZXcgUGFydERhdGEoKTtcbiAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJJZDogQ3ViaXNtSWRIYW5kbGUgPSBDdWJpc21GcmFtZXdvcmsuZ2V0SWRNYW5hZ2VyKCkuZ2V0SWQoXG4gICAgICAgICAgICBwYXJ0SW5mby5nZXRWYWx1ZUJ5U3RyaW5nKElkKS5nZXRSYXdTdHJpbmcoKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBwYXJ0RGF0YS5wYXJ0SWQgPSBwYXJhbWV0ZXJJZDtcblxuICAgICAgICAgIC8vIOODquODs+OCr+OBmeOCi+ODkeODvOODhOOBruioreWumlxuICAgICAgICAgIGlmICghcGFydEluZm8uZ2V0VmFsdWVCeVN0cmluZyhMaW5rKS5pc051bGwoKSkge1xuICAgICAgICAgICAgY29uc3QgbGlua0xpc3RJbmZvOiBWYWx1ZSA9IHBhcnRJbmZvLmdldFZhbHVlQnlTdHJpbmcoTGluayk7XG4gICAgICAgICAgICBjb25zdCBsaW5rQ291bnQ6IG51bWJlciA9IGxpbmtMaXN0SW5mby5nZXRTaXplKCk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGxpbmtJbmRleCA9IDA7IGxpbmtJbmRleCA8IGxpbmtDb3VudDsgKytsaW5rSW5kZXgpIHtcbiAgICAgICAgICAgICAgY29uc3QgbGlua1BhcnQ6IFBhcnREYXRhID0gbmV3IFBhcnREYXRhKCk7XG4gICAgICAgICAgICAgIGNvbnN0IGxpbmtJZDogQ3ViaXNtSWRIYW5kbGUgPSBDdWJpc21GcmFtZXdvcmsuZ2V0SWRNYW5hZ2VyKCkuZ2V0SWQoXG4gICAgICAgICAgICAgICAgbGlua0xpc3RJbmZvLmdldFZhbHVlQnlJbmRleChsaW5rSW5kZXgpLmdldFN0cmluZygpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgbGlua1BhcnQucGFydElkID0gbGlua0lkO1xuXG4gICAgICAgICAgICAgIHBhcnREYXRhLmxpbmsucHVzaEJhY2sobGlua1BhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldC5fcGFydEdyb3Vwcy5wdXNoQmFjayhwYXJ0RGF0YS5jbG9uZSgpKTtcblxuICAgICAgICAgICsrZ3JvdXBDb3VudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldC5fcGFydEdyb3VwQ291bnRzLnB1c2hCYWNrKGdyb3VwQ291bnQpO1xuICAgICAgfVxuXG4gICAgICBDdWJpc21Kc29uLmRlbGV0ZShqc29uKTtcblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgqTjg7Pjgrnjgr/jg7PjgrnjgpLnoLTmo4TjgZnjgotcbiAgICAgKiBAcGFyYW0gcG9zZSDlr77osaHjga5DdWJpc21Qb3NlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkZWxldGUocG9zZTogQ3ViaXNtUG9zZSk6IHZvaWQge1xuICAgICAgaWYgKHBvc2UgIT0gbnVsbCkge1xuICAgICAgICBwb3NlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg4fjg6vjga7jg5Hjg6njg6Hjg7zjgr/jga7mm7TmlrBcbiAgICAgKiBAcGFyYW0gbW9kZWwg5a++6LGh44Gu44Oi44OH44OrXG4gICAgICogQHBhcmFtIGRlbHRhVGltZVNlY29uZHMg44OH44Or44K/5pmC6ZaTW+enkl1cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlUGFyYW1ldGVycyhcbiAgICAgIG1vZGVsOiBDdWJpc21Nb2RlbCxcbiAgICAgIGRlbHRhVGltZVNlY29uZHM6IG51bWJlclxuICAgICk6IHZvaWQge1xuICAgICAgLy8g5YmN5Zue44Gu44Oi44OH44Or44Go5ZCM44GY44Gn44Gq44GE5aC05ZCI44Gv5Yid5pyf5YyW44GM5b+F6KaBXG4gICAgICBpZiAobW9kZWwgIT0gdGhpcy5fbGFzdE1vZGVsKSB7XG4gICAgICAgIC8vIOODkeODqeODoeODvOOCv+OCpOODs+ODh+ODg+OCr+OCueOBruWIneacn+WMllxuICAgICAgICB0aGlzLnJlc2V0KG1vZGVsKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbGFzdE1vZGVsID0gbW9kZWw7XG5cbiAgICAgIC8vIOioreWumuOBi+OCieaZgumWk+OCkuWkieabtOOBmeOCi+OBqOOAgee1jOmBjuaZgumWk+OBjOODnuOCpOODiuOCueOBq+OBquOCi+S6i+OBjOOBguOCi+OBruOBp+OAgee1jOmBjuaZgumWkzDjgajjgZfjgablr77lv5xcbiAgICAgIGlmIChkZWx0YVRpbWVTZWNvbmRzIDwgMC4wKSB7XG4gICAgICAgIGRlbHRhVGltZVNlY29uZHMgPSAwLjA7XG4gICAgICB9XG5cbiAgICAgIGxldCBiZWdpbkluZGV4ID0gMDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9wYXJ0R3JvdXBDb3VudHMuZ2V0U2l6ZSgpOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGFydEdyb3VwQ291bnQ6IG51bWJlciA9IHRoaXMuX3BhcnRHcm91cENvdW50cy5hdChpKTtcblxuICAgICAgICB0aGlzLmRvRmFkZShtb2RlbCwgZGVsdGFUaW1lU2Vjb25kcywgYmVnaW5JbmRleCwgcGFydEdyb3VwQ291bnQpO1xuXG4gICAgICAgIGJlZ2luSW5kZXggKz0gcGFydEdyb3VwQ291bnQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29weVBhcnRPcGFjaXRpZXMobW9kZWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOihqOekuuOCkuWIneacn+WMllxuICAgICAqIEBwYXJhbSBtb2RlbCDlr77osaHjga7jg6Ljg4fjg6tcbiAgICAgKiBAbm90ZSDkuI3pgI/mmI7luqbjga7liJ3mnJ/lgKTjgYww44Gn44Gq44GE44OR44Op44Oh44O844K/44Gv44CB5LiN6YCP5piO5bqm44KS77yR44Gr6Kit5a6a44GZ44KLXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0KG1vZGVsOiBDdWJpc21Nb2RlbCk6IHZvaWQge1xuICAgICAgbGV0IGJlZ2luSW5kZXggPSAwO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3BhcnRHcm91cENvdW50cy5nZXRTaXplKCk7ICsraSkge1xuICAgICAgICBjb25zdCBncm91cENvdW50OiBudW1iZXIgPSB0aGlzLl9wYXJ0R3JvdXBDb3VudHMuYXQoaSk7XG5cbiAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gYmVnaW5JbmRleDsgaiA8IGJlZ2luSW5kZXggKyBncm91cENvdW50OyArK2opIHtcbiAgICAgICAgICB0aGlzLl9wYXJ0R3JvdXBzLmF0KGopLmluaXRpYWxpemUobW9kZWwpO1xuXG4gICAgICAgICAgY29uc3QgcGFydHNJbmRleDogbnVtYmVyID0gdGhpcy5fcGFydEdyb3Vwcy5hdChqKS5wYXJ0SW5kZXg7XG4gICAgICAgICAgY29uc3QgcGFyYW1JbmRleDogbnVtYmVyID0gdGhpcy5fcGFydEdyb3Vwcy5hdChqKS5wYXJhbWV0ZXJJbmRleDtcblxuICAgICAgICAgIGlmIChwYXJ0c0luZGV4IDwgMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbW9kZWwuc2V0UGFydE9wYWNpdHlCeUluZGV4KHBhcnRzSW5kZXgsIGogPT0gYmVnaW5JbmRleCA/IDEuMCA6IDAuMCk7XG4gICAgICAgICAgbW9kZWwuc2V0UGFyYW1ldGVyVmFsdWVCeUluZGV4KFxuICAgICAgICAgICAgcGFyYW1JbmRleCxcbiAgICAgICAgICAgIGogPT0gYmVnaW5JbmRleCA/IDEuMCA6IDAuMFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRoaXMuX3BhcnRHcm91cHMuYXQoaikubGluay5nZXRTaXplKCk7ICsraykge1xuICAgICAgICAgICAgdGhpcy5fcGFydEdyb3Vwc1xuICAgICAgICAgICAgICAuYXQoailcbiAgICAgICAgICAgICAgLmxpbmsuYXQoaylcbiAgICAgICAgICAgICAgLmluaXRpYWxpemUobW9kZWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJlZ2luSW5kZXggKz0gZ3JvdXBDb3VudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Hjg7zjg4Tjga7kuI3pgI/mmI7luqbjgpLjgrPjg5Tjg7xcbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlbCDlr77osaHjga7jg6Ljg4fjg6tcbiAgICAgKi9cbiAgICBwdWJsaWMgY29weVBhcnRPcGFjaXRpZXMobW9kZWw6IEN1YmlzbU1vZGVsKTogdm9pZCB7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgZ3JvdXBJbmRleCA9IDA7XG4gICAgICAgIGdyb3VwSW5kZXggPCB0aGlzLl9wYXJ0R3JvdXBzLmdldFNpemUoKTtcbiAgICAgICAgKytncm91cEluZGV4XG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcGFydERhdGE6IFBhcnREYXRhID0gdGhpcy5fcGFydEdyb3Vwcy5hdChncm91cEluZGV4KTtcblxuICAgICAgICBpZiAocGFydERhdGEubGluay5nZXRTaXplKCkgPT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlOyAvLyDpgKPli5XjgZnjgovjg5Hjg6njg6Hjg7zjgr/jga/jgarjgYRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnRJbmRleDogbnVtYmVyID0gdGhpcy5fcGFydEdyb3Vwcy5hdChncm91cEluZGV4KS5wYXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IG9wYWNpdHk6IG51bWJlciA9IG1vZGVsLmdldFBhcnRPcGFjaXR5QnlJbmRleChwYXJ0SW5kZXgpO1xuXG4gICAgICAgIGZvciAoXG4gICAgICAgICAgbGV0IGxpbmtJbmRleCA9IDA7XG4gICAgICAgICAgbGlua0luZGV4IDwgcGFydERhdGEubGluay5nZXRTaXplKCk7XG4gICAgICAgICAgKytsaW5rSW5kZXhcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbGlua1BhcnQ6IFBhcnREYXRhID0gcGFydERhdGEubGluay5hdChsaW5rSW5kZXgpO1xuICAgICAgICAgIGNvbnN0IGxpbmtQYXJ0SW5kZXg6IG51bWJlciA9IGxpbmtQYXJ0LnBhcnRJbmRleDtcblxuICAgICAgICAgIGlmIChsaW5rUGFydEluZGV4IDwgMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbW9kZWwuc2V0UGFydE9wYWNpdHlCeUluZGV4KGxpbmtQYXJ0SW5kZXgsIG9wYWNpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OR44O844OE44Gu44OV44Kn44O844OJ5pON5L2c44KS6KGM44GG44CCXG4gICAgICogQHBhcmFtIG1vZGVsIOWvvuixoeOBruODouODh+ODq1xuICAgICAqIEBwYXJhbSBkZWx0YVRpbWVTZWNvbmRzIOODh+ODq+OCv+aZgumWk1vnp5JdXG4gICAgICogQHBhcmFtIGJlZ2luSW5kZXgg44OV44Kn44O844OJ5pON5L2c44KS6KGM44GG44OR44O844OE44Kw44Or44O844OX44Gu5YWI6aCt44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHBhcmFtIHBhcnRHcm91cENvdW50IOODleOCp+ODvOODieaTjeS9nOOCkuihjOOBhuODkeODvOODhOOCsOODq+ODvOODl+OBruWAi+aVsFxuICAgICAqL1xuICAgIHB1YmxpYyBkb0ZhZGUoXG4gICAgICBtb2RlbDogQ3ViaXNtTW9kZWwsXG4gICAgICBkZWx0YVRpbWVTZWNvbmRzOiBudW1iZXIsXG4gICAgICBiZWdpbkluZGV4OiBudW1iZXIsXG4gICAgICBwYXJ0R3JvdXBDb3VudDogbnVtYmVyXG4gICAgKTogdm9pZCB7XG4gICAgICBsZXQgdmlzaWJsZVBhcnRJbmRleCA9IC0xO1xuICAgICAgbGV0IG5ld09wYWNpdHkgPSAxLjA7XG5cbiAgICAgIGNvbnN0IHBoaSA9IDAuNTtcbiAgICAgIGNvbnN0IGJhY2tPcGFjaXR5VGhyZXNob2xkID0gMC4xNTtcblxuICAgICAgLy8g54++5Zyo44CB6KGo56S654q25oWL44Gr44Gq44Gj44Gm44GE44KL44OR44O844OE44KS5Y+W5b6XXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBiZWdpbkluZGV4OyBpIDwgYmVnaW5JbmRleCArIHBhcnRHcm91cENvdW50OyArK2kpIHtcbiAgICAgICAgY29uc3QgcGFydEluZGV4OiBudW1iZXIgPSB0aGlzLl9wYXJ0R3JvdXBzLmF0KGkpLnBhcnRJbmRleDtcbiAgICAgICAgY29uc3QgcGFyYW1JbmRleDogbnVtYmVyID0gdGhpcy5fcGFydEdyb3Vwcy5hdChpKS5wYXJhbWV0ZXJJbmRleDtcblxuICAgICAgICBpZiAobW9kZWwuZ2V0UGFyYW1ldGVyVmFsdWVCeUluZGV4KHBhcmFtSW5kZXgpID4gRXBzaWxvbikge1xuICAgICAgICAgIGlmICh2aXNpYmxlUGFydEluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZpc2libGVQYXJ0SW5kZXggPSBpO1xuICAgICAgICAgIG5ld09wYWNpdHkgPSBtb2RlbC5nZXRQYXJ0T3BhY2l0eUJ5SW5kZXgocGFydEluZGV4KTtcblxuICAgICAgICAgIC8vIOaWsOOBl+OBhOS4jemAj+aYjuW6puOCkuioiOeul1xuICAgICAgICAgIG5ld09wYWNpdHkgKz0gZGVsdGFUaW1lU2Vjb25kcyAvIHRoaXMuX2ZhZGVUaW1lU2Vjb25kcztcblxuICAgICAgICAgIGlmIChuZXdPcGFjaXR5ID4gMS4wKSB7XG4gICAgICAgICAgICBuZXdPcGFjaXR5ID0gMS4wO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodmlzaWJsZVBhcnRJbmRleCA8IDApIHtcbiAgICAgICAgdmlzaWJsZVBhcnRJbmRleCA9IDA7XG4gICAgICAgIG5ld09wYWNpdHkgPSAxLjA7XG4gICAgICB9XG5cbiAgICAgIC8vIOihqOekuuODkeODvOODhOOAgemdnuihqOekuuODkeODvOODhOOBruS4jemAj+aYjuW6puOCkuioreWumuOBmeOCi1xuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gYmVnaW5JbmRleDsgaSA8IGJlZ2luSW5kZXggKyBwYXJ0R3JvdXBDb3VudDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzSW5kZXg6IG51bWJlciA9IHRoaXMuX3BhcnRHcm91cHMuYXQoaSkucGFydEluZGV4O1xuXG4gICAgICAgIC8vIOihqOekuuODkeODvOODhOOBruioreWumlxuICAgICAgICBpZiAodmlzaWJsZVBhcnRJbmRleCA9PSBpKSB7XG4gICAgICAgICAgbW9kZWwuc2V0UGFydE9wYWNpdHlCeUluZGV4KHBhcnRzSW5kZXgsIG5ld09wYWNpdHkpOyAvLyDlhYjjgavoqK3lrppcbiAgICAgICAgfVxuICAgICAgICAvLyDpnZ7ooajnpLrjg5Hjg7zjg4Tjga7oqK3lrppcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgbGV0IG9wYWNpdHk6IG51bWJlciA9IG1vZGVsLmdldFBhcnRPcGFjaXR5QnlJbmRleChwYXJ0c0luZGV4KTtcbiAgICAgICAgICBsZXQgYTE6IG51bWJlcjsgLy8g6KiI566X44Gr44KI44Gj44Gm5rGC44KB44KJ44KM44KL5LiN6YCP5piO5bqmXG5cbiAgICAgICAgICBpZiAobmV3T3BhY2l0eSA8IHBoaSkge1xuICAgICAgICAgICAgYTEgPSAobmV3T3BhY2l0eSAqIChwaGkgLSAxKSkgLyBwaGkgKyAxLjA7IC8vICgwLDEpLChwaGkscGhpKeOCkumAmuOCi+ebtOe3muW8j1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhMSA9ICgoMSAtIG5ld09wYWNpdHkpICogcGhpKSAvICgxLjAgLSBwaGkpOyAvLyAoMSwwKSwocGhpLHBoaSnjgpLpgJrjgovnm7Tnt5rlvI9cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyDog4zmma/jga7opovjgYjjgovlibLlkIjjgpLliLbpmZDjgZnjgovloLTlkIhcbiAgICAgICAgICBjb25zdCBiYWNrT3BhY2l0eTogbnVtYmVyID0gKDEuMCAtIGExKSAqICgxLjAgLSBuZXdPcGFjaXR5KTtcblxuICAgICAgICAgIGlmIChiYWNrT3BhY2l0eSA+IGJhY2tPcGFjaXR5VGhyZXNob2xkKSB7XG4gICAgICAgICAgICBhMSA9IDEuMCAtIGJhY2tPcGFjaXR5VGhyZXNob2xkIC8gKDEuMCAtIG5ld09wYWNpdHkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvcGFjaXR5ID4gYTEpIHtcbiAgICAgICAgICAgIG9wYWNpdHkgPSBhMTsgLy8g6KiI566X44Gu5LiN6YCP5piO5bqm44KI44KK44KC5aSn44GN44GR44KM44Gw77yI5r+D44GR44KM44Gw77yJ5LiN6YCP5piO5bqm44KS5LiK44GS44KLXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbW9kZWwuc2V0UGFydE9wYWNpdHlCeUluZGV4KHBhcnRzSW5kZXgsIG9wYWNpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5fZmFkZVRpbWVTZWNvbmRzID0gRGVmYXVsdEZhZGVJblNlY29uZHM7XG4gICAgICB0aGlzLl9sYXN0TW9kZWwgPSBudWxsO1xuICAgICAgdGhpcy5fcGFydEdyb3VwcyA9IG5ldyBjc21WZWN0b3I8UGFydERhdGE+KCk7XG4gICAgICB0aGlzLl9wYXJ0R3JvdXBDb3VudHMgPSBuZXcgY3NtVmVjdG9yPG51bWJlcj4oKTtcbiAgICB9XG5cbiAgICBfcGFydEdyb3VwczogY3NtVmVjdG9yPFBhcnREYXRhPjsgLy8g44OR44O844OE44Kw44Or44O844OXXG4gICAgX3BhcnRHcm91cENvdW50czogY3NtVmVjdG9yPG51bWJlcj47IC8vIOOBneOCjOOBnuOCjOOBruODkeODvOODhOOCsOODq+ODvOODl+OBruWAi+aVsFxuICAgIF9mYWRlVGltZVNlY29uZHM6IG51bWJlcjsgLy8g44OV44Kn44O844OJ5pmC6ZaTW+enkl1cbiAgICBfbGFzdE1vZGVsOiBDdWJpc21Nb2RlbDsgLy8g5YmN5Zue5pON5L2c44GX44Gf44Oi44OH44OrXG4gIH1cblxuICAvKipcbiAgICog44OR44O844OE44Gr44G+44Gk44KP44KL44OH44O844K/44KS566h55CGXG4gICAqL1xuICBleHBvcnQgY2xhc3MgUGFydERhdGEge1xuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHY/OiBQYXJ0RGF0YSkge1xuICAgICAgdGhpcy5wYXJhbWV0ZXJJbmRleCA9IDA7XG4gICAgICB0aGlzLnBhcnRJbmRleCA9IDA7XG4gICAgICB0aGlzLmxpbmsgPSBuZXcgY3NtVmVjdG9yPFBhcnREYXRhPigpO1xuXG4gICAgICBpZiAodiAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5wYXJ0SWQgPSB2LnBhcnRJZDtcblxuICAgICAgICBmb3IgKFxuICAgICAgICAgIGNvbnN0IGl0ZTogaXRlcmF0b3I8UGFydERhdGE+ID0gdi5saW5rLmJlZ2luKCk7XG4gICAgICAgICAgaXRlLm5vdEVxdWFsKHYubGluay5lbmQoKSk7XG4gICAgICAgICAgaXRlLnByZUluY3JlbWVudCgpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMubGluay5wdXNoQmFjayhpdGUucHRyKCkuY2xvbmUoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA95ryU566X5a2Q44Gu44Kq44O844OQ44O844Ot44O844OJXG4gICAgICovXG4gICAgcHVibGljIGFzc2lnbm1lbnQodjogUGFydERhdGEpOiBQYXJ0RGF0YSB7XG4gICAgICB0aGlzLnBhcnRJZCA9IHYucGFydElkO1xuXG4gICAgICBmb3IgKFxuICAgICAgICBjb25zdCBpdGU6IGl0ZXJhdG9yPFBhcnREYXRhPiA9IHYubGluay5iZWdpbigpO1xuICAgICAgICBpdGUubm90RXF1YWwodi5saW5rLmVuZCgpKTtcbiAgICAgICAgaXRlLnByZUluY3JlbWVudCgpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5saW5rLnB1c2hCYWNrKGl0ZS5wdHIoKS5jbG9uZSgpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Yid5pyf5YyWXG4gICAgICogQHBhcmFtIG1vZGVsIOWIneacn+WMluOBq+S9v+eUqOOBmeOCi+ODouODh+ODq1xuICAgICAqL1xuICAgIHB1YmxpYyBpbml0aWFsaXplKG1vZGVsOiBDdWJpc21Nb2RlbCk6IHZvaWQge1xuICAgICAgdGhpcy5wYXJhbWV0ZXJJbmRleCA9IG1vZGVsLmdldFBhcmFtZXRlckluZGV4KHRoaXMucGFydElkKTtcbiAgICAgIHRoaXMucGFydEluZGV4ID0gbW9kZWwuZ2V0UGFydEluZGV4KHRoaXMucGFydElkKTtcblxuICAgICAgbW9kZWwuc2V0UGFyYW1ldGVyVmFsdWVCeUluZGV4KHRoaXMucGFyYW1ldGVySW5kZXgsIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCquODluOCuOOCp+OCr+ODiOOBruOCs+ODlOODvOOCkueUn+aIkOOBmeOCi1xuICAgICAqL1xuICAgIHB1YmxpYyBjbG9uZSgpOiBQYXJ0RGF0YSB7XG4gICAgICBjb25zdCBjbG9uZVBhcnREYXRhOiBQYXJ0RGF0YSA9IG5ldyBQYXJ0RGF0YSgpO1xuXG4gICAgICBjbG9uZVBhcnREYXRhLnBhcnRJZCA9IHRoaXMucGFydElkO1xuICAgICAgY2xvbmVQYXJ0RGF0YS5wYXJhbWV0ZXJJbmRleCA9IHRoaXMucGFyYW1ldGVySW5kZXg7XG4gICAgICBjbG9uZVBhcnREYXRhLnBhcnRJbmRleCA9IHRoaXMucGFydEluZGV4O1xuICAgICAgY2xvbmVQYXJ0RGF0YS5saW5rID0gbmV3IGNzbVZlY3RvcjxQYXJ0RGF0YT4oKTtcblxuICAgICAgZm9yIChcbiAgICAgICAgbGV0IGl0ZTogaXRlcmF0b3I8UGFydERhdGE+ID0gdGhpcy5saW5rLmJlZ2luKCk7XG4gICAgICAgIGl0ZS5ub3RFcXVhbCh0aGlzLmxpbmsuZW5kKCkpO1xuICAgICAgICBpdGUuaW5jcmVtZW50KClcbiAgICAgICkge1xuICAgICAgICBjbG9uZVBhcnREYXRhLmxpbmsucHVzaEJhY2soaXRlLnB0cigpLmNsb25lKCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2xvbmVQYXJ0RGF0YTtcbiAgICB9XG5cbiAgICBwYXJ0SWQ6IEN1YmlzbUlkSGFuZGxlOyAvLyDjg5Hjg7zjg4RJRFxuICAgIHBhcmFtZXRlckluZGV4OiBudW1iZXI7IC8vIOODkeODqeODoeODvOOCv+OBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgIHBhcnRJbmRleDogbnVtYmVyOyAvLyDjg5Hjg7zjg4Tjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICBsaW5rOiBjc21WZWN0b3I8UGFydERhdGE+OyAvLyDpgKPli5XjgZnjgovjg5Hjg6njg6Hjg7zjgr9cbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbW1vZGVsdXNlcmRhdGFqc29uIH0gZnJvbSAnLi9jdWJpc21tb2RlbHVzZXJkYXRhanNvbic7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtaWQgfSBmcm9tICcuLi9pZC9jdWJpc21pZCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3Ntc3RyaW5nIH0gZnJvbSAnLi4vdHlwZS9jc21zdHJpbmcnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGNzbXZlY3RvciB9IGZyb20gJy4uL3R5cGUvY3NtdmVjdG9yJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21mcmFtZXdvcmsgfSBmcm9tICcuLi9saXZlMmRjdWJpc21mcmFtZXdvcmsnO1xuaW1wb3J0IEN1YmlzbUZyYW1ld29yayA9IGN1YmlzbWZyYW1ld29yay5DdWJpc21GcmFtZXdvcms7XG5pbXBvcnQgY3NtVmVjdG9yID0gY3NtdmVjdG9yLmNzbVZlY3RvcjtcbmltcG9ydCBjc21TdHJpbmcgPSBjc21zdHJpbmcuY3NtU3RyaW5nO1xuaW1wb3J0IEN1YmlzbUlkSGFuZGxlID0gY3ViaXNtaWQuQ3ViaXNtSWRIYW5kbGU7XG5pbXBvcnQgQ3ViaXNtTW9kZWxVc2VyRGF0YUpzb24gPSBjdWJpc21tb2RlbHVzZXJkYXRhanNvbi5DdWJpc21Nb2RlbFVzZXJEYXRhSnNvbjtcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICBjb25zdCBBcnRNZXNoID0gJ0FydE1lc2gnO1xuXG4gIC8qKlxuICAgKiDjg6bjg7zjgrbjg7zjg4fjg7zjgr/jgqTjg7Pjgr/jg7zjg5Xjgqfjg7zjgrlcbiAgICpcbiAgICogSnNvbuOBi+OCieiqreOBv+i+vOOCk+OBoOODpuODvOOCtuODvOODh+ODvOOCv+OCkuiomOmMsuOBl+OBpuOBiuOBj+OBn+OCgeOBruani+mAoOS9k1xuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbU1vZGVsVXNlckRhdGFOb2RlIHtcbiAgICB0YXJnZXRUeXBlOiBDdWJpc21JZEhhbmRsZTsgLy8g44Om44O844K244O844OH44O844K/44K/44O844Ky44OD44OI44K/44Kk44OXXG4gICAgdGFyZ2V0SWQ6IEN1YmlzbUlkSGFuZGxlOyAvLyDjg6bjg7zjgrbjg7zjg4fjg7zjgr/jgr/jg7zjgrLjg4Pjg4jjga5JRFxuICAgIHZhbHVlOiBjc21TdHJpbmc7IC8vIOODpuODvOOCtuODvOODh+ODvOOCv1xuICB9XG5cbiAgLyoqXG4gICAqIOODpuODvOOCtuODh+ODvOOCv+OBrueuoeeQhuOCr+ODqeOCuVxuICAgKlxuICAgKiDjg6bjg7zjgrbjg4fjg7zjgr/jgpLjg63jg7zjg4njgIHnrqHnkIbjgIHmpJzntKLjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrnjgIHop6PmlL7jgb7jgafjgpLooYzjgYbjgIJcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBDdWJpc21Nb2RlbFVzZXJEYXRhIHtcbiAgICAvKipcbiAgICAgKiDjgqTjg7Pjgrnjgr/jg7Pjgrnjga7kvZzmiJBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBidWZmZXIgICAgdXNlcmRhdGEzLmpzb27jgYzoqq3jgb/ovrzjgb7jgozjgabjgYTjgovjg5Djg4Pjg5XjgqFcbiAgICAgKiBAcGFyYW0gc2l6ZSAgICAgIOODkOODg+ODleOCoeOBruOCteOCpOOCulxuICAgICAqIEByZXR1cm4g5L2c5oiQ44GV44KM44Gf44Kk44Oz44K544K/44Oz44K5XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUoXG4gICAgICBidWZmZXI6IEFycmF5QnVmZmVyLFxuICAgICAgc2l6ZTogbnVtYmVyXG4gICAgKTogQ3ViaXNtTW9kZWxVc2VyRGF0YSB7XG4gICAgICBjb25zdCByZXQ6IEN1YmlzbU1vZGVsVXNlckRhdGEgPSBuZXcgQ3ViaXNtTW9kZWxVc2VyRGF0YSgpO1xuXG4gICAgICByZXQucGFyc2VVc2VyRGF0YShidWZmZXIsIHNpemUpO1xuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCpOODs+OCueOCv+ODs+OCueOCkuegtOajhOOBmeOCi1xuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGVsVXNlckRhdGEg56C05qOE44GZ44KL44Kk44Oz44K544K/44Oz44K5XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkZWxldGUobW9kZWxVc2VyRGF0YTogQ3ViaXNtTW9kZWxVc2VyRGF0YSk6IHZvaWQge1xuICAgICAgaWYgKG1vZGVsVXNlckRhdGEgIT0gbnVsbCkge1xuICAgICAgICBtb2RlbFVzZXJEYXRhLnJlbGVhc2UoKTtcbiAgICAgICAgbW9kZWxVc2VyRGF0YSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXJ0TWVzaOOBruODpuODvOOCtuODvOODh+ODvOOCv+OBruODquOCueODiOOBruWPluW+l1xuICAgICAqXG4gICAgICogQHJldHVybiDjg6bjg7zjgrbjg7zjg4fjg7zjgr/jg6rjgrnjg4hcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QXJ0TWVzaFVzZXJEYXRhcygpOiBjc21WZWN0b3I8Q3ViaXNtTW9kZWxVc2VyRGF0YU5vZGU+IHtcbiAgICAgIHJldHVybiB0aGlzLl9hcnRNZXNoVXNlckRhdGFOb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHVzZXJkYXRhMy5qc29u44Gu44OR44O844K5XG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnVmZmVyICAgIHVzZXJkYXRhMy5qc29u44GM6Kqt44G/6L6844G+44KM44Gm44GE44KL44OQ44OD44OV44KhXG4gICAgICogQHBhcmFtIHNpemUgICAgICDjg5Djg4Pjg5XjgqHjga7jgrXjgqTjgrpcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyc2VVc2VyRGF0YShidWZmZXI6IEFycmF5QnVmZmVyLCBzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIGxldCBqc29uOiBDdWJpc21Nb2RlbFVzZXJEYXRhSnNvbiA9IG5ldyBDdWJpc21Nb2RlbFVzZXJEYXRhSnNvbihcbiAgICAgICAgYnVmZmVyLFxuICAgICAgICBzaXplXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0eXBlT2ZBcnRNZXNoID0gQ3ViaXNtRnJhbWV3b3JrLmdldElkTWFuYWdlcigpLmdldElkKEFydE1lc2gpO1xuICAgICAgY29uc3Qgbm9kZUNvdW50OiBudW1iZXIgPSBqc29uLmdldFVzZXJEYXRhQ291bnQoKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlQ291bnQ7IGkrKykge1xuICAgICAgICBjb25zdCBhZGROb2RlOiBDdWJpc21Nb2RlbFVzZXJEYXRhTm9kZSA9IG5ldyBDdWJpc21Nb2RlbFVzZXJEYXRhTm9kZSgpO1xuXG4gICAgICAgIGFkZE5vZGUudGFyZ2V0SWQgPSBqc29uLmdldFVzZXJEYXRhSWQoaSk7XG4gICAgICAgIGFkZE5vZGUudGFyZ2V0VHlwZSA9IEN1YmlzbUZyYW1ld29yay5nZXRJZE1hbmFnZXIoKS5nZXRJZChcbiAgICAgICAgICBqc29uLmdldFVzZXJEYXRhVGFyZ2V0VHlwZShpKVxuICAgICAgICApO1xuICAgICAgICBhZGROb2RlLnZhbHVlID0gbmV3IGNzbVN0cmluZyhqc29uLmdldFVzZXJEYXRhVmFsdWUoaSkpO1xuICAgICAgICB0aGlzLl91c2VyRGF0YU5vZGVzLnB1c2hCYWNrKGFkZE5vZGUpO1xuXG4gICAgICAgIGlmIChhZGROb2RlLnRhcmdldFR5cGUgPT0gdHlwZU9mQXJ0TWVzaCkge1xuICAgICAgICAgIHRoaXMuX2FydE1lc2hVc2VyRGF0YU5vZGUucHVzaEJhY2soYWRkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAganNvbi5yZWxlYXNlKCk7XG4gICAgICBqc29uID0gdm9pZCAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuX3VzZXJEYXRhTm9kZXMgPSBuZXcgY3NtVmVjdG9yPEN1YmlzbU1vZGVsVXNlckRhdGFOb2RlPigpO1xuICAgICAgdGhpcy5fYXJ0TWVzaFVzZXJEYXRhTm9kZSA9IG5ldyBjc21WZWN0b3I8Q3ViaXNtTW9kZWxVc2VyRGF0YU5vZGU+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OH44K544OI44Op44Kv44K/55u45b2T44Gu5Yem55CGXG4gICAgICpcbiAgICAgKiDjg6bjg7zjgrbjg7zjg4fjg7zjgr/mp4vpgKDkvZPphY3liJfjgpLop6PmlL7jgZnjgotcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdXNlckRhdGFOb2Rlcy5nZXRTaXplKCk7ICsraSkge1xuICAgICAgICB0aGlzLl91c2VyRGF0YU5vZGVzLnNldChpLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdXNlckRhdGFOb2RlcyA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdXNlckRhdGFOb2RlczogY3NtVmVjdG9yPEN1YmlzbU1vZGVsVXNlckRhdGFOb2RlPjsgLy8g44Om44O844K244O844OH44O844K/5qeL6YCg5L2T6YWN5YiXXG4gICAgcHJpdmF0ZSBfYXJ0TWVzaFVzZXJEYXRhTm9kZTogY3NtVmVjdG9yPEN1YmlzbU1vZGVsVXNlckRhdGFOb2RlPjsgLy8g6Zay6Kan44Oq44K544OI44Gu5L+d5oyBXG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGhlIExpdmUyRCBPcGVuIFNvZnR3YXJlIGxpY2Vuc2VcbiAqIHRoYXQgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmxpdmUyZC5jb20vZXVsYS9saXZlMmQtb3Blbi1zb2Z0d2FyZS1saWNlbnNlLWFncmVlbWVudF9lbi5odG1sLlxuICovXG5cbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21qc29uIH0gZnJvbSAnLi4vdXRpbHMvY3ViaXNtanNvbic7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtaWQgfSBmcm9tICcuLi9pZC9jdWJpc21pZCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtZnJhbWV3b3JrIH0gZnJvbSAnLi4vbGl2ZTJkY3ViaXNtZnJhbWV3b3JrJztcbmltcG9ydCBDdWJpc21GcmFtZXdvcmsgPSBjdWJpc21mcmFtZXdvcmsuQ3ViaXNtRnJhbWV3b3JrO1xuaW1wb3J0IEN1YmlzbUlkSGFuZGxlID0gY3ViaXNtaWQuQ3ViaXNtSWRIYW5kbGU7XG5pbXBvcnQgQ3ViaXNtSnNvbiA9IGN1YmlzbWpzb24uQ3ViaXNtSnNvbjtcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICBjb25zdCBNZXRhID0gJ01ldGEnO1xuICBjb25zdCBVc2VyRGF0YUNvdW50ID0gJ1VzZXJEYXRhQ291bnQnO1xuICBjb25zdCBUb3RhbFVzZXJEYXRhU2l6ZSA9ICdUb3RhbFVzZXJEYXRhU2l6ZSc7XG4gIGNvbnN0IFVzZXJEYXRhID0gJ1VzZXJEYXRhJztcbiAgY29uc3QgVGFyZ2V0ID0gJ1RhcmdldCc7XG4gIGNvbnN0IElkID0gJ0lkJztcbiAgY29uc3QgVmFsdWUgPSAnVmFsdWUnO1xuXG4gIGV4cG9ydCBjbGFzcyBDdWJpc21Nb2RlbFVzZXJEYXRhSnNvbiB7XG4gICAgLyoqXG4gICAgICog44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICogQHBhcmFtIGJ1ZmZlciAgICB1c2VyZGF0YTMuanNvbuOBjOiqreOBv+i+vOOBvuOCjOOBpuOBhOOCi+ODkOODg+ODleOCoVxuICAgICAqIEBwYXJhbSBzaXplICAgICAg44OQ44OD44OV44Kh44Gu44K144Kk44K6XG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGJ1ZmZlcjogQXJyYXlCdWZmZXIsIHNpemU6IG51bWJlcikge1xuICAgICAgdGhpcy5fanNvbiA9IEN1YmlzbUpzb24uY3JlYXRlKGJ1ZmZlciwgc2l6ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OH44K544OI44Op44Kv44K/55u45b2T44Gu5Yem55CGXG4gICAgICovXG4gICAgcHVibGljIHJlbGVhc2UoKTogdm9pZCB7XG4gICAgICBDdWJpc21Kc29uLmRlbGV0ZSh0aGlzLl9qc29uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6bjg7zjgrbjg7zjg4fjg7zjgr/lgIvmlbDjga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIOODpuODvOOCtuODvOODh+ODvOOCv+OBruWAi+aVsFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRVc2VyRGF0YUNvdW50KCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvblxuICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKE1ldGEpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFVzZXJEYXRhQ291bnQpXG4gICAgICAgIC50b0ludCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODpuODvOOCtuODvOODh+ODvOOCv+e3j+aWh+Wtl+WIl+aVsOOBruWPluW+l1xuICAgICAqXG4gICAgICogQHJldHVybiDjg6bjg7zjgrbjg7zjg4fjg7zjgr/nt4/mloflrZfliJfmlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VG90YWxVc2VyRGF0YVNpemUoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoTWV0YSlcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoVG90YWxVc2VyRGF0YVNpemUpXG4gICAgICAgIC50b0ludCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODpuODvOOCtuODvOODh+ODvOOCv+OBruOCv+OCpOODl+OBruWPluW+l1xuICAgICAqXG4gICAgICogQHJldHVybiDjg6bjg7zjgrbjg7zjg4fjg7zjgr/jga7jgr/jgqTjg5dcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VXNlckRhdGFUYXJnZXRUeXBlKGk6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvblxuICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFVzZXJEYXRhKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KGkpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFRhcmdldClcbiAgICAgICAgLmdldFJhd1N0cmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODpuODvOOCtuODvOODh+ODvOOCv+OBruOCv+ODvOOCsuODg+ODiElE44Gu5Y+W5b6XXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaSDjgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIOODpuODvOOCtuODvOODh+ODvOOCv+OCv+ODvOOCsuODg+ODiElEXG4gICAgICovXG4gICAgcHVibGljIGdldFVzZXJEYXRhSWQoaTogbnVtYmVyKTogQ3ViaXNtSWRIYW5kbGUge1xuICAgICAgcmV0dXJuIEN1YmlzbUZyYW1ld29yay5nZXRJZE1hbmFnZXIoKS5nZXRJZChcbiAgICAgICAgdGhpcy5fanNvblxuICAgICAgICAgIC5nZXRSb290KClcbiAgICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhVc2VyRGF0YSlcbiAgICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KGkpXG4gICAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoSWQpXG4gICAgICAgICAgLmdldFJhd1N0cmluZygpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODpuODvOOCtuODvOODh+ODvOOCv+OBruaWh+Wtl+WIl+OBruWPluW+l1xuICAgICAqXG4gICAgICogQHBhcmFtIGkg44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiDjg6bjg7zjgrbjg7zjg4fjg7zjgr9cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VXNlckRhdGFWYWx1ZShpOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhVc2VyRGF0YSlcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChpKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhWYWx1ZSlcbiAgICAgICAgLmdldFJhd1N0cmluZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2pzb246IEN1YmlzbUpzb247XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGhlIExpdmUyRCBPcGVuIFNvZnR3YXJlIGxpY2Vuc2VcbiAqIHRoYXQgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmxpdmUyZC5jb20vZXVsYS9saXZlMmQtb3Blbi1zb2Z0d2FyZS1saWNlbnNlLWFncmVlbWVudF9lbi5odG1sLlxuICovXG5cbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjdWJpc21waHlzaWNzaW50ZXJuYWwgfSBmcm9tICcuL2N1YmlzbXBoeXNpY3NpbnRlcm5hbCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtbW9kZWwgfSBmcm9tICcuLi9tb2RlbC9jdWJpc21tb2RlbCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtdmVjdG9yMiB9IGZyb20gJy4uL21hdGgvY3ViaXNtdmVjdG9yMic7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtbWF0aCB9IGZyb20gJy4uL21hdGgvY3ViaXNtbWF0aCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtcGh5c2ljc2pzb24gfSBmcm9tICcuL2N1YmlzbXBoeXNpY3Nqc29uJztcbmltcG9ydCBDdWJpc21QaHlzaWNzSnNvbiA9IGN1YmlzbXBoeXNpY3Nqc29uLkN1YmlzbVBoeXNpY3NKc29uO1xuaW1wb3J0IEN1YmlzbU1hdGggPSBjdWJpc21tYXRoLkN1YmlzbU1hdGg7XG5pbXBvcnQgQ3ViaXNtUGh5c2ljc1JpZyA9IGN1YmlzbXBoeXNpY3NpbnRlcm5hbC5DdWJpc21QaHlzaWNzUmlnO1xuaW1wb3J0IEN1YmlzbVBoeXNpY3NTdWJSaWcgPSBjdWJpc21waHlzaWNzaW50ZXJuYWwuQ3ViaXNtUGh5c2ljc1N1YlJpZztcbmltcG9ydCBDdWJpc21QaHlzaWNzSW5wdXQgPSBjdWJpc21waHlzaWNzaW50ZXJuYWwuQ3ViaXNtUGh5c2ljc0lucHV0O1xuaW1wb3J0IEN1YmlzbVBoeXNpY3NPdXRwdXQgPSBjdWJpc21waHlzaWNzaW50ZXJuYWwuQ3ViaXNtUGh5c2ljc091dHB1dDtcbmltcG9ydCBDdWJpc21QaHlzaWNzUGFydGljbGUgPSBjdWJpc21waHlzaWNzaW50ZXJuYWwuQ3ViaXNtUGh5c2ljc1BhcnRpY2xlO1xuaW1wb3J0IEN1YmlzbVBoeXNpY3NTb3VyY2UgPSBjdWJpc21waHlzaWNzaW50ZXJuYWwuQ3ViaXNtUGh5c2ljc1NvdXJjZTtcbmltcG9ydCBDdWJpc21QaHlzaWNzVGFyZ2V0VHlwZSA9IGN1YmlzbXBoeXNpY3NpbnRlcm5hbC5DdWJpc21QaHlzaWNzVGFyZ2V0VHlwZTtcbmltcG9ydCBDdWJpc21QaHlzaWNzTm9ybWFsaXphdGlvbiA9IGN1YmlzbXBoeXNpY3NpbnRlcm5hbC5DdWJpc21QaHlzaWNzTm9ybWFsaXphdGlvbjtcbmltcG9ydCBDdWJpc21WZWN0b3IyID0gY3ViaXNtdmVjdG9yMi5DdWJpc21WZWN0b3IyO1xuaW1wb3J0IEN1YmlzbU1vZGVsID0gY3ViaXNtbW9kZWwuQ3ViaXNtTW9kZWw7XG5cbmV4cG9ydCBuYW1lc3BhY2UgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIHtcbiAgLy8gcGh5c2ljcyB0eXBlcyB0YWdzLlxuICBjb25zdCBQaHlzaWNzVHlwZVRhZ1ggPSAnWCc7XG4gIGNvbnN0IFBoeXNpY3NUeXBlVGFnWSA9ICdZJztcbiAgY29uc3QgUGh5c2ljc1R5cGVUYWdBbmdsZSA9ICdBbmdsZSc7XG5cbiAgLy8gQ29uc3RhbnQgb2YgYWlyIHJlc2lzdGFuY2UuXG4gIGNvbnN0IEFpclJlc2lzdGFuY2UgPSA1LjA7XG5cbiAgLy8gQ29uc3RhbnQgb2YgbWF4aW11bSB3ZWlnaHQgb2YgaW5wdXQgYW5kIG91dHB1dCByYXRpby5cbiAgY29uc3QgTWF4aW11bVdlaWdodCA9IDEwMC4wO1xuXG4gIC8vIENvbnN0YW50IG9mIHRocmVzaG9sZCBvZiBtb3ZlbWVudC5cbiAgY29uc3QgTW92ZW1lbnRUaHJlc2hvbGQgPSAwLjAwMTtcblxuICAvKipcbiAgICog54mp55CG5ryU566X44Kv44Op44K5XG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtUGh5c2ljcyB7XG4gICAgLyoqXG4gICAgICog44Kk44Oz44K544K/44Oz44K544Gu5L2c5oiQXG4gICAgICogQHBhcmFtIGJ1ZmZlciAgICBwaHlzaWNzMy5qc29u44GM6Kqt44G/6L6844G+44KM44Gm44GE44KL44OQ44OD44OV44KhXG4gICAgICogQHBhcmFtIHNpemUgICAgICDjg5Djg4Pjg5XjgqHjga7jgrXjgqTjgrpcbiAgICAgKiBAcmV0dXJuIOS9nOaIkOOBleOCjOOBn+OCpOODs+OCueOCv+ODs+OCuVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGJ1ZmZlcjogQXJyYXlCdWZmZXIsIHNpemU6IG51bWJlcik6IEN1YmlzbVBoeXNpY3Mge1xuICAgICAgY29uc3QgcmV0OiBDdWJpc21QaHlzaWNzID0gbmV3IEN1YmlzbVBoeXNpY3MoKTtcblxuICAgICAgcmV0LnBhcnNlKGJ1ZmZlciwgc2l6ZSk7XG4gICAgICByZXQuX3BoeXNpY3NSaWcuZ3Jhdml0eS55ID0gMDtcblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgqTjg7Pjgrnjgr/jg7PjgrnjgpLnoLTmo4TjgZnjgotcbiAgICAgKiBAcGFyYW0gcGh5c2ljcyDnoLTmo4TjgZnjgovjgqTjg7Pjgrnjgr/jg7PjgrlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGRlbGV0ZShwaHlzaWNzOiBDdWJpc21QaHlzaWNzKTogdm9pZCB7XG4gICAgICBpZiAocGh5c2ljcyAhPSBudWxsKSB7XG4gICAgICAgIHBoeXNpY3MucmVsZWFzZSgpO1xuICAgICAgICBwaHlzaWNzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDniannkIbmvJTnrpfjga7oqZXkvqFcbiAgICAgKiBAcGFyYW0gbW9kZWwg54mp55CG5ryU566X44Gu57WQ5p6c44KS6YGp55So44GZ44KL44Oi44OH44OrXG4gICAgICogQHBhcmFtIGRlbHRhVGltZVNlY29uZHMg44OH44Or44K/5pmC6ZaTW+enkl1cbiAgICAgKi9cbiAgICBwdWJsaWMgZXZhbHVhdGUobW9kZWw6IEN1YmlzbU1vZGVsLCBkZWx0YVRpbWVTZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIGxldCB0b3RhbEFuZ2xlOiB7IGFuZ2xlOiBudW1iZXIgfTtcbiAgICAgIGxldCB3ZWlnaHQ6IG51bWJlcjtcbiAgICAgIGxldCByYWRBbmdsZTogbnVtYmVyO1xuICAgICAgbGV0IG91dHB1dFZhbHVlOiBudW1iZXI7XG4gICAgICBjb25zdCB0b3RhbFRyYW5zbGF0aW9uOiBDdWJpc21WZWN0b3IyID0gbmV3IEN1YmlzbVZlY3RvcjIoKTtcbiAgICAgIGxldCBjdXJyZW50U2V0dGluZzogQ3ViaXNtUGh5c2ljc1N1YlJpZztcbiAgICAgIGxldCBjdXJyZW50SW5wdXQ6IEN1YmlzbVBoeXNpY3NJbnB1dFtdO1xuICAgICAgbGV0IGN1cnJlbnRPdXRwdXQ6IEN1YmlzbVBoeXNpY3NPdXRwdXRbXTtcbiAgICAgIGxldCBjdXJyZW50UGFydGljbGVzOiBDdWJpc21QaHlzaWNzUGFydGljbGVbXTtcblxuICAgICAgbGV0IHBhcmFtZXRlclZhbHVlOiBGbG9hdDMyQXJyYXk7XG4gICAgICBsZXQgcGFyYW1ldGVyTWF4aW11bVZhbHVlOiBGbG9hdDMyQXJyYXk7XG4gICAgICBsZXQgcGFyYW1ldGVyTWluaW11bVZhbHVlOiBGbG9hdDMyQXJyYXk7XG4gICAgICBsZXQgcGFyYW1ldGVyRGVmYXVsdFZhbHVlOiBGbG9hdDMyQXJyYXk7XG5cbiAgICAgIHBhcmFtZXRlclZhbHVlID0gbW9kZWwuZ2V0TW9kZWwoKS5wYXJhbWV0ZXJzLnZhbHVlcztcbiAgICAgIHBhcmFtZXRlck1heGltdW1WYWx1ZSA9IG1vZGVsLmdldE1vZGVsKCkucGFyYW1ldGVycy5tYXhpbXVtVmFsdWVzO1xuICAgICAgcGFyYW1ldGVyTWluaW11bVZhbHVlID0gbW9kZWwuZ2V0TW9kZWwoKS5wYXJhbWV0ZXJzLm1pbmltdW1WYWx1ZXM7XG4gICAgICBwYXJhbWV0ZXJEZWZhdWx0VmFsdWUgPSBtb2RlbC5nZXRNb2RlbCgpLnBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlcztcblxuICAgICAgZm9yIChcbiAgICAgICAgbGV0IHNldHRpbmdJbmRleCA9IDA7XG4gICAgICAgIHNldHRpbmdJbmRleCA8IHRoaXMuX3BoeXNpY3NSaWcuc3ViUmlnQ291bnQ7XG4gICAgICAgICsrc2V0dGluZ0luZGV4XG4gICAgICApIHtcbiAgICAgICAgdG90YWxBbmdsZSA9IHsgYW5nbGU6IDAuMCB9O1xuICAgICAgICB0b3RhbFRyYW5zbGF0aW9uLnggPSAwLjA7XG4gICAgICAgIHRvdGFsVHJhbnNsYXRpb24ueSA9IDAuMDtcbiAgICAgICAgY3VycmVudFNldHRpbmcgPSB0aGlzLl9waHlzaWNzUmlnLnNldHRpbmdzLmF0KHNldHRpbmdJbmRleCk7XG4gICAgICAgIGN1cnJlbnRJbnB1dCA9IHRoaXMuX3BoeXNpY3NSaWcuaW5wdXRzLmdldChcbiAgICAgICAgICBjdXJyZW50U2V0dGluZy5iYXNlSW5wdXRJbmRleFxuICAgICAgICApO1xuICAgICAgICBjdXJyZW50T3V0cHV0ID0gdGhpcy5fcGh5c2ljc1JpZy5vdXRwdXRzLmdldChcbiAgICAgICAgICBjdXJyZW50U2V0dGluZy5iYXNlT3V0cHV0SW5kZXhcbiAgICAgICAgKTtcbiAgICAgICAgY3VycmVudFBhcnRpY2xlcyA9IHRoaXMuX3BoeXNpY3NSaWcucGFydGljbGVzLmdldChcbiAgICAgICAgICBjdXJyZW50U2V0dGluZy5iYXNlUGFydGljbGVJbmRleFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIExvYWQgaW5wdXQgcGFyYW1ldGVyc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnRTZXR0aW5nLmlucHV0Q291bnQ7ICsraSkge1xuICAgICAgICAgIHdlaWdodCA9IGN1cnJlbnRJbnB1dFtpXS53ZWlnaHQgLyBNYXhpbXVtV2VpZ2h0O1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnRJbnB1dFtpXS5zb3VyY2VQYXJhbWV0ZXJJbmRleCA9PSAtMSkge1xuICAgICAgICAgICAgY3VycmVudElucHV0W2ldLnNvdXJjZVBhcmFtZXRlckluZGV4ID0gbW9kZWwuZ2V0UGFyYW1ldGVySW5kZXgoXG4gICAgICAgICAgICAgIGN1cnJlbnRJbnB1dFtpXS5zb3VyY2UuaWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3VycmVudElucHV0W2ldLmdldE5vcm1hbGl6ZWRQYXJhbWV0ZXJWYWx1ZShcbiAgICAgICAgICAgIHRvdGFsVHJhbnNsYXRpb24sXG4gICAgICAgICAgICB0b3RhbEFuZ2xlLFxuICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVbY3VycmVudElucHV0W2ldLnNvdXJjZVBhcmFtZXRlckluZGV4XSxcbiAgICAgICAgICAgIHBhcmFtZXRlck1pbmltdW1WYWx1ZVtjdXJyZW50SW5wdXRbaV0uc291cmNlUGFyYW1ldGVySW5kZXhdLFxuICAgICAgICAgICAgcGFyYW1ldGVyTWF4aW11bVZhbHVlW2N1cnJlbnRJbnB1dFtpXS5zb3VyY2VQYXJhbWV0ZXJJbmRleF0sXG4gICAgICAgICAgICBwYXJhbWV0ZXJEZWZhdWx0VmFsdWVbY3VycmVudElucHV0W2ldLnNvdXJjZVBhcmFtZXRlckluZGV4XSxcbiAgICAgICAgICAgIGN1cnJlbnRTZXR0aW5nLm5vcm1hbGl6YXRpb25Qb3NpdGlvbixcbiAgICAgICAgICAgIGN1cnJlbnRTZXR0aW5nLm5vcm1hbGl6YXRpb25BbmdsZSxcbiAgICAgICAgICAgIGN1cnJlbnRJbnB1dFswXS5yZWZsZWN0LFxuICAgICAgICAgICAgd2VpZ2h0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJhZEFuZ2xlID0gQ3ViaXNtTWF0aC5kZWdyZWVzVG9SYWRpYW4oLXRvdGFsQW5nbGUuYW5nbGUpO1xuXG4gICAgICAgIHRvdGFsVHJhbnNsYXRpb24ueCA9XG4gICAgICAgICAgdG90YWxUcmFuc2xhdGlvbi54ICogQ3ViaXNtTWF0aC5jb3MocmFkQW5nbGUpIC1cbiAgICAgICAgICB0b3RhbFRyYW5zbGF0aW9uLnkgKiBDdWJpc21NYXRoLnNpbihyYWRBbmdsZSk7XG4gICAgICAgIHRvdGFsVHJhbnNsYXRpb24ueSA9XG4gICAgICAgICAgdG90YWxUcmFuc2xhdGlvbi54ICogQ3ViaXNtTWF0aC5zaW4ocmFkQW5nbGUpICtcbiAgICAgICAgICB0b3RhbFRyYW5zbGF0aW9uLnkgKiBDdWJpc21NYXRoLmNvcyhyYWRBbmdsZSk7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHBhcnRpY2xlcyBwb3NpdGlvbi5cbiAgICAgICAgdXBkYXRlUGFydGljbGVzKFxuICAgICAgICAgIGN1cnJlbnRQYXJ0aWNsZXMsXG4gICAgICAgICAgY3VycmVudFNldHRpbmcucGFydGljbGVDb3VudCxcbiAgICAgICAgICB0b3RhbFRyYW5zbGF0aW9uLFxuICAgICAgICAgIHRvdGFsQW5nbGUuYW5nbGUsXG4gICAgICAgICAgdGhpcy5fb3B0aW9ucy53aW5kLFxuICAgICAgICAgIE1vdmVtZW50VGhyZXNob2xkICogY3VycmVudFNldHRpbmcubm9ybWFsaXphdGlvblBvc2l0aW9uLm1heGltdW0sXG4gICAgICAgICAgZGVsdGFUaW1lU2Vjb25kcyxcbiAgICAgICAgICBBaXJSZXNpc3RhbmNlXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVXBkYXRlIG91dHB1dCBwYXJhbWV0ZXJzLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnRTZXR0aW5nLm91dHB1dENvdW50OyArK2kpIHtcbiAgICAgICAgICBjb25zdCBwYXJ0aWNsZUluZGV4ID0gY3VycmVudE91dHB1dFtpXS52ZXJ0ZXhJbmRleDtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcnRpY2xlSW5kZXggPCAxIHx8XG4gICAgICAgICAgICBwYXJ0aWNsZUluZGV4ID49IGN1cnJlbnRTZXR0aW5nLnBhcnRpY2xlQ291bnRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjdXJyZW50T3V0cHV0W2ldLmRlc3RpbmF0aW9uUGFyYW1ldGVySW5kZXggPT0gLTEpIHtcbiAgICAgICAgICAgIGN1cnJlbnRPdXRwdXRbXG4gICAgICAgICAgICAgIGlcbiAgICAgICAgICAgIF0uZGVzdGluYXRpb25QYXJhbWV0ZXJJbmRleCA9IG1vZGVsLmdldFBhcmFtZXRlckluZGV4KFxuICAgICAgICAgICAgICBjdXJyZW50T3V0cHV0W2ldLmRlc3RpbmF0aW9uLmlkXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uOiBDdWJpc21WZWN0b3IyID0gbmV3IEN1YmlzbVZlY3RvcjIoKTtcbiAgICAgICAgICB0cmFuc2xhdGlvbi54ID1cbiAgICAgICAgICAgIGN1cnJlbnRQYXJ0aWNsZXNbcGFydGljbGVJbmRleF0ucG9zaXRpb24ueCAtXG4gICAgICAgICAgICBjdXJyZW50UGFydGljbGVzW3BhcnRpY2xlSW5kZXggLSAxXS5wb3NpdGlvbi54O1xuICAgICAgICAgIHRyYW5zbGF0aW9uLnkgPVxuICAgICAgICAgICAgY3VycmVudFBhcnRpY2xlc1twYXJ0aWNsZUluZGV4XS5wb3NpdGlvbi55IC1cbiAgICAgICAgICAgIGN1cnJlbnRQYXJ0aWNsZXNbcGFydGljbGVJbmRleCAtIDFdLnBvc2l0aW9uLnk7XG5cbiAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGN1cnJlbnRPdXRwdXRbaV0uZ2V0VmFsdWUoXG4gICAgICAgICAgICB0cmFuc2xhdGlvbixcbiAgICAgICAgICAgIGN1cnJlbnRQYXJ0aWNsZXMsXG4gICAgICAgICAgICBwYXJ0aWNsZUluZGV4LFxuICAgICAgICAgICAgY3VycmVudE91dHB1dFtpXS5yZWZsZWN0LFxuICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5ncmF2aXR5XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uUGFyYW1ldGVySW5kZXg6IG51bWJlciA9XG4gICAgICAgICAgICBjdXJyZW50T3V0cHV0W2ldLmRlc3RpbmF0aW9uUGFyYW1ldGVySW5kZXg7XG4gICAgICAgICAgY29uc3Qgb3V0UGFyYW1ldGVyVmFsdWU6IEZsb2F0MzJBcnJheSA9XG4gICAgICAgICAgICAhRmxvYXQzMkFycmF5LnByb3RvdHlwZS5zbGljZSAmJlxuICAgICAgICAgICAgJ3N1YmFycmF5JyBpbiBGbG9hdDMyQXJyYXkucHJvdG90eXBlXG4gICAgICAgICAgICAgID8gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZS5zdWJhcnJheShkZXN0aW5hdGlvblBhcmFtZXRlckluZGV4KVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICkgLy8g5YCk5rih44GX44GZ44KL44Gf44KB44CBSlNPTi5wYXJzZSwgSlNPTi5zdHJpbmdpZnlcbiAgICAgICAgICAgICAgOiBwYXJhbWV0ZXJWYWx1ZS5zbGljZShkZXN0aW5hdGlvblBhcmFtZXRlckluZGV4KTtcblxuICAgICAgICAgIHVwZGF0ZU91dHB1dFBhcmFtZXRlclZhbHVlKFxuICAgICAgICAgICAgb3V0UGFyYW1ldGVyVmFsdWUsXG4gICAgICAgICAgICBwYXJhbWV0ZXJNaW5pbXVtVmFsdWVbZGVzdGluYXRpb25QYXJhbWV0ZXJJbmRleF0sXG4gICAgICAgICAgICBwYXJhbWV0ZXJNYXhpbXVtVmFsdWVbZGVzdGluYXRpb25QYXJhbWV0ZXJJbmRleF0sXG4gICAgICAgICAgICBvdXRwdXRWYWx1ZSxcbiAgICAgICAgICAgIGN1cnJlbnRPdXRwdXRbaV1cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8g5YCk44KS5Y+N5pigXG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIGxldCBvZmZzZXQ6IG51bWJlciA9IGRlc3RpbmF0aW9uUGFyYW1ldGVySW5kZXgsIG91dFBhcmFtSW5kZXggPSAwO1xuICAgICAgICAgICAgb2Zmc2V0IDwgcGFyYW1ldGVyVmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgb2Zmc2V0KyssIG91dFBhcmFtSW5kZXgrK1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVbb2Zmc2V0XSA9IG91dFBhcmFtZXRlclZhbHVlW291dFBhcmFtSW5kZXhdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCquODl+OCt+ODp+ODs+OBruioreWumlxuICAgICAqIEBwYXJhbSBvcHRpb25zIOOCquODl+OCt+ODp+ODs1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRPcHRpb25zKG9wdGlvbnM6IE9wdGlvbnMpOiB2b2lkIHtcbiAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCquODl+OCt+ODp+ODs+OBruWPluW+l1xuICAgICAqIEByZXR1cm4g44Kq44OX44K344On44OzXG4gICAgICovXG4gICAgcHVibGljIGdldE9wdGlvbigpOiBPcHRpb25zIHtcbiAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuX3BoeXNpY3NSaWcgPSBudWxsO1xuXG4gICAgICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gICAgICB0aGlzLl9vcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiAgICAgIHRoaXMuX29wdGlvbnMuZ3Jhdml0eS55ID0gLTEuMDtcbiAgICAgIHRoaXMuX29wdGlvbnMuZ3Jhdml0eS54ID0gMDtcbiAgICAgIHRoaXMuX29wdGlvbnMud2luZC54ID0gMDtcbiAgICAgIHRoaXMuX29wdGlvbnMud2luZC55ID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg4fjgrnjg4jjg6njgq/jgr/nm7jlvZPjga7lh6bnkIZcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuX3BoeXNpY3NSaWcgPSB2b2lkIDA7XG4gICAgICB0aGlzLl9waHlzaWNzUmlnID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwaHlzaWNzMy5qc29u44KS44OR44O844K544GZ44KL44CCXG4gICAgICogQHBhcmFtIHBoeXNpY3NKc29uIHBoeXNpY3MzLmpzb27jgYzoqq3jgb/ovrzjgb7jgozjgabjgYTjgovjg5Djg4Pjg5XjgqFcbiAgICAgKiBAcGFyYW0gc2l6ZSDjg5Djg4Pjg5XjgqHjga7jgrXjgqTjgrpcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyc2UocGh5c2ljc0pzb246IEFycmF5QnVmZmVyLCBzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHRoaXMuX3BoeXNpY3NSaWcgPSBuZXcgQ3ViaXNtUGh5c2ljc1JpZygpO1xuXG4gICAgICBsZXQganNvbjogQ3ViaXNtUGh5c2ljc0pzb24gPSBuZXcgQ3ViaXNtUGh5c2ljc0pzb24ocGh5c2ljc0pzb24sIHNpemUpO1xuXG4gICAgICB0aGlzLl9waHlzaWNzUmlnLmdyYXZpdHkgPSBqc29uLmdldEdyYXZpdHkoKTtcbiAgICAgIHRoaXMuX3BoeXNpY3NSaWcud2luZCA9IGpzb24uZ2V0V2luZCgpO1xuICAgICAgdGhpcy5fcGh5c2ljc1JpZy5zdWJSaWdDb3VudCA9IGpzb24uZ2V0U3ViUmlnQ291bnQoKTtcblxuICAgICAgdGhpcy5fcGh5c2ljc1JpZy5zZXR0aW5ncy51cGRhdGVTaXplKFxuICAgICAgICB0aGlzLl9waHlzaWNzUmlnLnN1YlJpZ0NvdW50LFxuICAgICAgICBDdWJpc21QaHlzaWNzU3ViUmlnLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgdGhpcy5fcGh5c2ljc1JpZy5pbnB1dHMudXBkYXRlU2l6ZShcbiAgICAgICAganNvbi5nZXRUb3RhbElucHV0Q291bnQoKSxcbiAgICAgICAgQ3ViaXNtUGh5c2ljc0lucHV0LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgdGhpcy5fcGh5c2ljc1JpZy5vdXRwdXRzLnVwZGF0ZVNpemUoXG4gICAgICAgIGpzb24uZ2V0VG90YWxPdXRwdXRDb3VudCgpLFxuICAgICAgICBDdWJpc21QaHlzaWNzT3V0cHV0LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgdGhpcy5fcGh5c2ljc1JpZy5wYXJ0aWNsZXMudXBkYXRlU2l6ZShcbiAgICAgICAganNvbi5nZXRWZXJ0ZXhDb3VudCgpLFxuICAgICAgICBDdWJpc21QaHlzaWNzUGFydGljbGUsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICAgIGxldCBpbnB1dEluZGV4ID0gMCxcbiAgICAgICAgb3V0cHV0SW5kZXggPSAwLFxuICAgICAgICBwYXJ0aWNsZUluZGV4ID0gMDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9waHlzaWNzUmlnLnNldHRpbmdzLmdldFNpemUoKTsgKytpKSB7XG4gICAgICAgIHRoaXMuX3BoeXNpY3NSaWcuc2V0dGluZ3MuYXQoXG4gICAgICAgICAgaVxuICAgICAgICApLm5vcm1hbGl6YXRpb25Qb3NpdGlvbi5taW5pbXVtID0ganNvbi5nZXROb3JtYWxpemF0aW9uUG9zaXRpb25NaW5pbXVtVmFsdWUoXG4gICAgICAgICAgaVxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9waHlzaWNzUmlnLnNldHRpbmdzLmF0KFxuICAgICAgICAgIGlcbiAgICAgICAgKS5ub3JtYWxpemF0aW9uUG9zaXRpb24ubWF4aW11bSA9IGpzb24uZ2V0Tm9ybWFsaXphdGlvblBvc2l0aW9uTWF4aW11bVZhbHVlKFxuICAgICAgICAgIGlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fcGh5c2ljc1JpZy5zZXR0aW5ncy5hdChcbiAgICAgICAgICBpXG4gICAgICAgICkubm9ybWFsaXphdGlvblBvc2l0aW9uLmRlZmFsdXQgPSBqc29uLmdldE5vcm1hbGl6YXRpb25Qb3NpdGlvbkRlZmF1bHRWYWx1ZShcbiAgICAgICAgICBpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5fcGh5c2ljc1JpZy5zZXR0aW5ncy5hdChcbiAgICAgICAgICBpXG4gICAgICAgICkubm9ybWFsaXphdGlvbkFuZ2xlLm1pbmltdW0gPSBqc29uLmdldE5vcm1hbGl6YXRpb25BbmdsZU1pbmltdW1WYWx1ZShcbiAgICAgICAgICBpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX3BoeXNpY3NSaWcuc2V0dGluZ3MuYXQoXG4gICAgICAgICAgaVxuICAgICAgICApLm5vcm1hbGl6YXRpb25BbmdsZS5tYXhpbXVtID0ganNvbi5nZXROb3JtYWxpemF0aW9uQW5nbGVNYXhpbXVtVmFsdWUoXG4gICAgICAgICAgaVxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9waHlzaWNzUmlnLnNldHRpbmdzLmF0KFxuICAgICAgICAgIGlcbiAgICAgICAgKS5ub3JtYWxpemF0aW9uQW5nbGUuZGVmYWx1dCA9IGpzb24uZ2V0Tm9ybWFsaXphdGlvbkFuZ2xlRGVmYXVsdFZhbHVlKFxuICAgICAgICAgIGlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJbnB1dFxuICAgICAgICB0aGlzLl9waHlzaWNzUmlnLnNldHRpbmdzLmF0KGkpLmlucHV0Q291bnQgPSBqc29uLmdldElucHV0Q291bnQoaSk7XG4gICAgICAgIHRoaXMuX3BoeXNpY3NSaWcuc2V0dGluZ3MuYXQoaSkuYmFzZUlucHV0SW5kZXggPSBpbnB1dEluZGV4O1xuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5fcGh5c2ljc1JpZy5zZXR0aW5ncy5hdChpKS5pbnB1dENvdW50OyArK2opIHtcbiAgICAgICAgICB0aGlzLl9waHlzaWNzUmlnLmlucHV0cy5hdChpbnB1dEluZGV4ICsgaikuc291cmNlUGFyYW1ldGVySW5kZXggPSAtMTtcbiAgICAgICAgICB0aGlzLl9waHlzaWNzUmlnLmlucHV0cy5hdChcbiAgICAgICAgICAgIGlucHV0SW5kZXggKyBqXG4gICAgICAgICAgKS53ZWlnaHQgPSBqc29uLmdldElucHV0V2VpZ2h0KGksIGopO1xuICAgICAgICAgIHRoaXMuX3BoeXNpY3NSaWcuaW5wdXRzLmF0KFxuICAgICAgICAgICAgaW5wdXRJbmRleCArIGpcbiAgICAgICAgICApLnJlZmxlY3QgPSBqc29uLmdldElucHV0UmVmbGVjdChpLCBqKTtcblxuICAgICAgICAgIGlmIChqc29uLmdldElucHV0VHlwZShpLCBqKSA9PSBQaHlzaWNzVHlwZVRhZ1gpIHtcbiAgICAgICAgICAgIHRoaXMuX3BoeXNpY3NSaWcuaW5wdXRzLmF0KGlucHV0SW5kZXggKyBqKS50eXBlID1cbiAgICAgICAgICAgICAgQ3ViaXNtUGh5c2ljc1NvdXJjZS5DdWJpc21QaHlzaWNzU291cmNlX1g7XG4gICAgICAgICAgICB0aGlzLl9waHlzaWNzUmlnLmlucHV0cy5hdChcbiAgICAgICAgICAgICAgaW5wdXRJbmRleCArIGpcbiAgICAgICAgICAgICkuZ2V0Tm9ybWFsaXplZFBhcmFtZXRlclZhbHVlID0gZ2V0SW5wdXRUcmFuc2xhdGlvblhGcm9tTm9ybWFsaXplZFBhcmFtZXRlclZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoanNvbi5nZXRJbnB1dFR5cGUoaSwgaikgPT0gUGh5c2ljc1R5cGVUYWdZKSB7XG4gICAgICAgICAgICB0aGlzLl9waHlzaWNzUmlnLmlucHV0cy5hdChpbnB1dEluZGV4ICsgaikudHlwZSA9XG4gICAgICAgICAgICAgIEN1YmlzbVBoeXNpY3NTb3VyY2UuQ3ViaXNtUGh5c2ljc1NvdXJjZV9ZO1xuICAgICAgICAgICAgdGhpcy5fcGh5c2ljc1JpZy5pbnB1dHMuYXQoXG4gICAgICAgICAgICAgIGlucHV0SW5kZXggKyBqXG4gICAgICAgICAgICApLmdldE5vcm1hbGl6ZWRQYXJhbWV0ZXJWYWx1ZSA9IGdldElucHV0VHJhbnNsYXRpb25ZRnJvbU5vcm1hbGl6ZWRQYXJhbXRlclZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoanNvbi5nZXRJbnB1dFR5cGUoaSwgaikgPT0gUGh5c2ljc1R5cGVUYWdBbmdsZSkge1xuICAgICAgICAgICAgdGhpcy5fcGh5c2ljc1JpZy5pbnB1dHMuYXQoaW5wdXRJbmRleCArIGopLnR5cGUgPVxuICAgICAgICAgICAgICBDdWJpc21QaHlzaWNzU291cmNlLkN1YmlzbVBoeXNpY3NTb3VyY2VfQW5nbGU7XG4gICAgICAgICAgICB0aGlzLl9waHlzaWNzUmlnLmlucHV0cy5hdChcbiAgICAgICAgICAgICAgaW5wdXRJbmRleCArIGpcbiAgICAgICAgICAgICkuZ2V0Tm9ybWFsaXplZFBhcmFtZXRlclZhbHVlID0gZ2V0SW5wdXRBbmdsZUZyb21Ob3JtYWxpemVkUGFyYW1ldGVyVmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fcGh5c2ljc1JpZy5pbnB1dHMuYXQoaW5wdXRJbmRleCArIGopLnNvdXJjZS50YXJnZXRUeXBlID1cbiAgICAgICAgICAgIEN1YmlzbVBoeXNpY3NUYXJnZXRUeXBlLkN1YmlzbVBoeXNpY3NUYXJnZXRUeXBlX1BhcmFtZXRlcjtcbiAgICAgICAgICB0aGlzLl9waHlzaWNzUmlnLmlucHV0cy5hdChcbiAgICAgICAgICAgIGlucHV0SW5kZXggKyBqXG4gICAgICAgICAgKS5zb3VyY2UuaWQgPSBqc29uLmdldElucHV0U291cmNlSWQoaSwgaik7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXRJbmRleCArPSB0aGlzLl9waHlzaWNzUmlnLnNldHRpbmdzLmF0KGkpLmlucHV0Q291bnQ7XG5cbiAgICAgICAgLy8gT3V0cHV0XG4gICAgICAgIHRoaXMuX3BoeXNpY3NSaWcuc2V0dGluZ3MuYXQoaSkub3V0cHV0Q291bnQgPSBqc29uLmdldE91dHB1dENvdW50KGkpO1xuICAgICAgICB0aGlzLl9waHlzaWNzUmlnLnNldHRpbmdzLmF0KGkpLmJhc2VPdXRwdXRJbmRleCA9IG91dHB1dEluZGV4O1xuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5fcGh5c2ljc1JpZy5zZXR0aW5ncy5hdChpKS5vdXRwdXRDb3VudDsgKytqKSB7XG4gICAgICAgICAgdGhpcy5fcGh5c2ljc1JpZy5vdXRwdXRzLmF0KFxuICAgICAgICAgICAgb3V0cHV0SW5kZXggKyBqXG4gICAgICAgICAgKS5kZXN0aW5hdGlvblBhcmFtZXRlckluZGV4ID0gLTE7XG4gICAgICAgICAgdGhpcy5fcGh5c2ljc1JpZy5vdXRwdXRzLmF0KFxuICAgICAgICAgICAgb3V0cHV0SW5kZXggKyBqXG4gICAgICAgICAgKS52ZXJ0ZXhJbmRleCA9IGpzb24uZ2V0T3V0cHV0VmVydGV4SW5kZXgoaSwgaik7XG4gICAgICAgICAgdGhpcy5fcGh5c2ljc1JpZy5vdXRwdXRzLmF0KFxuICAgICAgICAgICAgb3V0cHV0SW5kZXggKyBqXG4gICAgICAgICAgKS5hbmdsZVNjYWxlID0ganNvbi5nZXRPdXRwdXRBbmdsZVNjYWxlKGksIGopO1xuICAgICAgICAgIHRoaXMuX3BoeXNpY3NSaWcub3V0cHV0cy5hdChcbiAgICAgICAgICAgIG91dHB1dEluZGV4ICsgalxuICAgICAgICAgICkud2VpZ2h0ID0ganNvbi5nZXRPdXRwdXRXZWlnaHQoaSwgaik7XG4gICAgICAgICAgdGhpcy5fcGh5c2ljc1JpZy5vdXRwdXRzLmF0KG91dHB1dEluZGV4ICsgaikuZGVzdGluYXRpb24udGFyZ2V0VHlwZSA9XG4gICAgICAgICAgICBDdWJpc21QaHlzaWNzVGFyZ2V0VHlwZS5DdWJpc21QaHlzaWNzVGFyZ2V0VHlwZV9QYXJhbWV0ZXI7XG5cbiAgICAgICAgICB0aGlzLl9waHlzaWNzUmlnLm91dHB1dHMuYXQoXG4gICAgICAgICAgICBvdXRwdXRJbmRleCArIGpcbiAgICAgICAgICApLmRlc3RpbmF0aW9uLmlkID0ganNvbi5nZXRPdXRwdXREZXN0aW5hdGlvbklkKGksIGopO1xuXG4gICAgICAgICAgaWYgKGpzb24uZ2V0T3V0cHV0VHlwZShpLCBqKSA9PSBQaHlzaWNzVHlwZVRhZ1gpIHtcbiAgICAgICAgICAgIHRoaXMuX3BoeXNpY3NSaWcub3V0cHV0cy5hdChvdXRwdXRJbmRleCArIGopLnR5cGUgPVxuICAgICAgICAgICAgICBDdWJpc21QaHlzaWNzU291cmNlLkN1YmlzbVBoeXNpY3NTb3VyY2VfWDtcbiAgICAgICAgICAgIHRoaXMuX3BoeXNpY3NSaWcub3V0cHV0cy5hdChcbiAgICAgICAgICAgICAgb3V0cHV0SW5kZXggKyBqXG4gICAgICAgICAgICApLmdldFZhbHVlID0gZ2V0T3V0cHV0VHJhbnNsYXRpb25YO1xuICAgICAgICAgICAgdGhpcy5fcGh5c2ljc1JpZy5vdXRwdXRzLmF0KFxuICAgICAgICAgICAgICBvdXRwdXRJbmRleCArIGpcbiAgICAgICAgICAgICkuZ2V0U2NhbGUgPSBnZXRPdXRwdXRTY2FsZVRyYW5zbGF0aW9uWDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGpzb24uZ2V0T3V0cHV0VHlwZShpLCBqKSA9PSBQaHlzaWNzVHlwZVRhZ1kpIHtcbiAgICAgICAgICAgIHRoaXMuX3BoeXNpY3NSaWcub3V0cHV0cy5hdChvdXRwdXRJbmRleCArIGopLnR5cGUgPVxuICAgICAgICAgICAgICBDdWJpc21QaHlzaWNzU291cmNlLkN1YmlzbVBoeXNpY3NTb3VyY2VfWTtcbiAgICAgICAgICAgIHRoaXMuX3BoeXNpY3NSaWcub3V0cHV0cy5hdChcbiAgICAgICAgICAgICAgb3V0cHV0SW5kZXggKyBqXG4gICAgICAgICAgICApLmdldFZhbHVlID0gZ2V0T3V0cHV0VHJhbnNsYXRpb25ZO1xuICAgICAgICAgICAgdGhpcy5fcGh5c2ljc1JpZy5vdXRwdXRzLmF0KFxuICAgICAgICAgICAgICBvdXRwdXRJbmRleCArIGpcbiAgICAgICAgICAgICkuZ2V0U2NhbGUgPSBnZXRPdXRwdXRTY2FsZVRyYW5zbGF0aW9uWTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGpzb24uZ2V0T3V0cHV0VHlwZShpLCBqKSA9PSBQaHlzaWNzVHlwZVRhZ0FuZ2xlKSB7XG4gICAgICAgICAgICB0aGlzLl9waHlzaWNzUmlnLm91dHB1dHMuYXQob3V0cHV0SW5kZXggKyBqKS50eXBlID1cbiAgICAgICAgICAgICAgQ3ViaXNtUGh5c2ljc1NvdXJjZS5DdWJpc21QaHlzaWNzU291cmNlX0FuZ2xlO1xuICAgICAgICAgICAgdGhpcy5fcGh5c2ljc1JpZy5vdXRwdXRzLmF0KFxuICAgICAgICAgICAgICBvdXRwdXRJbmRleCArIGpcbiAgICAgICAgICAgICkuZ2V0VmFsdWUgPSBnZXRPdXRwdXRBbmdsZTtcbiAgICAgICAgICAgIHRoaXMuX3BoeXNpY3NSaWcub3V0cHV0cy5hdChcbiAgICAgICAgICAgICAgb3V0cHV0SW5kZXggKyBqXG4gICAgICAgICAgICApLmdldFNjYWxlID0gZ2V0T3V0cHV0U2NhbGVBbmdsZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9waHlzaWNzUmlnLm91dHB1dHMuYXQoXG4gICAgICAgICAgICBvdXRwdXRJbmRleCArIGpcbiAgICAgICAgICApLnJlZmxlY3QgPSBqc29uLmdldE91dHB1dFJlZmxlY3QoaSwgaik7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0SW5kZXggKz0gdGhpcy5fcGh5c2ljc1JpZy5zZXR0aW5ncy5hdChpKS5vdXRwdXRDb3VudDtcblxuICAgICAgICAvLyBQYXJ0aWNsZVxuICAgICAgICB0aGlzLl9waHlzaWNzUmlnLnNldHRpbmdzLmF0KGkpLnBhcnRpY2xlQ291bnQgPSBqc29uLmdldFBhcnRpY2xlQ291bnQoXG4gICAgICAgICAgaVxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9waHlzaWNzUmlnLnNldHRpbmdzLmF0KGkpLmJhc2VQYXJ0aWNsZUluZGV4ID0gcGFydGljbGVJbmRleDtcblxuICAgICAgICBmb3IgKFxuICAgICAgICAgIGxldCBqID0gMDtcbiAgICAgICAgICBqIDwgdGhpcy5fcGh5c2ljc1JpZy5zZXR0aW5ncy5hdChpKS5wYXJ0aWNsZUNvdW50O1xuICAgICAgICAgICsralxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLl9waHlzaWNzUmlnLnBhcnRpY2xlcy5hdChcbiAgICAgICAgICAgIHBhcnRpY2xlSW5kZXggKyBqXG4gICAgICAgICAgKS5tb2JpbGl0eSA9IGpzb24uZ2V0UGFydGljbGVNb2JpbGl0eShpLCBqKTtcbiAgICAgICAgICB0aGlzLl9waHlzaWNzUmlnLnBhcnRpY2xlcy5hdChcbiAgICAgICAgICAgIHBhcnRpY2xlSW5kZXggKyBqXG4gICAgICAgICAgKS5kZWxheSA9IGpzb24uZ2V0UGFydGljbGVEZWxheShpLCBqKTtcbiAgICAgICAgICB0aGlzLl9waHlzaWNzUmlnLnBhcnRpY2xlcy5hdChcbiAgICAgICAgICAgIHBhcnRpY2xlSW5kZXggKyBqXG4gICAgICAgICAgKS5hY2NlbGVyYXRpb24gPSBqc29uLmdldFBhcnRpY2xlQWNjZWxlcmF0aW9uKGksIGopO1xuICAgICAgICAgIHRoaXMuX3BoeXNpY3NSaWcucGFydGljbGVzLmF0KFxuICAgICAgICAgICAgcGFydGljbGVJbmRleCArIGpcbiAgICAgICAgICApLnJhZGl1cyA9IGpzb24uZ2V0UGFydGljbGVSYWRpdXMoaSwgaik7XG4gICAgICAgICAgdGhpcy5fcGh5c2ljc1JpZy5wYXJ0aWNsZXMuYXQoXG4gICAgICAgICAgICBwYXJ0aWNsZUluZGV4ICsgalxuICAgICAgICAgICkucG9zaXRpb24gPSBqc29uLmdldFBhcnRpY2xlUG9zaXRpb24oaSwgaik7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJ0aWNsZUluZGV4ICs9IHRoaXMuX3BoeXNpY3NSaWcuc2V0dGluZ3MuYXQoaSkucGFydGljbGVDb3VudDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbml0aWFsaXplKCk7XG5cbiAgICAgIGpzb24ucmVsZWFzZSgpO1xuICAgICAganNvbiA9IHZvaWQgMDtcbiAgICAgIGpzb24gPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWIneacn+WMluOBmeOCi1xuICAgICAqL1xuICAgIHB1YmxpYyBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgICAgbGV0IHN0cmFuZDogQ3ViaXNtUGh5c2ljc1BhcnRpY2xlW107XG4gICAgICBsZXQgY3VycmVudFNldHRpbmc6IEN1YmlzbVBoeXNpY3NTdWJSaWc7XG4gICAgICBsZXQgcmFkaXVzOiBDdWJpc21WZWN0b3IyO1xuXG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgc2V0dGluZ0luZGV4ID0gMDtcbiAgICAgICAgc2V0dGluZ0luZGV4IDwgdGhpcy5fcGh5c2ljc1JpZy5zdWJSaWdDb3VudDtcbiAgICAgICAgKytzZXR0aW5nSW5kZXhcbiAgICAgICkge1xuICAgICAgICBjdXJyZW50U2V0dGluZyA9IHRoaXMuX3BoeXNpY3NSaWcuc2V0dGluZ3MuYXQoc2V0dGluZ0luZGV4KTtcbiAgICAgICAgc3RyYW5kID0gdGhpcy5fcGh5c2ljc1JpZy5wYXJ0aWNsZXMuZ2V0KFxuICAgICAgICAgIGN1cnJlbnRTZXR0aW5nLmJhc2VQYXJ0aWNsZUluZGV4XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgdG9wIG9mIHBhcnRpY2xlLlxuICAgICAgICBzdHJhbmRbMF0uaW5pdGlhbFBvc2l0aW9uID0gbmV3IEN1YmlzbVZlY3RvcjIoMC4wLCAwLjApO1xuICAgICAgICBzdHJhbmRbMF0ubGFzdFBvc2l0aW9uID0gbmV3IEN1YmlzbVZlY3RvcjIoXG4gICAgICAgICAgc3RyYW5kWzBdLmluaXRpYWxQb3NpdGlvbi54LFxuICAgICAgICAgIHN0cmFuZFswXS5pbml0aWFsUG9zaXRpb24ueVxuICAgICAgICApO1xuICAgICAgICBzdHJhbmRbMF0ubGFzdEdyYXZpdHkgPSBuZXcgQ3ViaXNtVmVjdG9yMigwLjAsIC0xLjApO1xuICAgICAgICBzdHJhbmRbMF0ubGFzdEdyYXZpdHkueSAqPSAtMS4wO1xuICAgICAgICBzdHJhbmRbMF0udmVsb2NpdHkgPSBuZXcgQ3ViaXNtVmVjdG9yMigwLjAsIDAuMCk7XG4gICAgICAgIHN0cmFuZFswXS5mb3JjZSA9IG5ldyBDdWJpc21WZWN0b3IyKDAuMCwgMC4wKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHBhcml0Y2xlcy5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBjdXJyZW50U2V0dGluZy5wYXJ0aWNsZUNvdW50OyArK2kpIHtcbiAgICAgICAgICByYWRpdXMgPSBuZXcgQ3ViaXNtVmVjdG9yMigwLjAsIDAuMCk7XG4gICAgICAgICAgcmFkaXVzLnkgPSBzdHJhbmRbaV0ucmFkaXVzO1xuICAgICAgICAgIHN0cmFuZFtpXS5pbml0aWFsUG9zaXRpb24gPSBuZXcgQ3ViaXNtVmVjdG9yMihcbiAgICAgICAgICAgIHN0cmFuZFtpIC0gMV0uaW5pdGlhbFBvc2l0aW9uLnggKyByYWRpdXMueCxcbiAgICAgICAgICAgIHN0cmFuZFtpIC0gMV0uaW5pdGlhbFBvc2l0aW9uLnkgKyByYWRpdXMueVxuICAgICAgICAgICk7XG4gICAgICAgICAgc3RyYW5kW2ldLnBvc2l0aW9uID0gbmV3IEN1YmlzbVZlY3RvcjIoXG4gICAgICAgICAgICBzdHJhbmRbaV0uaW5pdGlhbFBvc2l0aW9uLngsXG4gICAgICAgICAgICBzdHJhbmRbaV0uaW5pdGlhbFBvc2l0aW9uLnlcbiAgICAgICAgICApO1xuICAgICAgICAgIHN0cmFuZFtpXS5sYXN0UG9zaXRpb24gPSBuZXcgQ3ViaXNtVmVjdG9yMihcbiAgICAgICAgICAgIHN0cmFuZFtpXS5pbml0aWFsUG9zaXRpb24ueCxcbiAgICAgICAgICAgIHN0cmFuZFtpXS5pbml0aWFsUG9zaXRpb24ueVxuICAgICAgICAgICk7XG4gICAgICAgICAgc3RyYW5kW2ldLmxhc3RHcmF2aXR5ID0gbmV3IEN1YmlzbVZlY3RvcjIoMC4wLCAtMS4wKTtcbiAgICAgICAgICBzdHJhbmRbaV0ubGFzdEdyYXZpdHkueSAqPSAtMS4wO1xuICAgICAgICAgIHN0cmFuZFtpXS52ZWxvY2l0eSA9IG5ldyBDdWJpc21WZWN0b3IyKDAuMCwgMC4wKTtcbiAgICAgICAgICBzdHJhbmRbaV0uZm9yY2UgPSBuZXcgQ3ViaXNtVmVjdG9yMigwLjAsIDAuMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBfcGh5c2ljc1JpZzogQ3ViaXNtUGh5c2ljc1JpZzsgLy8g54mp55CG5ryU566X44Gu44OH44O844K/XG4gICAgX29wdGlvbnM6IE9wdGlvbnM7IC8vIOOCquODl+OCt+ODp+ODs1xuICB9XG5cbiAgLyoqXG4gICAqIOeJqeeQhua8lOeul+OBruOCquODl+OCt+ODp+ODs1xuICAgKi9cbiAgZXhwb3J0IGNsYXNzIE9wdGlvbnMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5ncmF2aXR5ID0gbmV3IEN1YmlzbVZlY3RvcjIoMCwgMCk7XG4gICAgICB0aGlzLndpbmQgPSBuZXcgQ3ViaXNtVmVjdG9yMigwLCAwKTtcbiAgICB9XG5cbiAgICBncmF2aXR5OiBDdWJpc21WZWN0b3IyOyAvLyDph43lipvmlrnlkJFcbiAgICB3aW5kOiBDdWJpc21WZWN0b3IyOyAvLyDpoqjjga7mlrnlkJFcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHNpZ24uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBFdmFsdWF0aW9uIHRhcmdldCB2YWx1ZS5cbiAgICpcbiAgICogQHJldHVybiBTaWduIG9mIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gc2lnbih2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgcmV0ID0gMDtcblxuICAgIGlmICh2YWx1ZSA+IDAuMCkge1xuICAgICAgcmV0ID0gMTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMC4wKSB7XG4gICAgICByZXQgPSAtMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SW5wdXRUcmFuc2xhdGlvblhGcm9tTm9ybWFsaXplZFBhcmFtZXRlclZhbHVlKFxuICAgIHRhcmdldFRyYW5zbGF0aW9uOiBDdWJpc21WZWN0b3IyLFxuICAgIHRhcmdldEFuZ2xlOiB7IGFuZ2xlOiBudW1iZXIgfSxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIHBhcmFtZXRlck1pbmltdW1WYWx1ZTogbnVtYmVyLFxuICAgIHBhcmFtZXRlck1heGltdW1WYWx1ZTogbnVtYmVyLFxuICAgIHBhcmFtZXRlckRlZmF1bHRWYWx1ZTogbnVtYmVyLFxuICAgIG5vcm1hbGl6YXRpb25Qb3NpdGlvbjogQ3ViaXNtUGh5c2ljc05vcm1hbGl6YXRpb24sXG4gICAgbm9ybWFsaXphdGlvbkFuZ2xlOiBDdWJpc21QaHlzaWNzTm9ybWFsaXphdGlvbixcbiAgICBpc0ludmVydGVkOiBib29sZWFuLFxuICAgIHdlaWdodDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIHRhcmdldFRyYW5zbGF0aW9uLnggKz1cbiAgICAgIG5vcm1hbGl6ZVBhcmFtZXRlclZhbHVlKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgcGFyYW1ldGVyTWluaW11bVZhbHVlLFxuICAgICAgICBwYXJhbWV0ZXJNYXhpbXVtVmFsdWUsXG4gICAgICAgIHBhcmFtZXRlckRlZmF1bHRWYWx1ZSxcbiAgICAgICAgbm9ybWFsaXphdGlvblBvc2l0aW9uLm1pbmltdW0sXG4gICAgICAgIG5vcm1hbGl6YXRpb25Qb3NpdGlvbi5tYXhpbXVtLFxuICAgICAgICBub3JtYWxpemF0aW9uUG9zaXRpb24uZGVmYWx1dCxcbiAgICAgICAgaXNJbnZlcnRlZFxuICAgICAgKSAqIHdlaWdodDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldElucHV0VHJhbnNsYXRpb25ZRnJvbU5vcm1hbGl6ZWRQYXJhbXRlclZhbHVlKFxuICAgIHRhcmdldFRyYW5zbGF0aW9uOiBDdWJpc21WZWN0b3IyLFxuICAgIHRhcmdldEFuZ2xlOiB7IGFuZ2xlOiBudW1iZXIgfSxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIHBhcmFtZXRlck1pbmltdW1WYWx1ZTogbnVtYmVyLFxuICAgIHBhcmFtZXRlck1heGltdW1WYWx1ZTogbnVtYmVyLFxuICAgIHBhcmFtZXRlckRlZmF1bHRWYWx1ZTogbnVtYmVyLFxuICAgIG5vcm1hbGl6YXRpb25Qb3NpdGlvbjogQ3ViaXNtUGh5c2ljc05vcm1hbGl6YXRpb24sXG4gICAgbm9ybWFsaXphdGlvbkFuZ2xlOiBDdWJpc21QaHlzaWNzTm9ybWFsaXphdGlvbixcbiAgICBpc0ludmVydGVkOiBib29sZWFuLFxuICAgIHdlaWdodDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIHRhcmdldFRyYW5zbGF0aW9uLnkgKz1cbiAgICAgIG5vcm1hbGl6ZVBhcmFtZXRlclZhbHVlKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgcGFyYW1ldGVyTWluaW11bVZhbHVlLFxuICAgICAgICBwYXJhbWV0ZXJNYXhpbXVtVmFsdWUsXG4gICAgICAgIHBhcmFtZXRlckRlZmF1bHRWYWx1ZSxcbiAgICAgICAgbm9ybWFsaXphdGlvblBvc2l0aW9uLm1pbmltdW0sXG4gICAgICAgIG5vcm1hbGl6YXRpb25Qb3NpdGlvbi5tYXhpbXVtLFxuICAgICAgICBub3JtYWxpemF0aW9uUG9zaXRpb24uZGVmYWx1dCxcbiAgICAgICAgaXNJbnZlcnRlZFxuICAgICAgKSAqIHdlaWdodDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldElucHV0QW5nbGVGcm9tTm9ybWFsaXplZFBhcmFtZXRlclZhbHVlKFxuICAgIHRhcmdldFRyYW5zbGF0aW9uOiBDdWJpc21WZWN0b3IyLFxuICAgIHRhcmdldEFuZ2xlOiB7IGFuZ2xlOiBudW1iZXIgfSxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIHBhcmFtZXRlck1pbmltdW1WYWx1ZTogbnVtYmVyLFxuICAgIHBhcmFtZXRlck1heGltdW1WYWx1ZTogbnVtYmVyLFxuICAgIHBhcmFtZXRlckRlZmF1bHRWYWx1ZTogbnVtYmVyLFxuICAgIG5vcm1hbGl6YWl0aW9uUG9zaXRpb246IEN1YmlzbVBoeXNpY3NOb3JtYWxpemF0aW9uLFxuICAgIG5vcm1hbGl6YXRpb25BbmdsZTogQ3ViaXNtUGh5c2ljc05vcm1hbGl6YXRpb24sXG4gICAgaXNJbnZlcnRlZDogYm9vbGVhbixcbiAgICB3ZWlnaHQ6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICB0YXJnZXRBbmdsZS5hbmdsZSArPVxuICAgICAgbm9ybWFsaXplUGFyYW1ldGVyVmFsdWUoXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBwYXJhbWV0ZXJNaW5pbXVtVmFsdWUsXG4gICAgICAgIHBhcmFtZXRlck1heGltdW1WYWx1ZSxcbiAgICAgICAgcGFyYW1ldGVyRGVmYXVsdFZhbHVlLFxuICAgICAgICBub3JtYWxpemF0aW9uQW5nbGUubWluaW11bSxcbiAgICAgICAgbm9ybWFsaXphdGlvbkFuZ2xlLm1heGltdW0sXG4gICAgICAgIG5vcm1hbGl6YXRpb25BbmdsZS5kZWZhbHV0LFxuICAgICAgICBpc0ludmVydGVkXG4gICAgICApICogd2VpZ2h0O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0T3V0cHV0VHJhbnNsYXRpb25YKFxuICAgIHRyYW5zbGF0aW9uOiBDdWJpc21WZWN0b3IyLFxuICAgIHBhcnRpY2xlczogQ3ViaXNtUGh5c2ljc1BhcnRpY2xlW10sXG4gICAgcGFydGljbGVJbmRleDogbnVtYmVyLFxuICAgIGlzSW52ZXJ0ZWQ6IGJvb2xlYW4sXG4gICAgcGFyZW50R3Jhdml0eTogQ3ViaXNtVmVjdG9yMlxuICApOiBudW1iZXIge1xuICAgIGxldCBvdXRwdXRWYWx1ZTogbnVtYmVyID0gdHJhbnNsYXRpb24ueDtcblxuICAgIGlmIChpc0ludmVydGVkKSB7XG4gICAgICBvdXRwdXRWYWx1ZSAqPSAtMS4wO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXRWYWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE91dHB1dFRyYW5zbGF0aW9uWShcbiAgICB0cmFuc2xhdGlvbjogQ3ViaXNtVmVjdG9yMixcbiAgICBwYXJ0aWNsZXM6IEN1YmlzbVBoeXNpY3NQYXJ0aWNsZVtdLFxuICAgIHBhcnRpY2xlSW5kZXg6IG51bWJlcixcbiAgICBpc0ludmVydGVkOiBib29sZWFuLFxuICAgIHBhcmVudEdyYXZpdHk6IEN1YmlzbVZlY3RvcjJcbiAgKTogbnVtYmVyIHtcbiAgICBsZXQgb3V0cHV0VmFsdWU6IG51bWJlciA9IHRyYW5zbGF0aW9uLnk7XG5cbiAgICBpZiAoaXNJbnZlcnRlZCkge1xuICAgICAgb3V0cHV0VmFsdWUgKj0gLTEuMDtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dFZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0T3V0cHV0QW5nbGUoXG4gICAgdHJhbnNsYXRpb246IEN1YmlzbVZlY3RvcjIsXG4gICAgcGFydGljbGVzOiBDdWJpc21QaHlzaWNzUGFydGljbGVbXSxcbiAgICBwYXJ0aWNsZUluZGV4OiBudW1iZXIsXG4gICAgaXNJbnZlcnRlZDogYm9vbGVhbixcbiAgICBwYXJlbnRHcmF2aXR5OiBDdWJpc21WZWN0b3IyXG4gICk6IG51bWJlciB7XG4gICAgbGV0IG91dHB1dFZhbHVlOiBudW1iZXI7XG5cbiAgICBpZiAocGFydGljbGVJbmRleCA+PSAyKSB7XG4gICAgICBwYXJlbnRHcmF2aXR5ID0gcGFydGljbGVzW3BhcnRpY2xlSW5kZXggLSAxXS5wb3NpdGlvbi5zdWJzdHJhY3QoXG4gICAgICAgIHBhcnRpY2xlc1twYXJ0aWNsZUluZGV4IC0gMl0ucG9zaXRpb25cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEdyYXZpdHkgPSBwYXJlbnRHcmF2aXR5Lm11bHRpcGx5QnlTY2FsZXIoLTEuMCk7XG4gICAgfVxuXG4gICAgb3V0cHV0VmFsdWUgPSBDdWJpc21NYXRoLmRpcmVjdGlvblRvUmFkaWFuKHBhcmVudEdyYXZpdHksIHRyYW5zbGF0aW9uKTtcblxuICAgIGlmIChpc0ludmVydGVkKSB7XG4gICAgICBvdXRwdXRWYWx1ZSAqPSAtMS4wO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXRWYWx1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJhbmdlVmFsdWUobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBtYXhWYWx1ZTogbnVtYmVyID0gQ3ViaXNtTWF0aC5tYXgobWluLCBtYXgpO1xuICAgIGNvbnN0IG1pblZhbHVlOiBudW1iZXIgPSBDdWJpc21NYXRoLm1pbihtaW4sIG1heCk7XG5cbiAgICByZXR1cm4gQ3ViaXNtTWF0aC5hYnMobWF4VmFsdWUgLSBtaW5WYWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBtaW5WYWx1ZTogbnVtYmVyID0gQ3ViaXNtTWF0aC5taW4obWluLCBtYXgpO1xuICAgIHJldHVybiBtaW5WYWx1ZSArIGdldFJhbmdlVmFsdWUobWluLCBtYXgpIC8gMi4wO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0T3V0cHV0U2NhbGVUcmFuc2xhdGlvblgoXG4gICAgdHJhbnNsYXRpb25TY2FsZTogQ3ViaXNtVmVjdG9yMixcbiAgICBhbmdsZVNjYWxlOiBudW1iZXJcbiAgKTogbnVtYmVyIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0cmFuc2xhdGlvblNjYWxlLngpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE91dHB1dFNjYWxlVHJhbnNsYXRpb25ZKFxuICAgIHRyYW5zbGF0aW9uU2NhbGU6IEN1YmlzbVZlY3RvcjIsXG4gICAgYW5nbGVTY2FsZTogbnVtYmVyXG4gICk6IG51bWJlciB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodHJhbnNsYXRpb25TY2FsZS55KSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRPdXRwdXRTY2FsZUFuZ2xlKFxuICAgIHRyYW5zbGF0aW9uU2NhbGU6IEN1YmlzbVZlY3RvcjIsXG4gICAgYW5nbGVTY2FsZTogbnVtYmVyXG4gICk6IG51bWJlciB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYW5nbGVTY2FsZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgcGFydGljbGVzLlxuICAgKlxuICAgKiBAcGFyYW0gc3RyYW5kICAgICAgICAgICAgICAgIFRhcmdldCBhcnJheSBvZiBwYXJ0aWNsZS5cbiAgICogQHBhcmFtIHN0cmFuZENvdW50ICAgICAgICAgICBDb3VudCBvZiBwYXJ0aWNsZS5cbiAgICogQHBhcmFtIHRvdGFsVHJhbnNsYXRpb24gICAgICBUb3RhbCB0cmFuc2xhdGlvbiB2YWx1ZS5cbiAgICogQHBhcmFtIHRvdGFsQW5nbGUgICAgICAgICAgICBUb3RhbCBhbmdsZS5cbiAgICogQHBhcmFtIHdpbmREaXJlY3Rpb24gICAgICAgICBEaXJlY3Rpb24gb2YgV2luZC5cbiAgICogQHBhcmFtIHRocmVzaG9sZFZhbHVlICAgICAgICBUaHJlc2hvbGQgb2YgbW92ZW1lbnQuXG4gICAqIEBwYXJhbSBkZWx0YVRpbWVTZWNvbmRzICAgICAgRGVsdGEgdGltZS5cbiAgICogQHBhcmFtIGFpclJlc2lzdGFuY2UgICAgICAgICBBaXIgcmVzaXN0YW5jZS5cbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVBhcnRpY2xlcyhcbiAgICBzdHJhbmQ6IEN1YmlzbVBoeXNpY3NQYXJ0aWNsZVtdLFxuICAgIHN0cmFuZENvdW50OiBudW1iZXIsXG4gICAgdG90YWxUcmFuc2xhdGlvbjogQ3ViaXNtVmVjdG9yMixcbiAgICB0b3RhbEFuZ2xlOiBudW1iZXIsXG4gICAgd2luZERpcmVjdGlvbjogQ3ViaXNtVmVjdG9yMixcbiAgICB0aHJlc2hvbGRWYWx1ZTogbnVtYmVyLFxuICAgIGRlbHRhVGltZVNlY29uZHM6IG51bWJlcixcbiAgICBhaXJSZXNpc3RhbmNlOiBudW1iZXJcbiAgKSB7XG4gICAgbGV0IHRvdGFsUmFkaWFuOiBudW1iZXI7XG4gICAgbGV0IGRlbGF5OiBudW1iZXI7XG4gICAgbGV0IHJhZGlhbjogbnVtYmVyO1xuICAgIGxldCBjdXJyZW50R3Jhdml0eTogQ3ViaXNtVmVjdG9yMjtcbiAgICBsZXQgZGlyZWN0aW9uOiBDdWJpc21WZWN0b3IyID0gbmV3IEN1YmlzbVZlY3RvcjIoMC4wLCAwLjApO1xuICAgIGxldCB2ZWxvY2l0eTogQ3ViaXNtVmVjdG9yMiA9IG5ldyBDdWJpc21WZWN0b3IyKDAuMCwgMC4wKTtcbiAgICBsZXQgZm9yY2U6IEN1YmlzbVZlY3RvcjIgPSBuZXcgQ3ViaXNtVmVjdG9yMigwLjAsIDAuMCk7XG4gICAgbGV0IG5ld0RpcmVjdGlvbjogQ3ViaXNtVmVjdG9yMiA9IG5ldyBDdWJpc21WZWN0b3IyKDAuMCwgMC4wKTtcblxuICAgIHN0cmFuZFswXS5wb3NpdGlvbiA9IG5ldyBDdWJpc21WZWN0b3IyKFxuICAgICAgdG90YWxUcmFuc2xhdGlvbi54LFxuICAgICAgdG90YWxUcmFuc2xhdGlvbi55XG4gICAgKTtcblxuICAgIHRvdGFsUmFkaWFuID0gQ3ViaXNtTWF0aC5kZWdyZWVzVG9SYWRpYW4odG90YWxBbmdsZSk7XG4gICAgY3VycmVudEdyYXZpdHkgPSBDdWJpc21NYXRoLnJhZGlhblRvRGlyZWN0aW9uKHRvdGFsUmFkaWFuKTtcbiAgICBjdXJyZW50R3Jhdml0eS5ub3JtYWxpemUoKTtcblxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3RyYW5kQ291bnQ7ICsraSkge1xuICAgICAgc3RyYW5kW2ldLmZvcmNlID0gY3VycmVudEdyYXZpdHlcbiAgICAgICAgLm11bHRpcGx5QnlTY2FsZXIoc3RyYW5kW2ldLmFjY2VsZXJhdGlvbilcbiAgICAgICAgLmFkZCh3aW5kRGlyZWN0aW9uKTtcblxuICAgICAgc3RyYW5kW2ldLmxhc3RQb3NpdGlvbiA9IG5ldyBDdWJpc21WZWN0b3IyKFxuICAgICAgICBzdHJhbmRbaV0ucG9zaXRpb24ueCxcbiAgICAgICAgc3RyYW5kW2ldLnBvc2l0aW9uLnlcbiAgICAgICk7XG5cbiAgICAgIGRlbGF5ID0gc3RyYW5kW2ldLmRlbGF5ICogZGVsdGFUaW1lU2Vjb25kcyAqIDMwLjA7XG5cbiAgICAgIGRpcmVjdGlvbiA9IHN0cmFuZFtpXS5wb3NpdGlvbi5zdWJzdHJhY3Qoc3RyYW5kW2kgLSAxXS5wb3NpdGlvbik7XG5cbiAgICAgIHJhZGlhbiA9XG4gICAgICAgIEN1YmlzbU1hdGguZGlyZWN0aW9uVG9SYWRpYW4oc3RyYW5kW2ldLmxhc3RHcmF2aXR5LCBjdXJyZW50R3Jhdml0eSkgL1xuICAgICAgICBhaXJSZXNpc3RhbmNlO1xuXG4gICAgICBkaXJlY3Rpb24ueCA9XG4gICAgICAgIEN1YmlzbU1hdGguY29zKHJhZGlhbikgKiBkaXJlY3Rpb24ueCAtXG4gICAgICAgIGRpcmVjdGlvbi55ICogQ3ViaXNtTWF0aC5zaW4ocmFkaWFuKTtcbiAgICAgIGRpcmVjdGlvbi55ID1cbiAgICAgICAgQ3ViaXNtTWF0aC5zaW4ocmFkaWFuKSAqIGRpcmVjdGlvbi54ICtcbiAgICAgICAgZGlyZWN0aW9uLnkgKiBDdWJpc21NYXRoLmNvcyhyYWRpYW4pO1xuXG4gICAgICBzdHJhbmRbaV0ucG9zaXRpb24gPSBzdHJhbmRbaSAtIDFdLnBvc2l0aW9uLmFkZChkaXJlY3Rpb24pO1xuXG4gICAgICB2ZWxvY2l0eSA9IHN0cmFuZFtpXS52ZWxvY2l0eS5tdWx0aXBseUJ5U2NhbGVyKGRlbGF5KTtcbiAgICAgIGZvcmNlID0gc3RyYW5kW2ldLmZvcmNlLm11bHRpcGx5QnlTY2FsZXIoZGVsYXkpLm11bHRpcGx5QnlTY2FsZXIoZGVsYXkpO1xuXG4gICAgICBzdHJhbmRbaV0ucG9zaXRpb24gPSBzdHJhbmRbaV0ucG9zaXRpb24uYWRkKHZlbG9jaXR5KS5hZGQoZm9yY2UpO1xuXG4gICAgICBuZXdEaXJlY3Rpb24gPSBzdHJhbmRbaV0ucG9zaXRpb24uc3Vic3RyYWN0KHN0cmFuZFtpIC0gMV0ucG9zaXRpb24pO1xuICAgICAgbmV3RGlyZWN0aW9uLm5vcm1hbGl6ZSgpO1xuXG4gICAgICBzdHJhbmRbaV0ucG9zaXRpb24gPSBzdHJhbmRbaSAtIDFdLnBvc2l0aW9uLmFkZChcbiAgICAgICAgbmV3RGlyZWN0aW9uLm11bHRpcGx5QnlTY2FsZXIoc3RyYW5kW2ldLnJhZGl1cylcbiAgICAgICk7XG5cbiAgICAgIGlmIChDdWJpc21NYXRoLmFicyhzdHJhbmRbaV0ucG9zaXRpb24ueCkgPCB0aHJlc2hvbGRWYWx1ZSkge1xuICAgICAgICBzdHJhbmRbaV0ucG9zaXRpb24ueCA9IDAuMDtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlbGF5ICE9IDAuMCkge1xuICAgICAgICBzdHJhbmRbaV0udmVsb2NpdHkgPSBzdHJhbmRbaV0ucG9zaXRpb24uc3Vic3RyYWN0KFxuICAgICAgICAgIHN0cmFuZFtpXS5sYXN0UG9zaXRpb25cbiAgICAgICAgKTtcbiAgICAgICAgc3RyYW5kW2ldLnZlbG9jaXR5ID0gc3RyYW5kW2ldLnZlbG9jaXR5LmRpdmlzaW9uQnlTY2FsYXIoZGVsYXkpO1xuICAgICAgICBzdHJhbmRbaV0udmVsb2NpdHkgPSBzdHJhbmRbaV0udmVsb2NpdHkubXVsdGlwbHlCeVNjYWxlcihcbiAgICAgICAgICBzdHJhbmRbaV0ubW9iaWxpdHlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgc3RyYW5kW2ldLmZvcmNlID0gbmV3IEN1YmlzbVZlY3RvcjIoMC4wLCAwLjApO1xuICAgICAgc3RyYW5kW2ldLmxhc3RHcmF2aXR5ID0gbmV3IEN1YmlzbVZlY3RvcjIoXG4gICAgICAgIGN1cnJlbnRHcmF2aXR5LngsXG4gICAgICAgIGN1cnJlbnRHcmF2aXR5LnlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgb3V0cHV0IHBhcmFtZXRlciB2YWx1ZS5cbiAgICogQHBhcmFtIHBhcmFtZXRlclZhbHVlICAgICAgICAgICAgVGFyZ2V0IHBhcmFtZXRlciB2YWx1ZS5cbiAgICogQHBhcmFtIHBhcmFtZXRlclZhbHVlTWluaW11bSAgICAgTWluaW11bSBvZiBwYXJhbWV0ZXIgdmFsdWUuXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJWYWx1ZU1heGltdW0gICAgIE1heGltdW0gb2YgcGFyYW1ldGVyIHZhbHVlLlxuICAgKiBAcGFyYW0gdHJhbnNsYXRpb24gICAgICAgICAgICAgICBUcmFuc2xhdGlvbiB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZU91dHB1dFBhcmFtZXRlclZhbHVlKFxuICAgIHBhcmFtZXRlclZhbHVlOiBGbG9hdDMyQXJyYXksXG4gICAgcGFyYW1ldGVyVmFsdWVNaW5pbXVtOiBudW1iZXIsXG4gICAgcGFyYW1ldGVyVmFsdWVNYXhpbXVtOiBudW1iZXIsXG4gICAgdHJhbnNsYXRpb246IG51bWJlcixcbiAgICBvdXRwdXQ6IEN1YmlzbVBoeXNpY3NPdXRwdXRcbiAgKTogdm9pZCB7XG4gICAgbGV0IG91dHB1dFNjYWxlOiBudW1iZXI7XG4gICAgbGV0IHZhbHVlOiBudW1iZXI7XG4gICAgbGV0IHdlaWdodDogbnVtYmVyO1xuXG4gICAgb3V0cHV0U2NhbGUgPSBvdXRwdXQuZ2V0U2NhbGUob3V0cHV0LnRyYW5zbGF0aW9uU2NhbGUsIG91dHB1dC5hbmdsZVNjYWxlKTtcblxuICAgIHZhbHVlID0gdHJhbnNsYXRpb24gKiBvdXRwdXRTY2FsZTtcblxuICAgIGlmICh2YWx1ZSA8IHBhcmFtZXRlclZhbHVlTWluaW11bSkge1xuICAgICAgaWYgKHZhbHVlIDwgb3V0cHV0LnZhbHVlQmVsb3dNaW5pbXVtKSB7XG4gICAgICAgIG91dHB1dC52YWx1ZUJlbG93TWluaW11bSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IHBhcmFtZXRlclZhbHVlTWluaW11bTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID4gcGFyYW1ldGVyVmFsdWVNYXhpbXVtKSB7XG4gICAgICBpZiAodmFsdWUgPiBvdXRwdXQudmFsdWVFeGNlZWRlZE1heGltdW0pIHtcbiAgICAgICAgb3V0cHV0LnZhbHVlRXhjZWVkZWRNYXhpbXVtID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gcGFyYW1ldGVyVmFsdWVNYXhpbXVtO1xuICAgIH1cblxuICAgIHdlaWdodCA9IG91dHB1dC53ZWlnaHQgLyBNYXhpbXVtV2VpZ2h0O1xuXG4gICAgaWYgKHdlaWdodCA+PSAxLjApIHtcbiAgICAgIHBhcmFtZXRlclZhbHVlWzBdID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gcGFyYW1ldGVyVmFsdWVbMF0gKiAoMS4wIC0gd2VpZ2h0KSArIHZhbHVlICogd2VpZ2h0O1xuICAgICAgcGFyYW1ldGVyVmFsdWVbMF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBub3JtYWxpemVQYXJhbWV0ZXJWYWx1ZShcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIHBhcmFtZXRlck1pbmltdW06IG51bWJlcixcbiAgICBwYXJhbWV0ZXJNYXhpbXVtOiBudW1iZXIsXG4gICAgcGFyYW1ldGVyRGVmYXVsdDogbnVtYmVyLFxuICAgIG5vcm1hbGl6ZWRNaW5pbXVtOiBudW1iZXIsXG4gICAgbm9ybWFsaXplZE1heGltdW06IG51bWJlcixcbiAgICBub3JtYWxpemVkRGVmYXVsdDogbnVtYmVyLFxuICAgIGlzSW52ZXJ0ZWQ6IGJvb2xlYW5cbiAgKSB7XG4gICAgbGV0IHJlc3VsdCA9IDAuMDtcblxuICAgIGNvbnN0IG1heFZhbHVlOiBudW1iZXIgPSBDdWJpc21NYXRoLm1heChwYXJhbWV0ZXJNYXhpbXVtLCBwYXJhbWV0ZXJNaW5pbXVtKTtcblxuICAgIGlmIChtYXhWYWx1ZSA8IHZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IG1heFZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1pblZhbHVlOiBudW1iZXIgPSBDdWJpc21NYXRoLm1pbihwYXJhbWV0ZXJNYXhpbXVtLCBwYXJhbWV0ZXJNaW5pbXVtKTtcblxuICAgIGlmIChtaW5WYWx1ZSA+IHZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IG1pblZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbk5vcm1WYWx1ZTogbnVtYmVyID0gQ3ViaXNtTWF0aC5taW4oXG4gICAgICBub3JtYWxpemVkTWluaW11bSxcbiAgICAgIG5vcm1hbGl6ZWRNYXhpbXVtXG4gICAgKTtcbiAgICBjb25zdCBtYXhOb3JtVmFsdWU6IG51bWJlciA9IEN1YmlzbU1hdGgubWF4KFxuICAgICAgbm9ybWFsaXplZE1pbmltdW0sXG4gICAgICBub3JtYWxpemVkTWF4aW11bVxuICAgICk7XG4gICAgY29uc3QgbWlkZGxlTm9ybVZhbHVlOiBudW1iZXIgPSBub3JtYWxpemVkRGVmYXVsdDtcblxuICAgIGNvbnN0IG1pZGRsZVZhbHVlOiBudW1iZXIgPSBnZXREZWZhdWx0VmFsdWUobWluVmFsdWUsIG1heFZhbHVlKTtcbiAgICBjb25zdCBwYXJhbVZhbHVlOiBudW1iZXIgPSB2YWx1ZSAtIG1pZGRsZVZhbHVlO1xuXG4gICAgc3dpdGNoIChzaWduKHBhcmFtVmFsdWUpKSB7XG4gICAgICBjYXNlIDE6IHtcbiAgICAgICAgY29uc3Qgbkxlbmd0aDogbnVtYmVyID0gbWF4Tm9ybVZhbHVlIC0gbWlkZGxlTm9ybVZhbHVlO1xuICAgICAgICBjb25zdCBwTGVuZ3RoOiBudW1iZXIgPSBtYXhWYWx1ZSAtIG1pZGRsZVZhbHVlO1xuXG4gICAgICAgIGlmIChwTGVuZ3RoICE9IDAuMCkge1xuICAgICAgICAgIHJlc3VsdCA9IHBhcmFtVmFsdWUgKiAobkxlbmd0aCAvIHBMZW5ndGgpO1xuICAgICAgICAgIHJlc3VsdCArPSBtaWRkbGVOb3JtVmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgLTE6IHtcbiAgICAgICAgY29uc3Qgbkxlbmd0aDogbnVtYmVyID0gbWluTm9ybVZhbHVlIC0gbWlkZGxlTm9ybVZhbHVlO1xuICAgICAgICBjb25zdCBwTGVuZ3RoOiBudW1iZXIgPSBtaW5WYWx1ZSAtIG1pZGRsZVZhbHVlO1xuXG4gICAgICAgIGlmIChwTGVuZ3RoICE9IDAuMCkge1xuICAgICAgICAgIHJlc3VsdCA9IHBhcmFtVmFsdWUgKiAobkxlbmd0aCAvIHBMZW5ndGgpO1xuICAgICAgICAgIHJlc3VsdCArPSBtaWRkbGVOb3JtVmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgMDoge1xuICAgICAgICByZXN1bHQgPSBtaWRkbGVOb3JtVmFsdWU7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc0ludmVydGVkID8gcmVzdWx0IDogcmVzdWx0ICogLTEuMDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbXZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL2N1YmlzbXZlY3RvcjInO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWlkIH0gZnJvbSAnLi4vaWQvY3ViaXNtaWQnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGNzbXZlY3RvciB9IGZyb20gJy4uL3R5cGUvY3NtdmVjdG9yJztcbmltcG9ydCBjc21WZWN0b3IgPSBjc212ZWN0b3IuY3NtVmVjdG9yO1xuaW1wb3J0IEN1YmlzbUlkSGFuZGxlID0gY3ViaXNtaWQuQ3ViaXNtSWRIYW5kbGU7XG5pbXBvcnQgQ3ViaXNtVmVjdG9yMiA9IGN1YmlzbXZlY3RvcjIuQ3ViaXNtVmVjdG9yMjtcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvKipcbiAgICog54mp55CG5ryU566X44Gu6YGp55So5YWI44Gu56iu6aGeXG4gICAqL1xuICBleHBvcnQgZW51bSBDdWJpc21QaHlzaWNzVGFyZ2V0VHlwZSB7XG4gICAgQ3ViaXNtUGh5c2ljc1RhcmdldFR5cGVfUGFyYW1ldGVyIC8vIOODkeODqeODoeODvOOCv+OBq+WvvuOBl+OBpumBqeeUqFxuICB9XG5cbiAgLyoqXG4gICAqIOeJqeeQhua8lOeul+OBruWFpeWKm+OBrueorumhnlxuICAgKi9cbiAgZXhwb3J0IGVudW0gQ3ViaXNtUGh5c2ljc1NvdXJjZSB7XG4gICAgQ3ViaXNtUGh5c2ljc1NvdXJjZV9YLCAvLyBY6Lu444Gu5L2N572u44GL44KJXG4gICAgQ3ViaXNtUGh5c2ljc1NvdXJjZV9ZLCAvLyBZ6Lu444Gu5L2N572u44GL44KJXG4gICAgQ3ViaXNtUGh5c2ljc1NvdXJjZV9BbmdsZSAvLyDop5LluqbjgYvjgolcbiAgfVxuXG4gIC8qKlxuICAgKiBAYnJpZWYg54mp55CG5ryU566X44Gn5L2/55So44GZ44KL5aSW6YOo44Gu5YqbXG4gICAqXG4gICAqIOeJqeeQhua8lOeul+OBp+S9v+eUqOOBmeOCi+WklumDqOOBruWKm+OAglxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIFBoeXNpY3NKc29uRWZmZWN0aXZlRm9yY2VzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuZ3Jhdml0eSA9IG5ldyBDdWJpc21WZWN0b3IyKDAsIDApO1xuICAgICAgdGhpcy53aW5kID0gbmV3IEN1YmlzbVZlY3RvcjIoMCwgMCk7XG4gICAgfVxuICAgIGdyYXZpdHk6IEN1YmlzbVZlY3RvcjI7IC8vIOmHjeWKm1xuICAgIHdpbmQ6IEN1YmlzbVZlY3RvcjI7IC8vIOmiqFxuICB9XG5cbiAgLyoqXG4gICAqIOeJqeeQhua8lOeul+OBruODkeODqeODoeODvOOCv+aDheWgsVxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbVBoeXNpY3NQYXJhbWV0ZXIge1xuICAgIGlkOiBDdWJpc21JZEhhbmRsZTsgLy8g44OR44Op44Oh44O844K/XG4gICAgdGFyZ2V0VHlwZTogQ3ViaXNtUGh5c2ljc1RhcmdldFR5cGU7IC8vIOmBqeeUqOWFiOOBrueorumhnlxuICB9XG5cbiAgLyoqXG4gICAqIOeJqeeQhua8lOeul+OBruato+imj+WMluaDheWgsVxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbVBoeXNpY3NOb3JtYWxpemF0aW9uIHtcbiAgICBtaW5pbXVtOiBudW1iZXI7IC8vIOacgOWkp+WApFxuICAgIG1heGltdW06IG51bWJlcjsgLy8g5pyA5bCP5YCkXG4gICAgZGVmYWx1dDogbnVtYmVyOyAvLyDjg4fjg5Xjgqnjg6vjg4jlgKRcbiAgfVxuXG4gIC8qKlxuICAgKiDniannkIbmvJTnrpfjga7mvJTnrpflp5Tkvb/nlKjjgZnjgovniannkIbngrnjga7mg4XloLFcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBDdWJpc21QaHlzaWNzUGFydGljbGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5pbml0aWFsUG9zaXRpb24gPSBuZXcgQ3ViaXNtVmVjdG9yMigwLCAwKTtcbiAgICAgIHRoaXMucG9zaXRpb24gPSBuZXcgQ3ViaXNtVmVjdG9yMigwLCAwKTtcbiAgICAgIHRoaXMubGFzdFBvc2l0aW9uID0gbmV3IEN1YmlzbVZlY3RvcjIoMCwgMCk7XG4gICAgICB0aGlzLmxhc3RHcmF2aXR5ID0gbmV3IEN1YmlzbVZlY3RvcjIoMCwgMCk7XG4gICAgICB0aGlzLmZvcmNlID0gbmV3IEN1YmlzbVZlY3RvcjIoMCwgMCk7XG4gICAgICB0aGlzLnZlbG9jaXR5ID0gbmV3IEN1YmlzbVZlY3RvcjIoMCwgMCk7XG4gICAgfVxuXG4gICAgaW5pdGlhbFBvc2l0aW9uOiBDdWJpc21WZWN0b3IyOyAvLyDliJ3mnJ/kvY3nva5cbiAgICBtb2JpbGl0eTogbnVtYmVyOyAvLyDli5XjgY3jgoTjgZnjgZVcbiAgICBkZWxheTogbnVtYmVyOyAvLyDpgYXjgoxcbiAgICBhY2NlbGVyYXRpb246IG51bWJlcjsgLy8g5Yqg6YCf5bqmXG4gICAgcmFkaXVzOiBudW1iZXI7IC8vIOi3nembolxuICAgIHBvc2l0aW9uOiBDdWJpc21WZWN0b3IyOyAvLyDnj77lnKjjga7kvY3nva5cbiAgICBsYXN0UG9zaXRpb246IEN1YmlzbVZlY3RvcjI7IC8vIOacgOW+jOOBruS9jee9rlxuICAgIGxhc3RHcmF2aXR5OiBDdWJpc21WZWN0b3IyOyAvLyDmnIDlvozjga7ph43liptcbiAgICBmb3JjZTogQ3ViaXNtVmVjdG9yMjsgLy8g54++5Zyo44GL44GL44Gj44Gm44GE44KL5YqbXG4gICAgdmVsb2NpdHk6IEN1YmlzbVZlY3RvcjI7IC8vIOePvuWcqOOBrumAn+W6plxuICB9XG5cbiAgLyoqXG4gICAqIOeJqeeQhua8lOeul+OBrueJqeeQhueCueOBrueuoeeQhlxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbVBoeXNpY3NTdWJSaWcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5ub3JtYWxpemF0aW9uUG9zaXRpb24gPSBuZXcgQ3ViaXNtUGh5c2ljc05vcm1hbGl6YXRpb24oKTtcbiAgICAgIHRoaXMubm9ybWFsaXphdGlvbkFuZ2xlID0gbmV3IEN1YmlzbVBoeXNpY3NOb3JtYWxpemF0aW9uKCk7XG4gICAgfVxuICAgIGlucHV0Q291bnQ6IG51bWJlcjsgLy8g5YWl5Yqb44Gu5YCL5pWwXG4gICAgb3V0cHV0Q291bnQ6IG51bWJlcjsgLy8g5Ye65Yqb44Gu5YCL5pWwXG4gICAgcGFydGljbGVDb3VudDogbnVtYmVyOyAvLyDniannkIbngrnjga7lgIvmlbBcbiAgICBiYXNlSW5wdXRJbmRleDogbnVtYmVyOyAvLyDlhaXlipvjga7mnIDliJ3jga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICBiYXNlT3V0cHV0SW5kZXg6IG51bWJlcjsgLy8g5Ye65Yqb44Gu5pyA5Yid44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgYmFzZVBhcnRpY2xlSW5kZXg6IG51bWJlcjsgLy8g54mp55CG54K544Gu5pyA5Yid44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgbm9ybWFsaXphdGlvblBvc2l0aW9uOiBDdWJpc21QaHlzaWNzTm9ybWFsaXphdGlvbjsgLy8g5q2j6KaP5YyW44GV44KM44Gf5L2N572uXG4gICAgbm9ybWFsaXphdGlvbkFuZ2xlOiBDdWJpc21QaHlzaWNzTm9ybWFsaXphdGlvbjsgLy8g5q2j6KaP5YyW44GV44KM44Gf6KeS5bqmXG4gIH1cblxuICAvKipcbiAgICog5q2j6KaP5YyW44GV44KM44Gf44OR44Op44Oh44O844K/44Gu5Y+W5b6X6Zai5pWw44Gu5a6j6KiAXG4gICAqIEBwYXJhbSB0YXJnZXRUcmFuc2xhdGlvbiAgICAgLy8g5ryU566X57WQ5p6c44Gu56e75YuV5YCkXG4gICAqIEBwYXJhbSB0YXJnZXRBbmdsZSAgICAgICAgICAgLy8g5ryU566X57WQ5p6c44Gu6KeS5bqmXG4gICAqIEBwYXJhbSB2YWx1ZSAgICAgICAgICAgICAgICAgLy8g44OR44Op44Oh44O844K/44Gu5YCkXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJNaW5pbXVuVmFsdWUgLy8g44OR44Op44Oh44O844K/44Gu5pyA5bCP5YCkXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJNYXhpbXVtVmFsdWUgLy8g44OR44Op44Oh44O844K/44Gu5pyA5aSn5YCkXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJEZWZhdWx0VmFsdWUgLy8g44OR44Op44Oh44O844K/44Gu44OH44OV44Kp44Or44OI5YCkXG4gICAqIEBwYXJhbSBub3JtYWxpemF0aW9uUG9zaXRpb24gLy8g5q2j6KaP5YyW44GV44KM44Gf5L2N572uXG4gICAqIEBwYXJhbSBub3JtYWxpemF0aW9uQW5nbGUgICAgLy8g5q2j6KaP5YyW44GV44KM44Gf6KeS5bqmXG4gICAqIEBwYXJhbSBpc0ludmVydGVkICAgICAgICAgICAgLy8g5YCk44GM5Y+N6Lui44GV44KM44Gm44GE44KL44GL77yfXG4gICAqIEBwYXJhbSB3ZWlnaHQgICAgICAgICAgICAgICAgLy8g6YeN44G/XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIG5vcm1hbGl6ZWRQaHlzaWNzUGFyYW1ldGVyVmFsdWVHZXR0ZXIge1xuICAgIChcbiAgICAgIHRhcmdldFRyYW5zbGF0aW9uOiBDdWJpc21WZWN0b3IyLFxuICAgICAgdGFyZ2V0QW5nbGU6IHsgYW5nbGU6IG51bWJlciB9LFxuICAgICAgdmFsdWU6IG51bWJlcixcbiAgICAgIHBhcmFtZXRlck1pbmltdW5WYWx1ZTogbnVtYmVyLFxuICAgICAgcGFyYW1ldGVyTWF4aW11bVZhbHVlOiBudW1iZXIsXG4gICAgICBwYXJhbWV0ZXJEZWZhdWx0VmFsdWU6IG51bWJlcixcbiAgICAgIG5vcm1hbGl6YXRpb25Qb3NpdGlvbjogQ3ViaXNtUGh5c2ljc05vcm1hbGl6YXRpb24sXG4gICAgICBub3JtYWxpemF0aW9uQW5nbGU6IEN1YmlzbVBoeXNpY3NOb3JtYWxpemF0aW9uLFxuICAgICAgaXNJbnZlcnRlZDogYm9vbGVhbixcbiAgICAgIHdlaWdodDogbnVtYmVyXG4gICAgKTogdm9pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiDniannkIbmvJTnrpfjga7lgKTjga7lj5blvpfplqLmlbDjga7lrqPoqIBcbiAgICogQHBhcmFtIHRyYW5zbGF0aW9uIOenu+WLleWApFxuICAgKiBAcGFyYW0gcGFydGljbGVzIOeJqeeQhueCueOBruODquOCueODiFxuICAgKiBAcGFyYW0gaXNJbnZlcnRlZCDlgKTjgYzlj43mmKDjgZXjgozjgabjgYTjgovjgYtcbiAgICogQHBhcmFtIHBhcmVudEdyYXZpdHkg6YeN5YqbXG4gICAqIEByZXR1cm4g5YCkXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIHBoeXNpY3NWYWx1ZUdldHRlciB7XG4gICAgKFxuICAgICAgdHJhbnNsYXRpb246IEN1YmlzbVZlY3RvcjIsXG4gICAgICBwYXJ0aWNsZXM6IEN1YmlzbVBoeXNpY3NQYXJ0aWNsZVtdLFxuICAgICAgcGFydGljbGVJbmRleDogbnVtYmVyLFxuICAgICAgaXNJbnZlcnRlZDogYm9vbGVhbixcbiAgICAgIHBhcmVudEdyYXZpdHk6IEN1YmlzbVZlY3RvcjJcbiAgICApOiBudW1iZXI7XG4gIH1cblxuICAvKipcbiAgICog54mp55CG5ryU566X44Gu44K544Kx44O844Or44Gu5Y+W5b6X6Zai5pWw44Gu5a6j6KiAXG4gICAqIEBwYXJhbSB0cmFuc2xhdGlvblNjYWxlIOenu+WLleWApOOBruOCueOCseODvOODq1xuICAgKiBAcGFyYW0gYW5nbGVTY2FsZSAgICDop5Lluqbjga7jgrnjgrHjg7zjg6tcbiAgICogQHJldHVybiDjgrnjgrHjg7zjg6vlgKRcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgcGh5c2ljc1NjYWxlR2V0dGVyIHtcbiAgICAodHJhbnNsYXRpb25TY2FsZTogQ3ViaXNtVmVjdG9yMiwgYW5nbGVTY2FsZTogbnVtYmVyKTogbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIOeJqeeQhua8lOeul+OBruWFpeWKm+aDheWgsVxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbVBoeXNpY3NJbnB1dCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLnNvdXJjZSA9IG5ldyBDdWJpc21QaHlzaWNzUGFyYW1ldGVyKCk7XG4gICAgfVxuICAgIHNvdXJjZTogQ3ViaXNtUGh5c2ljc1BhcmFtZXRlcjsgLy8g5YWl5Yqb5YWD44Gu44OR44Op44Oh44O844K/XG4gICAgc291cmNlUGFyYW1ldGVySW5kZXg6IG51bWJlcjsgLy8g5YWl5Yqb5YWD44Gu44OR44Op44Oh44O844K/44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgd2VpZ2h0OiBudW1iZXI7IC8vIOmHjeOBv1xuICAgIHR5cGU6IG51bWJlcjsgLy8g5YWl5Yqb44Gu56iu6aGeXG4gICAgcmVmbGVjdDogYm9vbGVhbjsgLy8g5YCk44GM5Y+N6Lui44GV44KM44Gm44GE44KL44GL44Gp44GG44GLXG4gICAgZ2V0Tm9ybWFsaXplZFBhcmFtZXRlclZhbHVlOiBub3JtYWxpemVkUGh5c2ljc1BhcmFtZXRlclZhbHVlR2V0dGVyOyAvLyDmraPopo/ljJbjgZXjgozjgZ/jg5Hjg6njg6Hjg7zjgr/lgKTjga7lj5blvpfplqLmlbBcbiAgfVxuXG4gIC8qKlxuICAgKiBAYnJpZWYg54mp55CG5ryU566X44Gu5Ye65Yqb5oOF5aCxXG4gICAqXG4gICAqIOeJqeeQhua8lOeul+OBruWHuuWKm+aDheWgseOAglxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbVBoeXNpY3NPdXRwdXQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IG5ldyBDdWJpc21QaHlzaWNzUGFyYW1ldGVyKCk7XG4gICAgICB0aGlzLnRyYW5zbGF0aW9uU2NhbGUgPSBuZXcgQ3ViaXNtVmVjdG9yMigwLCAwKTtcbiAgICB9XG5cbiAgICBkZXN0aW5hdGlvbjogQ3ViaXNtUGh5c2ljc1BhcmFtZXRlcjsgLy8g5Ye65Yqb5YWI44Gu44OR44Op44Oh44O844K/XG4gICAgZGVzdGluYXRpb25QYXJhbWV0ZXJJbmRleDogbnVtYmVyOyAvLyDlh7rlipvlhYjjga7jg5Hjg6njg6Hjg7zjgr/jga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICB2ZXJ0ZXhJbmRleDogbnVtYmVyOyAvLyDmjK/jgorlrZDjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICB0cmFuc2xhdGlvblNjYWxlOiBDdWJpc21WZWN0b3IyOyAvLyDnp7vli5XlgKTjga7jgrnjgrHjg7zjg6tcbiAgICBhbmdsZVNjYWxlOiBudW1iZXI7IC8vIOinkuW6puOBruOCueOCseODvOODq1xuICAgIHdlaWdodDogbnVtYmVyOyAvLyDph43jgb9cbiAgICB0eXBlOiBDdWJpc21QaHlzaWNzU291cmNlOyAvLyDlh7rlipvjga7nqK7poZ5cbiAgICByZWZsZWN0OiBib29sZWFuOyAvLyDlgKTjgYzlj43ou6LjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYtcbiAgICB2YWx1ZUJlbG93TWluaW11bTogbnVtYmVyOyAvLyDmnIDlsI/lgKTjgpLkuIvlm57jgaPjgZ/mmYLjga7lgKRcbiAgICB2YWx1ZUV4Y2VlZGVkTWF4aW11bTogbnVtYmVyOyAvLyDmnIDlpKflgKTjgpLjgZPjgYjjgZ/mmYLjga7lgKRcbiAgICBnZXRWYWx1ZTogcGh5c2ljc1ZhbHVlR2V0dGVyOyAvLyDniannkIbmvJTnrpfjga7lgKTjga7lj5blvpfplqLmlbBcbiAgICBnZXRTY2FsZTogcGh5c2ljc1NjYWxlR2V0dGVyOyAvLyDniannkIbmvJTnrpfjga7jgrnjgrHjg7zjg6vlgKTjga7lj5blvpfplqLmlbBcbiAgfVxuXG4gIC8qKlxuICAgKiBAYnJpZWYg54mp55CG5ryU566X44Gu44OH44O844K/XG4gICAqXG4gICAqIOeJqeeQhua8lOeul+OBruODh+ODvOOCv+OAglxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbVBoeXNpY3NSaWcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5zZXR0aW5ncyA9IG5ldyBjc21WZWN0b3I8Q3ViaXNtUGh5c2ljc1N1YlJpZz4oKTtcbiAgICAgIHRoaXMuaW5wdXRzID0gbmV3IGNzbVZlY3RvcjxDdWJpc21QaHlzaWNzSW5wdXQ+KCk7XG4gICAgICB0aGlzLm91dHB1dHMgPSBuZXcgY3NtVmVjdG9yPEN1YmlzbVBoeXNpY3NPdXRwdXQ+KCk7XG4gICAgICB0aGlzLnBhcnRpY2xlcyA9IG5ldyBjc21WZWN0b3I8Q3ViaXNtUGh5c2ljc1BhcnRpY2xlPigpO1xuICAgICAgdGhpcy5ncmF2aXR5ID0gbmV3IEN1YmlzbVZlY3RvcjIoMCwgMCk7XG4gICAgICB0aGlzLndpbmQgPSBuZXcgQ3ViaXNtVmVjdG9yMigwLCAwKTtcbiAgICB9XG5cbiAgICBzdWJSaWdDb3VudDogbnVtYmVyOyAvLyDniannkIbmvJTnrpfjga7niannkIbngrnjga7lgIvmlbBcbiAgICBzZXR0aW5nczogY3NtVmVjdG9yPEN1YmlzbVBoeXNpY3NTdWJSaWc+OyAvLyDniannkIbmvJTnrpfjga7niannkIbngrnjga7nrqHnkIbjga7jg6rjgrnjg4hcbiAgICBpbnB1dHM6IGNzbVZlY3RvcjxDdWJpc21QaHlzaWNzSW5wdXQ+OyAvLyDniannkIbmvJTnrpfjga7lhaXlipvjga7jg6rjgrnjg4hcbiAgICBvdXRwdXRzOiBjc21WZWN0b3I8Q3ViaXNtUGh5c2ljc091dHB1dD47IC8vIOeJqeeQhua8lOeul+OBruWHuuWKm+OBruODquOCueODiFxuICAgIHBhcnRpY2xlczogY3NtVmVjdG9yPEN1YmlzbVBoeXNpY3NQYXJ0aWNsZT47IC8vIOeJqeeQhua8lOeul+OBrueJqeeQhueCueOBruODquOCueODiFxuICAgIGdyYXZpdHk6IEN1YmlzbVZlY3RvcjI7IC8vIOmHjeWKm1xuICAgIHdpbmQ6IEN1YmlzbVZlY3RvcjI7IC8vIOmiqFxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRoZSBMaXZlMkQgT3BlbiBTb2Z0d2FyZSBsaWNlbnNlXG4gKiB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5saXZlMmQuY29tL2V1bGEvbGl2ZTJkLW9wZW4tc29mdHdhcmUtbGljZW5zZS1hZ3JlZW1lbnRfZW4uaHRtbC5cbiAqL1xuXG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtanNvbiB9IGZyb20gJy4uL3V0aWxzL2N1YmlzbWpzb24nO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbXZlY3RvcjIgfSBmcm9tICcuLi9tYXRoL2N1YmlzbXZlY3RvcjInO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWlkIH0gZnJvbSAnLi4vaWQvY3ViaXNtaWQnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWZyYW1ld29yayB9IGZyb20gJy4uL2xpdmUyZGN1YmlzbWZyYW1ld29yayc7XG5pbXBvcnQgQ3ViaXNtRnJhbWV3b3JrID0gY3ViaXNtZnJhbWV3b3JrLkN1YmlzbUZyYW1ld29yaztcbmltcG9ydCBDdWJpc21JZEhhbmRsZSA9IGN1YmlzbWlkLkN1YmlzbUlkSGFuZGxlO1xuaW1wb3J0IEN1YmlzbVZlY3RvcjIgPSBjdWJpc212ZWN0b3IyLkN1YmlzbVZlY3RvcjI7XG5pbXBvcnQgQ3ViaXNtSnNvbiA9IGN1YmlzbWpzb24uQ3ViaXNtSnNvbjtcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICAvLyBKU09OIGtleXNcbiAgY29uc3QgUG9zaXRpb24gPSAnUG9zaXRpb24nO1xuICBjb25zdCBYID0gJ1gnO1xuICBjb25zdCBZID0gJ1knO1xuICBjb25zdCBBbmdsZSA9ICdBbmdsZSc7XG4gIGNvbnN0IFR5cGUgPSAnVHlwZSc7XG4gIGNvbnN0IElkID0gJ0lkJztcblxuICAvLyBNZXRhXG4gIGNvbnN0IE1ldGEgPSAnTWV0YSc7XG4gIGNvbnN0IEVmZmVjdGl2ZUZvcmNlcyA9ICdFZmZlY3RpdmVGb3JjZXMnO1xuICBjb25zdCBUb3RhbElucHV0Q291bnQgPSAnVG90YWxJbnB1dENvdW50JztcbiAgY29uc3QgVG90YWxPdXRwdXRDb3VudCA9ICdUb3RhbE91dHB1dENvdW50JztcbiAgY29uc3QgUGh5c2ljc1NldHRpbmdDb3VudCA9ICdQaHlzaWNzU2V0dGluZ0NvdW50JztcbiAgY29uc3QgR3Jhdml0eSA9ICdHcmF2aXR5JztcbiAgY29uc3QgV2luZCA9ICdXaW5kJztcbiAgY29uc3QgVmVydGV4Q291bnQgPSAnVmVydGV4Q291bnQnO1xuXG4gIC8vIFBoeXNpY3NTZXR0aW5nc1xuICBjb25zdCBQaHlzaWNzU2V0dGluZ3MgPSAnUGh5c2ljc1NldHRpbmdzJztcbiAgY29uc3QgTm9ybWFsaXphdGlvbiA9ICdOb3JtYWxpemF0aW9uJztcbiAgY29uc3QgTWluaW11bSA9ICdNaW5pbXVtJztcbiAgY29uc3QgTWF4aW11bSA9ICdNYXhpbXVtJztcbiAgY29uc3QgRGVmYXVsdCA9ICdEZWZhdWx0JztcbiAgY29uc3QgUmVmbGVjdCA9ICdSZWZsZWN0JztcbiAgY29uc3QgV2VpZ2h0ID0gJ1dlaWdodCc7XG5cbiAgLy8gSW5wdXRcbiAgY29uc3QgSW5wdXQgPSAnSW5wdXQnO1xuICBjb25zdCBTb3VyY2UgPSAnU291cmNlJztcblxuICAvLyBPdXRwdXRcbiAgY29uc3QgT3V0cHV0ID0gJ091dHB1dCc7XG4gIGNvbnN0IFNjYWxlID0gJ1NjYWxlJztcbiAgY29uc3QgVmVydGV4SW5kZXggPSAnVmVydGV4SW5kZXgnO1xuICBjb25zdCBEZXN0aW5hdGlvbiA9ICdEZXN0aW5hdGlvbic7XG5cbiAgLy8gUGFydGljbGVcbiAgY29uc3QgVmVydGljZXMgPSAnVmVydGljZXMnO1xuICBjb25zdCBNb2JpbGl0eSA9ICdNb2JpbGl0eSc7XG4gIGNvbnN0IERlbGF5ID0gJ0RlbGF5JztcbiAgY29uc3QgUmFkaXVzID0gJ1JhZGl1cyc7XG4gIGNvbnN0IEFjY2VsZXJhdGlvbiA9ICdBY2NlbGVyYXRpb24nO1xuXG4gIC8qKlxuICAgKiBwaHlzaWNzMy5qc29u44Gu44Kz44Oz44OG44OK44CCXG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtUGh5c2ljc0pzb24ge1xuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqIEBwYXJhbSBidWZmZXIgcGh5c2ljczMuanNvbuOBjOiqreOBv+i+vOOBvuOCjOOBpuOBhOOCi+ODkOODg+ODleOCoVxuICAgICAqIEBwYXJhbSBzaXplIOODkOODg+ODleOCoeOBruOCteOCpOOCulxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihidWZmZXI6IEFycmF5QnVmZmVyLCBzaXplOiBudW1iZXIpIHtcbiAgICAgIHRoaXMuX2pzb24gPSBDdWJpc21Kc29uLmNyZWF0ZShidWZmZXIsIHNpemUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODh+OCueODiOODqeOCr+OCv+ebuOW9k+OBruWHpueQhlxuICAgICAqL1xuICAgIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgICAgQ3ViaXNtSnNvbi5kZWxldGUodGhpcy5fanNvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6YeN5Yqb44Gu5Y+W5b6XXG4gICAgICogQHJldHVybiDph43liptcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0R3Jhdml0eSgpOiBDdWJpc21WZWN0b3IyIHtcbiAgICAgIGNvbnN0IHJldDogQ3ViaXNtVmVjdG9yMiA9IG5ldyBDdWJpc21WZWN0b3IyKDAsIDApO1xuICAgICAgcmV0LnggPSB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoTWV0YSlcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoRWZmZWN0aXZlRm9yY2VzKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhHcmF2aXR5KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhYKVxuICAgICAgICAudG9GbG9hdCgpO1xuICAgICAgcmV0LnkgPSB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoTWV0YSlcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoRWZmZWN0aXZlRm9yY2VzKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhHcmF2aXR5KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhZKVxuICAgICAgICAudG9GbG9hdCgpO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpoqjjga7lj5blvpdcbiAgICAgKiBAcmV0dXJuIOmiqFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRXaW5kKCk6IEN1YmlzbVZlY3RvcjIge1xuICAgICAgY29uc3QgcmV0OiBDdWJpc21WZWN0b3IyID0gbmV3IEN1YmlzbVZlY3RvcjIoMCwgMCk7XG4gICAgICByZXQueCA9IHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhNZXRhKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhFZmZlY3RpdmVGb3JjZXMpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFdpbmQpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFgpXG4gICAgICAgIC50b0Zsb2F0KCk7XG4gICAgICByZXQueSA9IHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhNZXRhKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhFZmZlY3RpdmVGb3JjZXMpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFdpbmQpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFkpXG4gICAgICAgIC50b0Zsb2F0KCk7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOeJqeeQhuW6l+OBrueuoeeQhuOBruWAi+aVsOOBruWPluW+l1xuICAgICAqIEByZXR1cm4g54mp55CG5bqX44Gu566h55CG44Gu5YCL5pWwXG4gICAgICovXG4gICAgcHVibGljIGdldFN1YlJpZ0NvdW50KCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvblxuICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKE1ldGEpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFBoeXNpY3NTZXR0aW5nQ291bnQpXG4gICAgICAgIC50b0ludCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWFpeWKm+OBrue3j+WQiOioiOOBruWPluW+l1xuICAgICAqIEByZXR1cm4g5YWl5Yqb44Gu57eP5ZCI6KiIXG4gICAgICovXG4gICAgcHVibGljIGdldFRvdGFsSW5wdXRDb3VudCgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhNZXRhKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhUb3RhbElucHV0Q291bnQpXG4gICAgICAgIC50b0ludCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWHuuWKm+OBrue3j+WQiOioiOOBruWPluW+l1xuICAgICAqIEByZXR1cm4g5Ye65Yqb44Gu57eP5ZCI6KiIXG4gICAgICovXG4gICAgcHVibGljIGdldFRvdGFsT3V0cHV0Q291bnQoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoTWV0YSlcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoVG90YWxPdXRwdXRDb3VudClcbiAgICAgICAgLnRvSW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog54mp55CG54K544Gu5YCL5pWw44Gu5Y+W5b6XXG4gICAgICogQHJldHVybiDniannkIbngrnjga7lgIvmlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmVydGV4Q291bnQoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoTWV0YSlcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoVmVydGV4Q291bnQpXG4gICAgICAgIC50b0ludCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOato+imj+WMluOBleOCjOOBn+S9jee9ruOBruacgOWwj+WApOOBruWPluW+l1xuICAgICAqIEBwYXJhbSBwaHlzaWNzU2V0dGluZ0luZGV4IOeJqeeQhua8lOeul+OBruioreWumuOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4g5q2j6KaP5YyW44GV44KM44Gf5L2N572u44Gu5pyA5bCP5YCkXG4gICAgICovXG4gICAgcHVibGljIGdldE5vcm1hbGl6YXRpb25Qb3NpdGlvbk1pbmltdW1WYWx1ZShcbiAgICAgIHBoeXNpY3NTZXR0aW5nSW5kZXg6IG51bWJlclxuICAgICk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvblxuICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFBoeXNpY3NTZXR0aW5ncylcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChwaHlzaWNzU2V0dGluZ0luZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhOb3JtYWxpemF0aW9uKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhQb3NpdGlvbilcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoTWluaW11bSlcbiAgICAgICAgLnRvRmxvYXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmraPopo/ljJbjgZXjgozjgZ/kvY3nva7jga7mnIDlpKflgKTjga7lj5blvpdcbiAgICAgKiBAcGFyYW0gcGh5c2ljc1NldHRpbmdJbmRleCDniannkIbmvJTnrpfjga7oqK3lrprjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIOato+imj+WMluOBleOCjOOBn+S9jee9ruOBruacgOWkp+WApFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROb3JtYWxpemF0aW9uUG9zaXRpb25NYXhpbXVtVmFsdWUoXG4gICAgICBwaHlzaWNzU2V0dGluZ0luZGV4OiBudW1iZXJcbiAgICApOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhQaHlzaWNzU2V0dGluZ3MpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgocGh5c2ljc1NldHRpbmdJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoTm9ybWFsaXphdGlvbilcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoUG9zaXRpb24pXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKE1heGltdW0pXG4gICAgICAgIC50b0Zsb2F0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5q2j6KaP5YyW44GV44KM44Gf5L2N572u44Gu44OH44OV44Kp44Or44OI5YCk44Gu5Y+W5b6XXG4gICAgICogQHBhcmFtIHBoeXNpY3NTZXR0aW5nSW5kZXgg54mp55CG5ryU566X44Gu6Kit5a6a44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiDmraPopo/ljJbjgZXjgozjgZ/kvY3nva7jga7jg4fjg5Xjgqnjg6vjg4jlgKRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Tm9ybWFsaXphdGlvblBvc2l0aW9uRGVmYXVsdFZhbHVlKFxuICAgICAgcGh5c2ljc1NldHRpbmdJbmRleDogbnVtYmVyXG4gICAgKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoUGh5c2ljc1NldHRpbmdzKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KHBoeXNpY3NTZXR0aW5nSW5kZXgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKE5vcm1hbGl6YXRpb24pXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFBvc2l0aW9uKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhEZWZhdWx0KVxuICAgICAgICAudG9GbG9hdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOato+imj+WMluOBleOCjOOBn+inkuW6puOBruacgOWwj+WApOOBruWPluW+l1xuICAgICAqIEBwYXJhbSBwaHlzaWNzU2V0dGluZ0luZGV4IOeJqeeQhua8lOeul+OBruioreWumuOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4g5q2j6KaP5YyW44GV44KM44Gf6KeS5bqm44Gu5pyA5bCP5YCkXG4gICAgICovXG4gICAgcHVibGljIGdldE5vcm1hbGl6YXRpb25BbmdsZU1pbmltdW1WYWx1ZShcbiAgICAgIHBoeXNpY3NTZXR0aW5nSW5kZXg6IG51bWJlclxuICAgICk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvblxuICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFBoeXNpY3NTZXR0aW5ncylcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChwaHlzaWNzU2V0dGluZ0luZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhOb3JtYWxpemF0aW9uKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhBbmdsZSlcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoTWluaW11bSlcbiAgICAgICAgLnRvRmxvYXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmraPopo/ljJbjgZXjgozjgZ/op5Lluqbjga7mnIDlpKflgKTjga7lj5blvpdcbiAgICAgKiBAcGFyYW0gcGh5c2ljc1NldHRpbmdJbmRleFxuICAgICAqIEByZXR1cm4g5q2j6KaP5YyW44GV44KM44Gf6KeS5bqm44Gu5pyA5aSn5YCkXG4gICAgICovXG4gICAgcHVibGljIGdldE5vcm1hbGl6YXRpb25BbmdsZU1heGltdW1WYWx1ZShcbiAgICAgIHBoeXNpY3NTZXR0aW5nSW5kZXg6IG51bWJlclxuICAgICk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvblxuICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFBoeXNpY3NTZXR0aW5ncylcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChwaHlzaWNzU2V0dGluZ0luZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhOb3JtYWxpemF0aW9uKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhBbmdsZSlcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoTWF4aW11bSlcbiAgICAgICAgLnRvRmxvYXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmraPopo/ljJbjgZXjgozjgZ/op5Lluqbjga7jg4fjg5Xjgqnjg6vjg4jlgKTjga7lj5blvpdcbiAgICAgKiBAcGFyYW0gcGh5c2ljc1NldHRpbmdJbmRleCDniannkIbmvJTnrpfjga7oqK3lrprjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIOato+imj+WMluOBleOCjOOBn+inkuW6puOBruODh+ODleOCqeODq+ODiOWApFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROb3JtYWxpemF0aW9uQW5nbGVEZWZhdWx0VmFsdWUoXG4gICAgICBwaHlzaWNzU2V0dGluZ0luZGV4OiBudW1iZXJcbiAgICApOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhQaHlzaWNzU2V0dGluZ3MpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgocGh5c2ljc1NldHRpbmdJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoTm9ybWFsaXphdGlvbilcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoQW5nbGUpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKERlZmF1bHQpXG4gICAgICAgIC50b0Zsb2F0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5YWl5Yqb44Gu5YCL5pWw44Gu5Y+W5b6XXG4gICAgICogQHBhcmFtIHBoeXNpY3NTZXR0aW5nSW5kZXgg54mp55CG5ryU566X44Gu6Kit5a6a44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiDlhaXlipvjga7lgIvmlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SW5wdXRDb3VudChwaHlzaWNzU2V0dGluZ0luZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhQaHlzaWNzU2V0dGluZ3MpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgocGh5c2ljc1NldHRpbmdJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoSW5wdXQpXG4gICAgICAgIC5nZXRWZWN0b3IoKVxuICAgICAgICAuZ2V0U2l6ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWFpeWKm+OBrumHjeOBv+OBruWPluW+l1xuICAgICAqIEBwYXJhbSBwaHlzaWNzU2V0dGluZ0luZGV4IOeJqeeQhua8lOeul+OBruioreWumuOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEBwYXJhbSBpbnB1dEluZGV4IOWFpeWKm+OBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4g5YWl5Yqb44Gu6YeN44G/XG4gICAgICovXG4gICAgcHVibGljIGdldElucHV0V2VpZ2h0KFxuICAgICAgcGh5c2ljc1NldHRpbmdJbmRleDogbnVtYmVyLFxuICAgICAgaW5wdXRJbmRleDogbnVtYmVyXG4gICAgKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoUGh5c2ljc1NldHRpbmdzKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KHBoeXNpY3NTZXR0aW5nSW5kZXgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKElucHV0KVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KGlucHV0SW5kZXgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFdlaWdodClcbiAgICAgICAgLnRvRmxvYXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlhaXlipvjga7lj43ou6Ljga7lj5blvpdcbiAgICAgKiBAcGFyYW0gcGh5c2ljc1NldHRpbmdJbmRleCDniannkIbmvJTnrpfjga7oqK3lrprjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcGFyYW0gaW5wdXRJbmRleCDlhaXlipvjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIOWFpeWKm+OBruWPjei7olxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJbnB1dFJlZmxlY3QoXG4gICAgICBwaHlzaWNzU2V0dGluZ0luZGV4OiBudW1iZXIsXG4gICAgICBpbnB1dEluZGV4OiBudW1iZXJcbiAgICApOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoUGh5c2ljc1NldHRpbmdzKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KHBoeXNpY3NTZXR0aW5nSW5kZXgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKElucHV0KVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KGlucHV0SW5kZXgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFJlZmxlY3QpXG4gICAgICAgIC50b0Jvb2xlYW4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlhaXlipvjga7nqK7poZ7jga7lj5blvpdcbiAgICAgKiBAcGFyYW0gcGh5c2ljc1NldHRpbmdJbmRleCDniannkIbmvJTnrpfjga7oqK3lrprjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcGFyYW0gaW5wdXRJbmRleCDlhaXlipvjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIOWFpeWKm+OBrueorumhnlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJbnB1dFR5cGUoXG4gICAgICBwaHlzaWNzU2V0dGluZ0luZGV4OiBudW1iZXIsXG4gICAgICBpbnB1dEluZGV4OiBudW1iZXJcbiAgICApOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhQaHlzaWNzU2V0dGluZ3MpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgocGh5c2ljc1NldHRpbmdJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoSW5wdXQpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgoaW5wdXRJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoVHlwZSlcbiAgICAgICAgLmdldFJhd1N0cmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWFpeWKm+WFg+OBrklE44Gu5Y+W5b6XXG4gICAgICogQHBhcmFtIHBoeXNpY3NTZXR0aW5nSW5kZXgg54mp55CG5ryU566X44Gu6Kit5a6a44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHBhcmFtIGlucHV0SW5kZXgg5YWl5Yqb44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiDlhaXlipvlhYPjga5JRFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJbnB1dFNvdXJjZUlkKFxuICAgICAgcGh5c2ljc1NldHRpbmdJbmRleDogbnVtYmVyLFxuICAgICAgaW5wdXRJbmRleDogbnVtYmVyXG4gICAgKTogQ3ViaXNtSWRIYW5kbGUge1xuICAgICAgcmV0dXJuIEN1YmlzbUZyYW1ld29yay5nZXRJZE1hbmFnZXIoKS5nZXRJZChcbiAgICAgICAgdGhpcy5fanNvblxuICAgICAgICAgIC5nZXRSb290KClcbiAgICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhQaHlzaWNzU2V0dGluZ3MpXG4gICAgICAgICAgLmdldFZhbHVlQnlJbmRleChwaHlzaWNzU2V0dGluZ0luZGV4KVxuICAgICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKElucHV0KVxuICAgICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgoaW5wdXRJbmRleClcbiAgICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhTb3VyY2UpXG4gICAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoSWQpXG4gICAgICAgICAgLmdldFJhd1N0cmluZygpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWHuuWKm+OBruWAi+aVsOOBruWPluW+l1xuICAgICAqIEBwYXJhbSBwaHlzaWNzU2V0dGluZ0luZGV4IOeJqeeQhua8lOeul+OBruioreWumuOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4g5Ye65Yqb44Gu5YCL5pWwXG4gICAgICovXG4gICAgcHVibGljIGdldE91dHB1dENvdW50KHBoeXNpY3NTZXR0aW5nSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvblxuICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFBoeXNpY3NTZXR0aW5ncylcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChwaHlzaWNzU2V0dGluZ0luZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhPdXRwdXQpXG4gICAgICAgIC5nZXRWZWN0b3IoKVxuICAgICAgICAuZ2V0U2l6ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWHuuWKm+OBrueJqeeQhueCueOBruOCpOODs+ODh+ODg+OCr+OCueOBruWPluW+l1xuICAgICAqIEBwYXJhbSBwaHlzaWNzU2V0dGluZ0luZGV4IOeJqeeQhua8lOeul+OBruioreWumuOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEBwYXJhbSBvdXRwdXRJbmRleCDlh7rlipvjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIOWHuuWKm+OBrueJqeeQhueCueOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRPdXRwdXRWZXJ0ZXhJbmRleChcbiAgICAgIHBoeXNpY3NTZXR0aW5nSW5kZXg6IG51bWJlcixcbiAgICAgIG91dHB1dEluZGV4OiBudW1iZXJcbiAgICApOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhQaHlzaWNzU2V0dGluZ3MpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgocGh5c2ljc1NldHRpbmdJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoT3V0cHV0KVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KG91dHB1dEluZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhWZXJ0ZXhJbmRleClcbiAgICAgICAgLnRvSW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Ye65Yqb44Gu6KeS5bqm44Gu44K544Kx44O844Or44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHBhcmFtIHBoeXNpY3NTZXR0aW5nSW5kZXgg54mp55CG5ryU566X44Gu6Kit5a6a44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHBhcmFtIG91dHB1dEluZGV4IOWHuuWKm+OBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4g5Ye65Yqb44Gu6KeS5bqm44Gu44K544Kx44O844OrXG4gICAgICovXG4gICAgcHVibGljIGdldE91dHB1dEFuZ2xlU2NhbGUoXG4gICAgICBwaHlzaWNzU2V0dGluZ0luZGV4OiBudW1iZXIsXG4gICAgICBvdXRwdXRJbmRleDogbnVtYmVyXG4gICAgKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoUGh5c2ljc1NldHRpbmdzKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KHBoeXNpY3NTZXR0aW5nSW5kZXgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKE91dHB1dClcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChvdXRwdXRJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoU2NhbGUpXG4gICAgICAgIC50b0Zsb2F0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Ye65Yqb44Gu6YeN44G/44Gu5Y+W5b6XXG4gICAgICogQHBhcmFtIHBoeXNpY3NTZXR0aW5nSW5kZXgg54mp55CG5ryU566X44Gu6Kit5a6a44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHBhcmFtIG91dHB1dEluZGV4IOWHuuWKm+OBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4g5Ye65Yqb44Gu6YeN44G/XG4gICAgICovXG4gICAgcHVibGljIGdldE91dHB1dFdlaWdodChcbiAgICAgIHBoeXNpY3NTZXR0aW5nSW5kZXg6IG51bWJlcixcbiAgICAgIG91dHB1dEluZGV4OiBudW1iZXJcbiAgICApOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhQaHlzaWNzU2V0dGluZ3MpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgocGh5c2ljc1NldHRpbmdJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoT3V0cHV0KVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KG91dHB1dEluZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhXZWlnaHQpXG4gICAgICAgIC50b0Zsb2F0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Ye65Yqb5YWI44GuSUTjga7lj5blvpdcbiAgICAgKiBAcGFyYW0gcGh5c2ljc1NldHRpbmdJbmRleCDniannkIbmvJTnrpfjga7oqK3lrprjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcGFyYW0gb3V0cHV0SW5kZXgg5Ye65Yqb44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiDlh7rlipvlhYjjga5JRFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRPdXRwdXREZXN0aW5hdGlvbklkKFxuICAgICAgcGh5c2ljc1NldHRpbmdJbmRleDogbnVtYmVyLFxuICAgICAgb3V0cHV0SW5kZXg6IG51bWJlclxuICAgICk6IEN1YmlzbUlkSGFuZGxlIHtcbiAgICAgIHJldHVybiBDdWJpc21GcmFtZXdvcmsuZ2V0SWRNYW5hZ2VyKCkuZ2V0SWQoXG4gICAgICAgIHRoaXMuX2pzb25cbiAgICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoUGh5c2ljc1NldHRpbmdzKVxuICAgICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgocGh5c2ljc1NldHRpbmdJbmRleClcbiAgICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhPdXRwdXQpXG4gICAgICAgICAgLmdldFZhbHVlQnlJbmRleChvdXRwdXRJbmRleClcbiAgICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhEZXN0aW5hdGlvbilcbiAgICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhJZClcbiAgICAgICAgICAuZ2V0UmF3U3RyaW5nKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Ye65Yqb44Gu56iu6aGe44Gu5Y+W5b6XXG4gICAgICogQHBhcmFtIHBoeXNpY3NTZXR0aW5nSW5kZXgg54mp55CG5ryU566X44Gu6Kit5a6a44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHBhcmFtIG91dHB1dEluZGV4IOWHuuWKm+OBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4g5Ye65Yqb44Gu56iu6aGeXG4gICAgICovXG4gICAgcHVibGljIGdldE91dHB1dFR5cGUoXG4gICAgICBwaHlzaWNzU2V0dGluZ0luZGV4OiBudW1iZXIsXG4gICAgICBvdXRwdXRJbmRleDogbnVtYmVyXG4gICAgKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoUGh5c2ljc1NldHRpbmdzKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KHBoeXNpY3NTZXR0aW5nSW5kZXgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKE91dHB1dClcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChvdXRwdXRJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoVHlwZSlcbiAgICAgICAgLmdldFJhd1N0cmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWHuuWKm+OBruWPjei7ouOBruWPluW+l1xuICAgICAqIEBwYXJhbSBwaHlzaWNzU2V0dGluZ0luZGV4IOeJqeeQhua8lOeul+OBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEBwYXJhbSBvdXRwdXRJbmRleCDlh7rlipvjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIOWHuuWKm+OBruWPjei7olxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRPdXRwdXRSZWZsZWN0KFxuICAgICAgcGh5c2ljc1NldHRpbmdJbmRleDogbnVtYmVyLFxuICAgICAgb3V0cHV0SW5kZXg6IG51bWJlclxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhQaHlzaWNzU2V0dGluZ3MpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgocGh5c2ljc1NldHRpbmdJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoT3V0cHV0KVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KG91dHB1dEluZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhSZWZsZWN0KVxuICAgICAgICAudG9Cb29sZWFuKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog54mp55CG54K544Gu5YCL5pWw44Gu5Y+W5b6XXG4gICAgICogQHBhcmFtIHBoeXNpY3NTZXR0aW5nSW5kZXgg54mp55CG5ryU566X55S36Kit5a6a44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiDniannkIbngrnjga7lgIvmlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGFydGljbGVDb3VudChwaHlzaWNzU2V0dGluZ0luZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhQaHlzaWNzU2V0dGluZ3MpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgocGh5c2ljc1NldHRpbmdJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoVmVydGljZXMpXG4gICAgICAgIC5nZXRWZWN0b3IoKVxuICAgICAgICAuZ2V0U2l6ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOeJqeeQhueCueOBruWLleOBjeOChOOBmeOBleOBruWPluW+l1xuICAgICAqIEBwYXJhbSBwaHlzaWNzU2V0dGluZ0luZGV4IOeJqeeQhua8lOeul+OBruioreWumuOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEBwYXJhbSB2ZXJ0ZXhJbmRleCDniannkIbngrnjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIOeJqeeQhueCueOBruWLleOBjeOChOOBmeOBlVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYXJ0aWNsZU1vYmlsaXR5KFxuICAgICAgcGh5c2ljc1NldHRpbmdJbmRleDogbnVtYmVyLFxuICAgICAgdmVydGV4SW5kZXg6IG51bWJlclxuICAgICk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvblxuICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFBoeXNpY3NTZXR0aW5ncylcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChwaHlzaWNzU2V0dGluZ0luZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhWZXJ0aWNlcylcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleCh2ZXJ0ZXhJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoTW9iaWxpdHkpXG4gICAgICAgIC50b0Zsb2F0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog54mp55CG54K544Gu6YGF44KM44Gu5Y+W5b6XXG4gICAgICogQHBhcmFtIHBoeXNpY3NTZXR0aW5nSW5kZXgg54mp55CG5ryU566X44Gu6Kit5a6a44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHBhcmFtIHZlcnRleEluZGV4IOeJqeeQhueCueOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4g54mp55CG54K544Gu6YGF44KMXG4gICAgICovXG4gICAgcHVibGljIGdldFBhcnRpY2xlRGVsYXkoXG4gICAgICBwaHlzaWNzU2V0dGluZ0luZGV4OiBudW1iZXIsXG4gICAgICB2ZXJ0ZXhJbmRleDogbnVtYmVyXG4gICAgKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoUGh5c2ljc1NldHRpbmdzKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KHBoeXNpY3NTZXR0aW5nSW5kZXgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFZlcnRpY2VzKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KHZlcnRleEluZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhEZWxheSlcbiAgICAgICAgLnRvRmxvYXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDniannkIbngrnjga7liqDpgJ/luqbjga7lj5blvpdcbiAgICAgKiBAcGFyYW0gcGh5c2ljc1NldHRpbmdJbmRleCDniannkIbmvJTnrpfjga7oqK3lrppcbiAgICAgKiBAcGFyYW0gdmVydGV4SW5kZXgg54mp55CG54K544Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHJldHVybiDniannkIbngrnjga7liqDpgJ/luqZcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGFydGljbGVBY2NlbGVyYXRpb24oXG4gICAgICBwaHlzaWNzU2V0dGluZ0luZGV4OiBudW1iZXIsXG4gICAgICB2ZXJ0ZXhJbmRleDogbnVtYmVyXG4gICAgKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoUGh5c2ljc1NldHRpbmdzKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KHBoeXNpY3NTZXR0aW5nSW5kZXgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFZlcnRpY2VzKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KHZlcnRleEluZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhBY2NlbGVyYXRpb24pXG4gICAgICAgIC50b0Zsb2F0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog54mp55CG54K544Gu6Led6Zui44Gu5Y+W5b6XXG4gICAgICogQHBhcmFtIHBoeXNpY3NTZXR0aW5nSW5kZXgg54mp55CG5ryU566X44Gu6Kit5a6a44Gu44Kk44Oz44OH44OD44Kv44K5XG4gICAgICogQHBhcmFtIHZlcnRleEluZGV4IOeJqeeQhueCueOBruOCpOODs+ODh+ODg+OCr+OCuVxuICAgICAqIEByZXR1cm4g54mp55CG54K544Gu6Led6ZuiXG4gICAgICovXG4gICAgcHVibGljIGdldFBhcnRpY2xlUmFkaXVzKFxuICAgICAgcGh5c2ljc1NldHRpbmdJbmRleDogbnVtYmVyLFxuICAgICAgdmVydGV4SW5kZXg6IG51bWJlclxuICAgICk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvblxuICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFBoeXNpY3NTZXR0aW5ncylcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChwaHlzaWNzU2V0dGluZ0luZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhWZXJ0aWNlcylcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleCh2ZXJ0ZXhJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoUmFkaXVzKVxuICAgICAgICAudG9JbnQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDniannkIbngrnjga7kvY3nva7jga7lj5blvpdcbiAgICAgKiBAcGFyYW0gcGh5c2ljc1NldHRpbmdJbmRleCDniannkIbmvJTnrpfjga7oqK3lrprjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcGFyYW0gdmVydGV4SW5kZSDniannkIbngrnjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKiBAcmV0dXJuIOeJqeeQhueCueOBruS9jee9rlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYXJ0aWNsZVBvc2l0aW9uKFxuICAgICAgcGh5c2ljc1NldHRpbmdJbmRleDogbnVtYmVyLFxuICAgICAgdmVydGV4SW5kZXg6IG51bWJlclxuICAgICk6IEN1YmlzbVZlY3RvcjIge1xuICAgICAgY29uc3QgcmV0OiBDdWJpc21WZWN0b3IyID0gbmV3IEN1YmlzbVZlY3RvcjIoMCwgMCk7XG4gICAgICByZXQueCA9IHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhQaHlzaWNzU2V0dGluZ3MpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgocGh5c2ljc1NldHRpbmdJbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoVmVydGljZXMpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgodmVydGV4SW5kZXgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFBvc2l0aW9uKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhYKVxuICAgICAgICAudG9GbG9hdCgpO1xuICAgICAgcmV0LnkgPSB0aGlzLl9qc29uXG4gICAgICAgIC5nZXRSb290KClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoUGh5c2ljc1NldHRpbmdzKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KHBoeXNpY3NTZXR0aW5nSW5kZXgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFZlcnRpY2VzKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KHZlcnRleEluZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhQb3NpdGlvbilcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoWSlcbiAgICAgICAgLnRvRmxvYXQoKTtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgX2pzb246IEN1YmlzbUpzb247IC8vIHBoeXNpY3MzLmpzb27jg4fjg7zjgr9cbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQoYykgTGl2ZTJEIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0aGUgTGl2ZTJEIE9wZW4gU29mdHdhcmUgbGljZW5zZVxuICogdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly93d3cubGl2ZTJkLmNvbS9ldWxhL2xpdmUyZC1vcGVuLXNvZnR3YXJlLWxpY2Vuc2UtYWdyZWVtZW50X2VuLmh0bWwuXG4gKi9cblxuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWZyYW1ld29yayB9IGZyb20gJy4uL2xpdmUyZGN1YmlzbWZyYW1ld29yayc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3NtcmVjdCB9IGZyb20gJy4uL3R5cGUvY3NtcmVjdGYnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbXJlbmRlcmVyIH0gZnJvbSAnLi9jdWJpc21yZW5kZXJlcic7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtbW9kZWwgfSBmcm9tICcuLi9tb2RlbC9jdWJpc21tb2RlbCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3Vic2ltbWF0cml4NDQgfSBmcm9tICcuLi9tYXRoL2N1YmlzbW1hdHJpeDQ0JztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjc21tYXAgfSBmcm9tICcuLi90eXBlL2NzbW1hcCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3NtdmVjdG9yIH0gZnJvbSAnLi4vdHlwZS9jc212ZWN0b3InO1xuaW1wb3J0IHsgQ3ViaXNtTG9nRXJyb3IgfSBmcm9tICcuLi91dGlscy9jdWJpc21kZWJ1Zyc7XG5pbXBvcnQgQ29uc3RhbnQgPSBjdWJpc21mcmFtZXdvcmsuQ29uc3RhbnQ7XG5pbXBvcnQgQ3ViaXNtTWF0cml4NDQgPSBjdWJzaW1tYXRyaXg0NC5DdWJpc21NYXRyaXg0NDtcbmltcG9ydCBjc21SZWN0ID0gY3NtcmVjdC5jc21SZWN0O1xuaW1wb3J0IGNzbU1hcCA9IGNzbW1hcC5jc21NYXA7XG5pbXBvcnQgY3NtVmVjdG9yID0gY3NtdmVjdG9yLmNzbVZlY3RvcjtcbmltcG9ydCBDdWJpc21Nb2RlbCA9IGN1YmlzbW1vZGVsLkN1YmlzbU1vZGVsO1xuaW1wb3J0IEN1YmlzbVJlbmRlcmVyID0gY3ViaXNtcmVuZGVyZXIuQ3ViaXNtUmVuZGVyZXI7XG5pbXBvcnQgQ3ViaXNtQmxlbmRNb2RlID0gY3ViaXNtcmVuZGVyZXIuQ3ViaXNtQmxlbmRNb2RlO1xuaW1wb3J0IEN1YmlzbVRleHR1cmVDb2xvciA9IGN1YmlzbXJlbmRlcmVyLkN1YmlzbVRleHR1cmVDb2xvcjtcblxuZXhwb3J0IG5hbWVzcGFjZSBMaXZlMkRDdWJpc21GcmFtZXdvcmsge1xuICBjb25zdCBDb2xvckNoYW5uZWxDb3VudCA9IDQ7IC8vIOWun+mok+aZguOBqzHjg4Hjg6Pjg7Pjg43jg6vjga7loLTlkIjjga8x44CBUkdC44Gg44GR44Gu5aC05ZCI44GvM+OAgeOCouODq+ODleOCoeOCguWQq+OCgeOCi+WgtOWQiOOBrzRcblxuICBjb25zdCBzaGFkZXJDb3VudCA9IDEwOyAvLyDjgrfjgqfjg7zjg4Djg7zjga7mlbAgPSDjg57jgrnjgq/nlJ/miJDnlKggKyAo6YCa5bi455SoICsg5Yqg566XICsg5LmX566XKSAqICjjg57jgrnjgq/nhKHjga7kuZfnrpfmuIjjgqLjg6vjg5XjgqHlr77lv5zniYggKyDjg57jgrnjgq/mnInjga7kuZfnrpfmuIjjgqLjg6vjg5XjgqHlr77lv5zniYggKyDjg57jgrnjgq/mnInlj43ou6Ljga7kuZfnrpfmuIjjgqLjg6vjg5XjgqHlr77lv5zniYgpXG4gIGxldCBzX2luc3RhbmNlOiBDdWJpc21TaGFkZXJfV2ViR0w7XG4gIGxldCBzX3ZpZXdwb3J0OiBudW1iZXJbXTtcbiAgbGV0IHNfZmJvOiBXZWJHTEZyYW1lYnVmZmVyO1xuXG4gIC8qKlxuICAgKiDjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jga7lh6bnkIbjgpLlrp/ooYzjgZnjgovjgq/jg6njgrlcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBDdWJpc21DbGlwcGluZ01hbmFnZXJfV2ViR0wge1xuICAgIC8qKlxuICAgICAqIOOCq+ODqeODvOODgeODo+ODs+ODjeODq++8iFJHQkHvvInjga7jg5Xjg6njgrDjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcGFyYW0gY2hhbm5lbE5vIOOCq+ODqeODvOODgeODo+ODs+ODjeODq++8iFJHQkHvvInjga7nlarlj7fvvIgwOlIsIDE6RywgMjpCLCAzOkHvvIlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2hhbm5lbEZsYWdBc0NvbG9yKGNoYW5uZWxObzogbnVtYmVyKTogQ3ViaXNtVGV4dHVyZUNvbG9yIHtcbiAgICAgIHJldHVybiB0aGlzLl9jaGFubmVsQ29sb3JzLmF0KGNoYW5uZWxObyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OG44Oz44Od44Op44Oq44Gu44Os44Oz44OA44O844OG44Kv44K544OB44Oj44Gu44Ki44OJ44Os44K544KS5Y+W5b6X44GZ44KLXG4gICAgICogRnJhbWVCdWZmZXJPYmplY3TjgYzlrZjlnKjjgZfjgarjgYTloLTlkIjjgIHmlrDjgZfjgY/nlJ/miJDjgZnjgotcbiAgICAgKlxuICAgICAqIEByZXR1cm4g44Os44Oz44OA44O844OG44Kv44K544OB44Oj44Gu44Ki44OJ44Os44K5XG4gICAgICovXG4gICAgcHVibGljIGdldE1hc2tSZW5kZXJUZXh0dXJlKCk6IFdlYkdMRnJhbWVidWZmZXIge1xuICAgICAgbGV0IHJldDogV2ViR0xGcmFtZWJ1ZmZlciA9IDA7XG5cbiAgICAgIC8vIOODhuODs+ODneODqeODquOBrlJlbmRlclRleHR1cmXjgpLlj5blvpfjgZnjgotcbiAgICAgIGlmICh0aGlzLl9tYXNrVGV4dHVyZSAmJiB0aGlzLl9tYXNrVGV4dHVyZS50ZXh0dXJlICE9IDApIHtcbiAgICAgICAgLy8g5YmN5Zue5L2/44Gj44Gf44KC44Gu44KS6L+U44GZXG4gICAgICAgIHRoaXMuX21hc2tUZXh0dXJlLmZyYW1lTm8gPSB0aGlzLl9jdXJyZW50RnJhbWVObztcbiAgICAgICAgcmV0ID0gdGhpcy5fbWFza1RleHR1cmUudGV4dHVyZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJldCA9PSAwKSB7XG4gICAgICAgIC8vIEZyYW1lQnVmZmVyT2JqZWN044GM5a2Y5Zyo44GX44Gq44GE5aC05ZCI44CB5paw44GX44GP55Sf5oiQ44GZ44KLXG5cbiAgICAgICAgLy8g44Kv44Oq44OD44OU44Oz44Kw44OQ44OD44OV44Kh44K144Kk44K644KS5Y+W5b6XXG4gICAgICAgIGNvbnN0IHNpemU6IG51bWJlciA9IHRoaXMuX2NsaXBwaW5nTWFza0J1ZmZlclNpemU7XG5cbiAgICAgICAgdGhpcy5fY29sb3JCdWZmZXIgPSB0aGlzLmdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgdGhpcy5nbC5iaW5kVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRoaXMuX2NvbG9yQnVmZmVyKTtcbiAgICAgICAgdGhpcy5nbC50ZXhJbWFnZTJEKFxuICAgICAgICAgIHRoaXMuZ2wuVEVYVFVSRV8yRCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIHRoaXMuZ2wuUkdCQSxcbiAgICAgICAgICBzaXplLFxuICAgICAgICAgIHNpemUsXG4gICAgICAgICAgMCxcbiAgICAgICAgICB0aGlzLmdsLlJHQkEsXG4gICAgICAgICAgdGhpcy5nbC5VTlNJR05FRF9CWVRFLFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5nbC50ZXhQYXJhbWV0ZXJpKFxuICAgICAgICAgIHRoaXMuZ2wuVEVYVFVSRV8yRCxcbiAgICAgICAgICB0aGlzLmdsLlRFWFRVUkVfV1JBUF9TLFxuICAgICAgICAgIHRoaXMuZ2wuQ0xBTVBfVE9fRURHRVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmdsLnRleFBhcmFtZXRlcmkoXG4gICAgICAgICAgdGhpcy5nbC5URVhUVVJFXzJELFxuICAgICAgICAgIHRoaXMuZ2wuVEVYVFVSRV9XUkFQX1QsXG4gICAgICAgICAgdGhpcy5nbC5DTEFNUF9UT19FREdFXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZ2wudGV4UGFyYW1ldGVyaShcbiAgICAgICAgICB0aGlzLmdsLlRFWFRVUkVfMkQsXG4gICAgICAgICAgdGhpcy5nbC5URVhUVVJFX01JTl9GSUxURVIsXG4gICAgICAgICAgdGhpcy5nbC5MSU5FQVJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5nbC50ZXhQYXJhbWV0ZXJpKFxuICAgICAgICAgIHRoaXMuZ2wuVEVYVFVSRV8yRCxcbiAgICAgICAgICB0aGlzLmdsLlRFWFRVUkVfTUFHX0ZJTFRFUixcbiAgICAgICAgICB0aGlzLmdsLkxJTkVBUlxuICAgICAgICApO1xuICAgICAgICB0aGlzLmdsLmJpbmRUZXh0dXJlKHRoaXMuZ2wuVEVYVFVSRV8yRCwgbnVsbCk7XG5cbiAgICAgICAgcmV0ID0gdGhpcy5nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmdsLmJpbmRGcmFtZWJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCByZXQpO1xuICAgICAgICB0aGlzLmdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFxuICAgICAgICAgIHRoaXMuZ2wuRlJBTUVCVUZGRVIsXG4gICAgICAgICAgdGhpcy5nbC5DT0xPUl9BVFRBQ0hNRU5UMCxcbiAgICAgICAgICB0aGlzLmdsLlRFWFRVUkVfMkQsXG4gICAgICAgICAgdGhpcy5fY29sb3JCdWZmZXIsXG4gICAgICAgICAgMFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmdsLmJpbmRGcmFtZWJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCBzX2Zibyk7XG5cbiAgICAgICAgdGhpcy5fbWFza1RleHR1cmUgPSBuZXcgQ3ViaXNtUmVuZGVyVGV4dHVyZVJlc291cmNlKFxuICAgICAgICAgIHRoaXMuX2N1cnJlbnRGcmFtZU5vLFxuICAgICAgICAgIHJldFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdlYkdM44Os44Oz44OA44Oq44Oz44Kw44Kz44Oz44OG44Kt44K544OI44KS6Kit5a6a44GZ44KLXG4gICAgICogQHBhcmFtIGdsIFdlYkdM44Os44Oz44OA44Oq44Oz44Kw44Kz44Oz44OG44Kt44K544OIXG4gICAgICovXG4gICAgcHVibGljIHNldEdMKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpOiB2b2lkIHtcbiAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg57jgrnjgq/jgZXjgozjgovmj4/nlLvjgqrjg5bjgrjjgqfjgq/jg4jnvqTlhajkvZPjgpLlm7LjgoDnn6nlvaLvvIjjg6Ljg4fjg6vluqfmqJnns7vvvInjgpLoqIjnrpfjgZnjgotcbiAgICAgKiBAcGFyYW0gbW9kZWwg44Oi44OH44Or44Gu44Kk44Oz44K544K/44Oz44K5XG4gICAgICogQHBhcmFtIGNsaXBwaW5nQ29udGV4dCDjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jga7jgrPjg7Pjg4bjgq3jgrnjg4hcbiAgICAgKi9cbiAgICBwdWJsaWMgY2FsY0NsaXBwZWREcmF3VG90YWxCb3VuZHMoXG4gICAgICBtb2RlbDogQ3ViaXNtTW9kZWwsXG4gICAgICBjbGlwcGluZ0NvbnRleHQ6IEN1YmlzbUNsaXBwaW5nQ29udGV4dFxuICAgICk6IHZvaWQge1xuICAgICAgLy8g6KKr44Kv44Oq44OD44OU44Oz44Kw44Oe44K544Kv77yI44Oe44K544Kv44GV44KM44KL5o+P55S744Kq44OW44K444Kn44Kv44OI77yJ44Gu5YWo5L2T44Gu55+p5b2iXG4gICAgICBsZXQgY2xpcHBlZERyYXdUb3RhbE1pblg6IG51bWJlciA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICBsZXQgY2xpcHBlZERyYXdUb3RhbE1pblk6IG51bWJlciA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICBsZXQgY2xpcHBlZERyYXdUb3RhbE1heFg6IG51bWJlciA9IE51bWJlci5NSU5fVkFMVUU7XG4gICAgICBsZXQgY2xpcHBlZERyYXdUb3RhbE1heFk6IG51bWJlciA9IE51bWJlci5NSU5fVkFMVUU7XG5cbiAgICAgIC8vIOOBk+OBruODnuOCueOCr+OBjOWun+mam+OBq+W/heimgeOBi+WIpOWumuOBmeOCi1xuICAgICAgLy8g44GT44Gu44Kv44Oq44OD44OU44Oz44Kw44KS5Yip55So44GZ44KL44CM5o+P55S744Kq44OW44K444Kn44Kv44OI44CN44GM44Gy44Go44Gk44Gn44KC5L2/55So5Y+v6IO944Gn44GC44KM44Gw44Oe44K544Kv44KS55Sf5oiQ44GZ44KL5b+F6KaB44GM44GC44KLXG4gICAgICBjb25zdCBjbGlwcGVkRHJhd0NvdW50OiBudW1iZXIgPVxuICAgICAgICBjbGlwcGluZ0NvbnRleHQuX2NsaXBwZWREcmF3YWJsZUluZGV4TGlzdC5sZW5ndGg7XG5cbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBjbGlwcGVkRHJhd2FibGVJbmRleCA9IDA7XG4gICAgICAgIGNsaXBwZWREcmF3YWJsZUluZGV4IDwgY2xpcHBlZERyYXdDb3VudDtcbiAgICAgICAgY2xpcHBlZERyYXdhYmxlSW5kZXgrK1xuICAgICAgKSB7XG4gICAgICAgIC8vIOODnuOCueOCr+OCkuS9v+eUqOOBmeOCi+aPj+eUu+OCquODluOCuOOCp+OCr+ODiOOBruaPj+eUu+OBleOCjOOCi+efqeW9ouOCkuaxguOCgeOCi1xuICAgICAgICBjb25zdCBkcmF3YWJsZUluZGV4OiBudW1iZXIgPVxuICAgICAgICAgIGNsaXBwaW5nQ29udGV4dC5fY2xpcHBlZERyYXdhYmxlSW5kZXhMaXN0W2NsaXBwZWREcmF3YWJsZUluZGV4XTtcblxuICAgICAgICBjb25zdCBkcmF3YWJsZVZlcnRleENvdW50OiBudW1iZXIgPSBtb2RlbC5nZXREcmF3YWJsZVZlcnRleENvdW50KFxuICAgICAgICAgIGRyYXdhYmxlSW5kZXhcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZHJhd2FibGVWZXJ0ZXhlczogRmxvYXQzMkFycmF5ID0gbW9kZWwuZ2V0RHJhd2FibGVWZXJ0aWNlcyhcbiAgICAgICAgICBkcmF3YWJsZUluZGV4XG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IG1pblg6IG51bWJlciA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICAgIGxldCBtaW5ZOiBudW1iZXIgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICBsZXQgbWF4WDogbnVtYmVyID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgICAgICAgbGV0IG1heFk6IG51bWJlciA9IE51bWJlci5NSU5fVkFMVUU7XG5cbiAgICAgICAgY29uc3QgbG9vcDogbnVtYmVyID0gZHJhd2FibGVWZXJ0ZXhDb3VudCAqIENvbnN0YW50LnZlcnRleFN0ZXA7XG4gICAgICAgIGZvciAoXG4gICAgICAgICAgbGV0IHBpOiBudW1iZXIgPSBDb25zdGFudC52ZXJ0ZXhPZmZzZXQ7XG4gICAgICAgICAgcGkgPCBsb29wO1xuICAgICAgICAgIHBpICs9IENvbnN0YW50LnZlcnRleFN0ZXBcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgeDogbnVtYmVyID0gZHJhd2FibGVWZXJ0ZXhlc1twaV07XG4gICAgICAgICAgY29uc3QgeTogbnVtYmVyID0gZHJhd2FibGVWZXJ0ZXhlc1twaSArIDFdO1xuXG4gICAgICAgICAgaWYgKHggPCBtaW5YKSB7XG4gICAgICAgICAgICBtaW5YID0geDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHggPiBtYXhYKSB7XG4gICAgICAgICAgICBtYXhYID0geDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHkgPCBtaW5ZKSB7XG4gICAgICAgICAgICBtaW5ZID0geTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHkgPiBtYXhZKSB7XG4gICAgICAgICAgICBtYXhZID0geTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDmnInlirnjgarngrnjgYzkuIDjgaTjgoLlj5bjgozjgarjgYvjgaPjgZ/jga7jgafjgrnjgq3jg4Pjg5dcbiAgICAgICAgaWYgKG1pblggPT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g5YWo5L2T44Gu55+p5b2i44Gr5Y+N5pigXG4gICAgICAgIGlmIChtaW5YIDwgY2xpcHBlZERyYXdUb3RhbE1pblgpIHtcbiAgICAgICAgICBjbGlwcGVkRHJhd1RvdGFsTWluWCA9IG1pblg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pblkgPCBjbGlwcGVkRHJhd1RvdGFsTWluWSkge1xuICAgICAgICAgIGNsaXBwZWREcmF3VG90YWxNaW5ZID0gbWluWTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4WCA+IGNsaXBwZWREcmF3VG90YWxNYXhYKSB7XG4gICAgICAgICAgY2xpcHBlZERyYXdUb3RhbE1heFggPSBtYXhYO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXhZID4gY2xpcHBlZERyYXdUb3RhbE1heFkpIHtcbiAgICAgICAgICBjbGlwcGVkRHJhd1RvdGFsTWF4WSA9IG1heFk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2xpcHBlZERyYXdUb3RhbE1pblggPT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgIGNsaXBwaW5nQ29udGV4dC5fYWxsQ2xpcHBlZERyYXdSZWN0LnggPSAwLjA7XG4gICAgICAgICAgY2xpcHBpbmdDb250ZXh0Ll9hbGxDbGlwcGVkRHJhd1JlY3QueSA9IDAuMDtcbiAgICAgICAgICBjbGlwcGluZ0NvbnRleHQuX2FsbENsaXBwZWREcmF3UmVjdC53aWR0aCA9IDAuMDtcbiAgICAgICAgICBjbGlwcGluZ0NvbnRleHQuX2FsbENsaXBwZWREcmF3UmVjdC5oZWlnaHQgPSAwLjA7XG4gICAgICAgICAgY2xpcHBpbmdDb250ZXh0Ll9pc1VzaW5nID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xpcHBpbmdDb250ZXh0Ll9pc1VzaW5nID0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCB3OiBudW1iZXIgPSBjbGlwcGVkRHJhd1RvdGFsTWF4WCAtIGNsaXBwZWREcmF3VG90YWxNaW5YO1xuICAgICAgICAgIGNvbnN0IGg6IG51bWJlciA9IGNsaXBwZWREcmF3VG90YWxNYXhZIC0gY2xpcHBlZERyYXdUb3RhbE1pblk7XG4gICAgICAgICAgY2xpcHBpbmdDb250ZXh0Ll9hbGxDbGlwcGVkRHJhd1JlY3QueCA9IGNsaXBwZWREcmF3VG90YWxNaW5YO1xuICAgICAgICAgIGNsaXBwaW5nQ29udGV4dC5fYWxsQ2xpcHBlZERyYXdSZWN0LnkgPSBjbGlwcGVkRHJhd1RvdGFsTWluWTtcbiAgICAgICAgICBjbGlwcGluZ0NvbnRleHQuX2FsbENsaXBwZWREcmF3UmVjdC53aWR0aCA9IHc7XG4gICAgICAgICAgY2xpcHBpbmdDb250ZXh0Ll9hbGxDbGlwcGVkRHJhd1JlY3QuaGVpZ2h0ID0gaDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuX21hc2tSZW5kZXJUZXh0dXJlID0gbnVsbDtcbiAgICAgIHRoaXMuX2NvbG9yQnVmZmVyID0gbnVsbDtcbiAgICAgIHRoaXMuX2N1cnJlbnRGcmFtZU5vID0gMDtcbiAgICAgIHRoaXMuX2NsaXBwaW5nTWFza0J1ZmZlclNpemUgPSAyNTY7XG4gICAgICB0aGlzLl9jbGlwcGluZ0NvbnRleHRMaXN0Rm9yTWFzayA9IG5ldyBjc21WZWN0b3I8Q3ViaXNtQ2xpcHBpbmdDb250ZXh0PigpO1xuICAgICAgdGhpcy5fY2xpcHBpbmdDb250ZXh0TGlzdEZvckRyYXcgPSBuZXcgY3NtVmVjdG9yPEN1YmlzbUNsaXBwaW5nQ29udGV4dD4oKTtcbiAgICAgIHRoaXMuX2NoYW5uZWxDb2xvcnMgPSBuZXcgY3NtVmVjdG9yPEN1YmlzbVRleHR1cmVDb2xvcj4oKTtcbiAgICAgIHRoaXMuX3RtcEJvdW5kc09uTW9kZWwgPSBuZXcgY3NtUmVjdCgpO1xuICAgICAgdGhpcy5fdG1wTWF0cml4ID0gbmV3IEN1YmlzbU1hdHJpeDQ0KCk7XG4gICAgICB0aGlzLl90bXBNYXRyaXhGb3JNYXNrID0gbmV3IEN1YmlzbU1hdHJpeDQ0KCk7XG4gICAgICB0aGlzLl90bXBNYXRyaXhGb3JEcmF3ID0gbmV3IEN1YmlzbU1hdHJpeDQ0KCk7XG4gICAgICB0aGlzLl9tYXNrVGV4dHVyZSA9IG51bGw7XG5cbiAgICAgIGxldCB0bXA6IEN1YmlzbVRleHR1cmVDb2xvciA9IG5ldyBDdWJpc21UZXh0dXJlQ29sb3IoKTtcbiAgICAgIHRtcC5SID0gMS4wO1xuICAgICAgdG1wLkcgPSAwLjA7XG4gICAgICB0bXAuQiA9IDAuMDtcbiAgICAgIHRtcC5BID0gMC4wO1xuICAgICAgdGhpcy5fY2hhbm5lbENvbG9ycy5wdXNoQmFjayh0bXApO1xuXG4gICAgICB0bXAgPSBuZXcgQ3ViaXNtVGV4dHVyZUNvbG9yKCk7XG4gICAgICB0bXAuUiA9IDAuMDtcbiAgICAgIHRtcC5HID0gMS4wO1xuICAgICAgdG1wLkIgPSAwLjA7XG4gICAgICB0bXAuQSA9IDAuMDtcbiAgICAgIHRoaXMuX2NoYW5uZWxDb2xvcnMucHVzaEJhY2sodG1wKTtcblxuICAgICAgdG1wID0gbmV3IEN1YmlzbVRleHR1cmVDb2xvcigpO1xuICAgICAgdG1wLlIgPSAwLjA7XG4gICAgICB0bXAuRyA9IDAuMDtcbiAgICAgIHRtcC5CID0gMS4wO1xuICAgICAgdG1wLkEgPSAwLjA7XG4gICAgICB0aGlzLl9jaGFubmVsQ29sb3JzLnB1c2hCYWNrKHRtcCk7XG5cbiAgICAgIHRtcCA9IG5ldyBDdWJpc21UZXh0dXJlQ29sb3IoKTtcbiAgICAgIHRtcC5SID0gMC4wO1xuICAgICAgdG1wLkcgPSAwLjA7XG4gICAgICB0bXAuQiA9IDAuMDtcbiAgICAgIHRtcC5BID0gMS4wO1xuICAgICAgdGhpcy5fY2hhbm5lbENvbG9ycy5wdXNoQmFjayh0bXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODh+OCueODiOODqeOCr+OCv+ebuOW9k+OBruWHpueQhlxuICAgICAqL1xuICAgIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jbGlwcGluZ0NvbnRleHRMaXN0Rm9yTWFzay5nZXRTaXplKCk7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5fY2xpcHBpbmdDb250ZXh0TGlzdEZvck1hc2suYXQoaSkpIHtcbiAgICAgICAgICB0aGlzLl9jbGlwcGluZ0NvbnRleHRMaXN0Rm9yTWFzay5hdChpKS5yZWxlYXNlKCk7XG4gICAgICAgICAgdGhpcy5fY2xpcHBpbmdDb250ZXh0TGlzdEZvck1hc2suc2V0KGksIHZvaWQgMCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2xpcHBpbmdDb250ZXh0TGlzdEZvck1hc2suc2V0KGksIG51bGwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2xpcHBpbmdDb250ZXh0TGlzdEZvck1hc2sgPSBudWxsO1xuXG4gICAgICAvLyBfY2xpcHBpbmdDb250ZXh0TGlzdEZvckRyYXfjga9fY2xpcHBpbmdDb250ZXh0TGlzdEZvck1hc2vjgavjgYLjgovjgqTjg7Pjgrnjgr/jg7PjgrnjgpLmjIfjgZfjgabjgYTjgovjgILkuIroqJjjga7lh6bnkIbjgavjgojjgoropoHntKDjgZTjgajjga5ERUxFVEXjga/kuI3opoHjgIJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY2xpcHBpbmdDb250ZXh0TGlzdEZvckRyYXcuZ2V0U2l6ZSgpOyBpKyspIHtcbiAgICAgICAgdGhpcy5fY2xpcHBpbmdDb250ZXh0TGlzdEZvckRyYXcuc2V0KGksIG51bGwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2xpcHBpbmdDb250ZXh0TGlzdEZvckRyYXcgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5fbWFza1RleHR1cmUpIHtcbiAgICAgICAgdGhpcy5nbC5kZWxldGVGcmFtZWJ1ZmZlcih0aGlzLl9tYXNrVGV4dHVyZS50ZXh0dXJlKTtcbiAgICAgICAgdGhpcy5fbWFza1RleHR1cmUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2NoYW5uZWxDb2xvcnMuZ2V0U2l6ZSgpOyBpKyspIHtcbiAgICAgICAgdGhpcy5fY2hhbm5lbENvbG9ycy5zZXQoaSwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NoYW5uZWxDb2xvcnMgPSBudWxsO1xuXG4gICAgICAvLyDjg4bjgq/jgrnjg4Hjg6Pop6PmlL5cbiAgICAgIHRoaXMuZ2wuZGVsZXRlVGV4dHVyZSh0aGlzLl9jb2xvckJ1ZmZlcik7XG4gICAgICB0aGlzLl9jb2xvckJ1ZmZlciA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oe44ON44O844K444Oj44Gu5Yid5pyf5YyW5Yem55CGXG4gICAgICog44Kv44Oq44OD44OU44Oz44Kw44Oe44K544Kv44KS5L2/44GG5o+P55S744Kq44OW44K444Kn44Kv44OI44Gu55m76Yyy44KS6KGM44GGXG4gICAgICogQHBhcmFtIG1vZGVsIOODouODh+ODq+OBruOCpOODs+OCueOCv+ODs+OCuVxuICAgICAqIEBwYXJhbSBkcmF3YWJsZUNvdW50IOaPj+eUu+OCquODluOCuOOCp+OCr+ODiOOBruaVsFxuICAgICAqIEBwYXJhbSBkcmF3YWJsZU1hc2tzIOaPj+eUu+OCquODluOCuOOCp+OCr+ODiOOCkuODnuOCueOCr+OBmeOCi+aPj+eUu+OCquODluOCuOOCp+OCr+ODiOOBruOCpOODs+ODh+ODg+OCr+OCueOBruODquOCueODiFxuICAgICAqIEBwYXJhbSBkcmF3YWJsZUNvdW50cyDmj4/nlLvjgqrjg5bjgrjjgqfjgq/jg4jjgpLjg57jgrnjgq/jgZnjgovmj4/nlLvjgqrjg5bjgrjjgqfjgq/jg4jjga7mlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdGlhbGl6ZShcbiAgICAgIG1vZGVsOiBDdWJpc21Nb2RlbCxcbiAgICAgIGRyYXdhYmxlQ291bnQ6IG51bWJlcixcbiAgICAgIGRyYXdhYmxlTWFza3M6IEludDMyQXJyYXlbXSxcbiAgICAgIGRyYXdhYmxlTWFza0NvdW50czogSW50MzJBcnJheVxuICAgICk6IHZvaWQge1xuICAgICAgLy8g44Kv44Oq44OD44OU44Oz44Kw44Oe44K544Kv44KS5L2/44GG5o+P55S744Kq44OW44K444Kn44Kv44OI44KS44GZ44G544Gm55m76Yyy44GZ44KLXG4gICAgICAvLyDjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jga/jgIHpgJrluLjmlbDlgIvnqIvluqbjgavpmZDlrprjgZfjgabkvb/jgYbjgoLjga7jgajjgZnjgotcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZHJhd2FibGVDb3VudDsgaSsrKSB7XG4gICAgICAgIGlmIChkcmF3YWJsZU1hc2tDb3VudHNbaV0gPD0gMCkge1xuICAgICAgICAgIC8vIOOCr+ODquODg+ODlOODs+OCsOODnuOCueOCr+OBjOS9v+eUqOOBleOCjOOBpuOBhOOBquOBhOOCouODvOODiOODoeODg+OCt+ODpe+8iOWkmuOBj+OBruWgtOWQiOS9v+eUqOOBl+OBquOBhO+8iVxuICAgICAgICAgIHRoaXMuX2NsaXBwaW5nQ29udGV4dExpc3RGb3JEcmF3LnB1c2hCYWNrKG51bGwpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g5pei44Gr44GC44KLQ2xpcENvbnRleHTjgajlkIzjgZjjgYvjg4Hjgqfjg4Pjgq/jgZnjgotcbiAgICAgICAgbGV0IGNsaXBwaW5nQ29udGV4dDogQ3ViaXNtQ2xpcHBpbmdDb250ZXh0ID0gdGhpcy5maW5kU2FtZUNsaXAoXG4gICAgICAgICAgZHJhd2FibGVNYXNrc1tpXSxcbiAgICAgICAgICBkcmF3YWJsZU1hc2tDb3VudHNbaV1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGNsaXBwaW5nQ29udGV4dCA9PSBudWxsKSB7XG4gICAgICAgICAgLy8g5ZCM5LiA44Gu44Oe44K544Kv44GM5a2Y5Zyo44GX44Gm44GE44Gq44GE5aC05ZCI44Gv55Sf5oiQ44GZ44KLXG4gICAgICAgICAgY2xpcHBpbmdDb250ZXh0ID0gbmV3IEN1YmlzbUNsaXBwaW5nQ29udGV4dChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBkcmF3YWJsZU1hc2tzW2ldLFxuICAgICAgICAgICAgZHJhd2FibGVNYXNrQ291bnRzW2ldXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9jbGlwcGluZ0NvbnRleHRMaXN0Rm9yTWFzay5wdXNoQmFjayhjbGlwcGluZ0NvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xpcHBpbmdDb250ZXh0LmFkZENsaXBwZWREcmF3YWJsZShpKTtcblxuICAgICAgICB0aGlzLl9jbGlwcGluZ0NvbnRleHRMaXN0Rm9yRHJhdy5wdXNoQmFjayhjbGlwcGluZ0NvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCr+ODquODg+ODlOODs+OCsOOCs+ODs+ODhuOCreOCueODiOOCkuS9nOaIkOOBmeOCi+OAguODouODh+ODq+aPj+eUu+aZguOBq+Wun+ihjOOBmeOCi+OAglxuICAgICAqIEBwYXJhbSBtb2RlbCDjg6Ljg4fjg6vjga7jgqTjg7Pjgrnjgr/jg7PjgrlcbiAgICAgKiBAcGFyYW0gcmVuZGVyZXIg44Os44Oz44OA44Op44Gu44Kk44Oz44K544K/44Oz44K5XG4gICAgICovXG4gICAgcHVibGljIHNldHVwQ2xpcHBpbmdDb250ZXh0KFxuICAgICAgbW9kZWw6IEN1YmlzbU1vZGVsLFxuICAgICAgcmVuZGVyZXI6IEN1YmlzbVJlbmRlcmVyX1dlYkdMXG4gICAgKTogdm9pZCB7XG4gICAgICB0aGlzLl9jdXJyZW50RnJhbWVObysrO1xuXG4gICAgICAvLyDlhajjgabjga7jgq/jg6rjg4Pjg5Tjg7PjgrDjgpLnlKjmhI/jgZnjgotcbiAgICAgIC8vIOWQjOOBmOOCr+ODquODg+ODl++8iOikh+aVsOOBruWgtOWQiOOBr+OBvuOBqOOCgeOBpuS4gOOBpOOBruOCr+ODquODg+ODl++8ieOCkuS9v+OBhuWgtOWQiOOBrzHluqbjgaDjgZHoqK3lrprjgZnjgotcbiAgICAgIGxldCB1c2luZ0NsaXBDb3VudCA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgY2xpcEluZGV4ID0gMDtcbiAgICAgICAgY2xpcEluZGV4IDwgdGhpcy5fY2xpcHBpbmdDb250ZXh0TGlzdEZvck1hc2suZ2V0U2l6ZSgpO1xuICAgICAgICBjbGlwSW5kZXgrK1xuICAgICAgKSB7XG4gICAgICAgIC8vIDHjgaTjga7jgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jgavplqLjgZfjgaZcbiAgICAgICAgY29uc3QgY2M6IEN1YmlzbUNsaXBwaW5nQ29udGV4dCA9IHRoaXMuX2NsaXBwaW5nQ29udGV4dExpc3RGb3JNYXNrLmF0KFxuICAgICAgICAgIGNsaXBJbmRleFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIOOBk+OBruOCr+ODquODg+ODl+OCkuWIqeeUqOOBmeOCi+aPj+eUu+OCquODluOCuOOCp+OCr+ODiOe+pOWFqOS9k+OCkuWbsuOCgOefqeW9ouOCkuioiOeul1xuICAgICAgICB0aGlzLmNhbGNDbGlwcGVkRHJhd1RvdGFsQm91bmRzKG1vZGVsLCBjYyk7XG5cbiAgICAgICAgaWYgKGNjLl9pc1VzaW5nKSB7XG4gICAgICAgICAgdXNpbmdDbGlwQ291bnQrKzsgLy8g5L2/55So5Lit44Go44GX44Gm44Kr44Km44Oz44OIXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g44Oe44K544Kv5L2c5oiQ5Yem55CGXG4gICAgICBpZiAodXNpbmdDbGlwQ291bnQgPiAwKSB7XG4gICAgICAgIC8vIOeUn+aIkOOBl+OBn0ZyYW1lQnVmZmVy44Go5ZCM44GY44K144Kk44K644Gn44OT44Ol44O844Od44O844OI44KS6Kit5a6aXG4gICAgICAgIHRoaXMuZ2wudmlld3BvcnQoXG4gICAgICAgICAgMCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIHRoaXMuX2NsaXBwaW5nTWFza0J1ZmZlclNpemUsXG4gICAgICAgICAgdGhpcy5fY2xpcHBpbmdNYXNrQnVmZmVyU2l6ZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIOODnuOCueOCr+OCkmFjdGl2ZeOBq+OBmeOCi1xuICAgICAgICB0aGlzLl9tYXNrUmVuZGVyVGV4dHVyZSA9IHRoaXMuZ2V0TWFza1JlbmRlclRleHR1cmUoKTtcblxuICAgICAgICAvLyDjg6Ljg4fjg6vmj4/nlLvmmYLjgatEcmF3TWVzaE5vd+OBq+a4oeOBleOCjOOCi+WkieaPmyjjg6Ljg4fjg6t0b+ODr+ODvOODq+ODieW6p+aomeWkieaPmylcbiAgICAgICAgY29uc3QgbW9kZWxUb1dvcmxkRjogQ3ViaXNtTWF0cml4NDQgPSByZW5kZXJlci5nZXRNdnBNYXRyaXgoKTtcblxuICAgICAgICByZW5kZXJlci5wcmVEcmF3KCk7IC8vIOODkOODg+ODleOCoeOCkuOCr+ODquOCouOBmeOCi1xuXG4gICAgICAgIC8vIOWQhOODnuOCueOCr+OBruODrOOCpOOCouOCpuODiOOCkuaxuuWumuOBl+OBpuOBhOOBj1xuICAgICAgICB0aGlzLnNldHVwTGF5b3V0Qm91bmRzKHVzaW5nQ2xpcENvdW50KTtcblxuICAgICAgICAvLyAtLS0tLS0tLS0tIOODnuOCueOCr+aPj+eUu+WHpueQhiAtLS0tLS0tLS0tXG4gICAgICAgIC8vIOODnuOCueOCr+eUqFJlbmRlclRleHR1cmXjgpJhY3RpdmXjgavjgrvjg4Pjg4hcbiAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgdGhpcy5fbWFza1JlbmRlclRleHR1cmUpO1xuXG4gICAgICAgIC8vIOODnuOCueOCr+OCkuOCr+ODquOCouOBmeOCi1xuICAgICAgICAvLyAo5Luu5LuV5qeYKSAx44GM54Sh5Yq577yI5o+P44GL44KM44Gq44GE77yJ6aCY5Z+f44CBMOOBjOacieWKue+8iOaPj+OBi+OCjOOCi++8iemgmOWfn+OAgu+8iOOCt+OCp+ODvOODgOODvENkKkNz44GnMOOBq+i/keOBhOWApOOCkuOBi+OBkeOBpuODnuOCueOCr+OCkuS9nOOCi+OAgjHjgpLjgYvjgZHjgovjgajkvZXjgoLotbfjgZPjgonjgarjgYTvvIlcbiAgICAgICAgdGhpcy5nbC5jbGVhckNvbG9yKDEuMCwgMS4wLCAxLjAsIDEuMCk7XG4gICAgICAgIHRoaXMuZ2wuY2xlYXIodGhpcy5nbC5DT0xPUl9CVUZGRVJfQklUKTtcblxuICAgICAgICAvLyDlrp/pmpvjgavjg57jgrnjgq/jgpLnlJ/miJDjgZnjgotcbiAgICAgICAgLy8g5YWo44Gm44Gu44Oe44K544Kv44KS44Gp44Gu44KI44GG44Gr44Os44Kk44Ki44Km44OI44GX44Gm5o+P44GP44GL44KS5rG65a6a44GX44CBQ2xpcENvbnRleHQsIENsaXBwZWREcmF3Q29udGV4dOOBq+iomOaGtuOBmeOCi1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIGxldCBjbGlwSW5kZXggPSAwO1xuICAgICAgICAgIGNsaXBJbmRleCA8IHRoaXMuX2NsaXBwaW5nQ29udGV4dExpc3RGb3JNYXNrLmdldFNpemUoKTtcbiAgICAgICAgICBjbGlwSW5kZXgrK1xuICAgICAgICApIHtcbiAgICAgICAgICAvLyAtLS0g5a6f6Zqb44GrMeOBpOOBruODnuOCueOCr+OCkuaPj+OBjyAtLS1cbiAgICAgICAgICBjb25zdCBjbGlwQ29udGV4dDogQ3ViaXNtQ2xpcHBpbmdDb250ZXh0ID0gdGhpcy5fY2xpcHBpbmdDb250ZXh0TGlzdEZvck1hc2suYXQoXG4gICAgICAgICAgICBjbGlwSW5kZXhcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGFsbENsaXBlZERyYXdSZWN0OiBjc21SZWN0ID0gY2xpcENvbnRleHQuX2FsbENsaXBwZWREcmF3UmVjdDsgLy8g44GT44Gu44Oe44K544Kv44KS5L2/44GG44CB44GZ44G544Gm44Gu5o+P55S744Kq44OW44K444Kn44Kv44OI44Gu6KuW55CG5bqn5qiZ5LiK44Gu5Zuy44G/55+p5b2iXG4gICAgICAgICAgY29uc3QgbGF5b3V0Qm91bmRzT25UZXgwMTogY3NtUmVjdCA9IGNsaXBDb250ZXh0Ll9sYXlvdXRCb3VuZHM7IC8vIOOBk+OBruS4reOBq+ODnuOCueOCr+OCkuWPjuOCgeOCi1xuXG4gICAgICAgICAgLy8g44Oi44OH44Or5bqn5qiZ5LiK44Gu55+p5b2i44KS44CB6YGp5a6c44Oe44O844K444Oz44KS5LuY44GR44Gm5L2/44GGXG4gICAgICAgICAgY29uc3QgTUFSR0lOID0gMC4wNTtcbiAgICAgICAgICB0aGlzLl90bXBCb3VuZHNPbk1vZGVsLnNldFJlY3QoYWxsQ2xpcGVkRHJhd1JlY3QpO1xuICAgICAgICAgIHRoaXMuX3RtcEJvdW5kc09uTW9kZWwuZXhwYW5kKFxuICAgICAgICAgICAgYWxsQ2xpcGVkRHJhd1JlY3Qud2lkdGggKiBNQVJHSU4sXG4gICAgICAgICAgICBhbGxDbGlwZWREcmF3UmVjdC5oZWlnaHQgKiBNQVJHSU5cbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIyMjIyMjIyMjIyDmnKzmnaXjga/libLjgorlvZPjgabjgonjgozjgZ/poJjln5/jga7lhajkvZPjgpLkvb/jgo/jgZrlv4XopoHmnIDkvY7pmZDjga7jgrXjgqTjgrrjgYzjgojjgYRcblxuICAgICAgICAgIC8vIOOCt+OCp+ODvOODgOeUqOOBruioiOeul+W8j+OCkuaxguOCgeOCi+OAguWbnui7ouOCkuiAg+aFruOBl+OBquOBhOWgtOWQiOOBr+S7peS4i+OBruOBqOOBiuOCilxuICAgICAgICAgIC8vIG1vdmVQZXJpb2QnID0gbW92ZVBlcmlvZCAqIHNjYWxlWCArIG9mZlhcdFx0ICBbWyBtb3ZlUGVyaW9kJyA9IChtb3ZlUGVyaW9kIC0gdG1wQm91bmRzT25Nb2RlbC5tb3ZlUGVyaW9kKSpzY2FsZSArIGxheW91dEJvdW5kc09uVGV4MDEubW92ZVBlcmlvZCBdXVxuICAgICAgICAgIGNvbnN0IHNjYWxlWDogbnVtYmVyID1cbiAgICAgICAgICAgIGxheW91dEJvdW5kc09uVGV4MDEud2lkdGggLyB0aGlzLl90bXBCb3VuZHNPbk1vZGVsLndpZHRoO1xuICAgICAgICAgIGNvbnN0IHNjYWxlWTogbnVtYmVyID1cbiAgICAgICAgICAgIGxheW91dEJvdW5kc09uVGV4MDEuaGVpZ2h0IC8gdGhpcy5fdG1wQm91bmRzT25Nb2RlbC5oZWlnaHQ7XG5cbiAgICAgICAgICAvLyDjg57jgrnjgq/nlJ/miJDmmYLjgavkvb/jgYbooYzliJfjgpLmsYLjgoHjgotcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyDjgrfjgqfjg7zjg4DjgavmuKHjgZnooYzliJfjgpLmsYLjgoHjgosgPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8IOimgeacgOmBqeWMlu+8iOmAhumghuOBq+ioiOeul+OBmeOCjOOBsOOCt+ODs+ODl+ODq+OBq+OBp+OBjeOCi++8iVxuICAgICAgICAgICAgdGhpcy5fdG1wTWF0cml4LmxvYWRJZGVudGl0eSgpO1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBsYXlvdXQwLi4xIOOCkiAtMS4uMeOBq+WkieaPm1xuICAgICAgICAgICAgICB0aGlzLl90bXBNYXRyaXgudHJhbnNsYXRlUmVsYXRpdmUoLTEuMCwgLTEuMCk7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcE1hdHJpeC5zY2FsZVJlbGF0aXZlKDIuMCwgMi4wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gdmlldyB0byBsYXlvdXQwLi4xXG4gICAgICAgICAgICAgIHRoaXMuX3RtcE1hdHJpeC50cmFuc2xhdGVSZWxhdGl2ZShcbiAgICAgICAgICAgICAgICBsYXlvdXRCb3VuZHNPblRleDAxLngsXG4gICAgICAgICAgICAgICAgbGF5b3V0Qm91bmRzT25UZXgwMS55XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHRoaXMuX3RtcE1hdHJpeC5zY2FsZVJlbGF0aXZlKHNjYWxlWCwgc2NhbGVZKTsgLy8gbmV3ID0gW3RyYW5zbGF0ZV1bc2NhbGVdXG4gICAgICAgICAgICAgIHRoaXMuX3RtcE1hdHJpeC50cmFuc2xhdGVSZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAtdGhpcy5fdG1wQm91bmRzT25Nb2RlbC54LFxuICAgICAgICAgICAgICAgIC10aGlzLl90bXBCb3VuZHNPbk1vZGVsLnlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy8gbmV3ID0gW3RyYW5zbGF0ZV1bc2NhbGVdW3RyYW5zbGF0ZV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRtcE1hdHJpeEZvck1hc2vjgYzoqIjnrpfntZDmnpxcbiAgICAgICAgICAgIHRoaXMuX3RtcE1hdHJpeEZvck1hc2suc2V0TWF0cml4KHRoaXMuX3RtcE1hdHJpeC5nZXRBcnJheSgpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLy0tLS0tLS0tLSBkcmF35pmC44GuIG1hc2sg5Y+C54Wn55So6KGM5YiX44KS6KiI566XXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8g44K344Kn44O844OA44Gr5rih44GZ6KGM5YiX44KS5rGC44KB44KLIDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PCDopoHmnIDpganljJbvvIjpgIbpoIbjgavoqIjnrpfjgZnjgozjgbDjgrfjg7Pjg5fjg6vjgavjgafjgY3jgovvvIlcbiAgICAgICAgICAgIHRoaXMuX3RtcE1hdHJpeC5sb2FkSWRlbnRpdHkoKTtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhpcy5fdG1wTWF0cml4LnRyYW5zbGF0ZVJlbGF0aXZlKFxuICAgICAgICAgICAgICAgIGxheW91dEJvdW5kc09uVGV4MDEueCxcbiAgICAgICAgICAgICAgICBsYXlvdXRCb3VuZHNPblRleDAxLnlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgdGhpcy5fdG1wTWF0cml4LnNjYWxlUmVsYXRpdmUoc2NhbGVYLCBzY2FsZVkpOyAvLyBuZXcgPSBbdHJhbnNsYXRlXVtzY2FsZV1cbiAgICAgICAgICAgICAgdGhpcy5fdG1wTWF0cml4LnRyYW5zbGF0ZVJlbGF0aXZlKFxuICAgICAgICAgICAgICAgIC10aGlzLl90bXBCb3VuZHNPbk1vZGVsLngsXG4gICAgICAgICAgICAgICAgLXRoaXMuX3RtcEJvdW5kc09uTW9kZWwueVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBuZXcgPSBbdHJhbnNsYXRlXVtzY2FsZV1bdHJhbnNsYXRlXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdG1wTWF0cml4Rm9yRHJhdy5zZXRNYXRyaXgodGhpcy5fdG1wTWF0cml4LmdldEFycmF5KCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjbGlwQ29udGV4dC5fbWF0cml4Rm9yTWFzay5zZXRNYXRyaXgoXG4gICAgICAgICAgICB0aGlzLl90bXBNYXRyaXhGb3JNYXNrLmdldEFycmF5KClcbiAgICAgICAgICApO1xuICAgICAgICAgIGNsaXBDb250ZXh0Ll9tYXRyaXhGb3JEcmF3LnNldE1hdHJpeChcbiAgICAgICAgICAgIHRoaXMuX3RtcE1hdHJpeEZvckRyYXcuZ2V0QXJyYXkoKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBjbGlwRHJhd0NvdW50OiBudW1iZXIgPSBjbGlwQ29udGV4dC5fY2xpcHBpbmdJZENvdW50O1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xpcERyYXdDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjbGlwRHJhd0luZGV4OiBudW1iZXIgPSBjbGlwQ29udGV4dC5fY2xpcHBpbmdJZExpc3RbaV07XG5cbiAgICAgICAgICAgIC8vIOmggueCueaDheWgseOBjOabtOaWsOOBleOCjOOBpuOBiuOCieOBmuOAgeS/oemgvOaAp+OBjOOBquOBhOWgtOWQiOOBr+aPj+eUu+OCkuODkeOCueOBmeOCi1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhbW9kZWwuZ2V0RHJhd2FibGVEeW5hbWljRmxhZ1ZlcnRleFBvc2l0aW9uc0RpZENoYW5nZShcbiAgICAgICAgICAgICAgICBjbGlwRHJhd0luZGV4XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVuZGVyZXIuc2V0SXNDdWxsaW5nKFxuICAgICAgICAgICAgICBtb2RlbC5nZXREcmF3YWJsZUN1bGxpbmcoY2xpcERyYXdJbmRleCkgIT0gZmFsc2VcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIOS7iuWbnuWwgueUqOOBruWkieaPm+OCkumBqeeUqOOBl+OBpuaPj+OBj1xuICAgICAgICAgICAgLy8g44OB44Oj44Oz44ON44Or44KC5YiH44KK5pu/44GI44KL5b+F6KaB44GM44GC44KLKEEsUixHLEIpXG4gICAgICAgICAgICByZW5kZXJlci5zZXRDbGlwcGluZ0NvbnRleHRCdWZmZXJGb3JNYXNrKGNsaXBDb250ZXh0KTtcbiAgICAgICAgICAgIHJlbmRlcmVyLmRyYXdNZXNoKFxuICAgICAgICAgICAgICBtb2RlbC5nZXREcmF3YWJsZVRleHR1cmVJbmRpY2VzKGNsaXBEcmF3SW5kZXgpLFxuICAgICAgICAgICAgICBtb2RlbC5nZXREcmF3YWJsZVZlcnRleEluZGV4Q291bnQoY2xpcERyYXdJbmRleCksXG4gICAgICAgICAgICAgIG1vZGVsLmdldERyYXdhYmxlVmVydGV4Q291bnQoY2xpcERyYXdJbmRleCksXG4gICAgICAgICAgICAgIG1vZGVsLmdldERyYXdhYmxlVmVydGV4SW5kaWNlcyhjbGlwRHJhd0luZGV4KSxcbiAgICAgICAgICAgICAgbW9kZWwuZ2V0RHJhd2FibGVWZXJ0aWNlcyhjbGlwRHJhd0luZGV4KSxcbiAgICAgICAgICAgICAgbW9kZWwuZ2V0RHJhd2FibGVWZXJ0ZXhVdnMoY2xpcERyYXdJbmRleCksXG4gICAgICAgICAgICAgIG1vZGVsLmdldERyYXdhYmxlT3BhY2l0eShjbGlwRHJhd0luZGV4KSxcbiAgICAgICAgICAgICAgQ3ViaXNtQmxlbmRNb2RlLkN1YmlzbUJsZW5kTW9kZV9Ob3JtYWwsIC8vIOOCr+ODquODg+ODlOODs+OCsOOBr+mAmuW4uOaPj+eUu+OCkuW8t+WItlxuICAgICAgICAgICAgICBmYWxzZSAvLyDjg57jgrnjgq/nlJ/miJDmmYLjga/jgq/jg6rjg4Pjg5Tjg7PjgrDjga7lj43ou6Lkvb/nlKjjga/lhajjgY/plqLkv4LjgYzjgarjgYRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gLS0tIOW+jOWHpueQhiAtLS1cbiAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgc19mYm8pOyAvLyDmj4/nlLvlr77osaHjgpLmiLvjgZlcbiAgICAgICAgcmVuZGVyZXIuc2V0Q2xpcHBpbmdDb250ZXh0QnVmZmVyRm9yTWFzayhudWxsKTtcblxuICAgICAgICB0aGlzLmdsLnZpZXdwb3J0KFxuICAgICAgICAgIHNfdmlld3BvcnRbMF0sXG4gICAgICAgICAgc192aWV3cG9ydFsxXSxcbiAgICAgICAgICBzX3ZpZXdwb3J0WzJdLFxuICAgICAgICAgIHNfdmlld3BvcnRbM11cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDml6Ljgavjg57jgrnjgq/jgpLkvZzjgaPjgabjgYTjgovjgYvjgpLnorroqo1cbiAgICAgKiDkvZzjgaPjgabjgYTjgovmp5jjgafjgYLjgozjgbDoqbLlvZPjgZnjgovjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jga7jgqTjg7Pjgrnjgr/jg7PjgrnjgpLov5TjgZlcbiAgICAgKiDkvZzjgaPjgabjgYTjgarjgZHjgozjgbBOVUxM44KS6L+U44GZXG4gICAgICogQHBhcmFtIGRyYXdhYmxlTWFza3Mg5o+P55S744Kq44OW44K444Kn44Kv44OI44KS44Oe44K544Kv44GZ44KL5o+P55S744Kq44OW44K444Kn44Kv44OI44Gu44Oq44K544OIXG4gICAgICogQHBhcmFtIGRyYXdhYmxlTWFza0NvdW50cyDmj4/nlLvjgqrjg5bjgrjjgqfjgq/jg4jjgpLjg57jgrnjgq/jgZnjgovmj4/nlLvjgqrjg5bjgrjjgqfjgq/jg4jjga7mlbBcbiAgICAgKiBAcmV0dXJuIOipsuW9k+OBmeOCi+OCr+ODquODg+ODlOODs+OCsOODnuOCueOCr+OBjOWtmOWcqOOBmeOCjOOBsOOCpOODs+OCueOCv+ODs+OCueOCkui/lOOBl+OAgeOBquOBkeOCjOOBsE5VTEzjgpLov5TjgZlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmluZFNhbWVDbGlwKFxuICAgICAgZHJhd2FibGVNYXNrczogSW50MzJBcnJheSxcbiAgICAgIGRyYXdhYmxlTWFza0NvdW50czogbnVtYmVyXG4gICAgKTogQ3ViaXNtQ2xpcHBpbmdDb250ZXh0IHtcbiAgICAgIC8vIOS9nOaIkOa4iOOBv0NsaXBwaW5nQ29udGV4dOOBqOS4gOiHtOOBmeOCi+OBi+eiuuiqjVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jbGlwcGluZ0NvbnRleHRMaXN0Rm9yTWFzay5nZXRTaXplKCk7IGkrKykge1xuICAgICAgICBjb25zdCBjbGlwcGluZ0NvbnRleHQ6IEN1YmlzbUNsaXBwaW5nQ29udGV4dCA9IHRoaXMuX2NsaXBwaW5nQ29udGV4dExpc3RGb3JNYXNrLmF0KFxuICAgICAgICAgIGlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY291bnQ6IG51bWJlciA9IGNsaXBwaW5nQ29udGV4dC5fY2xpcHBpbmdJZENvdW50O1xuXG4gICAgICAgIC8vIOWAi+aVsOOBjOmBleOBhuWgtOWQiOOBr+WIpeeJqVxuICAgICAgICBpZiAoY291bnQgIT0gZHJhd2FibGVNYXNrQ291bnRzKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2FtZUNvdW50ID0gMDtcblxuICAgICAgICAvLyDlkIzjgZhJROOCkuaMgeOBpOOBi+eiuuiqjeOAgumFjeWIl+OBruaVsOOBjOWQjOOBmOOBquOBruOBp+OAgeS4gOiHtOOBl+OBn+WAi+aVsOOBjOWQjOOBmOOBquOCieWQjOOBmOeJqeOCkuaMgeOBpOOBqOOBmeOCi1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvdW50OyBqKyspIHtcbiAgICAgICAgICBjb25zdCBjbGlwSWQ6IG51bWJlciA9IGNsaXBwaW5nQ29udGV4dC5fY2xpcHBpbmdJZExpc3Rbal07XG5cbiAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvdW50OyBrKyspIHtcbiAgICAgICAgICAgIGlmIChkcmF3YWJsZU1hc2tzW2tdID09IGNsaXBJZCkge1xuICAgICAgICAgICAgICBzYW1lQ291bnQrKztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNhbWVDb3VudCA9PSBjb3VudCkge1xuICAgICAgICAgIHJldHVybiBjbGlwcGluZ0NvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7IC8vIOimi+OBpOOBi+OCieOBquOBi+OBo+OBn1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCr+ODquODg+ODlOODs+OCsOOCs+ODs+ODhuOCreOCueODiOOCkumFjee9ruOBmeOCi+ODrOOCpOOCouOCpuODiFxuICAgICAqIOS4gOOBpOOBruODrOODs+ODgOODvOODhuOCr+OCueODgeODo+OCkualteWKm+OBhOOBo+OBseOBhOOBq+S9v+OBo+OBpuODnuOCueOCr+OCkuODrOOCpOOCouOCpuODiOOBmeOCi1xuICAgICAqIOODnuOCueOCr+OCsOODq+ODvOODl+OBruaVsOOBjDTku6XkuIvjgarjgolSR0JB5ZCE44OB44Oj44Oz44ON44Or44Gr5LiA44Gk44Ga44Gk44Oe44K544Kv44KS6YWN572u44GX44CBNeS7peS4ijbku6XkuIvjgarjgolSR0JB44KSMiwyLDEsMeOBqOmFjee9ruOBmeOCi+OAglxuICAgICAqXG4gICAgICogQHBhcmFtIHVzaW5nQ2xpcENvdW50IOmFjee9ruOBmeOCi+OCr+ODquODg+ODlOODs+OCsOOCs+ODs+ODhuOCreOCueODiOOBruaVsFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXR1cExheW91dEJvdW5kcyh1c2luZ0NsaXBDb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAvLyDjgbLjgajjgaTjga5SZW5kZXJUZXh0dXJl44KS5qW15Yqb44GE44Gj44Gx44GE44Gr5L2/44Gj44Gm44Oe44K544Kv44KS44Os44Kk44Ki44Km44OI44GZ44KLXG4gICAgICAvLyDjg57jgrnjgq/jgrDjg6vjg7zjg5fjga7mlbDjgYw05Lul5LiL44Gq44KJUkdCQeWQhOODgeODo+ODs+ODjeODq+OBqzHjgaTjgZrjgaTjg57jgrnjgq/jgpLphY3nva7jgZfjgIE15Lul5LiKNuS7peS4i+OBquOCiVJHQkHjgpIyLDIsMSwx44Go6YWN572u44GZ44KLXG5cbiAgICAgIC8vIFJHQkHjgpLpoIbnlarjgavkvb/jgaPjgabjgYTjgY9cbiAgICAgIGxldCBkaXY6IG51bWJlciA9IHVzaW5nQ2xpcENvdW50IC8gQ29sb3JDaGFubmVsQ291bnQ7IC8vIDHjg4Hjg6Pjg7Pjg43jg6vjgavphY3nva7jgZnjgovln7rmnKzjga7jg57jgrnjgq9cbiAgICAgIGxldCBtb2Q6IG51bWJlciA9IHVzaW5nQ2xpcENvdW50ICUgQ29sb3JDaGFubmVsQ291bnQ7IC8vIOS9meOCiuOAgeOBk+OBrueVquWPt+OBruODgeODo+ODs+ODjeODq+OBvuOBp+OBq+S4gOOBpOOBmuOBpOmFjeWIhuOBmeOCi1xuXG4gICAgICAvLyDlsI/mlbDngrnjga/liIfjgormjajjgabjgotcbiAgICAgIGRpdiA9IH5+ZGl2O1xuICAgICAgbW9kID0gfn5tb2Q7XG5cbiAgICAgIC8vIFJHQkHjgZ3jgozjgZ7jgozjga7jg4Hjg6Pjg7Pjg43jg6vjgpLnlKjmhI/jgZfjgabjgYTjgY/vvIgwOlIsIDE6RywgMjpCLCAzOkHvvIlcbiAgICAgIGxldCBjdXJDbGlwSW5kZXggPSAwOyAvLyDpoIbnlarjgavoqK3lrprjgZfjgabjgYTjgY9cblxuICAgICAgZm9yIChsZXQgY2hhbm5lbE5vID0gMDsgY2hhbm5lbE5vIDwgQ29sb3JDaGFubmVsQ291bnQ7IGNoYW5uZWxObysrKSB7XG4gICAgICAgIC8vIOOBk+OBruODgeODo+ODs+ODjeODq+OBq+ODrOOCpOOCouOCpuODiOOBmeOCi+aVsFxuICAgICAgICBjb25zdCBsYXlvdXRDb3VudDogbnVtYmVyID0gZGl2ICsgKGNoYW5uZWxObyA8IG1vZCA/IDEgOiAwKTtcblxuICAgICAgICAvLyDliIblibLmlrnms5XjgpLmsbrlrprjgZnjgotcbiAgICAgICAgaWYgKGxheW91dENvdW50ID09IDApIHtcbiAgICAgICAgICAvLyDkvZXjgoLjgZfjgarjgYRcbiAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRDb3VudCA9PSAxKSB7XG4gICAgICAgICAgLy8g5YWo44Gm44KS44Gd44Gu44G+44G+5L2/44GGXG4gICAgICAgICAgY29uc3QgY2xpcENvbnRleHQ6IEN1YmlzbUNsaXBwaW5nQ29udGV4dCA9IHRoaXMuX2NsaXBwaW5nQ29udGV4dExpc3RGb3JNYXNrLmF0KFxuICAgICAgICAgICAgY3VyQ2xpcEluZGV4KytcbiAgICAgICAgICApO1xuICAgICAgICAgIGNsaXBDb250ZXh0Ll9sYXlvdXRDaGFubmVsTm8gPSBjaGFubmVsTm87XG4gICAgICAgICAgY2xpcENvbnRleHQuX2xheW91dEJvdW5kcy54ID0gMC4wO1xuICAgICAgICAgIGNsaXBDb250ZXh0Ll9sYXlvdXRCb3VuZHMueSA9IDAuMDtcbiAgICAgICAgICBjbGlwQ29udGV4dC5fbGF5b3V0Qm91bmRzLndpZHRoID0gMS4wO1xuICAgICAgICAgIGNsaXBDb250ZXh0Ll9sYXlvdXRCb3VuZHMuaGVpZ2h0ID0gMS4wO1xuICAgICAgICB9IGVsc2UgaWYgKGxheW91dENvdW50ID09IDIpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheW91dENvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCB4cG9zOiBudW1iZXIgPSBpICUgMjtcblxuICAgICAgICAgICAgLy8g5bCP5pWw54K544Gv5YiH44KK5o2o44Gm44KLXG4gICAgICAgICAgICB4cG9zID0gfn54cG9zO1xuXG4gICAgICAgICAgICBjb25zdCBjYzogQ3ViaXNtQ2xpcHBpbmdDb250ZXh0ID0gdGhpcy5fY2xpcHBpbmdDb250ZXh0TGlzdEZvck1hc2suYXQoXG4gICAgICAgICAgICAgIGN1ckNsaXBJbmRleCsrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY2MuX2xheW91dENoYW5uZWxObyA9IGNoYW5uZWxObztcblxuICAgICAgICAgICAgY2MuX2xheW91dEJvdW5kcy54ID0geHBvcyAqIDAuNTtcbiAgICAgICAgICAgIGNjLl9sYXlvdXRCb3VuZHMueSA9IDAuMDtcbiAgICAgICAgICAgIGNjLl9sYXlvdXRCb3VuZHMud2lkdGggPSAwLjU7XG4gICAgICAgICAgICBjYy5fbGF5b3V0Qm91bmRzLmhlaWdodCA9IDEuMDtcbiAgICAgICAgICAgIC8vIFVW44KSMuOBpOOBq+WIhuino+OBl+OBpuS9v+OBhlxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRDb3VudCA8PSA0KSB7XG4gICAgICAgICAgLy8gNOWIhuWJsuOBl+OBpuS9v+OBhlxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5b3V0Q291bnQ7IGkrKykge1xuICAgICAgICAgICAgbGV0IHhwb3M6IG51bWJlciA9IGkgJSAyO1xuICAgICAgICAgICAgbGV0IHlwb3M6IG51bWJlciA9IGkgLyAyO1xuXG4gICAgICAgICAgICAvLyDlsI/mlbDngrnjga/liIfjgormjajjgabjgotcbiAgICAgICAgICAgIHhwb3MgPSB+fnhwb3M7XG4gICAgICAgICAgICB5cG9zID0gfn55cG9zO1xuXG4gICAgICAgICAgICBjb25zdCBjYyA9IHRoaXMuX2NsaXBwaW5nQ29udGV4dExpc3RGb3JNYXNrLmF0KGN1ckNsaXBJbmRleCsrKTtcbiAgICAgICAgICAgIGNjLl9sYXlvdXRDaGFubmVsTm8gPSBjaGFubmVsTm87XG5cbiAgICAgICAgICAgIGNjLl9sYXlvdXRCb3VuZHMueCA9IHhwb3MgKiAwLjU7XG4gICAgICAgICAgICBjYy5fbGF5b3V0Qm91bmRzLnkgPSB5cG9zICogMC41O1xuICAgICAgICAgICAgY2MuX2xheW91dEJvdW5kcy53aWR0aCA9IDAuNTtcbiAgICAgICAgICAgIGNjLl9sYXlvdXRCb3VuZHMuaGVpZ2h0ID0gMC41O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRDb3VudCA8PSA5KSB7XG4gICAgICAgICAgLy8gOeWIhuWJsuOBl+OBpuS9v+OBhlxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5b3V0Q291bnQ7IGkrKykge1xuICAgICAgICAgICAgbGV0IHhwb3MgPSBpICUgMztcbiAgICAgICAgICAgIGxldCB5cG9zID0gaSAvIDM7XG5cbiAgICAgICAgICAgIC8vIOWwj+aVsOeCueOBr+WIh+OCiuaNqOOBpuOCi1xuICAgICAgICAgICAgeHBvcyA9IH5+eHBvcztcbiAgICAgICAgICAgIHlwb3MgPSB+fnlwb3M7XG5cbiAgICAgICAgICAgIGNvbnN0IGNjOiBDdWJpc21DbGlwcGluZ0NvbnRleHQgPSB0aGlzLl9jbGlwcGluZ0NvbnRleHRMaXN0Rm9yTWFzay5hdChcbiAgICAgICAgICAgICAgY3VyQ2xpcEluZGV4KytcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYy5fbGF5b3V0Q2hhbm5lbE5vID0gY2hhbm5lbE5vO1xuXG4gICAgICAgICAgICBjYy5fbGF5b3V0Qm91bmRzLnggPSB4cG9zIC8gMy4wO1xuICAgICAgICAgICAgY2MuX2xheW91dEJvdW5kcy55ID0geXBvcyAvIDMuMDtcbiAgICAgICAgICAgIGNjLl9sYXlvdXRCb3VuZHMud2lkdGggPSAxLjAgLyAzLjA7XG4gICAgICAgICAgICBjYy5fbGF5b3V0Qm91bmRzLmhlaWdodCA9IDEuMCAvIDMuMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQ3ViaXNtTG9nRXJyb3IoJ25vdCBzdXBwb3J0ZWQgbWFzayBjb3VudCA6IHswfScsIGxheW91dENvdW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCq+ODqeODvOODkOODg+ODleOCoeOCkuWPluW+l+OBmeOCi1xuICAgICAqIEByZXR1cm4g44Kr44Op44O844OQ44OD44OV44KhXG4gICAgICovXG4gICAgcHVibGljIGdldENvbG9yQnVmZmVyKCk6IFdlYkdMVGV4dHVyZSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29sb3JCdWZmZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog55S76Z2i5o+P55S744Gr5L2/55So44GZ44KL44Kv44Oq44OD44OU44Oz44Kw44Oe44K544Kv44Gu44Oq44K544OI44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDnlLvpnaLmj4/nlLvjgavkvb/nlKjjgZnjgovjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jga7jg6rjgrnjg4hcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2xpcHBpbmdDb250ZXh0TGlzdEZvckRyYXcoKTogY3NtVmVjdG9yPEN1YmlzbUNsaXBwaW5nQ29udGV4dD4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2NsaXBwaW5nQ29udGV4dExpc3RGb3JEcmF3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCr+ODquODg+ODlOODs+OCsOODnuOCueOCr+ODkOODg+ODleOCoeOBruOCteOCpOOCuuOCkuioreWumuOBmeOCi1xuICAgICAqIEBwYXJhbSBzaXplIOOCr+ODquODg+ODlOODs+OCsOODnuOCueOCr+ODkOODg+ODleOCoeOBruOCteOCpOOCulxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRDbGlwcGluZ01hc2tCdWZmZXJTaXplKHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy5fY2xpcHBpbmdNYXNrQnVmZmVyU2l6ZSA9IHNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kv44Oq44OD44OU44Oz44Kw44Oe44K544Kv44OQ44OD44OV44Kh44Gu44K144Kk44K644KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jg5Djg4Pjg5XjgqHjga7jgrXjgqTjgrpcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2xpcHBpbmdNYXNrQnVmZmVyU2l6ZSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2NsaXBwaW5nTWFza0J1ZmZlclNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIF9tYXNrUmVuZGVyVGV4dHVyZTogV2ViR0xGcmFtZWJ1ZmZlcjsgLy8g44Oe44K544Kv55So44Os44Oz44OA44O844OG44Kv44K544OB44Oj44Gu44Ki44OJ44Os44K5XG4gICAgcHVibGljIF9jb2xvckJ1ZmZlcjogV2ViR0xUZXh0dXJlOyAvLyDjg57jgrnjgq/nlKjjgqvjg6njg7zjg5Djg4Pjg5XjgqHjg7zjga7jgqLjg4njg6zjgrlcbiAgICBwdWJsaWMgX2N1cnJlbnRGcmFtZU5vOiBudW1iZXI7IC8vIOODnuOCueOCr+ODhuOCr+OCueODgeODo+OBq+S4juOBiOOCi+ODleODrOODvOODoOeVquWPt1xuXG4gICAgcHVibGljIF9jaGFubmVsQ29sb3JzOiBjc21WZWN0b3I8Q3ViaXNtVGV4dHVyZUNvbG9yPjtcbiAgICBwdWJsaWMgX21hc2tUZXh0dXJlOiBDdWJpc21SZW5kZXJUZXh0dXJlUmVzb3VyY2U7IC8vIOODnuOCueOCr+eUqOOBruODhuOCr+OCueODgeODo+ODquOCveODvOOCueOBruODquOCueODiFxuICAgIHB1YmxpYyBfY2xpcHBpbmdDb250ZXh0TGlzdEZvck1hc2s6IGNzbVZlY3RvcjxDdWJpc21DbGlwcGluZ0NvbnRleHQ+OyAvLyDjg57jgrnjgq/nlKjjgq/jg6rjg4Pjg5Tjg7PjgrDjgrPjg7Pjg4bjgq3jgrnjg4jjga7jg6rjgrnjg4hcbiAgICBwdWJsaWMgX2NsaXBwaW5nQ29udGV4dExpc3RGb3JEcmF3OiBjc21WZWN0b3I8Q3ViaXNtQ2xpcHBpbmdDb250ZXh0PjsgLy8g5o+P55S755So44Kv44Oq44OD44OU44Oz44Kw44Kz44Oz44OG44Kt44K544OI44Gu44Oq44K544OIXG4gICAgcHVibGljIF9jbGlwcGluZ01hc2tCdWZmZXJTaXplOiBudW1iZXI7IC8vIOOCr+ODquODg+ODlOODs+OCsOODnuOCueOCr+OBruODkOODg+ODleOCoeOCteOCpOOCuu+8iOWIneacn+WApDoyNTbvvIlcblxuICAgIHByaXZhdGUgX3RtcE1hdHJpeDogQ3ViaXNtTWF0cml4NDQ7IC8vIOODnuOCueOCr+ioiOeul+eUqOOBruihjOWIl1xuICAgIHByaXZhdGUgX3RtcE1hdHJpeEZvck1hc2s6IEN1YmlzbU1hdHJpeDQ0OyAvLyDjg57jgrnjgq/oqIjnrpfnlKjjga7ooYzliJdcbiAgICBwcml2YXRlIF90bXBNYXRyaXhGb3JEcmF3OiBDdWJpc21NYXRyaXg0NDsgLy8g44Oe44K544Kv6KiI566X55So44Gu6KGM5YiXXG4gICAgcHJpdmF0ZSBfdG1wQm91bmRzT25Nb2RlbDogY3NtUmVjdDsgLy8g44Oe44K544Kv6YWN572u6KiI566X55So44Gu55+p5b2iXG5cbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0OyAvLyBXZWJHTOODrOODs+ODgOODquODs+OCsOOCs+ODs+ODhuOCreOCueODiFxuICB9XG5cbiAgLyoqXG4gICAqIOODrOODs+ODgOODvOODhuOCr+OCueODgeODo+OBruODquOCveODvOOCueOCkuWumue+qeOBmeOCi+ani+mAoOS9k1xuICAgKiDjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jgafkvb/nlKjjgZnjgotcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBDdWJpc21SZW5kZXJUZXh0dXJlUmVzb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIOW8leaVsOS7mOOBjeOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqIEBwYXJhbSBmcmFtZU5vIOODrOODs+ODgOODqeODvOOBruODleODrOODvOODoOeVquWPt1xuICAgICAqIEBwYXJhbSB0ZXh0dXJlIOODhuOCr+OCueODgeODo+OBruOCouODieODrOOCuVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihmcmFtZU5vOiBudW1iZXIsIHRleHR1cmU6IFdlYkdMRnJhbWVidWZmZXIpIHtcbiAgICAgIHRoaXMuZnJhbWVObyA9IGZyYW1lTm87XG4gICAgICB0aGlzLnRleHR1cmUgPSB0ZXh0dXJlO1xuICAgIH1cblxuICAgIHB1YmxpYyBmcmFtZU5vOiBudW1iZXI7IC8vIOODrOODs+ODgOODqeOBruODleODrOODvOODoOeVquWPt1xuICAgIHB1YmxpYyB0ZXh0dXJlOiBXZWJHTEZyYW1lYnVmZmVyOyAvLyDjg4bjgq/jgrnjg4Hjg6Pjga7jgqLjg4njg6zjgrlcbiAgfVxuXG4gIC8qKlxuICAgKiDjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jga7jgrPjg7Pjg4bjgq3jgrnjg4hcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBDdWJpc21DbGlwcGluZ0NvbnRleHQge1xuICAgIC8qKlxuICAgICAqIOW8leaVsOS7mOOBjeOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgIG1hbmFnZXI6IEN1YmlzbUNsaXBwaW5nTWFuYWdlcl9XZWJHTCxcbiAgICAgIGNsaXBwaW5nRHJhd2FibGVJbmRpY2VzOiBJbnQzMkFycmF5LFxuICAgICAgY2xpcENvdW50OiBudW1iZXJcbiAgICApIHtcbiAgICAgIHRoaXMuX293bmVyID0gbWFuYWdlcjtcblxuICAgICAgLy8g44Kv44Oq44OD44OX44GX44Gm44GE44KL77yI77yd44Oe44K544Kv55So44Gu77yJRHJhd2FibGXjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjg6rjgrnjg4hcbiAgICAgIHRoaXMuX2NsaXBwaW5nSWRMaXN0ID0gY2xpcHBpbmdEcmF3YWJsZUluZGljZXM7XG5cbiAgICAgIC8vIOODnuOCueOCr+OBruaVsFxuICAgICAgdGhpcy5fY2xpcHBpbmdJZENvdW50ID0gY2xpcENvdW50O1xuXG4gICAgICB0aGlzLl9hbGxDbGlwcGVkRHJhd1JlY3QgPSBuZXcgY3NtUmVjdCgpO1xuICAgICAgdGhpcy5fbGF5b3V0Qm91bmRzID0gbmV3IGNzbVJlY3QoKTtcblxuICAgICAgdGhpcy5fY2xpcHBlZERyYXdhYmxlSW5kZXhMaXN0ID0gW107XG5cbiAgICAgIHRoaXMuX21hdHJpeEZvck1hc2sgPSBuZXcgQ3ViaXNtTWF0cml4NDQoKTtcbiAgICAgIHRoaXMuX21hdHJpeEZvckRyYXcgPSBuZXcgQ3ViaXNtTWF0cml4NDQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg4fjgrnjg4jjg6njgq/jgr/nm7jlvZPjga7lh6bnkIZcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLl9sYXlvdXRCb3VuZHMgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9sYXlvdXRCb3VuZHMgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fYWxsQ2xpcHBlZERyYXdSZWN0ICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fYWxsQ2xpcHBlZERyYXdSZWN0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NsaXBwZWREcmF3YWJsZUluZGV4TGlzdCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2NsaXBwZWREcmF3YWJsZUluZGV4TGlzdCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44GT44Gu44Oe44K544Kv44Gr44Kv44Oq44OD44OX44GV44KM44KL5o+P55S744Kq44OW44K444Kn44Kv44OI44KS6L+95Yqg44GZ44KLXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZHJhd2FibGVJbmRleCDjgq/jg6rjg4Pjg5Tjg7PjgrDlr77osaHjgavov73liqDjgZnjgovmj4/nlLvjgqrjg5bjgrjjgqfjgq/jg4jjga7jgqTjg7Pjg4fjg4Pjgq/jgrlcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkQ2xpcHBlZERyYXdhYmxlKGRyYXdhYmxlSW5kZXg6IG51bWJlcikge1xuICAgICAgdGhpcy5fY2xpcHBlZERyYXdhYmxlSW5kZXhMaXN0LnB1c2goZHJhd2FibGVJbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44GT44Gu44Oe44K544Kv44KS566h55CG44GZ44KL44Oe44ON44O844K444Oj44Gu44Kk44Oz44K544K/44Oz44K544KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jg43jg7zjgrjjg6Pjga7jgqTjg7Pjgrnjgr/jg7PjgrlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2xpcHBpbmdNYW5hZ2VyKCk6IEN1YmlzbUNsaXBwaW5nTWFuYWdlcl9XZWJHTCB7XG4gICAgICByZXR1cm4gdGhpcy5fb3duZXI7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEdsKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpOiB2b2lkIHtcbiAgICAgIHRoaXMuX293bmVyLnNldEdMKGdsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgX2lzVXNpbmc6IGJvb2xlYW47IC8vIOePvuWcqOOBruaPj+eUu+eKtuaFi+OBp+ODnuOCueOCr+OBrua6luWCmeOBjOW/heimgeOBquOCiXRydWVcbiAgICBwdWJsaWMgcmVhZG9ubHkgX2NsaXBwaW5nSWRMaXN0OiBJbnQzMkFycmF5OyAvLyDjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jga5JROODquOCueODiFxuICAgIHB1YmxpYyBfY2xpcHBpbmdJZENvdW50OiBudW1iZXI7IC8vIOOCr+ODquODg+ODlOODs+OCsOODnuOCueOCr+OBruaVsFxuICAgIHB1YmxpYyBfbGF5b3V0Q2hhbm5lbE5vOiBudW1iZXI7IC8vIFJHQkHjga7jgYTjgZrjgozjga7jg4Hjg6Pjg7Pjg43jg6vjgavjgZPjga7jgq/jg6rjg4Pjg5fjgpLphY3nva7jgZnjgovjgYvvvIgwOlIsIDE6RywgMjpCLCAzOkHvvIlcbiAgICBwdWJsaWMgX2xheW91dEJvdW5kczogY3NtUmVjdDsgLy8g44Oe44K544Kv55So44OB44Oj44Oz44ON44Or44Gu44Gp44Gu6aCY5Z+f44Gr44Oe44K544Kv44KS5YWl44KM44KL44GL77yIVmlld+W6p+aomS0xfjEsIFVW44GvMH4x44Gr55u044GZ77yJXG4gICAgcHVibGljIF9hbGxDbGlwcGVkRHJhd1JlY3Q6IGNzbVJlY3Q7IC8vIOOBk+OBruOCr+ODquODg+ODlOODs+OCsOOBp+OAgeOCr+ODquODg+ODlOODs+OCsOOBleOCjOOCi+OBmeOBueOBpuOBruaPj+eUu+OCquODluOCuOOCp+OCr+ODiOOBruWbsuOBv+efqeW9ou+8iOavjuWbnuabtOaWsO+8iVxuICAgIHB1YmxpYyBfbWF0cml4Rm9yTWFzazogQ3ViaXNtTWF0cml4NDQ7IC8vIOODnuOCueOCr+OBruS9jee9ruioiOeul+e1kOaenOOCkuS/neaMgeOBmeOCi+ihjOWIl1xuICAgIHB1YmxpYyBfbWF0cml4Rm9yRHJhdzogQ3ViaXNtTWF0cml4NDQ7IC8vIOaPj+eUu+OCquODluOCuOOCp+OCr+ODiOOBruS9jee9ruioiOeul+e1kOaenOOCkuS/neaMgeOBmeOCi+ihjOWIl1xuICAgIHB1YmxpYyBfY2xpcHBlZERyYXdhYmxlSW5kZXhMaXN0OiBudW1iZXJbXTsgLy8g44GT44Gu44Oe44K544Kv44Gr44Kv44Oq44OD44OX44GV44KM44KL5o+P55S744Kq44OW44K444Kn44Kv44OI44Gu44Oq44K544OIXG5cbiAgICBwcml2YXRlIF9vd25lcjogQ3ViaXNtQ2xpcHBpbmdNYW5hZ2VyX1dlYkdMOyAvLyDjgZPjga7jg57jgrnjgq/jgpLnrqHnkIbjgZfjgabjgYTjgovjg57jg43jg7zjgrjjg6Pjga7jgqTjg7Pjgrnjgr/jg7PjgrlcbiAgfVxuXG4gIC8qKlxuICAgKiBXZWJHTOeUqOOBruOCt+OCp+ODvOODgOODvOODl+ODreOCsOODqeODoOOCkueUn+aIkOODu+egtOajhOOBmeOCi+OCr+ODqeOCuVxuICAgKiDjgrfjg7PjgrDjg6vjg4jjg7Pjgarjgq/jg6njgrnjgafjgYLjgorjgIFDdWJpc21TaGFkZXJfV2ViR0wuZ2V0SW5zdGFuY2XjgYvjgonjgqLjgq/jgrvjgrnjgZnjgovjgIJcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBDdWJpc21TaGFkZXJfV2ViR0wge1xuICAgIC8qKlxuICAgICAqIOOCpOODs+OCueOCv+ODs+OCueOCkuWPluW+l+OBmeOCi++8iOOCt+ODs+OCsOODq+ODiOODs++8iVxuICAgICAqIEByZXR1cm4g44Kk44Oz44K544K/44Oz44K5XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBDdWJpc21TaGFkZXJfV2ViR0wge1xuICAgICAgaWYgKHNfaW5zdGFuY2UgPT0gbnVsbCkge1xuICAgICAgICBzX2luc3RhbmNlID0gbmV3IEN1YmlzbVNoYWRlcl9XZWJHTCgpO1xuXG4gICAgICAgIHJldHVybiBzX2luc3RhbmNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNfaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kk44Oz44K544K/44Oz44K544KS6ZaL5pS+44GZ44KL77yI44K344Oz44Kw44Or44OI44Oz77yJXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBkZWxldGVJbnN0YW5jZSgpOiB2b2lkIHtcbiAgICAgIGlmIChzX2luc3RhbmNlKSB7XG4gICAgICAgIHNfaW5zdGFuY2UucmVsZWFzZSgpO1xuICAgICAgICBzX2luc3RhbmNlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwcml2YXRl44Gq44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICovXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMgPSBuZXcgY3NtVmVjdG9yPEN1YmlzbVNoYWRlclNldD4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg4fjgrnjg4jjg6njgq/jgr/nm7jlvZPjga7lh6bnkIZcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMucmVsZWFzZVNoYWRlclByb2dyYW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgrfjgqfjg7zjg4Djg7zjg5fjg63jgrDjg6njg6Djga7kuIDpgKPjga7jgrvjg4Pjg4jjgqLjg4Pjg5fjgpLlrp/ooYzjgZnjgotcbiAgICAgKiBAcGFyYW0gcmVuZGVyZXIg44Os44Oz44OA44Op44Gu44Kk44Oz44K544K/44Oz44K5XG4gICAgICogQHBhcmFtIHRleHR1cmVJZCBHUFXjga7jg4bjgq/jgrnjg4Hjg6NJRFxuICAgICAqIEBwYXJhbSB2ZXJ0ZXhDb3VudCDjg53jg6rjgrTjg7Pjg6Hjg4Pjgrfjg6Xjga7poILngrnmlbBcbiAgICAgKiBAcGFyYW0gdmVydGV4QXJyYXkg44Od44Oq44K044Oz44Oh44OD44K344Ol44Gu6aCC54K56YWN5YiXXG4gICAgICogQHBhcmFtIGluZGV4QXJyYXkg44Kk44Oz44OH44OD44Kv44K544OQ44OD44OV44Kh44Gu6aCC54K56YWN5YiXXG4gICAgICogQHBhcmFtIHV2QXJyYXkgdXbphY3liJdcbiAgICAgKiBAcGFyYW0gb3BhY2l0eSDkuI3pgI/mmI7luqZcbiAgICAgKiBAcGFyYW0gY29sb3JCbGVuZE1vZGUg44Kr44Op44O844OW44Os44Oz44OH44Kj44Oz44Kw44Gu44K/44Kk44OXXG4gICAgICogQHBhcmFtIGJhc2VDb2xvciDjg5njg7zjgrnjgqvjg6njg7xcbiAgICAgKiBAcGFyYW0gaXNQcmVtdWx0aXBsaWVkQWxwaGEg5LmX566X5riI44G/44Ki44Or44OV44Kh44GL44Gp44GG44GLXG4gICAgICogQHBhcmFtIG1hdHJpeDR4NCBNb2RlbC1WaWV3LVByb2plY3Rpb27ooYzliJdcbiAgICAgKiBAcGFyYW0gaW52ZXJ0ZWRNYXNrIOODnuOCueOCr+OCkuWPjei7ouOBl+OBpuS9v+eUqOOBmeOCi+ODleODqeOCsFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXR1cFNoYWRlclByb2dyYW0oXG4gICAgICByZW5kZXJlcjogQ3ViaXNtUmVuZGVyZXJfV2ViR0wsXG4gICAgICB0ZXh0dXJlSWQ6IFdlYkdMVGV4dHVyZSxcbiAgICAgIHZlcnRleENvdW50OiBudW1iZXIsXG4gICAgICB2ZXJ0ZXhBcnJheTogRmxvYXQzMkFycmF5LFxuICAgICAgaW5kZXhBcnJheTogVWludDE2QXJyYXksXG4gICAgICB1dkFycmF5OiBGbG9hdDMyQXJyYXksXG4gICAgICBidWZmZXJEYXRhOiB7XG4gICAgICAgIHZlcnRleDogV2ViR0xCdWZmZXI7XG4gICAgICAgIHV2OiBXZWJHTEJ1ZmZlcjtcbiAgICAgICAgaW5kZXg6IFdlYkdMQnVmZmVyO1xuICAgICAgfSxcbiAgICAgIG9wYWNpdHk6IG51bWJlcixcbiAgICAgIGNvbG9yQmxlbmRNb2RlOiBDdWJpc21CbGVuZE1vZGUsXG4gICAgICBiYXNlQ29sb3I6IEN1YmlzbVRleHR1cmVDb2xvcixcbiAgICAgIGlzUHJlbXVsdGlwbGllZEFscGhhOiBib29sZWFuLFxuICAgICAgbWF0cml4NHg0OiBDdWJpc21NYXRyaXg0NCxcbiAgICAgIGludmVydGVkTWFzazogYm9vbGVhblxuICAgICk6IHZvaWQge1xuICAgICAgaWYgKCFpc1ByZW11bHRpcGxpZWRBbHBoYSkge1xuICAgICAgICBDdWJpc21Mb2dFcnJvcignTm9QcmVtdWx0aXBsaWVkQWxwaGEgaXMgbm90IGFsbG93ZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3NoYWRlclNldHMuZ2V0U2l6ZSgpID09IDApIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVNoYWRlcnMoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQmxlbmRpbmdcbiAgICAgIGxldCBTUkNfQ09MT1I6IG51bWJlcjtcbiAgICAgIGxldCBEU1RfQ09MT1I6IG51bWJlcjtcbiAgICAgIGxldCBTUkNfQUxQSEE6IG51bWJlcjtcbiAgICAgIGxldCBEU1RfQUxQSEE6IG51bWJlcjtcblxuICAgICAgaWYgKHJlbmRlcmVyLmdldENsaXBwaW5nQ29udGV4dEJ1ZmZlckZvck1hc2soKSAhPSBudWxsKSB7XG4gICAgICAgIC8vIOODnuOCueOCr+eUn+aIkOaZglxuICAgICAgICBjb25zdCBzaGFkZXJTZXQ6IEN1YmlzbVNoYWRlclNldCA9IHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgICAgU2hhZGVyTmFtZXMuU2hhZGVyTmFtZXNfU2V0dXBNYXNrXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZ2wudXNlUHJvZ3JhbShzaGFkZXJTZXQuc2hhZGVyUHJvZ3JhbSk7XG5cbiAgICAgICAgLy8g44OG44Kv44K544OB44Oj6Kit5a6aXG4gICAgICAgIHRoaXMuZ2wuYWN0aXZlVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkUwKTtcbiAgICAgICAgdGhpcy5nbC5iaW5kVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRleHR1cmVJZCk7XG4gICAgICAgIHRoaXMuZ2wudW5pZm9ybTFpKHNoYWRlclNldC5zYW1wbGVyVGV4dHVyZTBMb2NhdGlvbiwgMCk7XG5cbiAgICAgICAgLy8g6aCC54K56YWN5YiX44Gu6Kit5a6aKFZCTylcbiAgICAgICAgaWYgKGJ1ZmZlckRhdGEudmVydGV4ID09IG51bGwpIHtcbiAgICAgICAgICBidWZmZXJEYXRhLnZlcnRleCA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJEYXRhLnZlcnRleCk7XG4gICAgICAgIHRoaXMuZ2wuYnVmZmVyRGF0YShcbiAgICAgICAgICB0aGlzLmdsLkFSUkFZX0JVRkZFUixcbiAgICAgICAgICB2ZXJ0ZXhBcnJheSxcbiAgICAgICAgICB0aGlzLmdsLkRZTkFNSUNfRFJBV1xuICAgICAgICApO1xuICAgICAgICB0aGlzLmdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHNoYWRlclNldC5hdHRyaWJ1dGVQb3NpdGlvbkxvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFxuICAgICAgICAgIHNoYWRlclNldC5hdHRyaWJ1dGVQb3NpdGlvbkxvY2F0aW9uLFxuICAgICAgICAgIDIsXG4gICAgICAgICAgdGhpcy5nbC5GTE9BVCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAwLFxuICAgICAgICAgIDBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyDjg4bjgq/jgrnjg4Hjg6PpoILngrnjga7oqK3lrppcbiAgICAgICAgaWYgKGJ1ZmZlckRhdGEudXYgPT0gbnVsbCkge1xuICAgICAgICAgIGJ1ZmZlckRhdGEudXYgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyRGF0YS51dik7XG4gICAgICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdXZBcnJheSwgdGhpcy5nbC5EWU5BTUlDX0RSQVcpO1xuICAgICAgICB0aGlzLmdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHNoYWRlclNldC5hdHRyaWJ1dGVUZXhDb29yZExvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFxuICAgICAgICAgIHNoYWRlclNldC5hdHRyaWJ1dGVUZXhDb29yZExvY2F0aW9uLFxuICAgICAgICAgIDIsXG4gICAgICAgICAgdGhpcy5nbC5GTE9BVCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAwLFxuICAgICAgICAgIDBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyDjg4Hjg6Pjg7Pjg43jg6tcbiAgICAgICAgY29uc3QgY2hhbm5lbE5vOiBudW1iZXIgPSByZW5kZXJlci5nZXRDbGlwcGluZ0NvbnRleHRCdWZmZXJGb3JNYXNrKClcbiAgICAgICAgICAuX2xheW91dENoYW5uZWxObztcbiAgICAgICAgY29uc3QgY29sb3JDaGFubmVsOiBDdWJpc21UZXh0dXJlQ29sb3IgPSByZW5kZXJlclxuICAgICAgICAgIC5nZXRDbGlwcGluZ0NvbnRleHRCdWZmZXJGb3JNYXNrKClcbiAgICAgICAgICAuZ2V0Q2xpcHBpbmdNYW5hZ2VyKClcbiAgICAgICAgICAuZ2V0Q2hhbm5lbEZsYWdBc0NvbG9yKGNoYW5uZWxObyk7XG4gICAgICAgIHRoaXMuZ2wudW5pZm9ybTRmKFxuICAgICAgICAgIHNoYWRlclNldC51bmlmb3JtQ2hhbm5lbEZsYWdMb2NhdGlvbixcbiAgICAgICAgICBjb2xvckNoYW5uZWwuUixcbiAgICAgICAgICBjb2xvckNoYW5uZWwuRyxcbiAgICAgICAgICBjb2xvckNoYW5uZWwuQixcbiAgICAgICAgICBjb2xvckNoYW5uZWwuQVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDRmdihcbiAgICAgICAgICBzaGFkZXJTZXQudW5pZm9ybUNsaXBNYXRyaXhMb2NhdGlvbixcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICByZW5kZXJlci5nZXRDbGlwcGluZ0NvbnRleHRCdWZmZXJGb3JNYXNrKCkuX21hdHJpeEZvck1hc2suZ2V0QXJyYXkoKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHJlY3Q6IGNzbVJlY3QgPSByZW5kZXJlci5nZXRDbGlwcGluZ0NvbnRleHRCdWZmZXJGb3JNYXNrKClcbiAgICAgICAgICAuX2xheW91dEJvdW5kcztcblxuICAgICAgICB0aGlzLmdsLnVuaWZvcm00ZihcbiAgICAgICAgICBzaGFkZXJTZXQudW5pZm9ybUJhc2VDb2xvckxvY2F0aW9uLFxuICAgICAgICAgIHJlY3QueCAqIDIuMCAtIDEuMCxcbiAgICAgICAgICByZWN0LnkgKiAyLjAgLSAxLjAsXG4gICAgICAgICAgcmVjdC5nZXRSaWdodCgpICogMi4wIC0gMS4wLFxuICAgICAgICAgIHJlY3QuZ2V0Qm90dG9tKCkgKiAyLjAgLSAxLjBcbiAgICAgICAgKTtcblxuICAgICAgICBTUkNfQ09MT1IgPSB0aGlzLmdsLlpFUk87XG4gICAgICAgIERTVF9DT0xPUiA9IHRoaXMuZ2wuT05FX01JTlVTX1NSQ19DT0xPUjtcbiAgICAgICAgU1JDX0FMUEhBID0gdGhpcy5nbC5aRVJPO1xuICAgICAgICBEU1RfQUxQSEEgPSB0aGlzLmdsLk9ORV9NSU5VU19TUkNfQUxQSEE7XG4gICAgICB9IC8vIOODnuOCueOCr+eUn+aIkOS7peWkluOBruWgtOWQiFxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IG1hc2tlZDogYm9vbGVhbiA9XG4gICAgICAgICAgcmVuZGVyZXIuZ2V0Q2xpcHBpbmdDb250ZXh0QnVmZmVyRm9yRHJhdygpICE9IG51bGw7IC8vIOOBk+OBruaPj+eUu+OCquODluOCuOOCp+OCr+ODiOOBr+ODnuOCueOCr+WvvuixoeOBi1xuICAgICAgICBjb25zdCBvZmZzZXQ6IG51bWJlciA9IG1hc2tlZCA/IChpbnZlcnRlZE1hc2sgPyAyIDogMSkgOiAwO1xuXG4gICAgICAgIGxldCBzaGFkZXJTZXQ6IEN1YmlzbVNoYWRlclNldCA9IG5ldyBDdWJpc21TaGFkZXJTZXQoKTtcblxuICAgICAgICBzd2l0Y2ggKGNvbG9yQmxlbmRNb2RlKSB7XG4gICAgICAgICAgY2FzZSBDdWJpc21CbGVuZE1vZGUuQ3ViaXNtQmxlbmRNb2RlX05vcm1hbDpcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc2hhZGVyU2V0ID0gdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgICAgICAgU2hhZGVyTmFtZXMuU2hhZGVyTmFtZXNfTm9ybWFsUHJlbXVsdGlwbGllZEFscGhhICsgb2Zmc2V0XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgU1JDX0NPTE9SID0gdGhpcy5nbC5PTkU7XG4gICAgICAgICAgICBEU1RfQ09MT1IgPSB0aGlzLmdsLk9ORV9NSU5VU19TUkNfQUxQSEE7XG4gICAgICAgICAgICBTUkNfQUxQSEEgPSB0aGlzLmdsLk9ORTtcbiAgICAgICAgICAgIERTVF9BTFBIQSA9IHRoaXMuZ2wuT05FX01JTlVTX1NSQ19BTFBIQTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBDdWJpc21CbGVuZE1vZGUuQ3ViaXNtQmxlbmRNb2RlX0FkZGl0aXZlOlxuICAgICAgICAgICAgc2hhZGVyU2V0ID0gdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgICAgICAgU2hhZGVyTmFtZXMuU2hhZGVyTmFtZXNfQWRkUHJlbXVsdGlwbGllZEFscGhhICsgb2Zmc2V0XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgU1JDX0NPTE9SID0gdGhpcy5nbC5PTkU7XG4gICAgICAgICAgICBEU1RfQ09MT1IgPSB0aGlzLmdsLk9ORTtcbiAgICAgICAgICAgIFNSQ19BTFBIQSA9IHRoaXMuZ2wuWkVSTztcbiAgICAgICAgICAgIERTVF9BTFBIQSA9IHRoaXMuZ2wuT05FO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIEN1YmlzbUJsZW5kTW9kZS5DdWJpc21CbGVuZE1vZGVfTXVsdGlwbGljYXRpdmU6XG4gICAgICAgICAgICBzaGFkZXJTZXQgPSB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICAgICAgICBTaGFkZXJOYW1lcy5TaGFkZXJOYW1lc19NdWx0UHJlbXVsdGlwbGllZEFscGhhICsgb2Zmc2V0XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgU1JDX0NPTE9SID0gdGhpcy5nbC5EU1RfQ09MT1I7XG4gICAgICAgICAgICBEU1RfQ09MT1IgPSB0aGlzLmdsLk9ORV9NSU5VU19TUkNfQUxQSEE7XG4gICAgICAgICAgICBTUkNfQUxQSEEgPSB0aGlzLmdsLlpFUk87XG4gICAgICAgICAgICBEU1RfQUxQSEEgPSB0aGlzLmdsLk9ORTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbC51c2VQcm9ncmFtKHNoYWRlclNldC5zaGFkZXJQcm9ncmFtKTtcblxuICAgICAgICAvLyDpoILngrnphY3liJfjga7oqK3lrppcbiAgICAgICAgaWYgKGJ1ZmZlckRhdGEudmVydGV4ID09IG51bGwpIHtcbiAgICAgICAgICBidWZmZXJEYXRhLnZlcnRleCA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJEYXRhLnZlcnRleCk7XG4gICAgICAgIHRoaXMuZ2wuYnVmZmVyRGF0YShcbiAgICAgICAgICB0aGlzLmdsLkFSUkFZX0JVRkZFUixcbiAgICAgICAgICB2ZXJ0ZXhBcnJheSxcbiAgICAgICAgICB0aGlzLmdsLkRZTkFNSUNfRFJBV1xuICAgICAgICApO1xuICAgICAgICB0aGlzLmdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHNoYWRlclNldC5hdHRyaWJ1dGVQb3NpdGlvbkxvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFxuICAgICAgICAgIHNoYWRlclNldC5hdHRyaWJ1dGVQb3NpdGlvbkxvY2F0aW9uLFxuICAgICAgICAgIDIsXG4gICAgICAgICAgdGhpcy5nbC5GTE9BVCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAwLFxuICAgICAgICAgIDBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyDjg4bjgq/jgrnjg4Hjg6PpoILngrnjga7oqK3lrppcbiAgICAgICAgaWYgKGJ1ZmZlckRhdGEudXYgPT0gbnVsbCkge1xuICAgICAgICAgIGJ1ZmZlckRhdGEudXYgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyRGF0YS51dik7XG4gICAgICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdXZBcnJheSwgdGhpcy5nbC5EWU5BTUlDX0RSQVcpO1xuICAgICAgICB0aGlzLmdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHNoYWRlclNldC5hdHRyaWJ1dGVUZXhDb29yZExvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFxuICAgICAgICAgIHNoYWRlclNldC5hdHRyaWJ1dGVUZXhDb29yZExvY2F0aW9uLFxuICAgICAgICAgIDIsXG4gICAgICAgICAgdGhpcy5nbC5GTE9BVCxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAwLFxuICAgICAgICAgIDBcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAobWFza2VkKSB7XG4gICAgICAgICAgdGhpcy5nbC5hY3RpdmVUZXh0dXJlKHRoaXMuZ2wuVEVYVFVSRTEpO1xuICAgICAgICAgIGNvbnN0IHRleDogV2ViR0xUZXh0dXJlID0gcmVuZGVyZXJcbiAgICAgICAgICAgIC5nZXRDbGlwcGluZ0NvbnRleHRCdWZmZXJGb3JEcmF3KClcbiAgICAgICAgICAgIC5nZXRDbGlwcGluZ01hbmFnZXIoKVxuICAgICAgICAgICAgLmdldENvbG9yQnVmZmVyKCk7XG4gICAgICAgICAgdGhpcy5nbC5iaW5kVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRleCk7XG4gICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWkoc2hhZGVyU2V0LnNhbXBsZXJUZXh0dXJlMUxvY2F0aW9uLCAxKTtcblxuICAgICAgICAgIC8vIHZpZXfluqfmqJnjgpJDbGlwcGluZ0NvbnRleHTjga7luqfmqJnjgavlpInmj5vjgZnjgovjgZ/jgoHjga7ooYzliJfjgpLoqK3lrppcbiAgICAgICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXg0ZnYoXG4gICAgICAgICAgICBzaGFkZXJTZXQudW5pZm9ybUNsaXBNYXRyaXhMb2NhdGlvbixcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgcmVuZGVyZXIuZ2V0Q2xpcHBpbmdDb250ZXh0QnVmZmVyRm9yRHJhdygpLl9tYXRyaXhGb3JEcmF3LmdldEFycmF5KClcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8g5L2/55So44GZ44KL44Kr44Op44O844OB44Oj44Oz44ON44Or44KS6Kit5a6aXG4gICAgICAgICAgY29uc3QgY2hhbm5lbE5vOiBudW1iZXIgPSByZW5kZXJlci5nZXRDbGlwcGluZ0NvbnRleHRCdWZmZXJGb3JEcmF3KClcbiAgICAgICAgICAgIC5fbGF5b3V0Q2hhbm5lbE5vO1xuICAgICAgICAgIGNvbnN0IGNvbG9yQ2hhbm5lbDogQ3ViaXNtVGV4dHVyZUNvbG9yID0gcmVuZGVyZXJcbiAgICAgICAgICAgIC5nZXRDbGlwcGluZ0NvbnRleHRCdWZmZXJGb3JEcmF3KClcbiAgICAgICAgICAgIC5nZXRDbGlwcGluZ01hbmFnZXIoKVxuICAgICAgICAgICAgLmdldENoYW5uZWxGbGFnQXNDb2xvcihjaGFubmVsTm8pO1xuICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTRmKFxuICAgICAgICAgICAgc2hhZGVyU2V0LnVuaWZvcm1DaGFubmVsRmxhZ0xvY2F0aW9uLFxuICAgICAgICAgICAgY29sb3JDaGFubmVsLlIsXG4gICAgICAgICAgICBjb2xvckNoYW5uZWwuRyxcbiAgICAgICAgICAgIGNvbG9yQ2hhbm5lbC5CLFxuICAgICAgICAgICAgY29sb3JDaGFubmVsLkFcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g44OG44Kv44K544OB44Oj6Kit5a6aXG4gICAgICAgIHRoaXMuZ2wuYWN0aXZlVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkUwKTtcbiAgICAgICAgdGhpcy5nbC5iaW5kVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRleHR1cmVJZCk7XG4gICAgICAgIHRoaXMuZ2wudW5pZm9ybTFpKHNoYWRlclNldC5zYW1wbGVyVGV4dHVyZTBMb2NhdGlvbiwgMCk7XG5cbiAgICAgICAgLy8g5bqn5qiZ5aSJ5o+bXG4gICAgICAgIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDRmdihcbiAgICAgICAgICBzaGFkZXJTZXQudW5pZm9ybU1hdHJpeExvY2F0aW9uLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIG1hdHJpeDR4NC5nZXRBcnJheSgpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5nbC51bmlmb3JtNGYoXG4gICAgICAgICAgc2hhZGVyU2V0LnVuaWZvcm1CYXNlQ29sb3JMb2NhdGlvbixcbiAgICAgICAgICBiYXNlQ29sb3IuUixcbiAgICAgICAgICBiYXNlQ29sb3IuRyxcbiAgICAgICAgICBiYXNlQ29sb3IuQixcbiAgICAgICAgICBiYXNlQ29sb3IuQVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBJQk/jgpLkvZzmiJDjgZfjgIHjg4fjg7zjgr/jgpLou6LpgIFcbiAgICAgIGlmIChidWZmZXJEYXRhLmluZGV4ID09IG51bGwpIHtcbiAgICAgICAgYnVmZmVyRGF0YS5pbmRleCA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgYnVmZmVyRGF0YS5pbmRleCk7XG4gICAgICB0aGlzLmdsLmJ1ZmZlckRhdGEoXG4gICAgICAgIHRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsXG4gICAgICAgIGluZGV4QXJyYXksXG4gICAgICAgIHRoaXMuZ2wuRFlOQU1JQ19EUkFXXG4gICAgICApO1xuICAgICAgdGhpcy5nbC5ibGVuZEZ1bmNTZXBhcmF0ZShTUkNfQ09MT1IsIERTVF9DT0xPUiwgU1JDX0FMUEhBLCBEU1RfQUxQSEEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCt+OCp+ODvOODgOODvOODl+ODreOCsOODqeODoOOCkuino+aUvuOBmeOCi1xuICAgICAqL1xuICAgIHB1YmxpYyByZWxlYXNlU2hhZGVyUHJvZ3JhbSgpOiB2b2lkIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fc2hhZGVyU2V0cy5nZXRTaXplKCk7IGkrKykge1xuICAgICAgICB0aGlzLmdsLmRlbGV0ZVByb2dyYW0odGhpcy5fc2hhZGVyU2V0cy5hdChpKS5zaGFkZXJQcm9ncmFtKTtcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChpKS5zaGFkZXJQcm9ncmFtID0gMDtcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5zZXQoaSwgdm9pZCAwKTtcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5zZXQoaSwgbnVsbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44K344Kn44O844OA44O844OX44Ot44Kw44Op44Og44KS5Yid5pyf5YyW44GZ44KLXG4gICAgICogQHBhcmFtIHZlcnRTaGFkZXJTcmMg6aCC54K544K344Kn44O844OA44Gu44K944O844K5XG4gICAgICogQHBhcmFtIGZyYWdTaGFkZXJTcmMg44OV44Op44Kw44Oh44Oz44OI44K344Kn44O844OA44Gu44K944O844K5XG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlU2hhZGVycygpOiB2b2lkIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhZGVyQ291bnQ7IGkrKykge1xuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLnB1c2hCYWNrKG5ldyBDdWJpc21TaGFkZXJTZXQoKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoMCkuc2hhZGVyUHJvZ3JhbSA9IHRoaXMubG9hZFNoYWRlclByb2dyYW0oXG4gICAgICAgIHZlcnRleFNoYWRlclNyY1NldHVwTWFzayxcbiAgICAgICAgZnJhZ21lbnRTaGFkZXJTcmNzZXR1cE1hc2tcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoMSkuc2hhZGVyUHJvZ3JhbSA9IHRoaXMubG9hZFNoYWRlclByb2dyYW0oXG4gICAgICAgIHZlcnRleFNoYWRlclNyYyxcbiAgICAgICAgZnJhZ21lbnRTaGFkZXJTcmNQcmVtdWx0aXBsaWVkQWxwaGFcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDIpLnNoYWRlclByb2dyYW0gPSB0aGlzLmxvYWRTaGFkZXJQcm9ncmFtKFxuICAgICAgICB2ZXJ0ZXhTaGFkZXJTcmNNYXNrZWQsXG4gICAgICAgIGZyYWdtZW50U2hhZGVyU3JjTWFza1ByZW11bHRpcGxpZWRBbHBoYVxuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoMykuc2hhZGVyUHJvZ3JhbSA9IHRoaXMubG9hZFNoYWRlclByb2dyYW0oXG4gICAgICAgIHZlcnRleFNoYWRlclNyY01hc2tlZCxcbiAgICAgICAgZnJhZ21lbnRTaGFkZXJTcmNNYXNrSW52ZXJ0ZWRQcmVtdWx0aXBsaWVkQWxwaGFcbiAgICAgICk7XG5cbiAgICAgIC8vIOWKoOeul+OCgumAmuW4uOOBqOWQjOOBmOOCt+OCp+ODvOODgOODvOOCkuWIqeeUqOOBmeOCi1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg0KS5zaGFkZXJQcm9ncmFtID0gdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgMVxuICAgICAgKS5zaGFkZXJQcm9ncmFtO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg1KS5zaGFkZXJQcm9ncmFtID0gdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgMlxuICAgICAgKS5zaGFkZXJQcm9ncmFtO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg2KS5zaGFkZXJQcm9ncmFtID0gdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgM1xuICAgICAgKS5zaGFkZXJQcm9ncmFtO1xuXG4gICAgICAvLyDkuZfnrpfjgoLpgJrluLjjgajlkIzjgZjjgrfjgqfjg7zjg4Djg7zjgpLliKnnlKjjgZnjgotcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoNykuc2hhZGVyUHJvZ3JhbSA9IHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDFcbiAgICAgICkuc2hhZGVyUHJvZ3JhbTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoOCkuc2hhZGVyUHJvZ3JhbSA9IHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDJcbiAgICAgICkuc2hhZGVyUHJvZ3JhbTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoOSkuc2hhZGVyUHJvZ3JhbSA9IHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDNcbiAgICAgICkuc2hhZGVyUHJvZ3JhbTtcblxuICAgICAgLy8gU2V0dXBNYXNrXG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICAwXG4gICAgICApLmF0dHJpYnV0ZVBvc2l0aW9uTG9jYXRpb24gPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDApLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdhX3Bvc2l0aW9uJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDBcbiAgICAgICkuYXR0cmlidXRlVGV4Q29vcmRMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoMCkuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ2FfdGV4Q29vcmQnXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgMFxuICAgICAgKS5zYW1wbGVyVGV4dHVyZTBMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDApLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdzX3RleHR1cmUwJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDBcbiAgICAgICkudW5pZm9ybUNsaXBNYXRyaXhMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDApLnNoYWRlclByb2dyYW0sXG4gICAgICAgICd1X2NsaXBNYXRyaXgnXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgMFxuICAgICAgKS51bmlmb3JtQ2hhbm5lbEZsYWdMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDApLnNoYWRlclByb2dyYW0sXG4gICAgICAgICd1X2NoYW5uZWxGbGFnJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDBcbiAgICAgICkudW5pZm9ybUJhc2VDb2xvckxvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoMCkuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ3VfYmFzZUNvbG9yJ1xuICAgICAgKTtcblxuICAgICAgLy8g6YCa5bi477yIUHJlbXVsdGlwbGllZEFscGhh77yJXG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICAxXG4gICAgICApLmF0dHJpYnV0ZVBvc2l0aW9uTG9jYXRpb24gPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDEpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdhX3Bvc2l0aW9uJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDFcbiAgICAgICkuYXR0cmlidXRlVGV4Q29vcmRMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoMSkuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ2FfdGV4Q29vcmQnXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgMVxuICAgICAgKS5zYW1wbGVyVGV4dHVyZTBMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDEpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdzX3RleHR1cmUwJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoMSkudW5pZm9ybU1hdHJpeExvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoMSkuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ3VfbWF0cml4J1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDFcbiAgICAgICkudW5pZm9ybUJhc2VDb2xvckxvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoMSkuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ3VfYmFzZUNvbG9yJ1xuICAgICAgKTtcblxuICAgICAgLy8g6YCa5bi477yI44Kv44Oq44OD44OU44Oz44Kw44CBUHJlbXVsdGlwbGllZEFscGhh77yJXG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICAyXG4gICAgICApLmF0dHJpYnV0ZVBvc2l0aW9uTG9jYXRpb24gPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDIpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdhX3Bvc2l0aW9uJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDJcbiAgICAgICkuYXR0cmlidXRlVGV4Q29vcmRMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoMikuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ2FfdGV4Q29vcmQnXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgMlxuICAgICAgKS5zYW1wbGVyVGV4dHVyZTBMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDIpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdzX3RleHR1cmUwJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDJcbiAgICAgICkuc2FtcGxlclRleHR1cmUxTG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCgyKS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAnc190ZXh0dXJlMSdcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDIpLnVuaWZvcm1NYXRyaXhMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDIpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICd1X21hdHJpeCdcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICAyXG4gICAgICApLnVuaWZvcm1DbGlwTWF0cml4TG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCgyKS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAndV9jbGlwTWF0cml4J1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDJcbiAgICAgICkudW5pZm9ybUNoYW5uZWxGbGFnTG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCgyKS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAndV9jaGFubmVsRmxhZydcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICAyXG4gICAgICApLnVuaWZvcm1CYXNlQ29sb3JMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDIpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICd1X2Jhc2VDb2xvcidcbiAgICAgICk7XG5cbiAgICAgIC8vIOmAmuW4uO+8iOOCr+ODquODg+ODlOODs+OCsOODu+WPjei7oiwgUHJlbXVsdGlwbGllZEFscGhh77yJXG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICAzXG4gICAgICApLmF0dHJpYnV0ZVBvc2l0aW9uTG9jYXRpb24gPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDMpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdhX3Bvc2l0aW9uJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDNcbiAgICAgICkuYXR0cmlidXRlVGV4Q29vcmRMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoMykuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ2FfdGV4Q29vcmQnXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgM1xuICAgICAgKS5zYW1wbGVyVGV4dHVyZTBMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDMpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdzX3RleHR1cmUwJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDNcbiAgICAgICkuc2FtcGxlclRleHR1cmUxTG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCgzKS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAnc190ZXh0dXJlMSdcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDMpLnVuaWZvcm1NYXRyaXhMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDMpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICd1X21hdHJpeCdcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICAzXG4gICAgICApLnVuaWZvcm1DbGlwTWF0cml4TG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCgzKS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAndV9jbGlwTWF0cml4J1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDNcbiAgICAgICkudW5pZm9ybUNoYW5uZWxGbGFnTG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCgzKS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAndV9jaGFubmVsRmxhZydcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICAzXG4gICAgICApLnVuaWZvcm1CYXNlQ29sb3JMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDMpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICd1X2Jhc2VDb2xvcidcbiAgICAgICk7XG5cbiAgICAgIC8vIOWKoOeul++8iFByZW11bHRpcGxpZWRBbHBoYe+8iVxuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgNFxuICAgICAgKS5hdHRyaWJ1dGVQb3NpdGlvbkxvY2F0aW9uID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg0KS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAnYV9wb3NpdGlvbidcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICA0XG4gICAgICApLmF0dHJpYnV0ZVRleENvb3JkTG9jYXRpb24gPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDQpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdhX3RleENvb3JkJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDRcbiAgICAgICkuc2FtcGxlclRleHR1cmUwTG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg0KS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAnc190ZXh0dXJlMCdcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDQpLnVuaWZvcm1NYXRyaXhMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDQpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICd1X21hdHJpeCdcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICA0XG4gICAgICApLnVuaWZvcm1CYXNlQ29sb3JMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDQpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICd1X2Jhc2VDb2xvcidcbiAgICAgICk7XG5cbiAgICAgIC8vIOWKoOeul++8iOOCr+ODquODg+ODlOODs+OCsOOAgVByZW11bHRpcGxpZWRBbHBoYe+8iVxuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgNVxuICAgICAgKS5hdHRyaWJ1dGVQb3NpdGlvbkxvY2F0aW9uID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg1KS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAnYV9wb3NpdGlvbidcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICA1XG4gICAgICApLmF0dHJpYnV0ZVRleENvb3JkTG9jYXRpb24gPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDUpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdhX3RleENvb3JkJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDVcbiAgICAgICkuc2FtcGxlclRleHR1cmUwTG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg1KS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAnc190ZXh0dXJlMCdcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICA1XG4gICAgICApLnNhbXBsZXJUZXh0dXJlMUxvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoNSkuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ3NfdGV4dHVyZTEnXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg1KS51bmlmb3JtTWF0cml4TG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg1KS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAndV9tYXRyaXgnXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgNVxuICAgICAgKS51bmlmb3JtQ2xpcE1hdHJpeExvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoNSkuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ3VfY2xpcE1hdHJpeCdcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICA1XG4gICAgICApLnVuaWZvcm1DaGFubmVsRmxhZ0xvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoNSkuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ3VfY2hhbm5lbEZsYWcnXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgNVxuICAgICAgKS51bmlmb3JtQmFzZUNvbG9yTG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg1KS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAndV9iYXNlQ29sb3InXG4gICAgICApO1xuXG4gICAgICAvLyDliqDnrpfvvIjjgq/jg6rjg4Pjg5Tjg7PjgrDjg7vlj43ou6LjgIFQcmVtdWx0aXBsaWVkQWxwaGHvvIlcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDZcbiAgICAgICkuYXR0cmlidXRlUG9zaXRpb25Mb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoNikuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ2FfcG9zaXRpb24nXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgNlxuICAgICAgKS5hdHRyaWJ1dGVUZXhDb29yZExvY2F0aW9uID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg2KS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAnYV90ZXhDb29yZCdcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICA2XG4gICAgICApLnNhbXBsZXJUZXh0dXJlMExvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoNikuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ3NfdGV4dHVyZTAnXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgNlxuICAgICAgKS5zYW1wbGVyVGV4dHVyZTFMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDYpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdzX3RleHR1cmUxJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoNikudW5pZm9ybU1hdHJpeExvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoNikuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ3VfbWF0cml4J1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDZcbiAgICAgICkudW5pZm9ybUNsaXBNYXRyaXhMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDYpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICd1X2NsaXBNYXRyaXgnXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgNlxuICAgICAgKS51bmlmb3JtQ2hhbm5lbEZsYWdMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDYpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICd1X2NoYW5uZWxGbGFnJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDZcbiAgICAgICkudW5pZm9ybUJhc2VDb2xvckxvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoNikuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ3VfYmFzZUNvbG9yJ1xuICAgICAgKTtcblxuICAgICAgLy8g5LmX566X77yIUHJlbXVsdGlwbGllZEFscGhh77yJXG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICA3XG4gICAgICApLmF0dHJpYnV0ZVBvc2l0aW9uTG9jYXRpb24gPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDcpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdhX3Bvc2l0aW9uJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDdcbiAgICAgICkuYXR0cmlidXRlVGV4Q29vcmRMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoNykuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ2FfdGV4Q29vcmQnXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgN1xuICAgICAgKS5zYW1wbGVyVGV4dHVyZTBMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDcpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdzX3RleHR1cmUwJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoNykudW5pZm9ybU1hdHJpeExvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoNykuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ3VfbWF0cml4J1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDdcbiAgICAgICkudW5pZm9ybUJhc2VDb2xvckxvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoNykuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ3VfYmFzZUNvbG9yJ1xuICAgICAgKTtcblxuICAgICAgLy8g5LmX566X77yI44Kv44Oq44OD44OU44Oz44Kw44CBUHJlbXVsdGlwbGllZEFscGhh77yJXG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICA4XG4gICAgICApLmF0dHJpYnV0ZVBvc2l0aW9uTG9jYXRpb24gPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDgpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdhX3Bvc2l0aW9uJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDhcbiAgICAgICkuYXR0cmlidXRlVGV4Q29vcmRMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoOCkuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ2FfdGV4Q29vcmQnXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgOFxuICAgICAgKS5zYW1wbGVyVGV4dHVyZTBMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDgpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdzX3RleHR1cmUwJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDhcbiAgICAgICkuc2FtcGxlclRleHR1cmUxTG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg4KS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAnc190ZXh0dXJlMSdcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDgpLnVuaWZvcm1NYXRyaXhMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDgpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICd1X21hdHJpeCdcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICA4XG4gICAgICApLnVuaWZvcm1DbGlwTWF0cml4TG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg4KS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAndV9jbGlwTWF0cml4J1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDhcbiAgICAgICkudW5pZm9ybUNoYW5uZWxGbGFnTG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg4KS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAndV9jaGFubmVsRmxhZydcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICA4XG4gICAgICApLnVuaWZvcm1CYXNlQ29sb3JMb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDgpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICd1X2Jhc2VDb2xvcidcbiAgICAgICk7XG5cbiAgICAgIC8vIOS5l+eul++8iOOCr+ODquODg+ODlOODs+OCsOODu+WPjei7ouOAgVByZW11bHRpcGxpZWRBbHBoYe+8iVxuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgOVxuICAgICAgKS5hdHRyaWJ1dGVQb3NpdGlvbkxvY2F0aW9uID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg5KS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAnYV9wb3NpdGlvbidcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICA5XG4gICAgICApLmF0dHJpYnV0ZVRleENvb3JkTG9jYXRpb24gPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKFxuICAgICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KDkpLnNoYWRlclByb2dyYW0sXG4gICAgICAgICdhX3RleENvb3JkJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoXG4gICAgICAgIDlcbiAgICAgICkuc2FtcGxlclRleHR1cmUwTG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg5KS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAnc190ZXh0dXJlMCdcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICA5XG4gICAgICApLnNhbXBsZXJUZXh0dXJlMUxvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoOSkuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ3NfdGV4dHVyZTEnXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg5KS51bmlmb3JtTWF0cml4TG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg5KS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAndV9tYXRyaXgnXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgOVxuICAgICAgKS51bmlmb3JtQ2xpcE1hdHJpeExvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoOSkuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ3VfY2xpcE1hdHJpeCdcbiAgICAgICk7XG4gICAgICB0aGlzLl9zaGFkZXJTZXRzLmF0KFxuICAgICAgICA5XG4gICAgICApLnVuaWZvcm1DaGFubmVsRmxhZ0xvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgIHRoaXMuX3NoYWRlclNldHMuYXQoOSkuc2hhZGVyUHJvZ3JhbSxcbiAgICAgICAgJ3VfY2hhbm5lbEZsYWcnXG4gICAgICApO1xuICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdChcbiAgICAgICAgOVxuICAgICAgKS51bmlmb3JtQmFzZUNvbG9yTG9jYXRpb24gPSB0aGlzLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgdGhpcy5fc2hhZGVyU2V0cy5hdCg5KS5zaGFkZXJQcm9ncmFtLFxuICAgICAgICAndV9iYXNlQ29sb3InXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCt+OCp+ODvOODgOODl+ODreOCsOODqeODoOOCkuODreODvOODieOBl+OBpuOCouODieODrOOCueOCkui/lOOBmVxuICAgICAqIEBwYXJhbSB2ZXJ0ZXhTaGFkZXJTb3VyY2UgICAg6aCC54K544K344Kn44O844OA44Gu44K944O844K5XG4gICAgICogQHBhcmFtIGZyYWdtZW50U2hhZGVyU291cmNlICDjg5Xjg6njgrDjg6Hjg7Pjg4jjgrfjgqfjg7zjg4Djga7jgr3jg7zjgrlcbiAgICAgKiBAcmV0dXJuIOOCt+OCp+ODvOODgOODl+ODreOCsOODqeODoOOBruOCouODieODrOOCuVxuICAgICAqL1xuICAgIHB1YmxpYyBsb2FkU2hhZGVyUHJvZ3JhbShcbiAgICAgIHZlcnRleFNoYWRlclNvdXJjZTogc3RyaW5nLFxuICAgICAgZnJhZ21lbnRTaGFkZXJTb3VyY2U6IHN0cmluZ1xuICAgICk6IFdlYkdMUHJvZ3JhbSB7XG4gICAgICAvLyBDcmVhdGUgU2hhZGVyIFByb2dyYW1cbiAgICAgIGxldCBzaGFkZXJQcm9ncmFtOiBXZWJHTFByb2dyYW0gPSB0aGlzLmdsLmNyZWF0ZVByb2dyYW0oKTtcblxuICAgICAgbGV0IHZlcnRTaGFkZXIgPSB0aGlzLmNvbXBpbGVTaGFkZXJTb3VyY2UoXG4gICAgICAgIHRoaXMuZ2wuVkVSVEVYX1NIQURFUixcbiAgICAgICAgdmVydGV4U2hhZGVyU291cmNlXG4gICAgICApO1xuXG4gICAgICBpZiAoIXZlcnRTaGFkZXIpIHtcbiAgICAgICAgQ3ViaXNtTG9nRXJyb3IoJ1ZlcnRleCBzaGFkZXIgY29tcGlsZSBlcnJvciEnKTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIGxldCBmcmFnU2hhZGVyID0gdGhpcy5jb21waWxlU2hhZGVyU291cmNlKFxuICAgICAgICB0aGlzLmdsLkZSQUdNRU5UX1NIQURFUixcbiAgICAgICAgZnJhZ21lbnRTaGFkZXJTb3VyY2VcbiAgICAgICk7XG4gICAgICBpZiAoIWZyYWdTaGFkZXIpIHtcbiAgICAgICAgQ3ViaXNtTG9nRXJyb3IoJ1ZlcnRleCBzaGFkZXIgY29tcGlsZSBlcnJvciEnKTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIC8vIEF0dGFjaCB2ZXJ0ZXggc2hhZGVyIHRvIHByb2dyYW1cbiAgICAgIHRoaXMuZ2wuYXR0YWNoU2hhZGVyKHNoYWRlclByb2dyYW0sIHZlcnRTaGFkZXIpO1xuXG4gICAgICAvLyBBdHRhY2ggZnJhZ21lbnQgc2hhZGVyIHRvIHByb2dyYW1cbiAgICAgIHRoaXMuZ2wuYXR0YWNoU2hhZGVyKHNoYWRlclByb2dyYW0sIGZyYWdTaGFkZXIpO1xuXG4gICAgICAvLyBsaW5rIHByb2dyYW1cbiAgICAgIHRoaXMuZ2wubGlua1Byb2dyYW0oc2hhZGVyUHJvZ3JhbSk7XG4gICAgICBjb25zdCBsaW5rU3RhdHVzID0gdGhpcy5nbC5nZXRQcm9ncmFtUGFyYW1ldGVyKFxuICAgICAgICBzaGFkZXJQcm9ncmFtLFxuICAgICAgICB0aGlzLmdsLkxJTktfU1RBVFVTXG4gICAgICApO1xuXG4gICAgICAvLyDjg6rjg7Pjgq/jgavlpLHmlZfjgZfjgZ/jgonjgrfjgqfjg7zjg4Djg7zjgpLliYrpmaRcbiAgICAgIGlmICghbGlua1N0YXR1cykge1xuICAgICAgICBDdWJpc21Mb2dFcnJvcignRmFpbGVkIHRvIGxpbmsgcHJvZ3JhbTogezB9Jywgc2hhZGVyUHJvZ3JhbSk7XG5cbiAgICAgICAgdGhpcy5nbC5kZWxldGVTaGFkZXIodmVydFNoYWRlcik7XG4gICAgICAgIHZlcnRTaGFkZXIgPSAwO1xuXG4gICAgICAgIHRoaXMuZ2wuZGVsZXRlU2hhZGVyKGZyYWdTaGFkZXIpO1xuICAgICAgICBmcmFnU2hhZGVyID0gMDtcblxuICAgICAgICBpZiAoc2hhZGVyUHJvZ3JhbSkge1xuICAgICAgICAgIHRoaXMuZ2wuZGVsZXRlUHJvZ3JhbShzaGFkZXJQcm9ncmFtKTtcbiAgICAgICAgICBzaGFkZXJQcm9ncmFtID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWxlYXNlIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVycy5cbiAgICAgIHRoaXMuZ2wuZGVsZXRlU2hhZGVyKHZlcnRTaGFkZXIpO1xuICAgICAgdGhpcy5nbC5kZWxldGVTaGFkZXIoZnJhZ1NoYWRlcik7XG5cbiAgICAgIHJldHVybiBzaGFkZXJQcm9ncmFtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOOCt+OCp+ODvOODgOODvOODl+ODreOCsOODqeODoOOCkuOCs+ODs+ODkeOCpOODq+OBmeOCi1xuICAgICAqIEBwYXJhbSBzaGFkZXJUeXBlIOOCt+OCp+ODvOODgOOCv+OCpOODlyhWZXJ0ZXgvRnJhZ21lbnQpXG4gICAgICogQHBhcmFtIHNoYWRlclNvdXJjZSDjgrfjgqfjg7zjg4Djgr3jg7zjgrnjgrPjg7zjg4lcbiAgICAgKlxuICAgICAqIEByZXR1cm4g44Kz44Oz44OR44Kk44Or44GV44KM44Gf44K344Kn44O844OA44O844OX44Ot44Kw44Op44OgXG4gICAgICovXG4gICAgcHVibGljIGNvbXBpbGVTaGFkZXJTb3VyY2UoXG4gICAgICBzaGFkZXJUeXBlOiBHTGVudW0sXG4gICAgICBzaGFkZXJTb3VyY2U6IHN0cmluZ1xuICAgICk6IFdlYkdMUHJvZ3JhbSB7XG4gICAgICBjb25zdCBzb3VyY2U6IHN0cmluZyA9IHNoYWRlclNvdXJjZTtcblxuICAgICAgY29uc3Qgc2hhZGVyOiBXZWJHTFByb2dyYW0gPSB0aGlzLmdsLmNyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTtcbiAgICAgIHRoaXMuZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlKTtcbiAgICAgIHRoaXMuZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpO1xuXG4gICAgICBpZiAoIXNoYWRlcikge1xuICAgICAgICBjb25zdCBsb2c6IHN0cmluZyA9IHRoaXMuZ2wuZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpO1xuICAgICAgICBDdWJpc21Mb2dFcnJvcignU2hhZGVyIGNvbXBpbGUgbG9nOiB7MH0gJywgbG9nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhdHVzOiBhbnkgPSB0aGlzLmdsLmdldFNoYWRlclBhcmFtZXRlcihcbiAgICAgICAgc2hhZGVyLFxuICAgICAgICB0aGlzLmdsLkNPTVBJTEVfU1RBVFVTXG4gICAgICApO1xuICAgICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5nbC5kZWxldGVTaGFkZXIoc2hhZGVyKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzaGFkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEdsKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpOiB2b2lkIHtcbiAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICB9XG5cbiAgICBfc2hhZGVyU2V0czogY3NtVmVjdG9yPEN1YmlzbVNoYWRlclNldD47IC8vIOODreODvOODieOBl+OBn+OCt+OCp+ODvOODgOODvOODl+ODreOCsOODqeODoOOCkuS/neaMgeOBmeOCi+WkieaVsFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQ7IC8vIHdlYmds44Kz44Oz44OG44Kt44K544OIXG4gIH1cblxuICAvKipcbiAgICogQ3ViaXNtU2hhZGVyX1dlYkdM44Gu44Kk44Oz44OK44O844Kv44Op44K5XG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3ViaXNtU2hhZGVyU2V0IHtcbiAgICBzaGFkZXJQcm9ncmFtOiBXZWJHTFByb2dyYW07IC8vIOOCt+OCp+ODvOODgOODvOODl+ODreOCsOODqeODoOOBruOCouODieODrOOCuVxuICAgIGF0dHJpYnV0ZVBvc2l0aW9uTG9jYXRpb246IEdMdWludDsgLy8g44K344Kn44O844OA44O844OX44Ot44Kw44Op44Og44Gr5rih44GZ5aSJ5pWw44Gu44Ki44OJ44Os44K577yIUG9zaXRpb27vvIlcbiAgICBhdHRyaWJ1dGVUZXhDb29yZExvY2F0aW9uOiBHTHVpbnQ7IC8vIOOCt+OCp+ODvOODgOODvOODl+ODreOCsOODqeODoOOBq+a4oeOBmeWkieaVsOOBruOCouODieODrOOCue+8iFRleENvb3Jk77yJXG4gICAgdW5pZm9ybU1hdHJpeExvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjsgLy8g44K344Kn44O844OA44O844OX44Ot44Kw44Op44Og44Gr5rih44GZ5aSJ5pWw44Gu44Ki44OJ44Os44K577yITWF0cml477yJXG4gICAgdW5pZm9ybUNsaXBNYXRyaXhMb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb247IC8vIOOCt+OCp+ODvOODgOODvOODl+ODreOCsOODqeODoOOBq+a4oeOBmeWkieaVsOOBruOCouODieODrOOCue+8iENsaXBNYXRyaXjvvIlcbiAgICBzYW1wbGVyVGV4dHVyZTBMb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb247IC8vIOOCt+OCp+ODvOODgOODvOODl+ODreOCsOODqeODoOOBq+a4oeOBmeWkieaVsOOBruOCouODieODrOOCue+8iFRleHR1cmUw77yJXG4gICAgc2FtcGxlclRleHR1cmUxTG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uOyAvLyDjgrfjgqfjg7zjg4Djg7zjg5fjg63jgrDjg6njg6DjgavmuKHjgZnlpInmlbDjga7jgqLjg4njg6zjgrnvvIhUZXh0dXJlMe+8iVxuICAgIHVuaWZvcm1CYXNlQ29sb3JMb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb247IC8vIOOCt+OCp+ODvOODgOODvOODl+ODreOCsOODqeODoOOBq+a4oeOBmeWkieaVsOOBruOCouODieODrOOCue+8iEJhc2VDb2xvcu+8iVxuICAgIHVuaWZvcm1DaGFubmVsRmxhZ0xvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjsgLy8g44K344Kn44O844OA44O844OX44Ot44Kw44Op44Og44Gr5rih44GZ5aSJ5pWw44Gu44Ki44OJ44Os44K577yIQ2hhbm5lbEZsYWfvvIlcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIFNoYWRlck5hbWVzIHtcbiAgICAvLyBTZXR1cE1hc2tcbiAgICBTaGFkZXJOYW1lc19TZXR1cE1hc2ssXG5cbiAgICAvLyBOb3JtYWxcbiAgICBTaGFkZXJOYW1lc19Ob3JtYWxQcmVtdWx0aXBsaWVkQWxwaGEsXG4gICAgU2hhZGVyTmFtZXNfTm9ybWFsTWFza2VkUHJlbXVsdGlwbGllZEFscGhhLFxuICAgIFNoYWRlck5hbWVzX05vbXJhbE1hc2tlZEludmVydGVkUHJlbXVsdGlwbGllZEFscGhhLFxuXG4gICAgLy8gQWRkXG4gICAgU2hhZGVyTmFtZXNfQWRkUHJlbXVsdGlwbGllZEFscGhhLFxuICAgIFNoYWRlck5hbWVzX0FkZE1hc2tlZFByZW11bHRpcGxpZWRBbHBoYSxcbiAgICBTaGFkZXJOYW1lc19BZGRNYXNrZWRQcmVtdWx0aXBsaWVkQWxwaGFJbnZlcnRlZCxcblxuICAgIC8vIE11bHRcbiAgICBTaGFkZXJOYW1lc19NdWx0UHJlbXVsdGlwbGllZEFscGhhLFxuICAgIFNoYWRlck5hbWVzX011bHRNYXNrZWRQcmVtdWx0aXBsaWVkQWxwaGEsXG4gICAgU2hhZGVyTmFtZXNfTXVsdE1hc2tlZFByZW11bHRpcGxpZWRBbHBoYUludmVydGVkXG4gIH1cblxuICBleHBvcnQgY29uc3QgdmVydGV4U2hhZGVyU3JjU2V0dXBNYXNrID1cbiAgICAnYXR0cmlidXRlIHZlYzQgICAgIGFfcG9zaXRpb247JyArXG4gICAgJ2F0dHJpYnV0ZSB2ZWMyICAgICBhX3RleENvb3JkOycgK1xuICAgICd2YXJ5aW5nIHZlYzIgICAgICAgdl90ZXhDb29yZDsnICtcbiAgICAndmFyeWluZyB2ZWM0ICAgICAgIHZfbXlQb3M7JyArXG4gICAgJ3VuaWZvcm0gbWF0NCAgICAgICB1X2NsaXBNYXRyaXg7JyArXG4gICAgJ3ZvaWQgbWFpbigpJyArXG4gICAgJ3snICtcbiAgICAnICAgZ2xfUG9zaXRpb24gPSB1X2NsaXBNYXRyaXggKiBhX3Bvc2l0aW9uOycgK1xuICAgICcgICB2X215UG9zID0gdV9jbGlwTWF0cml4ICogYV9wb3NpdGlvbjsnICtcbiAgICAnICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7JyArXG4gICAgJyAgIHZfdGV4Q29vcmQueSA9IDEuMCAtIHZfdGV4Q29vcmQueTsnICtcbiAgICAnfSc7XG4gIGV4cG9ydCBjb25zdCBmcmFnbWVudFNoYWRlclNyY3NldHVwTWFzayA9XG4gICAgJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OycgK1xuICAgICd2YXJ5aW5nIHZlYzIgICAgICAgdl90ZXhDb29yZDsnICtcbiAgICAndmFyeWluZyB2ZWM0ICAgICAgIHZfbXlQb3M7JyArXG4gICAgJ3VuaWZvcm0gdmVjNCAgICAgICB1X2Jhc2VDb2xvcjsnICtcbiAgICAndW5pZm9ybSB2ZWM0ICAgICAgIHVfY2hhbm5lbEZsYWc7JyArXG4gICAgJ3VuaWZvcm0gc2FtcGxlcjJEICBzX3RleHR1cmUwOycgK1xuICAgICd2b2lkIG1haW4oKScgK1xuICAgICd7JyArXG4gICAgJyAgIGZsb2F0IGlzSW5zaWRlID0gJyArXG4gICAgJyAgICAgICBzdGVwKHVfYmFzZUNvbG9yLngsIHZfbXlQb3MueC92X215UG9zLncpJyArXG4gICAgJyAgICAgICAqIHN0ZXAodV9iYXNlQ29sb3IueSwgdl9teVBvcy55L3ZfbXlQb3MudyknICtcbiAgICAnICAgICAgICogc3RlcCh2X215UG9zLngvdl9teVBvcy53LCB1X2Jhc2VDb2xvci56KScgK1xuICAgICcgICAgICAgKiBzdGVwKHZfbXlQb3MueS92X215UG9zLncsIHVfYmFzZUNvbG9yLncpOycgK1xuICAgICcgICBnbF9GcmFnQ29sb3IgPSB1X2NoYW5uZWxGbGFnICogdGV4dHVyZTJEKHNfdGV4dHVyZTAsIHZfdGV4Q29vcmQpLmEgKiBpc0luc2lkZTsnICtcbiAgICAnfSc7XG5cbiAgLy8tLS0tLSDjg5Djg7zjg4bjg4Pjgq/jgrnjgrfjgqfjg7zjg4Djg5fjg63jgrDjg6njg6AgLS0tLS1cbiAgLy8gTm9ybWFsICYgQWRkICYgTXVsdCDlhbHpgJpcbiAgZXhwb3J0IGNvbnN0IHZlcnRleFNoYWRlclNyYyA9XG4gICAgJ2F0dHJpYnV0ZSB2ZWM0ICAgICBhX3Bvc2l0aW9uOycgKyAvL3YudmVydGV4XG4gICAgJ2F0dHJpYnV0ZSB2ZWMyICAgICBhX3RleENvb3JkOycgKyAvL3YudGV4Y29vcmRcbiAgICAndmFyeWluZyB2ZWMyICAgICAgIHZfdGV4Q29vcmQ7JyArIC8vdjJmLnRleGNvb3JkXG4gICAgJ3VuaWZvcm0gbWF0NCAgICAgICB1X21hdHJpeDsnICtcbiAgICAndm9pZCBtYWluKCknICtcbiAgICAneycgK1xuICAgICcgICBnbF9Qb3NpdGlvbiA9IHVfbWF0cml4ICogYV9wb3NpdGlvbjsnICtcbiAgICAnICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7JyArXG4gICAgJyAgIHZfdGV4Q29vcmQueSA9IDEuMCAtIHZfdGV4Q29vcmQueTsnICtcbiAgICAnfSc7XG5cbiAgLy8gTm9ybWFsICYgQWRkICYgTXVsdCDlhbHpgJrvvIjjgq/jg6rjg4Pjg5Tjg7PjgrDjgZXjgozjgZ/jgoLjga7jga7mj4/nlLvnlKjvvIlcbiAgZXhwb3J0IGNvbnN0IHZlcnRleFNoYWRlclNyY01hc2tlZCA9XG4gICAgJ2F0dHJpYnV0ZSB2ZWM0ICAgICBhX3Bvc2l0aW9uOycgK1xuICAgICdhdHRyaWJ1dGUgdmVjMiAgICAgYV90ZXhDb29yZDsnICtcbiAgICAndmFyeWluZyB2ZWMyICAgICAgIHZfdGV4Q29vcmQ7JyArXG4gICAgJ3ZhcnlpbmcgdmVjNCAgICAgICB2X2NsaXBQb3M7JyArXG4gICAgJ3VuaWZvcm0gbWF0NCAgICAgICB1X21hdHJpeDsnICtcbiAgICAndW5pZm9ybSBtYXQ0ICAgICAgIHVfY2xpcE1hdHJpeDsnICtcbiAgICAndm9pZCBtYWluKCknICtcbiAgICAneycgK1xuICAgICcgICBnbF9Qb3NpdGlvbiA9IHVfbWF0cml4ICogYV9wb3NpdGlvbjsnICtcbiAgICAnICAgdl9jbGlwUG9zID0gdV9jbGlwTWF0cml4ICogYV9wb3NpdGlvbjsnICtcbiAgICAnICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7JyArXG4gICAgJyAgIHZfdGV4Q29vcmQueSA9IDEuMCAtIHZfdGV4Q29vcmQueTsnICtcbiAgICAnfSc7XG5cbiAgLy8tLS0tLSDjg5Xjg6njgrDjg6Hjg7Pjg4jjgrfjgqfjg7zjg4Djg5fjg63jgrDjg6njg6AgLS0tLS1cbiAgLy8gTm9ybWFsICYgQWRkICYgTXVsdCDlhbHpgJog77yIUHJlbXVsdGlwbGllZEFscGhh77yJXG4gIGV4cG9ydCBjb25zdCBmcmFnbWVudFNoYWRlclNyY1ByZW11bHRpcGxpZWRBbHBoYSA9XG4gICAgJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OycgK1xuICAgICd2YXJ5aW5nIHZlYzIgICAgICAgdl90ZXhDb29yZDsnICsgLy92MmYudGV4Y29vcmRcbiAgICAndW5pZm9ybSB2ZWM0ICAgICAgIHVfYmFzZUNvbG9yOycgK1xuICAgICd1bmlmb3JtIHNhbXBsZXIyRCAgc190ZXh0dXJlMDsnICsgLy9fTWFpblRleFxuICAgICd2b2lkIG1haW4oKScgK1xuICAgICd7JyArXG4gICAgJyAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRChzX3RleHR1cmUwICwgdl90ZXhDb29yZCkgKiB1X2Jhc2VDb2xvcjsnICtcbiAgICAnfSc7XG5cbiAgLy8gTm9ybWFsIO+8iOOCr+ODquODg+ODlOODs+OCsOOBleOCjOOBn+OCguOBruOBruaPj+eUu+eUqOOAgVByZW11bHRpcGxpZWRBbHBoYeWFvOeUqO+8iVxuICBleHBvcnQgY29uc3QgZnJhZ21lbnRTaGFkZXJTcmNNYXNrUHJlbXVsdGlwbGllZEFscGhhID1cbiAgICAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7JyArXG4gICAgJ3ZhcnlpbmcgdmVjMiAgICAgICB2X3RleENvb3JkOycgK1xuICAgICd2YXJ5aW5nIHZlYzQgICAgICAgdl9jbGlwUG9zOycgK1xuICAgICd1bmlmb3JtIHZlYzQgICAgICAgdV9iYXNlQ29sb3I7JyArXG4gICAgJ3VuaWZvcm0gdmVjNCAgICAgICB1X2NoYW5uZWxGbGFnOycgK1xuICAgICd1bmlmb3JtIHNhbXBsZXIyRCAgc190ZXh0dXJlMDsnICtcbiAgICAndW5pZm9ybSBzYW1wbGVyMkQgIHNfdGV4dHVyZTE7JyArXG4gICAgJ3ZvaWQgbWFpbigpJyArXG4gICAgJ3snICtcbiAgICAnICAgdmVjNCBjb2xfZm9ybWFzayA9IHRleHR1cmUyRChzX3RleHR1cmUwICwgdl90ZXhDb29yZCkgKiB1X2Jhc2VDb2xvcjsnICtcbiAgICAnICAgdmVjNCBjbGlwTWFzayA9ICgxLjAgLSB0ZXh0dXJlMkQoc190ZXh0dXJlMSwgdl9jbGlwUG9zLnh5IC8gdl9jbGlwUG9zLncpKSAqIHVfY2hhbm5lbEZsYWc7JyArXG4gICAgJyAgIGZsb2F0IG1hc2tWYWwgPSBjbGlwTWFzay5yICsgY2xpcE1hc2suZyArIGNsaXBNYXNrLmIgKyBjbGlwTWFzay5hOycgK1xuICAgICcgICBjb2xfZm9ybWFzayA9IGNvbF9mb3JtYXNrICogbWFza1ZhbDsnICtcbiAgICAnICAgZ2xfRnJhZ0NvbG9yID0gY29sX2Zvcm1hc2s7JyArXG4gICAgJ30nO1xuXG4gIC8vIE5vcm1hbCAmIEFkZCAmIE11bHQg5YWx6YCa77yI44Kv44Oq44OD44OU44Oz44Kw44GV44KM44Gm5Y+N6Lui5L2/55So44Gu5o+P55S755So44CBUHJlbXVsdGlwbGllZEFscGhh44Gu5aC05ZCI77yJXG4gIGV4cG9ydCBjb25zdCBmcmFnbWVudFNoYWRlclNyY01hc2tJbnZlcnRlZFByZW11bHRpcGxpZWRBbHBoYSA9XG4gICAgJ3ByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OycgK1xuICAgICd2YXJ5aW5nIHZlYzIgdl90ZXhDb29yZDsnICtcbiAgICAndmFyeWluZyB2ZWM0IHZfY2xpcFBvczsnICtcbiAgICAndW5pZm9ybSBzYW1wbGVyMkQgc190ZXh0dXJlMDsnICtcbiAgICAndW5pZm9ybSBzYW1wbGVyMkQgc190ZXh0dXJlMTsnICtcbiAgICAndW5pZm9ybSB2ZWM0IHVfY2hhbm5lbEZsYWc7JyArXG4gICAgJ3VuaWZvcm0gdmVjNCB1X2Jhc2VDb2xvcjsnICtcbiAgICAndm9pZCBtYWluKCknICtcbiAgICAneycgK1xuICAgICd2ZWM0IGNvbF9mb3JtYXNrID0gdGV4dHVyZTJEKHNfdGV4dHVyZTAsIHZfdGV4Q29vcmQpICogdV9iYXNlQ29sb3I7JyArXG4gICAgJ3ZlYzQgY2xpcE1hc2sgPSAoMS4wIC0gdGV4dHVyZTJEKHNfdGV4dHVyZTEsIHZfY2xpcFBvcy54eSAvIHZfY2xpcFBvcy53KSkgKiB1X2NoYW5uZWxGbGFnOycgK1xuICAgICdmbG9hdCBtYXNrVmFsID0gY2xpcE1hc2suciArIGNsaXBNYXNrLmcgKyBjbGlwTWFzay5iICsgY2xpcE1hc2suYTsnICtcbiAgICAnY29sX2Zvcm1hc2sgPSBjb2xfZm9ybWFzayAqICgxLjAgLSBtYXNrVmFsKTsnICtcbiAgICAnZ2xfRnJhZ0NvbG9yID0gY29sX2Zvcm1hc2s7JyArXG4gICAgJ30nO1xuXG4gIC8qKlxuICAgKiBXZWJHTOeUqOOBruaPj+eUu+WRveS7pOOCkuWun+ijheOBl+OBn+OCr+ODqeOCuVxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbVJlbmRlcmVyX1dlYkdMIGV4dGVuZHMgQ3ViaXNtUmVuZGVyZXIge1xuICAgIC8qKlxuICAgICAqIOODrOODs+ODgOODqeOBruWIneacn+WMluWHpueQhuOCkuWun+ihjOOBmeOCi1xuICAgICAqIOW8leaVsOOBq+a4oeOBl+OBn+ODouODh+ODq+OBi+OCieODrOODs+ODgOODqeOBruWIneacn+WMluWHpueQhuOBq+W/heimgeOBquaDheWgseOCkuWPluOCiuWHuuOBmeOBk+OBqOOBjOOBp+OBjeOCi1xuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGVsIOODouODh+ODq+OBruOCpOODs+OCueOCv+ODs+OCuVxuICAgICAqL1xuICAgIHB1YmxpYyBpbml0aWFsaXplKG1vZGVsOiBDdWJpc21Nb2RlbCk6IHZvaWQge1xuICAgICAgaWYgKG1vZGVsLmlzVXNpbmdNYXNraW5nKCkpIHtcbiAgICAgICAgdGhpcy5fY2xpcHBpbmdNYW5hZ2VyID0gbmV3IEN1YmlzbUNsaXBwaW5nTWFuYWdlcl9XZWJHTCgpOyAvLyDjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jg7vjg5Djg4Pjg5XjgqHliY3lh6bnkIbmlrnlvI/jgpLliJ3mnJ/ljJZcbiAgICAgICAgdGhpcy5fY2xpcHBpbmdNYW5hZ2VyLmluaXRpYWxpemUoXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgbW9kZWwuZ2V0RHJhd2FibGVDb3VudCgpLFxuICAgICAgICAgIG1vZGVsLmdldERyYXdhYmxlTWFza3MoKSxcbiAgICAgICAgICBtb2RlbC5nZXREcmF3YWJsZU1hc2tDb3VudHMoKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zb3J0ZWREcmF3YWJsZUluZGV4TGlzdC5yZXNpemUobW9kZWwuZ2V0RHJhd2FibGVDb3VudCgpLCAwKTtcblxuICAgICAgc3VwZXIuaW5pdGlhbGl6ZShtb2RlbCk7IC8vIOimquOCr+ODqeOCueOBruWHpueQhuOCkuWRvOOBtlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdlYkdM44OG44Kv44K544OB44Oj44Gu44OQ44Kk44Oz44OJ5Yem55CGXG4gICAgICogQ3ViaXNtUmVuZGVyZXLjgavjg4bjgq/jgrnjg4Hjg6PjgpLoqK3lrprjgZfjgIFDdWJpc21SZW5kZXJlcuWGheOBp+OBneOBrueUu+WDj+OCkuWPgueFp+OBmeOCi+OBn+OCgeOBrkluZGV45YCk44KS5oi744KK5YCk44Go44GZ44KLXG4gICAgICogQHBhcmFtIG1vZGVsVGV4dHVyZU5vIOOCu+ODg+ODiOOBmeOCi+ODouODh+ODq+ODhuOCr+OCueODgeODo+OBrueVquWPt1xuICAgICAqIEBwYXJhbSBnbFRleHR1cmVObyBXZWJHTOODhuOCr+OCueODgeODo+OBrueVquWPt1xuICAgICAqL1xuICAgIHB1YmxpYyBiaW5kVGV4dHVyZShtb2RlbFRleHR1cmVObzogbnVtYmVyLCBnbFRleHR1cmU6IFdlYkdMVGV4dHVyZSk6IHZvaWQge1xuICAgICAgdGhpcy5fdGV4dHVyZXMuc2V0VmFsdWUobW9kZWxUZXh0dXJlTm8sIGdsVGV4dHVyZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2ViR0zjgavjg5DjgqTjg7Pjg4njgZXjgozjgZ/jg4bjgq/jgrnjg4Hjg6Pjga7jg6rjgrnjg4jjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJuIOODhuOCr+OCueODgeODo+OBruODquOCueODiFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCaW5kZWRUZXh0dXJlcygpOiBjc21NYXA8bnVtYmVyLCBXZWJHTFRleHR1cmU+IHtcbiAgICAgIHJldHVybiB0aGlzLl90ZXh0dXJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jg5Djg4Pjg5XjgqHjga7jgrXjgqTjgrrjgpLoqK3lrprjgZnjgotcbiAgICAgKiDjg57jgrnjgq/nlKjjga5GcmFtZUJ1ZmZlcuOCkuegtOajhOOAgeWGjeS9nOaIkOOBmeOCi+eCuuWHpueQhuOCs+OCueODiOOBr+mrmOOBhFxuICAgICAqIEBwYXJhbSBzaXplIOOCr+ODquODg+ODlOODs+OCsOODnuOCueOCr+ODkOODg+ODleOCoeOBruOCteOCpOOCulxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRDbGlwcGluZ01hc2tCdWZmZXJTaXplKHNpemU6IG51bWJlcikge1xuICAgICAgLy8gRnJhbWVCdWZmZXLjga7jgrXjgqTjgrrjgpLlpInmm7TjgZnjgovjgZ/jgoHjgavjgqTjg7Pjgrnjgr/jg7PjgrnjgpLnoLTmo4Tjg7vlho3kvZzmiJDjgZnjgotcbiAgICAgIHRoaXMuX2NsaXBwaW5nTWFuYWdlci5yZWxlYXNlKCk7XG4gICAgICB0aGlzLl9jbGlwcGluZ01hbmFnZXIgPSB2b2lkIDA7XG4gICAgICB0aGlzLl9jbGlwcGluZ01hbmFnZXIgPSBudWxsO1xuXG4gICAgICB0aGlzLl9jbGlwcGluZ01hbmFnZXIgPSBuZXcgQ3ViaXNtQ2xpcHBpbmdNYW5hZ2VyX1dlYkdMKCk7XG5cbiAgICAgIHRoaXMuX2NsaXBwaW5nTWFuYWdlci5zZXRDbGlwcGluZ01hc2tCdWZmZXJTaXplKHNpemUpO1xuXG4gICAgICB0aGlzLl9jbGlwcGluZ01hbmFnZXIuaW5pdGlhbGl6ZShcbiAgICAgICAgdGhpcy5nZXRNb2RlbCgpLFxuICAgICAgICB0aGlzLmdldE1vZGVsKCkuZ2V0RHJhd2FibGVDb3VudCgpLFxuICAgICAgICB0aGlzLmdldE1vZGVsKCkuZ2V0RHJhd2FibGVNYXNrcygpLFxuICAgICAgICB0aGlzLmdldE1vZGVsKCkuZ2V0RHJhd2FibGVNYXNrQ291bnRzKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kv44Oq44OD44OU44Oz44Kw44Oe44K544Kv44OQ44OD44OV44Kh44Gu44K144Kk44K644KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jg5Djg4Pjg5XjgqHjga7jgrXjgqTjgrpcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2xpcHBpbmdNYXNrQnVmZmVyU2l6ZSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuX2NsaXBwaW5nTWFuYWdlci5nZXRDbGlwcGluZ01hc2tCdWZmZXJTaXplKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kz44Oz44K544OI44Op44Kv44K/XG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIHRoaXMuX2NsaXBwaW5nQ29udGV4dEJ1ZmZlckZvck1hc2sgPSBudWxsO1xuICAgICAgdGhpcy5fY2xpcHBpbmdDb250ZXh0QnVmZmVyRm9yRHJhdyA9IG51bGw7XG4gICAgICB0aGlzLl9jbGlwcGluZ01hbmFnZXIgPSBuZXcgQ3ViaXNtQ2xpcHBpbmdNYW5hZ2VyX1dlYkdMKCk7XG4gICAgICB0aGlzLmZpcnN0RHJhdyA9IHRydWU7XG4gICAgICB0aGlzLl90ZXh0dXJlcyA9IG5ldyBjc21NYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgICB0aGlzLl9zb3J0ZWREcmF3YWJsZUluZGV4TGlzdCA9IG5ldyBjc21WZWN0b3I8bnVtYmVyPigpO1xuICAgICAgdGhpcy5fYnVmZmVyRGF0YSA9IHtcbiAgICAgICAgdmVydGV4OiBXZWJHTEJ1ZmZlciA9IG51bGwsXG4gICAgICAgIHV2OiBXZWJHTEJ1ZmZlciA9IG51bGwsXG4gICAgICAgIGluZGV4OiBXZWJHTEJ1ZmZlciA9IG51bGxcbiAgICAgIH07XG5cbiAgICAgIC8vIOODhuOCr+OCueODgeODo+WvvuW/nOODnuODg+ODl+OBruWuuemHj+OCkueiuuS/neOBl+OBpuOBiuOBj1xuICAgICAgdGhpcy5fdGV4dHVyZXMucHJlcGFyZUNhcGFjaXR5KDMyLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg4fjgrnjg4jjg6njgq/jgr/nm7jlvZPjga7lh6bnkIZcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuX2NsaXBwaW5nTWFuYWdlci5yZWxlYXNlKCk7XG4gICAgICB0aGlzLl9jbGlwcGluZ01hbmFnZXIgPSB2b2lkIDA7XG4gICAgICB0aGlzLl9jbGlwcGluZ01hbmFnZXIgPSBudWxsO1xuXG4gICAgICB0aGlzLmdsLmRlbGV0ZUJ1ZmZlcih0aGlzLl9idWZmZXJEYXRhLnZlcnRleCk7XG4gICAgICB0aGlzLl9idWZmZXJEYXRhLnZlcnRleCA9IG51bGw7XG4gICAgICB0aGlzLmdsLmRlbGV0ZUJ1ZmZlcih0aGlzLl9idWZmZXJEYXRhLnV2KTtcbiAgICAgIHRoaXMuX2J1ZmZlckRhdGEudXYgPSBudWxsO1xuICAgICAgdGhpcy5nbC5kZWxldGVCdWZmZXIodGhpcy5fYnVmZmVyRGF0YS5pbmRleCk7XG4gICAgICB0aGlzLl9idWZmZXJEYXRhLmluZGV4ID0gbnVsbDtcbiAgICAgIHRoaXMuX2J1ZmZlckRhdGEgPSBudWxsO1xuXG4gICAgICB0aGlzLl90ZXh0dXJlcyA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44OH44Or44KS5o+P55S744GZ44KL5a6f6Zqb44Gu5Yem55CGXG4gICAgICovXG4gICAgcHVibGljIGRvRHJhd01vZGVsKCk6IHZvaWQge1xuICAgICAgLy8tLS0tLS0tLS0tLS0g44Kv44Oq44OD44OU44Oz44Kw44Oe44K544Kv44O744OQ44OD44OV44Kh5YmN5Yem55CG5pa55byP44Gu5aC05ZCIIC0tLS0tLS0tLS0tLVxuICAgICAgaWYgKHRoaXMuX2NsaXBwaW5nTWFuYWdlciAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMucHJlRHJhdygpO1xuICAgICAgICB0aGlzLl9jbGlwcGluZ01hbmFnZXIuc2V0dXBDbGlwcGluZ0NvbnRleHQodGhpcy5nZXRNb2RlbCgpLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgLy8g5LiK6KiY44Kv44Oq44OD44OU44Oz44Kw5Yem55CG5YaF44Gn44KC5LiA5bqmUHJlRHJhd+OCkuWRvOOBtuOBruOBp+azqOaEjyEhXG4gICAgICB0aGlzLnByZURyYXcoKTtcblxuICAgICAgY29uc3QgZHJhd2FibGVDb3VudDogbnVtYmVyID0gdGhpcy5nZXRNb2RlbCgpLmdldERyYXdhYmxlQ291bnQoKTtcbiAgICAgIGNvbnN0IHJlbmRlck9yZGVyOiBJbnQzMkFycmF5ID0gdGhpcy5nZXRNb2RlbCgpLmdldERyYXdhYmxlUmVuZGVyT3JkZXJzKCk7XG5cbiAgICAgIC8vIOOCpOODs+ODh+ODg+OCr+OCueOCkuaPj+eUu+mghuOBp+OCveODvOODiFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkcmF3YWJsZUNvdW50OyArK2kpIHtcbiAgICAgICAgY29uc3Qgb3JkZXI6IG51bWJlciA9IHJlbmRlck9yZGVyW2ldO1xuICAgICAgICB0aGlzLl9zb3J0ZWREcmF3YWJsZUluZGV4TGlzdC5zZXQob3JkZXIsIGkpO1xuICAgICAgfVxuXG4gICAgICAvLyDmj4/nlLtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZHJhd2FibGVDb3VudDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGRyYXdhYmxlSW5kZXg6IG51bWJlciA9IHRoaXMuX3NvcnRlZERyYXdhYmxlSW5kZXhMaXN0LmF0KGkpO1xuXG4gICAgICAgIC8vIERyYXdhYmxl44GM6KGo56S654q25oWL44Gn44Gq44GR44KM44Gw5Yem55CG44KS44OR44K544GZ44KLXG4gICAgICAgIGlmICghdGhpcy5nZXRNb2RlbCgpLmdldERyYXdhYmxlRHluYW1pY0ZsYWdJc1Zpc2libGUoZHJhd2FibGVJbmRleCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOOCr+ODquODg+ODlOODs+OCsOODnuOCueOCr+OCkuOCu+ODg+ODiOOBmeOCi1xuICAgICAgICB0aGlzLnNldENsaXBwaW5nQ29udGV4dEJ1ZmZlckZvckRyYXcoXG4gICAgICAgICAgdGhpcy5fY2xpcHBpbmdNYW5hZ2VyICE9IG51bGxcbiAgICAgICAgICAgID8gdGhpcy5fY2xpcHBpbmdNYW5hZ2VyXG4gICAgICAgICAgICAgICAgLmdldENsaXBwaW5nQ29udGV4dExpc3RGb3JEcmF3KClcbiAgICAgICAgICAgICAgICAuYXQoZHJhd2FibGVJbmRleClcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuc2V0SXNDdWxsaW5nKHRoaXMuZ2V0TW9kZWwoKS5nZXREcmF3YWJsZUN1bGxpbmcoZHJhd2FibGVJbmRleCkpO1xuXG4gICAgICAgIHRoaXMuZHJhd01lc2goXG4gICAgICAgICAgdGhpcy5nZXRNb2RlbCgpLmdldERyYXdhYmxlVGV4dHVyZUluZGljZXMoZHJhd2FibGVJbmRleCksXG4gICAgICAgICAgdGhpcy5nZXRNb2RlbCgpLmdldERyYXdhYmxlVmVydGV4SW5kZXhDb3VudChkcmF3YWJsZUluZGV4KSxcbiAgICAgICAgICB0aGlzLmdldE1vZGVsKCkuZ2V0RHJhd2FibGVWZXJ0ZXhDb3VudChkcmF3YWJsZUluZGV4KSxcbiAgICAgICAgICB0aGlzLmdldE1vZGVsKCkuZ2V0RHJhd2FibGVWZXJ0ZXhJbmRpY2VzKGRyYXdhYmxlSW5kZXgpLFxuICAgICAgICAgIHRoaXMuZ2V0TW9kZWwoKS5nZXREcmF3YWJsZVZlcnRpY2VzKGRyYXdhYmxlSW5kZXgpLFxuICAgICAgICAgIHRoaXMuZ2V0TW9kZWwoKS5nZXREcmF3YWJsZVZlcnRleFV2cyhkcmF3YWJsZUluZGV4KSxcbiAgICAgICAgICB0aGlzLmdldE1vZGVsKCkuZ2V0RHJhd2FibGVPcGFjaXR5KGRyYXdhYmxlSW5kZXgpLFxuICAgICAgICAgIHRoaXMuZ2V0TW9kZWwoKS5nZXREcmF3YWJsZUJsZW5kTW9kZShkcmF3YWJsZUluZGV4KSxcbiAgICAgICAgICB0aGlzLmdldE1vZGVsKCkuZ2V0RHJhd2FibGVJbnZlcnRlZE1hc2tCaXQoZHJhd2FibGVJbmRleClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBb44Kq44O844OQ44O844Op44Kk44OJXVxuICAgICAqIOaPj+eUu+OCquODluOCuOOCp+OCr+ODiO+8iOOCouODvOODiOODoeODg+OCt+ODpe+8ieOCkuaPj+eUu+OBmeOCi+OAglxuICAgICAqIOODneODquOCtOODs+ODoeODg+OCt+ODpeOBqOODhuOCr+OCueODgeODo+eVquWPt+OCkuOCu+ODg+ODiOOBp+a4oeOBmeOAglxuICAgICAqIEBwYXJhbSB0ZXh0dXJlTm8g5o+P55S744GZ44KL44OG44Kv44K544OB44Oj55Wq5Y+3XG4gICAgICogQHBhcmFtIGluZGV4Q291bnQg5o+P55S744Kq44OW44K444Kn44Kv44OI44Gu44Kk44Oz44OH44OD44Kv44K55YCkXG4gICAgICogQHBhcmFtIHZlcnRleENvdW50IOODneODquOCtOODs+ODoeODg+OCt+ODpeOBrumggueCueaVsFxuICAgICAqIEBwYXJhbSBpbmRleEFycmF5IOODneODquOCtOODs+ODoeODg+OCt+ODpeOBruOCpOODs+ODh+ODg+OCr+OCuemFjeWIl1xuICAgICAqIEBwYXJhbSB2ZXJ0ZXhBcnJheSDjg53jg6rjgrTjg7Pjg6Hjg4Pjgrfjg6Xjga7poILngrnphY3liJdcbiAgICAgKiBAcGFyYW0gdXZBcnJheSB1dumFjeWIl1xuICAgICAqIEBwYXJhbSBvcGFjaXR5IOS4jemAj+aYjuW6plxuICAgICAqIEBwYXJhbSBjb2xvckJsZW5kTW9kZSDjgqvjg6njg7zlkIjmiJDjgr/jgqTjg5dcbiAgICAgKiBAcGFyYW0gaW52ZXJ0ZWRNYXNrIOODnuOCueOCr+S9v+eUqOaZguOBruODnuOCueOCr+OBruWPjei7ouS9v+eUqFxuICAgICAqL1xuICAgIHB1YmxpYyBkcmF3TWVzaChcbiAgICAgIHRleHR1cmVObzogbnVtYmVyLFxuICAgICAgaW5kZXhDb3VudDogbnVtYmVyLFxuICAgICAgdmVydGV4Q291bnQ6IG51bWJlcixcbiAgICAgIGluZGV4QXJyYXk6IFVpbnQxNkFycmF5LFxuICAgICAgdmVydGV4QXJyYXk6IEZsb2F0MzJBcnJheSxcbiAgICAgIHV2QXJyYXk6IEZsb2F0MzJBcnJheSxcbiAgICAgIG9wYWNpdHk6IG51bWJlcixcbiAgICAgIGNvbG9yQmxlbmRNb2RlOiBDdWJpc21CbGVuZE1vZGUsXG4gICAgICBpbnZlcnRlZE1hc2s6IGJvb2xlYW5cbiAgICApOiB2b2lkIHtcbiAgICAgIC8vIOijj+mdouaPj+eUu+OBruacieWKueODu+eEoeWKuVxuICAgICAgaWYgKHRoaXMuaXNDdWxsaW5nKCkpIHtcbiAgICAgICAgdGhpcy5nbC5lbmFibGUodGhpcy5nbC5DVUxMX0ZBQ0UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nbC5kaXNhYmxlKHRoaXMuZ2wuQ1VMTF9GQUNFKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5nbC5mcm9udEZhY2UodGhpcy5nbC5DQ1cpOyAvLyBDdWJpc20gU0RLIE9wZW5HTOOBr+ODnuOCueOCr+ODu+OCouODvOODiOODoeODg+OCt+ODpeWFseOBq0NDV+OBjOihqOmdolxuXG4gICAgICBjb25zdCBtb2RlbENvbG9yUkdCQTogQ3ViaXNtVGV4dHVyZUNvbG9yID0gdGhpcy5nZXRNb2RlbENvbG9yKCk7XG5cbiAgICAgIGlmICh0aGlzLmdldENsaXBwaW5nQ29udGV4dEJ1ZmZlckZvck1hc2soKSA9PSBudWxsKSB7XG4gICAgICAgIC8vIOODnuOCueOCr+eUn+aIkOaZguS7peWkllxuICAgICAgICBtb2RlbENvbG9yUkdCQS5BICo9IG9wYWNpdHk7XG4gICAgICAgIGlmICh0aGlzLmlzUHJlbXVsdGlwbGllZEFscGhhKCkpIHtcbiAgICAgICAgICBtb2RlbENvbG9yUkdCQS5SICo9IG1vZGVsQ29sb3JSR0JBLkE7XG4gICAgICAgICAgbW9kZWxDb2xvclJHQkEuRyAqPSBtb2RlbENvbG9yUkdCQS5BO1xuICAgICAgICAgIG1vZGVsQ29sb3JSR0JBLkIgKj0gbW9kZWxDb2xvclJHQkEuQTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgZHJhd3RleHR1cmU6IFdlYkdMVGV4dHVyZTsgLy8g44K344Kn44O844OA44Gr5rih44GZ44OG44Kv44K544OB44OjXG5cbiAgICAgIC8vIOODhuOCr+OCueODgeODo+ODnuODg+ODl+OBi+OCieODkOOCpOODs+ODiea4iOOBv+ODhuOCr+OCueODgeODo++8qe+8pOOCkuWPluW+l1xuICAgICAgLy8g44OQ44Kk44Oz44OJ44GV44KM44Gm44GE44Gq44GR44KM44Gw44OA44Of44O844Gu44OG44Kv44K544OB44OjSUTjgpLjgrvjg4Pjg4jjgZnjgotcbiAgICAgIGlmICh0aGlzLl90ZXh0dXJlcy5nZXRWYWx1ZSh0ZXh0dXJlTm8pICE9IG51bGwpIHtcbiAgICAgICAgZHJhd3RleHR1cmUgPSB0aGlzLl90ZXh0dXJlcy5nZXRWYWx1ZSh0ZXh0dXJlTm8pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJhd3RleHR1cmUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBDdWJpc21TaGFkZXJfV2ViR0wuZ2V0SW5zdGFuY2UoKS5zZXR1cFNoYWRlclByb2dyYW0oXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGRyYXd0ZXh0dXJlLFxuICAgICAgICB2ZXJ0ZXhDb3VudCxcbiAgICAgICAgdmVydGV4QXJyYXksXG4gICAgICAgIGluZGV4QXJyYXksXG4gICAgICAgIHV2QXJyYXksXG4gICAgICAgIHRoaXMuX2J1ZmZlckRhdGEsXG4gICAgICAgIG9wYWNpdHksXG4gICAgICAgIGNvbG9yQmxlbmRNb2RlLFxuICAgICAgICBtb2RlbENvbG9yUkdCQSxcbiAgICAgICAgdGhpcy5pc1ByZW11bHRpcGxpZWRBbHBoYSgpLFxuICAgICAgICB0aGlzLmdldE12cE1hdHJpeCgpLFxuICAgICAgICBpbnZlcnRlZE1hc2tcbiAgICAgICk7XG5cbiAgICAgIC8vIOODneODquOCtOODs+ODoeODg+OCt+ODpeOCkuaPj+eUu+OBmeOCi1xuICAgICAgdGhpcy5nbC5kcmF3RWxlbWVudHMoXG4gICAgICAgIHRoaXMuZ2wuVFJJQU5HTEVTLFxuICAgICAgICBpbmRleENvdW50LFxuICAgICAgICB0aGlzLmdsLlVOU0lHTkVEX1NIT1JULFxuICAgICAgICAwXG4gICAgICApO1xuXG4gICAgICAvLyDlvozlh6bnkIZcbiAgICAgIHRoaXMuZ2wudXNlUHJvZ3JhbShudWxsKTtcbiAgICAgIHRoaXMuc2V0Q2xpcHBpbmdDb250ZXh0QnVmZmVyRm9yRHJhdyhudWxsKTtcbiAgICAgIHRoaXMuc2V0Q2xpcHBpbmdDb250ZXh0QnVmZmVyRm9yTWFzayhudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6zjg7Pjg4Djg6njgYzkv53mjIHjgZnjgovpnZnnmoTjgarjg6rjgr3jg7zjgrnjgpLop6PmlL7jgZnjgotcbiAgICAgKiBXZWJHTOOBrumdmeeahOOBquOCt+OCp+ODvOODgOODvOODl+ODreOCsOODqeODoOOCkuino+aUvuOBmeOCi1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZG9TdGF0aWNSZWxlYXNlKCk6IHZvaWQge1xuICAgICAgQ3ViaXNtU2hhZGVyX1dlYkdMLmRlbGV0ZUluc3RhbmNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Os44Oz44OA44O844K544OG44O844OI44KS6Kit5a6a44GZ44KLXG4gICAgICogQHBhcmFtIGZibyDjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PlgbTjgafmjIflrprjgZfjgabjgYTjgovjg5Xjg6zjg7zjg6Djg5Djg4Pjg5XjgqFcbiAgICAgKiBAcGFyYW0gdmlld3BvcnQg44OT44Ol44O844Od44O844OIXG4gICAgICovXG4gICAgcHVibGljIHNldFJlbmRlclN0YXRlKGZibzogV2ViR0xGcmFtZWJ1ZmZlciwgdmlld3BvcnQ6IG51bWJlcltdKTogdm9pZCB7XG4gICAgICBzX2ZibyA9IGZibztcbiAgICAgIHNfdmlld3BvcnQgPSB2aWV3cG9ydDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmj4/nlLvplovlp4vmmYLjga7ov73liqDlh6bnkIZcbiAgICAgKiDjg6Ljg4fjg6vjgpLmj4/nlLvjgZnjgovliY3jgavjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/jgavlv4XopoHjgarlh6bnkIbjgpLlrp/oo4XjgZfjgabjgYTjgotcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlRHJhdygpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmZpcnN0RHJhdykge1xuICAgICAgICB0aGlzLmZpcnN0RHJhdyA9IGZhbHNlO1xuXG4gICAgICAgIC8vIOaLoeW8teapn+iDveOCkuacieWKueOBq+OBmeOCi1xuICAgICAgICB0aGlzLl9hbmlzb3J0b3B5ID1cbiAgICAgICAgICB0aGlzLmdsLmdldEV4dGVuc2lvbignRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJykgfHxcbiAgICAgICAgICB0aGlzLmdsLmdldEV4dGVuc2lvbignV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycpIHx8XG4gICAgICAgICAgdGhpcy5nbC5nZXRFeHRlbnNpb24oJ01PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5nbC5kaXNhYmxlKHRoaXMuZ2wuU0NJU1NPUl9URVNUKTtcbiAgICAgIHRoaXMuZ2wuZGlzYWJsZSh0aGlzLmdsLlNURU5DSUxfVEVTVCk7XG4gICAgICB0aGlzLmdsLmRpc2FibGUodGhpcy5nbC5ERVBUSF9URVNUKTtcblxuICAgICAgLy8g44Kr44Oq44Oz44Kw77yIMS4wYmV0YTPvvIlcbiAgICAgIHRoaXMuZ2wuZnJvbnRGYWNlKHRoaXMuZ2wuQ1cpO1xuXG4gICAgICB0aGlzLmdsLmVuYWJsZSh0aGlzLmdsLkJMRU5EKTtcbiAgICAgIHRoaXMuZ2wuY29sb3JNYXNrKHRydWUsIHRydWUsIHRydWUsIHRydWUpO1xuXG4gICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIG51bGwpOyAvLyDliY3jgavjg5Djg4Pjg5XjgqHjgYzjg5DjgqTjg7Pjg4njgZXjgozjgabjgYTjgZ/jgonnoLTmo4TjgZnjgovlv4XopoHjgYzjgYLjgotcbiAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg57jgrnjgq/jg4bjgq/jgrnjg4Hjg6Pjgavmj4/nlLvjgZnjgovjgq/jg6rjg4Pjg5Tjg7PjgrDjgrPjg7Pjg4bjgq3jgrnjg4jjgpLjgrvjg4Pjg4jjgZnjgotcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Q2xpcHBpbmdDb250ZXh0QnVmZmVyRm9yTWFzayhjbGlwOiBDdWJpc21DbGlwcGluZ0NvbnRleHQpIHtcbiAgICAgIHRoaXMuX2NsaXBwaW5nQ29udGV4dEJ1ZmZlckZvck1hc2sgPSBjbGlwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODnuOCueOCr+ODhuOCr+OCueODgeODo+OBq+aPj+eUu+OBmeOCi+OCr+ODquODg+ODlOODs+OCsOOCs+ODs+ODhuOCreOCueODiOOCkuWPluW+l+OBmeOCi1xuICAgICAqIEByZXR1cm4g44Oe44K544Kv44OG44Kv44K544OB44Oj44Gr5o+P55S744GZ44KL44Kv44Oq44OD44OU44Oz44Kw44Kz44Oz44OG44Kt44K544OIXG4gICAgICovXG4gICAgcHVibGljIGdldENsaXBwaW5nQ29udGV4dEJ1ZmZlckZvck1hc2soKTogQ3ViaXNtQ2xpcHBpbmdDb250ZXh0IHtcbiAgICAgIHJldHVybiB0aGlzLl9jbGlwcGluZ0NvbnRleHRCdWZmZXJGb3JNYXNrO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOeUu+mdouS4iuOBq+aPj+eUu+OBmeOCi+OCr+ODquODg+ODlOODs+OCsOOCs+ODs+ODhuOCreOCueODiOOCkuOCu+ODg+ODiOOBmeOCi1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRDbGlwcGluZ0NvbnRleHRCdWZmZXJGb3JEcmF3KGNsaXA6IEN1YmlzbUNsaXBwaW5nQ29udGV4dCk6IHZvaWQge1xuICAgICAgdGhpcy5fY2xpcHBpbmdDb250ZXh0QnVmZmVyRm9yRHJhdyA9IGNsaXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog55S76Z2i5LiK44Gr5o+P55S744GZ44KL44Kv44Oq44OD44OU44Oz44Kw44Kz44Oz44OG44Kt44K544OI44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDnlLvpnaLkuIrjgavmj4/nlLvjgZnjgovjgq/jg6rjg4Pjg5Tjg7PjgrDjgrPjg7Pjg4bjgq3jgrnjg4hcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2xpcHBpbmdDb250ZXh0QnVmZmVyRm9yRHJhdygpOiBDdWJpc21DbGlwcGluZ0NvbnRleHQge1xuICAgICAgcmV0dXJuIHRoaXMuX2NsaXBwaW5nQ29udGV4dEJ1ZmZlckZvckRyYXc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2zjga7oqK3lrppcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhcnRVcChnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KTogdm9pZCB7XG4gICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICB0aGlzLl9jbGlwcGluZ01hbmFnZXIuc2V0R0woZ2wpO1xuICAgICAgQ3ViaXNtU2hhZGVyX1dlYkdMLmdldEluc3RhbmNlKCkuc2V0R2woZ2wpO1xuICAgIH1cblxuICAgIF90ZXh0dXJlczogY3NtTWFwPG51bWJlciwgV2ViR0xUZXh0dXJlPjsgLy8g44Oi44OH44Or44GM5Y+C54Wn44GZ44KL44OG44Kv44K544OB44Oj44Go44Os44Oz44OA44Op44Gn44OQ44Kk44Oz44OJ44GX44Gm44GE44KL44OG44Kv44K544OB44Oj44Go44Gu44Oe44OD44OXXG4gICAgX3NvcnRlZERyYXdhYmxlSW5kZXhMaXN0OiBjc21WZWN0b3I8bnVtYmVyPjsgLy8g5o+P55S744Kq44OW44K444Kn44Kv44OI44Gu44Kk44Oz44OH44OD44Kv44K544KS5o+P55S76aCG44Gr5Lim44G544Gf44Oq44K544OIXG4gICAgX2NsaXBwaW5nTWFuYWdlcjogQ3ViaXNtQ2xpcHBpbmdNYW5hZ2VyX1dlYkdMOyAvLyDjgq/jg6rjg4Pjg5Tjg7PjgrDjg57jgrnjgq/nrqHnkIbjgqrjg5bjgrjjgqfjgq/jg4hcbiAgICBfY2xpcHBpbmdDb250ZXh0QnVmZmVyRm9yTWFzazogQ3ViaXNtQ2xpcHBpbmdDb250ZXh0OyAvLyDjg57jgrnjgq/jg4bjgq/jgrnjg4Hjg6Pjgavmj4/nlLvjgZnjgovjgZ/jgoHjga7jgq/jg6rjg4Pjg5Tjg7PjgrDjgrPjg7Pjg4bjgq3jgrnjg4hcbiAgICBfY2xpcHBpbmdDb250ZXh0QnVmZmVyRm9yRHJhdzogQ3ViaXNtQ2xpcHBpbmdDb250ZXh0OyAvLyDnlLvpnaLkuIrmj4/nlLvjgZnjgovjgZ/jgoHjga7jgq/jg6rjg4Pjg5Tjg7PjgrDjgrPjg7Pjg4bjgq3jgrnjg4hcbiAgICBmaXJzdERyYXc6IGJvb2xlYW47XG4gICAgX2J1ZmZlckRhdGE6IHtcbiAgICAgIHZlcnRleDogV2ViR0xCdWZmZXI7XG4gICAgICB1djogV2ViR0xCdWZmZXI7XG4gICAgICBpbmRleDogV2ViR0xCdWZmZXI7XG4gICAgfTsgLy8g6aCC54K544OQ44OD44OV44Kh44OH44O844K/XG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dDsgLy8gd2ViZ2zjgrPjg7Pjg4bjgq3jgrnjg4hcbiAgfVxuXG4gIC8qKlxuICAgKiDjg6zjg7Pjg4Djg6njgYzkv53mjIHjgZnjgovpnZnnmoTjgarjg6rjgr3jg7zjgrnjgpLplovmlL7jgZnjgotcbiAgICovXG4gIEN1YmlzbVJlbmRlcmVyLnN0YXRpY1JlbGVhc2UgPSAoKTogdm9pZCA9PiB7XG4gICAgQ3ViaXNtUmVuZGVyZXJfV2ViR0wuZG9TdGF0aWNSZWxlYXNlKCk7XG4gIH07XG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRoZSBMaXZlMkQgT3BlbiBTb2Z0d2FyZSBsaWNlbnNlXG4gKiB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5saXZlMmQuY29tL2V1bGEvbGl2ZTJkLW9wZW4tc29mdHdhcmUtbGljZW5zZS1hZ3JlZW1lbnRfZW4uaHRtbC5cbiAqL1xuXG5leHBvcnQgbmFtZXNwYWNlIExpdmUyREN1YmlzbUZyYW1ld29yayB7XG4gIC8qKlxuICAgKiDnn6nlvaLlvaLnirbvvIjluqfmqJnjg7vplbfjgZXjga9mbG9hdOWApO+8ieOCkuWumue+qeOBmeOCi+OCr+ODqeOCuVxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIGNzbVJlY3Qge1xuICAgIC8qKlxuICAgICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgICAqIEBwYXJhbSB4IOW3puerr1jluqfmqJlcbiAgICAgKiBAcGFyYW0geSDkuIrnq69Z5bqn5qiZXG4gICAgICogQHBhcmFtIHcg5bmFXG4gICAgICogQHBhcmFtIGgg6auY44GVXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHg/OiBudW1iZXIsIHk/OiBudW1iZXIsIHc/OiBudW1iZXIsIGg/OiBudW1iZXIpIHtcbiAgICAgIHRoaXMueCA9IHg7XG4gICAgICB0aGlzLnkgPSB5O1xuICAgICAgdGhpcy53aWR0aCA9IHc7XG4gICAgICB0aGlzLmhlaWdodCA9IGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog55+p5b2i5Lit5aSu44GuWOW6p+aomeOCkuWPluW+l+OBmeOCi1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDZW50ZXJYKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy54ICsgMC41ICogdGhpcy53aWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnn6nlvaLkuK3lpK7jga5Z5bqn5qiZ44KS5Y+W5b6X44GZ44KLXG4gICAgICovXG4gICAgcHVibGljIGdldENlbnRlclkoKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiB0aGlzLnkgKyAwLjUgKiB0aGlzLmhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlj7PlgbTjga5Y5bqn5qiZ44KS5Y+W5b6X44GZ44KLXG4gICAgICovXG4gICAgcHVibGljIGdldFJpZ2h0KCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy54ICsgdGhpcy53aWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDkuIvnq6/jga5Z5bqn5qiZ44KS5Y+W5b6X44GZ44KLXG4gICAgICovXG4gICAgcHVibGljIGdldEJvdHRvbSgpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMueSArIHRoaXMuaGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOefqeW9ouOBq+WApOOCkuOCu+ODg+ODiOOBmeOCi1xuICAgICAqIEBwYXJhbSByIOefqeW9ouOBruOCpOODs+OCueOCv+ODs+OCuVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRSZWN0KHI6IGNzbVJlY3QpOiB2b2lkIHtcbiAgICAgIHRoaXMueCA9IHIueDtcbiAgICAgIHRoaXMueSA9IHIueTtcbiAgICAgIHRoaXMud2lkdGggPSByLndpZHRoO1xuICAgICAgdGhpcy5oZWlnaHQgPSByLmhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnn6nlvaLkuK3lpK7jgpLou7jjgavjgZfjgabnuKbmqKrjgpLmi6HnuK7jgZnjgotcbiAgICAgKiBAcGFyYW0gdyDluYXmlrnlkJHjgavmi6HnuK7jgZnjgovph49cbiAgICAgKiBAcGFyYW0gaCDpq5jjgZXmlrnlkJHjgavmi6HnuK7jgZnjgovph49cbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwYW5kKHc6IG51bWJlciwgaDogbnVtYmVyKSB7XG4gICAgICB0aGlzLnggLT0gdztcbiAgICAgIHRoaXMueSAtPSBoO1xuICAgICAgdGhpcy53aWR0aCArPSB3ICogMi4wO1xuICAgICAgdGhpcy5oZWlnaHQgKz0gaCAqIDIuMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgeDogbnVtYmVyOyAvLyDlt6bnq69Y5bqn5qiZXG4gICAgcHVibGljIHk6IG51bWJlcjsgLy8g5LiK56uvWeW6p+aomVxuICAgIHB1YmxpYyB3aWR0aDogbnVtYmVyOyAvLyDluYVcbiAgICBwdWJsaWMgaGVpZ2h0OiBudW1iZXI7IC8vIOmrmOOBlVxuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRoZSBMaXZlMkQgT3BlbiBTb2Z0d2FyZSBsaWNlbnNlXG4gKiB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5saXZlMmQuY29tL2V1bGEvbGl2ZTJkLW9wZW4tc29mdHdhcmUtbGljZW5zZS1hZ3JlZW1lbnRfZW4uaHRtbC5cbiAqL1xuXG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtZnJhbWV3b3JrIH0gZnJvbSAnLi9saXZlMmRjdWJpc21mcmFtZXdvcmsnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGljdWJpc21tb2RlbHNldHRpbmcgfSBmcm9tICcuL2ljdWJpc21tb2RlbHNldHRpbmcnO1xuaW1wb3J0IHsgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIGFzIGN1YmlzbWlkIH0gZnJvbSAnLi9pZC9jdWJpc21pZCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtanNvbiB9IGZyb20gJy4vdXRpbHMvY3ViaXNtanNvbic7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3NtbWFwIH0gZnJvbSAnLi90eXBlL2NzbW1hcCc7XG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3NtdmVjdG9yIH0gZnJvbSAnLi90eXBlL2NzbXZlY3Rvcic7XG5pbXBvcnQgY3NtVmVjdG9yID0gY3NtdmVjdG9yLmNzbVZlY3RvcjtcbmltcG9ydCBjc21NYXAgPSBjc21tYXAuY3NtTWFwO1xuaW1wb3J0IGl0ZXJhdG9yID0gY3NtbWFwLml0ZXJhdG9yO1xuaW1wb3J0IEN1YmlzbUZyYW1ld29yayA9IGN1YmlzbWZyYW1ld29yay5DdWJpc21GcmFtZXdvcms7XG5pbXBvcnQgQ3ViaXNtSWRIYW5kbGUgPSBjdWJpc21pZC5DdWJpc21JZEhhbmRsZTtcbmltcG9ydCBDdWJpc21Kc29uID0gY3ViaXNtanNvbi5DdWJpc21Kc29uO1xuaW1wb3J0IFZhbHVlID0gY3ViaXNtanNvbi5WYWx1ZTtcbmltcG9ydCBJQ3ViaXNtTW9kZWxTZXR0aW5nID0gaWN1YmlzbW1vZGVsc2V0dGluZy5JQ3ViaXNtTW9kZWxTZXR0aW5nO1xuXG5leHBvcnQgbmFtZXNwYWNlIExpdmUyREN1YmlzbUZyYW1ld29yayB7XG4gIC8qKlxuICAgKiBNb2RlbDNKc29u44Gu44Kt44O85paH5a2X5YiXXG4gICAqL1xuXG4gIC8vIEpTT04gS2V5c1xuICBjb25zdCBWZXJzaW9uID0gJ1ZlcnNpb24nO1xuICBjb25zdCBGaWxlUmVmZXJlbmNlcyA9ICdGaWxlUmVmZXJlbmNlcyc7XG4gIGNvbnN0IEdyb3VwcyA9ICdHcm91cHMnO1xuICBjb25zdCBMYXlvdXQgPSAnTGF5b3V0JztcbiAgY29uc3QgSGl0QXJlYXMgPSAnSGl0QXJlYXMnO1xuXG4gIGNvbnN0IE1vYyA9ICdNb2MnO1xuICBjb25zdCBUZXh0dXJlcyA9ICdUZXh0dXJlcyc7XG4gIGNvbnN0IFBoeXNpY3MgPSAnUGh5c2ljcyc7XG4gIGNvbnN0IFBvc2UgPSAnUG9zZSc7XG4gIGNvbnN0IEV4cHJlc3Npb25zID0gJ0V4cHJlc3Npb25zJztcbiAgY29uc3QgTW90aW9ucyA9ICdNb3Rpb25zJztcblxuICBjb25zdCBVc2VyRGF0YSA9ICdVc2VyRGF0YSc7XG4gIGNvbnN0IE5hbWUgPSAnTmFtZSc7XG4gIGNvbnN0IEZpbGVQYXRoID0gJ0ZpbGUnO1xuICBjb25zdCBJZCA9ICdJZCc7XG4gIGNvbnN0IElkcyA9ICdJZHMnO1xuICBjb25zdCBUYXJnZXQgPSAnVGFyZ2V0JztcblxuICAvLyBNb3Rpb25zXG4gIGNvbnN0IElkbGUgPSAnSWRsZSc7XG4gIGNvbnN0IFRhcEJvZHkgPSAnVGFwQm9keSc7XG4gIGNvbnN0IFBpbmNoSW4gPSAnUGluY2hJbic7XG4gIGNvbnN0IFBpbmNoT3V0ID0gJ1BpbmNoT3V0JztcbiAgY29uc3QgU2hha2UgPSAnU2hha2UnO1xuICBjb25zdCBGbGlja0hlYWQgPSAnRmxpY2tIZWFkJztcbiAgY29uc3QgUGFyYW1ldGVyID0gJ1BhcmFtZXRlcic7XG5cbiAgY29uc3QgU291bmRQYXRoID0gJ1NvdW5kJztcbiAgY29uc3QgRmFkZUluVGltZSA9ICdGYWRlSW5UaW1lJztcbiAgY29uc3QgRmFkZU91dFRpbWUgPSAnRmFkZU91dFRpbWUnO1xuXG4gIC8vIExheW91dFxuICBjb25zdCBDZW50ZXJYID0gJ0NlbnRlclgnO1xuICBjb25zdCBDZW50ZXJZID0gJ0NlbnRlclknO1xuICBjb25zdCBYID0gJ1gnO1xuICBjb25zdCBZID0gJ1knO1xuICBjb25zdCBXaWR0aCA9ICdXaWR0aCc7XG4gIGNvbnN0IEhlaWdodCA9ICdIZWlnaHQnO1xuXG4gIGNvbnN0IExpcFN5bmMgPSAnTGlwU3luYyc7XG4gIGNvbnN0IEV5ZUJsaW5rID0gJ0V5ZUJsaW5rJztcblxuICBjb25zdCBJbml0UGFyYW1ldGVyID0gJ2luaXRfcGFyYW0nO1xuICBjb25zdCBJbml0UGFydHNWaXNpYmxlID0gJ2luaXRfcGFydHNfdmlzaWJsZSc7XG4gIGNvbnN0IFZhbCA9ICd2YWwnO1xuXG4gIGVudW0gRnJlcXVlc3ROb2RlIHtcbiAgICBGcmVxdWVzdE5vZGVfR3JvdXBzLCAvLyBnZXRSb290KCkuZ2V0VmFsdWVCeVN0cmluZyhHcm91cHMpXG4gICAgRnJlcXVlc3ROb2RlX01vYywgLy8gZ2V0Um9vdCgpLmdldFZhbHVlQnlTdHJpbmcoRmlsZVJlZmVyZW5jZXMpLmdldFZhbHVlQnlTdHJpbmcoTW9jKVxuICAgIEZyZXF1ZXN0Tm9kZV9Nb3Rpb25zLCAvLyBnZXRSb290KCkuZ2V0VmFsdWVCeVN0cmluZyhGaWxlUmVmZXJlbmNlcykuZ2V0VmFsdWVCeVN0cmluZyhNb3Rpb25zKVxuICAgIEZyZXF1ZXN0Tm9kZV9FeHByZXNzaW9ucywgLy8gZ2V0Um9vdCgpLmdldFZhbHVlQnlTdHJpbmcoRmlsZVJlZmVyZW5jZXMpLmdldFZhbHVlQnlTdHJpbmcoRXhwcmVzc2lvbnMpXG4gICAgRnJlcXVlc3ROb2RlX1RleHR1cmVzLCAvLyBnZXRSb290KCkuZ2V0VmFsdWVCeVN0cmluZyhGaWxlUmVmZXJlbmNlcykuZ2V0VmFsdWVCeVN0cmluZyhUZXh0dXJlcylcbiAgICBGcmVxdWVzdE5vZGVfUGh5c2ljcywgLy8gZ2V0Um9vdCgpLmdldFZhbHVlQnlTdHJpbmcoRmlsZVJlZmVyZW5jZXMpLmdldFZhbHVlQnlTdHJpbmcoUGh5c2ljcylcbiAgICBGcmVxdWVzdE5vZGVfUG9zZSwgLy8gZ2V0Um9vdCgpLmdldFZhbHVlQnlTdHJpbmcoRmlsZVJlZmVyZW5jZXMpLmdldFZhbHVlQnlTdHJpbmcoUG9zZSlcbiAgICBGcmVxdWVzdE5vZGVfSGl0QXJlYXMgLy8gZ2V0Um9vdCgpLmdldFZhbHVlQnlTdHJpbmcoSGl0QXJlYXMpXG4gIH1cblxuICAvKipcbiAgICogTW9kZWwzSnNvbuODkeODvOOCteODvFxuICAgKlxuICAgKiBtb2RlbDMuanNvbuODleOCoeOCpOODq+OCkuODkeODvOOCueOBl+OBpuWApOOCkuWPluW+l+OBmeOCi1xuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEN1YmlzbU1vZGVsU2V0dGluZ0pzb24gZXh0ZW5kcyBJQ3ViaXNtTW9kZWxTZXR0aW5nIHtcbiAgICAvKipcbiAgICAgKiDlvJXmlbDku5jjgY3jgrPjg7Pjgrnjg4jjg6njgq/jgr9cbiAgICAgKlxuICAgICAqIEBwYXJhbSBidWZmZXIgICAgTW9kZWwzSnNvbuOCkuODkOOCpOODiOmFjeWIl+OBqOOBl+OBpuiqreOBv+i+vOOCk+OBoOODh+ODvOOCv+ODkOODg+ODleOCoVxuICAgICAqIEBwYXJhbSBzaXplICAgICAgTW9kZWwzSnNvbuOBruODh+ODvOOCv+OCteOCpOOCulxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihidWZmZXI6IEFycmF5QnVmZmVyLCBzaXplOiBudW1iZXIpIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgICB0aGlzLl9qc29uID0gQ3ViaXNtSnNvbi5jcmVhdGUoYnVmZmVyLCBzaXplKTtcblxuICAgICAgaWYgKHRoaXMuX2pzb24pIHtcbiAgICAgICAgdGhpcy5fanNvblZhbHVlID0gbmV3IGNzbVZlY3RvcjxWYWx1ZT4oKTtcblxuICAgICAgICAvLyDpoIbnlarjga9lbnVtIEZyZXF1ZXN0Tm9kZeOBqOS4gOiHtOOBleOBm+OCi1xuICAgICAgICB0aGlzLl9qc29uVmFsdWUucHVzaEJhY2sodGhpcy5fanNvbi5nZXRSb290KCkuZ2V0VmFsdWVCeVN0cmluZyhHcm91cHMpKTtcbiAgICAgICAgdGhpcy5fanNvblZhbHVlLnB1c2hCYWNrKFxuICAgICAgICAgIHRoaXMuX2pzb25cbiAgICAgICAgICAgIC5nZXRSb290KClcbiAgICAgICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKEZpbGVSZWZlcmVuY2VzKVxuICAgICAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoTW9jKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9qc29uVmFsdWUucHVzaEJhY2soXG4gICAgICAgICAgdGhpcy5fanNvblxuICAgICAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoRmlsZVJlZmVyZW5jZXMpXG4gICAgICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhNb3Rpb25zKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9qc29uVmFsdWUucHVzaEJhY2soXG4gICAgICAgICAgdGhpcy5fanNvblxuICAgICAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoRmlsZVJlZmVyZW5jZXMpXG4gICAgICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhFeHByZXNzaW9ucylcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fanNvblZhbHVlLnB1c2hCYWNrKFxuICAgICAgICAgIHRoaXMuX2pzb25cbiAgICAgICAgICAgIC5nZXRSb290KClcbiAgICAgICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKEZpbGVSZWZlcmVuY2VzKVxuICAgICAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoVGV4dHVyZXMpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2pzb25WYWx1ZS5wdXNoQmFjayhcbiAgICAgICAgICB0aGlzLl9qc29uXG4gICAgICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhGaWxlUmVmZXJlbmNlcylcbiAgICAgICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFBoeXNpY3MpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2pzb25WYWx1ZS5wdXNoQmFjayhcbiAgICAgICAgICB0aGlzLl9qc29uXG4gICAgICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhGaWxlUmVmZXJlbmNlcylcbiAgICAgICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFBvc2UpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2pzb25WYWx1ZS5wdXNoQmFjayhcbiAgICAgICAgICB0aGlzLl9qc29uLmdldFJvb3QoKS5nZXRWYWx1ZUJ5U3RyaW5nKEhpdEFyZWFzKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODh+OCueODiOODqeOCr+OCv+ebuOW9k+OBruWHpueQhlxuICAgICAqL1xuICAgIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgICAgQ3ViaXNtSnNvbi5kZWxldGUodGhpcy5fanNvbik7XG5cbiAgICAgIHRoaXMuX2pzb25WYWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3ViaXNtSnNvbuOCquODluOCuOOCp+OCr+ODiOOCkuWPluW+l+OBmeOCi1xuICAgICAqXG4gICAgICogQHJldHVybiBDdWJpc21Kc29uXG4gICAgICovXG4gICAgcHVibGljIEdldEpzb24oKTogQ3ViaXNtSnNvbiB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb2Pjg5XjgqHjgqTjg6vjga7lkI3liY3jgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJuIE1vY+ODleOCoeOCpOODq+OBruWQjeWJjVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNb2RlbEZpbGVOYW1lKCk6IHN0cmluZyB7XG4gICAgICBpZiAoIXRoaXMuaXNFeGlzdE1vZGVsRmlsZSgpKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9qc29uVmFsdWUuYXQoRnJlcXVlc3ROb2RlLkZyZXF1ZXN0Tm9kZV9Nb2MpLmdldFJhd1N0cmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODh+ODq+OBjOS9v+eUqOOBmeOCi+ODhuOCr+OCueODgeODo+OBruaVsOOCkuWPluW+l+OBmeOCi1xuICAgICAqIOODhuOCr+OCueODgeODo+OBruaVsFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUZXh0dXJlQ291bnQoKTogbnVtYmVyIHtcbiAgICAgIGlmICghdGhpcy5pc0V4aXN0VGV4dHVyZUZpbGVzKCkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9qc29uVmFsdWUuYXQoRnJlcXVlc3ROb2RlLkZyZXF1ZXN0Tm9kZV9UZXh0dXJlcykuZ2V0U2l6ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODhuOCr+OCueODgeODo+OBjOmFjee9ruOBleOCjOOBn+ODh+OCo+ODrOOCr+ODiOODquOBruWQjeWJjeOCkuWPluW+l+OBmeOCi1xuICAgICAqIEByZXR1cm4g44OG44Kv44K544OB44Oj44GM6YWN572u44GV44KM44Gf44OH44Kj44Os44Kv44OI44Oq44Gu5ZCN5YmNXG4gICAgICovXG4gICAgcHVibGljIGdldFRleHR1cmVEaXJlY3RvcnkoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uVmFsdWVcbiAgICAgICAgLmF0KEZyZXF1ZXN0Tm9kZS5GcmVxdWVzdE5vZGVfVGV4dHVyZXMpXG4gICAgICAgIC5nZXRSYXdTdHJpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg4fjg6vjgYzkvb/nlKjjgZnjgovjg4bjgq/jgrnjg4Hjg6Pjga7lkI3liY3jgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcGFyYW0gaW5kZXgg6YWN5YiX44Gu44Kk44Oz44OH44OD44Kv44K55YCkXG4gICAgICogQHJldHVybiDjg4bjgq/jgrnjg4Hjg6Pjga7lkI3liY1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VGV4dHVyZUZpbGVOYW1lKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX2pzb25WYWx1ZVxuICAgICAgICAuYXQoRnJlcXVlc3ROb2RlLkZyZXF1ZXN0Tm9kZV9UZXh0dXJlcylcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChpbmRleClcbiAgICAgICAgLmdldFJhd1N0cmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODh+ODq+OBq+ioreWumuOBleOCjOOBn+W9k+OBn+OCiuWIpOWumuOBruaVsOOCkuWPluW+l+OBmeOCi1xuICAgICAqIEByZXR1cm4g44Oi44OH44Or44Gr6Kit5a6a44GV44KM44Gf5b2T44Gf44KK5Yik5a6a44Gu5pWwXG4gICAgICovXG4gICAgcHVibGljIGdldEhpdEFyZWFzQ291bnQoKTogbnVtYmVyIHtcbiAgICAgIGlmICghdGhpcy5pc0V4aXN0SGl0QXJlYXMoKSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2pzb25WYWx1ZS5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX0hpdEFyZWFzKS5nZXRTaXplKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5b2T44Gf44KK5Yik5a6a44Gr6Kit5a6a44GV44KM44GfSUTjgpLlj5blvpfjgZnjgotcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCDphY3liJfjga5pbmRleFxuICAgICAqIEByZXR1cm4g5b2T44Gf44KK5Yik5a6a44Gr6Kit5a6a44GV44KM44GfSURcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SGl0QXJlYUlkKGluZGV4OiBudW1iZXIpOiBDdWJpc21JZEhhbmRsZSB7XG4gICAgICByZXR1cm4gQ3ViaXNtRnJhbWV3b3JrLmdldElkTWFuYWdlcigpLmdldElkKFxuICAgICAgICB0aGlzLl9qc29uVmFsdWVcbiAgICAgICAgICAuYXQoRnJlcXVlc3ROb2RlLkZyZXF1ZXN0Tm9kZV9IaXRBcmVhcylcbiAgICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KGluZGV4KVxuICAgICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKElkKVxuICAgICAgICAgIC5nZXRSYXdTdHJpbmcoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlvZPjgZ/jgorliKTlrprjgavoqK3lrprjgZXjgozjgZ/lkI3liY3jgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcGFyYW0gaW5kZXgg6YWN5YiX44Gu44Kk44Oz44OH44OD44Kv44K55YCkXG4gICAgICogQHJldHVybiDlvZPjgZ/jgorliKTlrprjgavoqK3lrprjgZXjgozjgZ/lkI3liY1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SGl0QXJlYU5hbWUoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvblZhbHVlXG4gICAgICAgIC5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX0hpdEFyZWFzKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KGluZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhOYW1lKVxuICAgICAgICAuZ2V0UmF3U3RyaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog54mp55CG5ryU566X6Kit5a6a44OV44Kh44Kk44Or44Gu5ZCN5YmN44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDniannkIbmvJTnrpfoqK3lrprjg5XjgqHjgqTjg6vjga7lkI3liY1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGh5c2ljc0ZpbGVOYW1lKCk6IHN0cmluZyB7XG4gICAgICBpZiAoIXRoaXMuaXNFeGlzdFBoeXNpY3NGaWxlKCkpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fanNvblZhbHVlXG4gICAgICAgIC5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX1BoeXNpY3MpXG4gICAgICAgIC5nZXRSYXdTdHJpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg5Hjg7zjg4TliIfjgormm7/jgYjoqK3lrprjg5XjgqHjgqTjg6vjga7lkI3liY3jgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJuIOODkeODvOODhOWIh+OCiuabv+OBiOioreWumuODleOCoeOCpOODq+OBruWQjeWJjVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQb3NlRmlsZU5hbWUoKTogc3RyaW5nIHtcbiAgICAgIGlmICghdGhpcy5pc0V4aXN0UG9zZUZpbGUoKSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9qc29uVmFsdWUuYXQoRnJlcXVlc3ROb2RlLkZyZXF1ZXN0Tm9kZV9Qb3NlKS5nZXRSYXdTdHJpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDooajmg4XoqK3lrprjg5XjgqHjgqTjg6vjga7mlbDjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJuIOihqOaDheioreWumuODleOCoeOCpOODq+OBruaVsFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRFeHByZXNzaW9uQ291bnQoKTogbnVtYmVyIHtcbiAgICAgIGlmICghdGhpcy5pc0V4aXN0RXhwcmVzc2lvbkZpbGUoKSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2pzb25WYWx1ZVxuICAgICAgICAuYXQoRnJlcXVlc3ROb2RlLkZyZXF1ZXN0Tm9kZV9FeHByZXNzaW9ucylcbiAgICAgICAgLmdldFNpemUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDooajmg4XoqK3lrprjg5XjgqHjgqTjg6vjgpLorZjliKXjgZnjgovlkI3liY3vvIjliKXlkI3vvInjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcGFyYW0gaW5kZXgg6YWN5YiX44Gu44Kk44Oz44OH44OD44Kv44K55YCkXG4gICAgICogQHJldHVybiDooajmg4Xjga7lkI3liY1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RXhwcmVzc2lvbk5hbWUoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fanNvblZhbHVlXG4gICAgICAgIC5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX0V4cHJlc3Npb25zKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KGluZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhOYW1lKVxuICAgICAgICAuZ2V0UmF3U3RyaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6KGo5oOF6Kit5a6a44OV44Kh44Kk44Or44Gu5ZCN5YmN44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHBhcmFtIGluZGV4IOmFjeWIl+OBruOCpOODs+ODh+ODg+OCr+OCueWApFxuICAgICAqIEByZXR1cm4g6KGo5oOF6Kit5a6a44OV44Kh44Kk44Or44Gu5ZCN5YmNXG4gICAgICovXG4gICAgcHVibGljIGdldEV4cHJlc3Npb25GaWxlTmFtZShpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9qc29uVmFsdWVcbiAgICAgICAgLmF0KEZyZXF1ZXN0Tm9kZS5GcmVxdWVzdE5vZGVfRXhwcmVzc2lvbnMpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgoaW5kZXgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKEZpbGVQYXRoKVxuICAgICAgICAuZ2V0UmF3U3RyaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz44Kw44Or44O844OX44Gu5pWw44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDjg6Ljg7zjgrfjg6fjg7PjgrDjg6vjg7zjg5fjga7mlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TW90aW9uR3JvdXBDb3VudCgpOiBudW1iZXIge1xuICAgICAgaWYgKCF0aGlzLmlzRXhpc3RNb3Rpb25Hcm91cHMoKSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2pzb25WYWx1ZVxuICAgICAgICAuYXQoRnJlcXVlc3ROb2RlLkZyZXF1ZXN0Tm9kZV9Nb3Rpb25zKVxuICAgICAgICAuZ2V0S2V5cygpXG4gICAgICAgIC5nZXRTaXplKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz44Kw44Or44O844OX44Gu5ZCN5YmN44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHBhcmFtIGluZGV4IOmFjeWIl+OBruOCpOODs+ODh+ODg+OCr+OCueWApFxuICAgICAqIEByZXR1cm4g44Oi44O844K344On44Oz44Kw44Or44O844OX44Gu5ZCN5YmNXG4gICAgICovXG4gICAgcHVibGljIGdldE1vdGlvbkdyb3VwTmFtZShpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgIGlmICghdGhpcy5pc0V4aXN0TW90aW9uR3JvdXBzKCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9qc29uVmFsdWVcbiAgICAgICAgLmF0KEZyZXF1ZXN0Tm9kZS5GcmVxdWVzdE5vZGVfTW90aW9ucylcbiAgICAgICAgLmdldEtleXMoKVxuICAgICAgICAuYXQoaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+OCsOODq+ODvOODl+OBq+WQq+OBvuOCjOOCi+ODouODvOOCt+ODp+ODs+OBruaVsOOCkuWPluW+l+OBmeOCi1xuICAgICAqIEBwYXJhbSBncm91cE5hbWUg44Oi44O844K344On44Oz44Kw44Or44O844OX44Gu5ZCN5YmNXG4gICAgICogQHJldHVybiDjg6Ljg7zjgrfjg6fjg7PjgrDjg6vjg7zjg5fjga7mlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TW90aW9uQ291bnQoZ3JvdXBOYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgaWYgKCF0aGlzLmlzRXhpc3RNb3Rpb25Hcm91cE5hbWUoZ3JvdXBOYW1lKSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2pzb25WYWx1ZVxuICAgICAgICAuYXQoRnJlcXVlc3ROb2RlLkZyZXF1ZXN0Tm9kZV9Nb3Rpb25zKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhncm91cE5hbWUpXG4gICAgICAgIC5nZXRTaXplKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Kw44Or44O844OX5ZCN44Go44Kk44Oz44OH44OD44Kv44K55YCk44GL44KJ44Oi44O844K344On44Oz44OV44Kh44Kk44Or5ZCN44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHBhcmFtIGdyb3VwTmFtZSDjg6Ljg7zjgrfjg6fjg7PjgrDjg6vjg7zjg5fjga7lkI3liY1cbiAgICAgKiBAcGFyYW0gaW5kZXggICAgIOmFjeWIl+OBruOCpOODs+ODh+ODg+OCr+OCueWApFxuICAgICAqIEByZXR1cm4g44Oi44O844K344On44Oz44OV44Kh44Kk44Or44Gu5ZCN5YmNXG4gICAgICovXG4gICAgcHVibGljIGdldE1vdGlvbkZpbGVOYW1lKGdyb3VwTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgIGlmICghdGhpcy5pc0V4aXN0TW90aW9uR3JvdXBOYW1lKGdyb3VwTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fanNvblZhbHVlXG4gICAgICAgIC5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX01vdGlvbnMpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKGdyb3VwTmFtZSlcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChpbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoRmlsZVBhdGgpXG4gICAgICAgIC5nZXRSYXdTdHJpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7Pjgavlr77lv5zjgZnjgovjgrXjgqbjg7Pjg4njg5XjgqHjgqTjg6vjga7lkI3liY3jgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIOODouODvOOCt+ODp+ODs+OCsOODq+ODvOODl+OBruWQjeWJjVxuICAgICAqIEBwYXJhbSBpbmRleCDphY3liJfjga7jgqTjg7Pjg4fjg4Pjgq/jgrnlgKRcbiAgICAgKiBAcmV0dXJuIOOCteOCpuODs+ODieODleOCoeOCpOODq+OBruWQjeWJjVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNb3Rpb25Tb3VuZEZpbGVOYW1lKGdyb3VwTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgIGlmICghdGhpcy5pc0V4aXN0TW90aW9uU291bmRGaWxlKGdyb3VwTmFtZSwgaW5kZXgpKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2pzb25WYWx1ZVxuICAgICAgICAuYXQoRnJlcXVlc3ROb2RlLkZyZXF1ZXN0Tm9kZV9Nb3Rpb25zKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhncm91cE5hbWUpXG4gICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgoaW5kZXgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKFNvdW5kUGF0aClcbiAgICAgICAgLmdldFJhd1N0cmluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+mWi+Wni+aZguOBruODleOCp+ODvOODieOCpOODs+WHpueQhuaZgumWk+OCkuWPluW+l+OBmeOCi1xuICAgICAqIEBwYXJhbSBncm91cE5hbWUg44Oi44O844K344On44Oz44Kw44Or44O844OX44Gu5ZCN5YmNXG4gICAgICogQHBhcmFtIGluZGV4IOmFjeWIl+OBruOCpOODs+ODh+ODg+OCr+OCueWApFxuICAgICAqIEByZXR1cm4g44OV44Kn44O844OJ44Kk44Oz5Yem55CG5pmC6ZaTW+enkl1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TW90aW9uRmFkZUluVGltZVZhbHVlKGdyb3VwTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgIGlmICghdGhpcy5pc0V4aXN0TW90aW9uRmFkZUluKGdyb3VwTmFtZSwgaW5kZXgpKSB7XG4gICAgICAgIHJldHVybiAtMS4wO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fanNvblZhbHVlXG4gICAgICAgIC5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX01vdGlvbnMpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKGdyb3VwTmFtZSlcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChpbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoRmFkZUluVGltZSlcbiAgICAgICAgLnRvRmxvYXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7PntYLkuobmmYLjga7jg5Xjgqfjg7zjg4njgqLjgqbjg4jlh6bnkIbmmYLplpPjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIOODouODvOOCt+ODp+ODs+OCsOODq+ODvOODl+OBruWQjeWJjVxuICAgICAqIEBwYXJhbSBpbmRleCDphY3liJfjga7jgqTjg7Pjg4fjg4Pjgq/jgrnlgKRcbiAgICAgKiBAcmV0dXJuIOODleOCp+ODvOODieOCouOCpuODiOWHpueQhuaZgumWk1vnp5JdXG4gICAgICovXG4gICAgcHVibGljIGdldE1vdGlvbkZhZGVPdXRUaW1lVmFsdWUoZ3JvdXBOYW1lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgaWYgKCF0aGlzLmlzRXhpc3RNb3Rpb25GYWRlT3V0KGdyb3VwTmFtZSwgaW5kZXgpKSB7XG4gICAgICAgIHJldHVybiAtMS4wO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fanNvblZhbHVlXG4gICAgICAgIC5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX01vdGlvbnMpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKGdyb3VwTmFtZSlcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChpbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoRmFkZU91dFRpbWUpXG4gICAgICAgIC50b0Zsb2F0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Om44O844K244O844OH44O844K/44Gu44OV44Kh44Kk44Or5ZCN44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDjg6bjg7zjgrbjg7zjg4fjg7zjgr/jga7jg5XjgqHjgqTjg6vlkI1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VXNlckRhdGFGaWxlKCk6IHN0cmluZyB7XG4gICAgICBpZiAoIXRoaXMuaXNFeGlzdFVzZXJEYXRhRmlsZSgpKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhGaWxlUmVmZXJlbmNlcylcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoVXNlckRhdGEpXG4gICAgICAgIC5nZXRSYXdTdHJpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6zjgqTjgqLjgqbjg4jmg4XloLHjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcGFyYW0gb3V0TGF5b3V0TWFwIGNzbU1hcOOCr+ODqeOCueOBruOCpOODs+OCueOCv+ODs+OCuVxuICAgICAqIEByZXR1cm4gdHJ1ZSDjg6zjgqTjgqLjgqbjg4jmg4XloLHjgYzlrZjlnKjjgZnjgotcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOODrOOCpOOCouOCpuODiOaDheWgseOBjOWtmOWcqOOBl+OBquOBhFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMYXlvdXRNYXAob3V0TGF5b3V0TWFwOiBjc21NYXA8c3RyaW5nLCBudW1iZXI+KTogYm9vbGVhbiB7XG4gICAgICAvLyDlrZjlnKjjgZfjgarjgYTopoHntKDjgavjgqLjgq/jgrvjgrnjgZnjgovjgajjgqjjg6njg7zjgavjgarjgovjgZ/jgoFWYWx1ZeOBjG51bGzjga7loLTlkIjjga9udWxs44KS5Luj5YWl44GZ44KLXG4gICAgICBjb25zdCBtYXA6IGNzbU1hcDxzdHJpbmcsIFZhbHVlPiA9IHRoaXMuX2pzb25cbiAgICAgICAgLmdldFJvb3QoKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhMYXlvdXQpXG4gICAgICAgIC5nZXRNYXAoKTtcblxuICAgICAgaWYgKG1hcCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgbGV0IHJldCA9IGZhbHNlO1xuXG4gICAgICBmb3IgKFxuICAgICAgICBjb25zdCBpdGU6IGl0ZXJhdG9yPHN0cmluZywgVmFsdWU+ID0gbWFwLmJlZ2luKCk7XG4gICAgICAgIGl0ZS5ub3RFcXVhbChtYXAuZW5kKCkpO1xuICAgICAgICBpdGUucHJlSW5jcmVtZW50KClcbiAgICAgICkge1xuICAgICAgICBvdXRMYXlvdXRNYXAuc2V0VmFsdWUoaXRlLnB0cigpLmZpcnN0LCBpdGUucHRyKCkuc2Vjb25kLnRvRmxvYXQoKSk7XG4gICAgICAgIHJldCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog55uu44OR44OB44Gr6Zai6YCj5LuY44GR44KJ44KM44Gf44OR44Op44Oh44O844K/44Gu5pWw44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDnm67jg5Hjg4HjgavplqLpgKPku5jjgZHjgonjgozjgZ/jg5Hjg6njg6Hjg7zjgr/jga7mlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RXllQmxpbmtQYXJhbWV0ZXJDb3VudCgpOiBudW1iZXIge1xuICAgICAgaWYgKCF0aGlzLmlzRXhpc3RFeWVCbGlua1BhcmFtZXRlcnMoKSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cblxuICAgICAgbGV0IG51bSA9IDA7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGkgPCB0aGlzLl9qc29uVmFsdWUuYXQoRnJlcXVlc3ROb2RlLkZyZXF1ZXN0Tm9kZV9Hcm91cHMpLmdldFNpemUoKTtcbiAgICAgICAgaSsrXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcmVmSTogVmFsdWUgPSB0aGlzLl9qc29uVmFsdWVcbiAgICAgICAgICAuYXQoRnJlcXVlc3ROb2RlLkZyZXF1ZXN0Tm9kZV9Hcm91cHMpXG4gICAgICAgICAgLmdldFZhbHVlQnlJbmRleChpKTtcbiAgICAgICAgaWYgKHJlZkkuaXNOdWxsKCkgfHwgcmVmSS5pc0Vycm9yKCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWZJLmdldFZhbHVlQnlTdHJpbmcoTmFtZSkuZ2V0UmF3U3RyaW5nKCkgPT0gRXllQmxpbmspIHtcbiAgICAgICAgICBudW0gPSByZWZJXG4gICAgICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhJZHMpXG4gICAgICAgICAgICAuZ2V0VmVjdG9yKClcbiAgICAgICAgICAgIC5nZXRTaXplKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDnm67jg5Hjg4HjgavplqLpgKPku5jjgZHjgonjgozjgZ/jg5Hjg6njg6Hjg7zjgr/jga5JROOCkuWPluW+l+OBmeOCi1xuICAgICAqIEBwYXJhbSBpbmRleCDphY3liJfjga7jgqTjg7Pjg4fjg4Pjgq/jgrnlgKRcbiAgICAgKiBAcmV0dXJuIOODkeODqeODoeODvOOCv0lEXG4gICAgICovXG4gICAgcHVibGljIGdldEV5ZUJsaW5rUGFyYW1ldGVySWQoaW5kZXg6IG51bWJlcik6IEN1YmlzbUlkSGFuZGxlIHtcbiAgICAgIGlmICghdGhpcy5pc0V4aXN0RXllQmxpbmtQYXJhbWV0ZXJzKCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGZvciAoXG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgaSA8IHRoaXMuX2pzb25WYWx1ZS5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX0dyb3VwcykuZ2V0U2l6ZSgpO1xuICAgICAgICBpKytcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZWZJOiBWYWx1ZSA9IHRoaXMuX2pzb25WYWx1ZVxuICAgICAgICAgIC5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX0dyb3VwcylcbiAgICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KGkpO1xuICAgICAgICBpZiAocmVmSS5pc051bGwoKSB8fCByZWZJLmlzRXJyb3IoKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlZkkuZ2V0VmFsdWVCeVN0cmluZyhOYW1lKS5nZXRSYXdTdHJpbmcoKSA9PSBFeWVCbGluaykge1xuICAgICAgICAgIHJldHVybiBDdWJpc21GcmFtZXdvcmsuZ2V0SWRNYW5hZ2VyKCkuZ2V0SWQoXG4gICAgICAgICAgICByZWZJXG4gICAgICAgICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKElkcylcbiAgICAgICAgICAgICAgLmdldFZhbHVlQnlJbmRleChpbmRleClcbiAgICAgICAgICAgICAgLmdldFJhd1N0cmluZygpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Oq44OD44OX44K344Oz44Kv44Gr6Zai6YCj5LuY44GR44KJ44KM44Gf44OR44Op44Oh44O844K/44Gu5pWw44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDjg6rjg4Pjg5fjgrfjg7Pjgq/jgavplqLpgKPku5jjgZHjgonjgozjgZ/jg5Hjg6njg6Hjg7zjgr/jga7mlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TGlwU3luY1BhcmFtZXRlckNvdW50KCk6IG51bWJlciB7XG4gICAgICBpZiAoIXRoaXMuaXNFeGlzdExpcFN5bmNQYXJhbWV0ZXJzKCkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIGxldCBudW0gPSAwO1xuICAgICAgZm9yIChcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBpIDwgdGhpcy5fanNvblZhbHVlLmF0KEZyZXF1ZXN0Tm9kZS5GcmVxdWVzdE5vZGVfR3JvdXBzKS5nZXRTaXplKCk7XG4gICAgICAgIGkrK1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHJlZkk6IFZhbHVlID0gdGhpcy5fanNvblZhbHVlXG4gICAgICAgICAgLmF0KEZyZXF1ZXN0Tm9kZS5GcmVxdWVzdE5vZGVfR3JvdXBzKVxuICAgICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgoaSk7XG4gICAgICAgIGlmIChyZWZJLmlzTnVsbCgpIHx8IHJlZkkuaXNFcnJvcigpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVmSS5nZXRWYWx1ZUJ5U3RyaW5nKE5hbWUpLmdldFJhd1N0cmluZygpID09IExpcFN5bmMpIHtcbiAgICAgICAgICBudW0gPSByZWZJXG4gICAgICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhJZHMpXG4gICAgICAgICAgICAuZ2V0VmVjdG9yKClcbiAgICAgICAgICAgIC5nZXRTaXplKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6rjg4Pjg5fjgrfjg7Pjgq/jgavplqLpgKPku5jjgZHjgonjgozjgZ/jg5Hjg6njg6Hjg7zjgr/jga7mlbDjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcGFyYW0gaW5kZXgg6YWN5YiX44Gu44Kk44Oz44OH44OD44Kv44K55YCkXG4gICAgICogQHJldHVybiDjg5Hjg6njg6Hjg7zjgr9JRFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMaXBTeW5jUGFyYW1ldGVySWQoaW5kZXg6IG51bWJlcik6IEN1YmlzbUlkSGFuZGxlIHtcbiAgICAgIGlmICghdGhpcy5pc0V4aXN0TGlwU3luY1BhcmFtZXRlcnMoKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZm9yIChcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBpIDwgdGhpcy5fanNvblZhbHVlLmF0KEZyZXF1ZXN0Tm9kZS5GcmVxdWVzdE5vZGVfR3JvdXBzKS5nZXRTaXplKCk7XG4gICAgICAgIGkrK1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHJlZkk6IFZhbHVlID0gdGhpcy5fanNvblZhbHVlXG4gICAgICAgICAgLmF0KEZyZXF1ZXN0Tm9kZS5GcmVxdWVzdE5vZGVfR3JvdXBzKVxuICAgICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgoaSk7XG4gICAgICAgIGlmIChyZWZJLmlzTnVsbCgpIHx8IHJlZkkuaXNFcnJvcigpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVmSS5nZXRWYWx1ZUJ5U3RyaW5nKE5hbWUpLmdldFJhd1N0cmluZygpID09IExpcFN5bmMpIHtcbiAgICAgICAgICByZXR1cm4gQ3ViaXNtRnJhbWV3b3JrLmdldElkTWFuYWdlcigpLmdldElkKFxuICAgICAgICAgICAgcmVmSVxuICAgICAgICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhJZHMpXG4gICAgICAgICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgoaW5kZXgpXG4gICAgICAgICAgICAgIC5nZXRSYXdTdHJpbmcoKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODouODh+ODq+ODleOCoeOCpOODq+OBruOCreODvOOBjOWtmOWcqOOBmeOCi+OBi+OBqeOBhuOBi+OCkueiuuiqjeOBmeOCi1xuICAgICAqIEByZXR1cm4gdHJ1ZSDjgq3jg7zjgYzlrZjlnKjjgZnjgotcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOOCreODvOOBjOWtmOWcqOOBl+OBquOBhFxuICAgICAqL1xuICAgIHByaXZhdGUgaXNFeGlzdE1vZGVsRmlsZSgpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IG5vZGU6IFZhbHVlID0gdGhpcy5fanNvblZhbHVlLmF0KEZyZXF1ZXN0Tm9kZS5GcmVxdWVzdE5vZGVfTW9jKTtcbiAgICAgIHJldHVybiAhbm9kZS5pc051bGwoKSAmJiAhbm9kZS5pc0Vycm9yKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44OG44Kv44K544OB44Oj44OV44Kh44Kk44Or44Gu44Kt44O844GM5a2Y5Zyo44GZ44KL44GL44Gp44GG44GL44KS56K66KqN44GZ44KLXG4gICAgICogQHJldHVybiB0cnVlIOOCreODvOOBjOWtmOWcqOOBmeOCi1xuICAgICAqIEByZXR1cm4gZmFsc2Ug44Kt44O844GM5a2Y5Zyo44GX44Gq44GEXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0V4aXN0VGV4dHVyZUZpbGVzKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgbm9kZTogVmFsdWUgPSB0aGlzLl9qc29uVmFsdWUuYXQoXG4gICAgICAgIEZyZXF1ZXN0Tm9kZS5GcmVxdWVzdE5vZGVfVGV4dHVyZXNcbiAgICAgICk7XG4gICAgICByZXR1cm4gIW5vZGUuaXNOdWxsKCkgJiYgIW5vZGUuaXNFcnJvcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOW9k+OBn+OCiuWIpOWumuOBruOCreODvOOBjOWtmOWcqOOBmeOCi+OBi+OBqeOBhuOBi+OCkueiuuiqjeOBmeOCi1xuICAgICAqIEByZXR1cm4gdHJ1ZSDjgq3jg7zjgYzlrZjlnKjjgZnjgotcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOOCreODvOOBjOWtmOWcqOOBl+OBquOBhFxuICAgICAqL1xuICAgIHByaXZhdGUgaXNFeGlzdEhpdEFyZWFzKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgbm9kZTogVmFsdWUgPSB0aGlzLl9qc29uVmFsdWUuYXQoXG4gICAgICAgIEZyZXF1ZXN0Tm9kZS5GcmVxdWVzdE5vZGVfSGl0QXJlYXNcbiAgICAgICk7XG4gICAgICByZXR1cm4gIW5vZGUuaXNOdWxsKCkgJiYgIW5vZGUuaXNFcnJvcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOeJqeeQhua8lOeul+ODleOCoeOCpOODq+OBruOCreODvOOBjOWtmOWcqOOBmeOCi+OBi+OBqeOBhuOBi+OCkueiuuiqjeOBmeOCi1xuICAgICAqIEByZXR1cm4gdHJ1ZSDjgq3jg7zjgYzlrZjlnKjjgZnjgotcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOOCreODvOOBjOWtmOWcqOOBl+OBquOBhFxuICAgICAqL1xuICAgIHByaXZhdGUgaXNFeGlzdFBoeXNpY3NGaWxlKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgbm9kZTogVmFsdWUgPSB0aGlzLl9qc29uVmFsdWUuYXQoRnJlcXVlc3ROb2RlLkZyZXF1ZXN0Tm9kZV9QaHlzaWNzKTtcbiAgICAgIHJldHVybiAhbm9kZS5pc051bGwoKSAmJiAhbm9kZS5pc0Vycm9yKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog44Od44O844K66Kit5a6a44OV44Kh44Kk44Or44Gu44Kt44O844GM5a2Y5Zyo44GZ44KL44GL44Gp44GG44GL44KS56K66KqN44GZ44KLXG4gICAgICogQHJldHVybiB0cnVlIOOCreODvOOBjOWtmOWcqOOBmeOCi1xuICAgICAqIEByZXR1cm4gZmFsc2Ug44Kt44O844GM5a2Y5Zyo44GX44Gq44GEXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0V4aXN0UG9zZUZpbGUoKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBub2RlOiBWYWx1ZSA9IHRoaXMuX2pzb25WYWx1ZS5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX1Bvc2UpO1xuICAgICAgcmV0dXJuICFub2RlLmlzTnVsbCgpICYmICFub2RlLmlzRXJyb3IoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDooajmg4XoqK3lrprjg5XjgqHjgqTjg6vjga7jgq3jg7zjgYzlrZjlnKjjgZnjgovjgYvjganjgYbjgYvjgpLnorroqo3jgZnjgotcbiAgICAgKiBAcmV0dXJuIHRydWUg44Kt44O844GM5a2Y5Zyo44GZ44KLXG4gICAgICogQHJldHVybiBmYWxzZSDjgq3jg7zjgYzlrZjlnKjjgZfjgarjgYRcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzRXhpc3RFeHByZXNzaW9uRmlsZSgpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IG5vZGU6IFZhbHVlID0gdGhpcy5fanNvblZhbHVlLmF0KFxuICAgICAgICBGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX0V4cHJlc3Npb25zXG4gICAgICApO1xuICAgICAgcmV0dXJuICFub2RlLmlzTnVsbCgpICYmICFub2RlLmlzRXJyb3IoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7PjgrDjg6vjg7zjg5fjga7jgq3jg7zjgYzlrZjlnKjjgZnjgovjgYvjganjgYbjgYvjgpLnorroqo3jgZnjgotcbiAgICAgKiBAcmV0dXJuIHRydWUg44Kt44O844GM5a2Y5Zyo44GZ44KLXG4gICAgICogQHJldHVybiBmYWxzZSDjgq3jg7zjgYzlrZjlnKjjgZfjgarjgYRcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzRXhpc3RNb3Rpb25Hcm91cHMoKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBub2RlOiBWYWx1ZSA9IHRoaXMuX2pzb25WYWx1ZS5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX01vdGlvbnMpO1xuICAgICAgcmV0dXJuICFub2RlLmlzTnVsbCgpICYmICFub2RlLmlzRXJyb3IoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlvJXmlbDjgafmjIflrprjgZfjgZ/jg6Ljg7zjgrfjg6fjg7PjgrDjg6vjg7zjg5fjga7jgq3jg7zjgYzlrZjlnKjjgZnjgovjgYvjganjgYbjgYvjgpLnorroqo3jgZnjgotcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lICDjgrDjg6vjg7zjg5flkI1cbiAgICAgKiBAcmV0dXJuIHRydWUg44Kt44O844GM5a2Y5Zyo44GZ44KLXG4gICAgICogQHJldHVybiBmYWxzZSDjgq3jg7zjgYzlrZjlnKjjgZfjgarjgYRcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzRXhpc3RNb3Rpb25Hcm91cE5hbWUoZ3JvdXBOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IG5vZGU6IFZhbHVlID0gdGhpcy5fanNvblZhbHVlXG4gICAgICAgIC5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX01vdGlvbnMpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKGdyb3VwTmFtZSk7XG4gICAgICByZXR1cm4gIW5vZGUuaXNOdWxsKCkgJiYgIW5vZGUuaXNFcnJvcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOW8leaVsOOBp+aMh+WumuOBl+OBn+ODouODvOOCt+ODp+ODs+OBq+WvvuW/nOOBmeOCi+OCteOCpuODs+ODieODleOCoeOCpOODq+OBruOCreODvOOBjOWtmOWcqOOBmeOCi+OBi+OBqeOBhuOBi+OCkueiuuiqjeOBmeOCi1xuICAgICAqIEBwYXJhbSBncm91cE5hbWUgIOOCsOODq+ODvOODl+WQjVxuICAgICAqIEBwYXJhbSBpbmRleCDphY3liJfjga7jgqTjg7Pjg4fjg4Pjgq/jgrnlgKRcbiAgICAgKiBAcmV0dXJuIHRydWUg44Kt44O844GM5a2Y5Zyo44GZ44KLXG4gICAgICogQHJldHVybiBmYWxzZSDjgq3jg7zjgYzlrZjlnKjjgZfjgarjgYRcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzRXhpc3RNb3Rpb25Tb3VuZEZpbGUoZ3JvdXBOYW1lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IG5vZGU6IFZhbHVlID0gdGhpcy5fanNvblZhbHVlXG4gICAgICAgIC5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX01vdGlvbnMpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKGdyb3VwTmFtZSlcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChpbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoU291bmRQYXRoKTtcbiAgICAgIHJldHVybiAhbm9kZS5pc051bGwoKSAmJiAhbm9kZS5pc0Vycm9yKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5byV5pWw44Gn5oyH5a6a44GX44Gf44Oi44O844K344On44Oz44Gr5a++5b+c44GZ44KL44OV44Kn44O844OJ44Kk44Oz5pmC6ZaT44Gu44Kt44O844GM5a2Y5Zyo44GZ44KL44GL44Gp44GG44GL44KS56K66KqN44GZ44KLXG4gICAgICogQHBhcmFtIGdyb3VwTmFtZSAg44Kw44Or44O844OX5ZCNXG4gICAgICogQHBhcmFtIGluZGV4IOmFjeWIl+OBruOCpOODs+ODh+ODg+OCr+OCueWApFxuICAgICAqIEByZXR1cm4gdHJ1ZSDjgq3jg7zjgYzlrZjlnKjjgZnjgotcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOOCreODvOOBjOWtmOWcqOOBl+OBquOBhFxuICAgICAqL1xuICAgIHByaXZhdGUgaXNFeGlzdE1vdGlvbkZhZGVJbihncm91cE5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgbm9kZTogVmFsdWUgPSB0aGlzLl9qc29uVmFsdWVcbiAgICAgICAgLmF0KEZyZXF1ZXN0Tm9kZS5GcmVxdWVzdE5vZGVfTW90aW9ucylcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoZ3JvdXBOYW1lKVxuICAgICAgICAuZ2V0VmFsdWVCeUluZGV4KGluZGV4KVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhGYWRlSW5UaW1lKTtcbiAgICAgIHJldHVybiAhbm9kZS5pc051bGwoKSAmJiAhbm9kZS5pc0Vycm9yKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5byV5pWw44Gn5oyH5a6a44GX44Gf44Oi44O844K344On44Oz44Gr5a++5b+c44GZ44KL44OV44Kn44O844OJ44Ki44Km44OI5pmC6ZaT44Gu44Kt44O844GM5a2Y5Zyo44GZ44KL44GL44Gp44GG44GL44KS56K66KqN44GZ44KLXG4gICAgICogQHBhcmFtIGdyb3VwTmFtZSAg44Kw44Or44O844OX5ZCNXG4gICAgICogQHBhcmFtIGluZGV4IOmFjeWIl+OBruOCpOODs+ODh+ODg+OCr+OCueWApFxuICAgICAqIEByZXR1cm4gdHJ1ZSDjgq3jg7zjgYzlrZjlnKjjgZnjgotcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOOCreODvOOBjOWtmOWcqOOBl+OBquOBhFxuICAgICAqL1xuICAgIHByaXZhdGUgaXNFeGlzdE1vdGlvbkZhZGVPdXQoZ3JvdXBOYW1lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IG5vZGU6IFZhbHVlID0gdGhpcy5fanNvblZhbHVlXG4gICAgICAgIC5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX01vdGlvbnMpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKGdyb3VwTmFtZSlcbiAgICAgICAgLmdldFZhbHVlQnlJbmRleChpbmRleClcbiAgICAgICAgLmdldFZhbHVlQnlTdHJpbmcoRmFkZU91dFRpbWUpO1xuICAgICAgcmV0dXJuICFub2RlLmlzTnVsbCgpICYmICFub2RlLmlzRXJyb3IoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VyRGF0YeOBruODleOCoeOCpOODq+WQjeOBjOWtmOWcqOOBmeOCi+OBi+OBqeOBhuOBi+OCkueiuuiqjeOBmeOCi1xuICAgICAqIEByZXR1cm4gdHJ1ZSDjgq3jg7zjgYzlrZjlnKjjgZnjgotcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOOCreODvOOBjOWtmOWcqOOBl+OBquOBhFxuICAgICAqL1xuICAgIHByaXZhdGUgaXNFeGlzdFVzZXJEYXRhRmlsZSgpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IG5vZGU6IFZhbHVlID0gdGhpcy5fanNvblxuICAgICAgICAuZ2V0Um9vdCgpXG4gICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKEZpbGVSZWZlcmVuY2VzKVxuICAgICAgICAuZ2V0VmFsdWVCeVN0cmluZyhVc2VyRGF0YSk7XG4gICAgICByZXR1cm4gIW5vZGUuaXNOdWxsKCkgJiYgIW5vZGUuaXNFcnJvcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOebruOBseOBoeOBq+WvvuW/nOS7mOOBkeOCieOCjOOBn+ODkeODqeODoeODvOOCv+OBjOWtmOWcqOOBmeOCi+OBi+OBqeOBhuOBi+OCkueiuuiqjeOBmeOCi1xuICAgICAqIEByZXR1cm4gdHJ1ZSDjgq3jg7zjgYzlrZjlnKjjgZnjgotcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOOCreODvOOBjOWtmOWcqOOBl+OBquOBhFxuICAgICAqL1xuICAgIHByaXZhdGUgaXNFeGlzdEV5ZUJsaW5rUGFyYW1ldGVycygpOiBib29sZWFuIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fanNvblZhbHVlLmF0KEZyZXF1ZXN0Tm9kZS5GcmVxdWVzdE5vZGVfR3JvdXBzKS5pc051bGwoKSB8fFxuICAgICAgICB0aGlzLl9qc29uVmFsdWUuYXQoRnJlcXVlc3ROb2RlLkZyZXF1ZXN0Tm9kZV9Hcm91cHMpLmlzRXJyb3IoKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBpIDwgdGhpcy5fanNvblZhbHVlLmF0KEZyZXF1ZXN0Tm9kZS5GcmVxdWVzdE5vZGVfR3JvdXBzKS5nZXRTaXplKCk7XG4gICAgICAgICsraVxuICAgICAgKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLl9qc29uVmFsdWVcbiAgICAgICAgICAgIC5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX0dyb3VwcylcbiAgICAgICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgoaSlcbiAgICAgICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKE5hbWUpXG4gICAgICAgICAgICAuZ2V0UmF3U3RyaW5nKCkgPT0gRXllQmxpbmtcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOODquODg+ODl+OCt+ODs+OCr+OBq+WvvuW/nOS7mOOBkeOCieOCjOOBn+ODkeODqeODoeODvOOCv+OBjOWtmOWcqOOBmeOCi+OBi+OBqeOBhuOBi+OCkueiuuiqjeOBmeOCi1xuICAgICAqIEByZXR1cm4gdHJ1ZSDjgq3jg7zjgYzlrZjlnKjjgZnjgotcbiAgICAgKiBAcmV0dXJuIGZhbHNlIOOCreODvOOBjOWtmOWcqOOBl+OBquOBhFxuICAgICAqL1xuICAgIHByaXZhdGUgaXNFeGlzdExpcFN5bmNQYXJhbWV0ZXJzKCk6IGJvb2xlYW4ge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9qc29uVmFsdWUuYXQoRnJlcXVlc3ROb2RlLkZyZXF1ZXN0Tm9kZV9Hcm91cHMpLmlzTnVsbCgpIHx8XG4gICAgICAgIHRoaXMuX2pzb25WYWx1ZS5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX0dyb3VwcykuaXNFcnJvcigpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZm9yIChcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBpIDwgdGhpcy5fanNvblZhbHVlLmF0KEZyZXF1ZXN0Tm9kZS5GcmVxdWVzdE5vZGVfR3JvdXBzKS5nZXRTaXplKCk7XG4gICAgICAgICsraVxuICAgICAgKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLl9qc29uVmFsdWVcbiAgICAgICAgICAgIC5hdChGcmVxdWVzdE5vZGUuRnJlcXVlc3ROb2RlX0dyb3VwcylcbiAgICAgICAgICAgIC5nZXRWYWx1ZUJ5SW5kZXgoaSlcbiAgICAgICAgICAgIC5nZXRWYWx1ZUJ5U3RyaW5nKE5hbWUpXG4gICAgICAgICAgICAuZ2V0UmF3U3RyaW5nKCkgPT0gTGlwU3luY1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2pzb246IEN1YmlzbUpzb247XG4gICAgcHJpdmF0ZSBfanNvblZhbHVlOiBjc21WZWN0b3I8VmFsdWU+O1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRoZSBMaXZlMkQgT3BlbiBTb2Z0d2FyZSBsaWNlbnNlXG4gKiB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5saXZlMmQuY29tL2V1bGEvbGl2ZTJkLW9wZW4tc29mdHdhcmUtbGljZW5zZS1hZ3JlZW1lbnRfZW4uaHRtbC5cbiAqL1xuXG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3ViaXNtaWQgfSBmcm9tICcuL2lkL2N1YmlzbWlkJztcbmltcG9ydCB7IExpdmUyREN1YmlzbUZyYW1ld29yayBhcyBjc21tYXAgfSBmcm9tICcuL3R5cGUvY3NtbWFwJztcbmltcG9ydCBjc21NYXAgPSBjc21tYXAuY3NtTWFwO1xuaW1wb3J0IEN1YmlzbUlkSGFuZGxlID0gY3ViaXNtaWQuQ3ViaXNtSWRIYW5kbGU7XG5cbmV4cG9ydCBuYW1lc3BhY2UgTGl2ZTJEQ3ViaXNtRnJhbWV3b3JrIHtcbiAgLyoqXG4gICAqIOODouODh+ODq+ioreWumuaDheWgseOCkuWPluOCiuaJseOBhumWouaVsOOCkuWuo+iogOOBl+OBn+e0lOeyi+S7ruaDs+OCr+ODqeOCueOAglxuICAgKlxuICAgKiDjgZPjga7jgq/jg6njgrnjgpLntpnmib/jgZnjgovjgZPjgajjgafjgIHjg6Ljg4fjg6voqK3lrprmg4XloLHjgpLlj5bjgormibHjgYbjgq/jg6njgrnjgavjgarjgovjgIJcbiAgICovXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJQ3ViaXNtTW9kZWxTZXR0aW5nIHtcbiAgICAvKipcbiAgICAgKiBNb2Pjg5XjgqHjgqTjg6vjga7lkI3liY3jgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJuIE1vY+ODleOCoeOCpOODq+OBruWQjeWJjVxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRNb2RlbEZpbGVOYW1lKCk6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIOODouODh+ODq+OBjOS9v+eUqOOBmeOCi+ODhuOCr+OCueODgeODo+OBruaVsOOCkuWPluW+l+OBmeOCi1xuICAgICAqIOODhuOCr+OCueODgeODo+OBruaVsFxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRUZXh0dXJlQ291bnQoKTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICog44OG44Kv44K544OB44Oj44GM6YWN572u44GV44KM44Gf44OH44Kj44Os44Kv44OI44Oq44Gu5ZCN5YmN44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDjg4bjgq/jgrnjg4Hjg6PjgYzphY3nva7jgZXjgozjgZ/jg4fjgqPjg6zjgq/jg4jjg6rjga7lkI3liY1cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0VGV4dHVyZURpcmVjdG9yeSgpOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg4fjg6vjgYzkvb/nlKjjgZnjgovjg4bjgq/jgrnjg4Hjg6Pjga7lkI3liY3jgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcGFyYW0gaW5kZXgg6YWN5YiX44Gu44Kk44Oz44OH44OD44Kv44K55YCkXG4gICAgICogQHJldHVybiDjg4bjgq/jgrnjg4Hjg6Pjga7lkI3liY1cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0VGV4dHVyZUZpbGVOYW1lKGluZGV4OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg4fjg6vjgavoqK3lrprjgZXjgozjgZ/lvZPjgZ/jgorliKTlrprjga7mlbDjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJuIOODouODh+ODq+OBq+ioreWumuOBleOCjOOBn+W9k+OBn+OCiuWIpOWumuOBruaVsFxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRIaXRBcmVhc0NvdW50KCk6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIOW9k+OBn+OCiuWIpOWumuOBq+ioreWumuOBleOCjOOBn0lE44KS5Y+W5b6X44GZ44KLXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXgg6YWN5YiX44GuaW5kZXhcbiAgICAgKiBAcmV0dXJuIOW9k+OBn+OCiuWIpOWumuOBq+ioreWumuOBleOCjOOBn0lEXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldEhpdEFyZWFJZChpbmRleDogbnVtYmVyKTogQ3ViaXNtSWRIYW5kbGU7XG5cbiAgICAvKipcbiAgICAgKiDlvZPjgZ/jgorliKTlrprjgavoqK3lrprjgZXjgozjgZ/lkI3liY3jgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcGFyYW0gaW5kZXgg6YWN5YiX44Gu44Kk44Oz44OH44OD44Kv44K55YCkXG4gICAgICogQHJldHVybiDlvZPjgZ/jgorliKTlrprjgavoqK3lrprjgZXjgozjgZ/lkI3liY1cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0SGl0QXJlYU5hbWUoaW5kZXg6IG51bWJlcik6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIOeJqeeQhua8lOeul+ioreWumuODleOCoeOCpOODq+OBruWQjeWJjeOCkuWPluW+l+OBmeOCi1xuICAgICAqIEByZXR1cm4g54mp55CG5ryU566X6Kit5a6a44OV44Kh44Kk44Or44Gu5ZCN5YmNXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldFBoeXNpY3NGaWxlTmFtZSgpOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiDjg5Hjg7zjg4TliIfjgormm7/jgYjoqK3lrprjg5XjgqHjgqTjg6vjga7lkI3liY3jgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcmV0dXJuIOODkeODvOODhOWIh+OCiuabv+OBiOioreWumuODleOCoeOCpOODq+OBruWQjeWJjVxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRQb3NlRmlsZU5hbWUoKTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICog6KGo5oOF6Kit5a6a44OV44Kh44Kk44Or44Gu5pWw44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDooajmg4XoqK3lrprjg5XjgqHjgqTjg6vjga7mlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0RXhwcmVzc2lvbkNvdW50KCk6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIOihqOaDheioreWumuODleOCoeOCpOODq+OCkuitmOWIpeOBmeOCi+WQjeWJje+8iOWIpeWQje+8ieOCkuWPluW+l+OBmeOCi1xuICAgICAqIEBwYXJhbSBpbmRleCDphY3liJfjga7jgqTjg7Pjg4fjg4Pjgq/jgrnlgKRcbiAgICAgKiBAcmV0dXJuIOihqOaDheOBruWQjeWJjVxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRFeHByZXNzaW9uTmFtZShpbmRleDogbnVtYmVyKTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICog6KGo5oOF6Kit5a6a44OV44Kh44Kk44Or44Gu5ZCN5YmN44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHBhcmFtIGluZGV4IOmFjeWIl+OBruOCpOODs+ODh+ODg+OCr+OCueWApFxuICAgICAqIEByZXR1cm4g6KGo5oOF6Kit5a6a44OV44Kh44Kk44Or44Gu5ZCN5YmNXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldEV4cHJlc3Npb25GaWxlTmFtZShpbmRleDogbnVtYmVyKTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz44Kw44Or44O844OX44Gu5pWw44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDjg6Ljg7zjgrfjg6fjg7PjgrDjg6vjg7zjg5fjga7mlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0TW90aW9uR3JvdXBDb3VudCgpOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7PjgrDjg6vjg7zjg5fjga7lkI3liY3jgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcGFyYW0gaW5kZXgg6YWN5YiX44Gu44Kk44Oz44OH44OD44Kv44K55YCkXG4gICAgICogQHJldHVybiDjg6Ljg7zjgrfjg6fjg7PjgrDjg6vjg7zjg5fjga7lkI3liY1cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0TW90aW9uR3JvdXBOYW1lKGluZGV4OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiDjg6Ljg7zjgrfjg6fjg7PjgrDjg6vjg7zjg5fjgavlkKvjgb7jgozjgovjg6Ljg7zjgrfjg6fjg7Pjga7mlbDjgpLlj5blvpfjgZnjgotcbiAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIOODouODvOOCt+ODp+ODs+OCsOODq+ODvOODl+OBruWQjeWJjVxuICAgICAqIEByZXR1cm4g44Oi44O844K344On44Oz44Kw44Or44O844OX44Gu5pWwXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldE1vdGlvbkNvdW50KGdyb3VwTmFtZTogc3RyaW5nKTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICog44Kw44Or44O844OX5ZCN44Go44Kk44Oz44OH44OD44Kv44K55YCk44GL44KJ44Oi44O844K344On44Oz44OV44Kh44Kk44Or5ZCN44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHBhcmFtIGdyb3VwTmFtZSDjg6Ljg7zjgrfjg6fjg7PjgrDjg6vjg7zjg5fjga7lkI3liY1cbiAgICAgKiBAcGFyYW0gaW5kZXggICAgIOmFjeWIl+OBruOCpOODs+ODh+ODg+OCr+OCueWApFxuICAgICAqIEByZXR1cm4g44Oi44O844K344On44Oz44OV44Kh44Kk44Or44Gu5ZCN5YmNXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldE1vdGlvbkZpbGVOYW1lKGdyb3VwTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz44Gr5a++5b+c44GZ44KL44K144Km44Oz44OJ44OV44Kh44Kk44Or44Gu5ZCN5YmN44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHBhcmFtIGdyb3VwTmFtZSDjg6Ljg7zjgrfjg6fjg7PjgrDjg6vjg7zjg5fjga7lkI3liY1cbiAgICAgKiBAcGFyYW0gaW5kZXgg6YWN5YiX44Gu44Kk44Oz44OH44OD44Kv44K55YCkXG4gICAgICogQHJldHVybiDjgrXjgqbjg7Pjg4njg5XjgqHjgqTjg6vjga7lkI3liY1cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0TW90aW9uU291bmRGaWxlTmFtZShcbiAgICAgIGdyb3VwTmFtZTogc3RyaW5nLFxuICAgICAgaW5kZXg6IG51bWJlclxuICAgICk6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIOODouODvOOCt+ODp+ODs+mWi+Wni+aZguOBruODleOCp+ODvOODieOCpOODs+WHpueQhuaZgumWk+OCkuWPluW+l+OBmeOCi1xuICAgICAqIEBwYXJhbSBncm91cE5hbWUg44Oi44O844K344On44Oz44Kw44Or44O844OX44Gu5ZCN5YmNXG4gICAgICogQHBhcmFtIGluZGV4IOmFjeWIl+OBruOCpOODs+ODh+ODg+OCr+OCueWApFxuICAgICAqIEByZXR1cm4g44OV44Kn44O844OJ44Kk44Oz5Yem55CG5pmC6ZaTW+enkl1cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0TW90aW9uRmFkZUluVGltZVZhbHVlKFxuICAgICAgZ3JvdXBOYW1lOiBzdHJpbmcsXG4gICAgICBpbmRleDogbnVtYmVyXG4gICAgKTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICog44Oi44O844K344On44Oz57WC5LqG5pmC44Gu44OV44Kn44O844OJ44Ki44Km44OI5Yem55CG5pmC6ZaT44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHBhcmFtIGdyb3VwTmFtZSDjg6Ljg7zjgrfjg6fjg7PjgrDjg6vjg7zjg5fjga7lkI3liY1cbiAgICAgKiBAcGFyYW0gaW5kZXgg6YWN5YiX44Gu44Kk44Oz44OH44OD44Kv44K55YCkXG4gICAgICogQHJldHVybiDjg5Xjgqfjg7zjg4njgqLjgqbjg4jlh6bnkIbmmYLplpNb56eSXVxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRNb3Rpb25GYWRlT3V0VGltZVZhbHVlKFxuICAgICAgZ3JvdXBOYW1lOiBzdHJpbmcsXG4gICAgICBpbmRleDogbnVtYmVyXG4gICAgKTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICog44Om44O844K244O844OH44O844K/44Gu44OV44Kh44Kk44Or5ZCN44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDjg6bjg7zjgrbjg7zjg4fjg7zjgr/jga7jg5XjgqHjgqTjg6vlkI1cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0VXNlckRhdGFGaWxlKCk6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIOODrOOCpOOCouOCpuODiOaDheWgseOCkuWPluW+l+OBmeOCi1xuICAgICAqIEBwYXJhbSBvdXRMYXlvdXRNYXAgY3NtTWFw44Kv44Op44K544Gu44Kk44Oz44K544K/44Oz44K5XG4gICAgICogQHJldHVybiB0cnVlIOODrOOCpOOCouOCpuODiOaDheWgseOBjOWtmOWcqOOBmeOCi1xuICAgICAqIEByZXR1cm4gZmFsc2Ug44Os44Kk44Ki44Km44OI5oOF5aCx44GM5a2Y5Zyo44GX44Gq44GEXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldExheW91dE1hcChvdXRMYXlvdXRNYXA6IGNzbU1hcDxzdHJpbmcsIG51bWJlcj4pOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICog55uu44OR44OB44Gr6Zai6YCj5LuY44GR44KJ44KM44Gf44OR44Op44Oh44O844K/44Gu5pWw44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDnm67jg5Hjg4HjgavplqLpgKPku5jjgZHjgonjgozjgZ/jg5Hjg6njg6Hjg7zjgr/jga7mlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0RXllQmxpbmtQYXJhbWV0ZXJDb3VudCgpOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiDnm67jg5Hjg4HjgavplqLpgKPku5jjgZHjgonjgozjgZ/jg5Hjg6njg6Hjg7zjgr/jga5JROOCkuWPluW+l+OBmeOCi1xuICAgICAqIEBwYXJhbSBpbmRleCDphY3liJfjga7jgqTjg7Pjg4fjg4Pjgq/jgrnlgKRcbiAgICAgKiBAcmV0dXJuIOODkeODqeODoeODvOOCv0lEXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldEV5ZUJsaW5rUGFyYW1ldGVySWQoaW5kZXg6IG51bWJlcik6IEN1YmlzbUlkSGFuZGxlO1xuXG4gICAgLyoqXG4gICAgICog44Oq44OD44OX44K344Oz44Kv44Gr6Zai6YCj5LuY44GR44KJ44KM44Gf44OR44Op44Oh44O844K/44Gu5pWw44KS5Y+W5b6X44GZ44KLXG4gICAgICogQHJldHVybiDjg6rjg4Pjg5fjgrfjg7Pjgq/jgavplqLpgKPku5jjgZHjgonjgozjgZ/jg5Hjg6njg6Hjg7zjgr/jga7mlbBcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0TGlwU3luY1BhcmFtZXRlckNvdW50KCk6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIOODquODg+ODl+OCt+ODs+OCr+OBq+mWoumAo+S7mOOBkeOCieOCjOOBn+ODkeODqeODoeODvOOCv+OBruaVsOOCkuWPluW+l+OBmeOCi1xuICAgICAqIEBwYXJhbSBpbmRleCDphY3liJfjga7jgqTjg7Pjg4fjg4Pjgq/jgrnlgKRcbiAgICAgKiBAcmV0dXJuIOODkeODqeODoeODvOOCv0lEXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldExpcFN5bmNQYXJhbWV0ZXJJZChpbmRleDogbnVtYmVyKTogQ3ViaXNtSWRIYW5kbGU7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0KGMpIExpdmUyRCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGhlIExpdmUyRCBPcGVuIFNvZnR3YXJlIGxpY2Vuc2VcbiAqIHRoYXQgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmxpdmUyZC5jb20vZXVsYS9saXZlMmQtb3Blbi1zb2Z0d2FyZS1saWNlbnNlLWFncmVlbWVudF9lbi5odG1sLlxuICovXG5cbi8qKlxuICogQGJyaWVmIOODkeODqeODoeODvOOCv0lE44Gu44OH44OV44Kp44Or44OI5YCk44KS5L+d5oyB44GZ44KL5a6a5pWwPGJyPlxuICogICAgICAgICDjg4fjg5Xjgqnjg6vjg4jlgKTjga7ku5Xmp5jjga/ku6XkuIvjga7jg57jg4vjg6XjgqLjg6vjgavln7rjgaXjgY88YnI+XG4gKiAgICAgICAgIGh0dHBzOi8vZG9jcy5saXZlMmQuY29tL2N1YmlzbS1lZGl0b3ItbWFudWFsL3N0YW5kYXJkLXBhcmFtZXRvci1saXN0L1xuICovXG5leHBvcnQgbmFtZXNwYWNlIExpdmUyREN1YmlzbUZyYW1ld29yayB7XG4gIC8vIOODkeODvOODhElEXG4gIGV4cG9ydCBjb25zdCBIaXRBcmVhUHJlZml4ID0gJ0hpdEFyZWEnO1xuICBleHBvcnQgY29uc3QgSGl0QXJlYUhlYWQgPSAnSGVhZCc7XG4gIGV4cG9ydCBjb25zdCBIaXRBcmVhQm9keSA9ICdCb2R5JztcbiAgZXhwb3J0IGNvbnN0IFBhcnRzSWRDb3JlID0gJ1BhcnRzMDFDb3JlJztcbiAgZXhwb3J0IGNvbnN0IFBhcnRzQXJtUHJlZml4ID0gJ1BhcnRzMDFBcm1fJztcbiAgZXhwb3J0IGNvbnN0IFBhcnRzQXJtTFByZWZpeCA9ICdQYXJ0czAxQXJtTF8nO1xuICBleHBvcnQgY29uc3QgUGFydHNBcm1SUHJlZml4ID0gJ1BhcnRzMDFBcm1SXyc7XG5cbiAgLy8g5Y+C5pWwSUTvvJpcbiAgZXhwb3J0IGNvbnN0IFBhcmFtQW5nbGVYID0gJ1BhcmFtQW5nbGVYJztcbiAgZXhwb3J0IGNvbnN0IFBhcmFtQW5nbGVZID0gJ1BhcmFtQW5nbGVZJztcbiAgZXhwb3J0IGNvbnN0IFBhcmFtQW5nbGVaID0gJ1BhcmFtQW5nbGVaJztcbiAgZXhwb3J0IGNvbnN0IFBhcmFtRXllTE9wZW4gPSAnUGFyYW1FeWVMT3Blbic7XG4gIGV4cG9ydCBjb25zdCBQYXJhbUV5ZUxTbWlsZSA9ICdQYXJhbUV5ZUxTbWlsZSc7XG4gIGV4cG9ydCBjb25zdCBQYXJhbUV5ZVJPcGVuID0gJ1BhcmFtRXllUk9wZW4nO1xuICBleHBvcnQgY29uc3QgUGFyYW1FeWVSU21pbGUgPSAnUGFyYW1FeWVSU21pbGUnO1xuICBleHBvcnQgY29uc3QgUGFyYW1FeWVCYWxsWCA9ICdQYXJhbUV5ZUJhbGxYJztcbiAgZXhwb3J0IGNvbnN0IFBhcmFtRXllQmFsbFkgPSAnUGFyYW1FeWVCYWxsWSc7XG4gIGV4cG9ydCBjb25zdCBQYXJhbUV5ZUJhbGxGb3JtID0gJ1BhcmFtRXllQmFsbEZvcm0nO1xuICBleHBvcnQgY29uc3QgUGFyYW1Ccm93TFkgPSAnUGFyYW1Ccm93TFknO1xuICBleHBvcnQgY29uc3QgUGFyYW1Ccm93UlkgPSAnUGFyYW1Ccm93UlknO1xuICBleHBvcnQgY29uc3QgUGFyYW1Ccm93TFggPSAnUGFyYW1Ccm93TFgnO1xuICBleHBvcnQgY29uc3QgUGFyYW1Ccm93UlggPSAnUGFyYW1Ccm93UlgnO1xuICBleHBvcnQgY29uc3QgUGFyYW1Ccm93TEFuZ2xlID0gJ1BhcmFtQnJvd0xBbmdsZSc7XG4gIGV4cG9ydCBjb25zdCBQYXJhbUJyb3dSQW5nbGUgPSAnUGFyYW1Ccm93UkFuZ2xlJztcbiAgZXhwb3J0IGNvbnN0IFBhcmFtQnJvd0xGb3JtID0gJ1BhcmFtQnJvd0xGb3JtJztcbiAgZXhwb3J0IGNvbnN0IFBhcmFtQnJvd1JGb3JtID0gJ1BhcmFtQnJvd1JGb3JtJztcbiAgZXhwb3J0IGNvbnN0IFBhcmFtTW91dGhGb3JtID0gJ1BhcmFtTW91dGhGb3JtJztcbiAgZXhwb3J0IGNvbnN0IFBhcmFtTW91dGhPcGVuWSA9ICdQYXJhbU1vdXRoT3BlblknO1xuICBleHBvcnQgY29uc3QgUGFyYW1DaGVlayA9ICdQYXJhbUNoZWVrJztcbiAgZXhwb3J0IGNvbnN0IFBhcmFtQm9keUFuZ2xlWCA9ICdQYXJhbUJvZHlBbmdsZVgnO1xuICBleHBvcnQgY29uc3QgUGFyYW1Cb2R5QW5nbGVZID0gJ1BhcmFtQm9keUFuZ2xlWSc7XG4gIGV4cG9ydCBjb25zdCBQYXJhbUJvZHlBbmdsZVogPSAnUGFyYW1Cb2R5QW5nbGVaJztcbiAgZXhwb3J0IGNvbnN0IFBhcmFtQnJlYXRoID0gJ1BhcmFtQnJlYXRoJztcbiAgZXhwb3J0IGNvbnN0IFBhcmFtQXJtTEEgPSAnUGFyYW1Bcm1MQSc7XG4gIGV4cG9ydCBjb25zdCBQYXJhbUFybVJBID0gJ1BhcmFtQXJtUkEnO1xuICBleHBvcnQgY29uc3QgUGFyYW1Bcm1MQiA9ICdQYXJhbUFybUxCJztcbiAgZXhwb3J0IGNvbnN0IFBhcmFtQXJtUkIgPSAnUGFyYW1Bcm1SQic7XG4gIGV4cG9ydCBjb25zdCBQYXJhbUhhbmRMID0gJ1BhcmFtSGFuZEwnO1xuICBleHBvcnQgY29uc3QgUGFyYW1IYW5kUiA9ICdQYXJhbUhhbmRSJztcbiAgZXhwb3J0IGNvbnN0IFBhcmFtSGFpckZyb250ID0gJ1BhcmFtSGFpckZyb250JztcbiAgZXhwb3J0IGNvbnN0IFBhcmFtSGFpclNpZGUgPSAnUGFyYW1IYWlyU2lkZSc7XG4gIGV4cG9ydCBjb25zdCBQYXJhbUhhaXJCYWNrID0gJ1BhcmFtSGFpckJhY2snO1xuICBleHBvcnQgY29uc3QgUGFyYW1IYWlyRmx1ZmZ5ID0gJ1BhcmFtSGFpckZsdWZmeSc7XG4gIGV4cG9ydCBjb25zdCBQYXJhbVNob3VsZGVyWSA9ICdQYXJhbVNob3VsZGVyWSc7XG4gIGV4cG9ydCBjb25zdCBQYXJhbUJ1c3RYID0gJ1BhcmFtQnVzdFgnO1xuICBleHBvcnQgY29uc3QgUGFyYW1CdXN0WSA9ICdQYXJhbUJ1c3RZJztcbiAgZXhwb3J0IGNvbnN0IFBhcmFtQmFzZVggPSAnUGFyYW1CYXNlWCc7XG4gIGV4cG9ydCBjb25zdCBQYXJhbUJhc2VZID0gJ1BhcmFtQmFzZVknO1xuICBleHBvcnQgY29uc3QgUGFyYW1OT05FID0gJ05PTkU6Jztcbn1cbiIsInZhciBzdXBwb3J0ID0ge1xuICBzZWFyY2hQYXJhbXM6ICdVUkxTZWFyY2hQYXJhbXMnIGluIHNlbGYsXG4gIGl0ZXJhYmxlOiAnU3ltYm9sJyBpbiBzZWxmICYmICdpdGVyYXRvcicgaW4gU3ltYm9sLFxuICBibG9iOlxuICAgICdGaWxlUmVhZGVyJyBpbiBzZWxmICYmXG4gICAgJ0Jsb2InIGluIHNlbGYgJiZcbiAgICAoZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgQmxvYigpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH0pKCksXG4gIGZvcm1EYXRhOiAnRm9ybURhdGEnIGluIHNlbGYsXG4gIGFycmF5QnVmZmVyOiAnQXJyYXlCdWZmZXInIGluIHNlbGZcbn1cblxuZnVuY3Rpb24gaXNEYXRhVmlldyhvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvYmopXG59XG5cbmlmIChzdXBwb3J0LmFycmF5QnVmZmVyKSB7XG4gIHZhciB2aWV3Q2xhc3NlcyA9IFtcbiAgICAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAnW29iamVjdCBVaW50OEFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgJ1tvYmplY3QgVWludDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAnW29iamVjdCBGbG9hdDY0QXJyYXldJ1xuICBdXG5cbiAgdmFyIGlzQXJyYXlCdWZmZXJWaWV3ID1cbiAgICBBcnJheUJ1ZmZlci5pc1ZpZXcgfHxcbiAgICBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdmlld0NsYXNzZXMuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSkgPiAtMVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmFtZShuYW1lKSB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICBuYW1lID0gU3RyaW5nKG5hbWUpXG4gIH1cbiAgaWYgKC9bXmEtejAtOVxcLSMkJSYnKisuXl9gfH5dL2kudGVzdChuYW1lKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVyIGluIGhlYWRlciBmaWVsZCBuYW1lJylcbiAgfVxuICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8vIEJ1aWxkIGEgZGVzdHJ1Y3RpdmUgaXRlcmF0b3IgZm9yIHRoZSB2YWx1ZSBsaXN0XG5mdW5jdGlvbiBpdGVyYXRvckZvcihpdGVtcykge1xuICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgbmV4dDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpXG4gICAgICByZXR1cm4ge2RvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZX1cbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICAgIGl0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBpdGVyYXRvclxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpdGVyYXRvclxufVxuXG5leHBvcnQgZnVuY3Rpb24gSGVhZGVycyhoZWFkZXJzKSB7XG4gIHRoaXMubWFwID0ge31cblxuICBpZiAoaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgIH0sIHRoaXMpXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbihoZWFkZXIpIHtcbiAgICAgIHRoaXMuYXBwZW5kKGhlYWRlclswXSwgaGVhZGVyWzFdKVxuICAgIH0sIHRoaXMpXG4gIH0gZWxzZSBpZiAoaGVhZGVycykge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgdGhpcy5hcHBlbmQobmFtZSwgaGVhZGVyc1tuYW1lXSlcbiAgICB9LCB0aGlzKVxuICB9XG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpXG4gIHZhbHVlID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG4gIHZhciBvbGRWYWx1ZSA9IHRoaXMubWFwW25hbWVdXG4gIHRoaXMubWFwW25hbWVdID0gb2xkVmFsdWUgPyBvbGRWYWx1ZSArICcsICcgKyB2YWx1ZSA6IHZhbHVlXG59XG5cbkhlYWRlcnMucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgZGVsZXRlIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSlcbiAgcmV0dXJuIHRoaXMuaGFzKG5hbWUpID8gdGhpcy5tYXBbbmFtZV0gOiBudWxsXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMubWFwLmhhc093blByb3BlcnR5KG5vcm1hbGl6ZU5hbWUobmFtZSkpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHRoaXMubWFwW25vcm1hbGl6ZU5hbWUobmFtZSldID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG59XG5cbkhlYWRlcnMucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaywgdGhpc0FyZykge1xuICBmb3IgKHZhciBuYW1lIGluIHRoaXMubWFwKSB7XG4gICAgaWYgKHRoaXMubWFwLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXMubWFwW25hbWVdLCBuYW1lLCB0aGlzKVxuICAgIH1cbiAgfVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2gobmFtZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGl0ZW1zID0gW11cbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgaXRlbXMucHVzaCh2YWx1ZSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5IZWFkZXJzLnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpdGVtcyA9IFtdXG4gIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGl0ZW1zLnB1c2goW25hbWUsIHZhbHVlXSlcbiAgfSlcbiAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxufVxuXG5pZiAoc3VwcG9ydC5pdGVyYWJsZSkge1xuICBIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gSGVhZGVycy5wcm90b3R5cGUuZW50cmllc1xufVxuXG5mdW5jdGlvbiBjb25zdW1lZChib2R5KSB7XG4gIGlmIChib2R5LmJvZHlVc2VkKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpKVxuICB9XG4gIGJvZHkuYm9keVVzZWQgPSB0cnVlXG59XG5cbmZ1bmN0aW9uIGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlc29sdmUocmVhZGVyLnJlc3VsdClcbiAgICB9XG4gICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlamVjdChyZWFkZXIuZXJyb3IpXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiByZWFkQmxvYkFzQXJyYXlCdWZmZXIoYmxvYikge1xuICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKVxuICByZXR1cm4gcHJvbWlzZVxufVxuXG5mdW5jdGlvbiByZWFkQmxvYkFzVGV4dChibG9iKSB7XG4gIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG4gIHZhciBwcm9taXNlID0gZmlsZVJlYWRlclJlYWR5KHJlYWRlcilcbiAgcmVhZGVyLnJlYWRBc1RleHQoYmxvYilcbiAgcmV0dXJuIHByb21pc2Vcbn1cblxuZnVuY3Rpb24gcmVhZEFycmF5QnVmZmVyQXNUZXh0KGJ1Zikge1xuICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1ZilcbiAgdmFyIGNoYXJzID0gbmV3IEFycmF5KHZpZXcubGVuZ3RoKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgIGNoYXJzW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZSh2aWV3W2ldKVxuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBidWZmZXJDbG9uZShidWYpIHtcbiAgaWYgKGJ1Zi5zbGljZSkge1xuICAgIHJldHVybiBidWYuc2xpY2UoMClcbiAgfSBlbHNlIHtcbiAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKVxuICAgIHZpZXcuc2V0KG5ldyBVaW50OEFycmF5KGJ1ZikpXG4gICAgcmV0dXJuIHZpZXcuYnVmZmVyXG4gIH1cbn1cblxuZnVuY3Rpb24gQm9keSgpIHtcbiAgdGhpcy5ib2R5VXNlZCA9IGZhbHNlXG5cbiAgdGhpcy5faW5pdEJvZHkgPSBmdW5jdGlvbihib2R5KSB7XG4gICAgdGhpcy5fYm9keUluaXQgPSBib2R5XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9ICcnXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5ibG9iICYmIEJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgIHRoaXMuX2JvZHlCbG9iID0gYm9keVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5mb3JtRGF0YSAmJiBGb3JtRGF0YS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgdGhpcy5fYm9keUZvcm1EYXRhID0gYm9keVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5zZWFyY2hQYXJhbXMgJiYgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpKSB7XG4gICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkudG9TdHJpbmcoKVxuICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlciAmJiBzdXBwb3J0LmJsb2IgJiYgaXNEYXRhVmlldyhib2R5KSkge1xuICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keS5idWZmZXIpXG4gICAgICAvLyBJRSAxMC0xMSBjYW4ndCBoYW5kbGUgYSBEYXRhVmlldyBib2R5LlxuICAgICAgdGhpcy5fYm9keUluaXQgPSBuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSlcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYXJyYXlCdWZmZXIgJiYgKEFycmF5QnVmZmVyLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGJvZHkpIHx8IGlzQXJyYXlCdWZmZXJWaWV3KGJvZHkpKSkge1xuICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGJvZHkpXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSkge1xuICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04JylcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUJsb2IgJiYgdGhpcy5fYm9keUJsb2IudHlwZSkge1xuICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCB0aGlzLl9ib2R5QmxvYi50eXBlKVxuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LnNlYXJjaFBhcmFtcyAmJiBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYm9keSkpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04JylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3VwcG9ydC5ibG9iKSB7XG4gICAgdGhpcy5ibG9iID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmVqZWN0ZWQgPSBjb25zdW1lZCh0aGlzKVxuICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgIHJldHVybiByZWplY3RlZFxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fYm9keUJsb2IpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QmxvYilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLl9ib2R5Rm9ybURhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIGJsb2InKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keVRleHRdKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmFycmF5QnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBjb25zdW1lZCh0aGlzKSB8fCBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUFycmF5QnVmZmVyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvYigpLnRoZW4ocmVhZEJsb2JBc0FycmF5QnVmZmVyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRoaXMudGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpXG4gICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYm9keUJsb2IpIHtcbiAgICAgIHJldHVybiByZWFkQmxvYkFzVGV4dCh0aGlzLl9ib2R5QmxvYilcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZWFkQXJyYXlCdWZmZXJBc1RleHQodGhpcy5fYm9keUFycmF5QnVmZmVyKSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIHRleHQnKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlUZXh0KVxuICAgIH1cbiAgfVxuXG4gIGlmIChzdXBwb3J0LmZvcm1EYXRhKSB7XG4gICAgdGhpcy5mb3JtRGF0YSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oZGVjb2RlKVxuICAgIH1cbiAgfVxuXG4gIHRoaXMuanNvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKEpTT04ucGFyc2UpXG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIVFRQIG1ldGhvZHMgd2hvc2UgY2FwaXRhbGl6YXRpb24gc2hvdWxkIGJlIG5vcm1hbGl6ZWRcbnZhciBtZXRob2RzID0gWydERUxFVEUnLCAnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUycsICdQT1NUJywgJ1BVVCddXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZChtZXRob2QpIHtcbiAgdmFyIHVwY2FzZWQgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICByZXR1cm4gbWV0aG9kcy5pbmRleE9mKHVwY2FzZWQpID4gLTEgPyB1cGNhc2VkIDogbWV0aG9kXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXF1ZXN0KGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIHZhciBib2R5ID0gb3B0aW9ucy5ib2R5XG5cbiAgaWYgKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgIGlmIChpbnB1dC5ib2R5VXNlZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJylcbiAgICB9XG4gICAgdGhpcy51cmwgPSBpbnB1dC51cmxcbiAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5wdXQuY3JlZGVudGlhbHNcbiAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5wdXQuaGVhZGVycylcbiAgICB9XG4gICAgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2RcbiAgICB0aGlzLm1vZGUgPSBpbnB1dC5tb2RlXG4gICAgdGhpcy5zaWduYWwgPSBpbnB1dC5zaWduYWxcbiAgICBpZiAoIWJvZHkgJiYgaW5wdXQuX2JvZHlJbml0ICE9IG51bGwpIHtcbiAgICAgIGJvZHkgPSBpbnB1dC5fYm9keUluaXRcbiAgICAgIGlucHV0LmJvZHlVc2VkID0gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLnVybCA9IFN0cmluZyhpbnB1dClcbiAgfVxuXG4gIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzIHx8IHRoaXMuY3JlZGVudGlhbHMgfHwgJ3NhbWUtb3JpZ2luJ1xuICBpZiAob3B0aW9ucy5oZWFkZXJzIHx8ICF0aGlzLmhlYWRlcnMpIHtcbiAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpXG4gIH1cbiAgdGhpcy5tZXRob2QgPSBub3JtYWxpemVNZXRob2Qob3B0aW9ucy5tZXRob2QgfHwgdGhpcy5tZXRob2QgfHwgJ0dFVCcpXG4gIHRoaXMubW9kZSA9IG9wdGlvbnMubW9kZSB8fCB0aGlzLm1vZGUgfHwgbnVsbFxuICB0aGlzLnNpZ25hbCA9IG9wdGlvbnMuc2lnbmFsIHx8IHRoaXMuc2lnbmFsXG4gIHRoaXMucmVmZXJyZXIgPSBudWxsXG5cbiAgaWYgKCh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykgJiYgYm9keSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzJylcbiAgfVxuICB0aGlzLl9pbml0Qm9keShib2R5KVxufVxuXG5SZXF1ZXN0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFJlcXVlc3QodGhpcywge2JvZHk6IHRoaXMuX2JvZHlJbml0fSlcbn1cblxuZnVuY3Rpb24gZGVjb2RlKGJvZHkpIHtcbiAgdmFyIGZvcm0gPSBuZXcgRm9ybURhdGEoKVxuICBib2R5XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnJicpXG4gICAgLmZvckVhY2goZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICAgIGlmIChieXRlcykge1xuICAgICAgICB2YXIgc3BsaXQgPSBieXRlcy5zcGxpdCgnPScpXG4gICAgICAgIHZhciBuYW1lID0gc3BsaXQuc2hpZnQoKS5yZXBsYWNlKC9cXCsvZywgJyAnKVxuICAgICAgICB2YXIgdmFsdWUgPSBzcGxpdC5qb2luKCc9JykucmVwbGFjZSgvXFwrL2csICcgJylcbiAgICAgICAgZm9ybS5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KG5hbWUpLCBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKVxuICAgICAgfVxuICAgIH0pXG4gIHJldHVybiBmb3JtXG59XG5cbmZ1bmN0aW9uIHBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSB7XG4gIHZhciBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICAvLyBSZXBsYWNlIGluc3RhbmNlcyBvZiBcXHJcXG4gYW5kIFxcbiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgc3BhY2Ugb3IgaG9yaXpvbnRhbCB0YWIgd2l0aCBhIHNwYWNlXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4yXG4gIHZhciBwcmVQcm9jZXNzZWRIZWFkZXJzID0gcmF3SGVhZGVycy5yZXBsYWNlKC9cXHI/XFxuW1xcdCBdKy9nLCAnICcpXG4gIHByZVByb2Nlc3NlZEhlYWRlcnMuc3BsaXQoL1xccj9cXG4vKS5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICB2YXIgcGFydHMgPSBsaW5lLnNwbGl0KCc6JylcbiAgICB2YXIga2V5ID0gcGFydHMuc2hpZnQoKS50cmltKClcbiAgICBpZiAoa2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSBwYXJ0cy5qb2luKCc6JykudHJpbSgpXG4gICAgICBoZWFkZXJzLmFwcGVuZChrZXksIHZhbHVlKVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIGhlYWRlcnNcbn1cblxuQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKVxuXG5leHBvcnQgZnVuY3Rpb24gUmVzcG9uc2UoYm9keUluaXQsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9XG4gIH1cblxuICB0aGlzLnR5cGUgPSAnZGVmYXVsdCdcbiAgdGhpcy5zdGF0dXMgPSBvcHRpb25zLnN0YXR1cyA9PT0gdW5kZWZpbmVkID8gMjAwIDogb3B0aW9ucy5zdGF0dXNcbiAgdGhpcy5vayA9IHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMFxuICB0aGlzLnN0YXR1c1RleHQgPSAnc3RhdHVzVGV4dCcgaW4gb3B0aW9ucyA/IG9wdGlvbnMuc3RhdHVzVGV4dCA6ICdPSydcbiAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICB0aGlzLnVybCA9IG9wdGlvbnMudXJsIHx8ICcnXG4gIHRoaXMuX2luaXRCb2R5KGJvZHlJbml0KVxufVxuXG5Cb2R5LmNhbGwoUmVzcG9uc2UucHJvdG90eXBlKVxuXG5SZXNwb25zZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZSh0aGlzLl9ib2R5SW5pdCwge1xuICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgc3RhdHVzVGV4dDogdGhpcy5zdGF0dXNUZXh0LFxuICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHRoaXMuaGVhZGVycyksXG4gICAgdXJsOiB0aGlzLnVybFxuICB9KVxufVxuXG5SZXNwb25zZS5lcnJvciA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogMCwgc3RhdHVzVGV4dDogJyd9KVxuICByZXNwb25zZS50eXBlID0gJ2Vycm9yJ1xuICByZXR1cm4gcmVzcG9uc2Vcbn1cblxudmFyIHJlZGlyZWN0U3RhdHVzZXMgPSBbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdXG5cblJlc3BvbnNlLnJlZGlyZWN0ID0gZnVuY3Rpb24odXJsLCBzdGF0dXMpIHtcbiAgaWYgKHJlZGlyZWN0U3RhdHVzZXMuaW5kZXhPZihzdGF0dXMpID09PSAtMSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlJylcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwge3N0YXR1czogc3RhdHVzLCBoZWFkZXJzOiB7bG9jYXRpb246IHVybH19KVxufVxuXG5leHBvcnQgdmFyIERPTUV4Y2VwdGlvbiA9IHNlbGYuRE9NRXhjZXB0aW9uXG50cnkge1xuICBuZXcgRE9NRXhjZXB0aW9uKClcbn0gY2F0Y2ggKGVycikge1xuICBET01FeGNlcHRpb24gPSBmdW5jdGlvbihtZXNzYWdlLCBuYW1lKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZVxuICAgIHRoaXMubmFtZSA9IG5hbWVcbiAgICB2YXIgZXJyb3IgPSBFcnJvcihtZXNzYWdlKVxuICAgIHRoaXMuc3RhY2sgPSBlcnJvci5zdGFja1xuICB9XG4gIERPTUV4Y2VwdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSlcbiAgRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERPTUV4Y2VwdGlvblxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2goaW5wdXQsIGluaXQpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpXG5cbiAgICBpZiAocmVxdWVzdC5zaWduYWwgJiYgcmVxdWVzdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydGVkJywgJ0Fib3J0RXJyb3InKSlcbiAgICB9XG5cbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcblxuICAgIGZ1bmN0aW9uIGFib3J0WGhyKCkge1xuICAgICAgeGhyLmFib3J0KClcbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgc3RhdHVzOiB4aHIuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB8fCAnJylcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMudXJsID0gJ3Jlc3BvbnNlVVJMJyBpbiB4aHIgPyB4aHIucmVzcG9uc2VVUkwgOiBvcHRpb25zLmhlYWRlcnMuZ2V0KCdYLVJlcXVlc3QtVVJMJylcbiAgICAgIHZhciBib2R5ID0gJ3Jlc3BvbnNlJyBpbiB4aHIgPyB4aHIucmVzcG9uc2UgOiB4aHIucmVzcG9uc2VUZXh0XG4gICAgICByZXNvbHZlKG5ldyBSZXNwb25zZShib2R5LCBvcHRpb25zKSlcbiAgICB9XG5cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSlcbiAgICB9XG5cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZWplY3QobmV3IFR5cGVFcnJvcignTmV0d29yayByZXF1ZXN0IGZhaWxlZCcpKVxuICAgIH1cblxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZWplY3QobmV3IERPTUV4Y2VwdGlvbignQWJvcnRlZCcsICdBYm9ydEVycm9yJykpXG4gICAgfVxuXG4gICAgeGhyLm9wZW4ocmVxdWVzdC5tZXRob2QsIHJlcXVlc3QudXJsLCB0cnVlKVxuXG4gICAgaWYgKHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdpbmNsdWRlJykge1xuICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWVcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3QuY3JlZGVudGlhbHMgPT09ICdvbWl0Jykge1xuICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKCdyZXNwb25zZVR5cGUnIGluIHhociAmJiBzdXBwb3J0LmJsb2IpIHtcbiAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgICB9XG5cbiAgICByZXF1ZXN0LmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpXG4gICAgfSlcblxuICAgIGlmIChyZXF1ZXN0LnNpZ25hbCkge1xuICAgICAgcmVxdWVzdC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydFhocilcblxuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBET05FIChzdWNjZXNzIG9yIGZhaWx1cmUpXG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgIHJlcXVlc3Quc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRYaHIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIuc2VuZCh0eXBlb2YgcmVxdWVzdC5fYm9keUluaXQgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHJlcXVlc3QuX2JvZHlJbml0KVxuICB9KVxufVxuXG5mZXRjaC5wb2x5ZmlsbCA9IHRydWVcblxuaWYgKCFzZWxmLmZldGNoKSB7XG4gIHNlbGYuZmV0Y2ggPSBmZXRjaFxuICBzZWxmLkhlYWRlcnMgPSBIZWFkZXJzXG4gIHNlbGYuUmVxdWVzdCA9IFJlcXVlc3RcbiAgc2VsZi5SZXNwb25zZSA9IFJlc3BvbnNlXG59XG4iLCIvKipcbiAqIENvcHlyaWdodChjKSBMaXZlMkQgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRoZSBMaXZlMkQgT3BlbiBTb2Z0d2FyZSBsaWNlbnNlXG4gKiB0aGF0IGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5saXZlMmQuY29tL2V1bGEvbGl2ZTJkLW9wZW4tc29mdHdhcmUtbGljZW5zZS1hZ3JlZW1lbnRfZW4uaHRtbC5cbiAqL1xuXG5pbXBvcnQgeyBMaXZlMkRDdWJpc21GcmFtZXdvcmsgYXMgY3NtdmVjdG9yIH0gZnJvbSAnQGZyYW1ld29yay90eXBlL2NzbXZlY3Rvcic7XG5pbXBvcnQgQ3NtX2NzbVZlY3RvciA9IGNzbXZlY3Rvci5jc21WZWN0b3I7XG5pbXBvcnQgY3NtVmVjdG9yX2l0ZXJhdG9yID0gY3NtdmVjdG9yLml0ZXJhdG9yO1xuaW1wb3J0IHsgZ2wgfSBmcm9tICcuL2xhcHBkZWxlZ2F0ZSc7XG5cbi8qKlxuICog57q555CG566h55CG57G744CCXG4gKuaJp+ihjOWbvuWDj+WKoOi9veWSjOeuoeeQhueahOexu+OAglxuICovXG5leHBvcnQgY2xhc3MgTEFwcFRleHR1cmVNYW5hZ2VyIHtcbiAgLyoqXG4gICAqIOOCs+ODs+OCueODiOODqeOCr+OCv1xuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fdGV4dHVyZXMgPSBuZXcgQ3NtX2NzbVZlY3RvcjxUZXh0dXJlSW5mbz4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDop6PmlL7jgZnjgovjgIJcbiAgICovXG4gIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgIGZvciAoXG4gICAgICBsZXQgaXRlOiBjc21WZWN0b3JfaXRlcmF0b3I8VGV4dHVyZUluZm8+ID0gdGhpcy5fdGV4dHVyZXMuYmVnaW4oKTtcbiAgICAgIGl0ZS5ub3RFcXVhbCh0aGlzLl90ZXh0dXJlcy5lbmQoKSk7XG4gICAgICBpdGUucHJlSW5jcmVtZW50KClcbiAgICApIHtcbiAgICAgIGdsLmRlbGV0ZVRleHR1cmUoaXRlLnB0cigpLmlkKTtcbiAgICB9XG4gICAgdGhpcy5fdGV4dHVyZXMgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOWbvuWDj+ivu+WFpVxuICAgKlxuICAgKiBAcGFyYW0gZmlsZU5hbWUg6K+75Y+W5Zu+5YOP5paH5Lu26Lev5b6E5ZCNXG4gICAqIEBwYXJhbSB1c2VQcmVtdWx0aXBseSBQcmVtdWx05Yem55CG44KS5pyJ5Yq544Gr44GZ44KL44GLIOWQr+eUqFByZW11bHTlpITnkIbmiJZcbiAgICogQHJldHVybiDlm77lg4/kv6Hmga/vvIzor7vlj5blpLHotKXml7bov5Tlm55udWxsXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlVGV4dHVyZUZyb21QbmdGaWxlKFxuICAgIGZpbGVOYW1lOiBzdHJpbmcsXG4gICAgdXNlUHJlbXVsdGlwbHk6IGJvb2xlYW4sXG4gICAgY2FsbGJhY2s6ICh0ZXh0dXJlSW5mbzogVGV4dHVyZUluZm8pID0+IHZvaWRcbiAgKTogdm9pZCB7XG4gICAgLy8gc2VhcmNoIGxvYWRlZCB0ZXh0dXJlIGFscmVhZHlcbiAgICBmb3IgKFxuICAgICAgbGV0IGl0ZTogY3NtVmVjdG9yX2l0ZXJhdG9yPFRleHR1cmVJbmZvPiA9IHRoaXMuX3RleHR1cmVzLmJlZ2luKCk7XG4gICAgICBpdGUubm90RXF1YWwodGhpcy5fdGV4dHVyZXMuZW5kKCkpO1xuICAgICAgaXRlLnByZUluY3JlbWVudCgpXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGl0ZS5wdHIoKS5maWxlTmFtZSA9PSBmaWxlTmFtZSAmJlxuICAgICAgICBpdGUucHRyKCkudXNlUHJlbXVsdHBseSA9PSB1c2VQcmVtdWx0aXBseVxuICAgICAgKSB7XG4gICAgICAgIC8vIDLlm57nm67ku6XpmY3jga/jgq3jg6Pjg4Pjgrfjg6XjgYzkvb/nlKjjgZXjgozjgoso5b6F44Gh5pmC6ZaT44Gq44GXKVxuICAgICAgICAvLyBXZWJLaXTjgafjga/lkIzjgZhJbWFnZeOBrm9ubG9hZOOCkuWGjeW6puWRvOOBtuOBq+OBr+WGjeOCpOODs+OCueOCv+ODs+OCueOBjOW/heimgVxuICAgICAgICAvLyDoqbPntLDvvJpodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNTAyNDE4MVxuICAgICAgICBpdGUucHRyKCkuaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGl0ZS5wdHIoKS5pbWcub25sb2FkID0gKCk6IHZvaWQgPT4gY2FsbGJhY2soaXRlLnB0cigpKTtcbiAgICAgICAgaXRlLnB0cigpLmltZy5zcmMgPSBmaWxlTmFtZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOinpuWPkeaVsOaNruWKoOi9vVxuICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgIC8vIGpzZGVsaXZy5Lya5Ye6546wV2ViR0zliqDovb3ot6jln5/nurnnkIblh7rplJnnmoTpl67pophcbiAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnJztcbiAgICBpbWcub25sb2FkID0gKCk6IHZvaWQgPT4ge1xuICAgICAgLy8g5Yib5bu65LiA5Liq57q555CG5a+56LGhXG4gICAgICBjb25zdCB0ZXg6IFdlYkdMVGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcblxuICAgICAgLy8g44OG44Kv44K544OB44Oj44KS6YG45oqeXG4gICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXgpO1xuXG4gICAgICAvLyDjg4bjgq/jgrnjg4Hjg6Pjgavjg5Tjgq/jgrvjg6vjgpLmm7jjgY3ovrzjgoBcbiAgICAgIGdsLnRleFBhcmFtZXRlcmkoXG4gICAgICAgIGdsLlRFWFRVUkVfMkQsXG4gICAgICAgIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUixcbiAgICAgICAgZ2wuTElORUFSX01JUE1BUF9MSU5FQVJcbiAgICAgICk7XG4gICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcblxuICAgICAgLy8gUHJlbXVsdOWHpueQhuOCkuihjOOCj+OBm+OCi1xuICAgICAgaWYgKHVzZVByZW11bHRpcGx5KSB7XG4gICAgICAgIGdsLnBpeGVsU3RvcmVpKGdsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIOODhuOCr+OCueODgeODo+OBq+ODlOOCr+OCu+ODq+OCkuabuOOBjei+vOOCgFxuICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBpbWcpO1xuXG4gICAgICAvLyDjg5/jg4Pjg5fjg57jg4Pjg5fjgpLnlJ/miJBcbiAgICAgIGdsLmdlbmVyYXRlTWlwbWFwKGdsLlRFWFRVUkVfMkQpO1xuXG4gICAgICAvLyDjg4bjgq/jgrnjg4Hjg6PjgpLjg5DjgqTjg7Pjg4lcbiAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpO1xuXG4gICAgICBjb25zdCB0ZXh0dXJlSW5mbzogVGV4dHVyZUluZm8gPSBuZXcgVGV4dHVyZUluZm8oKTtcbiAgICAgIGlmICh0ZXh0dXJlSW5mbyAhPSBudWxsKSB7XG4gICAgICAgIHRleHR1cmVJbmZvLmZpbGVOYW1lID0gZmlsZU5hbWU7XG4gICAgICAgIHRleHR1cmVJbmZvLndpZHRoID0gaW1nLndpZHRoO1xuICAgICAgICB0ZXh0dXJlSW5mby5oZWlnaHQgPSBpbWcuaGVpZ2h0O1xuICAgICAgICB0ZXh0dXJlSW5mby5pZCA9IHRleDtcbiAgICAgICAgdGV4dHVyZUluZm8uaW1nID0gaW1nO1xuICAgICAgICB0ZXh0dXJlSW5mby51c2VQcmVtdWx0cGx5ID0gdXNlUHJlbXVsdGlwbHk7XG4gICAgICAgIHRoaXMuX3RleHR1cmVzLnB1c2hCYWNrKHRleHR1cmVJbmZvKTtcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2sodGV4dHVyZUluZm8pO1xuICAgIH07XG4gICAgaW1nLnNyYyA9IGZpbGVOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIOeUu+WDj+OBruino+aUvlxuICAgKlxuICAgKiDphY3liJfjgavlrZjlnKjjgZnjgovnlLvlg4/lhajjgabjgpLop6PmlL7jgZnjgovjgIJcbiAgICovXG4gIHB1YmxpYyByZWxlYXNlVGV4dHVyZXMoKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90ZXh0dXJlcy5nZXRTaXplKCk7IGkrKykge1xuICAgICAgdGhpcy5fdGV4dHVyZXMuc2V0KGksIG51bGwpO1xuICAgIH1cblxuICAgIHRoaXMuX3RleHR1cmVzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICog55S75YOP44Gu6Kej5pS+XG4gICAqXG4gICAqIOaMh+WumuOBl+OBn+ODhuOCr+OCueODgeODo+OBrueUu+WDj+OCkuino+aUvuOBmeOCi+OAglxuICAgKiBAcGFyYW0gdGV4dHVyZSDop6PmlL7jgZnjgovjg4bjgq/jgrnjg4Hjg6NcbiAgICovXG4gIHB1YmxpYyByZWxlYXNlVGV4dHVyZUJ5VGV4dHVyZSh0ZXh0dXJlOiBXZWJHTFRleHR1cmUpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RleHR1cmVzLmdldFNpemUoKTsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5fdGV4dHVyZXMuYXQoaSkuaWQgIT0gdGV4dHVyZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdGV4dHVyZXMuc2V0KGksIG51bGwpO1xuICAgICAgdGhpcy5fdGV4dHVyZXMucmVtb3ZlKGkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOeUu+WDj+OBruino+aUvlxuICAgKlxuICAgKiDmjIflrprjgZfjgZ/lkI3liY3jga7nlLvlg4/jgpLop6PmlL7jgZnjgovjgIJcbiAgICogQHBhcmFtIGZpbGVOYW1lIOino+aUvuOBmeOCi+eUu+WDj+ODleOCoeOCpOODq+ODkeOCueWQjVxuICAgKi9cbiAgcHVibGljIHJlbGVhc2VUZXh0dXJlQnlGaWxlUGF0aChmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90ZXh0dXJlcy5nZXRTaXplKCk7IGkrKykge1xuICAgICAgaWYgKHRoaXMuX3RleHR1cmVzLmF0KGkpLmZpbGVOYW1lID09IGZpbGVOYW1lKSB7XG4gICAgICAgIHRoaXMuX3RleHR1cmVzLnNldChpLCBudWxsKTtcbiAgICAgICAgdGhpcy5fdGV4dHVyZXMucmVtb3ZlKGkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfdGV4dHVyZXM6IENzbV9jc21WZWN0b3I8VGV4dHVyZUluZm8+O1xufVxuXG4vKipcbiAqIOeUu+WDj+aDheWgseani+mAoOS9k1xuICovXG5leHBvcnQgY2xhc3MgVGV4dHVyZUluZm8ge1xuICBpbWc6IEhUTUxJbWFnZUVsZW1lbnQ7IC8vIOeUu+WDj1xuICBpZDogV2ViR0xUZXh0dXJlID0gbnVsbDsgLy8gIOe6ueeQhlxuICB3aWR0aCA9IDA7IC8vIOWuveW6plxuICBoZWlnaHQgPSAwOyAvLyDpq5jluqZcbiAgdXNlUHJlbXVsdHBseTogYm9vbGVhbjsgLy8g5ZCv55SoUHJlbXVsdOWkhOeQhuaIllxuICBmaWxlTmFtZTogc3RyaW5nOyAvLyDmlofku7blkI1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file
diff --git a/Live2D/js/jquery.min.js b/Live2D/js/jquery.min.js
new file mode 100644
index 00000000..4024b662
--- /dev/null
+++ b/Live2D/js/jquery.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v2.2.4 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){var b;if("object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype||{},"isPrototypeOf"))return!1;for(b in a);return void 0===b||k.call(a,b)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c;
+}catch(e){}O.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",""],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/