@vonage/ml-transformers 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/docs/assets/highlight.css +22 -15
- package/dist/docs/enums/BlurRadius.html +7 -1
- package/dist/docs/modules.html +9 -4
- package/dist/ml-transformers.es.js +1 -1
- package/dist/ml-transformers.umd.js +29 -29
- package/dist/types/src/transformers/BackgroundTransformer.d.ts +3 -1
- package/dist/types/src/transformers/BlurPostProcess.d.ts +3 -1
- package/dist/types/src/transformers/SilueteBlurPostProcess.d.ts +3 -1
- package/dist/types/src/types.d.ts +12 -1
- package/package.json +1 -1
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
:root {
|
|
2
|
-
--light-hl-0: #
|
|
3
|
-
--dark-hl-0: #
|
|
2
|
+
--light-hl-0: #0000FF;
|
|
3
|
+
--dark-hl-0: #569CD6;
|
|
4
4
|
--light-hl-1: #000000;
|
|
5
|
-
--dark-hl-1: #
|
|
6
|
-
--light-hl-2: #
|
|
7
|
-
--dark-hl-2: #
|
|
8
|
-
--light-hl-3: #
|
|
9
|
-
--dark-hl-3: #
|
|
10
|
-
--light-hl-4: #
|
|
11
|
-
--dark-hl-4: #
|
|
12
|
-
--light-hl-5: #
|
|
13
|
-
--dark-hl-5: #
|
|
14
|
-
--light-hl-6: #
|
|
15
|
-
--dark-hl-6: #
|
|
16
|
-
--light-hl-7: #
|
|
17
|
-
--dark-hl-7: #
|
|
5
|
+
--dark-hl-1: #D4D4D4;
|
|
6
|
+
--light-hl-2: #001080;
|
|
7
|
+
--dark-hl-2: #9CDCFE;
|
|
8
|
+
--light-hl-3: #267F99;
|
|
9
|
+
--dark-hl-3: #4EC9B0;
|
|
10
|
+
--light-hl-4: #A31515;
|
|
11
|
+
--dark-hl-4: #CE9178;
|
|
12
|
+
--light-hl-5: #098658;
|
|
13
|
+
--dark-hl-5: #B5CEA8;
|
|
14
|
+
--light-hl-6: #008000;
|
|
15
|
+
--dark-hl-6: #6A9955;
|
|
16
|
+
--light-hl-7: #000000;
|
|
17
|
+
--dark-hl-7: #C8C8C8;
|
|
18
|
+
--light-hl-8: #AF00DB;
|
|
19
|
+
--dark-hl-8: #C586C0;
|
|
18
20
|
--light-code-background: #F5F5F5;
|
|
19
21
|
--dark-code-background: #1E1E1E;
|
|
20
22
|
}
|
|
@@ -28,6 +30,7 @@
|
|
|
28
30
|
--hl-5: var(--light-hl-5);
|
|
29
31
|
--hl-6: var(--light-hl-6);
|
|
30
32
|
--hl-7: var(--light-hl-7);
|
|
33
|
+
--hl-8: var(--light-hl-8);
|
|
31
34
|
--code-background: var(--light-code-background);
|
|
32
35
|
} }
|
|
33
36
|
|
|
@@ -40,6 +43,7 @@
|
|
|
40
43
|
--hl-5: var(--dark-hl-5);
|
|
41
44
|
--hl-6: var(--dark-hl-6);
|
|
42
45
|
--hl-7: var(--dark-hl-7);
|
|
46
|
+
--hl-8: var(--dark-hl-8);
|
|
43
47
|
--code-background: var(--dark-code-background);
|
|
44
48
|
} }
|
|
45
49
|
|
|
@@ -52,6 +56,7 @@ body.light {
|
|
|
52
56
|
--hl-5: var(--light-hl-5);
|
|
53
57
|
--hl-6: var(--light-hl-6);
|
|
54
58
|
--hl-7: var(--light-hl-7);
|
|
59
|
+
--hl-8: var(--light-hl-8);
|
|
55
60
|
--code-background: var(--light-code-background);
|
|
56
61
|
}
|
|
57
62
|
|
|
@@ -64,6 +69,7 @@ body.dark {
|
|
|
64
69
|
--hl-5: var(--dark-hl-5);
|
|
65
70
|
--hl-6: var(--dark-hl-6);
|
|
66
71
|
--hl-7: var(--dark-hl-7);
|
|
72
|
+
--hl-8: var(--dark-hl-8);
|
|
67
73
|
--code-background: var(--dark-code-background);
|
|
68
74
|
}
|
|
69
75
|
|
|
@@ -75,4 +81,5 @@ body.dark {
|
|
|
75
81
|
.hl-5 { color: var(--hl-5); }
|
|
76
82
|
.hl-6 { color: var(--hl-6); }
|
|
77
83
|
.hl-7 { color: var(--hl-7); }
|
|
84
|
+
.hl-8 { color: var(--hl-8); }
|
|
78
85
|
pre, code { background: var(--code-background); }
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>BlurRadius | @vonage/ml-transformers</title><meta name="description" content="Documentation for @vonage/ml-transformers"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@vonage/ml-transformers</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">@vonage/ml-transformers</a></li><li><a href="BlurRadius.html">BlurRadius</a></li></ul><h1>Enumeration BlurRadius </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><div class="lead">
|
|
2
2
|
<p>BlurRadius specifies how much bluring filter to apply by a given transformer.</p>
|
|
3
|
-
</div
|
|
3
|
+
</div><dl class="tsd-comment-tags"><dt>low</dt><dd><ul>
|
|
4
|
+
<li>5px blur</li>
|
|
5
|
+
</ul>
|
|
6
|
+
</dd><dt>high</dt><dd><ul>
|
|
7
|
+
<li>15px blur</li>
|
|
8
|
+
</ul>
|
|
9
|
+
</dd></dl></div></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Enumeration Members</h3><ul class="tsd-index-list"><li class="tsd-kind-enum-member tsd-parent-kind-enum"><a href="BlurRadius.html#High" class="tsd-kind-icon">High</a></li><li class="tsd-kind-enum-member tsd-parent-kind-enum"><a href="BlurRadius.html#Low" class="tsd-kind-icon">Low</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Enumeration Members</h2><section class="tsd-panel tsd-member tsd-kind-enum-member tsd-parent-kind-enum"><a id="High" class="tsd-anchor"></a><h3 class="tsd-anchor-link">High<a href="#High" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">High<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">"High"</span></div><div class="tsd-comment tsd-typography"><div class="lead">
|
|
4
10
|
<p>High bluring filtering.</p>
|
|
5
11
|
</div></div></section><section class="tsd-panel tsd-member tsd-kind-enum-member tsd-parent-kind-enum"><a id="Low" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Low<a href="#Low" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">Low<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">"Low"</span></div><div class="tsd-comment tsd-typography"><div class="lead">
|
|
6
12
|
<p>Low bluring filtering.</p>
|
package/dist/docs/modules.html
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>@vonage/ml-transformers</title><meta name="description" content="Documentation for @vonage/ml-transformers"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="assets/style.css"/><link rel="stylesheet" href="assets/highlight.css"/><script async src="assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base="."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="index.html" class="title">@vonage/ml-transformers</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><h1>@vonage/ml-transformers </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>References</h3><ul class="tsd-index-list"><li class="tsd-kind-reference"><a href="modules.html#VonageFacedetection" class="tsd-kind-icon">Vonage<wbr/>Facedetection</a></li><li class="tsd-kind-reference"><a href="modules.html#VonageFacemash" class="tsd-kind-icon">Vonage<wbr/>Facemash</a></li><li class="tsd-kind-reference"><a href="modules.html#VonageHands" class="tsd-kind-icon">Vonage<wbr/>Hands</a></li><li class="tsd-kind-reference"><a href="modules.html#VonageHolistic" class="tsd-kind-icon">Vonage<wbr/>Holistic</a></li><li class="tsd-kind-reference"><a href="modules.html#VonageObjectron" class="tsd-kind-icon">Vonage<wbr/>Objectron</a></li><li class="tsd-kind-reference"><a href="modules.html#VonagePose" class="tsd-kind-icon">Vonage<wbr/>Pose</a></li></ul></section><section class="tsd-index-section "><h3>Enumerations</h3><ul class="tsd-index-list"><li class="tsd-kind-enum"><a href="enums/BlurRadius.html" class="tsd-kind-icon">Blur<wbr/>Radius</a></li></ul></section><section class="tsd-index-section "><h3>Classes</h3><ul class="tsd-index-list"><li class="tsd-kind-class"><a href="classes/MediapipeHelper.html" class="tsd-kind-icon">Mediapipe<wbr/>Helper</a></li></ul></section><section class="tsd-index-section tsd-is-external"><h3>Interfaces</h3><ul class="tsd-index-list"><li class="tsd-kind-interface tsd-is-external"><a href="interfaces/FaceDetectionOptions.html" class="tsd-kind-icon">Face<wbr/>Detection<wbr/>Options</a></li><li class="tsd-kind-interface tsd-is-external"><a href="interfaces/FaceDetectionResults.html" class="tsd-kind-icon">Face<wbr/>Detection<wbr/>Results</a></li><li class="tsd-kind-interface tsd-is-external"><a href="interfaces/FaceMeshOptions.html" class="tsd-kind-icon">Face<wbr/>Mesh<wbr/>Options</a></li><li class="tsd-kind-interface tsd-is-external"><a href="interfaces/FaceMeshResults.html" class="tsd-kind-icon">Face<wbr/>Mesh<wbr/>Results</a></li><li class="tsd-kind-interface tsd-is-external"><a href="interfaces/HandsOptions.html" class="tsd-kind-icon">Hands<wbr/>Options</a></li><li class="tsd-kind-interface tsd-is-external"><a href="interfaces/HandsResults.html" class="tsd-kind-icon">Hands<wbr/>Results</a></li><li class="tsd-kind-interface tsd-is-external"><a href="interfaces/HolisticOptions.html" class="tsd-kind-icon">Holistic<wbr/>Options</a></li><li class="tsd-kind-interface tsd-is-external"><a href="interfaces/HolisticResults.html" class="tsd-kind-icon">Holistic<wbr/>Results</a></li><li class="tsd-kind-interface tsd-is-external"><a href="interfaces/ObjectronOptions.html" class="tsd-kind-icon">Objectron<wbr/>Options</a></li><li class="tsd-kind-interface tsd-is-external"><a href="interfaces/ObjectronResults.html" class="tsd-kind-icon">Objectron<wbr/>Results</a></li><li class="tsd-kind-interface tsd-is-external"><a href="interfaces/PoseOptions.html" class="tsd-kind-icon">Pose<wbr/>Options</a></li><li class="tsd-kind-interface tsd-is-external"><a href="interfaces/PoseResults.html" class="tsd-kind-icon">Pose<wbr/>Results</a></li><li class="tsd-kind-interface tsd-is-external"><a href="interfaces/SelfieSegmentationOptions.html" class="tsd-kind-icon">Selfie<wbr/>Segmentation<wbr/>Options</a></li><li class="tsd-kind-interface tsd-is-external"><a href="interfaces/SelfieSegmentationResults.html" class="tsd-kind-icon">Selfie<wbr/>Segmentation<wbr/>Results</a></li></ul></section><section class="tsd-index-section "><h3>Type Aliases</h3><ul class="tsd-index-list"><li class="tsd-kind-type-alias"><a href="modules.html#AssetBackgroundConfig" class="tsd-kind-icon">Asset<wbr/>Background<wbr/>Config</a></li><li class="tsd-kind-type-alias"><a href="modules.html#BackgroundBlurConfig" class="tsd-kind-icon">Background<wbr/>Blur<wbr/>Config</a></li><li class="tsd-kind-type-alias"><a href="modules.html#BackgroundOptions" class="tsd-kind-icon">Background<wbr/>Options</a></li><li class="tsd-kind-type-alias"><a href="modules.html#MediaPipeModelConfig" class="tsd-kind-icon">Media<wbr/>Pipe<wbr/>Model<wbr/>Config</a></li><li class="tsd-kind-type-alias"><a href="modules.html#MediaPipeModelType" class="tsd-kind-icon">Media<wbr/>Pipe<wbr/>Model<wbr/>Type</a></li><li class="tsd-kind-type-alias"><a href="modules.html#MediaPipeResults" class="tsd-kind-icon">Media<wbr/>Pipe<wbr/>Results</a></li><li class="tsd-kind-type-alias"><a href="modules.html#MediaPipeResultsListener" class="tsd-kind-icon">Media<wbr/>Pipe<wbr/>Results<wbr/>Listener</a></li><li class="tsd-kind-type-alias"><a href="modules.html#MediaProcessorBaseConfig" class="tsd-kind-icon">Media<wbr/>Processor<wbr/>Base<wbr/>Config</a></li><li class="tsd-kind-type-alias"><a href="modules.html#MediaProcessorConfig" class="tsd-kind-icon">Media<wbr/>Processor<wbr/>Config</a></li><li class="tsd-kind-type-alias"><a href="modules.html#MediapipeConfig" class="tsd-kind-icon">Mediapipe<wbr/>Config</a></li><li class="tsd-kind-type-alias"><a href="modules.html#SilueteBlurConfig" class="tsd-kind-icon">Siluete<wbr/>Blur<wbr/>Config</a></li><li class="tsd-kind-type-alias"><a href="modules.html#VideoBackgroundConfig" class="tsd-kind-icon">Video<wbr/>Background<wbr/>Config</a></li><li class="tsd-kind-type-alias"><a href="modules.html#VirtualBackgroundConfig" class="tsd-kind-icon">Virtual<wbr/>Background<wbr/>Config</a></li></ul></section><section class="tsd-index-section "><h3>Properties</h3><ul class="tsd-index-list"><li class="tsd-kind-property"><a href="modules.html#VonageSelfiesegmentation" class="tsd-kind-icon">Vonage<wbr/>Selfiesegmentation</a></li></ul></section><section class="tsd-index-section "><h3>Functions</h3><ul class="tsd-index-list"><li class="tsd-kind-function"><a href="modules.html#createVonageMediaProcessorConnector" class="tsd-kind-icon">create<wbr/>Vonage<wbr/>Media<wbr/>Processor<wbr/>Connector</a></li><li class="tsd-kind-function"><a href="modules.html#getVonageEventEmitter" class="tsd-kind-icon">get<wbr/>Vonage<wbr/>Event<wbr/>Emitter</a></li><li class="tsd-kind-function"><a href="modules.html#isSupported" class="tsd-kind-icon">is<wbr/>Supported</a></li><li class="tsd-kind-function"><a href="modules.html#setBackgroundOptions" class="tsd-kind-icon">set<wbr/>Background<wbr/>Options</a></li><li class="tsd-kind-function"><a href="modules.html#setTrackExpectedRate" class="tsd-kind-icon">set<wbr/>Track<wbr/>Expected<wbr/>Rate</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>References</h2><section class="tsd-panel tsd-member tsd-kind-reference"><a id="VonageFacedetection" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Vonage<wbr/>Facedetection<a href="#VonageFacedetection" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3>Renames and re-exports <a href="modules.html#VonageSelfiesegmentation">VonageSelfiesegmentation</a></section><section class="tsd-panel tsd-member tsd-kind-reference"><a id="VonageFacemash" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Vonage<wbr/>Facemash<a href="#VonageFacemash" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3>Renames and re-exports <a href="modules.html#VonageSelfiesegmentation">VonageSelfiesegmentation</a></section><section class="tsd-panel tsd-member tsd-kind-reference"><a id="VonageHands" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Vonage<wbr/>Hands<a href="#VonageHands" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3>Renames and re-exports <a href="modules.html#VonageSelfiesegmentation">VonageSelfiesegmentation</a></section><section class="tsd-panel tsd-member tsd-kind-reference"><a id="VonageHolistic" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Vonage<wbr/>Holistic<a href="#VonageHolistic" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3>Renames and re-exports <a href="modules.html#VonageSelfiesegmentation">VonageSelfiesegmentation</a></section><section class="tsd-panel tsd-member tsd-kind-reference"><a id="VonageObjectron" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Vonage<wbr/>Objectron<a href="#VonageObjectron" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3>Renames and re-exports <a href="modules.html#VonageSelfiesegmentation">VonageSelfiesegmentation</a></section><section class="tsd-panel tsd-member tsd-kind-reference"><a id="VonagePose" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Vonage<wbr/>Pose<a href="#VonagePose" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3>Renames and re-exports <a href="modules.html#VonageSelfiesegmentation">VonageSelfiesegmentation</a></section></section><section class="tsd-panel-group tsd-member-group "><h2>Type Aliases</h2><section class="tsd-panel tsd-member tsd-kind-type-alias"><a id="AssetBackgroundConfig" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Asset<wbr/>Background<wbr/>Config<a href="#AssetBackgroundConfig" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">Asset<wbr/>Background<wbr/>Config<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>backgroundAssetUri<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> }</span></div><div class="tsd-comment tsd-typography"><div class="lead">
|
|
2
2
|
<p>AssetBackgroundConfig specifies the absolute URL to the image or video file used for background replacement.</p>
|
|
3
|
-
</div></div><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5>background<wbr/>Asset<wbr/>Uri<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5></li></ul></div></section><section class="tsd-panel tsd-member tsd-kind-type-alias"><a id="BackgroundBlurConfig" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Background<wbr/>Blur<wbr/>Config<a href="#BackgroundBlurConfig" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">Background<wbr/>Blur<wbr/>Config<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>radius<span class="tsd-signature-symbol">?: </span><a href="enums/BlurRadius.html" class="tsd-signature-type" data-tsd-kind="Enumeration">BlurRadius</a><span class="tsd-signature-symbol">; </span>transformerType<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">"BackgroundBlur"</span><span class="tsd-signature-symbol"> }</span></div><div class="tsd-comment tsd-typography"><div class="lead">
|
|
3
|
+
</div></div><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5>background<wbr/>Asset<wbr/>Uri<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5></li></ul></div></section><section class="tsd-panel tsd-member tsd-kind-type-alias"><a id="BackgroundBlurConfig" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Background<wbr/>Blur<wbr/>Config<a href="#BackgroundBlurConfig" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">Background<wbr/>Blur<wbr/>Config<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>radius<span class="tsd-signature-symbol">?: </span><a href="enums/BlurRadius.html" class="tsd-signature-type" data-tsd-kind="Enumeration">BlurRadius</a><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">; </span>transformerType<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">"BackgroundBlur"</span><span class="tsd-signature-symbol"> }</span></div><div class="tsd-comment tsd-typography"><div class="lead">
|
|
4
4
|
<p>BackgroundBlurConfig specifies the configuration for a transformer logic that performs background blurring.</p>
|
|
5
|
-
</div
|
|
5
|
+
</div><dl class="tsd-comment-tags"><dt>radius</dt><dd><ul>
|
|
6
|
+
<li>@BlurRadius or number indicating the blur radius.</li>
|
|
7
|
+
</ul>
|
|
8
|
+
<pre><code class="language-ts"><span class="hl-0">let</span><span class="hl-1"> </span><span class="hl-2">blurConfig</span><span class="hl-1">: </span><span class="hl-3">BackgroundBlurConfig</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">transformerType:</span><span class="hl-1"> </span><span class="hl-4">'BackgroundBlur'</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">radius:</span><span class="hl-1"> </span><span class="hl-5">8</span><br/><span class="hl-1">}</span><br/><span class="hl-6">// ..</span><br/><span class="hl-2">ctx</span><span class="hl-1">.</span><span class="hl-2">filter</span><span class="hl-1"> = </span><span class="hl-4">'blur(8px)'</span>
|
|
9
|
+
</code></pre>
|
|
10
|
+
</dd></dl></div><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5><span class="tsd-flag ts-flagOptional">Optional</span> radius<span class="tsd-signature-symbol">?: </span><a href="enums/BlurRadius.html" class="tsd-signature-type" data-tsd-kind="Enumeration">BlurRadius</a><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">number</span></h5></li><li class="tsd-parameter"><h5>transformer<wbr/>Type<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">"BackgroundBlur"</span></h5></li></ul></div></section><section class="tsd-panel tsd-member tsd-kind-type-alias"><a id="BackgroundOptions" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Background<wbr/>Options<a href="#BackgroundOptions" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">Background<wbr/>Options<span class="tsd-signature-symbol">:</span> <a href="modules.html#BackgroundBlurConfig" class="tsd-signature-type" data-tsd-kind="Type alias">BackgroundBlurConfig</a><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-symbol">(</span><a href="modules.html#VirtualBackgroundConfig" class="tsd-signature-type" data-tsd-kind="Type alias">VirtualBackgroundConfig</a><span class="tsd-signature-symbol"> | </span><a href="modules.html#VideoBackgroundConfig" class="tsd-signature-type" data-tsd-kind="Type alias">VideoBackgroundConfig</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> & </span><a href="modules.html#AssetBackgroundConfig" class="tsd-signature-type" data-tsd-kind="Type alias">AssetBackgroundConfig</a><span class="tsd-signature-symbol"> | </span><a href="modules.html#SilueteBlurConfig" class="tsd-signature-type" data-tsd-kind="Type alias">SilueteBlurConfig</a></div><div class="tsd-comment tsd-typography"><div class="lead">
|
|
6
11
|
<p>BackgroundOptions background options</p>
|
|
7
12
|
</div></div></section><section class="tsd-panel tsd-member tsd-kind-type-alias"><a id="MediaPipeModelConfig" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Media<wbr/>Pipe<wbr/>Model<wbr/>Config<a href="#MediaPipeModelConfig" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">Media<wbr/>Pipe<wbr/>Model<wbr/>Config<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>assetsUri<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>listener<span class="tsd-signature-symbol">: </span><a href="modules.html#MediaPipeResultsListener" class="tsd-signature-type" data-tsd-kind="Type alias">MediaPipeResultsListener</a><span class="tsd-signature-symbol">; </span>modelType<span class="tsd-signature-symbol">: </span><a href="modules.html#MediaPipeModelType" class="tsd-signature-type" data-tsd-kind="Type alias">MediaPipeModelType</a><span class="tsd-signature-symbol">; </span>options<span class="tsd-signature-symbol">: </span><a href="interfaces/FaceDetectionOptions.html" class="tsd-signature-type" data-tsd-kind="Interface">FaceDetectionOptions</a><span class="tsd-signature-symbol"> | </span><a href="interfaces/FaceMeshOptions.html" class="tsd-signature-type" data-tsd-kind="Interface">FaceMeshOptions</a><span class="tsd-signature-symbol"> | </span><a href="interfaces/HandsOptions.html" class="tsd-signature-type" data-tsd-kind="Interface">HandsOptions</a><span class="tsd-signature-symbol"> | </span><a href="interfaces/HolisticOptions.html" class="tsd-signature-type" data-tsd-kind="Interface">HolisticOptions</a><span class="tsd-signature-symbol"> | </span><a href="interfaces/ObjectronOptions.html" class="tsd-signature-type" data-tsd-kind="Interface">ObjectronOptions</a><span class="tsd-signature-symbol"> | </span><a href="interfaces/SelfieSegmentationOptions.html" class="tsd-signature-type" data-tsd-kind="Interface">SelfieSegmentationOptions</a><span class="tsd-signature-symbol"> | </span><a href="interfaces/PoseOptions.html" class="tsd-signature-type" data-tsd-kind="Interface">PoseOptions</a><span class="tsd-signature-symbol"> }</span></div><div class="tsd-comment tsd-typography"><div class="lead">
|
|
8
13
|
<p>defines one mediapipe model config</p>
|
|
@@ -35,7 +40,7 @@ assets are different between mediapipe models.</p>
|
|
|
35
40
|
<p>MediaProcessorBaseConfig specifies the absolute URL for the path where the mediapipe assets used by the transformers from this library are stored.
|
|
36
41
|
Vonage hosts static assets of mediapipe that will be used in case this property is not set.
|
|
37
42
|
Vonage promises to take care of maintaining all versioning.</p>
|
|
38
|
-
</div><dl class="tsd-comment-tags"><dt>example</dt><dd><pre><code class="language-ts"><span class="hl-
|
|
43
|
+
</div><dl class="tsd-comment-tags"><dt>example</dt><dd><pre><code class="language-ts"><span class="hl-1">{</span><br/><span class="hl-1"> </span><span class="hl-7">mediapipeBaseAssetsUri</span><span class="hl-1">: </span><span class="hl-4">'http://localhost:8080/assets'</span><span class="hl-1"> | </span><span class="hl-2">undeifined</span><br/><span class="hl-1">}</span>
|
|
39
44
|
</code></pre>
|
|
40
45
|
<p>mediapipeBaseAssetsUri - should be the uri path to mediapipe assets.
|
|
41
46
|
*** WARNING *** - using this option moves the responsibility of the assets and the versioning to the user.
|
|
@@ -51,7 +56,7 @@ please keep in mind that the assets list can change between versions!
|
|
|
51
56
|
all assets can be taken from <code>node_modules/@mediapipe/selfie_segmentation</code></p>
|
|
52
57
|
</dd></dl></div><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5><span class="tsd-flag ts-flagOptional">Optional</span> mediapipe<wbr/>Base<wbr/>Assets<wbr/>Uri<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">string</span></h5></li></ul></div></section><section class="tsd-panel tsd-member tsd-kind-type-alias"><a id="MediaProcessorConfig" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Media<wbr/>Processor<wbr/>Config<a href="#MediaProcessorConfig" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">Media<wbr/>Processor<wbr/>Config<span class="tsd-signature-symbol">:</span> <a href="modules.html#MediaProcessorBaseConfig" class="tsd-signature-type" data-tsd-kind="Type alias">MediaProcessorBaseConfig</a><span class="tsd-signature-symbol"> & </span><a href="modules.html#BackgroundOptions" class="tsd-signature-type" data-tsd-kind="Type alias">BackgroundOptions</a></div><div class="tsd-comment tsd-typography"><div class="lead">
|
|
53
58
|
<p>MediaProcessorConfig specifies the transformer logic to be performed.</p>
|
|
54
|
-
</div><dl class="tsd-comment-tags"><dt>example</dt><dd><pre><code class="language-ts"><span class="hl-
|
|
59
|
+
</div><dl class="tsd-comment-tags"><dt>example</dt><dd><pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-0">let</span><span class="hl-1"> </span><span class="hl-2">config</span><span class="hl-1">: </span><span class="hl-3">MediaProcessorConfig</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-8">if</span><span class="hl-1">(</span><span class="hl-2">typeType</span><span class="hl-1"> === </span><span class="hl-4">'blur'</span><span class="hl-1">){</span><br/><span class="hl-1"> </span><span class="hl-2">config</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">mediapipeBaseAssetsUri:</span><span class="hl-1"> </span><span class="hl-4">'https://example.com'</span><span class="hl-1">, </span><span class="hl-6">// mediapipeBaseAssetsUri is optional we provide static assets for it</span><br/><span class="hl-1"> </span><span class="hl-2">transformerType:</span><span class="hl-1"> </span><span class="hl-4">'BackgroundBlur'</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">radius:</span><span class="hl-1"> </span><span class="hl-2">blurLevelType</span><span class="hl-1"> === </span><span class="hl-4">'low'</span><span class="hl-1"> ? </span><span class="hl-2">BlurRadius</span><span class="hl-1">.</span><span class="hl-2">Low</span><span class="hl-1"> : </span><span class="hl-2">BlurRadius</span><span class="hl-1">.</span><span class="hl-2">High</span><span class="hl-1">,</span><br/><span class="hl-1"> };</span><br/><span class="hl-1"> } </span><span class="hl-8">else</span><span class="hl-1"> </span><span class="hl-8">if</span><span class="hl-1">(</span><span class="hl-2">typeType</span><span class="hl-1"> === </span><span class="hl-4">'virtual'</span><span class="hl-1">){</span><br/><span class="hl-1"> </span><span class="hl-2">config</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">mediapipeBaseAssetsUri:</span><span class="hl-1"> </span><span class="hl-4">'https://example.com'</span><span class="hl-1">, </span><span class="hl-6">// mediapipeBaseAssetsUri is optional we provide static assets for it</span><br/><span class="hl-1"> </span><span class="hl-2">transformerType:</span><span class="hl-1"> </span><span class="hl-4">'VirtualBackground'</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">backgroundAssetUri:</span><span class="hl-1"> </span><span class="hl-2">location</span><span class="hl-1">.</span><span class="hl-2">href</span><span class="hl-1"> + </span><span class="hl-4">"images/vonage.jpeg"</span><br/><span class="hl-1"> }</span><br/><span class="hl-1"> } </span><span class="hl-8">else</span><span class="hl-1"> </span><span class="hl-8">if</span><span class="hl-1">(</span><span class="hl-2">typeType</span><span class="hl-1"> === </span><span class="hl-4">'video'</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-2">config</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">mediapipeBaseAssetsUri:</span><span class="hl-1"> </span><span class="hl-4">'https://example.com'</span><span class="hl-1">, </span><span class="hl-6">// mediapipeBaseAssetsUri is optional we provide static assets for it</span><br/><span class="hl-1"> </span><span class="hl-2">transformerType:</span><span class="hl-1"> </span><span class="hl-4">'VideoBackground'</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">backgroundAssetUri:</span><span class="hl-1"> </span><span class="hl-2">location</span><span class="hl-1">.</span><span class="hl-2">href</span><span class="hl-1"> + </span><span class="hl-4">'videos/bbb.mp4'</span><br/><span class="hl-1"> };</span><br/><span class="hl-1"> } </span><span class="hl-8">else</span><span class="hl-1"> </span><span class="hl-8">if</span><span class="hl-1">(</span><span class="hl-2">typeType</span><span class="hl-1"> === </span><span class="hl-4">'siluete'</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-2">config</span><span class="hl-1"> = {</span><br/><span class="hl-1"> </span><span class="hl-2">mediapipeBaseAssetsUri:</span><span class="hl-1"> </span><span class="hl-4">'https://example.com'</span><span class="hl-1">, </span><span class="hl-6">// mediapipeBaseAssetsUri is optional we provide static assets for it</span><br/><span class="hl-1"> </span><span class="hl-2">transformerType:</span><span class="hl-1"> </span><span class="hl-4">'SilueteBlur'</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-2">radius:</span><span class="hl-1"> </span><span class="hl-2">blurLevelType</span><span class="hl-1"> === </span><span class="hl-4">'low'</span><span class="hl-1"> ? </span><span class="hl-2">BlurRadius</span><span class="hl-1">.</span><span class="hl-2">Low</span><span class="hl-1"> : </span><span class="hl-2">BlurRadius</span><span class="hl-1">.</span><span class="hl-2">High</span><span class="hl-1">,</span><br/><span class="hl-1"> };</span><br/><span class="hl-1"> }</span>
|
|
55
60
|
</code></pre>
|
|
56
61
|
</dd></dl></div></section><section class="tsd-panel tsd-member tsd-kind-type-alias"><a id="MediapipeConfig" class="tsd-anchor"></a><h3 class="tsd-anchor-link">Mediapipe<wbr/>Config<a href="#MediapipeConfig" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">Mediapipe<wbr/>Config<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>mediaPipeModelConfigArray<span class="tsd-signature-symbol">: </span><a href="modules.html#MediaPipeModelConfig" class="tsd-signature-type" data-tsd-kind="Type alias">MediaPipeModelConfig</a><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol"> }</span></div><div class="tsd-comment tsd-typography"><div class="lead">
|
|
57
62
|
<p>MediapipeConfig specified config of mediapipe helper:
|
|
@@ -1497,7 +1497,7 @@ class MediaProcessorConnector {
|
|
|
1497
1497
|
});
|
|
1498
1498
|
}
|
|
1499
1499
|
}
|
|
1500
|
-
const encodedJs = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NsYXNzIFB7fVAudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSxQLmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIiLHJlYWRhYmxlX251bGw6IlJlYWRhYmxlIGlzIG51bGwiLHdyaXRhYmxlX251bGw6IldyaXRhYmxlIGlzIG51bGwifTt2YXIgZWU9e2V4cG9ydHM6e319LEVlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBuPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxvPTA7bzxuLmxlbmd0aDtvKyspbltvXT1hcmd1bWVudHNbb107cmV0dXJuIGUuYXBwbHkodCxuKX19LHJ0PUVlLFI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB0ZShyKXtyZXR1cm4gQXJyYXkuaXNBcnJheShyKX1mdW5jdGlvbiByZShyKXtyZXR1cm4gdHlwZW9mIHI9PSJ1bmRlZmluZWQifWZ1bmN0aW9uIHN0KHIpe3JldHVybiByIT09bnVsbCYmIXJlKHIpJiZyLmNvbnN0cnVjdG9yIT09bnVsbCYmIXJlKHIuY29uc3RydWN0b3IpJiZ0eXBlb2Ygci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcj09ImZ1bmN0aW9uIiYmci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihyKX1mdW5jdGlvbiBUZShyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIn1mdW5jdGlvbiBudChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgRm9ybURhdGFdIn1mdW5jdGlvbiBpdChyKXt2YXIgZTtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIiYmQXJyYXlCdWZmZXIuaXNWaWV3P2U9QXJyYXlCdWZmZXIuaXNWaWV3KHIpOmU9ciYmci5idWZmZXImJlRlKHIuYnVmZmVyKSxlfWZ1bmN0aW9uIG90KHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyJ9ZnVuY3Rpb24gYXQocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIn1mdW5jdGlvbiBQZShyKXtyZXR1cm4gciE9PW51bGwmJnR5cGVvZiByPT0ib2JqZWN0In1mdW5jdGlvbiBEKHIpe2lmKFIuY2FsbChyKSE9PSJbb2JqZWN0IE9iamVjdF0iKXJldHVybiExO3ZhciBlPU9iamVjdC5nZXRQcm90b3R5cGVPZihyKTtyZXR1cm4gZT09PW51bGx8fGU9PT1PYmplY3QucHJvdG90eXBlfWZ1bmN0aW9uIHV0KHIpe3JldHVybiBSLmNhbGwocik9PT0iW29iamVjdCBEYXRlXSJ9ZnVuY3Rpb24gbHQocil7cmV0dXJuIFIuY2FsbChyKT09PSJbb2JqZWN0IEZpbGVdIn1mdW5jdGlvbiBjdChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgQmxvYl0ifWZ1bmN0aW9uIFJlKHIpe3JldHVybiBSLmNhbGwocik9PT0iW29iamVjdCBGdW5jdGlvbl0ifWZ1bmN0aW9uIGZ0KHIpe3JldHVybiBQZShyKSYmUmUoci5waXBlKX1mdW5jdGlvbiBodChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgVVJMU2VhcmNoUGFyYW1zXSJ9ZnVuY3Rpb24gZHQocil7cmV0dXJuIHIudHJpbT9yLnRyaW0oKTpyLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX1mdW5jdGlvbiBwdCgpe3JldHVybiB0eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmKG5hdmlnYXRvci5wcm9kdWN0PT09IlJlYWN0TmF0aXZlInx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTmF0aXZlU2NyaXB0Inx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTlMiKT8hMTp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmdHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIn1mdW5jdGlvbiBzZShyLGUpe2lmKCEocj09PW51bGx8fHR5cGVvZiByPT0idW5kZWZpbmVkIikpaWYodHlwZW9mIHIhPSJvYmplY3QiJiYocj1bcl0pLHRlKHIpKWZvcih2YXIgdD0wLHM9ci5sZW5ndGg7dDxzO3QrKyllLmNhbGwobnVsbCxyW3RdLHQscik7ZWxzZSBmb3IodmFyIG4gaW4gcilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocixuKSYmZS5jYWxsKG51bGwscltuXSxuLHIpfWZ1bmN0aW9uIG5lKCl7dmFyIHI9e307ZnVuY3Rpb24gZShuLG8pe0QocltvXSkmJkQobik/cltvXT1uZShyW29dLG4pOkQobik/cltvXT1uZSh7fSxuKTp0ZShuKT9yW29dPW4uc2xpY2UoKTpyW29dPW59Zm9yKHZhciB0PTAscz1hcmd1bWVudHMubGVuZ3RoO3Q8czt0Kyspc2UoYXJndW1lbnRzW3RdLGUpO3JldHVybiByfWZ1bmN0aW9uIG10KHIsZSx0KXtyZXR1cm4gc2UoZSxmdW5jdGlvbihuLG8pe3QmJnR5cGVvZiBuPT0iZnVuY3Rpb24iP3Jbb109cnQobix0KTpyW29dPW59KSxyfWZ1bmN0aW9uIGd0KHIpe3JldHVybiByLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKHI9ci5zbGljZSgxKSkscn12YXIgcD17aXNBcnJheTp0ZSxpc0FycmF5QnVmZmVyOlRlLGlzQnVmZmVyOnN0LGlzRm9ybURhdGE6bnQsaXNBcnJheUJ1ZmZlclZpZXc6aXQsaXNTdHJpbmc6b3QsaXNOdW1iZXI6YXQsaXNPYmplY3Q6UGUsaXNQbGFpbk9iamVjdDpELGlzVW5kZWZpbmVkOnJlLGlzRGF0ZTp1dCxpc0ZpbGU6bHQsaXNCbG9iOmN0LGlzRnVuY3Rpb246UmUsaXNTdHJlYW06ZnQsaXNVUkxTZWFyY2hQYXJhbXM6aHQsaXNTdGFuZGFyZEJyb3dzZXJFbnY6cHQsZm9yRWFjaDpzZSxtZXJnZTpuZSxleHRlbmQ6bXQsdHJpbTpkdCxzdHJpcEJPTTpndH0sST1wO2Z1bmN0aW9uIFNlKHIpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQocikucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lMjAvZywiKyIpLnJlcGxhY2UoLyU1Qi9naSwiWyIpLnJlcGxhY2UoLyU1RC9naSwiXSIpfXZhciBDZT1mdW5jdGlvbihlLHQscyl7aWYoIXQpcmV0dXJuIGU7dmFyIG47aWYocyluPXModCk7ZWxzZSBpZihJLmlzVVJMU2VhcmNoUGFyYW1zKHQpKW49dC50b1N0cmluZygpO2Vsc2V7dmFyIG89W107SS5mb3JFYWNoKHQsZnVuY3Rpb24obCxtKXtsPT09bnVsbHx8dHlwZW9mIGw9PSJ1bmRlZmluZWQifHwoSS5pc0FycmF5KGwpP209bSsiW10iOmw9W2xdLEkuZm9yRWFjaChsLGZ1bmN0aW9uKGYpe0kuaXNEYXRlKGYpP2Y9Zi50b0lTT1N0cmluZygpOkkuaXNPYmplY3QoZikmJihmPUpTT04uc3RyaW5naWZ5KGYpKSxvLnB1c2goU2UobSkrIj0iK1NlKGYpKX0pKX0pLG49by5qb2luKCImIil9aWYobil7dmFyIGk9ZS5pbmRleE9mKCIjIik7aSE9PS0xJiYoZT1lLnNsaWNlKDAsaSkpLGUrPShlLmluZGV4T2YoIj8iKT09PS0xPyI/IjoiJiIpK259cmV0dXJuIGV9LHl0PXA7ZnVuY3Rpb24gcSgpe3RoaXMuaGFuZGxlcnM9W119cS5wcm90b3R5cGUudXNlPWZ1bmN0aW9uKGUsdCxzKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0LHN5bmNocm9ub3VzOnM/cy5zeW5jaHJvbm91czohMSxydW5XaGVuOnM/cy5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfSxxLnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0scS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXt5dC5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24ocyl7cyE9PW51bGwmJmUocyl9KX07dmFyIF90PXEsYnQ9cCx3dD1mdW5jdGlvbihlLHQpe2J0LmZvckVhY2goZSxmdW5jdGlvbihuLG8pe28hPT10JiZvLnRvVXBwZXJDYXNlKCk9PT10LnRvVXBwZXJDYXNlKCkmJihlW3RdPW4sZGVsZXRlIGVbb10pfSl9LE9lPWZ1bmN0aW9uKGUsdCxzLG4sbyl7cmV0dXJuIGUuY29uZmlnPXQscyYmKGUuY29kZT1zKSxlLnJlcXVlc3Q9bixlLnJlc3BvbnNlPW8sZS5pc0F4aW9zRXJyb3I9ITAsZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6dGhpcy5jb25maWcsY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMucmVzcG9uc2UmJnRoaXMucmVzcG9uc2Uuc3RhdHVzP3RoaXMucmVzcG9uc2Uuc3RhdHVzOm51bGx9fSxlfSx2dD1PZSxJZT1mdW5jdGlvbihlLHQscyxuLG8pe3ZhciBpPW5ldyBFcnJvcihlKTtyZXR1cm4gdnQoaSx0LHMsbixvKX0sRXQ9SWUsVHQ9ZnVuY3Rpb24oZSx0LHMpe3ZhciBuPXMuY29uZmlnLnZhbGlkYXRlU3RhdHVzOyFzLnN0YXR1c3x8IW58fG4ocy5zdGF0dXMpP2Uocyk6dChFdCgiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK3Muc3RhdHVzLHMuY29uZmlnLG51bGwscy5yZXF1ZXN0LHMpKX0sSD1wLFB0PUguaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3JldHVybnt3cml0ZTpmdW5jdGlvbih0LHMsbixvLGksYSl7dmFyIGw9W107bC5wdXNoKHQrIj0iK2VuY29kZVVSSUNvbXBvbmVudChzKSksSC5pc051bWJlcihuKSYmbC5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUobikudG9HTVRTdHJpbmcoKSksSC5pc1N0cmluZyhvKSYmbC5wdXNoKCJwYXRoPSIrbyksSC5pc1N0cmluZyhpKSYmbC5wdXNoKCJkb21haW49IitpKSxhPT09ITAmJmwucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWwuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbih0KXt2YXIgcz1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrdCsiKT0oW147XSopIikpO3JldHVybiBzP2RlY29kZVVSSUNvbXBvbmVudChzWzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy53cml0ZSh0LCIiLERhdGUubm93KCktODY0ZTUpfX19KCk6ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24oKXt9LHJlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0scmVtb3ZlOmZ1bmN0aW9uKCl7fX19KCksUnQ9ZnVuY3Rpb24oZSl7cmV0dXJuL14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChlKX0sU3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9lLnJlcGxhY2UoL1wvKyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0sQ3Q9UnQsT3Q9U3QsSXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmIUN0KHQpP090KGUsdCk6dH0saWU9cCx4dD1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLE10PWZ1bmN0aW9uKGUpe3ZhciB0PXt9LHMsbixvO3JldHVybiBlJiZpZS5mb3JFYWNoKGUuc3BsaXQoYApgKSxmdW5jdGlvbihhKXtpZihvPWEuaW5kZXhPZigiOiIpLHM9aWUudHJpbShhLnN1YnN0cigwLG8pKS50b0xvd2VyQ2FzZSgpLG49aWUudHJpbShhLnN1YnN0cihvKzEpKSxzKXtpZih0W3NdJiZ4dC5pbmRleE9mKHMpPj0wKXJldHVybjtzPT09InNldC1jb29raWUiP3Rbc109KHRbc10/dFtzXTpbXSkuY29uY2F0KFtuXSk6dFtzXT10W3NdP3Rbc10rIiwgIituOm59fSksdH0seGU9cCxBdD14ZS5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGU9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxzO2Z1bmN0aW9uIG4obyl7dmFyIGk9bztyZXR1cm4gZSYmKHQuc2V0QXR0cmlidXRlKCJocmVmIixpKSxpPXQuaHJlZiksdC5zZXRBdHRyaWJ1dGUoImhyZWYiLGkpLHtocmVmOnQuaHJlZixwcm90b2NvbDp0LnByb3RvY29sP3QucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnQuaG9zdCxzZWFyY2g6dC5zZWFyY2g/dC5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDp0Lmhhc2g/dC5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6dC5ob3N0bmFtZSxwb3J0OnQucG9ydCxwYXRobmFtZTp0LnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj90LnBhdGhuYW1lOiIvIit0LnBhdGhuYW1lfX1yZXR1cm4gcz1uKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihpKXt2YXIgYT14ZS5pc1N0cmluZyhpKT9uKGkpOmk7cmV0dXJuIGEucHJvdG9jb2w9PT1zLnByb3RvY29sJiZhLmhvc3Q9PT1zLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITB9fSgpO2Z1bmN0aW9uIG9lKHIpe3RoaXMubWVzc2FnZT1yfW9lLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSxvZS5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgaj1vZSxKPXAsa3Q9VHQsTnQ9UHQsVXQ9Q2UsQnQ9SXQsJHQ9TXQsTHQ9QXQsYWU9SWUsRnQ9VyxEdD1qLE1lPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihzLG4pe3ZhciBvPWUuZGF0YSxpPWUuaGVhZGVycyxhPWUucmVzcG9uc2VUeXBlLGw7ZnVuY3Rpb24gbSgpe2UuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUobCksZS5zaWduYWwmJmUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixsKX1KLmlzRm9ybURhdGEobykmJmRlbGV0ZSBpWyJDb250ZW50LVR5cGUiXTt2YXIgdT1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoZS5hdXRoKXt2YXIgZj1lLmF1dGgudXNlcm5hbWV8fCIiLFQ9ZS5hdXRoLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlLmF1dGgucGFzc3dvcmQpKToiIjtpLkF1dGhvcml6YXRpb249IkJhc2ljICIrYnRvYShmKyI6IitUKX12YXIgZz1CdChlLmJhc2VVUkwsZS51cmwpO3Uub3BlbihlLm1ldGhvZC50b1VwcGVyQ2FzZSgpLFV0KGcsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKSwhMCksdS50aW1lb3V0PWUudGltZW91dDtmdW5jdGlvbiBldCgpe2lmKCEhdSl7dmFyIHY9ImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiB1PyR0KHUuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpOm51bGwsQj0hYXx8YT09PSJ0ZXh0Inx8YT09PSJqc29uIj91LnJlc3BvbnNlVGV4dDp1LnJlc3BvbnNlLE89e2RhdGE6QixzdGF0dXM6dS5zdGF0dXMsc3RhdHVzVGV4dDp1LnN0YXR1c1RleHQsaGVhZGVyczp2LGNvbmZpZzplLHJlcXVlc3Q6dX07a3QoZnVuY3Rpb24odmUpe3ModmUpLG0oKX0sZnVuY3Rpb24odmUpe24odmUpLG0oKX0sTyksdT1udWxsfX1pZigib25sb2FkZW5kImluIHU/dS5vbmxvYWRlbmQ9ZXQ6dS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshdXx8dS5yZWFkeVN0YXRlIT09NHx8dS5zdGF0dXM9PT0wJiYhKHUucmVzcG9uc2VVUkwmJnUucmVzcG9uc2VVUkwuaW5kZXhPZigiZmlsZToiKT09PTApfHxzZXRUaW1lb3V0KGV0KX0sdS5vbmFib3J0PWZ1bmN0aW9uKCl7IXV8fChuKGFlKCJSZXF1ZXN0IGFib3J0ZWQiLGUsIkVDT05OQUJPUlRFRCIsdSkpLHU9bnVsbCl9LHUub25lcnJvcj1mdW5jdGlvbigpe24oYWUoIk5ldHdvcmsgRXJyb3IiLGUsbnVsbCx1KSksdT1udWxsfSx1Lm9udGltZW91dD1mdW5jdGlvbigpe3ZhciBCPWUudGltZW91dD8idGltZW91dCBvZiAiK2UudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixPPWUudHJhbnNpdGlvbmFsfHxGdC50cmFuc2l0aW9uYWw7ZS50aW1lb3V0RXJyb3JNZXNzYWdlJiYoQj1lLnRpbWVvdXRFcnJvck1lc3NhZ2UpLG4oYWUoQixlLE8uY2xhcmlmeVRpbWVvdXRFcnJvcj8iRVRJTUVET1VUIjoiRUNPTk5BQk9SVEVEIix1KSksdT1udWxsfSxKLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpe3ZhciB0dD0oZS53aXRoQ3JlZGVudGlhbHN8fEx0KGcpKSYmZS54c3JmQ29va2llTmFtZT9OdC5yZWFkKGUueHNyZkNvb2tpZU5hbWUpOnZvaWQgMDt0dCYmKGlbZS54c3JmSGVhZGVyTmFtZV09dHQpfSJzZXRSZXF1ZXN0SGVhZGVyImluIHUmJkouZm9yRWFjaChpLGZ1bmN0aW9uKEIsTyl7dHlwZW9mIG89PSJ1bmRlZmluZWQiJiZPLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIj9kZWxldGUgaVtPXTp1LnNldFJlcXVlc3RIZWFkZXIoTyxCKX0pLEouaXNVbmRlZmluZWQoZS53aXRoQ3JlZGVudGlhbHMpfHwodS53aXRoQ3JlZGVudGlhbHM9ISFlLndpdGhDcmVkZW50aWFscyksYSYmYSE9PSJqc29uIiYmKHUucmVzcG9uc2VUeXBlPWUucmVzcG9uc2VUeXBlKSx0eXBlb2YgZS5vbkRvd25sb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJnUuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25Eb3dubG9hZFByb2dyZXNzKSx0eXBlb2YgZS5vblVwbG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZ1LnVwbG9hZCYmdS51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25VcGxvYWRQcm9ncmVzcyksKGUuY2FuY2VsVG9rZW58fGUuc2lnbmFsKSYmKGw9ZnVuY3Rpb24odil7IXV8fChuKCF2fHx2JiZ2LnR5cGU/bmV3IER0KCJjYW5jZWxlZCIpOnYpLHUuYWJvcnQoKSx1PW51bGwpfSxlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnN1YnNjcmliZShsKSxlLnNpZ25hbCYmKGUuc2lnbmFsLmFib3J0ZWQ/bCgpOmUuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixsKSkpLG98fChvPW51bGwpLHUuc2VuZChvKX0pfSxoPXAsQWU9d3QscXQ9T2UsSHQ9eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifTtmdW5jdGlvbiBrZShyLGUpeyFoLmlzVW5kZWZpbmVkKHIpJiZoLmlzVW5kZWZpbmVkKHJbIkNvbnRlbnQtVHlwZSJdKSYmKHJbIkNvbnRlbnQtVHlwZSJdPWUpfWZ1bmN0aW9uIGp0KCl7dmFyIHI7cmV0dXJuKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCE9InVuZGVmaW5lZCJ8fHR5cGVvZiBwcm9jZXNzIT0idW5kZWZpbmVkIiYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpPT09IltvYmplY3QgcHJvY2Vzc10iKSYmKHI9TWUpLHJ9ZnVuY3Rpb24gSnQocixlLHQpe2lmKGguaXNTdHJpbmcocikpdHJ5e3JldHVybihlfHxKU09OLnBhcnNlKShyKSxoLnRyaW0ocil9Y2F0Y2gocyl7aWYocy5uYW1lIT09IlN5bnRheEVycm9yIil0aHJvdyBzfXJldHVybih0fHxKU09OLnN0cmluZ2lmeSkocil9dmFyIFY9e3RyYW5zaXRpb25hbDp7c2lsZW50SlNPTlBhcnNpbmc6ITAsZm9yY2VkSlNPTlBhcnNpbmc6ITAsY2xhcmlmeVRpbWVvdXRFcnJvcjohMX0sYWRhcHRlcjpqdCgpLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7cmV0dXJuIEFlKHQsIkFjY2VwdCIpLEFlKHQsIkNvbnRlbnQtVHlwZSIpLGguaXNGb3JtRGF0YShlKXx8aC5pc0FycmF5QnVmZmVyKGUpfHxoLmlzQnVmZmVyKGUpfHxoLmlzU3RyZWFtKGUpfHxoLmlzRmlsZShlKXx8aC5pc0Jsb2IoZSk/ZTpoLmlzQXJyYXlCdWZmZXJWaWV3KGUpP2UuYnVmZmVyOmguaXNVUkxTZWFyY2hQYXJhbXMoZSk/KGtlKHQsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiksZS50b1N0cmluZygpKTpoLmlzT2JqZWN0KGUpfHx0JiZ0WyJDb250ZW50LVR5cGUiXT09PSJhcHBsaWNhdGlvbi9qc29uIj8oa2UodCwiYXBwbGljYXRpb24vanNvbiIpLEp0KGUpKTplfV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKGUpe3ZhciB0PXRoaXMudHJhbnNpdGlvbmFsfHxWLnRyYW5zaXRpb25hbCxzPXQmJnQuc2lsZW50SlNPTlBhcnNpbmcsbj10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG89IXMmJnRoaXMucmVzcG9uc2VUeXBlPT09Impzb24iO2lmKG98fG4mJmguaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChpKXtpZihvKXRocm93IGkubmFtZT09PSJTeW50YXhFcnJvciI/cXQoaSx0aGlzLCJFX0pTT05fUEFSU0UiKTppfXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX19O2guZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSxmdW5jdGlvbihlKXtWLmhlYWRlcnNbZV09e319KSxoLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtWLmhlYWRlcnNbZV09aC5tZXJnZShIdCl9KTt2YXIgVz1WLFZ0PXAsV3Q9VyxHdD1mdW5jdGlvbihlLHQscyl7dmFyIG49dGhpc3x8V3Q7cmV0dXJuIFZ0LmZvckVhY2gocyxmdW5jdGlvbihpKXtlPWkuY2FsbChuLGUsdCl9KSxlfSxOZT1mdW5jdGlvbihlKXtyZXR1cm4hIShlJiZlLl9fQ0FOQ0VMX18pfSxVZT1wLHVlPUd0LHp0PU5lLFF0PVcsWHQ9ajtmdW5jdGlvbiBsZShyKXtpZihyLmNhbmNlbFRva2VuJiZyLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKSxyLnNpZ25hbCYmci5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgWHQoImNhbmNlbGVkIil9dmFyIEt0PWZ1bmN0aW9uKGUpe2xlKGUpLGUuaGVhZGVycz1lLmhlYWRlcnN8fHt9LGUuZGF0YT11ZS5jYWxsKGUsZS5kYXRhLGUuaGVhZGVycyxlLnRyYW5zZm9ybVJlcXVlc3QpLGUuaGVhZGVycz1VZS5tZXJnZShlLmhlYWRlcnMuY29tbW9ufHx7fSxlLmhlYWRlcnNbZS5tZXRob2RdfHx7fSxlLmhlYWRlcnMpLFVlLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwiY29tbW9uIl0sZnVuY3Rpb24obil7ZGVsZXRlIGUuaGVhZGVyc1tuXX0pO3ZhciB0PWUuYWRhcHRlcnx8UXQuYWRhcHRlcjtyZXR1cm4gdChlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiBsZShlKSxuLmRhdGE9dWUuY2FsbChlLG4uZGF0YSxuLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSksbn0sZnVuY3Rpb24obil7cmV0dXJuIHp0KG4pfHwobGUoZSksbiYmbi5yZXNwb25zZSYmKG4ucmVzcG9uc2UuZGF0YT11ZS5jYWxsKGUsbi5yZXNwb25zZS5kYXRhLG4ucmVzcG9uc2UuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSkpLFByb21pc2UucmVqZWN0KG4pfSl9LHk9cCxCZT1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIHM9e307ZnVuY3Rpb24gbih1LGYpe3JldHVybiB5LmlzUGxhaW5PYmplY3QodSkmJnkuaXNQbGFpbk9iamVjdChmKT95Lm1lcmdlKHUsZik6eS5pc1BsYWluT2JqZWN0KGYpP3kubWVyZ2Uoe30sZik6eS5pc0FycmF5KGYpP2Yuc2xpY2UoKTpmfWZ1bmN0aW9uIG8odSl7aWYoeS5pc1VuZGVmaW5lZCh0W3VdKSl7aWYoIXkuaXNVbmRlZmluZWQoZVt1XSkpcmV0dXJuIG4odm9pZCAwLGVbdV0pfWVsc2UgcmV0dXJuIG4oZVt1XSx0W3VdKX1mdW5jdGlvbiBpKHUpe2lmKCF5LmlzVW5kZWZpbmVkKHRbdV0pKXJldHVybiBuKHZvaWQgMCx0W3VdKX1mdW5jdGlvbiBhKHUpe2lmKHkuaXNVbmRlZmluZWQodFt1XSkpe2lmKCF5LmlzVW5kZWZpbmVkKGVbdV0pKXJldHVybiBuKHZvaWQgMCxlW3VdKX1lbHNlIHJldHVybiBuKHZvaWQgMCx0W3VdKX1mdW5jdGlvbiBsKHUpe2lmKHUgaW4gdClyZXR1cm4gbihlW3VdLHRbdV0pO2lmKHUgaW4gZSlyZXR1cm4gbih2b2lkIDAsZVt1XSl9dmFyIG09e3VybDppLG1ldGhvZDppLGRhdGE6aSxiYXNlVVJMOmEsdHJhbnNmb3JtUmVxdWVzdDphLHRyYW5zZm9ybVJlc3BvbnNlOmEscGFyYW1zU2VyaWFsaXplcjphLHRpbWVvdXQ6YSx0aW1lb3V0TWVzc2FnZTphLHdpdGhDcmVkZW50aWFsczphLGFkYXB0ZXI6YSxyZXNwb25zZVR5cGU6YSx4c3JmQ29va2llTmFtZTphLHhzcmZIZWFkZXJOYW1lOmEsb25VcGxvYWRQcm9ncmVzczphLG9uRG93bmxvYWRQcm9ncmVzczphLGRlY29tcHJlc3M6YSxtYXhDb250ZW50TGVuZ3RoOmEsbWF4Qm9keUxlbmd0aDphLHRyYW5zcG9ydDphLGh0dHBBZ2VudDphLGh0dHBzQWdlbnQ6YSxjYW5jZWxUb2tlbjphLHNvY2tldFBhdGg6YSxyZXNwb25zZUVuY29kaW5nOmEsdmFsaWRhdGVTdGF0dXM6bH07cmV0dXJuIHkuZm9yRWFjaChPYmplY3Qua2V5cyhlKS5jb25jYXQoT2JqZWN0LmtleXModCkpLGZ1bmN0aW9uKGYpe3ZhciBUPW1bZl18fG8sZz1UKGYpO3kuaXNVbmRlZmluZWQoZykmJlQhPT1sfHwoc1tmXT1nKX0pLHN9LCRlPXt2ZXJzaW9uOiIwLjI1LjAifSxZdD0kZS52ZXJzaW9uLGNlPXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaChmdW5jdGlvbihyLGUpe2NlW3JdPWZ1bmN0aW9uKHMpe3JldHVybiB0eXBlb2Ygcz09PXJ8fCJhIisoZTwxPyJuICI6IiAiKStyfX0pO3ZhciBMZT17fTtjZS50cmFuc2l0aW9uYWw9ZnVuY3Rpb24oZSx0LHMpe2Z1bmN0aW9uIG4obyxpKXtyZXR1cm4iW0F4aW9zIHYiK1l0KyJdIFRyYW5zaXRpb25hbCBvcHRpb24gJyIrbysiJyIraSsocz8iLiAiK3M6IiIpfXJldHVybiBmdW5jdGlvbihvLGksYSl7aWYoZT09PSExKXRocm93IG5ldyBFcnJvcihuKGksIiBoYXMgYmVlbiByZW1vdmVkIisodD8iIGluICIrdDoiIikpKTtyZXR1cm4gdCYmIUxlW2ldJiYoTGVbaV09ITAsY29uc29sZS53YXJuKG4oaSwiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdiIrdCsiIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlIikpKSxlP2UobyxpLGEpOiEwfX07ZnVuY3Rpb24gWnQocixlLHQpe2lmKHR5cGVvZiByIT0ib2JqZWN0Iil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Zm9yKHZhciBzPU9iamVjdC5rZXlzKHIpLG49cy5sZW5ndGg7bi0tID4wOyl7dmFyIG89c1tuXSxpPWVbb107aWYoaSl7dmFyIGE9cltvXSxsPWE9PT12b2lkIDB8fGkoYSxvLHIpO2lmKGwhPT0hMCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb24gIitvKyIgbXVzdCBiZSAiK2wpO2NvbnRpbnVlfWlmKHQhPT0hMCl0aHJvdyBFcnJvcigiVW5rbm93biBvcHRpb24gIitvKX19dmFyIGVyPXthc3NlcnRPcHRpb25zOlp0LHZhbGlkYXRvcnM6Y2V9LEZlPXAsdHI9Q2UsRGU9X3QscWU9S3QsRz1CZSxIZT1lcix4PUhlLnZhbGlkYXRvcnM7ZnVuY3Rpb24gJChyKXt0aGlzLmRlZmF1bHRzPXIsdGhpcy5pbnRlcmNlcHRvcnM9e3JlcXVlc3Q6bmV3IERlLHJlc3BvbnNlOm5ldyBEZX19JC5wcm90b3R5cGUucmVxdWVzdD1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIj8odD10fHx7fSx0LnVybD1lKTp0PWV8fHt9LCF0LnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7dD1HKHRoaXMuZGVmYXVsdHMsdCksdC5tZXRob2Q/dC5tZXRob2Q9dC5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD90Lm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnQubWV0aG9kPSJnZXQiO3ZhciBzPXQudHJhbnNpdGlvbmFsO3MhPT12b2lkIDAmJkhlLmFzc2VydE9wdGlvbnMocyx7c2lsZW50SlNPTlBhcnNpbmc6eC50cmFuc2l0aW9uYWwoeC5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzp4LnRyYW5zaXRpb25hbCh4LmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6eC50cmFuc2l0aW9uYWwoeC5ib29sZWFuKX0sITEpO3ZhciBuPVtdLG89ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKGcpe3R5cGVvZiBnLnJ1bldoZW49PSJmdW5jdGlvbiImJmcucnVuV2hlbih0KT09PSExfHwobz1vJiZnLnN5bmNocm9ub3VzLG4udW5zaGlmdChnLmZ1bGZpbGxlZCxnLnJlamVjdGVkKSl9KTt2YXIgaT1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2kucHVzaChnLmZ1bGZpbGxlZCxnLnJlamVjdGVkKX0pO3ZhciBhO2lmKCFvKXt2YXIgbD1bcWUsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkobCxuKSxsPWwuY29uY2F0KGkpLGE9UHJvbWlzZS5yZXNvbHZlKHQpO2wubGVuZ3RoOylhPWEudGhlbihsLnNoaWZ0KCksbC5zaGlmdCgpKTtyZXR1cm4gYX1mb3IodmFyIG09dDtuLmxlbmd0aDspe3ZhciB1PW4uc2hpZnQoKSxmPW4uc2hpZnQoKTt0cnl7bT11KG0pfWNhdGNoKFQpe2YoVCk7YnJlYWt9fXRyeXthPXFlKG0pfWNhdGNoKFQpe3JldHVybiBQcm9taXNlLnJlamVjdChUKX1mb3IoO2kubGVuZ3RoOylhPWEudGhlbihpLnNoaWZ0KCksaS5zaGlmdCgpKTtyZXR1cm4gYX0sJC5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe2lmKCFlLnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7cmV0dXJuIGU9Ryh0aGlzLmRlZmF1bHRzLGUpLHRyKGUudXJsLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcikucmVwbGFjZSgvXlw/LywiIil9LEZlLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKGUpeyQucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscyl7cmV0dXJuIHRoaXMucmVxdWVzdChHKHN8fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihzfHx7fSkuZGF0YX0pKX19KSxGZS5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7JC5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxzLG4pe3JldHVybiB0aGlzLnJlcXVlc3QoRyhufHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpzfSkpfX0pO3ZhciBycj0kLHNyPWo7ZnVuY3Rpb24gTShyKXtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uIik7dmFyIGU7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe2U9bn0pO3ZhciB0PXRoaXM7dGhpcy5wcm9taXNlLnRoZW4oZnVuY3Rpb24ocyl7aWYoISF0Ll9saXN0ZW5lcnMpe3ZhciBuLG89dC5fbGlzdGVuZXJzLmxlbmd0aDtmb3Iobj0wO248bztuKyspdC5fbGlzdGVuZXJzW25dKHMpO3QuX2xpc3RlbmVycz1udWxsfX0pLHRoaXMucHJvbWlzZS50aGVuPWZ1bmN0aW9uKHMpe3ZhciBuLG89bmV3IFByb21pc2UoZnVuY3Rpb24oaSl7dC5zdWJzY3JpYmUoaSksbj1pfSkudGhlbihzKTtyZXR1cm4gby5jYW5jZWw9ZnVuY3Rpb24oKXt0LnVuc3Vic2NyaWJlKG4pfSxvfSxyKGZ1bmN0aW9uKG4pe3QucmVhc29ufHwodC5yZWFzb249bmV3IHNyKG4pLGUodC5yZWFzb24pKX0pfU0ucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn0sTS5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKHRoaXMucmVhc29uKXtlKHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19LE0ucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKCEhdGhpcy5fbGlzdGVuZXJzKXt2YXIgdD10aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihlKTt0IT09LTEmJnRoaXMuX2xpc3RlbmVycy5zcGxpY2UodCwxKX19LE0uc291cmNlPWZ1bmN0aW9uKCl7dmFyIGUsdD1uZXcgTShmdW5jdGlvbihuKXtlPW59KTtyZXR1cm57dG9rZW46dCxjYW5jZWw6ZX19O3ZhciBucj1NLGlyPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihzKXtyZXR1cm4gZS5hcHBseShudWxsLHMpfX0sb3I9cCxhcj1mdW5jdGlvbihlKXtyZXR1cm4gb3IuaXNPYmplY3QoZSkmJmUuaXNBeGlvc0Vycm9yPT09ITB9LGplPXAsdXI9RWUsej1ycixscj1CZSxjcj1XO2Z1bmN0aW9uIEplKHIpe3ZhciBlPW5ldyB6KHIpLHQ9dXIoei5wcm90b3R5cGUucmVxdWVzdCxlKTtyZXR1cm4gamUuZXh0ZW5kKHQsei5wcm90b3R5cGUsZSksamUuZXh0ZW5kKHQsZSksdC5jcmVhdGU9ZnVuY3Rpb24obil7cmV0dXJuIEplKGxyKHIsbikpfSx0fXZhciBFPUplKGNyKTtFLkF4aW9zPXosRS5DYW5jZWw9aixFLkNhbmNlbFRva2VuPW5yLEUuaXNDYW5jZWw9TmUsRS5WRVJTSU9OPSRlLnZlcnNpb24sRS5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUpfSxFLnNwcmVhZD1pcixFLmlzQXhpb3NFcnJvcj1hcixlZS5leHBvcnRzPUUsZWUuZXhwb3J0cy5kZWZhdWx0PUU7dmFyIGZyPWVlLmV4cG9ydHM7Y2xhc3MgY3tpc0VtcHR5KCl7cmV0dXJuIXRoaXMuaXNQcmVzZW50KCl9c3RhdGljIG9mKGUpe2lmKGUhPW51bGwpcmV0dXJuIG5ldyBWZShlKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFzc2VkIHZhbHVlIHdhcyBudWxsIG9yIHVuZGVmaW5lZC4iKX1zdGF0aWMgb2ZOb25OdWxsKGUpe3JldHVybiBjLm9mKGUpfXN0YXRpYyBvZk51bGxhYmxlKGUpe3JldHVybiBlIT1udWxsP25ldyBWZShlKTpuZXcgV2V9c3RhdGljIGVtcHR5KCl7cmV0dXJuIG5ldyBXZX1zdGF0aWMgZnJvbShlKXtzd2l0Y2goZS5raW5kKXtjYXNlInByZXNlbnQiOnJldHVybiBjLm9mKGUudmFsdWUpO2Nhc2UiZW1wdHkiOnJldHVybiBjLmVtcHR5KCk7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFzc2VkIHZhbHVlIHdhcyBub3QgYW4gT3B0aW9uIHR5cGUuIil9fX1jbGFzcyBWZSBleHRlbmRzIGN7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnBheWxvYWQ9ZX1pc1ByZXNlbnQoKXtyZXR1cm4hMH1nZXQoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfWlmUHJlc2VudChlKXtlKHRoaXMucGF5bG9hZCl9aWZQcmVzZW50T3JFbHNlKGUsdCl7ZSh0aGlzLnBheWxvYWQpfWZpbHRlcihlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpP3RoaXM6Yy5lbXB0eSgpfW1hcChlKXtjb25zdCB0PWUodGhpcy5wYXlsb2FkKTtyZXR1cm4gYy5vZk51bGxhYmxlKHQpfWZsYXRNYXAoZSl7cmV0dXJuIGUodGhpcy5wYXlsb2FkKX1vcihlKXtyZXR1cm4gdGhpc31vckVsc2UoZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vckVsc2VUaHJvdyhlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yTnVsbCgpe3JldHVybiB0aGlzLnBheWxvYWR9b3JVbmRlZmluZWQoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6InByZXNlbnQiLHZhbHVlOnRoaXMucGF5bG9hZH19bWF0Y2hlcyhlKXtyZXR1cm4gZS5wcmVzZW50KHRoaXMucGF5bG9hZCl9dG9KU09OKGUpe3JldHVybiB0aGlzLnBheWxvYWR9fWNsYXNzIFdlIGV4dGVuZHMgY3tpc1ByZXNlbnQoKXtyZXR1cm4hMX1jb25zdHJ1Y3Rvcigpe3N1cGVyKCl9Z2V0KCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIG9wdGlvbmFsIGlzIG5vdCBwcmVzZW50LiIpfWlmUHJlc2VudChlKXt9aWZQcmVzZW50T3JFbHNlKGUsdCl7dCgpfWZpbHRlcihlKXtyZXR1cm4gdGhpc31tYXAoZSl7cmV0dXJuIGMuZW1wdHkoKX1mbGF0TWFwKGUpe3JldHVybiBjLmVtcHR5KCl9b3IoZSl7cmV0dXJuIGUoKX1vckVsc2UoZSl7cmV0dXJuIGV9b3JFbHNlR2V0KGUpe3JldHVybiB0aGlzLm9yRWxzZShlKCkpfW9yRWxzZVRocm93KGUpe3Rocm93IGUoKX1vck51bGwoKXtyZXR1cm4gbnVsbH1vclVuZGVmaW5lZCgpe310b09wdGlvbigpe3JldHVybntraW5kOiJlbXB0eSJ9fW1hdGNoZXMoZSl7cmV0dXJuIGUuZW1wdHkoKX10b0pTT04oZSl7cmV0dXJuIG51bGx9fWNvbnN0IGhyPSIxLjIuNyI7ZnVuY3Rpb24gZHIocil7Z2xvYmFsVGhpcy5fdm9uYWdlTWVkaWFQcm9jZXNzb3JNZXRhZGF0YT1yfWZ1bmN0aW9uIHByKCl7cmV0dXJuIGdsb2JhbFRoaXMuX3ZvbmFnZU1lZGlhUHJvY2Vzc29yTWV0YWRhdGF9Y2xhc3MgX3tjb25zdHJ1Y3Rvcigpe2NvbnN0IGU9cHIoKTt0aGlzLl9yZXBvcnQ9e2FjdGlvbjpjLmVtcHR5KCksYXBwbGljYXRpb25JZDpjLm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLmFwcElkOm51bGwpLHRpbWVzdGFtcDpEYXRlLm5vdygpLGZwczpjLmVtcHR5KCksZnJhbWVzVHJhbnNmb3JtZWQ6Yy5lbXB0eSgpLGd1aWQ6Yy5lbXB0eSgpLGhpZ2hlc3RGcmFtZVRyYW5zZm9ybUNwdTpjLmVtcHR5KCksbWVzc2FnZTpjLmVtcHR5KCksc291cmNlOmMub2ZOdWxsYWJsZShlIT09dm9pZCAwJiZlIT1udWxsP2Uuc291cmNlVHlwZTpudWxsKSx0cmFuc2Zvcm1lZEZwczpjLmVtcHR5KCksdHJhbnNmb3JtZXJUeXBlOmMuZW1wdHkoKSx2YXJpYXRpb246Yy5lbXB0eSgpLHZpZGVvSGVpZ2h0OmMuZW1wdHkoKSx2aWRlb1dpZHRoOmMuZW1wdHkoKSx2ZXJzaW9uOmhyLGVycm9yOmMuZW1wdHkoKSxwcm94eVVybDpjLm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLnByb3h5VXJsOm51bGwpfX1hY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5hY3Rpb249Yy5vZk51bGxhYmxlKGUpLHRoaXN9ZnJhbWVzVHJhbnNmb3JtZWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcmFtZXNUcmFuc2Zvcm1lZD1jLm9mTnVsbGFibGUoZSksdGhpc31mcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcHM9Yy5vZk51bGxhYmxlKGUpLHRoaXN9Z3VpZChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lmd1aWQ9Yy5vZk51bGxhYmxlKGUpLHRoaXN9bWVzc2FnZShlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lm1lc3NhZ2U9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZWRGcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lZEZwcz1jLm9mTnVsbGFibGUoZSksdGhpc310cmFuc2Zvcm1lclR5cGUoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lclR5cGU9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dmFyaWF0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmFyaWF0aW9uPWMub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvSGVpZ2h0KGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmlkZW9IZWlnaHQ9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dmlkZW9XaWR0aChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvV2lkdGg9Yy5vZk51bGxhYmxlKGUpLHRoaXN9ZXJyb3IoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5lcnJvcj1jLm9mTnVsbGFibGUoZSksdGhpc31idWlsZCgpe3JldHVybiB0aGlzLl9yZXBvcnR9fWNvbnN0IG1yPXI9PkpTT04uc3RyaW5naWZ5KHIsKGUsdCk9PntpZih0IT09bnVsbClyZXR1cm4gdH0pO2NsYXNzIGJ7c3RhdGljIHJlcG9ydChlKXtyZXR1cm4gbmV3IFByb21pc2UoKHQscyk9PntpZihlLmFwcGxpY2F0aW9uSWQuaXNFbXB0eSgpfHxlLnNvdXJjZS5pc0VtcHR5KCkpe3QoInN1Y2Nlc3MiKTtyZXR1cm59bGV0IG49ZnIuY3JlYXRlKCksbz17dGltZW91dDoxZTQsdGltZW91dEVycm9yTWVzc2FnZToiUmVxdWVzdCB0aW1lb3V0IixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9fSxpPSJobGcudG9rYm94LmNvbS9wcm9kL2xvZ2dpbmcvdmNwX3dlYnJ0YyI7aWYoZS5wcm94eVVybC5pc0VtcHR5KCkpaT0iaHR0cHM6Ly8iK2k7ZWxzZXtsZXQgYTtlLnByb3h5VXJsLmdldCgpLnNsaWNlKGUucHJveHlVcmwuZ2V0KCkubGVuZ3RoLTEpIT09Ii8iP2E9ZS5wcm94eVVybC5nZXQoKSsiLyI6YT1lLnByb3h5VXJsLmdldCgpLGk9YStpfW4ucG9zdChpLG1yKGUpLG8pLnRoZW4oYT0+e2NvbnNvbGUubG9nKGEpLHQoInN1Y2Nlc3MiKX0pLmNhdGNoKGE9Pntjb25zb2xlLmxvZyhhKSxzKGEpfSl9KX19dmFyIFEsZ3I9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIHlyKCl7aWYoIVEmJihRPXR5cGVvZiBjcnlwdG8hPSJ1bmRlZmluZWQiJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8dHlwZW9mIG1zQ3J5cHRvIT0idW5kZWZpbmVkIiYmdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIiYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pLCFRKSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIFEoZ3IpfXZhciBfcj0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7ZnVuY3Rpb24gYnIocil7cmV0dXJuIHR5cGVvZiByPT0ic3RyaW5nIiYmX3IudGVzdChyKX1mb3IodmFyIGQ9W10sZmU9MDtmZTwyNTY7KytmZSlkLnB1c2goKGZlKzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gd3Iocil7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjAsdD0oZFtyW2UrMF1dK2RbcltlKzFdXStkW3JbZSsyXV0rZFtyW2UrM11dKyItIitkW3JbZSs0XV0rZFtyW2UrNV1dKyItIitkW3JbZSs2XV0rZFtyW2UrN11dKyItIitkW3JbZSs4XV0rZFtyW2UrOV1dKyItIitkW3JbZSsxMF1dK2RbcltlKzExXV0rZFtyW2UrMTJdXStkW3JbZSsxM11dK2RbcltlKzE0XV0rZFtyW2UrMTVdXSkudG9Mb3dlckNhc2UoKTtpZighYnIodCkpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBHZShyLGUsdCl7cj1yfHx7fTt2YXIgcz1yLnJhbmRvbXx8KHIucm5nfHx5cikoKTtpZihzWzZdPXNbNl0mMTV8NjQsc1s4XT1zWzhdJjYzfDEyOCxlKXt0PXR8fDA7Zm9yKHZhciBuPTA7bjwxNjsrK24pZVt0K25dPXNbbl07cmV0dXJuIGV9cmV0dXJuIHdyKHMpfWNvbnN0IFM9bmV3IFdlYWtNYXAsWD1uZXcgV2Vha01hcCxMPW5ldyBXZWFrTWFwLGhlPVN5bWJvbCgiYW55UHJvZHVjZXIiKSx6ZT1Qcm9taXNlLnJlc29sdmUoKSxLPVN5bWJvbCgibGlzdGVuZXJBZGRlZCIpLFk9U3ltYm9sKCJsaXN0ZW5lclJlbW92ZWQiKTtsZXQgZGU9ITE7ZnVuY3Rpb24gQShyKXtpZih0eXBlb2YgciE9InN0cmluZyImJnR5cGVvZiByIT0ic3ltYm9sIil0aHJvdyBuZXcgVHlwZUVycm9yKCJldmVudE5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBhIHN5bWJvbCIpfWZ1bmN0aW9uIFoocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gayhyLGUpe2NvbnN0IHQ9WC5nZXQocik7cmV0dXJuIHQuaGFzKGUpfHx0LnNldChlLG5ldyBTZXQpLHQuZ2V0KGUpfWZ1bmN0aW9uIEYocixlKXtjb25zdCB0PXR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJzeW1ib2wiP2U6aGUscz1MLmdldChyKTtyZXR1cm4gcy5oYXModCl8fHMuc2V0KHQsbmV3IFNldCkscy5nZXQodCl9ZnVuY3Rpb24gdnIocixlLHQpe2NvbnN0IHM9TC5nZXQocik7aWYocy5oYXMoZSkpZm9yKGNvbnN0IG4gb2Ygcy5nZXQoZSkpbi5lbnF1ZXVlKHQpO2lmKHMuaGFzKGhlKSl7Y29uc3Qgbj1Qcm9taXNlLmFsbChbZSx0XSk7Zm9yKGNvbnN0IG8gb2Ygcy5nZXQoaGUpKW8uZW5xdWV1ZShuKX19ZnVuY3Rpb24gUWUocixlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9ITEscz0oKT0+e30sbj1bXTtjb25zdCBvPXtlbnF1ZXVlKGkpe24ucHVzaChpKSxzKCl9LGZpbmlzaCgpe3Q9ITAscygpfX07Zm9yKGNvbnN0IGkgb2YgZSlGKHIsaSkuYWRkKG8pO3JldHVybnthc3luYyBuZXh0KCl7cmV0dXJuIG4/bi5sZW5ndGg9PT0wP3Q/KG49dm9pZCAwLHRoaXMubmV4dCgpKTooYXdhaXQgbmV3IFByb21pc2UoaT0+e3M9aX0pLHRoaXMubmV4dCgpKTp7ZG9uZTohMSx2YWx1ZTphd2FpdCBuLnNoaWZ0KCl9Ontkb25lOiEwfX0sYXN5bmMgcmV0dXJuKGkpe249dm9pZCAwO2Zvcihjb25zdCBhIG9mIGUpRihyLGEpLmRlbGV0ZShvKTtyZXR1cm4gcygpLGFyZ3VtZW50cy5sZW5ndGg+MD97ZG9uZTohMCx2YWx1ZTphd2FpdCBpfTp7ZG9uZTohMH19LFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtyZXR1cm4gdGhpc319fWZ1bmN0aW9uIFhlKHIpe2lmKHI9PT12b2lkIDApcmV0dXJuIEtlO2lmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIik7Zm9yKGNvbnN0IGUgb2YgcilpZighS2UuaW5jbHVkZXMoZSkpdGhyb3cgdHlwZW9mIGUhPSJzdHJpbmciP25ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgZWxlbWVudCBtdXN0IGJlIGEgc3RyaW5nIik6bmV3IEVycm9yKGAke2V9IGlzIG5vdCBFbWl0dGVyeSBtZXRob2RgKTtyZXR1cm4gcn1jb25zdCBwZT1yPT5yPT09S3x8cj09PVk7Y2xhc3MgQ3tzdGF0aWMgbWl4aW4oZSx0KXtyZXR1cm4gdD1YZSh0KSxzPT57aWYodHlwZW9mIHMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiYHRhcmdldGAgbXVzdCBiZSBmdW5jdGlvbiIpO2Zvcihjb25zdCBpIG9mIHQpaWYocy5wcm90b3R5cGVbaV0hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgXGAke2l9XGAgYWxyZWFkeSBleGlzdHMgb24gXGB0YXJnZXRcYGApO2Z1bmN0aW9uIG4oKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZSx7ZW51bWVyYWJsZTohMSx2YWx1ZTpuZXcgQ30pLHRoaXNbZV19T2JqZWN0LmRlZmluZVByb3BlcnR5KHMucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITEsZ2V0Om59KTtjb25zdCBvPWk9PmZ1bmN0aW9uKC4uLmEpe3JldHVybiB0aGlzW2VdW2ldKC4uLmEpfTtmb3IoY29uc3QgaSBvZiB0KU9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLnByb3RvdHlwZSxpLHtlbnVtZXJhYmxlOiExLHZhbHVlOm8oaSl9KTtyZXR1cm4gc319c3RhdGljIGdldCBpc0RlYnVnRW5hYmxlZCgpe2lmKHR5cGVvZiBwcm9jZXNzIT0ib2JqZWN0IilyZXR1cm4gZGU7Y29uc3R7ZW52OmV9PXByb2Nlc3N8fHtlbnY6e319O3JldHVybiBlLkRFQlVHPT09ImVtaXR0ZXJ5Inx8ZS5ERUJVRz09PSIqInx8ZGV9c3RhdGljIHNldCBpc0RlYnVnRW5hYmxlZChlKXtkZT1lfWNvbnN0cnVjdG9yKGU9e30pe1Muc2V0KHRoaXMsbmV3IFNldCksWC5zZXQodGhpcyxuZXcgTWFwKSxMLnNldCh0aGlzLG5ldyBNYXApLHRoaXMuZGVidWc9ZS5kZWJ1Z3x8e30sdGhpcy5kZWJ1Zy5lbmFibGVkPT09dm9pZCAwJiYodGhpcy5kZWJ1Zy5lbmFibGVkPSExKSx0aGlzLmRlYnVnLmxvZ2dlcnx8KHRoaXMuZGVidWcubG9nZ2VyPSh0LHMsbixvKT0+e289SlNPTi5zdHJpbmdpZnkobyksdHlwZW9mIG49PSJzeW1ib2wiJiYobj1uLnRvU3RyaW5nKCkpO2NvbnN0IGk9bmV3IERhdGUsYT1gJHtpLmdldEhvdXJzKCl9OiR7aS5nZXRNaW51dGVzKCl9OiR7aS5nZXRTZWNvbmRzKCl9LiR7aS5nZXRNaWxsaXNlY29uZHMoKX1gO2NvbnNvbGUubG9nKGBbJHthfV1bZW1pdHRlcnk6JHt0fV1bJHtzfV0gRXZlbnQgTmFtZTogJHtufQoJZGF0YTogJHtvfWApfSl9bG9nSWZEZWJ1Z0VuYWJsZWQoZSx0LHMpeyhDLmlzRGVidWdFbmFibGVkfHx0aGlzLmRlYnVnLmVuYWJsZWQpJiZ0aGlzLmRlYnVnLmxvZ2dlcihlLHRoaXMuZGVidWcubmFtZSx0LHMpfW9uKGUsdCl7Wih0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHMgb2YgZSlBKHMpLGsodGhpcyxzKS5hZGQodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlIixzLHZvaWQgMCkscGUocyl8fHRoaXMuZW1pdChLLHtldmVudE5hbWU6cyxsaXN0ZW5lcjp0fSk7cmV0dXJuIHRoaXMub2ZmLmJpbmQodGhpcyxlLHQpfW9mZihlLHQpe1oodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBzIG9mIGUpQShzKSxrKHRoaXMscykuZGVsZXRlKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInVuc3Vic2NyaWJlIixzLHZvaWQgMCkscGUocyl8fHRoaXMuZW1pdChZLHtldmVudE5hbWU6cyxsaXN0ZW5lcjp0fSl9b25jZShlKXtyZXR1cm4gbmV3IFByb21pc2UodD0+e2NvbnN0IHM9dGhpcy5vbihlLG49PntzKCksdChuKX0pfSl9ZXZlbnRzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKUEodCk7cmV0dXJuIFFlKHRoaXMsZSl9YXN5bmMgZW1pdChlLHQpe0EoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdCIsZSx0KSx2cih0aGlzLGUsdCk7Y29uc3Qgcz1rKHRoaXMsZSksbj1TLmdldCh0aGlzKSxvPVsuLi5zXSxpPXBlKGUpP1tdOlsuLi5uXTthd2FpdCB6ZSxhd2FpdCBQcm9taXNlLmFsbChbLi4uby5tYXAoYXN5bmMgYT0+e2lmKHMuaGFzKGEpKXJldHVybiBhKHQpfSksLi4uaS5tYXAoYXN5bmMgYT0+e2lmKG4uaGFzKGEpKXJldHVybiBhKGUsdCl9KV0pfWFzeW5jIGVtaXRTZXJpYWwoZSx0KXtBKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXRTZXJpYWwiLGUsdCk7Y29uc3Qgcz1rKHRoaXMsZSksbj1TLmdldCh0aGlzKSxvPVsuLi5zXSxpPVsuLi5uXTthd2FpdCB6ZTtmb3IoY29uc3QgYSBvZiBvKXMuaGFzKGEpJiZhd2FpdCBhKHQpO2Zvcihjb25zdCBhIG9mIGkpbi5oYXMoYSkmJmF3YWl0IGEoZSx0KX1vbkFueShlKXtyZXR1cm4gWihlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJzdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLFMuZ2V0KHRoaXMpLmFkZChlKSx0aGlzLmVtaXQoSyx7bGlzdGVuZXI6ZX0pLHRoaXMub2ZmQW55LmJpbmQodGhpcyxlKX1hbnlFdmVudCgpe3JldHVybiBRZSh0aGlzKX1vZmZBbnkoZSl7WihlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJ1bnN1YnNjcmliZUFueSIsdm9pZCAwLHZvaWQgMCksdGhpcy5lbWl0KFkse2xpc3RlbmVyOmV9KSxTLmdldCh0aGlzKS5kZWxldGUoZSl9Y2xlYXJMaXN0ZW5lcnMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCB0IG9mIGUpaWYodGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiY2xlYXIiLHQsdm9pZCAwKSx0eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0PT0ic3ltYm9sIil7ayh0aGlzLHQpLmNsZWFyKCk7Y29uc3Qgcz1GKHRoaXMsdCk7Zm9yKGNvbnN0IG4gb2YgcyluLmZpbmlzaCgpO3MuY2xlYXIoKX1lbHNle1MuZ2V0KHRoaXMpLmNsZWFyKCk7Zm9yKGNvbnN0IHMgb2YgWC5nZXQodGhpcykudmFsdWVzKCkpcy5jbGVhcigpO2Zvcihjb25zdCBzIG9mIEwuZ2V0KHRoaXMpLnZhbHVlcygpKXtmb3IoY29uc3QgbiBvZiBzKW4uZmluaXNoKCk7cy5jbGVhcigpfX19bGlzdGVuZXJDb3VudChlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9MDtmb3IoY29uc3QgcyBvZiBlKXtpZih0eXBlb2Ygcz09InN0cmluZyIpe3QrPVMuZ2V0KHRoaXMpLnNpemUrayh0aGlzLHMpLnNpemUrRih0aGlzLHMpLnNpemUrRih0aGlzKS5zaXplO2NvbnRpbnVlfXR5cGVvZiBzIT0idW5kZWZpbmVkIiYmQShzKSx0Kz1TLmdldCh0aGlzKS5zaXplO2Zvcihjb25zdCBuIG9mIFguZ2V0KHRoaXMpLnZhbHVlcygpKXQrPW4uc2l6ZTtmb3IoY29uc3QgbiBvZiBMLmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1uLnNpemV9cmV0dXJuIHR9YmluZE1ldGhvZHMoZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgYW4gb2JqZWN0Iik7dD1YZSh0KTtmb3IoY29uc3QgcyBvZiB0KXtpZihlW3NdIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtzfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxzLHtlbnVtZXJhYmxlOiExLHZhbHVlOnRoaXNbc10uYmluZCh0aGlzKX0pfX19Y29uc3QgS2U9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQy5wcm90b3R5cGUpLmZpbHRlcihyPT5yIT09ImNvbnN0cnVjdG9yIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImxpc3RlbmVyQWRkZWQiLHt2YWx1ZTpLLHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImxpc3RlbmVyUmVtb3ZlZCIse3ZhbHVlOlksd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KTt2YXIgbWU9QztmdW5jdGlvbiBFcihyKXtyZXR1cm4gdHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbCYmIm1lc3NhZ2UiaW4gciYmdHlwZW9mIHIubWVzc2FnZT09InN0cmluZyJ9ZnVuY3Rpb24gVHIocil7aWYoRXIocikpcmV0dXJuIHI7dHJ5e3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoe3JldHVybiBuZXcgRXJyb3IoU3RyaW5nKHIpKX19ZnVuY3Rpb24gZ2Uocil7cmV0dXJuIFRyKHIpLm1lc3NhZ2V9dmFyIHllOyhmdW5jdGlvbihyKXtyLkZQU19EUk9QPSJmcHNfZHJvcCJ9KSh5ZXx8KHllPXt9KSk7Y29uc3QgUHI9NTAwLFJyPS44O2NsYXNzIFNyIGV4dGVuZHMgbWV7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpLHRoaXMuaW5kZXhfPXQsdGhpcy51dWlkXz1HZSgpLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPTAsdGhpcy50cmFuc2Zvcm1lcl89ZSx0aGlzLnNob3VsZFN0b3BfPSExLHRoaXMuaXNGbGFzaGVkXz0hMSx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcHNfPTAsdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPTAsdGhpcy52aWRlb0hlaWdodF89MCx0aGlzLnZpZGVvV2lkdGhfPTAsdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTEsdGhpcy50cmFuc2Zvcm1lclR5cGVfPSJDdXN0b20iLCJnZXRUcmFuc2Zvcm1lclR5cGUiaW4gZSYmKHRoaXMudHJhbnNmb3JtZXJUeXBlXz1lLmdldFRyYW5zZm9ybWVyVHlwZSgpKTtjb25zdCBzPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7Yi5yZXBvcnQocyl9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZX1hc3luYyBzdGFydChlKXtpZih0aGlzLmNvbnRyb2xsZXJfPWUsdGhpcy50cmFuc2Zvcm1lcl8mJnR5cGVvZiB0aGlzLnRyYW5zZm9ybWVyXy5zdGFydD09ImZ1bmN0aW9uIil0cnl7YXdhaXQgdGhpcy50cmFuc2Zvcm1lcl8uc3RhcnQoZSl9Y2F0Y2godCl7Y29uc3Qgcz1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLmVycm9ycy50cmFuc2Zvcm1lcl9zdGFydCkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKGdlKHQpKS5idWlsZCgpO2IucmVwb3J0KHMpO2NvbnN0IG49e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOnQsZnVuY3Rpb246InN0YXJ0In07dGhpcy5lbWl0KCJlcnJvciIsbil9fWFzeW5jIHRyYW5zZm9ybShlLHQpe3ZhciBzLG4sbyxpO2lmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz09PTAmJih0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89RGF0ZS5ub3coKSksZSBpbnN0YW5jZW9mIFZpZGVvRnJhbWUmJih0aGlzLnZpZGVvSGVpZ2h0Xz0ocz1lPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlIZWlnaHQpIT1udWxsP3M6MCx0aGlzLnZpZGVvV2lkdGhfPShuPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheVdpZHRoKSE9bnVsbD9uOjApLCsrdGhpcy5mcmFtZXNGcm9tU291cmNlXyx0aGlzLnRyYW5zZm9ybWVyXylpZih0aGlzLnNob3VsZFN0b3BfKWNvbnNvbGUud2FybigiW1BpcGVsaW5lXSBmbHVzaCBmcm9tIHRyYW5zZm9ybSIpLGUuY2xvc2UoKSx0aGlzLmZsdXNoKHQpLHQudGVybWluYXRlKCk7ZWxzZSB0cnl7YXdhaXQoKGk9KG89dGhpcy50cmFuc2Zvcm1lcl8pLnRyYW5zZm9ybSk9PW51bGw/dm9pZCAwOmkuY2FsbChvLGUsdCkpLCsrdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8sdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89PT1QciYmdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCl9Y2F0Y2goYSl7Y29uc3QgbD1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLmVycm9ycy50cmFuc2Zvcm1lcl90cmFuc2Zvcm0pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihnZShhKSkuYnVpbGQoKTtiLnJlcG9ydChsKTtjb25zdCBtPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjphLGZ1bmN0aW9uOiJ0cmFuc2Zvcm0ifTt0aGlzLmVtaXQoImVycm9yIixtKX19YXN5bmMgZmx1c2goZSl7aWYodGhpcy50cmFuc2Zvcm1lcl8mJnR5cGVvZiB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaD09ImZ1bmN0aW9uIiYmIXRoaXMuaXNGbGFzaGVkXyl7dGhpcy5pc0ZsYXNoZWRfPSEwO3RyeXthd2FpdCB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaChlKX1jYXRjaChzKXtjb25zdCBuPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFAuZXJyb3JzLnRyYW5zZm9ybWVyX2ZsdXNoKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IoZ2UocykpLmJ1aWxkKCk7Yi5yZXBvcnQobik7Y29uc3Qgbz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6cyxmdW5jdGlvbjoiZmx1c2gifTt0aGlzLmVtaXQoImVycm9yIixvKX19dGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCk7Y29uc3QgdD1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJEZWxldGUiKS5idWlsZCgpO2IucmVwb3J0KHQpfXN0b3AoKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTdG9wIHN0cmVhbS4iKSx0aGlzLmNvbnRyb2xsZXJfJiYodGhpcy5mbHVzaCh0aGlzLmNvbnRyb2xsZXJfKSx0aGlzLmNvbnRyb2xsZXJfLnRlcm1pbmF0ZSgpKSx0aGlzLnNob3VsZFN0b3BfPSEwfW1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKXtsZXQgZT0oRGF0ZS5ub3coKS10aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF8pLzFlMyx0PXRoaXMuZnJhbWVzRnJvbVNvdXJjZV8vZSxzPXRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfL2U7aWYodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8hPS0xJiZ0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXypScj50KXtjb25zdCBvPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSx3YXJuaW5nVHlwZTp5ZS5GUFNfRFJPUCxkcm9wSW5mbzp7cmVxdWVzdGVkOnRoaXMudHJhY2tFeHBlY3RlZFJhdGVfLGN1cnJlbnQ6dH19O3RoaXMuZW1pdCgid2FybiIsbyl9Y29uc3Qgbj1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmZwcyh0KS50cmFuc2Zvcm1lZEZwcyhzKS5mcmFtZXNUcmFuc2Zvcm1lZCh0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXykuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52aWRlb0hlaWdodCh0aGlzLnZpZGVvSGVpZ2h0XykudmlkZW9XaWR0aCh0aGlzLnZpZGVvV2lkdGhfKS52YXJpYXRpb24oIlFvUyIpLmJ1aWxkKCk7Yi5yZXBvcnQobiksdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPTAsdGhpcy5mcmFtZXNGcm9tU291cmNlXz0wLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPTB9fWNsYXNzIENyIGV4dGVuZHMgbWV7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnRyYW5zZm9ybWVyc189W10sdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTE7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBzPW5ldyBTcihlW3RdLHQpO3Mub24oImVycm9yIixuPT57dGhpcy5lbWl0KCJlcnJvciIsbil9KSxzLm9uKCJ3YXJuIixuPT57dGhpcy5lbWl0KCJ3YXJuIixuKX0pLHRoaXMudHJhbnNmb3JtZXJzXy5wdXNoKHMpfX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lO2ZvcihsZXQgdCBvZiB0aGlzLnRyYW5zZm9ybWVyc18pdC5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyl9YXN5bmMgc3RhcnQoZSx0KXtpZighdGhpcy50cmFuc2Zvcm1lcnNffHx0aGlzLnRyYW5zZm9ybWVyc18ubGVuZ3RoPT09MCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gTm8gdHJhbnNmb3JtZXJzLiIpO3JldHVybn10cnl7bGV0IHM9ZTtmb3IobGV0IG4gb2YgdGhpcy50cmFuc2Zvcm1lcnNfKWU9ZS5waXBlVGhyb3VnaChuZXcgVHJhbnNmb3JtU3RyZWFtKG4pKTtlLnBpcGVUbyh0KS50aGVuKGFzeW5jKCk9Pntjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTZXR1cC4iKSxhd2FpdCB0LmFib3J0KCksYXdhaXQgcy5jYW5jZWwoKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIse21lc3NhZ2U6InBpcGVsaW5lX2VuZGVkIn0pfSkuY2F0Y2goYXN5bmMgbj0+e2UuY2FuY2VsKCkudGhlbigoKT0+e2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFNodXR0aW5nIGRvd24gc3RyZWFtcyBhZnRlciBhYm9ydC4iKX0pLmNhdGNoKG89Pntjb25zb2xlLmVycm9yKCJbUGlwZWxpbmVdIEVycm9yIGZyb20gc3RyZWFtIHRyYW5zZm9ybToiLG8pfSksYXdhaXQgdC5hYm9ydChuKSxhd2FpdCBzLmNhbmNlbChuKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIse21lc3NhZ2U6InBpcGVsaW5lX2VuZGVkX3dpdGhfZXJyb3IifSl9KX1jYXRjaHt0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIse21lc3NhZ2U6InBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvciJ9KSx0aGlzLmRlc3Ryb3koKTtyZXR1cm59dGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLHttZXNzYWdlOiJwaXBlbGluZV9zdGFydGVkIn0pLGNvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFBpcGVsaW5lIHN0YXJ0ZWQuIil9YXN5bmMgZGVzdHJveSgpe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIERlc3Ryb3lpbmcgUGlwZWxpbmUuIik7Zm9yKGxldCBlIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllLnN0b3AoKX19Y2xhc3MgT3IgZXh0ZW5kcyBtZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy51dWlkXz1HZSgpLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xO2NvbnN0IGU9bmV3IF8oKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7Yi5yZXBvcnQoZSl9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZSx0aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pfXRyYW5zZm9ybShlLHQpe3JldHVybiB0aGlzLnJlYWRhYmxlXz1lLHRoaXMud3JpdGFibGVfPXQsdGhpcy50cmFuc2Zvcm1JbnRlcm5hbCgpfXRyYW5zZm9ybUludGVybmFsKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57aWYoIXRoaXMudHJhbnNmb3JtZXJzX3x8dGhpcy50cmFuc2Zvcm1lcnNfLmxlbmd0aD09PTApe2NvbnN0IG49bmV3IF8oKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFAuZXJyb3JzLnRyYW5zZm9ybWVyX25vbmUpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO2IucmVwb3J0KG4pLHQoIltNZWRpYVByb2Nlc3Nvcl0gTmVlZCB0byBzZXQgdHJhbnNmb3JtZXJzLiIpO3JldHVybn1pZighdGhpcy5yZWFkYWJsZV8pe2NvbnN0IG49bmV3IF8oKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFAuZXJyb3JzLnJlYWRhYmxlX251bGwpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO2IucmVwb3J0KG4pLHQoIltNZWRpYVByb2Nlc3Nvcl0gUmVhZGFibGUgaXMgbnVsbC4iKTtyZXR1cm59aWYoIXRoaXMud3JpdGFibGVfKXtjb25zdCBuPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLmVycm9ycy53cml0YWJsZV9udWxsKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTtiLnJlcG9ydChuKSx0KCJbTWVkaWFQcm9jZXNzb3JdIFdyaXRhYmxlIGlzIG51bGwuIik7cmV0dXJufWxldCBzPSExO3RoaXMucGlwZWxpbmVfJiYocz0hMCx0aGlzLnBpcGVsaW5lXy5jbGVhckxpc3RlbmVycygpLHRoaXMucGlwZWxpbmVfLmRlc3Ryb3koKSksdGhpcy5waXBlbGluZV89bmV3IENyKHRoaXMudHJhbnNmb3JtZXJzXyksdGhpcy5waXBlbGluZV8ub24oIndhcm4iLG49Pnt0aGlzLmVtaXQoIndhcm4iLG4pfSksdGhpcy5waXBlbGluZV8ub24oImVycm9yIixuPT57dGhpcy5lbWl0KCJlcnJvciIsbil9KSx0aGlzLnBpcGVsaW5lXy5vbigicGlwZWxpbmVJbmZvIixuPT57cyYmKG4ubWVzc2FnZT09PSJwaXBlbGluZV9zdGFydGVkIj9uLm1lc3NhZ2U9InBpcGVsaW5lX3Jlc3RhcnRlZCI6bi5tZXNzYWdlPT09InBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvciImJihuLm1lc3NhZ2U9InBpcGVsaW5lX3Jlc3RhcnRlZF93aXRoX2Vycm9yIikpLHRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIixuKX0pLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfIT0tMSYmdGhpcy5waXBlbGluZV8uc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pLHRoaXMucGlwZWxpbmVfLnN0YXJ0KHRoaXMucmVhZGFibGVfLHRoaXMud3JpdGFibGVfKS50aGVuKCgpPT57ZSgpfSkuY2F0Y2gobj0+e3Qobil9KX0pfXNldFRyYW5zZm9ybWVycyhlKXtjb25zdCB0PW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLnVwZGF0ZXMudHJhbnNmb3JtZXJfbmV3KS52YXJpYXRpb24oIlVwZGF0ZSIpLmJ1aWxkKCk7cmV0dXJuIGIucmVwb3J0KHQpLHRoaXMudHJhbnNmb3JtZXJzXz1lLHRoaXMucmVhZGFibGVfJiZ0aGlzLndyaXRhYmxlXz90aGlzLnRyYW5zZm9ybUludGVybmFsKCk6UHJvbWlzZS5yZXNvbHZlKCl9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShlPT57dGhpcy5waXBlbGluZV8mJnRoaXMucGlwZWxpbmVfLmRlc3Ryb3koKTtjb25zdCB0PW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykudmFyaWF0aW9uKCJEZWxldGUiKS5idWlsZCgpO2IucmVwb3J0KHQpLGUoKX0pfX12YXIgX2U9KHI9PihyLkxvdz0iTG93IixyLkhpZ2g9IkhpZ2giLHIpKShfZXx8e30pO2NsYXNzIFlle2NvbnN0cnVjdG9yKGUpe3RoaXMuYmx1ckZpbHRlcl89ZT09PV9lLkhpZ2g/ImJsdXIoMTVweCkiOiJibHVyKDVweCkifWRlc3Ryb3koKXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e2UoKX0pfXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2UuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfWNhdGNoKHMpe2NvbnNvbGUubG9nKCJbQmx1clBvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLHMpfX19Y2xhc3MgWmV7Y29uc3RydWN0b3IoKXt9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShlPT57dGhpcy5iZ0ltYWdlXyYmdGhpcy5iZ0ltYWdlXy5jbG9zZSgpLGUoKX0pfXNldFZpcnR1YWxCR0ltYWdlKGUpe3RoaXMuYmdJbWFnZV8mJnRoaXMuYmdJbWFnZV8uY2xvc2UoKSx0aGlzLmJnSW1hZ2VfPWV9YXN5bmMgcnVuUG9zdFByb2Nlc3NpbmcoZSx0KXtpZih0aGlzLmJnSW1hZ2VfKXtpZih0aGlzLmJnSW1hZ2VfLndpZHRoIT10LndpZHRofHx0aGlzLmJnSW1hZ2VfLmhlaWdodCE9dC5oZWlnaHQpe2NvbnN0IHM9ImhpZ2giLG49e3Jlc2l6ZVdpZHRoOnQud2lkdGgscmVzaXplSGVpZ2h0OnQuaGVpZ2h0LHJlc2l6ZVF1YWxpdHk6c307dHJ5e3RoaXMuYmdJbWFnZV89YXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5iZ0ltYWdlXyxuKX1jYXRjaChvKXt0aHJvdyBvfX1lLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsZS5kcmF3SW1hZ2UodGhpcy5iZ0ltYWdlXywwLDAsdGhpcy5iZ0ltYWdlXy53aWR0aCx0aGlzLmJnSW1hZ2VfLmhlaWdodCl9fX1jbGFzcyBJcntjb25zdHJ1Y3RvcihlPTEvMCl7dGhpcy5jYXBhY2l0eT1lLHRoaXMuc3RvcmFnZT1bXX1lbnF1ZXVlKGUpe2lmKHRoaXMuc2l6ZSgpPT09dGhpcy5jYXBhY2l0eSl0aHJvdyBFcnJvcigiUXVldWUgaGFzIHJlYWNoZWQgbWF4IGNhcGFjaXR5LCB5b3UgY2Fubm90IGFkZCBtb3JlIGl0ZW1zIik7dGhpcy5zdG9yYWdlLnB1c2goZSl9ZGVxdWV1ZSgpe3JldHVybiB0aGlzLnN0b3JhZ2Uuc2hpZnQoKX1zaXplKCl7cmV0dXJuIHRoaXMuc3RvcmFnZS5sZW5ndGh9fWNvbnN0IGJlPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5xdWV1ZV89bmV3IElyfWNsZWFyUXVldWUocil7Zm9yKDt0aGlzLnF1ZXVlXy5zaXplKCk+MDspdGhpcy5xdWV1ZV8uZGVxdWV1ZSgpLmNsb3NlKCl9c2V0VmlkZW9SZWFkYWJsZShyKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9Pnt0aGlzLmZyYW1lUmVhZGVyXz1yLmdldFJlYWRlcigpLHRoaXMuZnJhbWVSZWFkZXJfLnJlYWQoKS50aGVuKHM9Pnt0aGlzLnByb2Nlc3NGcmFtZShzKX0pLmNhdGNoKHM9Pnt0KHMpfSksZSgpfSl9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShhc3luYyhyLGUpPT57dmFyIHQ7dGhpcy5jbGVhclF1ZXVlKCEwKSx0aGlzLmZyYW1lUmVhZGVyXz8odD10aGlzLmZyYW1lUmVhZGVyXyk9PW51bGx8fHQuY2FuY2VsKCkudGhlbigoKT0+e3IoKX0pLmNhdGNoKHM9PntlKHMpfSk6cigpfSl9cHJvY2Vzc0ZyYW1lKHIpe2lmKCFyLmRvbmUpe2lmKCF0aGlzLmZyYW1lUmVhZGVyXyl7ci52YWx1ZS5jbG9zZSgpO3JldHVybn1mb3IoO3RoaXMucXVldWVfLnNpemUoKT49YmUuTlVNQkVSX09GX0ZSQU1FU19UT19DTEVBUjspe2xldCBlPXRoaXMucXVldWVfLmRlcXVldWUoKTtlJiZlLmNsb3NlKCl9dGhpcy5xdWV1ZV8uZW5xdWV1ZShyLnZhbHVlKSx0aGlzLmZyYW1lUmVhZGVyXy5yZWFkKCkudGhlbihlPT57dGhpcy5wcm9jZXNzRnJhbWUoZSl9KS5jYXRjaChlPT57Y29uc29sZS5lcnJvcihlKX0pfX1ydW5Qb3N0UHJvY2Vzc2luZyhyLGUpe3RyeXtpZihyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsdGhpcy5xdWV1ZV8uc2l6ZSgpPmJlLk5VTUJFUl9PRl9GUkFNRVNfVE9fQ0xFQVImJnRoaXMuY2xlYXJRdWV1ZSghMSksdGhpcy5xdWV1ZV8uc2l6ZSgpPjApe2NvbnN0IHQ9dGhpcy5xdWV1ZV8uZGVxdWV1ZSgpO3IuZHJhd0ltYWdlKHQsMCwwLGUud2lkdGgsZS5oZWlnaHQpLHQuY2xvc2UoKX19Y2F0Y2godCl7Y29uc29sZS5lcnJvcigiW1ZpZGVvUG9zdFByb2Nlc3NdIEZhaWxlZCB0byBkcmF3IGNhbnZhcyIsdCl9fX07bGV0IHdlPWJlO3dlLk5VTUJFUl9PRl9GUkFNRVNfVE9fQ0xFQVI9NTtjbGFzcyB4cntjb25zdHJ1Y3RvcihlKXt0aGlzLmJsdXJGaWx0ZXJfPWU9PT1fZS5IaWdoPyJibHVyKDE1cHgpIjoiYmx1cig1cHgpIn1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGU9PntlKCl9KX1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLWluIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj0iYmx1cigwcHgpIixlLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KX1jYXRjaChzKXtjb25zb2xlLmxvZygiW0JsdXJQb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixzKX19fWNvbnN0IHc9Y2xhc3N7Y29uc3RydWN0b3IoKXtpZih0aGlzLmxhc3RQcm9jZXNzZWRUaW1lc3RhbXBfPTAsdGhpcy5uZXdJbnB1dENvdW50ZXI9MCx0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucmVzdWx0Q2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSksdGhpcy5yZXN1bHRDdHhfPXRoaXMucmVzdWx0Q2FudmFzXy5nZXRDb250ZXh0KCIyZCIse2FscGhhOiExLGRlc3luY2hyb25pemVkOiEwfSksIXRoaXMucmVzdWx0Q3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7aWYodGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKHcuU0VMRklFX1dJRFRILHcuU0VMRklFX0hJR0hUKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfPXRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uZ2V0Q29udGV4dCgiMmQiLHthbHBoYTohMSxkZXN5bmNocm9uaXplZDohMH0pLCF0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKX1pbml0KHIpe3RoaXMucHJvY2Vzc0ZyYW1lQ2I9cn1hc3luYyBzZXRCYWNrZ3JvdW5kT3B0aW9ucyhyKXtpZih0eXBlb2YgdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8hPSJ1bmRlZmluZWQiKXRyeXthd2FpdCB0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXy5kZXN0cm95KCl9Y2F0Y2goZSl7dGhyb3cgZX1pZihyLnRyYW5zZm9ybWVyVHlwZT09PSJWaXJ0dWFsQmFja2dyb3VuZCIpdGhpcy50aW1lckdhcF89dy5WSVJUVUFMX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgWmU7ZWxzZSBpZihyLnRyYW5zZm9ybWVyVHlwZT09PSJCYWNrZ3JvdW5kQmx1ciIpe2xldCBlPXI7dGhpcy50aW1lckdhcF89dy5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgWWUoZS5yYWRpdXMpfWVsc2UgaWYoci50cmFuc2Zvcm1lclR5cGU9PT0iVmlkZW9CYWNrZ3JvdW5kIil0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyB3ZTtlbHNlIGlmKHIudHJhbnNmb3JtZXJUeXBlPT09IlNpbHVldGVCbHVyIil7bGV0IGU9cjt0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyB4cihlLnJhZGl1cyl9ZWxzZSB0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBZZX1jbG9zZSgpe3JldHVybiBuZXcgUHJvbWlzZSgocixlKT0+e3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfP3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLmRlc3Ryb3koKS50aGVuKCgpPT57cigpfSkuY2F0Y2godD0+e2UodCl9KTpyKCl9KX1zdGFydCgpe31hc3luYyB0cmFuc2Zvcm0ocixlKXsodGhpcy5yZXN1bHRDYW52YXNfLndpZHRoIT1yLmRpc3BsYXlXaWR0aHx8dGhpcy5yZXN1bHRDYW52YXNfLmhlaWdodCE9ci5kaXNwbGF5SGVpZ2h0KSYmKHRoaXMucmVzdWx0Q2FudmFzXy53aWR0aD1yLmRpc3BsYXlXaWR0aCx0aGlzLnJlc3VsdENhbnZhc18uaGVpZ2h0PXIuZGlzcGxheUhlaWdodCk7Y29uc3QgdD1yLnRpbWVzdGFtcDtjcmVhdGVJbWFnZUJpdG1hcChyKS50aGVuKHM9PntyLmNsb3NlKCksdGhpcy5wcm9jZXNzRnJhbWUoZSxzLHQpfSkuY2F0Y2gocz0+e2UuZW5xdWV1ZShyKX0pfXByb2Nlc3NGcmFtZShyLGUsdCl7KHRoaXMubmV3SW5wdXRDb3VudGVyPHcuTkVXX0lOUFVUX05VTUJFUl9PRl9SVU5TfHx0LXRoaXMubGFzdFByb2Nlc3NlZFRpbWVzdGFtcF8+PXRoaXMudGltZXJHYXBfKSYmKHRoaXMubGFzdFByb2Nlc3NlZFRpbWVzdGFtcF89dCx0aGlzLnByb2Nlc3NTb3VyY2UoZSksdGhpcy5uZXdJbnB1dENvdW50ZXI8dy5ORVdfSU5QVVRfTlVNQkVSX09GX1JVTlMmJnRoaXMubmV3SW5wdXRDb3VudGVyKyspLHRoaXMucmVzdWx0Q3R4Xy5zYXZlKCksdGhpcy5yZXN1bHRDdHhfLmNsZWFyUmVjdCgwLDAsdGhpcy5yZXN1bHRDYW52YXNfLndpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQpLHRoaXMuc2VnbWVudGF0aW9uTWFza0ltYWdlXyYmKHRoaXMucmVzdWx0Q3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImNvcHkiLHRoaXMucmVzdWx0Q3R4Xy5kcmF3SW1hZ2UodGhpcy5zZWdtZW50YXRpb25NYXNrSW1hZ2VfLDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tJbWFnZV8ud2lkdGgsdGhpcy5zZWdtZW50YXRpb25NYXNrSW1hZ2VfLmhlaWdodCwwLDAsdGhpcy5yZXN1bHRDYW52YXNfLndpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQpKSx0aGlzLnJlc3VsdEN0eF8uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtYXRvcCIsdGhpcy5yZXN1bHRDdHhfLmZpbHRlcj0ibm9uZSIsdGhpcy5yZXN1bHRDdHhfLmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXyYmdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8ucnVuUG9zdFByb2Nlc3NpbmcodGhpcy5yZXN1bHRDdHhfLGUpLHRoaXMucmVzdWx0Q3R4Xy5yZXN0b3JlKCksci5lbnF1ZXVlKG5ldyBWaWRlb0ZyYW1lKHRoaXMucmVzdWx0Q2FudmFzXyx7dGltZXN0YW1wOnQsYWxwaGE6ImRpc2NhcmQifSkpLGUuY2xvc2UoKX1wcm9jZXNzU291cmNlKHIpe2lmKHRoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uY2xlYXJSZWN0KDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uaGVpZ2h0KSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLmRyYXdJbWFnZShyLDAsMCxyLndpZHRoLHIuaGVpZ2h0LDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uaGVpZ2h0KSx0aGlzLnByb2Nlc3NGcmFtZUNiKXtsZXQgZT10aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpO3RoaXMucHJvY2Vzc0ZyYW1lQ2IoZSl9fWZsdXNoKCl7fWdldFRyYW5zZm9ybWVyVHlwZSgpe3JldHVybiJCYWNrZ3JvdW5kVHJhbnNmb3JtZXIifXJlc2V0TmV3SW5wdXRDb3VuZXIoKXt0aGlzLm5ld0lucHV0Q291bnRlcj0wfXNldFZpZGVvQkdSZWFkYWJsZShyKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9Pnt0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXyBpbnN0YW5jZW9mIHdlP3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLnNldFZpZGVvUmVhZGFibGUocikudGhlbigoKT0+e2UoKX0pLmNhdGNoKHM9Pnt0KHMpfSk6dCgicG9zdCBwcm9jZXNzIGlzIG5vdCB2aWRlbyIpfSl9c2V0VmlydHVhbEJHSW1hZ2Uocil7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57dGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8gaW5zdGFuY2VvZiBaZT8odGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8uc2V0VmlydHVhbEJHSW1hZ2UociksZSgpKTp0KCJwb3N0IHByb2Nlc3MgaXMgbm90IHZpZGVvIil9KX1zZXRTZWdtZW50YXRpb25NYXNrSW1hZ2Uocil7dGhpcy5zZWdtZW50YXRpb25NYXNrSW1hZ2VfJiZ0aGlzLnNlZ21lbnRhdGlvbk1hc2tJbWFnZV8uY2xvc2UoKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tJbWFnZV89cn19O2xldCBOPXc7Ti5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORD0yZTUsTi5WSVJUVUFMX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORD0xNWU0LE4uTkVXX0lOUFVUX05VTUJFUl9PRl9SVU5TPTMwLE4uU0VMRklFX1dJRFRIPTI1NixOLlNFTEZJRV9ISUdIVD0xNDQ7ZnVuY3Rpb24gTXIocil7cmV0dXJuIHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwmJiJtZXNzYWdlImluIHImJnR5cGVvZiByLm1lc3NhZ2U9PSJzdHJpbmcifWZ1bmN0aW9uIEFyKHIpe2lmKE1yKHIpKXJldHVybiByO3RyeXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHIpKX1jYXRjaHtyZXR1cm4gbmV3IEVycm9yKFN0cmluZyhyKSl9fWZ1bmN0aW9uIFUocil7cmV0dXJuIHR5cGVvZiByPT0idW5kZWZpbmVkIj8iIjpBcihyKS5tZXNzYWdlfWlmKHR5cGVvZiBpbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iKXtsZXQgcj1mdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZSgocyxuKT0+e2U9bmV3IE9yLGUub24oImVycm9yIixpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfZXJyb3JfZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksZS5vbigid2FybiIsaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToibWVkaWFfcHJvY2Vzc29yX3dhcm5fZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksZS5vbigicGlwZWxpbmVJbmZvIixpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfcGlwZWxpbmVfZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksdD1uZXcgTix0LmluaXQoaT0+e3Bvc3RNZXNzYWdlKGksW2ldKX0pO2xldCBvPVtdO28ucHVzaCh0KSxlLnNldFRyYW5zZm9ybWVycyhvKS50aGVuKCgpPT57cygpfSkuY2F0Y2goaT0+e24oaSl9KX0pfSxlLHQ7b25tZXNzYWdlPWFzeW5jIHM9PntpZihzLmRhdGEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7dCYmdC5zZXRTZWdtZW50YXRpb25NYXNrSW1hZ2Uocy5kYXRhKTtyZXR1cm59Y29uc3R7b3BlcmF0aW9uOm59PXMuZGF0YTtpZihuPT09ImluaXQiKXtjb25zdHttZXRhRGF0YTpvfT1zLmRhdGE7dHlwZW9mIG89PSJzdHJpbmciJiZkcihKU09OLnBhcnNlKG8pKSxyKCkudGhlbigoKT0+e2NvbnN0IGk9e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZTpufTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShpKSl9KS5jYXRjaChpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpuLGVycm9yOlUoaSl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGEpKX0pfWVsc2UgaWYobj09PSJ0cmFuc2Zvcm0iKXtjb25zdHtyZWFkYWJsZTpvLHdyaXRhYmxlOml9PXMuZGF0YTt0LnJlc2V0TmV3SW5wdXRDb3VuZXIoKSxlLnRyYW5zZm9ybShvLGkpLnRoZW4oKCk9Pntjb25zdCBhPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSkuY2F0Y2goYT0+e2NvbnN0IGw9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpVKGEpfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShsKSl9KX1lbHNlIGlmKG49PT0iZGVzdHJveSIpdC5jbG9zZSgpLmZpbmFsbHkoKCk9PntlLmRlc3Ryb3koKS50aGVuKCgpPT57Y29uc3Qgbz17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KG8pKX0pLmNhdGNoKG89Pntjb25zdCBpPXtjYWxsYmFja1R5cGU6ImVycm9yIixtZXNzYWdlOm4sZXJyb3I6VShvKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaSkpfSl9KTtlbHNlIGlmKG49PT0ic2V0VHJhY2tFeHBlY3RlZFJhdGUiKXtlLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHMuZGF0YS5yYXRlKTtjb25zdCBvPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobykpfWVsc2UgaWYobj09PSJzZXRCYWNrZ3JvdW5kT3B0aW9ucyIpe2NvbnN0e2JhY2tncm91bmRPcHRpb25zOm99PXMuZGF0YTt0LnNldEJhY2tncm91bmRPcHRpb25zKEpTT04ucGFyc2UobykpLnRoZW4oKCk9Pntjb25zdCBpPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaSkpfSkuY2F0Y2goaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpVKGkpfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhKSl9KX1lbHNlIGlmKG49PT0ic2V0VmlkZW9CR1JlYWRhYmxlIil7Y29uc3R7cmVhZGFibGU6b309cy5kYXRhO3Quc2V0VmlkZW9CR1JlYWRhYmxlKG8pLnRoZW4oKCk9Pntjb25zdCBpPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaSkpfSkuY2F0Y2goaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpVKGkpfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhKSl9KX1lbHNlIGlmKG49PT0ic2V0VmlydHVhbEJHSW1hZ2UiKXtjb25zdHtpbWFnZTpvfT1zLmRhdGE7dC5zZXRWaXJ0dWFsQkdJbWFnZShvKS50aGVuKCgpPT57Y29uc3QgaT17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGkpKX0pLmNhdGNoKGk9Pntjb25zdCBhPXtjYWxsYmFja1R5cGU6ImVycm9yIixtZXNzYWdlOm4sZXJyb3I6VShpKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSl9fX19KSgpOwo=";
|
|
1500
|
+
const encodedJs = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NsYXNzIFR7fVQudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSxULmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIiLHJlYWRhYmxlX251bGw6IlJlYWRhYmxlIGlzIG51bGwiLHdyaXRhYmxlX251bGw6IldyaXRhYmxlIGlzIG51bGwifTt2YXIgdGU9e2V4cG9ydHM6e319LEVlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBuPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxvPTA7bzxuLmxlbmd0aDtvKyspbltvXT1hcmd1bWVudHNbb107cmV0dXJuIGUuYXBwbHkodCxuKX19LHJ0PUVlLFI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiByZShyKXtyZXR1cm4gQXJyYXkuaXNBcnJheShyKX1mdW5jdGlvbiBzZShyKXtyZXR1cm4gdHlwZW9mIHI9PSJ1bmRlZmluZWQifWZ1bmN0aW9uIHN0KHIpe3JldHVybiByIT09bnVsbCYmIXNlKHIpJiZyLmNvbnN0cnVjdG9yIT09bnVsbCYmIXNlKHIuY29uc3RydWN0b3IpJiZ0eXBlb2Ygci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcj09ImZ1bmN0aW9uIiYmci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihyKX1mdW5jdGlvbiBQZShyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIn1mdW5jdGlvbiBudChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgRm9ybURhdGFdIn1mdW5jdGlvbiBpdChyKXt2YXIgZTtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIiYmQXJyYXlCdWZmZXIuaXNWaWV3P2U9QXJyYXlCdWZmZXIuaXNWaWV3KHIpOmU9ciYmci5idWZmZXImJlBlKHIuYnVmZmVyKSxlfWZ1bmN0aW9uIG90KHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyJ9ZnVuY3Rpb24gYXQocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIn1mdW5jdGlvbiBUZShyKXtyZXR1cm4gciE9PW51bGwmJnR5cGVvZiByPT0ib2JqZWN0In1mdW5jdGlvbiBIKHIpe2lmKFIuY2FsbChyKSE9PSJbb2JqZWN0IE9iamVjdF0iKXJldHVybiExO3ZhciBlPU9iamVjdC5nZXRQcm90b3R5cGVPZihyKTtyZXR1cm4gZT09PW51bGx8fGU9PT1PYmplY3QucHJvdG90eXBlfWZ1bmN0aW9uIHV0KHIpe3JldHVybiBSLmNhbGwocik9PT0iW29iamVjdCBEYXRlXSJ9ZnVuY3Rpb24gbHQocil7cmV0dXJuIFIuY2FsbChyKT09PSJbb2JqZWN0IEZpbGVdIn1mdW5jdGlvbiBjdChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgQmxvYl0ifWZ1bmN0aW9uIFJlKHIpe3JldHVybiBSLmNhbGwocik9PT0iW29iamVjdCBGdW5jdGlvbl0ifWZ1bmN0aW9uIGZ0KHIpe3JldHVybiBUZShyKSYmUmUoci5waXBlKX1mdW5jdGlvbiBodChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgVVJMU2VhcmNoUGFyYW1zXSJ9ZnVuY3Rpb24gZHQocil7cmV0dXJuIHIudHJpbT9yLnRyaW0oKTpyLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX1mdW5jdGlvbiBwdCgpe3JldHVybiB0eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmKG5hdmlnYXRvci5wcm9kdWN0PT09IlJlYWN0TmF0aXZlInx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTmF0aXZlU2NyaXB0Inx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTlMiKT8hMTp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmdHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIn1mdW5jdGlvbiBuZShyLGUpe2lmKCEocj09PW51bGx8fHR5cGVvZiByPT0idW5kZWZpbmVkIikpaWYodHlwZW9mIHIhPSJvYmplY3QiJiYocj1bcl0pLHJlKHIpKWZvcih2YXIgdD0wLHM9ci5sZW5ndGg7dDxzO3QrKyllLmNhbGwobnVsbCxyW3RdLHQscik7ZWxzZSBmb3IodmFyIG4gaW4gcilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocixuKSYmZS5jYWxsKG51bGwscltuXSxuLHIpfWZ1bmN0aW9uIGllKCl7dmFyIHI9e307ZnVuY3Rpb24gZShuLG8pe0gocltvXSkmJkgobik/cltvXT1pZShyW29dLG4pOkgobik/cltvXT1pZSh7fSxuKTpyZShuKT9yW29dPW4uc2xpY2UoKTpyW29dPW59Zm9yKHZhciB0PTAscz1hcmd1bWVudHMubGVuZ3RoO3Q8czt0KyspbmUoYXJndW1lbnRzW3RdLGUpO3JldHVybiByfWZ1bmN0aW9uIG10KHIsZSx0KXtyZXR1cm4gbmUoZSxmdW5jdGlvbihuLG8pe3QmJnR5cGVvZiBuPT0iZnVuY3Rpb24iP3Jbb109cnQobix0KTpyW29dPW59KSxyfWZ1bmN0aW9uIGd0KHIpe3JldHVybiByLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKHI9ci5zbGljZSgxKSkscn12YXIgcD17aXNBcnJheTpyZSxpc0FycmF5QnVmZmVyOlBlLGlzQnVmZmVyOnN0LGlzRm9ybURhdGE6bnQsaXNBcnJheUJ1ZmZlclZpZXc6aXQsaXNTdHJpbmc6b3QsaXNOdW1iZXI6YXQsaXNPYmplY3Q6VGUsaXNQbGFpbk9iamVjdDpILGlzVW5kZWZpbmVkOnNlLGlzRGF0ZTp1dCxpc0ZpbGU6bHQsaXNCbG9iOmN0LGlzRnVuY3Rpb246UmUsaXNTdHJlYW06ZnQsaXNVUkxTZWFyY2hQYXJhbXM6aHQsaXNTdGFuZGFyZEJyb3dzZXJFbnY6cHQsZm9yRWFjaDpuZSxtZXJnZTppZSxleHRlbmQ6bXQsdHJpbTpkdCxzdHJpcEJPTTpndH0sTT1wO2Z1bmN0aW9uIFNlKHIpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQocikucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lMjAvZywiKyIpLnJlcGxhY2UoLyU1Qi9naSwiWyIpLnJlcGxhY2UoLyU1RC9naSwiXSIpfXZhciBDZT1mdW5jdGlvbihlLHQscyl7aWYoIXQpcmV0dXJuIGU7dmFyIG47aWYocyluPXModCk7ZWxzZSBpZihNLmlzVVJMU2VhcmNoUGFyYW1zKHQpKW49dC50b1N0cmluZygpO2Vsc2V7dmFyIG89W107TS5mb3JFYWNoKHQsZnVuY3Rpb24obCxnKXtsPT09bnVsbHx8dHlwZW9mIGw9PSJ1bmRlZmluZWQifHwoTS5pc0FycmF5KGwpP2c9ZysiW10iOmw9W2xdLE0uZm9yRWFjaChsLGZ1bmN0aW9uKGYpe00uaXNEYXRlKGYpP2Y9Zi50b0lTT1N0cmluZygpOk0uaXNPYmplY3QoZikmJihmPUpTT04uc3RyaW5naWZ5KGYpKSxvLnB1c2goU2UoZykrIj0iK1NlKGYpKX0pKX0pLG49by5qb2luKCImIil9aWYobil7dmFyIGk9ZS5pbmRleE9mKCIjIik7aSE9PS0xJiYoZT1lLnNsaWNlKDAsaSkpLGUrPShlLmluZGV4T2YoIj8iKT09PS0xPyI/IjoiJiIpK259cmV0dXJuIGV9LF90PXA7ZnVuY3Rpb24gcSgpe3RoaXMuaGFuZGxlcnM9W119cS5wcm90b3R5cGUudXNlPWZ1bmN0aW9uKGUsdCxzKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0LHN5bmNocm9ub3VzOnM/cy5zeW5jaHJvbm91czohMSxydW5XaGVuOnM/cy5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfSxxLnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0scS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXtfdC5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24ocyl7cyE9PW51bGwmJmUocyl9KX07dmFyIHl0PXEsYnQ9cCx3dD1mdW5jdGlvbihlLHQpe2J0LmZvckVhY2goZSxmdW5jdGlvbihuLG8pe28hPT10JiZvLnRvVXBwZXJDYXNlKCk9PT10LnRvVXBwZXJDYXNlKCkmJihlW3RdPW4sZGVsZXRlIGVbb10pfSl9LE9lPWZ1bmN0aW9uKGUsdCxzLG4sbyl7cmV0dXJuIGUuY29uZmlnPXQscyYmKGUuY29kZT1zKSxlLnJlcXVlc3Q9bixlLnJlc3BvbnNlPW8sZS5pc0F4aW9zRXJyb3I9ITAsZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6dGhpcy5jb25maWcsY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMucmVzcG9uc2UmJnRoaXMucmVzcG9uc2Uuc3RhdHVzP3RoaXMucmVzcG9uc2Uuc3RhdHVzOm51bGx9fSxlfSx2dD1PZSxJZT1mdW5jdGlvbihlLHQscyxuLG8pe3ZhciBpPW5ldyBFcnJvcihlKTtyZXR1cm4gdnQoaSx0LHMsbixvKX0sRXQ9SWUsUHQ9ZnVuY3Rpb24oZSx0LHMpe3ZhciBuPXMuY29uZmlnLnZhbGlkYXRlU3RhdHVzOyFzLnN0YXR1c3x8IW58fG4ocy5zdGF0dXMpP2Uocyk6dChFdCgiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK3Muc3RhdHVzLHMuY29uZmlnLG51bGwscy5yZXF1ZXN0LHMpKX0saj1wLFR0PWouaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3JldHVybnt3cml0ZTpmdW5jdGlvbih0LHMsbixvLGksYSl7dmFyIGw9W107bC5wdXNoKHQrIj0iK2VuY29kZVVSSUNvbXBvbmVudChzKSksai5pc051bWJlcihuKSYmbC5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUobikudG9HTVRTdHJpbmcoKSksai5pc1N0cmluZyhvKSYmbC5wdXNoKCJwYXRoPSIrbyksai5pc1N0cmluZyhpKSYmbC5wdXNoKCJkb21haW49IitpKSxhPT09ITAmJmwucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWwuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbih0KXt2YXIgcz1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrdCsiKT0oW147XSopIikpO3JldHVybiBzP2RlY29kZVVSSUNvbXBvbmVudChzWzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy53cml0ZSh0LCIiLERhdGUubm93KCktODY0ZTUpfX19KCk6ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24oKXt9LHJlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0scmVtb3ZlOmZ1bmN0aW9uKCl7fX19KCksUnQ9ZnVuY3Rpb24oZSl7cmV0dXJuL14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChlKX0sU3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9lLnJlcGxhY2UoL1wvKyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0sQ3Q9UnQsT3Q9U3QsSXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmIUN0KHQpP090KGUsdCk6dH0sb2U9cCxNdD1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLHh0PWZ1bmN0aW9uKGUpe3ZhciB0PXt9LHMsbixvO3JldHVybiBlJiZvZS5mb3JFYWNoKGUuc3BsaXQoYApgKSxmdW5jdGlvbihhKXtpZihvPWEuaW5kZXhPZigiOiIpLHM9b2UudHJpbShhLnN1YnN0cigwLG8pKS50b0xvd2VyQ2FzZSgpLG49b2UudHJpbShhLnN1YnN0cihvKzEpKSxzKXtpZih0W3NdJiZNdC5pbmRleE9mKHMpPj0wKXJldHVybjtzPT09InNldC1jb29raWUiP3Rbc109KHRbc10/dFtzXTpbXSkuY29uY2F0KFtuXSk6dFtzXT10W3NdP3Rbc10rIiwgIituOm59fSksdH0sTWU9cCxBdD1NZS5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGU9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxzO2Z1bmN0aW9uIG4obyl7dmFyIGk9bztyZXR1cm4gZSYmKHQuc2V0QXR0cmlidXRlKCJocmVmIixpKSxpPXQuaHJlZiksdC5zZXRBdHRyaWJ1dGUoImhyZWYiLGkpLHtocmVmOnQuaHJlZixwcm90b2NvbDp0LnByb3RvY29sP3QucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnQuaG9zdCxzZWFyY2g6dC5zZWFyY2g/dC5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDp0Lmhhc2g/dC5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6dC5ob3N0bmFtZSxwb3J0OnQucG9ydCxwYXRobmFtZTp0LnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj90LnBhdGhuYW1lOiIvIit0LnBhdGhuYW1lfX1yZXR1cm4gcz1uKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihpKXt2YXIgYT1NZS5pc1N0cmluZyhpKT9uKGkpOmk7cmV0dXJuIGEucHJvdG9jb2w9PT1zLnByb3RvY29sJiZhLmhvc3Q9PT1zLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITB9fSgpO2Z1bmN0aW9uIGFlKHIpe3RoaXMubWVzc2FnZT1yfWFlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSxhZS5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgRz1hZSxKPXAsa3Q9UHQsTnQ9VHQsVXQ9Q2UsQnQ9SXQsTHQ9eHQsRHQ9QXQsdWU9SWUsJHQ9VyxGdD1HLHhlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihzLG4pe3ZhciBvPWUuZGF0YSxpPWUuaGVhZGVycyxhPWUucmVzcG9uc2VUeXBlLGw7ZnVuY3Rpb24gZygpe2UuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUobCksZS5zaWduYWwmJmUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixsKX1KLmlzRm9ybURhdGEobykmJmRlbGV0ZSBpWyJDb250ZW50LVR5cGUiXTt2YXIgdT1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoZS5hdXRoKXt2YXIgZj1lLmF1dGgudXNlcm5hbWV8fCIiLFA9ZS5hdXRoLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlLmF1dGgucGFzc3dvcmQpKToiIjtpLkF1dGhvcml6YXRpb249IkJhc2ljICIrYnRvYShmKyI6IitQKX12YXIgXz1CdChlLmJhc2VVUkwsZS51cmwpO3Uub3BlbihlLm1ldGhvZC50b1VwcGVyQ2FzZSgpLFV0KF8sZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKSwhMCksdS50aW1lb3V0PWUudGltZW91dDtmdW5jdGlvbiBldCgpe2lmKCEhdSl7dmFyIHY9ImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiB1P0x0KHUuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpOm51bGwsQj0hYXx8YT09PSJ0ZXh0Inx8YT09PSJqc29uIj91LnJlc3BvbnNlVGV4dDp1LnJlc3BvbnNlLEk9e2RhdGE6QixzdGF0dXM6dS5zdGF0dXMsc3RhdHVzVGV4dDp1LnN0YXR1c1RleHQsaGVhZGVyczp2LGNvbmZpZzplLHJlcXVlc3Q6dX07a3QoZnVuY3Rpb24odmUpe3ModmUpLGcoKX0sZnVuY3Rpb24odmUpe24odmUpLGcoKX0sSSksdT1udWxsfX1pZigib25sb2FkZW5kImluIHU/dS5vbmxvYWRlbmQ9ZXQ6dS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshdXx8dS5yZWFkeVN0YXRlIT09NHx8dS5zdGF0dXM9PT0wJiYhKHUucmVzcG9uc2VVUkwmJnUucmVzcG9uc2VVUkwuaW5kZXhPZigiZmlsZToiKT09PTApfHxzZXRUaW1lb3V0KGV0KX0sdS5vbmFib3J0PWZ1bmN0aW9uKCl7IXV8fChuKHVlKCJSZXF1ZXN0IGFib3J0ZWQiLGUsIkVDT05OQUJPUlRFRCIsdSkpLHU9bnVsbCl9LHUub25lcnJvcj1mdW5jdGlvbigpe24odWUoIk5ldHdvcmsgRXJyb3IiLGUsbnVsbCx1KSksdT1udWxsfSx1Lm9udGltZW91dD1mdW5jdGlvbigpe3ZhciBCPWUudGltZW91dD8idGltZW91dCBvZiAiK2UudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixJPWUudHJhbnNpdGlvbmFsfHwkdC50cmFuc2l0aW9uYWw7ZS50aW1lb3V0RXJyb3JNZXNzYWdlJiYoQj1lLnRpbWVvdXRFcnJvck1lc3NhZ2UpLG4odWUoQixlLEkuY2xhcmlmeVRpbWVvdXRFcnJvcj8iRVRJTUVET1VUIjoiRUNPTk5BQk9SVEVEIix1KSksdT1udWxsfSxKLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpe3ZhciB0dD0oZS53aXRoQ3JlZGVudGlhbHN8fER0KF8pKSYmZS54c3JmQ29va2llTmFtZT9OdC5yZWFkKGUueHNyZkNvb2tpZU5hbWUpOnZvaWQgMDt0dCYmKGlbZS54c3JmSGVhZGVyTmFtZV09dHQpfSJzZXRSZXF1ZXN0SGVhZGVyImluIHUmJkouZm9yRWFjaChpLGZ1bmN0aW9uKEIsSSl7dHlwZW9mIG89PSJ1bmRlZmluZWQiJiZJLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIj9kZWxldGUgaVtJXTp1LnNldFJlcXVlc3RIZWFkZXIoSSxCKX0pLEouaXNVbmRlZmluZWQoZS53aXRoQ3JlZGVudGlhbHMpfHwodS53aXRoQ3JlZGVudGlhbHM9ISFlLndpdGhDcmVkZW50aWFscyksYSYmYSE9PSJqc29uIiYmKHUucmVzcG9uc2VUeXBlPWUucmVzcG9uc2VUeXBlKSx0eXBlb2YgZS5vbkRvd25sb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJnUuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25Eb3dubG9hZFByb2dyZXNzKSx0eXBlb2YgZS5vblVwbG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZ1LnVwbG9hZCYmdS51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25VcGxvYWRQcm9ncmVzcyksKGUuY2FuY2VsVG9rZW58fGUuc2lnbmFsKSYmKGw9ZnVuY3Rpb24odil7IXV8fChuKCF2fHx2JiZ2LnR5cGU/bmV3IEZ0KCJjYW5jZWxlZCIpOnYpLHUuYWJvcnQoKSx1PW51bGwpfSxlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnN1YnNjcmliZShsKSxlLnNpZ25hbCYmKGUuc2lnbmFsLmFib3J0ZWQ/bCgpOmUuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixsKSkpLG98fChvPW51bGwpLHUuc2VuZChvKX0pfSxoPXAsQWU9d3QsSHQ9T2UscXQ9eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifTtmdW5jdGlvbiBrZShyLGUpeyFoLmlzVW5kZWZpbmVkKHIpJiZoLmlzVW5kZWZpbmVkKHJbIkNvbnRlbnQtVHlwZSJdKSYmKHJbIkNvbnRlbnQtVHlwZSJdPWUpfWZ1bmN0aW9uIGp0KCl7dmFyIHI7cmV0dXJuKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCE9InVuZGVmaW5lZCJ8fHR5cGVvZiBwcm9jZXNzIT0idW5kZWZpbmVkIiYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpPT09IltvYmplY3QgcHJvY2Vzc10iKSYmKHI9eGUpLHJ9ZnVuY3Rpb24gR3QocixlLHQpe2lmKGguaXNTdHJpbmcocikpdHJ5e3JldHVybihlfHxKU09OLnBhcnNlKShyKSxoLnRyaW0ocil9Y2F0Y2gocyl7aWYocy5uYW1lIT09IlN5bnRheEVycm9yIil0aHJvdyBzfXJldHVybih0fHxKU09OLnN0cmluZ2lmeSkocil9dmFyIFY9e3RyYW5zaXRpb25hbDp7c2lsZW50SlNPTlBhcnNpbmc6ITAsZm9yY2VkSlNPTlBhcnNpbmc6ITAsY2xhcmlmeVRpbWVvdXRFcnJvcjohMX0sYWRhcHRlcjpqdCgpLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7cmV0dXJuIEFlKHQsIkFjY2VwdCIpLEFlKHQsIkNvbnRlbnQtVHlwZSIpLGguaXNGb3JtRGF0YShlKXx8aC5pc0FycmF5QnVmZmVyKGUpfHxoLmlzQnVmZmVyKGUpfHxoLmlzU3RyZWFtKGUpfHxoLmlzRmlsZShlKXx8aC5pc0Jsb2IoZSk/ZTpoLmlzQXJyYXlCdWZmZXJWaWV3KGUpP2UuYnVmZmVyOmguaXNVUkxTZWFyY2hQYXJhbXMoZSk/KGtlKHQsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiksZS50b1N0cmluZygpKTpoLmlzT2JqZWN0KGUpfHx0JiZ0WyJDb250ZW50LVR5cGUiXT09PSJhcHBsaWNhdGlvbi9qc29uIj8oa2UodCwiYXBwbGljYXRpb24vanNvbiIpLEd0KGUpKTplfV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKGUpe3ZhciB0PXRoaXMudHJhbnNpdGlvbmFsfHxWLnRyYW5zaXRpb25hbCxzPXQmJnQuc2lsZW50SlNPTlBhcnNpbmcsbj10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG89IXMmJnRoaXMucmVzcG9uc2VUeXBlPT09Impzb24iO2lmKG98fG4mJmguaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChpKXtpZihvKXRocm93IGkubmFtZT09PSJTeW50YXhFcnJvciI/SHQoaSx0aGlzLCJFX0pTT05fUEFSU0UiKTppfXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX19O2guZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSxmdW5jdGlvbihlKXtWLmhlYWRlcnNbZV09e319KSxoLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtWLmhlYWRlcnNbZV09aC5tZXJnZShxdCl9KTt2YXIgVz1WLEp0PXAsVnQ9VyxXdD1mdW5jdGlvbihlLHQscyl7dmFyIG49dGhpc3x8VnQ7cmV0dXJuIEp0LmZvckVhY2gocyxmdW5jdGlvbihpKXtlPWkuY2FsbChuLGUsdCl9KSxlfSxOZT1mdW5jdGlvbihlKXtyZXR1cm4hIShlJiZlLl9fQ0FOQ0VMX18pfSxVZT1wLGxlPVd0LHp0PU5lLFF0PVcsWHQ9RztmdW5jdGlvbiBjZShyKXtpZihyLmNhbmNlbFRva2VuJiZyLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKSxyLnNpZ25hbCYmci5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgWHQoImNhbmNlbGVkIil9dmFyIEt0PWZ1bmN0aW9uKGUpe2NlKGUpLGUuaGVhZGVycz1lLmhlYWRlcnN8fHt9LGUuZGF0YT1sZS5jYWxsKGUsZS5kYXRhLGUuaGVhZGVycyxlLnRyYW5zZm9ybVJlcXVlc3QpLGUuaGVhZGVycz1VZS5tZXJnZShlLmhlYWRlcnMuY29tbW9ufHx7fSxlLmhlYWRlcnNbZS5tZXRob2RdfHx7fSxlLmhlYWRlcnMpLFVlLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwiY29tbW9uIl0sZnVuY3Rpb24obil7ZGVsZXRlIGUuaGVhZGVyc1tuXX0pO3ZhciB0PWUuYWRhcHRlcnx8UXQuYWRhcHRlcjtyZXR1cm4gdChlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiBjZShlKSxuLmRhdGE9bGUuY2FsbChlLG4uZGF0YSxuLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSksbn0sZnVuY3Rpb24obil7cmV0dXJuIHp0KG4pfHwoY2UoZSksbiYmbi5yZXNwb25zZSYmKG4ucmVzcG9uc2UuZGF0YT1sZS5jYWxsKGUsbi5yZXNwb25zZS5kYXRhLG4ucmVzcG9uc2UuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSkpLFByb21pc2UucmVqZWN0KG4pfSl9LHk9cCxCZT1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIHM9e307ZnVuY3Rpb24gbih1LGYpe3JldHVybiB5LmlzUGxhaW5PYmplY3QodSkmJnkuaXNQbGFpbk9iamVjdChmKT95Lm1lcmdlKHUsZik6eS5pc1BsYWluT2JqZWN0KGYpP3kubWVyZ2Uoe30sZik6eS5pc0FycmF5KGYpP2Yuc2xpY2UoKTpmfWZ1bmN0aW9uIG8odSl7aWYoeS5pc1VuZGVmaW5lZCh0W3VdKSl7aWYoIXkuaXNVbmRlZmluZWQoZVt1XSkpcmV0dXJuIG4odm9pZCAwLGVbdV0pfWVsc2UgcmV0dXJuIG4oZVt1XSx0W3VdKX1mdW5jdGlvbiBpKHUpe2lmKCF5LmlzVW5kZWZpbmVkKHRbdV0pKXJldHVybiBuKHZvaWQgMCx0W3VdKX1mdW5jdGlvbiBhKHUpe2lmKHkuaXNVbmRlZmluZWQodFt1XSkpe2lmKCF5LmlzVW5kZWZpbmVkKGVbdV0pKXJldHVybiBuKHZvaWQgMCxlW3VdKX1lbHNlIHJldHVybiBuKHZvaWQgMCx0W3VdKX1mdW5jdGlvbiBsKHUpe2lmKHUgaW4gdClyZXR1cm4gbihlW3VdLHRbdV0pO2lmKHUgaW4gZSlyZXR1cm4gbih2b2lkIDAsZVt1XSl9dmFyIGc9e3VybDppLG1ldGhvZDppLGRhdGE6aSxiYXNlVVJMOmEsdHJhbnNmb3JtUmVxdWVzdDphLHRyYW5zZm9ybVJlc3BvbnNlOmEscGFyYW1zU2VyaWFsaXplcjphLHRpbWVvdXQ6YSx0aW1lb3V0TWVzc2FnZTphLHdpdGhDcmVkZW50aWFsczphLGFkYXB0ZXI6YSxyZXNwb25zZVR5cGU6YSx4c3JmQ29va2llTmFtZTphLHhzcmZIZWFkZXJOYW1lOmEsb25VcGxvYWRQcm9ncmVzczphLG9uRG93bmxvYWRQcm9ncmVzczphLGRlY29tcHJlc3M6YSxtYXhDb250ZW50TGVuZ3RoOmEsbWF4Qm9keUxlbmd0aDphLHRyYW5zcG9ydDphLGh0dHBBZ2VudDphLGh0dHBzQWdlbnQ6YSxjYW5jZWxUb2tlbjphLHNvY2tldFBhdGg6YSxyZXNwb25zZUVuY29kaW5nOmEsdmFsaWRhdGVTdGF0dXM6bH07cmV0dXJuIHkuZm9yRWFjaChPYmplY3Qua2V5cyhlKS5jb25jYXQoT2JqZWN0LmtleXModCkpLGZ1bmN0aW9uKGYpe3ZhciBQPWdbZl18fG8sXz1QKGYpO3kuaXNVbmRlZmluZWQoXykmJlAhPT1sfHwoc1tmXT1fKX0pLHN9LExlPXt2ZXJzaW9uOiIwLjI1LjAifSxZdD1MZS52ZXJzaW9uLGZlPXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaChmdW5jdGlvbihyLGUpe2ZlW3JdPWZ1bmN0aW9uKHMpe3JldHVybiB0eXBlb2Ygcz09PXJ8fCJhIisoZTwxPyJuICI6IiAiKStyfX0pO3ZhciBEZT17fTtmZS50cmFuc2l0aW9uYWw9ZnVuY3Rpb24oZSx0LHMpe2Z1bmN0aW9uIG4obyxpKXtyZXR1cm4iW0F4aW9zIHYiK1l0KyJdIFRyYW5zaXRpb25hbCBvcHRpb24gJyIrbysiJyIraSsocz8iLiAiK3M6IiIpfXJldHVybiBmdW5jdGlvbihvLGksYSl7aWYoZT09PSExKXRocm93IG5ldyBFcnJvcihuKGksIiBoYXMgYmVlbiByZW1vdmVkIisodD8iIGluICIrdDoiIikpKTtyZXR1cm4gdCYmIURlW2ldJiYoRGVbaV09ITAsY29uc29sZS53YXJuKG4oaSwiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdiIrdCsiIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlIikpKSxlP2UobyxpLGEpOiEwfX07ZnVuY3Rpb24gWnQocixlLHQpe2lmKHR5cGVvZiByIT0ib2JqZWN0Iil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Zm9yKHZhciBzPU9iamVjdC5rZXlzKHIpLG49cy5sZW5ndGg7bi0tID4wOyl7dmFyIG89c1tuXSxpPWVbb107aWYoaSl7dmFyIGE9cltvXSxsPWE9PT12b2lkIDB8fGkoYSxvLHIpO2lmKGwhPT0hMCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb24gIitvKyIgbXVzdCBiZSAiK2wpO2NvbnRpbnVlfWlmKHQhPT0hMCl0aHJvdyBFcnJvcigiVW5rbm93biBvcHRpb24gIitvKX19dmFyIGVyPXthc3NlcnRPcHRpb25zOlp0LHZhbGlkYXRvcnM6ZmV9LCRlPXAsdHI9Q2UsRmU9eXQsSGU9S3Qsej1CZSxxZT1lcix4PXFlLnZhbGlkYXRvcnM7ZnVuY3Rpb24gTChyKXt0aGlzLmRlZmF1bHRzPXIsdGhpcy5pbnRlcmNlcHRvcnM9e3JlcXVlc3Q6bmV3IEZlLHJlc3BvbnNlOm5ldyBGZX19TC5wcm90b3R5cGUucmVxdWVzdD1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIj8odD10fHx7fSx0LnVybD1lKTp0PWV8fHt9LCF0LnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7dD16KHRoaXMuZGVmYXVsdHMsdCksdC5tZXRob2Q/dC5tZXRob2Q9dC5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD90Lm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnQubWV0aG9kPSJnZXQiO3ZhciBzPXQudHJhbnNpdGlvbmFsO3MhPT12b2lkIDAmJnFlLmFzc2VydE9wdGlvbnMocyx7c2lsZW50SlNPTlBhcnNpbmc6eC50cmFuc2l0aW9uYWwoeC5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzp4LnRyYW5zaXRpb25hbCh4LmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6eC50cmFuc2l0aW9uYWwoeC5ib29sZWFuKX0sITEpO3ZhciBuPVtdLG89ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKF8pe3R5cGVvZiBfLnJ1bldoZW49PSJmdW5jdGlvbiImJl8ucnVuV2hlbih0KT09PSExfHwobz1vJiZfLnN5bmNocm9ub3VzLG4udW5zaGlmdChfLmZ1bGZpbGxlZCxfLnJlamVjdGVkKSl9KTt2YXIgaT1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKF8pe2kucHVzaChfLmZ1bGZpbGxlZCxfLnJlamVjdGVkKX0pO3ZhciBhO2lmKCFvKXt2YXIgbD1bSGUsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkobCxuKSxsPWwuY29uY2F0KGkpLGE9UHJvbWlzZS5yZXNvbHZlKHQpO2wubGVuZ3RoOylhPWEudGhlbihsLnNoaWZ0KCksbC5zaGlmdCgpKTtyZXR1cm4gYX1mb3IodmFyIGc9dDtuLmxlbmd0aDspe3ZhciB1PW4uc2hpZnQoKSxmPW4uc2hpZnQoKTt0cnl7Zz11KGcpfWNhdGNoKFApe2YoUCk7YnJlYWt9fXRyeXthPUhlKGcpfWNhdGNoKFApe3JldHVybiBQcm9taXNlLnJlamVjdChQKX1mb3IoO2kubGVuZ3RoOylhPWEudGhlbihpLnNoaWZ0KCksaS5zaGlmdCgpKTtyZXR1cm4gYX0sTC5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe2lmKCFlLnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7cmV0dXJuIGU9eih0aGlzLmRlZmF1bHRzLGUpLHRyKGUudXJsLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcikucmVwbGFjZSgvXlw/LywiIil9LCRlLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKGUpe0wucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscyl7cmV0dXJuIHRoaXMucmVxdWVzdCh6KHN8fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihzfHx7fSkuZGF0YX0pKX19KSwkZS5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7TC5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxzLG4pe3JldHVybiB0aGlzLnJlcXVlc3QoeihufHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpzfSkpfX0pO3ZhciBycj1MLHNyPUc7ZnVuY3Rpb24gQShyKXtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uIik7dmFyIGU7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe2U9bn0pO3ZhciB0PXRoaXM7dGhpcy5wcm9taXNlLnRoZW4oZnVuY3Rpb24ocyl7aWYoISF0Ll9saXN0ZW5lcnMpe3ZhciBuLG89dC5fbGlzdGVuZXJzLmxlbmd0aDtmb3Iobj0wO248bztuKyspdC5fbGlzdGVuZXJzW25dKHMpO3QuX2xpc3RlbmVycz1udWxsfX0pLHRoaXMucHJvbWlzZS50aGVuPWZ1bmN0aW9uKHMpe3ZhciBuLG89bmV3IFByb21pc2UoZnVuY3Rpb24oaSl7dC5zdWJzY3JpYmUoaSksbj1pfSkudGhlbihzKTtyZXR1cm4gby5jYW5jZWw9ZnVuY3Rpb24oKXt0LnVuc3Vic2NyaWJlKG4pfSxvfSxyKGZ1bmN0aW9uKG4pe3QucmVhc29ufHwodC5yZWFzb249bmV3IHNyKG4pLGUodC5yZWFzb24pKX0pfUEucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn0sQS5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKHRoaXMucmVhc29uKXtlKHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19LEEucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKCEhdGhpcy5fbGlzdGVuZXJzKXt2YXIgdD10aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihlKTt0IT09LTEmJnRoaXMuX2xpc3RlbmVycy5zcGxpY2UodCwxKX19LEEuc291cmNlPWZ1bmN0aW9uKCl7dmFyIGUsdD1uZXcgQShmdW5jdGlvbihuKXtlPW59KTtyZXR1cm57dG9rZW46dCxjYW5jZWw6ZX19O3ZhciBucj1BLGlyPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihzKXtyZXR1cm4gZS5hcHBseShudWxsLHMpfX0sb3I9cCxhcj1mdW5jdGlvbihlKXtyZXR1cm4gb3IuaXNPYmplY3QoZSkmJmUuaXNBeGlvc0Vycm9yPT09ITB9LGplPXAsdXI9RWUsUT1ycixscj1CZSxjcj1XO2Z1bmN0aW9uIEdlKHIpe3ZhciBlPW5ldyBRKHIpLHQ9dXIoUS5wcm90b3R5cGUucmVxdWVzdCxlKTtyZXR1cm4gamUuZXh0ZW5kKHQsUS5wcm90b3R5cGUsZSksamUuZXh0ZW5kKHQsZSksdC5jcmVhdGU9ZnVuY3Rpb24obil7cmV0dXJuIEdlKGxyKHIsbikpfSx0fXZhciBFPUdlKGNyKTtFLkF4aW9zPVEsRS5DYW5jZWw9RyxFLkNhbmNlbFRva2VuPW5yLEUuaXNDYW5jZWw9TmUsRS5WRVJTSU9OPUxlLnZlcnNpb24sRS5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUpfSxFLnNwcmVhZD1pcixFLmlzQXhpb3NFcnJvcj1hcix0ZS5leHBvcnRzPUUsdGUuZXhwb3J0cy5kZWZhdWx0PUU7dmFyIGZyPXRlLmV4cG9ydHM7Y2xhc3MgY3tpc0VtcHR5KCl7cmV0dXJuIXRoaXMuaXNQcmVzZW50KCl9c3RhdGljIG9mKGUpe2lmKGUhPW51bGwpcmV0dXJuIG5ldyBKZShlKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFzc2VkIHZhbHVlIHdhcyBudWxsIG9yIHVuZGVmaW5lZC4iKX1zdGF0aWMgb2ZOb25OdWxsKGUpe3JldHVybiBjLm9mKGUpfXN0YXRpYyBvZk51bGxhYmxlKGUpe3JldHVybiBlIT1udWxsP25ldyBKZShlKTpuZXcgVmV9c3RhdGljIGVtcHR5KCl7cmV0dXJuIG5ldyBWZX1zdGF0aWMgZnJvbShlKXtzd2l0Y2goZS5raW5kKXtjYXNlInByZXNlbnQiOnJldHVybiBjLm9mKGUudmFsdWUpO2Nhc2UiZW1wdHkiOnJldHVybiBjLmVtcHR5KCk7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFzc2VkIHZhbHVlIHdhcyBub3QgYW4gT3B0aW9uIHR5cGUuIil9fX1jbGFzcyBKZSBleHRlbmRzIGN7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnBheWxvYWQ9ZX1pc1ByZXNlbnQoKXtyZXR1cm4hMH1nZXQoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfWlmUHJlc2VudChlKXtlKHRoaXMucGF5bG9hZCl9aWZQcmVzZW50T3JFbHNlKGUsdCl7ZSh0aGlzLnBheWxvYWQpfWZpbHRlcihlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpP3RoaXM6Yy5lbXB0eSgpfW1hcChlKXtjb25zdCB0PWUodGhpcy5wYXlsb2FkKTtyZXR1cm4gYy5vZk51bGxhYmxlKHQpfWZsYXRNYXAoZSl7cmV0dXJuIGUodGhpcy5wYXlsb2FkKX1vcihlKXtyZXR1cm4gdGhpc31vckVsc2UoZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vckVsc2VUaHJvdyhlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yTnVsbCgpe3JldHVybiB0aGlzLnBheWxvYWR9b3JVbmRlZmluZWQoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6InByZXNlbnQiLHZhbHVlOnRoaXMucGF5bG9hZH19bWF0Y2hlcyhlKXtyZXR1cm4gZS5wcmVzZW50KHRoaXMucGF5bG9hZCl9dG9KU09OKGUpe3JldHVybiB0aGlzLnBheWxvYWR9fWNsYXNzIFZlIGV4dGVuZHMgY3tpc1ByZXNlbnQoKXtyZXR1cm4hMX1jb25zdHJ1Y3Rvcigpe3N1cGVyKCl9Z2V0KCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIG9wdGlvbmFsIGlzIG5vdCBwcmVzZW50LiIpfWlmUHJlc2VudChlKXt9aWZQcmVzZW50T3JFbHNlKGUsdCl7dCgpfWZpbHRlcihlKXtyZXR1cm4gdGhpc31tYXAoZSl7cmV0dXJuIGMuZW1wdHkoKX1mbGF0TWFwKGUpe3JldHVybiBjLmVtcHR5KCl9b3IoZSl7cmV0dXJuIGUoKX1vckVsc2UoZSl7cmV0dXJuIGV9b3JFbHNlR2V0KGUpe3JldHVybiB0aGlzLm9yRWxzZShlKCkpfW9yRWxzZVRocm93KGUpe3Rocm93IGUoKX1vck51bGwoKXtyZXR1cm4gbnVsbH1vclVuZGVmaW5lZCgpe310b09wdGlvbigpe3JldHVybntraW5kOiJlbXB0eSJ9fW1hdGNoZXMoZSl7cmV0dXJuIGUuZW1wdHkoKX10b0pTT04oZSl7cmV0dXJuIG51bGx9fWNvbnN0IGhyPSIxLjIuNyI7ZnVuY3Rpb24gZHIocil7Z2xvYmFsVGhpcy5fdm9uYWdlTWVkaWFQcm9jZXNzb3JNZXRhZGF0YT1yfWZ1bmN0aW9uIHByKCl7cmV0dXJuIGdsb2JhbFRoaXMuX3ZvbmFnZU1lZGlhUHJvY2Vzc29yTWV0YWRhdGF9Y2xhc3MgYntjb25zdHJ1Y3Rvcigpe2NvbnN0IGU9cHIoKTt0aGlzLl9yZXBvcnQ9e2FjdGlvbjpjLmVtcHR5KCksYXBwbGljYXRpb25JZDpjLm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLmFwcElkOm51bGwpLHRpbWVzdGFtcDpEYXRlLm5vdygpLGZwczpjLmVtcHR5KCksZnJhbWVzVHJhbnNmb3JtZWQ6Yy5lbXB0eSgpLGd1aWQ6Yy5lbXB0eSgpLGhpZ2hlc3RGcmFtZVRyYW5zZm9ybUNwdTpjLmVtcHR5KCksbWVzc2FnZTpjLmVtcHR5KCksc291cmNlOmMub2ZOdWxsYWJsZShlIT09dm9pZCAwJiZlIT1udWxsP2Uuc291cmNlVHlwZTpudWxsKSx0cmFuc2Zvcm1lZEZwczpjLmVtcHR5KCksdHJhbnNmb3JtZXJUeXBlOmMuZW1wdHkoKSx2YXJpYXRpb246Yy5lbXB0eSgpLHZpZGVvSGVpZ2h0OmMuZW1wdHkoKSx2aWRlb1dpZHRoOmMuZW1wdHkoKSx2ZXJzaW9uOmhyLGVycm9yOmMuZW1wdHkoKSxwcm94eVVybDpjLm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLnByb3h5VXJsOm51bGwpfX1hY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5hY3Rpb249Yy5vZk51bGxhYmxlKGUpLHRoaXN9ZnJhbWVzVHJhbnNmb3JtZWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcmFtZXNUcmFuc2Zvcm1lZD1jLm9mTnVsbGFibGUoZSksdGhpc31mcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcHM9Yy5vZk51bGxhYmxlKGUpLHRoaXN9Z3VpZChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lmd1aWQ9Yy5vZk51bGxhYmxlKGUpLHRoaXN9bWVzc2FnZShlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lm1lc3NhZ2U9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZWRGcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lZEZwcz1jLm9mTnVsbGFibGUoZSksdGhpc310cmFuc2Zvcm1lclR5cGUoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lclR5cGU9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dmFyaWF0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmFyaWF0aW9uPWMub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvSGVpZ2h0KGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmlkZW9IZWlnaHQ9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dmlkZW9XaWR0aChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvV2lkdGg9Yy5vZk51bGxhYmxlKGUpLHRoaXN9ZXJyb3IoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5lcnJvcj1jLm9mTnVsbGFibGUoZSksdGhpc31idWlsZCgpe3JldHVybiB0aGlzLl9yZXBvcnR9fWNvbnN0IG1yPXI9PkpTT04uc3RyaW5naWZ5KHIsKGUsdCk9PntpZih0IT09bnVsbClyZXR1cm4gdH0pO2NsYXNzIHd7c3RhdGljIHJlcG9ydChlKXtyZXR1cm4gbmV3IFByb21pc2UoKHQscyk9PntpZihlLmFwcGxpY2F0aW9uSWQuaXNFbXB0eSgpfHxlLnNvdXJjZS5pc0VtcHR5KCkpe3QoInN1Y2Nlc3MiKTtyZXR1cm59bGV0IG49ZnIuY3JlYXRlKCksbz17dGltZW91dDoxZTQsdGltZW91dEVycm9yTWVzc2FnZToiUmVxdWVzdCB0aW1lb3V0IixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9fSxpPSJobGcudG9rYm94LmNvbS9wcm9kL2xvZ2dpbmcvdmNwX3dlYnJ0YyI7aWYoZS5wcm94eVVybC5pc0VtcHR5KCkpaT0iaHR0cHM6Ly8iK2k7ZWxzZXtsZXQgYTtlLnByb3h5VXJsLmdldCgpLnNsaWNlKGUucHJveHlVcmwuZ2V0KCkubGVuZ3RoLTEpIT09Ii8iP2E9ZS5wcm94eVVybC5nZXQoKSsiLyI6YT1lLnByb3h5VXJsLmdldCgpLGk9YStpfW4ucG9zdChpLG1yKGUpLG8pLnRoZW4oYT0+e2NvbnNvbGUubG9nKGEpLHQoInN1Y2Nlc3MiKX0pLmNhdGNoKGE9Pntjb25zb2xlLmxvZyhhKSxzKGEpfSl9KX19dmFyIFgsZ3I9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIF9yKCl7aWYoIVgmJihYPXR5cGVvZiBjcnlwdG8hPSJ1bmRlZmluZWQiJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8dHlwZW9mIG1zQ3J5cHRvIT0idW5kZWZpbmVkIiYmdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIiYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pLCFYKSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIFgoZ3IpfXZhciB5cj0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7ZnVuY3Rpb24gYnIocil7cmV0dXJuIHR5cGVvZiByPT0ic3RyaW5nIiYmeXIudGVzdChyKX1mb3IodmFyIGQ9W10saGU9MDtoZTwyNTY7KytoZSlkLnB1c2goKGhlKzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gd3Iocil7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjAsdD0oZFtyW2UrMF1dK2RbcltlKzFdXStkW3JbZSsyXV0rZFtyW2UrM11dKyItIitkW3JbZSs0XV0rZFtyW2UrNV1dKyItIitkW3JbZSs2XV0rZFtyW2UrN11dKyItIitkW3JbZSs4XV0rZFtyW2UrOV1dKyItIitkW3JbZSsxMF1dK2RbcltlKzExXV0rZFtyW2UrMTJdXStkW3JbZSsxM11dK2RbcltlKzE0XV0rZFtyW2UrMTVdXSkudG9Mb3dlckNhc2UoKTtpZighYnIodCkpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBXZShyLGUsdCl7cj1yfHx7fTt2YXIgcz1yLnJhbmRvbXx8KHIucm5nfHxfcikoKTtpZihzWzZdPXNbNl0mMTV8NjQsc1s4XT1zWzhdJjYzfDEyOCxlKXt0PXR8fDA7Zm9yKHZhciBuPTA7bjwxNjsrK24pZVt0K25dPXNbbl07cmV0dXJuIGV9cmV0dXJuIHdyKHMpfWNvbnN0IFM9bmV3IFdlYWtNYXAsSz1uZXcgV2Vha01hcCxEPW5ldyBXZWFrTWFwLGRlPVN5bWJvbCgiYW55UHJvZHVjZXIiKSx6ZT1Qcm9taXNlLnJlc29sdmUoKSxZPVN5bWJvbCgibGlzdGVuZXJBZGRlZCIpLFo9U3ltYm9sKCJsaXN0ZW5lclJlbW92ZWQiKTtsZXQgcGU9ITE7ZnVuY3Rpb24gayhyKXtpZih0eXBlb2YgciE9InN0cmluZyImJnR5cGVvZiByIT0ic3ltYm9sIil0aHJvdyBuZXcgVHlwZUVycm9yKCJldmVudE5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBhIHN5bWJvbCIpfWZ1bmN0aW9uIGVlKHIpe2lmKHR5cGVvZiByIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIE4ocixlKXtjb25zdCB0PUsuZ2V0KHIpO3JldHVybiB0LmhhcyhlKXx8dC5zZXQoZSxuZXcgU2V0KSx0LmdldChlKX1mdW5jdGlvbiAkKHIsZSl7Y29uc3QgdD10eXBlb2YgZT09InN0cmluZyJ8fHR5cGVvZiBlPT0ic3ltYm9sIj9lOmRlLHM9RC5nZXQocik7cmV0dXJuIHMuaGFzKHQpfHxzLnNldCh0LG5ldyBTZXQpLHMuZ2V0KHQpfWZ1bmN0aW9uIHZyKHIsZSx0KXtjb25zdCBzPUQuZ2V0KHIpO2lmKHMuaGFzKGUpKWZvcihjb25zdCBuIG9mIHMuZ2V0KGUpKW4uZW5xdWV1ZSh0KTtpZihzLmhhcyhkZSkpe2NvbnN0IG49UHJvbWlzZS5hbGwoW2UsdF0pO2Zvcihjb25zdCBvIG9mIHMuZ2V0KGRlKSlvLmVucXVldWUobil9fWZ1bmN0aW9uIFFlKHIsZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2xldCB0PSExLHM9KCk9Pnt9LG49W107Y29uc3Qgbz17ZW5xdWV1ZShpKXtuLnB1c2goaSkscygpfSxmaW5pc2goKXt0PSEwLHMoKX19O2Zvcihjb25zdCBpIG9mIGUpJChyLGkpLmFkZChvKTtyZXR1cm57YXN5bmMgbmV4dCgpe3JldHVybiBuP24ubGVuZ3RoPT09MD90PyhuPXZvaWQgMCx0aGlzLm5leHQoKSk6KGF3YWl0IG5ldyBQcm9taXNlKGk9PntzPWl9KSx0aGlzLm5leHQoKSk6e2RvbmU6ITEsdmFsdWU6YXdhaXQgbi5zaGlmdCgpfTp7ZG9uZTohMH19LGFzeW5jIHJldHVybihpKXtuPXZvaWQgMDtmb3IoY29uc3QgYSBvZiBlKSQocixhKS5kZWxldGUobyk7cmV0dXJuIHMoKSxhcmd1bWVudHMubGVuZ3RoPjA/e2RvbmU6ITAsdmFsdWU6YXdhaXQgaX06e2RvbmU6ITB9fSxbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9fX1mdW5jdGlvbiBYZShyKXtpZihyPT09dm9pZCAwKXJldHVybiBLZTtpZighQXJyYXkuaXNBcnJheShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyIpO2Zvcihjb25zdCBlIG9mIHIpaWYoIUtlLmluY2x1ZGVzKGUpKXRocm93IHR5cGVvZiBlIT0ic3RyaW5nIj9uZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIGVsZW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpOm5ldyBFcnJvcihgJHtlfSBpcyBub3QgRW1pdHRlcnkgbWV0aG9kYCk7cmV0dXJuIHJ9Y29uc3QgbWU9cj0+cj09PVl8fHI9PT1aO2NsYXNzIE97c3RhdGljIG1peGluKGUsdCl7cmV0dXJuIHQ9WGUodCkscz0+e2lmKHR5cGVvZiBzIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgZnVuY3Rpb24iKTtmb3IoY29uc3QgaSBvZiB0KWlmKHMucHJvdG90eXBlW2ldIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtpfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtmdW5jdGlvbiBuKCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2VudW1lcmFibGU6ITEsdmFsdWU6bmV3IE99KSx0aGlzW2VdfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLnByb3RvdHlwZSxlLHtlbnVtZXJhYmxlOiExLGdldDpufSk7Y29uc3Qgbz1pPT5mdW5jdGlvbiguLi5hKXtyZXR1cm4gdGhpc1tlXVtpXSguLi5hKX07Zm9yKGNvbnN0IGkgb2YgdClPYmplY3QuZGVmaW5lUHJvcGVydHkocy5wcm90b3R5cGUsaSx7ZW51bWVyYWJsZTohMSx2YWx1ZTpvKGkpfSk7cmV0dXJuIHN9fXN0YXRpYyBnZXQgaXNEZWJ1Z0VuYWJsZWQoKXtpZih0eXBlb2YgcHJvY2VzcyE9Im9iamVjdCIpcmV0dXJuIHBlO2NvbnN0e2VudjplfT1wcm9jZXNzfHx7ZW52Ont9fTtyZXR1cm4gZS5ERUJVRz09PSJlbWl0dGVyeSJ8fGUuREVCVUc9PT0iKiJ8fHBlfXN0YXRpYyBzZXQgaXNEZWJ1Z0VuYWJsZWQoZSl7cGU9ZX1jb25zdHJ1Y3RvcihlPXt9KXtTLnNldCh0aGlzLG5ldyBTZXQpLEsuc2V0KHRoaXMsbmV3IE1hcCksRC5zZXQodGhpcyxuZXcgTWFwKSx0aGlzLmRlYnVnPWUuZGVidWd8fHt9LHRoaXMuZGVidWcuZW5hYmxlZD09PXZvaWQgMCYmKHRoaXMuZGVidWcuZW5hYmxlZD0hMSksdGhpcy5kZWJ1Zy5sb2dnZXJ8fCh0aGlzLmRlYnVnLmxvZ2dlcj0odCxzLG4sbyk9PntvPUpTT04uc3RyaW5naWZ5KG8pLHR5cGVvZiBuPT0ic3ltYm9sIiYmKG49bi50b1N0cmluZygpKTtjb25zdCBpPW5ldyBEYXRlLGE9YCR7aS5nZXRIb3VycygpfToke2kuZ2V0TWludXRlcygpfToke2kuZ2V0U2Vjb25kcygpfS4ke2kuZ2V0TWlsbGlzZWNvbmRzKCl9YDtjb25zb2xlLmxvZyhgWyR7YX1dW2VtaXR0ZXJ5OiR7dH1dWyR7c31dIEV2ZW50IE5hbWU6ICR7bn0KCWRhdGE6ICR7b31gKX0pfWxvZ0lmRGVidWdFbmFibGVkKGUsdCxzKXsoTy5pc0RlYnVnRW5hYmxlZHx8dGhpcy5kZWJ1Zy5lbmFibGVkKSYmdGhpcy5kZWJ1Zy5sb2dnZXIoZSx0aGlzLmRlYnVnLm5hbWUsdCxzKX1vbihlLHQpe2VlKHQpLGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgcyBvZiBlKWsocyksTih0aGlzLHMpLmFkZCh0KSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJzdWJzY3JpYmUiLHMsdm9pZCAwKSxtZShzKXx8dGhpcy5lbWl0KFkse2V2ZW50TmFtZTpzLGxpc3RlbmVyOnR9KTtyZXR1cm4gdGhpcy5vZmYuYmluZCh0aGlzLGUsdCl9b2ZmKGUsdCl7ZWUodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBzIG9mIGUpayhzKSxOKHRoaXMscykuZGVsZXRlKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInVuc3Vic2NyaWJlIixzLHZvaWQgMCksbWUocyl8fHRoaXMuZW1pdChaLHtldmVudE5hbWU6cyxsaXN0ZW5lcjp0fSl9b25jZShlKXtyZXR1cm4gbmV3IFByb21pc2UodD0+e2NvbnN0IHM9dGhpcy5vbihlLG49PntzKCksdChuKX0pfSl9ZXZlbnRzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKWsodCk7cmV0dXJuIFFlKHRoaXMsZSl9YXN5bmMgZW1pdChlLHQpe2soZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdCIsZSx0KSx2cih0aGlzLGUsdCk7Y29uc3Qgcz1OKHRoaXMsZSksbj1TLmdldCh0aGlzKSxvPVsuLi5zXSxpPW1lKGUpP1tdOlsuLi5uXTthd2FpdCB6ZSxhd2FpdCBQcm9taXNlLmFsbChbLi4uby5tYXAoYXN5bmMgYT0+e2lmKHMuaGFzKGEpKXJldHVybiBhKHQpfSksLi4uaS5tYXAoYXN5bmMgYT0+e2lmKG4uaGFzKGEpKXJldHVybiBhKGUsdCl9KV0pfWFzeW5jIGVtaXRTZXJpYWwoZSx0KXtrKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXRTZXJpYWwiLGUsdCk7Y29uc3Qgcz1OKHRoaXMsZSksbj1TLmdldCh0aGlzKSxvPVsuLi5zXSxpPVsuLi5uXTthd2FpdCB6ZTtmb3IoY29uc3QgYSBvZiBvKXMuaGFzKGEpJiZhd2FpdCBhKHQpO2Zvcihjb25zdCBhIG9mIGkpbi5oYXMoYSkmJmF3YWl0IGEoZSx0KX1vbkFueShlKXtyZXR1cm4gZWUoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlQW55Iix2b2lkIDAsdm9pZCAwKSxTLmdldCh0aGlzKS5hZGQoZSksdGhpcy5lbWl0KFkse2xpc3RlbmVyOmV9KSx0aGlzLm9mZkFueS5iaW5kKHRoaXMsZSl9YW55RXZlbnQoKXtyZXR1cm4gUWUodGhpcyl9b2ZmQW55KGUpe2VlKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInVuc3Vic2NyaWJlQW55Iix2b2lkIDAsdm9pZCAwKSx0aGlzLmVtaXQoWix7bGlzdGVuZXI6ZX0pLFMuZ2V0KHRoaXMpLmRlbGV0ZShlKX1jbGVhckxpc3RlbmVycyhlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHQgb2YgZSlpZih0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJjbGVhciIsdCx2b2lkIDApLHR5cGVvZiB0PT0ic3RyaW5nInx8dHlwZW9mIHQ9PSJzeW1ib2wiKXtOKHRoaXMsdCkuY2xlYXIoKTtjb25zdCBzPSQodGhpcyx0KTtmb3IoY29uc3QgbiBvZiBzKW4uZmluaXNoKCk7cy5jbGVhcigpfWVsc2V7Uy5nZXQodGhpcykuY2xlYXIoKTtmb3IoY29uc3QgcyBvZiBLLmdldCh0aGlzKS52YWx1ZXMoKSlzLmNsZWFyKCk7Zm9yKGNvbnN0IHMgb2YgRC5nZXQodGhpcykudmFsdWVzKCkpe2Zvcihjb25zdCBuIG9mIHMpbi5maW5pc2goKTtzLmNsZWFyKCl9fX1saXN0ZW5lckNvdW50KGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtsZXQgdD0wO2Zvcihjb25zdCBzIG9mIGUpe2lmKHR5cGVvZiBzPT0ic3RyaW5nIil7dCs9Uy5nZXQodGhpcykuc2l6ZStOKHRoaXMscykuc2l6ZSskKHRoaXMscykuc2l6ZSskKHRoaXMpLnNpemU7Y29udGludWV9dHlwZW9mIHMhPSJ1bmRlZmluZWQiJiZrKHMpLHQrPVMuZ2V0KHRoaXMpLnNpemU7Zm9yKGNvbnN0IG4gb2YgSy5nZXQodGhpcykudmFsdWVzKCkpdCs9bi5zaXplO2Zvcihjb25zdCBuIG9mIEQuZ2V0KHRoaXMpLnZhbHVlcygpKXQrPW4uc2l6ZX1yZXR1cm4gdH1iaW5kTWV0aG9kcyhlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcigiYHRhcmdldGAgbXVzdCBiZSBhbiBvYmplY3QiKTt0PVhlKHQpO2Zvcihjb25zdCBzIG9mIHQpe2lmKGVbc10hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgXGAke3N9XGAgYWxyZWFkeSBleGlzdHMgb24gXGB0YXJnZXRcYGApO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHMse2VudW1lcmFibGU6ITEsdmFsdWU6dGhpc1tzXS5iaW5kKHRoaXMpfSl9fX1jb25zdCBLZT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPLnByb3RvdHlwZSkuZmlsdGVyKHI9PnIhPT0iY29uc3RydWN0b3IiKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTywibGlzdGVuZXJBZGRlZCIse3ZhbHVlOlksd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTywibGlzdGVuZXJSZW1vdmVkIix7dmFsdWU6Wix3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pO3ZhciBnZT1PO2Z1bmN0aW9uIEVyKHIpe3JldHVybiB0eXBlb2Ygcj09Im9iamVjdCImJnIhPT1udWxsJiYibWVzc2FnZSJpbiByJiZ0eXBlb2Ygci5tZXNzYWdlPT0ic3RyaW5nIn1mdW5jdGlvbiBQcihyKXtpZihFcihyKSlyZXR1cm4gcjt0cnl7cmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShyKSl9Y2F0Y2h7cmV0dXJuIG5ldyBFcnJvcihTdHJpbmcocikpfX1mdW5jdGlvbiBfZShyKXtyZXR1cm4gUHIocikubWVzc2FnZX12YXIgeWU7KGZ1bmN0aW9uKHIpe3IuRlBTX0RST1A9ImZwc19kcm9wIn0pKHllfHwoeWU9e30pKTtjb25zdCBUcj01MDAsUnI9Ljg7Y2xhc3MgU3IgZXh0ZW5kcyBnZXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKCksdGhpcy5pbmRleF89dCx0aGlzLnV1aWRfPVdlKCksdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89MCx0aGlzLnRyYW5zZm9ybWVyXz1lLHRoaXMuc2hvdWxkU3RvcF89ITEsdGhpcy5pc0ZsYXNoZWRfPSExLHRoaXMuZnJhbWVzRnJvbVNvdXJjZV89MCx0aGlzLmZwc189MCx0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89MCx0aGlzLnZpZGVvSGVpZ2h0Xz0wLHRoaXMudmlkZW9XaWR0aF89MCx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMSx0aGlzLnRyYW5zZm9ybWVyVHlwZV89IkN1c3RvbSIsImdldFRyYW5zZm9ybWVyVHlwZSJpbiBlJiYodGhpcy50cmFuc2Zvcm1lclR5cGVfPWUuZ2V0VHJhbnNmb3JtZXJUeXBlKCkpO2NvbnN0IHM9bmV3IGIoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiQ3JlYXRlIikuYnVpbGQoKTt3LnJlcG9ydChzKX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lfWFzeW5jIHN0YXJ0KGUpe2lmKHRoaXMuY29udHJvbGxlcl89ZSx0aGlzLnRyYW5zZm9ybWVyXyYmdHlwZW9mIHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0PT0iZnVuY3Rpb24iKXRyeXthd2FpdCB0aGlzLnRyYW5zZm9ybWVyXy5zdGFydChlKX1jYXRjaCh0KXtjb25zdCBzPW5ldyBiKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFQuZXJyb3JzLnRyYW5zZm9ybWVyX3N0YXJ0KS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IoX2UodCkpLmJ1aWxkKCk7dy5yZXBvcnQocyk7Y29uc3Qgbj17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6dCxmdW5jdGlvbjoic3RhcnQifTt0aGlzLmVtaXQoImVycm9yIixuKX19YXN5bmMgdHJhbnNmb3JtKGUsdCl7dmFyIHMsbixvLGk7aWYodGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPT09MCYmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz1EYXRlLm5vdygpKSxlIGluc3RhbmNlb2YgVmlkZW9GcmFtZSYmKHRoaXMudmlkZW9IZWlnaHRfPShzPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheUhlaWdodCkhPW51bGw/czowLHRoaXMudmlkZW9XaWR0aF89KG49ZT09bnVsbD92b2lkIDA6ZS5kaXNwbGF5V2lkdGgpIT1udWxsP246MCksKyt0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfLHRoaXMudHJhbnNmb3JtZXJfKWlmKHRoaXMuc2hvdWxkU3RvcF8pY29uc29sZS53YXJuKCJbUGlwZWxpbmVdIGZsdXNoIGZyb20gdHJhbnNmb3JtIiksZS5jbG9zZSgpLHRoaXMuZmx1c2godCksdC50ZXJtaW5hdGUoKTtlbHNlIHRyeXthd2FpdCgoaT0obz10aGlzLnRyYW5zZm9ybWVyXykudHJhbnNmb3JtKT09bnVsbD92b2lkIDA6aS5jYWxsKG8sZSx0KSksKyt0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXyx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz09PVRyJiZ0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKX1jYXRjaChhKXtjb25zdCBsPW5ldyBiKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFQuZXJyb3JzLnRyYW5zZm9ybWVyX3RyYW5zZm9ybSkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKF9lKGEpKS5idWlsZCgpO3cucmVwb3J0KGwpO2NvbnN0IGc9e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOmEsZnVuY3Rpb246InRyYW5zZm9ybSJ9O3RoaXMuZW1pdCgiZXJyb3IiLGcpfX1hc3luYyBmbHVzaChlKXtpZih0aGlzLnRyYW5zZm9ybWVyXyYmdHlwZW9mIHRoaXMudHJhbnNmb3JtZXJfLmZsdXNoPT0iZnVuY3Rpb24iJiYhdGhpcy5pc0ZsYXNoZWRfKXt0aGlzLmlzRmxhc2hlZF89ITA7dHJ5e2F3YWl0IHRoaXMudHJhbnNmb3JtZXJfLmZsdXNoKGUpfWNhdGNoKHMpe2NvbnN0IG49bmV3IGIoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoVC5lcnJvcnMudHJhbnNmb3JtZXJfZmx1c2gpLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihfZShzKSkuYnVpbGQoKTt3LnJlcG9ydChuKTtjb25zdCBvPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjpzLGZ1bmN0aW9uOiJmbHVzaCJ9O3RoaXMuZW1pdCgiZXJyb3IiLG8pfX10aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKTtjb25zdCB0PW5ldyBiKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkRlbGV0ZSIpLmJ1aWxkKCk7dy5yZXBvcnQodCl9c3RvcCgpe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFN0b3Agc3RyZWFtLiIpLHRoaXMuY29udHJvbGxlcl8mJih0aGlzLmZsdXNoKHRoaXMuY29udHJvbGxlcl8pLHRoaXMuY29udHJvbGxlcl8udGVybWluYXRlKCkpLHRoaXMuc2hvdWxkU3RvcF89ITB9bWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpe2xldCBlPShEYXRlLm5vdygpLXRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXykvMWUzLHQ9dGhpcy5mcmFtZXNGcm9tU291cmNlXy9lLHM9dGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8vZTtpZih0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKlJyPnQpe2NvbnN0IG89e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LHdhcm5pbmdUeXBlOnllLkZQU19EUk9QLGRyb3BJbmZvOntyZXF1ZXN0ZWQ6dGhpcy50cmFja0V4cGVjdGVkUmF0ZV8sY3VycmVudDp0fX07dGhpcy5lbWl0KCJ3YXJuIixvKX1jb25zdCBuPW5ldyBiKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZnBzKHQpLnRyYW5zZm9ybWVkRnBzKHMpLmZyYW1lc1RyYW5zZm9ybWVkKHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZpZGVvSGVpZ2h0KHRoaXMudmlkZW9IZWlnaHRfKS52aWRlb1dpZHRoKHRoaXMudmlkZW9XaWR0aF8pLnZhcmlhdGlvbigiUW9TIikuYnVpbGQoKTt3LnJlcG9ydChuKSx0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89MCx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89MH19Y2xhc3MgQ3IgZXh0ZW5kcyBnZXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMudHJhbnNmb3JtZXJzXz1bXSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IHM9bmV3IFNyKGVbdF0sdCk7cy5vbigiZXJyb3IiLG49Pnt0aGlzLmVtaXQoImVycm9yIixuKX0pLHMub24oIndhcm4iLG49Pnt0aGlzLmVtaXQoIndhcm4iLG4pfSksdGhpcy50cmFuc2Zvcm1lcnNfLnB1c2gocyl9fXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWU7Zm9yKGxldCB0IG9mIHRoaXMudHJhbnNmb3JtZXJzXyl0LnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKX1hc3luYyBzdGFydChlLHQpe2lmKCF0aGlzLnRyYW5zZm9ybWVyc198fHRoaXMudHJhbnNmb3JtZXJzXy5sZW5ndGg9PT0wKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBObyB0cmFuc2Zvcm1lcnMuIik7cmV0dXJufXRyeXtsZXQgcz1lO2ZvcihsZXQgbiBvZiB0aGlzLnRyYW5zZm9ybWVyc18pZT1lLnBpcGVUaHJvdWdoKG5ldyBUcmFuc2Zvcm1TdHJlYW0obikpO2UucGlwZVRvKHQpLnRoZW4oYXN5bmMoKT0+e2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFNldHVwLiIpLGF3YWl0IHQuYWJvcnQoKSxhd2FpdCBzLmNhbmNlbCgpLHRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIix7bWVzc2FnZToicGlwZWxpbmVfZW5kZWQifSl9KS5jYXRjaChhc3luYyBuPT57ZS5jYW5jZWwoKS50aGVuKCgpPT57Y29uc29sZS5sb2coIltQaXBlbGluZV0gU2h1dHRpbmcgZG93biBzdHJlYW1zIGFmdGVyIGFib3J0LiIpfSkuY2F0Y2gobz0+e2NvbnNvbGUuZXJyb3IoIltQaXBlbGluZV0gRXJyb3IgZnJvbSBzdHJlYW0gdHJhbnNmb3JtOiIsbyl9KSxhd2FpdCB0LmFib3J0KG4pLGF3YWl0IHMuY2FuY2VsKG4pLHRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIix7bWVzc2FnZToicGlwZWxpbmVfZW5kZWRfd2l0aF9lcnJvciJ9KX0pfWNhdGNoe3RoaXMuZW1pdCgicGlwZWxpbmVJbmZvIix7bWVzc2FnZToicGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yIn0pLHRoaXMuZGVzdHJveSgpO3JldHVybn10aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIse21lc3NhZ2U6InBpcGVsaW5lX3N0YXJ0ZWQifSksY29uc29sZS5sb2coIltQaXBlbGluZV0gUGlwZWxpbmUgc3RhcnRlZC4iKX1hc3luYyBkZXN0cm95KCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gRGVzdHJveWluZyBQaXBlbGluZS4iKTtmb3IobGV0IGUgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKWUuc3RvcCgpfX1jbGFzcyBPciBleHRlbmRzIGdle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnV1aWRfPVdlKCksdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTE7Y29uc3QgZT1uZXcgYigpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLnZhcmlhdGlvbigiQ3JlYXRlIikuYnVpbGQoKTt3LnJlcG9ydChlKX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lLHRoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyl9dHJhbnNmb3JtKGUsdCl7cmV0dXJuIHRoaXMucmVhZGFibGVfPWUsdGhpcy53cml0YWJsZV89dCx0aGlzLnRyYW5zZm9ybUludGVybmFsKCl9dHJhbnNmb3JtSW50ZXJuYWwoKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9PntpZighdGhpcy50cmFuc2Zvcm1lcnNffHx0aGlzLnRyYW5zZm9ybWVyc18ubGVuZ3RoPT09MCl7Y29uc3Qgbj1uZXcgYigpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoVC5lcnJvcnMudHJhbnNmb3JtZXJfbm9uZSkudmFyaWF0aW9uKCJFcnJvciIpLmJ1aWxkKCk7dy5yZXBvcnQobiksdCgiW01lZGlhUHJvY2Vzc29yXSBOZWVkIHRvIHNldCB0cmFuc2Zvcm1lcnMuIik7cmV0dXJufWlmKCF0aGlzLnJlYWRhYmxlXyl7Y29uc3Qgbj1uZXcgYigpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoVC5lcnJvcnMucmVhZGFibGVfbnVsbCkudmFyaWF0aW9uKCJFcnJvciIpLmJ1aWxkKCk7dy5yZXBvcnQobiksdCgiW01lZGlhUHJvY2Vzc29yXSBSZWFkYWJsZSBpcyBudWxsLiIpO3JldHVybn1pZighdGhpcy53cml0YWJsZV8pe2NvbnN0IG49bmV3IGIoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFQuZXJyb3JzLndyaXRhYmxlX251bGwpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO3cucmVwb3J0KG4pLHQoIltNZWRpYVByb2Nlc3Nvcl0gV3JpdGFibGUgaXMgbnVsbC4iKTtyZXR1cm59bGV0IHM9ITE7dGhpcy5waXBlbGluZV8mJihzPSEwLHRoaXMucGlwZWxpbmVfLmNsZWFyTGlzdGVuZXJzKCksdGhpcy5waXBlbGluZV8uZGVzdHJveSgpKSx0aGlzLnBpcGVsaW5lXz1uZXcgQ3IodGhpcy50cmFuc2Zvcm1lcnNfKSx0aGlzLnBpcGVsaW5lXy5vbigid2FybiIsbj0+e3RoaXMuZW1pdCgid2FybiIsbil9KSx0aGlzLnBpcGVsaW5lXy5vbigiZXJyb3IiLG49Pnt0aGlzLmVtaXQoImVycm9yIixuKX0pLHRoaXMucGlwZWxpbmVfLm9uKCJwaXBlbGluZUluZm8iLG49PntzJiYobi5tZXNzYWdlPT09InBpcGVsaW5lX3N0YXJ0ZWQiP24ubWVzc2FnZT0icGlwZWxpbmVfcmVzdGFydGVkIjpuLm1lc3NhZ2U9PT0icGlwZWxpbmVfc3RhcnRlZF93aXRoX2Vycm9yIiYmKG4ubWVzc2FnZT0icGlwZWxpbmVfcmVzdGFydGVkX3dpdGhfZXJyb3IiKSksdGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLG4pfSksdGhpcy50cmFja0V4cGVjdGVkUmF0ZV8hPS0xJiZ0aGlzLnBpcGVsaW5lXy5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyksdGhpcy5waXBlbGluZV8uc3RhcnQodGhpcy5yZWFkYWJsZV8sdGhpcy53cml0YWJsZV8pLnRoZW4oKCk9PntlKCl9KS5jYXRjaChuPT57dChuKX0pfSl9c2V0VHJhbnNmb3JtZXJzKGUpe2NvbnN0IHQ9bmV3IGIoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFQudXBkYXRlcy50cmFuc2Zvcm1lcl9uZXcpLnZhcmlhdGlvbigiVXBkYXRlIikuYnVpbGQoKTtyZXR1cm4gdy5yZXBvcnQodCksdGhpcy50cmFuc2Zvcm1lcnNfPWUsdGhpcy5yZWFkYWJsZV8mJnRoaXMud3JpdGFibGVfP3RoaXMudHJhbnNmb3JtSW50ZXJuYWwoKTpQcm9taXNlLnJlc29sdmUoKX1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGU9Pnt0aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uZGVzdHJveSgpO2NvbnN0IHQ9bmV3IGIoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS52YXJpYXRpb24oIkRlbGV0ZSIpLmJ1aWxkKCk7dy5yZXBvcnQodCksZSgpfSl9fXZhciBGPShyPT4oci5Mb3c9IkxvdyIsci5IaWdoPSJIaWdoIixyKSkoRnx8e30pO2NsYXNzIFlle2NvbnN0cnVjdG9yKGUpe3R5cGVvZiBlPT0ibnVtYmVyIj8odGhpcy5ibHVyRmlsdGVyXz0iYmx1cigiK2UrInB4KSIsdGhpcy5ibHVyXz1lKToodGhpcy5ibHVyRmlsdGVyXz1lPT09Ri5IaWdoPyJibHVyKDE1cHgpIjoiYmx1cig1cHgpIix0aGlzLmJsdXJfPWU9PT1GLkhpZ2g/MTU6NSl9aXNIaWdoQmx1cigpe3JldHVybiB0aGlzLmJsdXJfPjV9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShlPT57ZSgpfSl9cnVuUG9zdFByb2Nlc3NpbmcoZSx0KXt0cnl7ZS5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLGUuZmlsdGVyPXRoaXMuYmx1ckZpbHRlcl8sZS5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCl9Y2F0Y2gocyl7Y29uc29sZS5sb2coIltCbHVyUG9zdFByb2Nlc3NdIEZhaWxlZCB0byBkcmF3IGNhbnZhcyIscyl9fX1jbGFzcyBaZXtjb25zdHJ1Y3Rvcigpe31kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGU9Pnt0aGlzLmJnSW1hZ2VfJiZ0aGlzLmJnSW1hZ2VfLmNsb3NlKCksZSgpfSl9c2V0VmlydHVhbEJHSW1hZ2UoZSl7dGhpcy5iZ0ltYWdlXyYmdGhpcy5iZ0ltYWdlXy5jbG9zZSgpLHRoaXMuYmdJbWFnZV89ZX1hc3luYyBydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe2lmKHRoaXMuYmdJbWFnZV8pe2lmKHRoaXMuYmdJbWFnZV8ud2lkdGghPXQud2lkdGh8fHRoaXMuYmdJbWFnZV8uaGVpZ2h0IT10LmhlaWdodCl7Y29uc3Qgcz0iaGlnaCIsbj17cmVzaXplV2lkdGg6dC53aWR0aCxyZXNpemVIZWlnaHQ6dC5oZWlnaHQscmVzaXplUXVhbGl0eTpzfTt0cnl7dGhpcy5iZ0ltYWdlXz1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcCh0aGlzLmJnSW1hZ2VfLG4pfWNhdGNoKG8pe3Rocm93IG99fWUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmRyYXdJbWFnZSh0aGlzLmJnSW1hZ2VfLDAsMCx0aGlzLmJnSW1hZ2VfLndpZHRoLHRoaXMuYmdJbWFnZV8uaGVpZ2h0KX19fWNsYXNzIElye2NvbnN0cnVjdG9yKGU9MS8wKXt0aGlzLmNhcGFjaXR5PWUsdGhpcy5zdG9yYWdlPVtdfWVucXVldWUoZSl7aWYodGhpcy5zaXplKCk9PT10aGlzLmNhcGFjaXR5KXRocm93IEVycm9yKCJRdWV1ZSBoYXMgcmVhY2hlZCBtYXggY2FwYWNpdHksIHlvdSBjYW5ub3QgYWRkIG1vcmUgaXRlbXMiKTt0aGlzLnN0b3JhZ2UucHVzaChlKX1kZXF1ZXVlKCl7cmV0dXJuIHRoaXMuc3RvcmFnZS5zaGlmdCgpfXNpemUoKXtyZXR1cm4gdGhpcy5zdG9yYWdlLmxlbmd0aH19Y29uc3QgYmU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLnF1ZXVlXz1uZXcgSXJ9Y2xlYXJRdWV1ZShyKXtmb3IoO3RoaXMucXVldWVfLnNpemUoKT4wOyl0aGlzLnF1ZXVlXy5kZXF1ZXVlKCkuY2xvc2UoKX1zZXRWaWRlb1JlYWRhYmxlKHIpe3JldHVybiBuZXcgUHJvbWlzZSgoZSx0KT0+e3RoaXMuZnJhbWVSZWFkZXJfPXIuZ2V0UmVhZGVyKCksdGhpcy5mcmFtZVJlYWRlcl8ucmVhZCgpLnRoZW4ocz0+e3RoaXMucHJvY2Vzc0ZyYW1lKHMpfSkuY2F0Y2gocz0+e3Qocyl9KSxlKCl9KX1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jKHIsZSk9Pnt2YXIgdDt0aGlzLmNsZWFyUXVldWUoITApLHRoaXMuZnJhbWVSZWFkZXJfPyh0PXRoaXMuZnJhbWVSZWFkZXJfKT09bnVsbHx8dC5jYW5jZWwoKS50aGVuKCgpPT57cigpfSkuY2F0Y2gocz0+e2Uocyl9KTpyKCl9KX1wcm9jZXNzRnJhbWUocil7aWYoIXIuZG9uZSl7aWYoIXRoaXMuZnJhbWVSZWFkZXJfKXtyLnZhbHVlLmNsb3NlKCk7cmV0dXJufWZvcig7dGhpcy5xdWV1ZV8uc2l6ZSgpPj1iZS5OVU1CRVJfT0ZfRlJBTUVTX1RPX0NMRUFSOyl7bGV0IGU9dGhpcy5xdWV1ZV8uZGVxdWV1ZSgpO2UmJmUuY2xvc2UoKX10aGlzLnF1ZXVlXy5lbnF1ZXVlKHIudmFsdWUpLHRoaXMuZnJhbWVSZWFkZXJfLnJlYWQoKS50aGVuKGU9Pnt0aGlzLnByb2Nlc3NGcmFtZShlKX0pLmNhdGNoKGU9Pntjb25zb2xlLmVycm9yKGUpfSl9fXJ1blBvc3RQcm9jZXNzaW5nKHIsZSl7dHJ5e2lmKHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIix0aGlzLnF1ZXVlXy5zaXplKCk+YmUuTlVNQkVSX09GX0ZSQU1FU19UT19DTEVBUiYmdGhpcy5jbGVhclF1ZXVlKCExKSx0aGlzLnF1ZXVlXy5zaXplKCk+MCl7Y29uc3QgdD10aGlzLnF1ZXVlXy5kZXF1ZXVlKCk7ci5kcmF3SW1hZ2UodCwwLDAsZS53aWR0aCxlLmhlaWdodCksdC5jbG9zZSgpfX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKCJbVmlkZW9Qb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIix0KX19fTtsZXQgd2U9YmU7d2UuTlVNQkVSX09GX0ZSQU1FU19UT19DTEVBUj01O2NsYXNzIE1ye2NvbnN0cnVjdG9yKGUpe3R5cGVvZiBlPT0ibnVtYmVyIj8odGhpcy5ibHVyRmlsdGVyXz0iYmx1cigiK2UrInB4KSIsdGhpcy5ibHVyXz1lKToodGhpcy5ibHVyRmlsdGVyXz1lPT09Ri5IaWdoPyJibHVyKDE1cHgpIjoiYmx1cig1cHgpIix0aGlzLmJsdXJfPWU9PT1GLkhpZ2g/MTU6NSl9aXNIaWdoQmx1cigpe3JldHVybiB0aGlzLmJsdXJfPjV9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShlPT57ZSgpfSl9cnVuUG9zdFByb2Nlc3NpbmcoZSx0KXt0cnl7ZS5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249InNvdXJjZS1pbiIsZS5maWx0ZXI9dGhpcy5ibHVyRmlsdGVyXyxlLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KSxlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsZS5maWx0ZXI9ImJsdXIoMHB4KSIsZS5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCl9Y2F0Y2gocyl7Y29uc29sZS5sb2coIltCbHVyUG9zdFByb2Nlc3NdIEZhaWxlZCB0byBkcmF3IGNhbnZhcyIscyl9fX1jb25zdCBtPWNsYXNze2NvbnN0cnVjdG9yKCl7aWYodGhpcy5sYXN0UHJvY2Vzc2VkVGltZXN0YW1wXz0wLHRoaXMubmV3SW5wdXRDb3VudGVyPTAsdGhpcy50aW1lckdhcF89bS5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORF9MT1csdGhpcy5yZXN1bHRDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLnJlc3VsdEN0eF89dGhpcy5yZXN1bHRDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5yZXN1bHRDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTtpZih0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMobS5TRUxGSUVfV0lEVEgsbS5TRUxGSUVfSElHSFQpLHRoaXMuc2VnbWVudGF0aW9uTWFza0N0eF89dGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXy5nZXRDb250ZXh0KCIyZCIse2FscGhhOiExLGRlc3luY2hyb25pemVkOiEwfSksIXRoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8pdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gY3JlYXRlIE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCIpfWluaXQocil7dGhpcy5wcm9jZXNzRnJhbWVDYj1yfWFzeW5jIHNldEJhY2tncm91bmRPcHRpb25zKHIpe2lmKHR5cGVvZiB0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXyE9InVuZGVmaW5lZCIpdHJ5e2F3YWl0IHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLmRlc3Ryb3koKX1jYXRjaChlKXt0aHJvdyBlfWlmKHIudHJhbnNmb3JtZXJUeXBlPT09IlZpcnR1YWxCYWNrZ3JvdW5kIil0aGlzLnRpbWVyR2FwXz1tLlZJUlRVQUxfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBaZTtlbHNlIGlmKHIudHJhbnNmb3JtZXJUeXBlPT09IkJhY2tncm91bmRCbHVyIil7bGV0IGU9cjt0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgWWUoZS5yYWRpdXMpLHRoaXMudGltZXJHYXBfPXRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLmlzSGlnaEJsdXIoKT9tLkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05EX0hJR0g6bS5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORF9MT1d9ZWxzZSBpZihyLnRyYW5zZm9ybWVyVHlwZT09PSJWaWRlb0JhY2tncm91bmQiKXRoaXMudGltZXJHYXBfPW0uVklERU9fUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyB3ZTtlbHNlIGlmKHIudHJhbnNmb3JtZXJUeXBlPT09IlNpbHVldGVCbHVyIil7bGV0IGU9cjt0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgTXIoZS5yYWRpdXMpLHRoaXMudGltZXJHYXBfPXRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLmlzSGlnaEJsdXIoKT9tLkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05EX0hJR0g6bS5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORF9MT1d9ZWxzZSB0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgWWUsdGhpcy50aW1lckdhcF89dGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8uaXNIaWdoQmx1cigpP20uQkxVUl9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkRfSElHSDptLkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05EX0xPV31jbG9zZSgpe3JldHVybiBuZXcgUHJvbWlzZSgocixlKT0+e3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfP3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLmRlc3Ryb3koKS50aGVuKCgpPT57cigpfSkuY2F0Y2godD0+e2UodCl9KTpyKCl9KX1zdGFydCgpe31hc3luYyB0cmFuc2Zvcm0ocixlKXsodGhpcy5yZXN1bHRDYW52YXNfLndpZHRoIT1yLmRpc3BsYXlXaWR0aHx8dGhpcy5yZXN1bHRDYW52YXNfLmhlaWdodCE9ci5kaXNwbGF5SGVpZ2h0KSYmKHRoaXMucmVzdWx0Q2FudmFzXy53aWR0aD1yLmRpc3BsYXlXaWR0aCx0aGlzLnJlc3VsdENhbnZhc18uaGVpZ2h0PXIuZGlzcGxheUhlaWdodCk7Y29uc3QgdD1yLnRpbWVzdGFtcDtjcmVhdGVJbWFnZUJpdG1hcChyKS50aGVuKHM9PntyLmNsb3NlKCksdGhpcy5wcm9jZXNzRnJhbWUoZSxzLHQpfSkuY2F0Y2gocz0+e2UuZW5xdWV1ZShyKX0pfXByb2Nlc3NGcmFtZShyLGUsdCl7KHRoaXMubmV3SW5wdXRDb3VudGVyPG0uTkVXX0lOUFVUX05VTUJFUl9PRl9SVU5TfHx0LXRoaXMubGFzdFByb2Nlc3NlZFRpbWVzdGFtcF8+PXRoaXMudGltZXJHYXBfKSYmKHRoaXMubGFzdFByb2Nlc3NlZFRpbWVzdGFtcF89dCx0aGlzLnByb2Nlc3NTb3VyY2UoZSksdGhpcy5uZXdJbnB1dENvdW50ZXI8bS5ORVdfSU5QVVRfTlVNQkVSX09GX1JVTlMmJnRoaXMubmV3SW5wdXRDb3VudGVyKyspLHRoaXMucmVzdWx0Q3R4Xy5zYXZlKCksdGhpcy5yZXN1bHRDdHhfLmNsZWFyUmVjdCgwLDAsdGhpcy5yZXN1bHRDYW52YXNfLndpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQpLHRoaXMuc2VnbWVudGF0aW9uTWFza0ltYWdlXyYmKHRoaXMucmVzdWx0Q3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImNvcHkiLHRoaXMucmVzdWx0Q3R4Xy5kcmF3SW1hZ2UodGhpcy5zZWdtZW50YXRpb25NYXNrSW1hZ2VfLDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tJbWFnZV8ud2lkdGgsdGhpcy5zZWdtZW50YXRpb25NYXNrSW1hZ2VfLmhlaWdodCwwLDAsdGhpcy5yZXN1bHRDYW52YXNfLndpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQpKSx0aGlzLnJlc3VsdEN0eF8uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtYXRvcCIsdGhpcy5yZXN1bHRDdHhfLmZpbHRlcj0ibm9uZSIsdGhpcy5yZXN1bHRDdHhfLmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXyYmdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8ucnVuUG9zdFByb2Nlc3NpbmcodGhpcy5yZXN1bHRDdHhfLGUpLHRoaXMucmVzdWx0Q3R4Xy5yZXN0b3JlKCksci5lbnF1ZXVlKG5ldyBWaWRlb0ZyYW1lKHRoaXMucmVzdWx0Q2FudmFzXyx7dGltZXN0YW1wOnQsYWxwaGE6ImRpc2NhcmQifSkpLGUuY2xvc2UoKX1wcm9jZXNzU291cmNlKHIpe2lmKHRoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uY2xlYXJSZWN0KDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uaGVpZ2h0KSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLmRyYXdJbWFnZShyLDAsMCxyLndpZHRoLHIuaGVpZ2h0LDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uaGVpZ2h0KSx0aGlzLnByb2Nlc3NGcmFtZUNiKXtsZXQgZT10aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpO3RoaXMucHJvY2Vzc0ZyYW1lQ2IoZSl9fWZsdXNoKCl7fWdldFRyYW5zZm9ybWVyVHlwZSgpe3JldHVybiJCYWNrZ3JvdW5kVHJhbnNmb3JtZXIifXJlc2V0TmV3SW5wdXRDb3VuZXIoKXt0aGlzLm5ld0lucHV0Q291bnRlcj0wfXNldFZpZGVvQkdSZWFkYWJsZShyKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9Pnt0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXyBpbnN0YW5jZW9mIHdlP3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLnNldFZpZGVvUmVhZGFibGUocikudGhlbigoKT0+e2UoKX0pLmNhdGNoKHM9Pnt0KHMpfSk6dCgicG9zdCBwcm9jZXNzIGlzIG5vdCB2aWRlbyIpfSl9c2V0VmlydHVhbEJHSW1hZ2Uocil7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57dGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8gaW5zdGFuY2VvZiBaZT8odGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8uc2V0VmlydHVhbEJHSW1hZ2UociksZSgpKTp0KCJwb3N0IHByb2Nlc3MgaXMgbm90IHZpZGVvIil9KX1zZXRTZWdtZW50YXRpb25NYXNrSW1hZ2Uocil7dGhpcy5zZWdtZW50YXRpb25NYXNrSW1hZ2VfJiZ0aGlzLnNlZ21lbnRhdGlvbk1hc2tJbWFnZV8uY2xvc2UoKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tJbWFnZV89cn19O2xldCBDPW07Qy5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORF9MT1c9MTVlNCxDLkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05EX0hJR0g9NGU0LEMuVklERU9fUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05EPTJlNSxDLlZJUlRVQUxfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05EPTE1ZTQsQy5ORVdfSU5QVVRfTlVNQkVSX09GX1JVTlM9MzAsQy5TRUxGSUVfV0lEVEg9MjU2LEMuU0VMRklFX0hJR0hUPTE0NDtmdW5jdGlvbiB4cihyKXtyZXR1cm4gdHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbCYmIm1lc3NhZ2UiaW4gciYmdHlwZW9mIHIubWVzc2FnZT09InN0cmluZyJ9ZnVuY3Rpb24gQXIocil7aWYoeHIocikpcmV0dXJuIHI7dHJ5e3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoe3JldHVybiBuZXcgRXJyb3IoU3RyaW5nKHIpKX19ZnVuY3Rpb24gVShyKXtyZXR1cm4gdHlwZW9mIHI9PSJ1bmRlZmluZWQiPyIiOkFyKHIpLm1lc3NhZ2V9aWYodHlwZW9mIGltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiIpe2xldCByPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQcm9taXNlKChzLG4pPT57ZT1uZXcgT3IsZS5vbigiZXJyb3IiLGk9Pntjb25zdCBhPXtjYWxsYmFja1R5cGU6Im1lZGlhX3Byb2Nlc3Nvcl9lcnJvcl9ldmVudCIsbWVzc2FnZTppfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhKSl9KSxlLm9uKCJ3YXJuIixpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3Jfd2Fybl9ldmVudCIsbWVzc2FnZTppfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhKSl9KSxlLm9uKCJwaXBlbGluZUluZm8iLGk9Pntjb25zdCBhPXtjYWxsYmFja1R5cGU6Im1lZGlhX3Byb2Nlc3Nvcl9waXBlbGluZV9ldmVudCIsbWVzc2FnZTppfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhKSl9KSx0PW5ldyBDLHQuaW5pdChpPT57cG9zdE1lc3NhZ2UoaSxbaV0pfSk7bGV0IG89W107by5wdXNoKHQpLGUuc2V0VHJhbnNmb3JtZXJzKG8pLnRoZW4oKCk9PntzKCl9KS5jYXRjaChpPT57bihpKX0pfSl9LGUsdDtvbm1lc3NhZ2U9YXN5bmMgcz0+e2lmKHMuZGF0YSBpbnN0YW5jZW9mIEltYWdlQml0bWFwKXt0JiZ0LnNldFNlZ21lbnRhdGlvbk1hc2tJbWFnZShzLmRhdGEpO3JldHVybn1jb25zdHtvcGVyYXRpb246bn09cy5kYXRhO2lmKG49PT0iaW5pdCIpe2NvbnN0e21ldGFEYXRhOm99PXMuZGF0YTt0eXBlb2Ygbz09InN0cmluZyImJmRyKEpTT04ucGFyc2UobykpLHIoKS50aGVuKCgpPT57Y29uc3QgaT17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGkpKX0pLmNhdGNoKGk9Pntjb25zdCBhPXtjYWxsYmFja1R5cGU6ImVycm9yIixtZXNzYWdlOm4sZXJyb3I6VShpKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSl9ZWxzZSBpZihuPT09InRyYW5zZm9ybSIpe2NvbnN0e3JlYWRhYmxlOm8sd3JpdGFibGU6aX09cy5kYXRhO3QucmVzZXROZXdJbnB1dENvdW5lcigpLGUudHJhbnNmb3JtKG8saSkudGhlbigoKT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZTpufTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhKSl9KS5jYXRjaChhPT57Y29uc3QgbD17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpuLGVycm9yOlUoYSl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGwpKX0pfWVsc2UgaWYobj09PSJkZXN0cm95Iil0LmNsb3NlKCkuZmluYWxseSgoKT0+e2UuZGVzdHJveSgpLnRoZW4oKCk9Pntjb25zdCBvPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobykpfSkuY2F0Y2gobz0+e2NvbnN0IGk9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpVKG8pfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShpKSl9KX0pO2Vsc2UgaWYobj09PSJzZXRUcmFja0V4cGVjdGVkUmF0ZSIpe2Uuc2V0VHJhY2tFeHBlY3RlZFJhdGUocy5kYXRhLnJhdGUpO2NvbnN0IG89e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZTpufTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShvKSl9ZWxzZSBpZihuPT09InNldEJhY2tncm91bmRPcHRpb25zIil7Y29uc3R7YmFja2dyb3VuZE9wdGlvbnM6b309cy5kYXRhO3Quc2V0QmFja2dyb3VuZE9wdGlvbnMoSlNPTi5wYXJzZShvKSkudGhlbigoKT0+e2NvbnN0IGk9e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZTpufTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShpKSl9KS5jYXRjaChpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpuLGVycm9yOlUoaSl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGEpKX0pfWVsc2UgaWYobj09PSJzZXRWaWRlb0JHUmVhZGFibGUiKXtjb25zdHtyZWFkYWJsZTpvfT1zLmRhdGE7dC5zZXRWaWRlb0JHUmVhZGFibGUobykudGhlbigoKT0+e2NvbnN0IGk9e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZTpufTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShpKSl9KS5jYXRjaChpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpuLGVycm9yOlUoaSl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGEpKX0pfWVsc2UgaWYobj09PSJzZXRWaXJ0dWFsQkdJbWFnZSIpe2NvbnN0e2ltYWdlOm99PXMuZGF0YTt0LnNldFZpcnR1YWxCR0ltYWdlKG8pLnRoZW4oKCk9Pntjb25zdCBpPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaSkpfSkuY2F0Y2goaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpVKGkpfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhKSl9KX19fX0pKCk7Cg==";
|
|
1501
1501
|
const blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], { type: "text/javascript;charset=utf-8" });
|
|
1502
1502
|
function WorkerWrapper() {
|
|
1503
1503
|
const objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob);
|