gl-draw 0.14.35 → 0.14.36
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/core/BaseObject.d.ts +19 -19
- package/dist/core/CSSRenderer/index.d.ts +2 -2
- package/dist/core/Camera.d.ts +10 -10
- package/dist/core/Composer.d.ts +9 -9
- package/dist/core/Controls.d.ts +2 -2
- package/dist/core/Helper.d.ts +3 -3
- package/dist/core/Lead/Lead.d.ts +5 -5
- package/dist/core/Lead/index.d.ts +2 -2
- package/dist/core/Loader/GzipJSONLoader.d.ts +4 -4
- package/dist/core/Loader/Loader.d.ts +22 -22
- package/dist/core/Loader/TextureLoader.d.ts +4 -4
- package/dist/core/Loader/index.d.ts +2 -2
- package/dist/core/Pencil.d.ts +11 -11
- package/dist/core/Renderer.d.ts +3 -3
- package/dist/core/ResourceTracker.d.ts +4 -4
- package/dist/core/Scene.d.ts +5 -5
- package/dist/core/TransformControls/index.d.ts +5 -5
- package/dist/core/WebGPURenderer.d.ts +2 -2
- package/dist/effect/index.js +3 -3
- package/dist/effect/index.module.js +41 -41
- package/dist/effect/scan.d.ts +3 -3
- package/dist/effect/scan2.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/index.module.js +526 -557
- package/dist/index.module2.js +251 -255
- package/dist/index2.js +5 -5
- package/dist/objects/conicPolygon/index.d.ts +3 -3
- package/dist/objects/extrudePolygon/ExtrudeGeometry.d.ts +23 -3
- package/dist/objects/extrudePolygon/ExtrudeGeometry2.d.ts +2 -2
- package/dist/objects/extrudePolygon/createGeometry.d.ts +22 -22
- package/dist/objects/extrudePolygon/getSplitTexture.d.ts +2 -2
- package/dist/objects/extrudePolygon/index.d.ts +9 -9
- package/dist/objects/index.d.ts +1 -1
- package/dist/objects/index.js +1 -1
- package/dist/objects/index.module.js +539 -565
- package/dist/objects/light/index.d.ts +6 -6
- package/dist/objects/line/index.d.ts +4 -4
- package/dist/objects/line/meshLine/MeshLineGeometry.d.ts +15 -15
- package/dist/objects/line/meshLine/MeshLineMaterial.d.ts +14 -14
- package/dist/objects/line/meshLine/index.d.ts +0 -1
- package/dist/objects/line2/createGeometry.d.ts +3 -3
- package/dist/objects/line2/index.d.ts +5 -5
- package/dist/objects/node/index.d.ts +3 -3
- package/dist/objects/pie/index.d.ts +67 -4
- package/dist/objects/scene/index.d.ts +2 -2
- package/dist/parseVector.js +1 -1
- package/dist/parseVector.module.js +10 -10
- package/dist/plugins/Worker/createGeometry.d.ts +2 -2
- package/dist/plugins/Worker/getAttributes/coords2Vector.d.ts +2 -2
- package/dist/plugins/Worker/getAttributes/extrudePolygon.d.ts +1 -2
- package/dist/plugins/Worker/getAttributes/line2.d.ts +1 -2
- package/dist/plugins/Worker/getAttributes/splitPolygonsByLongitudeDifference.d.ts +2 -2
- package/dist/plugins/Worker/index.d.ts +8 -8
- package/dist/plugins/index.js +1 -1
- package/dist/plugins/index.module.js +91 -91
- package/dist/utils/Sprite2Points.d.ts +2 -2
- package/dist/utils/colorCorrection.d.ts +4 -4
- package/dist/utils/parseVector.d.ts +3 -3
- package/dist/utils/uvGenerator.d.ts +4 -4
- package/dist/uvGenerator.js +1 -1
- package/dist/uvGenerator.module.js +46 -67
- package/package.json +1 -1
- package/dist/objects/fix.d.ts +0 -5
- package/dist/objects/line/meshLine/raycast.d.ts +0 -3
|
@@ -1,137 +1,137 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
for (var
|
|
6
|
-
|
|
7
|
-
if (
|
|
8
|
-
for (var
|
|
9
|
-
|
|
10
|
-
return b;
|
|
11
|
-
};
|
|
12
|
-
var N = (b, Z) => {
|
|
13
|
-
var l = {};
|
|
14
|
-
for (var d in b)
|
|
15
|
-
s.call(b, d) && Z.indexOf(d) < 0 && (l[d] = b[d]);
|
|
16
|
-
if (b != null && h)
|
|
17
|
-
for (var d of h(b))
|
|
18
|
-
Z.indexOf(d) < 0 && C.call(b, d) && (l[d] = b[d]);
|
|
1
|
+
var H = Object.defineProperty;
|
|
2
|
+
var u = Object.getOwnPropertySymbols;
|
|
3
|
+
var a = Object.prototype.hasOwnProperty, Y = Object.prototype.propertyIsEnumerable;
|
|
4
|
+
var s = (l, b, d) => b in l ? H(l, b, { enumerable: !0, configurable: !0, writable: !0, value: d }) : l[b] = d, W = (l, b) => {
|
|
5
|
+
for (var d in b || (b = {}))
|
|
6
|
+
a.call(b, d) && s(l, d, b[d]);
|
|
7
|
+
if (u)
|
|
8
|
+
for (var d of u(b))
|
|
9
|
+
Y.call(b, d) && s(l, d, b[d]);
|
|
19
10
|
return l;
|
|
20
11
|
};
|
|
21
|
-
var
|
|
22
|
-
var
|
|
12
|
+
var x = (l, b) => {
|
|
13
|
+
var d = {};
|
|
14
|
+
for (var G in l)
|
|
15
|
+
a.call(l, G) && b.indexOf(G) < 0 && (d[G] = l[G]);
|
|
16
|
+
if (l != null && u)
|
|
17
|
+
for (var G of u(l))
|
|
18
|
+
b.indexOf(G) < 0 && Y.call(l, G) && (d[G] = l[G]);
|
|
19
|
+
return d;
|
|
20
|
+
};
|
|
21
|
+
var V = (l, b, d) => new Promise((G, X) => {
|
|
22
|
+
var p = (Z) => {
|
|
23
23
|
try {
|
|
24
|
-
|
|
25
|
-
} catch (
|
|
26
|
-
|
|
24
|
+
m(d.next(Z));
|
|
25
|
+
} catch (c) {
|
|
26
|
+
X(c);
|
|
27
27
|
}
|
|
28
|
-
},
|
|
28
|
+
}, L = (Z) => {
|
|
29
29
|
try {
|
|
30
|
-
|
|
31
|
-
} catch (
|
|
32
|
-
|
|
30
|
+
m(d.throw(Z));
|
|
31
|
+
} catch (c) {
|
|
32
|
+
X(c);
|
|
33
33
|
}
|
|
34
|
-
},
|
|
35
|
-
|
|
34
|
+
}, m = (Z) => Z.done ? G(Z.value) : Promise.resolve(Z.value).then(p, L);
|
|
35
|
+
m((d = d.apply(l, b)).next());
|
|
36
36
|
});
|
|
37
|
-
import { createStore as
|
|
38
|
-
import
|
|
39
|
-
import { WorkerPool as
|
|
40
|
-
const S = "dmFyIEpQPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxLUD1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgalA9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGtoPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIGJ2PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksd3Y9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgcm09KHRlLHJlKT0+KHJlPVN5bWJvbFt0ZV0pP3JlOlN5bWJvbC5mb3IoIlN5bWJvbC4iK3RlKSxRUD10ZT0+e3Rocm93IFR5cGVFcnJvcih0ZSl9LENvPU1hdGgucG93LFN2PSh0ZSxyZSx5ZSk9PnJlIGluIHRlP0pQKHRlLHJlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp5ZX0pOnRlW3JlXT15ZSxXZT0odGUscmUpPT57Zm9yKHZhciB5ZSBpbiByZXx8KHJlPXt9KSlidi5jYWxsKHJlLHllKSYmU3YodGUseWUscmVbeWVdKTtpZihraClmb3IodmFyIHllIG9mIGtoKHJlKSl3di5jYWxsKHJlLHllKSYmU3YodGUseWUscmVbeWVdKTtyZXR1cm4gdGV9LGdpPSh0ZSxyZSk9PktQKHRlLGpQKHJlKSk7dmFyIEF2PSh0ZSxyZSk9Pnt2YXIgeWU9e307Zm9yKHZhciBOZSBpbiB0ZSlidi5jYWxsKHRlLE5lKSYmcmUuaW5kZXhPZihOZSk8MCYmKHllW05lXT10ZVtOZV0pO2lmKHRlIT1udWxsJiZraClmb3IodmFyIE5lIG9mIGtoKHRlKSlyZS5pbmRleE9mKE5lKTwwJiZ3di5jYWxsKHRlLE5lKSYmKHllW05lXT10ZVtOZV0pO3JldHVybiB5ZX07dmFyIE1zPSh0ZSxyZSx5ZSk9Pm5ldyBQcm9taXNlKChOZSxSbik9Pnt2YXIgSW49Z249Pnt0cnl7Q3IoeWUubmV4dChnbikpfWNhdGNoKFNzKXtSbihTcyl9fSxDaT1nbj0+e3RyeXtDcih5ZS50aHJvdyhnbikpfWNhdGNoKFNzKXtSbihTcyl9fSxDcj1nbj0+Z24uZG9uZT9OZShnbi52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKGduLnZhbHVlKS50aGVuKEluLENpKTtDcigoeWU9eWUuYXBwbHkodGUscmUpKS5uZXh0KCkpfSksdDM9ZnVuY3Rpb24odGUscmUpe3RoaXNbMF09dGUsdGhpc1sxXT1yZX07dmFyIFR2PXRlPT57dmFyIHJlPXRlW3JtKCJhc3luY0l0ZXJhdG9yIildLHllPSExLE5lLFJuPXt9O3JldHVybiByZT09bnVsbD8ocmU9dGVbcm0oIml0ZXJhdG9yIildKCksTmU9SW49PlJuW0luXT1DaT0+cmVbSW5dKENpKSk6KHJlPXJlLmNhbGwodGUpLE5lPUluPT5SbltJbl09Q2k9PntpZih5ZSl7aWYoeWU9ITEsSW49PT0idGhyb3ciKXRocm93IENpO3JldHVybiBDaX1yZXR1cm4geWU9ITAse2RvbmU6ITEsdmFsdWU6bmV3IHQzKG5ldyBQcm9taXNlKENyPT57dmFyIGduPXJlW0luXShDaSk7Z24gaW5zdGFuY2VvZiBPYmplY3R8fFFQKCJPYmplY3QgZXhwZWN0ZWQiKSxDcihnbil9KSwxKX19KSxSbltybSgiaXRlcmF0b3IiKV09KCk9PlJuLE5lKCJuZXh0IiksInRocm93ImluIHJlP05lKCJ0aHJvdyIpOlJuLnRocm93PUluPT57dGhyb3cgSW59LCJyZXR1cm4iaW4gcmUmJk5lKCJyZXR1cm4iKSxSbn07KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiOy8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgMjAxMC0yMDI1IFRocmVlLmpzIEF1dGhvcnMKICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogKi9jb25zdCB0ZT0iMTc2IixyZT17TEVGVDowLE1JRERMRToxLFJJR0hUOjIsUk9UQVRFOjAsRE9MTFk6MSxQQU46Mn0seWU9e1JPVEFURTowLFBBTjoxLERPTExZX1BBTjoyLERPTExZX1JPVEFURTozfSxOZT0wLFJuPTEsSW49MixDaT0zLENyPTAsZ249MSxTcz0yLHhpPTMsZWk9MCxZZT0xLFBuPTIsUmk9MCxScj0xLFZoPTIsR2g9MyxIaD00LHNtPTUscnI9MTAwLG9tPTEwMSxhbT0xMDIsY209MTAzLGxtPTEwNCx1bT0yMDAsaG09MjAxLGZtPTIwMixkbT0yMDMsaWM9MjA0LHJjPTIwNSxwbT0yMDYsbW09MjA3LGdtPTIwOCx4bT0yMDksX209MjEwLHltPTIxMSx2bT0yMTIsTW09MjEzLFNtPTIxNCxzYz0wLG9jPTEsYWM9MixJcj0zLGNjPTQsbGM9NSx1Yz02LGhjPTcsUm89MCxibT0xLHdtPTIsSWk9MCxBbT0xLFRtPTIsRW09MyxDbT00LFJtPTUsSW09NixQbT03LFdoPSJhdHRhY2hlZCIsTG09ImRldGFjaGVkIixmYz0zMDAsUGk9MzAxLHNyPTMwMixJbz0zMDMsUG89MzA0LGJzPTMwNixMbz0xZTMsR249MTAwMSxEbz0xMDAyLFhlPTEwMDMsWGg9MTAwNCxDdj0xMDA0LHdzPTEwMDUsUnY9MTAwNSx6ZT0xMDA2LFVvPTEwMDcsSXY9MTAwNyxfaT0xMDA4LFB2PTEwMDgsbmk9MTAwOSwkaD0xMDEwLHFoPTEwMTEsQXM9MTAxMixkYz0xMDEzLExpPTEwMTQseG49MTAxNSxUcz0xMDE2LHBjPTEwMTcsbWM9MTAxOCxFcz0xMDIwLFloPTM1OTAyLFpoPTEwMjEsSmg9MTAyMixubj0xMDIzLENzPTEwMjYsUnM9MTAyNyxnYz0xMDI4LE5vPTEwMjksS2g9MTAzMCx4Yz0xMDMxLEx2PTEwMzIsX2M9MTAzMyxGbz0zMzc3NixCbz0zMzc3NyxPbz0zMzc3OCx6bz0zMzc3OSx5Yz0zNTg0MCx2Yz0zNTg0MSxNYz0zNTg0MixTYz0zNTg0MyxiYz0zNjE5Nix3Yz0zNzQ5MixBYz0zNzQ5NixUYz0zNzgwOCxFYz0zNzgwOSxDYz0zNzgxMCxSYz0zNzgxMSxJYz0zNzgxMixQYz0zNzgxMyxMYz0zNzgxNCxEYz0zNzgxNSxVYz0zNzgxNixOYz0zNzgxNyxGYz0zNzgxOCxCYz0zNzgxOSxPYz0zNzgyMCx6Yz0zNzgyMSxrbz0zNjQ5MixrYz0zNjQ5NCxWYz0zNjQ5NSxqaD0zNjI4MyxHYz0zNjI4NCxIYz0zNjI4NSxXYz0zNjI4NixEbT0yMjAwLFVtPTIyMDEsTm09MjIwMixWbz0yMzAwLFhjPTIzMDEsJGM9MjMwMixQcj0yNDAwLExyPTI0MDEsR289MjQwMixxYz0yNTAwLFFoPTI1MDEsRHY9MCxVdj0xLE52PTIsRm09MzIwMCxCbT0zMjAxLEZ2PTMyMDIsQnY9MzIwMyxvcj0wLE9tPTEsRGk9IiIsX249InNyZ2IiLERyPSJzcmdiLWxpbmVhciIsSG89ImxpbmVhciIsZGU9InNyZ2IiLE92PTAsVXI9NzY4MCx6dj03NjgxLGt2PTc2ODIsVnY9NzY4MyxHdj0zNDA1NSxIdj0zNDA1NixXdj01Mzg2LFh2PTUxMiwkdj01MTMscXY9NTE0LFl2PTUxNSxadj01MTYsSnY9NTE3LEt2PTUxOCx0Zj01MTksem09NTEyLGttPTUxMyxWbT01MTQsZWY9NTE1LEdtPTUxNixIbT01MTcsV209NTE4LFhtPTUxOSxXbz0zNTA0NCxqdj0zNTA0OCxRdj0zNTA0MCx0TT0zNTA0NSxlTT0zNTA0OSxuTT0zNTA0MSxpTT0zNTA0NixyTT0zNTA1MCxzTT0zNTA0MixvTT0iMTAwIixuZj0iMzAwIGVzIixIbj0yZTMsWG89MjAwMSxhTT17Q09NUFVURToiY29tcHV0ZSIsUkVOREVSOiJyZW5kZXIifSxjTT17UEVSU1BFQ1RJVkU6InBlcnNwZWN0aXZlIixMSU5FQVI6ImxpbmVhciIsRkxBVDoiZmxhdCJ9LGxNPXtOT1JNQUw6Im5vcm1hbCIsQ0VOVFJPSUQ6ImNlbnRyb2lkIixTQU1QTEU6InNhbXBsZSIsRkxBVF9GSVJTVDoiZmxhdCBmaXJzdCIsRkxBVF9FSVRIRVI6ImZsYXQgZWl0aGVyIn07Y2xhc3MgeWl7YWRkRXZlbnRMaXN0ZW5lcih0LGUpe3RoaXMuX2xpc3RlbmVycz09PXZvaWQgMCYmKHRoaXMuX2xpc3RlbmVycz17fSk7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7blt0XT09PXZvaWQgMCYmKG5bdF09W10pLG5bdF0uaW5kZXhPZihlKT09PS0xJiZuW3RdLnB1c2goZSl9aGFzRXZlbnRMaXN0ZW5lcih0LGUpe2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiBuPT09dm9pZCAwPyExOm5bdF0hPT12b2lkIDAmJm5bdF0uaW5kZXhPZihlKSE9PS0xfXJlbW92ZUV2ZW50TGlzdGVuZXIodCxlKXtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztpZihuPT09dm9pZCAwKXJldHVybjtjb25zdCBpPW5bdF07aWYoaSE9PXZvaWQgMCl7Y29uc3Qgcz1pLmluZGV4T2YoZSk7cyE9PS0xJiZpLnNwbGljZShzLDEpfX1kaXNwYXRjaEV2ZW50KHQpe2NvbnN0IGU9dGhpcy5fbGlzdGVuZXJzO2lmKGU9PT12b2lkIDApcmV0dXJuO2NvbnN0IG49ZVt0LnR5cGVdO2lmKG4hPT12b2lkIDApe3QudGFyZ2V0PXRoaXM7Y29uc3QgaT1uLnNsaWNlKDApO2ZvcihsZXQgcz0wLG89aS5sZW5ndGg7czxvO3MrKylpW3NdLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3QgWmU9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2xldCAkbT0xMjM0NTY3O2NvbnN0IE5yPU1hdGguUEkvMTgwLElzPTE4MC9NYXRoLlBJO2Z1bmN0aW9uIExuKCl7Y29uc3Qgcj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCx0PU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLGU9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAsbj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MDtyZXR1cm4oWmVbciYyNTVdK1plW3I+PjgmMjU1XStaZVtyPj4xNiYyNTVdK1plW3I+PjI0JjI1NV0rIi0iK1plW3QmMjU1XStaZVt0Pj44JjI1NV0rIi0iK1plW3Q+PjE2JjE1fDY0XStaZVt0Pj4yNCYyNTVdKyItIitaZVtlJjYzfDEyOF0rWmVbZT4+OCYyNTVdKyItIitaZVtlPj4xNiYyNTVdK1plW2U+PjI0JjI1NV0rWmVbbiYyNTVdK1plW24+PjgmMjU1XStaZVtuPj4xNiYyNTVdK1plW24+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gSHQocix0LGUpe3JldHVybiBNYXRoLm1heCh0LE1hdGgubWluKGUscikpfWZ1bmN0aW9uIHJmKHIsdCl7cmV0dXJuKHIldCt0KSV0fWZ1bmN0aW9uIHVNKHIsdCxlLG4saSl7cmV0dXJuIG4rKHItdCkqKGktbikvKGUtdCl9ZnVuY3Rpb24gaE0ocix0LGUpe3JldHVybiByIT09dD8oZS1yKS8odC1yKTowfWZ1bmN0aW9uICRvKHIsdCxlKXtyZXR1cm4oMS1lKSpyK2UqdH1mdW5jdGlvbiBmTShyLHQsZSxuKXtyZXR1cm4gJG8ocix0LDEtTWF0aC5leHAoLWUqbikpfWZ1bmN0aW9uIGRNKHIsdD0xKXtyZXR1cm4gdC1NYXRoLmFicyhyZihyLHQqMiktdCl9ZnVuY3Rpb24gcE0ocix0LGUpe3JldHVybiByPD10PzA6cj49ZT8xOihyPShyLXQpLyhlLXQpLHIqciooMy0yKnIpKX1mdW5jdGlvbiBtTShyLHQsZSl7cmV0dXJuIHI8PXQ/MDpyPj1lPzE6KHI9KHItdCkvKGUtdCkscipyKnIqKHIqKHIqNi0xNSkrMTApKX1mdW5jdGlvbiBnTShyLHQpe3JldHVybiByK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoodC1yKzEpKX1mdW5jdGlvbiB4TShyLHQpe3JldHVybiByK01hdGgucmFuZG9tKCkqKHQtcil9ZnVuY3Rpb24gX00ocil7cmV0dXJuIHIqKC41LU1hdGgucmFuZG9tKCkpfWZ1bmN0aW9uIHlNKHIpe3IhPT12b2lkIDAmJigkbT1yKTtsZXQgdD0kbSs9MTgzMTU2NTgxMztyZXR1cm4gdD1NYXRoLmltdWwodF50Pj4+MTUsdHwxKSx0Xj10K01hdGguaW11bCh0XnQ+Pj43LHR8NjEpLCgodF50Pj4+MTQpPj4+MCkvNDI5NDk2NzI5Nn1mdW5jdGlvbiB2TShyKXtyZXR1cm4gcipOcn1mdW5jdGlvbiBNTShyKXtyZXR1cm4gcipJc31mdW5jdGlvbiBTTShyKXtyZXR1cm4ociZyLTEpPT09MCYmciE9PTB9ZnVuY3Rpb24gYk0ocil7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5jZWlsKE1hdGgubG9nKHIpL01hdGguTE4yKSl9ZnVuY3Rpb24gd00ocil7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMikpfWZ1bmN0aW9uIEFNKHIsdCxlLG4saSl7Y29uc3Qgcz1NYXRoLmNvcyxvPU1hdGguc2luLGE9cyhlLzIpLGM9byhlLzIpLGw9cygodCtuKS8yKSx1PW8oKHQrbikvMiksaD1zKCh0LW4pLzIpLGY9bygodC1uKS8yKSxkPXMoKG4tdCkvMikscD1vKChuLXQpLzIpO3N3aXRjaChpKXtjYXNlIlhZWCI6ci5zZXQoYSp1LGMqaCxjKmYsYSpsKTticmVhaztjYXNlIllaWSI6ci5zZXQoYypmLGEqdSxjKmgsYSpsKTticmVhaztjYXNlIlpYWiI6ci5zZXQoYypoLGMqZixhKnUsYSpsKTticmVhaztjYXNlIlhaWCI6ci5zZXQoYSp1LGMqcCxjKmQsYSpsKTticmVhaztjYXNlIllYWSI6ci5zZXQoYypkLGEqdSxjKnAsYSpsKTticmVhaztjYXNlIlpZWiI6ci5zZXQoYypwLGMqZCxhKnUsYSpsKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuTWF0aFV0aWxzOiAuc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIraSl9fWZ1bmN0aW9uIHJuKHIsdCl7c3dpdGNoKHQuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiByO2Nhc2UgVWludDMyQXJyYXk6cmV0dXJuIHIvNDI5NDk2NzI5NTtjYXNlIFVpbnQxNkFycmF5OnJldHVybiByLzY1NTM1O2Nhc2UgVWludDhBcnJheTpyZXR1cm4gci8yNTU7Y2FzZSBJbnQzMkFycmF5OnJldHVybiBNYXRoLm1heChyLzIxNDc0ODM2NDcsLTEpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5tYXgoci8zMjc2NywtMSk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgubWF4KHIvMTI3LC0xKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb21wb25lbnQgdHlwZS4iKX19ZnVuY3Rpb24gWXQocix0KXtzd2l0Y2godC5jb25zdHJ1Y3Rvcil7Y2FzZSBGbG9hdDMyQXJyYXk6cmV0dXJuIHI7Y2FzZSBVaW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChyKjQyOTQ5NjcyOTUpO2Nhc2UgVWludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQocio2NTUzNSk7Y2FzZSBVaW50OEFycmF5OnJldHVybiBNYXRoLnJvdW5kKHIqMjU1KTtjYXNlIEludDMyQXJyYXk6cmV0dXJuIE1hdGgucm91bmQocioyMTQ3NDgzNjQ3KTtjYXNlIEludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQociozMjc2Nyk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQocioxMjcpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCB0eXBlLiIpfX1jb25zdCBUTT17REVHMlJBRDpOcixSQUQyREVHOklzLGdlbmVyYXRlVVVJRDpMbixjbGFtcDpIdCxldWNsaWRlYW5Nb2R1bG86cmYsbWFwTGluZWFyOnVNLGludmVyc2VMZXJwOmhNLGxlcnA6JG8sZGFtcDpmTSxwaW5ncG9uZzpkTSxzbW9vdGhzdGVwOnBNLHNtb290aGVyc3RlcDptTSxyYW5kSW50OmdNLHJhbmRGbG9hdDp4TSxyYW5kRmxvYXRTcHJlYWQ6X00sc2VlZGVkUmFuZG9tOnlNLGRlZ1RvUmFkOnZNLHJhZFRvRGVnOk1NLGlzUG93ZXJPZlR3bzpTTSxjZWlsUG93ZXJPZlR3bzpiTSxmbG9vclBvd2VyT2ZUd286d00sc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcjpBTSxub3JtYWxpemU6WXQsZGVub3JtYWxpemU6cm59O2NsYXNzIHF7Y29uc3RydWN0b3IodD0wLGU9MCl7cS5wcm90b3R5cGUuaXNWZWN0b3IyPSEwLHRoaXMueD10LHRoaXMueT1lfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnh9c2V0IHdpZHRoKHQpe3RoaXMueD10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy55fXNldCBoZWlnaHQodCl7dGhpcy55PXR9c2V0KHQsZSl7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnksaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbM10qbitpWzZdLHRoaXMueT1pWzFdKmUraVs0XSpuK2lbN10sdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9SHQodGhpcy54LHQueCxlLngpLHRoaXMueT1IdCh0aGlzLnksdC55LGUueSksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9SHQodGhpcy54LHQsZSksdGhpcy55PUh0KHRoaXMueSx0LGUpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKEh0KG4sdCxlKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0Lnl9Y3Jvc3ModCl7cmV0dXJuIHRoaXMueCp0LnktdGhpcy55KnQueH1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnl9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfWFuZ2xlKCl7cmV0dXJuIE1hdGguYXRhbjIoLXRoaXMueSwtdGhpcy54KStNYXRoLlBJfWFuZ2xlVG8odCl7Y29uc3QgZT1NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKnQubGVuZ3RoU3EoKSk7aWYoZT09PTApcmV0dXJuIE1hdGguUEkvMjtjb25zdCBuPXRoaXMuZG90KHQpL2U7cmV0dXJuIE1hdGguYWNvcyhIdChuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueTtyZXR1cm4gZSplK24qbn1tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnl9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpc31yb3RhdGVBcm91bmQodCxlKXtjb25zdCBuPU1hdGguY29zKGUpLGk9TWF0aC5zaW4oZSkscz10aGlzLngtdC54LG89dGhpcy55LXQueTtyZXR1cm4gdGhpcy54PXMqbi1vKmkrdC54LHRoaXMueT1zKmkrbypuK3QueSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnl9fWNsYXNzIFd0e2NvbnN0cnVjdG9yKHQsZSxuLGkscyxvLGEsYyxsKXtXdC5wcm90b3R5cGUuaXNNYXRyaXgzPSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXSx0IT09dm9pZCAwJiZ0aGlzLnNldCh0LGUsbixpLHMsbyxhLGMsbCl9c2V0KHQsZSxuLGkscyxvLGEsYyxsKXtjb25zdCB1PXRoaXMuZWxlbWVudHM7cmV0dXJuIHVbMF09dCx1WzFdPWksdVsyXT1hLHVbM109ZSx1WzRdPXMsdVs1XT1jLHVbNl09bix1WzddPW8sdVs4XT1sLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwxLDAsMCwwLDEpLHRoaXN9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMSksbi5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDIpLHRoaXN9c2V0RnJvbU1hdHJpeDQodCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbNF0sZVs4XSxlWzFdLGVbNV0sZVs5XSxlWzJdLGVbNl0sZVsxMF0pLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgbj10LmVsZW1lbnRzLGk9ZS5lbGVtZW50cyxzPXRoaXMuZWxlbWVudHMsbz1uWzBdLGE9blszXSxjPW5bNl0sbD1uWzFdLHU9bls0XSxoPW5bN10sZj1uWzJdLGQ9bls1XSxwPW5bOF0seD1pWzBdLGc9aVszXSxtPWlbNl0sdj1pWzFdLHk9aVs0XSxfPWlbN10sUz1pWzJdLHc9aVs1XSxBPWlbOF07cmV0dXJuIHNbMF09byp4K2EqditjKlMsc1szXT1vKmcrYSp5K2MqdyxzWzZdPW8qbSthKl8rYypBLHNbMV09bCp4K3UqditoKlMsc1s0XT1sKmcrdSp5K2gqdyxzWzddPWwqbSt1Kl8raCpBLHNbMl09Zip4K2QqditwKlMsc1s1XT1mKmcrZCp5K3AqdyxzWzhdPWYqbStkKl8rcCpBLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbM10qPXQsZVs2XSo9dCxlWzFdKj10LGVbNF0qPXQsZVs3XSo9dCxlWzJdKj10LGVbNV0qPXQsZVs4XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0saT10WzJdLHM9dFszXSxvPXRbNF0sYT10WzVdLGM9dFs2XSxsPXRbN10sdT10WzhdO3JldHVybiBlKm8qdS1lKmEqbC1uKnMqdStuKmEqYytpKnMqbC1pKm8qY31pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxpPXRbMl0scz10WzNdLG89dFs0XSxhPXRbNV0sYz10WzZdLGw9dFs3XSx1PXRbOF0saD11Km8tYSpsLGY9YSpjLXUqcyxkPWwqcy1vKmMscD1lKmgrbipmK2kqZDtpZihwPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IHg9MS9wO3JldHVybiB0WzBdPWgqeCx0WzFdPShpKmwtdSpuKSp4LHRbMl09KGEqbi1pKm8pKngsdFszXT1mKngsdFs0XT0odSplLWkqYykqeCx0WzVdPShpKnMtYSplKSp4LHRbNl09ZCp4LHRbN109KG4qYy1sKmUpKngsdFs4XT0obyplLW4qcykqeCx0aGlzfXRyYW5zcG9zZSgpe2xldCB0O2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdD1lWzFdLGVbMV09ZVszXSxlWzNdPXQsdD1lWzJdLGVbMl09ZVs2XSxlWzZdPXQsdD1lWzVdLGVbNV09ZVs3XSxlWzddPXQsdGhpc31nZXROb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQodCkuaW52ZXJ0KCkudHJhbnNwb3NlKCl9dHJhbnNwb3NlSW50b0FycmF5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVszXSx0WzJdPWVbNl0sdFszXT1lWzFdLHRbNF09ZVs0XSx0WzVdPWVbN10sdFs2XT1lWzJdLHRbN109ZVs1XSx0WzhdPWVbOF0sdGhpc31zZXRVdlRyYW5zZm9ybSh0LGUsbixpLHMsbyxhKXtjb25zdCBjPU1hdGguY29zKHMpLGw9TWF0aC5zaW4ocyk7cmV0dXJuIHRoaXMuc2V0KG4qYyxuKmwsLW4qKGMqbytsKmEpK28rdCwtaSpsLGkqYywtaSooLWwqbytjKmEpK2ErZSwwLDAsMSksdGhpc31zY2FsZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KHNmLm1ha2VTY2FsZSh0LGUpKSx0aGlzfXJvdGF0ZSh0KXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShzZi5tYWtlUm90YXRpb24oLXQpKSx0aGlzfXRyYW5zbGF0ZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KHNmLm1ha2VUcmFuc2xhdGlvbih0LGUpKSx0aGlzfW1ha2VUcmFuc2xhdGlvbih0LGUpe3JldHVybiB0LmlzVmVjdG9yMj90aGlzLnNldCgxLDAsdC54LDAsMSx0LnksMCwwLDEpOnRoaXMuc2V0KDEsMCx0LDAsMSxlLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbih0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsLW4sMCxuLGUsMCwwLDAsMSksdGhpc31tYWtlU2NhbGUodCxlKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCxlLDAsMCwwLDEpLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7Zm9yKGxldCBpPTA7aTw5O2krKylpZihlW2ldIT09bltpXSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPW5bMF0sdFtlKzFdPW5bMV0sdFtlKzJdPW5bMl0sdFtlKzNdPW5bM10sdFtlKzRdPW5bNF0sdFtlKzVdPW5bNV0sdFtlKzZdPW5bNl0sdFtlKzddPW5bN10sdFtlKzhdPW5bOF0sdH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX19Y29uc3Qgc2Y9bmV3IFd0O2Z1bmN0aW9uIHFtKHIpe2ZvcihsZXQgdD1yLmxlbmd0aC0xO3Q+PTA7LS10KWlmKHJbdF0+PTY1NTM1KXJldHVybiEwO3JldHVybiExfWNvbnN0IEVNPXtJbnQ4QXJyYXksVWludDhBcnJheSxVaW50OENsYW1wZWRBcnJheSxJbnQxNkFycmF5LFVpbnQxNkFycmF5LEludDMyQXJyYXksVWludDMyQXJyYXksRmxvYXQzMkFycmF5LEZsb2F0NjRBcnJheX07ZnVuY3Rpb24gUHMocix0KXtyZXR1cm4gbmV3IEVNW3JdKHQpfWZ1bmN0aW9uIHFvKHIpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLHIpfWZ1bmN0aW9uIFltKCl7Y29uc3Qgcj1xbygiY2FudmFzIik7cmV0dXJuIHIuc3R5bGUuZGlzcGxheT0iYmxvY2siLHJ9Y29uc3QgWm09e307ZnVuY3Rpb24gWWMocil7ciBpbiBabXx8KFptW3JdPSEwLGNvbnNvbGUud2FybihyKSl9ZnVuY3Rpb24gQ00ocix0LGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuLGkpe2Z1bmN0aW9uIHMoKXtzd2l0Y2goci5jbGllbnRXYWl0U3luYyh0LHIuU1lOQ19GTFVTSF9DT01NQU5EU19CSVQsMCkpe2Nhc2Ugci5XQUlUX0ZBSUxFRDppKCk7YnJlYWs7Y2FzZSByLlRJTUVPVVRfRVhQSVJFRDpzZXRUaW1lb3V0KHMsZSk7YnJlYWs7ZGVmYXVsdDpuKCl9fXNldFRpbWVvdXQocyxlKX0pfWZ1bmN0aW9uIFJNKHIpe2NvbnN0IHQ9ci5lbGVtZW50czt0WzJdPS41KnRbMl0rLjUqdFszXSx0WzZdPS41KnRbNl0rLjUqdFs3XSx0WzEwXT0uNSp0WzEwXSsuNSp0WzExXSx0WzE0XT0uNSp0WzE0XSsuNSp0WzE1XX1mdW5jdGlvbiBJTShyKXtjb25zdCB0PXIuZWxlbWVudHM7dFsxMV09PT0tMT8odFsxMF09LXRbMTBdLTEsdFsxNF09LXRbMTRdKToodFsxMF09LXRbMTBdLHRbMTRdPS10WzE0XSsxKX1jb25zdCBKbT1uZXcgV3QoKS5zZXQoLjQxMjM5MDgsLjM1NzU4NDMsLjE4MDQ4MDgsLjIxMjYzOSwuNzE1MTY4NywuMDcyMTkyMywuMDE5MzMwOCwuMTE5MTk0OCwuOTUwNTMyMiksS209bmV3IFd0KCkuc2V0KDMuMjQwOTY5OSwtMS41MzczODMyLC0uNDk4NjEwOCwtLjk2OTI0MzYsMS44NzU5Njc1LC4wNDE1NTUxLC4wNTU2MzAxLC0uMjAzOTc3LDEuMDU2OTcxNSk7ZnVuY3Rpb24gUE0oKXtjb25zdCByPXtlbmFibGVkOiEwLHdvcmtpbmdDb2xvclNwYWNlOkRyLHNwYWNlczp7fSxjb252ZXJ0OmZ1bmN0aW9uKGkscyxvKXtyZXR1cm4gdGhpcy5lbmFibGVkPT09ITF8fHM9PT1vfHwhc3x8IW98fCh0aGlzLnNwYWNlc1tzXS50cmFuc2Zlcj09PWRlJiYoaS5yPVVpKGkuciksaS5nPVVpKGkuZyksaS5iPVVpKGkuYikpLHRoaXMuc3BhY2VzW3NdLnByaW1hcmllcyE9PXRoaXMuc3BhY2VzW29dLnByaW1hcmllcyYmKGkuYXBwbHlNYXRyaXgzKHRoaXMuc3BhY2VzW3NdLnRvWFlaKSxpLmFwcGx5TWF0cml4Myh0aGlzLnNwYWNlc1tvXS5mcm9tWFlaKSksdGhpcy5zcGFjZXNbb10udHJhbnNmZXI9PT1kZSYmKGkucj1McyhpLnIpLGkuZz1McyhpLmcpLGkuYj1McyhpLmIpKSksaX0sZnJvbVdvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKGkscyl7cmV0dXJuIHRoaXMuY29udmVydChpLHRoaXMud29ya2luZ0NvbG9yU3BhY2Uscyl9LHRvV29ya2luZ0NvbG9yU3BhY2U6ZnVuY3Rpb24oaSxzKXtyZXR1cm4gdGhpcy5jb252ZXJ0KGkscyx0aGlzLndvcmtpbmdDb2xvclNwYWNlKX0sZ2V0UHJpbWFyaWVzOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLnNwYWNlc1tpXS5wcmltYXJpZXN9LGdldFRyYW5zZmVyOmZ1bmN0aW9uKGkpe3JldHVybiBpPT09RGk/SG86dGhpcy5zcGFjZXNbaV0udHJhbnNmZXJ9LGdldEx1bWluYW5jZUNvZWZmaWNpZW50czpmdW5jdGlvbihpLHM9dGhpcy53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIGkuZnJvbUFycmF5KHRoaXMuc3BhY2VzW3NdLmx1bWluYW5jZUNvZWZmaWNpZW50cyl9LGRlZmluZTpmdW5jdGlvbihpKXtPYmplY3QuYXNzaWduKHRoaXMuc3BhY2VzLGkpfSxfZ2V0TWF0cml4OmZ1bmN0aW9uKGkscyxvKXtyZXR1cm4gaS5jb3B5KHRoaXMuc3BhY2VzW3NdLnRvWFlaKS5tdWx0aXBseSh0aGlzLnNwYWNlc1tvXS5mcm9tWFlaKX0sX2dldERyYXdpbmdCdWZmZXJDb2xvclNwYWNlOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLnNwYWNlc1tpXS5vdXRwdXRDb2xvclNwYWNlQ29uZmlnLmRyYXdpbmdCdWZmZXJDb2xvclNwYWNlfSxfZ2V0VW5wYWNrQ29sb3JTcGFjZTpmdW5jdGlvbihpPXRoaXMud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB0aGlzLnNwYWNlc1tpXS53b3JraW5nQ29sb3JTcGFjZUNvbmZpZy51bnBhY2tDb2xvclNwYWNlfX0sdD1bLjY0LC4zMywuMywuNiwuMTUsLjA2XSxlPVsuMjEyNiwuNzE1MiwuMDcyMl0sbj1bLjMxMjcsLjMyOV07cmV0dXJuIHIuZGVmaW5lKHtbRHJdOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6SG8sdG9YWVo6Sm0sZnJvbVhZWjpLbSxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSx3b3JraW5nQ29sb3JTcGFjZUNvbmZpZzp7dW5wYWNrQ29sb3JTcGFjZTpfbn0sb3V0cHV0Q29sb3JTcGFjZUNvbmZpZzp7ZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6X259fSxbX25dOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6ZGUsdG9YWVo6Sm0sZnJvbVhZWjpLbSxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSxvdXRwdXRDb2xvclNwYWNlQ29uZmlnOntkcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTpfbn19fSkscn1jb25zdCBuZT1QTSgpO2Z1bmN0aW9uIFVpKHIpe3JldHVybiByPC4wNDA0NT9yKi4wNzczOTkzODA4Ok1hdGgucG93KHIqLjk0Nzg2NzI5ODYrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBMcyhyKXtyZXR1cm4gcjwuMDAzMTMwOD9yKjEyLjkyOjEuMDU1Kk1hdGgucG93KHIsLjQxNjY2KS0uMDU1fWxldCBEcztjbGFzcyBqbXtzdGF0aWMgZ2V0RGF0YVVSTCh0LGU9ImltYWdlL3BuZyIpe2lmKC9eZGF0YTovaS50ZXN0KHQuc3JjKXx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50PT0idW5kZWZpbmVkIilyZXR1cm4gdC5zcmM7bGV0IG47aWYodCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KW49dDtlbHNle0RzPT09dm9pZCAwJiYoRHM9cW8oImNhbnZhcyIpKSxEcy53aWR0aD10LndpZHRoLERzLmhlaWdodD10LmhlaWdodDtjb25zdCBpPURzLmdldENvbnRleHQoIjJkIik7dCBpbnN0YW5jZW9mIEltYWdlRGF0YT9pLnB1dEltYWdlRGF0YSh0LDAsMCk6aS5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksbj1Ec31yZXR1cm4gbi50b0RhdGFVUkwoZSl9c3RhdGljIHNSR0JUb0xpbmVhcih0KXtpZih0eXBlb2YgSFRNTEltYWdlRWxlbWVudCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fHR5cGVvZiBJbWFnZUJpdG1hcCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgZT1xbygiY2FudmFzIik7ZS53aWR0aD10LndpZHRoLGUuaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49ZS5nZXRDb250ZXh0KCIyZCIpO24uZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpO2NvbnN0IGk9bi5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLHM9aS5kYXRhO2ZvcihsZXQgbz0wO288cy5sZW5ndGg7bysrKXNbb109VWkoc1tvXS8yNTUpKjI1NTtyZXR1cm4gbi5wdXRJbWFnZURhdGEoaSwwLDApLGV9ZWxzZSBpZih0LmRhdGEpe2NvbnN0IGU9dC5kYXRhLnNsaWNlKDApO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxlIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/ZVtuXT1NYXRoLmZsb29yKFVpKGVbbl0vMjU1KSoyNTUpOmVbbl09VWkoZVtuXSk7cmV0dXJue2RhdGE6ZSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19ZWxzZSByZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLnNSR0JUb0xpbmVhcigpOiBVbnN1cHBvcnRlZCBpbWFnZSB0eXBlLiBObyBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGFwcGxpZWQuIiksdH19bGV0IExNPTA7Y2xhc3MgYXJ7Y29uc3RydWN0b3IodD1udWxsKXt0aGlzLmlzU291cmNlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOkxNKyt9KSx0aGlzLnV1aWQ9TG4oKSx0aGlzLmRhdGE9dCx0aGlzLmRhdGFSZWFkeT0hMCx0aGlzLnZlcnNpb249MH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK310b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQuaW1hZ2VzW3RoaXMudXVpZF0hPT12b2lkIDApcmV0dXJuIHQuaW1hZ2VzW3RoaXMudXVpZF07Y29uc3Qgbj17dXVpZDp0aGlzLnV1aWQsdXJsOiIifSxpPXRoaXMuZGF0YTtpZihpIT09bnVsbCl7bGV0IHM7aWYoQXJyYXkuaXNBcnJheShpKSl7cz1bXTtmb3IobGV0IG89MCxhPWkubGVuZ3RoO288YTtvKyspaVtvXS5pc0RhdGFUZXh0dXJlP3MucHVzaChvZihpW29dLmltYWdlKSk6cy5wdXNoKG9mKGlbb10pKX1lbHNlIHM9b2YoaSk7bi51cmw9c31yZXR1cm4gZXx8KHQuaW1hZ2VzW3RoaXMudXVpZF09biksbn19ZnVuY3Rpb24gb2Yocil7cmV0dXJuIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IT0idW5kZWZpbmVkIiYmciBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCE9InVuZGVmaW5lZCImJnIgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8dHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIiYmciBpbnN0YW5jZW9mIEltYWdlQml0bWFwP2ptLmdldERhdGFVUkwocik6ci5kYXRhP3tkYXRhOkFycmF5LmZyb20oci5kYXRhKSx3aWR0aDpyLndpZHRoLGhlaWdodDpyLmhlaWdodCx0eXBlOnIuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTooY29uc29sZS53YXJuKCJUSFJFRS5UZXh0dXJlOiBVbmFibGUgdG8gc2VyaWFsaXplIFRleHR1cmUuIikse30pfWxldCBETT0wO2NsYXNzIEFlIGV4dGVuZHMgeWl7Y29uc3RydWN0b3IodD1BZS5ERUZBVUxUX0lNQUdFLGU9QWUuREVGQVVMVF9NQVBQSU5HLG49R24saT1HbixzPXplLG89X2ksYT1ubixjPW5pLGw9QWUuREVGQVVMVF9BTklTT1RST1BZLHU9RGkpe3N1cGVyKCksdGhpcy5pc1RleHR1cmU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6RE0rK30pLHRoaXMudXVpZD1MbigpLHRoaXMubmFtZT0iIix0aGlzLnNvdXJjZT1uZXcgYXIodCksdGhpcy5taXBtYXBzPVtdLHRoaXMubWFwcGluZz1lLHRoaXMuY2hhbm5lbD0wLHRoaXMud3JhcFM9bix0aGlzLndyYXBUPWksdGhpcy5tYWdGaWx0ZXI9cyx0aGlzLm1pbkZpbHRlcj1vLHRoaXMuYW5pc290cm9weT1sLHRoaXMuZm9ybWF0PWEsdGhpcy5pbnRlcm5hbEZvcm1hdD1udWxsLHRoaXMudHlwZT1jLHRoaXMub2Zmc2V0PW5ldyBxKDAsMCksdGhpcy5yZXBlYXQ9bmV3IHEoMSwxKSx0aGlzLmNlbnRlcj1uZXcgcSgwLDApLHRoaXMucm90YXRpb249MCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITAsdGhpcy5tYXRyaXg9bmV3IFd0LHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdGhpcy5jb2xvclNwYWNlPXUsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLm9uVXBkYXRlPW51bGwsdGhpcy5yZW5kZXJUYXJnZXQ9bnVsbCx0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMSx0aGlzLmlzVGV4dHVyZUFycmF5PSExLHRoaXMucG1yZW1WZXJzaW9uPTB9Z2V0IGltYWdlKCl7cmV0dXJuIHRoaXMuc291cmNlLmRhdGF9c2V0IGltYWdlKHQ9bnVsbCl7dGhpcy5zb3VyY2UuZGF0YT10fXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueSx0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnksdGhpcy5yb3RhdGlvbix0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnkpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuc291cmNlPXQuc291cmNlLHRoaXMubWlwbWFwcz10Lm1pcG1hcHMuc2xpY2UoMCksdGhpcy5tYXBwaW5nPXQubWFwcGluZyx0aGlzLmNoYW5uZWw9dC5jaGFubmVsLHRoaXMud3JhcFM9dC53cmFwUyx0aGlzLndyYXBUPXQud3JhcFQsdGhpcy5tYWdGaWx0ZXI9dC5tYWdGaWx0ZXIsdGhpcy5taW5GaWx0ZXI9dC5taW5GaWx0ZXIsdGhpcy5hbmlzb3Ryb3B5PXQuYW5pc290cm9weSx0aGlzLmZvcm1hdD10LmZvcm1hdCx0aGlzLmludGVybmFsRm9ybWF0PXQuaW50ZXJuYWxGb3JtYXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLm9mZnNldC5jb3B5KHQub2Zmc2V0KSx0aGlzLnJlcGVhdC5jb3B5KHQucmVwZWF0KSx0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLmdlbmVyYXRlTWlwbWFwcz10LmdlbmVyYXRlTWlwbWFwcyx0aGlzLnByZW11bHRpcGx5QWxwaGE9dC5wcmVtdWx0aXBseUFscGhhLHRoaXMuZmxpcFk9dC5mbGlwWSx0aGlzLnVucGFja0FsaWdubWVudD10LnVucGFja0FsaWdubWVudCx0aGlzLmNvbG9yU3BhY2U9dC5jb2xvclNwYWNlLHRoaXMucmVuZGVyVGFyZ2V0PXQucmVuZGVyVGFyZ2V0LHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPXQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlLHRoaXMuaXNUZXh0dXJlQXJyYXk9dC5pc1RleHR1cmVBcnJheSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpc310b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQudGV4dHVyZXNbdGhpcy51dWlkXSE9PXZvaWQgMClyZXR1cm4gdC50ZXh0dXJlc1t0aGlzLnV1aWRdO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsaW1hZ2U6dGhpcy5zb3VyY2UudG9KU09OKHQpLnV1aWQsbWFwcGluZzp0aGlzLm1hcHBpbmcsY2hhbm5lbDp0aGlzLmNoYW5uZWwscmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCxpbnRlcm5hbEZvcm1hdDp0aGlzLmludGVybmFsRm9ybWF0LHR5cGU6dGhpcy50eXBlLGNvbG9yU3BhY2U6dGhpcy5jb2xvclNwYWNlLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxnZW5lcmF0ZU1pcG1hcHM6dGhpcy5nZW5lcmF0ZU1pcG1hcHMscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihuLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09biksbn1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKHRoaXMubWFwcGluZyE9PWZjKXJldHVybiB0O2lmKHQuYXBwbHlNYXRyaXgzKHRoaXMubWF0cml4KSx0Lng8MHx8dC54PjEpc3dpdGNoKHRoaXMud3JhcFMpe2Nhc2UgTG86dC54PXQueC1NYXRoLmZsb29yKHQueCk7YnJlYWs7Y2FzZSBHbjp0Lng9dC54PDA/MDoxO2JyZWFrO2Nhc2UgRG86TWF0aC5hYnMoTWF0aC5mbG9vcih0LngpJTIpPT09MT90Lng9TWF0aC5jZWlsKHQueCktdC54OnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrfWlmKHQueTwwfHx0Lnk+MSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSBMbzp0Lnk9dC55LU1hdGguZmxvb3IodC55KTticmVhaztjYXNlIEduOnQueT10Lnk8MD8wOjE7YnJlYWs7Y2FzZSBEbzpNYXRoLmFicyhNYXRoLmZsb29yKHQueSklMik9PT0xP3QueT1NYXRoLmNlaWwodC55KS10Lnk6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWt9cmV0dXJuIHRoaXMuZmxpcFkmJih0Lnk9MS10LnkpLHR9c2V0IG5lZWRzVXBkYXRlKHQpe3Q9PT0hMCYmKHRoaXMudmVyc2lvbisrLHRoaXMuc291cmNlLm5lZWRzVXBkYXRlPSEwKX1zZXQgbmVlZHNQTVJFTVVwZGF0ZSh0KXt0PT09ITAmJnRoaXMucG1yZW1WZXJzaW9uKyt9fUFlLkRFRkFVTFRfSU1BR0U9bnVsbCxBZS5ERUZBVUxUX01BUFBJTkc9ZmMsQWUuREVGQVVMVF9BTklTT1RST1BZPTE7Y2xhc3MgUXR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAsaT0xKXtRdC5wcm90b3R5cGUuaXNWZWN0b3I0PSEwLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1pfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnp9c2V0IHdpZHRoKHQpe3RoaXMuej10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy53fXNldCBoZWlnaHQodCl7dGhpcy53PXR9c2V0KHQsZSxuLGkpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzLnc9aSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpcy53PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRXKHQpe3JldHVybiB0aGlzLnc9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztjYXNlIDM6dGhpcy53PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56LHRoaXMudyl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpcy53PXQudyE9PXZvaWQgMD90Lnc6MSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcy53Kz10LncsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcy53LT10LncsdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXMudy09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpcy53PXQudy1lLncsdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcy53Kj10LncsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzLnoqPXQsdGhpcy53Kj10LHRoaXN9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LGk9dGhpcy56LHM9dGhpcy53LG89dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PW9bMF0qZStvWzRdKm4rb1s4XSppK29bMTJdKnMsdGhpcy55PW9bMV0qZStvWzVdKm4rb1s5XSppK29bMTNdKnMsdGhpcy56PW9bMl0qZStvWzZdKm4rb1sxMF0qaStvWzE0XSpzLHRoaXMudz1vWzNdKmUrb1s3XSpuK29bMTFdKmkrb1sxNV0qcyx0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpcy53Lz10LncsdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1zZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbih0KXt0aGlzLnc9MipNYXRoLmFjb3ModC53KTtjb25zdCBlPU1hdGguc3FydCgxLXQudyp0LncpO3JldHVybiBlPDFlLTQ/KHRoaXMueD0xLHRoaXMueT0wLHRoaXMuej0wKToodGhpcy54PXQueC9lLHRoaXMueT10LnkvZSx0aGlzLno9dC56L2UpLHRoaXN9c2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4KHQpe2xldCBlLG4saSxzO2NvbnN0IGM9dC5lbGVtZW50cyxsPWNbMF0sdT1jWzRdLGg9Y1s4XSxmPWNbMV0sZD1jWzVdLHA9Y1s5XSx4PWNbMl0sZz1jWzZdLG09Y1sxMF07aWYoTWF0aC5hYnModS1mKTwuMDEmJk1hdGguYWJzKGgteCk8LjAxJiZNYXRoLmFicyhwLWcpPC4wMSl7aWYoTWF0aC5hYnModStmKTwuMSYmTWF0aC5hYnMoaCt4KTwuMSYmTWF0aC5hYnMocCtnKTwuMSYmTWF0aC5hYnMobCtkK20tMyk8LjEpcmV0dXJuIHRoaXMuc2V0KDEsMCwwLDApLHRoaXM7ZT1NYXRoLlBJO2NvbnN0IHk9KGwrMSkvMixfPShkKzEpLzIsUz0obSsxKS8yLHc9KHUrZikvNCxBPShoK3gpLzQsVD0ocCtnKS80O3JldHVybiB5Pl8mJnk+Uz95PC4wMT8obj0wLGk9LjcwNzEwNjc4MSxzPS43MDcxMDY3ODEpOihuPU1hdGguc3FydCh5KSxpPXcvbixzPUEvbik6Xz5TP188LjAxPyhuPS43MDcxMDY3ODEsaT0wLHM9LjcwNzEwNjc4MSk6KGk9TWF0aC5zcXJ0KF8pLG49dy9pLHM9VC9pKTpTPC4wMT8obj0uNzA3MTA2NzgxLGk9LjcwNzEwNjc4MSxzPTApOihzPU1hdGguc3FydChTKSxuPUEvcyxpPVQvcyksdGhpcy5zZXQobixpLHMsZSksdGhpc31sZXQgdj1NYXRoLnNxcnQoKGctcCkqKGctcCkrKGgteCkqKGgteCkrKGYtdSkqKGYtdSkpO3JldHVybiBNYXRoLmFicyh2KTwuMDAxJiYodj0xKSx0aGlzLng9KGctcCkvdix0aGlzLnk9KGgteCkvdix0aGlzLno9KGYtdSkvdix0aGlzLnc9TWF0aC5hY29zKChsK2QrbS0xKS8yKSx0aGlzfXNldEZyb21NYXRyaXhQb3NpdGlvbih0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1lWzEyXSx0aGlzLnk9ZVsxM10sdGhpcy56PWVbMTRdLHRoaXMudz1lWzE1XSx0aGlzfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzLno9TWF0aC5taW4odGhpcy56LHQueiksdGhpcy53PU1hdGgubWluKHRoaXMudyx0LncpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5tYXgodGhpcy53LHQudyksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9SHQodGhpcy54LHQueCxlLngpLHRoaXMueT1IdCh0aGlzLnksdC55LGUueSksdGhpcy56PUh0KHRoaXMueix0LnosZS56KSx0aGlzLnc9SHQodGhpcy53LHQudyxlLncpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PUh0KHRoaXMueCx0LGUpLHRoaXMueT1IdCh0aGlzLnksdCxlKSx0aGlzLno9SHQodGhpcy56LHQsZSksdGhpcy53PUh0KHRoaXMudyx0LGUpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKEh0KG4sdCxlKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpcy53PU1hdGguZmxvb3IodGhpcy53KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpcy53PU1hdGguY2VpbCh0aGlzLncpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpcy53PU1hdGgucm91bmQodGhpcy53KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzLno9TWF0aC50cnVuYyh0aGlzLnopLHRoaXMudz1NYXRoLnRydW5jKHRoaXMudyksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpcy53PS10aGlzLncsdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56K3RoaXMudyp0Lnd9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLncpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KStNYXRoLmFicyh0aGlzLncpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzLncrPSh0LnctdGhpcy53KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzLnc9dC53KyhlLnctdC53KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56JiZ0Lnc9PT10aGlzLnd9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXMudz10W2UrM10sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHRbZSszXT10aGlzLncsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXMudz10LmdldFcoZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpcy53PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMueix5aWVsZCB0aGlzLnd9fWNsYXNzIFpjIGV4dGVuZHMgeWl7Y29uc3RydWN0b3IodD0xLGU9MSxuPXt9KXtzdXBlcigpLHRoaXMuaXNSZW5kZXJUYXJnZXQ9ITAsdGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PWUsdGhpcy5kZXB0aD1uLmRlcHRoP24uZGVwdGg6MSx0aGlzLnNjaXNzb3I9bmV3IFF0KDAsMCx0LGUpLHRoaXMuc2Npc3NvclRlc3Q9ITEsdGhpcy52aWV3cG9ydD1uZXcgUXQoMCwwLHQsZSk7Y29uc3QgaT17d2lkdGg6dCxoZWlnaHQ6ZSxkZXB0aDp0aGlzLmRlcHRofTtuPU9iamVjdC5hc3NpZ24oe2dlbmVyYXRlTWlwbWFwczohMSxpbnRlcm5hbEZvcm1hdDpudWxsLG1pbkZpbHRlcjp6ZSxkZXB0aEJ1ZmZlcjohMCxzdGVuY2lsQnVmZmVyOiExLHJlc29sdmVEZXB0aEJ1ZmZlcjohMCxyZXNvbHZlU3RlbmNpbEJ1ZmZlcjohMCxkZXB0aFRleHR1cmU6bnVsbCxzYW1wbGVzOjAsY291bnQ6MSxtdWx0aXZpZXc6ITF9LG4pO2NvbnN0IHM9bmV3IEFlKGksbi5tYXBwaW5nLG4ud3JhcFMsbi53cmFwVCxuLm1hZ0ZpbHRlcixuLm1pbkZpbHRlcixuLmZvcm1hdCxuLnR5cGUsbi5hbmlzb3Ryb3B5LG4uY29sb3JTcGFjZSk7cy5mbGlwWT0hMSxzLmdlbmVyYXRlTWlwbWFwcz1uLmdlbmVyYXRlTWlwbWFwcyxzLmludGVybmFsRm9ybWF0PW4uaW50ZXJuYWxGb3JtYXQsdGhpcy50ZXh0dXJlcz1bXTtjb25zdCBvPW4uY291bnQ7Zm9yKGxldCBhPTA7YTxvO2ErKyl0aGlzLnRleHR1cmVzW2FdPXMuY2xvbmUoKSx0aGlzLnRleHR1cmVzW2FdLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMCx0aGlzLnRleHR1cmVzW2FdLnJlbmRlclRhcmdldD10aGlzO3RoaXMuZGVwdGhCdWZmZXI9bi5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9bi5zdGVuY2lsQnVmZmVyLHRoaXMucmVzb2x2ZURlcHRoQnVmZmVyPW4ucmVzb2x2ZURlcHRoQnVmZmVyLHRoaXMucmVzb2x2ZVN0ZW5jaWxCdWZmZXI9bi5yZXNvbHZlU3RlbmNpbEJ1ZmZlcix0aGlzLl9kZXB0aFRleHR1cmU9bnVsbCx0aGlzLmRlcHRoVGV4dHVyZT1uLmRlcHRoVGV4dHVyZSx0aGlzLnNhbXBsZXM9bi5zYW1wbGVzLHRoaXMubXVsdGl2aWV3PW4ubXVsdGl2aWV3fWdldCB0ZXh0dXJlKCl7cmV0dXJuIHRoaXMudGV4dHVyZXNbMF19c2V0IHRleHR1cmUodCl7dGhpcy50ZXh0dXJlc1swXT10fXNldCBkZXB0aFRleHR1cmUodCl7dGhpcy5fZGVwdGhUZXh0dXJlIT09bnVsbCYmKHRoaXMuX2RlcHRoVGV4dHVyZS5yZW5kZXJUYXJnZXQ9bnVsbCksdCE9PW51bGwmJih0LnJlbmRlclRhcmdldD10aGlzKSx0aGlzLl9kZXB0aFRleHR1cmU9dH1nZXQgZGVwdGhUZXh0dXJlKCl7cmV0dXJuIHRoaXMuX2RlcHRoVGV4dHVyZX1zZXRTaXplKHQsZSxuPTEpe2lmKHRoaXMud2lkdGghPT10fHx0aGlzLmhlaWdodCE9PWV8fHRoaXMuZGVwdGghPT1uKXt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPW47Zm9yKGxldCBpPTAscz10aGlzLnRleHR1cmVzLmxlbmd0aDtpPHM7aSsrKXRoaXMudGV4dHVyZXNbaV0uaW1hZ2Uud2lkdGg9dCx0aGlzLnRleHR1cmVzW2ldLmltYWdlLmhlaWdodD1lLHRoaXMudGV4dHVyZXNbaV0uaW1hZ2UuZGVwdGg9bjt0aGlzLmRpc3Bvc2UoKX10aGlzLnZpZXdwb3J0LnNldCgwLDAsdCxlKSx0aGlzLnNjaXNzb3Iuc2V0KDAsMCx0LGUpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMud2lkdGg9dC53aWR0aCx0aGlzLmhlaWdodD10LmhlaWdodCx0aGlzLmRlcHRoPXQuZGVwdGgsdGhpcy5zY2lzc29yLmNvcHkodC5zY2lzc29yKSx0aGlzLnNjaXNzb3JUZXN0PXQuc2Npc3NvclRlc3QsdGhpcy52aWV3cG9ydC5jb3B5KHQudmlld3BvcnQpLHRoaXMudGV4dHVyZXMubGVuZ3RoPTA7Zm9yKGxldCBlPTAsbj10LnRleHR1cmVzLmxlbmd0aDtlPG47ZSsrKXt0aGlzLnRleHR1cmVzW2VdPXQudGV4dHVyZXNbZV0uY2xvbmUoKSx0aGlzLnRleHR1cmVzW2VdLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMCx0aGlzLnRleHR1cmVzW2VdLnJlbmRlclRhcmdldD10aGlzO2NvbnN0IGk9T2JqZWN0LmFzc2lnbih7fSx0LnRleHR1cmVzW2VdLmltYWdlKTt0aGlzLnRleHR1cmVzW2VdLnNvdXJjZT1uZXcgYXIoaSl9cmV0dXJuIHRoaXMuZGVwdGhCdWZmZXI9dC5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9dC5zdGVuY2lsQnVmZmVyLHRoaXMucmVzb2x2ZURlcHRoQnVmZmVyPXQucmVzb2x2ZURlcHRoQnVmZmVyLHRoaXMucmVzb2x2ZVN0ZW5jaWxCdWZmZXI9dC5yZXNvbHZlU3RlbmNpbEJ1ZmZlcix0LmRlcHRoVGV4dHVyZSE9PW51bGwmJih0aGlzLmRlcHRoVGV4dHVyZT10LmRlcHRoVGV4dHVyZS5jbG9uZSgpKSx0aGlzLnNhbXBsZXM9dC5zYW1wbGVzLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19Y2xhc3MgdmkgZXh0ZW5kcyBaY3tjb25zdHJ1Y3Rvcih0PTEsZT0xLG49e30pe3N1cGVyKHQsZSxuKSx0aGlzLmlzV2ViR0xSZW5kZXJUYXJnZXQ9ITB9fWNsYXNzIFlvIGV4dGVuZHMgQWV7Y29uc3RydWN0b3IodD1udWxsLGU9MSxuPTEsaT0xKXtzdXBlcihudWxsKSx0aGlzLmlzRGF0YUFycmF5VGV4dHVyZT0hMCx0aGlzLmltYWdlPXtkYXRhOnQsd2lkdGg6ZSxoZWlnaHQ6bixkZXB0aDppfSx0aGlzLm1hZ0ZpbHRlcj1YZSx0aGlzLm1pbkZpbHRlcj1YZSx0aGlzLndyYXBSPUduLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuZmxpcFk9ITEsdGhpcy51bnBhY2tBbGlnbm1lbnQ9MSx0aGlzLmxheWVyVXBkYXRlcz1uZXcgU2V0fWFkZExheWVyVXBkYXRlKHQpe3RoaXMubGF5ZXJVcGRhdGVzLmFkZCh0KX1jbGVhckxheWVyVXBkYXRlcygpe3RoaXMubGF5ZXJVcGRhdGVzLmNsZWFyKCl9fWNsYXNzIFVNIGV4dGVuZHMgdml7Y29uc3RydWN0b3IodD0xLGU9MSxuPTEsaT17fSl7c3VwZXIodCxlLGkpLHRoaXMuaXNXZWJHTEFycmF5UmVuZGVyVGFyZ2V0PSEwLHRoaXMuZGVwdGg9bix0aGlzLnRleHR1cmU9bmV3IFlvKG51bGwsdCxlLG4pLHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITB9fWNsYXNzIEpjIGV4dGVuZHMgQWV7Y29uc3RydWN0b3IodD1udWxsLGU9MSxuPTEsaT0xKXtzdXBlcihudWxsKSx0aGlzLmlzRGF0YTNEVGV4dHVyZT0hMCx0aGlzLmltYWdlPXtkYXRhOnQsd2lkdGg6ZSxoZWlnaHQ6bixkZXB0aDppfSx0aGlzLm1hZ0ZpbHRlcj1YZSx0aGlzLm1pbkZpbHRlcj1YZSx0aGlzLndyYXBSPUduLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuZmxpcFk9ITEsdGhpcy51bnBhY2tBbGlnbm1lbnQ9MX19Y2xhc3MgTk0gZXh0ZW5kcyB2aXtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxpPXt9KXtzdXBlcih0LGUsaSksdGhpcy5pc1dlYkdMM0RSZW5kZXJUYXJnZXQ9ITAsdGhpcy5kZXB0aD1uLHRoaXMudGV4dHVyZT1uZXcgSmMobnVsbCx0LGUsbiksdGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMH19Y2xhc3MgeW57Y29uc3RydWN0b3IodD0wLGU9MCxuPTAsaT0xKXt0aGlzLmlzUXVhdGVybmlvbj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PWl9c3RhdGljIHNsZXJwRmxhdCh0LGUsbixpLHMsbyxhKXtsZXQgYz1uW2krMF0sbD1uW2krMV0sdT1uW2krMl0saD1uW2krM107Y29uc3QgZj1zW28rMF0sZD1zW28rMV0scD1zW28rMl0seD1zW28rM107aWYoYT09PTApe3RbZSswXT1jLHRbZSsxXT1sLHRbZSsyXT11LHRbZSszXT1oO3JldHVybn1pZihhPT09MSl7dFtlKzBdPWYsdFtlKzFdPWQsdFtlKzJdPXAsdFtlKzNdPXg7cmV0dXJufWlmKGghPT14fHxjIT09Znx8bCE9PWR8fHUhPT1wKXtsZXQgZz0xLWE7Y29uc3QgbT1jKmYrbCpkK3UqcCtoKngsdj1tPj0wPzE6LTEseT0xLW0qbTtpZih5Pk51bWJlci5FUFNJTE9OKXtjb25zdCBTPU1hdGguc3FydCh5KSx3PU1hdGguYXRhbjIoUyxtKnYpO2c9TWF0aC5zaW4oZyp3KS9TLGE9TWF0aC5zaW4oYSp3KS9TfWNvbnN0IF89YSp2O2lmKGM9YypnK2YqXyxsPWwqZytkKl8sdT11KmcrcCpfLGg9aCpnK3gqXyxnPT09MS1hKXtjb25zdCBTPTEvTWF0aC5zcXJ0KGMqYytsKmwrdSp1K2gqaCk7Yyo9UyxsKj1TLHUqPVMsaCo9U319dFtlXT1jLHRbZSsxXT1sLHRbZSsyXT11LHRbZSszXT1ofXN0YXRpYyBtdWx0aXBseVF1YXRlcm5pb25zRmxhdCh0LGUsbixpLHMsbyl7Y29uc3QgYT1uW2ldLGM9bltpKzFdLGw9bltpKzJdLHU9bltpKzNdLGg9c1tvXSxmPXNbbysxXSxkPXNbbysyXSxwPXNbbyszXTtyZXR1cm4gdFtlXT1hKnArdSpoK2MqZC1sKmYsdFtlKzFdPWMqcCt1KmYrbCpoLWEqZCx0W2UrMl09bCpwK3UqZCthKmYtYypoLHRbZSszXT11KnAtYSpoLWMqZi1sKmQsdH1nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KHQpe3RoaXMuX3g9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeSh0KXt0aGlzLl95PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHoodCl7dGhpcy5fej10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgdygpe3JldHVybiB0aGlzLl93fXNldCB3KHQpe3RoaXMuX3c9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxuLGkpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PWksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fdyl9Y29weSh0KXtyZXR1cm4gdGhpcy5feD10LngsdGhpcy5feT10LnksdGhpcy5fej10LnosdGhpcy5fdz10LncsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUV1bGVyKHQsZT0hMCl7Y29uc3Qgbj10Ll94LGk9dC5feSxzPXQuX3osbz10Ll9vcmRlcixhPU1hdGguY29zLGM9TWF0aC5zaW4sbD1hKG4vMiksdT1hKGkvMiksaD1hKHMvMiksZj1jKG4vMiksZD1jKGkvMikscD1jKHMvMik7c3dpdGNoKG8pe2Nhc2UiWFlaIjp0aGlzLl94PWYqdSpoK2wqZCpwLHRoaXMuX3k9bCpkKmgtZip1KnAsdGhpcy5fej1sKnUqcCtmKmQqaCx0aGlzLl93PWwqdSpoLWYqZCpwO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PWYqdSpoK2wqZCpwLHRoaXMuX3k9bCpkKmgtZip1KnAsdGhpcy5fej1sKnUqcC1mKmQqaCx0aGlzLl93PWwqdSpoK2YqZCpwO2JyZWFrO2Nhc2UiWlhZIjp0aGlzLl94PWYqdSpoLWwqZCpwLHRoaXMuX3k9bCpkKmgrZip1KnAsdGhpcy5fej1sKnUqcCtmKmQqaCx0aGlzLl93PWwqdSpoLWYqZCpwO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl94PWYqdSpoLWwqZCpwLHRoaXMuX3k9bCpkKmgrZip1KnAsdGhpcy5fej1sKnUqcC1mKmQqaCx0aGlzLl93PWwqdSpoK2YqZCpwO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl94PWYqdSpoK2wqZCpwLHRoaXMuX3k9bCpkKmgrZip1KnAsdGhpcy5fej1sKnUqcC1mKmQqaCx0aGlzLl93PWwqdSpoLWYqZCpwO2JyZWFrO2Nhc2UiWFpZIjp0aGlzLl94PWYqdSpoLWwqZCpwLHRoaXMuX3k9bCpkKmgtZip1KnAsdGhpcy5fej1sKnUqcCtmKmQqaCx0aGlzLl93PWwqdSpoK2YqZCpwO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIitvKX1yZXR1cm4gZT09PSEwJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tQXhpc0FuZ2xlKHQsZSl7Y29uc3Qgbj1lLzIsaT1NYXRoLnNpbihuKTtyZXR1cm4gdGhpcy5feD10LngqaSx0aGlzLl95PXQueSppLHRoaXMuX3o9dC56KmksdGhpcy5fdz1NYXRoLmNvcyhuKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCl7Y29uc3QgZT10LmVsZW1lbnRzLG49ZVswXSxpPWVbNF0scz1lWzhdLG89ZVsxXSxhPWVbNV0sYz1lWzldLGw9ZVsyXSx1PWVbNl0saD1lWzEwXSxmPW4rYStoO2lmKGY+MCl7Y29uc3QgZD0uNS9NYXRoLnNxcnQoZisxKTt0aGlzLl93PS4yNS9kLHRoaXMuX3g9KHUtYykqZCx0aGlzLl95PShzLWwpKmQsdGhpcy5fej0oby1pKSpkfWVsc2UgaWYobj5hJiZuPmgpe2NvbnN0IGQ9MipNYXRoLnNxcnQoMStuLWEtaCk7dGhpcy5fdz0odS1jKS9kLHRoaXMuX3g9LjI1KmQsdGhpcy5feT0oaStvKS9kLHRoaXMuX3o9KHMrbCkvZH1lbHNlIGlmKGE+aCl7Y29uc3QgZD0yKk1hdGguc3FydCgxK2Etbi1oKTt0aGlzLl93PShzLWwpL2QsdGhpcy5feD0oaStvKS9kLHRoaXMuX3k9LjI1KmQsdGhpcy5fej0oYyt1KS9kfWVsc2V7Y29uc3QgZD0yKk1hdGguc3FydCgxK2gtbi1hKTt0aGlzLl93PShvLWkpL2QsdGhpcy5feD0ocytsKS9kLHRoaXMuX3k9KGMrdSkvZCx0aGlzLl96PS4yNSpkfXJldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tVW5pdFZlY3RvcnModCxlKXtsZXQgbj10LmRvdChlKSsxO3JldHVybiBuPE51bWJlci5FUFNJTE9OPyhuPTAsTWF0aC5hYnModC54KT5NYXRoLmFicyh0LnopPyh0aGlzLl94PS10LnksdGhpcy5feT10LngsdGhpcy5fej0wLHRoaXMuX3c9bik6KHRoaXMuX3g9MCx0aGlzLl95PS10LnosdGhpcy5fej10LnksdGhpcy5fdz1uKSk6KHRoaXMuX3g9dC55KmUuei10LnoqZS55LHRoaXMuX3k9dC56KmUueC10LngqZS56LHRoaXMuX3o9dC54KmUueS10LnkqZS54LHRoaXMuX3c9biksdGhpcy5ub3JtYWxpemUoKX1hbmdsZVRvKHQpe3JldHVybiAyKk1hdGguYWNvcyhNYXRoLmFicyhIdCh0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBuPXRoaXMuYW5nbGVUbyh0KTtpZihuPT09MClyZXR1cm4gdGhpcztjb25zdCBpPU1hdGgubWluKDEsZS9uKTtyZXR1cm4gdGhpcy5zbGVycCh0LGkpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdD09PTA/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBuPXQuX3gsaT10Ll95LHM9dC5feixvPXQuX3csYT1lLl94LGM9ZS5feSxsPWUuX3osdT1lLl93O3JldHVybiB0aGlzLl94PW4qdStvKmEraSpsLXMqYyx0aGlzLl95PWkqdStvKmMrcyphLW4qbCx0aGlzLl96PXMqdStvKmwrbipjLWkqYSx0aGlzLl93PW8qdS1uKmEtaSpjLXMqbCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKGU9PT0wKXJldHVybiB0aGlzO2lmKGU9PT0xKXJldHVybiB0aGlzLmNvcHkodCk7Y29uc3Qgbj10aGlzLl94LGk9dGhpcy5feSxzPXRoaXMuX3osbz10aGlzLl93O2xldCBhPW8qdC5fdytuKnQuX3graSp0Ll95K3MqdC5fejtpZihhPDA/KHRoaXMuX3c9LXQuX3csdGhpcy5feD0tdC5feCx0aGlzLl95PS10Ll95LHRoaXMuX3o9LXQuX3osYT0tYSk6dGhpcy5jb3B5KHQpLGE+PTEpcmV0dXJuIHRoaXMuX3c9byx0aGlzLl94PW4sdGhpcy5feT1pLHRoaXMuX3o9cyx0aGlzO2NvbnN0IGM9MS1hKmE7aWYoYzw9TnVtYmVyLkVQU0lMT04pe2NvbnN0IGQ9MS1lO3JldHVybiB0aGlzLl93PWQqbytlKnRoaXMuX3csdGhpcy5feD1kKm4rZSp0aGlzLl94LHRoaXMuX3k9ZCppK2UqdGhpcy5feSx0aGlzLl96PWQqcytlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzfWNvbnN0IGw9TWF0aC5zcXJ0KGMpLHU9TWF0aC5hdGFuMihsLGEpLGg9TWF0aC5zaW4oKDEtZSkqdSkvbCxmPU1hdGguc2luKGUqdSkvbDtyZXR1cm4gdGhpcy5fdz1vKmgrdGhpcy5fdypmLHRoaXMuX3g9bipoK3RoaXMuX3gqZix0aGlzLl95PWkqaCt0aGlzLl95KmYsdGhpcy5fej1zKmgrdGhpcy5feipmLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLG4pe3JldHVybiB0aGlzLmNvcHkodCkuc2xlcnAoZSxuKX1yYW5kb20oKXtjb25zdCB0PTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLGU9MipNYXRoLlBJKk1hdGgucmFuZG9tKCksbj1NYXRoLnJhbmRvbSgpLGk9TWF0aC5zcXJ0KDEtbikscz1NYXRoLnNxcnQobik7cmV0dXJuIHRoaXMuc2V0KGkqTWF0aC5zaW4odCksaSpNYXRoLmNvcyh0KSxzKk1hdGguc2luKGUpLHMqTWF0aC5jb3MoZSkpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5feD10W2VdLHRoaXMuX3k9dFtlKzFdLHRoaXMuX3o9dFtlKzJdLHRoaXMuX3c9dFtlKzNdLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLnRvQXJyYXkoKX1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX3d9fWNsYXNzIEl7Y29uc3RydWN0b3IodD0wLGU9MCxuPTApe0kucHJvdG90eXBlLmlzVmVjdG9yMz0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bn1zZXQodCxlLG4pe3JldHVybiBuPT09dm9pZCAwJiYobj10aGlzLnopLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXMuej10LnotZS56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXN9bXVsdGlwbHlWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngqZS54LHRoaXMueT10LnkqZS55LHRoaXMuej10LnoqZS56LHRoaXN9YXBwbHlFdWxlcih0KXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oUW0uc2V0RnJvbUV1bGVyKHQpKX1hcHBseUF4aXNBbmdsZSh0LGUpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihRbS5zZXRGcm9tQXhpc0FuZ2xlKHQsZSkpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxpPXRoaXMueixzPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1zWzBdKmUrc1szXSpuK3NbNl0qaSx0aGlzLnk9c1sxXSplK3NbNF0qbitzWzddKmksdGhpcy56PXNbMl0qZStzWzVdKm4rc1s4XSppLHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXgzKHQpLm5vcm1hbGl6ZSgpfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxpPXRoaXMueixzPXQuZWxlbWVudHMsbz0xLyhzWzNdKmUrc1s3XSpuK3NbMTFdKmkrc1sxNV0pO3JldHVybiB0aGlzLng9KHNbMF0qZStzWzRdKm4rc1s4XSppK3NbMTJdKSpvLHRoaXMueT0oc1sxXSplK3NbNV0qbitzWzldKmkrc1sxM10pKm8sdGhpcy56PShzWzJdKmUrc1s2XSpuK3NbMTBdKmkrc1sxNF0pKm8sdGhpc31hcHBseVF1YXRlcm5pb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnksaT10aGlzLnoscz10Lngsbz10LnksYT10LnosYz10LncsbD0yKihvKmktYSpuKSx1PTIqKGEqZS1zKmkpLGg9MioocypuLW8qZSk7cmV0dXJuIHRoaXMueD1lK2MqbCtvKmgtYSp1LHRoaXMueT1uK2MqdSthKmwtcypoLHRoaXMuej1pK2MqaCtzKnUtbypsLHRoaXN9cHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZEludmVyc2UpLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXgpfXVucHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpfXRyYW5zZm9ybURpcmVjdGlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxpPXRoaXMueixzPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1zWzBdKmUrc1s0XSpuK3NbOF0qaSx0aGlzLnk9c1sxXSplK3NbNV0qbitzWzldKmksdGhpcy56PXNbMl0qZStzWzZdKm4rc1sxMF0qaSx0aGlzLm5vcm1hbGl6ZSgpfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1IdCh0aGlzLngsdC54LGUueCksdGhpcy55PUh0KHRoaXMueSx0LnksZS55KSx0aGlzLno9SHQodGhpcy56LHQueixlLnopLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PUh0KHRoaXMueCx0LGUpLHRoaXMueT1IdCh0aGlzLnksdCxlKSx0aGlzLno9SHQodGhpcy56LHQsZSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoSHQobix0LGUpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzLno9TWF0aC50cnVuYyh0aGlzLnopLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXMuej0tdGhpcy56LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0LnkrdGhpcy56KnQuen1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMuen1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpK01hdGguYWJzKHRoaXMueil9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzfWNyb3NzKHQpe3JldHVybiB0aGlzLmNyb3NzVmVjdG9ycyh0aGlzLHQpfWNyb3NzVmVjdG9ycyh0LGUpe2NvbnN0IG49dC54LGk9dC55LHM9dC56LG89ZS54LGE9ZS55LGM9ZS56O3JldHVybiB0aGlzLng9aSpjLXMqYSx0aGlzLnk9cypvLW4qYyx0aGlzLno9biphLWkqbyx0aGlzfXByb2plY3RPblZlY3Rvcih0KXtjb25zdCBlPXQubGVuZ3RoU3EoKTtpZihlPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDApO2NvbnN0IG49dC5kb3QodGhpcykvZTtyZXR1cm4gdGhpcy5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKG4pfXByb2plY3RPblBsYW5lKHQpe3JldHVybiBhZi5jb3B5KHRoaXMpLnByb2plY3RPblZlY3Rvcih0KSx0aGlzLnN1YihhZil9cmVmbGVjdCh0KXtyZXR1cm4gdGhpcy5zdWIoYWYuY29weSh0KS5tdWx0aXBseVNjYWxhcigyKnRoaXMuZG90KHQpKSl9YW5nbGVUbyh0KXtjb25zdCBlPU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqdC5sZW5ndGhTcSgpKTtpZihlPT09MClyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QodCkvZTtyZXR1cm4gTWF0aC5hY29zKEh0KG4sLTEsMSkpfWRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVRvU3F1YXJlZCh0KXtjb25zdCBlPXRoaXMueC10Lngsbj10aGlzLnktdC55LGk9dGhpcy56LXQuejtyZXR1cm4gZSplK24qbitpKml9bWFuaGF0dGFuRGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5hYnModGhpcy54LXQueCkrTWF0aC5hYnModGhpcy55LXQueSkrTWF0aC5hYnModGhpcy56LXQueil9c2V0RnJvbVNwaGVyaWNhbCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQucmFkaXVzLHQucGhpLHQudGhldGEpfXNldEZyb21TcGhlcmljYWxDb29yZHModCxlLG4pe2NvbnN0IGk9TWF0aC5zaW4oZSkqdDtyZXR1cm4gdGhpcy54PWkqTWF0aC5zaW4obiksdGhpcy55PU1hdGguY29zKGUpKnQsdGhpcy56PWkqTWF0aC5jb3MobiksdGhpc31zZXRGcm9tQ3lsaW5kcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQucmFkaXVzLHQudGhldGEsdC55KX1zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHModCxlLG4pe3JldHVybiB0aGlzLng9dCpNYXRoLnNpbihlKSx0aGlzLnk9bix0aGlzLno9dCpNYXRoLmNvcyhlKSx0aGlzfXNldEZyb21NYXRyaXhQb3NpdGlvbih0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1lWzEyXSx0aGlzLnk9ZVsxM10sdGhpcy56PWVbMTRdLHRoaXN9c2V0RnJvbU1hdHJpeFNjYWxlKHQpe2NvbnN0IGU9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMCkubGVuZ3RoKCksbj10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwxKS5sZW5ndGgoKSxpPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDIpLmxlbmd0aCgpO3JldHVybiB0aGlzLng9ZSx0aGlzLnk9bix0aGlzLno9aSx0aGlzfXNldEZyb21NYXRyaXhDb2x1bW4odCxlKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cyxlKjQpfXNldEZyb21NYXRyaXgzQ29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsZSozKX1zZXRGcm9tRXVsZXIodCl7cmV0dXJuIHRoaXMueD10Ll94LHRoaXMueT10Ll95LHRoaXMuej10Ll96LHRoaXN9c2V0RnJvbUNvbG9yKHQpe3JldHVybiB0aGlzLng9dC5yLHRoaXMueT10LmcsdGhpcy56PXQuYix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnkmJnQuej09PXRoaXMuen1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpcy56PXQuZ2V0WihlKSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzLno9TWF0aC5yYW5kb20oKSx0aGlzfXJhbmRvbURpcmVjdGlvbigpe2NvbnN0IHQ9TWF0aC5yYW5kb20oKSpNYXRoLlBJKjIsZT1NYXRoLnJhbmRvbSgpKjItMSxuPU1hdGguc3FydCgxLWUqZSk7cmV0dXJuIHRoaXMueD1uKk1hdGguY29zKHQpLHRoaXMueT1lLHRoaXMuej1uKk1hdGguc2luKHQpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueSx5aWVsZCB0aGlzLnp9fWNvbnN0IGFmPW5ldyBJLFFtPW5ldyB5bjtjbGFzcyBsZXtjb25zdHJ1Y3Rvcih0PW5ldyBJKDEvMCwxLzAsMS8wKSxlPW5ldyBJKC0xLzAsLTEvMCwtMS8wKSl7dGhpcy5pc0JveDM9ITAsdGhpcy5taW49dCx0aGlzLm1heD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpc31zZXRGcm9tQXJyYXkodCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKz0zKXRoaXMuZXhwYW5kQnlQb2ludChpaS5mcm9tQXJyYXkodCxlKSk7cmV0dXJuIHRoaXN9c2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5jb3VudDtlPG47ZSsrKXRoaXMuZXhwYW5kQnlQb2ludChpaS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSkpO3JldHVybiB0aGlzfXNldEZyb21Qb2ludHModCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5leHBhbmRCeVBvaW50KHRbZV0pO3JldHVybiB0aGlzfXNldEZyb21DZW50ZXJBbmRTaXplKHQsZSl7Y29uc3Qgbj1paS5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKC41KTtyZXR1cm4gdGhpcy5taW4uY29weSh0KS5zdWIobiksdGhpcy5tYXguY29weSh0KS5hZGQobiksdGhpc31zZXRGcm9tT2JqZWN0KHQsZT0hMSl7cmV0dXJuIHRoaXMubWFrZUVtcHR5KCksdGhpcy5leHBhbmRCeU9iamVjdCh0LGUpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQubWluKSx0aGlzLm1heC5jb3B5KHQubWF4KSx0aGlzfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLm1pbi54PXRoaXMubWluLnk9dGhpcy5taW4uej0xLzAsdGhpcy5tYXgueD10aGlzLm1heC55PXRoaXMubWF4Lno9LTEvMCx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5tYXgueDx0aGlzLm1pbi54fHx0aGlzLm1heC55PHRoaXMubWluLnl8fHRoaXMubWF4Lno8dGhpcy5taW4uen1nZXRDZW50ZXIodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX1nZXRTaXplKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5zdWJWZWN0b3JzKHRoaXMubWF4LHRoaXMubWluKX1leHBhbmRCeVBvaW50KHQpe3JldHVybiB0aGlzLm1pbi5taW4odCksdGhpcy5tYXgubWF4KHQpLHRoaXN9ZXhwYW5kQnlWZWN0b3IodCl7cmV0dXJuIHRoaXMubWluLnN1Yih0KSx0aGlzLm1heC5hZGQodCksdGhpc31leHBhbmRCeVNjYWxhcih0KXtyZXR1cm4gdGhpcy5taW4uYWRkU2NhbGFyKC10KSx0aGlzLm1heC5hZGRTY2FsYXIodCksdGhpc31leHBhbmRCeU9iamVjdCh0LGU9ITEpe3QudXBkYXRlV29ybGRNYXRyaXgoITEsITEpO2NvbnN0IG49dC5nZW9tZXRyeTtpZihuIT09dm9pZCAwKXtjb25zdCBzPW4uZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKGU9PT0hMCYmcyE9PXZvaWQgMCYmdC5pc0luc3RhbmNlZE1lc2ghPT0hMClmb3IobGV0IG89MCxhPXMuY291bnQ7bzxhO28rKyl0LmlzTWVzaD09PSEwP3QuZ2V0VmVydGV4UG9zaXRpb24obyxpaSk6aWkuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLG8pLGlpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKSx0aGlzLmV4cGFuZEJ5UG9pbnQoaWkpO2Vsc2UgdC5ib3VuZGluZ0JveCE9PXZvaWQgMD8odC5ib3VuZGluZ0JveD09PW51bGwmJnQuY29tcHV0ZUJvdW5kaW5nQm94KCksS2MuY29weSh0LmJvdW5kaW5nQm94KSk6KG4uYm91bmRpbmdCb3g9PT1udWxsJiZuLmNvbXB1dGVCb3VuZGluZ0JveCgpLEtjLmNvcHkobi5ib3VuZGluZ0JveCkpLEtjLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKSx0aGlzLnVuaW9uKEtjKX1jb25zdCBpPXQuY2hpbGRyZW47Zm9yKGxldCBzPTAsbz1pLmxlbmd0aDtzPG87cysrKXRoaXMuZXhwYW5kQnlPYmplY3QoaVtzXSxlKTtyZXR1cm4gdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiB0Lng+PXRoaXMubWluLngmJnQueDw9dGhpcy5tYXgueCYmdC55Pj10aGlzLm1pbi55JiZ0Lnk8PXRoaXMubWF4LnkmJnQuej49dGhpcy5taW4ueiYmdC56PD10aGlzLm1heC56fWNvbnRhaW5zQm94KHQpe3JldHVybiB0aGlzLm1pbi54PD10Lm1pbi54JiZ0Lm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD10Lm1pbi55JiZ0Lm1heC55PD10aGlzLm1heC55JiZ0aGlzLm1pbi56PD10Lm1pbi56JiZ0Lm1heC56PD10aGlzLm1heC56fWdldFBhcmFtZXRlcih0LGUpe3JldHVybiBlLnNldCgodC54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLCh0LnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSksKHQuei10aGlzLm1pbi56KS8odGhpcy5tYXguei10aGlzLm1pbi56KSl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5tYXgueD49dGhpcy5taW4ueCYmdC5taW4ueDw9dGhpcy5tYXgueCYmdC5tYXgueT49dGhpcy5taW4ueSYmdC5taW4ueTw9dGhpcy5tYXgueSYmdC5tYXguej49dGhpcy5taW4ueiYmdC5taW4uejw9dGhpcy5tYXguen1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodC5jZW50ZXIsaWkpLGlpLmRpc3RhbmNlVG9TcXVhcmVkKHQuY2VudGVyKTw9dC5yYWRpdXMqdC5yYWRpdXN9aW50ZXJzZWN0c1BsYW5lKHQpe2xldCBlLG47cmV0dXJuIHQubm9ybWFsLng+MD8oZT10Lm5vcm1hbC54KnRoaXMubWluLngsbj10Lm5vcm1hbC54KnRoaXMubWF4LngpOihlPXQubm9ybWFsLngqdGhpcy5tYXgueCxuPXQubm9ybWFsLngqdGhpcy5taW4ueCksdC5ub3JtYWwueT4wPyhlKz10Lm5vcm1hbC55KnRoaXMubWluLnksbis9dC5ub3JtYWwueSp0aGlzLm1heC55KTooZSs9dC5ub3JtYWwueSp0aGlzLm1heC55LG4rPXQubm9ybWFsLnkqdGhpcy5taW4ueSksdC5ub3JtYWwuej4wPyhlKz10Lm5vcm1hbC56KnRoaXMubWluLnosbis9dC5ub3JtYWwueip0aGlzLm1heC56KTooZSs9dC5ub3JtYWwueip0aGlzLm1heC56LG4rPXQubm9ybWFsLnoqdGhpcy5taW4ueiksZTw9LXQuY29uc3RhbnQmJm4+PS10LmNvbnN0YW50fWludGVyc2VjdHNUcmlhbmdsZSh0KXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4hMTt0aGlzLmdldENlbnRlcihabyksamMuc3ViVmVjdG9ycyh0aGlzLm1heCxabyksVXMuc3ViVmVjdG9ycyh0LmEsWm8pLE5zLnN1YlZlY3RvcnModC5iLFpvKSxGcy5zdWJWZWN0b3JzKHQuYyxabyksY3Iuc3ViVmVjdG9ycyhOcyxVcyksbHIuc3ViVmVjdG9ycyhGcyxOcyksRnIuc3ViVmVjdG9ycyhVcyxGcyk7bGV0IGU9WzAsLWNyLnosY3IueSwwLC1sci56LGxyLnksMCwtRnIueixGci55LGNyLnosMCwtY3IueCxsci56LDAsLWxyLngsRnIueiwwLC1Gci54LC1jci55LGNyLngsMCwtbHIueSxsci54LDAsLUZyLnksRnIueCwwXTtyZXR1cm4hY2YoZSxVcyxOcyxGcyxqYyl8fChlPVsxLDAsMCwwLDEsMCwwLDAsMV0sIWNmKGUsVXMsTnMsRnMsamMpKT8hMTooUWMuY3Jvc3NWZWN0b3JzKGNyLGxyKSxlPVtRYy54LFFjLnksUWMuel0sY2YoZSxVcyxOcyxGcyxqYykpfWNsYW1wUG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHQpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KX1kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHRoaXMuY2xhbXBQb2ludCh0LGlpKS5kaXN0YW5jZVRvKHQpfWdldEJvdW5kaW5nU3BoZXJlKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90Lm1ha2VFbXB0eSgpOih0aGlzLmdldENlbnRlcih0LmNlbnRlciksdC5yYWRpdXM9dGhpcy5nZXRTaXplKGlpKS5sZW5ndGgoKSouNSksdH1pbnRlcnNlY3QodCl7cmV0dXJuIHRoaXMubWluLm1heCh0Lm1pbiksdGhpcy5tYXgubWluKHQubWF4KSx0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKSx0aGlzfXVuaW9uKHQpe3JldHVybiB0aGlzLm1pbi5taW4odC5taW4pLHRoaXMubWF4Lm1heCh0Lm1heCksdGhpc31hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3RoaXM6KE5pWzBdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLE5pWzFdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLE5pWzJdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLE5pWzNdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLE5pWzRdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLE5pWzVdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLE5pWzZdLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLE5pWzddLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0RnJvbVBvaW50cyhOaSksdGhpcyl9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLm1pbi5hZGQodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm1pbi5lcXVhbHModGhpcy5taW4pJiZ0Lm1heC5lcXVhbHModGhpcy5tYXgpfX1jb25zdCBOaT1bbmV3IEksbmV3IEksbmV3IEksbmV3IEksbmV3IEksbmV3IEksbmV3IEksbmV3IEldLGlpPW5ldyBJLEtjPW5ldyBsZSxVcz1uZXcgSSxOcz1uZXcgSSxGcz1uZXcgSSxjcj1uZXcgSSxscj1uZXcgSSxGcj1uZXcgSSxabz1uZXcgSSxqYz1uZXcgSSxRYz1uZXcgSSxCcj1uZXcgSTtmdW5jdGlvbiBjZihyLHQsZSxuLGkpe2ZvcihsZXQgcz0wLG89ci5sZW5ndGgtMztzPD1vO3MrPTMpe0JyLmZyb21BcnJheShyLHMpO2NvbnN0IGE9aS54Kk1hdGguYWJzKEJyLngpK2kueSpNYXRoLmFicyhCci55KStpLnoqTWF0aC5hYnMoQnIueiksYz10LmRvdChCciksbD1lLmRvdChCciksdT1uLmRvdChCcik7aWYoTWF0aC5tYXgoLU1hdGgubWF4KGMsbCx1KSxNYXRoLm1pbihjLGwsdSkpPmEpcmV0dXJuITF9cmV0dXJuITB9Y29uc3QgRk09bmV3IGxlLEpvPW5ldyBJLGxmPW5ldyBJO2NsYXNzIEdle2NvbnN0cnVjdG9yKHQ9bmV3IEksZT0tMSl7dGhpcy5pc1NwaGVyZT0hMCx0aGlzLmNlbnRlcj10LHRoaXMucmFkaXVzPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9ZSx0aGlzfXNldEZyb21Qb2ludHModCxlKXtjb25zdCBuPXRoaXMuY2VudGVyO2UhPT12b2lkIDA/bi5jb3B5KGUpOkZNLnNldEZyb21Qb2ludHModCkuZ2V0Q2VudGVyKG4pO2xldCBpPTA7Zm9yKGxldCBzPTAsbz10Lmxlbmd0aDtzPG87cysrKWk9TWF0aC5tYXgoaSxuLmRpc3RhbmNlVG9TcXVhcmVkKHRbc10pKTtyZXR1cm4gdGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGkpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMucmFkaXVzPDB9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMuY2VudGVyLnNldCgwLDAsMCksdGhpcy5yYWRpdXM9LTEsdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXN9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpLXRoaXMucmFkaXVzfWludGVyc2VjdHNTcGhlcmUodCl7Y29uc3QgZT10aGlzLnJhZGl1cyt0LnJhZGl1cztyZXR1cm4gdC5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD1lKmV9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzU3BoZXJlKHRoaXMpfWludGVyc2VjdHNQbGFuZSh0KXtyZXR1cm4gTWF0aC5hYnModC5kaXN0YW5jZVRvUG9pbnQodGhpcy5jZW50ZXIpKTw9dGhpcy5yYWRpdXN9Y2xhbXBQb2ludCh0LGUpe2NvbnN0IG49dGhpcy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodCk7cmV0dXJuIGUuY29weSh0KSxuPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzJiYoZS5zdWIodGhpcy5jZW50ZXIpLm5vcm1hbGl6ZSgpLGUubXVsdGlwbHlTY2FsYXIodGhpcy5yYWRpdXMpLmFkZCh0aGlzLmNlbnRlcikpLGV9Z2V0Qm91bmRpbmdCb3godCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpPyh0Lm1ha2VFbXB0eSgpLHQpOih0LnNldCh0aGlzLmNlbnRlcix0aGlzLmNlbnRlciksdC5leHBhbmRCeVNjYWxhcih0aGlzLnJhZGl1cyksdCl9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQodCksdGhpcy5yYWRpdXM9dGhpcy5yYWRpdXMqdC5nZXRNYXhTY2FsZU9uQXhpcygpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLmNlbnRlci5hZGQodCksdGhpc31leHBhbmRCeVBvaW50KHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzLmNlbnRlci5jb3B5KHQpLHRoaXMucmFkaXVzPTAsdGhpcztKby5zdWJWZWN0b3JzKHQsdGhpcy5jZW50ZXIpO2NvbnN0IGU9Sm8ubGVuZ3RoU3EoKTtpZihlPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzKXtjb25zdCBuPU1hdGguc3FydChlKSxpPShuLXRoaXMucmFkaXVzKSouNTt0aGlzLmNlbnRlci5hZGRTY2FsZWRWZWN0b3IoSm8saS9uKSx0aGlzLnJhZGl1cys9aX1yZXR1cm4gdGhpc311bmlvbih0KXtyZXR1cm4gdC5pc0VtcHR5KCk/dGhpczp0aGlzLmlzRW1wdHkoKT8odGhpcy5jb3B5KHQpLHRoaXMpOih0aGlzLmNlbnRlci5lcXVhbHModC5jZW50ZXIpPT09ITA/dGhpcy5yYWRpdXM9TWF0aC5tYXgodGhpcy5yYWRpdXMsdC5yYWRpdXMpOihsZi5zdWJWZWN0b3JzKHQuY2VudGVyLHRoaXMuY2VudGVyKS5zZXRMZW5ndGgodC5yYWRpdXMpLHRoaXMuZXhwYW5kQnlQb2ludChKby5jb3B5KHQuY2VudGVyKS5hZGQobGYpKSx0aGlzLmV4cGFuZEJ5UG9pbnQoSm8uY29weSh0LmNlbnRlcikuc3ViKGxmKSkpLHRoaXMpfWVxdWFscyh0KXtyZXR1cm4gdC5jZW50ZXIuZXF1YWxzKHRoaXMuY2VudGVyKSYmdC5yYWRpdXM9PT10aGlzLnJhZGl1c31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNvbnN0IEZpPW5ldyBJLHVmPW5ldyBJLHRsPW5ldyBJLHVyPW5ldyBJLGhmPW5ldyBJLGVsPW5ldyBJLGZmPW5ldyBJO2NsYXNzIGhye2NvbnN0cnVjdG9yKHQ9bmV3IEksZT1uZXcgSSgwLDAsLTEpKXt0aGlzLm9yaWdpbj10LHRoaXMuZGlyZWN0aW9uPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodCksdGhpcy5kaXJlY3Rpb24uY29weShlKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodC5vcmlnaW4pLHRoaXMuZGlyZWN0aW9uLmNvcHkodC5kaXJlY3Rpb24pLHRoaXN9YXQodCxlKXtyZXR1cm4gZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sdCl9bG9va0F0KHQpe3JldHVybiB0aGlzLmRpcmVjdGlvbi5jb3B5KHQpLnN1Yih0aGlzLm9yaWdpbikubm9ybWFsaXplKCksdGhpc31yZWNhc3QodCl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodGhpcy5hdCh0LEZpKSksdGhpc31jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSl7ZS5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pO2NvbnN0IG49ZS5kb3QodGhpcy5kaXJlY3Rpb24pO3JldHVybiBuPDA/ZS5jb3B5KHRoaXMub3JpZ2luKTplLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbixuKX1kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlU3FUb1BvaW50KHQpKX1kaXN0YW5jZVNxVG9Qb2ludCh0KXtjb25zdCBlPUZpLnN1YlZlY3RvcnModCx0aGlzLm9yaWdpbikuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gZTwwP3RoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKHQpOihGaS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sZSksRmkuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlU3FUb1NlZ21lbnQodCxlLG4saSl7dWYuY29weSh0KS5hZGQoZSkubXVsdGlwbHlTY2FsYXIoLjUpLHRsLmNvcHkoZSkuc3ViKHQpLm5vcm1hbGl6ZSgpLHVyLmNvcHkodGhpcy5vcmlnaW4pLnN1Yih1Zik7Y29uc3Qgcz10LmRpc3RhbmNlVG8oZSkqLjUsbz0tdGhpcy5kaXJlY3Rpb24uZG90KHRsKSxhPXVyLmRvdCh0aGlzLmRpcmVjdGlvbiksYz0tdXIuZG90KHRsKSxsPXVyLmxlbmd0aFNxKCksdT1NYXRoLmFicygxLW8qbyk7bGV0IGgsZixkLHA7aWYodT4wKWlmKGg9bypjLWEsZj1vKmEtYyxwPXMqdSxoPj0wKWlmKGY+PS1wKWlmKGY8PXApe2NvbnN0IHg9MS91O2gqPXgsZio9eCxkPWgqKGgrbypmKzIqYSkrZioobypoK2YrMipjKStsfWVsc2UgZj1zLGg9TWF0aC5tYXgoMCwtKG8qZithKSksZD0taCpoK2YqKGYrMipjKStsO2Vsc2UgZj0tcyxoPU1hdGgubWF4KDAsLShvKmYrYSkpLGQ9LWgqaCtmKihmKzIqYykrbDtlbHNlIGY8PS1wPyhoPU1hdGgubWF4KDAsLSgtbypzK2EpKSxmPWg+MD8tczpNYXRoLm1pbihNYXRoLm1heCgtcywtYykscyksZD0taCpoK2YqKGYrMipjKStsKTpmPD1wPyhoPTAsZj1NYXRoLm1pbihNYXRoLm1heCgtcywtYykscyksZD1mKihmKzIqYykrbCk6KGg9TWF0aC5tYXgoMCwtKG8qcythKSksZj1oPjA/czpNYXRoLm1pbihNYXRoLm1heCgtcywtYykscyksZD0taCpoK2YqKGYrMipjKStsKTtlbHNlIGY9bz4wPy1zOnMsaD1NYXRoLm1heCgwLC0obypmK2EpKSxkPS1oKmgrZiooZisyKmMpK2w7cmV0dXJuIG4mJm4uY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLGgpLGkmJmkuY29weSh1ZikuYWRkU2NhbGVkVmVjdG9yKHRsLGYpLGR9aW50ZXJzZWN0U3BoZXJlKHQsZSl7Rmkuc3ViVmVjdG9ycyh0LmNlbnRlcix0aGlzLm9yaWdpbik7Y29uc3Qgbj1GaS5kb3QodGhpcy5kaXJlY3Rpb24pLGk9RmkuZG90KEZpKS1uKm4scz10LnJhZGl1cyp0LnJhZGl1cztpZihpPnMpcmV0dXJuIG51bGw7Y29uc3Qgbz1NYXRoLnNxcnQocy1pKSxhPW4tbyxjPW4rbztyZXR1cm4gYzwwP251bGw6YTwwP3RoaXMuYXQoYyxlKTp0aGlzLmF0KGEsZSl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWRpc3RhbmNlVG9QbGFuZSh0KXtjb25zdCBlPXQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbik7aWYoZT09PTApcmV0dXJuIHQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKT09PTA/MDpudWxsO2NvbnN0IG49LSh0aGlzLm9yaWdpbi5kb3QodC5ub3JtYWwpK3QuY29uc3RhbnQpL2U7cmV0dXJuIG4+PTA/bjpudWxsfWludGVyc2VjdFBsYW5lKHQsZSl7Y29uc3Qgbj10aGlzLmRpc3RhbmNlVG9QbGFuZSh0KTtyZXR1cm4gbj09PW51bGw/bnVsbDp0aGlzLmF0KG4sZSl9aW50ZXJzZWN0c1BsYW5lKHQpe2NvbnN0IGU9dC5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pO3JldHVybiBlPT09MHx8dC5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKSplPDB9aW50ZXJzZWN0Qm94KHQsZSl7bGV0IG4saSxzLG8sYSxjO2NvbnN0IGw9MS90aGlzLmRpcmVjdGlvbi54LHU9MS90aGlzLmRpcmVjdGlvbi55LGg9MS90aGlzLmRpcmVjdGlvbi56LGY9dGhpcy5vcmlnaW47cmV0dXJuIGw+PTA/KG49KHQubWluLngtZi54KSpsLGk9KHQubWF4LngtZi54KSpsKToobj0odC5tYXgueC1mLngpKmwsaT0odC5taW4ueC1mLngpKmwpLHU+PTA/KHM9KHQubWluLnktZi55KSp1LG89KHQubWF4LnktZi55KSp1KToocz0odC5tYXgueS1mLnkpKnUsbz0odC5taW4ueS1mLnkpKnUpLG4+b3x8cz5pfHwoKHM+bnx8aXNOYU4obikpJiYobj1zKSwobzxpfHxpc05hTihpKSkmJihpPW8pLGg+PTA/KGE9KHQubWluLnotZi56KSpoLGM9KHQubWF4LnotZi56KSpoKTooYT0odC5tYXguei1mLnopKmgsYz0odC5taW4uei1mLnopKmgpLG4+Y3x8YT5pKXx8KChhPm58fG4hPT1uKSYmKG49YSksKGM8aXx8aSE9PWkpJiYoaT1jKSxpPDApP251bGw6dGhpcy5hdChuPj0wP246aSxlKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0aGlzLmludGVyc2VjdEJveCh0LEZpKSE9PW51bGx9aW50ZXJzZWN0VHJpYW5nbGUodCxlLG4saSxzKXtoZi5zdWJWZWN0b3JzKGUsdCksZWwuc3ViVmVjdG9ycyhuLHQpLGZmLmNyb3NzVmVjdG9ycyhoZixlbCk7bGV0IG89dGhpcy5kaXJlY3Rpb24uZG90KGZmKSxhO2lmKG8+MCl7aWYoaSlyZXR1cm4gbnVsbDthPTF9ZWxzZSBpZihvPDApYT0tMSxvPS1vO2Vsc2UgcmV0dXJuIG51bGw7dXIuc3ViVmVjdG9ycyh0aGlzLm9yaWdpbix0KTtjb25zdCBjPWEqdGhpcy5kaXJlY3Rpb24uZG90KGVsLmNyb3NzVmVjdG9ycyh1cixlbCkpO2lmKGM8MClyZXR1cm4gbnVsbDtjb25zdCBsPWEqdGhpcy5kaXJlY3Rpb24uZG90KGhmLmNyb3NzKHVyKSk7aWYobDwwfHxjK2w+bylyZXR1cm4gbnVsbDtjb25zdCB1PS1hKnVyLmRvdChmZik7cmV0dXJuIHU8MD9udWxsOnRoaXMuYXQodS9vLHMpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KHQpLHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmdC5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNsYXNzIEN0e2NvbnN0cnVjdG9yKHQsZSxuLGkscyxvLGEsYyxsLHUsaCxmLGQscCx4LGcpe0N0LnByb3RvdHlwZS5pc01hdHJpeDQ9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV0sdCE9PXZvaWQgMCYmdGhpcy5zZXQodCxlLG4saSxzLG8sYSxjLGwsdSxoLGYsZCxwLHgsZyl9c2V0KHQsZSxuLGkscyxvLGEsYyxsLHUsaCxmLGQscCx4LGcpe2NvbnN0IG09dGhpcy5lbGVtZW50cztyZXR1cm4gbVswXT10LG1bNF09ZSxtWzhdPW4sbVsxMl09aSxtWzFdPXMsbVs1XT1vLG1bOV09YSxtWzEzXT1jLG1bMl09bCxtWzZdPXUsbVsxMF09aCxtWzE0XT1mLG1bM109ZCxtWzddPXAsbVsxMV09eCxtWzE1XT1nLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgQ3QoKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSxlWzldPW5bOV0sZVsxMF09blsxMF0sZVsxMV09blsxMV0sZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sZVsxNV09blsxNV0sdGhpc31jb3B5UG9zaXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sdGhpc31zZXRGcm9tTWF0cml4Myh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVszXSxlWzZdLDAsZVsxXSxlWzRdLGVbN10sMCxlWzJdLGVbNV0sZVs4XSwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMSksbi5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMiksdGhpc31tYWtlQmFzaXModCxlLG4pe3JldHVybiB0aGlzLnNldCh0LngsZS54LG4ueCwwLHQueSxlLnksbi55LDAsdC56LGUueixuLnosMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RSb3RhdGlvbih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzLGk9MS9Ccy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMCkubGVuZ3RoKCkscz0xL0JzLnNldEZyb21NYXRyaXhDb2x1bW4odCwxKS5sZW5ndGgoKSxvPTEvQnMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDIpLmxlbmd0aCgpO3JldHVybiBlWzBdPW5bMF0qaSxlWzFdPW5bMV0qaSxlWzJdPW5bMl0qaSxlWzNdPTAsZVs0XT1uWzRdKnMsZVs1XT1uWzVdKnMsZVs2XT1uWzZdKnMsZVs3XT0wLGVbOF09bls4XSpvLGVbOV09bls5XSpvLGVbMTBdPW5bMTBdKm8sZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbUV1bGVyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQueCxpPXQueSxzPXQueixvPU1hdGguY29zKG4pLGE9TWF0aC5zaW4obiksYz1NYXRoLmNvcyhpKSxsPU1hdGguc2luKGkpLHU9TWF0aC5jb3MocyksaD1NYXRoLnNpbihzKTtpZih0Lm9yZGVyPT09IlhZWiIpe2NvbnN0IGY9byp1LGQ9bypoLHA9YSp1LHg9YSpoO2VbMF09Yyp1LGVbNF09LWMqaCxlWzhdPWwsZVsxXT1kK3AqbCxlWzVdPWYteCpsLGVbOV09LWEqYyxlWzJdPXgtZipsLGVbNl09cCtkKmwsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJZWFoiKXtjb25zdCBmPWMqdSxkPWMqaCxwPWwqdSx4PWwqaDtlWzBdPWYreCphLGVbNF09cCphLWQsZVs4XT1vKmwsZVsxXT1vKmgsZVs1XT1vKnUsZVs5XT0tYSxlWzJdPWQqYS1wLGVbNl09eCtmKmEsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJaWFkiKXtjb25zdCBmPWMqdSxkPWMqaCxwPWwqdSx4PWwqaDtlWzBdPWYteCphLGVbNF09LW8qaCxlWzhdPXArZCphLGVbMV09ZCtwKmEsZVs1XT1vKnUsZVs5XT14LWYqYSxlWzJdPS1vKmwsZVs2XT1hLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWllYIil7Y29uc3QgZj1vKnUsZD1vKmgscD1hKnUseD1hKmg7ZVswXT1jKnUsZVs0XT1wKmwtZCxlWzhdPWYqbCt4LGVbMV09YypoLGVbNV09eCpsK2YsZVs5XT1kKmwtcCxlWzJdPS1sLGVbNl09YSpjLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWVpYIil7Y29uc3QgZj1vKmMsZD1vKmwscD1hKmMseD1hKmw7ZVswXT1jKnUsZVs0XT14LWYqaCxlWzhdPXAqaCtkLGVbMV09aCxlWzVdPW8qdSxlWzldPS1hKnUsZVsyXT0tbCp1LGVbNl09ZCpoK3AsZVsxMF09Zi14Kmh9ZWxzZSBpZih0Lm9yZGVyPT09IlhaWSIpe2NvbnN0IGY9bypjLGQ9bypsLHA9YSpjLHg9YSpsO2VbMF09Yyp1LGVbNF09LWgsZVs4XT1sKnUsZVsxXT1mKmgreCxlWzVdPW8qdSxlWzldPWQqaC1wLGVbMl09cCpoLWQsZVs2XT1hKnUsZVsxMF09eCpoK2Z9cmV0dXJuIGVbM109MCxlWzddPTAsZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMuY29tcG9zZShCTSx0LE9NKX1sb29rQXQodCxlLG4pe2NvbnN0IGk9dGhpcy5lbGVtZW50cztyZXR1cm4gRG4uc3ViVmVjdG9ycyh0LGUpLERuLmxlbmd0aFNxKCk9PT0wJiYoRG4uej0xKSxEbi5ub3JtYWxpemUoKSxmci5jcm9zc1ZlY3RvcnMobixEbiksZnIubGVuZ3RoU3EoKT09PTAmJihNYXRoLmFicyhuLnopPT09MT9Ebi54Kz0xZS00OkRuLnorPTFlLTQsRG4ubm9ybWFsaXplKCksZnIuY3Jvc3NWZWN0b3JzKG4sRG4pKSxmci5ub3JtYWxpemUoKSxubC5jcm9zc1ZlY3RvcnMoRG4sZnIpLGlbMF09ZnIueCxpWzRdPW5sLngsaVs4XT1Ebi54LGlbMV09ZnIueSxpWzVdPW5sLnksaVs5XT1Ebi55LGlbMl09ZnIueixpWzZdPW5sLnosaVsxMF09RG4ueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxpPWUuZWxlbWVudHMscz10aGlzLmVsZW1lbnRzLG89blswXSxhPW5bNF0sYz1uWzhdLGw9blsxMl0sdT1uWzFdLGg9bls1XSxmPW5bOV0sZD1uWzEzXSxwPW5bMl0seD1uWzZdLGc9blsxMF0sbT1uWzE0XSx2PW5bM10seT1uWzddLF89blsxMV0sUz1uWzE1XSx3PWlbMF0sQT1pWzRdLFQ9aVs4XSxiPWlbMTJdLE09aVsxXSxFPWlbNV0sRD1pWzldLEw9aVsxM10sRj1pWzJdLE49aVs2XSxPPWlbMTBdLEg9aVsxNF0sej1pWzNdLFE9aVs3XSxzdD1pWzExXSxmdD1pWzE1XTtyZXR1cm4gc1swXT1vKncrYSpNK2MqRitsKnosc1s0XT1vKkErYSpFK2MqTitsKlEsc1s4XT1vKlQrYSpEK2MqTytsKnN0LHNbMTJdPW8qYithKkwrYypIK2wqZnQsc1sxXT11KncraCpNK2YqRitkKnosc1s1XT11KkEraCpFK2YqTitkKlEsc1s5XT11KlQraCpEK2YqTytkKnN0LHNbMTNdPXUqYitoKkwrZipIK2QqZnQsc1syXT1wKncreCpNK2cqRittKnosc1s2XT1wKkEreCpFK2cqTittKlEsc1sxMF09cCpUK3gqRCtnKk8rbSpzdCxzWzE0XT1wKmIreCpMK2cqSCttKmZ0LHNbM109dip3K3kqTStfKkYrUyp6LHNbN109dipBK3kqRStfKk4rUypRLHNbMTFdPXYqVCt5KkQrXypPK1Mqc3Qsc1sxNV09dipiK3kqTCtfKkgrUypmdCx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzRdKj10LGVbOF0qPXQsZVsxMl0qPXQsZVsxXSo9dCxlWzVdKj10LGVbOV0qPXQsZVsxM10qPXQsZVsyXSo9dCxlWzZdKj10LGVbMTBdKj10LGVbMTRdKj10LGVbM10qPXQsZVs3XSo9dCxlWzExXSo9dCxlWzE1XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbNF0saT10WzhdLHM9dFsxMl0sbz10WzFdLGE9dFs1XSxjPXRbOV0sbD10WzEzXSx1PXRbMl0saD10WzZdLGY9dFsxMF0sZD10WzE0XSxwPXRbM10seD10WzddLGc9dFsxMV0sbT10WzE1XTtyZXR1cm4gcCooK3MqYypoLWkqbCpoLXMqYSpmK24qbCpmK2kqYSpkLW4qYypkKSt4KigrZSpjKmQtZSpsKmYrcypvKmYtaSpvKmQraSpsKnUtcypjKnUpK2cqKCtlKmwqaC1lKmEqZC1zKm8qaCtuKm8qZCtzKmEqdS1uKmwqdSkrbSooLWkqYSp1LWUqYypoK2UqYSpmK2kqbypoLW4qbypmK24qYyp1KX10cmFuc3Bvc2UoKXtjb25zdCB0PXRoaXMuZWxlbWVudHM7bGV0IGU7cmV0dXJuIGU9dFsxXSx0WzFdPXRbNF0sdFs0XT1lLGU9dFsyXSx0WzJdPXRbOF0sdFs4XT1lLGU9dFs2XSx0WzZdPXRbOV0sdFs5XT1lLGU9dFszXSx0WzNdPXRbMTJdLHRbMTJdPWUsZT10WzddLHRbN109dFsxM10sdFsxM109ZSxlPXRbMTFdLHRbMTFdPXRbMTRdLHRbMTRdPWUsdGhpc31zZXRQb3NpdGlvbih0LGUsbil7Y29uc3QgaT10aGlzLmVsZW1lbnRzO3JldHVybiB0LmlzVmVjdG9yMz8oaVsxMl09dC54LGlbMTNdPXQueSxpWzE0XT10LnopOihpWzEyXT10LGlbMTNdPWUsaVsxNF09biksdGhpc31pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxpPXRbMl0scz10WzNdLG89dFs0XSxhPXRbNV0sYz10WzZdLGw9dFs3XSx1PXRbOF0saD10WzldLGY9dFsxMF0sZD10WzExXSxwPXRbMTJdLHg9dFsxM10sZz10WzE0XSxtPXRbMTVdLHY9aCpnKmwteCpmKmwreCpjKmQtYSpnKmQtaCpjKm0rYSpmKm0seT1wKmYqbC11KmcqbC1wKmMqZCtvKmcqZCt1KmMqbS1vKmYqbSxfPXUqeCpsLXAqaCpsK3AqYSpkLW8qeCpkLXUqYSptK28qaCptLFM9cCpoKmMtdSp4KmMtcCphKmYrbyp4KmYrdSphKmctbypoKmcsdz1lKnYrbip5K2kqXytzKlM7aWYodz09PTApcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IEE9MS93O3JldHVybiB0WzBdPXYqQSx0WzFdPSh4KmYqcy1oKmcqcy14KmkqZCtuKmcqZCtoKmkqbS1uKmYqbSkqQSx0WzJdPShhKmcqcy14KmMqcyt4KmkqbC1uKmcqbC1hKmkqbStuKmMqbSkqQSx0WzNdPShoKmMqcy1hKmYqcy1oKmkqbCtuKmYqbCthKmkqZC1uKmMqZCkqQSx0WzRdPXkqQSx0WzVdPSh1Kmcqcy1wKmYqcytwKmkqZC1lKmcqZC11KmkqbStlKmYqbSkqQSx0WzZdPShwKmMqcy1vKmcqcy1wKmkqbCtlKmcqbCtvKmkqbS1lKmMqbSkqQSx0WzddPShvKmYqcy11KmMqcyt1KmkqbC1lKmYqbC1vKmkqZCtlKmMqZCkqQSx0WzhdPV8qQSx0WzldPShwKmgqcy11Kngqcy1wKm4qZCtlKngqZCt1Km4qbS1lKmgqbSkqQSx0WzEwXT0obyp4KnMtcCphKnMrcCpuKmwtZSp4KmwtbypuKm0rZSphKm0pKkEsdFsxMV09KHUqYSpzLW8qaCpzLXUqbipsK2UqaCpsK28qbipkLWUqYSpkKSpBLHRbMTJdPVMqQSx0WzEzXT0odSp4KmktcCpoKmkrcCpuKmYtZSp4KmYtdSpuKmcrZSpoKmcpKkEsdFsxNF09KHAqYSppLW8qeCppLXAqbipjK2UqeCpjK28qbipnLWUqYSpnKSpBLHRbMTVdPShvKmgqaS11KmEqaSt1Km4qYy1lKmgqYy1vKm4qZitlKmEqZikqQSx0aGlzfXNjYWxlKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQueCxpPXQueSxzPXQuejtyZXR1cm4gZVswXSo9bixlWzRdKj1pLGVbOF0qPXMsZVsxXSo9bixlWzVdKj1pLGVbOV0qPXMsZVsyXSo9bixlWzZdKj1pLGVbMTBdKj1zLGVbM10qPW4sZVs3XSo9aSxlWzExXSo9cyx0aGlzfWdldE1heFNjYWxlT25BeGlzKCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSp0WzBdK3RbMV0qdFsxXSt0WzJdKnRbMl0sbj10WzRdKnRbNF0rdFs1XSp0WzVdK3RbNl0qdFs2XSxpPXRbOF0qdFs4XSt0WzldKnRbOV0rdFsxMF0qdFsxMF07cmV0dXJuIE1hdGguc3FydChNYXRoLm1heChlLG4saSkpfW1ha2VUcmFuc2xhdGlvbih0LGUsbil7cmV0dXJuIHQuaXNWZWN0b3IzP3RoaXMuc2V0KDEsMCwwLHQueCwwLDEsMCx0LnksMCwwLDEsdC56LDAsMCwwLDEpOnRoaXMuc2V0KDEsMCwwLHQsMCwxLDAsZSwwLDAsMSxuLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWCh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCxlLC1uLDAsMCxuLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvblkodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLDAsbiwwLDAsMSwwLDAsLW4sMCxlLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25aKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwtbiwwLDAsbixlLDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uQXhpcyh0LGUpe2NvbnN0IG49TWF0aC5jb3MoZSksaT1NYXRoLnNpbihlKSxzPTEtbixvPXQueCxhPXQueSxjPXQueixsPXMqbyx1PXMqYTtyZXR1cm4gdGhpcy5zZXQobCpvK24sbCphLWkqYyxsKmMraSphLDAsbCphK2kqYyx1KmErbix1KmMtaSpvLDAsbCpjLWkqYSx1KmMraSpvLHMqYypjK24sMCwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZSh0LGUsbil7cmV0dXJuIHRoaXMuc2V0KHQsMCwwLDAsMCxlLDAsMCwwLDAsbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNoZWFyKHQsZSxuLGkscyxvKXtyZXR1cm4gdGhpcy5zZXQoMSxuLHMsMCx0LDEsbywwLGUsaSwxLDAsMCwwLDAsMSksdGhpc31jb21wb3NlKHQsZSxuKXtjb25zdCBpPXRoaXMuZWxlbWVudHMscz1lLl94LG89ZS5feSxhPWUuX3osYz1lLl93LGw9cytzLHU9bytvLGg9YSthLGY9cypsLGQ9cyp1LHA9cypoLHg9byp1LGc9bypoLG09YSpoLHY9YypsLHk9Yyp1LF89YypoLFM9bi54LHc9bi55LEE9bi56O3JldHVybiBpWzBdPSgxLSh4K20pKSpTLGlbMV09KGQrXykqUyxpWzJdPShwLXkpKlMsaVszXT0wLGlbNF09KGQtXykqdyxpWzVdPSgxLShmK20pKSp3LGlbNl09KGcrdikqdyxpWzddPTAsaVs4XT0ocCt5KSpBLGlbOV09KGctdikqQSxpWzEwXT0oMS0oZit4KSkqQSxpWzExXT0wLGlbMTJdPXQueCxpWzEzXT10LnksaVsxNF09dC56LGlbMTVdPTEsdGhpc31kZWNvbXBvc2UodCxlLG4pe2NvbnN0IGk9dGhpcy5lbGVtZW50cztsZXQgcz1Ccy5zZXQoaVswXSxpWzFdLGlbMl0pLmxlbmd0aCgpO2NvbnN0IG89QnMuc2V0KGlbNF0saVs1XSxpWzZdKS5sZW5ndGgoKSxhPUJzLnNldChpWzhdLGlbOV0saVsxMF0pLmxlbmd0aCgpO3RoaXMuZGV0ZXJtaW5hbnQoKTwwJiYocz0tcyksdC54PWlbMTJdLHQueT1pWzEzXSx0Lno9aVsxNF0scmkuY29weSh0aGlzKTtjb25zdCBsPTEvcyx1PTEvbyxoPTEvYTtyZXR1cm4gcmkuZWxlbWVudHNbMF0qPWwscmkuZWxlbWVudHNbMV0qPWwscmkuZWxlbWVudHNbMl0qPWwscmkuZWxlbWVudHNbNF0qPXUscmkuZWxlbWVudHNbNV0qPXUscmkuZWxlbWVudHNbNl0qPXUscmkuZWxlbWVudHNbOF0qPWgscmkuZWxlbWVudHNbOV0qPWgscmkuZWxlbWVudHNbMTBdKj1oLGUuc2V0RnJvbVJvdGF0aW9uTWF0cml4KHJpKSxuLng9cyxuLnk9byxuLno9YSx0aGlzfW1ha2VQZXJzcGVjdGl2ZSh0LGUsbixpLHMsbyxhPUhuKXtjb25zdCBjPXRoaXMuZWxlbWVudHMsbD0yKnMvKGUtdCksdT0yKnMvKG4taSksaD0oZSt0KS8oZS10KSxmPShuK2kpLyhuLWkpO2xldCBkLHA7aWYoYT09PUhuKWQ9LShvK3MpLyhvLXMpLHA9LTIqbypzLyhvLXMpO2Vsc2UgaWYoYT09PVhvKWQ9LW8vKG8tcykscD0tbypzLyhvLXMpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VQZXJzcGVjdGl2ZSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2EpO3JldHVybiBjWzBdPWwsY1s0XT0wLGNbOF09aCxjWzEyXT0wLGNbMV09MCxjWzVdPXUsY1s5XT1mLGNbMTNdPTAsY1syXT0wLGNbNl09MCxjWzEwXT1kLGNbMTRdPXAsY1szXT0wLGNbN109MCxjWzExXT0tMSxjWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyh0LGUsbixpLHMsbyxhPUhuKXtjb25zdCBjPXRoaXMuZWxlbWVudHMsbD0xLyhlLXQpLHU9MS8obi1pKSxoPTEvKG8tcyksZj0oZSt0KSpsLGQ9KG4raSkqdTtsZXQgcCx4O2lmKGE9PT1IbilwPShvK3MpKmgseD0tMipoO2Vsc2UgaWYoYT09PVhvKXA9cypoLHg9LTEqaDtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuTWF0cml4NC5tYWtlT3J0aG9ncmFwaGljKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrYSk7cmV0dXJuIGNbMF09MipsLGNbNF09MCxjWzhdPTAsY1sxMl09LWYsY1sxXT0wLGNbNV09Mip1LGNbOV09MCxjWzEzXT0tZCxjWzJdPTAsY1s2XT0wLGNbMTBdPXgsY1sxNF09LXAsY1szXT0wLGNbN109MCxjWzExXT0wLGNbMTVdPTEsdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztmb3IobGV0IGk9MDtpPDE2O2krKylpZihlW2ldIT09bltpXSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgbj0wO248MTY7bisrKXRoaXMuZWxlbWVudHNbbl09dFtuK2VdO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gdFtlXT1uWzBdLHRbZSsxXT1uWzFdLHRbZSsyXT1uWzJdLHRbZSszXT1uWzNdLHRbZSs0XT1uWzRdLHRbZSs1XT1uWzVdLHRbZSs2XT1uWzZdLHRbZSs3XT1uWzddLHRbZSs4XT1uWzhdLHRbZSs5XT1uWzldLHRbZSsxMF09blsxMF0sdFtlKzExXT1uWzExXSx0W2UrMTJdPW5bMTJdLHRbZSsxM109blsxM10sdFtlKzE0XT1uWzE0XSx0W2UrMTVdPW5bMTVdLHR9fWNvbnN0IEJzPW5ldyBJLHJpPW5ldyBDdCxCTT1uZXcgSSgwLDAsMCksT009bmV3IEkoMSwxLDEpLGZyPW5ldyBJLG5sPW5ldyBJLERuPW5ldyBJLHRnPW5ldyBDdCxlZz1uZXcgeW47Y2xhc3MgVW57Y29uc3RydWN0b3IodD0wLGU9MCxuPTAsaT1Vbi5ERUZBVUxUX09SREVSKXt0aGlzLmlzRXVsZXI9ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fb3JkZXI9aX1nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KHQpe3RoaXMuX3g9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeSh0KXt0aGlzLl95PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHoodCl7dGhpcy5fej10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgb3JkZXIoKXtyZXR1cm4gdGhpcy5fb3JkZXJ9c2V0IG9yZGVyKHQpe3RoaXMuX29yZGVyPXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsbixpPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fb3JkZXI9aSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9Y29weSh0KXtyZXR1cm4gdGhpcy5feD10Ll94LHRoaXMuX3k9dC5feSx0aGlzLl96PXQuX3osdGhpcy5fb3JkZXI9dC5fb3JkZXIsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQsZT10aGlzLl9vcmRlcixuPSEwKXtjb25zdCBpPXQuZWxlbWVudHMscz1pWzBdLG89aVs0XSxhPWlbOF0sYz1pWzFdLGw9aVs1XSx1PWlbOV0saD1pWzJdLGY9aVs2XSxkPWlbMTBdO3N3aXRjaChlKXtjYXNlIlhZWiI6dGhpcy5feT1NYXRoLmFzaW4oSHQoYSwtMSwxKSksTWF0aC5hYnMoYSk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtdSxkKSx0aGlzLl96PU1hdGguYXRhbjIoLW8scykpOih0aGlzLl94PU1hdGguYXRhbjIoZixsKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PU1hdGguYXNpbigtSHQodSwtMSwxKSksTWF0aC5hYnModSk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMihhLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihjLGwpKToodGhpcy5feT1NYXRoLmF0YW4yKC1oLHMpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9TWF0aC5hc2luKEh0KGYsLTEsMSkpLE1hdGguYWJzKGYpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIoLWgsZCksdGhpcy5fej1NYXRoLmF0YW4yKC1vLGwpKToodGhpcy5feT0wLHRoaXMuX3o9TWF0aC5hdGFuMihjLHMpKTticmVhaztjYXNlIlpZWCI6dGhpcy5feT1NYXRoLmFzaW4oLUh0KGgsLTEsMSkpLE1hdGguYWJzKGgpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZixkKSx0aGlzLl96PU1hdGguYXRhbjIoYyxzKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLW8sbCkpO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl96PU1hdGguYXNpbihIdChjLC0xLDEpKSxNYXRoLmFicyhjKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC11LGwpLHRoaXMuX3k9TWF0aC5hdGFuMigtaCxzKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIoYSxkKSk7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3o9TWF0aC5hc2luKC1IdChvLC0xLDEpKSxNYXRoLmFicyhvKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKGYsbCksdGhpcy5feT1NYXRoLmF0YW4yKGEscykpOih0aGlzLl94PU1hdGguYXRhbjIoLXUsZCksdGhpcy5feT0wKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuRXVsZXI6IC5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK2UpfXJldHVybiB0aGlzLl9vcmRlcj1lLG49PT0hMCYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVF1YXRlcm5pb24odCxlLG4pe3JldHVybiB0Zy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh0ZyxlLG4pfXNldEZyb21WZWN0b3IzKHQsZT10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuc2V0KHQueCx0LnksdC56LGUpfXJlb3JkZXIodCl7cmV0dXJuIGVnLnNldEZyb21FdWxlcih0aGlzKSx0aGlzLnNldEZyb21RdWF0ZXJuaW9uKGVnLHQpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fb3JkZXI9PT10aGlzLl9vcmRlcn1mcm9tQXJyYXkodCl7cmV0dXJuIHRoaXMuX3g9dFswXSx0aGlzLl95PXRbMV0sdGhpcy5fej10WzJdLHRbM10hPT12b2lkIDAmJih0aGlzLl9vcmRlcj10WzNdKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl9vcmRlcix0fV9vbkNoYW5nZSh0KXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz10LHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5feCx5aWVsZCB0aGlzLl95LHlpZWxkIHRoaXMuX3oseWllbGQgdGhpcy5fb3JkZXJ9fVVuLkRFRkFVTFRfT1JERVI9IlhZWiI7Y2xhc3MgaWx7Y29uc3RydWN0b3IoKXt0aGlzLm1hc2s9MX1zZXQodCl7dGhpcy5tYXNrPSgxPDx0fDApPj4+MH1lbmFibGUodCl7dGhpcy5tYXNrfD0xPDx0fDB9ZW5hYmxlQWxsKCl7dGhpcy5tYXNrPS0xfXRvZ2dsZSh0KXt0aGlzLm1hc2tePTE8PHR8MH1kaXNhYmxlKHQpe3RoaXMubWFzayY9figxPDx0fDApfWRpc2FibGVBbGwoKXt0aGlzLm1hc2s9MH10ZXN0KHQpe3JldHVybih0aGlzLm1hc2smdC5tYXNrKSE9PTB9aXNFbmFibGVkKHQpe3JldHVybih0aGlzLm1hc2smKDE8PHR8MCkpIT09MH19bGV0IHpNPTA7Y29uc3Qgbmc9bmV3IEksT3M9bmV3IHluLEJpPW5ldyBDdCxybD1uZXcgSSxLbz1uZXcgSSxrTT1uZXcgSSxWTT1uZXcgeW4saWc9bmV3IEkoMSwwLDApLHJnPW5ldyBJKDAsMSwwKSxzZz1uZXcgSSgwLDAsMSksb2c9e3R5cGU6ImFkZGVkIn0sR009e3R5cGU6InJlbW92ZWQifSx6cz17dHlwZToiY2hpbGRhZGRlZCIsY2hpbGQ6bnVsbH0sZGY9e3R5cGU6ImNoaWxkcmVtb3ZlZCIsY2hpbGQ6bnVsbH07Y2xhc3Mgc2UgZXh0ZW5kcyB5aXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc09iamVjdDNEPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOnpNKyt9KSx0aGlzLnV1aWQ9TG4oKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJPYmplY3QzRCIsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMudXA9c2UuREVGQVVMVF9VUC5jbG9uZSgpO2NvbnN0IHQ9bmV3IEksZT1uZXcgVW4sbj1uZXcgeW4saT1uZXcgSSgxLDEsMSk7ZnVuY3Rpb24gcygpe24uc2V0RnJvbUV1bGVyKGUsITEpfWZ1bmN0aW9uIG8oKXtlLnNldEZyb21RdWF0ZXJuaW9uKG4sdm9pZCAwLCExKX1lLl9vbkNoYW5nZShzKSxuLl9vbkNoYW5nZShvKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtwb3NpdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dH0scm90YXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmV9LHF1YXRlcm5pb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm59LHNjYWxlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTppfSxtb2RlbFZpZXdNYXRyaXg6e3ZhbHVlOm5ldyBDdH0sbm9ybWFsTWF0cml4Ont2YWx1ZTpuZXcgV3R9fSksdGhpcy5tYXRyaXg9bmV3IEN0LHRoaXMubWF0cml4V29ybGQ9bmV3IEN0LHRoaXMubWF0cml4QXV0b1VwZGF0ZT1zZS5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT1zZS5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdGhpcy5sYXllcnM9bmV3IGlsLHRoaXMudmlzaWJsZT0hMCx0aGlzLmNhc3RTaGFkb3c9ITEsdGhpcy5yZWNlaXZlU2hhZG93PSExLHRoaXMuZnJ1c3R1bUN1bGxlZD0hMCx0aGlzLnJlbmRlck9yZGVyPTAsdGhpcy5hbmltYXRpb25zPVtdLHRoaXMuY3VzdG9tRGVwdGhNYXRlcmlhbD12b2lkIDAsdGhpcy5jdXN0b21EaXN0YW5jZU1hdGVyaWFsPXZvaWQgMCx0aGlzLnVzZXJEYXRhPXt9fW9uQmVmb3JlU2hhZG93KCl7fW9uQWZ0ZXJTaGFkb3coKXt9b25CZWZvcmVSZW5kZXIoKXt9b25BZnRlclJlbmRlcigpe31hcHBseU1hdHJpeDQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMubWF0cml4LnByZW11bHRpcGx5KHQpLHRoaXMubWF0cml4LmRlY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKX1hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSh0KSx0aGlzfXNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZSh0LGUpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSl9c2V0Um90YXRpb25Gcm9tRXVsZXIodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcih0LCEwKX1zZXRSb3RhdGlvbkZyb21NYXRyaXgodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KX1zZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3RoaXMucXVhdGVybmlvbi5jb3B5KHQpfXJvdGF0ZU9uQXhpcyh0LGUpe3JldHVybiBPcy5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KE9zKSx0aGlzfXJvdGF0ZU9uV29ybGRBeGlzKHQsZSl7cmV0dXJuIE9zLnNldEZyb21BeGlzQW5nbGUodCxlKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoT3MpLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoaWcsdCl9cm90YXRlWSh0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMocmcsdCl9cm90YXRlWih0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoc2csdCl9dHJhbnNsYXRlT25BeGlzKHQsZSl7cmV0dXJuIG5nLmNvcHkodCkuYXBwbHlRdWF0ZXJuaW9uKHRoaXMucXVhdGVybmlvbiksdGhpcy5wb3NpdGlvbi5hZGQobmcubXVsdGlwbHlTY2FsYXIoZSkpLHRoaXN9dHJhbnNsYXRlWCh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoaWcsdCl9dHJhbnNsYXRlWSh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMocmcsdCl9dHJhbnNsYXRlWih0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoc2csdCl9bG9jYWxUb1dvcmxkKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKX13b3JsZFRvTG9jYWwodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuYXBwbHlNYXRyaXg0KEJpLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkpfWxvb2tBdCh0LGUsbil7dC5pc1ZlY3RvcjM/cmwuY29weSh0KTpybC5zZXQodCxlLG4pO2NvbnN0IGk9dGhpcy5wYXJlbnQ7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksS28uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpLHRoaXMuaXNDYW1lcmF8fHRoaXMuaXNMaWdodD9CaS5sb29rQXQoS28scmwsdGhpcy51cCk6QmkubG9va0F0KHJsLEtvLHRoaXMudXApLHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoQmkpLGkmJihCaS5leHRyYWN0Um90YXRpb24oaS5tYXRyaXhXb3JsZCksT3Muc2V0RnJvbVJvdGF0aW9uTWF0cml4KEJpKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoT3MuaW52ZXJ0KCkpKX1hZGQodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRoaXMuYWRkKGFyZ3VtZW50c1tlXSk7cmV0dXJuIHRoaXN9cmV0dXJuIHQ9PT10aGlzPyhjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4iLHQpLHRoaXMpOih0JiZ0LmlzT2JqZWN0M0Q/KHQucmVtb3ZlRnJvbVBhcmVudCgpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQuZGlzcGF0Y2hFdmVudChvZyksenMuY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQoenMpLHpzLmNoaWxkPW51bGwpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4iLHQpLHRoaXMpfXJlbW92ZSh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW25dKTtyZXR1cm4gdGhpc31jb25zdCBlPXRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KTtyZXR1cm4gZSE9PS0xJiYodC5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuLnNwbGljZShlLDEpLHQuZGlzcGF0Y2hFdmVudChHTSksZGYuY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQoZGYpLGRmLmNoaWxkPW51bGwpLHRoaXN9cmVtb3ZlRnJvbVBhcmVudCgpe2NvbnN0IHQ9dGhpcy5wYXJlbnQ7cmV0dXJuIHQhPT1udWxsJiZ0LnJlbW92ZSh0aGlzKSx0aGlzfWNsZWFyKCl7cmV0dXJuIHRoaXMucmVtb3ZlKC4uLnRoaXMuY2hpbGRyZW4pfWF0dGFjaCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksQmkuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSx0LnBhcmVudCE9PW51bGwmJih0LnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksQmkubXVsdGlwbHkodC5wYXJlbnQubWF0cml4V29ybGQpKSx0LmFwcGx5TWF0cml4NChCaSksdC5yZW1vdmVGcm9tUGFyZW50KCksdC5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2godCksdC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCksdC5kaXNwYXRjaEV2ZW50KG9nKSx6cy5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudCh6cyksenMuY2hpbGQ9bnVsbCx0aGlzfWdldE9iamVjdEJ5SWQodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgiaWQiLHQpfWdldE9iamVjdEJ5TmFtZSh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIix0KX1nZXRPYmplY3RCeVByb3BlcnR5KHQsZSl7aWYodGhpc1t0XT09PWUpcmV0dXJuIHRoaXM7Zm9yKGxldCBuPTAsaT10aGlzLmNoaWxkcmVuLmxlbmd0aDtuPGk7bisrKXtjb25zdCBvPXRoaXMuY2hpbGRyZW5bbl0uZ2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpO2lmKG8hPT12b2lkIDApcmV0dXJuIG99fWdldE9iamVjdHNCeVByb3BlcnR5KHQsZSxuPVtdKXt0aGlzW3RdPT09ZSYmbi5wdXNoKHRoaXMpO2NvbnN0IGk9dGhpcy5jaGlsZHJlbjtmb3IobGV0IHM9MCxvPWkubGVuZ3RoO3M8bztzKyspaVtzXS5nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LGUsbik7cmV0dXJuIG59Z2V0V29ybGRQb3NpdGlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCl9Z2V0V29ybGRRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShLbyx0LGtNKSx0fWdldFdvcmxkU2NhbGUodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKEtvLFZNLHQpLHR9Z2V0V29ybGREaXJlY3Rpb24odCl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiB0LnNldChlWzhdLGVbOV0sZVsxMF0pLm5vcm1hbGl6ZSgpfXJheWNhc3QoKXt9dHJhdmVyc2UodCl7dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuPGk7bisrKWVbbl0udHJhdmVyc2UodCl9dHJhdmVyc2VWaXNpYmxlKHQpe2lmKHRoaXMudmlzaWJsZT09PSExKXJldHVybjt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxpPWUubGVuZ3RoO248aTtuKyspZVtuXS50cmF2ZXJzZVZpc2libGUodCl9dHJhdmVyc2VBbmNlc3RvcnModCl7Y29uc3QgZT10aGlzLnBhcmVudDtlIT09bnVsbCYmKHQoZSksZS50cmF2ZXJzZUFuY2VzdG9ycyh0KSl9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9dXBkYXRlTWF0cml4V29ybGQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLCh0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGV8fHQpJiYodGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmKHRoaXMucGFyZW50PT09bnVsbD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCkpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0PSEwKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuPGk7bisrKWVbbl0udXBkYXRlTWF0cml4V29ybGQodCl9dXBkYXRlV29ybGRNYXRyaXgodCxlKXtjb25zdCBuPXRoaXMucGFyZW50O2lmKHQ9PT0hMCYmbiE9PW51bGwmJm4udXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT09PSEwJiYodGhpcy5wYXJlbnQ9PT1udWxsP3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSksZT09PSEwKXtjb25zdCBpPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBzPTAsbz1pLmxlbmd0aDtzPG87cysrKWlbc10udXBkYXRlV29ybGRNYXRyaXgoITEsITApfX10b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyIsbj17fTtlJiYodD17Z2VvbWV0cmllczp7fSxtYXRlcmlhbHM6e30sdGV4dHVyZXM6e30saW1hZ2VzOnt9LHNoYXBlczp7fSxza2VsZXRvbnM6e30sYW5pbWF0aW9uczp7fSxub2Rlczp7fX0sbi5tZXRhZGF0YT17dmVyc2lvbjo0LjYsdHlwZToiT2JqZWN0IixnZW5lcmF0b3I6Ik9iamVjdDNELnRvSlNPTiJ9KTtjb25zdCBpPXt9O2kudXVpZD10aGlzLnV1aWQsaS50eXBlPXRoaXMudHlwZSx0aGlzLm5hbWUhPT0iIiYmKGkubmFtZT10aGlzLm5hbWUpLHRoaXMuY2FzdFNoYWRvdz09PSEwJiYoaS5jYXN0U2hhZG93PSEwKSx0aGlzLnJlY2VpdmVTaGFkb3c9PT0hMCYmKGkucmVjZWl2ZVNoYWRvdz0hMCksdGhpcy52aXNpYmxlPT09ITEmJihpLnZpc2libGU9ITEpLHRoaXMuZnJ1c3R1bUN1bGxlZD09PSExJiYoaS5mcnVzdHVtQ3VsbGVkPSExKSx0aGlzLnJlbmRlck9yZGVyIT09MCYmKGkucmVuZGVyT3JkZXI9dGhpcy5yZW5kZXJPcmRlciksT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihpLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGkubGF5ZXJzPXRoaXMubGF5ZXJzLm1hc2ssaS5tYXRyaXg9dGhpcy5tYXRyaXgudG9BcnJheSgpLGkudXA9dGhpcy51cC50b0FycmF5KCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPT09ITEmJihpLm1hdHJpeEF1dG9VcGRhdGU9ITEpLHRoaXMuaXNJbnN0YW5jZWRNZXNoJiYoaS50eXBlPSJJbnN0YW5jZWRNZXNoIixpLmNvdW50PXRoaXMuY291bnQsaS5pbnN0YW5jZU1hdHJpeD10aGlzLmluc3RhbmNlTWF0cml4LnRvSlNPTigpLHRoaXMuaW5zdGFuY2VDb2xvciE9PW51bGwmJihpLmluc3RhbmNlQ29sb3I9dGhpcy5pbnN0YW5jZUNvbG9yLnRvSlNPTigpKSksdGhpcy5pc0JhdGNoZWRNZXNoJiYoaS50eXBlPSJCYXRjaGVkTWVzaCIsaS5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkPXRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCxpLnNvcnRPYmplY3RzPXRoaXMuc29ydE9iamVjdHMsaS5kcmF3UmFuZ2VzPXRoaXMuX2RyYXdSYW5nZXMsaS5yZXNlcnZlZFJhbmdlcz10aGlzLl9yZXNlcnZlZFJhbmdlcyxpLmdlb21ldHJ5SW5mbz10aGlzLl9nZW9tZXRyeUluZm8ubWFwKGE9PmdpKFdlKHt9LGEpLHtib3VuZGluZ0JveDphLmJvdW5kaW5nQm94P3ttaW46YS5ib3VuZGluZ0JveC5taW4udG9BcnJheSgpLG1heDphLmJvdW5kaW5nQm94Lm1heC50b0FycmF5KCl9OnZvaWQgMCxib3VuZGluZ1NwaGVyZTphLmJvdW5kaW5nU3BoZXJlP3tyYWRpdXM6YS5ib3VuZGluZ1NwaGVyZS5yYWRpdXMsY2VudGVyOmEuYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKX06dm9pZCAwfSkpLGkuaW5zdGFuY2VJbmZvPXRoaXMuX2luc3RhbmNlSW5mby5tYXAoYT0+V2Uoe30sYSkpLGkuYXZhaWxhYmxlSW5zdGFuY2VJZHM9dGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMuc2xpY2UoKSxpLmF2YWlsYWJsZUdlb21ldHJ5SWRzPXRoaXMuX2F2YWlsYWJsZUdlb21ldHJ5SWRzLnNsaWNlKCksaS5uZXh0SW5kZXhTdGFydD10aGlzLl9uZXh0SW5kZXhTdGFydCxpLm5leHRWZXJ0ZXhTdGFydD10aGlzLl9uZXh0VmVydGV4U3RhcnQsaS5nZW9tZXRyeUNvdW50PXRoaXMuX2dlb21ldHJ5Q291bnQsaS5tYXhJbnN0YW5jZUNvdW50PXRoaXMuX21heEluc3RhbmNlQ291bnQsaS5tYXhWZXJ0ZXhDb3VudD10aGlzLl9tYXhWZXJ0ZXhDb3VudCxpLm1heEluZGV4Q291bnQ9dGhpcy5fbWF4SW5kZXhDb3VudCxpLmdlb21ldHJ5SW5pdGlhbGl6ZWQ9dGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCxpLm1hdHJpY2VzVGV4dHVyZT10aGlzLl9tYXRyaWNlc1RleHR1cmUudG9KU09OKHQpLGkuaW5kaXJlY3RUZXh0dXJlPXRoaXMuX2luZGlyZWN0VGV4dHVyZS50b0pTT04odCksdGhpcy5fY29sb3JzVGV4dHVyZSE9PW51bGwmJihpLmNvbG9yc1RleHR1cmU9dGhpcy5fY29sb3JzVGV4dHVyZS50b0pTT04odCkpLHRoaXMuYm91bmRpbmdTcGhlcmUhPT1udWxsJiYoaS5ib3VuZGluZ1NwaGVyZT17Y2VudGVyOnRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSxyYWRpdXM6dGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXN9KSx0aGlzLmJvdW5kaW5nQm94IT09bnVsbCYmKGkuYm91bmRpbmdCb3g9e21pbjp0aGlzLmJvdW5kaW5nQm94Lm1pbi50b0FycmF5KCksbWF4OnRoaXMuYm91bmRpbmdCb3gubWF4LnRvQXJyYXkoKX0pKTtmdW5jdGlvbiBzKGEsYyl7cmV0dXJuIGFbYy51dWlkXT09PXZvaWQgMCYmKGFbYy51dWlkXT1jLnRvSlNPTih0KSksYy51dWlkfWlmKHRoaXMuaXNTY2VuZSl0aGlzLmJhY2tncm91bmQmJih0aGlzLmJhY2tncm91bmQuaXNDb2xvcj9pLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTigpOnRoaXMuYmFja2dyb3VuZC5pc1RleHR1cmUmJihpLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTih0KS51dWlkKSksdGhpcy5lbnZpcm9ubWVudCYmdGhpcy5lbnZpcm9ubWVudC5pc1RleHR1cmUmJnRoaXMuZW52aXJvbm1lbnQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlIT09ITAmJihpLmVudmlyb25tZW50PXRoaXMuZW52aXJvbm1lbnQudG9KU09OKHQpLnV1aWQpO2Vsc2UgaWYodGhpcy5pc01lc2h8fHRoaXMuaXNMaW5lfHx0aGlzLmlzUG9pbnRzKXtpLmdlb21ldHJ5PXModC5nZW9tZXRyaWVzLHRoaXMuZ2VvbWV0cnkpO2NvbnN0IGE9dGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO2lmKGEhPT12b2lkIDAmJmEuc2hhcGVzIT09dm9pZCAwKXtjb25zdCBjPWEuc2hhcGVzO2lmKEFycmF5LmlzQXJyYXkoYykpZm9yKGxldCBsPTAsdT1jLmxlbmd0aDtsPHU7bCsrKXtjb25zdCBoPWNbbF07cyh0LnNoYXBlcyxoKX1lbHNlIHModC5zaGFwZXMsYyl9fWlmKHRoaXMuaXNTa2lubmVkTWVzaCYmKGkuYmluZE1vZGU9dGhpcy5iaW5kTW9kZSxpLmJpbmRNYXRyaXg9dGhpcy5iaW5kTWF0cml4LnRvQXJyYXkoKSx0aGlzLnNrZWxldG9uIT09dm9pZCAwJiYocyh0LnNrZWxldG9ucyx0aGlzLnNrZWxldG9uKSxpLnNrZWxldG9uPXRoaXMuc2tlbGV0b24udXVpZCkpLHRoaXMubWF0ZXJpYWwhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7Y29uc3QgYT1bXTtmb3IobGV0IGM9MCxsPXRoaXMubWF0ZXJpYWwubGVuZ3RoO2M8bDtjKyspYS5wdXNoKHModC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbFtjXSkpO2kubWF0ZXJpYWw9YX1lbHNlIGkubWF0ZXJpYWw9cyh0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsKTtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXtpLmNoaWxkcmVuPVtdO2ZvcihsZXQgYT0wO2E8dGhpcy5jaGlsZHJlbi5sZW5ndGg7YSsrKWkuY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2FdLnRvSlNPTih0KS5vYmplY3QpfWlmKHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg+MCl7aS5hbmltYXRpb25zPVtdO2ZvcihsZXQgYT0wO2E8dGhpcy5hbmltYXRpb25zLmxlbmd0aDthKyspe2NvbnN0IGM9dGhpcy5hbmltYXRpb25zW2FdO2kuYW5pbWF0aW9ucy5wdXNoKHModC5hbmltYXRpb25zLGMpKX19aWYoZSl7Y29uc3QgYT1vKHQuZ2VvbWV0cmllcyksYz1vKHQubWF0ZXJpYWxzKSxsPW8odC50ZXh0dXJlcyksdT1vKHQuaW1hZ2VzKSxoPW8odC5zaGFwZXMpLGY9byh0LnNrZWxldG9ucyksZD1vKHQuYW5pbWF0aW9ucykscD1vKHQubm9kZXMpO2EubGVuZ3RoPjAmJihuLmdlb21ldHJpZXM9YSksYy5sZW5ndGg+MCYmKG4ubWF0ZXJpYWxzPWMpLGwubGVuZ3RoPjAmJihuLnRleHR1cmVzPWwpLHUubGVuZ3RoPjAmJihuLmltYWdlcz11KSxoLmxlbmd0aD4wJiYobi5zaGFwZXM9aCksZi5sZW5ndGg+MCYmKG4uc2tlbGV0b25zPWYpLGQubGVuZ3RoPjAmJihuLmFuaW1hdGlvbnM9ZCkscC5sZW5ndGg+MCYmKG4ubm9kZXM9cCl9cmV0dXJuIG4ub2JqZWN0PWksbjtmdW5jdGlvbiBvKGEpe2NvbnN0IGM9W107Zm9yKGNvbnN0IGwgaW4gYSl7Y29uc3QgdT1hW2xdO2RlbGV0ZSB1Lm1ldGFkYXRhLGMucHVzaCh1KX1yZXR1cm4gY319Y2xvbmUodCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzLHQpfWNvcHkodCxlPSEwKXtpZih0aGlzLm5hbWU9dC5uYW1lLHRoaXMudXAuY29weSh0LnVwKSx0aGlzLnBvc2l0aW9uLmNvcHkodC5wb3NpdGlvbiksdGhpcy5yb3RhdGlvbi5vcmRlcj10LnJvdGF0aW9uLm9yZGVyLHRoaXMucXVhdGVybmlvbi5jb3B5KHQucXVhdGVybmlvbiksdGhpcy5zY2FsZS5jb3B5KHQuc2NhbGUpLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMubWF0cml4V29ybGQuY29weSh0Lm1hdHJpeFdvcmxkKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPXQubWF0cml4V29ybGRBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT10Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUsdGhpcy5sYXllcnMubWFzaz10LmxheWVycy5tYXNrLHRoaXMudmlzaWJsZT10LnZpc2libGUsdGhpcy5jYXN0U2hhZG93PXQuY2FzdFNoYWRvdyx0aGlzLnJlY2VpdmVTaGFkb3c9dC5yZWNlaXZlU2hhZG93LHRoaXMuZnJ1c3R1bUN1bGxlZD10LmZydXN0dW1DdWxsZWQsdGhpcy5yZW5kZXJPcmRlcj10LnJlbmRlck9yZGVyLHRoaXMuYW5pbWF0aW9ucz10LmFuaW1hdGlvbnMuc2xpY2UoKSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLGU9PT0hMClmb3IobGV0IG49MDtuPHQuY2hpbGRyZW4ubGVuZ3RoO24rKyl7Y29uc3QgaT10LmNoaWxkcmVuW25dO3RoaXMuYWRkKGkuY2xvbmUoKSl9cmV0dXJuIHRoaXN9fXNlLkRFRkFVTFRfVVA9bmV3IEkoMCwxLDApLHNlLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFPSEwLHNlLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFPSEwO2NvbnN0IHNpPW5ldyBJLE9pPW5ldyBJLHBmPW5ldyBJLHppPW5ldyBJLGtzPW5ldyBJLFZzPW5ldyBJLGFnPW5ldyBJLG1mPW5ldyBJLGdmPW5ldyBJLHhmPW5ldyBJLF9mPW5ldyBRdCx5Zj1uZXcgUXQsdmY9bmV3IFF0O2NsYXNzIGdle2NvbnN0cnVjdG9yKHQ9bmV3IEksZT1uZXcgSSxuPW5ldyBJKXt0aGlzLmE9dCx0aGlzLmI9ZSx0aGlzLmM9bn1zdGF0aWMgZ2V0Tm9ybWFsKHQsZSxuLGkpe2kuc3ViVmVjdG9ycyhuLGUpLHNpLnN1YlZlY3RvcnModCxlKSxpLmNyb3NzKHNpKTtjb25zdCBzPWkubGVuZ3RoU3EoKTtyZXR1cm4gcz4wP2kubXVsdGlwbHlTY2FsYXIoMS9NYXRoLnNxcnQocykpOmkuc2V0KDAsMCwwKX1zdGF0aWMgZ2V0QmFyeWNvb3JkKHQsZSxuLGkscyl7c2kuc3ViVmVjdG9ycyhpLGUpLE9pLnN1YlZlY3RvcnMobixlKSxwZi5zdWJWZWN0b3JzKHQsZSk7Y29uc3Qgbz1zaS5kb3Qoc2kpLGE9c2kuZG90KE9pKSxjPXNpLmRvdChwZiksbD1PaS5kb3QoT2kpLHU9T2kuZG90KHBmKSxoPW8qbC1hKmE7aWYoaD09PTApcmV0dXJuIHMuc2V0KDAsMCwwKSxudWxsO2NvbnN0IGY9MS9oLGQ9KGwqYy1hKnUpKmYscD0obyp1LWEqYykqZjtyZXR1cm4gcy5zZXQoMS1kLXAscCxkKX1zdGF0aWMgY29udGFpbnNQb2ludCh0LGUsbixpKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLG4saSx6aSk9PT1udWxsPyExOnppLng+PTAmJnppLnk+PTAmJnppLngremkueTw9MX1zdGF0aWMgZ2V0SW50ZXJwb2xhdGlvbih0LGUsbixpLHMsbyxhLGMpe3JldHVybiB0aGlzLmdldEJhcnljb29yZCh0LGUsbixpLHppKT09PW51bGw/KGMueD0wLGMueT0wLCJ6ImluIGMmJihjLno9MCksInciaW4gYyYmKGMudz0wKSxudWxsKTooYy5zZXRTY2FsYXIoMCksYy5hZGRTY2FsZWRWZWN0b3Iocyx6aS54KSxjLmFkZFNjYWxlZFZlY3RvcihvLHppLnkpLGMuYWRkU2NhbGVkVmVjdG9yKGEsemkueiksYyl9c3RhdGljIGdldEludGVycG9sYXRlZEF0dHJpYnV0ZSh0LGUsbixpLHMsbyl7cmV0dXJuIF9mLnNldFNjYWxhcigwKSx5Zi5zZXRTY2FsYXIoMCksdmYuc2V0U2NhbGFyKDApLF9mLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSx5Zi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbiksdmYuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGkpLG8uc2V0U2NhbGFyKDApLG8uYWRkU2NhbGVkVmVjdG9yKF9mLHMueCksby5hZGRTY2FsZWRWZWN0b3IoeWYscy55KSxvLmFkZFNjYWxlZFZlY3Rvcih2ZixzLnopLG99c3RhdGljIGlzRnJvbnRGYWNpbmcodCxlLG4saSl7cmV0dXJuIHNpLnN1YlZlY3RvcnMobixlKSxPaS5zdWJWZWN0b3JzKHQsZSksc2kuY3Jvc3MoT2kpLmRvdChpKTwwfXNldCh0LGUsbil7cmV0dXJuIHRoaXMuYS5jb3B5KHQpLHRoaXMuYi5jb3B5KGUpLHRoaXMuYy5jb3B5KG4pLHRoaXN9c2V0RnJvbVBvaW50c0FuZEluZGljZXModCxlLG4saSl7cmV0dXJuIHRoaXMuYS5jb3B5KHRbZV0pLHRoaXMuYi5jb3B5KHRbbl0pLHRoaXMuYy5jb3B5KHRbaV0pLHRoaXN9c2V0RnJvbUF0dHJpYnV0ZUFuZEluZGljZXModCxlLG4saSl7cmV0dXJuIHRoaXMuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksdGhpcy5iLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxuKSx0aGlzLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGkpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMuYS5jb3B5KHQuYSksdGhpcy5iLmNvcHkodC5iKSx0aGlzLmMuY29weSh0LmMpLHRoaXN9Z2V0QXJlYSgpe3JldHVybiBzaS5zdWJWZWN0b3JzKHRoaXMuYyx0aGlzLmIpLE9pLnN1YlZlY3RvcnModGhpcy5hLHRoaXMuYiksc2kuY3Jvc3MoT2kpLmxlbmd0aCgpKi41fWdldE1pZHBvaW50KHQpe3JldHVybiB0LmFkZFZlY3RvcnModGhpcy5hLHRoaXMuYikuYWRkKHRoaXMuYykubXVsdGlwbHlTY2FsYXIoMS8zKX1nZXROb3JtYWwodCl7cmV0dXJuIGdlLmdldE5vcm1hbCh0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1nZXRQbGFuZSh0KXtyZXR1cm4gdC5zZXRGcm9tQ29wbGFuYXJQb2ludHModGhpcy5hLHRoaXMuYix0aGlzLmMpfWdldEJhcnljb29yZCh0LGUpe3JldHVybiBnZS5nZXRCYXJ5Y29vcmQodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlKX1nZXRJbnRlcnBvbGF0aW9uKHQsZSxuLGkscyl7cmV0dXJuIGdlLmdldEludGVycG9sYXRpb24odCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlLG4saSxzKX1jb250YWluc1BvaW50KHQpe3JldHVybiBnZS5jb250YWluc1BvaW50KHQsdGhpcy5hLHRoaXMuYix0aGlzLmMpfWlzRnJvbnRGYWNpbmcodCl7cmV0dXJuIGdlLmlzRnJvbnRGYWNpbmcodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzVHJpYW5nbGUodGhpcyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2NvbnN0IG49dGhpcy5hLGk9dGhpcy5iLHM9dGhpcy5jO2xldCBvLGE7a3Muc3ViVmVjdG9ycyhpLG4pLFZzLnN1YlZlY3RvcnMocyxuKSxtZi5zdWJWZWN0b3JzKHQsbik7Y29uc3QgYz1rcy5kb3QobWYpLGw9VnMuZG90KG1mKTtpZihjPD0wJiZsPD0wKXJldHVybiBlLmNvcHkobik7Z2Yuc3ViVmVjdG9ycyh0LGkpO2NvbnN0IHU9a3MuZG90KGdmKSxoPVZzLmRvdChnZik7aWYodT49MCYmaDw9dSlyZXR1cm4gZS5jb3B5KGkpO2NvbnN0IGY9YypoLXUqbDtpZihmPD0wJiZjPj0wJiZ1PD0wKXJldHVybiBvPWMvKGMtdSksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihrcyxvKTt4Zi5zdWJWZWN0b3JzKHQscyk7Y29uc3QgZD1rcy5kb3QoeGYpLHA9VnMuZG90KHhmKTtpZihwPj0wJiZkPD1wKXJldHVybiBlLmNvcHkocyk7Y29uc3QgeD1kKmwtYypwO2lmKHg8PTAmJmw+PTAmJnA8PTApcmV0dXJuIGE9bC8obC1wKSxlLmNvcHkobikuYWRkU2NhbGVkVmVjdG9yKFZzLGEpO2NvbnN0IGc9dSpwLWQqaDtpZihnPD0wJiZoLXU+PTAmJmQtcD49MClyZXR1cm4gYWcuc3ViVmVjdG9ycyhzLGkpLGE9KGgtdSkvKGgtdSsoZC1wKSksZS5jb3B5KGkpLmFkZFNjYWxlZFZlY3RvcihhZyxhKTtjb25zdCBtPTEvKGcreCtmKTtyZXR1cm4gbz14Km0sYT1mKm0sZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihrcyxvKS5hZGRTY2FsZWRWZWN0b3IoVnMsYSl9ZXF1YWxzKHQpe3JldHVybiB0LmEuZXF1YWxzKHRoaXMuYSkmJnQuYi5lcXVhbHModGhpcy5iKSYmdC5jLmVxdWFscyh0aGlzLmMpfX1jb25zdCBjZz17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSxkcj17aDowLHM6MCxsOjB9LHNsPXtoOjAsczowLGw6MH07ZnVuY3Rpb24gTWYocix0LGUpe3JldHVybiBlPDAmJihlKz0xKSxlPjEmJihlLT0xKSxlPDEvNj9yKyh0LXIpKjYqZTplPDEvMj90OmU8Mi8zP3IrKHQtcikqNiooMi8zLWUpOnJ9bGV0IHl0PWNsYXNze2NvbnN0cnVjdG9yKHQsZSxuKXtyZXR1cm4gdGhpcy5pc0NvbG9yPSEwLHRoaXMucj0xLHRoaXMuZz0xLHRoaXMuYj0xLHRoaXMuc2V0KHQsZSxuKX1zZXQodCxlLG4pe2lmKGU9PT12b2lkIDAmJm49PT12b2lkIDApe2NvbnN0IGk9dDtpJiZpLmlzQ29sb3I/dGhpcy5jb3B5KGkpOnR5cGVvZiBpPT0ibnVtYmVyIj90aGlzLnNldEhleChpKTp0eXBlb2YgaT09InN0cmluZyImJnRoaXMuc2V0U3R5bGUoaSl9ZWxzZSB0aGlzLnNldFJHQih0LGUsbik7cmV0dXJuIHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLnI9dCx0aGlzLmc9dCx0aGlzLmI9dCx0aGlzfXNldEhleCh0LGU9X24pe3JldHVybiB0PU1hdGguZmxvb3IodCksdGhpcy5yPSh0Pj4xNiYyNTUpLzI1NSx0aGlzLmc9KHQ+PjgmMjU1KS8yNTUsdGhpcy5iPSh0JjI1NSkvMjU1LG5lLnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxlKSx0aGlzfXNldFJHQih0LGUsbixpPW5lLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPWUsdGhpcy5iPW4sbmUudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLGkpLHRoaXN9c2V0SFNMKHQsZSxuLGk9bmUud29ya2luZ0NvbG9yU3BhY2Upe2lmKHQ9cmYodCwxKSxlPUh0KGUsMCwxKSxuPUh0KG4sMCwxKSxlPT09MCl0aGlzLnI9dGhpcy5nPXRoaXMuYj1uO2Vsc2V7Y29uc3Qgcz1uPD0uNT9uKigxK2UpOm4rZS1uKmUsbz0yKm4tczt0aGlzLnI9TWYobyxzLHQrMS8zKSx0aGlzLmc9TWYobyxzLHQpLHRoaXMuYj1NZihvLHMsdC0xLzMpfXJldHVybiBuZS50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMsaSksdGhpc31zZXRTdHlsZSh0LGU9X24pe2Z1bmN0aW9uIG4ocyl7cyE9PXZvaWQgMCYmcGFyc2VGbG9hdChzKTwxJiZjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBBbHBoYSBjb21wb25lbnQgb2YgIit0KyIgd2lsbCBiZSBpZ25vcmVkLiIpfWxldCBpO2lmKGk9L14oXHcrKVwoKFteXCldKilcKS8uZXhlYyh0KSl7bGV0IHM7Y29uc3Qgbz1pWzFdLGE9aVsyXTtzd2l0Y2gobyl7Y2FzZSJyZ2IiOmNhc2UicmdiYSI6aWYocz0vXlxzKihcZCspXHMqLFxzKihcZCspXHMqLFxzKihcZCspXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGEpKXJldHVybiBuKHNbNF0pLHRoaXMuc2V0UkdCKE1hdGgubWluKDI1NSxwYXJzZUludChzWzFdLDEwKSkvMjU1LE1hdGgubWluKDI1NSxwYXJzZUludChzWzJdLDEwKSkvMjU1LE1hdGgubWluKDI1NSxwYXJzZUludChzWzNdLDEwKSkvMjU1LGUpO2lmKHM9L15ccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhhKSlyZXR1cm4gbihzWzRdKSx0aGlzLnNldFJHQihNYXRoLm1pbigxMDAscGFyc2VJbnQoc1sxXSwxMCkpLzEwMCxNYXRoLm1pbigxMDAscGFyc2VJbnQoc1syXSwxMCkpLzEwMCxNYXRoLm1pbigxMDAscGFyc2VJbnQoc1szXSwxMCkpLzEwMCxlKTticmVhaztjYXNlImhzbCI6Y2FzZSJoc2xhIjppZihzPS9eXHMqKFxkKlwuP1xkKylccyosXHMqKFxkKlwuP1xkKylcJVxzKixccyooXGQqXC4/XGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGEpKXJldHVybiBuKHNbNF0pLHRoaXMuc2V0SFNMKHBhcnNlRmxvYXQoc1sxXSkvMzYwLHBhcnNlRmxvYXQoc1syXSkvMTAwLHBhcnNlRmxvYXQoc1szXSkvMTAwLGUpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciBtb2RlbCAiK3QpfX1lbHNlIGlmKGk9L15cIyhbQS1GYS1mXGRdKykkLy5leGVjKHQpKXtjb25zdCBzPWlbMV0sbz1zLmxlbmd0aDtpZihvPT09MylyZXR1cm4gdGhpcy5zZXRSR0IocGFyc2VJbnQocy5jaGFyQXQoMCksMTYpLzE1LHBhcnNlSW50KHMuY2hhckF0KDEpLDE2KS8xNSxwYXJzZUludChzLmNoYXJBdCgyKSwxNikvMTUsZSk7aWYobz09PTYpcmV0dXJuIHRoaXMuc2V0SGV4KHBhcnNlSW50KHMsMTYpLGUpO2NvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEludmFsaWQgaGV4IGNvbG9yICIrdCl9ZWxzZSBpZih0JiZ0Lmxlbmd0aD4wKXJldHVybiB0aGlzLnNldENvbG9yTmFtZSh0LGUpO3JldHVybiB0aGlzfXNldENvbG9yTmFtZSh0LGU9X24pe2NvbnN0IG49Y2dbdC50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gbiE9PXZvaWQgMD90aGlzLnNldEhleChuLGUpOmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgIit0KSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMucix0aGlzLmcsdGhpcy5iKX1jb3B5KHQpe3JldHVybiB0aGlzLnI9dC5yLHRoaXMuZz10LmcsdGhpcy5iPXQuYix0aGlzfWNvcHlTUkdCVG9MaW5lYXIodCl7cmV0dXJuIHRoaXMucj1VaSh0LnIpLHRoaXMuZz1VaSh0LmcpLHRoaXMuYj1VaSh0LmIpLHRoaXN9Y29weUxpbmVhclRvU1JHQih0KXtyZXR1cm4gdGhpcy5yPUxzKHQuciksdGhpcy5nPUxzKHQuZyksdGhpcy5iPUxzKHQuYiksdGhpc31jb252ZXJ0U1JHQlRvTGluZWFyKCl7cmV0dXJuIHRoaXMuY29weVNSR0JUb0xpbmVhcih0aGlzKSx0aGlzfWNvbnZlcnRMaW5lYXJUb1NSR0IoKXtyZXR1cm4gdGhpcy5jb3B5TGluZWFyVG9TUkdCKHRoaXMpLHRoaXN9Z2V0SGV4KHQ9X24pe3JldHVybiBuZS5mcm9tV29ya2luZ0NvbG9yU3BhY2UoSmUuY29weSh0aGlzKSx0KSxNYXRoLnJvdW5kKEh0KEplLnIqMjU1LDAsMjU1KSkqNjU1MzYrTWF0aC5yb3VuZChIdChKZS5nKjI1NSwwLDI1NSkpKjI1NitNYXRoLnJvdW5kKEh0KEplLmIqMjU1LDAsMjU1KSl9Z2V0SGV4U3RyaW5nKHQ9X24pe3JldHVybigiMDAwMDAwIit0aGlzLmdldEhleCh0KS50b1N0cmluZygxNikpLnNsaWNlKC02KX1nZXRIU0wodCxlPW5lLndvcmtpbmdDb2xvclNwYWNlKXtuZS5mcm9tV29ya2luZ0NvbG9yU3BhY2UoSmUuY29weSh0aGlzKSxlKTtjb25zdCBuPUplLnIsaT1KZS5nLHM9SmUuYixvPU1hdGgubWF4KG4saSxzKSxhPU1hdGgubWluKG4saSxzKTtsZXQgYyxsO2NvbnN0IHU9KGErbykvMjtpZihhPT09byljPTAsbD0wO2Vsc2V7Y29uc3QgaD1vLWE7c3dpdGNoKGw9dTw9LjU/aC8obythKTpoLygyLW8tYSksbyl7Y2FzZSBuOmM9KGktcykvaCsoaTxzPzY6MCk7YnJlYWs7Y2FzZSBpOmM9KHMtbikvaCsyO2JyZWFrO2Nhc2UgczpjPShuLWkpL2grNDticmVha31jLz02fXJldHVybiB0Lmg9Yyx0LnM9bCx0Lmw9dSx0fWdldFJHQih0LGU9bmUud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiBuZS5mcm9tV29ya2luZ0NvbG9yU3BhY2UoSmUuY29weSh0aGlzKSxlKSx0LnI9SmUucix0Lmc9SmUuZyx0LmI9SmUuYix0fWdldFN0eWxlKHQ9X24pe25lLmZyb21Xb3JraW5nQ29sb3JTcGFjZShKZS5jb3B5KHRoaXMpLHQpO2NvbnN0IGU9SmUucixuPUplLmcsaT1KZS5iO3JldHVybiB0IT09X24/YGNvbG9yKCR7dH0gJHtlLnRvRml4ZWQoMyl9ICR7bi50b0ZpeGVkKDMpfSAke2kudG9GaXhlZCgzKX0pYDpgcmdiKCR7TWF0aC5yb3VuZChlKjI1NSl9LCR7TWF0aC5yb3VuZChuKjI1NSl9LCR7TWF0aC5yb3VuZChpKjI1NSl9KWB9b2Zmc2V0SFNMKHQsZSxuKXtyZXR1cm4gdGhpcy5nZXRIU0woZHIpLHRoaXMuc2V0SFNMKGRyLmgrdCxkci5zK2UsZHIubCtuKX1hZGQodCl7cmV0dXJuIHRoaXMucis9dC5yLHRoaXMuZys9dC5nLHRoaXMuYis9dC5iLHRoaXN9YWRkQ29sb3JzKHQsZSl7cmV0dXJuIHRoaXMucj10LnIrZS5yLHRoaXMuZz10LmcrZS5nLHRoaXMuYj10LmIrZS5iLHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLnIrPXQsdGhpcy5nKz10LHRoaXMuYis9dCx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy5yPU1hdGgubWF4KDAsdGhpcy5yLXQuciksdGhpcy5nPU1hdGgubWF4KDAsdGhpcy5nLXQuZyksdGhpcy5iPU1hdGgubWF4KDAsdGhpcy5iLXQuYiksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5yKj10LnIsdGhpcy5nKj10LmcsdGhpcy5iKj10LmIsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKj10LHRoaXMuZyo9dCx0aGlzLmIqPXQsdGhpc31sZXJwKHQsZSl7cmV0dXJuIHRoaXMucis9KHQuci10aGlzLnIpKmUsdGhpcy5nKz0odC5nLXRoaXMuZykqZSx0aGlzLmIrPSh0LmItdGhpcy5iKSplLHRoaXN9bGVycENvbG9ycyh0LGUsbil7cmV0dXJuIHRoaXMucj10LnIrKGUuci10LnIpKm4sdGhpcy5nPXQuZysoZS5nLXQuZykqbix0aGlzLmI9dC5iKyhlLmItdC5iKSpuLHRoaXN9bGVycEhTTCh0LGUpe3RoaXMuZ2V0SFNMKGRyKSx0LmdldEhTTChzbCk7Y29uc3Qgbj0kbyhkci5oLHNsLmgsZSksaT0kbyhkci5zLHNsLnMsZSkscz0kbyhkci5sLHNsLmwsZSk7cmV0dXJuIHRoaXMuc2V0SFNMKG4saSxzKSx0aGlzfXNldEZyb21WZWN0b3IzKHQpe3JldHVybiB0aGlzLnI9dC54LHRoaXMuZz10LnksdGhpcy5iPXQueix0aGlzfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMucixuPXRoaXMuZyxpPXRoaXMuYixzPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMucj1zWzBdKmUrc1szXSpuK3NbNl0qaSx0aGlzLmc9c1sxXSplK3NbNF0qbitzWzddKmksdGhpcy5iPXNbMl0qZStzWzVdKm4rc1s4XSppLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnI9PT10aGlzLnImJnQuZz09PXRoaXMuZyYmdC5iPT09dGhpcy5ifWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMucj10W2VdLHRoaXMuZz10W2UrMV0sdGhpcy5iPXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMucix0W2UrMV09dGhpcy5nLHRbZSsyXT10aGlzLmIsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMucj10LmdldFgoZSksdGhpcy5nPXQuZ2V0WShlKSx0aGlzLmI9dC5nZXRaKGUpLHRoaXN9dG9KU09OKCl7cmV0dXJuIHRoaXMuZ2V0SGV4KCl9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5yLHlpZWxkIHRoaXMuZyx5aWVsZCB0aGlzLmJ9fTtjb25zdCBKZT1uZXcgeXQ7eXQuTkFNRVM9Y2c7bGV0IEhNPTA7Y2xhc3MgS2UgZXh0ZW5kcyB5aXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc01hdGVyaWFsPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOkhNKyt9KSx0aGlzLnV1aWQ9TG4oKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJNYXRlcmlhbCIsdGhpcy5ibGVuZGluZz1Scix0aGlzLnNpZGU9ZWksdGhpcy52ZXJ0ZXhDb2xvcnM9ITEsdGhpcy5vcGFjaXR5PTEsdGhpcy50cmFuc3BhcmVudD0hMSx0aGlzLmFscGhhSGFzaD0hMSx0aGlzLmJsZW5kU3JjPWljLHRoaXMuYmxlbmREc3Q9cmMsdGhpcy5ibGVuZEVxdWF0aW9uPXJyLHRoaXMuYmxlbmRTcmNBbHBoYT1udWxsLHRoaXMuYmxlbmREc3RBbHBoYT1udWxsLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPW51bGwsdGhpcy5ibGVuZENvbG9yPW5ldyB5dCgwLDAsMCksdGhpcy5ibGVuZEFscGhhPTAsdGhpcy5kZXB0aEZ1bmM9SXIsdGhpcy5kZXB0aFRlc3Q9ITAsdGhpcy5kZXB0aFdyaXRlPSEwLHRoaXMuc3RlbmNpbFdyaXRlTWFzaz0yNTUsdGhpcy5zdGVuY2lsRnVuYz10Zix0aGlzLnN0ZW5jaWxSZWY9MCx0aGlzLnN0ZW5jaWxGdW5jTWFzaz0yNTUsdGhpcy5zdGVuY2lsRmFpbD1Vcix0aGlzLnN0ZW5jaWxaRmFpbD1Vcix0aGlzLnN0ZW5jaWxaUGFzcz1Vcix0aGlzLnN0ZW5jaWxXcml0ZT0hMSx0aGlzLmNsaXBwaW5nUGxhbmVzPW51bGwsdGhpcy5jbGlwSW50ZXJzZWN0aW9uPSExLHRoaXMuY2xpcFNoYWRvd3M9ITEsdGhpcy5zaGFkb3dTaWRlPW51bGwsdGhpcy5jb2xvcldyaXRlPSEwLHRoaXMucHJlY2lzaW9uPW51bGwsdGhpcy5wb2x5Z29uT2Zmc2V0PSExLHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj0wLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPTAsdGhpcy5kaXRoZXJpbmc9ITEsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9ITEsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9ITEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9ITEsdGhpcy5hbGxvd092ZXJyaWRlPSEwLHRoaXMudmlzaWJsZT0hMCx0aGlzLnRvbmVNYXBwZWQ9ITAsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLl9hbHBoYVRlc3Q9MH1nZXQgYWxwaGFUZXN0KCl7cmV0dXJuIHRoaXMuX2FscGhhVGVzdH1zZXQgYWxwaGFUZXN0KHQpe3RoaXMuX2FscGhhVGVzdD4wIT10PjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX2FscGhhVGVzdD10fW9uQmVmb3JlUmVuZGVyKCl7fW9uQmVmb3JlQ29tcGlsZSgpe31jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKXtyZXR1cm4gdGhpcy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKX1zZXRWYWx1ZXModCl7aWYodCE9PXZvaWQgMClmb3IoY29uc3QgZSBpbiB0KXtjb25zdCBuPXRbZV07aWYobj09PXZvaWQgMCl7Y29uc29sZS53YXJuKGBUSFJFRS5NYXRlcmlhbDogcGFyYW1ldGVyICcke2V9JyBoYXMgdmFsdWUgb2YgdW5kZWZpbmVkLmApO2NvbnRpbnVlfWNvbnN0IGk9dGhpc1tlXTtpZihpPT09dm9pZCAwKXtjb25zb2xlLndhcm4oYFRIUkVFLk1hdGVyaWFsOiAnJHtlfScgaXMgbm90IGEgcHJvcGVydHkgb2YgVEhSRUUuJHt0aGlzLnR5cGV9LmApO2NvbnRpbnVlfWkmJmkuaXNDb2xvcj9pLnNldChuKTppJiZpLmlzVmVjdG9yMyYmbiYmbi5pc1ZlY3RvcjM/aS5jb3B5KG4pOnRoaXNbZV09bn19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciO2UmJih0PXt0ZXh0dXJlczp7fSxpbWFnZXM6e319KTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O24udXVpZD10aGlzLnV1aWQsbi50eXBlPXRoaXMudHlwZSx0aGlzLm5hbWUhPT0iIiYmKG4ubmFtZT10aGlzLm5hbWUpLHRoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKG4uY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSksdGhpcy5yb3VnaG5lc3MhPT12b2lkIDAmJihuLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyksdGhpcy5tZXRhbG5lc3MhPT12b2lkIDAmJihuLm1ldGFsbmVzcz10aGlzLm1ldGFsbmVzcyksdGhpcy5zaGVlbiE9PXZvaWQgMCYmKG4uc2hlZW49dGhpcy5zaGVlbiksdGhpcy5zaGVlbkNvbG9yJiZ0aGlzLnNoZWVuQ29sb3IuaXNDb2xvciYmKG4uc2hlZW5Db2xvcj10aGlzLnNoZWVuQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2hlZW5Sb3VnaG5lc3MhPT12b2lkIDAmJihuLnNoZWVuUm91Z2huZXNzPXRoaXMuc2hlZW5Sb3VnaG5lc3MpLHRoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKG4uZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSksdGhpcy5lbWlzc2l2ZUludGVuc2l0eSE9PXZvaWQgMCYmdGhpcy5lbWlzc2l2ZUludGVuc2l0eSE9PTEmJihuLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXImJnRoaXMuc3BlY3VsYXIuaXNDb2xvciYmKG4uc3BlY3VsYXI9dGhpcy5zcGVjdWxhci5nZXRIZXgoKSksdGhpcy5zcGVjdWxhckludGVuc2l0eSE9PXZvaWQgMCYmKG4uc3BlY3VsYXJJbnRlbnNpdHk9dGhpcy5zcGVjdWxhckludGVuc2l0eSksdGhpcy5zcGVjdWxhckNvbG9yJiZ0aGlzLnNwZWN1bGFyQ29sb3IuaXNDb2xvciYmKG4uc3BlY3VsYXJDb2xvcj10aGlzLnNwZWN1bGFyQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2hpbmluZXNzIT09dm9pZCAwJiYobi5zaGluaW5lc3M9dGhpcy5zaGluaW5lc3MpLHRoaXMuY2xlYXJjb2F0IT09dm9pZCAwJiYobi5jbGVhcmNvYXQ9dGhpcy5jbGVhcmNvYXQpLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzIT09dm9pZCAwJiYobi5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MpLHRoaXMuY2xlYXJjb2F0TWFwJiZ0aGlzLmNsZWFyY29hdE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE1hcD10aGlzLmNsZWFyY29hdE1hcC50b0pTT04odCkudXVpZCksdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJnRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0Um91Z2huZXNzTWFwPXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCYmdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXROb3JtYWxNYXA9dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5jbGVhcmNvYXROb3JtYWxTY2FsZT10aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKSksdGhpcy5kaXNwZXJzaW9uIT09dm9pZCAwJiYobi5kaXNwZXJzaW9uPXRoaXMuZGlzcGVyc2lvbiksdGhpcy5pcmlkZXNjZW5jZSE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2U9dGhpcy5pcmlkZXNjZW5jZSksdGhpcy5pcmlkZXNjZW5jZUlPUiE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2VJT1I9dGhpcy5pcmlkZXNjZW5jZUlPUiksdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPXRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSksdGhpcy5pcmlkZXNjZW5jZU1hcCYmdGhpcy5pcmlkZXNjZW5jZU1hcC5pc1RleHR1cmUmJihuLmlyaWRlc2NlbmNlTWFwPXRoaXMuaXJpZGVzY2VuY2VNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAmJnRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD10aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmFuaXNvdHJvcHkhPT12b2lkIDAmJihuLmFuaXNvdHJvcHk9dGhpcy5hbmlzb3Ryb3B5KSx0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbiE9PXZvaWQgMCYmKG4uYW5pc290cm9weVJvdGF0aW9uPXRoaXMuYW5pc290cm9weVJvdGF0aW9uKSx0aGlzLmFuaXNvdHJvcHlNYXAmJnRoaXMuYW5pc290cm9weU1hcC5pc1RleHR1cmUmJihuLmFuaXNvdHJvcHlNYXA9dGhpcy5hbmlzb3Ryb3B5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYobi5tYXA9dGhpcy5tYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihuLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04odCkudXVpZCksdGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihuLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYobi5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTih0KS51dWlkLG4ubGlnaHRNYXBJbnRlbnNpdHk9dGhpcy5saWdodE1hcEludGVuc2l0eSksdGhpcy5hb01hcCYmdGhpcy5hb01hcC5pc1RleHR1cmUmJihuLmFvTWFwPXRoaXMuYW9NYXAudG9KU09OKHQpLnV1aWQsbi5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KSx0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihuLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTih0KS51dWlkLG4uYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKSx0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYobi5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxuLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYobi5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKHQpLnV1aWQsbi5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLG4uZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpLHRoaXMucm91Z2huZXNzTWFwJiZ0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUmJihuLnJvdWdobmVzc01hcD10aGlzLnJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5tZXRhbG5lc3NNYXAmJnRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSYmKG4ubWV0YWxuZXNzTWFwPXRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVtaXNzaXZlTWFwJiZ0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSYmKG4uZW1pc3NpdmVNYXA9dGhpcy5lbWlzc2l2ZU1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhck1hcCYmdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyTWFwPXRoaXMuc3BlY3VsYXJNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJnRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhckludGVuc2l0eU1hcD10aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFyQ29sb3JNYXAmJnRoaXMuc3BlY3VsYXJDb2xvck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyQ29sb3JNYXA9dGhpcy5zcGVjdWxhckNvbG9yTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYobi5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKHQpLnV1aWQsdGhpcy5jb21iaW5lIT09dm9pZCAwJiYobi5jb21iaW5lPXRoaXMuY29tYmluZSkpLHRoaXMuZW52TWFwUm90YXRpb24hPT12b2lkIDAmJihuLmVudk1hcFJvdGF0aW9uPXRoaXMuZW52TWFwUm90YXRpb24udG9BcnJheSgpKSx0aGlzLmVudk1hcEludGVuc2l0eSE9PXZvaWQgMCYmKG4uZW52TWFwSW50ZW5zaXR5PXRoaXMuZW52TWFwSW50ZW5zaXR5KSx0aGlzLnJlZmxlY3Rpdml0eSE9PXZvaWQgMCYmKG4ucmVmbGVjdGl2aXR5PXRoaXMucmVmbGVjdGl2aXR5KSx0aGlzLnJlZnJhY3Rpb25SYXRpbyE9PXZvaWQgMCYmKG4ucmVmcmFjdGlvblJhdGlvPXRoaXMucmVmcmFjdGlvblJhdGlvKSx0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKG4uZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04odCkudXVpZCksdGhpcy50cmFuc21pc3Npb24hPT12b2lkIDAmJihuLnRyYW5zbWlzc2lvbj10aGlzLnRyYW5zbWlzc2lvbiksdGhpcy50cmFuc21pc3Npb25NYXAmJnRoaXMudHJhbnNtaXNzaW9uTWFwLmlzVGV4dHVyZSYmKG4udHJhbnNtaXNzaW9uTWFwPXRoaXMudHJhbnNtaXNzaW9uTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnRoaWNrbmVzcyE9PXZvaWQgMCYmKG4udGhpY2tuZXNzPXRoaXMudGhpY2tuZXNzKSx0aGlzLnRoaWNrbmVzc01hcCYmdGhpcy50aGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi50aGlja25lc3NNYXA9dGhpcy50aGlja25lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSE9PXZvaWQgMCYmdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlIT09MS8wJiYobi5hdHRlbnVhdGlvbkRpc3RhbmNlPXRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSksdGhpcy5hdHRlbnVhdGlvbkNvbG9yIT09dm9pZCAwJiYobi5hdHRlbnVhdGlvbkNvbG9yPXRoaXMuYXR0ZW51YXRpb25Db2xvci5nZXRIZXgoKSksdGhpcy5zaXplIT09dm9pZCAwJiYobi5zaXplPXRoaXMuc2l6ZSksdGhpcy5zaGFkb3dTaWRlIT09bnVsbCYmKG4uc2hhZG93U2lkZT10aGlzLnNoYWRvd1NpZGUpLHRoaXMuc2l6ZUF0dGVudWF0aW9uIT09dm9pZCAwJiYobi5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pLHRoaXMuYmxlbmRpbmchPT1SciYmKG4uYmxlbmRpbmc9dGhpcy5ibGVuZGluZyksdGhpcy5zaWRlIT09ZWkmJihuLnNpZGU9dGhpcy5zaWRlKSx0aGlzLnZlcnRleENvbG9ycz09PSEwJiYobi52ZXJ0ZXhDb2xvcnM9ITApLHRoaXMub3BhY2l0eTwxJiYobi5vcGFjaXR5PXRoaXMub3BhY2l0eSksdGhpcy50cmFuc3BhcmVudD09PSEwJiYobi50cmFuc3BhcmVudD0hMCksdGhpcy5ibGVuZFNyYyE9PWljJiYobi5ibGVuZFNyYz10aGlzLmJsZW5kU3JjKSx0aGlzLmJsZW5kRHN0IT09cmMmJihuLmJsZW5kRHN0PXRoaXMuYmxlbmREc3QpLHRoaXMuYmxlbmRFcXVhdGlvbiE9PXJyJiYobi5ibGVuZEVxdWF0aW9uPXRoaXMuYmxlbmRFcXVhdGlvbiksdGhpcy5ibGVuZFNyY0FscGhhIT09bnVsbCYmKG4uYmxlbmRTcmNBbHBoYT10aGlzLmJsZW5kU3JjQWxwaGEpLHRoaXMuYmxlbmREc3RBbHBoYSE9PW51bGwmJihuLmJsZW5kRHN0QWxwaGE9dGhpcy5ibGVuZERzdEFscGhhKSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSE9PW51bGwmJihuLmJsZW5kRXF1YXRpb25BbHBoYT10aGlzLmJsZW5kRXF1YXRpb25BbHBoYSksdGhpcy5ibGVuZENvbG9yJiZ0aGlzLmJsZW5kQ29sb3IuaXNDb2xvciYmKG4uYmxlbmRDb2xvcj10aGlzLmJsZW5kQ29sb3IuZ2V0SGV4KCkpLHRoaXMuYmxlbmRBbHBoYSE9PTAmJihuLmJsZW5kQWxwaGE9dGhpcy5ibGVuZEFscGhhKSx0aGlzLmRlcHRoRnVuYyE9PUlyJiYobi5kZXB0aEZ1bmM9dGhpcy5kZXB0aEZ1bmMpLHRoaXMuZGVwdGhUZXN0PT09ITEmJihuLmRlcHRoVGVzdD10aGlzLmRlcHRoVGVzdCksdGhpcy5kZXB0aFdyaXRlPT09ITEmJihuLmRlcHRoV3JpdGU9dGhpcy5kZXB0aFdyaXRlKSx0aGlzLmNvbG9yV3JpdGU9PT0hMSYmKG4uY29sb3JXcml0ZT10aGlzLmNvbG9yV3JpdGUpLHRoaXMuc3RlbmNpbFdyaXRlTWFzayE9PTI1NSYmKG4uc3RlbmNpbFdyaXRlTWFzaz10aGlzLnN0ZW5jaWxXcml0ZU1hc2spLHRoaXMuc3RlbmNpbEZ1bmMhPT10ZiYmKG4uc3RlbmNpbEZ1bmM9dGhpcy5zdGVuY2lsRnVuYyksdGhpcy5zdGVuY2lsUmVmIT09MCYmKG4uc3RlbmNpbFJlZj10aGlzLnN0ZW5jaWxSZWYpLHRoaXMuc3RlbmNpbEZ1bmNNYXNrIT09MjU1JiYobi5zdGVuY2lsRnVuY01hc2s9dGhpcy5zdGVuY2lsRnVuY01hc2spLHRoaXMuc3RlbmNpbEZhaWwhPT1VciYmKG4uc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbCksdGhpcy5zdGVuY2lsWkZhaWwhPT1VciYmKG4uc3RlbmNpbFpGYWlsPXRoaXMuc3RlbmNpbFpGYWlsKSx0aGlzLnN0ZW5jaWxaUGFzcyE9PVVyJiYobi5zdGVuY2lsWlBhc3M9dGhpcy5zdGVuY2lsWlBhc3MpLHRoaXMuc3RlbmNpbFdyaXRlPT09ITAmJihuLnN0ZW5jaWxXcml0ZT10aGlzLnN0ZW5jaWxXcml0ZSksdGhpcy5yb3RhdGlvbiE9PXZvaWQgMCYmdGhpcy5yb3RhdGlvbiE9PTAmJihuLnJvdGF0aW9uPXRoaXMucm90YXRpb24pLHRoaXMucG9seWdvbk9mZnNldD09PSEwJiYobi5wb2x5Z29uT2Zmc2V0PSEwKSx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IhPT0wJiYobi5wb2x5Z29uT2Zmc2V0RmFjdG9yPXRoaXMucG9seWdvbk9mZnNldEZhY3RvciksdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMhPT0wJiYobi5wb2x5Z29uT2Zmc2V0VW5pdHM9dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMpLHRoaXMubGluZXdpZHRoIT09dm9pZCAwJiZ0aGlzLmxpbmV3aWR0aCE9PTEmJihuLmxpbmV3aWR0aD10aGlzLmxpbmV3aWR0aCksdGhpcy5kYXNoU2l6ZSE9PXZvaWQgMCYmKG4uZGFzaFNpemU9dGhpcy5kYXNoU2l6ZSksdGhpcy5nYXBTaXplIT09dm9pZCAwJiYobi5nYXBTaXplPXRoaXMuZ2FwU2l6ZSksdGhpcy5zY2FsZSE9PXZvaWQgMCYmKG4uc2NhbGU9dGhpcy5zY2FsZSksdGhpcy5kaXRoZXJpbmc9PT0hMCYmKG4uZGl0aGVyaW5nPSEwKSx0aGlzLmFscGhhVGVzdD4wJiYobi5hbHBoYVRlc3Q9dGhpcy5hbHBoYVRlc3QpLHRoaXMuYWxwaGFIYXNoPT09ITAmJihuLmFscGhhSGFzaD0hMCksdGhpcy5hbHBoYVRvQ292ZXJhZ2U9PT0hMCYmKG4uYWxwaGFUb0NvdmVyYWdlPSEwKSx0aGlzLnByZW11bHRpcGxpZWRBbHBoYT09PSEwJiYobi5wcmVtdWx0aXBsaWVkQWxwaGE9ITApLHRoaXMuZm9yY2VTaW5nbGVQYXNzPT09ITAmJihuLmZvcmNlU2luZ2xlUGFzcz0hMCksdGhpcy53aXJlZnJhbWU9PT0hMCYmKG4ud2lyZWZyYW1lPSEwKSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD4xJiYobi53aXJlZnJhbWVMaW5ld2lkdGg9dGhpcy53aXJlZnJhbWVMaW5ld2lkdGgpLHRoaXMud2lyZWZyYW1lTGluZWNhcCE9PSJyb3VuZCImJihuLndpcmVmcmFtZUxpbmVjYXA9dGhpcy53aXJlZnJhbWVMaW5lY2FwKSx0aGlzLndpcmVmcmFtZUxpbmVqb2luIT09InJvdW5kIiYmKG4ud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lam9pbiksdGhpcy5mbGF0U2hhZGluZz09PSEwJiYobi5mbGF0U2hhZGluZz0hMCksdGhpcy52aXNpYmxlPT09ITEmJihuLnZpc2libGU9ITEpLHRoaXMudG9uZU1hcHBlZD09PSExJiYobi50b25lTWFwcGVkPSExKSx0aGlzLmZvZz09PSExJiYobi5mb2c9ITEpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYobi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTtmdW5jdGlvbiBpKHMpe2NvbnN0IG89W107Zm9yKGNvbnN0IGEgaW4gcyl7Y29uc3QgYz1zW2FdO2RlbGV0ZSBjLm1ldGFkYXRhLG8ucHVzaChjKX1yZXR1cm4gb31pZihlKXtjb25zdCBzPWkodC50ZXh0dXJlcyksbz1pKHQuaW1hZ2VzKTtzLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1zKSxvLmxlbmd0aD4wJiYobi5pbWFnZXM9byl9cmV0dXJuIG59Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy5uYW1lPXQubmFtZSx0aGlzLmJsZW5kaW5nPXQuYmxlbmRpbmcsdGhpcy5zaWRlPXQuc2lkZSx0aGlzLnZlcnRleENvbG9ycz10LnZlcnRleENvbG9ycyx0aGlzLm9wYWNpdHk9dC5vcGFjaXR5LHRoaXMudHJhbnNwYXJlbnQ9dC50cmFuc3BhcmVudCx0aGlzLmJsZW5kU3JjPXQuYmxlbmRTcmMsdGhpcy5ibGVuZERzdD10LmJsZW5kRHN0LHRoaXMuYmxlbmRFcXVhdGlvbj10LmJsZW5kRXF1YXRpb24sdGhpcy5ibGVuZFNyY0FscGhhPXQuYmxlbmRTcmNBbHBoYSx0aGlzLmJsZW5kRHN0QWxwaGE9dC5ibGVuZERzdEFscGhhLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPXQuYmxlbmRFcXVhdGlvbkFscGhhLHRoaXMuYmxlbmRDb2xvci5jb3B5KHQuYmxlbmRDb2xvciksdGhpcy5ibGVuZEFscGhhPXQuYmxlbmRBbHBoYSx0aGlzLmRlcHRoRnVuYz10LmRlcHRoRnVuYyx0aGlzLmRlcHRoVGVzdD10LmRlcHRoVGVzdCx0aGlzLmRlcHRoV3JpdGU9dC5kZXB0aFdyaXRlLHRoaXMuc3RlbmNpbFdyaXRlTWFzaz10LnN0ZW5jaWxXcml0ZU1hc2ssdGhpcy5zdGVuY2lsRnVuYz10LnN0ZW5jaWxGdW5jLHRoaXMuc3RlbmNpbFJlZj10LnN0ZW5jaWxSZWYsdGhpcy5zdGVuY2lsRnVuY01hc2s9dC5zdGVuY2lsRnVuY01hc2ssdGhpcy5zdGVuY2lsRmFpbD10LnN0ZW5jaWxGYWlsLHRoaXMuc3RlbmNpbFpGYWlsPXQuc3RlbmNpbFpGYWlsLHRoaXMuc3RlbmNpbFpQYXNzPXQuc3RlbmNpbFpQYXNzLHRoaXMuc3RlbmNpbFdyaXRlPXQuc3RlbmNpbFdyaXRlO2NvbnN0IGU9dC5jbGlwcGluZ1BsYW5lcztsZXQgbj1udWxsO2lmKGUhPT1udWxsKXtjb25zdCBpPWUubGVuZ3RoO249bmV3IEFycmF5KGkpO2ZvcihsZXQgcz0wO3MhPT1pOysrcyluW3NdPWVbc10uY2xvbmUoKX1yZXR1cm4gdGhpcy5jbGlwcGluZ1BsYW5lcz1uLHRoaXMuY2xpcEludGVyc2VjdGlvbj10LmNsaXBJbnRlcnNlY3Rpb24sdGhpcy5jbGlwU2hhZG93cz10LmNsaXBTaGFkb3dzLHRoaXMuc2hhZG93U2lkZT10LnNoYWRvd1NpZGUsdGhpcy5jb2xvcldyaXRlPXQuY29sb3JXcml0ZSx0aGlzLnByZWNpc2lvbj10LnByZWNpc2lvbix0aGlzLnBvbHlnb25PZmZzZXQ9dC5wb2x5Z29uT2Zmc2V0LHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj10LnBvbHlnb25PZmZzZXRGYWN0b3IsdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM9dC5wb2x5Z29uT2Zmc2V0VW5pdHMsdGhpcy5kaXRoZXJpbmc9dC5kaXRoZXJpbmcsdGhpcy5hbHBoYVRlc3Q9dC5hbHBoYVRlc3QsdGhpcy5hbHBoYUhhc2g9dC5hbHBoYUhhc2gsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9dC5hbHBoYVRvQ292ZXJhZ2UsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9dC5wcmVtdWx0aXBsaWVkQWxwaGEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9dC5mb3JjZVNpbmdsZVBhc3MsdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLnRvbmVNYXBwZWQ9dC50b25lTWFwcGVkLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfX1jbGFzcyBwciBleHRlbmRzIEtle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc01lc2hCYXNpY01hdGVyaWFsPSEwLHRoaXMudHlwZT0iTWVzaEJhc2ljTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHl0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5lbnZNYXBSb3RhdGlvbj1uZXcgVW4sdGhpcy5jb21iaW5lPVJvLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLnNwZWN1bGFyTWFwPXQuc3BlY3VsYXJNYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZW52TWFwPXQuZW52TWFwLHRoaXMuZW52TWFwUm90YXRpb24uY29weSh0LmVudk1hcFJvdGF0aW9uKSx0aGlzLmNvbWJpbmU9dC5jb21iaW5lLHRoaXMucmVmbGVjdGl2aXR5PXQucmVmbGVjdGl2aXR5LHRoaXMucmVmcmFjdGlvblJhdGlvPXQucmVmcmFjdGlvblJhdGlvLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMud2lyZWZyYW1lTGluZWNhcD10LndpcmVmcmFtZUxpbmVjYXAsdGhpcy53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNvbnN0IGtpPVdNKCk7ZnVuY3Rpb24gV00oKXtjb25zdCByPW5ldyBBcnJheUJ1ZmZlcig0KSx0PW5ldyBGbG9hdDMyQXJyYXkociksZT1uZXcgVWludDMyQXJyYXkociksbj1uZXcgVWludDMyQXJyYXkoNTEyKSxpPW5ldyBVaW50MzJBcnJheSg1MTIpO2ZvcihsZXQgYz0wO2M8MjU2OysrYyl7Y29uc3QgbD1jLTEyNztsPC0yNz8obltjXT0wLG5bY3wyNTZdPTMyNzY4LGlbY109MjQsaVtjfDI1Nl09MjQpOmw8LTE0PyhuW2NdPTEwMjQ+Pi1sLTE0LG5bY3wyNTZdPTEwMjQ+Pi1sLTE0fDMyNzY4LGlbY109LWwtMSxpW2N8MjU2XT0tbC0xKTpsPD0xNT8obltjXT1sKzE1PDwxMCxuW2N8MjU2XT1sKzE1PDwxMHwzMjc2OCxpW2NdPTEzLGlbY3wyNTZdPTEzKTpsPDEyOD8obltjXT0zMTc0NCxuW2N8MjU2XT02NDUxMixpW2NdPTI0LGlbY3wyNTZdPTI0KToobltjXT0zMTc0NCxuW2N8MjU2XT02NDUxMixpW2NdPTEzLGlbY3wyNTZdPTEzKX1jb25zdCBzPW5ldyBVaW50MzJBcnJheSgyMDQ4KSxvPW5ldyBVaW50MzJBcnJheSg2NCksYT1uZXcgVWludDMyQXJyYXkoNjQpO2ZvcihsZXQgYz0xO2M8MTAyNDsrK2Mpe2xldCBsPWM8PDEzLHU9MDtmb3IoOyEobCY4Mzg4NjA4KTspbDw8PTEsdS09ODM4ODYwODtsJj0tODM4ODYwOSx1Kz05NDc5MTI3MDQsc1tjXT1sfHV9Zm9yKGxldCBjPTEwMjQ7YzwyMDQ4OysrYylzW2NdPTkzOTUyNDA5NisoYy0xMDI0PDwxMyk7Zm9yKGxldCBjPTE7YzwzMTsrK2Mpb1tjXT1jPDwyMztvWzMxXT0xMTk5NTcwOTQ0LG9bMzJdPTIxNDc0ODM2NDg7Zm9yKGxldCBjPTMzO2M8NjM7KytjKW9bY109MjE0NzQ4MzY0OCsoYy0zMjw8MjMpO29bNjNdPTMzNDcwNTQ1OTI7Zm9yKGxldCBjPTE7Yzw2NDsrK2MpYyE9PTMyJiYoYVtjXT0xMDI0KTtyZXR1cm57ZmxvYXRWaWV3OnQsdWludDMyVmlldzplLGJhc2VUYWJsZTpuLHNoaWZ0VGFibGU6aSxtYW50aXNzYVRhYmxlOnMsZXhwb25lbnRUYWJsZTpvLG9mZnNldFRhYmxlOmF9fWZ1bmN0aW9uIHZuKHIpe01hdGguYWJzKHIpPjY1NTA0JiZjb25zb2xlLndhcm4oIlRIUkVFLkRhdGFVdGlscy50b0hhbGZGbG9hdCgpOiBWYWx1ZSBvdXQgb2YgcmFuZ2UuIikscj1IdChyLC02NTUwNCw2NTUwNCksa2kuZmxvYXRWaWV3WzBdPXI7Y29uc3QgdD1raS51aW50MzJWaWV3WzBdLGU9dD4+MjMmNTExO3JldHVybiBraS5iYXNlVGFibGVbZV0rKCh0JjgzODg2MDcpPj5raS5zaGlmdFRhYmxlW2VdKX1mdW5jdGlvbiBqbyhyKXtjb25zdCB0PXI+PjEwO3JldHVybiBraS51aW50MzJWaWV3WzBdPWtpLm1hbnRpc3NhVGFibGVba2kub2Zmc2V0VGFibGVbdF0rKHImMTAyMyldK2tpLmV4cG9uZW50VGFibGVbdF0sa2kuZmxvYXRWaWV3WzBdfWNsYXNzIFhNe3N0YXRpYyB0b0hhbGZGbG9hdCh0KXtyZXR1cm4gdm4odCl9c3RhdGljIGZyb21IYWxmRmxvYXQodCl7cmV0dXJuIGpvKHQpfX1jb25zdCBGZT1uZXcgSSxvbD1uZXcgcTtsZXQgJE09MDtjbGFzcyBKdHtjb25zdHJ1Y3Rvcih0LGUsbj0hMSl7aWYoQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LiIpO3RoaXMuaXNCdWZmZXJBdHRyaWJ1dGU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6JE0rK30pLHRoaXMubmFtZT0iIix0aGlzLmFycmF5PXQsdGhpcy5pdGVtU2l6ZT1lLHRoaXMuY291bnQ9dCE9PXZvaWQgMD90Lmxlbmd0aC9lOjAsdGhpcy5ub3JtYWxpemVkPW4sdGhpcy51c2FnZT1Xbyx0aGlzLnVwZGF0ZVJhbmdlcz1bXSx0aGlzLmdwdVR5cGU9eG4sdGhpcy52ZXJzaW9uPTB9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLml0ZW1TaXplPXQuaXRlbVNpemUsdGhpcy5jb3VudD10LmNvdW50LHRoaXMubm9ybWFsaXplZD10Lm5vcm1hbGl6ZWQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXMuZ3B1VHlwZT10LmdwdVR5cGUsdGhpc31jb3B5QXQodCxlLG4pe3QqPXRoaXMuaXRlbVNpemUsbio9ZS5pdGVtU2l6ZTtmb3IobGV0IGk9MCxzPXRoaXMuaXRlbVNpemU7aTxzO2krKyl0aGlzLmFycmF5W3QraV09ZS5hcnJheVtuK2ldO3JldHVybiB0aGlzfWNvcHlBcnJheSh0KXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCksdGhpc31hcHBseU1hdHJpeDModCl7aWYodGhpcy5pdGVtU2l6ZT09PTIpZm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspb2wuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLG9sLmFwcGx5TWF0cml4Myh0KSx0aGlzLnNldFhZKGUsb2wueCxvbC55KTtlbHNlIGlmKHRoaXMuaXRlbVNpemU9PT0zKWZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKUZlLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxGZS5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWVooZSxGZS54LEZlLnksRmUueik7cmV0dXJuIHRoaXN9YXBwbHlNYXRyaXg0KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKUZlLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxGZS5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRYWVooZSxGZS54LEZlLnksRmUueik7cmV0dXJuIHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspRmUuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLEZlLmFwcGx5Tm9ybWFsTWF0cml4KHQpLHRoaXMuc2V0WFlaKGUsRmUueCxGZS55LEZlLnopO3JldHVybiB0aGlzfXRyYW5zZm9ybURpcmVjdGlvbih0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylGZS5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksRmUudHJhbnNmb3JtRGlyZWN0aW9uKHQpLHRoaXMuc2V0WFlaKGUsRmUueCxGZS55LEZlLnopO3JldHVybiB0aGlzfXNldCh0LGU9MCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQsZSksdGhpc31nZXRDb21wb25lbnQodCxlKXtsZXQgbj10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZStlXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYobj1ybihuLHRoaXMuYXJyYXkpKSxufXNldENvbXBvbmVudCh0LGUsbil7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKG49WXQobix0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV09bix0aGlzfWdldFgodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPXJuKGUsdGhpcy5hcnJheSkpLGV9c2V0WCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVl0KGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplXT1lLHRoaXN9Z2V0WSh0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsxXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1ybihlLHRoaXMuYXJyYXkpKSxlfXNldFkodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1ZdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsxXT1lLHRoaXN9Z2V0Wih0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1ybihlLHRoaXMuYXJyYXkpKSxlfXNldFoodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1ZdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXT1lLHRoaXN9Z2V0Vyh0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1ybihlLHRoaXMuYXJyYXkpKSxlfXNldFcodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1ZdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXT1lLHRoaXN9c2V0WFkodCxlLG4pe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9WXQoZSx0aGlzLmFycmF5KSxuPVl0KG4sdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1lLHRoaXMuYXJyYXlbdCsxXT1uLHRoaXN9c2V0WFlaKHQsZSxuLGkpe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9WXQoZSx0aGlzLmFycmF5KSxuPVl0KG4sdGhpcy5hcnJheSksaT1ZdChpLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzLmFycmF5W3QrMl09aSx0aGlzfXNldFhZWlcodCxlLG4saSxzKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPVl0KGUsdGhpcy5hcnJheSksbj1ZdChuLHRoaXMuYXJyYXkpLGk9WXQoaSx0aGlzLmFycmF5KSxzPVl0KHMsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1lLHRoaXMuYXJyYXlbdCsxXT1uLHRoaXMuYXJyYXlbdCsyXT1pLHRoaXMuYXJyYXlbdCszXT1zLHRoaXN9b25VcGxvYWQodCl7cmV0dXJuIHRoaXMub25VcGxvYWRDYWxsYmFjaz10LHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5hcnJheSx0aGlzLml0ZW1TaXplKS5jb3B5KHRoaXMpfXRvSlNPTigpe2NvbnN0IHQ9e2l0ZW1TaXplOnRoaXMuaXRlbVNpemUsdHlwZTp0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkuZnJvbSh0aGlzLmFycmF5KSxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH07cmV0dXJuIHRoaXMubmFtZSE9PSIiJiYodC5uYW1lPXRoaXMubmFtZSksdGhpcy51c2FnZSE9PVdvJiYodC51c2FnZT10aGlzLnVzYWdlKSx0fX1jbGFzcyBxTSBleHRlbmRzIEp0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgSW50OEFycmF5KHQpLGUsbil9fWNsYXNzIFlNIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50OEFycmF5KHQpLGUsbil9fWNsYXNzIFpNIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50OENsYW1wZWRBcnJheSh0KSxlLG4pfX1jbGFzcyBKTSBleHRlbmRzIEp0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgSW50MTZBcnJheSh0KSxlLG4pfX1jbGFzcyBTZiBleHRlbmRzIEp0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgVWludDE2QXJyYXkodCksZSxuKX19Y2xhc3MgS00gZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IEludDMyQXJyYXkodCksZSxuKX19Y2xhc3MgYmYgZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQzMkFycmF5KHQpLGUsbil9fWNsYXNzIGpNIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50MTZBcnJheSh0KSxlLG4pLHRoaXMuaXNGbG9hdDE2QnVmZmVyQXR0cmlidXRlPSEwfWdldFgodCl7bGV0IGU9am8odGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdKTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1ybihlLHRoaXMuYXJyYXkpKSxlfXNldFgodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1ZdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV09dm4oZSksdGhpc31nZXRZKHQpe2xldCBlPWpvKHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdKTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1ybihlLHRoaXMuYXJyYXkpKSxlfXNldFkodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1ZdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsxXT12bihlKSx0aGlzfWdldFoodCl7bGV0IGU9am8odGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl0pO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPXJuKGUsdGhpcy5hcnJheSkpLGV9c2V0Wih0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVl0KGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzJdPXZuKGUpLHRoaXN9Z2V0Vyh0KXtsZXQgZT1qbyh0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXSk7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9cm4oZSx0aGlzLmFycmF5KSksZX1zZXRXKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9WXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM109dm4oZSksdGhpc31zZXRYWSh0LGUsbil7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT1ZdChlLHRoaXMuYXJyYXkpLG49WXQobix0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPXZuKGUpLHRoaXMuYXJyYXlbdCsxXT12bihuKSx0aGlzfXNldFhZWih0LGUsbixpKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPVl0KGUsdGhpcy5hcnJheSksbj1ZdChuLHRoaXMuYXJyYXkpLGk9WXQoaSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPXZuKGUpLHRoaXMuYXJyYXlbdCsxXT12bihuKSx0aGlzLmFycmF5W3QrMl09dm4oaSksdGhpc31zZXRYWVpXKHQsZSxuLGkscyl7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT1ZdChlLHRoaXMuYXJyYXkpLG49WXQobix0aGlzLmFycmF5KSxpPVl0KGksdGhpcy5hcnJheSkscz1ZdChzLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09dm4oZSksdGhpcy5hcnJheVt0KzFdPXZuKG4pLHRoaXMuYXJyYXlbdCsyXT12bihpKSx0aGlzLmFycmF5W3QrM109dm4ocyksdGhpc319Y2xhc3MgdnQgZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IEZsb2F0MzJBcnJheSh0KSxlLG4pfX1sZXQgUU09MDtjb25zdCBXbj1uZXcgQ3Qsd2Y9bmV3IHNlLEdzPW5ldyBJLE5uPW5ldyBsZSxRbz1uZXcgbGUsSGU9bmV3IEk7Y2xhc3MgTnQgZXh0ZW5kcyB5aXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc0J1ZmZlckdlb21ldHJ5PSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOlFNKyt9KSx0aGlzLnV1aWQ9TG4oKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSIsdGhpcy5pbmRleD1udWxsLHRoaXMuaW5kaXJlY3Q9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT0hMSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsLHRoaXMuZHJhd1JhbmdlPXtzdGFydDowLGNvdW50OjEvMH0sdGhpcy51c2VyRGF0YT17fX1nZXRJbmRleCgpe3JldHVybiB0aGlzLmluZGV4fXNldEluZGV4KHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP3RoaXMuaW5kZXg9bmV3KHFtKHQpP2JmOlNmKSh0LDEpOnRoaXMuaW5kZXg9dCx0aGlzfXNldEluZGlyZWN0KHQpe3JldHVybiB0aGlzLmluZGlyZWN0PXQsdGhpc31nZXRJbmRpcmVjdCgpe3JldHVybiB0aGlzLmluZGlyZWN0fWdldEF0dHJpYnV0ZSh0KXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdfXNldEF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF09ZSx0aGlzfWRlbGV0ZUF0dHJpYnV0ZSh0KXtyZXR1cm4gZGVsZXRlIHRoaXMuYXR0cmlidXRlc1t0XSx0aGlzfWhhc0F0dHJpYnV0ZSh0KXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdIT09dm9pZCAwfWFkZEdyb3VwKHQsZSxuPTApe3RoaXMuZ3JvdXBzLnB1c2goe3N0YXJ0OnQsY291bnQ6ZSxtYXRlcmlhbEluZGV4Om59KX1jbGVhckdyb3Vwcygpe3RoaXMuZ3JvdXBzPVtdfXNldERyYXdSYW5nZSh0LGUpe3RoaXMuZHJhd1JhbmdlLnN0YXJ0PXQsdGhpcy5kcmF3UmFuZ2UuY291bnQ9ZX1hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247ZSE9PXZvaWQgMCYmKGUuYXBwbHlNYXRyaXg0KHQpLGUubmVlZHNVcGRhdGU9ITApO2NvbnN0IG49dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtpZihuIT09dm9pZCAwKXtjb25zdCBzPW5ldyBXdCgpLmdldE5vcm1hbE1hdHJpeCh0KTtuLmFwcGx5Tm9ybWFsTWF0cml4KHMpLG4ubmVlZHNVcGRhdGU9ITB9Y29uc3QgaT10aGlzLmF0dHJpYnV0ZXMudGFuZ2VudDtyZXR1cm4gaSE9PXZvaWQgMCYmKGkudHJhbnNmb3JtRGlyZWN0aW9uKHQpLGkubmVlZHNVcGRhdGU9ITApLHRoaXMuYm91bmRpbmdCb3ghPT1udWxsJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpLHRoaXMuYm91bmRpbmdTcGhlcmUhPT1udWxsJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKHQpe3JldHVybiBXbi5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLmFwcGx5TWF0cml4NChXbiksdGhpc31yb3RhdGVYKHQpe3JldHVybiBXbi5tYWtlUm90YXRpb25YKHQpLHRoaXMuYXBwbHlNYXRyaXg0KFduKSx0aGlzfXJvdGF0ZVkodCl7cmV0dXJuIFduLm1ha2VSb3RhdGlvblkodCksdGhpcy5hcHBseU1hdHJpeDQoV24pLHRoaXN9cm90YXRlWih0KXtyZXR1cm4gV24ubWFrZVJvdGF0aW9uWih0KSx0aGlzLmFwcGx5TWF0cml4NChXbiksdGhpc310cmFuc2xhdGUodCxlLG4pe3JldHVybiBXbi5tYWtlVHJhbnNsYXRpb24odCxlLG4pLHRoaXMuYXBwbHlNYXRyaXg0KFduKSx0aGlzfXNjYWxlKHQsZSxuKXtyZXR1cm4gV24ubWFrZVNjYWxlKHQsZSxuKSx0aGlzLmFwcGx5TWF0cml4NChXbiksdGhpc31sb29rQXQodCl7cmV0dXJuIHdmLmxvb2tBdCh0KSx3Zi51cGRhdGVNYXRyaXgoKSx0aGlzLmFwcGx5TWF0cml4NCh3Zi5tYXRyaXgpLHRoaXN9Y2VudGVyKCl7cmV0dXJuIHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksdGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoR3MpLm5lZ2F0ZSgpLHRoaXMudHJhbnNsYXRlKEdzLngsR3MueSxHcy56KSx0aGlzfXNldEZyb21Qb2ludHModCl7Y29uc3QgZT10aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZihlPT09dm9pZCAwKXtjb25zdCBuPVtdO2ZvcihsZXQgaT0wLHM9dC5sZW5ndGg7aTxzO2krKyl7Y29uc3Qgbz10W2ldO24ucHVzaChvLngsby55LG8uenx8MCl9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgdnQobiwzKSl9ZWxzZXtjb25zdCBuPU1hdGgubWluKHQubGVuZ3RoLGUuY291bnQpO2ZvcihsZXQgaT0wO2k8bjtpKyspe2NvbnN0IHM9dFtpXTtlLnNldFhZWihpLHMueCxzLnkscy56fHwwKX10Lmxlbmd0aD5lLmNvdW50JiZjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiBCdWZmZXIgc2l6ZSB0b28gc21hbGwgZm9yIHBvaW50cyBkYXRhLiBVc2UgLmRpc3Bvc2UoKSBhbmQgY3JlYXRlIGEgbmV3IGdlb21ldHJ5LiIpLGUubmVlZHNVcGRhdGU9ITB9cmV0dXJuIHRoaXN9Y29tcHV0ZUJvdW5kaW5nQm94KCl7dGhpcy5ib3VuZGluZ0JveD09PW51bGwmJih0aGlzLmJvdW5kaW5nQm94PW5ldyBsZSk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBib3guIix0aGlzKSx0aGlzLmJvdW5kaW5nQm94LnNldChuZXcgSSgtMS8wLC0xLzAsLTEvMCksbmV3IEkoMS8wLDEvMCwxLzApKTtyZXR1cm59aWYodCE9PXZvaWQgMCl7aWYodGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuPGk7bisrKXtjb25zdCBzPWVbbl07Tm4uc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShzKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhIZS5hZGRWZWN0b3JzKHRoaXMuYm91bmRpbmdCb3gubWluLE5uLm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KEhlKSxIZS5hZGRWZWN0b3JzKHRoaXMuYm91bmRpbmdCb3gubWF4LE5uLm1heCksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KEhlKSk6KHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChObi5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChObi5tYXgpKX19ZWxzZSB0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpOyhpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi54KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueSl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnopKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfWNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpe3RoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgR2UpO2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodCYmdC5pc0dMQnVmZmVyQXR0cmlidXRlKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgc3BoZXJlLiIsdGhpcyksdGhpcy5ib3VuZGluZ1NwaGVyZS5zZXQobmV3IEksMS8wKTtyZXR1cm59aWYodCl7Y29uc3Qgbj10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtpZihObi5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCBzPTAsbz1lLmxlbmd0aDtzPG87cysrKXtjb25zdCBhPWVbc107UW8uc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShhKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhIZS5hZGRWZWN0b3JzKE5uLm1pbixRby5taW4pLE5uLmV4cGFuZEJ5UG9pbnQoSGUpLEhlLmFkZFZlY3RvcnMoTm4ubWF4LFFvLm1heCksTm4uZXhwYW5kQnlQb2ludChIZSkpOihObi5leHBhbmRCeVBvaW50KFFvLm1pbiksTm4uZXhwYW5kQnlQb2ludChRby5tYXgpKX1Obi5nZXRDZW50ZXIobik7bGV0IGk9MDtmb3IobGV0IHM9MCxvPXQuY291bnQ7czxvO3MrKylIZS5mcm9tQnVmZmVyQXR0cmlidXRlKHQscyksaT1NYXRoLm1heChpLG4uZGlzdGFuY2VUb1NxdWFyZWQoSGUpKTtpZihlKWZvcihsZXQgcz0wLG89ZS5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT1lW3NdLGM9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtmb3IobGV0IGw9MCx1PWEuY291bnQ7bDx1O2wrKylIZS5mcm9tQnVmZmVyQXR0cmlidXRlKGEsbCksYyYmKEdzLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxsKSxIZS5hZGQoR3MpKSxpPU1hdGgubWF4KGksbi5kaXN0YW5jZVRvU3F1YXJlZChIZSkpfXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzPU1hdGguc3FydChpKSxpc05hTih0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cykmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfX1jb21wdXRlVGFuZ2VudHMoKXtjb25zdCB0PXRoaXMuaW5kZXgsZT10aGlzLmF0dHJpYnV0ZXM7aWYodD09PW51bGx8fGUucG9zaXRpb249PT12b2lkIDB8fGUubm9ybWFsPT09dm9pZCAwfHxlLnV2PT09dm9pZCAwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGZhaWxlZC4gTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzIChpbmRleCwgcG9zaXRpb24sIG5vcm1hbCBvciB1dikiKTtyZXR1cm59Y29uc3Qgbj1lLnBvc2l0aW9uLGk9ZS5ub3JtYWwscz1lLnV2O3RoaXMuaGFzQXR0cmlidXRlKCJ0YW5nZW50Iik9PT0hMSYmdGhpcy5zZXRBdHRyaWJ1dGUoInRhbmdlbnQiLG5ldyBKdChuZXcgRmxvYXQzMkFycmF5KDQqbi5jb3VudCksNCkpO2NvbnN0IG89dGhpcy5nZXRBdHRyaWJ1dGUoInRhbmdlbnQiKSxhPVtdLGM9W107Zm9yKGxldCBUPTA7VDxuLmNvdW50O1QrKylhW1RdPW5ldyBJLGNbVF09bmV3IEk7Y29uc3QgbD1uZXcgSSx1PW5ldyBJLGg9bmV3IEksZj1uZXcgcSxkPW5ldyBxLHA9bmV3IHEseD1uZXcgSSxnPW5ldyBJO2Z1bmN0aW9uIG0oVCxiLE0pe2wuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLFQpLHUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLGIpLGguZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLE0pLGYuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLFQpLGQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGIpLHAuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLE0pLHUuc3ViKGwpLGguc3ViKGwpLGQuc3ViKGYpLHAuc3ViKGYpO2NvbnN0IEU9MS8oZC54KnAueS1wLngqZC55KTtpc0Zpbml0ZShFKSYmKHguY29weSh1KS5tdWx0aXBseVNjYWxhcihwLnkpLmFkZFNjYWxlZFZlY3RvcihoLC1kLnkpLm11bHRpcGx5U2NhbGFyKEUpLGcuY29weShoKS5tdWx0aXBseVNjYWxhcihkLngpLmFkZFNjYWxlZFZlY3Rvcih1LC1wLngpLm11bHRpcGx5U2NhbGFyKEUpLGFbVF0uYWRkKHgpLGFbYl0uYWRkKHgpLGFbTV0uYWRkKHgpLGNbVF0uYWRkKGcpLGNbYl0uYWRkKGcpLGNbTV0uYWRkKGcpKX1sZXQgdj10aGlzLmdyb3Vwczt2Lmxlbmd0aD09PTAmJih2PVt7c3RhcnQ6MCxjb3VudDp0LmNvdW50fV0pO2ZvcihsZXQgVD0wLGI9di5sZW5ndGg7VDxiOysrVCl7Y29uc3QgTT12W1RdLEU9TS5zdGFydCxEPU0uY291bnQ7Zm9yKGxldCBMPUUsRj1FK0Q7TDxGO0wrPTMpbSh0LmdldFgoTCswKSx0LmdldFgoTCsxKSx0LmdldFgoTCsyKSl9Y29uc3QgeT1uZXcgSSxfPW5ldyBJLFM9bmV3IEksdz1uZXcgSTtmdW5jdGlvbiBBKFQpe1MuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLFQpLHcuY29weShTKTtjb25zdCBiPWFbVF07eS5jb3B5KGIpLHkuc3ViKFMubXVsdGlwbHlTY2FsYXIoUy5kb3QoYikpKS5ub3JtYWxpemUoKSxfLmNyb3NzVmVjdG9ycyh3LGIpO2NvbnN0IEU9Xy5kb3QoY1tUXSk8MD8tMToxO28uc2V0WFlaVyhULHkueCx5LnkseS56LEUpfWZvcihsZXQgVD0wLGI9di5sZW5ndGg7VDxiOysrVCl7Y29uc3QgTT12W1RdLEU9TS5zdGFydCxEPU0uY291bnQ7Zm9yKGxldCBMPUUsRj1FK0Q7TDxGO0wrPTMpQSh0LmdldFgoTCswKSksQSh0LmdldFgoTCsxKSksQSh0LmdldFgoTCsyKSl9fWNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZSE9PXZvaWQgMCl7bGV0IG49dGhpcy5nZXRBdHRyaWJ1dGUoIm5vcm1hbCIpO2lmKG49PT12b2lkIDApbj1uZXcgSnQobmV3IEZsb2F0MzJBcnJheShlLmNvdW50KjMpLDMpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG4pO2Vsc2UgZm9yKGxldCBmPTAsZD1uLmNvdW50O2Y8ZDtmKyspbi5zZXRYWVooZiwwLDAsMCk7Y29uc3QgaT1uZXcgSSxzPW5ldyBJLG89bmV3IEksYT1uZXcgSSxjPW5ldyBJLGw9bmV3IEksdT1uZXcgSSxoPW5ldyBJO2lmKHQpZm9yKGxldCBmPTAsZD10LmNvdW50O2Y8ZDtmKz0zKXtjb25zdCBwPXQuZ2V0WChmKzApLHg9dC5nZXRYKGYrMSksZz10LmdldFgoZisyKTtpLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxwKSxzLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSx4KSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxnKSx1LnN1YlZlY3RvcnMobyxzKSxoLnN1YlZlY3RvcnMoaSxzKSx1LmNyb3NzKGgpLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHApLGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHgpLGwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLGcpLGEuYWRkKHUpLGMuYWRkKHUpLGwuYWRkKHUpLG4uc2V0WFlaKHAsYS54LGEueSxhLnopLG4uc2V0WFlaKHgsYy54LGMueSxjLnopLG4uc2V0WFlaKGcsbC54LGwueSxsLnopfWVsc2UgZm9yKGxldCBmPTAsZD1lLmNvdW50O2Y8ZDtmKz0zKWkuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGYrMCkscy5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZisxKSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxmKzIpLHUuc3ViVmVjdG9ycyhvLHMpLGguc3ViVmVjdG9ycyhpLHMpLHUuY3Jvc3MoaCksbi5zZXRYWVooZiswLHUueCx1LnksdS56KSxuLnNldFhZWihmKzEsdS54LHUueSx1LnopLG4uc2V0WFlaKGYrMix1LngsdS55LHUueik7dGhpcy5ub3JtYWxpemVOb3JtYWxzKCksbi5uZWVkc1VwZGF0ZT0hMH19bm9ybWFsaXplTm9ybWFscygpe2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtmb3IobGV0IGU9MCxuPXQuY291bnQ7ZTxuO2UrKylIZS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksSGUubm9ybWFsaXplKCksdC5zZXRYWVooZSxIZS54LEhlLnksSGUueil9dG9Ob25JbmRleGVkKCl7ZnVuY3Rpb24gdChhLGMpe2NvbnN0IGw9YS5hcnJheSx1PWEuaXRlbVNpemUsaD1hLm5vcm1hbGl6ZWQsZj1uZXcgbC5jb25zdHJ1Y3RvcihjLmxlbmd0aCp1KTtsZXQgZD0wLHA9MDtmb3IobGV0IHg9MCxnPWMubGVuZ3RoO3g8Zzt4Kyspe2EuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT9kPWNbeF0qYS5kYXRhLnN0cmlkZSthLm9mZnNldDpkPWNbeF0qdTtmb3IobGV0IG09MDttPHU7bSsrKWZbcCsrXT1sW2QrK119cmV0dXJuIG5ldyBKdChmLHUsaCl9aWYodGhpcy5pbmRleD09PW51bGwpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkudG9Ob25JbmRleGVkKCk6IEJ1ZmZlckdlb21ldHJ5IGlzIGFscmVhZHkgbm9uLWluZGV4ZWQuIiksdGhpcztjb25zdCBlPW5ldyBOdCxuPXRoaXMuaW5kZXguYXJyYXksaT10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGEgaW4gaSl7Y29uc3QgYz1pW2FdLGw9dChjLG4pO2Uuc2V0QXR0cmlidXRlKGEsbCl9Y29uc3Qgcz10aGlzLm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgYSBpbiBzKXtjb25zdCBjPVtdLGw9c1thXTtmb3IobGV0IHU9MCxoPWwubGVuZ3RoO3U8aDt1Kyspe2NvbnN0IGY9bFt1XSxkPXQoZixuKTtjLnB1c2goZCl9ZS5tb3JwaEF0dHJpYnV0ZXNbYV09Y31lLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbz10aGlzLmdyb3Vwcztmb3IobGV0IGE9MCxjPW8ubGVuZ3RoO2E8YzthKyspe2NvbnN0IGw9b1thXTtlLmFkZEdyb3VwKGwuc3RhcnQsbC5jb3VudCxsLm1hdGVyaWFsSW5kZXgpfXJldHVybiBlfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJCdWZmZXJHZW9tZXRyeSIsZ2VuZXJhdG9yOiJCdWZmZXJHZW9tZXRyeS50b0pTT04ifX07aWYodC51dWlkPXRoaXMudXVpZCx0LnR5cGU9dGhpcy50eXBlLHRoaXMubmFtZSE9PSIiJiYodC5uYW1lPXRoaXMubmFtZSksT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJih0LnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLHRoaXMucGFyYW1ldGVycyE9PXZvaWQgMCl7Y29uc3QgYz10aGlzLnBhcmFtZXRlcnM7Zm9yKGNvbnN0IGwgaW4gYyljW2xdIT09dm9pZCAwJiYodFtsXT1jW2xdKTtyZXR1cm4gdH10LmRhdGE9e2F0dHJpYnV0ZXM6e319O2NvbnN0IGU9dGhpcy5pbmRleDtlIT09bnVsbCYmKHQuZGF0YS5pbmRleD17dHlwZTplLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5hcnJheSl9KTtjb25zdCBuPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgYyBpbiBuKXtjb25zdCBsPW5bY107dC5kYXRhLmF0dHJpYnV0ZXNbY109bC50b0pTT04odC5kYXRhKX1jb25zdCBpPXt9O2xldCBzPSExO2Zvcihjb25zdCBjIGluIHRoaXMubW9ycGhBdHRyaWJ1dGVzKXtjb25zdCBsPXRoaXMubW9ycGhBdHRyaWJ1dGVzW2NdLHU9W107Zm9yKGxldCBoPTAsZj1sLmxlbmd0aDtoPGY7aCsrKXtjb25zdCBkPWxbaF07dS5wdXNoKGQudG9KU09OKHQuZGF0YSkpfXUubGVuZ3RoPjAmJihpW2NdPXUscz0hMCl9cyYmKHQuZGF0YS5tb3JwaEF0dHJpYnV0ZXM9aSx0LmRhdGEubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSk7Y29uc3Qgbz10aGlzLmdyb3VwcztvLmxlbmd0aD4wJiYodC5kYXRhLmdyb3Vwcz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG8pKSk7Y29uc3QgYT10aGlzLmJvdW5kaW5nU3BoZXJlO3JldHVybiBhIT09bnVsbCYmKHQuZGF0YS5ib3VuZGluZ1NwaGVyZT17Y2VudGVyOmEuY2VudGVyLnRvQXJyYXkoKSxyYWRpdXM6YS5yYWRpdXN9KSx0fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMuaW5kZXg9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5ncm91cHM9W10sdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbDtjb25zdCBlPXt9O3RoaXMubmFtZT10Lm5hbWU7Y29uc3Qgbj10LmluZGV4O24hPT1udWxsJiZ0aGlzLnNldEluZGV4KG4uY2xvbmUoKSk7Y29uc3QgaT10LmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGwgaW4gaSl7Y29uc3QgdT1pW2xdO3RoaXMuc2V0QXR0cmlidXRlKGwsdS5jbG9uZShlKSl9Y29uc3Qgcz10Lm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgbCBpbiBzKXtjb25zdCB1PVtdLGg9c1tsXTtmb3IobGV0IGY9MCxkPWgubGVuZ3RoO2Y8ZDtmKyspdS5wdXNoKGhbZl0uY2xvbmUoZSkpO3RoaXMubW9ycGhBdHRyaWJ1dGVzW2xdPXV9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT10Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2NvbnN0IG89dC5ncm91cHM7Zm9yKGxldCBsPTAsdT1vLmxlbmd0aDtsPHU7bCsrKXtjb25zdCBoPW9bbF07dGhpcy5hZGRHcm91cChoLnN0YXJ0LGguY291bnQsaC5tYXRlcmlhbEluZGV4KX1jb25zdCBhPXQuYm91bmRpbmdCb3g7YSE9PW51bGwmJih0aGlzLmJvdW5kaW5nQm94PWEuY2xvbmUoKSk7Y29uc3QgYz10LmJvdW5kaW5nU3BoZXJlO3JldHVybiBjIT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9Yy5jbG9uZSgpKSx0aGlzLmRyYXdSYW5nZS5zdGFydD10LmRyYXdSYW5nZS5zdGFydCx0aGlzLmRyYXdSYW5nZS5jb3VudD10LmRyYXdSYW5nZS5jb3VudCx0aGlzLnVzZXJEYXRhPXQudXNlckRhdGEsdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX1jb25zdCBsZz1uZXcgQ3QsT3I9bmV3IGhyLGFsPW5ldyBHZSx1Zz1uZXcgSSxjbD1uZXcgSSxsbD1uZXcgSSx1bD1uZXcgSSxBZj1uZXcgSSxobD1uZXcgSSxoZz1uZXcgSSxmbD1uZXcgSTtjbGFzcyBMZSBleHRlbmRzIHNle2NvbnN0cnVjdG9yKHQ9bmV3IE50LGU9bmV3IHByKXtzdXBlcigpLHRoaXMuaXNNZXNoPSEwLHRoaXMudHlwZT0iTWVzaCIsdGhpcy5nZW9tZXRyeT10LHRoaXMubWF0ZXJpYWw9ZSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT12b2lkIDAsdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9dm9pZCAwLHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdC5tb3JwaFRhcmdldEluZmx1ZW5jZXMhPT12b2lkIDAmJih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz10Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5zbGljZSgpKSx0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeSE9PXZvaWQgMCYmKHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PU9iamVjdC5hc3NpZ24oe30sdC5tb3JwaFRhcmdldERpY3Rpb25hcnkpKSx0aGlzLm1hdGVyaWFsPUFycmF5LmlzQXJyYXkodC5tYXRlcmlhbCk/dC5tYXRlcmlhbC5zbGljZSgpOnQubWF0ZXJpYWwsdGhpcy5nZW9tZXRyeT10Lmdlb21ldHJ5LHRoaXN9dXBkYXRlTW9ycGhUYXJnZXRzKCl7Y29uc3QgZT10aGlzLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyxuPU9iamVjdC5rZXlzKGUpO2lmKG4ubGVuZ3RoPjApe2NvbnN0IGk9ZVtuWzBdXTtpZihpIT09dm9pZCAwKXt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT17fTtmb3IobGV0IHM9MCxvPWkubGVuZ3RoO3M8bztzKyspe2NvbnN0IGE9aVtzXS5uYW1lfHxTdHJpbmcocyk7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVthXT1zfX19fWdldFZlcnRleFBvc2l0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLmdlb21ldHJ5LGk9bi5hdHRyaWJ1dGVzLnBvc2l0aW9uLHM9bi5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sbz1uLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLHQpO2NvbnN0IGE9dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM7aWYocyYmYSl7aGwuc2V0KDAsMCwwKTtmb3IobGV0IGM9MCxsPXMubGVuZ3RoO2M8bDtjKyspe2NvbnN0IHU9YVtjXSxoPXNbY107dSE9PTAmJihBZi5mcm9tQnVmZmVyQXR0cmlidXRlKGgsdCksbz9obC5hZGRTY2FsZWRWZWN0b3IoQWYsdSk6aGwuYWRkU2NhbGVkVmVjdG9yKEFmLnN1YihlKSx1KSl9ZS5hZGQoaGwpfXJldHVybiBlfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnksaT10aGlzLm1hdGVyaWFsLHM9dGhpcy5tYXRyaXhXb3JsZDtpIT09dm9pZCAwJiYobi5ib3VuZGluZ1NwaGVyZT09PW51bGwmJm4uY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksYWwuY29weShuLmJvdW5kaW5nU3BoZXJlKSxhbC5hcHBseU1hdHJpeDQocyksT3IuY29weSh0LnJheSkucmVjYXN0KHQubmVhciksIShhbC5jb250YWluc1BvaW50KE9yLm9yaWdpbik9PT0hMSYmKE9yLmludGVyc2VjdFNwaGVyZShhbCx1Zyk9PT1udWxsfHxPci5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQodWcpPkNvKHQuZmFyLXQubmVhciwyKSkpJiYobGcuY29weShzKS5pbnZlcnQoKSxPci5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQobGcpLCEobi5ib3VuZGluZ0JveCE9PW51bGwmJk9yLmludGVyc2VjdHNCb3gobi5ib3VuZGluZ0JveCk9PT0hMSkmJnRoaXMuX2NvbXB1dGVJbnRlcnNlY3Rpb25zKHQsZSxPcikpKX1fY29tcHV0ZUludGVyc2VjdGlvbnModCxlLG4pe2xldCBpO2NvbnN0IHM9dGhpcy5nZW9tZXRyeSxvPXRoaXMubWF0ZXJpYWwsYT1zLmluZGV4LGM9cy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9cy5hdHRyaWJ1dGVzLnV2LHU9cy5hdHRyaWJ1dGVzLnV2MSxoPXMuYXR0cmlidXRlcy5ub3JtYWwsZj1zLmdyb3VwcyxkPXMuZHJhd1JhbmdlO2lmKGEhPT1udWxsKWlmKEFycmF5LmlzQXJyYXkobykpZm9yKGxldCBwPTAseD1mLmxlbmd0aDtwPHg7cCsrKXtjb25zdCBnPWZbcF0sbT1vW2cubWF0ZXJpYWxJbmRleF0sdj1NYXRoLm1heChnLnN0YXJ0LGQuc3RhcnQpLHk9TWF0aC5taW4oYS5jb3VudCxNYXRoLm1pbihnLnN0YXJ0K2cuY291bnQsZC5zdGFydCtkLmNvdW50KSk7Zm9yKGxldCBfPXYsUz15O188UztfKz0zKXtjb25zdCB3PWEuZ2V0WChfKSxBPWEuZ2V0WChfKzEpLFQ9YS5nZXRYKF8rMik7aT1kbCh0aGlzLG0sdCxuLGwsdSxoLHcsQSxUKSxpJiYoaS5mYWNlSW5kZXg9TWF0aC5mbG9vcihfLzMpLGkuZmFjZS5tYXRlcmlhbEluZGV4PWcubWF0ZXJpYWxJbmRleCxlLnB1c2goaSkpfX1lbHNle2NvbnN0IHA9TWF0aC5tYXgoMCxkLnN0YXJ0KSx4PU1hdGgubWluKGEuY291bnQsZC5zdGFydCtkLmNvdW50KTtmb3IobGV0IGc9cCxtPXg7ZzxtO2crPTMpe2NvbnN0IHY9YS5nZXRYKGcpLHk9YS5nZXRYKGcrMSksXz1hLmdldFgoZysyKTtpPWRsKHRoaXMsbyx0LG4sbCx1LGgsdix5LF8pLGkmJihpLmZhY2VJbmRleD1NYXRoLmZsb29yKGcvMyksZS5wdXNoKGkpKX19ZWxzZSBpZihjIT09dm9pZCAwKWlmKEFycmF5LmlzQXJyYXkobykpZm9yKGxldCBwPTAseD1mLmxlbmd0aDtwPHg7cCsrKXtjb25zdCBnPWZbcF0sbT1vW2cubWF0ZXJpYWxJbmRleF0sdj1NYXRoLm1heChnLnN0YXJ0LGQuc3RhcnQpLHk9TWF0aC5taW4oYy5jb3VudCxNYXRoLm1pbihnLnN0YXJ0K2cuY291bnQsZC5zdGFydCtkLmNvdW50KSk7Zm9yKGxldCBfPXYsUz15O188UztfKz0zKXtjb25zdCB3PV8sQT1fKzEsVD1fKzI7aT1kbCh0aGlzLG0sdCxuLGwsdSxoLHcsQSxUKSxpJiYoaS5mYWNlSW5kZXg9TWF0aC5mbG9vcihfLzMpLGkuZmFjZS5tYXRlcmlhbEluZGV4PWcubWF0ZXJpYWxJbmRleCxlLnB1c2goaSkpfX1lbHNle2NvbnN0IHA9TWF0aC5tYXgoMCxkLnN0YXJ0KSx4PU1hdGgubWluKGMuY291bnQsZC5zdGFydCtkLmNvdW50KTtmb3IobGV0IGc9cCxtPXg7ZzxtO2crPTMpe2NvbnN0IHY9Zyx5PWcrMSxfPWcrMjtpPWRsKHRoaXMsbyx0LG4sbCx1LGgsdix5LF8pLGkmJihpLmZhY2VJbmRleD1NYXRoLmZsb29yKGcvMyksZS5wdXNoKGkpKX19fX1mdW5jdGlvbiB0UyhyLHQsZSxuLGkscyxvLGEpe2xldCBjO2lmKHQuc2lkZT09PVllP2M9bi5pbnRlcnNlY3RUcmlhbmdsZShvLHMsaSwhMCxhKTpjPW4uaW50ZXJzZWN0VHJpYW5nbGUoaSxzLG8sdC5zaWRlPT09ZWksYSksYz09PW51bGwpcmV0dXJuIG51bGw7ZmwuY29weShhKSxmbC5hcHBseU1hdHJpeDQoci5tYXRyaXhXb3JsZCk7Y29uc3QgbD1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhmbCk7cmV0dXJuIGw8ZS5uZWFyfHxsPmUuZmFyP251bGw6e2Rpc3RhbmNlOmwscG9pbnQ6ZmwuY2xvbmUoKSxvYmplY3Q6cn19ZnVuY3Rpb24gZGwocix0LGUsbixpLHMsbyxhLGMsbCl7ci5nZXRWZXJ0ZXhQb3NpdGlvbihhLGNsKSxyLmdldFZlcnRleFBvc2l0aW9uKGMsbGwpLHIuZ2V0VmVydGV4UG9zaXRpb24obCx1bCk7Y29uc3QgdT10UyhyLHQsZSxuLGNsLGxsLHVsLGhnKTtpZih1KXtjb25zdCBoPW5ldyBJO2dlLmdldEJhcnljb29yZChoZyxjbCxsbCx1bCxoKSxpJiYodS51dj1nZS5nZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUoaSxhLGMsbCxoLG5ldyBxKSkscyYmKHUudXYxPWdlLmdldEludGVycG9sYXRlZEF0dHJpYnV0ZShzLGEsYyxsLGgsbmV3IHEpKSxvJiYodS5ub3JtYWw9Z2UuZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKG8sYSxjLGwsaCxuZXcgSSksdS5ub3JtYWwuZG90KG4uZGlyZWN0aW9uKT4wJiZ1Lm5vcm1hbC5tdWx0aXBseVNjYWxhcigtMSkpO2NvbnN0IGY9e2EsYjpjLGM6bCxub3JtYWw6bmV3IEksbWF0ZXJpYWxJbmRleDowfTtnZS5nZXROb3JtYWwoY2wsbGwsdWwsZi5ub3JtYWwpLHUuZmFjZT1mLHUuYmFyeWNvb3JkPWh9cmV0dXJuIHV9Y2xhc3MgenIgZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxpPTEscz0xLG89MSl7c3VwZXIoKSx0aGlzLnR5cGU9IkJveEdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOnQsaGVpZ2h0OmUsZGVwdGg6bix3aWR0aFNlZ21lbnRzOmksaGVpZ2h0U2VnbWVudHM6cyxkZXB0aFNlZ21lbnRzOm99O2NvbnN0IGE9dGhpcztpPU1hdGguZmxvb3IoaSkscz1NYXRoLmZsb29yKHMpLG89TWF0aC5mbG9vcihvKTtjb25zdCBjPVtdLGw9W10sdT1bXSxoPVtdO2xldCBmPTAsZD0wO3AoInoiLCJ5IiwieCIsLTEsLTEsbixlLHQsbyxzLDApLHAoInoiLCJ5IiwieCIsMSwtMSxuLGUsLXQsbyxzLDEpLHAoIngiLCJ6IiwieSIsMSwxLHQsbixlLGksbywyKSxwKCJ4IiwieiIsInkiLDEsLTEsdCxuLC1lLGksbywzKSxwKCJ4IiwieSIsInoiLDEsLTEsdCxlLG4saSxzLDQpLHAoIngiLCJ5IiwieiIsLTEsLTEsdCxlLC1uLGkscyw1KSx0aGlzLnNldEluZGV4KGMpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHZ0KGwsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyB2dCh1LDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyB2dChoLDIpKTtmdW5jdGlvbiBwKHgsZyxtLHYseSxfLFMsdyxBLFQsYil7Y29uc3QgTT1fL0EsRT1TL1QsRD1fLzIsTD1TLzIsRj13LzIsTj1BKzEsTz1UKzE7bGV0IEg9MCx6PTA7Y29uc3QgUT1uZXcgSTtmb3IobGV0IHN0PTA7c3Q8TztzdCsrKXtjb25zdCBmdD1zdCpFLUw7Zm9yKGxldCBSdD0wO1J0PE47UnQrKyl7Y29uc3QgRnQ9UnQqTS1EO1FbeF09RnQqdixRW2ddPWZ0KnksUVttXT1GLGwucHVzaChRLngsUS55LFEueiksUVt4XT0wLFFbZ109MCxRW21dPXc+MD8xOi0xLHUucHVzaChRLngsUS55LFEueiksaC5wdXNoKFJ0L0EpLGgucHVzaCgxLXN0L1QpLEgrPTF9fWZvcihsZXQgc3Q9MDtzdDxUO3N0KyspZm9yKGxldCBmdD0wO2Z0PEE7ZnQrKyl7Y29uc3QgUnQ9ZitmdCtOKnN0LEZ0PWYrZnQrTiooc3QrMSksSz1mKyhmdCsxKStOKihzdCsxKSxvdD1mKyhmdCsxKStOKnN0O2MucHVzaChSdCxGdCxvdCksYy5wdXNoKEZ0LEssb3QpLHorPTZ9YS5hZGRHcm91cChkLHosYiksZCs9eixmKz1IfX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc31zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyB6cih0LndpZHRoLHQuaGVpZ2h0LHQuZGVwdGgsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMsdC5kZXB0aFNlZ21lbnRzKX19ZnVuY3Rpb24gSHMocil7Y29uc3QgdD17fTtmb3IoY29uc3QgZSBpbiByKXt0W2VdPXt9O2Zvcihjb25zdCBuIGluIHJbZV0pe2NvbnN0IGk9cltlXVtuXTtpJiYoaS5pc0NvbG9yfHxpLmlzTWF0cml4M3x8aS5pc01hdHJpeDR8fGkuaXNWZWN0b3IyfHxpLmlzVmVjdG9yM3x8aS5pc1ZlY3RvcjR8fGkuaXNUZXh0dXJlfHxpLmlzUXVhdGVybmlvbik/aS5pc1JlbmRlclRhcmdldFRleHR1cmU/KGNvbnNvbGUud2FybigiVW5pZm9ybXNVdGlsczogVGV4dHVyZXMgb2YgcmVuZGVyIHRhcmdldHMgY2Fubm90IGJlIGNsb25lZCB2aWEgY2xvbmVVbmlmb3JtcygpIG9yIG1lcmdlVW5pZm9ybXMoKS4iKSx0W2VdW25dPW51bGwpOnRbZV1bbl09aS5jbG9uZSgpOkFycmF5LmlzQXJyYXkoaSk/dFtlXVtuXT1pLnNsaWNlKCk6dFtlXVtuXT1pfX1yZXR1cm4gdH1mdW5jdGlvbiBzbihyKXtjb25zdCB0PXt9O2ZvcihsZXQgZT0wO2U8ci5sZW5ndGg7ZSsrKXtjb25zdCBuPUhzKHJbZV0pO2Zvcihjb25zdCBpIGluIG4pdFtpXT1uW2ldfXJldHVybiB0fWZ1bmN0aW9uIGVTKHIpe2NvbnN0IHQ9W107Zm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspdC5wdXNoKHJbZV0uY2xvbmUoKSk7cmV0dXJuIHR9ZnVuY3Rpb24gZmcocil7Y29uc3QgdD1yLmdldFJlbmRlclRhcmdldCgpO3JldHVybiB0PT09bnVsbD9yLm91dHB1dENvbG9yU3BhY2U6dC5pc1hSUmVuZGVyVGFyZ2V0PT09ITA/dC50ZXh0dXJlLmNvbG9yU3BhY2U6bmUud29ya2luZ0NvbG9yU3BhY2V9Y29uc3QgZGc9e2Nsb25lOkhzLG1lcmdlOnNufTt2YXIgblM9YHZvaWQgbWFpbigpIHsKCWdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTsKfWAsaVM9YHZvaWQgbWFpbigpIHsKCWdsX0ZyYWdDb2xvciA9IHZlYzQoIDEuMCwgMC4wLCAwLjAsIDEuMCApOwp9YDtjbGFzcyBvaSBleHRlbmRzIEtle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc1NoYWRlck1hdGVyaWFsPSEwLHRoaXMudHlwZT0iU2hhZGVyTWF0ZXJpYWwiLHRoaXMuZGVmaW5lcz17fSx0aGlzLnVuaWZvcm1zPXt9LHRoaXMudW5pZm9ybXNHcm91cHM9W10sdGhpcy52ZXJ0ZXhTaGFkZXI9blMsdGhpcy5mcmFnbWVudFNoYWRlcj1pUyx0aGlzLmxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy5mb2c9ITEsdGhpcy5saWdodHM9ITEsdGhpcy5jbGlwcGluZz0hMSx0aGlzLmZvcmNlU2luZ2xlUGFzcz0hMCx0aGlzLmV4dGVuc2lvbnM9e2NsaXBDdWxsRGlzdGFuY2U6ITEsbXVsdGlEcmF3OiExfSx0aGlzLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM9e2NvbG9yOlsxLDEsMV0sdXY6WzAsMF0sdXYxOlswLDBdfSx0aGlzLmluZGV4MEF0dHJpYnV0ZU5hbWU9dm9pZCAwLHRoaXMudW5pZm9ybXNOZWVkVXBkYXRlPSExLHRoaXMuZ2xzbFZlcnNpb249bnVsbCx0IT09dm9pZCAwJiZ0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZnJhZ21lbnRTaGFkZXI9dC5mcmFnbWVudFNoYWRlcix0aGlzLnZlcnRleFNoYWRlcj10LnZlcnRleFNoYWRlcix0aGlzLnVuaWZvcm1zPUhzKHQudW5pZm9ybXMpLHRoaXMudW5pZm9ybXNHcm91cHM9ZVModC51bmlmb3Jtc0dyb3VwcyksdGhpcy5kZWZpbmVzPU9iamVjdC5hc3NpZ24oe30sdC5kZWZpbmVzKSx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLmZvZz10LmZvZyx0aGlzLmxpZ2h0cz10LmxpZ2h0cyx0aGlzLmNsaXBwaW5nPXQuY2xpcHBpbmcsdGhpcy5leHRlbnNpb25zPU9iamVjdC5hc3NpZ24oe30sdC5leHRlbnNpb25zKSx0aGlzLmdsc2xWZXJzaW9uPXQuZ2xzbFZlcnNpb24sdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7ZS5nbHNsVmVyc2lvbj10aGlzLmdsc2xWZXJzaW9uLGUudW5pZm9ybXM9e307Zm9yKGNvbnN0IGkgaW4gdGhpcy51bmlmb3Jtcyl7Y29uc3Qgbz10aGlzLnVuaWZvcm1zW2ldLnZhbHVlO28mJm8uaXNUZXh0dXJlP2UudW5pZm9ybXNbaV09e3R5cGU6InQiLHZhbHVlOm8udG9KU09OKHQpLnV1aWR9Om8mJm8uaXNDb2xvcj9lLnVuaWZvcm1zW2ldPXt0eXBlOiJjIix2YWx1ZTpvLmdldEhleCgpfTpvJiZvLmlzVmVjdG9yMj9lLnVuaWZvcm1zW2ldPXt0eXBlOiJ2MiIsdmFsdWU6by50b0FycmF5KCl9Om8mJm8uaXNWZWN0b3IzP2UudW5pZm9ybXNbaV09e3R5cGU6InYzIix2YWx1ZTpvLnRvQXJyYXkoKX06byYmby5pc1ZlY3RvcjQ/ZS51bmlmb3Jtc1tpXT17dHlwZToidjQiLHZhbHVlOm8udG9BcnJheSgpfTpvJiZvLmlzTWF0cml4Mz9lLnVuaWZvcm1zW2ldPXt0eXBlOiJtMyIsdmFsdWU6by50b0FycmF5KCl9Om8mJm8uaXNNYXRyaXg0P2UudW5pZm9ybXNbaV09e3R5cGU6Im00Iix2YWx1ZTpvLnRvQXJyYXkoKX06ZS51bmlmb3Jtc1tpXT17dmFsdWU6b319T2JqZWN0LmtleXModGhpcy5kZWZpbmVzKS5sZW5ndGg+MCYmKGUuZGVmaW5lcz10aGlzLmRlZmluZXMpLGUudmVydGV4U2hhZGVyPXRoaXMudmVydGV4U2hhZGVyLGUuZnJhZ21lbnRTaGFkZXI9dGhpcy5mcmFnbWVudFNoYWRlcixlLmxpZ2h0cz10aGlzLmxpZ2h0cyxlLmNsaXBwaW5nPXRoaXMuY2xpcHBpbmc7Y29uc3Qgbj17fTtmb3IoY29uc3QgaSBpbiB0aGlzLmV4dGVuc2lvbnMpdGhpcy5leHRlbnNpb25zW2ldPT09ITAmJihuW2ldPSEwKTtyZXR1cm4gT2JqZWN0LmtleXMobikubGVuZ3RoPjAmJihlLmV4dGVuc2lvbnM9biksZX19Y2xhc3MgcGwgZXh0ZW5kcyBzZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc0NhbWVyYT0hMCx0aGlzLnR5cGU9IkNhbWVyYSIsdGhpcy5tYXRyaXhXb3JsZEludmVyc2U9bmV3IEN0LHRoaXMucHJvamVjdGlvbk1hdHJpeD1uZXcgQ3QsdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZT1uZXcgQ3QsdGhpcy5jb29yZGluYXRlU3lzdGVtPUhufWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodC5tYXRyaXhXb3JsZEludmVyc2UpLHRoaXMucHJvamVjdGlvbk1hdHJpeC5jb3B5KHQucHJvamVjdGlvbk1hdHJpeCksdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLHRoaXMuY29vcmRpbmF0ZVN5c3RlbT10LmNvb3JkaW5hdGVTeXN0ZW0sdGhpc31nZXRXb3JsZERpcmVjdGlvbih0KXtyZXR1cm4gc3VwZXIuZ2V0V29ybGREaXJlY3Rpb24odCkubmVnYXRlKCl9dXBkYXRlTWF0cml4V29ybGQodCl7c3VwZXIudXBkYXRlTWF0cml4V29ybGQodCksdGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKX11cGRhdGVXb3JsZE1hdHJpeCh0LGUpe3N1cGVyLnVwZGF0ZVdvcmxkTWF0cml4KHQsZSksdGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNvbnN0IG1yPW5ldyBJLHBnPW5ldyBxLG1nPW5ldyBxO2NsYXNzICRlIGV4dGVuZHMgcGx7Y29uc3RydWN0b3IodD01MCxlPTEsbj0uMSxpPTJlMyl7c3VwZXIoKSx0aGlzLmlzUGVyc3BlY3RpdmVDYW1lcmE9ITAsdGhpcy50eXBlPSJQZXJzcGVjdGl2ZUNhbWVyYSIsdGhpcy5mb3Y9dCx0aGlzLnpvb209MSx0aGlzLm5lYXI9bix0aGlzLmZhcj1pLHRoaXMuZm9jdXM9MTAsdGhpcy5hc3BlY3Q9ZSx0aGlzLnZpZXc9bnVsbCx0aGlzLmZpbG1HYXVnZT0zNSx0aGlzLmZpbG1PZmZzZXQ9MCx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLmZvdj10LmZvdix0aGlzLnpvb209dC56b29tLHRoaXMubmVhcj10Lm5lYXIsdGhpcy5mYXI9dC5mYXIsdGhpcy5mb2N1cz10LmZvY3VzLHRoaXMuYXNwZWN0PXQuYXNwZWN0LHRoaXMudmlldz10LnZpZXc9PT1udWxsP251bGw6T2JqZWN0LmFzc2lnbih7fSx0LnZpZXcpLHRoaXMuZmlsbUdhdWdlPXQuZmlsbUdhdWdlLHRoaXMuZmlsbU9mZnNldD10LmZpbG1PZmZzZXQsdGhpc31zZXRGb2NhbExlbmd0aCh0KXtjb25zdCBlPS41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL3Q7dGhpcy5mb3Y9SXMqMipNYXRoLmF0YW4oZSksdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Z2V0Rm9jYWxMZW5ndGgoKXtjb25zdCB0PU1hdGgudGFuKE5yKi41KnRoaXMuZm92KTtyZXR1cm4gLjUqdGhpcy5nZXRGaWxtSGVpZ2h0KCkvdH1nZXRFZmZlY3RpdmVGT1YoKXtyZXR1cm4gSXMqMipNYXRoLmF0YW4oTWF0aC50YW4oTnIqLjUqdGhpcy5mb3YpL3RoaXMuem9vbSl9Z2V0RmlsbVdpZHRoKCl7cmV0dXJuIHRoaXMuZmlsbUdhdWdlKk1hdGgubWluKHRoaXMuYXNwZWN0LDEpfWdldEZpbG1IZWlnaHQoKXtyZXR1cm4gdGhpcy5maWxtR2F1Z2UvTWF0aC5tYXgodGhpcy5hc3BlY3QsMSl9Z2V0Vmlld0JvdW5kcyh0LGUsbil7bXIuc2V0KC0xLC0xLC41KS5hcHBseU1hdHJpeDQodGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSksZS5zZXQobXIueCxtci55KS5tdWx0aXBseVNjYWxhcigtdC9tci56KSxtci5zZXQoMSwxLC41KS5hcHBseU1hdHJpeDQodGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSksbi5zZXQobXIueCxtci55KS5tdWx0aXBseVNjYWxhcigtdC9tci56KX1nZXRWaWV3U2l6ZSh0LGUpe3JldHVybiB0aGlzLmdldFZpZXdCb3VuZHModCxwZyxtZyksZS5zdWJWZWN0b3JzKG1nLHBnKX1zZXRWaWV3T2Zmc2V0KHQsZSxuLGkscyxvKXt0aGlzLmFzcGVjdD10L2UsdGhpcy52aWV3PT09bnVsbCYmKHRoaXMudmlldz17ZW5hYmxlZDohMCxmdWxsV2lkdGg6MSxmdWxsSGVpZ2h0OjEsb2Zmc2V0WDowLG9mZnNldFk6MCx3aWR0aDoxLGhlaWdodDoxfSksdGhpcy52aWV3LmVuYWJsZWQ9ITAsdGhpcy52aWV3LmZ1bGxXaWR0aD10LHRoaXMudmlldy5mdWxsSGVpZ2h0PWUsdGhpcy52aWV3Lm9mZnNldFg9bix0aGlzLnZpZXcub2Zmc2V0WT1pLHRoaXMudmlldy53aWR0aD1zLHRoaXMudmlldy5oZWlnaHQ9byx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1jbGVhclZpZXdPZmZzZXQoKXt0aGlzLnZpZXchPT1udWxsJiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfXVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKXtjb25zdCB0PXRoaXMubmVhcjtsZXQgZT10Kk1hdGgudGFuKE5yKi41KnRoaXMuZm92KS90aGlzLnpvb20sbj0yKmUsaT10aGlzLmFzcGVjdCpuLHM9LS41Kmk7Y29uc3Qgbz10aGlzLnZpZXc7aWYodGhpcy52aWV3IT09bnVsbCYmdGhpcy52aWV3LmVuYWJsZWQpe2NvbnN0IGM9by5mdWxsV2lkdGgsbD1vLmZ1bGxIZWlnaHQ7cys9by5vZmZzZXRYKmkvYyxlLT1vLm9mZnNldFkqbi9sLGkqPW8ud2lkdGgvYyxuKj1vLmhlaWdodC9sfWNvbnN0IGE9dGhpcy5maWxtT2Zmc2V0O2EhPT0wJiYocys9dCphL3RoaXMuZ2V0RmlsbVdpZHRoKCkpLHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUocyxzK2ksZSxlLW4sdCx0aGlzLmZhcix0aGlzLmNvb3JkaW5hdGVTeXN0ZW0pLHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSh0aGlzLnByb2plY3Rpb25NYXRyaXgpLmludmVydCgpfXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTtyZXR1cm4gZS5vYmplY3QuZm92PXRoaXMuZm92LGUub2JqZWN0Lnpvb209dGhpcy56b29tLGUub2JqZWN0Lm5lYXI9dGhpcy5uZWFyLGUub2JqZWN0LmZhcj10aGlzLmZhcixlLm9iamVjdC5mb2N1cz10aGlzLmZvY3VzLGUub2JqZWN0LmFzcGVjdD10aGlzLmFzcGVjdCx0aGlzLnZpZXchPT1udWxsJiYoZS5vYmplY3Qudmlldz1PYmplY3QuYXNzaWduKHt9LHRoaXMudmlldykpLGUub2JqZWN0LmZpbG1HYXVnZT10aGlzLmZpbG1HYXVnZSxlLm9iamVjdC5maWxtT2Zmc2V0PXRoaXMuZmlsbU9mZnNldCxlfX1jb25zdCBXcz0tOTAsWHM9MTtjbGFzcyBnZyBleHRlbmRzIHNle2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcigpLHRoaXMudHlwZT0iQ3ViZUNhbWVyYSIsdGhpcy5yZW5kZXJUYXJnZXQ9bix0aGlzLmNvb3JkaW5hdGVTeXN0ZW09bnVsbCx0aGlzLmFjdGl2ZU1pcG1hcExldmVsPTA7Y29uc3QgaT1uZXcgJGUoV3MsWHMsdCxlKTtpLmxheWVycz10aGlzLmxheWVycyx0aGlzLmFkZChpKTtjb25zdCBzPW5ldyAkZShXcyxYcyx0LGUpO3MubGF5ZXJzPXRoaXMubGF5ZXJzLHRoaXMuYWRkKHMpO2NvbnN0IG89bmV3ICRlKFdzLFhzLHQsZSk7by5sYXllcnM9dGhpcy5sYXllcnMsdGhpcy5hZGQobyk7Y29uc3QgYT1uZXcgJGUoV3MsWHMsdCxlKTthLmxheWVycz10aGlzLmxheWVycyx0aGlzLmFkZChhKTtjb25zdCBjPW5ldyAkZShXcyxYcyx0LGUpO2MubGF5ZXJzPXRoaXMubGF5ZXJzLHRoaXMuYWRkKGMpO2NvbnN0IGw9bmV3ICRlKFdzLFhzLHQsZSk7bC5sYXllcnM9dGhpcy5sYXllcnMsdGhpcy5hZGQobCl9dXBkYXRlQ29vcmRpbmF0ZVN5c3RlbSgpe2NvbnN0IHQ9dGhpcy5jb29yZGluYXRlU3lzdGVtLGU9dGhpcy5jaGlsZHJlbi5jb25jYXQoKSxbbixpLHMsbyxhLGNdPWU7Zm9yKGNvbnN0IGwgb2YgZSl0aGlzLnJlbW92ZShsKTtpZih0PT09SG4pbi51cC5zZXQoMCwxLDApLG4ubG9va0F0KDEsMCwwKSxpLnVwLnNldCgwLDEsMCksaS5sb29rQXQoLTEsMCwwKSxzLnVwLnNldCgwLDAsLTEpLHMubG9va0F0KDAsMSwwKSxvLnVwLnNldCgwLDAsMSksby5sb29rQXQoMCwtMSwwKSxhLnVwLnNldCgwLDEsMCksYS5sb29rQXQoMCwwLDEpLGMudXAuc2V0KDAsMSwwKSxjLmxvb2tBdCgwLDAsLTEpO2Vsc2UgaWYodD09PVhvKW4udXAuc2V0KDAsLTEsMCksbi5sb29rQXQoLTEsMCwwKSxpLnVwLnNldCgwLC0xLDApLGkubG9va0F0KDEsMCwwKSxzLnVwLnNldCgwLDAsMSkscy5sb29rQXQoMCwxLDApLG8udXAuc2V0KDAsMCwtMSksby5sb29rQXQoMCwtMSwwKSxhLnVwLnNldCgwLC0xLDApLGEubG9va0F0KDAsMCwxKSxjLnVwLnNldCgwLC0xLDApLGMubG9va0F0KDAsMCwtMSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkN1YmVDYW1lcmEudXBkYXRlQ29vcmRpbmF0ZVN5c3RlbSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK3QpO2Zvcihjb25zdCBsIG9mIGUpdGhpcy5hZGQobCksbC51cGRhdGVNYXRyaXhXb3JsZCgpfXVwZGF0ZSh0LGUpe3RoaXMucGFyZW50PT09bnVsbCYmdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO2NvbnN0e3JlbmRlclRhcmdldDpuLGFjdGl2ZU1pcG1hcExldmVsOml9PXRoaXM7dGhpcy5jb29yZGluYXRlU3lzdGVtIT09dC5jb29yZGluYXRlU3lzdGVtJiYodGhpcy5jb29yZGluYXRlU3lzdGVtPXQuY29vcmRpbmF0ZVN5c3RlbSx0aGlzLnVwZGF0ZUNvb3JkaW5hdGVTeXN0ZW0oKSk7Y29uc3RbcyxvLGEsYyxsLHVdPXRoaXMuY2hpbGRyZW4saD10LmdldFJlbmRlclRhcmdldCgpLGY9dC5nZXRBY3RpdmVDdWJlRmFjZSgpLGQ9dC5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpLHA9dC54ci5lbmFibGVkO3QueHIuZW5hYmxlZD0hMTtjb25zdCB4PW4udGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7bi50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz0hMSx0LnNldFJlbmRlclRhcmdldChuLDAsaSksdC5yZW5kZXIoZSxzKSx0LnNldFJlbmRlclRhcmdldChuLDEsaSksdC5yZW5kZXIoZSxvKSx0LnNldFJlbmRlclRhcmdldChuLDIsaSksdC5yZW5kZXIoZSxhKSx0LnNldFJlbmRlclRhcmdldChuLDMsaSksdC5yZW5kZXIoZSxjKSx0LnNldFJlbmRlclRhcmdldChuLDQsaSksdC5yZW5kZXIoZSxsKSxuLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPXgsdC5zZXRSZW5kZXJUYXJnZXQobiw1LGkpLHQucmVuZGVyKGUsdSksdC5zZXRSZW5kZXJUYXJnZXQoaCxmLGQpLHQueHIuZW5hYmxlZD1wLG4udGV4dHVyZS5uZWVkc1BNUkVNVXBkYXRlPSEwfX1jbGFzcyB0YSBleHRlbmRzIEFle2NvbnN0cnVjdG9yKHQ9W10sZT1QaSxuLGkscyxvLGEsYyxsLHUpe3N1cGVyKHQsZSxuLGkscyxvLGEsYyxsLHUpLHRoaXMuaXNDdWJlVGV4dHVyZT0hMCx0aGlzLmZsaXBZPSExfWdldCBpbWFnZXMoKXtyZXR1cm4gdGhpcy5pbWFnZX1zZXQgaW1hZ2VzKHQpe3RoaXMuaW1hZ2U9dH19Y2xhc3MgeGcgZXh0ZW5kcyB2aXtjb25zdHJ1Y3Rvcih0PTEsZT17fSl7c3VwZXIodCx0LGUpLHRoaXMuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQ9ITA7Y29uc3Qgbj17d2lkdGg6dCxoZWlnaHQ6dCxkZXB0aDoxfSxpPVtuLG4sbixuLG4sbl07dGhpcy50ZXh0dXJlPW5ldyB0YShpLGUubWFwcGluZyxlLndyYXBTLGUud3JhcFQsZS5tYWdGaWx0ZXIsZS5taW5GaWx0ZXIsZS5mb3JtYXQsZS50eXBlLGUuYW5pc290cm9weSxlLmNvbG9yU3BhY2UpLHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITAsdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1lLmdlbmVyYXRlTWlwbWFwcyE9PXZvaWQgMD9lLmdlbmVyYXRlTWlwbWFwczohMSx0aGlzLnRleHR1cmUubWluRmlsdGVyPWUubWluRmlsdGVyIT09dm9pZCAwP2UubWluRmlsdGVyOnplfWZyb21FcXVpcmVjdGFuZ3VsYXJUZXh0dXJlKHQsZSl7dGhpcy50ZXh0dXJlLnR5cGU9ZS50eXBlLHRoaXMudGV4dHVyZS5jb2xvclNwYWNlPWUuY29sb3JTcGFjZSx0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPWUuZ2VuZXJhdGVNaXBtYXBzLHRoaXMudGV4dHVyZS5taW5GaWx0ZXI9ZS5taW5GaWx0ZXIsdGhpcy50ZXh0dXJlLm1hZ0ZpbHRlcj1lLm1hZ0ZpbHRlcjtjb25zdCBuPXt1bmlmb3Jtczp7dEVxdWlyZWN0Ont2YWx1ZTpudWxsfX0sdmVydGV4U2hhZGVyOmAKCgkJCQl2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwoKCQkJCXZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7CgoJCQkJCXJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApOwoKCQkJCX0KCgkJCQl2b2lkIG1haW4oKSB7CgoJCQkJCXZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7CgoJCQkJCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkJCQkJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoKCQkJCX0KCQkJYCxmcmFnbWVudFNoYWRlcjpgCgoJCQkJdW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0OwoKCQkJCXZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CgoJCQkJI2luY2x1ZGUgPGNvbW1vbj4KCgkJCQl2b2lkIG1haW4oKSB7CgoJCQkJCXZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29ybGREaXJlY3Rpb24gKTsKCgkJCQkJdmVjMiBzYW1wbGVVViA9IGVxdWlyZWN0VXYoIGRpcmVjdGlvbiApOwoKCQkJCQlnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTsKCgkJCQl9CgkJCWB9LGk9bmV3IHpyKDUsNSw1KSxzPW5ldyBvaSh7bmFtZToiQ3ViZW1hcEZyb21FcXVpcmVjdCIsdW5pZm9ybXM6SHMobi51bmlmb3JtcyksdmVydGV4U2hhZGVyOm4udmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOm4uZnJhZ21lbnRTaGFkZXIsc2lkZTpZZSxibGVuZGluZzpSaX0pO3MudW5pZm9ybXMudEVxdWlyZWN0LnZhbHVlPWU7Y29uc3Qgbz1uZXcgTGUoaSxzKSxhPWUubWluRmlsdGVyO3JldHVybiBlLm1pbkZpbHRlcj09PV9pJiYoZS5taW5GaWx0ZXI9emUpLG5ldyBnZygxLDEwLHRoaXMpLnVwZGF0ZSh0LG8pLGUubWluRmlsdGVyPWEsby5nZW9tZXRyeS5kaXNwb3NlKCksby5tYXRlcmlhbC5kaXNwb3NlKCksdGhpc31jbGVhcih0LGU9ITAsbj0hMCxpPSEwKXtjb25zdCBzPXQuZ2V0UmVuZGVyVGFyZ2V0KCk7Zm9yKGxldCBvPTA7bzw2O28rKyl0LnNldFJlbmRlclRhcmdldCh0aGlzLG8pLHQuY2xlYXIoZSxuLGkpO3Quc2V0UmVuZGVyVGFyZ2V0KHMpfX1jbGFzcyAkcyBleHRlbmRzIHNle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzR3JvdXA9ITAsdGhpcy50eXBlPSJHcm91cCJ9fWNvbnN0IHJTPXt0eXBlOiJtb3ZlIn07Y2xhc3MgbWx7Y29uc3RydWN0b3IoKXt0aGlzLl90YXJnZXRSYXk9bnVsbCx0aGlzLl9ncmlwPW51bGwsdGhpcy5faGFuZD1udWxsfWdldEhhbmRTcGFjZSgpe3JldHVybiB0aGlzLl9oYW5kPT09bnVsbCYmKHRoaXMuX2hhbmQ9bmV3ICRzLHRoaXMuX2hhbmQubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLl9oYW5kLnZpc2libGU9ITEsdGhpcy5faGFuZC5qb2ludHM9e30sdGhpcy5faGFuZC5pbnB1dFN0YXRlPXtwaW5jaGluZzohMX0pLHRoaXMuX2hhbmR9Z2V0VGFyZ2V0UmF5U3BhY2UoKXtyZXR1cm4gdGhpcy5fdGFyZ2V0UmF5PT09bnVsbCYmKHRoaXMuX3RhcmdldFJheT1uZXcgJHMsdGhpcy5fdGFyZ2V0UmF5Lm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5fdGFyZ2V0UmF5LnZpc2libGU9ITEsdGhpcy5fdGFyZ2V0UmF5Lmhhc0xpbmVhclZlbG9jaXR5PSExLHRoaXMuX3RhcmdldFJheS5saW5lYXJWZWxvY2l0eT1uZXcgSSx0aGlzLl90YXJnZXRSYXkuaGFzQW5ndWxhclZlbG9jaXR5PSExLHRoaXMuX3RhcmdldFJheS5hbmd1bGFyVmVsb2NpdHk9bmV3IEkpLHRoaXMuX3RhcmdldFJheX1nZXRHcmlwU3BhY2UoKXtyZXR1cm4gdGhpcy5fZ3JpcD09PW51bGwmJih0aGlzLl9ncmlwPW5ldyAkcyx0aGlzLl9ncmlwLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5fZ3JpcC52aXNpYmxlPSExLHRoaXMuX2dyaXAuaGFzTGluZWFyVmVsb2NpdHk9ITEsdGhpcy5fZ3JpcC5saW5lYXJWZWxvY2l0eT1uZXcgSSx0aGlzLl9ncmlwLmhhc0FuZ3VsYXJWZWxvY2l0eT0hMSx0aGlzLl9ncmlwLmFuZ3VsYXJWZWxvY2l0eT1uZXcgSSksdGhpcy5fZ3JpcH1kaXNwYXRjaEV2ZW50KHQpe3JldHVybiB0aGlzLl90YXJnZXRSYXkhPT1udWxsJiZ0aGlzLl90YXJnZXRSYXkuZGlzcGF0Y2hFdmVudCh0KSx0aGlzLl9ncmlwIT09bnVsbCYmdGhpcy5fZ3JpcC5kaXNwYXRjaEV2ZW50KHQpLHRoaXMuX2hhbmQhPT1udWxsJiZ0aGlzLl9oYW5kLmRpc3BhdGNoRXZlbnQodCksdGhpc31jb25uZWN0KHQpe2lmKHQmJnQuaGFuZCl7Y29uc3QgZT10aGlzLl9oYW5kO2lmKGUpZm9yKGNvbnN0IG4gb2YgdC5oYW5kLnZhbHVlcygpKXRoaXMuX2dldEhhbmRKb2ludChlLG4pfXJldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImNvbm5lY3RlZCIsZGF0YTp0fSksdGhpc31kaXNjb25uZWN0KHQpe3JldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc2Nvbm5lY3RlZCIsZGF0YTp0fSksdGhpcy5fdGFyZ2V0UmF5IT09bnVsbCYmKHRoaXMuX3RhcmdldFJheS52aXNpYmxlPSExKSx0aGlzLl9ncmlwIT09bnVsbCYmKHRoaXMuX2dyaXAudmlzaWJsZT0hMSksdGhpcy5faGFuZCE9PW51bGwmJih0aGlzLl9oYW5kLnZpc2libGU9ITEpLHRoaXN9dXBkYXRlKHQsZSxuKXtsZXQgaT1udWxsLHM9bnVsbCxvPW51bGw7Y29uc3QgYT10aGlzLl90YXJnZXRSYXksYz10aGlzLl9ncmlwLGw9dGhpcy5faGFuZDtpZih0JiZlLnNlc3Npb24udmlzaWJpbGl0eVN0YXRlIT09InZpc2libGUtYmx1cnJlZCIpe2lmKGwmJnQuaGFuZCl7bz0hMDtmb3IoY29uc3QgeCBvZiB0LmhhbmQudmFsdWVzKCkpe2NvbnN0IGc9ZS5nZXRKb2ludFBvc2UoeCxuKSxtPXRoaXMuX2dldEhhbmRKb2ludChsLHgpO2chPT1udWxsJiYobS5tYXRyaXguZnJvbUFycmF5KGcudHJhbnNmb3JtLm1hdHJpeCksbS5tYXRyaXguZGVjb21wb3NlKG0ucG9zaXRpb24sbS5yb3RhdGlvbixtLnNjYWxlKSxtLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITAsbS5qb2ludFJhZGl1cz1nLnJhZGl1cyksbS52aXNpYmxlPWchPT1udWxsfWNvbnN0IHU9bC5qb2ludHNbImluZGV4LWZpbmdlci10aXAiXSxoPWwuam9pbnRzWyJ0aHVtYi10aXAiXSxmPXUucG9zaXRpb24uZGlzdGFuY2VUbyhoLnBvc2l0aW9uKSxkPS4wMixwPS4wMDU7bC5pbnB1dFN0YXRlLnBpbmNoaW5nJiZmPmQrcD8obC5pbnB1dFN0YXRlLnBpbmNoaW5nPSExLHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToicGluY2hlbmQiLGhhbmRlZG5lc3M6dC5oYW5kZWRuZXNzLHRhcmdldDp0aGlzfSkpOiFsLmlucHV0U3RhdGUucGluY2hpbmcmJmY8PWQtcCYmKGwuaW5wdXRTdGF0ZS5waW5jaGluZz0hMCx0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6InBpbmNoc3RhcnQiLGhhbmRlZG5lc3M6dC5oYW5kZWRuZXNzLHRhcmdldDp0aGlzfSkpfWVsc2UgYyE9PW51bGwmJnQuZ3JpcFNwYWNlJiYocz1lLmdldFBvc2UodC5ncmlwU3BhY2UsbikscyE9PW51bGwmJihjLm1hdHJpeC5mcm9tQXJyYXkocy50cmFuc2Zvcm0ubWF0cml4KSxjLm1hdHJpeC5kZWNvbXBvc2UoYy5wb3NpdGlvbixjLnJvdGF0aW9uLGMuc2NhbGUpLGMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMCxzLmxpbmVhclZlbG9jaXR5PyhjLmhhc0xpbmVhclZlbG9jaXR5PSEwLGMubGluZWFyVmVsb2NpdHkuY29weShzLmxpbmVhclZlbG9jaXR5KSk6Yy5oYXNMaW5lYXJWZWxvY2l0eT0hMSxzLmFuZ3VsYXJWZWxvY2l0eT8oYy5oYXNBbmd1bGFyVmVsb2NpdHk9ITAsYy5hbmd1bGFyVmVsb2NpdHkuY29weShzLmFuZ3VsYXJWZWxvY2l0eSkpOmMuaGFzQW5ndWxhclZlbG9jaXR5PSExKSk7YSE9PW51bGwmJihpPWUuZ2V0UG9zZSh0LnRhcmdldFJheVNwYWNlLG4pLGk9PT1udWxsJiZzIT09bnVsbCYmKGk9cyksaSE9PW51bGwmJihhLm1hdHJpeC5mcm9tQXJyYXkoaS50cmFuc2Zvcm0ubWF0cml4KSxhLm1hdHJpeC5kZWNvbXBvc2UoYS5wb3NpdGlvbixhLnJvdGF0aW9uLGEuc2NhbGUpLGEubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMCxpLmxpbmVhclZlbG9jaXR5PyhhLmhhc0xpbmVhclZlbG9jaXR5PSEwLGEubGluZWFyVmVsb2NpdHkuY29weShpLmxpbmVhclZlbG9jaXR5KSk6YS5oYXNMaW5lYXJWZWxvY2l0eT0hMSxpLmFuZ3VsYXJWZWxvY2l0eT8oYS5oYXNBbmd1bGFyVmVsb2NpdHk9ITAsYS5hbmd1bGFyVmVsb2NpdHkuY29weShpLmFuZ3VsYXJWZWxvY2l0eSkpOmEuaGFzQW5ndWxhclZlbG9jaXR5PSExLHRoaXMuZGlzcGF0Y2hFdmVudChyUykpKX1yZXR1cm4gYSE9PW51bGwmJihhLnZpc2libGU9aSE9PW51bGwpLGMhPT1udWxsJiYoYy52aXNpYmxlPXMhPT1udWxsKSxsIT09bnVsbCYmKGwudmlzaWJsZT1vIT09bnVsbCksdGhpc31fZ2V0SGFuZEpvaW50KHQsZSl7aWYodC5qb2ludHNbZS5qb2ludE5hbWVdPT09dm9pZCAwKXtjb25zdCBuPW5ldyAkcztuLm1hdHJpeEF1dG9VcGRhdGU9ITEsbi52aXNpYmxlPSExLHQuam9pbnRzW2Uuam9pbnROYW1lXT1uLHQuYWRkKG4pfXJldHVybiB0LmpvaW50c1tlLmpvaW50TmFtZV19fWNsYXNzIGdse2NvbnN0cnVjdG9yKHQsZT0yNWUtNSl7dGhpcy5pc0ZvZ0V4cDI9ITAsdGhpcy5uYW1lPSIiLHRoaXMuY29sb3I9bmV3IHl0KHQpLHRoaXMuZGVuc2l0eT1lfWNsb25lKCl7cmV0dXJuIG5ldyBnbCh0aGlzLmNvbG9yLHRoaXMuZGVuc2l0eSl9dG9KU09OKCl7cmV0dXJue3R5cGU6IkZvZ0V4cDIiLG5hbWU6dGhpcy5uYW1lLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksZGVuc2l0eTp0aGlzLmRlbnNpdHl9fX1jbGFzcyB4bHtjb25zdHJ1Y3Rvcih0LGU9MSxuPTFlMyl7dGhpcy5pc0ZvZz0hMCx0aGlzLm5hbWU9IiIsdGhpcy5jb2xvcj1uZXcgeXQodCksdGhpcy5uZWFyPWUsdGhpcy5mYXI9bn1jbG9uZSgpe3JldHVybiBuZXcgeGwodGhpcy5jb2xvcix0aGlzLm5lYXIsdGhpcy5mYXIpfXRvSlNPTigpe3JldHVybnt0eXBlOiJGb2ciLG5hbWU6dGhpcy5uYW1lLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksbmVhcjp0aGlzLm5lYXIsZmFyOnRoaXMuZmFyfX19Y2xhc3MgX2cgZXh0ZW5kcyBzZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc1NjZW5lPSEwLHRoaXMudHlwZT0iU2NlbmUiLHRoaXMuYmFja2dyb3VuZD1udWxsLHRoaXMuZW52aXJvbm1lbnQ9bnVsbCx0aGlzLmZvZz1udWxsLHRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3M9MCx0aGlzLmJhY2tncm91bmRJbnRlbnNpdHk9MSx0aGlzLmJhY2tncm91bmRSb3RhdGlvbj1uZXcgVW4sdGhpcy5lbnZpcm9ubWVudEludGVuc2l0eT0xLHRoaXMuZW52aXJvbm1lbnRSb3RhdGlvbj1uZXcgVW4sdGhpcy5vdmVycmlkZU1hdGVyaWFsPW51bGwsdHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyE9InVuZGVmaW5lZCImJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgib2JzZXJ2ZSIse2RldGFpbDp0aGlzfSkpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHQuYmFja2dyb3VuZCE9PW51bGwmJih0aGlzLmJhY2tncm91bmQ9dC5iYWNrZ3JvdW5kLmNsb25lKCkpLHQuZW52aXJvbm1lbnQhPT1udWxsJiYodGhpcy5lbnZpcm9ubWVudD10LmVudmlyb25tZW50LmNsb25lKCkpLHQuZm9nIT09bnVsbCYmKHRoaXMuZm9nPXQuZm9nLmNsb25lKCkpLHRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3M9dC5iYWNrZ3JvdW5kQmx1cnJpbmVzcyx0aGlzLmJhY2tncm91bmRJbnRlbnNpdHk9dC5iYWNrZ3JvdW5kSW50ZW5zaXR5LHRoaXMuYmFja2dyb3VuZFJvdGF0aW9uLmNvcHkodC5iYWNrZ3JvdW5kUm90YXRpb24pLHRoaXMuZW52aXJvbm1lbnRJbnRlbnNpdHk9dC5lbnZpcm9ubWVudEludGVuc2l0eSx0aGlzLmVudmlyb25tZW50Um90YXRpb24uY29weSh0LmVudmlyb25tZW50Um90YXRpb24pLHQub3ZlcnJpZGVNYXRlcmlhbCE9PW51bGwmJih0aGlzLm92ZXJyaWRlTWF0ZXJpYWw9dC5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCkpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIHRoaXMuZm9nIT09bnVsbCYmKGUub2JqZWN0LmZvZz10aGlzLmZvZy50b0pTT04oKSksdGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcz4wJiYoZS5vYmplY3QuYmFja2dyb3VuZEJsdXJyaW5lc3M9dGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcyksdGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5IT09MSYmKGUub2JqZWN0LmJhY2tncm91bmRJbnRlbnNpdHk9dGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5KSxlLm9iamVjdC5iYWNrZ3JvdW5kUm90YXRpb249dGhpcy5iYWNrZ3JvdW5kUm90YXRpb24udG9BcnJheSgpLHRoaXMuZW52aXJvbm1lbnRJbnRlbnNpdHkhPT0xJiYoZS5vYmplY3QuZW52aXJvbm1lbnRJbnRlbnNpdHk9dGhpcy5lbnZpcm9ubWVudEludGVuc2l0eSksZS5vYmplY3QuZW52aXJvbm1lbnRSb3RhdGlvbj10aGlzLmVudmlyb25tZW50Um90YXRpb24udG9BcnJheSgpLGV9fWNsYXNzIF9se2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5pc0ludGVybGVhdmVkQnVmZmVyPSEwLHRoaXMuYXJyYXk9dCx0aGlzLnN0cmlkZT1lLHRoaXMuY291bnQ9dCE9PXZvaWQgMD90Lmxlbmd0aC9lOjAsdGhpcy51c2FnZT1Xbyx0aGlzLnVwZGF0ZVJhbmdlcz1bXSx0aGlzLnZlcnNpb249MCx0aGlzLnV1aWQ9TG4oKX1vblVwbG9hZENhbGxiYWNrKCl7fXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfXNldFVzYWdlKHQpe3JldHVybiB0aGlzLnVzYWdlPXQsdGhpc31hZGRVcGRhdGVSYW5nZSh0LGUpe3RoaXMudXBkYXRlUmFuZ2VzLnB1c2goe3N0YXJ0OnQsY291bnQ6ZX0pfWNsZWFyVXBkYXRlUmFuZ2VzKCl7dGhpcy51cGRhdGVSYW5nZXMubGVuZ3RoPTB9Y29weSh0KXtyZXR1cm4gdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLmNvdW50PXQuY291bnQsdGhpcy5zdHJpZGU9dC5zdHJpZGUsdGhpcy51c2FnZT10LnVzYWdlLHRoaXN9Y29weUF0KHQsZSxuKXt0Kj10aGlzLnN0cmlkZSxuKj1lLnN0cmlkZTtmb3IobGV0IGk9MCxzPXRoaXMuc3RyaWRlO2k8cztpKyspdGhpcy5hcnJheVt0K2ldPWUuYXJyYXlbbitpXTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Y2xvbmUodCl7dC5hcnJheUJ1ZmZlcnM9PT12b2lkIDAmJih0LmFycmF5QnVmZmVycz17fSksdGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9PT12b2lkIDAmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1MbigpKSx0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09PT12b2lkIDAmJih0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09dGhpcy5hcnJheS5zbGljZSgwKS5idWZmZXIpO2NvbnN0IGU9bmV3IHRoaXMuYXJyYXkuY29uc3RydWN0b3IodC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdKSxuPW5ldyB0aGlzLmNvbnN0cnVjdG9yKGUsdGhpcy5zdHJpZGUpO3JldHVybiBuLnNldFVzYWdlKHRoaXMudXNhZ2UpLG59b25VcGxvYWQodCl7cmV0dXJuIHRoaXMub25VcGxvYWRDYWxsYmFjaz10LHRoaXN9dG9KU09OKHQpe3JldHVybiB0LmFycmF5QnVmZmVycz09PXZvaWQgMCYmKHQuYXJyYXlCdWZmZXJzPXt9KSx0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD09PXZvaWQgMCYmKHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkPUxuKCkpLHQuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXT09PXZvaWQgMCYmKHQuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXT1BcnJheS5mcm9tKG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5LmJ1ZmZlcikpKSx7dXVpZDp0aGlzLnV1aWQsYnVmZmVyOnRoaXMuYXJyYXkuYnVmZmVyLl91dWlkLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLHN0cmlkZTp0aGlzLnN0cmlkZX19fWNvbnN0IG9uPW5ldyBJO2NsYXNzIGtye2NvbnN0cnVjdG9yKHQsZSxuLGk9ITEpe3RoaXMuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT0hMCx0aGlzLm5hbWU9IiIsdGhpcy5kYXRhPXQsdGhpcy5pdGVtU2l6ZT1lLHRoaXMub2Zmc2V0PW4sdGhpcy5ub3JtYWxpemVkPWl9Z2V0IGNvdW50KCl7cmV0dXJuIHRoaXMuZGF0YS5jb3VudH1nZXQgYXJyYXkoKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5fXNldCBuZWVkc1VwZGF0ZSh0KXt0aGlzLmRhdGEubmVlZHNVcGRhdGU9dH1hcHBseU1hdHJpeDQodCl7Zm9yKGxldCBlPTAsbj10aGlzLmRhdGEuY291bnQ7ZTxuO2UrKylvbi5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksb24uYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUsb24ueCxvbi55LG9uLnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKW9uLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxvbi5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLG9uLngsb24ueSxvbi56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspb24uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLG9uLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLG9uLngsb24ueSxvbi56KTtyZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCxlKXtsZXQgbj10aGlzLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCtlXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYobj1ybihuLHRoaXMuYXJyYXkpKSxufXNldENvbXBvbmVudCh0LGUsbil7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKG49WXQobix0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCtlXT1uLHRoaXN9c2V0WCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVl0KGUsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdPWUsdGhpc31zZXRZKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9WXQoZSx0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsxXT1lLHRoaXN9c2V0Wih0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVl0KGUsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl09ZSx0aGlzfXNldFcodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1ZdChlLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdPWUsdGhpc31nZXRYKHQpe2xldCBlPXRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPXJuKGUsdGhpcy5hcnJheSkpLGV9Z2V0WSh0KXtsZXQgZT10aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPXJuKGUsdGhpcy5hcnJheSkpLGV9Z2V0Wih0KXtsZXQgZT10aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzJdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPXJuKGUsdGhpcy5hcnJheSkpLGV9Z2V0Vyh0KXtsZXQgZT10aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPXJuKGUsdGhpcy5hcnJheSkpLGV9c2V0WFkodCxlLG4pe3JldHVybiB0PXQqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCx0aGlzLm5vcm1hbGl6ZWQmJihlPVl0KGUsdGhpcy5hcnJheSksbj1ZdChuLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbdCswXT1lLHRoaXMuZGF0YS5hcnJheVt0KzFdPW4sdGhpc31zZXRYWVoodCxlLG4saSl7cmV0dXJuIHQ9dCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCYmKGU9WXQoZSx0aGlzLmFycmF5KSxuPVl0KG4sdGhpcy5hcnJheSksaT1ZdChpLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbdCswXT1lLHRoaXMuZGF0YS5hcnJheVt0KzFdPW4sdGhpcy5kYXRhLmFycmF5W3QrMl09aSx0aGlzfXNldFhZWlcodCxlLG4saSxzKXtyZXR1cm4gdD10KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQsdGhpcy5ub3JtYWxpemVkJiYoZT1ZdChlLHRoaXMuYXJyYXkpLG49WXQobix0aGlzLmFycmF5KSxpPVl0KGksdGhpcy5hcnJheSkscz1ZdChzLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbdCswXT1lLHRoaXMuZGF0YS5hcnJheVt0KzFdPW4sdGhpcy5kYXRhLmFycmF5W3QrMl09aSx0aGlzLmRhdGEuYXJyYXlbdCszXT1zLHRoaXN9Y2xvbmUodCl7aWYodD09PXZvaWQgMCl7Y29uc29sZS5sb2coIlRIUkVFLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLmNsb25lKCk6IENsb25pbmcgYW4gaW50ZXJsZWF2ZWQgYnVmZmVyIGF0dHJpYnV0ZSB3aWxsIGRlLWludGVybGVhdmUgYnVmZmVyIGRhdGEuIik7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPHRoaXMuY291bnQ7bisrKXtjb25zdCBpPW4qdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDtmb3IobGV0IHM9MDtzPHRoaXMuaXRlbVNpemU7cysrKWUucHVzaCh0aGlzLmRhdGEuYXJyYXlbaStzXSl9cmV0dXJuIG5ldyBKdChuZXcgdGhpcy5hcnJheS5jb25zdHJ1Y3RvcihlKSx0aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCl9ZWxzZSByZXR1cm4gdC5pbnRlcmxlYXZlZEJ1ZmZlcnM9PT12b2lkIDAmJih0LmludGVybGVhdmVkQnVmZmVycz17fSksdC5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdPT09dm9pZCAwJiYodC5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdPXRoaXMuZGF0YS5jbG9uZSh0KSksbmV3IGtyKHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXSx0aGlzLml0ZW1TaXplLHRoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCl9dG9KU09OKHQpe2lmKHQ9PT12b2lkIDApe2NvbnNvbGUubG9nKCJUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS50b0pTT04oKTogU2VyaWFsaXppbmcgYW4gaW50ZXJsZWF2ZWQgYnVmZmVyIGF0dHJpYnV0ZSB3aWxsIGRlLWludGVybGVhdmUgYnVmZmVyIGRhdGEuIik7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPHRoaXMuY291bnQ7bisrKXtjb25zdCBpPW4qdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDtmb3IobGV0IHM9MDtzPHRoaXMuaXRlbVNpemU7cysrKWUucHVzaCh0aGlzLmRhdGEuYXJyYXlbaStzXSl9cmV0dXJue2l0ZW1TaXplOnRoaXMuaXRlbVNpemUsdHlwZTp0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6ZSxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19ZWxzZSByZXR1cm4gdC5pbnRlcmxlYXZlZEJ1ZmZlcnM9PT12b2lkIDAmJih0LmludGVybGVhdmVkQnVmZmVycz17fSksdC5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdPT09dm9pZCAwJiYodC5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdPXRoaXMuZGF0YS50b0pTT04odCkpLHtpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiEwLGl0ZW1TaXplOnRoaXMuaXRlbVNpemUsZGF0YTp0aGlzLmRhdGEudXVpZCxvZmZzZXQ6dGhpcy5vZmZzZXQsbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9fX1jbGFzcyBUZiBleHRlbmRzIEtle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc1Nwcml0ZU1hdGVyaWFsPSEwLHRoaXMudHlwZT0iU3ByaXRlTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHl0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLnJvdGF0aW9uPTAsdGhpcy5zaXplQXR0ZW51YXRpb249ITAsdGhpcy50cmFuc3BhcmVudD0hMCx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hcD10Lm1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5yb3RhdGlvbj10LnJvdGF0aW9uLHRoaXMuc2l6ZUF0dGVudWF0aW9uPXQuc2l6ZUF0dGVudWF0aW9uLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWxldCBxcztjb25zdCBlYT1uZXcgSSxZcz1uZXcgSSxacz1uZXcgSSxKcz1uZXcgcSxuYT1uZXcgcSx5Zz1uZXcgQ3QseWw9bmV3IEksaWE9bmV3IEksdmw9bmV3IEksdmc9bmV3IHEsRWY9bmV3IHEsTWc9bmV3IHE7Y2xhc3MgU2cgZXh0ZW5kcyBzZXtjb25zdHJ1Y3Rvcih0PW5ldyBUZil7aWYoc3VwZXIoKSx0aGlzLmlzU3ByaXRlPSEwLHRoaXMudHlwZT0iU3ByaXRlIixxcz09PXZvaWQgMCl7cXM9bmV3IE50O2NvbnN0IGU9bmV3IEZsb2F0MzJBcnJheShbLS41LC0uNSwwLDAsMCwuNSwtLjUsMCwxLDAsLjUsLjUsMCwxLDEsLS41LC41LDAsMCwxXSksbj1uZXcgX2woZSw1KTtxcy5zZXRJbmRleChbMCwxLDIsMCwyLDNdKSxxcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcga3IobiwzLDAsITEpKSxxcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcga3IobiwyLDMsITEpKX10aGlzLmdlb21ldHJ5PXFzLHRoaXMubWF0ZXJpYWw9dCx0aGlzLmNlbnRlcj1uZXcgcSguNSwuNSl9cmF5Y2FzdCh0LGUpe3QuY2FtZXJhPT09bnVsbCYmY29uc29sZS5lcnJvcignVEhSRUUuU3ByaXRlOiAiUmF5Y2FzdGVyLmNhbWVyYSIgbmVlZHMgdG8gYmUgc2V0IGluIG9yZGVyIHRvIHJheWNhc3QgYWdhaW5zdCBzcHJpdGVzLicpLFlzLnNldEZyb21NYXRyaXhTY2FsZSh0aGlzLm1hdHJpeFdvcmxkKSx5Zy5jb3B5KHQuY2FtZXJhLm1hdHJpeFdvcmxkKSx0aGlzLm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKHQuY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSx0aGlzLm1hdHJpeFdvcmxkKSxacy5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tb2RlbFZpZXdNYXRyaXgpLHQuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEmJnRoaXMubWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uPT09ITEmJllzLm11bHRpcGx5U2NhbGFyKC1acy56KTtjb25zdCBuPXRoaXMubWF0ZXJpYWwucm90YXRpb247bGV0IGkscztuIT09MCYmKHM9TWF0aC5jb3MobiksaT1NYXRoLnNpbihuKSk7Y29uc3Qgbz10aGlzLmNlbnRlcjtNbCh5bC5zZXQoLS41LC0uNSwwKSxacyxvLFlzLGkscyksTWwoaWEuc2V0KC41LC0uNSwwKSxacyxvLFlzLGkscyksTWwodmwuc2V0KC41LC41LDApLFpzLG8sWXMsaSxzKSx2Zy5zZXQoMCwwKSxFZi5zZXQoMSwwKSxNZy5zZXQoMSwxKTtsZXQgYT10LnJheS5pbnRlcnNlY3RUcmlhbmdsZSh5bCxpYSx2bCwhMSxlYSk7aWYoYT09PW51bGwmJihNbChpYS5zZXQoLS41LC41LDApLFpzLG8sWXMsaSxzKSxFZi5zZXQoMCwxKSxhPXQucmF5LmludGVyc2VjdFRyaWFuZ2xlKHlsLHZsLGlhLCExLGVhKSxhPT09bnVsbCkpcmV0dXJuO2NvbnN0IGM9dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8oZWEpO2M8dC5uZWFyfHxjPnQuZmFyfHxlLnB1c2goe2Rpc3RhbmNlOmMscG9pbnQ6ZWEuY2xvbmUoKSx1djpnZS5nZXRJbnRlcnBvbGF0aW9uKGVhLHlsLGlhLHZsLHZnLEVmLE1nLG5ldyBxKSxmYWNlOm51bGwsb2JqZWN0OnRoaXN9KX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0LmNlbnRlciE9PXZvaWQgMCYmdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5tYXRlcmlhbD10Lm1hdGVyaWFsLHRoaXN9fWZ1bmN0aW9uIE1sKHIsdCxlLG4saSxzKXtKcy5zdWJWZWN0b3JzKHIsZSkuYWRkU2NhbGFyKC41KS5tdWx0aXBseShuKSxpIT09dm9pZCAwPyhuYS54PXMqSnMueC1pKkpzLnksbmEueT1pKkpzLngrcypKcy55KTpuYS5jb3B5KEpzKSxyLmNvcHkodCksci54Kz1uYS54LHIueSs9bmEueSxyLmFwcGx5TWF0cml4NCh5Zyl9Y29uc3QgU2w9bmV3IEksYmc9bmV3IEk7Y2xhc3Mgd2cgZXh0ZW5kcyBzZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc0xPRD0hMCx0aGlzLl9jdXJyZW50TGV2ZWw9MCx0aGlzLnR5cGU9IkxPRCIsT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7bGV2ZWxzOntlbnVtZXJhYmxlOiEwLHZhbHVlOltdfX0pLHRoaXMuYXV0b1VwZGF0ZT0hMH1jb3B5KHQpe3N1cGVyLmNvcHkodCwhMSk7Y29uc3QgZT10LmxldmVscztmb3IobGV0IG49MCxpPWUubGVuZ3RoO248aTtuKyspe2NvbnN0IHM9ZVtuXTt0aGlzLmFkZExldmVsKHMub2JqZWN0LmNsb25lKCkscy5kaXN0YW5jZSxzLmh5c3RlcmVzaXMpfXJldHVybiB0aGlzLmF1dG9VcGRhdGU9dC5hdXRvVXBkYXRlLHRoaXN9YWRkTGV2ZWwodCxlPTAsbj0wKXtlPU1hdGguYWJzKGUpO2NvbnN0IGk9dGhpcy5sZXZlbHM7bGV0IHM7Zm9yKHM9MDtzPGkubGVuZ3RoJiYhKGU8aVtzXS5kaXN0YW5jZSk7cysrKTtyZXR1cm4gaS5zcGxpY2UocywwLHtkaXN0YW5jZTplLGh5c3RlcmVzaXM6bixvYmplY3Q6dH0pLHRoaXMuYWRkKHQpLHRoaXN9cmVtb3ZlTGV2ZWwodCl7Y29uc3QgZT10aGlzLmxldmVscztmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKylpZihlW25dLmRpc3RhbmNlPT09dCl7Y29uc3QgaT1lLnNwbGljZShuLDEpO3JldHVybiB0aGlzLnJlbW92ZShpWzBdLm9iamVjdCksITB9cmV0dXJuITF9Z2V0Q3VycmVudExldmVsKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnRMZXZlbH1nZXRPYmplY3RGb3JEaXN0YW5jZSh0KXtjb25zdCBlPXRoaXMubGV2ZWxzO2lmKGUubGVuZ3RoPjApe2xldCBuLGk7Zm9yKG49MSxpPWUubGVuZ3RoO248aTtuKyspe2xldCBzPWVbbl0uZGlzdGFuY2U7aWYoZVtuXS5vYmplY3QudmlzaWJsZSYmKHMtPXMqZVtuXS5oeXN0ZXJlc2lzKSx0PHMpYnJlYWt9cmV0dXJuIGVbbi0xXS5vYmplY3R9cmV0dXJuIG51bGx9cmF5Y2FzdCh0LGUpe2lmKHRoaXMubGV2ZWxzLmxlbmd0aD4wKXtTbC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7Y29uc3QgaT10LnJheS5vcmlnaW4uZGlzdGFuY2VUbyhTbCk7dGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZShpKS5yYXljYXN0KHQsZSl9fXVwZGF0ZSh0KXtjb25zdCBlPXRoaXMubGV2ZWxzO2lmKGUubGVuZ3RoPjEpe1NsLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSxiZy5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7Y29uc3Qgbj1TbC5kaXN0YW5jZVRvKGJnKS90Lnpvb207ZVswXS5vYmplY3QudmlzaWJsZT0hMDtsZXQgaSxzO2ZvcihpPTEscz1lLmxlbmd0aDtpPHM7aSsrKXtsZXQgbz1lW2ldLmRpc3RhbmNlO2lmKGVbaV0ub2JqZWN0LnZpc2libGUmJihvLT1vKmVbaV0uaHlzdGVyZXNpcyksbj49byllW2ktMV0ub2JqZWN0LnZpc2libGU9ITEsZVtpXS5vYmplY3QudmlzaWJsZT0hMDtlbHNlIGJyZWFrfWZvcih0aGlzLl9jdXJyZW50TGV2ZWw9aS0xO2k8cztpKyspZVtpXS5vYmplY3QudmlzaWJsZT0hMX19dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3RoaXMuYXV0b1VwZGF0ZT09PSExJiYoZS5vYmplY3QuYXV0b1VwZGF0ZT0hMSksZS5vYmplY3QubGV2ZWxzPVtdO2NvbnN0IG49dGhpcy5sZXZlbHM7Zm9yKGxldCBpPTAscz1uLmxlbmd0aDtpPHM7aSsrKXtjb25zdCBvPW5baV07ZS5vYmplY3QubGV2ZWxzLnB1c2goe29iamVjdDpvLm9iamVjdC51dWlkLGRpc3RhbmNlOm8uZGlzdGFuY2UsaHlzdGVyZXNpczpvLmh5c3RlcmVzaXN9KX1yZXR1cm4gZX19Y29uc3QgQWc9bmV3IEksVGc9bmV3IFF0LEVnPW5ldyBRdCxzUz1uZXcgSSxDZz1uZXcgQ3QsYmw9bmV3IEksQ2Y9bmV3IEdlLFJnPW5ldyBDdCxSZj1uZXcgaHI7Y2xhc3MgSWcgZXh0ZW5kcyBMZXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5pc1NraW5uZWRNZXNoPSEwLHRoaXMudHlwZT0iU2tpbm5lZE1lc2giLHRoaXMuYmluZE1vZGU9V2gsdGhpcy5iaW5kTWF0cml4PW5ldyBDdCx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlPW5ldyBDdCx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsfWNvbXB1dGVCb3VuZGluZ0JveCgpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeTt0aGlzLmJvdW5kaW5nQm94PT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IGxlKSx0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpO2NvbnN0IGU9dC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7Zm9yKGxldCBuPTA7bjxlLmNvdW50O24rKyl0aGlzLmdldFZlcnRleFBvc2l0aW9uKG4sYmwpLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChibCl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5O3RoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgR2UpLHRoaXMuYm91bmRpbmdTcGhlcmUubWFrZUVtcHR5KCk7Y29uc3QgZT10LmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtmb3IobGV0IG49MDtuPGUuY291bnQ7bisrKXRoaXMuZ2V0VmVydGV4UG9zaXRpb24obixibCksdGhpcy5ib3VuZGluZ1NwaGVyZS5leHBhbmRCeVBvaW50KGJsKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLmJpbmRNb2RlPXQuYmluZE1vZGUsdGhpcy5iaW5kTWF0cml4LmNvcHkodC5iaW5kTWF0cml4KSx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkodC5iaW5kTWF0cml4SW52ZXJzZSksdGhpcy5za2VsZXRvbj10LnNrZWxldG9uLHQuYm91bmRpbmdCb3ghPT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD10LmJvdW5kaW5nQm94LmNsb25lKCkpLHQuYm91bmRpbmdTcGhlcmUhPT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT10LmJvdW5kaW5nU3BoZXJlLmNsb25lKCkpLHRoaXN9cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5tYXRlcmlhbCxpPXRoaXMubWF0cml4V29ybGQ7biE9PXZvaWQgMCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLENmLmNvcHkodGhpcy5ib3VuZGluZ1NwaGVyZSksQ2YuYXBwbHlNYXRyaXg0KGkpLHQucmF5LmludGVyc2VjdHNTcGhlcmUoQ2YpIT09ITEmJihSZy5jb3B5KGkpLmludmVydCgpLFJmLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChSZyksISh0aGlzLmJvdW5kaW5nQm94IT09bnVsbCYmUmYuaW50ZXJzZWN0c0JveCh0aGlzLmJvdW5kaW5nQm94KT09PSExKSYmdGhpcy5fY29tcHV0ZUludGVyc2VjdGlvbnModCxlLFJmKSkpfWdldFZlcnRleFBvc2l0aW9uKHQsZSl7cmV0dXJuIHN1cGVyLmdldFZlcnRleFBvc2l0aW9uKHQsZSksdGhpcy5hcHBseUJvbmVUcmFuc2Zvcm0odCxlKSxlfWJpbmQodCxlKXt0aGlzLnNrZWxldG9uPXQsZT09PXZvaWQgMCYmKHRoaXMudXBkYXRlTWF0cml4V29ybGQoITApLHRoaXMuc2tlbGV0b24uY2FsY3VsYXRlSW52ZXJzZXMoKSxlPXRoaXMubWF0cml4V29ybGQpLHRoaXMuYmluZE1hdHJpeC5jb3B5KGUpLHRoaXMuYmluZE1hdHJpeEludmVyc2UuY29weShlKS5pbnZlcnQoKX1wb3NlKCl7dGhpcy5za2VsZXRvbi5wb3NlKCl9bm9ybWFsaXplU2tpbldlaWdodHMoKXtjb25zdCB0PW5ldyBRdCxlPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0O2ZvcihsZXQgbj0wLGk9ZS5jb3VudDtuPGk7bisrKXt0LmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxuKTtjb25zdCBzPTEvdC5tYW5oYXR0YW5MZW5ndGgoKTtzIT09MS8wP3QubXVsdGlwbHlTY2FsYXIocyk6dC5zZXQoMSwwLDAsMCksZS5zZXRYWVpXKG4sdC54LHQueSx0LnosdC53KX19dXBkYXRlTWF0cml4V29ybGQodCl7c3VwZXIudXBkYXRlTWF0cml4V29ybGQodCksdGhpcy5iaW5kTW9kZT09PVdoP3RoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKTp0aGlzLmJpbmRNb2RlPT09TG0/dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuYmluZE1hdHJpeCkuaW52ZXJ0KCk6Y29uc29sZS53YXJuKCJUSFJFRS5Ta2lubmVkTWVzaDogVW5yZWNvZ25pemVkIGJpbmRNb2RlOiAiK3RoaXMuYmluZE1vZGUpfWFwcGx5Qm9uZVRyYW5zZm9ybSh0LGUpe2NvbnN0IG49dGhpcy5za2VsZXRvbixpPXRoaXMuZ2VvbWV0cnk7VGcuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLmF0dHJpYnV0ZXMuc2tpbkluZGV4LHQpLEVnLmZyb21CdWZmZXJBdHRyaWJ1dGUoaS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQsdCksQWcuY29weShlKS5hcHBseU1hdHJpeDQodGhpcy5iaW5kTWF0cml4KSxlLnNldCgwLDAsMCk7Zm9yKGxldCBzPTA7czw0O3MrKyl7Y29uc3Qgbz1FZy5nZXRDb21wb25lbnQocyk7aWYobyE9PTApe2NvbnN0IGE9VGcuZ2V0Q29tcG9uZW50KHMpO0NnLm11bHRpcGx5TWF0cmljZXMobi5ib25lc1thXS5tYXRyaXhXb3JsZCxuLmJvbmVJbnZlcnNlc1thXSksZS5hZGRTY2FsZWRWZWN0b3Ioc1MuY29weShBZykuYXBwbHlNYXRyaXg0KENnKSxvKX19cmV0dXJuIGUuYXBwbHlNYXRyaXg0KHRoaXMuYmluZE1hdHJpeEludmVyc2UpfX1jbGFzcyBJZiBleHRlbmRzIHNle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzQm9uZT0hMCx0aGlzLnR5cGU9IkJvbmUifX1jbGFzcyBNaSBleHRlbmRzIEFle2NvbnN0cnVjdG9yKHQ9bnVsbCxlPTEsbj0xLGkscyxvLGEsYyxsPVhlLHU9WGUsaCxmKXtzdXBlcihudWxsLG8sYSxjLGwsdSxpLHMsaCxmKSx0aGlzLmlzRGF0YVRleHR1cmU9ITAsdGhpcy5pbWFnZT17ZGF0YTp0LHdpZHRoOmUsaGVpZ2h0Om59LHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuZmxpcFk9ITEsdGhpcy51bnBhY2tBbGlnbm1lbnQ9MX19Y29uc3QgUGc9bmV3IEN0LG9TPW5ldyBDdDtjbGFzcyB3bHtjb25zdHJ1Y3Rvcih0PVtdLGU9W10pe3RoaXMudXVpZD1MbigpLHRoaXMuYm9uZXM9dC5zbGljZSgwKSx0aGlzLmJvbmVJbnZlcnNlcz1lLHRoaXMuYm9uZU1hdHJpY2VzPW51bGwsdGhpcy5ib25lVGV4dHVyZT1udWxsLHRoaXMuaW5pdCgpfWluaXQoKXtjb25zdCB0PXRoaXMuYm9uZXMsZT10aGlzLmJvbmVJbnZlcnNlcztpZih0aGlzLmJvbmVNYXRyaWNlcz1uZXcgRmxvYXQzMkFycmF5KHQubGVuZ3RoKjE2KSxlLmxlbmd0aD09PTApdGhpcy5jYWxjdWxhdGVJbnZlcnNlcygpO2Vsc2UgaWYodC5sZW5ndGghPT1lLmxlbmd0aCl7Y29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogTnVtYmVyIG9mIGludmVyc2UgYm9uZSBtYXRyaWNlcyBkb2VzIG5vdCBtYXRjaCBhbW91bnQgb2YgYm9uZXMuIiksdGhpcy5ib25lSW52ZXJzZXM9W107Zm9yKGxldCBuPTAsaT10aGlzLmJvbmVzLmxlbmd0aDtuPGk7bisrKXRoaXMuYm9uZUludmVyc2VzLnB1c2gobmV3IEN0KX19Y2FsY3VsYXRlSW52ZXJzZXMoKXt0aGlzLmJvbmVJbnZlcnNlcy5sZW5ndGg9MDtmb3IobGV0IHQ9MCxlPXRoaXMuYm9uZXMubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IG49bmV3IEN0O3RoaXMuYm9uZXNbdF0mJm4uY29weSh0aGlzLmJvbmVzW3RdLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSx0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG4pfX1wb3NlKCl7Zm9yKGxldCB0PTAsZT10aGlzLmJvbmVzLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBuPXRoaXMuYm9uZXNbdF07biYmbi5tYXRyaXhXb3JsZC5jb3B5KHRoaXMuYm9uZUludmVyc2VzW3RdKS5pbnZlcnQoKX1mb3IobGV0IHQ9MCxlPXRoaXMuYm9uZXMubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IG49dGhpcy5ib25lc1t0XTtuJiYobi5wYXJlbnQmJm4ucGFyZW50LmlzQm9uZT8obi5tYXRyaXguY29weShuLnBhcmVudC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksbi5tYXRyaXgubXVsdGlwbHkobi5tYXRyaXhXb3JsZCkpOm4ubWF0cml4LmNvcHkobi5tYXRyaXhXb3JsZCksbi5tYXRyaXguZGVjb21wb3NlKG4ucG9zaXRpb24sbi5xdWF0ZXJuaW9uLG4uc2NhbGUpKX19dXBkYXRlKCl7Y29uc3QgdD10aGlzLmJvbmVzLGU9dGhpcy5ib25lSW52ZXJzZXMsbj10aGlzLmJvbmVNYXRyaWNlcyxpPXRoaXMuYm9uZVRleHR1cmU7Zm9yKGxldCBzPTAsbz10Lmxlbmd0aDtzPG87cysrKXtjb25zdCBhPXRbc10/dFtzXS5tYXRyaXhXb3JsZDpvUztQZy5tdWx0aXBseU1hdHJpY2VzKGEsZVtzXSksUGcudG9BcnJheShuLHMqMTYpfWkhPT1udWxsJiYoaS5uZWVkc1VwZGF0ZT0hMCl9Y2xvbmUoKXtyZXR1cm4gbmV3IHdsKHRoaXMuYm9uZXMsdGhpcy5ib25lSW52ZXJzZXMpfWNvbXB1dGVCb25lVGV4dHVyZSgpe2xldCB0PU1hdGguc3FydCh0aGlzLmJvbmVzLmxlbmd0aCo0KTt0PU1hdGguY2VpbCh0LzQpKjQsdD1NYXRoLm1heCh0LDQpO2NvbnN0IGU9bmV3IEZsb2F0MzJBcnJheSh0KnQqNCk7ZS5zZXQodGhpcy5ib25lTWF0cmljZXMpO2NvbnN0IG49bmV3IE1pKGUsdCx0LG5uLHhuKTtyZXR1cm4gbi5uZWVkc1VwZGF0ZT0hMCx0aGlzLmJvbmVNYXRyaWNlcz1lLHRoaXMuYm9uZVRleHR1cmU9bix0aGlzfWdldEJvbmVCeU5hbWUodCl7Zm9yKGxldCBlPTAsbj10aGlzLmJvbmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBpPXRoaXMuYm9uZXNbZV07aWYoaS5uYW1lPT09dClyZXR1cm4gaX19ZGlzcG9zZSgpe3RoaXMuYm9uZVRleHR1cmUhPT1udWxsJiYodGhpcy5ib25lVGV4dHVyZS5kaXNwb3NlKCksdGhpcy5ib25lVGV4dHVyZT1udWxsKX1mcm9tSlNPTih0LGUpe3RoaXMudXVpZD10LnV1aWQ7Zm9yKGxldCBuPTAsaT10LmJvbmVzLmxlbmd0aDtuPGk7bisrKXtjb25zdCBzPXQuYm9uZXNbbl07bGV0IG89ZVtzXTtvPT09dm9pZCAwJiYoY29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogTm8gYm9uZSBmb3VuZCB3aXRoIFVVSUQ6IixzKSxvPW5ldyBJZiksdGhpcy5ib25lcy5wdXNoKG8pLHRoaXMuYm9uZUludmVyc2VzLnB1c2gobmV3IEN0KCkuZnJvbUFycmF5KHQuYm9uZUludmVyc2VzW25dKSl9cmV0dXJuIHRoaXMuaW5pdCgpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD17bWV0YWRhdGE6e3ZlcnNpb246NC42LHR5cGU6IlNrZWxldG9uIixnZW5lcmF0b3I6IlNrZWxldG9uLnRvSlNPTiJ9LGJvbmVzOltdLGJvbmVJbnZlcnNlczpbXX07dC51dWlkPXRoaXMudXVpZDtjb25zdCBlPXRoaXMuYm9uZXMsbj10aGlzLmJvbmVJbnZlcnNlcztmb3IobGV0IGk9MCxzPWUubGVuZ3RoO2k8cztpKyspe2NvbnN0IG89ZVtpXTt0LmJvbmVzLnB1c2goby51dWlkKTtjb25zdCBhPW5baV07dC5ib25lSW52ZXJzZXMucHVzaChhLnRvQXJyYXkoKSl9cmV0dXJuIHR9fWNsYXNzIEtzIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IodCxlLG4saT0xKXtzdXBlcih0LGUsbiksdGhpcy5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT0hMCx0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9aX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMubWVzaFBlckF0dHJpYnV0ZT10Lm1lc2hQZXJBdHRyaWJ1dGUsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0Lm1lc2hQZXJBdHRyaWJ1dGU9dGhpcy5tZXNoUGVyQXR0cmlidXRlLHQuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9ITAsdH19Y29uc3QganM9bmV3IEN0LExnPW5ldyBDdCxBbD1bXSxEZz1uZXcgbGUsYVM9bmV3IEN0LHJhPW5ldyBMZSxzYT1uZXcgR2U7Y2xhc3MgVWcgZXh0ZW5kcyBMZXtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlKSx0aGlzLmlzSW5zdGFuY2VkTWVzaD0hMCx0aGlzLmluc3RhbmNlTWF0cml4PW5ldyBLcyhuZXcgRmxvYXQzMkFycmF5KG4qMTYpLDE2KSx0aGlzLmluc3RhbmNlQ29sb3I9bnVsbCx0aGlzLm1vcnBoVGV4dHVyZT1udWxsLHRoaXMuY291bnQ9bix0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsO2ZvcihsZXQgaT0wO2k8bjtpKyspdGhpcy5zZXRNYXRyaXhBdChpLGFTKX1jb21wdXRlQm91bmRpbmdCb3goKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnksZT10aGlzLmNvdW50O3RoaXMuYm91bmRpbmdCb3g9PT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1uZXcgbGUpLHQuYm91bmRpbmdCb3g9PT1udWxsJiZ0LmNvbXB1dGVCb3VuZGluZ0JveCgpLHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7Zm9yKGxldCBuPTA7bjxlO24rKyl0aGlzLmdldE1hdHJpeEF0KG4sanMpLERnLmNvcHkodC5ib3VuZGluZ0JveCkuYXBwbHlNYXRyaXg0KGpzKSx0aGlzLmJvdW5kaW5nQm94LnVuaW9uKERnKX1jb21wdXRlQm91bmRpbmdTcGhlcmUoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnksZT10aGlzLmNvdW50O3RoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgR2UpLHQuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZ0LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXMuYm91bmRpbmdTcGhlcmUubWFrZUVtcHR5KCk7Zm9yKGxldCBuPTA7bjxlO24rKyl0aGlzLmdldE1hdHJpeEF0KG4sanMpLHNhLmNvcHkodC5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KGpzKSx0aGlzLmJvdW5kaW5nU3BoZXJlLnVuaW9uKHNhKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLmluc3RhbmNlTWF0cml4LmNvcHkodC5pbnN0YW5jZU1hdHJpeCksdC5tb3JwaFRleHR1cmUhPT1udWxsJiYodGhpcy5tb3JwaFRleHR1cmU9dC5tb3JwaFRleHR1cmUuY2xvbmUoKSksdC5pbnN0YW5jZUNvbG9yIT09bnVsbCYmKHRoaXMuaW5zdGFuY2VDb2xvcj10Lmluc3RhbmNlQ29sb3IuY2xvbmUoKSksdGhpcy5jb3VudD10LmNvdW50LHQuYm91bmRpbmdCb3ghPT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD10LmJvdW5kaW5nQm94LmNsb25lKCkpLHQuYm91bmRpbmdTcGhlcmUhPT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT10LmJvdW5kaW5nU3BoZXJlLmNsb25lKCkpLHRoaXN9Z2V0Q29sb3JBdCh0LGUpe2UuZnJvbUFycmF5KHRoaXMuaW5zdGFuY2VDb2xvci5hcnJheSx0KjMpfWdldE1hdHJpeEF0KHQsZSl7ZS5mcm9tQXJyYXkodGhpcy5pbnN0YW5jZU1hdHJpeC5hcnJheSx0KjE2KX1nZXRNb3JwaEF0KHQsZSl7Y29uc3Qgbj1lLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyxpPXRoaXMubW9ycGhUZXh0dXJlLnNvdXJjZS5kYXRhLmRhdGEscz1uLmxlbmd0aCsxLG89dCpzKzE7Zm9yKGxldCBhPTA7YTxuLmxlbmd0aDthKyspblthXT1pW28rYV19cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5tYXRyaXhXb3JsZCxpPXRoaXMuY291bnQ7aWYocmEuZ2VvbWV0cnk9dGhpcy5nZW9tZXRyeSxyYS5tYXRlcmlhbD10aGlzLm1hdGVyaWFsLHJhLm1hdGVyaWFsIT09dm9pZCAwJiYodGhpcy5ib3VuZGluZ1NwaGVyZT09PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksc2EuY29weSh0aGlzLmJvdW5kaW5nU3BoZXJlKSxzYS5hcHBseU1hdHJpeDQobiksdC5yYXkuaW50ZXJzZWN0c1NwaGVyZShzYSkhPT0hMSkpZm9yKGxldCBzPTA7czxpO3MrKyl7dGhpcy5nZXRNYXRyaXhBdChzLGpzKSxMZy5tdWx0aXBseU1hdHJpY2VzKG4sanMpLHJhLm1hdHJpeFdvcmxkPUxnLHJhLnJheWNhc3QodCxBbCk7Zm9yKGxldCBvPTAsYT1BbC5sZW5ndGg7bzxhO28rKyl7Y29uc3QgYz1BbFtvXTtjLmluc3RhbmNlSWQ9cyxjLm9iamVjdD10aGlzLGUucHVzaChjKX1BbC5sZW5ndGg9MH19c2V0Q29sb3JBdCh0LGUpe3RoaXMuaW5zdGFuY2VDb2xvcj09PW51bGwmJih0aGlzLmluc3RhbmNlQ29sb3I9bmV3IEtzKG5ldyBGbG9hdDMyQXJyYXkodGhpcy5pbnN0YW5jZU1hdHJpeC5jb3VudCozKS5maWxsKDEpLDMpKSxlLnRvQXJyYXkodGhpcy5pbnN0YW5jZUNvbG9yLmFycmF5LHQqMyl9c2V0TWF0cml4QXQodCxlKXtlLnRvQXJyYXkodGhpcy5pbnN0YW5jZU1hdHJpeC5hcnJheSx0KjE2KX1zZXRNb3JwaEF0KHQsZSl7Y29uc3Qgbj1lLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyxpPW4ubGVuZ3RoKzE7dGhpcy5tb3JwaFRleHR1cmU9PT1udWxsJiYodGhpcy5tb3JwaFRleHR1cmU9bmV3IE1pKG5ldyBGbG9hdDMyQXJyYXkoaSp0aGlzLmNvdW50KSxpLHRoaXMuY291bnQsZ2MseG4pKTtjb25zdCBzPXRoaXMubW9ycGhUZXh0dXJlLnNvdXJjZS5kYXRhLmRhdGE7bGV0IG89MDtmb3IobGV0IGw9MDtsPG4ubGVuZ3RoO2wrKylvKz1uW2xdO2NvbnN0IGE9dGhpcy5nZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZT8xOjEtbyxjPWkqdDtzW2NdPWEscy5zZXQobixjKzEpfXVwZGF0ZU1vcnBoVGFyZ2V0cygpe31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pLHRoaXMubW9ycGhUZXh0dXJlIT09bnVsbCYmKHRoaXMubW9ycGhUZXh0dXJlLmRpc3Bvc2UoKSx0aGlzLm1vcnBoVGV4dHVyZT1udWxsKX19Y29uc3QgUGY9bmV3IEksY1M9bmV3IEksbFM9bmV3IFd0O2NsYXNzIGFpe2NvbnN0cnVjdG9yKHQ9bmV3IEkoMSwwLDApLGU9MCl7dGhpcy5pc1BsYW5lPSEwLHRoaXMubm9ybWFsPXQsdGhpcy5jb25zdGFudD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLHRoaXMuY29uc3RhbnQ9ZSx0aGlzfXNldENvbXBvbmVudHModCxlLG4saSl7cmV0dXJuIHRoaXMubm9ybWFsLnNldCh0LGUsbiksdGhpcy5jb25zdGFudD1pLHRoaXN9c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PS1lLmRvdCh0aGlzLm5vcm1hbCksdGhpc31zZXRGcm9tQ29wbGFuYXJQb2ludHModCxlLG4pe2NvbnN0IGk9UGYuc3ViVmVjdG9ycyhuLGUpLmNyb3NzKGNTLnN1YlZlY3RvcnModCxlKSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoaSx0KSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodC5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9dC5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IHQ9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIodCksdGhpcy5jb25zdGFudCo9dCx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KHQpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQodC5jZW50ZXIpLXQucmFkaXVzfXByb2plY3RQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLC10aGlzLmRpc3RhbmNlVG9Qb2ludCh0KSl9aW50ZXJzZWN0TGluZSh0LGUpe2NvbnN0IG49dC5kZWx0YShQZiksaT10aGlzLm5vcm1hbC5kb3Qobik7aWYoaT09PTApcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpPT09MD9lLmNvcHkodC5zdGFydCk6bnVsbDtjb25zdCBzPS0odC5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL2k7cmV0dXJuIHM8MHx8cz4xP251bGw6ZS5jb3B5KHQuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihuLHMpfWludGVyc2VjdHNMaW5lKHQpe2NvbnN0IGU9dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCksbj10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LmVuZCk7cmV0dXJuIGU8MCYmbj4wfHxuPDAmJmU+MH1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KHQpe3JldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQodCxlKXtjb25zdCBuPWV8fGxTLmdldE5vcm1hbE1hdHJpeCh0KSxpPXRoaXMuY29wbGFuYXJQb2ludChQZikuYXBwbHlNYXRyaXg0KHQpLHM9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKG4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1pLmRvdChzKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jb25zdGFudC09dC5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZ0LmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNvbnN0IFZyPW5ldyBHZSxUbD1uZXcgSTtjbGFzcyBRc3tjb25zdHJ1Y3Rvcih0PW5ldyBhaSxlPW5ldyBhaSxuPW5ldyBhaSxpPW5ldyBhaSxzPW5ldyBhaSxvPW5ldyBhaSl7dGhpcy5wbGFuZXM9W3QsZSxuLGkscyxvXX1zZXQodCxlLG4saSxzLG8pe2NvbnN0IGE9dGhpcy5wbGFuZXM7cmV0dXJuIGFbMF0uY29weSh0KSxhWzFdLmNvcHkoZSksYVsyXS5jb3B5KG4pLGFbM10uY29weShpKSxhWzRdLmNvcHkocyksYVs1XS5jb3B5KG8pLHRoaXN9Y29weSh0KXtjb25zdCBlPXRoaXMucGxhbmVzO2ZvcihsZXQgbj0wO248NjtuKyspZVtuXS5jb3B5KHQucGxhbmVzW25dKTtyZXR1cm4gdGhpc31zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCh0LGU9SG4pe2NvbnN0IG49dGhpcy5wbGFuZXMsaT10LmVsZW1lbnRzLHM9aVswXSxvPWlbMV0sYT1pWzJdLGM9aVszXSxsPWlbNF0sdT1pWzVdLGg9aVs2XSxmPWlbN10sZD1pWzhdLHA9aVs5XSx4PWlbMTBdLGc9aVsxMV0sbT1pWzEyXSx2PWlbMTNdLHk9aVsxNF0sXz1pWzE1XTtpZihuWzBdLnNldENvbXBvbmVudHMoYy1zLGYtbCxnLWQsXy1tKS5ub3JtYWxpemUoKSxuWzFdLnNldENvbXBvbmVudHMoYytzLGYrbCxnK2QsXyttKS5ub3JtYWxpemUoKSxuWzJdLnNldENvbXBvbmVudHMoYytvLGYrdSxnK3AsXyt2KS5ub3JtYWxpemUoKSxuWzNdLnNldENvbXBvbmVudHMoYy1vLGYtdSxnLXAsXy12KS5ub3JtYWxpemUoKSxuWzRdLnNldENvbXBvbmVudHMoYy1hLGYtaCxnLXgsXy15KS5ub3JtYWxpemUoKSxlPT09SG4pbls1XS5zZXRDb21wb25lbnRzKGMrYSxmK2gsZyt4LF8reSkubm9ybWFsaXplKCk7ZWxzZSBpZihlPT09WG8pbls1XS5zZXRDb21wb25lbnRzKGEsaCx4LHkpLm5vcm1hbGl6ZSgpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5GcnVzdHVtLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrZSk7cmV0dXJuIHRoaXN9aW50ZXJzZWN0c09iamVjdCh0KXtpZih0LmJvdW5kaW5nU3BoZXJlIT09dm9pZCAwKXQuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZ0LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLFZyLmNvcHkodC5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpO2Vsc2V7Y29uc3QgZT10Lmdlb21ldHJ5O2UuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZlLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLFZyLmNvcHkoZS5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpfXJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoVnIpfWludGVyc2VjdHNTcHJpdGUodCl7cmV0dXJuIFZyLmNlbnRlci5zZXQoMCwwLDApLFZyLnJhZGl1cz0uNzA3MTA2NzgxMTg2NTQ3NixWci5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy5pbnRlcnNlY3RzU3BoZXJlKFZyKX1pbnRlcnNlY3RzU3BoZXJlKHQpe2NvbnN0IGU9dGhpcy5wbGFuZXMsbj10LmNlbnRlcixpPS10LnJhZGl1cztmb3IobGV0IHM9MDtzPDY7cysrKWlmKGVbc10uZGlzdGFuY2VUb1BvaW50KG4pPGkpcmV0dXJuITE7cmV0dXJuITB9aW50ZXJzZWN0c0JveCh0KXtjb25zdCBlPXRoaXMucGxhbmVzO2ZvcihsZXQgbj0wO248NjtuKyspe2NvbnN0IGk9ZVtuXTtpZihUbC54PWkubm9ybWFsLng+MD90Lm1heC54OnQubWluLngsVGwueT1pLm5vcm1hbC55PjA/dC5tYXgueTp0Lm1pbi55LFRsLno9aS5ub3JtYWwuej4wP3QubWF4Lno6dC5taW4ueixpLmRpc3RhbmNlVG9Qb2ludChUbCk8MClyZXR1cm4hMX1yZXR1cm4hMH1jb250YWluc1BvaW50KHQpe2NvbnN0IGU9dGhpcy5wbGFuZXM7Zm9yKGxldCBuPTA7bjw2O24rKylpZihlW25dLmRpc3RhbmNlVG9Qb2ludCh0KTwwKXJldHVybiExO3JldHVybiEwfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y29uc3QgU2k9bmV3IEN0LGJpPW5ldyBRcztjbGFzcyBFbHtjb25zdHJ1Y3Rvcigpe3RoaXMuY29vcmRpbmF0ZVN5c3RlbT1Ibn1pbnRlcnNlY3RzT2JqZWN0KHQsZSl7aWYoIWUuaXNBcnJheUNhbWVyYXx8ZS5jYW1lcmFzLmxlbmd0aD09PTApcmV0dXJuITE7Zm9yKGxldCBuPTA7bjxlLmNhbWVyYXMubGVuZ3RoO24rKyl7Y29uc3QgaT1lLmNhbWVyYXNbbl07aWYoU2kubXVsdGlwbHlNYXRyaWNlcyhpLnByb2plY3Rpb25NYXRyaXgsaS5tYXRyaXhXb3JsZEludmVyc2UpLGJpLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KFNpLHRoaXMuY29vcmRpbmF0ZVN5c3RlbSksYmkuaW50ZXJzZWN0c09iamVjdCh0KSlyZXR1cm4hMH1yZXR1cm4hMX1pbnRlcnNlY3RzU3ByaXRlKHQsZSl7aWYoIWV8fCFlLmNhbWVyYXN8fGUuY2FtZXJhcy5sZW5ndGg9PT0wKXJldHVybiExO2ZvcihsZXQgbj0wO248ZS5jYW1lcmFzLmxlbmd0aDtuKyspe2NvbnN0IGk9ZS5jYW1lcmFzW25dO2lmKFNpLm11bHRpcGx5TWF0cmljZXMoaS5wcm9qZWN0aW9uTWF0cml4LGkubWF0cml4V29ybGRJbnZlcnNlKSxiaS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChTaSx0aGlzLmNvb3JkaW5hdGVTeXN0ZW0pLGJpLmludGVyc2VjdHNTcHJpdGUodCkpcmV0dXJuITB9cmV0dXJuITF9aW50ZXJzZWN0c1NwaGVyZSh0LGUpe2lmKCFlfHwhZS5jYW1lcmFzfHxlLmNhbWVyYXMubGVuZ3RoPT09MClyZXR1cm4hMTtmb3IobGV0IG49MDtuPGUuY2FtZXJhcy5sZW5ndGg7bisrKXtjb25zdCBpPWUuY2FtZXJhc1tuXTtpZihTaS5tdWx0aXBseU1hdHJpY2VzKGkucHJvamVjdGlvbk1hdHJpeCxpLm1hdHJpeFdvcmxkSW52ZXJzZSksYmkuc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoU2ksdGhpcy5jb29yZGluYXRlU3lzdGVtKSxiaS5pbnRlcnNlY3RzU3BoZXJlKHQpKXJldHVybiEwfXJldHVybiExfWludGVyc2VjdHNCb3godCxlKXtpZighZXx8IWUuY2FtZXJhc3x8ZS5jYW1lcmFzLmxlbmd0aD09PTApcmV0dXJuITE7Zm9yKGxldCBuPTA7bjxlLmNhbWVyYXMubGVuZ3RoO24rKyl7Y29uc3QgaT1lLmNhbWVyYXNbbl07aWYoU2kubXVsdGlwbHlNYXRyaWNlcyhpLnByb2plY3Rpb25NYXRyaXgsaS5tYXRyaXhXb3JsZEludmVyc2UpLGJpLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KFNpLHRoaXMuY29vcmRpbmF0ZVN5c3RlbSksYmkuaW50ZXJzZWN0c0JveCh0KSlyZXR1cm4hMH1yZXR1cm4hMX1jb250YWluc1BvaW50KHQsZSl7aWYoIWV8fCFlLmNhbWVyYXN8fGUuY2FtZXJhcy5sZW5ndGg9PT0wKXJldHVybiExO2ZvcihsZXQgbj0wO248ZS5jYW1lcmFzLmxlbmd0aDtuKyspe2NvbnN0IGk9ZS5jYW1lcmFzW25dO2lmKFNpLm11bHRpcGx5TWF0cmljZXMoaS5wcm9qZWN0aW9uTWF0cml4LGkubWF0cml4V29ybGRJbnZlcnNlKSxiaS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChTaSx0aGlzLmNvb3JkaW5hdGVTeXN0ZW0pLGJpLmNvbnRhaW5zUG9pbnQodCkpcmV0dXJuITB9cmV0dXJuITF9Y2xvbmUoKXtyZXR1cm4gbmV3IEVsfX1mdW5jdGlvbiBMZihyLHQpe3JldHVybiByLXR9ZnVuY3Rpb24gdVMocix0KXtyZXR1cm4gci56LXQuen1mdW5jdGlvbiBoUyhyLHQpe3JldHVybiB0Lnotci56fWNsYXNzIGZTe2NvbnN0cnVjdG9yKCl7dGhpcy5pbmRleD0wLHRoaXMucG9vbD1bXSx0aGlzLmxpc3Q9W119cHVzaCh0LGUsbixpKXtjb25zdCBzPXRoaXMucG9vbCxvPXRoaXMubGlzdDt0aGlzLmluZGV4Pj1zLmxlbmd0aCYmcy5wdXNoKHtzdGFydDotMSxjb3VudDotMSx6Oi0xLGluZGV4Oi0xfSk7Y29uc3QgYT1zW3RoaXMuaW5kZXhdO28ucHVzaChhKSx0aGlzLmluZGV4KyssYS5zdGFydD10LGEuY291bnQ9ZSxhLno9bixhLmluZGV4PWl9cmVzZXQoKXt0aGlzLmxpc3QubGVuZ3RoPTAsdGhpcy5pbmRleD0wfX1jb25zdCBNbj1uZXcgQ3QsZFM9bmV3IHl0KDEsMSwxKSxOZz1uZXcgUXMscFM9bmV3IEVsLENsPW5ldyBsZSxHcj1uZXcgR2Usb2E9bmV3IEksRmc9bmV3IEksbVM9bmV3IEksRGY9bmV3IGZTLGplPW5ldyBMZSxSbD1bXTtmdW5jdGlvbiBnUyhyLHQsZT0wKXtjb25zdCBuPXQuaXRlbVNpemU7aWYoci5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfHxyLmFycmF5LmNvbnN0cnVjdG9yIT09dC5hcnJheS5jb25zdHJ1Y3Rvcil7Y29uc3QgaT1yLmNvdW50O2ZvcihsZXQgcz0wO3M8aTtzKyspZm9yKGxldCBvPTA7bzxuO28rKyl0LnNldENvbXBvbmVudChzK2UsbyxyLmdldENvbXBvbmVudChzLG8pKX1lbHNlIHQuYXJyYXkuc2V0KHIuYXJyYXksZSpuKTt0Lm5lZWRzVXBkYXRlPSEwfWZ1bmN0aW9uIEhyKHIsdCl7aWYoci5jb25zdHJ1Y3RvciE9PXQuY29uc3RydWN0b3Ipe2NvbnN0IGU9TWF0aC5taW4oci5sZW5ndGgsdC5sZW5ndGgpO2ZvcihsZXQgbj0wO248ZTtuKyspdFtuXT1yW25dfWVsc2V7Y29uc3QgZT1NYXRoLm1pbihyLmxlbmd0aCx0Lmxlbmd0aCk7dC5zZXQobmV3IHIuY29uc3RydWN0b3Ioci5idWZmZXIsMCxlKSl9fWNsYXNzIEJnIGV4dGVuZHMgTGV7Y29uc3RydWN0b3IodCxlLG49ZSoyLGkpe3N1cGVyKG5ldyBOdCxpKSx0aGlzLmlzQmF0Y2hlZE1lc2g9ITAsdGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkPSEwLHRoaXMuc29ydE9iamVjdHM9ITAsdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbCx0aGlzLmN1c3RvbVNvcnQ9bnVsbCx0aGlzLl9pbnN0YW5jZUluZm89W10sdGhpcy5fZ2VvbWV0cnlJbmZvPVtdLHRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzPVtdLHRoaXMuX2F2YWlsYWJsZUdlb21ldHJ5SWRzPVtdLHRoaXMuX25leHRJbmRleFN0YXJ0PTAsdGhpcy5fbmV4dFZlcnRleFN0YXJ0PTAsdGhpcy5fZ2VvbWV0cnlDb3VudD0wLHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkPSEwLHRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQ9ITEsdGhpcy5fbWF4SW5zdGFuY2VDb3VudD10LHRoaXMuX21heFZlcnRleENvdW50PWUsdGhpcy5fbWF4SW5kZXhDb3VudD1uLHRoaXMuX211bHRpRHJhd0NvdW50cz1uZXcgSW50MzJBcnJheSh0KSx0aGlzLl9tdWx0aURyYXdTdGFydHM9bmV3IEludDMyQXJyYXkodCksdGhpcy5fbXVsdGlEcmF3Q291bnQ9MCx0aGlzLl9tdWx0aURyYXdJbnN0YW5jZXM9bnVsbCx0aGlzLl9tYXRyaWNlc1RleHR1cmU9bnVsbCx0aGlzLl9pbmRpcmVjdFRleHR1cmU9bnVsbCx0aGlzLl9jb2xvcnNUZXh0dXJlPW51bGwsdGhpcy5faW5pdE1hdHJpY2VzVGV4dHVyZSgpLHRoaXMuX2luaXRJbmRpcmVjdFRleHR1cmUoKX1nZXQgbWF4SW5zdGFuY2VDb3VudCgpe3JldHVybiB0aGlzLl9tYXhJbnN0YW5jZUNvdW50fWdldCBpbnN0YW5jZUNvdW50KCl7cmV0dXJuIHRoaXMuX2luc3RhbmNlSW5mby5sZW5ndGgtdGhpcy5fYXZhaWxhYmxlSW5zdGFuY2VJZHMubGVuZ3RofWdldCB1bnVzZWRWZXJ0ZXhDb3VudCgpe3JldHVybiB0aGlzLl9tYXhWZXJ0ZXhDb3VudC10aGlzLl9uZXh0VmVydGV4U3RhcnR9Z2V0IHVudXNlZEluZGV4Q291bnQoKXtyZXR1cm4gdGhpcy5fbWF4SW5kZXhDb3VudC10aGlzLl9uZXh0SW5kZXhTdGFydH1faW5pdE1hdHJpY2VzVGV4dHVyZSgpe2xldCB0PU1hdGguc3FydCh0aGlzLl9tYXhJbnN0YW5jZUNvdW50KjQpO3Q9TWF0aC5jZWlsKHQvNCkqNCx0PU1hdGgubWF4KHQsNCk7Y29uc3QgZT1uZXcgRmxvYXQzMkFycmF5KHQqdCo0KSxuPW5ldyBNaShlLHQsdCxubix4bik7dGhpcy5fbWF0cmljZXNUZXh0dXJlPW59X2luaXRJbmRpcmVjdFRleHR1cmUoKXtsZXQgdD1NYXRoLnNxcnQodGhpcy5fbWF4SW5zdGFuY2VDb3VudCk7dD1NYXRoLmNlaWwodCk7Y29uc3QgZT1uZXcgVWludDMyQXJyYXkodCp0KSxuPW5ldyBNaShlLHQsdCxObyxMaSk7dGhpcy5faW5kaXJlY3RUZXh0dXJlPW59X2luaXRDb2xvcnNUZXh0dXJlKCl7bGV0IHQ9TWF0aC5zcXJ0KHRoaXMuX21heEluc3RhbmNlQ291bnQpO3Q9TWF0aC5jZWlsKHQpO2NvbnN0IGU9bmV3IEZsb2F0MzJBcnJheSh0KnQqNCkuZmlsbCgxKSxuPW5ldyBNaShlLHQsdCxubix4bik7bi5jb2xvclNwYWNlPW5lLndvcmtpbmdDb2xvclNwYWNlLHRoaXMuX2NvbG9yc1RleHR1cmU9bn1faW5pdGlhbGl6ZUdlb21ldHJ5KHQpe2NvbnN0IGU9dGhpcy5nZW9tZXRyeSxuPXRoaXMuX21heFZlcnRleENvdW50LGk9dGhpcy5fbWF4SW5kZXhDb3VudDtpZih0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkPT09ITEpe2Zvcihjb25zdCBzIGluIHQuYXR0cmlidXRlcyl7Y29uc3Qgbz10LmdldEF0dHJpYnV0ZShzKSx7YXJyYXk6YSxpdGVtU2l6ZTpjLG5vcm1hbGl6ZWQ6bH09byx1PW5ldyBhLmNvbnN0cnVjdG9yKG4qYyksaD1uZXcgSnQodSxjLGwpO2Uuc2V0QXR0cmlidXRlKHMsaCl9aWYodC5nZXRJbmRleCgpIT09bnVsbCl7Y29uc3Qgcz1uPjY1NTM1P25ldyBVaW50MzJBcnJheShpKTpuZXcgVWludDE2QXJyYXkoaSk7ZS5zZXRJbmRleChuZXcgSnQocywxKSl9dGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZD0hMH19X3ZhbGlkYXRlR2VvbWV0cnkodCl7Y29uc3QgZT10aGlzLmdlb21ldHJ5O2lmKCEhdC5nZXRJbmRleCgpIT0hIWUuZ2V0SW5kZXgoKSl0aHJvdyBuZXcgRXJyb3IoJ1RIUkVFLkJhdGNoZWRNZXNoOiBBbGwgZ2VvbWV0cmllcyBtdXN0IGNvbnNpc3RlbnRseSBoYXZlICJpbmRleCIuJyk7Zm9yKGNvbnN0IG4gaW4gZS5hdHRyaWJ1dGVzKXtpZighdC5oYXNBdHRyaWJ1dGUobikpdGhyb3cgbmV3IEVycm9yKGBUSFJFRS5CYXRjaGVkTWVzaDogQWRkZWQgZ2VvbWV0cnkgbWlzc2luZyAiJHtufSIuIEFsbCBnZW9tZXRyaWVzIG11c3QgaGF2ZSBjb25zaXN0ZW50IGF0dHJpYnV0ZXMuYCk7Y29uc3QgaT10LmdldEF0dHJpYnV0ZShuKSxzPWUuZ2V0QXR0cmlidXRlKG4pO2lmKGkuaXRlbVNpemUhPT1zLml0ZW1TaXplfHxpLm5vcm1hbGl6ZWQhPT1zLm5vcm1hbGl6ZWQpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5CYXRjaGVkTWVzaDogQWxsIGF0dHJpYnV0ZXMgbXVzdCBoYXZlIGEgY29uc2lzdGVudCBpdGVtU2l6ZSBhbmQgbm9ybWFsaXplZCB2YWx1ZS4iKX19dmFsaWRhdGVJbnN0YW5jZUlkKHQpe2NvbnN0IGU9dGhpcy5faW5zdGFuY2VJbmZvO2lmKHQ8MHx8dD49ZS5sZW5ndGh8fGVbdF0uYWN0aXZlPT09ITEpdGhyb3cgbmV3IEVycm9yKGBUSFJFRS5CYXRjaGVkTWVzaDogSW52YWxpZCBpbnN0YW5jZUlkICR7dH0uIEluc3RhbmNlIGlzIGVpdGhlciBvdXQgb2YgcmFuZ2Ugb3IgaGFzIGJlZW4gZGVsZXRlZC5gKX12YWxpZGF0ZUdlb21ldHJ5SWQodCl7Y29uc3QgZT10aGlzLl9nZW9tZXRyeUluZm87aWYodDwwfHx0Pj1lLmxlbmd0aHx8ZVt0XS5hY3RpdmU9PT0hMSl0aHJvdyBuZXcgRXJyb3IoYFRIUkVFLkJhdGNoZWRNZXNoOiBJbnZhbGlkIGdlb21ldHJ5SWQgJHt0fS4gR2VvbWV0cnkgaXMgZWl0aGVyIG91dCBvZiByYW5nZSBvciBoYXMgYmVlbiBkZWxldGVkLmApfXNldEN1c3RvbVNvcnQodCl7cmV0dXJuIHRoaXMuY3VzdG9tU29ydD10LHRoaXN9Y29tcHV0ZUJvdW5kaW5nQm94KCl7dGhpcy5ib3VuZGluZ0JveD09PW51bGwmJih0aGlzLmJvdW5kaW5nQm94PW5ldyBsZSk7Y29uc3QgdD10aGlzLmJvdW5kaW5nQm94LGU9dGhpcy5faW5zdGFuY2VJbmZvO3QubWFrZUVtcHR5KCk7Zm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuPGk7bisrKXtpZihlW25dLmFjdGl2ZT09PSExKWNvbnRpbnVlO2NvbnN0IHM9ZVtuXS5nZW9tZXRyeUluZGV4O3RoaXMuZ2V0TWF0cml4QXQobixNbiksdGhpcy5nZXRCb3VuZGluZ0JveEF0KHMsQ2wpLmFwcGx5TWF0cml4NChNbiksdC51bmlvbihDbCl9fWNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpe3RoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgR2UpO2NvbnN0IHQ9dGhpcy5ib3VuZGluZ1NwaGVyZSxlPXRoaXMuX2luc3RhbmNlSW5mbzt0Lm1ha2VFbXB0eSgpO2ZvcihsZXQgbj0wLGk9ZS5sZW5ndGg7bjxpO24rKyl7aWYoZVtuXS5hY3RpdmU9PT0hMSljb250aW51ZTtjb25zdCBzPWVbbl0uZ2VvbWV0cnlJbmRleDt0aGlzLmdldE1hdHJpeEF0KG4sTW4pLHRoaXMuZ2V0Qm91bmRpbmdTcGhlcmVBdChzLEdyKS5hcHBseU1hdHJpeDQoTW4pLHQudW5pb24oR3IpfX1hZGRJbnN0YW5jZSh0KXtpZih0aGlzLl9pbnN0YW5jZUluZm8ubGVuZ3RoPj10aGlzLm1heEluc3RhbmNlQ291bnQmJnRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5CYXRjaGVkTWVzaDogTWF4aW11bSBpdGVtIGNvdW50IHJlYWNoZWQuIik7Y29uc3Qgbj17dmlzaWJsZTohMCxhY3RpdmU6ITAsZ2VvbWV0cnlJbmRleDp0fTtsZXQgaT1udWxsO3RoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLmxlbmd0aD4wPyh0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5zb3J0KExmKSxpPXRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLnNoaWZ0KCksdGhpcy5faW5zdGFuY2VJbmZvW2ldPW4pOihpPXRoaXMuX2luc3RhbmNlSW5mby5sZW5ndGgsdGhpcy5faW5zdGFuY2VJbmZvLnB1c2gobikpO2NvbnN0IHM9dGhpcy5fbWF0cmljZXNUZXh0dXJlO01uLmlkZW50aXR5KCkudG9BcnJheShzLmltYWdlLmRhdGEsaSoxNikscy5uZWVkc1VwZGF0ZT0hMDtjb25zdCBvPXRoaXMuX2NvbG9yc1RleHR1cmU7cmV0dXJuIG8mJihkUy50b0FycmF5KG8uaW1hZ2UuZGF0YSxpKjQpLG8ubmVlZHNVcGRhdGU9ITApLHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkPSEwLGl9YWRkR2VvbWV0cnkodCxlPS0xLG49LTEpe3RoaXMuX2luaXRpYWxpemVHZW9tZXRyeSh0KSx0aGlzLl92YWxpZGF0ZUdlb21ldHJ5KHQpO2NvbnN0IGk9e3ZlcnRleFN0YXJ0Oi0xLHZlcnRleENvdW50Oi0xLHJlc2VydmVkVmVydGV4Q291bnQ6LTEsaW5kZXhTdGFydDotMSxpbmRleENvdW50Oi0xLHJlc2VydmVkSW5kZXhDb3VudDotMSxzdGFydDotMSxjb3VudDotMSxib3VuZGluZ0JveDpudWxsLGJvdW5kaW5nU3BoZXJlOm51bGwsYWN0aXZlOiEwfSxzPXRoaXMuX2dlb21ldHJ5SW5mbztpLnZlcnRleFN0YXJ0PXRoaXMuX25leHRWZXJ0ZXhTdGFydCxpLnJlc2VydmVkVmVydGV4Q291bnQ9ZT09PS0xP3QuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLmNvdW50OmU7Y29uc3Qgbz10LmdldEluZGV4KCk7aWYobyE9PW51bGwmJihpLmluZGV4U3RhcnQ9dGhpcy5fbmV4dEluZGV4U3RhcnQsaS5yZXNlcnZlZEluZGV4Q291bnQ9bj09PS0xP28uY291bnQ6biksaS5pbmRleFN0YXJ0IT09LTEmJmkuaW5kZXhTdGFydCtpLnJlc2VydmVkSW5kZXhDb3VudD50aGlzLl9tYXhJbmRleENvdW50fHxpLnZlcnRleFN0YXJ0K2kucmVzZXJ2ZWRWZXJ0ZXhDb3VudD50aGlzLl9tYXhWZXJ0ZXhDb3VudCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkJhdGNoZWRNZXNoOiBSZXNlcnZlZCBzcGFjZSByZXF1ZXN0IGV4Y2VlZHMgdGhlIG1heGltdW0gYnVmZmVyIHNpemUuIik7bGV0IGM7cmV0dXJuIHRoaXMuX2F2YWlsYWJsZUdlb21ldHJ5SWRzLmxlbmd0aD4wPyh0aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcy5zb3J0KExmKSxjPXRoaXMuX2F2YWlsYWJsZUdlb21ldHJ5SWRzLnNoaWZ0KCksc1tjXT1pKTooYz10aGlzLl9nZW9tZXRyeUNvdW50LHRoaXMuX2dlb21ldHJ5Q291bnQrKyxzLnB1c2goaSkpLHRoaXMuc2V0R2VvbWV0cnlBdChjLHQpLHRoaXMuX25leHRJbmRleFN0YXJ0PWkuaW5kZXhTdGFydCtpLnJlc2VydmVkSW5kZXhDb3VudCx0aGlzLl9uZXh0VmVydGV4U3RhcnQ9aS52ZXJ0ZXhTdGFydCtpLnJlc2VydmVkVmVydGV4Q291bnQsY31zZXRHZW9tZXRyeUF0KHQsZSl7aWYodD49dGhpcy5fZ2VvbWV0cnlDb3VudCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLkJhdGNoZWRNZXNoOiBNYXhpbXVtIGdlb21ldHJ5IGNvdW50IHJlYWNoZWQuIik7dGhpcy5fdmFsaWRhdGVHZW9tZXRyeShlKTtjb25zdCBuPXRoaXMuZ2VvbWV0cnksaT1uLmdldEluZGV4KCkhPT1udWxsLHM9bi5nZXRJbmRleCgpLG89ZS5nZXRJbmRleCgpLGE9dGhpcy5fZ2VvbWV0cnlJbmZvW3RdO2lmKGkmJm8uY291bnQ+YS5yZXNlcnZlZEluZGV4Q291bnR8fGUuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudD5hLnJlc2VydmVkVmVydGV4Q291bnQpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5CYXRjaGVkTWVzaDogUmVzZXJ2ZWQgc3BhY2Ugbm90IGxhcmdlIGVub3VnaCBmb3IgcHJvdmlkZWQgZ2VvbWV0cnkuIik7Y29uc3QgYz1hLnZlcnRleFN0YXJ0LGw9YS5yZXNlcnZlZFZlcnRleENvdW50O2EudmVydGV4Q291bnQ9ZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikuY291bnQ7Zm9yKGNvbnN0IHUgaW4gbi5hdHRyaWJ1dGVzKXtjb25zdCBoPWUuZ2V0QXR0cmlidXRlKHUpLGY9bi5nZXRBdHRyaWJ1dGUodSk7Z1MoaCxmLGMpO2NvbnN0IGQ9aC5pdGVtU2l6ZTtmb3IobGV0IHA9aC5jb3VudCx4PWw7cDx4O3ArKyl7Y29uc3QgZz1jK3A7Zm9yKGxldCBtPTA7bTxkO20rKylmLnNldENvbXBvbmVudChnLG0sMCl9Zi5uZWVkc1VwZGF0ZT0hMCxmLmFkZFVwZGF0ZVJhbmdlKGMqZCxsKmQpfWlmKGkpe2NvbnN0IHU9YS5pbmRleFN0YXJ0LGg9YS5yZXNlcnZlZEluZGV4Q291bnQ7YS5pbmRleENvdW50PWUuZ2V0SW5kZXgoKS5jb3VudDtmb3IobGV0IGY9MDtmPG8uY291bnQ7ZisrKXMuc2V0WCh1K2YsYytvLmdldFgoZikpO2ZvcihsZXQgZj1vLmNvdW50LGQ9aDtmPGQ7ZisrKXMuc2V0WCh1K2YsYyk7cy5uZWVkc1VwZGF0ZT0hMCxzLmFkZFVwZGF0ZVJhbmdlKHUsYS5yZXNlcnZlZEluZGV4Q291bnQpfXJldHVybiBhLnN0YXJ0PWk/YS5pbmRleFN0YXJ0OmEudmVydGV4U3RhcnQsYS5jb3VudD1pP2EuaW5kZXhDb3VudDphLnZlcnRleENvdW50LGEuYm91bmRpbmdCb3g9bnVsbCxlLmJvdW5kaW5nQm94IT09bnVsbCYmKGEuYm91bmRpbmdCb3g9ZS5ib3VuZGluZ0JveC5jbG9uZSgpKSxhLmJvdW5kaW5nU3BoZXJlPW51bGwsZS5ib3VuZGluZ1NwaGVyZSE9PW51bGwmJihhLmJvdW5kaW5nU3BoZXJlPWUuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSksdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQ9ITAsdH1kZWxldGVHZW9tZXRyeSh0KXtjb25zdCBlPXRoaXMuX2dlb21ldHJ5SW5mbztpZih0Pj1lLmxlbmd0aHx8ZVt0XS5hY3RpdmU9PT0hMSlyZXR1cm4gdGhpcztjb25zdCBuPXRoaXMuX2luc3RhbmNlSW5mbztmb3IobGV0IGk9MCxzPW4ubGVuZ3RoO2k8cztpKyspbltpXS5hY3RpdmUmJm5baV0uZ2VvbWV0cnlJbmRleD09PXQmJnRoaXMuZGVsZXRlSW5zdGFuY2UoaSk7cmV0dXJuIGVbdF0uYWN0aXZlPSExLHRoaXMuX2F2YWlsYWJsZUdlb21ldHJ5SWRzLnB1c2godCksdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQ9ITAsdGhpc31kZWxldGVJbnN0YW5jZSh0KXtyZXR1cm4gdGhpcy52YWxpZGF0ZUluc3RhbmNlSWQodCksdGhpcy5faW5zdGFuY2VJbmZvW3RdLmFjdGl2ZT0hMSx0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5wdXNoKHQpLHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkPSEwLHRoaXN9b3B0aW1pemUoKXtsZXQgdD0wLGU9MDtjb25zdCBuPXRoaXMuX2dlb21ldHJ5SW5mbyxpPW4ubWFwKChvLGEpPT5hKS5zb3J0KChvLGEpPT5uW29dLnZlcnRleFN0YXJ0LW5bYV0udmVydGV4U3RhcnQpLHM9dGhpcy5nZW9tZXRyeTtmb3IobGV0IG89MCxhPW4ubGVuZ3RoO288YTtvKyspe2NvbnN0IGM9aVtvXSxsPW5bY107aWYobC5hY3RpdmUhPT0hMSl7aWYocy5pbmRleCE9PW51bGwpe2lmKGwuaW5kZXhTdGFydCE9PWUpe2NvbnN0e2luZGV4U3RhcnQ6dSx2ZXJ0ZXhTdGFydDpoLHJlc2VydmVkSW5kZXhDb3VudDpmfT1sLGQ9cy5pbmRleCxwPWQuYXJyYXkseD10LWg7Zm9yKGxldCBnPXU7Zzx1K2Y7ZysrKXBbZ109cFtnXSt4O2QuYXJyYXkuY29weVdpdGhpbihlLHUsdStmKSxkLmFkZFVwZGF0ZVJhbmdlKGUsZiksbC5pbmRleFN0YXJ0PWV9ZSs9bC5yZXNlcnZlZEluZGV4Q291bnR9aWYobC52ZXJ0ZXhTdGFydCE9PXQpe2NvbnN0e3ZlcnRleFN0YXJ0OnUscmVzZXJ2ZWRWZXJ0ZXhDb3VudDpofT1sLGY9cy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBkIGluIGYpe2NvbnN0IHA9ZltkXSx7YXJyYXk6eCxpdGVtU2l6ZTpnfT1wO3guY29weVdpdGhpbih0KmcsdSpnLCh1K2gpKmcpLHAuYWRkVXBkYXRlUmFuZ2UodCpnLGgqZyl9bC52ZXJ0ZXhTdGFydD10fXQrPWwucmVzZXJ2ZWRWZXJ0ZXhDb3VudCxsLnN0YXJ0PXMuaW5kZXg/bC5pbmRleFN0YXJ0OmwudmVydGV4U3RhcnQsdGhpcy5fbmV4dEluZGV4U3RhcnQ9cy5pbmRleD9sLmluZGV4U3RhcnQrbC5yZXNlcnZlZEluZGV4Q291bnQ6MCx0aGlzLl9uZXh0VmVydGV4U3RhcnQ9bC52ZXJ0ZXhTdGFydCtsLnJlc2VydmVkVmVydGV4Q291bnR9fXJldHVybiB0aGlzfWdldEJvdW5kaW5nQm94QXQodCxlKXtpZih0Pj10aGlzLl9nZW9tZXRyeUNvdW50KXJldHVybiBudWxsO2NvbnN0IG49dGhpcy5nZW9tZXRyeSxpPXRoaXMuX2dlb21ldHJ5SW5mb1t0XTtpZihpLmJvdW5kaW5nQm94PT09bnVsbCl7Y29uc3Qgcz1uZXcgbGUsbz1uLmluZGV4LGE9bi5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgYz1pLnN0YXJ0LGw9aS5zdGFydCtpLmNvdW50O2M8bDtjKyspe2xldCB1PWM7byYmKHU9by5nZXRYKHUpKSxzLmV4cGFuZEJ5UG9pbnQob2EuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLHUpKX1pLmJvdW5kaW5nQm94PXN9cmV0dXJuIGUuY29weShpLmJvdW5kaW5nQm94KSxlfWdldEJvdW5kaW5nU3BoZXJlQXQodCxlKXtpZih0Pj10aGlzLl9nZW9tZXRyeUNvdW50KXJldHVybiBudWxsO2NvbnN0IG49dGhpcy5nZW9tZXRyeSxpPXRoaXMuX2dlb21ldHJ5SW5mb1t0XTtpZihpLmJvdW5kaW5nU3BoZXJlPT09bnVsbCl7Y29uc3Qgcz1uZXcgR2U7dGhpcy5nZXRCb3VuZGluZ0JveEF0KHQsQ2wpLENsLmdldENlbnRlcihzLmNlbnRlcik7Y29uc3Qgbz1uLmluZGV4LGE9bi5hdHRyaWJ1dGVzLnBvc2l0aW9uO2xldCBjPTA7Zm9yKGxldCBsPWkuc3RhcnQsdT1pLnN0YXJ0K2kuY291bnQ7bDx1O2wrKyl7bGV0IGg9bDtvJiYoaD1vLmdldFgoaCkpLG9hLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxoKSxjPU1hdGgubWF4KGMscy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQob2EpKX1zLnJhZGl1cz1NYXRoLnNxcnQoYyksaS5ib3VuZGluZ1NwaGVyZT1zfXJldHVybiBlLmNvcHkoaS5ib3VuZGluZ1NwaGVyZSksZX1zZXRNYXRyaXhBdCh0LGUpe3RoaXMudmFsaWRhdGVJbnN0YW5jZUlkKHQpO2NvbnN0IG49dGhpcy5fbWF0cmljZXNUZXh0dXJlLGk9dGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGE7cmV0dXJuIGUudG9BcnJheShpLHQqMTYpLG4ubmVlZHNVcGRhdGU9ITAsdGhpc31nZXRNYXRyaXhBdCh0LGUpe3JldHVybiB0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCh0KSxlLmZyb21BcnJheSh0aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YSx0KjE2KX1zZXRDb2xvckF0KHQsZSl7cmV0dXJuIHRoaXMudmFsaWRhdGVJbnN0YW5jZUlkKHQpLHRoaXMuX2NvbG9yc1RleHR1cmU9PT1udWxsJiZ0aGlzLl9pbml0Q29sb3JzVGV4dHVyZSgpLGUudG9BcnJheSh0aGlzLl9jb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEsdCo0KSx0aGlzLl9jb2xvcnNUZXh0dXJlLm5lZWRzVXBkYXRlPSEwLHRoaXN9Z2V0Q29sb3JBdCh0LGUpe3JldHVybiB0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCh0KSxlLmZyb21BcnJheSh0aGlzLl9jb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEsdCo0KX1zZXRWaXNpYmxlQXQodCxlKXtyZXR1cm4gdGhpcy52YWxpZGF0ZUluc3RhbmNlSWQodCksdGhpcy5faW5zdGFuY2VJbmZvW3RdLnZpc2libGU9PT1lP3RoaXM6KHRoaXMuX2luc3RhbmNlSW5mb1t0XS52aXNpYmxlPWUsdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQ9ITAsdGhpcyl9Z2V0VmlzaWJsZUF0KHQpe3JldHVybiB0aGlzLnZhbGlkYXRlSW5zdGFuY2VJZCh0KSx0aGlzLl9pbnN0YW5jZUluZm9bdF0udmlzaWJsZX1zZXRHZW9tZXRyeUlkQXQodCxlKXtyZXR1cm4gdGhpcy52YWxpZGF0ZUluc3RhbmNlSWQodCksdGhpcy52YWxpZGF0ZUdlb21ldHJ5SWQoZSksdGhpcy5faW5zdGFuY2VJbmZvW3RdLmdlb21ldHJ5SW5kZXg9ZSx0aGlzfWdldEdlb21ldHJ5SWRBdCh0KXtyZXR1cm4gdGhpcy52YWxpZGF0ZUluc3RhbmNlSWQodCksdGhpcy5faW5zdGFuY2VJbmZvW3RdLmdlb21ldHJ5SW5kZXh9Z2V0R2VvbWV0cnlSYW5nZUF0KHQsZT17fSl7dGhpcy52YWxpZGF0ZUdlb21ldHJ5SWQodCk7Y29uc3Qgbj10aGlzLl9nZW9tZXRyeUluZm9bdF07cmV0dXJuIGUudmVydGV4U3RhcnQ9bi52ZXJ0ZXhTdGFydCxlLnZlcnRleENvdW50PW4udmVydGV4Q291bnQsZS5yZXNlcnZlZFZlcnRleENvdW50PW4ucmVzZXJ2ZWRWZXJ0ZXhDb3VudCxlLmluZGV4U3RhcnQ9bi5pbmRleFN0YXJ0LGUuaW5kZXhDb3VudD1uLmluZGV4Q291bnQsZS5yZXNlcnZlZEluZGV4Q291bnQ9bi5yZXNlcnZlZEluZGV4Q291bnQsZS5zdGFydD1uLnN0YXJ0LGUuY291bnQ9bi5jb3VudCxlfXNldEluc3RhbmNlQ291bnQodCl7Y29uc3QgZT10aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcyxuPXRoaXMuX2luc3RhbmNlSW5mbztmb3IoZS5zb3J0KExmKTtlW2UubGVuZ3RoLTFdPT09bi5sZW5ndGg7KW4ucG9wKCksZS5wb3AoKTtpZih0PG4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgQmF0Y2hlZE1lc2g6IEluc3RhbmNlIGlkcyBvdXRzaWRlIHRoZSByYW5nZSAke3R9IGFyZSBiZWluZyB1c2VkLiBDYW5ub3Qgc2hyaW5rIGluc3RhbmNlIGNvdW50LmApO2NvbnN0IGk9bmV3IEludDMyQXJyYXkodCkscz1uZXcgSW50MzJBcnJheSh0KTtIcih0aGlzLl9tdWx0aURyYXdDb3VudHMsaSksSHIodGhpcy5fbXVsdGlEcmF3U3RhcnRzLHMpLHRoaXMuX211bHRpRHJhd0NvdW50cz1pLHRoaXMuX211bHRpRHJhd1N0YXJ0cz1zLHRoaXMuX21heEluc3RhbmNlQ291bnQ9dDtjb25zdCBvPXRoaXMuX2luZGlyZWN0VGV4dHVyZSxhPXRoaXMuX21hdHJpY2VzVGV4dHVyZSxjPXRoaXMuX2NvbG9yc1RleHR1cmU7by5kaXNwb3NlKCksdGhpcy5faW5pdEluZGlyZWN0VGV4dHVyZSgpLEhyKG8uaW1hZ2UuZGF0YSx0aGlzLl9pbmRpcmVjdFRleHR1cmUuaW1hZ2UuZGF0YSksYS5kaXNwb3NlKCksdGhpcy5faW5pdE1hdHJpY2VzVGV4dHVyZSgpLEhyKGEuaW1hZ2UuZGF0YSx0aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YSksYyYmKGMuZGlzcG9zZSgpLHRoaXMuX2luaXRDb2xvcnNUZXh0dXJlKCksSHIoYy5pbWFnZS5kYXRhLHRoaXMuX2NvbG9yc1RleHR1cmUuaW1hZ2UuZGF0YSkpfXNldEdlb21ldHJ5U2l6ZSh0LGUpe2NvbnN0IG49Wy4uLnRoaXMuX2dlb21ldHJ5SW5mb10uZmlsdGVyKGE9PmEuYWN0aXZlKTtpZihNYXRoLm1heCguLi5uLm1hcChhPT5hLnZlcnRleFN0YXJ0K2EucmVzZXJ2ZWRWZXJ0ZXhDb3VudCkpPnQpdGhyb3cgbmV3IEVycm9yKGBCYXRjaGVkTWVzaDogR2VvbWV0cnkgdmVydGV4IHZhbHVlcyBhcmUgYmVpbmcgdXNlZCBvdXRzaWRlIHRoZSByYW5nZSAke2V9LiBDYW5ub3Qgc2hyaW5rIGZ1cnRoZXIuYCk7aWYodGhpcy5nZW9tZXRyeS5pbmRleCYmTWF0aC5tYXgoLi4ubi5tYXAoYz0+Yy5pbmRleFN0YXJ0K2MucmVzZXJ2ZWRJbmRleENvdW50KSk+ZSl0aHJvdyBuZXcgRXJyb3IoYEJhdGNoZWRNZXNoOiBHZW9tZXRyeSBpbmRleCB2YWx1ZXMgYXJlIGJlaW5nIHVzZWQgb3V0c2lkZSB0aGUgcmFuZ2UgJHtlfS4gQ2Fubm90IHNocmluayBmdXJ0aGVyLmApO2NvbnN0IHM9dGhpcy5nZW9tZXRyeTtzLmRpc3Bvc2UoKSx0aGlzLl9tYXhWZXJ0ZXhDb3VudD10LHRoaXMuX21heEluZGV4Q291bnQ9ZSx0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkJiYodGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZD0hMSx0aGlzLmdlb21ldHJ5PW5ldyBOdCx0aGlzLl9pbml0aWFsaXplR2VvbWV0cnkocykpO2NvbnN0IG89dGhpcy5nZW9tZXRyeTtzLmluZGV4JiZIcihzLmluZGV4LmFycmF5LG8uaW5kZXguYXJyYXkpO2Zvcihjb25zdCBhIGluIHMuYXR0cmlidXRlcylIcihzLmF0dHJpYnV0ZXNbYV0uYXJyYXksby5hdHRyaWJ1dGVzW2FdLmFycmF5KX1yYXljYXN0KHQsZSl7Y29uc3Qgbj10aGlzLl9pbnN0YW5jZUluZm8saT10aGlzLl9nZW9tZXRyeUluZm8scz10aGlzLm1hdHJpeFdvcmxkLG89dGhpcy5nZW9tZXRyeTtqZS5tYXRlcmlhbD10aGlzLm1hdGVyaWFsLGplLmdlb21ldHJ5LmluZGV4PW8uaW5kZXgsamUuZ2VvbWV0cnkuYXR0cmlidXRlcz1vLmF0dHJpYnV0ZXMsamUuZ2VvbWV0cnkuYm91bmRpbmdCb3g9PT1udWxsJiYoamUuZ2VvbWV0cnkuYm91bmRpbmdCb3g9bmV3IGxlKSxqZS5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZT09PW51bGwmJihqZS5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZT1uZXcgR2UpO2ZvcihsZXQgYT0wLGM9bi5sZW5ndGg7YTxjO2ErKyl7aWYoIW5bYV0udmlzaWJsZXx8IW5bYV0uYWN0aXZlKWNvbnRpbnVlO2NvbnN0IGw9blthXS5nZW9tZXRyeUluZGV4LHU9aVtsXTtqZS5nZW9tZXRyeS5zZXREcmF3UmFuZ2UodS5zdGFydCx1LmNvdW50KSx0aGlzLmdldE1hdHJpeEF0KGEsamUubWF0cml4V29ybGQpLnByZW11bHRpcGx5KHMpLHRoaXMuZ2V0Qm91bmRpbmdCb3hBdChsLGplLmdlb21ldHJ5LmJvdW5kaW5nQm94KSx0aGlzLmdldEJvdW5kaW5nU3BoZXJlQXQobCxqZS5nZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSksamUucmF5Y2FzdCh0LFJsKTtmb3IobGV0IGg9MCxmPVJsLmxlbmd0aDtoPGY7aCsrKXtjb25zdCBkPVJsW2hdO2Qub2JqZWN0PXRoaXMsZC5iYXRjaElkPWEsZS5wdXNoKGQpfVJsLmxlbmd0aD0wfWplLm1hdGVyaWFsPW51bGwsamUuZ2VvbWV0cnkuaW5kZXg9bnVsbCxqZS5nZW9tZXRyeS5hdHRyaWJ1dGVzPXt9LGplLmdlb21ldHJ5LnNldERyYXdSYW5nZSgwLDEvMCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnkuY2xvbmUoKSx0aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQ9dC5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkLHRoaXMuc29ydE9iamVjdHM9dC5zb3J0T2JqZWN0cyx0aGlzLmJvdW5kaW5nQm94PXQuYm91bmRpbmdCb3ghPT1udWxsP3QuYm91bmRpbmdCb3guY2xvbmUoKTpudWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9dC5ib3VuZGluZ1NwaGVyZSE9PW51bGw/dC5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpOm51bGwsdGhpcy5fZ2VvbWV0cnlJbmZvPXQuX2dlb21ldHJ5SW5mby5tYXAoZT0+Z2koV2Uoe30sZSkse2JvdW5kaW5nQm94OmUuYm91bmRpbmdCb3ghPT1udWxsP2UuYm91bmRpbmdCb3guY2xvbmUoKTpudWxsLGJvdW5kaW5nU3BoZXJlOmUuYm91bmRpbmdTcGhlcmUhPT1udWxsP2UuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTpudWxsfSkpLHRoaXMuX2luc3RhbmNlSW5mbz10Ll9pbnN0YW5jZUluZm8ubWFwKGU9PldlKHt9LGUpKSx0aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcz10Ll9hdmFpbGFibGVJbnN0YW5jZUlkcy5zbGljZSgpLHRoaXMuX2F2YWlsYWJsZUdlb21ldHJ5SWRzPXQuX2F2YWlsYWJsZUdlb21ldHJ5SWRzLnNsaWNlKCksdGhpcy5fbmV4dEluZGV4U3RhcnQ9dC5fbmV4dEluZGV4U3RhcnQsdGhpcy5fbmV4dFZlcnRleFN0YXJ0PXQuX25leHRWZXJ0ZXhTdGFydCx0aGlzLl9nZW9tZXRyeUNvdW50PXQuX2dlb21ldHJ5Q291bnQsdGhpcy5fbWF4SW5zdGFuY2VDb3VudD10Ll9tYXhJbnN0YW5jZUNvdW50LHRoaXMuX21heFZlcnRleENvdW50PXQuX21heFZlcnRleENvdW50LHRoaXMuX21heEluZGV4Q291bnQ9dC5fbWF4SW5kZXhDb3VudCx0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkPXQuX2dlb21ldHJ5SW5pdGlhbGl6ZWQsdGhpcy5fbXVsdGlEcmF3Q291bnRzPXQuX211bHRpRHJhd0NvdW50cy5zbGljZSgpLHRoaXMuX211bHRpRHJhd1N0YXJ0cz10Ll9tdWx0aURyYXdTdGFydHMuc2xpY2UoKSx0aGlzLl9pbmRpcmVjdFRleHR1cmU9dC5faW5kaXJlY3RUZXh0dXJlLmNsb25lKCksdGhpcy5faW5kaXJlY3RUZXh0dXJlLmltYWdlLmRhdGE9dGhpcy5faW5kaXJlY3RUZXh0dXJlLmltYWdlLmRhdGEuc2xpY2UoKSx0aGlzLl9tYXRyaWNlc1RleHR1cmU9dC5fbWF0cmljZXNUZXh0dXJlLmNsb25lKCksdGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGE9dGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGEuc2xpY2UoKSx0aGlzLl9jb2xvcnNUZXh0dXJlIT09bnVsbCYmKHRoaXMuX2NvbG9yc1RleHR1cmU9dC5fY29sb3JzVGV4dHVyZS5jbG9uZSgpLHRoaXMuX2NvbG9yc1RleHR1cmUuaW1hZ2UuZGF0YT10aGlzLl9jb2xvcnNUZXh0dXJlLmltYWdlLmRhdGEuc2xpY2UoKSksdGhpc31kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5fbWF0cmljZXNUZXh0dXJlLmRpc3Bvc2UoKSx0aGlzLl9tYXRyaWNlc1RleHR1cmU9bnVsbCx0aGlzLl9pbmRpcmVjdFRleHR1cmUuZGlzcG9zZSgpLHRoaXMuX2luZGlyZWN0VGV4dHVyZT1udWxsLHRoaXMuX2NvbG9yc1RleHR1cmUhPT1udWxsJiYodGhpcy5fY29sb3JzVGV4dHVyZS5kaXNwb3NlKCksdGhpcy5fY29sb3JzVGV4dHVyZT1udWxsKX1vbkJlZm9yZVJlbmRlcih0LGUsbixpLHMpe2lmKCF0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCYmIXRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCYmIXRoaXMuc29ydE9iamVjdHMpcmV0dXJuO2NvbnN0IG89aS5nZXRJbmRleCgpLGE9bz09PW51bGw/MTpvLmFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULGM9dGhpcy5faW5zdGFuY2VJbmZvLGw9dGhpcy5fbXVsdGlEcmF3U3RhcnRzLHU9dGhpcy5fbXVsdGlEcmF3Q291bnRzLGg9dGhpcy5fZ2VvbWV0cnlJbmZvLGY9dGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkLGQ9dGhpcy5faW5kaXJlY3RUZXh0dXJlLHA9ZC5pbWFnZS5kYXRhLHg9bi5pc0FycmF5Q2FtZXJhP3BTOk5nO2YmJiFuLmlzQXJyYXlDYW1lcmEmJihNbi5tdWx0aXBseU1hdHJpY2VzKG4ucHJvamVjdGlvbk1hdHJpeCxuLm1hdHJpeFdvcmxkSW52ZXJzZSkubXVsdGlwbHkodGhpcy5tYXRyaXhXb3JsZCksTmcuc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoTW4sdC5jb29yZGluYXRlU3lzdGVtKSk7bGV0IGc9MDtpZih0aGlzLnNvcnRPYmplY3RzKXtNbi5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpLG9hLnNldEZyb21NYXRyaXhQb3NpdGlvbihuLm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoTW4pLEZnLnNldCgwLDAsLTEpLnRyYW5zZm9ybURpcmVjdGlvbihuLm1hdHJpeFdvcmxkKS50cmFuc2Zvcm1EaXJlY3Rpb24oTW4pO2ZvcihsZXQgeT0wLF89Yy5sZW5ndGg7eTxfO3krKylpZihjW3ldLnZpc2libGUmJmNbeV0uYWN0aXZlKXtjb25zdCBTPWNbeV0uZ2VvbWV0cnlJbmRleDt0aGlzLmdldE1hdHJpeEF0KHksTW4pLHRoaXMuZ2V0Qm91bmRpbmdTcGhlcmVBdChTLEdyKS5hcHBseU1hdHJpeDQoTW4pO2xldCB3PSExO2lmKGYmJih3PSF4LmludGVyc2VjdHNTcGhlcmUoR3IsbikpLCF3KXtjb25zdCBBPWhbU10sVD1tUy5zdWJWZWN0b3JzKEdyLmNlbnRlcixvYSkuZG90KEZnKTtEZi5wdXNoKEEuc3RhcnQsQS5jb3VudCxULHkpfX1jb25zdCBtPURmLmxpc3Qsdj10aGlzLmN1c3RvbVNvcnQ7dj09PW51bGw/bS5zb3J0KHMudHJhbnNwYXJlbnQ/aFM6dVMpOnYuY2FsbCh0aGlzLG0sbik7Zm9yKGxldCB5PTAsXz1tLmxlbmd0aDt5PF87eSsrKXtjb25zdCBTPW1beV07bFtnXT1TLnN0YXJ0KmEsdVtnXT1TLmNvdW50LHBbZ109Uy5pbmRleCxnKyt9RGYucmVzZXQoKX1lbHNlIGZvcihsZXQgbT0wLHY9Yy5sZW5ndGg7bTx2O20rKylpZihjW21dLnZpc2libGUmJmNbbV0uYWN0aXZlKXtjb25zdCB5PWNbbV0uZ2VvbWV0cnlJbmRleDtsZXQgXz0hMTtpZihmJiYodGhpcy5nZXRNYXRyaXhBdChtLE1uKSx0aGlzLmdldEJvdW5kaW5nU3BoZXJlQXQoeSxHcikuYXBwbHlNYXRyaXg0KE1uKSxfPSF4LmludGVyc2VjdHNTcGhlcmUoR3IsbikpLCFfKXtjb25zdCBTPWhbeV07bFtnXT1TLnN0YXJ0KmEsdVtnXT1TLmNvdW50LHBbZ109bSxnKyt9fWQubmVlZHNVcGRhdGU9ITAsdGhpcy5fbXVsdGlEcmF3Q291bnQ9Zyx0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZD0hMX1vbkJlZm9yZVNoYWRvdyh0LGUsbixpLHMsbyl7dGhpcy5vbkJlZm9yZVJlbmRlcih0LG51bGwsaSxzLG8pfX1jbGFzcyBhbiBleHRlbmRzIEtle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc0xpbmVCYXNpY01hdGVyaWFsPSEwLHRoaXMudHlwZT0iTGluZUJhc2ljTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHl0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMubGluZXdpZHRoPTEsdGhpcy5saW5lY2FwPSJyb3VuZCIsdGhpcy5saW5lam9pbj0icm91bmQiLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMubGluZXdpZHRoPXQubGluZXdpZHRoLHRoaXMubGluZWNhcD10LmxpbmVjYXAsdGhpcy5saW5lam9pbj10LmxpbmVqb2luLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNvbnN0IElsPW5ldyBJLFBsPW5ldyBJLE9nPW5ldyBDdCxhYT1uZXcgaHIsTGw9bmV3IEdlLFVmPW5ldyBJLHpnPW5ldyBJO2NsYXNzIGdyIGV4dGVuZHMgc2V7Y29uc3RydWN0b3IodD1uZXcgTnQsZT1uZXcgYW4pe3N1cGVyKCksdGhpcy5pc0xpbmU9ITAsdGhpcy50eXBlPSJMaW5lIix0aGlzLmdlb21ldHJ5PXQsdGhpcy5tYXRlcmlhbD1lLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXZvaWQgMCx0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz12b2lkIDAsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLm1hdGVyaWFsPUFycmF5LmlzQXJyYXkodC5tYXRlcmlhbCk/dC5tYXRlcmlhbC5zbGljZSgpOnQubWF0ZXJpYWwsdGhpcy5nZW9tZXRyeT10Lmdlb21ldHJ5LHRoaXN9Y29tcHV0ZUxpbmVEaXN0YW5jZXMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7aWYodC5pbmRleD09PW51bGwpe2NvbnN0IGU9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLG49WzBdO2ZvcihsZXQgaT0xLHM9ZS5jb3VudDtpPHM7aSsrKUlsLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxpLTEpLFBsLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxpKSxuW2ldPW5baS0xXSxuW2ldKz1JbC5kaXN0YW5jZVRvKFBsKTt0LnNldEF0dHJpYnV0ZSgibGluZURpc3RhbmNlIixuZXcgdnQobiwxKSl9ZWxzZSBjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTogQ29tcHV0YXRpb24gb25seSBwb3NzaWJsZSB3aXRoIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5LiIpO3JldHVybiB0aGlzfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnksaT10aGlzLm1hdHJpeFdvcmxkLHM9dC5wYXJhbXMuTGluZS50aHJlc2hvbGQsbz1uLmRyYXdSYW5nZTtpZihuLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmbi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxMbC5jb3B5KG4uYm91bmRpbmdTcGhlcmUpLExsLmFwcGx5TWF0cml4NChpKSxMbC5yYWRpdXMrPXMsdC5yYXkuaW50ZXJzZWN0c1NwaGVyZShMbCk9PT0hMSlyZXR1cm47T2cuY29weShpKS5pbnZlcnQoKSxhYS5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoT2cpO2NvbnN0IGE9cy8oKHRoaXMuc2NhbGUueCt0aGlzLnNjYWxlLnkrdGhpcy5zY2FsZS56KS8zKSxjPWEqYSxsPXRoaXMuaXNMaW5lU2VnbWVudHM/MjoxLHU9bi5pbmRleCxmPW4uYXR0cmlidXRlcy5wb3NpdGlvbjtpZih1IT09bnVsbCl7Y29uc3QgZD1NYXRoLm1heCgwLG8uc3RhcnQpLHA9TWF0aC5taW4odS5jb3VudCxvLnN0YXJ0K28uY291bnQpO2ZvcihsZXQgeD1kLGc9cC0xO3g8Zzt4Kz1sKXtjb25zdCBtPXUuZ2V0WCh4KSx2PXUuZ2V0WCh4KzEpLHk9RGwodGhpcyx0LGFhLGMsbSx2LHgpO3kmJmUucHVzaCh5KX1pZih0aGlzLmlzTGluZUxvb3Ape2NvbnN0IHg9dS5nZXRYKHAtMSksZz11LmdldFgoZCksbT1EbCh0aGlzLHQsYWEsYyx4LGcscC0xKTttJiZlLnB1c2gobSl9fWVsc2V7Y29uc3QgZD1NYXRoLm1heCgwLG8uc3RhcnQpLHA9TWF0aC5taW4oZi5jb3VudCxvLnN0YXJ0K28uY291bnQpO2ZvcihsZXQgeD1kLGc9cC0xO3g8Zzt4Kz1sKXtjb25zdCBtPURsKHRoaXMsdCxhYSxjLHgseCsxLHgpO20mJmUucHVzaChtKX1pZih0aGlzLmlzTGluZUxvb3Ape2NvbnN0IHg9RGwodGhpcyx0LGFhLGMscC0xLGQscC0xKTt4JiZlLnB1c2goeCl9fX11cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCBlPXRoaXMuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXMoZSk7aWYobi5sZW5ndGg+MCl7Y29uc3QgaT1lW25bMF1dO2lmKGkhPT12b2lkIDApe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgcz0wLG89aS5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT1pW3NdLm5hbWV8fFN0cmluZyhzKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2FdPXN9fX19fWZ1bmN0aW9uIERsKHIsdCxlLG4saSxzLG8pe2NvbnN0IGE9ci5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKElsLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxpKSxQbC5mcm9tQnVmZmVyQXR0cmlidXRlKGEscyksZS5kaXN0YW5jZVNxVG9TZWdtZW50KElsLFBsLFVmLHpnKT5uKXJldHVybjtVZi5hcHBseU1hdHJpeDQoci5tYXRyaXhXb3JsZCk7Y29uc3QgbD10LnJheS5vcmlnaW4uZGlzdGFuY2VUbyhVZik7aWYoIShsPHQubmVhcnx8bD50LmZhcikpcmV0dXJue2Rpc3RhbmNlOmwscG9pbnQ6emcuY2xvbmUoKS5hcHBseU1hdHJpeDQoci5tYXRyaXhXb3JsZCksaW5kZXg6byxmYWNlOm51bGwsZmFjZUluZGV4Om51bGwsYmFyeWNvb3JkOm51bGwsb2JqZWN0OnJ9fWNvbnN0IGtnPW5ldyBJLFZnPW5ldyBJO2NsYXNzIHdpIGV4dGVuZHMgZ3J7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMuaXNMaW5lU2VnbWVudHM9ITAsdGhpcy50eXBlPSJMaW5lU2VnbWVudHMifWNvbXB1dGVMaW5lRGlzdGFuY2VzKCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5O2lmKHQuaW5kZXg9PT1udWxsKXtjb25zdCBlPXQuYXR0cmlidXRlcy5wb3NpdGlvbixuPVtdO2ZvcihsZXQgaT0wLHM9ZS5jb3VudDtpPHM7aSs9MilrZy5mcm9tQnVmZmVyQXR0cmlidXRlKGUsaSksVmcuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGkrMSksbltpXT1pPT09MD8wOm5baS0xXSxuW2krMV09bltpXStrZy5kaXN0YW5jZVRvKFZnKTt0LnNldEF0dHJpYnV0ZSgibGluZURpc3RhbmNlIixuZXcgdnQobiwxKSl9ZWxzZSBjb25zb2xlLndhcm4oIlRIUkVFLkxpbmVTZWdtZW50cy5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7cmV0dXJuIHRoaXN9fWNsYXNzIEdnIGV4dGVuZHMgZ3J7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMuaXNMaW5lTG9vcD0hMCx0aGlzLnR5cGU9IkxpbmVMb29wIn19Y2xhc3MgTmYgZXh0ZW5kcyBLZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNQb2ludHNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IlBvaW50c01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5dCgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5zaXplPTEsdGhpcy5zaXplQXR0ZW51YXRpb249ITAsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuc2l6ZT10LnNpemUsdGhpcy5zaXplQXR0ZW51YXRpb249dC5zaXplQXR0ZW51YXRpb24sdGhpcy5mb2c9dC5mb2csdGhpc319Y29uc3QgSGc9bmV3IEN0LEZmPW5ldyBocixVbD1uZXcgR2UsTmw9bmV3IEk7Y2xhc3MgV2cgZXh0ZW5kcyBzZXtjb25zdHJ1Y3Rvcih0PW5ldyBOdCxlPW5ldyBOZil7c3VwZXIoKSx0aGlzLmlzUG9pbnRzPSEwLHRoaXMudHlwZT0iUG9pbnRzIix0aGlzLmdlb21ldHJ5PXQsdGhpcy5tYXRlcmlhbD1lLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXZvaWQgMCx0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz12b2lkIDAsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLm1hdGVyaWFsPUFycmF5LmlzQXJyYXkodC5tYXRlcmlhbCk/dC5tYXRlcmlhbC5zbGljZSgpOnQubWF0ZXJpYWwsdGhpcy5nZW9tZXRyeT10Lmdlb21ldHJ5LHRoaXN9cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxpPXRoaXMubWF0cml4V29ybGQscz10LnBhcmFtcy5Qb2ludHMudGhyZXNob2xkLG89bi5kcmF3UmFuZ2U7aWYobi5ib3VuZGluZ1NwaGVyZT09PW51bGwmJm4uY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksVWwuY29weShuLmJvdW5kaW5nU3BoZXJlKSxVbC5hcHBseU1hdHJpeDQoaSksVWwucmFkaXVzKz1zLHQucmF5LmludGVyc2VjdHNTcGhlcmUoVWwpPT09ITEpcmV0dXJuO0hnLmNvcHkoaSkuaW52ZXJ0KCksRmYuY29weSh0LnJheSkuYXBwbHlNYXRyaXg0KEhnKTtjb25zdCBhPXMvKCh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMyksYz1hKmEsbD1uLmluZGV4LGg9bi5hdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKGwhPT1udWxsKXtjb25zdCBmPU1hdGgubWF4KDAsby5zdGFydCksZD1NYXRoLm1pbihsLmNvdW50LG8uc3RhcnQrby5jb3VudCk7Zm9yKGxldCBwPWYseD1kO3A8eDtwKyspe2NvbnN0IGc9bC5nZXRYKHApO05sLmZyb21CdWZmZXJBdHRyaWJ1dGUoaCxnKSxYZyhObCxnLGMsaSx0LGUsdGhpcyl9fWVsc2V7Y29uc3QgZj1NYXRoLm1heCgwLG8uc3RhcnQpLGQ9TWF0aC5taW4oaC5jb3VudCxvLnN0YXJ0K28uY291bnQpO2ZvcihsZXQgcD1mLHg9ZDtwPHg7cCsrKU5sLmZyb21CdWZmZXJBdHRyaWJ1dGUoaCxwKSxYZyhObCxwLGMsaSx0LGUsdGhpcyl9fXVwZGF0ZU1vcnBoVGFyZ2V0cygpe2NvbnN0IGU9dGhpcy5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMsbj1PYmplY3Qua2V5cyhlKTtpZihuLmxlbmd0aD4wKXtjb25zdCBpPWVbblswXV07aWYoaSE9PXZvaWQgMCl7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e307Zm9yKGxldCBzPTAsbz1pLmxlbmd0aDtzPG87cysrKXtjb25zdCBhPWlbc10ubmFtZXx8U3RyaW5nKHMpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCksdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbYV09c319fX19ZnVuY3Rpb24gWGcocix0LGUsbixpLHMsbyl7Y29uc3QgYT1GZi5kaXN0YW5jZVNxVG9Qb2ludChyKTtpZihhPGUpe2NvbnN0IGM9bmV3IEk7RmYuY2xvc2VzdFBvaW50VG9Qb2ludChyLGMpLGMuYXBwbHlNYXRyaXg0KG4pO2NvbnN0IGw9aS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oYyk7aWYobDxpLm5lYXJ8fGw+aS5mYXIpcmV0dXJuO3MucHVzaCh7ZGlzdGFuY2U6bCxkaXN0YW5jZVRvUmF5Ok1hdGguc3FydChhKSxwb2ludDpjLGluZGV4OnQsZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLGJhcnljb29yZDpudWxsLG9iamVjdDpvfSl9fWNsYXNzICRnIGV4dGVuZHMgQWV7Y29uc3RydWN0b3IodCxlLG4saSxzPXplLG89emUsYSxjLGwpe3N1cGVyKHQsZSxuLGkscyxvLGEsYyxsKSx0aGlzLmlzVmlkZW9UZXh0dXJlPSEwLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExO2NvbnN0IHU9dGhpcztmdW5jdGlvbiBoKCl7dS5uZWVkc1VwZGF0ZT0hMCx0LnJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2soaCl9InJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2siaW4gdCYmdC5yZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrKGgpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuaW1hZ2UpLmNvcHkodGhpcyl9dXBkYXRlKCl7Y29uc3QgdD10aGlzLmltYWdlOyJyZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrImluIHQ9PT0hMSYmdC5yZWFkeVN0YXRlPj10LkhBVkVfQ1VSUkVOVF9EQVRBJiYodGhpcy5uZWVkc1VwZGF0ZT0hMCl9fWNsYXNzIHhTIGV4dGVuZHMgJGd7Y29uc3RydWN0b3IodCxlLG4saSxzLG8sYSxjKXtzdXBlcih7fSx0LGUsbixpLHMsbyxhLGMpLHRoaXMuaXNWaWRlb0ZyYW1lVGV4dHVyZT0hMH11cGRhdGUoKXt9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfXNldEZyYW1lKHQpe3RoaXMuaW1hZ2U9dCx0aGlzLm5lZWRzVXBkYXRlPSEwfX1jbGFzcyBfUyBleHRlbmRzIEFle2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoe3dpZHRoOnQsaGVpZ2h0OmV9KSx0aGlzLmlzRnJhbWVidWZmZXJUZXh0dXJlPSEwLHRoaXMubWFnRmlsdGVyPVhlLHRoaXMubWluRmlsdGVyPVhlLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMubmVlZHNVcGRhdGU9ITB9fWNsYXNzIEZsIGV4dGVuZHMgQWV7Y29uc3RydWN0b3IodCxlLG4saSxzLG8sYSxjLGwsdSxoLGYpe3N1cGVyKG51bGwsbyxhLGMsbCx1LGkscyxoLGYpLHRoaXMuaXNDb21wcmVzc2VkVGV4dHVyZT0hMCx0aGlzLmltYWdlPXt3aWR0aDplLGhlaWdodDpufSx0aGlzLm1pcG1hcHM9dCx0aGlzLmZsaXBZPSExLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExfX1jbGFzcyB5UyBleHRlbmRzIEZse2NvbnN0cnVjdG9yKHQsZSxuLGkscyxvKXtzdXBlcih0LGUsbixzLG8pLHRoaXMuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlPSEwLHRoaXMuaW1hZ2UuZGVwdGg9aSx0aGlzLndyYXBSPUduLHRoaXMubGF5ZXJVcGRhdGVzPW5ldyBTZXR9YWRkTGF5ZXJVcGRhdGUodCl7dGhpcy5sYXllclVwZGF0ZXMuYWRkKHQpfWNsZWFyTGF5ZXJVcGRhdGVzKCl7dGhpcy5sYXllclVwZGF0ZXMuY2xlYXIoKX19Y2xhc3MgdlMgZXh0ZW5kcyBGbHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodm9pZCAwLHRbMF0ud2lkdGgsdFswXS5oZWlnaHQsZSxuLFBpKSx0aGlzLmlzQ29tcHJlc3NlZEN1YmVUZXh0dXJlPSEwLHRoaXMuaXNDdWJlVGV4dHVyZT0hMCx0aGlzLmltYWdlPXR9fWNsYXNzIE1TIGV4dGVuZHMgQWV7Y29uc3RydWN0b3IodCxlLG4saSxzLG8sYSxjLGwpe3N1cGVyKHQsZSxuLGkscyxvLGEsYyxsKSx0aGlzLmlzQ2FudmFzVGV4dHVyZT0hMCx0aGlzLm5lZWRzVXBkYXRlPSEwfX1jbGFzcyBCbCBleHRlbmRzIEFle2NvbnN0cnVjdG9yKHQsZSxuPUxpLGkscyxvLGE9WGUsYz1YZSxsLHU9Q3Mpe2lmKHUhPT1DcyYmdSE9PVJzKXRocm93IG5ldyBFcnJvcigiRGVwdGhUZXh0dXJlIGZvcm1hdCBtdXN0IGJlIGVpdGhlciBUSFJFRS5EZXB0aEZvcm1hdCBvciBUSFJFRS5EZXB0aFN0ZW5jaWxGb3JtYXQiKTtzdXBlcihudWxsLGkscyxvLGEsYyx1LG4sbCksdGhpcy5pc0RlcHRoVGV4dHVyZT0hMCx0aGlzLmltYWdlPXt3aWR0aDp0LGhlaWdodDplfSx0aGlzLmZsaXBZPSExLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuY29tcGFyZUZ1bmN0aW9uPW51bGx9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnNvdXJjZT1uZXcgYXIoT2JqZWN0LmFzc2lnbih7fSx0LmltYWdlKSksdGhpcy5jb21wYXJlRnVuY3Rpb249dC5jb21wYXJlRnVuY3Rpb24sdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIHRoaXMuY29tcGFyZUZ1bmN0aW9uIT09bnVsbCYmKGUuY29tcGFyZUZ1bmN0aW9uPXRoaXMuY29tcGFyZUZ1bmN0aW9uKSxlfX1jbGFzcyBTUyBleHRlbmRzIEJse2NvbnN0cnVjdG9yKHQ9MSxlPTEsbj0xKXtzdXBlcih0LGUpLHRoaXMuaXNEZXB0aEFycmF5VGV4dHVyZT0hMCx0aGlzLmltYWdlPXt3aWR0aDp0LGhlaWdodDplLGRlcHRoOm59LHRoaXMuZmxpcFk9ITEsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITEsdGhpcy5jb21wYXJlRnVuY3Rpb249bnVsbCx0aGlzLmxheWVyVXBkYXRlcz1uZXcgU2V0fWFkZExheWVyVXBkYXRlKHQpe3RoaXMubGF5ZXJVcGRhdGVzLmFkZCh0KX1jbGVhckxheWVyVXBkYXRlcygpe3RoaXMubGF5ZXJVcGRhdGVzLmNsZWFyKCl9fWNsYXNzIE9sIGV4dGVuZHMgTnR7Y29uc3RydWN0b3IodD0xLGU9MSxuPTQsaT04LHM9MSl7c3VwZXIoKSx0aGlzLnR5cGU9IkNhcHN1bGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxoZWlnaHQ6ZSxjYXBTZWdtZW50czpuLHJhZGlhbFNlZ21lbnRzOmksaGVpZ2h0U2VnbWVudHM6c30sZT1NYXRoLm1heCgwLGUpLG49TWF0aC5tYXgoMSxNYXRoLmZsb29yKG4pKSxpPU1hdGgubWF4KDMsTWF0aC5mbG9vcihpKSkscz1NYXRoLm1heCgxLE1hdGguZmxvb3IocykpO2NvbnN0IG89W10sYT1bXSxjPVtdLGw9W10sdT1lLzIsaD1NYXRoLlBJLzIqdCxmPWUsZD0yKmgrZixwPW4qMitzLHg9aSsxLGc9bmV3IEksbT1uZXcgSTtmb3IobGV0IHY9MDt2PD1wO3YrKyl7bGV0IHk9MCxfPTAsUz0wLHc9MDtpZih2PD1uKXtjb25zdCBiPXYvbixNPWIqTWF0aC5QSS8yO189LXUtdCpNYXRoLmNvcyhNKSxTPXQqTWF0aC5zaW4oTSksdz0tdCpNYXRoLmNvcyhNKSx5PWIqaH1lbHNlIGlmKHY8PW4rcyl7Y29uc3QgYj0odi1uKS9zO189LXUrYiplLFM9dCx3PTAseT1oK2IqZn1lbHNle2NvbnN0IGI9KHYtbi1zKS9uLE09YipNYXRoLlBJLzI7Xz11K3QqTWF0aC5zaW4oTSksUz10Kk1hdGguY29zKE0pLHc9dCpNYXRoLnNpbihNKSx5PWgrZitiKmh9Y29uc3QgQT1NYXRoLm1heCgwLE1hdGgubWluKDEseS9kKSk7bGV0IFQ9MDt2PT09MD9UPS41L2k6dj09PXAmJihUPS0uNS9pKTtmb3IobGV0IGI9MDtiPD1pO2IrKyl7Y29uc3QgTT1iL2ksRT1NKk1hdGguUEkqMixEPU1hdGguc2luKEUpLEw9TWF0aC5jb3MoRSk7bS54PS1TKkwsbS55PV8sbS56PVMqRCxhLnB1c2gobS54LG0ueSxtLnopLGcuc2V0KC1TKkwsdyxTKkQpLGcubm9ybWFsaXplKCksYy5wdXNoKGcueCxnLnksZy56KSxsLnB1c2goTStULEEpfWlmKHY+MCl7Y29uc3QgYj0odi0xKSp4O2ZvcihsZXQgTT0wO008aTtNKyspe2NvbnN0IEU9YitNLEQ9YitNKzEsTD12KngrTSxGPXYqeCtNKzE7by5wdXNoKEUsRCxMKSxvLnB1c2goRCxGLEwpfX19dGhpcy5zZXRJbmRleChvKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyB2dChhLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgdnQoYywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgdnQobCwyKSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgT2wodC5yYWRpdXMsdC5oZWlnaHQsdC5jYXBTZWdtZW50cyx0LnJhZGlhbFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMpfX1jbGFzcyB6bCBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9MSxlPTMyLG49MCxpPU1hdGguUEkqMil7c3VwZXIoKSx0aGlzLnR5cGU9IkNpcmNsZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LHNlZ21lbnRzOmUsdGhldGFTdGFydDpuLHRoZXRhTGVuZ3RoOml9LGU9TWF0aC5tYXgoMyxlKTtjb25zdCBzPVtdLG89W10sYT1bXSxjPVtdLGw9bmV3IEksdT1uZXcgcTtvLnB1c2goMCwwLDApLGEucHVzaCgwLDAsMSksYy5wdXNoKC41LC41KTtmb3IobGV0IGg9MCxmPTM7aDw9ZTtoKyssZis9Myl7Y29uc3QgZD1uK2gvZSppO2wueD10Kk1hdGguY29zKGQpLGwueT10Kk1hdGguc2luKGQpLG8ucHVzaChsLngsbC55LGwueiksYS5wdXNoKDAsMCwxKSx1Lng9KG9bZl0vdCsxKS8yLHUueT0ob1tmKzFdL3QrMSkvMixjLnB1c2godS54LHUueSl9Zm9yKGxldCBoPTE7aDw9ZTtoKyspcy5wdXNoKGgsaCsxLDApO3RoaXMuc2V0SW5kZXgocyksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgdnQobywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IHZ0KGEsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IHZ0KGMsMikpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IHpsKHQucmFkaXVzLHQuc2VnbWVudHMsdC50aGV0YVN0YXJ0LHQudGhldGFMZW5ndGgpfX1jbGFzcyBjYSBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9MSxlPTEsbj0xLGk9MzIscz0xLG89ITEsYT0wLGM9TWF0aC5QSSoyKXtzdXBlcigpLHRoaXMudHlwZT0iQ3lsaW5kZXJHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXNUb3A6dCxyYWRpdXNCb3R0b206ZSxoZWlnaHQ6bixyYWRpYWxTZWdtZW50czppLGhlaWdodFNlZ21lbnRzOnMsb3BlbkVuZGVkOm8sdGhldGFTdGFydDphLHRoZXRhTGVuZ3RoOmN9O2NvbnN0IGw9dGhpcztpPU1hdGguZmxvb3IoaSkscz1NYXRoLmZsb29yKHMpO2NvbnN0IHU9W10saD1bXSxmPVtdLGQ9W107bGV0IHA9MDtjb25zdCB4PVtdLGc9bi8yO2xldCBtPTA7digpLG89PT0hMSYmKHQ+MCYmeSghMCksZT4wJiZ5KCExKSksdGhpcy5zZXRJbmRleCh1KSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyB2dChoLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgdnQoZiwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgdnQoZCwyKSk7ZnVuY3Rpb24gdigpe2NvbnN0IF89bmV3IEksUz1uZXcgSTtsZXQgdz0wO2NvbnN0IEE9KGUtdCkvbjtmb3IobGV0IFQ9MDtUPD1zO1QrKyl7Y29uc3QgYj1bXSxNPVQvcyxFPU0qKGUtdCkrdDtmb3IobGV0IEQ9MDtEPD1pO0QrKyl7Y29uc3QgTD1EL2ksRj1MKmMrYSxOPU1hdGguc2luKEYpLE89TWF0aC5jb3MoRik7Uy54PUUqTixTLnk9LU0qbitnLFMuej1FKk8saC5wdXNoKFMueCxTLnksUy56KSxfLnNldChOLEEsTykubm9ybWFsaXplKCksZi5wdXNoKF8ueCxfLnksXy56KSxkLnB1c2goTCwxLU0pLGIucHVzaChwKyspfXgucHVzaChiKX1mb3IobGV0IFQ9MDtUPGk7VCsrKWZvcihsZXQgYj0wO2I8cztiKyspe2NvbnN0IE09eFtiXVtUXSxFPXhbYisxXVtUXSxEPXhbYisxXVtUKzFdLEw9eFtiXVtUKzFdOyh0PjB8fGIhPT0wKSYmKHUucHVzaChNLEUsTCksdys9MyksKGU+MHx8YiE9PXMtMSkmJih1LnB1c2goRSxELEwpLHcrPTMpfWwuYWRkR3JvdXAobSx3LDApLG0rPXd9ZnVuY3Rpb24geShfKXtjb25zdCBTPXAsdz1uZXcgcSxBPW5ldyBJO2xldCBUPTA7Y29uc3QgYj1fPT09ITA/dDplLE09Xz09PSEwPzE6LTE7Zm9yKGxldCBEPTE7RDw9aTtEKyspaC5wdXNoKDAsZypNLDApLGYucHVzaCgwLE0sMCksZC5wdXNoKC41LC41KSxwKys7Y29uc3QgRT1wO2ZvcihsZXQgRD0wO0Q8PWk7RCsrKXtjb25zdCBGPUQvaSpjK2EsTj1NYXRoLmNvcyhGKSxPPU1hdGguc2luKEYpO0EueD1iKk8sQS55PWcqTSxBLno9YipOLGgucHVzaChBLngsQS55LEEueiksZi5wdXNoKDAsTSwwKSx3Lng9TiouNSsuNSx3Lnk9TyouNSpNKy41LGQucHVzaCh3Lngsdy55KSxwKyt9Zm9yKGxldCBEPTA7RDxpO0QrKyl7Y29uc3QgTD1TK0QsRj1FK0Q7Xz09PSEwP3UucHVzaChGLEYrMSxMKTp1LnB1c2goRisxLEYsTCksVCs9M31sLmFkZEdyb3VwKG0sVCxfPT09ITA/MToyKSxtKz1UfX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc31zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBjYSh0LnJhZGl1c1RvcCx0LnJhZGl1c0JvdHRvbSx0LmhlaWdodCx0LnJhZGlhbFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMsdC5vcGVuRW5kZWQsdC50aGV0YVN0YXJ0LHQudGhldGFMZW5ndGgpfX1jbGFzcyBsYSBleHRlbmRzIGNhe2NvbnN0cnVjdG9yKHQ9MSxlPTEsbj0zMixpPTEscz0hMSxvPTAsYT1NYXRoLlBJKjIpe3N1cGVyKDAsdCxlLG4saSxzLG8sYSksdGhpcy50eXBlPSJDb25lR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsaGVpZ2h0OmUscmFkaWFsU2VnbWVudHM6bixoZWlnaHRTZWdtZW50czppLG9wZW5FbmRlZDpzLHRoZXRhU3RhcnQ6byx0aGV0YUxlbmd0aDphfX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBsYSh0LnJhZGl1cyx0LmhlaWdodCx0LnJhZGlhbFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMsdC5vcGVuRW5kZWQsdC50aGV0YVN0YXJ0LHQudGhldGFMZW5ndGgpfX1jbGFzcyB4ciBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9W10sZT1bXSxuPTEsaT0wKXtzdXBlcigpLHRoaXMudHlwZT0iUG9seWhlZHJvbkdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3ZlcnRpY2VzOnQsaW5kaWNlczplLHJhZGl1czpuLGRldGFpbDppfTtjb25zdCBzPVtdLG89W107YShpKSxsKG4pLHUoKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyB2dChzLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgdnQocy5zbGljZSgpLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyB2dChvLDIpKSxpPT09MD90aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk6dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7ZnVuY3Rpb24gYSh2KXtjb25zdCB5PW5ldyBJLF89bmV3IEksUz1uZXcgSTtmb3IobGV0IHc9MDt3PGUubGVuZ3RoO3crPTMpZChlW3crMF0seSksZChlW3crMV0sXyksZChlW3crMl0sUyksYyh5LF8sUyx2KX1mdW5jdGlvbiBjKHYseSxfLFMpe2NvbnN0IHc9UysxLEE9W107Zm9yKGxldCBUPTA7VDw9dztUKyspe0FbVF09W107Y29uc3QgYj12LmNsb25lKCkubGVycChfLFQvdyksTT15LmNsb25lKCkubGVycChfLFQvdyksRT13LVQ7Zm9yKGxldCBEPTA7RDw9RTtEKyspRD09PTAmJlQ9PT13P0FbVF1bRF09YjpBW1RdW0RdPWIuY2xvbmUoKS5sZXJwKE0sRC9FKX1mb3IobGV0IFQ9MDtUPHc7VCsrKWZvcihsZXQgYj0wO2I8Mioody1UKS0xO2IrKyl7Y29uc3QgTT1NYXRoLmZsb29yKGIvMik7YiUyPT09MD8oZihBW1RdW00rMV0pLGYoQVtUKzFdW01dKSxmKEFbVF1bTV0pKTooZihBW1RdW00rMV0pLGYoQVtUKzFdW00rMV0pLGYoQVtUKzFdW01dKSl9fWZ1bmN0aW9uIGwodil7Y29uc3QgeT1uZXcgSTtmb3IobGV0IF89MDtfPHMubGVuZ3RoO18rPTMpeS54PXNbXyswXSx5Lnk9c1tfKzFdLHkuej1zW18rMl0seS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih2KSxzW18rMF09eS54LHNbXysxXT15Lnksc1tfKzJdPXkuen1mdW5jdGlvbiB1KCl7Y29uc3Qgdj1uZXcgSTtmb3IobGV0IHk9MDt5PHMubGVuZ3RoO3krPTMpe3YueD1zW3krMF0sdi55PXNbeSsxXSx2Lno9c1t5KzJdO2NvbnN0IF89Zyh2KS8yL01hdGguUEkrLjUsUz1tKHYpL01hdGguUEkrLjU7by5wdXNoKF8sMS1TKX1wKCksaCgpfWZ1bmN0aW9uIGgoKXtmb3IobGV0IHY9MDt2PG8ubGVuZ3RoO3YrPTYpe2NvbnN0IHk9b1t2KzBdLF89b1t2KzJdLFM9b1t2KzRdLHc9TWF0aC5tYXgoeSxfLFMpLEE9TWF0aC5taW4oeSxfLFMpO3c+LjkmJkE8LjEmJih5PC4yJiYob1t2KzBdKz0xKSxfPC4yJiYob1t2KzJdKz0xKSxTPC4yJiYob1t2KzRdKz0xKSl9fWZ1bmN0aW9uIGYodil7cy5wdXNoKHYueCx2Lnksdi56KX1mdW5jdGlvbiBkKHYseSl7Y29uc3QgXz12KjM7eS54PXRbXyswXSx5Lnk9dFtfKzFdLHkuej10W18rMl19ZnVuY3Rpb24gcCgpe2NvbnN0IHY9bmV3IEkseT1uZXcgSSxfPW5ldyBJLFM9bmV3IEksdz1uZXcgcSxBPW5ldyBxLFQ9bmV3IHE7Zm9yKGxldCBiPTAsTT0wO2I8cy5sZW5ndGg7Yis9OSxNKz02KXt2LnNldChzW2IrMF0sc1tiKzFdLHNbYisyXSkseS5zZXQoc1tiKzNdLHNbYis0XSxzW2IrNV0pLF8uc2V0KHNbYis2XSxzW2IrN10sc1tiKzhdKSx3LnNldChvW00rMF0sb1tNKzFdKSxBLnNldChvW00rMl0sb1tNKzNdKSxULnNldChvW00rNF0sb1tNKzVdKSxTLmNvcHkodikuYWRkKHkpLmFkZChfKS5kaXZpZGVTY2FsYXIoMyk7Y29uc3QgRT1nKFMpO3godyxNKzAsdixFKSx4KEEsTSsyLHksRSkseChULE0rNCxfLEUpfX1mdW5jdGlvbiB4KHYseSxfLFMpe1M8MCYmdi54PT09MSYmKG9beV09di54LTEpLF8ueD09PTAmJl8uej09PTAmJihvW3ldPVMvMi9NYXRoLlBJKy41KX1mdW5jdGlvbiBnKHYpe3JldHVybiBNYXRoLmF0YW4yKHYueiwtdi54KX1mdW5jdGlvbiBtKHYpe3JldHVybiBNYXRoLmF0YW4yKC12LnksTWF0aC5zcXJ0KHYueCp2Lngrdi56KnYueikpfX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc31zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyB4cih0LnZlcnRpY2VzLHQuaW5kaWNlcyx0LnJhZGl1cyx0LmRldGFpbHMpfX1jbGFzcyBrbCBleHRlbmRzIHhye2NvbnN0cnVjdG9yKHQ9MSxlPTApe2NvbnN0IG49KDErTWF0aC5zcXJ0KDUpKS8yLGk9MS9uLHM9Wy0xLC0xLC0xLC0xLC0xLDEsLTEsMSwtMSwtMSwxLDEsMSwtMSwtMSwxLC0xLDEsMSwxLC0xLDEsMSwxLDAsLWksLW4sMCwtaSxuLDAsaSwtbiwwLGksbiwtaSwtbiwwLC1pLG4sMCxpLC1uLDAsaSxuLDAsLW4sMCwtaSxuLDAsLWksLW4sMCxpLG4sMCxpXSxvPVszLDExLDcsMyw3LDE1LDMsMTUsMTMsNywxOSwxNyw3LDE3LDYsNyw2LDE1LDE3LDQsOCwxNyw4LDEwLDE3LDEwLDYsOCwwLDE2LDgsMTYsMiw4LDIsMTAsMCwxMiwxLDAsMSwxOCwwLDE4LDE2LDYsMTAsMiw2LDIsMTMsNiwxMywxNSwyLDE2LDE4LDIsMTgsMywyLDMsMTMsMTgsMSw5LDE4LDksMTEsMTgsMTEsMyw0LDE0LDEyLDQsMTIsMCw0LDAsOCwxMSw5LDUsMTEsNSwxOSwxMSwxOSw3LDE5LDUsMTQsMTksMTQsNCwxOSw0LDE3LDEsMTIsMTQsMSwxNCw1LDEsNSw5XTtzdXBlcihzLG8sdCxlKSx0aGlzLnR5cGU9IkRvZGVjYWhlZHJvbkdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LGRldGFpbDplfX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBrbCh0LnJhZGl1cyx0LmRldGFpbCl9fWNvbnN0IFZsPW5ldyBJLEdsPW5ldyBJLEJmPW5ldyBJLEhsPW5ldyBnZTtjbGFzcyBxZyBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9bnVsbCxlPTEpe2lmKHN1cGVyKCksdGhpcy50eXBlPSJFZGdlc0dlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e2dlb21ldHJ5OnQsdGhyZXNob2xkQW5nbGU6ZX0sdCE9PW51bGwpe2NvbnN0IGk9TWF0aC5wb3coMTAsNCkscz1NYXRoLmNvcyhOciplKSxvPXQuZ2V0SW5kZXgoKSxhPXQuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLGM9bz9vLmNvdW50OmEuY291bnQsbD1bMCwwLDBdLHU9WyJhIiwiYiIsImMiXSxoPW5ldyBBcnJheSgzKSxmPXt9LGQ9W107Zm9yKGxldCBwPTA7cDxjO3ArPTMpe28/KGxbMF09by5nZXRYKHApLGxbMV09by5nZXRYKHArMSksbFsyXT1vLmdldFgocCsyKSk6KGxbMF09cCxsWzFdPXArMSxsWzJdPXArMik7Y29uc3R7YTp4LGI6ZyxjOm19PUhsO2lmKHguZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGxbMF0pLGcuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGxbMV0pLG0uZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGxbMl0pLEhsLmdldE5vcm1hbChCZiksaFswXT1gJHtNYXRoLnJvdW5kKHgueCppKX0sJHtNYXRoLnJvdW5kKHgueSppKX0sJHtNYXRoLnJvdW5kKHgueippKX1gLGhbMV09YCR7TWF0aC5yb3VuZChnLngqaSl9LCR7TWF0aC5yb3VuZChnLnkqaSl9LCR7TWF0aC5yb3VuZChnLnoqaSl9YCxoWzJdPWAke01hdGgucm91bmQobS54KmkpfSwke01hdGgucm91bmQobS55KmkpfSwke01hdGgucm91bmQobS56KmkpfWAsIShoWzBdPT09aFsxXXx8aFsxXT09PWhbMl18fGhbMl09PT1oWzBdKSlmb3IobGV0IHY9MDt2PDM7disrKXtjb25zdCB5PSh2KzEpJTMsXz1oW3ZdLFM9aFt5XSx3PUhsW3Vbdl1dLEE9SGxbdVt5XV0sVD1gJHtffV8ke1N9YCxiPWAke1N9XyR7X31gO2IgaW4gZiYmZltiXT8oQmYuZG90KGZbYl0ubm9ybWFsKTw9cyYmKGQucHVzaCh3Lngsdy55LHcueiksZC5wdXNoKEEueCxBLnksQS56KSksZltiXT1udWxsKTpUIGluIGZ8fChmW1RdPXtpbmRleDA6bFt2XSxpbmRleDE6bFt5XSxub3JtYWw6QmYuY2xvbmUoKX0pfX1mb3IoY29uc3QgcCBpbiBmKWlmKGZbcF0pe2NvbnN0e2luZGV4MDp4LGluZGV4MTpnfT1mW3BdO1ZsLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSx4KSxHbC5mcm9tQnVmZmVyQXR0cmlidXRlKGEsZyksZC5wdXNoKFZsLngsVmwueSxWbC56KSxkLnB1c2goR2wueCxHbC55LEdsLnopfXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHZ0KGQsMykpfX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc319Y2xhc3MgY2l7Y29uc3RydWN0b3IoKXt0aGlzLnR5cGU9IkN1cnZlIix0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz0yMDAsdGhpcy5uZWVkc1VwZGF0ZT0hMSx0aGlzLmNhY2hlQXJjTGVuZ3Rocz1udWxsfWdldFBvaW50KCl7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZTogLmdldFBvaW50KCkgbm90IGltcGxlbWVudGVkLiIpfWdldFBvaW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQobixlKX1nZXRQb2ludHModD01KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiBlfWdldFNwYWNlZFBvaW50cyh0PTUpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnRBdChuL3QpKTtyZXR1cm4gZX1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0TGVuZ3RocygpO3JldHVybiB0W3QubGVuZ3RoLTFdfWdldExlbmd0aHModD10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyl7aWYodGhpcy5jYWNoZUFyY0xlbmd0aHMmJnRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aD09PXQrMSYmIXRoaXMubmVlZHNVcGRhdGUpcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO3RoaXMubmVlZHNVcGRhdGU9ITE7Y29uc3QgZT1bXTtsZXQgbixpPXRoaXMuZ2V0UG9pbnQoMCkscz0wO2UucHVzaCgwKTtmb3IobGV0IG89MTtvPD10O28rKyluPXRoaXMuZ2V0UG9pbnQoby90KSxzKz1uLmRpc3RhbmNlVG8oaSksZS5wdXNoKHMpLGk9bjtyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM9ZSxlfXVwZGF0ZUFyY0xlbmd0aHMoKXt0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXMuZ2V0TGVuZ3RocygpfWdldFV0b1RtYXBwaW5nKHQsZT1udWxsKXtjb25zdCBuPXRoaXMuZ2V0TGVuZ3RocygpO2xldCBpPTA7Y29uc3Qgcz1uLmxlbmd0aDtsZXQgbztlP289ZTpvPXQqbltzLTFdO2xldCBhPTAsYz1zLTEsbDtmb3IoO2E8PWM7KWlmKGk9TWF0aC5mbG9vcihhKyhjLWEpLzIpLGw9bltpXS1vLGw8MClhPWkrMTtlbHNlIGlmKGw+MCljPWktMTtlbHNle2M9aTticmVha31pZihpPWMsbltpXT09PW8pcmV0dXJuIGkvKHMtMSk7Y29uc3QgdT1uW2ldLGY9bltpKzFdLXUsZD0oby11KS9mO3JldHVybihpK2QpLyhzLTEpfWdldFRhbmdlbnQodCxlKXtsZXQgaT10LTFlLTQscz10KzFlLTQ7aTwwJiYoaT0wKSxzPjEmJihzPTEpO2NvbnN0IG89dGhpcy5nZXRQb2ludChpKSxhPXRoaXMuZ2V0UG9pbnQocyksYz1lfHwoby5pc1ZlY3RvcjI/bmV3IHE6bmV3IEkpO3JldHVybiBjLmNvcHkoYSkuc3ViKG8pLm5vcm1hbGl6ZSgpLGN9Z2V0VGFuZ2VudEF0KHQsZSl7Y29uc3Qgbj10aGlzLmdldFV0b1RtYXBwaW5nKHQpO3JldHVybiB0aGlzLmdldFRhbmdlbnQobixlKX1jb21wdXRlRnJlbmV0RnJhbWVzKHQsZT0hMSl7Y29uc3Qgbj1uZXcgSSxpPVtdLHM9W10sbz1bXSxhPW5ldyBJLGM9bmV3IEN0O2ZvcihsZXQgZD0wO2Q8PXQ7ZCsrKXtjb25zdCBwPWQvdDtpW2RdPXRoaXMuZ2V0VGFuZ2VudEF0KHAsbmV3IEkpfXNbMF09bmV3IEksb1swXT1uZXcgSTtsZXQgbD1OdW1iZXIuTUFYX1ZBTFVFO2NvbnN0IHU9TWF0aC5hYnMoaVswXS54KSxoPU1hdGguYWJzKGlbMF0ueSksZj1NYXRoLmFicyhpWzBdLnopO3U8PWwmJihsPXUsbi5zZXQoMSwwLDApKSxoPD1sJiYobD1oLG4uc2V0KDAsMSwwKSksZjw9bCYmbi5zZXQoMCwwLDEpLGEuY3Jvc3NWZWN0b3JzKGlbMF0sbikubm9ybWFsaXplKCksc1swXS5jcm9zc1ZlY3RvcnMoaVswXSxhKSxvWzBdLmNyb3NzVmVjdG9ycyhpWzBdLHNbMF0pO2ZvcihsZXQgZD0xO2Q8PXQ7ZCsrKXtpZihzW2RdPXNbZC0xXS5jbG9uZSgpLG9bZF09b1tkLTFdLmNsb25lKCksYS5jcm9zc1ZlY3RvcnMoaVtkLTFdLGlbZF0pLGEubGVuZ3RoKCk+TnVtYmVyLkVQU0lMT04pe2Eubm9ybWFsaXplKCk7Y29uc3QgcD1NYXRoLmFjb3MoSHQoaVtkLTFdLmRvdChpW2RdKSwtMSwxKSk7c1tkXS5hcHBseU1hdHJpeDQoYy5tYWtlUm90YXRpb25BeGlzKGEscCkpfW9bZF0uY3Jvc3NWZWN0b3JzKGlbZF0sc1tkXSl9aWYoZT09PSEwKXtsZXQgZD1NYXRoLmFjb3MoSHQoc1swXS5kb3Qoc1t0XSksLTEsMSkpO2QvPXQsaVswXS5kb3QoYS5jcm9zc1ZlY3RvcnMoc1swXSxzW3RdKSk+MCYmKGQ9LWQpO2ZvcihsZXQgcD0xO3A8PXQ7cCsrKXNbcF0uYXBwbHlNYXRyaXg0KGMubWFrZVJvdGF0aW9uQXhpcyhpW3BdLGQqcCkpLG9bcF0uY3Jvc3NWZWN0b3JzKGlbcF0sc1twXSl9cmV0dXJue3RhbmdlbnRzOmksbm9ybWFsczpzLGJpbm9ybWFsczpvfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9dC5hcmNMZW5ndGhEaXZpc2lvbnMsdGhpc310b0pTT04oKXtjb25zdCB0PXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiQ3VydmUiLGdlbmVyYXRvcjoiQ3VydmUudG9KU09OIn19O3JldHVybiB0LmFyY0xlbmd0aERpdmlzaW9ucz10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyx0LnR5cGU9dGhpcy50eXBlLHR9ZnJvbUpTT04odCl7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPXQuYXJjTGVuZ3RoRGl2aXNpb25zLHRoaXN9fWNsYXNzIFdsIGV4dGVuZHMgY2l7Y29uc3RydWN0b3IodD0wLGU9MCxuPTEsaT0xLHM9MCxvPU1hdGguUEkqMixhPSExLGM9MCl7c3VwZXIoKSx0aGlzLmlzRWxsaXBzZUN1cnZlPSEwLHRoaXMudHlwZT0iRWxsaXBzZUN1cnZlIix0aGlzLmFYPXQsdGhpcy5hWT1lLHRoaXMueFJhZGl1cz1uLHRoaXMueVJhZGl1cz1pLHRoaXMuYVN0YXJ0QW5nbGU9cyx0aGlzLmFFbmRBbmdsZT1vLHRoaXMuYUNsb2Nrd2lzZT1hLHRoaXMuYVJvdGF0aW9uPWN9Z2V0UG9pbnQodCxlPW5ldyBxKXtjb25zdCBuPWUsaT1NYXRoLlBJKjI7bGV0IHM9dGhpcy5hRW5kQW5nbGUtdGhpcy5hU3RhcnRBbmdsZTtjb25zdCBvPU1hdGguYWJzKHMpPE51bWJlci5FUFNJTE9OO2Zvcig7czwwOylzKz1pO2Zvcig7cz5pOylzLT1pO3M8TnVtYmVyLkVQU0lMT04mJihvP3M9MDpzPWkpLHRoaXMuYUNsb2Nrd2lzZT09PSEwJiYhbyYmKHM9PT1pP3M9LWk6cz1zLWkpO2NvbnN0IGE9dGhpcy5hU3RhcnRBbmdsZSt0KnM7bGV0IGM9dGhpcy5hWCt0aGlzLnhSYWRpdXMqTWF0aC5jb3MoYSksbD10aGlzLmFZK3RoaXMueVJhZGl1cypNYXRoLnNpbihhKTtpZih0aGlzLmFSb3RhdGlvbiE9PTApe2NvbnN0IHU9TWF0aC5jb3ModGhpcy5hUm90YXRpb24pLGg9TWF0aC5zaW4odGhpcy5hUm90YXRpb24pLGY9Yy10aGlzLmFYLGQ9bC10aGlzLmFZO2M9Zip1LWQqaCt0aGlzLmFYLGw9ZipoK2QqdSt0aGlzLmFZfXJldHVybiBuLnNldChjLGwpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5hWD10LmFYLHRoaXMuYVk9dC5hWSx0aGlzLnhSYWRpdXM9dC54UmFkaXVzLHRoaXMueVJhZGl1cz10LnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT10LmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPXQuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT10LmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249dC5hUm90YXRpb24sdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LmFYPXRoaXMuYVgsdC5hWT10aGlzLmFZLHQueFJhZGl1cz10aGlzLnhSYWRpdXMsdC55UmFkaXVzPXRoaXMueVJhZGl1cyx0LmFTdGFydEFuZ2xlPXRoaXMuYVN0YXJ0QW5nbGUsdC5hRW5kQW5nbGU9dGhpcy5hRW5kQW5nbGUsdC5hQ2xvY2t3aXNlPXRoaXMuYUNsb2Nrd2lzZSx0LmFSb3RhdGlvbj10aGlzLmFSb3RhdGlvbix0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLmFYPXQuYVgsdGhpcy5hWT10LmFZLHRoaXMueFJhZGl1cz10LnhSYWRpdXMsdGhpcy55UmFkaXVzPXQueVJhZGl1cyx0aGlzLmFTdGFydEFuZ2xlPXQuYVN0YXJ0QW5nbGUsdGhpcy5hRW5kQW5nbGU9dC5hRW5kQW5nbGUsdGhpcy5hQ2xvY2t3aXNlPXQuYUNsb2Nrd2lzZSx0aGlzLmFSb3RhdGlvbj10LmFSb3RhdGlvbix0aGlzfX1jbGFzcyBZZyBleHRlbmRzIFdse2NvbnN0cnVjdG9yKHQsZSxuLGkscyxvKXtzdXBlcih0LGUsbixuLGkscyxvKSx0aGlzLmlzQXJjQ3VydmU9ITAsdGhpcy50eXBlPSJBcmNDdXJ2ZSJ9fWZ1bmN0aW9uIE9mKCl7bGV0IHI9MCx0PTAsZT0wLG49MDtmdW5jdGlvbiBpKHMsbyxhLGMpe3I9cyx0PWEsZT0tMypzKzMqby0yKmEtYyxuPTIqcy0yKm8rYStjfXJldHVybntpbml0Q2F0bXVsbFJvbTpmdW5jdGlvbihzLG8sYSxjLGwpe2kobyxhLGwqKGEtcyksbCooYy1vKSl9LGluaXROb251bmlmb3JtQ2F0bXVsbFJvbTpmdW5jdGlvbihzLG8sYSxjLGwsdSxoKXtsZXQgZj0oby1zKS9sLShhLXMpLyhsK3UpKyhhLW8pL3UsZD0oYS1vKS91LShjLW8pLyh1K2gpKyhjLWEpL2g7Zio9dSxkKj11LGkobyxhLGYsZCl9LGNhbGM6ZnVuY3Rpb24ocyl7Y29uc3Qgbz1zKnMsYT1vKnM7cmV0dXJuIHIrdCpzK2UqbytuKmF9fX1jb25zdCBYbD1uZXcgSSx6Zj1uZXcgT2Ysa2Y9bmV3IE9mLFZmPW5ldyBPZjtjbGFzcyBaZyBleHRlbmRzIGNpe2NvbnN0cnVjdG9yKHQ9W10sZT0hMSxuPSJjZW50cmlwZXRhbCIsaT0uNSl7c3VwZXIoKSx0aGlzLmlzQ2F0bXVsbFJvbUN1cnZlMz0hMCx0aGlzLnR5cGU9IkNhdG11bGxSb21DdXJ2ZTMiLHRoaXMucG9pbnRzPXQsdGhpcy5jbG9zZWQ9ZSx0aGlzLmN1cnZlVHlwZT1uLHRoaXMudGVuc2lvbj1pfWdldFBvaW50KHQsZT1uZXcgSSl7Y29uc3Qgbj1lLGk9dGhpcy5wb2ludHMscz1pLmxlbmd0aCxvPShzLSh0aGlzLmNsb3NlZD8wOjEpKSp0O2xldCBhPU1hdGguZmxvb3IobyksYz1vLWE7dGhpcy5jbG9zZWQ/YSs9YT4wPzA6KE1hdGguZmxvb3IoTWF0aC5hYnMoYSkvcykrMSkqczpjPT09MCYmYT09PXMtMSYmKGE9cy0yLGM9MSk7bGV0IGwsdTt0aGlzLmNsb3NlZHx8YT4wP2w9aVsoYS0xKSVzXTooWGwuc3ViVmVjdG9ycyhpWzBdLGlbMV0pLmFkZChpWzBdKSxsPVhsKTtjb25zdCBoPWlbYSVzXSxmPWlbKGErMSklc107aWYodGhpcy5jbG9zZWR8fGErMjxzP3U9aVsoYSsyKSVzXTooWGwuc3ViVmVjdG9ycyhpW3MtMV0saVtzLTJdKS5hZGQoaVtzLTFdKSx1PVhsKSx0aGlzLmN1cnZlVHlwZT09PSJjZW50cmlwZXRhbCJ8fHRoaXMuY3VydmVUeXBlPT09ImNob3JkYWwiKXtjb25zdCBkPXRoaXMuY3VydmVUeXBlPT09ImNob3JkYWwiPy41Oi4yNTtsZXQgcD1NYXRoLnBvdyhsLmRpc3RhbmNlVG9TcXVhcmVkKGgpLGQpLHg9TWF0aC5wb3coaC5kaXN0YW5jZVRvU3F1YXJlZChmKSxkKSxnPU1hdGgucG93KGYuZGlzdGFuY2VUb1NxdWFyZWQodSksZCk7eDwxZS00JiYoeD0xKSxwPDFlLTQmJihwPXgpLGc8MWUtNCYmKGc9eCksemYuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKGwueCxoLngsZi54LHUueCxwLHgsZyksa2YuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKGwueSxoLnksZi55LHUueSxwLHgsZyksVmYuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKGwueixoLnosZi56LHUueixwLHgsZyl9ZWxzZSB0aGlzLmN1cnZlVHlwZT09PSJjYXRtdWxscm9tIiYmKHpmLmluaXRDYXRtdWxsUm9tKGwueCxoLngsZi54LHUueCx0aGlzLnRlbnNpb24pLGtmLmluaXRDYXRtdWxsUm9tKGwueSxoLnksZi55LHUueSx0aGlzLnRlbnNpb24pLFZmLmluaXRDYXRtdWxsUm9tKGwueixoLnosZi56LHUueix0aGlzLnRlbnNpb24pKTtyZXR1cm4gbi5zZXQoemYuY2FsYyhjKSxrZi5jYWxjKGMpLFZmLmNhbGMoYykpLG59Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IGk9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChpLmNsb25lKCkpfXJldHVybiB0aGlzLmNsb3NlZD10LmNsb3NlZCx0aGlzLmN1cnZlVHlwZT10LmN1cnZlVHlwZSx0aGlzLnRlbnNpb249dC50ZW5zaW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXRoaXMucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBpPXRoaXMucG9pbnRzW2VdO3QucG9pbnRzLnB1c2goaS50b0FycmF5KCkpfXJldHVybiB0LmNsb3NlZD10aGlzLmNsb3NlZCx0LmN1cnZlVHlwZT10aGlzLmN1cnZlVHlwZSx0LnRlbnNpb249dGhpcy50ZW5zaW9uLHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10LnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3QgaT10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKG5ldyBJKCkuZnJvbUFycmF5KGkpKX1yZXR1cm4gdGhpcy5jbG9zZWQ9dC5jbG9zZWQsdGhpcy5jdXJ2ZVR5cGU9dC5jdXJ2ZVR5cGUsdGhpcy50ZW5zaW9uPXQudGVuc2lvbix0aGlzfX1mdW5jdGlvbiBKZyhyLHQsZSxuLGkpe2NvbnN0IHM9KG4tdCkqLjUsbz0oaS1lKSouNSxhPXIqcixjPXIqYTtyZXR1cm4oMiplLTIqbitzK28pKmMrKC0zKmUrMypuLTIqcy1vKSphK3MqcitlfWZ1bmN0aW9uIGJTKHIsdCl7Y29uc3QgZT0xLXI7cmV0dXJuIGUqZSp0fWZ1bmN0aW9uIHdTKHIsdCl7cmV0dXJuIDIqKDEtcikqcip0fWZ1bmN0aW9uIEFTKHIsdCl7cmV0dXJuIHIqcip0fWZ1bmN0aW9uIHVhKHIsdCxlLG4pe3JldHVybiBiUyhyLHQpK3dTKHIsZSkrQVMocixuKX1mdW5jdGlvbiBUUyhyLHQpe2NvbnN0IGU9MS1yO3JldHVybiBlKmUqZSp0fWZ1bmN0aW9uIEVTKHIsdCl7Y29uc3QgZT0xLXI7cmV0dXJuIDMqZSplKnIqdH1mdW5jdGlvbiBDUyhyLHQpe3JldHVybiAzKigxLXIpKnIqcip0fWZ1bmN0aW9uIFJTKHIsdCl7cmV0dXJuIHIqcipyKnR9ZnVuY3Rpb24gaGEocix0LGUsbixpKXtyZXR1cm4gVFMocix0KStFUyhyLGUpK0NTKHIsbikrUlMocixpKX1jbGFzcyBHZiBleHRlbmRzIGNpe2NvbnN0cnVjdG9yKHQ9bmV3IHEsZT1uZXcgcSxuPW5ldyBxLGk9bmV3IHEpe3N1cGVyKCksdGhpcy5pc0N1YmljQmV6aWVyQ3VydmU9ITAsdGhpcy50eXBlPSJDdWJpY0JlemllckN1cnZlIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9bix0aGlzLnYzPWl9Z2V0UG9pbnQodCxlPW5ldyBxKXtjb25zdCBuPWUsaT10aGlzLnYwLHM9dGhpcy52MSxvPXRoaXMudjIsYT10aGlzLnYzO3JldHVybiBuLnNldChoYSh0LGkueCxzLngsby54LGEueCksaGEodCxpLnkscy55LG8ueSxhLnkpKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpcy52My5jb3B5KHQudjMpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MD10aGlzLnYwLnRvQXJyYXkoKSx0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdC52Mz10aGlzLnYzLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzLnYzLmZyb21BcnJheSh0LnYzKSx0aGlzfX1jbGFzcyBLZyBleHRlbmRzIGNpe2NvbnN0cnVjdG9yKHQ9bmV3IEksZT1uZXcgSSxuPW5ldyBJLGk9bmV3IEkpe3N1cGVyKCksdGhpcy5pc0N1YmljQmV6aWVyQ3VydmUzPSEwLHRoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1uLHRoaXMudjM9aX1nZXRQb2ludCh0LGU9bmV3IEkpe2NvbnN0IG49ZSxpPXRoaXMudjAscz10aGlzLnYxLG89dGhpcy52MixhPXRoaXMudjM7cmV0dXJuIG4uc2V0KGhhKHQsaS54LHMueCxvLngsYS54KSxoYSh0LGkueSxzLnksby55LGEueSksaGEodCxpLnoscy56LG8ueixhLnopKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpcy52My5jb3B5KHQudjMpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MD10aGlzLnYwLnRvQXJyYXkoKSx0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdC52Mz10aGlzLnYzLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzLnYzLmZyb21BcnJheSh0LnYzKSx0aGlzfX1jbGFzcyBIZiBleHRlbmRzIGNpe2NvbnN0cnVjdG9yKHQ9bmV3IHEsZT1uZXcgcSl7c3VwZXIoKSx0aGlzLmlzTGluZUN1cnZlPSEwLHRoaXMudHlwZT0iTGluZUN1cnZlIix0aGlzLnYxPXQsdGhpcy52Mj1lfWdldFBvaW50KHQsZT1uZXcgcSl7Y29uc3Qgbj1lO3JldHVybiB0PT09MT9uLmNvcHkodGhpcy52Mik6KG4uY29weSh0aGlzLnYyKS5zdWIodGhpcy52MSksbi5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy52MSkpLG59Z2V0UG9pbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFBvaW50KHQsZSl9Z2V0VGFuZ2VudCh0LGU9bmV3IHEpe3JldHVybiBlLnN1YlZlY3RvcnModGhpcy52Mix0aGlzLnYxKS5ub3JtYWxpemUoKX1nZXRUYW5nZW50QXQodCxlKXtyZXR1cm4gdGhpcy5nZXRUYW5nZW50KHQsZSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fWNsYXNzIGpnIGV4dGVuZHMgY2l7Y29uc3RydWN0b3IodD1uZXcgSSxlPW5ldyBJKXtzdXBlcigpLHRoaXMuaXNMaW5lQ3VydmUzPSEwLHRoaXMudHlwZT0iTGluZUN1cnZlMyIsdGhpcy52MT10LHRoaXMudjI9ZX1nZXRQb2ludCh0LGU9bmV3IEkpe2NvbnN0IG49ZTtyZXR1cm4gdD09PTE/bi5jb3B5KHRoaXMudjIpOihuLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLG4ubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMudjEpKSxufWdldFBvaW50QXQodCxlKXtyZXR1cm4gdGhpcy5nZXRQb2ludCh0LGUpfWdldFRhbmdlbnQodCxlPW5ldyBJKXtyZXR1cm4gZS5zdWJWZWN0b3JzKHRoaXMudjIsdGhpcy52MSkubm9ybWFsaXplKCl9Z2V0VGFuZ2VudEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCh0LGUpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBXZiBleHRlbmRzIGNpe2NvbnN0cnVjdG9yKHQ9bmV3IHEsZT1uZXcgcSxuPW5ldyBxKXtzdXBlcigpLHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZT0hMCx0aGlzLnR5cGU9IlF1YWRyYXRpY0JlemllckN1cnZlIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9bn1nZXRQb2ludCh0LGU9bmV3IHEpe2NvbnN0IG49ZSxpPXRoaXMudjAscz10aGlzLnYxLG89dGhpcy52MjtyZXR1cm4gbi5zZXQodWEodCxpLngscy54LG8ueCksdWEodCxpLnkscy55LG8ueSkpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fWNsYXNzIFhmIGV4dGVuZHMgY2l7Y29uc3RydWN0b3IodD1uZXcgSSxlPW5ldyBJLG49bmV3IEkpe3N1cGVyKCksdGhpcy5pc1F1YWRyYXRpY0JlemllckN1cnZlMz0hMCx0aGlzLnR5cGU9IlF1YWRyYXRpY0JlemllckN1cnZlMyIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW59Z2V0UG9pbnQodCxlPW5ldyBJKXtjb25zdCBuPWUsaT10aGlzLnYwLHM9dGhpcy52MSxvPXRoaXMudjI7cmV0dXJuIG4uc2V0KHVhKHQsaS54LHMueCxvLngpLHVhKHQsaS55LHMueSxvLnkpLHVhKHQsaS56LHMueixvLnopKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyAkZiBleHRlbmRzIGNpe2NvbnN0cnVjdG9yKHQ9W10pe3N1cGVyKCksdGhpcy5pc1NwbGluZUN1cnZlPSEwLHRoaXMudHlwZT0iU3BsaW5lQ3VydmUiLHRoaXMucG9pbnRzPXR9Z2V0UG9pbnQodCxlPW5ldyBxKXtjb25zdCBuPWUsaT10aGlzLnBvaW50cyxzPShpLmxlbmd0aC0xKSp0LG89TWF0aC5mbG9vcihzKSxhPXMtbyxjPWlbbz09PTA/bzpvLTFdLGw9aVtvXSx1PWlbbz5pLmxlbmd0aC0yP2kubGVuZ3RoLTE6bysxXSxoPWlbbz5pLmxlbmd0aC0zP2kubGVuZ3RoLTE6bysyXTtyZXR1cm4gbi5zZXQoSmcoYSxjLngsbC54LHUueCxoLngpLEpnKGEsYy55LGwueSx1LnksaC55KSksbn1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10LnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3QgaT10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKGkuY2xvbmUoKSl9cmV0dXJuIHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXRoaXMucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBpPXRoaXMucG9pbnRzW2VdO3QucG9pbnRzLnB1c2goaS50b0FycmF5KCkpfXJldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IGk9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChuZXcgcSgpLmZyb21BcnJheShpKSl9cmV0dXJuIHRoaXN9fXZhciAkbD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxBcmNDdXJ2ZTpZZyxDYXRtdWxsUm9tQ3VydmUzOlpnLEN1YmljQmV6aWVyQ3VydmU6R2YsQ3ViaWNCZXppZXJDdXJ2ZTM6S2csRWxsaXBzZUN1cnZlOldsLExpbmVDdXJ2ZTpIZixMaW5lQ3VydmUzOmpnLFF1YWRyYXRpY0JlemllckN1cnZlOldmLFF1YWRyYXRpY0JlemllckN1cnZlMzpYZixTcGxpbmVDdXJ2ZTokZn0pO2NsYXNzIFFnIGV4dGVuZHMgY2l7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iQ3VydmVQYXRoIix0aGlzLmN1cnZlcz1bXSx0aGlzLmF1dG9DbG9zZT0hMX1hZGQodCl7dGhpcy5jdXJ2ZXMucHVzaCh0KX1jbG9zZVBhdGgoKXtjb25zdCB0PXRoaXMuY3VydmVzWzBdLmdldFBvaW50KDApLGU9dGhpcy5jdXJ2ZXNbdGhpcy5jdXJ2ZXMubGVuZ3RoLTFdLmdldFBvaW50KDEpO2lmKCF0LmVxdWFscyhlKSl7Y29uc3Qgbj10LmlzVmVjdG9yMj09PSEwPyJMaW5lQ3VydmUiOiJMaW5lQ3VydmUzIjt0aGlzLmN1cnZlcy5wdXNoKG5ldyAkbFtuXShlLHQpKX1yZXR1cm4gdGhpc31nZXRQb2ludCh0LGUpe2NvbnN0IG49dCp0aGlzLmdldExlbmd0aCgpLGk9dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtsZXQgcz0wO2Zvcig7czxpLmxlbmd0aDspe2lmKGlbc10+PW4pe2NvbnN0IG89aVtzXS1uLGE9dGhpcy5jdXJ2ZXNbc10sYz1hLmdldExlbmd0aCgpLGw9Yz09PTA/MDoxLW8vYztyZXR1cm4gYS5nZXRQb2ludEF0KGwsZSl9cysrfXJldHVybiBudWxsfWdldExlbmd0aCgpe2NvbnN0IHQ9dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtyZXR1cm4gdFt0Lmxlbmd0aC0xXX11cGRhdGVBcmNMZW5ndGhzKCl7dGhpcy5uZWVkc1VwZGF0ZT0hMCx0aGlzLmNhY2hlTGVuZ3Rocz1udWxsLHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCl9Z2V0Q3VydmVMZW5ndGhzKCl7aWYodGhpcy5jYWNoZUxlbmd0aHMmJnRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aD09PXRoaXMuY3VydmVzLmxlbmd0aClyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7Y29uc3QgdD1bXTtsZXQgZT0wO2ZvcihsZXQgbj0wLGk9dGhpcy5jdXJ2ZXMubGVuZ3RoO248aTtuKyspZSs9dGhpcy5jdXJ2ZXNbbl0uZ2V0TGVuZ3RoKCksdC5wdXNoKGUpO3JldHVybiB0aGlzLmNhY2hlTGVuZ3Rocz10LHR9Z2V0U3BhY2VkUG9pbnRzKHQ9NDApe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnQobi90KSk7cmV0dXJuIHRoaXMuYXV0b0Nsb3NlJiZlLnB1c2goZVswXSksZX1nZXRQb2ludHModD0xMil7Y29uc3QgZT1bXTtsZXQgbjtmb3IobGV0IGk9MCxzPXRoaXMuY3VydmVzO2k8cy5sZW5ndGg7aSsrKXtjb25zdCBvPXNbaV0sYT1vLmlzRWxsaXBzZUN1cnZlP3QqMjpvLmlzTGluZUN1cnZlfHxvLmlzTGluZUN1cnZlMz8xOm8uaXNTcGxpbmVDdXJ2ZT90Km8ucG9pbnRzLmxlbmd0aDp0LGM9by5nZXRQb2ludHMoYSk7Zm9yKGxldCBsPTA7bDxjLmxlbmd0aDtsKyspe2NvbnN0IHU9Y1tsXTtuJiZuLmVxdWFscyh1KXx8KGUucHVzaCh1KSxuPXUpfX1yZXR1cm4gdGhpcy5hdXRvQ2xvc2UmJmUubGVuZ3RoPjEmJiFlW2UubGVuZ3RoLTFdLmVxdWFscyhlWzBdKSYmZS5wdXNoKGVbMF0pLGV9Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMuY3VydmVzPVtdO2ZvcihsZXQgZT0wLG49dC5jdXJ2ZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IGk9dC5jdXJ2ZXNbZV07dGhpcy5jdXJ2ZXMucHVzaChpLmNsb25lKCkpfXJldHVybiB0aGlzLmF1dG9DbG9zZT10LmF1dG9DbG9zZSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5hdXRvQ2xvc2U9dGhpcy5hdXRvQ2xvc2UsdC5jdXJ2ZXM9W107Zm9yKGxldCBlPTAsbj10aGlzLmN1cnZlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3QgaT10aGlzLmN1cnZlc1tlXTt0LmN1cnZlcy5wdXNoKGkudG9KU09OKCkpfXJldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMuYXV0b0Nsb3NlPXQuYXV0b0Nsb3NlLHRoaXMuY3VydmVzPVtdO2ZvcihsZXQgZT0wLG49dC5jdXJ2ZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IGk9dC5jdXJ2ZXNbZV07dGhpcy5jdXJ2ZXMucHVzaChuZXcgJGxbaS50eXBlXSgpLmZyb21KU09OKGkpKX1yZXR1cm4gdGhpc319bGV0IHFsPWNsYXNzIGV4dGVuZHMgUWd7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IlBhdGgiLHRoaXMuY3VycmVudFBvaW50PW5ldyBxLHQmJnRoaXMuc2V0RnJvbVBvaW50cyh0KX1zZXRGcm9tUG9pbnRzKHQpe3RoaXMubW92ZVRvKHRbMF0ueCx0WzBdLnkpO2ZvcihsZXQgZT0xLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmxpbmVUbyh0W2VdLngsdFtlXS55KTtyZXR1cm4gdGhpc31tb3ZlVG8odCxlKXtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuc2V0KHQsZSksdGhpc31saW5lVG8odCxlKXtjb25zdCBuPW5ldyBIZih0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBxKHQsZSkpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKG4pLHRoaXMuY3VycmVudFBvaW50LnNldCh0LGUpLHRoaXN9cXVhZHJhdGljQ3VydmVUbyh0LGUsbixpKXtjb25zdCBzPW5ldyBXZih0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBxKHQsZSksbmV3IHEobixpKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2gocyksdGhpcy5jdXJyZW50UG9pbnQuc2V0KG4saSksdGhpc31iZXppZXJDdXJ2ZVRvKHQsZSxuLGkscyxvKXtjb25zdCBhPW5ldyBHZih0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBxKHQsZSksbmV3IHEobixpKSxuZXcgcShzLG8pKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChhKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQocyxvKSx0aGlzfXNwbGluZVRocnUodCl7Y29uc3QgZT1bdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKV0uY29uY2F0KHQpLG49bmV3ICRmKGUpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKG4pLHRoaXMuY3VycmVudFBvaW50LmNvcHkodFt0Lmxlbmd0aC0xXSksdGhpc31hcmModCxlLG4saSxzLG8pe2NvbnN0IGE9dGhpcy5jdXJyZW50UG9pbnQueCxjPXRoaXMuY3VycmVudFBvaW50Lnk7cmV0dXJuIHRoaXMuYWJzYXJjKHQrYSxlK2MsbixpLHMsbyksdGhpc31hYnNhcmModCxlLG4saSxzLG8pe3JldHVybiB0aGlzLmFic2VsbGlwc2UodCxlLG4sbixpLHMsbyksdGhpc31lbGxpcHNlKHQsZSxuLGkscyxvLGEsYyl7Y29uc3QgbD10aGlzLmN1cnJlbnRQb2ludC54LHU9dGhpcy5jdXJyZW50UG9pbnQueTtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKHQrbCxlK3UsbixpLHMsbyxhLGMpLHRoaXN9YWJzZWxsaXBzZSh0LGUsbixpLHMsbyxhLGMpe2NvbnN0IGw9bmV3IFdsKHQsZSxuLGkscyxvLGEsYyk7aWYodGhpcy5jdXJ2ZXMubGVuZ3RoPjApe2NvbnN0IGg9bC5nZXRQb2ludCgwKTtoLmVxdWFscyh0aGlzLmN1cnJlbnRQb2ludCl8fHRoaXMubGluZVRvKGgueCxoLnkpfXRoaXMuY3VydmVzLnB1c2gobCk7Y29uc3QgdT1sLmdldFBvaW50KDEpO3JldHVybiB0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHUpLHRoaXN9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHQuY3VycmVudFBvaW50KSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQuY3VycmVudFBvaW50PXRoaXMuY3VycmVudFBvaW50LnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLmN1cnJlbnRQb2ludC5mcm9tQXJyYXkodC5jdXJyZW50UG9pbnQpLHRoaXN9fTtjbGFzcyBWaSBleHRlbmRzIHFse2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMudXVpZD1MbigpLHRoaXMudHlwZT0iU2hhcGUiLHRoaXMuaG9sZXM9W119Z2V0UG9pbnRzSG9sZXModCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxpPXRoaXMuaG9sZXMubGVuZ3RoO248aTtuKyspZVtuXT10aGlzLmhvbGVzW25dLmdldFBvaW50cyh0KTtyZXR1cm4gZX1leHRyYWN0UG9pbnRzKHQpe3JldHVybntzaGFwZTp0aGlzLmdldFBvaW50cyh0KSxob2xlczp0aGlzLmdldFBvaW50c0hvbGVzKHQpfX1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXQuaG9sZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IGk9dC5ob2xlc1tlXTt0aGlzLmhvbGVzLnB1c2goaS5jbG9uZSgpKX1yZXR1cm4gdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QudXVpZD10aGlzLnV1aWQsdC5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXRoaXMuaG9sZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IGk9dGhpcy5ob2xlc1tlXTt0LmhvbGVzLnB1c2goaS50b0pTT04oKSl9cmV0dXJuIHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy51dWlkPXQudXVpZCx0aGlzLmhvbGVzPVtdO2ZvcihsZXQgZT0wLG49dC5ob2xlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3QgaT10LmhvbGVzW2VdO3RoaXMuaG9sZXMucHVzaChuZXcgcWwoKS5mcm9tSlNPTihpKSl9cmV0dXJuIHRoaXN9fWZ1bmN0aW9uIElTKHIsdCxlPTIpe2NvbnN0IG49dCYmdC5sZW5ndGgsaT1uP3RbMF0qZTpyLmxlbmd0aDtsZXQgcz10MChyLDAsaSxlLCEwKTtjb25zdCBvPVtdO2lmKCFzfHxzLm5leHQ9PT1zLnByZXYpcmV0dXJuIG87bGV0IGEsYyxsO2lmKG4mJihzPU5TKHIsdCxzLGUpKSxyLmxlbmd0aD44MCplKXthPTEvMCxjPTEvMDtsZXQgdT0tMS8wLGg9LTEvMDtmb3IobGV0IGY9ZTtmPGk7Zis9ZSl7Y29uc3QgZD1yW2ZdLHA9cltmKzFdO2Q8YSYmKGE9ZCkscDxjJiYoYz1wKSxkPnUmJih1PWQpLHA+aCYmKGg9cCl9bD1NYXRoLm1heCh1LWEsaC1jKSxsPWwhPT0wPzMyNzY3L2w6MH1yZXR1cm4gZmEocyxvLGUsYSxjLGwsMCksb31mdW5jdGlvbiB0MChyLHQsZSxuLGkpe2xldCBzO2lmKGk9PT0kUyhyLHQsZSxuKT4wKWZvcihsZXQgbz10O288ZTtvKz1uKXM9cjAoby9ufDAscltvXSxyW28rMV0scyk7ZWxzZSBmb3IobGV0IG89ZS1uO28+PXQ7by09bilzPXIwKG8vbnwwLHJbb10scltvKzFdLHMpO3JldHVybiBzJiZ0byhzLHMubmV4dCkmJihtYShzKSxzPXMubmV4dCksc31mdW5jdGlvbiBXcihyLHQpe2lmKCFyKXJldHVybiByO3R8fCh0PXIpO2xldCBlPXIsbjtkbyBpZihuPSExLCFlLnN0ZWluZXImJih0byhlLGUubmV4dCl8fFNlKGUucHJldixlLGUubmV4dCk9PT0wKSl7aWYobWEoZSksZT10PWUucHJldixlPT09ZS5uZXh0KWJyZWFrO249ITB9ZWxzZSBlPWUubmV4dDt3aGlsZShufHxlIT09dCk7cmV0dXJuIHR9ZnVuY3Rpb24gZmEocix0LGUsbixpLHMsbyl7aWYoIXIpcmV0dXJuOyFvJiZzJiZrUyhyLG4saSxzKTtsZXQgYT1yO2Zvcig7ci5wcmV2IT09ci5uZXh0Oyl7Y29uc3QgYz1yLnByZXYsbD1yLm5leHQ7aWYocz9MUyhyLG4saSxzKTpQUyhyKSl7dC5wdXNoKGMuaSxyLmksbC5pKSxtYShyKSxyPWwubmV4dCxhPWwubmV4dDtjb250aW51ZX1pZihyPWwscj09PWEpe28/bz09PTE/KHI9RFMoV3IociksdCksZmEocix0LGUsbixpLHMsMikpOm89PT0yJiZVUyhyLHQsZSxuLGkscyk6ZmEoV3IociksdCxlLG4saSxzLDEpO2JyZWFrfX19ZnVuY3Rpb24gUFMocil7Y29uc3QgdD1yLnByZXYsZT1yLG49ci5uZXh0O2lmKFNlKHQsZSxuKT49MClyZXR1cm4hMTtjb25zdCBpPXQueCxzPWUueCxvPW4ueCxhPXQueSxjPWUueSxsPW4ueSx1PU1hdGgubWluKGkscyxvKSxoPU1hdGgubWluKGEsYyxsKSxmPU1hdGgubWF4KGkscyxvKSxkPU1hdGgubWF4KGEsYyxsKTtsZXQgcD1uLm5leHQ7Zm9yKDtwIT09dDspe2lmKHAueD49dSYmcC54PD1mJiZwLnk+PWgmJnAueTw9ZCYmZGEoaSxhLHMsYyxvLGwscC54LHAueSkmJlNlKHAucHJldixwLHAubmV4dCk+PTApcmV0dXJuITE7cD1wLm5leHR9cmV0dXJuITB9ZnVuY3Rpb24gTFMocix0LGUsbil7Y29uc3QgaT1yLnByZXYscz1yLG89ci5uZXh0O2lmKFNlKGkscyxvKT49MClyZXR1cm4hMTtjb25zdCBhPWkueCxjPXMueCxsPW8ueCx1PWkueSxoPXMueSxmPW8ueSxkPU1hdGgubWluKGEsYyxsKSxwPU1hdGgubWluKHUsaCxmKSx4PU1hdGgubWF4KGEsYyxsKSxnPU1hdGgubWF4KHUsaCxmKSxtPXFmKGQscCx0LGUsbiksdj1xZih4LGcsdCxlLG4pO2xldCB5PXIucHJldlosXz1yLm5leHRaO2Zvcig7eSYmeS56Pj1tJiZfJiZfLno8PXY7KXtpZih5Lng+PWQmJnkueDw9eCYmeS55Pj1wJiZ5Lnk8PWcmJnkhPT1pJiZ5IT09byYmZGEoYSx1LGMsaCxsLGYseS54LHkueSkmJlNlKHkucHJldix5LHkubmV4dCk+PTB8fCh5PXkucHJldlosXy54Pj1kJiZfLng8PXgmJl8ueT49cCYmXy55PD1nJiZfIT09aSYmXyE9PW8mJmRhKGEsdSxjLGgsbCxmLF8ueCxfLnkpJiZTZShfLnByZXYsXyxfLm5leHQpPj0wKSlyZXR1cm4hMTtfPV8ubmV4dFp9Zm9yKDt5JiZ5Lno+PW07KXtpZih5Lng+PWQmJnkueDw9eCYmeS55Pj1wJiZ5Lnk8PWcmJnkhPT1pJiZ5IT09byYmZGEoYSx1LGMsaCxsLGYseS54LHkueSkmJlNlKHkucHJldix5LHkubmV4dCk+PTApcmV0dXJuITE7eT15LnByZXZafWZvcig7XyYmXy56PD12Oyl7aWYoXy54Pj1kJiZfLng8PXgmJl8ueT49cCYmXy55PD1nJiZfIT09aSYmXyE9PW8mJmRhKGEsdSxjLGgsbCxmLF8ueCxfLnkpJiZTZShfLnByZXYsXyxfLm5leHQpPj0wKXJldHVybiExO189Xy5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiBEUyhyLHQpe2xldCBlPXI7ZG97Y29uc3Qgbj1lLnByZXYsaT1lLm5leHQubmV4dDshdG8obixpKSYmbjAobixlLGUubmV4dCxpKSYmcGEobixpKSYmcGEoaSxuKSYmKHQucHVzaChuLmksZS5pLGkuaSksbWEoZSksbWEoZS5uZXh0KSxlPXI9aSksZT1lLm5leHR9d2hpbGUoZSE9PXIpO3JldHVybiBXcihlKX1mdW5jdGlvbiBVUyhyLHQsZSxuLGkscyl7bGV0IG89cjtkb3tsZXQgYT1vLm5leHQubmV4dDtmb3IoO2EhPT1vLnByZXY7KXtpZihvLmkhPT1hLmkmJkhTKG8sYSkpe2xldCBjPWkwKG8sYSk7bz1XcihvLG8ubmV4dCksYz1XcihjLGMubmV4dCksZmEobyx0LGUsbixpLHMsMCksZmEoYyx0LGUsbixpLHMsMCk7cmV0dXJufWE9YS5uZXh0fW89by5uZXh0fXdoaWxlKG8hPT1yKX1mdW5jdGlvbiBOUyhyLHQsZSxuKXtjb25zdCBpPVtdO2ZvcihsZXQgcz0wLG89dC5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT10W3NdKm4sYz1zPG8tMT90W3MrMV0qbjpyLmxlbmd0aCxsPXQwKHIsYSxjLG4sITEpO2w9PT1sLm5leHQmJihsLnN0ZWluZXI9ITApLGkucHVzaChHUyhsKSl9aS5zb3J0KEZTKTtmb3IobGV0IHM9MDtzPGkubGVuZ3RoO3MrKyllPUJTKGlbc10sZSk7cmV0dXJuIGV9ZnVuY3Rpb24gRlMocix0KXtsZXQgZT1yLngtdC54O2lmKGU9PT0wJiYoZT1yLnktdC55LGU9PT0wKSl7Y29uc3Qgbj0oci5uZXh0Lnktci55KS8oci5uZXh0Lngtci54KSxpPSh0Lm5leHQueS10LnkpLyh0Lm5leHQueC10LngpO2U9bi1pfXJldHVybiBlfWZ1bmN0aW9uIEJTKHIsdCl7Y29uc3QgZT1PUyhyLHQpO2lmKCFlKXJldHVybiB0O2NvbnN0IG49aTAoZSxyKTtyZXR1cm4gV3IobixuLm5leHQpLFdyKGUsZS5uZXh0KX1mdW5jdGlvbiBPUyhyLHQpe2xldCBlPXQ7Y29uc3Qgbj1yLngsaT1yLnk7bGV0IHM9LTEvMCxvO2lmKHRvKHIsZSkpcmV0dXJuIGU7ZG97aWYodG8ocixlLm5leHQpKXJldHVybiBlLm5leHQ7aWYoaTw9ZS55JiZpPj1lLm5leHQueSYmZS5uZXh0LnkhPT1lLnkpe2NvbnN0IGg9ZS54KyhpLWUueSkqKGUubmV4dC54LWUueCkvKGUubmV4dC55LWUueSk7aWYoaDw9biYmaD5zJiYocz1oLG89ZS54PGUubmV4dC54P2U6ZS5uZXh0LGg9PT1uKSlyZXR1cm4gb31lPWUubmV4dH13aGlsZShlIT09dCk7aWYoIW8pcmV0dXJuIG51bGw7Y29uc3QgYT1vLGM9by54LGw9by55O2xldCB1PTEvMDtlPW87ZG97aWYobj49ZS54JiZlLng+PWMmJm4hPT1lLngmJmUwKGk8bD9uOnMsaSxjLGwsaTxsP3M6bixpLGUueCxlLnkpKXtjb25zdCBoPU1hdGguYWJzKGktZS55KS8obi1lLngpO3BhKGUscikmJihoPHV8fGg9PT11JiYoZS54Pm8ueHx8ZS54PT09by54JiZ6UyhvLGUpKSkmJihvPWUsdT1oKX1lPWUubmV4dH13aGlsZShlIT09YSk7cmV0dXJuIG99ZnVuY3Rpb24gelMocix0KXtyZXR1cm4gU2Uoci5wcmV2LHIsdC5wcmV2KTwwJiZTZSh0Lm5leHQscixyLm5leHQpPDB9ZnVuY3Rpb24ga1Mocix0LGUsbil7bGV0IGk9cjtkbyBpLno9PT0wJiYoaS56PXFmKGkueCxpLnksdCxlLG4pKSxpLnByZXZaPWkucHJldixpLm5leHRaPWkubmV4dCxpPWkubmV4dDt3aGlsZShpIT09cik7aS5wcmV2Wi5uZXh0Wj1udWxsLGkucHJldlo9bnVsbCxWUyhpKX1mdW5jdGlvbiBWUyhyKXtsZXQgdCxlPTE7ZG97bGV0IG49cixpO3I9bnVsbDtsZXQgcz1udWxsO2Zvcih0PTA7bjspe3QrKztsZXQgbz1uLGE9MDtmb3IobGV0IGw9MDtsPGUmJihhKyssbz1vLm5leHRaLCEhbyk7bCsrKTtsZXQgYz1lO2Zvcig7YT4wfHxjPjAmJm87KWEhPT0wJiYoYz09PTB8fCFvfHxuLno8PW8ueik/KGk9bixuPW4ubmV4dFosYS0tKTooaT1vLG89by5uZXh0WixjLS0pLHM/cy5uZXh0Wj1pOnI9aSxpLnByZXZaPXMscz1pO249b31zLm5leHRaPW51bGwsZSo9Mn13aGlsZSh0PjEpO3JldHVybiByfWZ1bmN0aW9uIHFmKHIsdCxlLG4saSl7cmV0dXJuIHI9KHItZSkqaXwwLHQ9KHQtbikqaXwwLHI9KHJ8cjw8OCkmMTY3MTE5MzUscj0ocnxyPDw0KSYyNTI2NDUxMzUscj0ocnxyPDwyKSY4NTg5OTM0NTkscj0ocnxyPDwxKSYxNDMxNjU1NzY1LHQ9KHR8dDw8OCkmMTY3MTE5MzUsdD0odHx0PDw0KSYyNTI2NDUxMzUsdD0odHx0PDwyKSY4NTg5OTM0NTksdD0odHx0PDwxKSYxNDMxNjU1NzY1LHJ8dDw8MX1mdW5jdGlvbiBHUyhyKXtsZXQgdD1yLGU9cjtkbyh0Lng8ZS54fHx0Lng9PT1lLngmJnQueTxlLnkpJiYoZT10KSx0PXQubmV4dDt3aGlsZSh0IT09cik7cmV0dXJuIGV9ZnVuY3Rpb24gZTAocix0LGUsbixpLHMsbyxhKXtyZXR1cm4oaS1vKSoodC1hKT49KHItbykqKHMtYSkmJihyLW8pKihuLWEpPj0oZS1vKSoodC1hKSYmKGUtbykqKHMtYSk+PShpLW8pKihuLWEpfWZ1bmN0aW9uIGRhKHIsdCxlLG4saSxzLG8sYSl7cmV0dXJuIShyPT09byYmdD09PWEpJiZlMChyLHQsZSxuLGkscyxvLGEpfWZ1bmN0aW9uIEhTKHIsdCl7cmV0dXJuIHIubmV4dC5pIT09dC5pJiZyLnByZXYuaSE9PXQuaSYmIVdTKHIsdCkmJihwYShyLHQpJiZwYSh0LHIpJiZYUyhyLHQpJiYoU2Uoci5wcmV2LHIsdC5wcmV2KXx8U2Uocix0LnByZXYsdCkpfHx0byhyLHQpJiZTZShyLnByZXYscixyLm5leHQpPjAmJlNlKHQucHJldix0LHQubmV4dCk+MCl9ZnVuY3Rpb24gU2Uocix0LGUpe3JldHVybih0Lnktci55KSooZS54LXQueCktKHQueC1yLngpKihlLnktdC55KX1mdW5jdGlvbiB0byhyLHQpe3JldHVybiByLng9PT10LngmJnIueT09PXQueX1mdW5jdGlvbiBuMChyLHQsZSxuKXtjb25zdCBpPVpsKFNlKHIsdCxlKSkscz1abChTZShyLHQsbikpLG89WmwoU2UoZSxuLHIpKSxhPVpsKFNlKGUsbix0KSk7cmV0dXJuISEoaSE9PXMmJm8hPT1hfHxpPT09MCYmWWwocixlLHQpfHxzPT09MCYmWWwocixuLHQpfHxvPT09MCYmWWwoZSxyLG4pfHxhPT09MCYmWWwoZSx0LG4pKX1mdW5jdGlvbiBZbChyLHQsZSl7cmV0dXJuIHQueDw9TWF0aC5tYXgoci54LGUueCkmJnQueD49TWF0aC5taW4oci54LGUueCkmJnQueTw9TWF0aC5tYXgoci55LGUueSkmJnQueT49TWF0aC5taW4oci55LGUueSl9ZnVuY3Rpb24gWmwocil7cmV0dXJuIHI+MD8xOnI8MD8tMTowfWZ1bmN0aW9uIFdTKHIsdCl7bGV0IGU9cjtkb3tpZihlLmkhPT1yLmkmJmUubmV4dC5pIT09ci5pJiZlLmkhPT10LmkmJmUubmV4dC5pIT09dC5pJiZuMChlLGUubmV4dCxyLHQpKXJldHVybiEwO2U9ZS5uZXh0fXdoaWxlKGUhPT1yKTtyZXR1cm4hMX1mdW5jdGlvbiBwYShyLHQpe3JldHVybiBTZShyLnByZXYscixyLm5leHQpPDA/U2Uocix0LHIubmV4dCk+PTAmJlNlKHIsci5wcmV2LHQpPj0wOlNlKHIsdCxyLnByZXYpPDB8fFNlKHIsci5uZXh0LHQpPDB9ZnVuY3Rpb24gWFMocix0KXtsZXQgZT1yLG49ITE7Y29uc3QgaT0oci54K3QueCkvMixzPShyLnkrdC55KS8yO2RvIGUueT5zIT1lLm5leHQueT5zJiZlLm5leHQueSE9PWUueSYmaTwoZS5uZXh0LngtZS54KSoocy1lLnkpLyhlLm5leHQueS1lLnkpK2UueCYmKG49IW4pLGU9ZS5uZXh0O3doaWxlKGUhPT1yKTtyZXR1cm4gbn1mdW5jdGlvbiBpMChyLHQpe2NvbnN0IGU9WWYoci5pLHIueCxyLnkpLG49WWYodC5pLHQueCx0LnkpLGk9ci5uZXh0LHM9dC5wcmV2O3JldHVybiByLm5leHQ9dCx0LnByZXY9cixlLm5leHQ9aSxpLnByZXY9ZSxuLm5leHQ9ZSxlLnByZXY9bixzLm5leHQ9bixuLnByZXY9cyxufWZ1bmN0aW9uIHIwKHIsdCxlLG4pe2NvbnN0IGk9WWYocix0LGUpO3JldHVybiBuPyhpLm5leHQ9bi5uZXh0LGkucHJldj1uLG4ubmV4dC5wcmV2PWksbi5uZXh0PWkpOihpLnByZXY9aSxpLm5leHQ9aSksaX1mdW5jdGlvbiBtYShyKXtyLm5leHQucHJldj1yLnByZXYsci5wcmV2Lm5leHQ9ci5uZXh0LHIucHJldlomJihyLnByZXZaLm5leHRaPXIubmV4dFopLHIubmV4dFomJihyLm5leHRaLnByZXZaPXIucHJldlopfWZ1bmN0aW9uIFlmKHIsdCxlKXtyZXR1cm57aTpyLHg6dCx5OmUscHJldjpudWxsLG5leHQ6bnVsbCx6OjAscHJldlo6bnVsbCxuZXh0WjpudWxsLHN0ZWluZXI6ITF9fWZ1bmN0aW9uICRTKHIsdCxlLG4pe2xldCBpPTA7Zm9yKGxldCBzPXQsbz1lLW47czxlO3MrPW4paSs9KHJbb10tcltzXSkqKHJbcysxXStyW28rMV0pLG89cztyZXR1cm4gaX1jbGFzcyBxU3tzdGF0aWMgdHJpYW5ndWxhdGUodCxlLG49Mil7cmV0dXJuIElTKHQsZSxuKX19Y2xhc3MgY257c3RhdGljIGFyZWEodCl7Y29uc3QgZT10Lmxlbmd0aDtsZXQgbj0wO2ZvcihsZXQgaT1lLTEscz0wO3M8ZTtpPXMrKyluKz10W2ldLngqdFtzXS55LXRbc10ueCp0W2ldLnk7cmV0dXJuIG4qLjV9c3RhdGljIGlzQ2xvY2tXaXNlKHQpe3JldHVybiBjbi5hcmVhKHQpPDB9c3RhdGljIHRyaWFuZ3VsYXRlU2hhcGUodCxlKXtjb25zdCBuPVtdLGk9W10scz1bXTtzMCh0KSxvMChuLHQpO2xldCBvPXQubGVuZ3RoO2UuZm9yRWFjaChzMCk7Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDtjKyspaS5wdXNoKG8pLG8rPWVbY10ubGVuZ3RoLG8wKG4sZVtjXSk7Y29uc3QgYT1xUy50cmlhbmd1bGF0ZShuLGkpO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7Yys9MylzLnB1c2goYS5zbGljZShjLGMrMykpO3JldHVybiBzfX1mdW5jdGlvbiBzMChyKXtjb25zdCB0PXIubGVuZ3RoO3Q+MiYmclt0LTFdLmVxdWFscyhyWzBdKSYmci5wb3AoKX1mdW5jdGlvbiBvMChyLHQpe2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXIucHVzaCh0W2VdLngpLHIucHVzaCh0W2VdLnkpfWxldCBhMD1jbGFzcyBFdiBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9bmV3IFZpKFtuZXcgcSguNSwuNSksbmV3IHEoLS41LC41KSxuZXcgcSgtLjUsLS41KSxuZXcgcSguNSwtLjUpXSksZT17fSl7c3VwZXIoKSx0aGlzLnR5cGU9IkV4dHJ1ZGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6dCxvcHRpb25zOmV9LHQ9QXJyYXkuaXNBcnJheSh0KT90Olt0XTtjb25zdCBuPXRoaXMsaT1bXSxzPVtdO2ZvcihsZXQgYT0wLGM9dC5sZW5ndGg7YTxjO2ErKyl7Y29uc3QgbD10W2FdO28obCl9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgdnQoaSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgdnQocywyKSksdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO2Z1bmN0aW9uIG8oYSl7Y29uc3QgYz1bXSxsPWUuY3VydmVTZWdtZW50cyE9PXZvaWQgMD9lLmN1cnZlU2VnbWVudHM6MTIsdT1lLnN0ZXBzIT09dm9pZCAwP2Uuc3RlcHM6MSxoPWUuZGVwdGghPT12b2lkIDA/ZS5kZXB0aDoxO2xldCBmPWUuYmV2ZWxFbmFibGVkIT09dm9pZCAwP2UuYmV2ZWxFbmFibGVkOiEwLGQ9ZS5iZXZlbFRoaWNrbmVzcyE9PXZvaWQgMD9lLmJldmVsVGhpY2tuZXNzOi4yLHA9ZS5iZXZlbFNpemUhPT12b2lkIDA/ZS5iZXZlbFNpemU6ZC0uMSx4PWUuYmV2ZWxPZmZzZXQhPT12b2lkIDA/ZS5iZXZlbE9mZnNldDowLGc9ZS5iZXZlbFNlZ21lbnRzIT09dm9pZCAwP2UuYmV2ZWxTZWdtZW50czozO2NvbnN0IG09ZS5leHRydWRlUGF0aCx2PWUuVVZHZW5lcmF0b3IhPT12b2lkIDA/ZS5VVkdlbmVyYXRvcjpZUztsZXQgeSxfPSExLFMsdyxBLFQ7bSYmKHk9bS5nZXRTcGFjZWRQb2ludHModSksXz0hMCxmPSExLFM9bS5jb21wdXRlRnJlbmV0RnJhbWVzKHUsITEpLHc9bmV3IEksQT1uZXcgSSxUPW5ldyBJKSxmfHwoZz0wLGQ9MCxwPTAseD0wKTtjb25zdCBiPWEuZXh0cmFjdFBvaW50cyhsKTtsZXQgTT1iLnNoYXBlO2NvbnN0IEU9Yi5ob2xlcztpZighY24uaXNDbG9ja1dpc2UoTSkpe009TS5yZXZlcnNlKCk7Zm9yKGxldCBVPTAsbHQ9RS5sZW5ndGg7VTxsdDtVKyspe2NvbnN0IGV0PUVbVV07Y24uaXNDbG9ja1dpc2UoZXQpJiYoRVtVXT1ldC5yZXZlcnNlKCkpfX1mdW5jdGlvbiBMKFUpe2NvbnN0IGV0PTEwMDAwMDAwMDAwMDAwMDAxZS0zNjtsZXQgYXQ9VVswXTtmb3IobGV0IHR0PTE7dHQ8PVUubGVuZ3RoO3R0Kyspe2NvbnN0IEV0PXR0JVUubGVuZ3RoLFg9VVtFdF0sUj1YLngtYXQueCxDPVgueS1hdC55LEI9UipSK0MqQyxWPU1hdGgubWF4KE1hdGguYWJzKFgueCksTWF0aC5hYnMoWC55KSxNYXRoLmFicyhhdC54KSxNYXRoLmFicyhhdC55KSksSj1ldCpWKlY7aWYoQjw9Sil7VS5zcGxpY2UoRXQsMSksdHQtLTtjb250aW51ZX1hdD1YfX1MKE0pLEUuZm9yRWFjaChMKTtjb25zdCBGPUUubGVuZ3RoLE49TTtmb3IobGV0IFU9MDtVPEY7VSsrKXtjb25zdCBsdD1FW1VdO009TS5jb25jYXQobHQpfWZ1bmN0aW9uIE8oVSxsdCxldCl7cmV0dXJuIGx0fHxjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlR2VvbWV0cnk6IHZlYyBkb2VzIG5vdCBleGlzdCIpLFUuY2xvbmUoKS5hZGRTY2FsZWRWZWN0b3IobHQsZXQpfWNvbnN0IEg9TS5sZW5ndGg7ZnVuY3Rpb24geihVLGx0LGV0KXtsZXQgYXQsdHQsRXQ7Y29uc3QgWD1VLngtbHQueCxSPVUueS1sdC55LEM9ZXQueC1VLngsQj1ldC55LVUueSxWPVgqWCtSKlIsSj1YKkItUipDO2lmKE1hdGguYWJzKEopPk51bWJlci5FUFNJTE9OKXtjb25zdCAkPU1hdGguc3FydChWKSx1dD1NYXRoLnNxcnQoQypDK0IqQikscnQ9bHQueC1SLyQsbXQ9bHQueStYLyQsQXQ9ZXQueC1CL3V0LGl0PWV0LnkrQy91dCxodD0oKEF0LXJ0KSpCLShpdC1tdCkqQykvKFgqQi1SKkMpO2F0PXJ0K1gqaHQtVS54LHR0PW10K1IqaHQtVS55O2NvbnN0IEx0PWF0KmF0K3R0KnR0O2lmKEx0PD0yKXJldHVybiBuZXcgcShhdCx0dCk7RXQ9TWF0aC5zcXJ0KEx0LzIpfWVsc2V7bGV0ICQ9ITE7WD5OdW1iZXIuRVBTSUxPTj9DPk51bWJlci5FUFNJTE9OJiYoJD0hMCk6WDwtTnVtYmVyLkVQU0lMT04/QzwtTnVtYmVyLkVQU0lMT04mJigkPSEwKTpNYXRoLnNpZ24oUik9PT1NYXRoLnNpZ24oQikmJigkPSEwKSwkPyhhdD0tUix0dD1YLEV0PU1hdGguc3FydChWKSk6KGF0PVgsdHQ9UixFdD1NYXRoLnNxcnQoVi8yKSl9cmV0dXJuIG5ldyBxKGF0L0V0LHR0L0V0KX1jb25zdCBRPVtdO2ZvcihsZXQgVT0wLGx0PU4ubGVuZ3RoLGV0PWx0LTEsYXQ9VSsxO1U8bHQ7VSsrLGV0KyssYXQrKylldD09PWx0JiYoZXQ9MCksYXQ9PT1sdCYmKGF0PTApLFFbVV09eihOW1VdLE5bZXRdLE5bYXRdKTtjb25zdCBzdD1bXTtsZXQgZnQsUnQ9US5jb25jYXQoKTtmb3IobGV0IFU9MCxsdD1GO1U8bHQ7VSsrKXtjb25zdCBldD1FW1VdO2Z0PVtdO2ZvcihsZXQgYXQ9MCx0dD1ldC5sZW5ndGgsRXQ9dHQtMSxYPWF0KzE7YXQ8dHQ7YXQrKyxFdCsrLFgrKylFdD09PXR0JiYoRXQ9MCksWD09PXR0JiYoWD0wKSxmdFthdF09eihldFthdF0sZXRbRXRdLGV0W1hdKTtzdC5wdXNoKGZ0KSxSdD1SdC5jb25jYXQoZnQpfWxldCBGdDtpZihnPT09MClGdD1jbi50cmlhbmd1bGF0ZVNoYXBlKE4sRSk7ZWxzZXtjb25zdCBVPVtdLGx0PVtdO2ZvcihsZXQgZXQ9MDtldDxnO2V0Kyspe2NvbnN0IGF0PWV0L2csdHQ9ZCpNYXRoLmNvcyhhdCpNYXRoLlBJLzIpLEV0PXAqTWF0aC5zaW4oYXQqTWF0aC5QSS8yKSt4O2ZvcihsZXQgWD0wLFI9Ti5sZW5ndGg7WDxSO1grKyl7Y29uc3QgQz1PKE5bWF0sUVtYXSxFdCk7JHQoQy54LEMueSwtdHQpLGF0PT09MCYmVS5wdXNoKEMpfWZvcihsZXQgWD0wLFI9RjtYPFI7WCsrKXtjb25zdCBDPUVbWF07ZnQ9c3RbWF07Y29uc3QgQj1bXTtmb3IobGV0IFY9MCxKPUMubGVuZ3RoO1Y8SjtWKyspe2NvbnN0ICQ9TyhDW1ZdLGZ0W1ZdLEV0KTskdCgkLngsJC55LC10dCksYXQ9PT0wJiZCLnB1c2goJCl9YXQ9PT0wJiZsdC5wdXNoKEIpfX1GdD1jbi50cmlhbmd1bGF0ZVNoYXBlKFUsbHQpfWNvbnN0IEs9RnQubGVuZ3RoLG90PXAreDtmb3IobGV0IFU9MDtVPEg7VSsrKXtjb25zdCBsdD1mP08oTVtVXSxSdFtVXSxvdCk6TVtVXTtfPyhBLmNvcHkoUy5ub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihsdC54KSx3LmNvcHkoUy5iaW5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKGx0LnkpLFQuY29weSh5WzBdKS5hZGQoQSkuYWRkKHcpLCR0KFQueCxULnksVC56KSk6JHQobHQueCxsdC55LDApfWZvcihsZXQgVT0xO1U8PXU7VSsrKWZvcihsZXQgbHQ9MDtsdDxIO2x0Kyspe2NvbnN0IGV0PWY/TyhNW2x0XSxSdFtsdF0sb3QpOk1bbHRdO18/KEEuY29weShTLm5vcm1hbHNbVV0pLm11bHRpcGx5U2NhbGFyKGV0LngpLHcuY29weShTLmJpbm9ybWFsc1tVXSkubXVsdGlwbHlTY2FsYXIoZXQueSksVC5jb3B5KHlbVV0pLmFkZChBKS5hZGQodyksJHQoVC54LFQueSxULnopKTokdChldC54LGV0LnksaC91KlUpfWZvcihsZXQgVT1nLTE7VT49MDtVLS0pe2NvbnN0IGx0PVUvZyxldD1kKk1hdGguY29zKGx0Kk1hdGguUEkvMiksYXQ9cCpNYXRoLnNpbihsdCpNYXRoLlBJLzIpK3g7Zm9yKGxldCB0dD0wLEV0PU4ubGVuZ3RoO3R0PEV0O3R0Kyspe2NvbnN0IFg9TyhOW3R0XSxRW3R0XSxhdCk7JHQoWC54LFgueSxoK2V0KX1mb3IobGV0IHR0PTAsRXQ9RS5sZW5ndGg7dHQ8RXQ7dHQrKyl7Y29uc3QgWD1FW3R0XTtmdD1zdFt0dF07Zm9yKGxldCBSPTAsQz1YLmxlbmd0aDtSPEM7UisrKXtjb25zdCBCPU8oWFtSXSxmdFtSXSxhdCk7Xz8kdChCLngsQi55K3lbdS0xXS55LHlbdS0xXS54K2V0KTokdChCLngsQi55LGgrZXQpfX19TXQoKSxkdCgpO2Z1bmN0aW9uIE10KCl7Y29uc3QgVT1pLmxlbmd0aC8zO2lmKGYpe2xldCBsdD0wLGV0PUgqbHQ7Zm9yKGxldCBhdD0wO2F0PEs7YXQrKyl7Y29uc3QgdHQ9RnRbYXRdO1B0KHR0WzJdK2V0LHR0WzFdK2V0LHR0WzBdK2V0KX1sdD11K2cqMixldD1IKmx0O2ZvcihsZXQgYXQ9MDthdDxLO2F0Kyspe2NvbnN0IHR0PUZ0W2F0XTtQdCh0dFswXStldCx0dFsxXStldCx0dFsyXStldCl9fWVsc2V7Zm9yKGxldCBsdD0wO2x0PEs7bHQrKyl7Y29uc3QgZXQ9RnRbbHRdO1B0KGV0WzJdLGV0WzFdLGV0WzBdKX1mb3IobGV0IGx0PTA7bHQ8SztsdCsrKXtjb25zdCBldD1GdFtsdF07UHQoZXRbMF0rSCp1LGV0WzFdK0gqdSxldFsyXStIKnUpfX1uLmFkZEdyb3VwKFUsaS5sZW5ndGgvMy1VLDApfWZ1bmN0aW9uIGR0KCl7Y29uc3QgVT1pLmxlbmd0aC8zO2xldCBsdD0wO0l0KE4sbHQpLGx0Kz1OLmxlbmd0aDtmb3IobGV0IGV0PTAsYXQ9RS5sZW5ndGg7ZXQ8YXQ7ZXQrKyl7Y29uc3QgdHQ9RVtldF07SXQodHQsbHQpLGx0Kz10dC5sZW5ndGh9bi5hZGRHcm91cChVLGkubGVuZ3RoLzMtVSwxKX1mdW5jdGlvbiBJdChVLGx0KXtsZXQgZXQ9VS5sZW5ndGg7Zm9yKDstLWV0Pj0wOyl7Y29uc3QgYXQ9ZXQ7bGV0IHR0PWV0LTE7dHQ8MCYmKHR0PVUubGVuZ3RoLTEpO2ZvcihsZXQgRXQ9MCxYPXUrZyoyO0V0PFg7RXQrKyl7Y29uc3QgUj1IKkV0LEM9SCooRXQrMSksQj1sdCthdCtSLFY9bHQrdHQrUixKPWx0K3R0K0MsJD1sdCthdCtDO19lKEIsVixKLCQpfX19ZnVuY3Rpb24gJHQoVSxsdCxldCl7Yy5wdXNoKFUpLGMucHVzaChsdCksYy5wdXNoKGV0KX1mdW5jdGlvbiBQdChVLGx0LGV0KXtxdChVKSxxdChsdCkscXQoZXQpO2NvbnN0IGF0PWkubGVuZ3RoLzMsdHQ9di5nZW5lcmF0ZVRvcFVWKG4saSxhdC0zLGF0LTIsYXQtMSk7QnQodHRbMF0pLEJ0KHR0WzFdKSxCdCh0dFsyXSl9ZnVuY3Rpb24gX2UoVSxsdCxldCxhdCl7cXQoVSkscXQobHQpLHF0KGF0KSxxdChsdCkscXQoZXQpLHF0KGF0KTtjb25zdCB0dD1pLmxlbmd0aC8zLEV0PXYuZ2VuZXJhdGVTaWRlV2FsbFVWKG4saSx0dC02LHR0LTMsdHQtMix0dC0xKTtCdChFdFswXSksQnQoRXRbMV0pLEJ0KEV0WzNdKSxCdChFdFsxXSksQnQoRXRbMl0pLEJ0KEV0WzNdKX1mdW5jdGlvbiBxdChVKXtpLnB1c2goY1tVKjMrMF0pLGkucHVzaChjW1UqMysxXSksaS5wdXNoKGNbVSozKzJdKX1mdW5jdGlvbiBCdChVKXtzLnB1c2goVS54KSxzLnB1c2goVS55KX19fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCksZT10aGlzLnBhcmFtZXRlcnMuc2hhcGVzLG49dGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnM7cmV0dXJuIFpTKGUsbix0KX1zdGF0aWMgZnJvbUpTT04odCxlKXtjb25zdCBuPVtdO2ZvcihsZXQgcz0wLG89dC5zaGFwZXMubGVuZ3RoO3M8bztzKyspe2NvbnN0IGE9ZVt0LnNoYXBlc1tzXV07bi5wdXNoKGEpfWNvbnN0IGk9dC5vcHRpb25zLmV4dHJ1ZGVQYXRoO3JldHVybiBpIT09dm9pZCAwJiYodC5vcHRpb25zLmV4dHJ1ZGVQYXRoPW5ldyAkbFtpLnR5cGVdKCkuZnJvbUpTT04oaSkpLG5ldyBFdihuLHQub3B0aW9ucyl9fTtjb25zdCBZUz17Z2VuZXJhdGVUb3BVVjpmdW5jdGlvbihyLHQsZSxuLGkpe2NvbnN0IHM9dFtlKjNdLG89dFtlKjMrMV0sYT10W24qM10sYz10W24qMysxXSxsPXRbaSozXSx1PXRbaSozKzFdO3JldHVybltuZXcgcShzLG8pLG5ldyBxKGEsYyksbmV3IHEobCx1KV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbihyLHQsZSxuLGkscyl7Y29uc3Qgbz10W2UqM10sYT10W2UqMysxXSxjPXRbZSozKzJdLGw9dFtuKjNdLHU9dFtuKjMrMV0saD10W24qMysyXSxmPXRbaSozXSxkPXRbaSozKzFdLHA9dFtpKjMrMl0seD10W3MqM10sZz10W3MqMysxXSxtPXRbcyozKzJdO3JldHVybiBNYXRoLmFicyhhLXUpPE1hdGguYWJzKG8tbCk/W25ldyBxKG8sMS1jKSxuZXcgcShsLDEtaCksbmV3IHEoZiwxLXApLG5ldyBxKHgsMS1tKV06W25ldyBxKGEsMS1jKSxuZXcgcSh1LDEtaCksbmV3IHEoZCwxLXApLG5ldyBxKGcsMS1tKV19fTtmdW5jdGlvbiBaUyhyLHQsZSl7aWYoZS5zaGFwZXM9W10sQXJyYXkuaXNBcnJheShyKSlmb3IobGV0IG49MCxpPXIubGVuZ3RoO248aTtuKyspe2NvbnN0IHM9cltuXTtlLnNoYXBlcy5wdXNoKHMudXVpZCl9ZWxzZSBlLnNoYXBlcy5wdXNoKHIudXVpZCk7cmV0dXJuIGUub3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LHQpLHQuZXh0cnVkZVBhdGghPT12b2lkIDAmJihlLm9wdGlvbnMuZXh0cnVkZVBhdGg9dC5leHRydWRlUGF0aC50b0pTT04oKSksZX1jbGFzcyBKbCBleHRlbmRzIHhye2NvbnN0cnVjdG9yKHQ9MSxlPTApe2NvbnN0IG49KDErTWF0aC5zcXJ0KDUpKS8yLGk9Wy0xLG4sMCwxLG4sMCwtMSwtbiwwLDEsLW4sMCwwLC0xLG4sMCwxLG4sMCwtMSwtbiwwLDEsLW4sbiwwLC0xLG4sMCwxLC1uLDAsLTEsLW4sMCwxXSxzPVswLDExLDUsMCw1LDEsMCwxLDcsMCw3LDEwLDAsMTAsMTEsMSw1LDksNSwxMSw0LDExLDEwLDIsMTAsNyw2LDcsMSw4LDMsOSw0LDMsNCwyLDMsMiw2LDMsNiw4LDMsOCw5LDQsOSw1LDIsNCwxMSw2LDIsMTAsOCw2LDcsOSw4LDFdO3N1cGVyKGkscyx0LGUpLHRoaXMudHlwZT0iSWNvc2FoZWRyb25HZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxkZXRhaWw6ZX19c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgSmwodC5yYWRpdXMsdC5kZXRhaWwpfX1jbGFzcyBLbCBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9W25ldyBxKDAsLS41KSxuZXcgcSguNSwwKSxuZXcgcSgwLC41KV0sZT0xMixuPTAsaT1NYXRoLlBJKjIpe3N1cGVyKCksdGhpcy50eXBlPSJMYXRoZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3BvaW50czp0LHNlZ21lbnRzOmUscGhpU3RhcnQ6bixwaGlMZW5ndGg6aX0sZT1NYXRoLmZsb29yKGUpLGk9SHQoaSwwLE1hdGguUEkqMik7Y29uc3Qgcz1bXSxvPVtdLGE9W10sYz1bXSxsPVtdLHU9MS9lLGg9bmV3IEksZj1uZXcgcSxkPW5ldyBJLHA9bmV3IEkseD1uZXcgSTtsZXQgZz0wLG09MDtmb3IobGV0IHY9MDt2PD10Lmxlbmd0aC0xO3YrKylzd2l0Y2godil7Y2FzZSAwOmc9dFt2KzFdLngtdFt2XS54LG09dFt2KzFdLnktdFt2XS55LGQueD1tKjEsZC55PS1nLGQuej1tKjAseC5jb3B5KGQpLGQubm9ybWFsaXplKCksYy5wdXNoKGQueCxkLnksZC56KTticmVhaztjYXNlIHQubGVuZ3RoLTE6Yy5wdXNoKHgueCx4LnkseC56KTticmVhaztkZWZhdWx0Omc9dFt2KzFdLngtdFt2XS54LG09dFt2KzFdLnktdFt2XS55LGQueD1tKjEsZC55PS1nLGQuej1tKjAscC5jb3B5KGQpLGQueCs9eC54LGQueSs9eC55LGQueis9eC56LGQubm9ybWFsaXplKCksYy5wdXNoKGQueCxkLnksZC56KSx4LmNvcHkocCl9Zm9yKGxldCB2PTA7djw9ZTt2Kyspe2NvbnN0IHk9bit2KnUqaSxfPU1hdGguc2luKHkpLFM9TWF0aC5jb3MoeSk7Zm9yKGxldCB3PTA7dzw9dC5sZW5ndGgtMTt3Kyspe2gueD10W3ddLngqXyxoLnk9dFt3XS55LGguej10W3ddLngqUyxvLnB1c2goaC54LGgueSxoLnopLGYueD12L2UsZi55PXcvKHQubGVuZ3RoLTEpLGEucHVzaChmLngsZi55KTtjb25zdCBBPWNbMyp3KzBdKl8sVD1jWzMqdysxXSxiPWNbMyp3KzBdKlM7bC5wdXNoKEEsVCxiKX19Zm9yKGxldCB2PTA7djxlO3YrKylmb3IobGV0IHk9MDt5PHQubGVuZ3RoLTE7eSsrKXtjb25zdCBfPXkrdip0Lmxlbmd0aCxTPV8sdz1fK3QubGVuZ3RoLEE9Xyt0Lmxlbmd0aCsxLFQ9XysxO3MucHVzaChTLHcsVCkscy5wdXNoKEEsVCx3KX10aGlzLnNldEluZGV4KHMpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHZ0KG8sMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IHZ0KGEsMikpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyB2dChsLDMpKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc31zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBLbCh0LnBvaW50cyx0LnNlZ21lbnRzLHQucGhpU3RhcnQsdC5waGlMZW5ndGgpfX1jbGFzcyBnYSBleHRlbmRzIHhye2NvbnN0cnVjdG9yKHQ9MSxlPTApe2NvbnN0IG49WzEsMCwwLC0xLDAsMCwwLDEsMCwwLC0xLDAsMCwwLDEsMCwwLC0xXSxpPVswLDIsNCwwLDQsMywwLDMsNSwwLDUsMiwxLDIsNSwxLDUsMywxLDMsNCwxLDQsMl07c3VwZXIobixpLHQsZSksdGhpcy50eXBlPSJPY3RhaGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsZGV0YWlsOmV9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IGdhKHQucmFkaXVzLHQuZGV0YWlsKX19Y2xhc3MgWHIgZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxpPTEpe3N1cGVyKCksdGhpcy50eXBlPSJQbGFuZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOnQsaGVpZ2h0OmUsd2lkdGhTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOml9O2NvbnN0IHM9dC8yLG89ZS8yLGE9TWF0aC5mbG9vcihuKSxjPU1hdGguZmxvb3IoaSksbD1hKzEsdT1jKzEsaD10L2EsZj1lL2MsZD1bXSxwPVtdLHg9W10sZz1bXTtmb3IobGV0IG09MDttPHU7bSsrKXtjb25zdCB2PW0qZi1vO2ZvcihsZXQgeT0wO3k8bDt5Kyspe2NvbnN0IF89eSpoLXM7cC5wdXNoKF8sLXYsMCkseC5wdXNoKDAsMCwxKSxnLnB1c2goeS9hKSxnLnB1c2goMS1tL2MpfX1mb3IobGV0IG09MDttPGM7bSsrKWZvcihsZXQgdj0wO3Y8YTt2Kyspe2NvbnN0IHk9ditsKm0sXz12K2wqKG0rMSksUz12KzErbCoobSsxKSx3PXYrMStsKm07ZC5wdXNoKHksXyx3KSxkLnB1c2goXyxTLHcpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgdnQocCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IHZ0KHgsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IHZ0KGcsMikpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IFhyKHQud2lkdGgsdC5oZWlnaHQsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMpfX1jbGFzcyBqbCBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9LjUsZT0xLG49MzIsaT0xLHM9MCxvPU1hdGguUEkqMil7c3VwZXIoKSx0aGlzLnR5cGU9IlJpbmdHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtpbm5lclJhZGl1czp0LG91dGVyUmFkaXVzOmUsdGhldGFTZWdtZW50czpuLHBoaVNlZ21lbnRzOmksdGhldGFTdGFydDpzLHRoZXRhTGVuZ3RoOm99LG49TWF0aC5tYXgoMyxuKSxpPU1hdGgubWF4KDEsaSk7Y29uc3QgYT1bXSxjPVtdLGw9W10sdT1bXTtsZXQgaD10O2NvbnN0IGY9KGUtdCkvaSxkPW5ldyBJLHA9bmV3IHE7Zm9yKGxldCB4PTA7eDw9aTt4Kyspe2ZvcihsZXQgZz0wO2c8PW47ZysrKXtjb25zdCBtPXMrZy9uKm87ZC54PWgqTWF0aC5jb3MobSksZC55PWgqTWF0aC5zaW4obSksYy5wdXNoKGQueCxkLnksZC56KSxsLnB1c2goMCwwLDEpLHAueD0oZC54L2UrMSkvMixwLnk9KGQueS9lKzEpLzIsdS5wdXNoKHAueCxwLnkpfWgrPWZ9Zm9yKGxldCB4PTA7eDxpO3grKyl7Y29uc3QgZz14KihuKzEpO2ZvcihsZXQgbT0wO208bjttKyspe2NvbnN0IHY9bStnLHk9dixfPXYrbisxLFM9dituKzIsdz12KzE7YS5wdXNoKHksXyx3KSxhLnB1c2goXyxTLHcpfX10aGlzLnNldEluZGV4KGEpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHZ0KGMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyB2dChsLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyB2dCh1LDIpKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc31zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBqbCh0LmlubmVyUmFkaXVzLHQub3V0ZXJSYWRpdXMsdC50aGV0YVNlZ21lbnRzLHQucGhpU2VnbWVudHMsdC50aGV0YVN0YXJ0LHQudGhldGFMZW5ndGgpfX1jbGFzcyBRbCBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9bmV3IFZpKFtuZXcgcSgwLC41KSxuZXcgcSgtLjUsLS41KSxuZXcgcSguNSwtLjUpXSksZT0xMil7c3VwZXIoKSx0aGlzLnR5cGU9IlNoYXBlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17c2hhcGVzOnQsY3VydmVTZWdtZW50czplfTtjb25zdCBuPVtdLGk9W10scz1bXSxvPVtdO2xldCBhPTAsYz0wO2lmKEFycmF5LmlzQXJyYXkodCk9PT0hMSlsKHQpO2Vsc2UgZm9yKGxldCB1PTA7dTx0Lmxlbmd0aDt1KyspbCh0W3VdKSx0aGlzLmFkZEdyb3VwKGEsYyx1KSxhKz1jLGM9MDt0aGlzLnNldEluZGV4KG4pLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHZ0KGksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyB2dChzLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyB2dChvLDIpKTtmdW5jdGlvbiBsKHUpe2NvbnN0IGg9aS5sZW5ndGgvMyxmPXUuZXh0cmFjdFBvaW50cyhlKTtsZXQgZD1mLnNoYXBlO2NvbnN0IHA9Zi5ob2xlcztjbi5pc0Nsb2NrV2lzZShkKT09PSExJiYoZD1kLnJldmVyc2UoKSk7Zm9yKGxldCBnPTAsbT1wLmxlbmd0aDtnPG07ZysrKXtjb25zdCB2PXBbZ107Y24uaXNDbG9ja1dpc2Uodik9PT0hMCYmKHBbZ109di5yZXZlcnNlKCkpfWNvbnN0IHg9Y24udHJpYW5ndWxhdGVTaGFwZShkLHApO2ZvcihsZXQgZz0wLG09cC5sZW5ndGg7ZzxtO2crKyl7Y29uc3Qgdj1wW2ddO2Q9ZC5jb25jYXQodil9Zm9yKGxldCBnPTAsbT1kLmxlbmd0aDtnPG07ZysrKXtjb25zdCB2PWRbZ107aS5wdXNoKHYueCx2LnksMCkscy5wdXNoKDAsMCwxKSxvLnB1c2godi54LHYueSl9Zm9yKGxldCBnPTAsbT14Lmxlbmd0aDtnPG07ZysrKXtjb25zdCB2PXhbZ10seT12WzBdK2gsXz12WzFdK2gsUz12WzJdK2g7bi5wdXNoKHksXyxTKSxjKz0zfX19Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKSxlPXRoaXMucGFyYW1ldGVycy5zaGFwZXM7cmV0dXJuIEpTKGUsdCl9c3RhdGljIGZyb21KU09OKHQsZSl7Y29uc3Qgbj1bXTtmb3IobGV0IGk9MCxzPXQuc2hhcGVzLmxlbmd0aDtpPHM7aSsrKXtjb25zdCBvPWVbdC5zaGFwZXNbaV1dO24ucHVzaChvKX1yZXR1cm4gbmV3IFFsKG4sdC5jdXJ2ZVNlZ21lbnRzKX19ZnVuY3Rpb24gSlMocix0KXtpZih0LnNoYXBlcz1bXSxBcnJheS5pc0FycmF5KHIpKWZvcihsZXQgZT0wLG49ci5sZW5ndGg7ZTxuO2UrKyl7Y29uc3QgaT1yW2VdO3Quc2hhcGVzLnB1c2goaS51dWlkKX1lbHNlIHQuc2hhcGVzLnB1c2goci51dWlkKTtyZXR1cm4gdH1jbGFzcyB4YSBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9MSxlPTMyLG49MTYsaT0wLHM9TWF0aC5QSSoyLG89MCxhPU1hdGguUEkpe3N1cGVyKCksdGhpcy50eXBlPSJTcGhlcmVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCx3aWR0aFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6bixwaGlTdGFydDppLHBoaUxlbmd0aDpzLHRoZXRhU3RhcnQ6byx0aGV0YUxlbmd0aDphfSxlPU1hdGgubWF4KDMsTWF0aC5mbG9vcihlKSksbj1NYXRoLm1heCgyLE1hdGguZmxvb3IobikpO2NvbnN0IGM9TWF0aC5taW4obythLE1hdGguUEkpO2xldCBsPTA7Y29uc3QgdT1bXSxoPW5ldyBJLGY9bmV3IEksZD1bXSxwPVtdLHg9W10sZz1bXTtmb3IobGV0IG09MDttPD1uO20rKyl7Y29uc3Qgdj1bXSx5PW0vbjtsZXQgXz0wO209PT0wJiZvPT09MD9fPS41L2U6bT09PW4mJmM9PT1NYXRoLlBJJiYoXz0tLjUvZSk7Zm9yKGxldCBTPTA7Uzw9ZTtTKyspe2NvbnN0IHc9Uy9lO2gueD0tdCpNYXRoLmNvcyhpK3cqcykqTWF0aC5zaW4obyt5KmEpLGgueT10Kk1hdGguY29zKG8reSphKSxoLno9dCpNYXRoLnNpbihpK3cqcykqTWF0aC5zaW4obyt5KmEpLHAucHVzaChoLngsaC55LGgueiksZi5jb3B5KGgpLm5vcm1hbGl6ZSgpLHgucHVzaChmLngsZi55LGYueiksZy5wdXNoKHcrXywxLXkpLHYucHVzaChsKyspfXUucHVzaCh2KX1mb3IobGV0IG09MDttPG47bSsrKWZvcihsZXQgdj0wO3Y8ZTt2Kyspe2NvbnN0IHk9dVttXVt2KzFdLF89dVttXVt2XSxTPXVbbSsxXVt2XSx3PXVbbSsxXVt2KzFdOyhtIT09MHx8bz4wKSYmZC5wdXNoKHksXyx3KSwobSE9PW4tMXx8YzxNYXRoLlBJKSYmZC5wdXNoKF8sUyx3KX10aGlzLnNldEluZGV4KGQpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHZ0KHAsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyB2dCh4LDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyB2dChnLDIpKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc31zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyB4YSh0LnJhZGl1cyx0LndpZHRoU2VnbWVudHMsdC5oZWlnaHRTZWdtZW50cyx0LnBoaVN0YXJ0LHQucGhpTGVuZ3RoLHQudGhldGFTdGFydCx0LnRoZXRhTGVuZ3RoKX19Y2xhc3MgdHUgZXh0ZW5kcyB4cntjb25zdHJ1Y3Rvcih0PTEsZT0wKXtjb25zdCBuPVsxLDEsMSwtMSwtMSwxLC0xLDEsLTEsMSwtMSwtMV0saT1bMiwxLDAsMCwzLDIsMSwzLDAsMiwzLDFdO3N1cGVyKG4saSx0LGUpLHRoaXMudHlwZT0iVGV0cmFoZWRyb25HZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxkZXRhaWw6ZX19c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgdHUodC5yYWRpdXMsdC5kZXRhaWwpfX1jbGFzcyBldSBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9MSxlPS40LG49MTIsaT00OCxzPU1hdGguUEkqMil7c3VwZXIoKSx0aGlzLnR5cGU9IlRvcnVzR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsdHViZTplLHJhZGlhbFNlZ21lbnRzOm4sdHVidWxhclNlZ21lbnRzOmksYXJjOnN9LG49TWF0aC5mbG9vcihuKSxpPU1hdGguZmxvb3IoaSk7Y29uc3Qgbz1bXSxhPVtdLGM9W10sbD1bXSx1PW5ldyBJLGg9bmV3IEksZj1uZXcgSTtmb3IobGV0IGQ9MDtkPD1uO2QrKylmb3IobGV0IHA9MDtwPD1pO3ArKyl7Y29uc3QgeD1wL2kqcyxnPWQvbipNYXRoLlBJKjI7aC54PSh0K2UqTWF0aC5jb3MoZykpKk1hdGguY29zKHgpLGgueT0odCtlKk1hdGguY29zKGcpKSpNYXRoLnNpbih4KSxoLno9ZSpNYXRoLnNpbihnKSxhLnB1c2goaC54LGgueSxoLnopLHUueD10Kk1hdGguY29zKHgpLHUueT10Kk1hdGguc2luKHgpLGYuc3ViVmVjdG9ycyhoLHUpLm5vcm1hbGl6ZSgpLGMucHVzaChmLngsZi55LGYueiksbC5wdXNoKHAvaSksbC5wdXNoKGQvbil9Zm9yKGxldCBkPTE7ZDw9bjtkKyspZm9yKGxldCBwPTE7cDw9aTtwKyspe2NvbnN0IHg9KGkrMSkqZCtwLTEsZz0oaSsxKSooZC0xKStwLTEsbT0oaSsxKSooZC0xKStwLHY9KGkrMSkqZCtwO28ucHVzaCh4LGcsdiksby5wdXNoKGcsbSx2KX10aGlzLnNldEluZGV4KG8pLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHZ0KGEsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyB2dChjLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyB2dChsLDIpKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc31zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBldSh0LnJhZGl1cyx0LnR1YmUsdC5yYWRpYWxTZWdtZW50cyx0LnR1YnVsYXJTZWdtZW50cyx0LmFyYyl9fWNsYXNzIG51IGV4dGVuZHMgTnR7Y29uc3RydWN0b3IodD0xLGU9LjQsbj02NCxpPTgscz0yLG89Myl7c3VwZXIoKSx0aGlzLnR5cGU9IlRvcnVzS25vdEdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LHR1YmU6ZSx0dWJ1bGFyU2VnbWVudHM6bixyYWRpYWxTZWdtZW50czppLHA6cyxxOm99LG49TWF0aC5mbG9vcihuKSxpPU1hdGguZmxvb3IoaSk7Y29uc3QgYT1bXSxjPVtdLGw9W10sdT1bXSxoPW5ldyBJLGY9bmV3IEksZD1uZXcgSSxwPW5ldyBJLHg9bmV3IEksZz1uZXcgSSxtPW5ldyBJO2ZvcihsZXQgeT0wO3k8PW47Kyt5KXtjb25zdCBfPXkvbipzKk1hdGguUEkqMjt2KF8scyxvLHQsZCksdihfKy4wMSxzLG8sdCxwKSxnLnN1YlZlY3RvcnMocCxkKSxtLmFkZFZlY3RvcnMocCxkKSx4LmNyb3NzVmVjdG9ycyhnLG0pLG0uY3Jvc3NWZWN0b3JzKHgsZykseC5ub3JtYWxpemUoKSxtLm5vcm1hbGl6ZSgpO2ZvcihsZXQgUz0wO1M8PWk7KytTKXtjb25zdCB3PVMvaSpNYXRoLlBJKjIsQT0tZSpNYXRoLmNvcyh3KSxUPWUqTWF0aC5zaW4odyk7aC54PWQueCsoQSptLngrVCp4LngpLGgueT1kLnkrKEEqbS55K1QqeC55KSxoLno9ZC56KyhBKm0ueitUKngueiksYy5wdXNoKGgueCxoLnksaC56KSxmLnN1YlZlY3RvcnMoaCxkKS5ub3JtYWxpemUoKSxsLnB1c2goZi54LGYueSxmLnopLHUucHVzaCh5L24pLHUucHVzaChTL2kpfX1mb3IobGV0IHk9MTt5PD1uO3krKylmb3IobGV0IF89MTtfPD1pO18rKyl7Y29uc3QgUz0oaSsxKSooeS0xKSsoXy0xKSx3PShpKzEpKnkrKF8tMSksQT0oaSsxKSp5K18sVD0oaSsxKSooeS0xKStfO2EucHVzaChTLHcsVCksYS5wdXNoKHcsQSxUKX10aGlzLnNldEluZGV4KGEpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHZ0KGMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyB2dChsLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyB2dCh1LDIpKTtmdW5jdGlvbiB2KHksXyxTLHcsQSl7Y29uc3QgVD1NYXRoLmNvcyh5KSxiPU1hdGguc2luKHkpLE09Uy9fKnksRT1NYXRoLmNvcyhNKTtBLng9dyooMitFKSouNSpULEEueT13KigyK0UpKmIqLjUsQS56PXcqTWF0aC5zaW4oTSkqLjV9fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IG51KHQucmFkaXVzLHQudHViZSx0LnR1YnVsYXJTZWdtZW50cyx0LnJhZGlhbFNlZ21lbnRzLHQucCx0LnEpfX1jbGFzcyBpdSBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9bmV3IFhmKG5ldyBJKC0xLC0xLDApLG5ldyBJKC0xLDEsMCksbmV3IEkoMSwxLDApKSxlPTY0LG49MSxpPTgscz0hMSl7c3VwZXIoKSx0aGlzLnR5cGU9IlR1YmVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtwYXRoOnQsdHVidWxhclNlZ21lbnRzOmUscmFkaXVzOm4scmFkaWFsU2VnbWVudHM6aSxjbG9zZWQ6c307Y29uc3Qgbz10LmNvbXB1dGVGcmVuZXRGcmFtZXMoZSxzKTt0aGlzLnRhbmdlbnRzPW8udGFuZ2VudHMsdGhpcy5ub3JtYWxzPW8ubm9ybWFscyx0aGlzLmJpbm9ybWFscz1vLmJpbm9ybWFscztjb25zdCBhPW5ldyBJLGM9bmV3IEksbD1uZXcgcTtsZXQgdT1uZXcgSTtjb25zdCBoPVtdLGY9W10sZD1bXSxwPVtdO3goKSx0aGlzLnNldEluZGV4KHApLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHZ0KGgsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyB2dChmLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyB2dChkLDIpKTtmdW5jdGlvbiB4KCl7Zm9yKGxldCB5PTA7eTxlO3krKylnKHkpO2cocz09PSExP2U6MCksdigpLG0oKX1mdW5jdGlvbiBnKHkpe3U9dC5nZXRQb2ludEF0KHkvZSx1KTtjb25zdCBfPW8ubm9ybWFsc1t5XSxTPW8uYmlub3JtYWxzW3ldO2ZvcihsZXQgdz0wO3c8PWk7dysrKXtjb25zdCBBPXcvaSpNYXRoLlBJKjIsVD1NYXRoLnNpbihBKSxiPS1NYXRoLmNvcyhBKTtjLng9YipfLngrVCpTLngsYy55PWIqXy55K1QqUy55LGMuej1iKl8ueitUKlMueixjLm5vcm1hbGl6ZSgpLGYucHVzaChjLngsYy55LGMueiksYS54PXUueCtuKmMueCxhLnk9dS55K24qYy55LGEuej11LnorbipjLnosaC5wdXNoKGEueCxhLnksYS56KX19ZnVuY3Rpb24gbSgpe2ZvcihsZXQgeT0xO3k8PWU7eSsrKWZvcihsZXQgXz0xO188PWk7XysrKXtjb25zdCBTPShpKzEpKih5LTEpKyhfLTEpLHc9KGkrMSkqeSsoXy0xKSxBPShpKzEpKnkrXyxUPShpKzEpKih5LTEpK187cC5wdXNoKFMsdyxUKSxwLnB1c2godyxBLFQpfX1mdW5jdGlvbiB2KCl7Zm9yKGxldCB5PTA7eTw9ZTt5KyspZm9yKGxldCBfPTA7Xzw9aTtfKyspbC54PXkvZSxsLnk9Xy9pLGQucHVzaChsLngsbC55KX19Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5wYXRoPXRoaXMucGFyYW1ldGVycy5wYXRoLnRvSlNPTigpLHR9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgaXUobmV3ICRsW3QucGF0aC50eXBlXSgpLmZyb21KU09OKHQucGF0aCksdC50dWJ1bGFyU2VnbWVudHMsdC5yYWRpdXMsdC5yYWRpYWxTZWdtZW50cyx0LmNsb3NlZCl9fWNsYXNzIGMwIGV4dGVuZHMgTnR7Y29uc3RydWN0b3IodD1udWxsKXtpZihzdXBlcigpLHRoaXMudHlwZT0iV2lyZWZyYW1lR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17Z2VvbWV0cnk6dH0sdCE9PW51bGwpe2NvbnN0IGU9W10sbj1uZXcgU2V0LGk9bmV3IEkscz1uZXcgSTtpZih0LmluZGV4IT09bnVsbCl7Y29uc3Qgbz10LmF0dHJpYnV0ZXMucG9zaXRpb24sYT10LmluZGV4O2xldCBjPXQuZ3JvdXBzO2MubGVuZ3RoPT09MCYmKGM9W3tzdGFydDowLGNvdW50OmEuY291bnQsbWF0ZXJpYWxJbmRleDowfV0pO2ZvcihsZXQgbD0wLHU9Yy5sZW5ndGg7bDx1OysrbCl7Y29uc3QgaD1jW2xdLGY9aC5zdGFydCxkPWguY291bnQ7Zm9yKGxldCBwPWYseD1mK2Q7cDx4O3ArPTMpZm9yKGxldCBnPTA7ZzwzO2crKyl7Y29uc3QgbT1hLmdldFgocCtnKSx2PWEuZ2V0WChwKyhnKzEpJTMpO2kuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLG0pLHMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLHYpLGwwKGkscyxuKT09PSEwJiYoZS5wdXNoKGkueCxpLnksaS56KSxlLnB1c2gocy54LHMueSxzLnopKX19fWVsc2V7Y29uc3Qgbz10LmF0dHJpYnV0ZXMucG9zaXRpb247Zm9yKGxldCBhPTAsYz1vLmNvdW50LzM7YTxjO2ErKylmb3IobGV0IGw9MDtsPDM7bCsrKXtjb25zdCB1PTMqYStsLGg9MyphKyhsKzEpJTM7aS5mcm9tQnVmZmVyQXR0cmlidXRlKG8sdSkscy5mcm9tQnVmZmVyQXR0cmlidXRlKG8saCksbDAoaSxzLG4pPT09ITAmJihlLnB1c2goaS54LGkueSxpLnopLGUucHVzaChzLngscy55LHMueikpfX10aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyB2dChlLDMpKX19Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9fWZ1bmN0aW9uIGwwKHIsdCxlKXtjb25zdCBuPWAke3IueH0sJHtyLnl9LCR7ci56fS0ke3QueH0sJHt0Lnl9LCR7dC56fWAsaT1gJHt0Lnh9LCR7dC55fSwke3Quen0tJHtyLnh9LCR7ci55fSwke3Iuen1gO3JldHVybiBlLmhhcyhuKT09PSEwfHxlLmhhcyhpKT09PSEwPyExOihlLmFkZChuKSxlLmFkZChpKSwhMCl9dmFyIHUwPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJveEdlb21ldHJ5OnpyLENhcHN1bGVHZW9tZXRyeTpPbCxDaXJjbGVHZW9tZXRyeTp6bCxDb25lR2VvbWV0cnk6bGEsQ3lsaW5kZXJHZW9tZXRyeTpjYSxEb2RlY2FoZWRyb25HZW9tZXRyeTprbCxFZGdlc0dlb21ldHJ5OnFnLEV4dHJ1ZGVHZW9tZXRyeTphMCxJY29zYWhlZHJvbkdlb21ldHJ5OkpsLExhdGhlR2VvbWV0cnk6S2wsT2N0YWhlZHJvbkdlb21ldHJ5OmdhLFBsYW5lR2VvbWV0cnk6WHIsUG9seWhlZHJvbkdlb21ldHJ5OnhyLFJpbmdHZW9tZXRyeTpqbCxTaGFwZUdlb21ldHJ5OlFsLFNwaGVyZUdlb21ldHJ5OnhhLFRldHJhaGVkcm9uR2VvbWV0cnk6dHUsVG9ydXNHZW9tZXRyeTpldSxUb3J1c0tub3RHZW9tZXRyeTpudSxUdWJlR2VvbWV0cnk6aXUsV2lyZWZyYW1lR2VvbWV0cnk6YzB9KTtjbGFzcyBoMCBleHRlbmRzIEtle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc1NoYWRvd01hdGVyaWFsPSEwLHRoaXMudHlwZT0iU2hhZG93TWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHl0KDApLHRoaXMudHJhbnNwYXJlbnQ9ITAsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5mb2c9dC5mb2csdGhpc319Y2xhc3MgZjAgZXh0ZW5kcyBvaXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLmlzUmF3U2hhZGVyTWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJSYXdTaGFkZXJNYXRlcmlhbCJ9fWNsYXNzIFpmIGV4dGVuZHMgS2V7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJNZXNoU3RhbmRhcmRNYXRlcmlhbCIsdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIn0sdGhpcy5jb2xvcj1uZXcgeXQoMTY3NzcyMTUpLHRoaXMucm91Z2huZXNzPTEsdGhpcy5tZXRhbG5lc3M9MCx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyB5dCgwKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZU1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9b3IsdGhpcy5ub3JtYWxTY2FsZT1uZXcgcSgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMucm91Z2huZXNzTWFwPW51bGwsdGhpcy5tZXRhbG5lc3NNYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5lbnZNYXA9bnVsbCx0aGlzLmVudk1hcFJvdGF0aW9uPW5ldyBVbix0aGlzLmVudk1hcEludGVuc2l0eT0xLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5yb3VnaG5lc3M9dC5yb3VnaG5lc3MsdGhpcy5tZXRhbG5lc3M9dC5tZXRhbG5lc3MsdGhpcy5tYXA9dC5tYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuZW1pc3NpdmUuY29weSh0LmVtaXNzaXZlKSx0aGlzLmVtaXNzaXZlTWFwPXQuZW1pc3NpdmVNYXAsdGhpcy5lbWlzc2l2ZUludGVuc2l0eT10LmVtaXNzaXZlSW50ZW5zaXR5LHRoaXMuYnVtcE1hcD10LmJ1bXBNYXAsdGhpcy5idW1wU2NhbGU9dC5idW1wU2NhbGUsdGhpcy5ub3JtYWxNYXA9dC5ub3JtYWxNYXAsdGhpcy5ub3JtYWxNYXBUeXBlPXQubm9ybWFsTWFwVHlwZSx0aGlzLm5vcm1hbFNjYWxlLmNvcHkodC5ub3JtYWxTY2FsZSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpcy5yb3VnaG5lc3NNYXA9dC5yb3VnaG5lc3NNYXAsdGhpcy5tZXRhbG5lc3NNYXA9dC5tZXRhbG5lc3NNYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZW52TWFwPXQuZW52TWFwLHRoaXMuZW52TWFwUm90YXRpb24uY29weSh0LmVudk1hcFJvdGF0aW9uKSx0aGlzLmVudk1hcEludGVuc2l0eT10LmVudk1hcEludGVuc2l0eSx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpcy5mb2c9dC5mb2csdGhpc319Y2xhc3MgZDAgZXh0ZW5kcyBaZntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbD0hMCx0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIiLFBIWVNJQ0FMOiIifSx0aGlzLnR5cGU9Ik1lc2hQaHlzaWNhbE1hdGVyaWFsIix0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbj0wLHRoaXMuYW5pc290cm9weU1hcD1udWxsLHRoaXMuY2xlYXJjb2F0TWFwPW51bGwsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9MCx0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcD1udWxsLHRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGU9bmV3IHEoMSwxKSx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD1udWxsLHRoaXMuaW9yPTEuNSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicmVmbGVjdGl2aXR5Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEh0KDIuNSoodGhpcy5pb3ItMSkvKHRoaXMuaW9yKzEpLDAsMSl9LHNldDpmdW5jdGlvbihlKXt0aGlzLmlvcj0oMSsuNCplKS8oMS0uNCplKX19KSx0aGlzLmlyaWRlc2NlbmNlTWFwPW51bGwsdGhpcy5pcmlkZXNjZW5jZUlPUj0xLjMsdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPVsxMDAsNDAwXSx0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwPW51bGwsdGhpcy5zaGVlbkNvbG9yPW5ldyB5dCgwKSx0aGlzLnNoZWVuQ29sb3JNYXA9bnVsbCx0aGlzLnNoZWVuUm91Z2huZXNzPTEsdGhpcy5zaGVlblJvdWdobmVzc01hcD1udWxsLHRoaXMudHJhbnNtaXNzaW9uTWFwPW51bGwsdGhpcy50aGlja25lc3M9MCx0aGlzLnRoaWNrbmVzc01hcD1udWxsLHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZT0xLzAsdGhpcy5hdHRlbnVhdGlvbkNvbG9yPW5ldyB5dCgxLDEsMSksdGhpcy5zcGVjdWxhckludGVuc2l0eT0xLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXA9bnVsbCx0aGlzLnNwZWN1bGFyQ29sb3I9bmV3IHl0KDEsMSwxKSx0aGlzLnNwZWN1bGFyQ29sb3JNYXA9bnVsbCx0aGlzLl9hbmlzb3Ryb3B5PTAsdGhpcy5fY2xlYXJjb2F0PTAsdGhpcy5fZGlzcGVyc2lvbj0wLHRoaXMuX2lyaWRlc2NlbmNlPTAsdGhpcy5fc2hlZW49MCx0aGlzLl90cmFuc21pc3Npb249MCx0aGlzLnNldFZhbHVlcyh0KX1nZXQgYW5pc290cm9weSgpe3JldHVybiB0aGlzLl9hbmlzb3Ryb3B5fXNldCBhbmlzb3Ryb3B5KHQpe3RoaXMuX2FuaXNvdHJvcHk+MCE9dD4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl9hbmlzb3Ryb3B5PXR9Z2V0IGNsZWFyY29hdCgpe3JldHVybiB0aGlzLl9jbGVhcmNvYXR9c2V0IGNsZWFyY29hdCh0KXt0aGlzLl9jbGVhcmNvYXQ+MCE9dD4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl9jbGVhcmNvYXQ9dH1nZXQgaXJpZGVzY2VuY2UoKXtyZXR1cm4gdGhpcy5faXJpZGVzY2VuY2V9c2V0IGlyaWRlc2NlbmNlKHQpe3RoaXMuX2lyaWRlc2NlbmNlPjAhPXQ+MCYmdGhpcy52ZXJzaW9uKyssdGhpcy5faXJpZGVzY2VuY2U9dH1nZXQgZGlzcGVyc2lvbigpe3JldHVybiB0aGlzLl9kaXNwZXJzaW9ufXNldCBkaXNwZXJzaW9uKHQpe3RoaXMuX2Rpc3BlcnNpb24+MCE9dD4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl9kaXNwZXJzaW9uPXR9Z2V0IHNoZWVuKCl7cmV0dXJuIHRoaXMuX3NoZWVufXNldCBzaGVlbih0KXt0aGlzLl9zaGVlbj4wIT10PjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX3NoZWVuPXR9Z2V0IHRyYW5zbWlzc2lvbigpe3JldHVybiB0aGlzLl90cmFuc21pc3Npb259c2V0IHRyYW5zbWlzc2lvbih0KXt0aGlzLl90cmFuc21pc3Npb24+MCE9dD4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl90cmFuc21pc3Npb249dH1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiIsUEhZU0lDQUw6IiJ9LHRoaXMuYW5pc290cm9weT10LmFuaXNvdHJvcHksdGhpcy5hbmlzb3Ryb3B5Um90YXRpb249dC5hbmlzb3Ryb3B5Um90YXRpb24sdGhpcy5hbmlzb3Ryb3B5TWFwPXQuYW5pc290cm9weU1hcCx0aGlzLmNsZWFyY29hdD10LmNsZWFyY29hdCx0aGlzLmNsZWFyY29hdE1hcD10LmNsZWFyY29hdE1hcCx0aGlzLmNsZWFyY29hdFJvdWdobmVzcz10LmNsZWFyY29hdFJvdWdobmVzcyx0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcD10LmNsZWFyY29hdFJvdWdobmVzc01hcCx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD10LmNsZWFyY29hdE5vcm1hbE1hcCx0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLmNvcHkodC5jbGVhcmNvYXROb3JtYWxTY2FsZSksdGhpcy5kaXNwZXJzaW9uPXQuZGlzcGVyc2lvbix0aGlzLmlvcj10Lmlvcix0aGlzLmlyaWRlc2NlbmNlPXQuaXJpZGVzY2VuY2UsdGhpcy5pcmlkZXNjZW5jZU1hcD10LmlyaWRlc2NlbmNlTWFwLHRoaXMuaXJpZGVzY2VuY2VJT1I9dC5pcmlkZXNjZW5jZUlPUix0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2U9Wy4uLnQuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZV0sdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD10LmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLHRoaXMuc2hlZW49dC5zaGVlbix0aGlzLnNoZWVuQ29sb3IuY29weSh0LnNoZWVuQ29sb3IpLHRoaXMuc2hlZW5Db2xvck1hcD10LnNoZWVuQ29sb3JNYXAsdGhpcy5zaGVlblJvdWdobmVzcz10LnNoZWVuUm91Z2huZXNzLHRoaXMuc2hlZW5Sb3VnaG5lc3NNYXA9dC5zaGVlblJvdWdobmVzc01hcCx0aGlzLnRyYW5zbWlzc2lvbj10LnRyYW5zbWlzc2lvbix0aGlzLnRyYW5zbWlzc2lvbk1hcD10LnRyYW5zbWlzc2lvbk1hcCx0aGlzLnRoaWNrbmVzcz10LnRoaWNrbmVzcyx0aGlzLnRoaWNrbmVzc01hcD10LnRoaWNrbmVzc01hcCx0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2U9dC5hdHRlbnVhdGlvbkRpc3RhbmNlLHRoaXMuYXR0ZW51YXRpb25Db2xvci5jb3B5KHQuYXR0ZW51YXRpb25Db2xvciksdGhpcy5zcGVjdWxhckludGVuc2l0eT10LnNwZWN1bGFySW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXA9dC5zcGVjdWxhckludGVuc2l0eU1hcCx0aGlzLnNwZWN1bGFyQ29sb3IuY29weSh0LnNwZWN1bGFyQ29sb3IpLHRoaXMuc3BlY3VsYXJDb2xvck1hcD10LnNwZWN1bGFyQ29sb3JNYXAsdGhpc319Y2xhc3MgcDAgZXh0ZW5kcyBLZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoUGhvbmdNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hQaG9uZ01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5dCgxNjc3NzIxNSksdGhpcy5zcGVjdWxhcj1uZXcgeXQoMTExODQ4MSksdGhpcy5zaGluaW5lc3M9MzAsdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZT1uZXcgeXQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPW9yLHRoaXMubm9ybWFsU2NhbGU9bmV3IHEoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5lbnZNYXBSb3RhdGlvbj1uZXcgVW4sdGhpcy5jb21iaW5lPVJvLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5zcGVjdWxhci5jb3B5KHQuc3BlY3VsYXIpLHRoaXMuc2hpbmluZXNzPXQuc2hpbmluZXNzLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLmVtaXNzaXZlLmNvcHkodC5lbWlzc2l2ZSksdGhpcy5lbWlzc2l2ZU1hcD10LmVtaXNzaXZlTWFwLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9dC5lbWlzc2l2ZUludGVuc2l0eSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5lbnZNYXBSb3RhdGlvbi5jb3B5KHQuZW52TWFwUm90YXRpb24pLHRoaXMuY29tYmluZT10LmNvbWJpbmUsdGhpcy5yZWZsZWN0aXZpdHk9dC5yZWZsZWN0aXZpdHksdGhpcy5yZWZyYWN0aW9uUmF0aW89dC5yZWZyYWN0aW9uUmF0aW8sdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNsYXNzIG0wIGV4dGVuZHMgS2V7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaFRvb25NYXRlcmlhbD0hMCx0aGlzLmRlZmluZXM9e1RPT046IiJ9LHRoaXMudHlwZT0iTWVzaFRvb25NYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgeXQoMTY3NzcyMTUpLHRoaXMubWFwPW51bGwsdGhpcy5ncmFkaWVudE1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyB5dCgwKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZU1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9b3IsdGhpcy5ub3JtYWxTY2FsZT1uZXcgcSgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiLHRoaXMud2lyZWZyYW1lTGluZWpvaW49InJvdW5kIix0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hcD10Lm1hcCx0aGlzLmdyYWRpZW50TWFwPXQuZ3JhZGllbnRNYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuZW1pc3NpdmUuY29weSh0LmVtaXNzaXZlKSx0aGlzLmVtaXNzaXZlTWFwPXQuZW1pc3NpdmVNYXAsdGhpcy5lbWlzc2l2ZUludGVuc2l0eT10LmVtaXNzaXZlSW50ZW5zaXR5LHRoaXMuYnVtcE1hcD10LmJ1bXBNYXAsdGhpcy5idW1wU2NhbGU9dC5idW1wU2NhbGUsdGhpcy5ub3JtYWxNYXA9dC5ub3JtYWxNYXAsdGhpcy5ub3JtYWxNYXBUeXBlPXQubm9ybWFsTWFwVHlwZSx0aGlzLm5vcm1hbFNjYWxlLmNvcHkodC5ub3JtYWxTY2FsZSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMud2lyZWZyYW1lTGluZWNhcD10LndpcmVmcmFtZUxpbmVjYXAsdGhpcy53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNsYXNzIGcwIGV4dGVuZHMgS2V7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaE5vcm1hbE1hdGVyaWFsPSEwLHRoaXMudHlwZT0iTWVzaE5vcm1hbE1hdGVyaWFsIix0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPW9yLHRoaXMubm9ybWFsU2NhbGU9bmV3IHEoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMuZmxhdFNoYWRpbmc9dC5mbGF0U2hhZGluZyx0aGlzfX1jbGFzcyB4MCBleHRlbmRzIEtle2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc01lc2hMYW1iZXJ0TWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJNZXNoTGFtYmVydE1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5dCgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZT1uZXcgeXQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPW9yLHRoaXMubm9ybWFsU2NhbGU9bmV3IHEoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5lbnZNYXBSb3RhdGlvbj1uZXcgVW4sdGhpcy5jb21iaW5lPVJvLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuZW1pc3NpdmUuY29weSh0LmVtaXNzaXZlKSx0aGlzLmVtaXNzaXZlTWFwPXQuZW1pc3NpdmVNYXAsdGhpcy5lbWlzc2l2ZUludGVuc2l0eT10LmVtaXNzaXZlSW50ZW5zaXR5LHRoaXMuYnVtcE1hcD10LmJ1bXBNYXAsdGhpcy5idW1wU2NhbGU9dC5idW1wU2NhbGUsdGhpcy5ub3JtYWxNYXA9dC5ub3JtYWxNYXAsdGhpcy5ub3JtYWxNYXBUeXBlPXQubm9ybWFsTWFwVHlwZSx0aGlzLm5vcm1hbFNjYWxlLmNvcHkodC5ub3JtYWxTY2FsZSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpcy5zcGVjdWxhck1hcD10LnNwZWN1bGFyTWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmVudk1hcD10LmVudk1hcCx0aGlzLmVudk1hcFJvdGF0aW9uLmNvcHkodC5lbnZNYXBSb3RhdGlvbiksdGhpcy5jb21iaW5lPXQuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpcy5mb2c9dC5mb2csdGhpc319Y2xhc3MgSmYgZXh0ZW5kcyBLZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoRGVwdGhNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hEZXB0aE1hdGVyaWFsIix0aGlzLmRlcHRoUGFja2luZz1GbSx0aGlzLm1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5kZXB0aFBhY2tpbmc9dC5kZXB0aFBhY2tpbmcsdGhpcy5tYXA9dC5tYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXN9fWNsYXNzIEtmIGV4dGVuZHMgS2V7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJNZXNoRGlzdGFuY2VNYXRlcmlhbCIsdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLm1hcD10Lm1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpc319Y2xhc3MgXzAgZXh0ZW5kcyBLZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoTWF0Y2FwTWF0ZXJpYWw9ITAsdGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9LHRoaXMudHlwZT0iTWVzaE1hdGNhcE1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5dCgxNjc3NzIxNSksdGhpcy5tYXRjYXA9bnVsbCx0aGlzLm1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9b3IsdGhpcy5ub3JtYWxTY2FsZT1uZXcgcSgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmZsYXRTaGFkaW5nPSExLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9LHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hdGNhcD10Lm1hdGNhcCx0aGlzLm1hcD10Lm1hcCx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpcy5mb2c9dC5mb2csdGhpc319Y2xhc3MgeTAgZXh0ZW5kcyBhbntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNMaW5lRGFzaGVkTWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJMaW5lRGFzaGVkTWF0ZXJpYWwiLHRoaXMuc2NhbGU9MSx0aGlzLmRhc2hTaXplPTMsdGhpcy5nYXBTaXplPTEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnNjYWxlPXQuc2NhbGUsdGhpcy5kYXNoU2l6ZT10LmRhc2hTaXplLHRoaXMuZ2FwU2l6ZT10LmdhcFNpemUsdGhpc319ZnVuY3Rpb24gJHIocix0KXtyZXR1cm4hcnx8ci5jb25zdHJ1Y3Rvcj09PXQ/cjp0eXBlb2YgdC5CWVRFU19QRVJfRUxFTUVOVD09Im51bWJlciI/bmV3IHQocik6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocil9ZnVuY3Rpb24gdjAocil7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhyKSYmIShyIGluc3RhbmNlb2YgRGF0YVZpZXcpfWZ1bmN0aW9uIE0wKHIpe2Z1bmN0aW9uIHQoaSxzKXtyZXR1cm4gcltpXS1yW3NdfWNvbnN0IGU9ci5sZW5ndGgsbj1uZXcgQXJyYXkoZSk7Zm9yKGxldCBpPTA7aSE9PWU7KytpKW5baV09aTtyZXR1cm4gbi5zb3J0KHQpLG59ZnVuY3Rpb24gamYocix0LGUpe2NvbnN0IG49ci5sZW5ndGgsaT1uZXcgci5jb25zdHJ1Y3RvcihuKTtmb3IobGV0IHM9MCxvPTA7byE9PW47KytzKXtjb25zdCBhPWVbc10qdDtmb3IobGV0IGM9MDtjIT09dDsrK2MpaVtvKytdPXJbYStjXX1yZXR1cm4gaX1mdW5jdGlvbiBRZihyLHQsZSxuKXtsZXQgaT0xLHM9clswXTtmb3IoO3MhPT12b2lkIDAmJnNbbl09PT12b2lkIDA7KXM9cltpKytdO2lmKHM9PT12b2lkIDApcmV0dXJuO2xldCBvPXNbbl07aWYobyE9PXZvaWQgMClpZihBcnJheS5pc0FycmF5KG8pKWRvIG89c1tuXSxvIT09dm9pZCAwJiYodC5wdXNoKHMudGltZSksZS5wdXNoKC4uLm8pKSxzPXJbaSsrXTt3aGlsZShzIT09dm9pZCAwKTtlbHNlIGlmKG8udG9BcnJheSE9PXZvaWQgMClkbyBvPXNbbl0sbyE9PXZvaWQgMCYmKHQucHVzaChzLnRpbWUpLG8udG9BcnJheShlLGUubGVuZ3RoKSkscz1yW2krK107d2hpbGUocyE9PXZvaWQgMCk7ZWxzZSBkbyBvPXNbbl0sbyE9PXZvaWQgMCYmKHQucHVzaChzLnRpbWUpLGUucHVzaChvKSkscz1yW2krK107d2hpbGUocyE9PXZvaWQgMCl9ZnVuY3Rpb24gS1Mocix0LGUsbixpPTMwKXtjb25zdCBzPXIuY2xvbmUoKTtzLm5hbWU9dDtjb25zdCBvPVtdO2ZvcihsZXQgYz0wO2M8cy50cmFja3MubGVuZ3RoOysrYyl7Y29uc3QgbD1zLnRyYWNrc1tjXSx1PWwuZ2V0VmFsdWVTaXplKCksaD1bXSxmPVtdO2ZvcihsZXQgZD0wO2Q8bC50aW1lcy5sZW5ndGg7KytkKXtjb25zdCBwPWwudGltZXNbZF0qaTtpZighKHA8ZXx8cD49bikpe2gucHVzaChsLnRpbWVzW2RdKTtmb3IobGV0IHg9MDt4PHU7Kyt4KWYucHVzaChsLnZhbHVlc1tkKnUreF0pfX1oLmxlbmd0aCE9PTAmJihsLnRpbWVzPSRyKGgsbC50aW1lcy5jb25zdHJ1Y3RvciksbC52YWx1ZXM9JHIoZixsLnZhbHVlcy5jb25zdHJ1Y3Rvciksby5wdXNoKGwpKX1zLnRyYWNrcz1vO2xldCBhPTEvMDtmb3IobGV0IGM9MDtjPHMudHJhY2tzLmxlbmd0aDsrK2MpYT5zLnRyYWNrc1tjXS50aW1lc1swXSYmKGE9cy50cmFja3NbY10udGltZXNbMF0pO2ZvcihsZXQgYz0wO2M8cy50cmFja3MubGVuZ3RoOysrYylzLnRyYWNrc1tjXS5zaGlmdCgtMSphKTtyZXR1cm4gcy5yZXNldER1cmF0aW9uKCksc31mdW5jdGlvbiBqUyhyLHQ9MCxlPXIsbj0zMCl7bjw9MCYmKG49MzApO2NvbnN0IGk9ZS50cmFja3MubGVuZ3RoLHM9dC9uO2ZvcihsZXQgbz0wO288aTsrK28pe2NvbnN0IGE9ZS50cmFja3Nbb10sYz1hLlZhbHVlVHlwZU5hbWU7aWYoYz09PSJib29sInx8Yz09PSJzdHJpbmciKWNvbnRpbnVlO2NvbnN0IGw9ci50cmFja3MuZmluZChmdW5jdGlvbihtKXtyZXR1cm4gbS5uYW1lPT09YS5uYW1lJiZtLlZhbHVlVHlwZU5hbWU9PT1jfSk7aWYobD09PXZvaWQgMCljb250aW51ZTtsZXQgdT0wO2NvbnN0IGg9YS5nZXRWYWx1ZVNpemUoKTthLmNyZWF0ZUludGVycG9sYW50LmlzSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kR0xURkN1YmljU3BsaW5lJiYodT1oLzMpO2xldCBmPTA7Y29uc3QgZD1sLmdldFZhbHVlU2l6ZSgpO2wuY3JlYXRlSW50ZXJwb2xhbnQuaXNJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUmJihmPWQvMyk7Y29uc3QgcD1hLnRpbWVzLmxlbmd0aC0xO2xldCB4O2lmKHM8PWEudGltZXNbMF0pe2NvbnN0IG09dSx2PWgtdTt4PWEudmFsdWVzLnNsaWNlKG0sdil9ZWxzZSBpZihzPj1hLnRpbWVzW3BdKXtjb25zdCBtPXAqaCt1LHY9bStoLXU7eD1hLnZhbHVlcy5zbGljZShtLHYpfWVsc2V7Y29uc3QgbT1hLmNyZWF0ZUludGVycG9sYW50KCksdj11LHk9aC11O20uZXZhbHVhdGUocykseD1tLnJlc3VsdEJ1ZmZlci5zbGljZSh2LHkpfWM9PT0icXVhdGVybmlvbiImJm5ldyB5bigpLmZyb21BcnJheSh4KS5ub3JtYWxpemUoKS5jb25qdWdhdGUoKS50b0FycmF5KHgpO2NvbnN0IGc9bC50aW1lcy5sZW5ndGg7Zm9yKGxldCBtPTA7bTxnOysrbSl7Y29uc3Qgdj1tKmQrZjtpZihjPT09InF1YXRlcm5pb24iKXluLm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KGwudmFsdWVzLHYseCwwLGwudmFsdWVzLHYpO2Vsc2V7Y29uc3QgeT1kLWYqMjtmb3IobGV0IF89MDtfPHk7KytfKWwudmFsdWVzW3YrX10tPXhbX119fX1yZXR1cm4gci5ibGVuZE1vZGU9UWgscn1jbGFzcyBRU3tzdGF0aWMgY29udmVydEFycmF5KHQsZSl7cmV0dXJuICRyKHQsZSl9c3RhdGljIGlzVHlwZWRBcnJheSh0KXtyZXR1cm4gdjAodCl9c3RhdGljIGdldEtleWZyYW1lT3JkZXIodCl7cmV0dXJuIE0wKHQpfXN0YXRpYyBzb3J0ZWRBcnJheSh0LGUsbil7cmV0dXJuIGpmKHQsZSxuKX1zdGF0aWMgZmxhdHRlbkpTT04odCxlLG4saSl7UWYodCxlLG4saSl9c3RhdGljIHN1YmNsaXAodCxlLG4saSxzPTMwKXtyZXR1cm4gS1ModCxlLG4saSxzKX1zdGF0aWMgbWFrZUNsaXBBZGRpdGl2ZSh0LGU9MCxuPXQsaT0zMCl7cmV0dXJuIGpTKHQsZSxuLGkpfX1jbGFzcyBfYXtjb25zdHJ1Y3Rvcih0LGUsbixpKXt0aGlzLnBhcmFtZXRlclBvc2l0aW9ucz10LHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5yZXN1bHRCdWZmZXI9aSE9PXZvaWQgMD9pOm5ldyBlLmNvbnN0cnVjdG9yKG4pLHRoaXMuc2FtcGxlVmFsdWVzPWUsdGhpcy52YWx1ZVNpemU9bix0aGlzLnNldHRpbmdzPW51bGwsdGhpcy5EZWZhdWx0U2V0dGluZ3NfPXt9fWV2YWx1YXRlKHQpe2NvbnN0IGU9dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM7bGV0IG49dGhpcy5fY2FjaGVkSW5kZXgsaT1lW25dLHM9ZVtuLTFdO3Q6e2U6e2xldCBvO246e2k6aWYoISh0PGkpKXtmb3IobGV0IGE9bisyOzspe2lmKGk9PT12b2lkIDApe2lmKHQ8cylicmVhayBpO3JldHVybiBuPWUubGVuZ3RoLHRoaXMuX2NhY2hlZEluZGV4PW4sdGhpcy5jb3B5U2FtcGxlVmFsdWVfKG4tMSl9aWYobj09PWEpYnJlYWs7aWYocz1pLGk9ZVsrK25dLHQ8aSlicmVhayBlfW89ZS5sZW5ndGg7YnJlYWsgbn1pZighKHQ+PXMpKXtjb25zdCBhPWVbMV07dDxhJiYobj0yLHM9YSk7Zm9yKGxldCBjPW4tMjs7KXtpZihzPT09dm9pZCAwKXJldHVybiB0aGlzLl9jYWNoZWRJbmRleD0wLHRoaXMuY29weVNhbXBsZVZhbHVlXygwKTtpZihuPT09YylicmVhaztpZihpPXMscz1lWy0tbi0xXSx0Pj1zKWJyZWFrIGV9bz1uLG49MDticmVhayBufWJyZWFrIHR9Zm9yKDtuPG87KXtjb25zdCBhPW4rbz4+PjE7dDxlW2FdP289YTpuPWErMX1pZihpPWVbbl0scz1lW24tMV0scz09PXZvaWQgMClyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oMCk7aWYoaT09PXZvaWQgMClyZXR1cm4gbj1lLmxlbmd0aCx0aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuY29weVNhbXBsZVZhbHVlXyhuLTEpfXRoaXMuX2NhY2hlZEluZGV4PW4sdGhpcy5pbnRlcnZhbENoYW5nZWRfKG4scyxpKX1yZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZV8obixzLHQsaSl9Z2V0U2V0dGluZ3NfKCl7cmV0dXJuIHRoaXMuc2V0dGluZ3N8fHRoaXMuRGVmYXVsdFNldHRpbmdzX31jb3B5U2FtcGxlVmFsdWVfKHQpe2NvbnN0IGU9dGhpcy5yZXN1bHRCdWZmZXIsbj10aGlzLnNhbXBsZVZhbHVlcyxpPXRoaXMudmFsdWVTaXplLHM9dCppO2ZvcihsZXQgbz0wO28hPT1pOysrbyllW29dPW5bcytvXTtyZXR1cm4gZX1pbnRlcnBvbGF0ZV8oKXt0aHJvdyBuZXcgRXJyb3IoImNhbGwgdG8gYWJzdHJhY3QgbWV0aG9kIil9aW50ZXJ2YWxDaGFuZ2VkXygpe319Y2xhc3MgUzAgZXh0ZW5kcyBfYXtjb25zdHJ1Y3Rvcih0LGUsbixpKXtzdXBlcih0LGUsbixpKSx0aGlzLl93ZWlnaHRQcmV2PS0wLHRoaXMuX29mZnNldFByZXY9LTAsdGhpcy5fd2VpZ2h0TmV4dD0tMCx0aGlzLl9vZmZzZXROZXh0PS0wLHRoaXMuRGVmYXVsdFNldHRpbmdzXz17ZW5kaW5nU3RhcnQ6UHIsZW5kaW5nRW5kOlByfX1pbnRlcnZhbENoYW5nZWRfKHQsZSxuKXtjb25zdCBpPXRoaXMucGFyYW1ldGVyUG9zaXRpb25zO2xldCBzPXQtMixvPXQrMSxhPWlbc10sYz1pW29dO2lmKGE9PT12b2lkIDApc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQpe2Nhc2UgTHI6cz10LGE9MiplLW47YnJlYWs7Y2FzZSBHbzpzPWkubGVuZ3RoLTIsYT1lK2lbc10taVtzKzFdO2JyZWFrO2RlZmF1bHQ6cz10LGE9bn1pZihjPT09dm9pZCAwKXN3aXRjaCh0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ0VuZCl7Y2FzZSBMcjpvPXQsYz0yKm4tZTticmVhaztjYXNlIEdvOm89MSxjPW4raVsxXS1pWzBdO2JyZWFrO2RlZmF1bHQ6bz10LTEsYz1lfWNvbnN0IGw9KG4tZSkqLjUsdT10aGlzLnZhbHVlU2l6ZTt0aGlzLl93ZWlnaHRQcmV2PWwvKGUtYSksdGhpcy5fd2VpZ2h0TmV4dD1sLyhjLW4pLHRoaXMuX29mZnNldFByZXY9cyp1LHRoaXMuX29mZnNldE5leHQ9byp1fWludGVycG9sYXRlXyh0LGUsbixpKXtjb25zdCBzPXRoaXMucmVzdWx0QnVmZmVyLG89dGhpcy5zYW1wbGVWYWx1ZXMsYT10aGlzLnZhbHVlU2l6ZSxjPXQqYSxsPWMtYSx1PXRoaXMuX29mZnNldFByZXYsaD10aGlzLl9vZmZzZXROZXh0LGY9dGhpcy5fd2VpZ2h0UHJldixkPXRoaXMuX3dlaWdodE5leHQscD0obi1lKS8oaS1lKSx4PXAqcCxnPXgqcCxtPS1mKmcrMipmKngtZipwLHY9KDErZikqZysoLTEuNS0yKmYpKngrKC0uNStmKSpwKzEseT0oLTEtZCkqZysoMS41K2QpKngrLjUqcCxfPWQqZy1kKng7Zm9yKGxldCBTPTA7UyE9PWE7KytTKXNbU109bSpvW3UrU10rdipvW2wrU10reSpvW2MrU10rXypvW2grU107cmV0dXJuIHN9fWNsYXNzIHRkIGV4dGVuZHMgX2F7Y29uc3RydWN0b3IodCxlLG4saSl7c3VwZXIodCxlLG4saSl9aW50ZXJwb2xhdGVfKHQsZSxuLGkpe2NvbnN0IHM9dGhpcy5yZXN1bHRCdWZmZXIsbz10aGlzLnNhbXBsZVZhbHVlcyxhPXRoaXMudmFsdWVTaXplLGM9dCphLGw9Yy1hLHU9KG4tZSkvKGktZSksaD0xLXU7Zm9yKGxldCBmPTA7ZiE9PWE7KytmKXNbZl09b1tsK2ZdKmgrb1tjK2ZdKnU7cmV0dXJuIHN9fWNsYXNzIGIwIGV4dGVuZHMgX2F7Y29uc3RydWN0b3IodCxlLG4saSl7c3VwZXIodCxlLG4saSl9aW50ZXJwb2xhdGVfKHQpe3JldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8odC0xKX19Y2xhc3MgWG57Y29uc3RydWN0b3IodCxlLG4saSl7aWYodD09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkIik7aWYoZT09PXZvaWQgMHx8ZS5sZW5ndGg9PT0wKXRocm93IG5ldyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogbm8ga2V5ZnJhbWVzIGluIHRyYWNrIG5hbWVkICIrdCk7dGhpcy5uYW1lPXQsdGhpcy50aW1lcz0kcihlLHRoaXMuVGltZUJ1ZmZlclR5cGUpLHRoaXMudmFsdWVzPSRyKG4sdGhpcy5WYWx1ZUJ1ZmZlclR5cGUpLHRoaXMuc2V0SW50ZXJwb2xhdGlvbihpfHx0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKX1zdGF0aWMgdG9KU09OKHQpe2NvbnN0IGU9dC5jb25zdHJ1Y3RvcjtsZXQgbjtpZihlLnRvSlNPTiE9PXRoaXMudG9KU09OKW49ZS50b0pTT04odCk7ZWxzZXtuPXtuYW1lOnQubmFtZSx0aW1lczokcih0LnRpbWVzLEFycmF5KSx2YWx1ZXM6JHIodC52YWx1ZXMsQXJyYXkpfTtjb25zdCBpPXQuZ2V0SW50ZXJwb2xhdGlvbigpO2khPT10LkRlZmF1bHRJbnRlcnBvbGF0aW9uJiYobi5pbnRlcnBvbGF0aW9uPWkpfXJldHVybiBuLnR5cGU9dC5WYWx1ZVR5cGVOYW1lLG59SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGUodCl7cmV0dXJuIG5ldyBiMCh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksdCl9SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyKHQpe3JldHVybiBuZXcgdGQodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLHQpfUludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aCh0KXtyZXR1cm4gbmV3IFMwKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSx0KX1zZXRJbnRlcnBvbGF0aW9uKHQpe2xldCBlO3N3aXRjaCh0KXtjYXNlIFZvOmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTticmVhaztjYXNlIFhjOmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI7YnJlYWs7Y2FzZSAkYzplPXRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoO2JyZWFrfWlmKGU9PT12b2lkIDApe2NvbnN0IG49InVuc3VwcG9ydGVkIGludGVycG9sYXRpb24gZm9yICIrdGhpcy5WYWx1ZVR5cGVOYW1lKyIga2V5ZnJhbWUgdHJhY2sgbmFtZWQgIit0aGlzLm5hbWU7aWYodGhpcy5jcmVhdGVJbnRlcnBvbGFudD09PXZvaWQgMClpZih0IT09dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil0aGlzLnNldEludGVycG9sYXRpb24odGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbik7ZWxzZSB0aHJvdyBuZXcgRXJyb3Iobik7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuS2V5ZnJhbWVUcmFjazoiLG4pLHRoaXN9cmV0dXJuIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ9ZSx0aGlzfWdldEludGVycG9sYXRpb24oKXtzd2l0Y2godGhpcy5jcmVhdGVJbnRlcnBvbGFudCl7Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOnJldHVybiBWbztjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOnJldHVybiBYYztjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnJldHVybiAkY319Z2V0VmFsdWVTaXplKCl7cmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aC90aGlzLnRpbWVzLmxlbmd0aH1zaGlmdCh0KXtpZih0IT09MCl7Y29uc3QgZT10aGlzLnRpbWVzO2ZvcihsZXQgbj0wLGk9ZS5sZW5ndGg7biE9PWk7KytuKWVbbl0rPXR9cmV0dXJuIHRoaXN9c2NhbGUodCl7aWYodCE9PTEpe2NvbnN0IGU9dGhpcy50aW1lcztmb3IobGV0IG49MCxpPWUubGVuZ3RoO24hPT1pOysrbillW25dKj10fXJldHVybiB0aGlzfXRyaW0odCxlKXtjb25zdCBuPXRoaXMudGltZXMsaT1uLmxlbmd0aDtsZXQgcz0wLG89aS0xO2Zvcig7cyE9PWkmJm5bc108dDspKytzO2Zvcig7byE9PS0xJiZuW29dPmU7KS0tbztpZigrK28scyE9PTB8fG8hPT1pKXtzPj1vJiYobz1NYXRoLm1heChvLDEpLHM9by0xKTtjb25zdCBhPXRoaXMuZ2V0VmFsdWVTaXplKCk7dGhpcy50aW1lcz1uLnNsaWNlKHMsbyksdGhpcy52YWx1ZXM9dGhpcy52YWx1ZXMuc2xpY2UocyphLG8qYSl9cmV0dXJuIHRoaXN9dmFsaWRhdGUoKXtsZXQgdD0hMDtjb25zdCBlPXRoaXMuZ2V0VmFsdWVTaXplKCk7ZS1NYXRoLmZsb29yKGUpIT09MCYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4iLHRoaXMpLHQ9ITEpO2NvbnN0IG49dGhpcy50aW1lcyxpPXRoaXMudmFsdWVzLHM9bi5sZW5ndGg7cz09PTAmJihjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBUcmFjayBpcyBlbXB0eS4iLHRoaXMpLHQ9ITEpO2xldCBvPW51bGw7Zm9yKGxldCBhPTA7YSE9PXM7YSsrKXtjb25zdCBjPW5bYV07aWYodHlwZW9mIGM9PSJudW1iZXIiJiZpc05hTihjKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIix0aGlzLGEsYyksdD0hMTticmVha31pZihvIT09bnVsbCYmbz5jKXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4iLHRoaXMsYSxjLG8pLHQ9ITE7YnJlYWt9bz1jfWlmKGkhPT12b2lkIDAmJnYwKGkpKWZvcihsZXQgYT0wLGM9aS5sZW5ndGg7YSE9PWM7KythKXtjb25zdCBsPWlbYV07aWYoaXNOYU4obCkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4iLHRoaXMsYSxsKSx0PSExO2JyZWFrfX1yZXR1cm4gdH1vcHRpbWl6ZSgpe2NvbnN0IHQ9dGhpcy50aW1lcy5zbGljZSgpLGU9dGhpcy52YWx1ZXMuc2xpY2UoKSxuPXRoaXMuZ2V0VmFsdWVTaXplKCksaT10aGlzLmdldEludGVycG9sYXRpb24oKT09PSRjLHM9dC5sZW5ndGgtMTtsZXQgbz0xO2ZvcihsZXQgYT0xO2E8czsrK2Epe2xldCBjPSExO2NvbnN0IGw9dFthXSx1PXRbYSsxXTtpZihsIT09dSYmKGEhPT0xfHxsIT09dFswXSkpaWYoaSljPSEwO2Vsc2V7Y29uc3QgaD1hKm4sZj1oLW4sZD1oK247Zm9yKGxldCBwPTA7cCE9PW47KytwKXtjb25zdCB4PWVbaCtwXTtpZih4IT09ZVtmK3BdfHx4IT09ZVtkK3BdKXtjPSEwO2JyZWFrfX19aWYoYyl7aWYoYSE9PW8pe3Rbb109dFthXTtjb25zdCBoPWEqbixmPW8qbjtmb3IobGV0IGQ9MDtkIT09bjsrK2QpZVtmK2RdPWVbaCtkXX0rK299fWlmKHM+MCl7dFtvXT10W3NdO2ZvcihsZXQgYT1zKm4sYz1vKm4sbD0wO2whPT1uOysrbCllW2MrbF09ZVthK2xdOysrb31yZXR1cm4gbyE9PXQubGVuZ3RoPyh0aGlzLnRpbWVzPXQuc2xpY2UoMCxvKSx0aGlzLnZhbHVlcz1lLnNsaWNlKDAsbypuKSk6KHRoaXMudGltZXM9dCx0aGlzLnZhbHVlcz1lKSx0aGlzfWNsb25lKCl7Y29uc3QgdD10aGlzLnRpbWVzLnNsaWNlKCksZT10aGlzLnZhbHVlcy5zbGljZSgpLG49dGhpcy5jb25zdHJ1Y3RvcixpPW5ldyBuKHRoaXMubmFtZSx0LGUpO3JldHVybiBpLmNyZWF0ZUludGVycG9sYW50PXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQsaX19WG4ucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9IiIsWG4ucHJvdG90eXBlLlRpbWVCdWZmZXJUeXBlPUZsb2F0MzJBcnJheSxYbi5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUZsb2F0MzJBcnJheSxYbi5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb249WGM7Y2xhc3MgcXIgZXh0ZW5kcyBYbntjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlLG4pfX1xci5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0iYm9vbCIscXIucHJvdG90eXBlLlZhbHVlQnVmZmVyVHlwZT1BcnJheSxxci5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb249Vm8scXIucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcj12b2lkIDAscXIucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aD12b2lkIDA7Y2xhc3MgZWQgZXh0ZW5kcyBYbntjb25zdHJ1Y3Rvcih0LGUsbixpKXtzdXBlcih0LGUsbixpKX19ZWQucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9ImNvbG9yIjtjbGFzcyB5YSBleHRlbmRzIFhue2NvbnN0cnVjdG9yKHQsZSxuLGkpe3N1cGVyKHQsZSxuLGkpfX15YS5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0ibnVtYmVyIjtjbGFzcyB3MCBleHRlbmRzIF9he2NvbnN0cnVjdG9yKHQsZSxuLGkpe3N1cGVyKHQsZSxuLGkpfWludGVycG9sYXRlXyh0LGUsbixpKXtjb25zdCBzPXRoaXMucmVzdWx0QnVmZmVyLG89dGhpcy5zYW1wbGVWYWx1ZXMsYT10aGlzLnZhbHVlU2l6ZSxjPShuLWUpLyhpLWUpO2xldCBsPXQqYTtmb3IobGV0IHU9bCthO2whPT11O2wrPTQpeW4uc2xlcnBGbGF0KHMsMCxvLGwtYSxvLGwsYyk7cmV0dXJuIHN9fWNsYXNzIHZhIGV4dGVuZHMgWG57Y29uc3RydWN0b3IodCxlLG4saSl7c3VwZXIodCxlLG4saSl9SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyKHQpe3JldHVybiBuZXcgdzAodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLHQpfX12YS5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0icXVhdGVybmlvbiIsdmEucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aD12b2lkIDA7Y2xhc3MgWXIgZXh0ZW5kcyBYbntjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlLG4pfX1Zci5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0ic3RyaW5nIixZci5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUFycmF5LFlyLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbj1WbyxZci5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyPXZvaWQgMCxZci5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoPXZvaWQgMDtjbGFzcyBNYSBleHRlbmRzIFhue2NvbnN0cnVjdG9yKHQsZSxuLGkpe3N1cGVyKHQsZSxuLGkpfX1NYS5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0idmVjdG9yIjtjbGFzcyBTYXtjb25zdHJ1Y3Rvcih0PSIiLGU9LTEsbj1bXSxpPXFjKXt0aGlzLm5hbWU9dCx0aGlzLnRyYWNrcz1uLHRoaXMuZHVyYXRpb249ZSx0aGlzLmJsZW5kTW9kZT1pLHRoaXMudXVpZD1MbigpLHRoaXMuZHVyYXRpb248MCYmdGhpcy5yZXNldER1cmF0aW9uKCl9c3RhdGljIHBhcnNlKHQpe2NvbnN0IGU9W10sbj10LnRyYWNrcyxpPTEvKHQuZnBzfHwxKTtmb3IobGV0IG89MCxhPW4ubGVuZ3RoO28hPT1hOysrbyllLnB1c2goZWIobltvXSkuc2NhbGUoaSkpO2NvbnN0IHM9bmV3IHRoaXModC5uYW1lLHQuZHVyYXRpb24sZSx0LmJsZW5kTW9kZSk7cmV0dXJuIHMudXVpZD10LnV1aWQsc31zdGF0aWMgdG9KU09OKHQpe2NvbnN0IGU9W10sbj10LnRyYWNrcyxpPXtuYW1lOnQubmFtZSxkdXJhdGlvbjp0LmR1cmF0aW9uLHRyYWNrczplLHV1aWQ6dC51dWlkLGJsZW5kTW9kZTp0LmJsZW5kTW9kZX07Zm9yKGxldCBzPTAsbz1uLmxlbmd0aDtzIT09bzsrK3MpZS5wdXNoKFhuLnRvSlNPTihuW3NdKSk7cmV0dXJuIGl9c3RhdGljIENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKHQsZSxuLGkpe2NvbnN0IHM9ZS5sZW5ndGgsbz1bXTtmb3IobGV0IGE9MDthPHM7YSsrKXtsZXQgYz1bXSxsPVtdO2MucHVzaCgoYStzLTEpJXMsYSwoYSsxKSVzKSxsLnB1c2goMCwxLDApO2NvbnN0IHU9TTAoYyk7Yz1qZihjLDEsdSksbD1qZihsLDEsdSksIWkmJmNbMF09PT0wJiYoYy5wdXNoKHMpLGwucHVzaChsWzBdKSksby5wdXNoKG5ldyB5YSgiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1siK2VbYV0ubmFtZSsiXSIsYyxsKS5zY2FsZSgxL24pKX1yZXR1cm4gbmV3IHRoaXModCwtMSxvKX1zdGF0aWMgZmluZEJ5TmFtZSh0LGUpe2xldCBuPXQ7aWYoIUFycmF5LmlzQXJyYXkodCkpe2NvbnN0IGk9dDtuPWkuZ2VvbWV0cnkmJmkuZ2VvbWV0cnkuYW5pbWF0aW9uc3x8aS5hbmltYXRpb25zfWZvcihsZXQgaT0wO2k8bi5sZW5ndGg7aSsrKWlmKG5baV0ubmFtZT09PWUpcmV0dXJuIG5baV07cmV0dXJuIG51bGx9c3RhdGljIENyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzKHQsZSxuKXtjb25zdCBpPXt9LHM9L14oW1x3LV0qPykoW1xkXSspJC87Zm9yKGxldCBhPTAsYz10Lmxlbmd0aDthPGM7YSsrKXtjb25zdCBsPXRbYV0sdT1sLm5hbWUubWF0Y2gocyk7aWYodSYmdS5sZW5ndGg+MSl7Y29uc3QgaD11WzFdO2xldCBmPWlbaF07Znx8KGlbaF09Zj1bXSksZi5wdXNoKGwpfX1jb25zdCBvPVtdO2Zvcihjb25zdCBhIGluIGkpby5wdXNoKHRoaXMuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoYSxpW2FdLGUsbikpO3JldHVybiBvfXN0YXRpYyBwYXJzZUFuaW1hdGlvbih0LGUpe2lmKGNvbnNvbGUud2FybigiVEhSRUUuQW5pbWF0aW9uQ2xpcDogcGFyc2VBbmltYXRpb24oKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgd2l0aCByMTg1IiksIXQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkFuaW1hdGlvbkNsaXA6IE5vIGFuaW1hdGlvbiBpbiBKU09OTG9hZGVyIGRhdGEuIiksbnVsbDtjb25zdCBuPWZ1bmN0aW9uKGgsZixkLHAseCl7aWYoZC5sZW5ndGghPT0wKXtjb25zdCBnPVtdLG09W107UWYoZCxnLG0scCksZy5sZW5ndGghPT0wJiZ4LnB1c2gobmV3IGgoZixnLG0pKX19LGk9W10scz10Lm5hbWV8fCJkZWZhdWx0IixvPXQuZnBzfHwzMCxhPXQuYmxlbmRNb2RlO2xldCBjPXQubGVuZ3RofHwtMTtjb25zdCBsPXQuaGllcmFyY2h5fHxbXTtmb3IobGV0IGg9MDtoPGwubGVuZ3RoO2grKyl7Y29uc3QgZj1sW2hdLmtleXM7aWYoISghZnx8Zi5sZW5ndGg9PT0wKSlpZihmWzBdLm1vcnBoVGFyZ2V0cyl7Y29uc3QgZD17fTtsZXQgcDtmb3IocD0wO3A8Zi5sZW5ndGg7cCsrKWlmKGZbcF0ubW9ycGhUYXJnZXRzKWZvcihsZXQgeD0wO3g8ZltwXS5tb3JwaFRhcmdldHMubGVuZ3RoO3grKylkW2ZbcF0ubW9ycGhUYXJnZXRzW3hdXT0tMTtmb3IoY29uc3QgeCBpbiBkKXtjb25zdCBnPVtdLG09W107Zm9yKGxldCB2PTA7diE9PWZbcF0ubW9ycGhUYXJnZXRzLmxlbmd0aDsrK3Ype2NvbnN0IHk9ZltwXTtnLnB1c2goeS50aW1lKSxtLnB1c2goeS5tb3JwaFRhcmdldD09PXg/MTowKX1pLnB1c2gobmV3IHlhKCIubW9ycGhUYXJnZXRJbmZsdWVuY2VbIit4KyJdIixnLG0pKX1jPWQubGVuZ3RoKm99ZWxzZXtjb25zdCBkPSIuYm9uZXNbIitlW2hdLm5hbWUrIl0iO24oTWEsZCsiLnBvc2l0aW9uIixmLCJwb3MiLGkpLG4odmEsZCsiLnF1YXRlcm5pb24iLGYsInJvdCIsaSksbihNYSxkKyIuc2NhbGUiLGYsInNjbCIsaSl9fXJldHVybiBpLmxlbmd0aD09PTA/bnVsbDpuZXcgdGhpcyhzLGMsaSxhKX1yZXNldER1cmF0aW9uKCl7Y29uc3QgdD10aGlzLnRyYWNrcztsZXQgZT0wO2ZvcihsZXQgbj0wLGk9dC5sZW5ndGg7biE9PWk7KytuKXtjb25zdCBzPXRoaXMudHJhY2tzW25dO2U9TWF0aC5tYXgoZSxzLnRpbWVzW3MudGltZXMubGVuZ3RoLTFdKX1yZXR1cm4gdGhpcy5kdXJhdGlvbj1lLHRoaXN9dHJpbSgpe2ZvcihsZXQgdD0wO3Q8dGhpcy50cmFja3MubGVuZ3RoO3QrKyl0aGlzLnRyYWNrc1t0XS50cmltKDAsdGhpcy5kdXJhdGlvbik7cmV0dXJuIHRoaXN9dmFsaWRhdGUoKXtsZXQgdD0hMDtmb3IobGV0IGU9MDtlPHRoaXMudHJhY2tzLmxlbmd0aDtlKyspdD10JiZ0aGlzLnRyYWNrc1tlXS52YWxpZGF0ZSgpO3JldHVybiB0fW9wdGltaXplKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnRyYWNrcy5sZW5ndGg7dCsrKXRoaXMudHJhY2tzW3RdLm9wdGltaXplKCk7cmV0dXJuIHRoaXN9Y2xvbmUoKXtjb25zdCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy50cmFja3MubGVuZ3RoO2UrKyl0LnB1c2godGhpcy50cmFja3NbZV0uY2xvbmUoKSk7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMubmFtZSx0aGlzLmR1cmF0aW9uLHQsdGhpcy5ibGVuZE1vZGUpfXRvSlNPTigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvSlNPTih0aGlzKX19ZnVuY3Rpb24gdGIocil7c3dpdGNoKHIudG9Mb3dlckNhc2UoKSl7Y2FzZSJzY2FsYXIiOmNhc2UiZG91YmxlIjpjYXNlImZsb2F0IjpjYXNlIm51bWJlciI6Y2FzZSJpbnRlZ2VyIjpyZXR1cm4geWE7Y2FzZSJ2ZWN0b3IiOmNhc2UidmVjdG9yMiI6Y2FzZSJ2ZWN0b3IzIjpjYXNlInZlY3RvcjQiOnJldHVybiBNYTtjYXNlImNvbG9yIjpyZXR1cm4gZWQ7Y2FzZSJxdWF0ZXJuaW9uIjpyZXR1cm4gdmE7Y2FzZSJib29sIjpjYXNlImJvb2xlYW4iOnJldHVybiBxcjtjYXNlInN0cmluZyI6cmV0dXJuIFlyfXRocm93IG5ldyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVW5zdXBwb3J0ZWQgdHlwZU5hbWU6ICIrcil9ZnVuY3Rpb24gZWIocil7aWYoci50eXBlPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UiKTtjb25zdCB0PXRiKHIudHlwZSk7aWYoci50aW1lcz09PXZvaWQgMCl7Y29uc3QgZT1bXSxuPVtdO1FmKHIua2V5cyxlLG4sInZhbHVlIiksci50aW1lcz1lLHIudmFsdWVzPW59cmV0dXJuIHQucGFyc2UhPT12b2lkIDA/dC5wYXJzZShyKTpuZXcgdChyLm5hbWUsci50aW1lcyxyLnZhbHVlcyxyLmludGVycG9sYXRpb24pfWNvbnN0IEdpPXtlbmFibGVkOiExLGZpbGVzOnt9LGFkZDpmdW5jdGlvbihyLHQpe3RoaXMuZW5hYmxlZCE9PSExJiYodGhpcy5maWxlc1tyXT10KX0sZ2V0OmZ1bmN0aW9uKHIpe2lmKHRoaXMuZW5hYmxlZCE9PSExKXJldHVybiB0aGlzLmZpbGVzW3JdfSxyZW1vdmU6ZnVuY3Rpb24ocil7ZGVsZXRlIHRoaXMuZmlsZXNbcl19LGNsZWFyOmZ1bmN0aW9uKCl7dGhpcy5maWxlcz17fX19O2NsYXNzIG5ke2NvbnN0cnVjdG9yKHQsZSxuKXtjb25zdCBpPXRoaXM7bGV0IHM9ITEsbz0wLGE9MCxjO2NvbnN0IGw9W107dGhpcy5vblN0YXJ0PXZvaWQgMCx0aGlzLm9uTG9hZD10LHRoaXMub25Qcm9ncmVzcz1lLHRoaXMub25FcnJvcj1uLHRoaXMuaXRlbVN0YXJ0PWZ1bmN0aW9uKHUpe2ErKyxzPT09ITEmJmkub25TdGFydCE9PXZvaWQgMCYmaS5vblN0YXJ0KHUsbyxhKSxzPSEwfSx0aGlzLml0ZW1FbmQ9ZnVuY3Rpb24odSl7bysrLGkub25Qcm9ncmVzcyE9PXZvaWQgMCYmaS5vblByb2dyZXNzKHUsbyxhKSxvPT09YSYmKHM9ITEsaS5vbkxvYWQhPT12b2lkIDAmJmkub25Mb2FkKCkpfSx0aGlzLml0ZW1FcnJvcj1mdW5jdGlvbih1KXtpLm9uRXJyb3IhPT12b2lkIDAmJmkub25FcnJvcih1KX0sdGhpcy5yZXNvbHZlVVJMPWZ1bmN0aW9uKHUpe3JldHVybiBjP2ModSk6dX0sdGhpcy5zZXRVUkxNb2RpZmllcj1mdW5jdGlvbih1KXtyZXR1cm4gYz11LHRoaXN9LHRoaXMuYWRkSGFuZGxlcj1mdW5jdGlvbih1LGgpe3JldHVybiBsLnB1c2godSxoKSx0aGlzfSx0aGlzLnJlbW92ZUhhbmRsZXI9ZnVuY3Rpb24odSl7Y29uc3QgaD1sLmluZGV4T2YodSk7cmV0dXJuIGghPT0tMSYmbC5zcGxpY2UoaCwyKSx0aGlzfSx0aGlzLmdldEhhbmRsZXI9ZnVuY3Rpb24odSl7Zm9yKGxldCBoPTAsZj1sLmxlbmd0aDtoPGY7aCs9Mil7Y29uc3QgZD1sW2hdLHA9bFtoKzFdO2lmKGQuZ2xvYmFsJiYoZC5sYXN0SW5kZXg9MCksZC50ZXN0KHUpKXJldHVybiBwfXJldHVybiBudWxsfX19Y29uc3QgQTA9bmV3IG5kO2NsYXNzIFNue2NvbnN0cnVjdG9yKHQpe3RoaXMubWFuYWdlcj10IT09dm9pZCAwP3Q6QTAsdGhpcy5jcm9zc09yaWdpbj0iYW5vbnltb3VzIix0aGlzLndpdGhDcmVkZW50aWFscz0hMSx0aGlzLnBhdGg9IiIsdGhpcy5yZXNvdXJjZVBhdGg9IiIsdGhpcy5yZXF1ZXN0SGVhZGVyPXt9fWxvYWQoKXt9bG9hZEFzeW5jKHQsZSl7Y29uc3Qgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihpLHMpe24ubG9hZCh0LGksZSxzKX0pfXBhcnNlKCl7fXNldENyb3NzT3JpZ2luKHQpe3JldHVybiB0aGlzLmNyb3NzT3JpZ2luPXQsdGhpc31zZXRXaXRoQ3JlZGVudGlhbHModCl7cmV0dXJuIHRoaXMud2l0aENyZWRlbnRpYWxzPXQsdGhpc31zZXRQYXRoKHQpe3JldHVybiB0aGlzLnBhdGg9dCx0aGlzfXNldFJlc291cmNlUGF0aCh0KXtyZXR1cm4gdGhpcy5yZXNvdXJjZVBhdGg9dCx0aGlzfXNldFJlcXVlc3RIZWFkZXIodCl7cmV0dXJuIHRoaXMucmVxdWVzdEhlYWRlcj10LHRoaXN9fVNuLkRFRkFVTFRfTUFURVJJQUxfTkFNRT0iX19ERUZBVUxUIjtjb25zdCBIaT17fTtjbGFzcyBuYiBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCksdGhpcy5yZXNwb25zZT1lfX1jbGFzcyBXaSBleHRlbmRzIFNue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMubWltZVR5cGU9IiIsdGhpcy5yZXNwb25zZVR5cGU9IiJ9bG9hZCh0LGUsbixpKXt0PT09dm9pZCAwJiYodD0iIiksdGhpcy5wYXRoIT09dm9pZCAwJiYodD10aGlzLnBhdGgrdCksdD10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCh0KTtjb25zdCBzPUdpLmdldCh0KTtpZihzIT09dm9pZCAwKXJldHVybiB0aGlzLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLHNldFRpbWVvdXQoKCk9PntlJiZlKHMpLHRoaXMubWFuYWdlci5pdGVtRW5kKHQpfSwwKSxzO2lmKEhpW3RdIT09dm9pZCAwKXtIaVt0XS5wdXNoKHtvbkxvYWQ6ZSxvblByb2dyZXNzOm4sb25FcnJvcjppfSk7cmV0dXJufUhpW3RdPVtdLEhpW3RdLnB1c2goe29uTG9hZDplLG9uUHJvZ3Jlc3M6bixvbkVycm9yOml9KTtjb25zdCBvPW5ldyBSZXF1ZXN0KHQse2hlYWRlcnM6bmV3IEhlYWRlcnModGhpcy5yZXF1ZXN0SGVhZGVyKSxjcmVkZW50aWFsczp0aGlzLndpdGhDcmVkZW50aWFscz8iaW5jbHVkZSI6InNhbWUtb3JpZ2luIn0pLGE9dGhpcy5taW1lVHlwZSxjPXRoaXMucmVzcG9uc2VUeXBlO2ZldGNoKG8pLnRoZW4obD0+e2lmKGwuc3RhdHVzPT09MjAwfHxsLnN0YXR1cz09PTApe2lmKGwuc3RhdHVzPT09MCYmY29uc29sZS53YXJuKCJUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLiIpLHR5cGVvZiBSZWFkYWJsZVN0cmVhbT09InVuZGVmaW5lZCJ8fGwuYm9keT09PXZvaWQgMHx8bC5ib2R5LmdldFJlYWRlcj09PXZvaWQgMClyZXR1cm4gbDtjb25zdCB1PUhpW3RdLGg9bC5ib2R5LmdldFJlYWRlcigpLGY9bC5oZWFkZXJzLmdldCgiWC1GaWxlLVNpemUiKXx8bC5oZWFkZXJzLmdldCgiQ29udGVudC1MZW5ndGgiKSxkPWY/cGFyc2VJbnQoZik6MCxwPWQhPT0wO2xldCB4PTA7Y29uc3QgZz1uZXcgUmVhZGFibGVTdHJlYW0oe3N0YXJ0KG0pe3YoKTtmdW5jdGlvbiB2KCl7aC5yZWFkKCkudGhlbigoe2RvbmU6eSx2YWx1ZTpffSk9PntpZih5KW0uY2xvc2UoKTtlbHNle3grPV8uYnl0ZUxlbmd0aDtjb25zdCBTPW5ldyBQcm9ncmVzc0V2ZW50KCJwcm9ncmVzcyIse2xlbmd0aENvbXB1dGFibGU6cCxsb2FkZWQ6eCx0b3RhbDpkfSk7Zm9yKGxldCB3PTAsQT11Lmxlbmd0aDt3PEE7dysrKXtjb25zdCBUPXVbd107VC5vblByb2dyZXNzJiZULm9uUHJvZ3Jlc3MoUyl9bS5lbnF1ZXVlKF8pLHYoKX19LHk9PnttLmVycm9yKHkpfSl9fX0pO3JldHVybiBuZXcgUmVzcG9uc2UoZyl9ZWxzZSB0aHJvdyBuZXcgbmIoYGZldGNoIGZvciAiJHtsLnVybH0iIHJlc3BvbmRlZCB3aXRoICR7bC5zdGF0dXN9OiAke2wuc3RhdHVzVGV4dH1gLGwpfSkudGhlbihsPT57c3dpdGNoKGMpe2Nhc2UiYXJyYXlidWZmZXIiOnJldHVybiBsLmFycmF5QnVmZmVyKCk7Y2FzZSJibG9iIjpyZXR1cm4gbC5ibG9iKCk7Y2FzZSJkb2N1bWVudCI6cmV0dXJuIGwudGV4dCgpLnRoZW4odT0+bmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh1LGEpKTtjYXNlImpzb24iOnJldHVybiBsLmpzb24oKTtkZWZhdWx0OmlmKGE9PT0iIilyZXR1cm4gbC50ZXh0KCk7e2NvbnN0IGg9L2NoYXJzZXQ9Ij8oW147IlxzXSopIj8vaS5leGVjKGEpLGY9aCYmaFsxXT9oWzFdLnRvTG93ZXJDYXNlKCk6dm9pZCAwLGQ9bmV3IFRleHREZWNvZGVyKGYpO3JldHVybiBsLmFycmF5QnVmZmVyKCkudGhlbihwPT5kLmRlY29kZShwKSl9fX0pLnRoZW4obD0+e0dpLmFkZCh0LGwpO2NvbnN0IHU9SGlbdF07ZGVsZXRlIEhpW3RdO2ZvcihsZXQgaD0wLGY9dS5sZW5ndGg7aDxmO2grKyl7Y29uc3QgZD11W2hdO2Qub25Mb2FkJiZkLm9uTG9hZChsKX19KS5jYXRjaChsPT57Y29uc3QgdT1IaVt0XTtpZih1PT09dm9pZCAwKXRocm93IHRoaXMubWFuYWdlci5pdGVtRXJyb3IodCksbDtkZWxldGUgSGlbdF07Zm9yKGxldCBoPTAsZj11Lmxlbmd0aDtoPGY7aCsrKXtjb25zdCBkPXVbaF07ZC5vbkVycm9yJiZkLm9uRXJyb3IobCl9dGhpcy5tYW5hZ2VyLml0ZW1FcnJvcih0KX0pLmZpbmFsbHkoKCk9Pnt0aGlzLm1hbmFnZXIuaXRlbUVuZCh0KX0pLHRoaXMubWFuYWdlci5pdGVtU3RhcnQodCl9c2V0UmVzcG9uc2VUeXBlKHQpe3JldHVybiB0aGlzLnJlc3BvbnNlVHlwZT10LHRoaXN9c2V0TWltZVR5cGUodCl7cmV0dXJuIHRoaXMubWltZVR5cGU9dCx0aGlzfX1jbGFzcyBpYiBleHRlbmRzIFNue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4saSl7Y29uc3Qgcz10aGlzLG89bmV3IFdpKHRoaXMubWFuYWdlcik7by5zZXRQYXRoKHRoaXMucGF0aCksby5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksby5zZXRXaXRoQ3JlZGVudGlhbHModGhpcy53aXRoQ3JlZGVudGlhbHMpLG8ubG9hZCh0LGZ1bmN0aW9uKGEpe3RyeXtlKHMucGFyc2UoSlNPTi5wYXJzZShhKSkpfWNhdGNoKGMpe2k/aShjKTpjb25zb2xlLmVycm9yKGMpLHMubWFuYWdlci5pdGVtRXJyb3IodCl9fSxuLGkpfXBhcnNlKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IGk9U2EucGFyc2UodFtuXSk7ZS5wdXNoKGkpfXJldHVybiBlfX1jbGFzcyByYiBleHRlbmRzIFNue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4saSl7Y29uc3Qgcz10aGlzLG89W10sYT1uZXcgRmwsYz1uZXcgV2kodGhpcy5tYW5hZ2VyKTtjLnNldFBhdGgodGhpcy5wYXRoKSxjLnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKSxjLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxjLnNldFdpdGhDcmVkZW50aWFscyhzLndpdGhDcmVkZW50aWFscyk7bGV0IGw9MDtmdW5jdGlvbiB1KGgpe2MubG9hZCh0W2hdLGZ1bmN0aW9uKGYpe2NvbnN0IGQ9cy5wYXJzZShmLCEwKTtvW2hdPXt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodCxmb3JtYXQ6ZC5mb3JtYXQsbWlwbWFwczpkLm1pcG1hcHN9LGwrPTEsbD09PTYmJihkLm1pcG1hcENvdW50PT09MSYmKGEubWluRmlsdGVyPXplKSxhLmltYWdlPW8sYS5mb3JtYXQ9ZC5mb3JtYXQsYS5uZWVkc1VwZGF0ZT0hMCxlJiZlKGEpKX0sbixpKX1pZihBcnJheS5pc0FycmF5KHQpKWZvcihsZXQgaD0wLGY9dC5sZW5ndGg7aDxmOysraCl1KGgpO2Vsc2UgYy5sb2FkKHQsZnVuY3Rpb24oaCl7Y29uc3QgZj1zLnBhcnNlKGgsITApO2lmKGYuaXNDdWJlbWFwKXtjb25zdCBkPWYubWlwbWFwcy5sZW5ndGgvZi5taXBtYXBDb3VudDtmb3IobGV0IHA9MDtwPGQ7cCsrKXtvW3BdPXttaXBtYXBzOltdfTtmb3IobGV0IHg9MDt4PGYubWlwbWFwQ291bnQ7eCsrKW9bcF0ubWlwbWFwcy5wdXNoKGYubWlwbWFwc1twKmYubWlwbWFwQ291bnQreF0pLG9bcF0uZm9ybWF0PWYuZm9ybWF0LG9bcF0ud2lkdGg9Zi53aWR0aCxvW3BdLmhlaWdodD1mLmhlaWdodH1hLmltYWdlPW99ZWxzZSBhLmltYWdlLndpZHRoPWYud2lkdGgsYS5pbWFnZS5oZWlnaHQ9Zi5oZWlnaHQsYS5taXBtYXBzPWYubWlwbWFwcztmLm1pcG1hcENvdW50PT09MSYmKGEubWluRmlsdGVyPXplKSxhLmZvcm1hdD1mLmZvcm1hdCxhLm5lZWRzVXBkYXRlPSEwLGUmJmUoYSl9LG4saSk7cmV0dXJuIGF9fWNsYXNzIGJhIGV4dGVuZHMgU257Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsbixpKXt0aGlzLnBhdGghPT12b2lkIDAmJih0PXRoaXMucGF0aCt0KSx0PXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKHQpO2NvbnN0IHM9dGhpcyxvPUdpLmdldCh0KTtpZihvIT09dm9pZCAwKXJldHVybiBzLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlJiZlKG8pLHMubWFuYWdlci5pdGVtRW5kKHQpfSwwKSxvO2NvbnN0IGE9cW8oImltZyIpO2Z1bmN0aW9uIGMoKXt1KCksR2kuYWRkKHQsdGhpcyksZSYmZSh0aGlzKSxzLm1hbmFnZXIuaXRlbUVuZCh0KX1mdW5jdGlvbiBsKGgpe3UoKSxpJiZpKGgpLHMubWFuYWdlci5pdGVtRXJyb3IodCkscy5tYW5hZ2VyLml0ZW1FbmQodCl9ZnVuY3Rpb24gdSgpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsYywhMSksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsbCwhMSl9cmV0dXJuIGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYywhMSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsbCwhMSksdC5zbGljZSgwLDUpIT09ImRhdGE6IiYmdGhpcy5jcm9zc09yaWdpbiE9PXZvaWQgMCYmKGEuY3Jvc3NPcmlnaW49dGhpcy5jcm9zc09yaWdpbikscy5tYW5hZ2VyLml0ZW1TdGFydCh0KSxhLnNyYz10LGF9fWNsYXNzIHNiIGV4dGVuZHMgU257Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsbixpKXtjb25zdCBzPW5ldyB0YTtzLmNvbG9yU3BhY2U9X247Y29uc3Qgbz1uZXcgYmEodGhpcy5tYW5hZ2VyKTtvLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pLG8uc2V0UGF0aCh0aGlzLnBhdGgpO2xldCBhPTA7ZnVuY3Rpb24gYyhsKXtvLmxvYWQodFtsXSxmdW5jdGlvbih1KXtzLmltYWdlc1tsXT11LGErKyxhPT09NiYmKHMubmVlZHNVcGRhdGU9ITAsZSYmZShzKSl9LHZvaWQgMCxpKX1mb3IobGV0IGw9MDtsPHQubGVuZ3RoOysrbCljKGwpO3JldHVybiBzfX1jbGFzcyBvYiBleHRlbmRzIFNue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4saSl7Y29uc3Qgcz10aGlzLG89bmV3IE1pLGE9bmV3IFdpKHRoaXMubWFuYWdlcik7cmV0dXJuIGEuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLGEuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLGEuc2V0UGF0aCh0aGlzLnBhdGgpLGEuc2V0V2l0aENyZWRlbnRpYWxzKHMud2l0aENyZWRlbnRpYWxzKSxhLmxvYWQodCxmdW5jdGlvbihjKXtsZXQgbDt0cnl7bD1zLnBhcnNlKGMpfWNhdGNoKHUpe2lmKGkhPT12b2lkIDApaSh1KTtlbHNle2NvbnNvbGUuZXJyb3IodSk7cmV0dXJufX1sLmltYWdlIT09dm9pZCAwP28uaW1hZ2U9bC5pbWFnZTpsLmRhdGEhPT12b2lkIDAmJihvLmltYWdlLndpZHRoPWwud2lkdGgsby5pbWFnZS5oZWlnaHQ9bC5oZWlnaHQsby5pbWFnZS5kYXRhPWwuZGF0YSksby53cmFwUz1sLndyYXBTIT09dm9pZCAwP2wud3JhcFM6R24sby53cmFwVD1sLndyYXBUIT09dm9pZCAwP2wud3JhcFQ6R24sby5tYWdGaWx0ZXI9bC5tYWdGaWx0ZXIhPT12b2lkIDA/bC5tYWdGaWx0ZXI6emUsby5taW5GaWx0ZXI9bC5taW5GaWx0ZXIhPT12b2lkIDA/bC5taW5GaWx0ZXI6emUsby5hbmlzb3Ryb3B5PWwuYW5pc290cm9weSE9PXZvaWQgMD9sLmFuaXNvdHJvcHk6MSxsLmNvbG9yU3BhY2UhPT12b2lkIDAmJihvLmNvbG9yU3BhY2U9bC5jb2xvclNwYWNlKSxsLmZsaXBZIT09dm9pZCAwJiYoby5mbGlwWT1sLmZsaXBZKSxsLmZvcm1hdCE9PXZvaWQgMCYmKG8uZm9ybWF0PWwuZm9ybWF0KSxsLnR5cGUhPT12b2lkIDAmJihvLnR5cGU9bC50eXBlKSxsLm1pcG1hcHMhPT12b2lkIDAmJihvLm1pcG1hcHM9bC5taXBtYXBzLG8ubWluRmlsdGVyPV9pKSxsLm1pcG1hcENvdW50PT09MSYmKG8ubWluRmlsdGVyPXplKSxsLmdlbmVyYXRlTWlwbWFwcyE9PXZvaWQgMCYmKG8uZ2VuZXJhdGVNaXBtYXBzPWwuZ2VuZXJhdGVNaXBtYXBzKSxvLm5lZWRzVXBkYXRlPSEwLGUmJmUobyxsKX0sbixpKSxvfX1jbGFzcyBhYiBleHRlbmRzIFNue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4saSl7Y29uc3Qgcz1uZXcgQWUsbz1uZXcgYmEodGhpcy5tYW5hZ2VyKTtyZXR1cm4gby5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKSxvLnNldFBhdGgodGhpcy5wYXRoKSxvLmxvYWQodCxmdW5jdGlvbihhKXtzLmltYWdlPWEscy5uZWVkc1VwZGF0ZT0hMCxlIT09dm9pZCAwJiZlKHMpfSxuLGkpLHN9fWNsYXNzIF9yIGV4dGVuZHMgc2V7Y29uc3RydWN0b3IodCxlPTEpe3N1cGVyKCksdGhpcy5pc0xpZ2h0PSEwLHRoaXMudHlwZT0iTGlnaHQiLHRoaXMuY29sb3I9bmV3IHl0KHQpLHRoaXMuaW50ZW5zaXR5PWV9ZGlzcG9zZSgpe31jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5pbnRlbnNpdHk9dC5pbnRlbnNpdHksdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0LmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCksZS5vYmplY3QuaW50ZW5zaXR5PXRoaXMuaW50ZW5zaXR5LHRoaXMuZ3JvdW5kQ29sb3IhPT12b2lkIDAmJihlLm9iamVjdC5ncm91bmRDb2xvcj10aGlzLmdyb3VuZENvbG9yLmdldEhleCgpKSx0aGlzLmRpc3RhbmNlIT09dm9pZCAwJiYoZS5vYmplY3QuZGlzdGFuY2U9dGhpcy5kaXN0YW5jZSksdGhpcy5hbmdsZSE9PXZvaWQgMCYmKGUub2JqZWN0LmFuZ2xlPXRoaXMuYW5nbGUpLHRoaXMuZGVjYXkhPT12b2lkIDAmJihlLm9iamVjdC5kZWNheT10aGlzLmRlY2F5KSx0aGlzLnBlbnVtYnJhIT09dm9pZCAwJiYoZS5vYmplY3QucGVudW1icmE9dGhpcy5wZW51bWJyYSksdGhpcy5zaGFkb3chPT12b2lkIDAmJihlLm9iamVjdC5zaGFkb3c9dGhpcy5zaGFkb3cudG9KU09OKCkpLHRoaXMudGFyZ2V0IT09dm9pZCAwJiYoZS5vYmplY3QudGFyZ2V0PXRoaXMudGFyZ2V0LnV1aWQpLGV9fWNsYXNzIFQwIGV4dGVuZHMgX3J7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQsbiksdGhpcy5pc0hlbWlzcGhlcmVMaWdodD0hMCx0aGlzLnR5cGU9IkhlbWlzcGhlcmVMaWdodCIsdGhpcy5wb3NpdGlvbi5jb3B5KHNlLkRFRkFVTFRfVVApLHRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5ncm91bmRDb2xvcj1uZXcgeXQoZSl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5ncm91bmRDb2xvci5jb3B5KHQuZ3JvdW5kQ29sb3IpLHRoaXN9fWNvbnN0IGlkPW5ldyBDdCxFMD1uZXcgSSxDMD1uZXcgSTtjbGFzcyByZHtjb25zdHJ1Y3Rvcih0KXt0aGlzLmNhbWVyYT10LHRoaXMuaW50ZW5zaXR5PTEsdGhpcy5iaWFzPTAsdGhpcy5ub3JtYWxCaWFzPTAsdGhpcy5yYWRpdXM9MSx0aGlzLmJsdXJTYW1wbGVzPTgsdGhpcy5tYXBTaXplPW5ldyBxKDUxMiw1MTIpLHRoaXMubWFwVHlwZT1uaSx0aGlzLm1hcD1udWxsLHRoaXMubWFwUGFzcz1udWxsLHRoaXMubWF0cml4PW5ldyBDdCx0aGlzLmF1dG9VcGRhdGU9ITAsdGhpcy5uZWVkc1VwZGF0ZT0hMSx0aGlzLl9mcnVzdHVtPW5ldyBRcyx0aGlzLl9mcmFtZUV4dGVudHM9bmV3IHEoMSwxKSx0aGlzLl92aWV3cG9ydENvdW50PTEsdGhpcy5fdmlld3BvcnRzPVtuZXcgUXQoMCwwLDEsMSldfWdldFZpZXdwb3J0Q291bnQoKXtyZXR1cm4gdGhpcy5fdmlld3BvcnRDb3VudH1nZXRGcnVzdHVtKCl7cmV0dXJuIHRoaXMuX2ZydXN0dW19dXBkYXRlTWF0cmljZXModCl7Y29uc3QgZT10aGlzLmNhbWVyYSxuPXRoaXMubWF0cml4O0UwLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSxlLnBvc2l0aW9uLmNvcHkoRTApLEMwLnNldEZyb21NYXRyaXhQb3NpdGlvbih0LnRhcmdldC5tYXRyaXhXb3JsZCksZS5sb29rQXQoQzApLGUudXBkYXRlTWF0cml4V29ybGQoKSxpZC5tdWx0aXBseU1hdHJpY2VzKGUucHJvamVjdGlvbk1hdHJpeCxlLm1hdHJpeFdvcmxkSW52ZXJzZSksdGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChpZCksbi5zZXQoLjUsMCwwLC41LDAsLjUsMCwuNSwwLDAsLjUsLjUsMCwwLDAsMSksbi5tdWx0aXBseShpZCl9Z2V0Vmlld3BvcnQodCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1t0XX1nZXRGcmFtZUV4dGVudHMoKXtyZXR1cm4gdGhpcy5fZnJhbWVFeHRlbnRzfWRpc3Bvc2UoKXt0aGlzLm1hcCYmdGhpcy5tYXAuZGlzcG9zZSgpLHRoaXMubWFwUGFzcyYmdGhpcy5tYXBQYXNzLmRpc3Bvc2UoKX1jb3B5KHQpe3JldHVybiB0aGlzLmNhbWVyYT10LmNhbWVyYS5jbG9uZSgpLHRoaXMuaW50ZW5zaXR5PXQuaW50ZW5zaXR5LHRoaXMuYmlhcz10LmJpYXMsdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpcy5hdXRvVXBkYXRlPXQuYXV0b1VwZGF0ZSx0aGlzLm5lZWRzVXBkYXRlPXQubmVlZHNVcGRhdGUsdGhpcy5ub3JtYWxCaWFzPXQubm9ybWFsQmlhcyx0aGlzLmJsdXJTYW1wbGVzPXQuYmx1clNhbXBsZXMsdGhpcy5tYXBTaXplLmNvcHkodC5tYXBTaXplKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX10b0pTT04oKXtjb25zdCB0PXt9O3JldHVybiB0aGlzLmludGVuc2l0eSE9PTEmJih0LmludGVuc2l0eT10aGlzLmludGVuc2l0eSksdGhpcy5iaWFzIT09MCYmKHQuYmlhcz10aGlzLmJpYXMpLHRoaXMubm9ybWFsQmlhcyE9PTAmJih0Lm5vcm1hbEJpYXM9dGhpcy5ub3JtYWxCaWFzKSx0aGlzLnJhZGl1cyE9PTEmJih0LnJhZGl1cz10aGlzLnJhZGl1cyksKHRoaXMubWFwU2l6ZS54IT09NTEyfHx0aGlzLm1hcFNpemUueSE9PTUxMikmJih0Lm1hcFNpemU9dGhpcy5tYXBTaXplLnRvQXJyYXkoKSksdC5jYW1lcmE9dGhpcy5jYW1lcmEudG9KU09OKCExKS5vYmplY3QsZGVsZXRlIHQuY2FtZXJhLm1hdHJpeCx0fX1jbGFzcyBjYiBleHRlbmRzIHJke2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3ICRlKDUwLDEsLjUsNTAwKSksdGhpcy5pc1Nwb3RMaWdodFNoYWRvdz0hMCx0aGlzLmZvY3VzPTF9dXBkYXRlTWF0cmljZXModCl7Y29uc3QgZT10aGlzLmNhbWVyYSxuPUlzKjIqdC5hbmdsZSp0aGlzLmZvY3VzLGk9dGhpcy5tYXBTaXplLndpZHRoL3RoaXMubWFwU2l6ZS5oZWlnaHQscz10LmRpc3RhbmNlfHxlLmZhcjsobiE9PWUuZm92fHxpIT09ZS5hc3BlY3R8fHMhPT1lLmZhcikmJihlLmZvdj1uLGUuYXNwZWN0PWksZS5mYXI9cyxlLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSksc3VwZXIudXBkYXRlTWF0cmljZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmZvY3VzPXQuZm9jdXMsdGhpc319Y2xhc3MgUjAgZXh0ZW5kcyBfcntjb25zdHJ1Y3Rvcih0LGUsbj0wLGk9TWF0aC5QSS8zLHM9MCxvPTIpe3N1cGVyKHQsZSksdGhpcy5pc1Nwb3RMaWdodD0hMCx0aGlzLnR5cGU9IlNwb3RMaWdodCIsdGhpcy5wb3NpdGlvbi5jb3B5KHNlLkRFRkFVTFRfVVApLHRoaXMudXBkYXRlTWF0cml4KCksdGhpcy50YXJnZXQ9bmV3IHNlLHRoaXMuZGlzdGFuY2U9bix0aGlzLmFuZ2xlPWksdGhpcy5wZW51bWJyYT1zLHRoaXMuZGVjYXk9byx0aGlzLm1hcD1udWxsLHRoaXMuc2hhZG93PW5ldyBjYn1nZXQgcG93ZXIoKXtyZXR1cm4gdGhpcy5pbnRlbnNpdHkqTWF0aC5QSX1zZXQgcG93ZXIodCl7dGhpcy5pbnRlbnNpdHk9dC9NYXRoLlBJfWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5kaXN0YW5jZT10LmRpc3RhbmNlLHRoaXMuYW5nbGU9dC5hbmdsZSx0aGlzLnBlbnVtYnJhPXQucGVudW1icmEsdGhpcy5kZWNheT10LmRlY2F5LHRoaXMudGFyZ2V0PXQudGFyZ2V0LmNsb25lKCksdGhpcy5zaGFkb3c9dC5zaGFkb3cuY2xvbmUoKSx0aGlzfX1jb25zdCBJMD1uZXcgQ3Qsd2E9bmV3IEksc2Q9bmV3IEk7Y2xhc3MgbGIgZXh0ZW5kcyByZHtjb25zdHJ1Y3Rvcigpe3N1cGVyKG5ldyAkZSg5MCwxLC41LDUwMCkpLHRoaXMuaXNQb2ludExpZ2h0U2hhZG93PSEwLHRoaXMuX2ZyYW1lRXh0ZW50cz1uZXcgcSg0LDIpLHRoaXMuX3ZpZXdwb3J0Q291bnQ9Nix0aGlzLl92aWV3cG9ydHM9W25ldyBRdCgyLDEsMSwxKSxuZXcgUXQoMCwxLDEsMSksbmV3IFF0KDMsMSwxLDEpLG5ldyBRdCgxLDEsMSwxKSxuZXcgUXQoMywwLDEsMSksbmV3IFF0KDEsMCwxLDEpXSx0aGlzLl9jdWJlRGlyZWN0aW9ucz1bbmV3IEkoMSwwLDApLG5ldyBJKC0xLDAsMCksbmV3IEkoMCwwLDEpLG5ldyBJKDAsMCwtMSksbmV3IEkoMCwxLDApLG5ldyBJKDAsLTEsMCldLHRoaXMuX2N1YmVVcHM9W25ldyBJKDAsMSwwKSxuZXcgSSgwLDEsMCksbmV3IEkoMCwxLDApLG5ldyBJKDAsMSwwKSxuZXcgSSgwLDAsMSksbmV3IEkoMCwwLC0xKV19dXBkYXRlTWF0cmljZXModCxlPTApe2NvbnN0IG49dGhpcy5jYW1lcmEsaT10aGlzLm1hdHJpeCxzPXQuZGlzdGFuY2V8fG4uZmFyO3MhPT1uLmZhciYmKG4uZmFyPXMsbi51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCkpLHdhLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSxuLnBvc2l0aW9uLmNvcHkod2EpLHNkLmNvcHkobi5wb3NpdGlvbiksc2QuYWRkKHRoaXMuX2N1YmVEaXJlY3Rpb25zW2VdKSxuLnVwLmNvcHkodGhpcy5fY3ViZVVwc1tlXSksbi5sb29rQXQoc2QpLG4udXBkYXRlTWF0cml4V29ybGQoKSxpLm1ha2VUcmFuc2xhdGlvbigtd2EueCwtd2EueSwtd2EueiksSTAubXVsdGlwbHlNYXRyaWNlcyhuLnByb2plY3Rpb25NYXRyaXgsbi5tYXRyaXhXb3JsZEludmVyc2UpLHRoaXMuX2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoSTApfX1jbGFzcyBQMCBleHRlbmRzIF9ye2NvbnN0cnVjdG9yKHQsZSxuPTAsaT0yKXtzdXBlcih0LGUpLHRoaXMuaXNQb2ludExpZ2h0PSEwLHRoaXMudHlwZT0iUG9pbnRMaWdodCIsdGhpcy5kaXN0YW5jZT1uLHRoaXMuZGVjYXk9aSx0aGlzLnNoYWRvdz1uZXcgbGJ9Z2V0IHBvd2VyKCl7cmV0dXJuIHRoaXMuaW50ZW5zaXR5KjQqTWF0aC5QSX1zZXQgcG93ZXIodCl7dGhpcy5pbnRlbnNpdHk9dC8oNCpNYXRoLlBJKX1kaXNwb3NlKCl7dGhpcy5zaGFkb3cuZGlzcG9zZSgpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMuZGlzdGFuY2U9dC5kaXN0YW5jZSx0aGlzLmRlY2F5PXQuZGVjYXksdGhpcy5zaGFkb3c9dC5zaGFkb3cuY2xvbmUoKSx0aGlzfX1jbGFzcyBydSBleHRlbmRzIHBse2NvbnN0cnVjdG9yKHQ9LTEsZT0xLG49MSxpPS0xLHM9LjEsbz0yZTMpe3N1cGVyKCksdGhpcy5pc09ydGhvZ3JhcGhpY0NhbWVyYT0hMCx0aGlzLnR5cGU9Ik9ydGhvZ3JhcGhpY0NhbWVyYSIsdGhpcy56b29tPTEsdGhpcy52aWV3PW51bGwsdGhpcy5sZWZ0PXQsdGhpcy5yaWdodD1lLHRoaXMudG9wPW4sdGhpcy5ib3R0b209aSx0aGlzLm5lYXI9cyx0aGlzLmZhcj1vLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMubGVmdD10LmxlZnQsdGhpcy5yaWdodD10LnJpZ2h0LHRoaXMudG9wPXQudG9wLHRoaXMuYm90dG9tPXQuYm90dG9tLHRoaXMubmVhcj10Lm5lYXIsdGhpcy5mYXI9dC5mYXIsdGhpcy56b29tPXQuem9vbSx0aGlzLnZpZXc9dC52aWV3PT09bnVsbD9udWxsOk9iamVjdC5hc3NpZ24oe30sdC52aWV3KSx0aGlzfXNldFZpZXdPZmZzZXQodCxlLG4saSxzLG8pe3RoaXMudmlldz09PW51bGwmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pLHRoaXMudmlldy5lbmFibGVkPSEwLHRoaXMudmlldy5mdWxsV2lkdGg9dCx0aGlzLnZpZXcuZnVsbEhlaWdodD1lLHRoaXMudmlldy5vZmZzZXRYPW4sdGhpcy52aWV3Lm9mZnNldFk9aSx0aGlzLnZpZXcud2lkdGg9cyx0aGlzLnZpZXcuaGVpZ2h0PW8sdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y2xlYXJWaWV3T2Zmc2V0KCl7dGhpcy52aWV3IT09bnVsbCYmKHRoaXMudmlldy5lbmFibGVkPSExKSx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX11cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl7Y29uc3QgdD0odGhpcy5yaWdodC10aGlzLmxlZnQpLygyKnRoaXMuem9vbSksZT0odGhpcy50b3AtdGhpcy5ib3R0b20pLygyKnRoaXMuem9vbSksbj0odGhpcy5yaWdodCt0aGlzLmxlZnQpLzIsaT0odGhpcy50b3ArdGhpcy5ib3R0b20pLzI7bGV0IHM9bi10LG89bit0LGE9aStlLGM9aS1lO2lmKHRoaXMudmlldyE9PW51bGwmJnRoaXMudmlldy5lbmFibGVkKXtjb25zdCBsPSh0aGlzLnJpZ2h0LXRoaXMubGVmdCkvdGhpcy52aWV3LmZ1bGxXaWR0aC90aGlzLnpvb20sdT0odGhpcy50b3AtdGhpcy5ib3R0b20pL3RoaXMudmlldy5mdWxsSGVpZ2h0L3RoaXMuem9vbTtzKz1sKnRoaXMudmlldy5vZmZzZXRYLG89cytsKnRoaXMudmlldy53aWR0aCxhLT11KnRoaXMudmlldy5vZmZzZXRZLGM9YS11KnRoaXMudmlldy5oZWlnaHR9dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VPcnRob2dyYXBoaWMocyxvLGEsYyx0aGlzLm5lYXIsdGhpcy5mYXIsdGhpcy5jb29yZGluYXRlU3lzdGVtKSx0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5wcm9qZWN0aW9uTWF0cml4KS5pbnZlcnQoKX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0Lnpvb209dGhpcy56b29tLGUub2JqZWN0LmxlZnQ9dGhpcy5sZWZ0LGUub2JqZWN0LnJpZ2h0PXRoaXMucmlnaHQsZS5vYmplY3QudG9wPXRoaXMudG9wLGUub2JqZWN0LmJvdHRvbT10aGlzLmJvdHRvbSxlLm9iamVjdC5uZWFyPXRoaXMubmVhcixlLm9iamVjdC5mYXI9dGhpcy5mYXIsdGhpcy52aWV3IT09bnVsbCYmKGUub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKSxlfX1jbGFzcyB1YiBleHRlbmRzIHJke2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IHJ1KC01LDUsNSwtNSwuNSw1MDApKSx0aGlzLmlzRGlyZWN0aW9uYWxMaWdodFNoYWRvdz0hMH19Y2xhc3MgTDAgZXh0ZW5kcyBfcntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5pc0RpcmVjdGlvbmFsTGlnaHQ9ITAsdGhpcy50eXBlPSJEaXJlY3Rpb25hbExpZ2h0Iix0aGlzLnBvc2l0aW9uLmNvcHkoc2UuREVGQVVMVF9VUCksdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLnRhcmdldD1uZXcgc2UsdGhpcy5zaGFkb3c9bmV3IHVifWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnRhcmdldD10LnRhcmdldC5jbG9uZSgpLHRoaXMuc2hhZG93PXQuc2hhZG93LmNsb25lKCksdGhpc319Y2xhc3MgRDAgZXh0ZW5kcyBfcntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5pc0FtYmllbnRMaWdodD0hMCx0aGlzLnR5cGU9IkFtYmllbnRMaWdodCJ9fWNsYXNzIFUwIGV4dGVuZHMgX3J7Y29uc3RydWN0b3IodCxlLG49MTAsaT0xMCl7c3VwZXIodCxlKSx0aGlzLmlzUmVjdEFyZWFMaWdodD0hMCx0aGlzLnR5cGU9IlJlY3RBcmVhTGlnaHQiLHRoaXMud2lkdGg9bix0aGlzLmhlaWdodD1pfWdldCBwb3dlcigpe3JldHVybiB0aGlzLmludGVuc2l0eSp0aGlzLndpZHRoKnRoaXMuaGVpZ2h0Kk1hdGguUEl9c2V0IHBvd2VyKHQpe3RoaXMuaW50ZW5zaXR5PXQvKHRoaXMud2lkdGgqdGhpcy5oZWlnaHQqTWF0aC5QSSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLndpZHRoPXQud2lkdGgsdGhpcy5oZWlnaHQ9dC5oZWlnaHQsdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0LndpZHRoPXRoaXMud2lkdGgsZS5vYmplY3QuaGVpZ2h0PXRoaXMuaGVpZ2h0LGV9fWNsYXNzIE4we2NvbnN0cnVjdG9yKCl7dGhpcy5pc1NwaGVyaWNhbEhhcm1vbmljczM9ITAsdGhpcy5jb2VmZmljaWVudHM9W107Zm9yKGxldCB0PTA7dDw5O3QrKyl0aGlzLmNvZWZmaWNpZW50cy5wdXNoKG5ldyBJKX1zZXQodCl7Zm9yKGxldCBlPTA7ZTw5O2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5jb3B5KHRbZV0pO3JldHVybiB0aGlzfXplcm8oKXtmb3IobGV0IHQ9MDt0PDk7dCsrKXRoaXMuY29lZmZpY2llbnRzW3RdLnNldCgwLDAsMCk7cmV0dXJuIHRoaXN9Z2V0QXQodCxlKXtjb25zdCBuPXQueCxpPXQueSxzPXQueixvPXRoaXMuY29lZmZpY2llbnRzO3JldHVybiBlLmNvcHkob1swXSkubXVsdGlwbHlTY2FsYXIoLjI4MjA5NSksZS5hZGRTY2FsZWRWZWN0b3Iob1sxXSwuNDg4NjAzKmkpLGUuYWRkU2NhbGVkVmVjdG9yKG9bMl0sLjQ4ODYwMypzKSxlLmFkZFNjYWxlZFZlY3RvcihvWzNdLC40ODg2MDMqbiksZS5hZGRTY2FsZWRWZWN0b3Iob1s0XSwxLjA5MjU0OCoobippKSksZS5hZGRTY2FsZWRWZWN0b3Iob1s1XSwxLjA5MjU0OCooaSpzKSksZS5hZGRTY2FsZWRWZWN0b3Iob1s2XSwuMzE1MzkyKigzKnMqcy0xKSksZS5hZGRTY2FsZWRWZWN0b3Iob1s3XSwxLjA5MjU0OCoobipzKSksZS5hZGRTY2FsZWRWZWN0b3Iob1s4XSwuNTQ2Mjc0KihuKm4taSppKSksZX1nZXRJcnJhZGlhbmNlQXQodCxlKXtjb25zdCBuPXQueCxpPXQueSxzPXQueixvPXRoaXMuY29lZmZpY2llbnRzO3JldHVybiBlLmNvcHkob1swXSkubXVsdGlwbHlTY2FsYXIoLjg4NjIyNyksZS5hZGRTY2FsZWRWZWN0b3Iob1sxXSwyKi41MTE2NjQqaSksZS5hZGRTY2FsZWRWZWN0b3Iob1syXSwyKi41MTE2NjQqcyksZS5hZGRTY2FsZWRWZWN0b3Iob1szXSwyKi41MTE2NjQqbiksZS5hZGRTY2FsZWRWZWN0b3Iob1s0XSwyKi40MjkwNDMqbippKSxlLmFkZFNjYWxlZFZlY3RvcihvWzVdLDIqLjQyOTA0MyppKnMpLGUuYWRkU2NhbGVkVmVjdG9yKG9bNl0sLjc0MzEyNSpzKnMtLjI0NzcwOCksZS5hZGRTY2FsZWRWZWN0b3Iob1s3XSwyKi40MjkwNDMqbipzKSxlLmFkZFNjYWxlZFZlY3RvcihvWzhdLC40MjkwNDMqKG4qbi1pKmkpKSxlfWFkZCh0KXtmb3IobGV0IGU9MDtlPDk7ZSsrKXRoaXMuY29lZmZpY2llbnRzW2VdLmFkZCh0LmNvZWZmaWNpZW50c1tlXSk7cmV0dXJuIHRoaXN9YWRkU2NhbGVkU0godCxlKXtmb3IobGV0IG49MDtuPDk7bisrKXRoaXMuY29lZmZpY2llbnRzW25dLmFkZFNjYWxlZFZlY3Rvcih0LmNvZWZmaWNpZW50c1tuXSxlKTtyZXR1cm4gdGhpc31zY2FsZSh0KXtmb3IobGV0IGU9MDtlPDk7ZSsrKXRoaXMuY29lZmZpY2llbnRzW2VdLm11bHRpcGx5U2NhbGFyKHQpO3JldHVybiB0aGlzfWxlcnAodCxlKXtmb3IobGV0IG49MDtuPDk7bisrKXRoaXMuY29lZmZpY2llbnRzW25dLmxlcnAodC5jb2VmZmljaWVudHNbbl0sZSk7cmV0dXJuIHRoaXN9ZXF1YWxzKHQpe2ZvcihsZXQgZT0wO2U8OTtlKyspaWYoIXRoaXMuY29lZmZpY2llbnRzW2VdLmVxdWFscyh0LmNvZWZmaWNpZW50c1tlXSkpcmV0dXJuITE7cmV0dXJuITB9Y29weSh0KXtyZXR1cm4gdGhpcy5zZXQodC5jb2VmZmljaWVudHMpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1mcm9tQXJyYXkodCxlPTApe2NvbnN0IG49dGhpcy5jb2VmZmljaWVudHM7Zm9yKGxldCBpPTA7aTw5O2krKyluW2ldLmZyb21BcnJheSh0LGUraSozKTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuY29lZmZpY2llbnRzO2ZvcihsZXQgaT0wO2k8OTtpKyspbltpXS50b0FycmF5KHQsZStpKjMpO3JldHVybiB0fXN0YXRpYyBnZXRCYXNpc0F0KHQsZSl7Y29uc3Qgbj10LngsaT10Lnkscz10Lno7ZVswXT0uMjgyMDk1LGVbMV09LjQ4ODYwMyppLGVbMl09LjQ4ODYwMypzLGVbM109LjQ4ODYwMypuLGVbNF09MS4wOTI1NDgqbippLGVbNV09MS4wOTI1NDgqaSpzLGVbNl09LjMxNTM5MiooMypzKnMtMSksZVs3XT0xLjA5MjU0OCpuKnMsZVs4XT0uNTQ2Mjc0KihuKm4taSppKX19Y2xhc3MgRjAgZXh0ZW5kcyBfcntjb25zdHJ1Y3Rvcih0PW5ldyBOMCxlPTEpe3N1cGVyKHZvaWQgMCxlKSx0aGlzLmlzTGlnaHRQcm9iZT0hMCx0aGlzLnNoPXR9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnNoLmNvcHkodC5zaCksdGhpc31mcm9tSlNPTih0KXtyZXR1cm4gdGhpcy5pbnRlbnNpdHk9dC5pbnRlbnNpdHksdGhpcy5zaC5mcm9tQXJyYXkodC5zaCksdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0LnNoPXRoaXMuc2gudG9BcnJheSgpLGV9fWNsYXNzIHN1IGV4dGVuZHMgU257Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy50ZXh0dXJlcz17fX1sb2FkKHQsZSxuLGkpe2NvbnN0IHM9dGhpcyxvPW5ldyBXaShzLm1hbmFnZXIpO28uc2V0UGF0aChzLnBhdGgpLG8uc2V0UmVxdWVzdEhlYWRlcihzLnJlcXVlc3RIZWFkZXIpLG8uc2V0V2l0aENyZWRlbnRpYWxzKHMud2l0aENyZWRlbnRpYWxzKSxvLmxvYWQodCxmdW5jdGlvbihhKXt0cnl7ZShzLnBhcnNlKEpTT04ucGFyc2UoYSkpKX1jYXRjaChjKXtpP2koYyk6Y29uc29sZS5lcnJvcihjKSxzLm1hbmFnZXIuaXRlbUVycm9yKHQpfX0sbixpKX1wYXJzZSh0KXtjb25zdCBlPXRoaXMudGV4dHVyZXM7ZnVuY3Rpb24gbihzKXtyZXR1cm4gZVtzXT09PXZvaWQgMCYmY29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbExvYWRlcjogVW5kZWZpbmVkIHRleHR1cmUiLHMpLGVbc119Y29uc3QgaT10aGlzLmNyZWF0ZU1hdGVyaWFsRnJvbVR5cGUodC50eXBlKTtpZih0LnV1aWQhPT12b2lkIDAmJihpLnV1aWQ9dC51dWlkKSx0Lm5hbWUhPT12b2lkIDAmJihpLm5hbWU9dC5uYW1lKSx0LmNvbG9yIT09dm9pZCAwJiZpLmNvbG9yIT09dm9pZCAwJiZpLmNvbG9yLnNldEhleCh0LmNvbG9yKSx0LnJvdWdobmVzcyE9PXZvaWQgMCYmKGkucm91Z2huZXNzPXQucm91Z2huZXNzKSx0Lm1ldGFsbmVzcyE9PXZvaWQgMCYmKGkubWV0YWxuZXNzPXQubWV0YWxuZXNzKSx0LnNoZWVuIT09dm9pZCAwJiYoaS5zaGVlbj10LnNoZWVuKSx0LnNoZWVuQ29sb3IhPT12b2lkIDAmJihpLnNoZWVuQ29sb3I9bmV3IHl0KCkuc2V0SGV4KHQuc2hlZW5Db2xvcikpLHQuc2hlZW5Sb3VnaG5lc3MhPT12b2lkIDAmJihpLnNoZWVuUm91Z2huZXNzPXQuc2hlZW5Sb3VnaG5lc3MpLHQuZW1pc3NpdmUhPT12b2lkIDAmJmkuZW1pc3NpdmUhPT12b2lkIDAmJmkuZW1pc3NpdmUuc2V0SGV4KHQuZW1pc3NpdmUpLHQuc3BlY3VsYXIhPT12b2lkIDAmJmkuc3BlY3VsYXIhPT12b2lkIDAmJmkuc3BlY3VsYXIuc2V0SGV4KHQuc3BlY3VsYXIpLHQuc3BlY3VsYXJJbnRlbnNpdHkhPT12b2lkIDAmJihpLnNwZWN1bGFySW50ZW5zaXR5PXQuc3BlY3VsYXJJbnRlbnNpdHkpLHQuc3BlY3VsYXJDb2xvciE9PXZvaWQgMCYmaS5zcGVjdWxhckNvbG9yIT09dm9pZCAwJiZpLnNwZWN1bGFyQ29sb3Iuc2V0SGV4KHQuc3BlY3VsYXJDb2xvciksdC5zaGluaW5lc3MhPT12b2lkIDAmJihpLnNoaW5pbmVzcz10LnNoaW5pbmVzcyksdC5jbGVhcmNvYXQhPT12b2lkIDAmJihpLmNsZWFyY29hdD10LmNsZWFyY29hdCksdC5jbGVhcmNvYXRSb3VnaG5lc3MhPT12b2lkIDAmJihpLmNsZWFyY29hdFJvdWdobmVzcz10LmNsZWFyY29hdFJvdWdobmVzcyksdC5kaXNwZXJzaW9uIT09dm9pZCAwJiYoaS5kaXNwZXJzaW9uPXQuZGlzcGVyc2lvbiksdC5pcmlkZXNjZW5jZSE9PXZvaWQgMCYmKGkuaXJpZGVzY2VuY2U9dC5pcmlkZXNjZW5jZSksdC5pcmlkZXNjZW5jZUlPUiE9PXZvaWQgMCYmKGkuaXJpZGVzY2VuY2VJT1I9dC5pcmlkZXNjZW5jZUlPUiksdC5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlIT09dm9pZCAwJiYoaS5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPXQuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSksdC50cmFuc21pc3Npb24hPT12b2lkIDAmJihpLnRyYW5zbWlzc2lvbj10LnRyYW5zbWlzc2lvbiksdC50aGlja25lc3MhPT12b2lkIDAmJihpLnRoaWNrbmVzcz10LnRoaWNrbmVzcyksdC5hdHRlbnVhdGlvbkRpc3RhbmNlIT09dm9pZCAwJiYoaS5hdHRlbnVhdGlvbkRpc3RhbmNlPXQuYXR0ZW51YXRpb25EaXN0YW5jZSksdC5hdHRlbnVhdGlvbkNvbG9yIT09dm9pZCAwJiZpLmF0dGVudWF0aW9uQ29sb3IhPT12b2lkIDAmJmkuYXR0ZW51YXRpb25Db2xvci5zZXRIZXgodC5hdHRlbnVhdGlvbkNvbG9yKSx0LmFuaXNvdHJvcHkhPT12b2lkIDAmJihpLmFuaXNvdHJvcHk9dC5hbmlzb3Ryb3B5KSx0LmFuaXNvdHJvcHlSb3RhdGlvbiE9PXZvaWQgMCYmKGkuYW5pc290cm9weVJvdGF0aW9uPXQuYW5pc290cm9weVJvdGF0aW9uKSx0LmZvZyE9PXZvaWQgMCYmKGkuZm9nPXQuZm9nKSx0LmZsYXRTaGFkaW5nIT09dm9pZCAwJiYoaS5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nKSx0LmJsZW5kaW5nIT09dm9pZCAwJiYoaS5ibGVuZGluZz10LmJsZW5kaW5nKSx0LmNvbWJpbmUhPT12b2lkIDAmJihpLmNvbWJpbmU9dC5jb21iaW5lKSx0LnNpZGUhPT12b2lkIDAmJihpLnNpZGU9dC5zaWRlKSx0LnNoYWRvd1NpZGUhPT12b2lkIDAmJihpLnNoYWRvd1NpZGU9dC5zaGFkb3dTaWRlKSx0Lm9wYWNpdHkhPT12b2lkIDAmJihpLm9wYWNpdHk9dC5vcGFjaXR5KSx0LnRyYW5zcGFyZW50IT09dm9pZCAwJiYoaS50cmFuc3BhcmVudD10LnRyYW5zcGFyZW50KSx0LmFscGhhVGVzdCE9PXZvaWQgMCYmKGkuYWxwaGFUZXN0PXQuYWxwaGFUZXN0KSx0LmFscGhhSGFzaCE9PXZvaWQgMCYmKGkuYWxwaGFIYXNoPXQuYWxwaGFIYXNoKSx0LmRlcHRoRnVuYyE9PXZvaWQgMCYmKGkuZGVwdGhGdW5jPXQuZGVwdGhGdW5jKSx0LmRlcHRoVGVzdCE9PXZvaWQgMCYmKGkuZGVwdGhUZXN0PXQuZGVwdGhUZXN0KSx0LmRlcHRoV3JpdGUhPT12b2lkIDAmJihpLmRlcHRoV3JpdGU9dC5kZXB0aFdyaXRlKSx0LmNvbG9yV3JpdGUhPT12b2lkIDAmJihpLmNvbG9yV3JpdGU9dC5jb2xvcldyaXRlKSx0LmJsZW5kU3JjIT09dm9pZCAwJiYoaS5ibGVuZFNyYz10LmJsZW5kU3JjKSx0LmJsZW5kRHN0IT09dm9pZCAwJiYoaS5ibGVuZERzdD10LmJsZW5kRHN0KSx0LmJsZW5kRXF1YXRpb24hPT12b2lkIDAmJihpLmJsZW5kRXF1YXRpb249dC5ibGVuZEVxdWF0aW9uKSx0LmJsZW5kU3JjQWxwaGEhPT12b2lkIDAmJihpLmJsZW5kU3JjQWxwaGE9dC5ibGVuZFNyY0FscGhhKSx0LmJsZW5kRHN0QWxwaGEhPT12b2lkIDAmJihpLmJsZW5kRHN0QWxwaGE9dC5ibGVuZERzdEFscGhhKSx0LmJsZW5kRXF1YXRpb25BbHBoYSE9PXZvaWQgMCYmKGkuYmxlbmRFcXVhdGlvbkFscGhhPXQuYmxlbmRFcXVhdGlvbkFscGhhKSx0LmJsZW5kQ29sb3IhPT12b2lkIDAmJmkuYmxlbmRDb2xvciE9PXZvaWQgMCYmaS5ibGVuZENvbG9yLnNldEhleCh0LmJsZW5kQ29sb3IpLHQuYmxlbmRBbHBoYSE9PXZvaWQgMCYmKGkuYmxlbmRBbHBoYT10LmJsZW5kQWxwaGEpLHQuc3RlbmNpbFdyaXRlTWFzayE9PXZvaWQgMCYmKGkuc3RlbmNpbFdyaXRlTWFzaz10LnN0ZW5jaWxXcml0ZU1hc2spLHQuc3RlbmNpbEZ1bmMhPT12b2lkIDAmJihpLnN0ZW5jaWxGdW5jPXQuc3RlbmNpbEZ1bmMpLHQuc3RlbmNpbFJlZiE9PXZvaWQgMCYmKGkuc3RlbmNpbFJlZj10LnN0ZW5jaWxSZWYpLHQuc3RlbmNpbEZ1bmNNYXNrIT09dm9pZCAwJiYoaS5zdGVuY2lsRnVuY01hc2s9dC5zdGVuY2lsRnVuY01hc2spLHQuc3RlbmNpbEZhaWwhPT12b2lkIDAmJihpLnN0ZW5jaWxGYWlsPXQuc3RlbmNpbEZhaWwpLHQuc3RlbmNpbFpGYWlsIT09dm9pZCAwJiYoaS5zdGVuY2lsWkZhaWw9dC5zdGVuY2lsWkZhaWwpLHQuc3RlbmNpbFpQYXNzIT09dm9pZCAwJiYoaS5zdGVuY2lsWlBhc3M9dC5zdGVuY2lsWlBhc3MpLHQuc3RlbmNpbFdyaXRlIT09dm9pZCAwJiYoaS5zdGVuY2lsV3JpdGU9dC5zdGVuY2lsV3JpdGUpLHQud2lyZWZyYW1lIT09dm9pZCAwJiYoaS53aXJlZnJhbWU9dC53aXJlZnJhbWUpLHQud2lyZWZyYW1lTGluZXdpZHRoIT09dm9pZCAwJiYoaS53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgpLHQud2lyZWZyYW1lTGluZWNhcCE9PXZvaWQgMCYmKGkud2lyZWZyYW1lTGluZWNhcD10LndpcmVmcmFtZUxpbmVjYXApLHQud2lyZWZyYW1lTGluZWpvaW4hPT12b2lkIDAmJihpLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4pLHQucm90YXRpb24hPT12b2lkIDAmJihpLnJvdGF0aW9uPXQucm90YXRpb24pLHQubGluZXdpZHRoIT09dm9pZCAwJiYoaS5saW5ld2lkdGg9dC5saW5ld2lkdGgpLHQuZGFzaFNpemUhPT12b2lkIDAmJihpLmRhc2hTaXplPXQuZGFzaFNpemUpLHQuZ2FwU2l6ZSE9PXZvaWQgMCYmKGkuZ2FwU2l6ZT10LmdhcFNpemUpLHQuc2NhbGUhPT12b2lkIDAmJihpLnNjYWxlPXQuc2NhbGUpLHQucG9seWdvbk9mZnNldCE9PXZvaWQgMCYmKGkucG9seWdvbk9mZnNldD10LnBvbHlnb25PZmZzZXQpLHQucG9seWdvbk9mZnNldEZhY3RvciE9PXZvaWQgMCYmKGkucG9seWdvbk9mZnNldEZhY3Rvcj10LnBvbHlnb25PZmZzZXRGYWN0b3IpLHQucG9seWdvbk9mZnNldFVuaXRzIT09dm9pZCAwJiYoaS5wb2x5Z29uT2Zmc2V0VW5pdHM9dC5wb2x5Z29uT2Zmc2V0VW5pdHMpLHQuZGl0aGVyaW5nIT09dm9pZCAwJiYoaS5kaXRoZXJpbmc9dC5kaXRoZXJpbmcpLHQuYWxwaGFUb0NvdmVyYWdlIT09dm9pZCAwJiYoaS5hbHBoYVRvQ292ZXJhZ2U9dC5hbHBoYVRvQ292ZXJhZ2UpLHQucHJlbXVsdGlwbGllZEFscGhhIT09dm9pZCAwJiYoaS5wcmVtdWx0aXBsaWVkQWxwaGE9dC5wcmVtdWx0aXBsaWVkQWxwaGEpLHQuZm9yY2VTaW5nbGVQYXNzIT09dm9pZCAwJiYoaS5mb3JjZVNpbmdsZVBhc3M9dC5mb3JjZVNpbmdsZVBhc3MpLHQudmlzaWJsZSE9PXZvaWQgMCYmKGkudmlzaWJsZT10LnZpc2libGUpLHQudG9uZU1hcHBlZCE9PXZvaWQgMCYmKGkudG9uZU1hcHBlZD10LnRvbmVNYXBwZWQpLHQudXNlckRhdGEhPT12b2lkIDAmJihpLnVzZXJEYXRhPXQudXNlckRhdGEpLHQudmVydGV4Q29sb3JzIT09dm9pZCAwJiYodHlwZW9mIHQudmVydGV4Q29sb3JzPT0ibnVtYmVyIj9pLnZlcnRleENvbG9ycz10LnZlcnRleENvbG9ycz4wOmkudmVydGV4Q29sb3JzPXQudmVydGV4Q29sb3JzKSx0LnVuaWZvcm1zIT09dm9pZCAwKWZvcihjb25zdCBzIGluIHQudW5pZm9ybXMpe2NvbnN0IG89dC51bmlmb3Jtc1tzXTtzd2l0Y2goaS51bmlmb3Jtc1tzXT17fSxvLnR5cGUpe2Nhc2UidCI6aS51bmlmb3Jtc1tzXS52YWx1ZT1uKG8udmFsdWUpO2JyZWFrO2Nhc2UiYyI6aS51bmlmb3Jtc1tzXS52YWx1ZT1uZXcgeXQoKS5zZXRIZXgoby52YWx1ZSk7YnJlYWs7Y2FzZSJ2MiI6aS51bmlmb3Jtc1tzXS52YWx1ZT1uZXcgcSgpLmZyb21BcnJheShvLnZhbHVlKTticmVhaztjYXNlInYzIjppLnVuaWZvcm1zW3NdLnZhbHVlPW5ldyBJKCkuZnJvbUFycmF5KG8udmFsdWUpO2JyZWFrO2Nhc2UidjQiOmkudW5pZm9ybXNbc10udmFsdWU9bmV3IFF0KCkuZnJvbUFycmF5KG8udmFsdWUpO2JyZWFrO2Nhc2UibTMiOmkudW5pZm9ybXNbc10udmFsdWU9bmV3IFd0KCkuZnJvbUFycmF5KG8udmFsdWUpO2JyZWFrO2Nhc2UibTQiOmkudW5pZm9ybXNbc10udmFsdWU9bmV3IEN0KCkuZnJvbUFycmF5KG8udmFsdWUpO2JyZWFrO2RlZmF1bHQ6aS51bmlmb3Jtc1tzXS52YWx1ZT1vLnZhbHVlfX1pZih0LmRlZmluZXMhPT12b2lkIDAmJihpLmRlZmluZXM9dC5kZWZpbmVzKSx0LnZlcnRleFNoYWRlciE9PXZvaWQgMCYmKGkudmVydGV4U2hhZGVyPXQudmVydGV4U2hhZGVyKSx0LmZyYWdtZW50U2hhZGVyIT09dm9pZCAwJiYoaS5mcmFnbWVudFNoYWRlcj10LmZyYWdtZW50U2hhZGVyKSx0Lmdsc2xWZXJzaW9uIT09dm9pZCAwJiYoaS5nbHNsVmVyc2lvbj10Lmdsc2xWZXJzaW9uKSx0LmV4dGVuc2lvbnMhPT12b2lkIDApZm9yKGNvbnN0IHMgaW4gdC5leHRlbnNpb25zKWkuZXh0ZW5zaW9uc1tzXT10LmV4dGVuc2lvbnNbc107aWYodC5saWdodHMhPT12b2lkIDAmJihpLmxpZ2h0cz10LmxpZ2h0cyksdC5jbGlwcGluZyE9PXZvaWQgMCYmKGkuY2xpcHBpbmc9dC5jbGlwcGluZyksdC5zaXplIT09dm9pZCAwJiYoaS5zaXplPXQuc2l6ZSksdC5zaXplQXR0ZW51YXRpb24hPT12b2lkIDAmJihpLnNpemVBdHRlbnVhdGlvbj10LnNpemVBdHRlbnVhdGlvbiksdC5tYXAhPT12b2lkIDAmJihpLm1hcD1uKHQubWFwKSksdC5tYXRjYXAhPT12b2lkIDAmJihpLm1hdGNhcD1uKHQubWF0Y2FwKSksdC5hbHBoYU1hcCE9PXZvaWQgMCYmKGkuYWxwaGFNYXA9bih0LmFscGhhTWFwKSksdC5idW1wTWFwIT09dm9pZCAwJiYoaS5idW1wTWFwPW4odC5idW1wTWFwKSksdC5idW1wU2NhbGUhPT12b2lkIDAmJihpLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSksdC5ub3JtYWxNYXAhPT12b2lkIDAmJihpLm5vcm1hbE1hcD1uKHQubm9ybWFsTWFwKSksdC5ub3JtYWxNYXBUeXBlIT09dm9pZCAwJiYoaS5ub3JtYWxNYXBUeXBlPXQubm9ybWFsTWFwVHlwZSksdC5ub3JtYWxTY2FsZSE9PXZvaWQgMCl7bGV0IHM9dC5ub3JtYWxTY2FsZTtBcnJheS5pc0FycmF5KHMpPT09ITEmJihzPVtzLHNdKSxpLm5vcm1hbFNjYWxlPW5ldyBxKCkuZnJvbUFycmF5KHMpfXJldHVybiB0LmRpc3BsYWNlbWVudE1hcCE9PXZvaWQgMCYmKGkuZGlzcGxhY2VtZW50TWFwPW4odC5kaXNwbGFjZW1lbnRNYXApKSx0LmRpc3BsYWNlbWVudFNjYWxlIT09dm9pZCAwJiYoaS5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlKSx0LmRpc3BsYWNlbWVudEJpYXMhPT12b2lkIDAmJihpLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzKSx0LnJvdWdobmVzc01hcCE9PXZvaWQgMCYmKGkucm91Z2huZXNzTWFwPW4odC5yb3VnaG5lc3NNYXApKSx0Lm1ldGFsbmVzc01hcCE9PXZvaWQgMCYmKGkubWV0YWxuZXNzTWFwPW4odC5tZXRhbG5lc3NNYXApKSx0LmVtaXNzaXZlTWFwIT09dm9pZCAwJiYoaS5lbWlzc2l2ZU1hcD1uKHQuZW1pc3NpdmVNYXApKSx0LmVtaXNzaXZlSW50ZW5zaXR5IT09dm9pZCAwJiYoaS5lbWlzc2l2ZUludGVuc2l0eT10LmVtaXNzaXZlSW50ZW5zaXR5KSx0LnNwZWN1bGFyTWFwIT09dm9pZCAwJiYoaS5zcGVjdWxhck1hcD1uKHQuc3BlY3VsYXJNYXApKSx0LnNwZWN1bGFySW50ZW5zaXR5TWFwIT09dm9pZCAwJiYoaS5zcGVjdWxhckludGVuc2l0eU1hcD1uKHQuc3BlY3VsYXJJbnRlbnNpdHlNYXApKSx0LnNwZWN1bGFyQ29sb3JNYXAhPT12b2lkIDAmJihpLnNwZWN1bGFyQ29sb3JNYXA9bih0LnNwZWN1bGFyQ29sb3JNYXApKSx0LmVudk1hcCE9PXZvaWQgMCYmKGkuZW52TWFwPW4odC5lbnZNYXApKSx0LmVudk1hcFJvdGF0aW9uIT09dm9pZCAwJiZpLmVudk1hcFJvdGF0aW9uLmZyb21BcnJheSh0LmVudk1hcFJvdGF0aW9uKSx0LmVudk1hcEludGVuc2l0eSE9PXZvaWQgMCYmKGkuZW52TWFwSW50ZW5zaXR5PXQuZW52TWFwSW50ZW5zaXR5KSx0LnJlZmxlY3Rpdml0eSE9PXZvaWQgMCYmKGkucmVmbGVjdGl2aXR5PXQucmVmbGVjdGl2aXR5KSx0LnJlZnJhY3Rpb25SYXRpbyE9PXZvaWQgMCYmKGkucmVmcmFjdGlvblJhdGlvPXQucmVmcmFjdGlvblJhdGlvKSx0LmxpZ2h0TWFwIT09dm9pZCAwJiYoaS5saWdodE1hcD1uKHQubGlnaHRNYXApKSx0LmxpZ2h0TWFwSW50ZW5zaXR5IT09dm9pZCAwJiYoaS5saWdodE1hcEludGVuc2l0eT10LmxpZ2h0TWFwSW50ZW5zaXR5KSx0LmFvTWFwIT09dm9pZCAwJiYoaS5hb01hcD1uKHQuYW9NYXApKSx0LmFvTWFwSW50ZW5zaXR5IT09dm9pZCAwJiYoaS5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5KSx0LmdyYWRpZW50TWFwIT09dm9pZCAwJiYoaS5ncmFkaWVudE1hcD1uKHQuZ3JhZGllbnRNYXApKSx0LmNsZWFyY29hdE1hcCE9PXZvaWQgMCYmKGkuY2xlYXJjb2F0TWFwPW4odC5jbGVhcmNvYXRNYXApKSx0LmNsZWFyY29hdFJvdWdobmVzc01hcCE9PXZvaWQgMCYmKGkuY2xlYXJjb2F0Um91Z2huZXNzTWFwPW4odC5jbGVhcmNvYXRSb3VnaG5lc3NNYXApKSx0LmNsZWFyY29hdE5vcm1hbE1hcCE9PXZvaWQgMCYmKGkuY2xlYXJjb2F0Tm9ybWFsTWFwPW4odC5jbGVhcmNvYXROb3JtYWxNYXApKSx0LmNsZWFyY29hdE5vcm1hbFNjYWxlIT09dm9pZCAwJiYoaS5jbGVhcmNvYXROb3JtYWxTY2FsZT1uZXcgcSgpLmZyb21BcnJheSh0LmNsZWFyY29hdE5vcm1hbFNjYWxlKSksdC5pcmlkZXNjZW5jZU1hcCE9PXZvaWQgMCYmKGkuaXJpZGVzY2VuY2VNYXA9bih0LmlyaWRlc2NlbmNlTWFwKSksdC5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCE9PXZvaWQgMCYmKGkuaXJpZGVzY2VuY2VUaGlja25lc3NNYXA9bih0LmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwKSksdC50cmFuc21pc3Npb25NYXAhPT12b2lkIDAmJihpLnRyYW5zbWlzc2lvbk1hcD1uKHQudHJhbnNtaXNzaW9uTWFwKSksdC50aGlja25lc3NNYXAhPT12b2lkIDAmJihpLnRoaWNrbmVzc01hcD1uKHQudGhpY2tuZXNzTWFwKSksdC5hbmlzb3Ryb3B5TWFwIT09dm9pZCAwJiYoaS5hbmlzb3Ryb3B5TWFwPW4odC5hbmlzb3Ryb3B5TWFwKSksdC5zaGVlbkNvbG9yTWFwIT09dm9pZCAwJiYoaS5zaGVlbkNvbG9yTWFwPW4odC5zaGVlbkNvbG9yTWFwKSksdC5zaGVlblJvdWdobmVzc01hcCE9PXZvaWQgMCYmKGkuc2hlZW5Sb3VnaG5lc3NNYXA9bih0LnNoZWVuUm91Z2huZXNzTWFwKSksaX1zZXRUZXh0dXJlcyh0KXtyZXR1cm4gdGhpcy50ZXh0dXJlcz10LHRoaXN9Y3JlYXRlTWF0ZXJpYWxGcm9tVHlwZSh0KXtyZXR1cm4gc3UuY3JlYXRlTWF0ZXJpYWxGcm9tVHlwZSh0KX1zdGF0aWMgY3JlYXRlTWF0ZXJpYWxGcm9tVHlwZSh0KXtjb25zdCBlPXtTaGFkb3dNYXRlcmlhbDpoMCxTcHJpdGVNYXRlcmlhbDpUZixSYXdTaGFkZXJNYXRlcmlhbDpmMCxTaGFkZXJNYXRlcmlhbDpvaSxQb2ludHNNYXRlcmlhbDpOZixNZXNoUGh5c2ljYWxNYXRlcmlhbDpkMCxNZXNoU3RhbmRhcmRNYXRlcmlhbDpaZixNZXNoUGhvbmdNYXRlcmlhbDpwMCxNZXNoVG9vbk1hdGVyaWFsOm0wLE1lc2hOb3JtYWxNYXRlcmlhbDpnMCxNZXNoTGFtYmVydE1hdGVyaWFsOngwLE1lc2hEZXB0aE1hdGVyaWFsOkpmLE1lc2hEaXN0YW5jZU1hdGVyaWFsOktmLE1lc2hCYXNpY01hdGVyaWFsOnByLE1lc2hNYXRjYXBNYXRlcmlhbDpfMCxMaW5lRGFzaGVkTWF0ZXJpYWw6eTAsTGluZUJhc2ljTWF0ZXJpYWw6YW4sTWF0ZXJpYWw6S2V9O3JldHVybiBuZXcgZVt0XX19Y2xhc3Mgb2R7c3RhdGljIGV4dHJhY3RVcmxCYXNlKHQpe2NvbnN0IGU9dC5sYXN0SW5kZXhPZigiLyIpO3JldHVybiBlPT09LTE/Ii4vIjp0LnNsaWNlKDAsZSsxKX1zdGF0aWMgcmVzb2x2ZVVSTCh0LGUpe3JldHVybiB0eXBlb2YgdCE9InN0cmluZyJ8fHQ9PT0iIj8iIjooL15odHRwcz86XC9cLy9pLnRlc3QoZSkmJi9eXC8vLnRlc3QodCkmJihlPWUucmVwbGFjZSgvKF5odHRwcz86XC9cL1teXC9dKykuKi9pLCIkMSIpKSwvXihodHRwcz86KT9cL1wvL2kudGVzdCh0KXx8L15kYXRhOi4qLC4qJC9pLnRlc3QodCl8fC9eYmxvYjouKiQvaS50ZXN0KHQpP3Q6ZSt0KX19Y2xhc3MgQjAgZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PSEwLHRoaXMudHlwZT0iSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiLHRoaXMuaW5zdGFuY2VDb3VudD0xLzB9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmluc3RhbmNlQ291bnQ9dC5pbnN0YW5jZUNvdW50LHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5pbnN0YW5jZUNvdW50PXRoaXMuaW5zdGFuY2VDb3VudCx0LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk9ITAsdH19Y2xhc3MgTzAgZXh0ZW5kcyBTbntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLGkpe2NvbnN0IHM9dGhpcyxvPW5ldyBXaShzLm1hbmFnZXIpO28uc2V0UGF0aChzLnBhdGgpLG8uc2V0UmVxdWVzdEhlYWRlcihzLnJlcXVlc3RIZWFkZXIpLG8uc2V0V2l0aENyZWRlbnRpYWxzKHMud2l0aENyZWRlbnRpYWxzKSxvLmxvYWQodCxmdW5jdGlvbihhKXt0cnl7ZShzLnBhcnNlKEpTT04ucGFyc2UoYSkpKX1jYXRjaChjKXtpP2koYyk6Y29uc29sZS5lcnJvcihjKSxzLm1hbmFnZXIuaXRlbUVycm9yKHQpfX0sbixpKX1wYXJzZSh0KXtjb25zdCBlPXt9LG49e307ZnVuY3Rpb24gaShkLHApe2lmKGVbcF0hPT12b2lkIDApcmV0dXJuIGVbcF07Y29uc3QgZz1kLmludGVybGVhdmVkQnVmZmVyc1twXSxtPXMoZCxnLmJ1ZmZlciksdj1QcyhnLnR5cGUsbSkseT1uZXcgX2wodixnLnN0cmlkZSk7cmV0dXJuIHkudXVpZD1nLnV1aWQsZVtwXT15LHl9ZnVuY3Rpb24gcyhkLHApe2lmKG5bcF0hPT12b2lkIDApcmV0dXJuIG5bcF07Y29uc3QgZz1kLmFycmF5QnVmZmVyc1twXSxtPW5ldyBVaW50MzJBcnJheShnKS5idWZmZXI7cmV0dXJuIG5bcF09bSxtfWNvbnN0IG89dC5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5P25ldyBCMDpuZXcgTnQsYT10LmRhdGEuaW5kZXg7aWYoYSE9PXZvaWQgMCl7Y29uc3QgZD1QcyhhLnR5cGUsYS5hcnJheSk7by5zZXRJbmRleChuZXcgSnQoZCwxKSl9Y29uc3QgYz10LmRhdGEuYXR0cmlidXRlcztmb3IoY29uc3QgZCBpbiBjKXtjb25zdCBwPWNbZF07bGV0IHg7aWYocC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXtjb25zdCBnPWkodC5kYXRhLHAuZGF0YSk7eD1uZXcga3IoZyxwLml0ZW1TaXplLHAub2Zmc2V0LHAubm9ybWFsaXplZCl9ZWxzZXtjb25zdCBnPVBzKHAudHlwZSxwLmFycmF5KSxtPXAuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU/S3M6SnQ7eD1uZXcgbShnLHAuaXRlbVNpemUscC5ub3JtYWxpemVkKX1wLm5hbWUhPT12b2lkIDAmJih4Lm5hbWU9cC5uYW1lKSxwLnVzYWdlIT09dm9pZCAwJiZ4LnNldFVzYWdlKHAudXNhZ2UpLG8uc2V0QXR0cmlidXRlKGQseCl9Y29uc3QgbD10LmRhdGEubW9ycGhBdHRyaWJ1dGVzO2lmKGwpZm9yKGNvbnN0IGQgaW4gbCl7Y29uc3QgcD1sW2RdLHg9W107Zm9yKGxldCBnPTAsbT1wLmxlbmd0aDtnPG07ZysrKXtjb25zdCB2PXBbZ107bGV0IHk7aWYodi5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXtjb25zdCBfPWkodC5kYXRhLHYuZGF0YSk7eT1uZXcga3IoXyx2Lml0ZW1TaXplLHYub2Zmc2V0LHYubm9ybWFsaXplZCl9ZWxzZXtjb25zdCBfPVBzKHYudHlwZSx2LmFycmF5KTt5PW5ldyBKdChfLHYuaXRlbVNpemUsdi5ub3JtYWxpemVkKX12Lm5hbWUhPT12b2lkIDAmJih5Lm5hbWU9di5uYW1lKSx4LnB1c2goeSl9by5tb3JwaEF0dHJpYnV0ZXNbZF09eH10LmRhdGEubW9ycGhUYXJnZXRzUmVsYXRpdmUmJihvLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSEwKTtjb25zdCBoPXQuZGF0YS5ncm91cHN8fHQuZGF0YS5kcmF3Y2FsbHN8fHQuZGF0YS5vZmZzZXRzO2lmKGghPT12b2lkIDApZm9yKGxldCBkPTAscD1oLmxlbmd0aDtkIT09cDsrK2Qpe2NvbnN0IHg9aFtkXTtvLmFkZEdyb3VwKHguc3RhcnQseC5jb3VudCx4Lm1hdGVyaWFsSW5kZXgpfWNvbnN0IGY9dC5kYXRhLmJvdW5kaW5nU3BoZXJlO2lmKGYhPT12b2lkIDApe2NvbnN0IGQ9bmV3IEk7Zi5jZW50ZXIhPT12b2lkIDAmJmQuZnJvbUFycmF5KGYuY2VudGVyKSxvLmJvdW5kaW5nU3BoZXJlPW5ldyBHZShkLGYucmFkaXVzKX1yZXR1cm4gdC5uYW1lJiYoby5uYW1lPXQubmFtZSksdC51c2VyRGF0YSYmKG8udXNlckRhdGE9dC51c2VyRGF0YSksb319Y2xhc3MgaGIgZXh0ZW5kcyBTbntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLGkpe2NvbnN0IHM9dGhpcyxvPXRoaXMucGF0aD09PSIiP29kLmV4dHJhY3RVcmxCYXNlKHQpOnRoaXMucGF0aDt0aGlzLnJlc291cmNlUGF0aD10aGlzLnJlc291cmNlUGF0aHx8bztjb25zdCBhPW5ldyBXaSh0aGlzLm1hbmFnZXIpO2Euc2V0UGF0aCh0aGlzLnBhdGgpLGEuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLGEuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKSxhLmxvYWQodCxmdW5jdGlvbihjKXtsZXQgbD1udWxsO3RyeXtsPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7aSE9PXZvaWQgMCYmaShoKSxjb25zb2xlLmVycm9yKCJUSFJFRTpPYmplY3RMb2FkZXI6IENhbid0IHBhcnNlICIrdCsiLiIsaC5tZXNzYWdlKTtyZXR1cm59Y29uc3QgdT1sLm1ldGFkYXRhO2lmKHU9PT12b2lkIDB8fHUudHlwZT09PXZvaWQgMHx8dS50eXBlLnRvTG93ZXJDYXNlKCk9PT0iZ2VvbWV0cnkiKXtpIT09dm9pZCAwJiZpKG5ldyBFcnJvcigiVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW4ndCBsb2FkICIrdCkpLGNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdExvYWRlcjogQ2FuJ3QgbG9hZCAiK3QpO3JldHVybn1zLnBhcnNlKGwsZSl9LG4saSl9bG9hZEFzeW5jKHQsZSl7cmV0dXJuIE1zKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBuPXRoaXMsaT10aGlzLnBhdGg9PT0iIj9vZC5leHRyYWN0VXJsQmFzZSh0KTp0aGlzLnBhdGg7dGhpcy5yZXNvdXJjZVBhdGg9dGhpcy5yZXNvdXJjZVBhdGh8fGk7Y29uc3Qgcz1uZXcgV2kodGhpcy5tYW5hZ2VyKTtzLnNldFBhdGgodGhpcy5wYXRoKSxzLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxzLnNldFdpdGhDcmVkZW50aWFscyh0aGlzLndpdGhDcmVkZW50aWFscyk7Y29uc3Qgbz15aWVsZCBzLmxvYWRBc3luYyh0LGUpLGE9SlNPTi5wYXJzZShvKSxjPWEubWV0YWRhdGE7aWYoYz09PXZvaWQgMHx8Yy50eXBlPT09dm9pZCAwfHxjLnR5cGUudG9Mb3dlckNhc2UoKT09PSJnZW9tZXRyeSIpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5PYmplY3RMb2FkZXI6IENhbid0IGxvYWQgIit0KTtyZXR1cm4geWllbGQgbi5wYXJzZUFzeW5jKGEpfSl9cGFyc2UodCxlKXtjb25zdCBuPXRoaXMucGFyc2VBbmltYXRpb25zKHQuYW5pbWF0aW9ucyksaT10aGlzLnBhcnNlU2hhcGVzKHQuc2hhcGVzKSxzPXRoaXMucGFyc2VHZW9tZXRyaWVzKHQuZ2VvbWV0cmllcyxpKSxvPXRoaXMucGFyc2VJbWFnZXModC5pbWFnZXMsZnVuY3Rpb24oKXtlIT09dm9pZCAwJiZlKGwpfSksYT10aGlzLnBhcnNlVGV4dHVyZXModC50ZXh0dXJlcyxvKSxjPXRoaXMucGFyc2VNYXRlcmlhbHModC5tYXRlcmlhbHMsYSksbD10aGlzLnBhcnNlT2JqZWN0KHQub2JqZWN0LHMsYyxhLG4pLHU9dGhpcy5wYXJzZVNrZWxldG9ucyh0LnNrZWxldG9ucyxsKTtpZih0aGlzLmJpbmRTa2VsZXRvbnMobCx1KSx0aGlzLmJpbmRMaWdodFRhcmdldHMobCksZSE9PXZvaWQgMCl7bGV0IGg9ITE7Zm9yKGNvbnN0IGYgaW4gbylpZihvW2ZdLmRhdGEgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KXtoPSEwO2JyZWFrfWg9PT0hMSYmZShsKX1yZXR1cm4gbH1wYXJzZUFzeW5jKHQpe3JldHVybiBNcyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT10aGlzLnBhcnNlQW5pbWF0aW9ucyh0LmFuaW1hdGlvbnMpLG49dGhpcy5wYXJzZVNoYXBlcyh0LnNoYXBlcyksaT10aGlzLnBhcnNlR2VvbWV0cmllcyh0Lmdlb21ldHJpZXMsbikscz15aWVsZCB0aGlzLnBhcnNlSW1hZ2VzQXN5bmModC5pbWFnZXMpLG89dGhpcy5wYXJzZVRleHR1cmVzKHQudGV4dHVyZXMscyksYT10aGlzLnBhcnNlTWF0ZXJpYWxzKHQubWF0ZXJpYWxzLG8pLGM9dGhpcy5wYXJzZU9iamVjdCh0Lm9iamVjdCxpLGEsbyxlKSxsPXRoaXMucGFyc2VTa2VsZXRvbnModC5za2VsZXRvbnMsYyk7cmV0dXJuIHRoaXMuYmluZFNrZWxldG9ucyhjLGwpLHRoaXMuYmluZExpZ2h0VGFyZ2V0cyhjKSxjfSl9cGFyc2VTaGFwZXModCl7Y29uc3QgZT17fTtpZih0IT09dm9pZCAwKWZvcihsZXQgbj0wLGk9dC5sZW5ndGg7bjxpO24rKyl7Y29uc3Qgcz1uZXcgVmkoKS5mcm9tSlNPTih0W25dKTtlW3MudXVpZF09c31yZXR1cm4gZX1wYXJzZVNrZWxldG9ucyh0LGUpe2NvbnN0IG49e30saT17fTtpZihlLnRyYXZlcnNlKGZ1bmN0aW9uKHMpe3MuaXNCb25lJiYoaVtzLnV1aWRdPXMpfSksdCE9PXZvaWQgMClmb3IobGV0IHM9MCxvPXQubGVuZ3RoO3M8bztzKyspe2NvbnN0IGE9bmV3IHdsKCkuZnJvbUpTT04odFtzXSxpKTtuW2EudXVpZF09YX1yZXR1cm4gbn1wYXJzZUdlb21ldHJpZXModCxlKXtjb25zdCBuPXt9O2lmKHQhPT12b2lkIDApe2NvbnN0IGk9bmV3IE8wO2ZvcihsZXQgcz0wLG89dC5sZW5ndGg7czxvO3MrKyl7bGV0IGE7Y29uc3QgYz10W3NdO3N3aXRjaChjLnR5cGUpe2Nhc2UiQnVmZmVyR2VvbWV0cnkiOmNhc2UiSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiOmE9aS5wYXJzZShjKTticmVhaztkZWZhdWx0OmMudHlwZSBpbiB1MD9hPXUwW2MudHlwZV0uZnJvbUpTT04oYyxlKTpjb25zb2xlLndhcm4oYFRIUkVFLk9iamVjdExvYWRlcjogVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSAiJHtjLnR5cGV9ImApfWEudXVpZD1jLnV1aWQsYy5uYW1lIT09dm9pZCAwJiYoYS5uYW1lPWMubmFtZSksYy51c2VyRGF0YSE9PXZvaWQgMCYmKGEudXNlckRhdGE9Yy51c2VyRGF0YSksbltjLnV1aWRdPWF9fXJldHVybiBufXBhcnNlTWF0ZXJpYWxzKHQsZSl7Y29uc3Qgbj17fSxpPXt9O2lmKHQhPT12b2lkIDApe2NvbnN0IHM9bmV3IHN1O3Muc2V0VGV4dHVyZXMoZSk7Zm9yKGxldCBvPTAsYT10Lmxlbmd0aDtvPGE7bysrKXtjb25zdCBjPXRbb107bltjLnV1aWRdPT09dm9pZCAwJiYobltjLnV1aWRdPXMucGFyc2UoYykpLGlbYy51dWlkXT1uW2MudXVpZF19fXJldHVybiBpfXBhcnNlQW5pbWF0aW9ucyh0KXtjb25zdCBlPXt9O2lmKHQhPT12b2lkIDApZm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IGk9dFtuXSxzPVNhLnBhcnNlKGkpO2Vbcy51dWlkXT1zfXJldHVybiBlfXBhcnNlSW1hZ2VzKHQsZSl7Y29uc3Qgbj10aGlzLGk9e307bGV0IHM7ZnVuY3Rpb24gbyhjKXtyZXR1cm4gbi5tYW5hZ2VyLml0ZW1TdGFydChjKSxzLmxvYWQoYyxmdW5jdGlvbigpe24ubWFuYWdlci5pdGVtRW5kKGMpfSx2b2lkIDAsZnVuY3Rpb24oKXtuLm1hbmFnZXIuaXRlbUVycm9yKGMpLG4ubWFuYWdlci5pdGVtRW5kKGMpfSl9ZnVuY3Rpb24gYShjKXtpZih0eXBlb2YgYz09InN0cmluZyIpe2NvbnN0IGw9Yyx1PS9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KGwpP2w6bi5yZXNvdXJjZVBhdGgrbDtyZXR1cm4gbyh1KX1lbHNlIHJldHVybiBjLmRhdGE/e2RhdGE6UHMoYy50eXBlLGMuZGF0YSksd2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9Om51bGx9aWYodCE9PXZvaWQgMCYmdC5sZW5ndGg+MCl7Y29uc3QgYz1uZXcgbmQoZSk7cz1uZXcgYmEoYykscy5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTtmb3IobGV0IGw9MCx1PXQubGVuZ3RoO2w8dTtsKyspe2NvbnN0IGg9dFtsXSxmPWgudXJsO2lmKEFycmF5LmlzQXJyYXkoZikpe2NvbnN0IGQ9W107Zm9yKGxldCBwPTAseD1mLmxlbmd0aDtwPHg7cCsrKXtjb25zdCBnPWZbcF0sbT1hKGcpO20hPT1udWxsJiYobSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ/ZC5wdXNoKG0pOmQucHVzaChuZXcgTWkobS5kYXRhLG0ud2lkdGgsbS5oZWlnaHQpKSl9aVtoLnV1aWRdPW5ldyBhcihkKX1lbHNle2NvbnN0IGQ9YShoLnVybCk7aVtoLnV1aWRdPW5ldyBhcihkKX19fXJldHVybiBpfXBhcnNlSW1hZ2VzQXN5bmModCl7cmV0dXJuIE1zKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBlPXRoaXMsbj17fTtsZXQgaTtmdW5jdGlvbiBzKG8pe3JldHVybiBNcyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYodHlwZW9mIG89PSJzdHJpbmciKXtjb25zdCBhPW8sYz0vXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChhKT9hOmUucmVzb3VyY2VQYXRoK2E7cmV0dXJuIHlpZWxkIGkubG9hZEFzeW5jKGMpfWVsc2UgcmV0dXJuIG8uZGF0YT97ZGF0YTpQcyhvLnR5cGUsby5kYXRhKSx3aWR0aDpvLndpZHRoLGhlaWdodDpvLmhlaWdodH06bnVsbH0pfWlmKHQhPT12b2lkIDAmJnQubGVuZ3RoPjApe2k9bmV3IGJhKHRoaXMubWFuYWdlciksaS5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTtmb3IobGV0IG89MCxhPXQubGVuZ3RoO288YTtvKyspe2NvbnN0IGM9dFtvXSxsPWMudXJsO2lmKEFycmF5LmlzQXJyYXkobCkpe2NvbnN0IHU9W107Zm9yKGxldCBoPTAsZj1sLmxlbmd0aDtoPGY7aCsrKXtjb25zdCBkPWxbaF0scD15aWVsZCBzKGQpO3AhPT1udWxsJiYocCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ/dS5wdXNoKHApOnUucHVzaChuZXcgTWkocC5kYXRhLHAud2lkdGgscC5oZWlnaHQpKSl9bltjLnV1aWRdPW5ldyBhcih1KX1lbHNle2NvbnN0IHU9eWllbGQgcyhjLnVybCk7bltjLnV1aWRdPW5ldyBhcih1KX19fXJldHVybiBufSl9cGFyc2VUZXh0dXJlcyh0LGUpe2Z1bmN0aW9uIG4ocyxvKXtyZXR1cm4gdHlwZW9mIHM9PSJudW1iZXIiP3M6KGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlVGV4dHVyZTogQ29uc3RhbnQgc2hvdWxkIGJlIGluIG51bWVyaWMgZm9ybS4iLHMpLG9bc10pfWNvbnN0IGk9e307aWYodCE9PXZvaWQgMClmb3IobGV0IHM9MCxvPXQubGVuZ3RoO3M8bztzKyspe2NvbnN0IGE9dFtzXTthLmltYWdlPT09dm9pZCAwJiZjb25zb2xlLndhcm4oJ1RIUkVFLk9iamVjdExvYWRlcjogTm8gImltYWdlIiBzcGVjaWZpZWQgZm9yJyxhLnV1aWQpLGVbYS5pbWFnZV09PT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgaW1hZ2UiLGEuaW1hZ2UpO2NvbnN0IGM9ZVthLmltYWdlXSxsPWMuZGF0YTtsZXQgdTtBcnJheS5pc0FycmF5KGwpPyh1PW5ldyB0YSxsLmxlbmd0aD09PTYmJih1Lm5lZWRzVXBkYXRlPSEwKSk6KGwmJmwuZGF0YT91PW5ldyBNaTp1PW5ldyBBZSxsJiYodS5uZWVkc1VwZGF0ZT0hMCkpLHUuc291cmNlPWMsdS51dWlkPWEudXVpZCxhLm5hbWUhPT12b2lkIDAmJih1Lm5hbWU9YS5uYW1lKSxhLm1hcHBpbmchPT12b2lkIDAmJih1Lm1hcHBpbmc9bihhLm1hcHBpbmcsZmIpKSxhLmNoYW5uZWwhPT12b2lkIDAmJih1LmNoYW5uZWw9YS5jaGFubmVsKSxhLm9mZnNldCE9PXZvaWQgMCYmdS5vZmZzZXQuZnJvbUFycmF5KGEub2Zmc2V0KSxhLnJlcGVhdCE9PXZvaWQgMCYmdS5yZXBlYXQuZnJvbUFycmF5KGEucmVwZWF0KSxhLmNlbnRlciE9PXZvaWQgMCYmdS5jZW50ZXIuZnJvbUFycmF5KGEuY2VudGVyKSxhLnJvdGF0aW9uIT09dm9pZCAwJiYodS5yb3RhdGlvbj1hLnJvdGF0aW9uKSxhLndyYXAhPT12b2lkIDAmJih1LndyYXBTPW4oYS53cmFwWzBdLHowKSx1LndyYXBUPW4oYS53cmFwWzFdLHowKSksYS5mb3JtYXQhPT12b2lkIDAmJih1LmZvcm1hdD1hLmZvcm1hdCksYS5pbnRlcm5hbEZvcm1hdCE9PXZvaWQgMCYmKHUuaW50ZXJuYWxGb3JtYXQ9YS5pbnRlcm5hbEZvcm1hdCksYS50eXBlIT09dm9pZCAwJiYodS50eXBlPWEudHlwZSksYS5jb2xvclNwYWNlIT09dm9pZCAwJiYodS5jb2xvclNwYWNlPWEuY29sb3JTcGFjZSksYS5taW5GaWx0ZXIhPT12b2lkIDAmJih1Lm1pbkZpbHRlcj1uKGEubWluRmlsdGVyLGswKSksYS5tYWdGaWx0ZXIhPT12b2lkIDAmJih1Lm1hZ0ZpbHRlcj1uKGEubWFnRmlsdGVyLGswKSksYS5hbmlzb3Ryb3B5IT09dm9pZCAwJiYodS5hbmlzb3Ryb3B5PWEuYW5pc290cm9weSksYS5mbGlwWSE9PXZvaWQgMCYmKHUuZmxpcFk9YS5mbGlwWSksYS5nZW5lcmF0ZU1pcG1hcHMhPT12b2lkIDAmJih1LmdlbmVyYXRlTWlwbWFwcz1hLmdlbmVyYXRlTWlwbWFwcyksYS5wcmVtdWx0aXBseUFscGhhIT09dm9pZCAwJiYodS5wcmVtdWx0aXBseUFscGhhPWEucHJlbXVsdGlwbHlBbHBoYSksYS51bnBhY2tBbGlnbm1lbnQhPT12b2lkIDAmJih1LnVucGFja0FsaWdubWVudD1hLnVucGFja0FsaWdubWVudCksYS5jb21wYXJlRnVuY3Rpb24hPT12b2lkIDAmJih1LmNvbXBhcmVGdW5jdGlvbj1hLmNvbXBhcmVGdW5jdGlvbiksYS51c2VyRGF0YSE9PXZvaWQgMCYmKHUudXNlckRhdGE9YS51c2VyRGF0YSksaVthLnV1aWRdPXV9cmV0dXJuIGl9cGFyc2VPYmplY3QodCxlLG4saSxzKXtsZXQgbztmdW5jdGlvbiBhKGYpe3JldHVybiBlW2ZdPT09dm9pZCAwJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5IixmKSxlW2ZdfWZ1bmN0aW9uIGMoZil7aWYoZiE9PXZvaWQgMCl7aWYoQXJyYXkuaXNBcnJheShmKSl7Y29uc3QgZD1bXTtmb3IobGV0IHA9MCx4PWYubGVuZ3RoO3A8eDtwKyspe2NvbnN0IGc9ZltwXTtuW2ddPT09dm9pZCAwJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsIixnKSxkLnB1c2gobltnXSl9cmV0dXJuIGR9cmV0dXJuIG5bZl09PT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLGYpLG5bZl19fWZ1bmN0aW9uIGwoZil7cmV0dXJuIGlbZl09PT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgdGV4dHVyZSIsZiksaVtmXX1sZXQgdSxoO3N3aXRjaCh0LnR5cGUpe2Nhc2UiU2NlbmUiOm89bmV3IF9nLHQuYmFja2dyb3VuZCE9PXZvaWQgMCYmKE51bWJlci5pc0ludGVnZXIodC5iYWNrZ3JvdW5kKT9vLmJhY2tncm91bmQ9bmV3IHl0KHQuYmFja2dyb3VuZCk6by5iYWNrZ3JvdW5kPWwodC5iYWNrZ3JvdW5kKSksdC5lbnZpcm9ubWVudCE9PXZvaWQgMCYmKG8uZW52aXJvbm1lbnQ9bCh0LmVudmlyb25tZW50KSksdC5mb2chPT12b2lkIDAmJih0LmZvZy50eXBlPT09IkZvZyI/by5mb2c9bmV3IHhsKHQuZm9nLmNvbG9yLHQuZm9nLm5lYXIsdC5mb2cuZmFyKTp0LmZvZy50eXBlPT09IkZvZ0V4cDIiJiYoby5mb2c9bmV3IGdsKHQuZm9nLmNvbG9yLHQuZm9nLmRlbnNpdHkpKSx0LmZvZy5uYW1lIT09IiImJihvLmZvZy5uYW1lPXQuZm9nLm5hbWUpKSx0LmJhY2tncm91bmRCbHVycmluZXNzIT09dm9pZCAwJiYoby5iYWNrZ3JvdW5kQmx1cnJpbmVzcz10LmJhY2tncm91bmRCbHVycmluZXNzKSx0LmJhY2tncm91bmRJbnRlbnNpdHkhPT12b2lkIDAmJihvLmJhY2tncm91bmRJbnRlbnNpdHk9dC5iYWNrZ3JvdW5kSW50ZW5zaXR5KSx0LmJhY2tncm91bmRSb3RhdGlvbiE9PXZvaWQgMCYmby5iYWNrZ3JvdW5kUm90YXRpb24uZnJvbUFycmF5KHQuYmFja2dyb3VuZFJvdGF0aW9uKSx0LmVudmlyb25tZW50SW50ZW5zaXR5IT09dm9pZCAwJiYoby5lbnZpcm9ubWVudEludGVuc2l0eT10LmVudmlyb25tZW50SW50ZW5zaXR5KSx0LmVudmlyb25tZW50Um90YXRpb24hPT12b2lkIDAmJm8uZW52aXJvbm1lbnRSb3RhdGlvbi5mcm9tQXJyYXkodC5lbnZpcm9ubWVudFJvdGF0aW9uKTticmVhaztjYXNlIlBlcnNwZWN0aXZlQ2FtZXJhIjpvPW5ldyAkZSh0LmZvdix0LmFzcGVjdCx0Lm5lYXIsdC5mYXIpLHQuZm9jdXMhPT12b2lkIDAmJihvLmZvY3VzPXQuZm9jdXMpLHQuem9vbSE9PXZvaWQgMCYmKG8uem9vbT10Lnpvb20pLHQuZmlsbUdhdWdlIT09dm9pZCAwJiYoby5maWxtR2F1Z2U9dC5maWxtR2F1Z2UpLHQuZmlsbU9mZnNldCE9PXZvaWQgMCYmKG8uZmlsbU9mZnNldD10LmZpbG1PZmZzZXQpLHQudmlldyE9PXZvaWQgMCYmKG8udmlldz1PYmplY3QuYXNzaWduKHt9LHQudmlldykpO2JyZWFrO2Nhc2UiT3J0aG9ncmFwaGljQ2FtZXJhIjpvPW5ldyBydSh0LmxlZnQsdC5yaWdodCx0LnRvcCx0LmJvdHRvbSx0Lm5lYXIsdC5mYXIpLHQuem9vbSE9PXZvaWQgMCYmKG8uem9vbT10Lnpvb20pLHQudmlldyE9PXZvaWQgMCYmKG8udmlldz1PYmplY3QuYXNzaWduKHt9LHQudmlldykpO2JyZWFrO2Nhc2UiQW1iaWVudExpZ2h0IjpvPW5ldyBEMCh0LmNvbG9yLHQuaW50ZW5zaXR5KTticmVhaztjYXNlIkRpcmVjdGlvbmFsTGlnaHQiOm89bmV3IEwwKHQuY29sb3IsdC5pbnRlbnNpdHkpLG8udGFyZ2V0PXQudGFyZ2V0fHwiIjticmVhaztjYXNlIlBvaW50TGlnaHQiOm89bmV3IFAwKHQuY29sb3IsdC5pbnRlbnNpdHksdC5kaXN0YW5jZSx0LmRlY2F5KTticmVhaztjYXNlIlJlY3RBcmVhTGlnaHQiOm89bmV3IFUwKHQuY29sb3IsdC5pbnRlbnNpdHksdC53aWR0aCx0LmhlaWdodCk7YnJlYWs7Y2FzZSJTcG90TGlnaHQiOm89bmV3IFIwKHQuY29sb3IsdC5pbnRlbnNpdHksdC5kaXN0YW5jZSx0LmFuZ2xlLHQucGVudW1icmEsdC5kZWNheSksby50YXJnZXQ9dC50YXJnZXR8fCIiO2JyZWFrO2Nhc2UiSGVtaXNwaGVyZUxpZ2h0IjpvPW5ldyBUMCh0LmNvbG9yLHQuZ3JvdW5kQ29sb3IsdC5pbnRlbnNpdHkpO2JyZWFrO2Nhc2UiTGlnaHRQcm9iZSI6bz1uZXcgRjAoKS5mcm9tSlNPTih0KTticmVhaztjYXNlIlNraW5uZWRNZXNoIjp1PWEodC5nZW9tZXRyeSksaD1jKHQubWF0ZXJpYWwpLG89bmV3IElnKHUsaCksdC5iaW5kTW9kZSE9PXZvaWQgMCYmKG8uYmluZE1vZGU9dC5iaW5kTW9kZSksdC5iaW5kTWF0cml4IT09dm9pZCAwJiZvLmJpbmRNYXRyaXguZnJvbUFycmF5KHQuYmluZE1hdHJpeCksdC5za2VsZXRvbiE9PXZvaWQgMCYmKG8uc2tlbGV0b249dC5za2VsZXRvbik7YnJlYWs7Y2FzZSJNZXNoIjp1PWEodC5nZW9tZXRyeSksaD1jKHQubWF0ZXJpYWwpLG89bmV3IExlKHUsaCk7YnJlYWs7Y2FzZSJJbnN0YW5jZWRNZXNoIjp1PWEodC5nZW9tZXRyeSksaD1jKHQubWF0ZXJpYWwpO2NvbnN0IGY9dC5jb3VudCxkPXQuaW5zdGFuY2VNYXRyaXgscD10Lmluc3RhbmNlQ29sb3I7bz1uZXcgVWcodSxoLGYpLG8uaW5zdGFuY2VNYXRyaXg9bmV3IEtzKG5ldyBGbG9hdDMyQXJyYXkoZC5hcnJheSksMTYpLHAhPT12b2lkIDAmJihvLmluc3RhbmNlQ29sb3I9bmV3IEtzKG5ldyBGbG9hdDMyQXJyYXkocC5hcnJheSkscC5pdGVtU2l6ZSkpO2JyZWFrO2Nhc2UiQmF0Y2hlZE1lc2giOnU9YSh0Lmdlb21ldHJ5KSxoPWModC5tYXRlcmlhbCksbz1uZXcgQmcodC5tYXhJbnN0YW5jZUNvdW50LHQubWF4VmVydGV4Q291bnQsdC5tYXhJbmRleENvdW50LGgpLG8uZ2VvbWV0cnk9dSxvLnBlck9iamVjdEZydXN0dW1DdWxsZWQ9dC5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkLG8uc29ydE9iamVjdHM9dC5zb3J0T2JqZWN0cyxvLl9kcmF3UmFuZ2VzPXQuZHJhd1JhbmdlcyxvLl9yZXNlcnZlZFJhbmdlcz10LnJlc2VydmVkUmFuZ2VzLG8uX2dlb21ldHJ5SW5mbz10Lmdlb21ldHJ5SW5mby5tYXAoeD0+e2xldCBnPW51bGwsbT1udWxsO3JldHVybiB4LmJvdW5kaW5nQm94IT09dm9pZCAwJiYoZz1uZXcgbGUsZy5taW4uZnJvbUFycmF5KHguYm91bmRpbmdCb3gubWluKSxnLm1heC5mcm9tQXJyYXkoeC5ib3VuZGluZ0JveC5tYXgpKSx4LmJvdW5kaW5nU3BoZXJlIT09dm9pZCAwJiYobT1uZXcgR2UsbS5yYWRpdXM9eC5ib3VuZGluZ1NwaGVyZS5yYWRpdXMsbS5jZW50ZXIuZnJvbUFycmF5KHguYm91bmRpbmdTcGhlcmUuY2VudGVyKSksZ2koV2Uoe30seCkse2JvdW5kaW5nQm94OmcsYm91bmRpbmdTcGhlcmU6bX0pfSksby5faW5zdGFuY2VJbmZvPXQuaW5zdGFuY2VJbmZvLG8uX2F2YWlsYWJsZUluc3RhbmNlSWRzPXQuX2F2YWlsYWJsZUluc3RhbmNlSWRzLG8uX2F2YWlsYWJsZUdlb21ldHJ5SWRzPXQuX2F2YWlsYWJsZUdlb21ldHJ5SWRzLG8uX25leHRJbmRleFN0YXJ0PXQubmV4dEluZGV4U3RhcnQsby5fbmV4dFZlcnRleFN0YXJ0PXQubmV4dFZlcnRleFN0YXJ0LG8uX2dlb21ldHJ5Q291bnQ9dC5nZW9tZXRyeUNvdW50LG8uX21heEluc3RhbmNlQ291bnQ9dC5tYXhJbnN0YW5jZUNvdW50LG8uX21heFZlcnRleENvdW50PXQubWF4VmVydGV4Q291bnQsby5fbWF4SW5kZXhDb3VudD10Lm1heEluZGV4Q291bnQsby5fZ2VvbWV0cnlJbml0aWFsaXplZD10Lmdlb21ldHJ5SW5pdGlhbGl6ZWQsby5fbWF0cmljZXNUZXh0dXJlPWwodC5tYXRyaWNlc1RleHR1cmUudXVpZCksby5faW5kaXJlY3RUZXh0dXJlPWwodC5pbmRpcmVjdFRleHR1cmUudXVpZCksdC5jb2xvcnNUZXh0dXJlIT09dm9pZCAwJiYoby5fY29sb3JzVGV4dHVyZT1sKHQuY29sb3JzVGV4dHVyZS51dWlkKSksdC5ib3VuZGluZ1NwaGVyZSE9PXZvaWQgMCYmKG8uYm91bmRpbmdTcGhlcmU9bmV3IEdlLG8uYm91bmRpbmdTcGhlcmUuY2VudGVyLmZyb21BcnJheSh0LmJvdW5kaW5nU3BoZXJlLmNlbnRlciksby5ib3VuZGluZ1NwaGVyZS5yYWRpdXM9dC5ib3VuZGluZ1NwaGVyZS5yYWRpdXMpLHQuYm91bmRpbmdCb3ghPT12b2lkIDAmJihvLmJvdW5kaW5nQm94PW5ldyBsZSxvLmJvdW5kaW5nQm94Lm1pbi5mcm9tQXJyYXkodC5ib3VuZGluZ0JveC5taW4pLG8uYm91bmRpbmdCb3gubWF4LmZyb21BcnJheSh0LmJvdW5kaW5nQm94Lm1heCkpO2JyZWFrO2Nhc2UiTE9EIjpvPW5ldyB3ZzticmVhaztjYXNlIkxpbmUiOm89bmV3IGdyKGEodC5nZW9tZXRyeSksYyh0Lm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSJMaW5lTG9vcCI6bz1uZXcgR2coYSh0Lmdlb21ldHJ5KSxjKHQubWF0ZXJpYWwpKTticmVhaztjYXNlIkxpbmVTZWdtZW50cyI6bz1uZXcgd2koYSh0Lmdlb21ldHJ5KSxjKHQubWF0ZXJpYWwpKTticmVhaztjYXNlIlBvaW50Q2xvdWQiOmNhc2UiUG9pbnRzIjpvPW5ldyBXZyhhKHQuZ2VvbWV0cnkpLGModC5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UiU3ByaXRlIjpvPW5ldyBTZyhjKHQubWF0ZXJpYWwpKTticmVhaztjYXNlIkdyb3VwIjpvPW5ldyAkczticmVhaztjYXNlIkJvbmUiOm89bmV3IElmO2JyZWFrO2RlZmF1bHQ6bz1uZXcgc2V9aWYoby51dWlkPXQudXVpZCx0Lm5hbWUhPT12b2lkIDAmJihvLm5hbWU9dC5uYW1lKSx0Lm1hdHJpeCE9PXZvaWQgMD8oby5tYXRyaXguZnJvbUFycmF5KHQubWF0cml4KSx0Lm1hdHJpeEF1dG9VcGRhdGUhPT12b2lkIDAmJihvLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlKSxvLm1hdHJpeEF1dG9VcGRhdGUmJm8ubWF0cml4LmRlY29tcG9zZShvLnBvc2l0aW9uLG8ucXVhdGVybmlvbixvLnNjYWxlKSk6KHQucG9zaXRpb24hPT12b2lkIDAmJm8ucG9zaXRpb24uZnJvbUFycmF5KHQucG9zaXRpb24pLHQucm90YXRpb24hPT12b2lkIDAmJm8ucm90YXRpb24uZnJvbUFycmF5KHQucm90YXRpb24pLHQucXVhdGVybmlvbiE9PXZvaWQgMCYmby5xdWF0ZXJuaW9uLmZyb21BcnJheSh0LnF1YXRlcm5pb24pLHQuc2NhbGUhPT12b2lkIDAmJm8uc2NhbGUuZnJvbUFycmF5KHQuc2NhbGUpKSx0LnVwIT09dm9pZCAwJiZvLnVwLmZyb21BcnJheSh0LnVwKSx0LmNhc3RTaGFkb3chPT12b2lkIDAmJihvLmNhc3RTaGFkb3c9dC5jYXN0U2hhZG93KSx0LnJlY2VpdmVTaGFkb3chPT12b2lkIDAmJihvLnJlY2VpdmVTaGFkb3c9dC5yZWNlaXZlU2hhZG93KSx0LnNoYWRvdyYmKHQuc2hhZG93LmludGVuc2l0eSE9PXZvaWQgMCYmKG8uc2hhZG93LmludGVuc2l0eT10LnNoYWRvdy5pbnRlbnNpdHkpLHQuc2hhZG93LmJpYXMhPT12b2lkIDAmJihvLnNoYWRvdy5iaWFzPXQuc2hhZG93LmJpYXMpLHQuc2hhZG93Lm5vcm1hbEJpYXMhPT12b2lkIDAmJihvLnNoYWRvdy5ub3JtYWxCaWFzPXQuc2hhZG93Lm5vcm1hbEJpYXMpLHQuc2hhZG93LnJhZGl1cyE9PXZvaWQgMCYmKG8uc2hhZG93LnJhZGl1cz10LnNoYWRvdy5yYWRpdXMpLHQuc2hhZG93Lm1hcFNpemUhPT12b2lkIDAmJm8uc2hhZG93Lm1hcFNpemUuZnJvbUFycmF5KHQuc2hhZG93Lm1hcFNpemUpLHQuc2hhZG93LmNhbWVyYSE9PXZvaWQgMCYmKG8uc2hhZG93LmNhbWVyYT10aGlzLnBhcnNlT2JqZWN0KHQuc2hhZG93LmNhbWVyYSkpKSx0LnZpc2libGUhPT12b2lkIDAmJihvLnZpc2libGU9dC52aXNpYmxlKSx0LmZydXN0dW1DdWxsZWQhPT12b2lkIDAmJihvLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkKSx0LnJlbmRlck9yZGVyIT09dm9pZCAwJiYoby5yZW5kZXJPcmRlcj10LnJlbmRlck9yZGVyKSx0LnVzZXJEYXRhIT09dm9pZCAwJiYoby51c2VyRGF0YT10LnVzZXJEYXRhKSx0LmxheWVycyE9PXZvaWQgMCYmKG8ubGF5ZXJzLm1hc2s9dC5sYXllcnMpLHQuY2hpbGRyZW4hPT12b2lkIDApe2NvbnN0IGY9dC5jaGlsZHJlbjtmb3IobGV0IGQ9MDtkPGYubGVuZ3RoO2QrKylvLmFkZCh0aGlzLnBhcnNlT2JqZWN0KGZbZF0sZSxuLGkscykpfWlmKHQuYW5pbWF0aW9ucyE9PXZvaWQgMCl7Y29uc3QgZj10LmFuaW1hdGlvbnM7Zm9yKGxldCBkPTA7ZDxmLmxlbmd0aDtkKyspe2NvbnN0IHA9ZltkXTtvLmFuaW1hdGlvbnMucHVzaChzW3BdKX19aWYodC50eXBlPT09IkxPRCIpe3QuYXV0b1VwZGF0ZSE9PXZvaWQgMCYmKG8uYXV0b1VwZGF0ZT10LmF1dG9VcGRhdGUpO2NvbnN0IGY9dC5sZXZlbHM7Zm9yKGxldCBkPTA7ZDxmLmxlbmd0aDtkKyspe2NvbnN0IHA9ZltkXSx4PW8uZ2V0T2JqZWN0QnlQcm9wZXJ0eSgidXVpZCIscC5vYmplY3QpO3ghPT12b2lkIDAmJm8uYWRkTGV2ZWwoeCxwLmRpc3RhbmNlLHAuaHlzdGVyZXNpcyl9fXJldHVybiBvfWJpbmRTa2VsZXRvbnModCxlKXtPYmplY3Qua2V5cyhlKS5sZW5ndGghPT0wJiZ0LnRyYXZlcnNlKGZ1bmN0aW9uKG4pe2lmKG4uaXNTa2lubmVkTWVzaD09PSEwJiZuLnNrZWxldG9uIT09dm9pZCAwKXtjb25zdCBpPWVbbi5za2VsZXRvbl07aT09PXZvaWQgMD9jb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogTm8gc2tlbGV0b24gZm91bmQgd2l0aCBVVUlEOiIsbi5za2VsZXRvbik6bi5iaW5kKGksbi5iaW5kTWF0cml4KX19KX1iaW5kTGlnaHRUYXJnZXRzKHQpe3QudHJhdmVyc2UoZnVuY3Rpb24oZSl7aWYoZS5pc0RpcmVjdGlvbmFsTGlnaHR8fGUuaXNTcG90TGlnaHQpe2NvbnN0IG49ZS50YXJnZXQsaT10LmdldE9iamVjdEJ5UHJvcGVydHkoInV1aWQiLG4pO2khPT12b2lkIDA/ZS50YXJnZXQ9aTplLnRhcmdldD1uZXcgc2V9fSl9fWNvbnN0IGZiPXtVVk1hcHBpbmc6ZmMsQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOlBpLEN1YmVSZWZyYWN0aW9uTWFwcGluZzpzcixFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzpJbyxFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzpQbyxDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzpic30sejA9e1JlcGVhdFdyYXBwaW5nOkxvLENsYW1wVG9FZGdlV3JhcHBpbmc6R24sTWlycm9yZWRSZXBlYXRXcmFwcGluZzpEb30sazA9e05lYXJlc3RGaWx0ZXI6WGUsTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI6WGgsTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcjp3cyxMaW5lYXJGaWx0ZXI6emUsTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcjpVbyxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI6X2l9O2NsYXNzIGRiIGV4dGVuZHMgU257Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5pc0ltYWdlQml0bWFwTG9hZGVyPSEwLHR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcD09InVuZGVmaW5lZCImJmNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGNyZWF0ZUltYWdlQml0bWFwKCkgbm90IHN1cHBvcnRlZC4iKSx0eXBlb2YgZmV0Y2g9PSJ1bmRlZmluZWQiJiZjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBmZXRjaCgpIG5vdCBzdXBwb3J0ZWQuIiksdGhpcy5vcHRpb25zPXtwcmVtdWx0aXBseUFscGhhOiJub25lIn19c2V0T3B0aW9ucyh0KXtyZXR1cm4gdGhpcy5vcHRpb25zPXQsdGhpc31sb2FkKHQsZSxuLGkpe3Q9PT12b2lkIDAmJih0PSIiKSx0aGlzLnBhdGghPT12b2lkIDAmJih0PXRoaXMucGF0aCt0KSx0PXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKHQpO2NvbnN0IHM9dGhpcyxvPUdpLmdldCh0KTtpZihvIT09dm9pZCAwKXtpZihzLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLG8udGhlbil7by50aGVuKGw9PntlJiZlKGwpLHMubWFuYWdlci5pdGVtRW5kKHQpfSkuY2F0Y2gobD0+e2kmJmkobCl9KTtyZXR1cm59cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlJiZlKG8pLHMubWFuYWdlci5pdGVtRW5kKHQpfSwwKSxvfWNvbnN0IGE9e307YS5jcmVkZW50aWFscz10aGlzLmNyb3NzT3JpZ2luPT09ImFub255bW91cyI/InNhbWUtb3JpZ2luIjoiaW5jbHVkZSIsYS5oZWFkZXJzPXRoaXMucmVxdWVzdEhlYWRlcjtjb25zdCBjPWZldGNoKHQsYSkudGhlbihmdW5jdGlvbihsKXtyZXR1cm4gbC5ibG9iKCl9KS50aGVuKGZ1bmN0aW9uKGwpe3JldHVybiBjcmVhdGVJbWFnZUJpdG1hcChsLE9iamVjdC5hc3NpZ24ocy5vcHRpb25zLHtjb2xvclNwYWNlQ29udmVyc2lvbjoibm9uZSJ9KSl9KS50aGVuKGZ1bmN0aW9uKGwpe3JldHVybiBHaS5hZGQodCxsKSxlJiZlKGwpLHMubWFuYWdlci5pdGVtRW5kKHQpLGx9KS5jYXRjaChmdW5jdGlvbihsKXtpJiZpKGwpLEdpLnJlbW92ZSh0KSxzLm1hbmFnZXIuaXRlbUVycm9yKHQpLHMubWFuYWdlci5pdGVtRW5kKHQpfSk7R2kuYWRkKHQsYykscy5tYW5hZ2VyLml0ZW1TdGFydCh0KX19bGV0IG91O2NsYXNzIGFke3N0YXRpYyBnZXRDb250ZXh0KCl7cmV0dXJuIG91PT09dm9pZCAwJiYob3U9bmV3KHdpbmRvdy5BdWRpb0NvbnRleHR8fHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQpKSxvdX1zdGF0aWMgc2V0Q29udGV4dCh0KXtvdT10fX1jbGFzcyBwYiBleHRlbmRzIFNue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4saSl7Y29uc3Qgcz10aGlzLG89bmV3IFdpKHRoaXMubWFuYWdlcik7by5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIiksby5zZXRQYXRoKHRoaXMucGF0aCksby5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksby5zZXRXaXRoQ3JlZGVudGlhbHModGhpcy53aXRoQ3JlZGVudGlhbHMpLG8ubG9hZCh0LGZ1bmN0aW9uKGMpe3RyeXtjb25zdCBsPWMuc2xpY2UoMCk7YWQuZ2V0Q29udGV4dCgpLmRlY29kZUF1ZGlvRGF0YShsLGZ1bmN0aW9uKGgpe2UoaCl9KS5jYXRjaChhKX1jYXRjaChsKXthKGwpfX0sbixpKTtmdW5jdGlvbiBhKGMpe2k/aShjKTpjb25zb2xlLmVycm9yKGMpLHMubWFuYWdlci5pdGVtRXJyb3IodCl9fX1jb25zdCBWMD1uZXcgQ3QsRzA9bmV3IEN0LFpyPW5ldyBDdDtjbGFzcyBtYntjb25zdHJ1Y3Rvcigpe3RoaXMudHlwZT0iU3RlcmVvQ2FtZXJhIix0aGlzLmFzcGVjdD0xLHRoaXMuZXllU2VwPS4wNjQsdGhpcy5jYW1lcmFMPW5ldyAkZSx0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSgxKSx0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmNhbWVyYVI9bmV3ICRlLHRoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKDIpLHRoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuX2NhY2hlPXtmb2N1czpudWxsLGZvdjpudWxsLGFzcGVjdDpudWxsLG5lYXI6bnVsbCxmYXI6bnVsbCx6b29tOm51bGwsZXllU2VwOm51bGx9fXVwZGF0ZSh0KXtjb25zdCBlPXRoaXMuX2NhY2hlO2lmKGUuZm9jdXMhPT10LmZvY3VzfHxlLmZvdiE9PXQuZm92fHxlLmFzcGVjdCE9PXQuYXNwZWN0KnRoaXMuYXNwZWN0fHxlLm5lYXIhPT10Lm5lYXJ8fGUuZmFyIT09dC5mYXJ8fGUuem9vbSE9PXQuem9vbXx8ZS5leWVTZXAhPT10aGlzLmV5ZVNlcCl7ZS5mb2N1cz10LmZvY3VzLGUuZm92PXQuZm92LGUuYXNwZWN0PXQuYXNwZWN0KnRoaXMuYXNwZWN0LGUubmVhcj10Lm5lYXIsZS5mYXI9dC5mYXIsZS56b29tPXQuem9vbSxlLmV5ZVNlcD10aGlzLmV5ZVNlcCxaci5jb3B5KHQucHJvamVjdGlvbk1hdHJpeCk7Y29uc3QgaT1lLmV5ZVNlcC8yLHM9aSplLm5lYXIvZS5mb2N1cyxvPWUubmVhcipNYXRoLnRhbihOciplLmZvdiouNSkvZS56b29tO2xldCBhLGM7RzAuZWxlbWVudHNbMTJdPS1pLFYwLmVsZW1lbnRzWzEyXT1pLGE9LW8qZS5hc3BlY3QrcyxjPW8qZS5hc3BlY3Qrcyxaci5lbGVtZW50c1swXT0yKmUubmVhci8oYy1hKSxaci5lbGVtZW50c1s4XT0oYythKS8oYy1hKSx0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KFpyKSxhPS1vKmUuYXNwZWN0LXMsYz1vKmUuYXNwZWN0LXMsWnIuZWxlbWVudHNbMF09MiplLm5lYXIvKGMtYSksWnIuZWxlbWVudHNbOF09KGMrYSkvKGMtYSksdGhpcy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weShacil9dGhpcy5jYW1lcmFMLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCkubXVsdGlwbHkoRzApLHRoaXMuY2FtZXJhUi5tYXRyaXhXb3JsZC5jb3B5KHQubWF0cml4V29ybGQpLm11bHRpcGx5KFYwKX19Y2xhc3MgSDAgZXh0ZW5kcyAkZXtjb25zdHJ1Y3Rvcih0PVtdKXtzdXBlcigpLHRoaXMuaXNBcnJheUNhbWVyYT0hMCx0aGlzLmlzTXVsdGlWaWV3Q2FtZXJhPSExLHRoaXMuY2FtZXJhcz10fX1jbGFzcyBXMHtjb25zdHJ1Y3Rvcih0PSEwKXt0aGlzLmF1dG9TdGFydD10LHRoaXMuc3RhcnRUaW1lPTAsdGhpcy5vbGRUaW1lPTAsdGhpcy5lbGFwc2VkVGltZT0wLHRoaXMucnVubmluZz0hMX1zdGFydCgpe3RoaXMuc3RhcnRUaW1lPVgwKCksdGhpcy5vbGRUaW1lPXRoaXMuc3RhcnRUaW1lLHRoaXMuZWxhcHNlZFRpbWU9MCx0aGlzLnJ1bm5pbmc9ITB9c3RvcCgpe3RoaXMuZ2V0RWxhcHNlZFRpbWUoKSx0aGlzLnJ1bm5pbmc9ITEsdGhpcy5hdXRvU3RhcnQ9ITF9Z2V0RWxhcHNlZFRpbWUoKXtyZXR1cm4gdGhpcy5nZXREZWx0YSgpLHRoaXMuZWxhcHNlZFRpbWV9Z2V0RGVsdGEoKXtsZXQgdD0wO2lmKHRoaXMuYXV0b1N0YXJ0JiYhdGhpcy5ydW5uaW5nKXJldHVybiB0aGlzLnN0YXJ0KCksMDtpZih0aGlzLnJ1bm5pbmcpe2NvbnN0IGU9WDAoKTt0PShlLXRoaXMub2xkVGltZSkvMWUzLHRoaXMub2xkVGltZT1lLHRoaXMuZWxhcHNlZFRpbWUrPXR9cmV0dXJuIHR9fWZ1bmN0aW9uIFgwKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfWNvbnN0IEpyPW5ldyBJLCQwPW5ldyB5bixnYj1uZXcgSSxLcj1uZXcgSTtjbGFzcyB4YiBleHRlbmRzIHNle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkF1ZGlvTGlzdGVuZXIiLHRoaXMuY29udGV4dD1hZC5nZXRDb250ZXh0KCksdGhpcy5nYWluPXRoaXMuY29udGV4dC5jcmVhdGVHYWluKCksdGhpcy5nYWluLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmZpbHRlcj1udWxsLHRoaXMudGltZURlbHRhPTAsdGhpcy5fY2xvY2s9bmV3IFcwfWdldElucHV0KCl7cmV0dXJuIHRoaXMuZ2Fpbn1yZW1vdmVGaWx0ZXIoKXtyZXR1cm4gdGhpcy5maWx0ZXIhPT1udWxsJiYodGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPW51bGwpLHRoaXN9Z2V0RmlsdGVyKCl7cmV0dXJuIHRoaXMuZmlsdGVyfXNldEZpbHRlcih0KXtyZXR1cm4gdGhpcy5maWx0ZXIhPT1udWxsPyh0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pKTp0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPXQsdGhpcy5nYWluLmNvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzfWdldE1hc3RlclZvbHVtZSgpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX1zZXRNYXN0ZXJWb2x1bWUodCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSh0LHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9dXBkYXRlTWF0cml4V29ybGQodCl7c3VwZXIudXBkYXRlTWF0cml4V29ybGQodCk7Y29uc3QgZT10aGlzLmNvbnRleHQubGlzdGVuZXIsbj10aGlzLnVwO2lmKHRoaXMudGltZURlbHRhPXRoaXMuX2Nsb2NrLmdldERlbHRhKCksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoSnIsJDAsZ2IpLEtyLnNldCgwLDAsLTEpLmFwcGx5UXVhdGVybmlvbigkMCksZS5wb3NpdGlvblgpe2NvbnN0IGk9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3RoaXMudGltZURlbHRhO2UucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKEpyLngsaSksZS5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoSnIueSxpKSxlLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShKci56LGkpLGUuZm9yd2FyZFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoS3IueCxpKSxlLmZvcndhcmRZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKEtyLnksaSksZS5mb3J3YXJkWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShLci56LGkpLGUudXBYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG4ueCxpKSxlLnVwWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShuLnksaSksZS51cFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobi56LGkpfWVsc2UgZS5zZXRQb3NpdGlvbihKci54LEpyLnksSnIueiksZS5zZXRPcmllbnRhdGlvbihLci54LEtyLnksS3IueixuLngsbi55LG4ueil9fWNsYXNzIHEwIGV4dGVuZHMgc2V7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IkF1ZGlvIix0aGlzLmxpc3RlbmVyPXQsdGhpcy5jb250ZXh0PXQuY29udGV4dCx0aGlzLmdhaW49dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKSx0aGlzLmdhaW4uY29ubmVjdCh0LmdldElucHV0KCkpLHRoaXMuYXV0b3BsYXk9ITEsdGhpcy5idWZmZXI9bnVsbCx0aGlzLmRldHVuZT0wLHRoaXMubG9vcD0hMSx0aGlzLmxvb3BTdGFydD0wLHRoaXMubG9vcEVuZD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5kdXJhdGlvbj12b2lkIDAsdGhpcy5wbGF5YmFja1JhdGU9MSx0aGlzLmlzUGxheWluZz0hMSx0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMCx0aGlzLnNvdXJjZT1udWxsLHRoaXMuc291cmNlVHlwZT0iZW1wdHkiLHRoaXMuX3N0YXJ0ZWRBdD0wLHRoaXMuX3Byb2dyZXNzPTAsdGhpcy5fY29ubmVjdGVkPSExLHRoaXMuZmlsdGVycz1bXX1nZXRPdXRwdXQoKXtyZXR1cm4gdGhpcy5nYWlufXNldE5vZGVTb3VyY2UodCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSExLHRoaXMuc291cmNlVHlwZT0iYXVkaW9Ob2RlIix0aGlzLnNvdXJjZT10LHRoaXMuY29ubmVjdCgpLHRoaXN9c2V0TWVkaWFFbGVtZW50U291cmNlKHQpe3JldHVybiB0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMSx0aGlzLnNvdXJjZVR5cGU9Im1lZGlhTm9kZSIsdGhpcy5zb3VyY2U9dGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhRWxlbWVudFNvdXJjZSh0KSx0aGlzLmNvbm5lY3QoKSx0aGlzfXNldE1lZGlhU3RyZWFtU291cmNlKHQpe3JldHVybiB0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMSx0aGlzLnNvdXJjZVR5cGU9Im1lZGlhU3RyZWFtTm9kZSIsdGhpcy5zb3VyY2U9dGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKHQpLHRoaXMuY29ubmVjdCgpLHRoaXN9c2V0QnVmZmVyKHQpe3JldHVybiB0aGlzLmJ1ZmZlcj10LHRoaXMuc291cmNlVHlwZT0iYnVmZmVyIix0aGlzLmF1dG9wbGF5JiZ0aGlzLnBsYXkoKSx0aGlzfXBsYXkodD0wKXtpZih0aGlzLmlzUGxheWluZz09PSEwKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiBBdWRpbyBpcyBhbHJlYWR5IHBsYXlpbmcuIik7cmV0dXJufWlmKHRoaXMuaGFzUGxheWJhY2tDb250cm9sPT09ITEpe2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7cmV0dXJufXRoaXMuX3N0YXJ0ZWRBdD10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdDtjb25zdCBlPXRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtyZXR1cm4gZS5idWZmZXI9dGhpcy5idWZmZXIsZS5sb29wPXRoaXMubG9vcCxlLmxvb3BTdGFydD10aGlzLmxvb3BTdGFydCxlLmxvb3BFbmQ9dGhpcy5sb29wRW5kLGUub25lbmRlZD10aGlzLm9uRW5kZWQuYmluZCh0aGlzKSxlLnN0YXJ0KHRoaXMuX3N0YXJ0ZWRBdCx0aGlzLl9wcm9ncmVzcyt0aGlzLm9mZnNldCx0aGlzLmR1cmF0aW9uKSx0aGlzLmlzUGxheWluZz0hMCx0aGlzLnNvdXJjZT1lLHRoaXMuc2V0RGV0dW5lKHRoaXMuZGV0dW5lKSx0aGlzLnNldFBsYXliYWNrUmF0ZSh0aGlzLnBsYXliYWNrUmF0ZSksdGhpcy5jb25uZWN0KCl9cGF1c2UoKXtpZih0aGlzLmhhc1BsYXliYWNrQ29udHJvbD09PSExKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO3JldHVybn1yZXR1cm4gdGhpcy5pc1BsYXlpbmc9PT0hMCYmKHRoaXMuX3Byb2dyZXNzKz1NYXRoLm1heCh0aGlzLmNvbnRleHQuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRlZEF0LDApKnRoaXMucGxheWJhY2tSYXRlLHRoaXMubG9vcD09PSEwJiYodGhpcy5fcHJvZ3Jlc3M9dGhpcy5fcHJvZ3Jlc3MlKHRoaXMuZHVyYXRpb258fHRoaXMuYnVmZmVyLmR1cmF0aW9uKSksdGhpcy5zb3VyY2Uuc3RvcCgpLHRoaXMuc291cmNlLm9uZW5kZWQ9bnVsbCx0aGlzLmlzUGxheWluZz0hMSksdGhpc31zdG9wKHQ9MCl7aWYodGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9PT0hMSl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtyZXR1cm59cmV0dXJuIHRoaXMuX3Byb2dyZXNzPTAsdGhpcy5zb3VyY2UhPT1udWxsJiYodGhpcy5zb3VyY2Uuc3RvcCh0aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsKSx0aGlzLmlzUGxheWluZz0hMSx0aGlzfWNvbm5lY3QoKXtpZih0aGlzLmZpbHRlcnMubGVuZ3RoPjApe3RoaXMuc291cmNlLmNvbm5lY3QodGhpcy5maWx0ZXJzWzBdKTtmb3IobGV0IHQ9MSxlPXRoaXMuZmlsdGVycy5sZW5ndGg7dDxlO3QrKyl0aGlzLmZpbHRlcnNbdC0xXS5jb25uZWN0KHRoaXMuZmlsdGVyc1t0XSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmNvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXMuX2Nvbm5lY3RlZD0hMCx0aGlzfWRpc2Nvbm5lY3QoKXtpZih0aGlzLl9jb25uZWN0ZWQhPT0hMSl7aWYodGhpcy5maWx0ZXJzLmxlbmd0aD4wKXt0aGlzLnNvdXJjZS5kaXNjb25uZWN0KHRoaXMuZmlsdGVyc1swXSk7Zm9yKGxldCB0PTEsZT10aGlzLmZpbHRlcnMubGVuZ3RoO3Q8ZTt0KyspdGhpcy5maWx0ZXJzW3QtMV0uZGlzY29ubmVjdCh0aGlzLmZpbHRlcnNbdF0pO3RoaXMuZmlsdGVyc1t0aGlzLmZpbHRlcnMubGVuZ3RoLTFdLmRpc2Nvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSl9ZWxzZSB0aGlzLnNvdXJjZS5kaXNjb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpO3JldHVybiB0aGlzLl9jb25uZWN0ZWQ9ITEsdGhpc319Z2V0RmlsdGVycygpe3JldHVybiB0aGlzLmZpbHRlcnN9c2V0RmlsdGVycyh0KXtyZXR1cm4gdHx8KHQ9W10pLHRoaXMuX2Nvbm5lY3RlZD09PSEwPyh0aGlzLmRpc2Nvbm5lY3QoKSx0aGlzLmZpbHRlcnM9dC5zbGljZSgpLHRoaXMuY29ubmVjdCgpKTp0aGlzLmZpbHRlcnM9dC5zbGljZSgpLHRoaXN9c2V0RGV0dW5lKHQpe3JldHVybiB0aGlzLmRldHVuZT10LHRoaXMuaXNQbGF5aW5nPT09ITAmJnRoaXMuc291cmNlLmRldHVuZSE9PXZvaWQgMCYmdGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSh0aGlzLmRldHVuZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfWdldERldHVuZSgpe3JldHVybiB0aGlzLmRldHVuZX1nZXRGaWx0ZXIoKXtyZXR1cm4gdGhpcy5nZXRGaWx0ZXJzKClbMF19c2V0RmlsdGVyKHQpe3JldHVybiB0aGlzLnNldEZpbHRlcnModD9bdF06W10pfXNldFBsYXliYWNrUmF0ZSh0KXtpZih0aGlzLmhhc1BsYXliYWNrQ29udHJvbD09PSExKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO3JldHVybn1yZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU9dCx0aGlzLmlzUGxheWluZz09PSEwJiZ0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMucGxheWJhY2tSYXRlLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9Z2V0UGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMucGxheWJhY2tSYXRlfW9uRW5kZWQoKXt0aGlzLmlzUGxheWluZz0hMSx0aGlzLl9wcm9ncmVzcz0wfWdldExvb3AoKXtyZXR1cm4gdGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9PT0hMT8oY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKSwhMSk6dGhpcy5sb29wfXNldExvb3AodCl7aWYodGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9PT0hMSl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtyZXR1cm59cmV0dXJuIHRoaXMubG9vcD10LHRoaXMuaXNQbGF5aW5nPT09ITAmJih0aGlzLnNvdXJjZS5sb29wPXRoaXMubG9vcCksdGhpc31zZXRMb29wU3RhcnQodCl7cmV0dXJuIHRoaXMubG9vcFN0YXJ0PXQsdGhpc31zZXRMb29wRW5kKHQpe3JldHVybiB0aGlzLmxvb3BFbmQ9dCx0aGlzfWdldFZvbHVtZSgpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX1zZXRWb2x1bWUodCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSh0LHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdC5zb3VyY2VUeXBlIT09ImJ1ZmZlciI/KGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IEF1ZGlvIHNvdXJjZSB0eXBlIGNhbm5vdCBiZSBjb3BpZWQuIiksdGhpcyk6KHRoaXMuYXV0b3BsYXk9dC5hdXRvcGxheSx0aGlzLmJ1ZmZlcj10LmJ1ZmZlcix0aGlzLmRldHVuZT10LmRldHVuZSx0aGlzLmxvb3A9dC5sb29wLHRoaXMubG9vcFN0YXJ0PXQubG9vcFN0YXJ0LHRoaXMubG9vcEVuZD10Lmxvb3BFbmQsdGhpcy5vZmZzZXQ9dC5vZmZzZXQsdGhpcy5kdXJhdGlvbj10LmR1cmF0aW9uLHRoaXMucGxheWJhY2tSYXRlPXQucGxheWJhY2tSYXRlLHRoaXMuaGFzUGxheWJhY2tDb250cm9sPXQuaGFzUGxheWJhY2tDb250cm9sLHRoaXMuc291cmNlVHlwZT10LnNvdXJjZVR5cGUsdGhpcy5maWx0ZXJzPXQuZmlsdGVycy5zbGljZSgpLHRoaXMpfWNsb25lKHQpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmxpc3RlbmVyKS5jb3B5KHRoaXMsdCl9fWNvbnN0IGpyPW5ldyBJLFkwPW5ldyB5bixfYj1uZXcgSSxRcj1uZXcgSTtjbGFzcyB5YiBleHRlbmRzIHEwe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMucGFubmVyPXRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKSx0aGlzLnBhbm5lci5wYW5uaW5nTW9kZWw9IkhSVEYiLHRoaXMucGFubmVyLmNvbm5lY3QodGhpcy5nYWluKX1jb25uZWN0KCl7cmV0dXJuIHN1cGVyLmNvbm5lY3QoKSx0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2FpbiksdGhpc31kaXNjb25uZWN0KCl7cmV0dXJuIHN1cGVyLmRpc2Nvbm5lY3QoKSx0aGlzLnBhbm5lci5kaXNjb25uZWN0KHRoaXMuZ2FpbiksdGhpc31nZXRPdXRwdXQoKXtyZXR1cm4gdGhpcy5wYW5uZXJ9Z2V0UmVmRGlzdGFuY2UoKXtyZXR1cm4gdGhpcy5wYW5uZXIucmVmRGlzdGFuY2V9c2V0UmVmRGlzdGFuY2UodCl7cmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlPXQsdGhpc31nZXRSb2xsb2ZmRmFjdG9yKCl7cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3J9c2V0Um9sbG9mZkZhY3Rvcih0KXtyZXR1cm4gdGhpcy5wYW5uZXIucm9sbG9mZkZhY3Rvcj10LHRoaXN9Z2V0RGlzdGFuY2VNb2RlbCgpe3JldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsfXNldERpc3RhbmNlTW9kZWwodCl7cmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWw9dCx0aGlzfWdldE1heERpc3RhbmNlKCl7cmV0dXJuIHRoaXMucGFubmVyLm1heERpc3RhbmNlfXNldE1heERpc3RhbmNlKHQpe3JldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZT10LHRoaXN9c2V0RGlyZWN0aW9uYWxDb25lKHQsZSxuKXtyZXR1cm4gdGhpcy5wYW5uZXIuY29uZUlubmVyQW5nbGU9dCx0aGlzLnBhbm5lci5jb25lT3V0ZXJBbmdsZT1lLHRoaXMucGFubmVyLmNvbmVPdXRlckdhaW49bix0aGlzfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe2lmKHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpLHRoaXMuaGFzUGxheWJhY2tDb250cm9sPT09ITAmJnRoaXMuaXNQbGF5aW5nPT09ITEpcmV0dXJuO3RoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKGpyLFkwLF9iKSxRci5zZXQoMCwwLDEpLmFwcGx5UXVhdGVybmlvbihZMCk7Y29uc3QgZT10aGlzLnBhbm5lcjtpZihlLnBvc2l0aW9uWCl7Y29uc3Qgbj10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy5saXN0ZW5lci50aW1lRGVsdGE7ZS5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoanIueCxuKSxlLnBvc2l0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShqci55LG4pLGUucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGpyLnosbiksZS5vcmllbnRhdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoUXIueCxuKSxlLm9yaWVudGF0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShRci55LG4pLGUub3JpZW50YXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKFFyLnosbil9ZWxzZSBlLnNldFBvc2l0aW9uKGpyLngsanIueSxqci56KSxlLnNldE9yaWVudGF0aW9uKFFyLngsUXIueSxRci56KX19Y2xhc3MgdmJ7Y29uc3RydWN0b3IodCxlPTIwNDgpe3RoaXMuYW5hbHlzZXI9dC5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCksdGhpcy5hbmFseXNlci5mZnRTaXplPWUsdGhpcy5kYXRhPW5ldyBVaW50OEFycmF5KHRoaXMuYW5hbHlzZXIuZnJlcXVlbmN5QmluQ291bnQpLHQuZ2V0T3V0cHV0KCkuY29ubmVjdCh0aGlzLmFuYWx5c2VyKX1nZXRGcmVxdWVuY3lEYXRhKCl7cmV0dXJuIHRoaXMuYW5hbHlzZXIuZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEodGhpcy5kYXRhKSx0aGlzLmRhdGF9Z2V0QXZlcmFnZUZyZXF1ZW5jeSgpe2xldCB0PTA7Y29uc3QgZT10aGlzLmdldEZyZXF1ZW5jeURhdGEoKTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0Kz1lW25dO3JldHVybiB0L2UubGVuZ3RofX1jbGFzcyBaMHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5iaW5kaW5nPXQsdGhpcy52YWx1ZVNpemU9bjtsZXQgaSxzLG87c3dpdGNoKGUpe2Nhc2UicXVhdGVybmlvbiI6aT10aGlzLl9zbGVycCxzPXRoaXMuX3NsZXJwQWRkaXRpdmUsbz10aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5UXVhdGVybmlvbix0aGlzLmJ1ZmZlcj1uZXcgRmxvYXQ2NEFycmF5KG4qNiksdGhpcy5fd29ya0luZGV4PTU7YnJlYWs7Y2FzZSJzdHJpbmciOmNhc2UiYm9vbCI6aT10aGlzLl9zZWxlY3Qscz10aGlzLl9zZWxlY3Qsbz10aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5T3RoZXIsdGhpcy5idWZmZXI9bmV3IEFycmF5KG4qNSk7YnJlYWs7ZGVmYXVsdDppPXRoaXMuX2xlcnAscz10aGlzLl9sZXJwQWRkaXRpdmUsbz10aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYyx0aGlzLmJ1ZmZlcj1uZXcgRmxvYXQ2NEFycmF5KG4qNSl9dGhpcy5fbWl4QnVmZmVyUmVnaW9uPWksdGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmU9cyx0aGlzLl9zZXRJZGVudGl0eT1vLHRoaXMuX29yaWdJbmRleD0zLHRoaXMuX2FkZEluZGV4PTQsdGhpcy5jdW11bGF0aXZlV2VpZ2h0PTAsdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmU9MCx0aGlzLnVzZUNvdW50PTAsdGhpcy5yZWZlcmVuY2VDb3VudD0wfWFjY3VtdWxhdGUodCxlKXtjb25zdCBuPXRoaXMuYnVmZmVyLGk9dGhpcy52YWx1ZVNpemUscz10KmkraTtsZXQgbz10aGlzLmN1bXVsYXRpdmVXZWlnaHQ7aWYobz09PTApe2ZvcihsZXQgYT0wO2EhPT1pOysrYSluW3MrYV09blthXTtvPWV9ZWxzZXtvKz1lO2NvbnN0IGE9ZS9vO3RoaXMuX21peEJ1ZmZlclJlZ2lvbihuLHMsMCxhLGkpfXRoaXMuY3VtdWxhdGl2ZVdlaWdodD1vfWFjY3VtdWxhdGVBZGRpdGl2ZSh0KXtjb25zdCBlPXRoaXMuYnVmZmVyLG49dGhpcy52YWx1ZVNpemUsaT1uKnRoaXMuX2FkZEluZGV4O3RoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPT09MCYmdGhpcy5fc2V0SWRlbnRpdHkoKSx0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZShlLGksMCx0LG4pLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlKz10fWFwcGx5KHQpe2NvbnN0IGU9dGhpcy52YWx1ZVNpemUsbj10aGlzLmJ1ZmZlcixpPXQqZStlLHM9dGhpcy5jdW11bGF0aXZlV2VpZ2h0LG89dGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUsYT10aGlzLmJpbmRpbmc7aWYodGhpcy5jdW11bGF0aXZlV2VpZ2h0PTAsdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmU9MCxzPDEpe2NvbnN0IGM9ZSp0aGlzLl9vcmlnSW5kZXg7dGhpcy5fbWl4QnVmZmVyUmVnaW9uKG4saSxjLDEtcyxlKX1vPjAmJnRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlKG4saSx0aGlzLl9hZGRJbmRleCplLDEsZSk7Zm9yKGxldCBjPWUsbD1lK2U7YyE9PWw7KytjKWlmKG5bY10hPT1uW2MrZV0pe2Euc2V0VmFsdWUobixpKTticmVha319c2F2ZU9yaWdpbmFsU3RhdGUoKXtjb25zdCB0PXRoaXMuYmluZGluZyxlPXRoaXMuYnVmZmVyLG49dGhpcy52YWx1ZVNpemUsaT1uKnRoaXMuX29yaWdJbmRleDt0LmdldFZhbHVlKGUsaSk7Zm9yKGxldCBzPW4sbz1pO3MhPT1vOysrcyllW3NdPWVbaStzJW5dO3RoaXMuX3NldElkZW50aXR5KCksdGhpcy5jdW11bGF0aXZlV2VpZ2h0PTAsdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmU9MH1yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpe2NvbnN0IHQ9dGhpcy52YWx1ZVNpemUqMzt0aGlzLmJpbmRpbmcuc2V0VmFsdWUodGhpcy5idWZmZXIsdCl9X3NldEFkZGl0aXZlSWRlbnRpdHlOdW1lcmljKCl7Y29uc3QgdD10aGlzLl9hZGRJbmRleCp0aGlzLnZhbHVlU2l6ZSxlPXQrdGhpcy52YWx1ZVNpemU7Zm9yKGxldCBuPXQ7bjxlO24rKyl0aGlzLmJ1ZmZlcltuXT0wfV9zZXRBZGRpdGl2ZUlkZW50aXR5UXVhdGVybmlvbigpe3RoaXMuX3NldEFkZGl0aXZlSWRlbnRpdHlOdW1lcmljKCksdGhpcy5idWZmZXJbdGhpcy5fYWRkSW5kZXgqdGhpcy52YWx1ZVNpemUrM109MX1fc2V0QWRkaXRpdmVJZGVudGl0eU90aGVyKCl7Y29uc3QgdD10aGlzLl9vcmlnSW5kZXgqdGhpcy52YWx1ZVNpemUsZT10aGlzLl9hZGRJbmRleCp0aGlzLnZhbHVlU2l6ZTtmb3IobGV0IG49MDtuPHRoaXMudmFsdWVTaXplO24rKyl0aGlzLmJ1ZmZlcltlK25dPXRoaXMuYnVmZmVyW3Qrbl19X3NlbGVjdCh0LGUsbixpLHMpe2lmKGk+PS41KWZvcihsZXQgbz0wO28hPT1zOysrbyl0W2Urb109dFtuK29dfV9zbGVycCh0LGUsbixpKXt5bi5zbGVycEZsYXQodCxlLHQsZSx0LG4saSl9X3NsZXJwQWRkaXRpdmUodCxlLG4saSxzKXtjb25zdCBvPXRoaXMuX3dvcmtJbmRleCpzO3luLm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KHQsbyx0LGUsdCxuKSx5bi5zbGVycEZsYXQodCxlLHQsZSx0LG8saSl9X2xlcnAodCxlLG4saSxzKXtjb25zdCBvPTEtaTtmb3IobGV0IGE9MDthIT09czsrK2Epe2NvbnN0IGM9ZSthO3RbY109dFtjXSpvK3RbbithXSppfX1fbGVycEFkZGl0aXZlKHQsZSxuLGkscyl7Zm9yKGxldCBvPTA7byE9PXM7KytvKXtjb25zdCBhPWUrbzt0W2FdPXRbYV0rdFtuK29dKml9fX1jb25zdCBjZD0iXFxbXFxdXFwuOlxcLyIsTWI9bmV3IFJlZ0V4cCgiWyIrY2QrIl0iLCJnIiksbGQ9IlteIitjZCsiXSIsU2I9IlteIitjZC5yZXBsYWNlKCJcXC4iLCIiKSsiXSIsYmI9LygoPzpXQytbXC86XSkqKS8uc291cmNlLnJlcGxhY2UoIldDIixsZCksd2I9LyhXQ09EKyk/Ly5zb3VyY2UucmVwbGFjZSgiV0NPRCIsU2IpLEFiPS8oPzpcLihXQyspKD86XFsoLispXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLGxkKSxUYj0vXC4oV0MrKSg/OlxbKC4rKVxdKT8vLnNvdXJjZS5yZXBsYWNlKCJXQyIsbGQpLEViPW5ldyBSZWdFeHAoIl4iK2JiK3diK0FiK1RiKyIkIiksQ2I9WyJtYXRlcmlhbCIsIm1hdGVyaWFscyIsImJvbmVzIiwibWFwIl07Y2xhc3MgUmJ7Y29uc3RydWN0b3IodCxlLG4pe2NvbnN0IGk9bnx8b2UucGFyc2VUcmFja05hbWUoZSk7dGhpcy5fdGFyZ2V0R3JvdXA9dCx0aGlzLl9iaW5kaW5ncz10LnN1YnNjcmliZV8oZSxpKX1nZXRWYWx1ZSh0LGUpe3RoaXMuYmluZCgpO2NvbnN0IG49dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLGk9dGhpcy5fYmluZGluZ3Nbbl07aSE9PXZvaWQgMCYmaS5nZXRWYWx1ZSh0LGUpfXNldFZhbHVlKHQsZSl7Y29uc3Qgbj10aGlzLl9iaW5kaW5ncztmb3IobGV0IGk9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLHM9bi5sZW5ndGg7aSE9PXM7KytpKW5baV0uc2V0VmFsdWUodCxlKX1iaW5kKCl7Y29uc3QgdD10aGlzLl9iaW5kaW5ncztmb3IobGV0IGU9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLG49dC5sZW5ndGg7ZSE9PW47KytlKXRbZV0uYmluZCgpfXVuYmluZCgpe2NvbnN0IHQ9dGhpcy5fYmluZGluZ3M7Zm9yKGxldCBlPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxuPXQubGVuZ3RoO2UhPT1uOysrZSl0W2VdLnVuYmluZCgpfX1jbGFzcyBvZXtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5wYXRoPWUsdGhpcy5wYXJzZWRQYXRoPW58fG9lLnBhcnNlVHJhY2tOYW1lKGUpLHRoaXMubm9kZT1vZS5maW5kTm9kZSh0LHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSksdGhpcy5yb290Tm9kZT10LHRoaXMuZ2V0VmFsdWU9dGhpcy5fZ2V0VmFsdWVfdW5ib3VuZCx0aGlzLnNldFZhbHVlPXRoaXMuX3NldFZhbHVlX3VuYm91bmR9c3RhdGljIGNyZWF0ZSh0LGUsbil7cmV0dXJuIHQmJnQuaXNBbmltYXRpb25PYmplY3RHcm91cD9uZXcgb2UuQ29tcG9zaXRlKHQsZSxuKTpuZXcgb2UodCxlLG4pfXN0YXRpYyBzYW5pdGl6ZU5vZGVOYW1lKHQpe3JldHVybiB0LnJlcGxhY2UoL1xzL2csIl8iKS5yZXBsYWNlKE1iLCIiKX1zdGF0aWMgcGFyc2VUcmFja05hbWUodCl7Y29uc3QgZT1FYi5leGVjKHQpO2lmKGU9PT1udWxsKXRocm93IG5ldyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBDYW5ub3QgcGFyc2UgdHJhY2tOYW1lOiAiK3QpO2NvbnN0IG49e25vZGVOYW1lOmVbMl0sb2JqZWN0TmFtZTplWzNdLG9iamVjdEluZGV4OmVbNF0scHJvcGVydHlOYW1lOmVbNV0scHJvcGVydHlJbmRleDplWzZdfSxpPW4ubm9kZU5hbWUmJm4ubm9kZU5hbWUubGFzdEluZGV4T2YoIi4iKTtpZihpIT09dm9pZCAwJiZpIT09LTEpe2NvbnN0IHM9bi5ub2RlTmFtZS5zdWJzdHJpbmcoaSsxKTtDYi5pbmRleE9mKHMpIT09LTEmJihuLm5vZGVOYW1lPW4ubm9kZU5hbWUuc3Vic3RyaW5nKDAsaSksbi5vYmplY3ROYW1lPXMpfWlmKG4ucHJvcGVydHlOYW1lPT09bnVsbHx8bi5wcm9wZXJ0eU5hbWUubGVuZ3RoPT09MCl0aHJvdyBuZXcgRXJyb3IoIlByb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICIrdCk7cmV0dXJuIG59c3RhdGljIGZpbmROb2RlKHQsZSl7aWYoZT09PXZvaWQgMHx8ZT09PSIifHxlPT09Ii4ifHxlPT09LTF8fGU9PT10Lm5hbWV8fGU9PT10LnV1aWQpcmV0dXJuIHQ7aWYodC5za2VsZXRvbil7Y29uc3Qgbj10LnNrZWxldG9uLmdldEJvbmVCeU5hbWUoZSk7aWYobiE9PXZvaWQgMClyZXR1cm4gbn1pZih0LmNoaWxkcmVuKXtjb25zdCBuPWZ1bmN0aW9uKHMpe2ZvcihsZXQgbz0wO288cy5sZW5ndGg7bysrKXtjb25zdCBhPXNbb107aWYoYS5uYW1lPT09ZXx8YS51dWlkPT09ZSlyZXR1cm4gYTtjb25zdCBjPW4oYS5jaGlsZHJlbik7aWYoYylyZXR1cm4gY31yZXR1cm4gbnVsbH0saT1uKHQuY2hpbGRyZW4pO2lmKGkpcmV0dXJuIGl9cmV0dXJuIG51bGx9X2dldFZhbHVlX3VuYXZhaWxhYmxlKCl7fV9zZXRWYWx1ZV91bmF2YWlsYWJsZSgpe31fZ2V0VmFsdWVfZGlyZWN0KHQsZSl7dFtlXT10aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV19X2dldFZhbHVlX2FycmF5KHQsZSl7Y29uc3Qgbj10aGlzLnJlc29sdmVkUHJvcGVydHk7Zm9yKGxldCBpPTAscz1uLmxlbmd0aDtpIT09czsrK2kpdFtlKytdPW5baV19X2dldFZhbHVlX2FycmF5RWxlbWVudCh0LGUpe3RbZV09dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF19X2dldFZhbHVlX3RvQXJyYXkodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkudG9BcnJheSh0LGUpfV9zZXRWYWx1ZV9kaXJlY3QodCxlKXt0aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV09dFtlXX1fc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlKHQsZSl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPXRbZV0sdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2RpcmVjdF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKHQsZSl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPXRbZV0sdGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfYXJyYXkodCxlKXtjb25zdCBuPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtmb3IobGV0IGk9MCxzPW4ubGVuZ3RoO2khPT1zOysraSluW2ldPXRbZSsrXX1fc2V0VmFsdWVfYXJyYXlfc2V0TmVlZHNVcGRhdGUodCxlKXtjb25zdCBuPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtmb3IobGV0IGk9MCxzPW4ubGVuZ3RoO2khPT1zOysraSluW2ldPXRbZSsrXTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSh0LGUpe2NvbnN0IG49dGhpcy5yZXNvbHZlZFByb3BlcnR5O2ZvcihsZXQgaT0wLHM9bi5sZW5ndGg7aSE9PXM7KytpKW5baV09dFtlKytdO3RoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2FycmF5RWxlbWVudCh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPXRbZV19X3NldFZhbHVlX2FycmF5RWxlbWVudF9zZXROZWVkc1VwZGF0ZSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPXRbZV0sdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2FycmF5RWxlbWVudF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09dFtlXSx0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9mcm9tQXJyYXkodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KHQsZSl9X3NldFZhbHVlX2Zyb21BcnJheV9zZXROZWVkc1VwZGF0ZSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkodCxlKSx0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfZnJvbUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KHQsZSksdGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1fZ2V0VmFsdWVfdW5ib3VuZCh0LGUpe3RoaXMuYmluZCgpLHRoaXMuZ2V0VmFsdWUodCxlKX1fc2V0VmFsdWVfdW5ib3VuZCh0LGUpe3RoaXMuYmluZCgpLHRoaXMuc2V0VmFsdWUodCxlKX1iaW5kKCl7bGV0IHQ9dGhpcy5ub2RlO2NvbnN0IGU9dGhpcy5wYXJzZWRQYXRoLG49ZS5vYmplY3ROYW1lLGk9ZS5wcm9wZXJ0eU5hbWU7bGV0IHM9ZS5wcm9wZXJ0eUluZGV4O2lmKHR8fCh0PW9lLmZpbmROb2RlKHRoaXMucm9vdE5vZGUsZS5ub2RlTmFtZSksdGhpcy5ub2RlPXQpLHRoaXMuZ2V0VmFsdWU9dGhpcy5fZ2V0VmFsdWVfdW5hdmFpbGFibGUsdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZSwhdCl7Y29uc29sZS53YXJuKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IE5vIHRhcmdldCBub2RlIGZvdW5kIGZvciB0cmFjazogIit0aGlzLnBhdGgrIi4iKTtyZXR1cm59aWYobil7bGV0IGw9ZS5vYmplY3RJbmRleDtzd2l0Y2gobil7Y2FzZSJtYXRlcmlhbHMiOmlmKCF0Lm1hdGVyaWFsKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4iLHRoaXMpO3JldHVybn1pZighdC5tYXRlcmlhbC5tYXRlcmlhbHMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hdGVyaWFscyBhcyBub2RlLm1hdGVyaWFsIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbHMgYXJyYXkuIix0aGlzKTtyZXR1cm59dD10Lm1hdGVyaWFsLm1hdGVyaWFsczticmVhaztjYXNlImJvbmVzIjppZighdC5za2VsZXRvbil7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgc2tlbGV0b24uIix0aGlzKTtyZXR1cm59dD10LnNrZWxldG9uLmJvbmVzO2ZvcihsZXQgdT0wO3U8dC5sZW5ndGg7dSsrKWlmKHRbdV0ubmFtZT09PWwpe2w9dTticmVha31icmVhaztjYXNlIm1hcCI6aWYoIm1hcCJpbiB0KXt0PXQubWFwO2JyZWFrfWlmKCF0Lm1hdGVyaWFsKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4iLHRoaXMpO3JldHVybn1pZighdC5tYXRlcmlhbC5tYXApe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hcCBhcyBub2RlLm1hdGVyaWFsIGRvZXMgbm90IGhhdmUgYSBtYXAuIix0aGlzKTtyZXR1cm59dD10Lm1hdGVyaWFsLm1hcDticmVhaztkZWZhdWx0OmlmKHRbbl09PT12b2lkIDApe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG9iamVjdE5hbWUgb2Ygbm9kZSB1bmRlZmluZWQuIix0aGlzKTtyZXR1cm59dD10W25dfWlmKGwhPT12b2lkIDApe2lmKHRbbF09PT12b2lkIDApe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIGJpbmQgdG8gb2JqZWN0SW5kZXggb2Ygb2JqZWN0TmFtZSwgYnV0IGlzIHVuZGVmaW5lZC4iLHRoaXMsdCk7cmV0dXJufXQ9dFtsXX19Y29uc3Qgbz10W2ldO2lmKG89PT12b2lkIDApe2NvbnN0IGw9ZS5ub2RlTmFtZTtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgcHJvcGVydHkgZm9yIHRyYWNrOiAiK2wrIi4iK2krIiBidXQgaXQgd2Fzbid0IGZvdW5kLiIsdCk7cmV0dXJufWxldCBhPXRoaXMuVmVyc2lvbmluZy5Ob25lO3RoaXMudGFyZ2V0T2JqZWN0PXQsdC5pc01hdGVyaWFsPT09ITA/YT10aGlzLlZlcnNpb25pbmcuTmVlZHNVcGRhdGU6dC5pc09iamVjdDNEPT09ITAmJihhPXRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlKTtsZXQgYz10aGlzLkJpbmRpbmdUeXBlLkRpcmVjdDtpZihzIT09dm9pZCAwKXtpZihpPT09Im1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIpe2lmKCF0Lmdlb21ldHJ5KXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS4iLHRoaXMpO3JldHVybn1pZighdC5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy4iLHRoaXMpO3JldHVybn10Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtzXSE9PXZvaWQgMCYmKHM9dC5tb3JwaFRhcmdldERpY3Rpb25hcnlbc10pfWM9dGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQsdGhpcy5yZXNvbHZlZFByb3BlcnR5PW8sdGhpcy5wcm9wZXJ0eUluZGV4PXN9ZWxzZSBvLmZyb21BcnJheSE9PXZvaWQgMCYmby50b0FycmF5IT09dm9pZCAwPyhjPXRoaXMuQmluZGluZ1R5cGUuSGFzRnJvbVRvQXJyYXksdGhpcy5yZXNvbHZlZFByb3BlcnR5PW8pOkFycmF5LmlzQXJyYXkobyk/KGM9dGhpcy5CaW5kaW5nVHlwZS5FbnRpcmVBcnJheSx0aGlzLnJlc29sdmVkUHJvcGVydHk9byk6dGhpcy5wcm9wZXJ0eU5hbWU9aTt0aGlzLmdldFZhbHVlPXRoaXMuR2V0dGVyQnlCaW5kaW5nVHlwZVtjXSx0aGlzLnNldFZhbHVlPXRoaXMuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmdbY11bYV19dW5iaW5kKCl7dGhpcy5ub2RlPW51bGwsdGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmJvdW5kLHRoaXMuc2V0VmFsdWU9dGhpcy5fc2V0VmFsdWVfdW5ib3VuZH19b2UuQ29tcG9zaXRlPVJiLG9lLnByb3RvdHlwZS5CaW5kaW5nVHlwZT17RGlyZWN0OjAsRW50aXJlQXJyYXk6MSxBcnJheUVsZW1lbnQ6MixIYXNGcm9tVG9BcnJheTozfSxvZS5wcm90b3R5cGUuVmVyc2lvbmluZz17Tm9uZTowLE5lZWRzVXBkYXRlOjEsTWF0cml4V29ybGROZWVkc1VwZGF0ZToyfSxvZS5wcm90b3R5cGUuR2V0dGVyQnlCaW5kaW5nVHlwZT1bb2UucHJvdG90eXBlLl9nZXRWYWx1ZV9kaXJlY3Qsb2UucHJvdG90eXBlLl9nZXRWYWx1ZV9hcnJheSxvZS5wcm90b3R5cGUuX2dldFZhbHVlX2FycmF5RWxlbWVudCxvZS5wcm90b3R5cGUuX2dldFZhbHVlX3RvQXJyYXldLG9lLnByb3RvdHlwZS5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZz1bW29lLnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0LG9lLnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlLG9lLnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGVdLFtvZS5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5LG9lLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlfc2V0TmVlZHNVcGRhdGUsb2UucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlXSxbb2UucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnQsb2UucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUsb2UucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZV0sW29lLnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5LG9lLnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5X3NldE5lZWRzVXBkYXRlLG9lLnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGVdXTtjbGFzcyBJYntjb25zdHJ1Y3Rvcigpe3RoaXMuaXNBbmltYXRpb25PYmplY3RHcm91cD0hMCx0aGlzLnV1aWQ9TG4oKSx0aGlzLl9vYmplY3RzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksdGhpcy5uQ2FjaGVkT2JqZWN0c189MDtjb25zdCB0PXt9O3RoaXMuX2luZGljZXNCeVVVSUQ9dDtmb3IobGV0IG49MCxpPWFyZ3VtZW50cy5sZW5ndGg7biE9PWk7KytuKXRbYXJndW1lbnRzW25dLnV1aWRdPW47dGhpcy5fcGF0aHM9W10sdGhpcy5fcGFyc2VkUGF0aHM9W10sdGhpcy5fYmluZGluZ3M9W10sdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoPXt9O2NvbnN0IGU9dGhpczt0aGlzLnN0YXRzPXtvYmplY3RzOntnZXQgdG90YWwoKXtyZXR1cm4gZS5fb2JqZWN0cy5sZW5ndGh9LGdldCBpblVzZSgpe3JldHVybiB0aGlzLnRvdGFsLWUubkNhY2hlZE9iamVjdHNffX0sZ2V0IGJpbmRpbmdzUGVyT2JqZWN0KCl7cmV0dXJuIGUuX2JpbmRpbmdzLmxlbmd0aH19fWFkZCgpe2NvbnN0IHQ9dGhpcy5fb2JqZWN0cyxlPXRoaXMuX2luZGljZXNCeVVVSUQsbj10aGlzLl9wYXRocyxpPXRoaXMuX3BhcnNlZFBhdGhzLHM9dGhpcy5fYmluZGluZ3Msbz1zLmxlbmd0aDtsZXQgYSxjPXQubGVuZ3RoLGw9dGhpcy5uQ2FjaGVkT2JqZWN0c187Zm9yKGxldCB1PTAsaD1hcmd1bWVudHMubGVuZ3RoO3UhPT1oOysrdSl7Y29uc3QgZj1hcmd1bWVudHNbdV0sZD1mLnV1aWQ7bGV0IHA9ZVtkXTtpZihwPT09dm9pZCAwKXtwPWMrKyxlW2RdPXAsdC5wdXNoKGYpO2ZvcihsZXQgeD0wLGc9bzt4IT09ZzsrK3gpc1t4XS5wdXNoKG5ldyBvZShmLG5beF0saVt4XSkpfWVsc2UgaWYocDxsKXthPXRbcF07Y29uc3QgeD0tLWwsZz10W3hdO2VbZy51dWlkXT1wLHRbcF09ZyxlW2RdPXgsdFt4XT1mO2ZvcihsZXQgbT0wLHY9bzttIT09djsrK20pe2NvbnN0IHk9c1ttXSxfPXlbeF07bGV0IFM9eVtwXTt5W3BdPV8sUz09PXZvaWQgMCYmKFM9bmV3IG9lKGYsblttXSxpW21dKSkseVt4XT1TfX1lbHNlIHRbcF0hPT1hJiZjb25zb2xlLmVycm9yKCJUSFJFRS5BbmltYXRpb25PYmplY3RHcm91cDogRGlmZmVyZW50IG9iamVjdHMgd2l0aCB0aGUgc2FtZSBVVUlEIGRldGVjdGVkLiBDbGVhbiB0aGUgY2FjaGVzIG9yIHJlY3JlYXRlIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgd2hlbiByZWxvYWRpbmcgc2NlbmVzLiIpfXRoaXMubkNhY2hlZE9iamVjdHNfPWx9cmVtb3ZlKCl7Y29uc3QgdD10aGlzLl9vYmplY3RzLGU9dGhpcy5faW5kaWNlc0J5VVVJRCxuPXRoaXMuX2JpbmRpbmdzLGk9bi5sZW5ndGg7bGV0IHM9dGhpcy5uQ2FjaGVkT2JqZWN0c187Zm9yKGxldCBvPTAsYT1hcmd1bWVudHMubGVuZ3RoO28hPT1hOysrbyl7Y29uc3QgYz1hcmd1bWVudHNbb10sbD1jLnV1aWQsdT1lW2xdO2lmKHUhPT12b2lkIDAmJnU+PXMpe2NvbnN0IGg9cysrLGY9dFtoXTtlW2YudXVpZF09dSx0W3VdPWYsZVtsXT1oLHRbaF09Yztmb3IobGV0IGQ9MCxwPWk7ZCE9PXA7KytkKXtjb25zdCB4PW5bZF0sZz14W2hdLG09eFt1XTt4W3VdPWcseFtoXT1tfX19dGhpcy5uQ2FjaGVkT2JqZWN0c189c311bmNhY2hlKCl7Y29uc3QgdD10aGlzLl9vYmplY3RzLGU9dGhpcy5faW5kaWNlc0J5VVVJRCxuPXRoaXMuX2JpbmRpbmdzLGk9bi5sZW5ndGg7bGV0IHM9dGhpcy5uQ2FjaGVkT2JqZWN0c18sbz10Lmxlbmd0aDtmb3IobGV0IGE9MCxjPWFyZ3VtZW50cy5sZW5ndGg7YSE9PWM7KythKXtjb25zdCBsPWFyZ3VtZW50c1thXSx1PWwudXVpZCxoPWVbdV07aWYoaCE9PXZvaWQgMClpZihkZWxldGUgZVt1XSxoPHMpe2NvbnN0IGY9LS1zLGQ9dFtmXSxwPS0tbyx4PXRbcF07ZVtkLnV1aWRdPWgsdFtoXT1kLGVbeC51dWlkXT1mLHRbZl09eCx0LnBvcCgpO2ZvcihsZXQgZz0wLG09aTtnIT09bTsrK2cpe2NvbnN0IHY9bltnXSx5PXZbZl0sXz12W3BdO3ZbaF09eSx2W2ZdPV8sdi5wb3AoKX19ZWxzZXtjb25zdCBmPS0tbyxkPXRbZl07Zj4wJiYoZVtkLnV1aWRdPWgpLHRbaF09ZCx0LnBvcCgpO2ZvcihsZXQgcD0wLHg9aTtwIT09eDsrK3Ape2NvbnN0IGc9bltwXTtnW2hdPWdbZl0sZy5wb3AoKX19fXRoaXMubkNhY2hlZE9iamVjdHNfPXN9c3Vic2NyaWJlXyh0LGUpe2NvbnN0IG49dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoO2xldCBpPW5bdF07Y29uc3Qgcz10aGlzLl9iaW5kaW5ncztpZihpIT09dm9pZCAwKXJldHVybiBzW2ldO2NvbnN0IG89dGhpcy5fcGF0aHMsYT10aGlzLl9wYXJzZWRQYXRocyxjPXRoaXMuX29iamVjdHMsbD1jLmxlbmd0aCx1PXRoaXMubkNhY2hlZE9iamVjdHNfLGg9bmV3IEFycmF5KGwpO2k9cy5sZW5ndGgsblt0XT1pLG8ucHVzaCh0KSxhLnB1c2goZSkscy5wdXNoKGgpO2ZvcihsZXQgZj11LGQ9Yy5sZW5ndGg7ZiE9PWQ7KytmKXtjb25zdCBwPWNbZl07aFtmXT1uZXcgb2UocCx0LGUpfXJldHVybiBofXVuc3Vic2NyaWJlXyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxuPWVbdF07aWYobiE9PXZvaWQgMCl7Y29uc3QgaT10aGlzLl9wYXRocyxzPXRoaXMuX3BhcnNlZFBhdGhzLG89dGhpcy5fYmluZGluZ3MsYT1vLmxlbmd0aC0xLGM9b1thXSxsPXRbYV07ZVtsXT1uLG9bbl09YyxvLnBvcCgpLHNbbl09c1thXSxzLnBvcCgpLGlbbl09aVthXSxpLnBvcCgpfX19Y2xhc3MgSjB7Y29uc3RydWN0b3IodCxlLG49bnVsbCxpPWUuYmxlbmRNb2RlKXt0aGlzLl9taXhlcj10LHRoaXMuX2NsaXA9ZSx0aGlzLl9sb2NhbFJvb3Q9bix0aGlzLmJsZW5kTW9kZT1pO2NvbnN0IHM9ZS50cmFja3Msbz1zLmxlbmd0aCxhPW5ldyBBcnJheShvKSxjPXtlbmRpbmdTdGFydDpQcixlbmRpbmdFbmQ6UHJ9O2ZvcihsZXQgbD0wO2whPT1vOysrbCl7Y29uc3QgdT1zW2xdLmNyZWF0ZUludGVycG9sYW50KG51bGwpO2FbbF09dSx1LnNldHRpbmdzPWN9dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncz1jLHRoaXMuX2ludGVycG9sYW50cz1hLHRoaXMuX3Byb3BlcnR5QmluZGluZ3M9bmV3IEFycmF5KG8pLHRoaXMuX2NhY2hlSW5kZXg9bnVsbCx0aGlzLl9ieUNsaXBDYWNoZUluZGV4PW51bGwsdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD1udWxsLHRoaXMubG9vcD1VbSx0aGlzLl9sb29wQ291bnQ9LTEsdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy50aW1lPTAsdGhpcy50aW1lU2NhbGU9MSx0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9MSx0aGlzLndlaWdodD0xLHRoaXMuX2VmZmVjdGl2ZVdlaWdodD0xLHRoaXMucmVwZXRpdGlvbnM9MS8wLHRoaXMucGF1c2VkPSExLHRoaXMuZW5hYmxlZD0hMCx0aGlzLmNsYW1wV2hlbkZpbmlzaGVkPSExLHRoaXMuemVyb1Nsb3BlQXRTdGFydD0hMCx0aGlzLnplcm9TbG9wZUF0RW5kPSEwfXBsYXkoKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKHRoaXMpLHRoaXN9c3RvcCgpe3JldHVybiB0aGlzLl9taXhlci5fZGVhY3RpdmF0ZUFjdGlvbih0aGlzKSx0aGlzLnJlc2V0KCl9cmVzZXQoKXtyZXR1cm4gdGhpcy5wYXVzZWQ9ITEsdGhpcy5lbmFibGVkPSEwLHRoaXMudGltZT0wLHRoaXMuX2xvb3BDb3VudD0tMSx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLnN0b3BGYWRpbmcoKS5zdG9wV2FycGluZygpfWlzUnVubmluZygpe3JldHVybiB0aGlzLmVuYWJsZWQmJiF0aGlzLnBhdXNlZCYmdGhpcy50aW1lU2NhbGUhPT0wJiZ0aGlzLl9zdGFydFRpbWU9PT1udWxsJiZ0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24odGhpcyl9aXNTY2hlZHVsZWQoKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfXN0YXJ0QXQodCl7cmV0dXJuIHRoaXMuX3N0YXJ0VGltZT10LHRoaXN9c2V0TG9vcCh0LGUpe3JldHVybiB0aGlzLmxvb3A9dCx0aGlzLnJlcGV0aXRpb25zPWUsdGhpc31zZXRFZmZlY3RpdmVXZWlnaHQodCl7cmV0dXJuIHRoaXMud2VpZ2h0PXQsdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PXRoaXMuZW5hYmxlZD90OjAsdGhpcy5zdG9wRmFkaW5nKCl9Z2V0RWZmZWN0aXZlV2VpZ2h0KCl7cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodH1mYWRlSW4odCl7cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKHQsMCwxKX1mYWRlT3V0KHQpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyh0LDEsMCl9Y3Jvc3NGYWRlRnJvbSh0LGUsbj0hMSl7aWYodC5mYWRlT3V0KGUpLHRoaXMuZmFkZUluKGUpLG49PT0hMCl7Y29uc3QgaT10aGlzLl9jbGlwLmR1cmF0aW9uLHM9dC5fY2xpcC5kdXJhdGlvbixvPXMvaSxhPWkvczt0LndhcnAoMSxvLGUpLHRoaXMud2FycChhLDEsZSl9cmV0dXJuIHRoaXN9Y3Jvc3NGYWRlVG8odCxlLG49ITEpe3JldHVybiB0LmNyb3NzRmFkZUZyb20odGhpcyxlLG4pfXN0b3BGYWRpbmcoKXtjb25zdCB0PXRoaXMuX3dlaWdodEludGVycG9sYW50O3JldHVybiB0IT09bnVsbCYmKHRoaXMuX3dlaWdodEludGVycG9sYW50PW51bGwsdGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KHQpKSx0aGlzfXNldEVmZmVjdGl2ZVRpbWVTY2FsZSh0KXtyZXR1cm4gdGhpcy50aW1lU2NhbGU9dCx0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9dGhpcy5wYXVzZWQ/MDp0LHRoaXMuc3RvcFdhcnBpbmcoKX1nZXRFZmZlY3RpdmVUaW1lU2NhbGUoKXtyZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlfXNldER1cmF0aW9uKHQpe3JldHVybiB0aGlzLnRpbWVTY2FsZT10aGlzLl9jbGlwLmR1cmF0aW9uL3QsdGhpcy5zdG9wV2FycGluZygpfXN5bmNXaXRoKHQpe3JldHVybiB0aGlzLnRpbWU9dC50aW1lLHRoaXMudGltZVNjYWxlPXQudGltZVNjYWxlLHRoaXMuc3RvcFdhcnBpbmcoKX1oYWx0KHQpe3JldHVybiB0aGlzLndhcnAodGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlLDAsdCl9d2FycCh0LGUsbil7Y29uc3QgaT10aGlzLl9taXhlcixzPWkudGltZSxvPXRoaXMudGltZVNjYWxlO2xldCBhPXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O2E9PT1udWxsJiYoYT1pLl9sZW5kQ29udHJvbEludGVycG9sYW50KCksdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9YSk7Y29uc3QgYz1hLnBhcmFtZXRlclBvc2l0aW9ucyxsPWEuc2FtcGxlVmFsdWVzO3JldHVybiBjWzBdPXMsY1sxXT1zK24sbFswXT10L28sbFsxXT1lL28sdGhpc31zdG9wV2FycGluZygpe2NvbnN0IHQ9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7cmV0dXJuIHQhPT1udWxsJiYodGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQodCkpLHRoaXN9Z2V0TWl4ZXIoKXtyZXR1cm4gdGhpcy5fbWl4ZXJ9Z2V0Q2xpcCgpe3JldHVybiB0aGlzLl9jbGlwfWdldFJvb3QoKXtyZXR1cm4gdGhpcy5fbG9jYWxSb290fHx0aGlzLl9taXhlci5fcm9vdH1fdXBkYXRlKHQsZSxuLGkpe2lmKCF0aGlzLmVuYWJsZWQpe3RoaXMuX3VwZGF0ZVdlaWdodCh0KTtyZXR1cm59Y29uc3Qgcz10aGlzLl9zdGFydFRpbWU7aWYocyE9PW51bGwpe2NvbnN0IGM9KHQtcykqbjtjPDB8fG49PT0wP2U9MDoodGhpcy5fc3RhcnRUaW1lPW51bGwsZT1uKmMpfWUqPXRoaXMuX3VwZGF0ZVRpbWVTY2FsZSh0KTtjb25zdCBvPXRoaXMuX3VwZGF0ZVRpbWUoZSksYT10aGlzLl91cGRhdGVXZWlnaHQodCk7aWYoYT4wKXtjb25zdCBjPXRoaXMuX2ludGVycG9sYW50cyxsPXRoaXMuX3Byb3BlcnR5QmluZGluZ3M7c3dpdGNoKHRoaXMuYmxlbmRNb2RlKXtjYXNlIFFoOmZvcihsZXQgdT0wLGg9Yy5sZW5ndGg7dSE9PWg7Kyt1KWNbdV0uZXZhbHVhdGUobyksbFt1XS5hY2N1bXVsYXRlQWRkaXRpdmUoYSk7YnJlYWs7Y2FzZSBxYzpkZWZhdWx0OmZvcihsZXQgdT0wLGg9Yy5sZW5ndGg7dSE9PWg7Kyt1KWNbdV0uZXZhbHVhdGUobyksbFt1XS5hY2N1bXVsYXRlKGksYSl9fX1fdXBkYXRlV2VpZ2h0KHQpe2xldCBlPTA7aWYodGhpcy5lbmFibGVkKXtlPXRoaXMud2VpZ2h0O2NvbnN0IG49dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7aWYobiE9PW51bGwpe2NvbnN0IGk9bi5ldmFsdWF0ZSh0KVswXTtlKj1pLHQ+bi5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BGYWRpbmcoKSxpPT09MCYmKHRoaXMuZW5hYmxlZD0hMSkpfX1yZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PWUsZX1fdXBkYXRlVGltZVNjYWxlKHQpe2xldCBlPTA7aWYoIXRoaXMucGF1c2VkKXtlPXRoaXMudGltZVNjYWxlO2NvbnN0IG49dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7aWYobiE9PW51bGwpe2NvbnN0IGk9bi5ldmFsdWF0ZSh0KVswXTtlKj1pLHQ+bi5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BXYXJwaW5nKCksZT09PTA/dGhpcy5wYXVzZWQ9ITA6dGhpcy50aW1lU2NhbGU9ZSl9fXJldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9ZSxlfV91cGRhdGVUaW1lKHQpe2NvbnN0IGU9dGhpcy5fY2xpcC5kdXJhdGlvbixuPXRoaXMubG9vcDtsZXQgaT10aGlzLnRpbWUrdCxzPXRoaXMuX2xvb3BDb3VudDtjb25zdCBvPW49PT1ObTtpZih0PT09MClyZXR1cm4gcz09PS0xP2k6byYmKHMmMSk9PT0xP2UtaTppO2lmKG49PT1EbSl7cz09PS0xJiYodGhpcy5fbG9vcENvdW50PTAsdGhpcy5fc2V0RW5kaW5ncyghMCwhMCwhMSkpO3Q6e2lmKGk+PWUpaT1lO2Vsc2UgaWYoaTwwKWk9MDtlbHNle3RoaXMudGltZT1pO2JyZWFrIHR9dGhpcy5jbGFtcFdoZW5GaW5pc2hlZD90aGlzLnBhdXNlZD0hMDp0aGlzLmVuYWJsZWQ9ITEsdGhpcy50aW1lPWksdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToiZmluaXNoZWQiLGFjdGlvbjp0aGlzLGRpcmVjdGlvbjp0PDA/LTE6MX0pfX1lbHNle2lmKHM9PT0tMSYmKHQ+PTA/KHM9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLHRoaXMucmVwZXRpdGlvbnM9PT0wLG8pKTp0aGlzLl9zZXRFbmRpbmdzKHRoaXMucmVwZXRpdGlvbnM9PT0wLCEwLG8pKSxpPj1lfHxpPDApe2NvbnN0IGE9TWF0aC5mbG9vcihpL2UpO2ktPWUqYSxzKz1NYXRoLmFicyhhKTtjb25zdCBjPXRoaXMucmVwZXRpdGlvbnMtcztpZihjPD0wKXRoaXMuY2xhbXBXaGVuRmluaXNoZWQ/dGhpcy5wYXVzZWQ9ITA6dGhpcy5lbmFibGVkPSExLGk9dD4wP2U6MCx0aGlzLnRpbWU9aSx0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHt0eXBlOiJmaW5pc2hlZCIsYWN0aW9uOnRoaXMsZGlyZWN0aW9uOnQ+MD8xOi0xfSk7ZWxzZXtpZihjPT09MSl7Y29uc3QgbD10PDA7dGhpcy5fc2V0RW5kaW5ncyhsLCFsLG8pfWVsc2UgdGhpcy5fc2V0RW5kaW5ncyghMSwhMSxvKTt0aGlzLl9sb29wQ291bnQ9cyx0aGlzLnRpbWU9aSx0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHt0eXBlOiJsb29wIixhY3Rpb246dGhpcyxsb29wRGVsdGE6YX0pfX1lbHNlIHRoaXMudGltZT1pO2lmKG8mJihzJjEpPT09MSlyZXR1cm4gZS1pfXJldHVybiBpfV9zZXRFbmRpbmdzKHQsZSxuKXtjb25zdCBpPXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M7bj8oaS5lbmRpbmdTdGFydD1McixpLmVuZGluZ0VuZD1Mcik6KHQ/aS5lbmRpbmdTdGFydD10aGlzLnplcm9TbG9wZUF0U3RhcnQ/THI6UHI6aS5lbmRpbmdTdGFydD1HbyxlP2kuZW5kaW5nRW5kPXRoaXMuemVyb1Nsb3BlQXRFbmQ/THI6UHI6aS5lbmRpbmdFbmQ9R28pfV9zY2hlZHVsZUZhZGluZyh0LGUsbil7Y29uc3QgaT10aGlzLl9taXhlcixzPWkudGltZTtsZXQgbz10aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtvPT09bnVsbCYmKG89aS5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpLHRoaXMuX3dlaWdodEludGVycG9sYW50PW8pO2NvbnN0IGE9by5wYXJhbWV0ZXJQb3NpdGlvbnMsYz1vLnNhbXBsZVZhbHVlcztyZXR1cm4gYVswXT1zLGNbMF09ZSxhWzFdPXMrdCxjWzFdPW4sdGhpc319Y29uc3QgUGI9bmV3IEZsb2F0MzJBcnJheSgxKTtjbGFzcyBMYiBleHRlbmRzIHlpe2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5fcm9vdD10LHRoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCksdGhpcy5fYWNjdUluZGV4PTAsdGhpcy50aW1lPTAsdGhpcy50aW1lU2NhbGU9MX1fYmluZEFjdGlvbih0LGUpe2NvbnN0IG49dC5fbG9jYWxSb290fHx0aGlzLl9yb290LGk9dC5fY2xpcC50cmFja3Mscz1pLmxlbmd0aCxvPXQuX3Byb3BlcnR5QmluZGluZ3MsYT10Ll9pbnRlcnBvbGFudHMsYz1uLnV1aWQsbD10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWU7bGV0IHU9bFtjXTt1PT09dm9pZCAwJiYodT17fSxsW2NdPXUpO2ZvcihsZXQgaD0wO2ghPT1zOysraCl7Y29uc3QgZj1pW2hdLGQ9Zi5uYW1lO2xldCBwPXVbZF07aWYocCE9PXZvaWQgMCkrK3AucmVmZXJlbmNlQ291bnQsb1toXT1wO2Vsc2V7aWYocD1vW2hdLHAhPT12b2lkIDApe3AuX2NhY2hlSW5kZXg9PT1udWxsJiYoKytwLnJlZmVyZW5jZUNvdW50LHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyhwLGMsZCkpO2NvbnRpbnVlfWNvbnN0IHg9ZSYmZS5fcHJvcGVydHlCaW5kaW5nc1toXS5iaW5kaW5nLnBhcnNlZFBhdGg7cD1uZXcgWjAob2UuY3JlYXRlKG4sZCx4KSxmLlZhbHVlVHlwZU5hbWUsZi5nZXRWYWx1ZVNpemUoKSksKytwLnJlZmVyZW5jZUNvdW50LHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyhwLGMsZCksb1toXT1wfWFbaF0ucmVzdWx0QnVmZmVyPXAuYnVmZmVyfX1fYWN0aXZhdGVBY3Rpb24odCl7aWYoIXRoaXMuX2lzQWN0aXZlQWN0aW9uKHQpKXtpZih0Ll9jYWNoZUluZGV4PT09bnVsbCl7Y29uc3Qgbj0odC5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkLGk9dC5fY2xpcC51dWlkLHM9dGhpcy5fYWN0aW9uc0J5Q2xpcFtpXTt0aGlzLl9iaW5kQWN0aW9uKHQscyYmcy5rbm93bkFjdGlvbnNbMF0pLHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKHQsaSxuKX1jb25zdCBlPXQuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuIT09aTsrK24pe2NvbnN0IHM9ZVtuXTtzLnVzZUNvdW50Kys9PT0wJiYodGhpcy5fbGVuZEJpbmRpbmcocykscy5zYXZlT3JpZ2luYWxTdGF0ZSgpKX10aGlzLl9sZW5kQWN0aW9uKHQpfX1fZGVhY3RpdmF0ZUFjdGlvbih0KXtpZih0aGlzLl9pc0FjdGl2ZUFjdGlvbih0KSl7Y29uc3QgZT10Ll9wcm9wZXJ0eUJpbmRpbmdzO2ZvcihsZXQgbj0wLGk9ZS5sZW5ndGg7biE9PWk7KytuKXtjb25zdCBzPWVbbl07LS1zLnVzZUNvdW50PT09MCYmKHMucmVzdG9yZU9yaWdpbmFsU3RhdGUoKSx0aGlzLl90YWtlQmFja0JpbmRpbmcocykpfXRoaXMuX3Rha2VCYWNrQWN0aW9uKHQpfX1faW5pdE1lbW9yeU1hbmFnZXIoKXt0aGlzLl9hY3Rpb25zPVtdLHRoaXMuX25BY3RpdmVBY3Rpb25zPTAsdGhpcy5fYWN0aW9uc0J5Q2xpcD17fSx0aGlzLl9iaW5kaW5ncz1bXSx0aGlzLl9uQWN0aXZlQmluZGluZ3M9MCx0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWU9e30sdGhpcy5fY29udHJvbEludGVycG9sYW50cz1bXSx0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cz0wO2NvbnN0IHQ9dGhpczt0aGlzLnN0YXRzPXthY3Rpb25zOntnZXQgdG90YWwoKXtyZXR1cm4gdC5fYWN0aW9ucy5sZW5ndGh9LGdldCBpblVzZSgpe3JldHVybiB0Ll9uQWN0aXZlQWN0aW9uc319LGJpbmRpbmdzOntnZXQgdG90YWwoKXtyZXR1cm4gdC5fYmluZGluZ3MubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdC5fbkFjdGl2ZUJpbmRpbmdzfX0sY29udHJvbEludGVycG9sYW50czp7Z2V0IHRvdGFsKCl7cmV0dXJuIHQuX2NvbnRyb2xJbnRlcnBvbGFudHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdC5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHN9fX19X2lzQWN0aXZlQWN0aW9uKHQpe2NvbnN0IGU9dC5fY2FjaGVJbmRleDtyZXR1cm4gZSE9PW51bGwmJmU8dGhpcy5fbkFjdGl2ZUFjdGlvbnN9X2FkZEluYWN0aXZlQWN0aW9uKHQsZSxuKXtjb25zdCBpPXRoaXMuX2FjdGlvbnMscz10aGlzLl9hY3Rpb25zQnlDbGlwO2xldCBvPXNbZV07aWYobz09PXZvaWQgMClvPXtrbm93bkFjdGlvbnM6W3RdLGFjdGlvbkJ5Um9vdDp7fX0sdC5fYnlDbGlwQ2FjaGVJbmRleD0wLHNbZV09bztlbHNle2NvbnN0IGE9by5rbm93bkFjdGlvbnM7dC5fYnlDbGlwQ2FjaGVJbmRleD1hLmxlbmd0aCxhLnB1c2godCl9dC5fY2FjaGVJbmRleD1pLmxlbmd0aCxpLnB1c2godCksby5hY3Rpb25CeVJvb3Rbbl09dH1fcmVtb3ZlSW5hY3RpdmVBY3Rpb24odCl7Y29uc3QgZT10aGlzLl9hY3Rpb25zLG49ZVtlLmxlbmd0aC0xXSxpPXQuX2NhY2hlSW5kZXg7bi5fY2FjaGVJbmRleD1pLGVbaV09bixlLnBvcCgpLHQuX2NhY2hlSW5kZXg9bnVsbDtjb25zdCBzPXQuX2NsaXAudXVpZCxvPXRoaXMuX2FjdGlvbnNCeUNsaXAsYT1vW3NdLGM9YS5rbm93bkFjdGlvbnMsbD1jW2MubGVuZ3RoLTFdLHU9dC5fYnlDbGlwQ2FjaGVJbmRleDtsLl9ieUNsaXBDYWNoZUluZGV4PXUsY1t1XT1sLGMucG9wKCksdC5fYnlDbGlwQ2FjaGVJbmRleD1udWxsO2NvbnN0IGg9YS5hY3Rpb25CeVJvb3QsZj0odC5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkO2RlbGV0ZSBoW2ZdLGMubGVuZ3RoPT09MCYmZGVsZXRlIG9bc10sdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbih0KX1fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbih0KXtjb25zdCBlPXQuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuIT09aTsrK24pe2NvbnN0IHM9ZVtuXTstLXMucmVmZXJlbmNlQ291bnQ9PT0wJiZ0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcocyl9fV9sZW5kQWN0aW9uKHQpe2NvbnN0IGU9dGhpcy5fYWN0aW9ucyxuPXQuX2NhY2hlSW5kZXgsaT10aGlzLl9uQWN0aXZlQWN0aW9ucysrLHM9ZVtpXTt0Ll9jYWNoZUluZGV4PWksZVtpXT10LHMuX2NhY2hlSW5kZXg9bixlW25dPXN9X3Rha2VCYWNrQWN0aW9uKHQpe2NvbnN0IGU9dGhpcy5fYWN0aW9ucyxuPXQuX2NhY2hlSW5kZXgsaT0tLXRoaXMuX25BY3RpdmVBY3Rpb25zLHM9ZVtpXTt0Ll9jYWNoZUluZGV4PWksZVtpXT10LHMuX2NhY2hlSW5kZXg9bixlW25dPXN9X2FkZEluYWN0aXZlQmluZGluZyh0LGUsbil7Y29uc3QgaT10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUscz10aGlzLl9iaW5kaW5ncztsZXQgbz1pW2VdO289PT12b2lkIDAmJihvPXt9LGlbZV09byksb1tuXT10LHQuX2NhY2hlSW5kZXg9cy5sZW5ndGgscy5wdXNoKHQpfV9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcodCl7Y29uc3QgZT10aGlzLl9iaW5kaW5ncyxuPXQuYmluZGluZyxpPW4ucm9vdE5vZGUudXVpZCxzPW4ucGF0aCxvPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxhPW9baV0sYz1lW2UubGVuZ3RoLTFdLGw9dC5fY2FjaGVJbmRleDtjLl9jYWNoZUluZGV4PWwsZVtsXT1jLGUucG9wKCksZGVsZXRlIGFbc10sT2JqZWN0LmtleXMoYSkubGVuZ3RoPT09MCYmZGVsZXRlIG9baV19X2xlbmRCaW5kaW5nKHQpe2NvbnN0IGU9dGhpcy5fYmluZGluZ3Msbj10Ll9jYWNoZUluZGV4LGk9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzKysscz1lW2ldO3QuX2NhY2hlSW5kZXg9aSxlW2ldPXQscy5fY2FjaGVJbmRleD1uLGVbbl09c31fdGFrZUJhY2tCaW5kaW5nKHQpe2NvbnN0IGU9dGhpcy5fYmluZGluZ3Msbj10Ll9jYWNoZUluZGV4LGk9LS10aGlzLl9uQWN0aXZlQmluZGluZ3Mscz1lW2ldO3QuX2NhY2hlSW5kZXg9aSxlW2ldPXQscy5fY2FjaGVJbmRleD1uLGVbbl09c31fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpe2NvbnN0IHQ9dGhpcy5fY29udHJvbEludGVycG9sYW50cyxlPXRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzKys7bGV0IG49dFtlXTtyZXR1cm4gbj09PXZvaWQgMCYmKG49bmV3IHRkKG5ldyBGbG9hdDMyQXJyYXkoMiksbmV3IEZsb2F0MzJBcnJheSgyKSwxLFBiKSxuLl9fY2FjaGVJbmRleD1lLHRbZV09biksbn1fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQodCl7Y29uc3QgZT10aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLG49dC5fX2NhY2hlSW5kZXgsaT0tLXRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzLHM9ZVtpXTt0Ll9fY2FjaGVJbmRleD1pLGVbaV09dCxzLl9fY2FjaGVJbmRleD1uLGVbbl09c31jbGlwQWN0aW9uKHQsZSxuKXtjb25zdCBpPWV8fHRoaXMuX3Jvb3Qscz1pLnV1aWQ7bGV0IG89dHlwZW9mIHQ9PSJzdHJpbmciP1NhLmZpbmRCeU5hbWUoaSx0KTp0O2NvbnN0IGE9byE9PW51bGw/by51dWlkOnQsYz10aGlzLl9hY3Rpb25zQnlDbGlwW2FdO2xldCBsPW51bGw7aWYobj09PXZvaWQgMCYmKG8hPT1udWxsP249by5ibGVuZE1vZGU6bj1xYyksYyE9PXZvaWQgMCl7Y29uc3QgaD1jLmFjdGlvbkJ5Um9vdFtzXTtpZihoIT09dm9pZCAwJiZoLmJsZW5kTW9kZT09PW4pcmV0dXJuIGg7bD1jLmtub3duQWN0aW9uc1swXSxvPT09bnVsbCYmKG89bC5fY2xpcCl9aWYobz09PW51bGwpcmV0dXJuIG51bGw7Y29uc3QgdT1uZXcgSjAodGhpcyxvLGUsbik7cmV0dXJuIHRoaXMuX2JpbmRBY3Rpb24odSxsKSx0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbih1LGEscyksdX1leGlzdGluZ0FjdGlvbih0LGUpe2NvbnN0IG49ZXx8dGhpcy5fcm9vdCxpPW4udXVpZCxzPXR5cGVvZiB0PT0ic3RyaW5nIj9TYS5maW5kQnlOYW1lKG4sdCk6dCxvPXM/cy51dWlkOnQsYT10aGlzLl9hY3Rpb25zQnlDbGlwW29dO3JldHVybiBhIT09dm9pZCAwJiZhLmFjdGlvbkJ5Um9vdFtpXXx8bnVsbH1zdG9wQWxsQWN0aW9uKCl7Y29uc3QgdD10aGlzLl9hY3Rpb25zLGU9dGhpcy5fbkFjdGl2ZUFjdGlvbnM7Zm9yKGxldCBuPWUtMTtuPj0wOy0tbil0W25dLnN0b3AoKTtyZXR1cm4gdGhpc311cGRhdGUodCl7dCo9dGhpcy50aW1lU2NhbGU7Y29uc3QgZT10aGlzLl9hY3Rpb25zLG49dGhpcy5fbkFjdGl2ZUFjdGlvbnMsaT10aGlzLnRpbWUrPXQscz1NYXRoLnNpZ24odCksbz10aGlzLl9hY2N1SW5kZXhePTE7Zm9yKGxldCBsPTA7bCE9PW47KytsKWVbbF0uX3VwZGF0ZShpLHQscyxvKTtjb25zdCBhPXRoaXMuX2JpbmRpbmdzLGM9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzO2ZvcihsZXQgbD0wO2whPT1jOysrbClhW2xdLmFwcGx5KG8pO3JldHVybiB0aGlzfXNldFRpbWUodCl7dGhpcy50aW1lPTA7Zm9yKGxldCBlPTA7ZTx0aGlzLl9hY3Rpb25zLmxlbmd0aDtlKyspdGhpcy5fYWN0aW9uc1tlXS50aW1lPTA7cmV0dXJuIHRoaXMudXBkYXRlKHQpfWdldFJvb3QoKXtyZXR1cm4gdGhpcy5fcm9vdH11bmNhY2hlQ2xpcCh0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10LnV1aWQsaT10aGlzLl9hY3Rpb25zQnlDbGlwLHM9aVtuXTtpZihzIT09dm9pZCAwKXtjb25zdCBvPXMua25vd25BY3Rpb25zO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YSE9PWM7KythKXtjb25zdCBsPW9bYV07dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbihsKTtjb25zdCB1PWwuX2NhY2hlSW5kZXgsaD1lW2UubGVuZ3RoLTFdO2wuX2NhY2hlSW5kZXg9bnVsbCxsLl9ieUNsaXBDYWNoZUluZGV4PW51bGwsaC5fY2FjaGVJbmRleD11LGVbdV09aCxlLnBvcCgpLHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24obCl9ZGVsZXRlIGlbbl19fXVuY2FjaGVSb290KHQpe2NvbnN0IGU9dC51dWlkLG49dGhpcy5fYWN0aW9uc0J5Q2xpcDtmb3IoY29uc3QgbyBpbiBuKXtjb25zdCBhPW5bb10uYWN0aW9uQnlSb290LGM9YVtlXTtjIT09dm9pZCAwJiYodGhpcy5fZGVhY3RpdmF0ZUFjdGlvbihjKSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbihjKSl9Y29uc3QgaT10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUscz1pW2VdO2lmKHMhPT12b2lkIDApZm9yKGNvbnN0IG8gaW4gcyl7Y29uc3QgYT1zW29dO2EucmVzdG9yZU9yaWdpbmFsU3RhdGUoKSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoYSl9fXVuY2FjaGVBY3Rpb24odCxlKXtjb25zdCBuPXRoaXMuZXhpc3RpbmdBY3Rpb24odCxlKTtuIT09bnVsbCYmKHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24obiksdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24obikpfX1jbGFzcyBEYiBleHRlbmRzIFpje2NvbnN0cnVjdG9yKHQ9MSxlPTEsbj0xLGk9e30pe3N1cGVyKHQsZSxpKSx0aGlzLmlzUmVuZGVyVGFyZ2V0M0Q9ITAsdGhpcy5kZXB0aD1uLHRoaXMudGV4dHVyZT1uZXcgSmMobnVsbCx0LGUsbiksdGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMH19Y2xhc3MgVWIgZXh0ZW5kcyBaY3tjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxpPXt9KXtzdXBlcih0LGUsaSksdGhpcy5pc1JlbmRlclRhcmdldEFycmF5PSEwLHRoaXMuZGVwdGg9bix0aGlzLnRleHR1cmU9bmV3IFlvKG51bGwsdCxlLG4pLHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITB9fWNsYXNzIHVke2NvbnN0cnVjdG9yKHQpe3RoaXMudmFsdWU9dH1jbG9uZSgpe3JldHVybiBuZXcgdWQodGhpcy52YWx1ZS5jbG9uZT09PXZvaWQgMD90aGlzLnZhbHVlOnRoaXMudmFsdWUuY2xvbmUoKSl9fWxldCBOYj0wO2NsYXNzIEZiIGV4dGVuZHMgeWl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNVbmlmb3Jtc0dyb3VwPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOk5iKyt9KSx0aGlzLm5hbWU9IiIsdGhpcy51c2FnZT1Xbyx0aGlzLnVuaWZvcm1zPVtdfWFkZCh0KXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5wdXNoKHQpLHRoaXN9cmVtb3ZlKHQpe2NvbnN0IGU9dGhpcy51bmlmb3Jtcy5pbmRleE9mKHQpO3JldHVybiBlIT09LTEmJnRoaXMudW5pZm9ybXMuc3BsaWNlKGUsMSksdGhpc31zZXROYW1lKHQpe3JldHVybiB0aGlzLm5hbWU9dCx0aGlzfXNldFVzYWdlKHQpe3JldHVybiB0aGlzLnVzYWdlPXQsdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfWNvcHkodCl7dGhpcy5uYW1lPXQubmFtZSx0aGlzLnVzYWdlPXQudXNhZ2U7Y29uc3QgZT10LnVuaWZvcm1zO3RoaXMudW5pZm9ybXMubGVuZ3RoPTA7Zm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuPGk7bisrKXtjb25zdCBzPUFycmF5LmlzQXJyYXkoZVtuXSk/ZVtuXTpbZVtuXV07Zm9yKGxldCBvPTA7bzxzLmxlbmd0aDtvKyspdGhpcy51bmlmb3Jtcy5wdXNoKHNbb10uY2xvbmUoKSl9cmV0dXJuIHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jbGFzcyBCYiBleHRlbmRzIF9se2NvbnN0cnVjdG9yKHQsZSxuPTEpe3N1cGVyKHQsZSksdGhpcy5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPSEwLHRoaXMubWVzaFBlckF0dHJpYnV0ZT1ufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5tZXNoUGVyQXR0cmlidXRlPXQubWVzaFBlckF0dHJpYnV0ZSx0aGlzfWNsb25lKHQpe2NvbnN0IGU9c3VwZXIuY2xvbmUodCk7cmV0dXJuIGUubWVzaFBlckF0dHJpYnV0ZT10aGlzLm1lc2hQZXJBdHRyaWJ1dGUsZX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj0hMCxlLm1lc2hQZXJBdHRyaWJ1dGU9dGhpcy5tZXNoUGVyQXR0cmlidXRlLGV9fWNsYXNzIE9ie2NvbnN0cnVjdG9yKHQsZSxuLGkscyl7dGhpcy5pc0dMQnVmZmVyQXR0cmlidXRlPSEwLHRoaXMubmFtZT0iIix0aGlzLmJ1ZmZlcj10LHRoaXMudHlwZT1lLHRoaXMuaXRlbVNpemU9bix0aGlzLmVsZW1lbnRTaXplPWksdGhpcy5jb3VudD1zLHRoaXMudmVyc2lvbj0wfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfXNldEJ1ZmZlcih0KXtyZXR1cm4gdGhpcy5idWZmZXI9dCx0aGlzfXNldFR5cGUodCxlKXtyZXR1cm4gdGhpcy50eXBlPXQsdGhpcy5lbGVtZW50U2l6ZT1lLHRoaXN9c2V0SXRlbVNpemUodCl7cmV0dXJuIHRoaXMuaXRlbVNpemU9dCx0aGlzfXNldENvdW50KHQpe3JldHVybiB0aGlzLmNvdW50PXQsdGhpc319Y29uc3QgSzA9bmV3IEN0O2NsYXNzIHpie2NvbnN0cnVjdG9yKHQsZSxuPTAsaT0xLzApe3RoaXMucmF5PW5ldyBocih0LGUpLHRoaXMubmVhcj1uLHRoaXMuZmFyPWksdGhpcy5jYW1lcmE9bnVsbCx0aGlzLmxheWVycz1uZXcgaWwsdGhpcy5wYXJhbXM9e01lc2g6e30sTGluZTp7dGhyZXNob2xkOjF9LExPRDp7fSxQb2ludHM6e3RocmVzaG9sZDoxfSxTcHJpdGU6e319fXNldCh0LGUpe3RoaXMucmF5LnNldCh0LGUpfXNldEZyb21DYW1lcmEodCxlKXtlLmlzUGVyc3BlY3RpdmVDYW1lcmE/KHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCh0LngsdC55LC41KS51bnByb2plY3QoZSkuc3ViKHRoaXMucmF5Lm9yaWdpbikubm9ybWFsaXplKCksdGhpcy5jYW1lcmE9ZSk6ZS5pc09ydGhvZ3JhcGhpY0NhbWVyYT8odGhpcy5yYXkub3JpZ2luLnNldCh0LngsdC55LChlLm5lYXIrZS5mYXIpLyhlLm5lYXItZS5mYXIpKS51bnByb2plY3QoZSksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCgwLDAsLTEpLnRyYW5zZm9ybURpcmVjdGlvbihlLm1hdHJpeFdvcmxkKSx0aGlzLmNhbWVyYT1lKTpjb25zb2xlLmVycm9yKCJUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlOiAiK2UudHlwZSl9c2V0RnJvbVhSQ29udHJvbGxlcih0KXtyZXR1cm4gSzAuaWRlbnRpdHkoKS5leHRyYWN0Um90YXRpb24odC5tYXRyaXhXb3JsZCksdGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSx0aGlzLnJheS5kaXJlY3Rpb24uc2V0KDAsMCwtMSkuYXBwbHlNYXRyaXg0KEswKSx0aGlzfWludGVyc2VjdE9iamVjdCh0LGU9ITAsbj1bXSl7cmV0dXJuIGhkKHQsdGhpcyxuLGUpLG4uc29ydChqMCksbn1pbnRlcnNlY3RPYmplY3RzKHQsZT0hMCxuPVtdKXtmb3IobGV0IGk9MCxzPXQubGVuZ3RoO2k8cztpKyspaGQodFtpXSx0aGlzLG4sZSk7cmV0dXJuIG4uc29ydChqMCksbn19ZnVuY3Rpb24gajAocix0KXtyZXR1cm4gci5kaXN0YW5jZS10LmRpc3RhbmNlfWZ1bmN0aW9uIGhkKHIsdCxlLG4pe2xldCBpPSEwO2lmKHIubGF5ZXJzLnRlc3QodC5sYXllcnMpJiZyLnJheWNhc3QodCxlKT09PSExJiYoaT0hMSksaT09PSEwJiZuPT09ITApe2NvbnN0IHM9ci5jaGlsZHJlbjtmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YTtvKyspaGQoc1tvXSx0LGUsITApfX1jbGFzcyBrYntjb25zdHJ1Y3Rvcih0PTEsZT0wLG49MCl7dGhpcy5yYWRpdXM9dCx0aGlzLnBoaT1lLHRoaXMudGhldGE9bn1zZXQodCxlLG4pe3JldHVybiB0aGlzLnJhZGl1cz10LHRoaXMucGhpPWUsdGhpcy50aGV0YT1uLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpcy5waGk9dC5waGksdGhpcy50aGV0YT10LnRoZXRhLHRoaXN9bWFrZVNhZmUoKXtyZXR1cm4gdGhpcy5waGk9SHQodGhpcy5waGksMWUtNixNYXRoLlBJLTFlLTYpLHRoaXN9c2V0RnJvbVZlY3RvcjModCl7cmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3Jkcyh0LngsdC55LHQueil9c2V0RnJvbUNhcnRlc2lhbkNvb3Jkcyh0LGUsbil7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydCh0KnQrZSplK24qbiksdGhpcy5yYWRpdXM9PT0wPyh0aGlzLnRoZXRhPTAsdGhpcy5waGk9MCk6KHRoaXMudGhldGE9TWF0aC5hdGFuMih0LG4pLHRoaXMucGhpPU1hdGguYWNvcyhIdChlL3RoaXMucmFkaXVzLC0xLDEpKSksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNsYXNzIFZie2NvbnN0cnVjdG9yKHQ9MSxlPTAsbj0wKXt0aGlzLnJhZGl1cz10LHRoaXMudGhldGE9ZSx0aGlzLnk9bn1zZXQodCxlLG4pe3JldHVybiB0aGlzLnJhZGl1cz10LHRoaXMudGhldGE9ZSx0aGlzLnk9bix0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMucmFkaXVzPXQucmFkaXVzLHRoaXMudGhldGE9dC50aGV0YSx0aGlzLnk9dC55LHRoaXN9c2V0RnJvbVZlY3RvcjModCl7cmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3Jkcyh0LngsdC55LHQueil9c2V0RnJvbUNhcnRlc2lhbkNvb3Jkcyh0LGUsbil7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydCh0KnQrbipuKSx0aGlzLnRoZXRhPU1hdGguYXRhbjIodCxuKSx0aGlzLnk9ZSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y2xhc3MgZmR7Y29uc3RydWN0b3IodCxlLG4saSl7ZmQucHJvdG90eXBlLmlzTWF0cml4Mj0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwxXSx0IT09dm9pZCAwJiZ0aGlzLnNldCh0LGUsbixpKX1pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwxKSx0aGlzfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjw0O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc31zZXQodCxlLG4saSl7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO3JldHVybiBzWzBdPXQsc1syXT1lLHNbMV09bixzWzNdPWksdGhpc319Y29uc3QgUTA9bmV3IHE7Y2xhc3MgR2J7Y29uc3RydWN0b3IodD1uZXcgcSgxLzAsMS8wKSxlPW5ldyBxKC0xLzAsLTEvMCkpe3RoaXMuaXNCb3gyPSEwLHRoaXMubWluPXQsdGhpcy5tYXg9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5taW4uY29weSh0KSx0aGlzLm1heC5jb3B5KGUpLHRoaXN9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQodFtlXSk7cmV0dXJuIHRoaXN9c2V0RnJvbUNlbnRlckFuZFNpemUodCxlKXtjb25zdCBuPVEwLmNvcHkoZSkubXVsdGlwbHlTY2FsYXIoLjUpO3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLnN1YihuKSx0aGlzLm1heC5jb3B5KHQpLmFkZChuKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQubWluKSx0aGlzLm1heC5jb3B5KHQubWF4KSx0aGlzfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLm1pbi54PXRoaXMubWluLnk9MS8wLHRoaXMubWF4Lng9dGhpcy5tYXgueT0tMS8wLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueX1nZXRDZW50ZXIodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCk6dC5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9Z2V0U2l6ZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwKTp0LnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfWV4cGFuZEJ5UG9pbnQodCl7cmV0dXJuIHRoaXMubWluLm1pbih0KSx0aGlzLm1heC5tYXgodCksdGhpc31leHBhbmRCeVZlY3Rvcih0KXtyZXR1cm4gdGhpcy5taW4uc3ViKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWV4cGFuZEJ5U2NhbGFyKHQpe3JldHVybiB0aGlzLm1pbi5hZGRTY2FsYXIoLXQpLHRoaXMubWF4LmFkZFNjYWxhcih0KSx0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQueD49dGhpcy5taW4ueCYmdC54PD10aGlzLm1heC54JiZ0Lnk+PXRoaXMubWluLnkmJnQueTw9dGhpcy5tYXgueX1jb250YWluc0JveCh0KXtyZXR1cm4gdGhpcy5taW4ueDw9dC5taW4ueCYmdC5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9dC5taW4ueSYmdC5tYXgueTw9dGhpcy5tYXgueX1nZXRQYXJhbWV0ZXIodCxlKXtyZXR1cm4gZS5zZXQoKHQueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwodC55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0Lm1heC54Pj10aGlzLm1pbi54JiZ0Lm1pbi54PD10aGlzLm1heC54JiZ0Lm1heC55Pj10aGlzLm1pbi55JiZ0Lm1pbi55PD10aGlzLm1heC55fWNsYW1wUG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHQpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KX1kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHRoaXMuY2xhbXBQb2ludCh0LFEwKS5kaXN0YW5jZVRvKHQpfWludGVyc2VjdCh0KXtyZXR1cm4gdGhpcy5taW4ubWF4KHQubWluKSx0aGlzLm1heC5taW4odC5tYXgpLHRoaXMuaXNFbXB0eSgpJiZ0aGlzLm1ha2VFbXB0eSgpLHRoaXN9dW5pb24odCl7cmV0dXJuIHRoaXMubWluLm1pbih0Lm1pbiksdGhpcy5tYXgubWF4KHQubWF4KSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5taW4uYWRkKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5taW4uZXF1YWxzKHRoaXMubWluKSYmdC5tYXguZXF1YWxzKHRoaXMubWF4KX19Y29uc3QgdHg9bmV3IEksYXU9bmV3IEk7Y2xhc3MgRm57Y29uc3RydWN0b3IodD1uZXcgSSxlPW5ldyBJKXt0aGlzLnN0YXJ0PXQsdGhpcy5lbmQ9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5zdGFydC5jb3B5KHQpLHRoaXMuZW5kLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLnN0YXJ0LmNvcHkodC5zdGFydCksdGhpcy5lbmQuY29weSh0LmVuZCksdGhpc31nZXRDZW50ZXIodCl7cmV0dXJuIHQuYWRkVmVjdG9ycyh0aGlzLnN0YXJ0LHRoaXMuZW5kKS5tdWx0aXBseVNjYWxhciguNSl9ZGVsdGEodCl7cmV0dXJuIHQuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KX1kaXN0YW5jZVNxKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5lbmQpfWRpc3RhbmNlKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUbyh0aGlzLmVuZCl9YXQodCxlKXtyZXR1cm4gdGhpcy5kZWx0YShlKS5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy5zdGFydCl9Y2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LGUpe3R4LnN1YlZlY3RvcnModCx0aGlzLnN0YXJ0KSxhdS5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpO2NvbnN0IG49YXUuZG90KGF1KTtsZXQgcz1hdS5kb3QodHgpL247cmV0dXJuIGUmJihzPUh0KHMsMCwxKSksc31jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSxuKXtjb25zdCBpPXRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LGUpO3JldHVybiB0aGlzLmRlbHRhKG4pLm11bHRpcGx5U2NhbGFyKGkpLmFkZCh0aGlzLnN0YXJ0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuZW5kLmFwcGx5TWF0cml4NCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5zdGFydC5lcXVhbHModGhpcy5zdGFydCkmJnQuZW5kLmVxdWFscyh0aGlzLmVuZCl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jb25zdCBleD1uZXcgSTtjbGFzcyBIYiBleHRlbmRzIHNle2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKSx0aGlzLmxpZ2h0PXQsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuY29sb3I9ZSx0aGlzLnR5cGU9IlNwb3RMaWdodEhlbHBlciI7Y29uc3Qgbj1uZXcgTnQsaT1bMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsLTEsMCwxLDAsMCwwLDAsMSwxLDAsMCwwLDAsLTEsMV07Zm9yKGxldCBvPTAsYT0xLGM9MzI7bzxjO28rKyxhKyspe2NvbnN0IGw9by9jKk1hdGguUEkqMix1PWEvYypNYXRoLlBJKjI7aS5wdXNoKE1hdGguY29zKGwpLE1hdGguc2luKGwpLDEsTWF0aC5jb3ModSksTWF0aC5zaW4odSksMSl9bi5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgdnQoaSwzKSk7Y29uc3Qgcz1uZXcgYW4oe2ZvZzohMSx0b25lTWFwcGVkOiExfSk7dGhpcy5jb25lPW5ldyB3aShuLHMpLHRoaXMuYWRkKHRoaXMuY29uZSksdGhpcy51cGRhdGUoKX1kaXNwb3NlKCl7dGhpcy5jb25lLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLmNvbmUubWF0ZXJpYWwuZGlzcG9zZSgpfXVwZGF0ZSgpe3RoaXMubGlnaHQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubGlnaHQudGFyZ2V0LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLnBhcmVudD8odGhpcy5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITApLHRoaXMubWF0cml4LmNvcHkodGhpcy5wYXJlbnQubWF0cml4V29ybGQpLmludmVydCgpLm11bHRpcGx5KHRoaXMubGlnaHQubWF0cml4V29ybGQpKTp0aGlzLm1hdHJpeC5jb3B5KHRoaXMubGlnaHQubWF0cml4V29ybGQpLHRoaXMubWF0cml4V29ybGQuY29weSh0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKTtjb25zdCB0PXRoaXMubGlnaHQuZGlzdGFuY2U/dGhpcy5saWdodC5kaXN0YW5jZToxZTMsZT10Kk1hdGgudGFuKHRoaXMubGlnaHQuYW5nbGUpO3RoaXMuY29uZS5zY2FsZS5zZXQoZSxlLHQpLGV4LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCksdGhpcy5jb25lLmxvb2tBdChleCksdGhpcy5jb2xvciE9PXZvaWQgMD90aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOnRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpfX1jb25zdCB5cj1uZXcgSSxjdT1uZXcgQ3QsZGQ9bmV3IEN0O2NsYXNzIFdiIGV4dGVuZHMgd2l7Y29uc3RydWN0b3IodCl7Y29uc3QgZT1ueCh0KSxuPW5ldyBOdCxpPVtdLHM9W10sbz1uZXcgeXQoMCwwLDEpLGE9bmV3IHl0KDAsMSwwKTtmb3IobGV0IGw9MDtsPGUubGVuZ3RoO2wrKyl7Y29uc3QgdT1lW2xdO3UucGFyZW50JiZ1LnBhcmVudC5pc0JvbmUmJihpLnB1c2goMCwwLDApLGkucHVzaCgwLDAsMCkscy5wdXNoKG8ucixvLmcsby5iKSxzLnB1c2goYS5yLGEuZyxhLmIpKX1uLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyB2dChpLDMpKSxuLnNldEF0dHJpYnV0ZSgiY29sb3IiLG5ldyB2dChzLDMpKTtjb25zdCBjPW5ldyBhbih7dmVydGV4Q29sb3JzOiEwLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExLHRvbmVNYXBwZWQ6ITEsdHJhbnNwYXJlbnQ6ITB9KTtzdXBlcihuLGMpLHRoaXMuaXNTa2VsZXRvbkhlbHBlcj0hMCx0aGlzLnR5cGU9IlNrZWxldG9uSGVscGVyIix0aGlzLnJvb3Q9dCx0aGlzLmJvbmVzPWUsdGhpcy5tYXRyaXg9dC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITF9dXBkYXRlTWF0cml4V29ybGQodCl7Y29uc3QgZT10aGlzLmJvbmVzLG49dGhpcy5nZW9tZXRyeSxpPW4uZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2RkLmNvcHkodGhpcy5yb290Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKTtmb3IobGV0IHM9MCxvPTA7czxlLmxlbmd0aDtzKyspe2NvbnN0IGE9ZVtzXTthLnBhcmVudCYmYS5wYXJlbnQuaXNCb25lJiYoY3UubXVsdGlwbHlNYXRyaWNlcyhkZCxhLm1hdHJpeFdvcmxkKSx5ci5zZXRGcm9tTWF0cml4UG9zaXRpb24oY3UpLGkuc2V0WFlaKG8seXIueCx5ci55LHlyLnopLGN1Lm11bHRpcGx5TWF0cmljZXMoZGQsYS5wYXJlbnQubWF0cml4V29ybGQpLHlyLnNldEZyb21NYXRyaXhQb3NpdGlvbihjdSksaS5zZXRYWVoobysxLHlyLngseXIueSx5ci56KSxvKz0yKX1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5uZWVkc1VwZGF0ZT0hMCxzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KX1kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9fWZ1bmN0aW9uIG54KHIpe2NvbnN0IHQ9W107ci5pc0JvbmU9PT0hMCYmdC5wdXNoKHIpO2ZvcihsZXQgZT0wO2U8ci5jaGlsZHJlbi5sZW5ndGg7ZSsrKXQucHVzaCguLi5ueChyLmNoaWxkcmVuW2VdKSk7cmV0dXJuIHR9Y2xhc3MgWGIgZXh0ZW5kcyBMZXtjb25zdHJ1Y3Rvcih0LGUsbil7Y29uc3QgaT1uZXcgeGEoZSw0LDIpLHM9bmV3IHByKHt3aXJlZnJhbWU6ITAsZm9nOiExLHRvbmVNYXBwZWQ6ITF9KTtzdXBlcihpLHMpLHRoaXMubGlnaHQ9dCx0aGlzLmNvbG9yPW4sdGhpcy50eXBlPSJQb2ludExpZ2h0SGVscGVyIix0aGlzLm1hdHJpeD10aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX11cGRhdGUoKXt0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLmNvbG9yIT09dm9pZCAwP3RoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOnRoaXMubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKX19Y29uc3QgJGI9bmV3IEksaXg9bmV3IHl0LHJ4PW5ldyB5dDtjbGFzcyBxYiBleHRlbmRzIHNle2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcigpLHRoaXMubGlnaHQ9dCx0aGlzLm1hdHJpeD10Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmNvbG9yPW4sdGhpcy50eXBlPSJIZW1pc3BoZXJlTGlnaHRIZWxwZXIiO2NvbnN0IGk9bmV3IGdhKGUpO2kucm90YXRlWShNYXRoLlBJKi41KSx0aGlzLm1hdGVyaWFsPW5ldyBwcih7d2lyZWZyYW1lOiEwLGZvZzohMSx0b25lTWFwcGVkOiExfSksdGhpcy5jb2xvcj09PXZvaWQgMCYmKHRoaXMubWF0ZXJpYWwudmVydGV4Q29sb3JzPSEwKTtjb25zdCBzPWkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLG89bmV3IEZsb2F0MzJBcnJheShzLmNvdW50KjMpO2kuc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IEp0KG8sMykpLHRoaXMuYWRkKG5ldyBMZShpLHRoaXMubWF0ZXJpYWwpKSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmNoaWxkcmVuWzBdLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLmNoaWxkcmVuWzBdLm1hdGVyaWFsLmRpc3Bvc2UoKX11cGRhdGUoKXtjb25zdCB0PXRoaXMuY2hpbGRyZW5bMF07aWYodGhpcy5jb2xvciE9PXZvaWQgMCl0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTtlbHNle2NvbnN0IGU9dC5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoImNvbG9yIik7aXguY29weSh0aGlzLmxpZ2h0LmNvbG9yKSxyeC5jb3B5KHRoaXMubGlnaHQuZ3JvdW5kQ29sb3IpO2ZvcihsZXQgbj0wLGk9ZS5jb3VudDtuPGk7bisrKXtjb25zdCBzPW48aS8yP2l4OnJ4O2Uuc2V0WFlaKG4scy5yLHMuZyxzLmIpfWUubmVlZHNVcGRhdGU9ITB9dGhpcy5saWdodC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5sb29rQXQoJGIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQubWF0cml4V29ybGQpLm5lZ2F0ZSgpKX19Y2xhc3MgWWIgZXh0ZW5kcyB3aXtjb25zdHJ1Y3Rvcih0PTEwLGU9MTAsbj00NDczOTI0LGk9ODk0Nzg0OCl7bj1uZXcgeXQobiksaT1uZXcgeXQoaSk7Y29uc3Qgcz1lLzIsbz10L2UsYT10LzIsYz1bXSxsPVtdO2ZvcihsZXQgZj0wLGQ9MCxwPS1hO2Y8PWU7ZisrLHArPW8pe2MucHVzaCgtYSwwLHAsYSwwLHApLGMucHVzaChwLDAsLWEscCwwLGEpO2NvbnN0IHg9Zj09PXM/bjppO3gudG9BcnJheShsLGQpLGQrPTMseC50b0FycmF5KGwsZCksZCs9Myx4LnRvQXJyYXkobCxkKSxkKz0zLHgudG9BcnJheShsLGQpLGQrPTN9Y29uc3QgdT1uZXcgTnQ7dS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgdnQoYywzKSksdS5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgdnQobCwzKSk7Y29uc3QgaD1uZXcgYW4oe3ZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSk7c3VwZXIodSxoKSx0aGlzLnR5cGU9IkdyaWRIZWxwZXIifWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19Y2xhc3MgWmIgZXh0ZW5kcyB3aXtjb25zdHJ1Y3Rvcih0PTEwLGU9MTYsbj04LGk9NjQscz00NDczOTI0LG89ODk0Nzg0OCl7cz1uZXcgeXQocyksbz1uZXcgeXQobyk7Y29uc3QgYT1bXSxjPVtdO2lmKGU+MSlmb3IobGV0IGg9MDtoPGU7aCsrKXtjb25zdCBmPWgvZSooTWF0aC5QSSoyKSxkPU1hdGguc2luKGYpKnQscD1NYXRoLmNvcyhmKSp0O2EucHVzaCgwLDAsMCksYS5wdXNoKGQsMCxwKTtjb25zdCB4PWgmMT9zOm87Yy5wdXNoKHgucix4LmcseC5iKSxjLnB1c2goeC5yLHguZyx4LmIpfWZvcihsZXQgaD0wO2g8bjtoKyspe2NvbnN0IGY9aCYxP3M6byxkPXQtdC9uKmg7Zm9yKGxldCBwPTA7cDxpO3ArKyl7bGV0IHg9cC9pKihNYXRoLlBJKjIpLGc9TWF0aC5zaW4oeCkqZCxtPU1hdGguY29zKHgpKmQ7YS5wdXNoKGcsMCxtKSxjLnB1c2goZi5yLGYuZyxmLmIpLHg9KHArMSkvaSooTWF0aC5QSSoyKSxnPU1hdGguc2luKHgpKmQsbT1NYXRoLmNvcyh4KSpkLGEucHVzaChnLDAsbSksYy5wdXNoKGYucixmLmcsZi5iKX19Y29uc3QgbD1uZXcgTnQ7bC5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgdnQoYSwzKSksbC5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgdnQoYywzKSk7Y29uc3QgdT1uZXcgYW4oe3ZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSk7c3VwZXIobCx1KSx0aGlzLnR5cGU9IlBvbGFyR3JpZEhlbHBlciJ9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfX1jb25zdCBzeD1uZXcgSSxsdT1uZXcgSSxveD1uZXcgSTtjbGFzcyBKYiBleHRlbmRzIHNle2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcigpLHRoaXMubGlnaHQ9dCx0aGlzLm1hdHJpeD10Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmNvbG9yPW4sdGhpcy50eXBlPSJEaXJlY3Rpb25hbExpZ2h0SGVscGVyIixlPT09dm9pZCAwJiYoZT0xKTtsZXQgaT1uZXcgTnQ7aS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgdnQoWy1lLGUsMCxlLGUsMCxlLC1lLDAsLWUsLWUsMCwtZSxlLDBdLDMpKTtjb25zdCBzPW5ldyBhbih7Zm9nOiExLHRvbmVNYXBwZWQ6ITF9KTt0aGlzLmxpZ2h0UGxhbmU9bmV3IGdyKGkscyksdGhpcy5hZGQodGhpcy5saWdodFBsYW5lKSxpPW5ldyBOdCxpLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyB2dChbMCwwLDAsMCwwLDFdLDMpKSx0aGlzLnRhcmdldExpbmU9bmV3IGdyKGkscyksdGhpcy5hZGQodGhpcy50YXJnZXRMaW5lKSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCksdGhpcy50YXJnZXRMaW5lLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuZGlzcG9zZSgpfXVwZGF0ZSgpe3RoaXMubGlnaHQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubGlnaHQudGFyZ2V0LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxzeC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCksbHUuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKSxveC5zdWJWZWN0b3JzKGx1LHN4KSx0aGlzLmxpZ2h0UGxhbmUubG9va0F0KGx1KSx0aGlzLmNvbG9yIT09dm9pZCAwPyh0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcikpOih0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSksdGhpcy50YXJnZXRMaW5lLmxvb2tBdChsdSksdGhpcy50YXJnZXRMaW5lLnNjYWxlLno9b3gubGVuZ3RoKCl9fWNvbnN0IHV1PW5ldyBJLFRlPW5ldyBwbDtjbGFzcyBLYiBleHRlbmRzIHdpe2NvbnN0cnVjdG9yKHQpe2NvbnN0IGU9bmV3IE50LG49bmV3IGFuKHtjb2xvcjoxNjc3NzIxNSx2ZXJ0ZXhDb2xvcnM6ITAsdG9uZU1hcHBlZDohMX0pLGk9W10scz1bXSxvPXt9O2EoIm4xIiwibjIiKSxhKCJuMiIsIm40IiksYSgibjQiLCJuMyIpLGEoIm4zIiwibjEiKSxhKCJmMSIsImYyIiksYSgiZjIiLCJmNCIpLGEoImY0IiwiZjMiKSxhKCJmMyIsImYxIiksYSgibjEiLCJmMSIpLGEoIm4yIiwiZjIiKSxhKCJuMyIsImYzIiksYSgibjQiLCJmNCIpLGEoInAiLCJuMSIpLGEoInAiLCJuMiIpLGEoInAiLCJuMyIpLGEoInAiLCJuNCIpLGEoInUxIiwidTIiKSxhKCJ1MiIsInUzIiksYSgidTMiLCJ1MSIpLGEoImMiLCJ0IiksYSgicCIsImMiKSxhKCJjbjEiLCJjbjIiKSxhKCJjbjMiLCJjbjQiKSxhKCJjZjEiLCJjZjIiKSxhKCJjZjMiLCJjZjQiKTtmdW5jdGlvbiBhKHAseCl7YyhwKSxjKHgpfWZ1bmN0aW9uIGMocCl7aS5wdXNoKDAsMCwwKSxzLnB1c2goMCwwLDApLG9bcF09PT12b2lkIDAmJihvW3BdPVtdKSxvW3BdLnB1c2goaS5sZW5ndGgvMy0xKX1lLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyB2dChpLDMpKSxlLnNldEF0dHJpYnV0ZSgiY29sb3IiLG5ldyB2dChzLDMpKSxzdXBlcihlLG4pLHRoaXMudHlwZT0iQ2FtZXJhSGVscGVyIix0aGlzLmNhbWVyYT10LHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgmJnRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSx0aGlzLm1hdHJpeD10Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLnBvaW50TWFwPW8sdGhpcy51cGRhdGUoKTtjb25zdCBsPW5ldyB5dCgxNjc1NTIwMCksdT1uZXcgeXQoMTY3MTE2ODApLGg9bmV3IHl0KDQzNzc1KSxmPW5ldyB5dCgxNjc3NzIxNSksZD1uZXcgeXQoMzM1NTQ0Myk7dGhpcy5zZXRDb2xvcnMobCx1LGgsZixkKX1zZXRDb2xvcnModCxlLG4saSxzKXtjb25zdCBhPXRoaXMuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJjb2xvciIpO2Euc2V0WFlaKDAsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDEsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDIsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDMsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDQsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDUsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDYsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDcsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDgsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDksdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDEwLHQucix0LmcsdC5iKSxhLnNldFhZWigxMSx0LnIsdC5nLHQuYiksYS5zZXRYWVooMTIsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDEzLHQucix0LmcsdC5iKSxhLnNldFhZWigxNCx0LnIsdC5nLHQuYiksYS5zZXRYWVooMTUsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDE2LHQucix0LmcsdC5iKSxhLnNldFhZWigxNyx0LnIsdC5nLHQuYiksYS5zZXRYWVooMTgsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDE5LHQucix0LmcsdC5iKSxhLnNldFhZWigyMCx0LnIsdC5nLHQuYiksYS5zZXRYWVooMjEsdC5yLHQuZyx0LmIpLGEuc2V0WFlaKDIyLHQucix0LmcsdC5iKSxhLnNldFhZWigyMyx0LnIsdC5nLHQuYiksYS5zZXRYWVooMjQsZS5yLGUuZyxlLmIpLGEuc2V0WFlaKDI1LGUucixlLmcsZS5iKSxhLnNldFhZWigyNixlLnIsZS5nLGUuYiksYS5zZXRYWVooMjcsZS5yLGUuZyxlLmIpLGEuc2V0WFlaKDI4LGUucixlLmcsZS5iKSxhLnNldFhZWigyOSxlLnIsZS5nLGUuYiksYS5zZXRYWVooMzAsZS5yLGUuZyxlLmIpLGEuc2V0WFlaKDMxLGUucixlLmcsZS5iKSxhLnNldFhZWigzMixuLnIsbi5nLG4uYiksYS5zZXRYWVooMzMsbi5yLG4uZyxuLmIpLGEuc2V0WFlaKDM0LG4ucixuLmcsbi5iKSxhLnNldFhZWigzNSxuLnIsbi5nLG4uYiksYS5zZXRYWVooMzYsbi5yLG4uZyxuLmIpLGEuc2V0WFlaKDM3LG4ucixuLmcsbi5iKSxhLnNldFhZWigzOCxpLnIsaS5nLGkuYiksYS5zZXRYWVooMzksaS5yLGkuZyxpLmIpLGEuc2V0WFlaKDQwLHMucixzLmcscy5iKSxhLnNldFhZWig0MSxzLnIscy5nLHMuYiksYS5zZXRYWVooNDIscy5yLHMuZyxzLmIpLGEuc2V0WFlaKDQzLHMucixzLmcscy5iKSxhLnNldFhZWig0NCxzLnIscy5nLHMuYiksYS5zZXRYWVooNDUscy5yLHMuZyxzLmIpLGEuc2V0WFlaKDQ2LHMucixzLmcscy5iKSxhLnNldFhZWig0NyxzLnIscy5nLHMuYiksYS5zZXRYWVooNDgscy5yLHMuZyxzLmIpLGEuc2V0WFlaKDQ5LHMucixzLmcscy5iKSxhLm5lZWRzVXBkYXRlPSEwfXVwZGF0ZSgpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeSxlPXRoaXMucG9pbnRNYXAsbj0xLGk9MTtUZS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKTtjb25zdCBzPXRoaXMuY2FtZXJhLmNvb3JkaW5hdGVTeXN0ZW09PT1Ibj8tMTowO0RlKCJjIixlLHQsVGUsMCwwLHMpLERlKCJ0IixlLHQsVGUsMCwwLDEpLERlKCJuMSIsZSx0LFRlLC0xLC0xLHMpLERlKCJuMiIsZSx0LFRlLG4sLTEscyksRGUoIm4zIixlLHQsVGUsLTEsaSxzKSxEZSgibjQiLGUsdCxUZSxuLGkscyksRGUoImYxIixlLHQsVGUsLTEsLTEsMSksRGUoImYyIixlLHQsVGUsbiwtMSwxKSxEZSgiZjMiLGUsdCxUZSwtMSxpLDEpLERlKCJmNCIsZSx0LFRlLG4saSwxKSxEZSgidTEiLGUsdCxUZSxuKi43LGkqMS4xLHMpLERlKCJ1MiIsZSx0LFRlLC0xKi43LGkqMS4xLHMpLERlKCJ1MyIsZSx0LFRlLDAsaSoyLHMpLERlKCJjZjEiLGUsdCxUZSwtMSwwLDEpLERlKCJjZjIiLGUsdCxUZSxuLDAsMSksRGUoImNmMyIsZSx0LFRlLDAsLTEsMSksRGUoImNmNCIsZSx0LFRlLDAsaSwxKSxEZSgiY24xIixlLHQsVGUsLTEsMCxzKSxEZSgiY24yIixlLHQsVGUsbiwwLHMpLERlKCJjbjMiLGUsdCxUZSwwLC0xLHMpLERlKCJjbjQiLGUsdCxUZSwwLGkscyksdC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikubmVlZHNVcGRhdGU9ITB9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfX1mdW5jdGlvbiBEZShyLHQsZSxuLGkscyxvKXt1dS5zZXQoaSxzLG8pLnVucHJvamVjdChuKTtjb25zdCBhPXRbcl07aWYoYSE9PXZvaWQgMCl7Y29uc3QgYz1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtmb3IobGV0IGw9MCx1PWEubGVuZ3RoO2w8dTtsKyspYy5zZXRYWVooYVtsXSx1dS54LHV1LnksdXUueil9fWNvbnN0IGh1PW5ldyBsZTtjbGFzcyBqYiBleHRlbmRzIHdpe2NvbnN0cnVjdG9yKHQsZT0xNjc3Njk2MCl7Y29uc3Qgbj1uZXcgVWludDE2QXJyYXkoWzAsMSwxLDIsMiwzLDMsMCw0LDUsNSw2LDYsNyw3LDQsMCw0LDEsNSwyLDYsMyw3XSksaT1uZXcgRmxvYXQzMkFycmF5KDgqMykscz1uZXcgTnQ7cy5zZXRJbmRleChuZXcgSnQobiwxKSkscy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgSnQoaSwzKSksc3VwZXIocyxuZXcgYW4oe2NvbG9yOmUsdG9uZU1hcHBlZDohMX0pKSx0aGlzLm9iamVjdD10LHRoaXMudHlwZT0iQm94SGVscGVyIix0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy51cGRhdGUoKX11cGRhdGUoKXtpZih0aGlzLm9iamVjdCE9PXZvaWQgMCYmaHUuc2V0RnJvbU9iamVjdCh0aGlzLm9iamVjdCksaHUuaXNFbXB0eSgpKXJldHVybjtjb25zdCB0PWh1Lm1pbixlPWh1Lm1heCxuPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixpPW4uYXJyYXk7aVswXT1lLngsaVsxXT1lLnksaVsyXT1lLnosaVszXT10LngsaVs0XT1lLnksaVs1XT1lLnosaVs2XT10LngsaVs3XT10LnksaVs4XT1lLnosaVs5XT1lLngsaVsxMF09dC55LGlbMTFdPWUueixpWzEyXT1lLngsaVsxM109ZS55LGlbMTRdPXQueixpWzE1XT10LngsaVsxNl09ZS55LGlbMTddPXQueixpWzE4XT10LngsaVsxOV09dC55LGlbMjBdPXQueixpWzIxXT1lLngsaVsyMl09dC55LGlbMjNdPXQueixuLm5lZWRzVXBkYXRlPSEwLHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl9c2V0RnJvbU9iamVjdCh0KXtyZXR1cm4gdGhpcy5vYmplY3Q9dCx0aGlzLnVwZGF0ZSgpLHRoaXN9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5vYmplY3Q9dC5vYmplY3QsdGhpc31kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9fWNsYXNzIFFiIGV4dGVuZHMgd2l7Y29uc3RydWN0b3IodCxlPTE2Nzc2OTYwKXtjb25zdCBuPW5ldyBVaW50MTZBcnJheShbMCwxLDEsMiwyLDMsMywwLDQsNSw1LDYsNiw3LDcsNCwwLDQsMSw1LDIsNiwzLDddKSxpPVsxLDEsMSwtMSwxLDEsLTEsLTEsMSwxLC0xLDEsMSwxLC0xLC0xLDEsLTEsLTEsLTEsLTEsMSwtMSwtMV0scz1uZXcgTnQ7cy5zZXRJbmRleChuZXcgSnQobiwxKSkscy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgdnQoaSwzKSksc3VwZXIocyxuZXcgYW4oe2NvbG9yOmUsdG9uZU1hcHBlZDohMX0pKSx0aGlzLmJveD10LHRoaXMudHlwZT0iQm94M0hlbHBlciIsdGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKX11cGRhdGVNYXRyaXhXb3JsZCh0KXtjb25zdCBlPXRoaXMuYm94O2UuaXNFbXB0eSgpfHwoZS5nZXRDZW50ZXIodGhpcy5wb3NpdGlvbiksZS5nZXRTaXplKHRoaXMuc2NhbGUpLHRoaXMuc2NhbGUubXVsdGlwbHlTY2FsYXIoLjUpLHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpKX1kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9fWNsYXNzIHQxIGV4dGVuZHMgZ3J7Y29uc3RydWN0b3IodCxlPTEsbj0xNjc3Njk2MCl7Y29uc3QgaT1uLHM9WzEsLTEsMCwtMSwxLDAsLTEsLTEsMCwxLDEsMCwtMSwxLDAsLTEsLTEsMCwxLC0xLDAsMSwxLDBdLG89bmV3IE50O28uc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHZ0KHMsMykpLG8uY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksc3VwZXIobyxuZXcgYW4oe2NvbG9yOmksdG9uZU1hcHBlZDohMX0pKSx0aGlzLnR5cGU9IlBsYW5lSGVscGVyIix0aGlzLnBsYW5lPXQsdGhpcy5zaXplPWU7Y29uc3QgYT1bMSwxLDAsLTEsMSwwLC0xLC0xLDAsMSwxLDAsLTEsLTEsMCwxLC0xLDBdLGM9bmV3IE50O2Muc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHZ0KGEsMykpLGMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpcy5hZGQobmV3IExlKGMsbmV3IHByKHtjb2xvcjppLG9wYWNpdHk6LjIsdHJhbnNwYXJlbnQ6ITAsZGVwdGhXcml0ZTohMSx0b25lTWFwcGVkOiExfSkpKX11cGRhdGVNYXRyaXhXb3JsZCh0KXt0aGlzLnBvc2l0aW9uLnNldCgwLDAsMCksdGhpcy5zY2FsZS5zZXQoLjUqdGhpcy5zaXplLC41KnRoaXMuc2l6ZSwxKSx0aGlzLmxvb2tBdCh0aGlzLnBsYW5lLm5vcm1hbCksdGhpcy50cmFuc2xhdGVaKC10aGlzLnBsYW5lLmNvbnN0YW50KSxzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KX1kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCksdGhpcy5jaGlsZHJlblswXS5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCl9fWNvbnN0IGF4PW5ldyBJO2xldCBmdSxwZDtjbGFzcyBlMSBleHRlbmRzIHNle2NvbnN0cnVjdG9yKHQ9bmV3IEkoMCwwLDEpLGU9bmV3IEkoMCwwLDApLG49MSxpPTE2Nzc2OTYwLHM9biouMixvPXMqLjIpe3N1cGVyKCksdGhpcy50eXBlPSJBcnJvd0hlbHBlciIsZnU9PT12b2lkIDAmJihmdT1uZXcgTnQsZnUuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHZ0KFswLDAsMCwwLDEsMF0sMykpLHBkPW5ldyBsYSguNSwxLDUsMSkscGQudHJhbnNsYXRlKDAsLS41LDApKSx0aGlzLnBvc2l0aW9uLmNvcHkoZSksdGhpcy5saW5lPW5ldyBncihmdSxuZXcgYW4oe2NvbG9yOmksdG9uZU1hcHBlZDohMX0pKSx0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmFkZCh0aGlzLmxpbmUpLHRoaXMuY29uZT1uZXcgTGUocGQsbmV3IHByKHtjb2xvcjppLHRvbmVNYXBwZWQ6ITF9KSksdGhpcy5jb25lLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5hZGQodGhpcy5jb25lKSx0aGlzLnNldERpcmVjdGlvbih0KSx0aGlzLnNldExlbmd0aChuLHMsbyl9c2V0RGlyZWN0aW9uKHQpe2lmKHQueT4uOTk5OTkpdGhpcy5xdWF0ZXJuaW9uLnNldCgwLDAsMCwxKTtlbHNlIGlmKHQueTwtLjk5OTk5KXRoaXMucXVhdGVybmlvbi5zZXQoMSwwLDAsMCk7ZWxzZXtheC5zZXQodC56LDAsLXQueCkubm9ybWFsaXplKCk7Y29uc3QgZT1NYXRoLmFjb3ModC55KTt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZShheCxlKX19c2V0TGVuZ3RoKHQsZT10Ki4yLG49ZSouMil7dGhpcy5saW5lLnNjYWxlLnNldCgxLE1hdGgubWF4KDFlLTQsdC1lKSwxKSx0aGlzLmxpbmUudXBkYXRlTWF0cml4KCksdGhpcy5jb25lLnNjYWxlLnNldChuLGUsbiksdGhpcy5jb25lLnBvc2l0aW9uLnk9dCx0aGlzLmNvbmUudXBkYXRlTWF0cml4KCl9c2V0Q29sb3IodCl7dGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLnNldCh0KSx0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCwhMSksdGhpcy5saW5lLmNvcHkodC5saW5lKSx0aGlzLmNvbmUuY29weSh0LmNvbmUpLHRoaXN9ZGlzcG9zZSgpe3RoaXMubGluZS5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5saW5lLm1hdGVyaWFsLmRpc3Bvc2UoKSx0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCl9fWNsYXNzIG4xIGV4dGVuZHMgd2l7Y29uc3RydWN0b3IodD0xKXtjb25zdCBlPVswLDAsMCx0LDAsMCwwLDAsMCwwLHQsMCwwLDAsMCwwLDAsdF0sbj1bMSwwLDAsMSwuNiwwLDAsMSwwLC42LDEsMCwwLDAsMSwwLC42LDFdLGk9bmV3IE50O2kuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHZ0KGUsMykpLGkuc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IHZ0KG4sMykpO2NvbnN0IHM9bmV3IGFuKHt2ZXJ0ZXhDb2xvcnM6ITAsdG9uZU1hcHBlZDohMX0pO3N1cGVyKGkscyksdGhpcy50eXBlPSJBeGVzSGVscGVyIn1zZXRDb2xvcnModCxlLG4pe2NvbnN0IGk9bmV3IHl0LHM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yLmFycmF5O3JldHVybiBpLnNldCh0KSxpLnRvQXJyYXkocywwKSxpLnRvQXJyYXkocywzKSxpLnNldChlKSxpLnRvQXJyYXkocyw2KSxpLnRvQXJyYXkocyw5KSxpLnNldChuKSxpLnRvQXJyYXkocywxMiksaS50b0FycmF5KHMsMTUpLHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5uZWVkc1VwZGF0ZT0hMCx0aGlzfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19Y2xhc3MgaTF7Y29uc3RydWN0b3IoKXt0aGlzLnR5cGU9IlNoYXBlUGF0aCIsdGhpcy5jb2xvcj1uZXcgeXQsdGhpcy5zdWJQYXRocz1bXSx0aGlzLmN1cnJlbnRQYXRoPW51bGx9bW92ZVRvKHQsZSl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGg9bmV3IHFsLHRoaXMuc3ViUGF0aHMucHVzaCh0aGlzLmN1cnJlbnRQYXRoKSx0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyh0LGUpLHRoaXN9bGluZVRvKHQsZSl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGgubGluZVRvKHQsZSksdGhpc31xdWFkcmF0aWNDdXJ2ZVRvKHQsZSxuLGkpe3JldHVybiB0aGlzLmN1cnJlbnRQYXRoLnF1YWRyYXRpY0N1cnZlVG8odCxlLG4saSksdGhpc31iZXppZXJDdXJ2ZVRvKHQsZSxuLGkscyxvKXtyZXR1cm4gdGhpcy5jdXJyZW50UGF0aC5iZXppZXJDdXJ2ZVRvKHQsZSxuLGkscyxvKSx0aGlzfXNwbGluZVRocnUodCl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGguc3BsaW5lVGhydSh0KSx0aGlzfXRvU2hhcGVzKHQpe2Z1bmN0aW9uIGUobSl7Y29uc3Qgdj1bXTtmb3IobGV0IHk9MCxfPW0ubGVuZ3RoO3k8Xzt5Kyspe2NvbnN0IFM9bVt5XSx3PW5ldyBWaTt3LmN1cnZlcz1TLmN1cnZlcyx2LnB1c2godyl9cmV0dXJuIHZ9ZnVuY3Rpb24gbihtLHYpe2NvbnN0IHk9di5sZW5ndGg7bGV0IF89ITE7Zm9yKGxldCBTPXktMSx3PTA7dzx5O1M9dysrKXtsZXQgQT12W1NdLFQ9dlt3XSxiPVQueC1BLngsTT1ULnktQS55O2lmKE1hdGguYWJzKE0pPk51bWJlci5FUFNJTE9OKXtpZihNPDAmJihBPXZbd10sYj0tYixUPXZbU10sTT0tTSksbS55PEEueXx8bS55PlQueSljb250aW51ZTtpZihtLnk9PT1BLnkpe2lmKG0ueD09PUEueClyZXR1cm4hMH1lbHNle2NvbnN0IEU9TSoobS54LUEueCktYioobS55LUEueSk7aWYoRT09PTApcmV0dXJuITA7aWYoRTwwKWNvbnRpbnVlO189IV99fWVsc2V7aWYobS55IT09QS55KWNvbnRpbnVlO2lmKFQueDw9bS54JiZtLng8PUEueHx8QS54PD1tLngmJm0ueDw9VC54KXJldHVybiEwfX1yZXR1cm4gX31jb25zdCBpPWNuLmlzQ2xvY2tXaXNlLHM9dGhpcy5zdWJQYXRocztpZihzLmxlbmd0aD09PTApcmV0dXJuW107bGV0IG8sYSxjO2NvbnN0IGw9W107aWYocy5sZW5ndGg9PT0xKXJldHVybiBhPXNbMF0sYz1uZXcgVmksYy5jdXJ2ZXM9YS5jdXJ2ZXMsbC5wdXNoKGMpLGw7bGV0IHU9IWkoc1swXS5nZXRQb2ludHMoKSk7dT10PyF1OnU7Y29uc3QgaD1bXSxmPVtdO2xldCBkPVtdLHA9MCx4O2ZbcF09dm9pZCAwLGRbcF09W107Zm9yKGxldCBtPTAsdj1zLmxlbmd0aDttPHY7bSsrKWE9c1ttXSx4PWEuZ2V0UG9pbnRzKCksbz1pKHgpLG89dD8hbzpvLG8/KCF1JiZmW3BdJiZwKyssZltwXT17czpuZXcgVmkscDp4fSxmW3BdLnMuY3VydmVzPWEuY3VydmVzLHUmJnArKyxkW3BdPVtdKTpkW3BdLnB1c2goe2g6YSxwOnhbMF19KTtpZighZlswXSlyZXR1cm4gZShzKTtpZihmLmxlbmd0aD4xKXtsZXQgbT0hMSx2PTA7Zm9yKGxldCB5PTAsXz1mLmxlbmd0aDt5PF87eSsrKWhbeV09W107Zm9yKGxldCB5PTAsXz1mLmxlbmd0aDt5PF87eSsrKXtjb25zdCBTPWRbeV07Zm9yKGxldCB3PTA7dzxTLmxlbmd0aDt3Kyspe2NvbnN0IEE9U1t3XTtsZXQgVD0hMDtmb3IobGV0IGI9MDtiPGYubGVuZ3RoO2IrKyluKEEucCxmW2JdLnApJiYoeSE9PWImJnYrKyxUPyhUPSExLGhbYl0ucHVzaChBKSk6bT0hMCk7VCYmaFt5XS5wdXNoKEEpfX12PjAmJm09PT0hMSYmKGQ9aCl9bGV0IGc7Zm9yKGxldCBtPTAsdj1mLmxlbmd0aDttPHY7bSsrKXtjPWZbbV0ucyxsLnB1c2goYyksZz1kW21dO2ZvcihsZXQgeT0wLF89Zy5sZW5ndGg7eTxfO3krKyljLmhvbGVzLnB1c2goZ1t5XS5oKX1yZXR1cm4gbH19Y2xhc3MgcjEgZXh0ZW5kcyB5aXtjb25zdHJ1Y3Rvcih0LGU9bnVsbCl7c3VwZXIoKSx0aGlzLm9iamVjdD10LHRoaXMuZG9tRWxlbWVudD1lLHRoaXMuZW5hYmxlZD0hMCx0aGlzLnN0YXRlPS0xLHRoaXMua2V5cz17fSx0aGlzLm1vdXNlQnV0dG9ucz17TEVGVDpudWxsLE1JRERMRTpudWxsLFJJR0hUOm51bGx9LHRoaXMudG91Y2hlcz17T05FOm51bGwsVFdPOm51bGx9fWNvbm5lY3QodCl7aWYodD09PXZvaWQgMCl7Y29uc29sZS53YXJuKCJUSFJFRS5Db250cm9sczogY29ubmVjdCgpIG5vdyByZXF1aXJlcyBhbiBlbGVtZW50LiIpO3JldHVybn10aGlzLmRvbUVsZW1lbnQhPT1udWxsJiZ0aGlzLmRpc2Nvbm5lY3QoKSx0aGlzLmRvbUVsZW1lbnQ9dH1kaXNjb25uZWN0KCl7fWRpc3Bvc2UoKXt9dXBkYXRlKCl7fX1mdW5jdGlvbiBzMShyLHQpe2NvbnN0IGU9ci5pbWFnZSYmci5pbWFnZS53aWR0aD9yLmltYWdlLndpZHRoL3IuaW1hZ2UuaGVpZ2h0OjE7cmV0dXJuIGU+dD8oci5yZXBlYXQueD0xLHIucmVwZWF0Lnk9ZS90LHIub2Zmc2V0Lng9MCxyLm9mZnNldC55PSgxLXIucmVwZWF0LnkpLzIpOihyLnJlcGVhdC54PXQvZSxyLnJlcGVhdC55PTEsci5vZmZzZXQueD0oMS1yLnJlcGVhdC54KS8yLHIub2Zmc2V0Lnk9MCkscn1mdW5jdGlvbiBvMShyLHQpe2NvbnN0IGU9ci5pbWFnZSYmci5pbWFnZS53aWR0aD9yLmltYWdlLndpZHRoL3IuaW1hZ2UuaGVpZ2h0OjE7cmV0dXJuIGU+dD8oci5yZXBlYXQueD10L2Usci5yZXBlYXQueT0xLHIub2Zmc2V0Lng9KDEtci5yZXBlYXQueCkvMixyLm9mZnNldC55PTApOihyLnJlcGVhdC54PTEsci5yZXBlYXQueT1lL3Qsci5vZmZzZXQueD0wLHIub2Zmc2V0Lnk9KDEtci5yZXBlYXQueSkvMikscn1mdW5jdGlvbiBhMShyKXtyZXR1cm4gci5yZXBlYXQueD0xLHIucmVwZWF0Lnk9MSxyLm9mZnNldC54PTAsci5vZmZzZXQueT0wLHJ9ZnVuY3Rpb24gbWQocix0LGUsbil7Y29uc3QgaT1jMShuKTtzd2l0Y2goZSl7Y2FzZSBaaDpyZXR1cm4gcip0O2Nhc2UgZ2M6cmV0dXJuIHIqdC9pLmNvbXBvbmVudHMqaS5ieXRlTGVuZ3RoO2Nhc2UgTm86cmV0dXJuIHIqdC9pLmNvbXBvbmVudHMqaS5ieXRlTGVuZ3RoO2Nhc2UgS2g6cmV0dXJuIHIqdCoyL2kuY29tcG9uZW50cyppLmJ5dGVMZW5ndGg7Y2FzZSB4YzpyZXR1cm4gcip0KjIvaS5jb21wb25lbnRzKmkuYnl0ZUxlbmd0aDtjYXNlIEpoOnJldHVybiByKnQqMy9pLmNvbXBvbmVudHMqaS5ieXRlTGVuZ3RoO2Nhc2Ugbm46cmV0dXJuIHIqdCo0L2kuY29tcG9uZW50cyppLmJ5dGVMZW5ndGg7Y2FzZSBfYzpyZXR1cm4gcip0KjQvaS5jb21wb25lbnRzKmkuYnl0ZUxlbmd0aDtjYXNlIEZvOmNhc2UgQm86cmV0dXJuIE1hdGguZmxvb3IoKHIrMykvNCkqTWF0aC5mbG9vcigodCszKS80KSo4O2Nhc2UgT286Y2FzZSB6bzpyZXR1cm4gTWF0aC5mbG9vcigociszKS80KSpNYXRoLmZsb29yKCh0KzMpLzQpKjE2O2Nhc2UgdmM6Y2FzZSBTYzpyZXR1cm4gTWF0aC5tYXgociwxNikqTWF0aC5tYXgodCw4KS80O2Nhc2UgeWM6Y2FzZSBNYzpyZXR1cm4gTWF0aC5tYXgociw4KSpNYXRoLm1heCh0LDgpLzI7Y2FzZSBiYzpjYXNlIHdjOnJldHVybiBNYXRoLmZsb29yKChyKzMpLzQpKk1hdGguZmxvb3IoKHQrMykvNCkqODtjYXNlIEFjOnJldHVybiBNYXRoLmZsb29yKChyKzMpLzQpKk1hdGguZmxvb3IoKHQrMykvNCkqMTY7Y2FzZSBUYzpyZXR1cm4gTWF0aC5mbG9vcigociszKS80KSpNYXRoLmZsb29yKCh0KzMpLzQpKjE2O2Nhc2UgRWM6cmV0dXJuIE1hdGguZmxvb3IoKHIrNCkvNSkqTWF0aC5mbG9vcigodCszKS80KSoxNjtjYXNlIENjOnJldHVybiBNYXRoLmZsb29yKChyKzQpLzUpKk1hdGguZmxvb3IoKHQrNCkvNSkqMTY7Y2FzZSBSYzpyZXR1cm4gTWF0aC5mbG9vcigocis1KS82KSpNYXRoLmZsb29yKCh0KzQpLzUpKjE2O2Nhc2UgSWM6cmV0dXJuIE1hdGguZmxvb3IoKHIrNSkvNikqTWF0aC5mbG9vcigodCs1KS82KSoxNjtjYXNlIFBjOnJldHVybiBNYXRoLmZsb29yKChyKzcpLzgpKk1hdGguZmxvb3IoKHQrNCkvNSkqMTY7Y2FzZSBMYzpyZXR1cm4gTWF0aC5mbG9vcigocis3KS84KSpNYXRoLmZsb29yKCh0KzUpLzYpKjE2O2Nhc2UgRGM6cmV0dXJuIE1hdGguZmxvb3IoKHIrNykvOCkqTWF0aC5mbG9vcigodCs3KS84KSoxNjtjYXNlIFVjOnJldHVybiBNYXRoLmZsb29yKChyKzkpLzEwKSpNYXRoLmZsb29yKCh0KzQpLzUpKjE2O2Nhc2UgTmM6cmV0dXJuIE1hdGguZmxvb3IoKHIrOSkvMTApKk1hdGguZmxvb3IoKHQrNSkvNikqMTY7Y2FzZSBGYzpyZXR1cm4gTWF0aC5mbG9vcigocis5KS8xMCkqTWF0aC5mbG9vcigodCs3KS84KSoxNjtjYXNlIEJjOnJldHVybiBNYXRoLmZsb29yKChyKzkpLzEwKSpNYXRoLmZsb29yKCh0KzkpLzEwKSoxNjtjYXNlIE9jOnJldHVybiBNYXRoLmZsb29yKChyKzExKS8xMikqTWF0aC5mbG9vcigodCs5KS8xMCkqMTY7Y2FzZSB6YzpyZXR1cm4gTWF0aC5mbG9vcigocisxMSkvMTIpKk1hdGguZmxvb3IoKHQrMTEpLzEyKSoxNjtjYXNlIGtvOmNhc2Uga2M6Y2FzZSBWYzpyZXR1cm4gTWF0aC5jZWlsKHIvNCkqTWF0aC5jZWlsKHQvNCkqMTY7Y2FzZSBqaDpjYXNlIEdjOnJldHVybiBNYXRoLmNlaWwoci80KSpNYXRoLmNlaWwodC80KSo4O2Nhc2UgSGM6Y2FzZSBXYzpyZXR1cm4gTWF0aC5jZWlsKHIvNCkqTWF0aC5jZWlsKHQvNCkqMTZ9dGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZGV0ZXJtaW5lIHRleHR1cmUgYnl0ZSBsZW5ndGggZm9yICR7ZX0gZm9ybWF0LmApfWZ1bmN0aW9uIGMxKHIpe3N3aXRjaChyKXtjYXNlIG5pOmNhc2UgJGg6cmV0dXJue2J5dGVMZW5ndGg6MSxjb21wb25lbnRzOjF9O2Nhc2UgQXM6Y2FzZSBxaDpjYXNlIFRzOnJldHVybntieXRlTGVuZ3RoOjIsY29tcG9uZW50czoxfTtjYXNlIHBjOmNhc2UgbWM6cmV0dXJue2J5dGVMZW5ndGg6Mixjb21wb25lbnRzOjR9O2Nhc2UgTGk6Y2FzZSBkYzpjYXNlIHhuOnJldHVybntieXRlTGVuZ3RoOjQsY29tcG9uZW50czoxfTtjYXNlIFloOnJldHVybntieXRlTGVuZ3RoOjQsY29tcG9uZW50czozfX10aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdGV4dHVyZSB0eXBlICR7cn0uYCl9Y2xhc3MgbDF7c3RhdGljIGNvbnRhaW4odCxlKXtyZXR1cm4gczEodCxlKX1zdGF0aWMgY292ZXIodCxlKXtyZXR1cm4gbzEodCxlKX1zdGF0aWMgZmlsbCh0KXtyZXR1cm4gYTEodCl9c3RhdGljIGdldEJ5dGVMZW5ndGgodCxlLG4saSl7cmV0dXJuIG1kKHQsZSxuLGkpfX10eXBlb2YgX19USFJFRV9ERVZUT09MU19fIT0idW5kZWZpbmVkIiYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJyZWdpc3RlciIse2RldGFpbDp7cmV2aXNpb246dGV9fSkpLHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiYod2luZG93Ll9fVEhSRUVfXz9jb25zb2xlLndhcm4oIldBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4iKTp3aW5kb3cuX19USFJFRV9fPXRlKTsvKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IDIwMTAtMjAyNSBUaHJlZS5qcyBBdXRob3JzCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICovZnVuY3Rpb24gY3goKXtsZXQgcj1udWxsLHQ9ITEsZT1udWxsLG49bnVsbDtmdW5jdGlvbiBpKHMsbyl7ZShzLG8pLG49ci5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSl9cmV0dXJue3N0YXJ0OmZ1bmN0aW9uKCl7dCE9PSEwJiZlIT09bnVsbCYmKG49ci5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSksdD0hMCl9LHN0b3A6ZnVuY3Rpb24oKXtyLmNhbmNlbEFuaW1hdGlvbkZyYW1lKG4pLHQ9ITF9LHNldEFuaW1hdGlvbkxvb3A6ZnVuY3Rpb24ocyl7ZT1zfSxzZXRDb250ZXh0OmZ1bmN0aW9uKHMpe3I9c319fWZ1bmN0aW9uIHUxKHIpe2NvbnN0IHQ9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gZShhLGMpe2NvbnN0IGw9YS5hcnJheSx1PWEudXNhZ2UsaD1sLmJ5dGVMZW5ndGgsZj1yLmNyZWF0ZUJ1ZmZlcigpO3IuYmluZEJ1ZmZlcihjLGYpLHIuYnVmZmVyRGF0YShjLGwsdSksYS5vblVwbG9hZENhbGxiYWNrKCk7bGV0IGQ7aWYobCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSlkPXIuRkxPQVQ7ZWxzZSBpZihsIGluc3RhbmNlb2YgVWludDE2QXJyYXkpYS5pc0Zsb2F0MTZCdWZmZXJBdHRyaWJ1dGU/ZD1yLkhBTEZfRkxPQVQ6ZD1yLlVOU0lHTkVEX1NIT1JUO2Vsc2UgaWYobCBpbnN0YW5jZW9mIEludDE2QXJyYXkpZD1yLlNIT1JUO2Vsc2UgaWYobCBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KWQ9ci5VTlNJR05FRF9JTlQ7ZWxzZSBpZihsIGluc3RhbmNlb2YgSW50MzJBcnJheSlkPXIuSU5UO2Vsc2UgaWYobCBpbnN0YW5jZW9mIEludDhBcnJheSlkPXIuQllURTtlbHNlIGlmKGwgaW5zdGFuY2VvZiBVaW50OEFycmF5KWQ9ci5VTlNJR05FRF9CWVRFO2Vsc2UgaWYobCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KWQ9ci5VTlNJR05FRF9CWVRFO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTEF0dHJpYnV0ZXM6IFVuc3VwcG9ydGVkIGJ1ZmZlciBkYXRhIGZvcm1hdDogIitsKTtyZXR1cm57YnVmZmVyOmYsdHlwZTpkLGJ5dGVzUGVyRWxlbWVudDpsLkJZVEVTX1BFUl9FTEVNRU5ULHZlcnNpb246YS52ZXJzaW9uLHNpemU6aH19ZnVuY3Rpb24gbihhLGMsbCl7Y29uc3QgdT1jLmFycmF5LGg9Yy51cGRhdGVSYW5nZXM7aWYoci5iaW5kQnVmZmVyKGwsYSksaC5sZW5ndGg9PT0wKXIuYnVmZmVyU3ViRGF0YShsLDAsdSk7ZWxzZXtoLnNvcnQoKGQscCk9PmQuc3RhcnQtcC5zdGFydCk7bGV0IGY9MDtmb3IobGV0IGQ9MTtkPGgubGVuZ3RoO2QrKyl7Y29uc3QgcD1oW2ZdLHg9aFtkXTt4LnN0YXJ0PD1wLnN0YXJ0K3AuY291bnQrMT9wLmNvdW50PU1hdGgubWF4KHAuY291bnQseC5zdGFydCt4LmNvdW50LXAuc3RhcnQpOigrK2YsaFtmXT14KX1oLmxlbmd0aD1mKzE7Zm9yKGxldCBkPTAscD1oLmxlbmd0aDtkPHA7ZCsrKXtjb25zdCB4PWhbZF07ci5idWZmZXJTdWJEYXRhKGwseC5zdGFydCp1LkJZVEVTX1BFUl9FTEVNRU5ULHUseC5zdGFydCx4LmNvdW50KX1jLmNsZWFyVXBkYXRlUmFuZ2VzKCl9Yy5vblVwbG9hZENhbGxiYWNrKCl9ZnVuY3Rpb24gaShhKXtyZXR1cm4gYS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYoYT1hLmRhdGEpLHQuZ2V0KGEpfWZ1bmN0aW9uIHMoYSl7YS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYoYT1hLmRhdGEpO2NvbnN0IGM9dC5nZXQoYSk7YyYmKHIuZGVsZXRlQnVmZmVyKGMuYnVmZmVyKSx0LmRlbGV0ZShhKSl9ZnVuY3Rpb24gbyhhLGMpe2lmKGEuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKGE9YS5kYXRhKSxhLmlzR0xCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IHU9dC5nZXQoYSk7KCF1fHx1LnZlcnNpb248YS52ZXJzaW9uKSYmdC5zZXQoYSx7YnVmZmVyOmEuYnVmZmVyLHR5cGU6YS50eXBlLGJ5dGVzUGVyRWxlbWVudDphLmVsZW1lbnRTaXplLHZlcnNpb246YS52ZXJzaW9ufSk7cmV0dXJufWNvbnN0IGw9dC5nZXQoYSk7aWYobD09PXZvaWQgMCl0LnNldChhLGUoYSxjKSk7ZWxzZSBpZihsLnZlcnNpb248YS52ZXJzaW9uKXtpZihsLnNpemUhPT1hLmFycmF5LmJ5dGVMZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTEF0dHJpYnV0ZXM6IFRoZSBzaXplIG9mIHRoZSBidWZmZXIgYXR0cmlidXRlJ3MgYXJyYXkgYnVmZmVyIGRvZXMgbm90IG1hdGNoIHRoZSBvcmlnaW5hbCBzaXplLiBSZXNpemluZyBidWZmZXIgYXR0cmlidXRlcyBpcyBub3Qgc3VwcG9ydGVkLiIpO24obC5idWZmZXIsYSxjKSxsLnZlcnNpb249YS52ZXJzaW9ufX1yZXR1cm57Z2V0OmkscmVtb3ZlOnMsdXBkYXRlOm99fXZhciBoMT1gI2lmZGVmIFVTRV9BTFBIQUhBU0gKCWlmICggZGlmZnVzZUNvbG9yLmEgPCBnZXRBbHBoYUhhc2hUaHJlc2hvbGQoIHZQb3NpdGlvbiApICkgZGlzY2FyZDsKI2VuZGlmYCxmMT1gI2lmZGVmIFVTRV9BTFBIQUhBU0gKCWNvbnN0IGZsb2F0IEFMUEhBX0hBU0hfU0NBTEUgPSAwLjA1OwoJZmxvYXQgaGFzaDJEKCB2ZWMyIHZhbHVlICkgewoJCXJldHVybiBmcmFjdCggMS4wZTQgKiBzaW4oIDE3LjAgKiB2YWx1ZS54ICsgMC4xICogdmFsdWUueSApICogKCAwLjEgKyBhYnMoIHNpbiggMTMuMCAqIHZhbHVlLnkgKyB2YWx1ZS54ICkgKSApICk7Cgl9CglmbG9hdCBoYXNoM0QoIHZlYzMgdmFsdWUgKSB7CgkJcmV0dXJuIGhhc2gyRCggdmVjMiggaGFzaDJEKCB2YWx1ZS54eSApLCB2YWx1ZS56ICkgKTsKCX0KCWZsb2F0IGdldEFscGhhSGFzaFRocmVzaG9sZCggdmVjMyBwb3NpdGlvbiApIHsKCQlmbG9hdCBtYXhEZXJpdiA9IG1heCgKCQkJbGVuZ3RoKCBkRmR4KCBwb3NpdGlvbi54eXogKSApLAoJCQlsZW5ndGgoIGRGZHkoIHBvc2l0aW9uLnh5eiApICkKCQkpOwoJCWZsb2F0IHBpeFNjYWxlID0gMS4wIC8gKCBBTFBIQV9IQVNIX1NDQUxFICogbWF4RGVyaXYgKTsKCQl2ZWMyIHBpeFNjYWxlcyA9IHZlYzIoCgkJCWV4cDIoIGZsb29yKCBsb2cyKCBwaXhTY2FsZSApICkgKSwKCQkJZXhwMiggY2VpbCggbG9nMiggcGl4U2NhbGUgKSApICkKCQkpOwoJCXZlYzIgYWxwaGEgPSB2ZWMyKAoJCQloYXNoM0QoIGZsb29yKCBwaXhTY2FsZXMueCAqIHBvc2l0aW9uLnh5eiApICksCgkJCWhhc2gzRCggZmxvb3IoIHBpeFNjYWxlcy55ICogcG9zaXRpb24ueHl6ICkgKQoJCSk7CgkJZmxvYXQgbGVycEZhY3RvciA9IGZyYWN0KCBsb2cyKCBwaXhTY2FsZSApICk7CgkJZmxvYXQgeCA9ICggMS4wIC0gbGVycEZhY3RvciApICogYWxwaGEueCArIGxlcnBGYWN0b3IgKiBhbHBoYS55OwoJCWZsb2F0IGEgPSBtaW4oIGxlcnBGYWN0b3IsIDEuMCAtIGxlcnBGYWN0b3IgKTsKCQl2ZWMzIGNhc2VzID0gdmVjMygKCQkJeCAqIHggLyAoIDIuMCAqIGEgKiAoIDEuMCAtIGEgKSApLAoJCQkoIHggLSAwLjUgKiBhICkgLyAoIDEuMCAtIGEgKSwKCQkJMS4wIC0gKCAoIDEuMCAtIHggKSAqICggMS4wIC0geCApIC8gKCAyLjAgKiBhICogKCAxLjAgLSBhICkgKSApCgkJKTsKCQlmbG9hdCB0aHJlc2hvbGQgPSAoIHggPCAoIDEuMCAtIGEgKSApCgkJCT8gKCAoIHggPCBhICkgPyBjYXNlcy54IDogY2FzZXMueSApCgkJCTogY2FzZXMuejsKCQlyZXR1cm4gY2xhbXAoIHRocmVzaG9sZCAsIDEuMGUtNiwgMS4wICk7Cgl9CiNlbmRpZmAsZDE9YCNpZmRlZiBVU0VfQUxQSEFNQVAKCWRpZmZ1c2VDb2xvci5hICo9IHRleHR1cmUyRCggYWxwaGFNYXAsIHZBbHBoYU1hcFV2ICkuZzsKI2VuZGlmYCxwMT1gI2lmZGVmIFVTRV9BTFBIQU1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgYWxwaGFNYXA7CiNlbmRpZmAsbTE9YCNpZmRlZiBVU0VfQUxQSEFURVNUCgkjaWZkZWYgQUxQSEFfVE9fQ09WRVJBR0UKCWRpZmZ1c2VDb2xvci5hID0gc21vb3Roc3RlcCggYWxwaGFUZXN0LCBhbHBoYVRlc3QgKyBmd2lkdGgoIGRpZmZ1c2VDb2xvci5hICksIGRpZmZ1c2VDb2xvci5hICk7CglpZiAoIGRpZmZ1c2VDb2xvci5hID09IDAuMCApIGRpc2NhcmQ7CgkjZWxzZQoJaWYgKCBkaWZmdXNlQ29sb3IuYSA8IGFscGhhVGVzdCApIGRpc2NhcmQ7CgkjZW5kaWYKI2VuZGlmYCxnMT1gI2lmZGVmIFVTRV9BTFBIQVRFU1QKCXVuaWZvcm0gZmxvYXQgYWxwaGFUZXN0OwojZW5kaWZgLHgxPWAjaWZkZWYgVVNFX0FPTUFQCglmbG9hdCBhbWJpZW50T2NjbHVzaW9uID0gKCB0ZXh0dXJlMkQoIGFvTWFwLCB2QW9NYXBVdiApLnIgLSAxLjAgKSAqIGFvTWFwSW50ZW5zaXR5ICsgMS4wOwoJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGFtYmllbnRPY2NsdXNpb247CgkjaWYgZGVmaW5lZCggVVNFX0NMRUFSQ09BVCApIAoJCWNsZWFyY29hdFNwZWN1bGFySW5kaXJlY3QgKj0gYW1iaWVudE9jY2x1c2lvbjsKCSNlbmRpZgoJI2lmIGRlZmluZWQoIFVTRV9TSEVFTiApIAoJCXNoZWVuU3BlY3VsYXJJbmRpcmVjdCAqPSBhbWJpZW50T2NjbHVzaW9uOwoJI2VuZGlmCgkjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFNUQU5EQVJEICkKCQlmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIgKSApOwoJCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKj0gY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBkb3ROViwgYW1iaWVudE9jY2x1c2lvbiwgbWF0ZXJpYWwucm91Z2huZXNzICk7CgkjZW5kaWYKI2VuZGlmYCxfMT1gI2lmZGVmIFVTRV9BT01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgYW9NYXA7Cgl1bmlmb3JtIGZsb2F0IGFvTWFwSW50ZW5zaXR5OwojZW5kaWZgLHkxPWAjaWZkZWYgVVNFX0JBVENISU5HCgkjaWYgISBkZWZpbmVkKCBHTF9BTkdMRV9tdWx0aV9kcmF3ICkKCSNkZWZpbmUgZ2xfRHJhd0lEIF9nbF9EcmF3SUQKCXVuaWZvcm0gaW50IF9nbF9EcmF3SUQ7CgkjZW5kaWYKCXVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIGJhdGNoaW5nVGV4dHVyZTsKCXVuaWZvcm0gaGlnaHAgdXNhbXBsZXIyRCBiYXRjaGluZ0lkVGV4dHVyZTsKCW1hdDQgZ2V0QmF0Y2hpbmdNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7CgkJaW50IHNpemUgPSB0ZXh0dXJlU2l6ZSggYmF0Y2hpbmdUZXh0dXJlLCAwICkueDsKCQlpbnQgaiA9IGludCggaSApICogNDsKCQlpbnQgeCA9IGogJSBzaXplOwoJCWludCB5ID0gaiAvIHNpemU7CgkJdmVjNCB2MSA9IHRleGVsRmV0Y2goIGJhdGNoaW5nVGV4dHVyZSwgaXZlYzIoIHgsIHkgKSwgMCApOwoJCXZlYzQgdjIgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4ICsgMSwgeSApLCAwICk7CgkJdmVjNCB2MyA9IHRleGVsRmV0Y2goIGJhdGNoaW5nVGV4dHVyZSwgaXZlYzIoIHggKyAyLCB5ICksIDAgKTsKCQl2ZWM0IHY0ID0gdGV4ZWxGZXRjaCggYmF0Y2hpbmdUZXh0dXJlLCBpdmVjMiggeCArIDMsIHkgKSwgMCApOwoJCXJldHVybiBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApOwoJfQoJZmxvYXQgZ2V0SW5kaXJlY3RJbmRleCggY29uc3QgaW4gaW50IGkgKSB7CgkJaW50IHNpemUgPSB0ZXh0dXJlU2l6ZSggYmF0Y2hpbmdJZFRleHR1cmUsIDAgKS54OwoJCWludCB4ID0gaSAlIHNpemU7CgkJaW50IHkgPSBpIC8gc2l6ZTsKCQlyZXR1cm4gZmxvYXQoIHRleGVsRmV0Y2goIGJhdGNoaW5nSWRUZXh0dXJlLCBpdmVjMiggeCwgeSApLCAwICkuciApOwoJfQojZW5kaWYKI2lmZGVmIFVTRV9CQVRDSElOR19DT0xPUgoJdW5pZm9ybSBzYW1wbGVyMkQgYmF0Y2hpbmdDb2xvclRleHR1cmU7Cgl2ZWMzIGdldEJhdGNoaW5nQ29sb3IoIGNvbnN0IGluIGZsb2F0IGkgKSB7CgkJaW50IHNpemUgPSB0ZXh0dXJlU2l6ZSggYmF0Y2hpbmdDb2xvclRleHR1cmUsIDAgKS54OwoJCWludCBqID0gaW50KCBpICk7CgkJaW50IHggPSBqICUgc2l6ZTsKCQlpbnQgeSA9IGogLyBzaXplOwoJCXJldHVybiB0ZXhlbEZldGNoKCBiYXRjaGluZ0NvbG9yVGV4dHVyZSwgaXZlYzIoIHgsIHkgKSwgMCApLnJnYjsKCX0KI2VuZGlmYCx2MT1gI2lmZGVmIFVTRV9CQVRDSElORwoJbWF0NCBiYXRjaGluZ01hdHJpeCA9IGdldEJhdGNoaW5nTWF0cml4KCBnZXRJbmRpcmVjdEluZGV4KCBnbF9EcmF3SUQgKSApOwojZW5kaWZgLE0xPWB2ZWMzIHRyYW5zZm9ybWVkID0gdmVjMyggcG9zaXRpb24gKTsKI2lmZGVmIFVTRV9BTFBIQUhBU0gKCXZQb3NpdGlvbiA9IHZlYzMoIHBvc2l0aW9uICk7CiNlbmRpZmAsUzE9YHZlYzMgb2JqZWN0Tm9ybWFsID0gdmVjMyggbm9ybWFsICk7CiNpZmRlZiBVU0VfVEFOR0VOVAoJdmVjMyBvYmplY3RUYW5nZW50ID0gdmVjMyggdGFuZ2VudC54eXogKTsKI2VuZGlmYCxiMT1gZmxvYXQgR19CbGlublBob25nX0ltcGxpY2l0KCApIHsKCXJldHVybiAwLjI1Owp9CmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHsKCXJldHVybiBSRUNJUFJPQ0FMX1BJICogKCBzaGluaW5lc3MgKiAwLjUgKyAxLjAgKSAqIHBvdyggZG90TkgsIHNoaW5pbmVzcyApOwp9CnZlYzMgQlJERl9CbGlublBob25nKCBjb25zdCBpbiB2ZWMzIGxpZ2h0RGlyLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyApIHsKCXZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggbGlnaHREaXIgKyB2aWV3RGlyICk7CglmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaGFsZkRpciApICk7CglmbG9hdCBkb3RWSCA9IHNhdHVyYXRlKCBkb3QoIHZpZXdEaXIsIGhhbGZEaXIgKSApOwoJdmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCAxLjAsIGRvdFZIICk7CglmbG9hdCBHID0gR19CbGlublBob25nX0ltcGxpY2l0KCApOwoJZmxvYXQgRCA9IERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApOwoJcmV0dXJuIEYgKiAoIEcgKiBEICk7Cn0gLy8gdmFsaWRhdGVkYCx3MT1gI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJY29uc3QgbWF0MyBYWVpfVE9fUkVDNzA5ID0gbWF0MygKCQkgMy4yNDA0NTQyLCAtMC45NjkyNjYwLCAgMC4wNTU2NDM0LAoJCS0xLjUzNzEzODUsICAxLjg3NjAxMDgsIC0wLjIwNDAyNTksCgkJLTAuNDk4NTMxNCwgIDAuMDQxNTU2MCwgIDEuMDU3MjI1MgoJKTsKCXZlYzMgRnJlc25lbDBUb0lvciggdmVjMyBmcmVzbmVsMCApIHsKCQl2ZWMzIHNxcnRGMCA9IHNxcnQoIGZyZXNuZWwwICk7CgkJcmV0dXJuICggdmVjMyggMS4wICkgKyBzcXJ0RjAgKSAvICggdmVjMyggMS4wICkgLSBzcXJ0RjAgKTsKCX0KCXZlYzMgSW9yVG9GcmVzbmVsMCggdmVjMyB0cmFuc21pdHRlZElvciwgZmxvYXQgaW5jaWRlbnRJb3IgKSB7CgkJcmV0dXJuIHBvdzIoICggdHJhbnNtaXR0ZWRJb3IgLSB2ZWMzKCBpbmNpZGVudElvciApICkgLyAoIHRyYW5zbWl0dGVkSW9yICsgdmVjMyggaW5jaWRlbnRJb3IgKSApICk7Cgl9CglmbG9hdCBJb3JUb0ZyZXNuZWwwKCBmbG9hdCB0cmFuc21pdHRlZElvciwgZmxvYXQgaW5jaWRlbnRJb3IgKSB7CgkJcmV0dXJuIHBvdzIoICggdHJhbnNtaXR0ZWRJb3IgLSBpbmNpZGVudElvciApIC8gKCB0cmFuc21pdHRlZElvciArIGluY2lkZW50SW9yICkpOwoJfQoJdmVjMyBldmFsU2Vuc2l0aXZpdHkoIGZsb2F0IE9QRCwgdmVjMyBzaGlmdCApIHsKCQlmbG9hdCBwaGFzZSA9IDIuMCAqIFBJICogT1BEICogMS4wZS05OwoJCXZlYzMgdmFsID0gdmVjMyggNS40ODU2ZS0xMywgNC40MjAxZS0xMywgNS4yNDgxZS0xMyApOwoJCXZlYzMgcG9zID0gdmVjMyggMS42ODEwZSswNiwgMS43OTUzZSswNiwgMi4yMDg0ZSswNiApOwoJCXZlYzMgdmFyID0gdmVjMyggNC4zMjc4ZSswOSwgOS4zMDQ2ZSswOSwgNi42MTIxZSswOSApOwoJCXZlYzMgeHl6ID0gdmFsICogc3FydCggMi4wICogUEkgKiB2YXIgKSAqIGNvcyggcG9zICogcGhhc2UgKyBzaGlmdCApICogZXhwKCAtIHBvdzIoIHBoYXNlICkgKiB2YXIgKTsKCQl4eXoueCArPSA5Ljc0NzBlLTE0ICogc3FydCggMi4wICogUEkgKiA0LjUyODJlKzA5ICkgKiBjb3MoIDIuMjM5OWUrMDYgKiBwaGFzZSArIHNoaWZ0WyAwIF0gKSAqIGV4cCggLSA0LjUyODJlKzA5ICogcG93MiggcGhhc2UgKSApOwoJCXh5eiAvPSAxLjA2ODVlLTc7CgkJdmVjMyByZ2IgPSBYWVpfVE9fUkVDNzA5ICogeHl6OwoJCXJldHVybiByZ2I7Cgl9Cgl2ZWMzIGV2YWxJcmlkZXNjZW5jZSggZmxvYXQgb3V0c2lkZUlPUiwgZmxvYXQgZXRhMiwgZmxvYXQgY29zVGhldGExLCBmbG9hdCB0aGluRmlsbVRoaWNrbmVzcywgdmVjMyBiYXNlRjAgKSB7CgkJdmVjMyBJOwoJCWZsb2F0IGlyaWRlc2NlbmNlSU9SID0gbWl4KCBvdXRzaWRlSU9SLCBldGEyLCBzbW9vdGhzdGVwKCAwLjAsIDAuMDMsIHRoaW5GaWxtVGhpY2tuZXNzICkgKTsKCQlmbG9hdCBzaW5UaGV0YTJTcSA9IHBvdzIoIG91dHNpZGVJT1IgLyBpcmlkZXNjZW5jZUlPUiApICogKCAxLjAgLSBwb3cyKCBjb3NUaGV0YTEgKSApOwoJCWZsb2F0IGNvc1RoZXRhMlNxID0gMS4wIC0gc2luVGhldGEyU3E7CgkJaWYgKCBjb3NUaGV0YTJTcSA8IDAuMCApIHsKCQkJcmV0dXJuIHZlYzMoIDEuMCApOwoJCX0KCQlmbG9hdCBjb3NUaGV0YTIgPSBzcXJ0KCBjb3NUaGV0YTJTcSApOwoJCWZsb2F0IFIwID0gSW9yVG9GcmVzbmVsMCggaXJpZGVzY2VuY2VJT1IsIG91dHNpZGVJT1IgKTsKCQlmbG9hdCBSMTIgPSBGX1NjaGxpY2soIFIwLCAxLjAsIGNvc1RoZXRhMSApOwoJCWZsb2F0IFQxMjEgPSAxLjAgLSBSMTI7CgkJZmxvYXQgcGhpMTIgPSAwLjA7CgkJaWYgKCBpcmlkZXNjZW5jZUlPUiA8IG91dHNpZGVJT1IgKSBwaGkxMiA9IFBJOwoJCWZsb2F0IHBoaTIxID0gUEkgLSBwaGkxMjsKCQl2ZWMzIGJhc2VJT1IgPSBGcmVzbmVsMFRvSW9yKCBjbGFtcCggYmFzZUYwLCAwLjAsIDAuOTk5OSApICk7CQl2ZWMzIFIxID0gSW9yVG9GcmVzbmVsMCggYmFzZUlPUiwgaXJpZGVzY2VuY2VJT1IgKTsKCQl2ZWMzIFIyMyA9IEZfU2NobGljayggUjEsIDEuMCwgY29zVGhldGEyICk7CgkJdmVjMyBwaGkyMyA9IHZlYzMoIDAuMCApOwoJCWlmICggYmFzZUlPUlsgMCBdIDwgaXJpZGVzY2VuY2VJT1IgKSBwaGkyM1sgMCBdID0gUEk7CgkJaWYgKCBiYXNlSU9SWyAxIF0gPCBpcmlkZXNjZW5jZUlPUiApIHBoaTIzWyAxIF0gPSBQSTsKCQlpZiAoIGJhc2VJT1JbIDIgXSA8IGlyaWRlc2NlbmNlSU9SICkgcGhpMjNbIDIgXSA9IFBJOwoJCWZsb2F0IE9QRCA9IDIuMCAqIGlyaWRlc2NlbmNlSU9SICogdGhpbkZpbG1UaGlja25lc3MgKiBjb3NUaGV0YTI7CgkJdmVjMyBwaGkgPSB2ZWMzKCBwaGkyMSApICsgcGhpMjM7CgkJdmVjMyBSMTIzID0gY2xhbXAoIFIxMiAqIFIyMywgMWUtNSwgMC45OTk5ICk7CgkJdmVjMyByMTIzID0gc3FydCggUjEyMyApOwoJCXZlYzMgUnMgPSBwb3cyKCBUMTIxICkgKiBSMjMgLyAoIHZlYzMoIDEuMCApIC0gUjEyMyApOwoJCXZlYzMgQzAgPSBSMTIgKyBSczsKCQlJID0gQzA7CgkJdmVjMyBDbSA9IFJzIC0gVDEyMTsKCQlmb3IgKCBpbnQgbSA9IDE7IG0gPD0gMjsgKysgbSApIHsKCQkJQ20gKj0gcjEyMzsKCQkJdmVjMyBTbSA9IDIuMCAqIGV2YWxTZW5zaXRpdml0eSggZmxvYXQoIG0gKSAqIE9QRCwgZmxvYXQoIG0gKSAqIHBoaSApOwoJCQlJICs9IENtICogU207CgkJfQoJCXJldHVybiBtYXgoIEksIHZlYzMoIDAuMCApICk7Cgl9CiNlbmRpZmAsQTE9YCNpZmRlZiBVU0VfQlVNUE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgYnVtcE1hcDsKCXVuaWZvcm0gZmxvYXQgYnVtcFNjYWxlOwoJdmVjMiBkSGR4eV9md2QoKSB7CgkJdmVjMiBkU1RkeCA9IGRGZHgoIHZCdW1wTWFwVXYgKTsKCQl2ZWMyIGRTVGR5ID0gZEZkeSggdkJ1bXBNYXBVdiApOwoJCWZsb2F0IEhsbCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdkJ1bXBNYXBVdiApLng7CgkJZmxvYXQgZEJ4ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2QnVtcE1hcFV2ICsgZFNUZHggKS54IC0gSGxsOwoJCWZsb2F0IGRCeSA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdkJ1bXBNYXBVdiArIGRTVGR5ICkueCAtIEhsbDsKCQlyZXR1cm4gdmVjMiggZEJ4LCBkQnkgKTsKCX0KCXZlYzMgcGVydHVyYk5vcm1hbEFyYiggdmVjMyBzdXJmX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgZEhkeHksIGZsb2F0IGZhY2VEaXJlY3Rpb24gKSB7CgkJdmVjMyB2U2lnbWFYID0gbm9ybWFsaXplKCBkRmR4KCBzdXJmX3Bvcy54eXogKSApOwoJCXZlYzMgdlNpZ21hWSA9IG5vcm1hbGl6ZSggZEZkeSggc3VyZl9wb3MueHl6ICkgKTsKCQl2ZWMzIHZOID0gc3VyZl9ub3JtOwoJCXZlYzMgUjEgPSBjcm9zcyggdlNpZ21hWSwgdk4gKTsKCQl2ZWMzIFIyID0gY3Jvc3MoIHZOLCB2U2lnbWFYICk7CgkJZmxvYXQgZkRldCA9IGRvdCggdlNpZ21hWCwgUjEgKSAqIGZhY2VEaXJlY3Rpb247CgkJdmVjMyB2R3JhZCA9IHNpZ24oIGZEZXQgKSAqICggZEhkeHkueCAqIFIxICsgZEhkeHkueSAqIFIyICk7CgkJcmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApOwoJfQojZW5kaWZgLFQxPWAjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAKCXZlYzQgcGxhbmU7CgkjaWZkZWYgQUxQSEFfVE9fQ09WRVJBR0UKCQlmbG9hdCBkaXN0YW5jZVRvUGxhbmUsIGRpc3RhbmNlR3JhZGllbnQ7CgkJZmxvYXQgY2xpcE9wYWNpdHkgPSAxLjA7CgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCWZvciAoIGludCBpID0gMDsgaSA8IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHsKCQkJcGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdOwoJCQlkaXN0YW5jZVRvUGxhbmUgPSAtIGRvdCggdkNsaXBQb3NpdGlvbiwgcGxhbmUueHl6ICkgKyBwbGFuZS53OwoJCQlkaXN0YW5jZUdyYWRpZW50ID0gZndpZHRoKCBkaXN0YW5jZVRvUGxhbmUgKSAvIDIuMDsKCQkJY2xpcE9wYWNpdHkgKj0gc21vb3Roc3RlcCggLSBkaXN0YW5jZUdyYWRpZW50LCBkaXN0YW5jZUdyYWRpZW50LCBkaXN0YW5jZVRvUGxhbmUgKTsKCQkJaWYgKCBjbGlwT3BhY2l0eSA9PSAwLjAgKSBkaXNjYXJkOwoJCX0KCQkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJCSNpZiBVTklPTl9DTElQUElOR19QTEFORVMgPCBOVU1fQ0xJUFBJTkdfUExBTkVTCgkJCWZsb2F0IHVuaW9uQ2xpcE9wYWNpdHkgPSAxLjA7CgkJCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCQkJZm9yICggaW50IGkgPSBVTklPTl9DTElQUElOR19QTEFORVM7IGkgPCBOVU1fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkgewoJCQkJcGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdOwoJCQkJZGlzdGFuY2VUb1BsYW5lID0gLSBkb3QoIHZDbGlwUG9zaXRpb24sIHBsYW5lLnh5eiApICsgcGxhbmUudzsKCQkJCWRpc3RhbmNlR3JhZGllbnQgPSBmd2lkdGgoIGRpc3RhbmNlVG9QbGFuZSApIC8gMi4wOwoJCQkJdW5pb25DbGlwT3BhY2l0eSAqPSAxLjAgLSBzbW9vdGhzdGVwKCAtIGRpc3RhbmNlR3JhZGllbnQsIGRpc3RhbmNlR3JhZGllbnQsIGRpc3RhbmNlVG9QbGFuZSApOwoJCQl9CgkJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkJCWNsaXBPcGFjaXR5ICo9IDEuMCAtIHVuaW9uQ2xpcE9wYWNpdHk7CgkJI2VuZGlmCgkJZGlmZnVzZUNvbG9yLmEgKj0gY2xpcE9wYWNpdHk7CgkJaWYgKCBkaWZmdXNlQ29sb3IuYSA9PSAwLjAgKSBkaXNjYXJkOwoJI2Vsc2UKCQkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0CgkJZm9yICggaW50IGkgPSAwOyBpIDwgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkgewoJCQlwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07CgkJCWlmICggZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSBkaXNjYXJkOwoJCX0KCQkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJCSNpZiBVTklPTl9DTElQUElOR19QTEFORVMgPCBOVU1fQ0xJUFBJTkdfUExBTkVTCgkJCWJvb2wgY2xpcHBlZCA9IHRydWU7CgkJCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCQkJZm9yICggaW50IGkgPSBVTklPTl9DTElQUElOR19QTEFORVM7IGkgPCBOVU1fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkgewoJCQkJcGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdOwoJCQkJY2xpcHBlZCA9ICggZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSAmJiBjbGlwcGVkOwoJCQl9CgkJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkJCWlmICggY2xpcHBlZCApIGRpc2NhcmQ7CgkJI2VuZGlmCgkjZW5kaWYKI2VuZGlmYCxFMT1gI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwCgl2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjsKCXVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdOwojZW5kaWZgLEMxPWAjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAKCXZhcnlpbmcgdmVjMyB2Q2xpcFBvc2l0aW9uOwojZW5kaWZgLFIxPWAjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAKCXZDbGlwUG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwojZW5kaWZgLEkxPWAjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkKCWRpZmZ1c2VDb2xvciAqPSB2Q29sb3I7CiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApCglkaWZmdXNlQ29sb3IucmdiICo9IHZDb2xvcjsKI2VuZGlmYCxQMT1gI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApCgl2YXJ5aW5nIHZlYzQgdkNvbG9yOwojZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKQoJdmFyeWluZyB2ZWMzIHZDb2xvcjsKI2VuZGlmYCxMMT1gI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApCgl2YXJ5aW5nIHZlYzQgdkNvbG9yOwojZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfSU5TVEFOQ0lOR19DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9CQVRDSElOR19DT0xPUiApCgl2YXJ5aW5nIHZlYzMgdkNvbG9yOwojZW5kaWZgLEQxPWAjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkKCXZDb2xvciA9IHZlYzQoIDEuMCApOwojZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfSU5TVEFOQ0lOR19DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9CQVRDSElOR19DT0xPUiApCgl2Q29sb3IgPSB2ZWMzKCAxLjAgKTsKI2VuZGlmCiNpZmRlZiBVU0VfQ09MT1IKCXZDb2xvciAqPSBjb2xvcjsKI2VuZGlmCiNpZmRlZiBVU0VfSU5TVEFOQ0lOR19DT0xPUgoJdkNvbG9yLnh5eiAqPSBpbnN0YW5jZUNvbG9yLnh5ejsKI2VuZGlmCiNpZmRlZiBVU0VfQkFUQ0hJTkdfQ09MT1IKCXZlYzMgYmF0Y2hpbmdDb2xvciA9IGdldEJhdGNoaW5nQ29sb3IoIGdldEluZGlyZWN0SW5kZXgoIGdsX0RyYXdJRCApICk7Cgl2Q29sb3IueHl6ICo9IGJhdGNoaW5nQ29sb3IueHl6OwojZW5kaWZgLFUxPWAjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzCiNkZWZpbmUgUEkyIDYuMjgzMTg1MzA3MTc5NTg2CiNkZWZpbmUgUElfSEFMRiAxLjU3MDc5NjMyNjc5NDg5NjYKI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MTgzNzkwNwojZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTQzMDkxODk1MzUKI2RlZmluZSBFUFNJTE9OIDFlLTYKI2lmbmRlZiBzYXR1cmF0ZQojZGVmaW5lIHNhdHVyYXRlKCBhICkgY2xhbXAoIGEsIDAuMCwgMS4wICkKI2VuZGlmCiNkZWZpbmUgd2hpdGVDb21wbGVtZW50KCBhICkgKCAxLjAgLSBzYXR1cmF0ZSggYSApICkKZmxvYXQgcG93MiggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeDsgfQp2ZWMzIHBvdzIoIGNvbnN0IGluIHZlYzMgeCApIHsgcmV0dXJuIHgqeDsgfQpmbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4Kng7IH0KZmxvYXQgcG93NCggY29uc3QgaW4gZmxvYXQgeCApIHsgZmxvYXQgeDIgPSB4Kng7IHJldHVybiB4Mip4MjsgfQpmbG9hdCBtYXgzKCBjb25zdCBpbiB2ZWMzIHYgKSB7IHJldHVybiBtYXgoIG1heCggdi54LCB2LnkgKSwgdi56ICk7IH0KZmxvYXQgYXZlcmFnZSggY29uc3QgaW4gdmVjMyB2ICkgeyByZXR1cm4gZG90KCB2LCB2ZWMzKCAwLjMzMzMzMzMgKSApOyB9CmhpZ2hwIGZsb2F0IHJhbmQoIGNvbnN0IGluIHZlYzIgdXYgKSB7Cgljb25zdCBoaWdocCBmbG9hdCBhID0gMTIuOTg5OCwgYiA9IDc4LjIzMywgYyA9IDQzNzU4LjU0NTM7CgloaWdocCBmbG9hdCBkdCA9IGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuID0gbW9kKCBkdCwgUEkgKTsKCXJldHVybiBmcmFjdCggc2luKCBzbiApICogYyApOwp9CiNpZmRlZiBISUdIX1BSRUNJU0lPTgoJZmxvYXQgcHJlY2lzaW9uU2FmZUxlbmd0aCggdmVjMyB2ICkgeyByZXR1cm4gbGVuZ3RoKCB2ICk7IH0KI2Vsc2UKCWZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHsKCQlmbG9hdCBtYXhDb21wb25lbnQgPSBtYXgzKCBhYnMoIHYgKSApOwoJCXJldHVybiBsZW5ndGgoIHYgLyBtYXhDb21wb25lbnQgKSAqIG1heENvbXBvbmVudDsKCX0KI2VuZGlmCnN0cnVjdCBJbmNpZGVudExpZ2h0IHsKCXZlYzMgY29sb3I7Cgl2ZWMzIGRpcmVjdGlvbjsKCWJvb2wgdmlzaWJsZTsKfTsKc3RydWN0IFJlZmxlY3RlZExpZ2h0IHsKCXZlYzMgZGlyZWN0RGlmZnVzZTsKCXZlYzMgZGlyZWN0U3BlY3VsYXI7Cgl2ZWMzIGluZGlyZWN0RGlmZnVzZTsKCXZlYzMgaW5kaXJlY3RTcGVjdWxhcjsKfTsKI2lmZGVmIFVTRV9BTFBIQUhBU0gKCXZhcnlpbmcgdmVjMyB2UG9zaXRpb247CiNlbmRpZgp2ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkgewoJcmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7Cn0KdmVjMyBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7CglyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIGRpciwgMC4wICkgKiBtYXRyaXggKS54eXogKTsKfQptYXQzIHRyYW5zcG9zZU1hdDMoIGNvbnN0IGluIG1hdDMgbSApIHsKCW1hdDMgdG1wOwoJdG1wWyAwIF0gPSB2ZWMzKCBtWyAwIF0ueCwgbVsgMSBdLngsIG1bIDIgXS54ICk7Cgl0bXBbIDEgXSA9IHZlYzMoIG1bIDAgXS55LCBtWyAxIF0ueSwgbVsgMiBdLnkgKTsKCXRtcFsgMiBdID0gdmVjMyggbVsgMCBdLnosIG1bIDEgXS56LCBtWyAyIF0ueiApOwoJcmV0dXJuIHRtcDsKfQpib29sIGlzUGVyc3BlY3RpdmVNYXRyaXgoIG1hdDQgbSApIHsKCXJldHVybiBtWyAyIF1bIDMgXSA9PSAtIDEuMDsKfQp2ZWMyIGVxdWlyZWN0VXYoIGluIHZlYzMgZGlyICkgewoJZmxvYXQgdSA9IGF0YW4oIGRpci56LCBkaXIueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7CglmbG9hdCB2ID0gYXNpbiggY2xhbXAoIGRpci55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7CglyZXR1cm4gdmVjMiggdSwgdiApOwp9CnZlYzMgQlJERl9MYW1iZXJ0KCBjb25zdCBpbiB2ZWMzIGRpZmZ1c2VDb2xvciApIHsKCXJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yOwp9CnZlYzMgRl9TY2hsaWNrKCBjb25zdCBpbiB2ZWMzIGYwLCBjb25zdCBpbiBmbG9hdCBmOTAsIGNvbnN0IGluIGZsb2F0IGRvdFZIICkgewoJZmxvYXQgZnJlc25lbCA9IGV4cDIoICggLSA1LjU1NDczICogZG90VkggLSA2Ljk4MzE2ICkgKiBkb3RWSCApOwoJcmV0dXJuIGYwICogKCAxLjAgLSBmcmVzbmVsICkgKyAoIGY5MCAqIGZyZXNuZWwgKTsKfQpmbG9hdCBGX1NjaGxpY2soIGNvbnN0IGluIGZsb2F0IGYwLCBjb25zdCBpbiBmbG9hdCBmOTAsIGNvbnN0IGluIGZsb2F0IGRvdFZIICkgewoJZmxvYXQgZnJlc25lbCA9IGV4cDIoICggLSA1LjU1NDczICogZG90VkggLSA2Ljk4MzE2ICkgKiBkb3RWSCApOwoJcmV0dXJuIGYwICogKCAxLjAgLSBmcmVzbmVsICkgKyAoIGY5MCAqIGZyZXNuZWwgKTsKfSAvLyB2YWxpZGF0ZWRgLE4xPWAjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVgoJI2RlZmluZSBjdWJlVVZfbWluTWlwTGV2ZWwgNC4wCgkjZGVmaW5lIGN1YmVVVl9taW5UaWxlU2l6ZSAxNi4wCglmbG9hdCBnZXRGYWNlKCB2ZWMzIGRpcmVjdGlvbiApIHsKCQl2ZWMzIGFic0RpcmVjdGlvbiA9IGFicyggZGlyZWN0aW9uICk7CgkJZmxvYXQgZmFjZSA9IC0gMS4wOwoJCWlmICggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueiApIHsKCQkJaWYgKCBhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi55ICkKCQkJCWZhY2UgPSBkaXJlY3Rpb24ueCA+IDAuMCA/IDAuMCA6IDMuMDsKCQkJZWxzZQoJCQkJZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMS4wIDogNC4wOwoJCX0gZWxzZSB7CgkJCWlmICggYWJzRGlyZWN0aW9uLnogPiBhYnNEaXJlY3Rpb24ueSApCgkJCQlmYWNlID0gZGlyZWN0aW9uLnogPiAwLjAgPyAyLjAgOiA1LjA7CgkJCWVsc2UKCQkJCWZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEuMCA6IDQuMDsKCQl9CgkJcmV0dXJuIGZhY2U7Cgl9Cgl2ZWMyIGdldFVWKCB2ZWMzIGRpcmVjdGlvbiwgZmxvYXQgZmFjZSApIHsKCQl2ZWMyIHV2OwoJCWlmICggZmFjZSA9PSAwLjAgKSB7CgkJCXV2ID0gdmVjMiggZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55ICkgLyBhYnMoIGRpcmVjdGlvbi54ICk7CgkJfSBlbHNlIGlmICggZmFjZSA9PSAxLjAgKSB7CgkJCXV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgLSBkaXJlY3Rpb24ueiApIC8gYWJzKCBkaXJlY3Rpb24ueSApOwoJCX0gZWxzZSBpZiAoIGZhY2UgPT0gMi4wICkgewoJCQl1diA9IHZlYzIoIC0gZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55ICkgLyBhYnMoIGRpcmVjdGlvbi56ICk7CgkJfSBlbHNlIGlmICggZmFjZSA9PSAzLjAgKSB7CgkJCXV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnggKTsKCQl9IGVsc2UgaWYgKCBmYWNlID09IDQuMCApIHsKCQkJdXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueiApIC8gYWJzKCBkaXJlY3Rpb24ueSApOwoJCX0gZWxzZSB7CgkJCXV2ID0gdmVjMiggZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55ICkgLyBhYnMoIGRpcmVjdGlvbi56ICk7CgkJfQoJCXJldHVybiAwLjUgKiAoIHV2ICsgMS4wICk7Cgl9Cgl2ZWMzIGJpbGluZWFyQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIGRpcmVjdGlvbiwgZmxvYXQgbWlwSW50ICkgewoJCWZsb2F0IGZhY2UgPSBnZXRGYWNlKCBkaXJlY3Rpb24gKTsKCQlmbG9hdCBmaWx0ZXJJbnQgPSBtYXgoIGN1YmVVVl9taW5NaXBMZXZlbCAtIG1pcEludCwgMC4wICk7CgkJbWlwSW50ID0gbWF4KCBtaXBJbnQsIGN1YmVVVl9taW5NaXBMZXZlbCApOwoJCWZsb2F0IGZhY2VTaXplID0gZXhwMiggbWlwSW50ICk7CgkJaGlnaHAgdmVjMiB1diA9IGdldFVWKCBkaXJlY3Rpb24sIGZhY2UgKSAqICggZmFjZVNpemUgLSAyLjAgKSArIDEuMDsKCQlpZiAoIGZhY2UgPiAyLjAgKSB7CgkJCXV2LnkgKz0gZmFjZVNpemU7CgkJCWZhY2UgLT0gMy4wOwoJCX0KCQl1di54ICs9IGZhY2UgKiBmYWNlU2l6ZTsKCQl1di54ICs9IGZpbHRlckludCAqIDMuMCAqIGN1YmVVVl9taW5UaWxlU2l6ZTsKCQl1di55ICs9IDQuMCAqICggZXhwMiggQ1VCRVVWX01BWF9NSVAgKSAtIGZhY2VTaXplICk7CgkJdXYueCAqPSBDVUJFVVZfVEVYRUxfV0lEVEg7CgkJdXYueSAqPSBDVUJFVVZfVEVYRUxfSEVJR0hUOwoJCSNpZmRlZiB0ZXh0dXJlMkRHcmFkRVhUCgkJCXJldHVybiB0ZXh0dXJlMkRHcmFkRVhUKCBlbnZNYXAsIHV2LCB2ZWMyKCAwLjAgKSwgdmVjMiggMC4wICkgKS5yZ2I7CgkJI2Vsc2UKCQkJcmV0dXJuIHRleHR1cmUyRCggZW52TWFwLCB1diApLnJnYjsKCQkjZW5kaWYKCX0KCSNkZWZpbmUgY3ViZVVWX3IwIDEuMAoJI2RlZmluZSBjdWJlVVZfbTAgLSAyLjAKCSNkZWZpbmUgY3ViZVVWX3IxIDAuOAoJI2RlZmluZSBjdWJlVVZfbTEgLSAxLjAKCSNkZWZpbmUgY3ViZVVWX3I0IDAuNAoJI2RlZmluZSBjdWJlVVZfbTQgMi4wCgkjZGVmaW5lIGN1YmVVVl9yNSAwLjMwNQoJI2RlZmluZSBjdWJlVVZfbTUgMy4wCgkjZGVmaW5lIGN1YmVVVl9yNiAwLjIxCgkjZGVmaW5lIGN1YmVVVl9tNiA0LjAKCWZsb2F0IHJvdWdobmVzc1RvTWlwKCBmbG9hdCByb3VnaG5lc3MgKSB7CgkJZmxvYXQgbWlwID0gMC4wOwoJCWlmICggcm91Z2huZXNzID49IGN1YmVVVl9yMSApIHsKCQkJbWlwID0gKCBjdWJlVVZfcjAgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX20xIC0gY3ViZVVWX20wICkgLyAoIGN1YmVVVl9yMCAtIGN1YmVVVl9yMSApICsgY3ViZVVWX20wOwoJCX0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSBjdWJlVVZfcjQgKSB7CgkJCW1pcCA9ICggY3ViZVVWX3IxIC0gcm91Z2huZXNzICkgKiAoIGN1YmVVVl9tNCAtIGN1YmVVVl9tMSApIC8gKCBjdWJlVVZfcjEgLSBjdWJlVVZfcjQgKSArIGN1YmVVVl9tMTsKCQl9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3I1ICkgewoJCQltaXAgPSAoIGN1YmVVVl9yNCAtIHJvdWdobmVzcyApICogKCBjdWJlVVZfbTUgLSBjdWJlVVZfbTQgKSAvICggY3ViZVVWX3I0IC0gY3ViZVVWX3I1ICkgKyBjdWJlVVZfbTQ7CgkJfSBlbHNlIGlmICggcm91Z2huZXNzID49IGN1YmVVVl9yNiApIHsKCQkJbWlwID0gKCBjdWJlVVZfcjUgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX202IC0gY3ViZVVWX201ICkgLyAoIGN1YmVVVl9yNSAtIGN1YmVVVl9yNiApICsgY3ViZVVWX201OwoJCX0gZWxzZSB7CgkJCW1pcCA9IC0gMi4wICogbG9nMiggMS4xNiAqIHJvdWdobmVzcyApOwkJfQoJCXJldHVybiBtaXA7Cgl9Cgl2ZWM0IHRleHR1cmVDdWJlVVYoIHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgc2FtcGxlRGlyLCBmbG9hdCByb3VnaG5lc3MgKSB7CgkJZmxvYXQgbWlwID0gY2xhbXAoIHJvdWdobmVzc1RvTWlwKCByb3VnaG5lc3MgKSwgY3ViZVVWX20wLCBDVUJFVVZfTUFYX01JUCApOwoJCWZsb2F0IG1pcEYgPSBmcmFjdCggbWlwICk7CgkJZmxvYXQgbWlwSW50ID0gZmxvb3IoIG1pcCApOwoJCXZlYzMgY29sb3IwID0gYmlsaW5lYXJDdWJlVVYoIGVudk1hcCwgc2FtcGxlRGlyLCBtaXBJbnQgKTsKCQlpZiAoIG1pcEYgPT0gMC4wICkgewoJCQlyZXR1cm4gdmVjNCggY29sb3IwLCAxLjAgKTsKCQl9IGVsc2UgewoJCQl2ZWMzIGNvbG9yMSA9IGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpciwgbWlwSW50ICsgMS4wICk7CgkJCXJldHVybiB2ZWM0KCBtaXgoIGNvbG9yMCwgY29sb3IxLCBtaXBGICksIDEuMCApOwoJCX0KCX0KI2VuZGlmYCxGMT1gdmVjMyB0cmFuc2Zvcm1lZE5vcm1hbCA9IG9iamVjdE5vcm1hbDsKI2lmZGVmIFVTRV9UQU5HRU5UCgl2ZWMzIHRyYW5zZm9ybWVkVGFuZ2VudCA9IG9iamVjdFRhbmdlbnQ7CiNlbmRpZgojaWZkZWYgVVNFX0JBVENISU5HCgltYXQzIGJtID0gbWF0MyggYmF0Y2hpbmdNYXRyaXggKTsKCXRyYW5zZm9ybWVkTm9ybWFsIC89IHZlYzMoIGRvdCggYm1bIDAgXSwgYm1bIDAgXSApLCBkb3QoIGJtWyAxIF0sIGJtWyAxIF0gKSwgZG90KCBibVsgMiBdLCBibVsgMiBdICkgKTsKCXRyYW5zZm9ybWVkTm9ybWFsID0gYm0gKiB0cmFuc2Zvcm1lZE5vcm1hbDsKCSNpZmRlZiBVU0VfVEFOR0VOVAoJCXRyYW5zZm9ybWVkVGFuZ2VudCA9IGJtICogdHJhbnNmb3JtZWRUYW5nZW50OwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0lOU1RBTkNJTkcKCW1hdDMgaW0gPSBtYXQzKCBpbnN0YW5jZU1hdHJpeCApOwoJdHJhbnNmb3JtZWROb3JtYWwgLz0gdmVjMyggZG90KCBpbVsgMCBdLCBpbVsgMCBdICksIGRvdCggaW1bIDEgXSwgaW1bIDEgXSApLCBkb3QoIGltWyAyIF0sIGltWyAyIF0gKSApOwoJdHJhbnNmb3JtZWROb3JtYWwgPSBpbSAqIHRyYW5zZm9ybWVkTm9ybWFsOwoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJdHJhbnNmb3JtZWRUYW5nZW50ID0gaW0gKiB0cmFuc2Zvcm1lZFRhbmdlbnQ7CgkjZW5kaWYKI2VuZGlmCnRyYW5zZm9ybWVkTm9ybWFsID0gbm9ybWFsTWF0cml4ICogdHJhbnNmb3JtZWROb3JtYWw7CiNpZmRlZiBGTElQX1NJREVECgl0cmFuc2Zvcm1lZE5vcm1hbCA9IC0gdHJhbnNmb3JtZWROb3JtYWw7CiNlbmRpZgojaWZkZWYgVVNFX1RBTkdFTlQKCXRyYW5zZm9ybWVkVGFuZ2VudCA9ICggbW9kZWxWaWV3TWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWRUYW5nZW50LCAwLjAgKSApLnh5ejsKCSNpZmRlZiBGTElQX1NJREVECgkJdHJhbnNmb3JtZWRUYW5nZW50ID0gLSB0cmFuc2Zvcm1lZFRhbmdlbnQ7CgkjZW5kaWYKI2VuZGlmYCxCMT1gI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDsKCXVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50U2NhbGU7Cgl1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7CiNlbmRpZmAsTzE9YCNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgl0cmFuc2Zvcm1lZCArPSBub3JtYWxpemUoIG9iamVjdE5vcm1hbCApICogKCB0ZXh0dXJlMkQoIGRpc3BsYWNlbWVudE1hcCwgdkRpc3BsYWNlbWVudE1hcFV2ICkueCAqIGRpc3BsYWNlbWVudFNjYWxlICsgZGlzcGxhY2VtZW50QmlhcyApOwojZW5kaWZgLHoxPWAjaWZkZWYgVVNFX0VNSVNTSVZFTUFQCgl2ZWM0IGVtaXNzaXZlQ29sb3IgPSB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2RW1pc3NpdmVNYXBVdiApOwoJI2lmZGVmIERFQ09ERV9WSURFT19URVhUVVJFX0VNSVNTSVZFCgkJZW1pc3NpdmVDb2xvciA9IHNSR0JUcmFuc2ZlckVPVEYoIGVtaXNzaXZlQ29sb3IgKTsKCSNlbmRpZgoJdG90YWxFbWlzc2l2ZVJhZGlhbmNlICo9IGVtaXNzaXZlQ29sb3IucmdiOwojZW5kaWZgLGsxPWAjaWZkZWYgVVNFX0VNSVNTSVZFTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBlbWlzc2l2ZU1hcDsKI2VuZGlmYCxWMT0iZ2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7IixHMT1gdmVjNCBMaW5lYXJUcmFuc2Zlck9FVEYoIGluIHZlYzQgdmFsdWUgKSB7CglyZXR1cm4gdmFsdWU7Cn0KdmVjNCBzUkdCVHJhbnNmZXJFT1RGKCBpbiB2ZWM0IHZhbHVlICkgewoJcmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdmFsdWUucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdmFsdWUuYSApOwp9CnZlYzQgc1JHQlRyYW5zZmVyT0VURiggaW4gdmVjNCB2YWx1ZSApIHsKCXJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLmEgKTsKfWAsSDE9YCNpZmRlZiBVU0VfRU5WTUFQCgkjaWZkZWYgRU5WX1dPUkxEUE9TCgkJdmVjMyBjYW1lcmFUb0ZyYWc7CgkJaWYgKCBpc09ydGhvZ3JhcGhpYyApIHsKCQkJY2FtZXJhVG9GcmFnID0gbm9ybWFsaXplKCB2ZWMzKCAtIHZpZXdNYXRyaXhbIDAgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDEgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDIgXVsgMiBdICkgKTsKCQl9IGVsc2UgewoJCQljYW1lcmFUb0ZyYWcgPSBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTsKCQl9CgkJdmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApOwoJCSNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OCgkJCXZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIGNhbWVyYVRvRnJhZywgd29ybGROb3JtYWwgKTsKCQkjZWxzZQoJCQl2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCBjYW1lcmFUb0ZyYWcsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTsKCQkjZW5kaWYKCSNlbHNlCgkJdmVjMyByZWZsZWN0VmVjID0gdlJlZmxlY3Q7CgkjZW5kaWYKCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFCgkJdmVjNCBlbnZDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIGVudk1hcFJvdGF0aW9uICogdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApICk7CgkjZWxzZQoJCXZlYzQgZW52Q29sb3IgPSB2ZWM0KCAwLjAgKTsKCSNlbmRpZgoJI2lmZGVmIEVOVk1BUF9CTEVORElOR19NVUxUSVBMWQoJCW91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIG91dGdvaW5nTGlnaHQgKiBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTsKCSNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKQoJCW91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApOwoJI2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX0FERCApCgkJb3V0Z29pbmdMaWdodCArPSBlbnZDb2xvci54eXogKiBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5OwoJI2VuZGlmCiNlbmRpZmAsVzE9YCNpZmRlZiBVU0VfRU5WTUFQCgl1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTsKCXVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDsKCXVuaWZvcm0gbWF0MyBlbnZNYXBSb3RhdGlvbjsKCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFCgkJdW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7CgkjZWxzZQoJCXVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDsKCSNlbmRpZgoJCiNlbmRpZmAsWDE9YCNpZmRlZiBVU0VfRU5WTUFQCgl1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTsKCSNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIHx8IGRlZmluZWQoIExBTUJFUlQgKQoJCSNkZWZpbmUgRU5WX1dPUkxEUE9TCgkjZW5kaWYKCSNpZmRlZiBFTlZfV09STERQT1MKCQl2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CgkJdW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87CgkjZWxzZQoJCXZhcnlpbmcgdmVjMyB2UmVmbGVjdDsKCSNlbmRpZgojZW5kaWZgLCQxPWAjaWZkZWYgVVNFX0VOVk1BUAoJI2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgfHwgZGVmaW5lZCggTEFNQkVSVCApCgkJI2RlZmluZSBFTlZfV09STERQT1MKCSNlbmRpZgoJI2lmZGVmIEVOVl9XT1JMRFBPUwoJCQoJCXZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjsKCSNlbHNlCgkJdmFyeWluZyB2ZWMzIHZSZWZsZWN0OwoJCXVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvOwoJI2VuZGlmCiNlbmRpZmAscTE9YCNpZmRlZiBVU0VfRU5WTUFQCgkjaWZkZWYgRU5WX1dPUkxEUE9TCgkJdldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejsKCSNlbHNlCgkJdmVjMyBjYW1lcmFUb1ZlcnRleDsKCQlpZiAoIGlzT3J0aG9ncmFwaGljICkgewoJCQljYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggdmVjMyggLSB2aWV3TWF0cml4WyAwIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAxIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAyIF1bIDIgXSApICk7CgkJfSBlbHNlIHsKCQkJY2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHdvcmxkUG9zaXRpb24ueHl6IC0gY2FtZXJhUG9zaXRpb24gKTsKCQl9CgkJdmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7CgkJI2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT04KCQkJdlJlZmxlY3QgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTsKCQkjZWxzZQoJCQl2UmVmbGVjdCA9IHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7CgkJI2VuZGlmCgkjZW5kaWYKI2VuZGlmYCxZMT1gI2lmZGVmIFVTRV9GT0cKCXZGb2dEZXB0aCA9IC0gbXZQb3NpdGlvbi56OwojZW5kaWZgLFoxPWAjaWZkZWYgVVNFX0ZPRwoJdmFyeWluZyBmbG9hdCB2Rm9nRGVwdGg7CiNlbmRpZmAsSjE9YCNpZmRlZiBVU0VfRk9HCgkjaWZkZWYgRk9HX0VYUDIKCQlmbG9hdCBmb2dGYWN0b3IgPSAxLjAgLSBleHAoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiB2Rm9nRGVwdGggKiB2Rm9nRGVwdGggKTsKCSNlbHNlCgkJZmxvYXQgZm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCB2Rm9nRGVwdGggKTsKCSNlbmRpZgoJZ2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApOwojZW5kaWZgLEsxPWAjaWZkZWYgVVNFX0ZPRwoJdW5pZm9ybSB2ZWMzIGZvZ0NvbG9yOwoJdmFyeWluZyBmbG9hdCB2Rm9nRGVwdGg7CgkjaWZkZWYgRk9HX0VYUDIKCQl1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7CgkjZWxzZQoJCXVuaWZvcm0gZmxvYXQgZm9nTmVhcjsKCQl1bmlmb3JtIGZsb2F0IGZvZ0ZhcjsKCSNlbmRpZgojZW5kaWZgLGoxPWAjaWZkZWYgVVNFX0dSQURJRU5UTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDsKI2VuZGlmCnZlYzMgZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCB2ZWMzIG5vcm1hbCwgdmVjMyBsaWdodERpcmVjdGlvbiApIHsKCWZsb2F0IGRvdE5MID0gZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7Cgl2ZWMyIGNvb3JkID0gdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApOwoJI2lmZGVmIFVTRV9HUkFESUVOVE1BUAoJCXJldHVybiB2ZWMzKCB0ZXh0dXJlMkQoIGdyYWRpZW50TWFwLCBjb29yZCApLnIgKTsKCSNlbHNlCgkJdmVjMiBmdyA9IGZ3aWR0aCggY29vcmQgKSAqIDAuNTsKCQlyZXR1cm4gbWl4KCB2ZWMzKCAwLjcgKSwgdmVjMyggMS4wICksIHNtb290aHN0ZXAoIDAuNyAtIGZ3LngsIDAuNyArIGZ3LngsIGNvb3JkLnggKSApOwoJI2VuZGlmCn1gLFExPWAjaWZkZWYgVVNFX0xJR0hUTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBsaWdodE1hcDsKCXVuaWZvcm0gZmxvYXQgbGlnaHRNYXBJbnRlbnNpdHk7CiNlbmRpZmAsdHc9YExhbWJlcnRNYXRlcmlhbCBtYXRlcmlhbDsKbWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjsKbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aCA9IHNwZWN1bGFyU3RyZW5ndGg7YCxldz1gdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CnN0cnVjdCBMYW1iZXJ0TWF0ZXJpYWwgewoJdmVjMyBkaWZmdXNlQ29sb3I7CglmbG9hdCBzcGVjdWxhclN0cmVuZ3RoOwp9Owp2b2lkIFJFX0RpcmVjdF9MYW1iZXJ0KCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBMYW1iZXJ0TWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeU5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTsKCXZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7CglyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwp9CnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gTGFtYmVydE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQojZGVmaW5lIFJFX0RpcmVjdAkJCQlSRV9EaXJlY3RfTGFtYmVydAojZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZQkJUkVfSW5kaXJlY3REaWZmdXNlX0xhbWJlcnRgLG53PWB1bmlmb3JtIGJvb2wgcmVjZWl2ZVNoYWRvdzsKdW5pZm9ybSB2ZWMzIGFtYmllbnRMaWdodENvbG9yOwojaWYgZGVmaW5lZCggVVNFX0xJR0hUX1BST0JFUyApCgl1bmlmb3JtIHZlYzMgbGlnaHRQcm9iZVsgOSBdOwojZW5kaWYKdmVjMyBzaEdldElycmFkaWFuY2VBdCggaW4gdmVjMyBub3JtYWwsIGluIHZlYzMgc2hDb2VmZmljaWVudHNbIDkgXSApIHsKCWZsb2F0IHggPSBub3JtYWwueCwgeSA9IG5vcm1hbC55LCB6ID0gbm9ybWFsLno7Cgl2ZWMzIHJlc3VsdCA9IHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNzsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMSBdICogMi4wICogMC41MTE2NjQgKiB5OwoJcmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAyIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHo7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNSBdICogMi4wICogMC40MjkwNDMgKiB5ICogejsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNiBdICogKCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgOCBdICogMC40MjkwNDMgKiAoIHggKiB4IC0geSAqIHkgKTsKCXJldHVybiByZXN1bHQ7Cn0KdmVjMyBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBsaWdodFByb2JlWyA5IF0sIGNvbnN0IGluIHZlYzMgbm9ybWFsICkgewoJdmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApOwoJdmVjMyBpcnJhZGlhbmNlID0gc2hHZXRJcnJhZGlhbmNlQXQoIHdvcmxkTm9ybWFsLCBsaWdodFByb2JlICk7CglyZXR1cm4gaXJyYWRpYW5jZTsKfQp2ZWMzIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgYW1iaWVudExpZ2h0Q29sb3IgKSB7Cgl2ZWMzIGlycmFkaWFuY2UgPSBhbWJpZW50TGlnaHRDb2xvcjsKCXJldHVybiBpcnJhZGlhbmNlOwp9CmZsb2F0IGdldERpc3RhbmNlQXR0ZW51YXRpb24oIGNvbnN0IGluIGZsb2F0IGxpZ2h0RGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGN1dG9mZkRpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBkZWNheUV4cG9uZW50ICkgewoJZmxvYXQgZGlzdGFuY2VGYWxsb2ZmID0gMS4wIC8gbWF4KCBwb3coIGxpZ2h0RGlzdGFuY2UsIGRlY2F5RXhwb25lbnQgKSwgMC4wMSApOwoJaWYgKCBjdXRvZmZEaXN0YW5jZSA+IDAuMCApIHsKCQlkaXN0YW5jZUZhbGxvZmYgKj0gcG93Miggc2F0dXJhdGUoIDEuMCAtIHBvdzQoIGxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSApICkgKTsKCX0KCXJldHVybiBkaXN0YW5jZUZhbGxvZmY7Cn0KZmxvYXQgZ2V0U3BvdEF0dGVudWF0aW9uKCBjb25zdCBpbiBmbG9hdCBjb25lQ29zaW5lLCBjb25zdCBpbiBmbG9hdCBwZW51bWJyYUNvc2luZSwgY29uc3QgaW4gZmxvYXQgYW5nbGVDb3NpbmUgKSB7CglyZXR1cm4gc21vb3Roc3RlcCggY29uZUNvc2luZSwgcGVudW1icmFDb3NpbmUsIGFuZ2xlQ29zaW5lICk7Cn0KI2lmIE5VTV9ESVJfTElHSFRTID4gMAoJc3RydWN0IERpcmVjdGlvbmFsTGlnaHQgewoJCXZlYzMgZGlyZWN0aW9uOwoJCXZlYzMgY29sb3I7Cgl9OwoJdW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHRzWyBOVU1fRElSX0xJR0hUUyBdOwoJdm9pZCBnZXREaXJlY3Rpb25hbExpZ2h0SW5mbyggY29uc3QgaW4gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0LCBvdXQgSW5jaWRlbnRMaWdodCBsaWdodCApIHsKCQlsaWdodC5jb2xvciA9IGRpcmVjdGlvbmFsTGlnaHQuY29sb3I7CgkJbGlnaHQuZGlyZWN0aW9uID0gZGlyZWN0aW9uYWxMaWdodC5kaXJlY3Rpb247CgkJbGlnaHQudmlzaWJsZSA9IHRydWU7Cgl9CiNlbmRpZgojaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDAKCXN0cnVjdCBQb2ludExpZ2h0IHsKCQl2ZWMzIHBvc2l0aW9uOwoJCXZlYzMgY29sb3I7CgkJZmxvYXQgZGlzdGFuY2U7CgkJZmxvYXQgZGVjYXk7Cgl9OwoJdW5pZm9ybSBQb2ludExpZ2h0IHBvaW50TGlnaHRzWyBOVU1fUE9JTlRfTElHSFRTIF07Cgl2b2lkIGdldFBvaW50TGlnaHRJbmZvKCBjb25zdCBpbiBQb2ludExpZ2h0IHBvaW50TGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgb3V0IEluY2lkZW50TGlnaHQgbGlnaHQgKSB7CgkJdmVjMyBsVmVjdG9yID0gcG9pbnRMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5UG9zaXRpb247CgkJbGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7CgkJZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApOwoJCWxpZ2h0LmNvbG9yID0gcG9pbnRMaWdodC5jb2xvcjsKCQlsaWdodC5jb2xvciAqPSBnZXREaXN0YW5jZUF0dGVudWF0aW9uKCBsaWdodERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7CgkJbGlnaHQudmlzaWJsZSA9ICggbGlnaHQuY29sb3IgIT0gdmVjMyggMC4wICkgKTsKCX0KI2VuZGlmCiNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwCglzdHJ1Y3QgU3BvdExpZ2h0IHsKCQl2ZWMzIHBvc2l0aW9uOwoJCXZlYzMgZGlyZWN0aW9uOwoJCXZlYzMgY29sb3I7CgkJZmxvYXQgZGlzdGFuY2U7CgkJZmxvYXQgZGVjYXk7CgkJZmxvYXQgY29uZUNvczsKCQlmbG9hdCBwZW51bWJyYUNvczsKCX07Cgl1bmlmb3JtIFNwb3RMaWdodCBzcG90TGlnaHRzWyBOVU1fU1BPVF9MSUdIVFMgXTsKCXZvaWQgZ2V0U3BvdExpZ2h0SW5mbyggY29uc3QgaW4gU3BvdExpZ2h0IHNwb3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBvdXQgSW5jaWRlbnRMaWdodCBsaWdodCApIHsKCQl2ZWMzIGxWZWN0b3IgPSBzcG90TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeVBvc2l0aW9uOwoJCWxpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApOwoJCWZsb2F0IGFuZ2xlQ29zID0gZG90KCBsaWdodC5kaXJlY3Rpb24sIHNwb3RMaWdodC5kaXJlY3Rpb24gKTsKCQlmbG9hdCBzcG90QXR0ZW51YXRpb24gPSBnZXRTcG90QXR0ZW51YXRpb24oIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7CgkJaWYgKCBzcG90QXR0ZW51YXRpb24gPiAwLjAgKSB7CgkJCWZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTsKCQkJbGlnaHQuY29sb3IgPSBzcG90TGlnaHQuY29sb3IgKiBzcG90QXR0ZW51YXRpb247CgkJCWxpZ2h0LmNvbG9yICo9IGdldERpc3RhbmNlQXR0ZW51YXRpb24oIGxpZ2h0RGlzdGFuY2UsIHNwb3RMaWdodC5kaXN0YW5jZSwgc3BvdExpZ2h0LmRlY2F5ICk7CgkJCWxpZ2h0LnZpc2libGUgPSAoIGxpZ2h0LmNvbG9yICE9IHZlYzMoIDAuMCApICk7CgkJfSBlbHNlIHsKCQkJbGlnaHQuY29sb3IgPSB2ZWMzKCAwLjAgKTsKCQkJbGlnaHQudmlzaWJsZSA9IGZhbHNlOwoJCX0KCX0KI2VuZGlmCiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAKCXN0cnVjdCBSZWN0QXJlYUxpZ2h0IHsKCQl2ZWMzIGNvbG9yOwoJCXZlYzMgcG9zaXRpb247CgkJdmVjMyBoYWxmV2lkdGg7CgkJdmVjMyBoYWxmSGVpZ2h0OwoJfTsKCXVuaWZvcm0gc2FtcGxlcjJEIGx0Y18xOwl1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMjsKCXVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTsKI2VuZGlmCiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwCglzdHJ1Y3QgSGVtaXNwaGVyZUxpZ2h0IHsKCQl2ZWMzIGRpcmVjdGlvbjsKCQl2ZWMzIHNreUNvbG9yOwoJCXZlYzMgZ3JvdW5kQ29sb3I7Cgl9OwoJdW5pZm9ybSBIZW1pc3BoZXJlTGlnaHQgaGVtaXNwaGVyZUxpZ2h0c1sgTlVNX0hFTUlfTElHSFRTIF07Cgl2ZWMzIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIEhlbWlzcGhlcmVMaWdodCBoZW1pTGlnaHQsIGNvbnN0IGluIHZlYzMgbm9ybWFsICkgewoJCWZsb2F0IGRvdE5MID0gZG90KCBub3JtYWwsIGhlbWlMaWdodC5kaXJlY3Rpb24gKTsKCQlmbG9hdCBoZW1pRGlmZnVzZVdlaWdodCA9IDAuNSAqIGRvdE5MICsgMC41OwoJCXZlYzMgaXJyYWRpYW5jZSA9IG1peCggaGVtaUxpZ2h0Lmdyb3VuZENvbG9yLCBoZW1pTGlnaHQuc2t5Q29sb3IsIGhlbWlEaWZmdXNlV2VpZ2h0ICk7CgkJcmV0dXJuIGlycmFkaWFuY2U7Cgl9CiNlbmRpZmAsaXc9YCNpZmRlZiBVU0VfRU5WTUFQCgl2ZWMzIGdldElCTElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkgewoJCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWCgkJCXZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTsKCQkJdmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgZW52TWFwUm90YXRpb24gKiB3b3JsZE5vcm1hbCwgMS4wICk7CgkJCXJldHVybiBQSSAqIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTsKCQkjZWxzZQoJCQlyZXR1cm4gdmVjMyggMC4wICk7CgkJI2VuZGlmCgl9Cgl2ZWMzIGdldElCTFJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7CgkJI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVYKCQkJdmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggLSB2aWV3RGlyLCBub3JtYWwgKTsKCQkJcmVmbGVjdFZlYyA9IG5vcm1hbGl6ZSggbWl4KCByZWZsZWN0VmVjLCBub3JtYWwsIHJvdWdobmVzcyAqIHJvdWdobmVzcykgKTsKCQkJcmVmbGVjdFZlYyA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTsKCQkJdmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgZW52TWFwUm90YXRpb24gKiByZWZsZWN0VmVjLCByb3VnaG5lc3MgKTsKCQkJcmV0dXJuIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTsKCQkjZWxzZQoJCQlyZXR1cm4gdmVjMyggMC4wICk7CgkJI2VuZGlmCgl9CgkjaWZkZWYgVVNFX0FOSVNPVFJPUFkKCQl2ZWMzIGdldElCTEFuaXNvdHJvcHlSYWRpYW5jZSggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiB2ZWMzIGJpdGFuZ2VudCwgY29uc3QgaW4gZmxvYXQgYW5pc290cm9weSApIHsKCQkJI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVYKCQkJCXZlYzMgYmVudE5vcm1hbCA9IGNyb3NzKCBiaXRhbmdlbnQsIHZpZXdEaXIgKTsKCQkJCWJlbnROb3JtYWwgPSBub3JtYWxpemUoIGNyb3NzKCBiZW50Tm9ybWFsLCBiaXRhbmdlbnQgKSApOwoJCQkJYmVudE5vcm1hbCA9IG5vcm1hbGl6ZSggbWl4KCBiZW50Tm9ybWFsLCBub3JtYWwsIHBvdzIoIHBvdzIoIDEuMCAtIGFuaXNvdHJvcHkgKiAoIDEuMCAtIHJvdWdobmVzcyApICkgKSApICk7CgkJCQlyZXR1cm4gZ2V0SUJMUmFkaWFuY2UoIHZpZXdEaXIsIGJlbnROb3JtYWwsIHJvdWdobmVzcyApOwoJCQkjZWxzZQoJCQkJcmV0dXJuIHZlYzMoIDAuMCApOwoJCQkjZW5kaWYKCQl9CgkjZW5kaWYKI2VuZGlmYCxydz1gVG9vbk1hdGVyaWFsIG1hdGVyaWFsOwptYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO2Asc3c9YHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwpzdHJ1Y3QgVG9vbk1hdGVyaWFsIHsKCXZlYzMgZGlmZnVzZUNvbG9yOwp9Owp2b2lkIFJFX0RpcmVjdF9Ub29uKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBUb29uTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJdmVjMyBpcnJhZGlhbmNlID0gZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCBnZW9tZXRyeU5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjsKCXJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7Cn0Kdm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfVG9vbiggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBUb29uTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwp9CiNkZWZpbmUgUkVfRGlyZWN0CQkJCVJFX0RpcmVjdF9Ub29uCiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlCQlSRV9JbmRpcmVjdERpZmZ1c2VfVG9vbmAsb3c9YEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDsKbWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjsKbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IHNwZWN1bGFyOwptYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyA9IHNoaW5pbmVzczsKbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aCA9IHNwZWN1bGFyU3RyZW5ndGg7YCxhdz1gdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CnN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwgewoJdmVjMyBkaWZmdXNlQ29sb3I7Cgl2ZWMzIHNwZWN1bGFyQ29sb3I7CglmbG9hdCBzcGVjdWxhclNoaW5pbmVzczsKCWZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7Cn07CnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CglmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApOwoJdmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjsKCXJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7CglyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9CbGlublBob25nKCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoOwp9CnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQojZGVmaW5lIFJFX0RpcmVjdAkJCQlSRV9EaXJlY3RfQmxpbm5QaG9uZwojZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZQkJUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmdgLGN3PWBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsOwptYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiICogKCAxLjAgLSBtZXRhbG5lc3NGYWN0b3IgKTsKdmVjMyBkeHkgPSBtYXgoIGFicyggZEZkeCggbm9uUGVydHVyYmVkTm9ybWFsICkgKSwgYWJzKCBkRmR5KCBub25QZXJ0dXJiZWROb3JtYWwgKSApICk7CmZsb2F0IGdlb21ldHJ5Um91Z2huZXNzID0gbWF4KCBtYXgoIGR4eS54LCBkeHkueSApLCBkeHkueiApOwptYXRlcmlhbC5yb3VnaG5lc3MgPSBtYXgoIHJvdWdobmVzc0ZhY3RvciwgMC4wNTI1ICk7bWF0ZXJpYWwucm91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzOwptYXRlcmlhbC5yb3VnaG5lc3MgPSBtaW4oIG1hdGVyaWFsLnJvdWdobmVzcywgMS4wICk7CiNpZmRlZiBJT1IKCW1hdGVyaWFsLmlvciA9IGlvcjsKCSNpZmRlZiBVU0VfU1BFQ1VMQVIKCQlmbG9hdCBzcGVjdWxhckludGVuc2l0eUZhY3RvciA9IHNwZWN1bGFySW50ZW5zaXR5OwoJCXZlYzMgc3BlY3VsYXJDb2xvckZhY3RvciA9IHNwZWN1bGFyQ29sb3I7CgkJI2lmZGVmIFVTRV9TUEVDVUxBUl9DT0xPUk1BUAoJCQlzcGVjdWxhckNvbG9yRmFjdG9yICo9IHRleHR1cmUyRCggc3BlY3VsYXJDb2xvck1hcCwgdlNwZWN1bGFyQ29sb3JNYXBVdiApLnJnYjsKCQkjZW5kaWYKCQkjaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUAoJCQlzcGVjdWxhckludGVuc2l0eUZhY3RvciAqPSB0ZXh0dXJlMkQoIHNwZWN1bGFySW50ZW5zaXR5TWFwLCB2U3BlY3VsYXJJbnRlbnNpdHlNYXBVdiApLmE7CgkJI2VuZGlmCgkJbWF0ZXJpYWwuc3BlY3VsYXJGOTAgPSBtaXgoIHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yLCAxLjAsIG1ldGFsbmVzc0ZhY3RvciApOwoJI2Vsc2UKCQlmbG9hdCBzcGVjdWxhckludGVuc2l0eUZhY3RvciA9IDEuMDsKCQl2ZWMzIHNwZWN1bGFyQ29sb3JGYWN0b3IgPSB2ZWMzKCAxLjAgKTsKCQltYXRlcmlhbC5zcGVjdWxhckY5MCA9IDEuMDsKCSNlbmRpZgoJbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggbWluKCBwb3cyKCAoIG1hdGVyaWFsLmlvciAtIDEuMCApIC8gKCBtYXRlcmlhbC5pb3IgKyAxLjAgKSApICogc3BlY3VsYXJDb2xvckZhY3RvciwgdmVjMyggMS4wICkgKSAqIHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTsKI2Vsc2UKCW1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIDAuMDQgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7CgltYXRlcmlhbC5zcGVjdWxhckY5MCA9IDEuMDsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUCgltYXRlcmlhbC5jbGVhcmNvYXQgPSBjbGVhcmNvYXQ7CgltYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBjbGVhcmNvYXRSb3VnaG5lc3M7CgltYXRlcmlhbC5jbGVhcmNvYXRGMCA9IHZlYzMoIDAuMDQgKTsKCW1hdGVyaWFsLmNsZWFyY29hdEY5MCA9IDEuMDsKCSNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQCgkJbWF0ZXJpYWwuY2xlYXJjb2F0ICo9IHRleHR1cmUyRCggY2xlYXJjb2F0TWFwLCB2Q2xlYXJjb2F0TWFwVXYgKS54OwoJI2VuZGlmCgkjaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAKCQltYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKj0gdGV4dHVyZTJEKCBjbGVhcmNvYXRSb3VnaG5lc3NNYXAsIHZDbGVhcmNvYXRSb3VnaG5lc3NNYXBVdiApLnk7CgkjZW5kaWYKCW1hdGVyaWFsLmNsZWFyY29hdCA9IHNhdHVyYXRlKCBtYXRlcmlhbC5jbGVhcmNvYXQgKTsJbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gbWF4KCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIDAuMDUyNSApOwoJbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzOwoJbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gbWluKCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIDEuMCApOwojZW5kaWYKI2lmZGVmIFVTRV9ESVNQRVJTSU9OCgltYXRlcmlhbC5kaXNwZXJzaW9uID0gZGlzcGVyc2lvbjsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCW1hdGVyaWFsLmlyaWRlc2NlbmNlID0gaXJpZGVzY2VuY2U7CgltYXRlcmlhbC5pcmlkZXNjZW5jZUlPUiA9IGlyaWRlc2NlbmNlSU9SOwoJI2lmZGVmIFVTRV9JUklERVNDRU5DRU1BUAoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlICo9IHRleHR1cmUyRCggaXJpZGVzY2VuY2VNYXAsIHZJcmlkZXNjZW5jZU1hcFV2ICkucjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAKCQltYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcyA9IChpcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW0gLSBpcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW0pICogdGV4dHVyZTJEKCBpcmlkZXNjZW5jZVRoaWNrbmVzc01hcCwgdklyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXYgKS5nICsgaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtOwoJI2Vsc2UKCQltYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcyA9IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTgoJbWF0ZXJpYWwuc2hlZW5Db2xvciA9IHNoZWVuQ29sb3I7CgkjaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQCgkJbWF0ZXJpYWwuc2hlZW5Db2xvciAqPSB0ZXh0dXJlMkQoIHNoZWVuQ29sb3JNYXAsIHZTaGVlbkNvbG9yTWFwVXYgKS5yZ2I7CgkjZW5kaWYKCW1hdGVyaWFsLnNoZWVuUm91Z2huZXNzID0gY2xhbXAoIHNoZWVuUm91Z2huZXNzLCAwLjA3LCAxLjAgKTsKCSNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgkJbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgKj0gdGV4dHVyZTJEKCBzaGVlblJvdWdobmVzc01hcCwgdlNoZWVuUm91Z2huZXNzTWFwVXYgKS5hOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0FOSVNPVFJPUFkKCSNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUAoJCW1hdDIgYW5pc290cm9weU1hdCA9IG1hdDIoIGFuaXNvdHJvcHlWZWN0b3IueCwgYW5pc290cm9weVZlY3Rvci55LCAtIGFuaXNvdHJvcHlWZWN0b3IueSwgYW5pc290cm9weVZlY3Rvci54ICk7CgkJdmVjMyBhbmlzb3Ryb3B5UG9sYXIgPSB0ZXh0dXJlMkQoIGFuaXNvdHJvcHlNYXAsIHZBbmlzb3Ryb3B5TWFwVXYgKS5yZ2I7CgkJdmVjMiBhbmlzb3Ryb3B5ViA9IGFuaXNvdHJvcHlNYXQgKiBub3JtYWxpemUoIDIuMCAqIGFuaXNvdHJvcHlQb2xhci5yZyAtIHZlYzIoIDEuMCApICkgKiBhbmlzb3Ryb3B5UG9sYXIuYjsKCSNlbHNlCgkJdmVjMiBhbmlzb3Ryb3B5ViA9IGFuaXNvdHJvcHlWZWN0b3I7CgkjZW5kaWYKCW1hdGVyaWFsLmFuaXNvdHJvcHkgPSBsZW5ndGgoIGFuaXNvdHJvcHlWICk7CglpZiggbWF0ZXJpYWwuYW5pc290cm9weSA9PSAwLjAgKSB7CgkJYW5pc290cm9weVYgPSB2ZWMyKCAxLjAsIDAuMCApOwoJfSBlbHNlIHsKCQlhbmlzb3Ryb3B5ViAvPSBtYXRlcmlhbC5hbmlzb3Ryb3B5OwoJCW1hdGVyaWFsLmFuaXNvdHJvcHkgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuYW5pc290cm9weSApOwoJfQoJbWF0ZXJpYWwuYWxwaGFUID0gbWl4KCBwb3cyKCBtYXRlcmlhbC5yb3VnaG5lc3MgKSwgMS4wLCBwb3cyKCBtYXRlcmlhbC5hbmlzb3Ryb3B5ICkgKTsKCW1hdGVyaWFsLmFuaXNvdHJvcHlUID0gdGJuWyAwIF0gKiBhbmlzb3Ryb3B5Vi54ICsgdGJuWyAxIF0gKiBhbmlzb3Ryb3B5Vi55OwoJbWF0ZXJpYWwuYW5pc290cm9weUIgPSB0Ym5bIDEgXSAqIGFuaXNvdHJvcHlWLnggLSB0Ym5bIDAgXSAqIGFuaXNvdHJvcHlWLnk7CiNlbmRpZmAsbHc9YHN0cnVjdCBQaHlzaWNhbE1hdGVyaWFsIHsKCXZlYzMgZGlmZnVzZUNvbG9yOwoJZmxvYXQgcm91Z2huZXNzOwoJdmVjMyBzcGVjdWxhckNvbG9yOwoJZmxvYXQgc3BlY3VsYXJGOTA7CglmbG9hdCBkaXNwZXJzaW9uOwoJI2lmZGVmIFVTRV9DTEVBUkNPQVQKCQlmbG9hdCBjbGVhcmNvYXQ7CgkJZmxvYXQgY2xlYXJjb2F0Um91Z2huZXNzOwoJCXZlYzMgY2xlYXJjb2F0RjA7CgkJZmxvYXQgY2xlYXJjb2F0RjkwOwoJI2VuZGlmCgkjaWZkZWYgVVNFX0lSSURFU0NFTkNFCgkJZmxvYXQgaXJpZGVzY2VuY2U7CgkJZmxvYXQgaXJpZGVzY2VuY2VJT1I7CgkJZmxvYXQgaXJpZGVzY2VuY2VUaGlja25lc3M7CgkJdmVjMyBpcmlkZXNjZW5jZUZyZXNuZWw7CgkJdmVjMyBpcmlkZXNjZW5jZUYwOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1NIRUVOCgkJdmVjMyBzaGVlbkNvbG9yOwoJCWZsb2F0IHNoZWVuUm91Z2huZXNzOwoJI2VuZGlmCgkjaWZkZWYgSU9SCgkJZmxvYXQgaW9yOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJCWZsb2F0IHRyYW5zbWlzc2lvbjsKCQlmbG9hdCB0cmFuc21pc3Npb25BbHBoYTsKCQlmbG9hdCB0aGlja25lc3M7CgkJZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZTsKCQl2ZWMzIGF0dGVudWF0aW9uQ29sb3I7CgkjZW5kaWYKCSNpZmRlZiBVU0VfQU5JU09UUk9QWQoJCWZsb2F0IGFuaXNvdHJvcHk7CgkJZmxvYXQgYWxwaGFUOwoJCXZlYzMgYW5pc290cm9weVQ7CgkJdmVjMyBhbmlzb3Ryb3B5QjsKCSNlbmRpZgp9Owp2ZWMzIGNsZWFyY29hdFNwZWN1bGFyRGlyZWN0ID0gdmVjMyggMC4wICk7CnZlYzMgY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdCA9IHZlYzMoIDAuMCApOwp2ZWMzIHNoZWVuU3BlY3VsYXJEaXJlY3QgPSB2ZWMzKCAwLjAgKTsKdmVjMyBzaGVlblNwZWN1bGFySW5kaXJlY3QgPSB2ZWMzKDAuMCApOwp2ZWMzIFNjaGxpY2tfdG9fRjAoIGNvbnN0IGluIHZlYzMgZiwgY29uc3QgaW4gZmxvYXQgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHsKICAgIGZsb2F0IHggPSBjbGFtcCggMS4wIC0gZG90VkgsIDAuMCwgMS4wICk7CiAgICBmbG9hdCB4MiA9IHggKiB4OwogICAgZmxvYXQgeDUgPSBjbGFtcCggeCAqIHgyICogeDIsIDAuMCwgMC45OTk5ICk7CiAgICByZXR1cm4gKCBmIC0gdmVjMyggZjkwICkgKiB4NSApIC8gKCAxLjAgLSB4NSApOwp9CmZsb2F0IFZfR0dYX1NtaXRoQ29ycmVsYXRlZCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHsKCWZsb2F0IGEyID0gcG93MiggYWxwaGEgKTsKCWZsb2F0IGd2ID0gZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTsKCWZsb2F0IGdsID0gZG90TlYgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTsKCXJldHVybiAwLjUgLyBtYXgoIGd2ICsgZ2wsIEVQU0lMT04gKTsKfQpmbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkgewoJZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApOwoJZmxvYXQgZGVub20gPSBwb3cyKCBkb3ROSCApICogKCBhMiAtIDEuMCApICsgMS4wOwoJcmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7Cn0KI2lmZGVmIFVTRV9BTklTT1RST1BZCglmbG9hdCBWX0dHWF9TbWl0aENvcnJlbGF0ZWRfQW5pc290cm9waWMoIGNvbnN0IGluIGZsb2F0IGFscGhhVCwgY29uc3QgaW4gZmxvYXQgYWxwaGFCLCBjb25zdCBpbiBmbG9hdCBkb3RUViwgY29uc3QgaW4gZmxvYXQgZG90QlYsIGNvbnN0IGluIGZsb2F0IGRvdFRMLCBjb25zdCBpbiBmbG9hdCBkb3RCTCwgY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IGRvdE5MICkgewoJCWZsb2F0IGd2ID0gZG90TkwgKiBsZW5ndGgoIHZlYzMoIGFscGhhVCAqIGRvdFRWLCBhbHBoYUIgKiBkb3RCViwgZG90TlYgKSApOwoJCWZsb2F0IGdsID0gZG90TlYgKiBsZW5ndGgoIHZlYzMoIGFscGhhVCAqIGRvdFRMLCBhbHBoYUIgKiBkb3RCTCwgZG90TkwgKSApOwoJCWZsb2F0IHYgPSAwLjUgLyAoIGd2ICsgZ2wgKTsKCQlyZXR1cm4gc2F0dXJhdGUodik7Cgl9CglmbG9hdCBEX0dHWF9Bbmlzb3Ryb3BpYyggY29uc3QgaW4gZmxvYXQgYWxwaGFULCBjb25zdCBpbiBmbG9hdCBhbHBoYUIsIGNvbnN0IGluIGZsb2F0IGRvdE5ILCBjb25zdCBpbiBmbG9hdCBkb3RUSCwgY29uc3QgaW4gZmxvYXQgZG90QkggKSB7CgkJZmxvYXQgYTIgPSBhbHBoYVQgKiBhbHBoYUI7CgkJaGlnaHAgdmVjMyB2ID0gdmVjMyggYWxwaGFCICogZG90VEgsIGFscGhhVCAqIGRvdEJILCBhMiAqIGRvdE5IICk7CgkJaGlnaHAgZmxvYXQgdjIgPSBkb3QoIHYsIHYgKTsKCQlmbG9hdCB3MiA9IGEyIC8gdjI7CgkJcmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAqIHBvdzIgKCB3MiApOwoJfQojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVQKCXZlYzMgQlJERl9HR1hfQ2xlYXJjb2F0KCBjb25zdCBpbiB2ZWMzIGxpZ2h0RGlyLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsKSB7CgkJdmVjMyBmMCA9IG1hdGVyaWFsLmNsZWFyY29hdEYwOwoJCWZsb2F0IGY5MCA9IG1hdGVyaWFsLmNsZWFyY29hdEY5MDsKCQlmbG9hdCByb3VnaG5lc3MgPSBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3M7CgkJZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTsKCQl2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGxpZ2h0RGlyICsgdmlld0RpciApOwoJCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBsaWdodERpciApICk7CgkJZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApOwoJCWZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTsKCQlmbG9hdCBkb3RWSCA9IHNhdHVyYXRlKCBkb3QoIHZpZXdEaXIsIGhhbGZEaXIgKSApOwoJCXZlYzMgRiA9IEZfU2NobGljayggZjAsIGY5MCwgZG90VkggKTsKCQlmbG9hdCBWID0gVl9HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7CgkJZmxvYXQgRCA9IERfR0dYKCBhbHBoYSwgZG90TkggKTsKCQlyZXR1cm4gRiAqICggViAqIEQgKTsKCX0KI2VuZGlmCnZlYzMgQlJERl9HR1goIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwgKSB7Cgl2ZWMzIGYwID0gbWF0ZXJpYWwuc3BlY3VsYXJDb2xvcjsKCWZsb2F0IGY5MCA9IG1hdGVyaWFsLnNwZWN1bGFyRjkwOwoJZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwucm91Z2huZXNzOwoJZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTsKCXZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggbGlnaHREaXIgKyB2aWV3RGlyICk7CglmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgbGlnaHREaXIgKSApOwoJZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApOwoJZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApOwoJZmxvYXQgZG90VkggPSBzYXR1cmF0ZSggZG90KCB2aWV3RGlyLCBoYWxmRGlyICkgKTsKCXZlYzMgRiA9IEZfU2NobGljayggZjAsIGY5MCwgZG90VkggKTsKCSNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCQlGID0gbWl4KCBGLCBtYXRlcmlhbC5pcmlkZXNjZW5jZUZyZXNuZWwsIG1hdGVyaWFsLmlyaWRlc2NlbmNlICk7CgkjZW5kaWYKCSNpZmRlZiBVU0VfQU5JU09UUk9QWQoJCWZsb2F0IGRvdFRMID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5VCwgbGlnaHREaXIgKTsKCQlmbG9hdCBkb3RUViA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weVQsIHZpZXdEaXIgKTsKCQlmbG9hdCBkb3RUSCA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weVQsIGhhbGZEaXIgKTsKCQlmbG9hdCBkb3RCTCA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weUIsIGxpZ2h0RGlyICk7CgkJZmxvYXQgZG90QlYgPSBkb3QoIG1hdGVyaWFsLmFuaXNvdHJvcHlCLCB2aWV3RGlyICk7CgkJZmxvYXQgZG90QkggPSBkb3QoIG1hdGVyaWFsLmFuaXNvdHJvcHlCLCBoYWxmRGlyICk7CgkJZmxvYXQgViA9IFZfR0dYX1NtaXRoQ29ycmVsYXRlZF9Bbmlzb3Ryb3BpYyggbWF0ZXJpYWwuYWxwaGFULCBhbHBoYSwgZG90VFYsIGRvdEJWLCBkb3RUTCwgZG90QkwsIGRvdE5WLCBkb3ROTCApOwoJCWZsb2F0IEQgPSBEX0dHWF9Bbmlzb3Ryb3BpYyggbWF0ZXJpYWwuYWxwaGFULCBhbHBoYSwgZG90TkgsIGRvdFRILCBkb3RCSCApOwoJI2Vsc2UKCQlmbG9hdCBWID0gVl9HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7CgkJZmxvYXQgRCA9IERfR0dYKCBhbHBoYSwgZG90TkggKTsKCSNlbmRpZgoJcmV0dXJuIEYgKiAoIFYgKiBEICk7Cn0KdmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7Cgljb25zdCBmbG9hdCBMVVRfU0laRSA9IDY0LjA7Cgljb25zdCBmbG9hdCBMVVRfU0NBTEUgPSAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0laRTsKCWNvbnN0IGZsb2F0IExVVF9CSUFTID0gMC41IC8gTFVUX1NJWkU7CglmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIE4sIFYgKSApOwoJdmVjMiB1diA9IHZlYzIoIHJvdWdobmVzcywgc3FydCggMS4wIC0gZG90TlYgKSApOwoJdXYgPSB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTOwoJcmV0dXJuIHV2Owp9CmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkgewoJZmxvYXQgbCA9IGxlbmd0aCggZiApOwoJcmV0dXJuIG1heCggKCBsICogbCArIGYueiApIC8gKCBsICsgMS4wICksIDAuMCApOwp9CnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkgewoJZmxvYXQgeCA9IGRvdCggdjEsIHYyICk7CglmbG9hdCB5ID0gYWJzKCB4ICk7CglmbG9hdCBhID0gMC44NTQzOTg1ICsgKCAwLjQ5NjUxNTUgKyAwLjAxNDUyMDYgKiB5ICkgKiB5OwoJZmxvYXQgYiA9IDMuNDE3NTk0MCArICggNC4xNjE2NzI0ICsgeSApICogeTsKCWZsb2F0IHYgPSBhIC8gYjsKCWZsb2F0IHRoZXRhX3NpbnRoZXRhID0gKCB4ID4gMC4wICkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIG1heCggMS4wIC0geCAqIHgsIDFlLTcgKSApIC0gdjsKCXJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTsKfQp2ZWMzIExUQ19FdmFsdWF0ZSggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIHZlYzMgUCwgY29uc3QgaW4gbWF0MyBtSW52LCBjb25zdCBpbiB2ZWMzIHJlY3RDb29yZHNbIDQgXSApIHsKCXZlYzMgdjEgPSByZWN0Q29vcmRzWyAxIF0gLSByZWN0Q29vcmRzWyAwIF07Cgl2ZWMzIHYyID0gcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdOwoJdmVjMyBsaWdodE5vcm1hbCA9IGNyb3NzKCB2MSwgdjIgKTsKCWlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVjdENvb3Jkc1sgMCBdICkgPCAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7Cgl2ZWMzIFQxLCBUMjsKCVQxID0gbm9ybWFsaXplKCBWIC0gTiAqIGRvdCggViwgTiApICk7CglUMiA9IC0gY3Jvc3MoIE4sIFQxICk7CgltYXQzIG1hdCA9IG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApOwoJdmVjMyBjb29yZHNbIDQgXTsKCWNvb3Jkc1sgMCBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAwIF0gLSBQICk7Cgljb29yZHNbIDEgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApOwoJY29vcmRzWyAyIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDIgXSAtIFAgKTsKCWNvb3Jkc1sgMyBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7Cgljb29yZHNbIDAgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTsKCWNvb3Jkc1sgMSBdID0gbm9ybWFsaXplKCBjb29yZHNbIDEgXSApOwoJY29vcmRzWyAyIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMiBdICk7Cgljb29yZHNbIDMgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTsKCXZlYzMgdmVjdG9yRm9ybUZhY3RvciA9IHZlYzMoIDAuMCApOwoJdmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSApOwoJdmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApOwoJdmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMiBdLCBjb29yZHNbIDMgXSApOwoJdmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAgXSApOwoJZmxvYXQgcmVzdWx0ID0gTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICk7CglyZXR1cm4gdmVjMyggcmVzdWx0ICk7Cn0KI2lmIGRlZmluZWQoIFVTRV9TSEVFTiApCmZsb2F0IERfQ2hhcmxpZSggZmxvYXQgcm91Z2huZXNzLCBmbG9hdCBkb3ROSCApIHsKCWZsb2F0IGFscGhhID0gcG93Miggcm91Z2huZXNzICk7CglmbG9hdCBpbnZBbHBoYSA9IDEuMCAvIGFscGhhOwoJZmxvYXQgY29zMmggPSBkb3ROSCAqIGRvdE5IOwoJZmxvYXQgc2luMmggPSBtYXgoIDEuMCAtIGNvczJoLCAwLjAwNzgxMjUgKTsKCXJldHVybiAoIDIuMCArIGludkFscGhhICkgKiBwb3coIHNpbjJoLCBpbnZBbHBoYSAqIDAuNSApIC8gKCAyLjAgKiBQSSApOwp9CmZsb2F0IFZfTmV1YmVsdCggZmxvYXQgZG90TlYsIGZsb2F0IGRvdE5MICkgewoJcmV0dXJuIHNhdHVyYXRlKCAxLjAgLyAoIDQuMCAqICggZG90TkwgKyBkb3ROViAtIGRvdE5MICogZG90TlYgKSApICk7Cn0KdmVjMyBCUkRGX1NoZWVuKCBjb25zdCBpbiB2ZWMzIGxpZ2h0RGlyLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCB2ZWMzIHNoZWVuQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoZWVuUm91Z2huZXNzICkgewoJdmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTsKCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBsaWdodERpciApICk7CglmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7CglmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaGFsZkRpciApICk7CglmbG9hdCBEID0gRF9DaGFybGllKCBzaGVlblJvdWdobmVzcywgZG90TkggKTsKCWZsb2F0IFYgPSBWX05ldWJlbHQoIGRvdE5WLCBkb3ROTCApOwoJcmV0dXJuIHNoZWVuQ29sb3IgKiAoIEQgKiBWICk7Cn0KI2VuZGlmCmZsb2F0IElCTFNoZWVuQlJERiggY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkgewoJZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApOwoJZmxvYXQgcjIgPSByb3VnaG5lc3MgKiByb3VnaG5lc3M7CglmbG9hdCBhID0gcm91Z2huZXNzIDwgMC4yNSA/IC0zMzkuMiAqIHIyICsgMTYxLjQgKiByb3VnaG5lc3MgLSAyNS45IDogLTguNDggKiByMiArIDE0LjMgKiByb3VnaG5lc3MgLSA5Ljk1OwoJZmxvYXQgYiA9IHJvdWdobmVzcyA8IDAuMjUgPyA0NC4wICogcjIgLSAyMy43ICogcm91Z2huZXNzICsgMy4yNiA6IDEuOTcgKiByMiAtIDMuMjcgKiByb3VnaG5lc3MgKyAwLjcyOwoJZmxvYXQgREcgPSBleHAoIGEgKiBkb3ROViArIGIgKSArICggcm91Z2huZXNzIDwgMC4yNSA/IDAuMCA6IDAuMSAqICggcm91Z2huZXNzIC0gMC4yNSApICk7CglyZXR1cm4gc2F0dXJhdGUoIERHICogUkVDSVBST0NBTF9QSSApOwp9CnZlYzIgREZHQXBwcm94KCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7CglmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7Cgljb25zdCB2ZWM0IGMwID0gdmVjNCggLSAxLCAtIDAuMDI3NSwgLSAwLjU3MiwgMC4wMjIgKTsKCWNvbnN0IHZlYzQgYzEgPSB2ZWM0KCAxLCAwLjA0MjUsIDEuMDQsIC0gMC4wNCApOwoJdmVjNCByID0gcm91Z2huZXNzICogYzAgKyBjMTsKCWZsb2F0IGEwMDQgPSBtaW4oIHIueCAqIHIueCwgZXhwMiggLSA5LjI4ICogZG90TlYgKSApICogci54ICsgci55OwoJdmVjMiBmYWIgPSB2ZWMyKCAtIDEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3OwoJcmV0dXJuIGZhYjsKfQp2ZWMzIEVudmlyb25tZW50QlJERiggY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzcGVjdWxhckY5MCwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkgewoJdmVjMiBmYWIgPSBERkdBcHByb3goIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7CglyZXR1cm4gc3BlY3VsYXJDb2xvciAqIGZhYi54ICsgc3BlY3VsYXJGOTAgKiBmYWIueTsKfQojaWZkZWYgVVNFX0lSSURFU0NFTkNFCnZvaWQgY29tcHV0ZU11bHRpc2NhdHRlcmluZ0lyaWRlc2NlbmNlKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiBmbG9hdCBpcmlkZXNjZW5jZSwgY29uc3QgaW4gdmVjMyBpcmlkZXNjZW5jZUYwLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGlub3V0IHZlYzMgc2luZ2xlU2NhdHRlciwgaW5vdXQgdmVjMyBtdWx0aVNjYXR0ZXIgKSB7CiNlbHNlCnZvaWQgY29tcHV0ZU11bHRpc2NhdHRlcmluZyggY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzcGVjdWxhckY5MCwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBpbm91dCB2ZWMzIHNpbmdsZVNjYXR0ZXIsIGlub3V0IHZlYzMgbXVsdGlTY2F0dGVyICkgewojZW5kaWYKCXZlYzIgZmFiID0gREZHQXBwcm94KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApOwoJI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJCXZlYzMgRnIgPSBtaXgoIHNwZWN1bGFyQ29sb3IsIGlyaWRlc2NlbmNlRjAsIGlyaWRlc2NlbmNlICk7CgkjZWxzZQoJCXZlYzMgRnIgPSBzcGVjdWxhckNvbG9yOwoJI2VuZGlmCgl2ZWMzIEZzc0VzcyA9IEZyICogZmFiLnggKyBzcGVjdWxhckY5MCAqIGZhYi55OwoJZmxvYXQgRXNzID0gZmFiLnggKyBmYWIueTsKCWZsb2F0IEVtcyA9IDEuMCAtIEVzczsKCXZlYzMgRmF2ZyA9IEZyICsgKCAxLjAgLSBGciApICogMC4wNDc2MTk7CXZlYzMgRm1zID0gRnNzRXNzICogRmF2ZyAvICggMS4wIC0gRW1zICogRmF2ZyApOwoJc2luZ2xlU2NhdHRlciArPSBGc3NFc3M7CgltdWx0aVNjYXR0ZXIgKz0gRm1zICogRW1zOwp9CiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAKCXZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJCXZlYzMgbm9ybWFsID0gZ2VvbWV0cnlOb3JtYWw7CgkJdmVjMyB2aWV3RGlyID0gZ2VvbWV0cnlWaWV3RGlyOwoJCXZlYzMgcG9zaXRpb24gPSBnZW9tZXRyeVBvc2l0aW9uOwoJCXZlYzMgbGlnaHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uOwoJCXZlYzMgaGFsZldpZHRoID0gcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7CgkJdmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0OwoJCXZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7CgkJZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwucm91Z2huZXNzOwoJCXZlYzMgcmVjdENvb3Jkc1sgNCBdOwoJCXJlY3RDb29yZHNbIDAgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoIC0gaGFsZkhlaWdodDsJCXJlY3RDb29yZHNbIDEgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDsKCQlyZWN0Q29vcmRzWyAyIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7CgkJcmVjdENvb3Jkc1sgMyBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0OwoJCXZlYzIgdXYgPSBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7CgkJdmVjNCB0MSA9IHRleHR1cmUyRCggbHRjXzEsIHV2ICk7CgkJdmVjNCB0MiA9IHRleHR1cmUyRCggbHRjXzIsIHV2ICk7CgkJbWF0MyBtSW52ID0gbWF0MygKCQkJdmVjMyggdDEueCwgMCwgdDEueSApLAoJCQl2ZWMzKCAgICAwLCAxLCAgICAwICksCgkJCXZlYzMoIHQxLnosIDAsIHQxLncgKQoJCSk7CgkJdmVjMyBmcmVzbmVsID0gKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogdDIueCArICggdmVjMyggMS4wICkgLSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICkgKiB0Mi55ICk7CgkJcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gbGlnaHRDb2xvciAqIGZyZXNuZWwgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTsKCQlyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEuMCApLCByZWN0Q29vcmRzICk7Cgl9CiNlbmRpZgp2b2lkIFJFX0RpcmVjdF9QaHlzaWNhbCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CglmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApOwoJdmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjsKCSNpZmRlZiBVU0VfQ0xFQVJDT0FUCgkJZmxvYXQgZG90TkxjYyA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApOwoJCXZlYzMgY2NJcnJhZGlhbmNlID0gZG90TkxjYyAqIGRpcmVjdExpZ2h0LmNvbG9yOwoJCWNsZWFyY29hdFNwZWN1bGFyRGlyZWN0ICs9IGNjSXJyYWRpYW5jZSAqIEJSREZfR0dYX0NsZWFyY29hdCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbCApOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1NIRUVOCgkJc2hlZW5TcGVjdWxhckRpcmVjdCArPSBpcnJhZGlhbmNlICogQlJERl9TaGVlbiggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbC5zaGVlbkNvbG9yLCBtYXRlcmlhbC5zaGVlblJvdWdobmVzcyApOwoJI2VuZGlmCglyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9HR1goIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeU5vcm1hbCwgbWF0ZXJpYWwgKTsKCXJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7Cn0Kdm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7Cn0Kdm9pZCBSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIHJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgY2xlYXJjb2F0UmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0KSB7CgkjaWZkZWYgVVNFX0NMRUFSQ09BVAoJCWNsZWFyY29hdFNwZWN1bGFySW5kaXJlY3QgKz0gY2xlYXJjb2F0UmFkaWFuY2UgKiBFbnZpcm9ubWVudEJSREYoIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIG1hdGVyaWFsLmNsZWFyY29hdEYwLCBtYXRlcmlhbC5jbGVhcmNvYXRGOTAsIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyApOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1NIRUVOCgkJc2hlZW5TcGVjdWxhckluZGlyZWN0ICs9IGlycmFkaWFuY2UgKiBtYXRlcmlhbC5zaGVlbkNvbG9yICogSUJMU2hlZW5CUkRGKCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBtYXRlcmlhbC5zaGVlblJvdWdobmVzcyApOwoJI2VuZGlmCgl2ZWMzIHNpbmdsZVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgbXVsdGlTY2F0dGVyaW5nID0gdmVjMyggMC4wICk7Cgl2ZWMzIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZSA9IGlycmFkaWFuY2UgKiBSRUNJUFJPQ0FMX1BJOwoJI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJCWNvbXB1dGVNdWx0aXNjYXR0ZXJpbmdJcmlkZXNjZW5jZSggZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsIG1hdGVyaWFsLmlyaWRlc2NlbmNlLCBtYXRlcmlhbC5pcmlkZXNjZW5jZUZyZXNuZWwsIG1hdGVyaWFsLnJvdWdobmVzcywgc2luZ2xlU2NhdHRlcmluZywgbXVsdGlTY2F0dGVyaW5nICk7CgkjZWxzZQoJCWNvbXB1dGVNdWx0aXNjYXR0ZXJpbmcoIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyRjkwLCBtYXRlcmlhbC5yb3VnaG5lc3MsIHNpbmdsZVNjYXR0ZXJpbmcsIG11bHRpU2NhdHRlcmluZyApOwoJI2VuZGlmCgl2ZWMzIHRvdGFsU2NhdHRlcmluZyA9IHNpbmdsZVNjYXR0ZXJpbmcgKyBtdWx0aVNjYXR0ZXJpbmc7Cgl2ZWMzIGRpZmZ1c2UgPSBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiAoIDEuMCAtIG1heCggbWF4KCB0b3RhbFNjYXR0ZXJpbmcuciwgdG90YWxTY2F0dGVyaW5nLmcgKSwgdG90YWxTY2F0dGVyaW5nLmIgKSApOwoJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArPSByYWRpYW5jZSAqIHNpbmdsZVNjYXR0ZXJpbmc7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IG11bHRpU2NhdHRlcmluZyAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBkaWZmdXNlICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlOwp9CiNkZWZpbmUgUkVfRGlyZWN0CQkJCVJFX0RpcmVjdF9QaHlzaWNhbAojZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYQkJUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsCiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlCQlSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwKI2RlZmluZSBSRV9JbmRpcmVjdFNwZWN1bGFyCQlSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsCmZsb2F0IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IGFtYmllbnRPY2NsdXNpb24sIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHsKCXJldHVybiBzYXR1cmF0ZSggcG93KCBkb3ROViArIGFtYmllbnRPY2NsdXNpb24sIGV4cDIoIC0gMTYuMCAqIHJvdWdobmVzcyAtIDEuMCApICkgLSAxLjAgKyBhbWJpZW50T2NjbHVzaW9uICk7Cn1gLHV3PWAKdmVjMyBnZW9tZXRyeVBvc2l0aW9uID0gLSB2Vmlld1Bvc2l0aW9uOwp2ZWMzIGdlb21ldHJ5Tm9ybWFsID0gbm9ybWFsOwp2ZWMzIGdlb21ldHJ5Vmlld0RpciA9ICggaXNPcnRob2dyYXBoaWMgKSA/IHZlYzMoIDAsIDAsIDEgKSA6IG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApOwp2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsID0gdmVjMyggMC4wICk7CiNpZmRlZiBVU0VfQ0xFQVJDT0FUCglnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCA9IGNsZWFyY29hdE5vcm1hbDsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCWZsb2F0IGRvdE5WaSA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyICkgKTsKCWlmICggbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MgPT0gMC4wICkgewoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlID0gMC4wOwoJfSBlbHNlIHsKCQltYXRlcmlhbC5pcmlkZXNjZW5jZSA9IHNhdHVyYXRlKCBtYXRlcmlhbC5pcmlkZXNjZW5jZSApOwoJfQoJaWYgKCBtYXRlcmlhbC5pcmlkZXNjZW5jZSA+IDAuMCApIHsKCQltYXRlcmlhbC5pcmlkZXNjZW5jZUZyZXNuZWwgPSBldmFsSXJpZGVzY2VuY2UoIDEuMCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2VJT1IsIGRvdE5WaSwgbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKTsKCQltYXRlcmlhbC5pcmlkZXNjZW5jZUYwID0gU2NobGlja190b19GMCggbWF0ZXJpYWwuaXJpZGVzY2VuY2VGcmVzbmVsLCAxLjAsIGRvdE5WaSApOwoJfQojZW5kaWYKSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDsKI2lmICggTlVNX1BPSU5UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKQoJUG9pbnRMaWdodCBwb2ludExpZ2h0OwoJI2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAKCVBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodFNoYWRvdzsKCSNlbmRpZgoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHsKCQlwb2ludExpZ2h0ID0gcG9pbnRMaWdodHNbIGkgXTsKCQlnZXRQb2ludExpZ2h0SW5mbyggcG9pbnRMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZGlyZWN0TGlnaHQgKTsKCQkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTICkKCQlwb2ludExpZ2h0U2hhZG93ID0gcG9pbnRMaWdodFNoYWRvd3NbIGkgXTsKCQlkaXJlY3RMaWdodC5jb2xvciAqPSAoIGRpcmVjdExpZ2h0LnZpc2libGUgJiYgcmVjZWl2ZVNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dJbnRlbnNpdHksIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93QmlhcywgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0sIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFGYXIgKSA6IDEuMDsKCQkjZW5kaWYKCQlSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWYKI2lmICggTlVNX1NQT1RfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApCglTcG90TGlnaHQgc3BvdExpZ2h0OwoJdmVjNCBzcG90Q29sb3I7Cgl2ZWMzIHNwb3RMaWdodENvb3JkOwoJYm9vbCBpblNwb3RMaWdodE1hcDsKCSNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDAKCVNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3c7CgkjZW5kaWYKCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHsKCQlzcG90TGlnaHQgPSBzcG90TGlnaHRzWyBpIF07CgkJZ2V0U3BvdExpZ2h0SW5mbyggc3BvdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBkaXJlY3RMaWdodCApOwoJCSNpZiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUyApCgkJI2RlZmluZSBTUE9UX0xJR0hUX01BUF9JTkRFWCBVTlJPTExFRF9MT09QX0lOREVYCgkJI2VsaWYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyApCgkJI2RlZmluZSBTUE9UX0xJR0hUX01BUF9JTkRFWCBOVU1fU1BPVF9MSUdIVF9NQVBTCgkJI2Vsc2UKCQkjZGVmaW5lIFNQT1RfTElHSFRfTUFQX0lOREVYICggVU5ST0xMRURfTE9PUF9JTkRFWCAtIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUyApCgkJI2VuZGlmCgkJI2lmICggU1BPVF9MSUdIVF9NQVBfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9NQVBTICkKCQkJc3BvdExpZ2h0Q29vcmQgPSB2U3BvdExpZ2h0Q29vcmRbIGkgXS54eXogLyB2U3BvdExpZ2h0Q29vcmRbIGkgXS53OwoJCQlpblNwb3RMaWdodE1hcCA9IGFsbCggbGVzc1RoYW4oIGFicyggc3BvdExpZ2h0Q29vcmQgKiAyLiAtIDEuICksIHZlYzMoIDEuMCApICkgKTsKCQkJc3BvdENvbG9yID0gdGV4dHVyZTJEKCBzcG90TGlnaHRNYXBbIFNQT1RfTElHSFRfTUFQX0lOREVYIF0sIHNwb3RMaWdodENvb3JkLnh5ICk7CgkJCWRpcmVjdExpZ2h0LmNvbG9yID0gaW5TcG90TGlnaHRNYXAgPyBkaXJlY3RMaWdodC5jb2xvciAqIHNwb3RDb2xvci5yZ2IgOiBkaXJlY3RMaWdodC5jb2xvcjsKCQkjZW5kaWYKCQkjdW5kZWYgU1BPVF9MSUdIVF9NQVBfSU5ERVgKCQkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKQoJCXNwb3RMaWdodFNoYWRvdyA9IHNwb3RMaWdodFNoYWRvd3NbIGkgXTsKCQlkaXJlY3RMaWdodC5jb2xvciAqPSAoIGRpcmVjdExpZ2h0LnZpc2libGUgJiYgcmVjZWl2ZVNoYWRvdyApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93SW50ZW5zaXR5LCBzcG90TGlnaHRTaGFkb3cuc2hhZG93Qmlhcywgc3BvdExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdlNwb3RMaWdodENvb3JkWyBpIF0gKSA6IDEuMDsKCQkjZW5kaWYKCQlSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWYKI2lmICggTlVNX0RJUl9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0ICkKCURpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDsKCSNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMAoJRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93OwoJI2VuZGlmCgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHsKCQlkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTsKCQlnZXREaXJlY3Rpb25hbExpZ2h0SW5mbyggZGlyZWN0aW9uYWxMaWdodCwgZGlyZWN0TGlnaHQgKTsKCQkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUyApCgkJZGlyZWN0aW9uYWxMaWdodFNoYWRvdyA9IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBpIF07CgkJZGlyZWN0TGlnaHQuY29sb3IgKj0gKCBkaXJlY3RMaWdodC52aXNpYmxlICYmIHJlY2VpdmVTaGFkb3cgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd0ludGVuc2l0eSwgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wOwoJCSNlbmRpZgoJCVJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5UG9zaXRpb24sIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTsKCX0KCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCiNlbmRpZgojaWYgKCBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3RfUmVjdEFyZWEgKQoJUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0OwoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1JFQ1RfQVJFQV9MSUdIVFM7IGkgKysgKSB7CgkJcmVjdEFyZWFMaWdodCA9IHJlY3RBcmVhTGlnaHRzWyBpIF07CgkJUkVfRGlyZWN0X1JlY3RBcmVhKCByZWN0QXJlYUxpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWYKI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApCgl2ZWMzIGlibElycmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgaXJyYWRpYW5jZSA9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7CgkjaWYgZGVmaW5lZCggVVNFX0xJR0hUX1BST0JFUyApCgkJaXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnlOb3JtYWwgKTsKCSNlbmRpZgoJI2lmICggTlVNX0hFTUlfTElHSFRTID4gMCApCgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHsKCQkJaXJyYWRpYW5jZSArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5Tm9ybWFsICk7CgkJfQoJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkjZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyICkKCXZlYzMgcmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgY2xlYXJjb2F0UmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKI2VuZGlmYCxodz1gI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApCgkjaWZkZWYgVVNFX0xJR0hUTUFQCgkJdmVjNCBsaWdodE1hcFRleGVsID0gdGV4dHVyZTJEKCBsaWdodE1hcCwgdkxpZ2h0TWFwVXYgKTsKCQl2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IGxpZ2h0TWFwVGV4ZWwucmdiICogbGlnaHRNYXBJbnRlbnNpdHk7CgkJaXJyYWRpYW5jZSArPSBsaWdodE1hcElycmFkaWFuY2U7CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggU1RBTkRBUkQgKSAmJiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWICkKCQlpYmxJcnJhZGlhbmNlICs9IGdldElCTElycmFkaWFuY2UoIGdlb21ldHJ5Tm9ybWFsICk7CgkjZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApCgkjaWZkZWYgVVNFX0FOSVNPVFJPUFkKCQlyYWRpYW5jZSArPSBnZXRJQkxBbmlzb3Ryb3B5UmFkaWFuY2UoIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnJvdWdobmVzcywgbWF0ZXJpYWwuYW5pc290cm9weUIsIG1hdGVyaWFsLmFuaXNvdHJvcHkgKTsKCSNlbHNlCgkJcmFkaWFuY2UgKz0gZ2V0SUJMUmFkaWFuY2UoIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnJvdWdobmVzcyApOwoJI2VuZGlmCgkjaWZkZWYgVVNFX0NMRUFSQ09BVAoJCWNsZWFyY29hdFJhZGlhbmNlICs9IGdldElCTFJhZGlhbmNlKCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTsKCSNlbmRpZgojZW5kaWZgLGZ3PWAjaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlICkKCVJFX0luZGlyZWN0RGlmZnVzZSggaXJyYWRpYW5jZSwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApOwojZW5kaWYKI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKQoJUkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGlibElycmFkaWFuY2UsIGNsZWFyY29hdFJhZGlhbmNlLCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7CiNlbmRpZmAsZHc9YCNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKQoJZ2xfRnJhZ0RlcHRoID0gdklzUGVyc3BlY3RpdmUgPT0gMC4wID8gZ2xfRnJhZ0Nvb3JkLnogOiBsb2cyKCB2RnJhZ0RlcHRoICkgKiBsb2dEZXB0aEJ1ZkZDICogMC41OwojZW5kaWZgLHB3PWAjaWYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGICkKCXVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQzsKCXZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDsKCXZhcnlpbmcgZmxvYXQgdklzUGVyc3BlY3RpdmU7CiNlbmRpZmAsbXc9YCNpZmRlZiBVU0VfTE9HREVQVEhCVUYKCXZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDsKCXZhcnlpbmcgZmxvYXQgdklzUGVyc3BlY3RpdmU7CiNlbmRpZmAsZ3c9YCNpZmRlZiBVU0VfTE9HREVQVEhCVUYKCXZGcmFnRGVwdGggPSAxLjAgKyBnbF9Qb3NpdGlvbi53OwoJdklzUGVyc3BlY3RpdmUgPSBmbG9hdCggaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApICk7CiNlbmRpZmAseHc9YCNpZmRlZiBVU0VfTUFQCgl2ZWM0IHNhbXBsZWREaWZmdXNlQ29sb3IgPSB0ZXh0dXJlMkQoIG1hcCwgdk1hcFV2ICk7CgkjaWZkZWYgREVDT0RFX1ZJREVPX1RFWFRVUkUKCQlzYW1wbGVkRGlmZnVzZUNvbG9yID0gc1JHQlRyYW5zZmVyRU9URiggc2FtcGxlZERpZmZ1c2VDb2xvciApOwoJI2VuZGlmCglkaWZmdXNlQ29sb3IgKj0gc2FtcGxlZERpZmZ1c2VDb2xvcjsKI2VuZGlmYCxfdz1gI2lmZGVmIFVTRV9NQVAKCXVuaWZvcm0gc2FtcGxlcjJEIG1hcDsKI2VuZGlmYCx5dz1gI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKQoJI2lmIGRlZmluZWQoIFVTRV9QT0lOVFNfVVYgKQoJCXZlYzIgdXYgPSB2VXY7CgkjZWxzZQoJCXZlYzIgdXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnksIDEgKSApLnh5OwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX01BUAoJZGlmZnVzZUNvbG9yICo9IHRleHR1cmUyRCggbWFwLCB1diApOwojZW5kaWYKI2lmZGVmIFVTRV9BTFBIQU1BUAoJZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdXYgKS5nOwojZW5kaWZgLHZ3PWAjaWYgZGVmaW5lZCggVVNFX1BPSU5UU19VViApCgl2YXJ5aW5nIHZlYzIgdlV2OwojZWxzZQoJI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKQoJCXVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9NQVAKCXVuaWZvcm0gc2FtcGxlcjJEIG1hcDsKI2VuZGlmCiNpZmRlZiBVU0VfQUxQSEFNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwOwojZW5kaWZgLE13PWBmbG9hdCBtZXRhbG5lc3NGYWN0b3IgPSBtZXRhbG5lc3M7CiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQCgl2ZWM0IHRleGVsTWV0YWxuZXNzID0gdGV4dHVyZTJEKCBtZXRhbG5lc3NNYXAsIHZNZXRhbG5lc3NNYXBVdiApOwoJbWV0YWxuZXNzRmFjdG9yICo9IHRleGVsTWV0YWxuZXNzLmI7CiNlbmRpZmAsU3c9YCNpZmRlZiBVU0VfTUVUQUxORVNTTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBtZXRhbG5lc3NNYXA7CiNlbmRpZmAsYnc9YCNpZmRlZiBVU0VfSU5TVEFOQ0lOR19NT1JQSAoJZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBNT1JQSFRBUkdFVFNfQ09VTlQgXTsKCWZsb2F0IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZSA9IHRleGVsRmV0Y2goIG1vcnBoVGV4dHVyZSwgaXZlYzIoIDAsIGdsX0luc3RhbmNlSUQgKSwgMCApLnI7Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBNT1JQSFRBUkdFVFNfQ09VTlQ7IGkgKysgKSB7CgkJbW9ycGhUYXJnZXRJbmZsdWVuY2VzW2ldID0gIHRleGVsRmV0Y2goIG1vcnBoVGV4dHVyZSwgaXZlYzIoIGkgKyAxLCBnbF9JbnN0YW5jZUlEICksIDAgKS5yOwoJfQojZW5kaWZgLHd3PWAjaWYgZGVmaW5lZCggVVNFX01PUlBIQ09MT1JTICkKCXZDb2xvciAqPSBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBNT1JQSFRBUkdFVFNfQ09VTlQ7IGkgKysgKSB7CgkJI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApCgkJCWlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gIT0gMC4wICkgdkNvbG9yICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07CgkJI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkKCQkJaWYgKCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSAhPSAwLjAgKSB2Q29sb3IgKz0gZ2V0TW9ycGgoIGdsX1ZlcnRleElELCBpLCAyICkucmdiICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07CgkJI2VuZGlmCgl9CiNlbmRpZmAsQXc9YCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTCglvYmplY3ROb3JtYWwgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlOwoJZm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkgewoJCWlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gIT0gMC4wICkgb2JqZWN0Tm9ybWFsICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMSApLnh5eiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdOwoJfQojZW5kaWZgLFR3PWAjaWZkZWYgVVNFX01PUlBIVEFSR0VUUwoJI2lmbmRlZiBVU0VfSU5TVEFOQ0lOR19NT1JQSAoJCXVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlOwoJCXVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBNT1JQSFRBUkdFVFNfQ09VTlQgXTsKCSNlbmRpZgoJdW5pZm9ybSBzYW1wbGVyMkRBcnJheSBtb3JwaFRhcmdldHNUZXh0dXJlOwoJdW5pZm9ybSBpdmVjMiBtb3JwaFRhcmdldHNUZXh0dXJlU2l6ZTsKCXZlYzQgZ2V0TW9ycGgoIGNvbnN0IGluIGludCB2ZXJ0ZXhJbmRleCwgY29uc3QgaW4gaW50IG1vcnBoVGFyZ2V0SW5kZXgsIGNvbnN0IGluIGludCBvZmZzZXQgKSB7CgkJaW50IHRleGVsSW5kZXggPSB2ZXJ0ZXhJbmRleCAqIE1PUlBIVEFSR0VUU19URVhUVVJFX1NUUklERSArIG9mZnNldDsKCQlpbnQgeSA9IHRleGVsSW5kZXggLyBtb3JwaFRhcmdldHNUZXh0dXJlU2l6ZS54OwoJCWludCB4ID0gdGV4ZWxJbmRleCAtIHkgKiBtb3JwaFRhcmdldHNUZXh0dXJlU2l6ZS54OwoJCWl2ZWMzIG1vcnBoVVYgPSBpdmVjMyggeCwgeSwgbW9ycGhUYXJnZXRJbmRleCApOwoJCXJldHVybiB0ZXhlbEZldGNoKCBtb3JwaFRhcmdldHNUZXh0dXJlLCBtb3JwaFVWLCAwICk7Cgl9CiNlbmRpZmAsRXc9YCNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTCgl0cmFuc2Zvcm1lZCAqPSBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBNT1JQSFRBUkdFVFNfQ09VTlQ7IGkgKysgKSB7CgkJaWYgKCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSAhPSAwLjAgKSB0cmFuc2Zvcm1lZCArPSBnZXRNb3JwaCggZ2xfVmVydGV4SUQsIGksIDAgKS54eXogKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTsKCX0KI2VuZGlmYCxDdz1gZmxvYXQgZmFjZURpcmVjdGlvbiA9IGdsX0Zyb250RmFjaW5nID8gMS4wIDogLSAxLjA7CiNpZmRlZiBGTEFUX1NIQURFRAoJdmVjMyBmZHggPSBkRmR4KCB2Vmlld1Bvc2l0aW9uICk7Cgl2ZWMzIGZkeSA9IGRGZHkoIHZWaWV3UG9zaXRpb24gKTsKCXZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCBjcm9zcyggZmR4LCBmZHkgKSApOwojZWxzZQoJdmVjMyBub3JtYWwgPSBub3JtYWxpemUoIHZOb3JtYWwgKTsKCSNpZmRlZiBET1VCTEVfU0lERUQKCQlub3JtYWwgKj0gZmFjZURpcmVjdGlvbjsKCSNlbmRpZgojZW5kaWYKI2lmIGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFICkgfHwgZGVmaW5lZCggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU5JU09UUk9QWSApCgkjaWZkZWYgVVNFX1RBTkdFTlQKCQltYXQzIHRibiA9IG1hdDMoIG5vcm1hbGl6ZSggdlRhbmdlbnQgKSwgbm9ybWFsaXplKCB2Qml0YW5nZW50ICksIG5vcm1hbCApOwoJI2Vsc2UKCQltYXQzIHRibiA9IGdldFRhbmdlbnRGcmFtZSggLSB2Vmlld1Bvc2l0aW9uLCBub3JtYWwsCgkJI2lmIGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKQoJCQl2Tm9ybWFsTWFwVXYKCQkjZWxpZiBkZWZpbmVkKCBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCApCgkJCXZDbGVhcmNvYXROb3JtYWxNYXBVdgoJCSNlbHNlCgkJCXZVdgoJCSNlbmRpZgoJCSk7CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBET1VCTEVfU0lERUQgKSAmJiAhIGRlZmluZWQoIEZMQVRfU0hBREVEICkKCQl0Ym5bMF0gKj0gZmFjZURpcmVjdGlvbjsKCQl0Ym5bMV0gKj0gZmFjZURpcmVjdGlvbjsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQCgkjaWZkZWYgVVNFX1RBTkdFTlQKCQltYXQzIHRibjIgPSBtYXQzKCBub3JtYWxpemUoIHZUYW5nZW50ICksIG5vcm1hbGl6ZSggdkJpdGFuZ2VudCApLCBub3JtYWwgKTsKCSNlbHNlCgkJbWF0MyB0Ym4yID0gZ2V0VGFuZ2VudEZyYW1lKCAtIHZWaWV3UG9zaXRpb24sIG5vcm1hbCwgdkNsZWFyY29hdE5vcm1hbE1hcFV2ICk7CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBET1VCTEVfU0lERUQgKSAmJiAhIGRlZmluZWQoIEZMQVRfU0hBREVEICkKCQl0Ym4yWzBdICo9IGZhY2VEaXJlY3Rpb247CgkJdGJuMlsxXSAqPSBmYWNlRGlyZWN0aW9uOwoJI2VuZGlmCiNlbmRpZgp2ZWMzIG5vblBlcnR1cmJlZE5vcm1hbCA9IG5vcm1hbDtgLFJ3PWAjaWZkZWYgVVNFX05PUk1BTE1BUF9PQkpFQ1RTUEFDRQoJbm9ybWFsID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZOb3JtYWxNYXBVdiApLnh5eiAqIDIuMCAtIDEuMDsKCSNpZmRlZiBGTElQX1NJREVECgkJbm9ybWFsID0gLSBub3JtYWw7CgkjZW5kaWYKCSNpZmRlZiBET1VCTEVfU0lERUQKCQlub3JtYWwgPSBub3JtYWwgKiBmYWNlRGlyZWN0aW9uOwoJI2VuZGlmCglub3JtYWwgPSBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApOwojZWxpZiBkZWZpbmVkKCBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSApCgl2ZWMzIG1hcE4gPSB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdk5vcm1hbE1hcFV2ICkueHl6ICogMi4wIC0gMS4wOwoJbWFwTi54eSAqPSBub3JtYWxTY2FsZTsKCW5vcm1hbCA9IG5vcm1hbGl6ZSggdGJuICogbWFwTiApOwojZWxpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApCglub3JtYWwgPSBwZXJ0dXJiTm9ybWFsQXJiKCAtIHZWaWV3UG9zaXRpb24sIG5vcm1hbCwgZEhkeHlfZndkKCksIGZhY2VEaXJlY3Rpb24gKTsKI2VuZGlmYCxJdz1gI2lmbmRlZiBGTEFUX1NIQURFRAoJdmFyeWluZyB2ZWMzIHZOb3JtYWw7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQl2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7CgkJdmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7CgkjZW5kaWYKI2VuZGlmYCxQdz1gI2lmbmRlZiBGTEFUX1NIQURFRAoJdmFyeWluZyB2ZWMzIHZOb3JtYWw7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQl2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7CgkJdmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7CgkjZW5kaWYKI2VuZGlmYCxMdz1gI2lmbmRlZiBGTEFUX1NIQURFRAoJdk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTsKCSNpZmRlZiBVU0VfVEFOR0VOVAoJCXZUYW5nZW50ID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZFRhbmdlbnQgKTsKCQl2Qml0YW5nZW50ID0gbm9ybWFsaXplKCBjcm9zcyggdk5vcm1hbCwgdlRhbmdlbnQgKSAqIHRhbmdlbnQudyApOwoJI2VuZGlmCiNlbmRpZmAsRHc9YCNpZmRlZiBVU0VfTk9STUFMTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxNYXA7Cgl1bmlmb3JtIHZlYzIgbm9ybWFsU2NhbGU7CiNlbmRpZgojaWZkZWYgVVNFX05PUk1BTE1BUF9PQkpFQ1RTUEFDRQoJdW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDsKI2VuZGlmCiNpZiAhIGRlZmluZWQgKCBVU0VfVEFOR0VOVCApICYmICggZGVmaW5lZCAoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFICkgfHwgZGVmaW5lZCAoIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKSApCgltYXQzIGdldFRhbmdlbnRGcmFtZSggdmVjMyBleWVfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiB1diApIHsKCQl2ZWMzIHEwID0gZEZkeCggZXllX3Bvcy54eXogKTsKCQl2ZWMzIHExID0gZEZkeSggZXllX3Bvcy54eXogKTsKCQl2ZWMyIHN0MCA9IGRGZHgoIHV2LnN0ICk7CgkJdmVjMiBzdDEgPSBkRmR5KCB1di5zdCApOwoJCXZlYzMgTiA9IHN1cmZfbm9ybTsKCQl2ZWMzIHExcGVycCA9IGNyb3NzKCBxMSwgTiApOwoJCXZlYzMgcTBwZXJwID0gY3Jvc3MoIE4sIHEwICk7CgkJdmVjMyBUID0gcTFwZXJwICogc3QwLnggKyBxMHBlcnAgKiBzdDEueDsKCQl2ZWMzIEIgPSBxMXBlcnAgKiBzdDAueSArIHEwcGVycCAqIHN0MS55OwoJCWZsb2F0IGRldCA9IG1heCggZG90KCBULCBUICksIGRvdCggQiwgQiApICk7CgkJZmxvYXQgc2NhbGUgPSAoIGRldCA9PSAwLjAgKSA/IDAuMCA6IGludmVyc2VzcXJ0KCBkZXQgKTsKCQlyZXR1cm4gbWF0MyggVCAqIHNjYWxlLCBCICogc2NhbGUsIE4gKTsKCX0KI2VuZGlmYCxVdz1gI2lmZGVmIFVTRV9DTEVBUkNPQVQKCXZlYzMgY2xlYXJjb2F0Tm9ybWFsID0gbm9uUGVydHVyYmVkTm9ybWFsOwojZW5kaWZgLE53PWAjaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAKCXZlYzMgY2xlYXJjb2F0TWFwTiA9IHRleHR1cmUyRCggY2xlYXJjb2F0Tm9ybWFsTWFwLCB2Q2xlYXJjb2F0Tm9ybWFsTWFwVXYgKS54eXogKiAyLjAgLSAxLjA7CgljbGVhcmNvYXRNYXBOLnh5ICo9IGNsZWFyY29hdE5vcm1hbFNjYWxlOwoJY2xlYXJjb2F0Tm9ybWFsID0gbm9ybWFsaXplKCB0Ym4yICogY2xlYXJjb2F0TWFwTiApOwojZW5kaWZgLEZ3PWAjaWZkZWYgVVNFX0NMRUFSQ09BVE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0TWFwOwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXROb3JtYWxNYXA7Cgl1bmlmb3JtIHZlYzIgY2xlYXJjb2F0Tm9ybWFsU2NhbGU7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdFJvdWdobmVzc01hcDsKI2VuZGlmYCxCdz1gI2lmZGVmIFVTRV9JUklERVNDRU5DRU1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgaXJpZGVzY2VuY2VNYXA7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgaXJpZGVzY2VuY2VUaGlja25lc3NNYXA7CiNlbmRpZmAsT3c9YCNpZmRlZiBPUEFRVUUKZGlmZnVzZUNvbG9yLmEgPSAxLjA7CiNlbmRpZgojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgpkaWZmdXNlQ29sb3IuYSAqPSBtYXRlcmlhbC50cmFuc21pc3Npb25BbHBoYTsKI2VuZGlmCmdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7YCx6dz1gdmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkgewoJcmV0dXJuIG5vcm1hbGl6ZSggbm9ybWFsICkgKiAwLjUgKyAwLjU7Cn0KdmVjMyB1bnBhY2tSR0JUb05vcm1hbCggY29uc3QgaW4gdmVjMyByZ2IgKSB7CglyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDsKfQpjb25zdCBmbG9hdCBQYWNrVXBzY2FsZSA9IDI1Ni4gLyAyNTUuO2NvbnN0IGZsb2F0IFVucGFja0Rvd25zY2FsZSA9IDI1NS4gLyAyNTYuO2NvbnN0IGZsb2F0IFNoaWZ0UmlnaHQ4ID0gMS4gLyAyNTYuOwpjb25zdCBmbG9hdCBJbnYyNTUgPSAxLiAvIDI1NS47CmNvbnN0IHZlYzQgUGFja0ZhY3RvcnMgPSB2ZWM0KCAxLjAsIDI1Ni4wLCAyNTYuMCAqIDI1Ni4wLCAyNTYuMCAqIDI1Ni4wICogMjU2LjAgKTsKY29uc3QgdmVjMiBVbnBhY2tGYWN0b3JzMiA9IHZlYzIoIFVucGFja0Rvd25zY2FsZSwgMS4wIC8gUGFja0ZhY3RvcnMuZyApOwpjb25zdCB2ZWMzIFVucGFja0ZhY3RvcnMzID0gdmVjMyggVW5wYWNrRG93bnNjYWxlIC8gUGFja0ZhY3RvcnMucmcsIDEuMCAvIFBhY2tGYWN0b3JzLmIgKTsKY29uc3QgdmVjNCBVbnBhY2tGYWN0b3JzNCA9IHZlYzQoIFVucGFja0Rvd25zY2FsZSAvIFBhY2tGYWN0b3JzLnJnYiwgMS4wIC8gUGFja0ZhY3RvcnMuYSApOwp2ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHsKCWlmKCB2IDw9IDAuMCApCgkJcmV0dXJuIHZlYzQoIDAuLCAwLiwgMC4sIDAuICk7CglpZiggdiA+PSAxLjAgKQoJCXJldHVybiB2ZWM0KCAxLiwgMS4sIDEuLCAxLiApOwoJZmxvYXQgdnVmOwoJZmxvYXQgYWYgPSBtb2RmKCB2ICogUGFja0ZhY3RvcnMuYSwgdnVmICk7CglmbG9hdCBiZiA9IG1vZGYoIHZ1ZiAqIFNoaWZ0UmlnaHQ4LCB2dWYgKTsKCWZsb2F0IGdmID0gbW9kZiggdnVmICogU2hpZnRSaWdodDgsIHZ1ZiApOwoJcmV0dXJuIHZlYzQoIHZ1ZiAqIEludjI1NSwgZ2YgKiBQYWNrVXBzY2FsZSwgYmYgKiBQYWNrVXBzY2FsZSwgYWYgKTsKfQp2ZWMzIHBhY2tEZXB0aFRvUkdCKCBjb25zdCBpbiBmbG9hdCB2ICkgewoJaWYoIHYgPD0gMC4wICkKCQlyZXR1cm4gdmVjMyggMC4sIDAuLCAwLiApOwoJaWYoIHYgPj0gMS4wICkKCQlyZXR1cm4gdmVjMyggMS4sIDEuLCAxLiApOwoJZmxvYXQgdnVmOwoJZmxvYXQgYmYgPSBtb2RmKCB2ICogUGFja0ZhY3RvcnMuYiwgdnVmICk7CglmbG9hdCBnZiA9IG1vZGYoIHZ1ZiAqIFNoaWZ0UmlnaHQ4LCB2dWYgKTsKCXJldHVybiB2ZWMzKCB2dWYgKiBJbnYyNTUsIGdmICogUGFja1Vwc2NhbGUsIGJmICk7Cn0KdmVjMiBwYWNrRGVwdGhUb1JHKCBjb25zdCBpbiBmbG9hdCB2ICkgewoJaWYoIHYgPD0gMC4wICkKCQlyZXR1cm4gdmVjMiggMC4sIDAuICk7CglpZiggdiA+PSAxLjAgKQoJCXJldHVybiB2ZWMyKCAxLiwgMS4gKTsKCWZsb2F0IHZ1ZjsKCWZsb2F0IGdmID0gbW9kZiggdiAqIDI1Ni4sIHZ1ZiApOwoJcmV0dXJuIHZlYzIoIHZ1ZiAqIEludjI1NSwgZ2YgKTsKfQpmbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCggY29uc3QgaW4gdmVjNCB2ICkgewoJcmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9yczQgKTsKfQpmbG9hdCB1bnBhY2tSR0JUb0RlcHRoKCBjb25zdCBpbiB2ZWMzIHYgKSB7CglyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzMyApOwp9CmZsb2F0IHVucGFja1JHVG9EZXB0aCggY29uc3QgaW4gdmVjMiB2ICkgewoJcmV0dXJuIHYuciAqIFVucGFja0ZhY3RvcnMyLnIgKyB2LmcgKiBVbnBhY2tGYWN0b3JzMi5nOwp9CnZlYzQgcGFjazJIYWxmVG9SR0JBKCBjb25zdCBpbiB2ZWMyIHYgKSB7Cgl2ZWM0IHIgPSB2ZWM0KCB2LngsIGZyYWN0KCB2LnggKiAyNTUuMCApLCB2LnksIGZyYWN0KCB2LnkgKiAyNTUuMCApICk7CglyZXR1cm4gdmVjNCggci54IC0gci55IC8gMjU1LjAsIHIueSwgci56IC0gci53IC8gMjU1LjAsIHIudyApOwp9CnZlYzIgdW5wYWNrUkdCQVRvMkhhbGYoIGNvbnN0IGluIHZlYzQgdiApIHsKCXJldHVybiB2ZWMyKCB2LnggKyAoIHYueSAvIDI1NS4wICksIHYueiArICggdi53IC8gMjU1LjAgKSApOwp9CmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHsKCXJldHVybiAoIHZpZXdaICsgbmVhciApIC8gKCBuZWFyIC0gZmFyICk7Cn0KZmxvYXQgb3J0aG9ncmFwaGljRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBkZXB0aCwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkgewoJcmV0dXJuIGRlcHRoICogKCBuZWFyIC0gZmFyICkgLSBuZWFyOwp9CmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkgewoJcmV0dXJuICggKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7Cn0KZmxvYXQgcGVyc3BlY3RpdmVEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGRlcHRoLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7CglyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogZGVwdGggLSBmYXIgKTsKfWAsa3c9YCNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBCglnbF9GcmFnQ29sb3IucmdiICo9IGdsX0ZyYWdDb2xvci5hOwojZW5kaWZgLFZ3PWB2ZWM0IG12UG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7CiNpZmRlZiBVU0VfQkFUQ0hJTkcKCW12UG9zaXRpb24gPSBiYXRjaGluZ01hdHJpeCAqIG12UG9zaXRpb247CiNlbmRpZgojaWZkZWYgVVNFX0lOU1RBTkNJTkcKCW12UG9zaXRpb24gPSBpbnN0YW5jZU1hdHJpeCAqIG12UG9zaXRpb247CiNlbmRpZgptdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogbXZQb3NpdGlvbjsKZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtgLEd3PWAjaWZkZWYgRElUSEVSSU5HCglnbF9GcmFnQ29sb3IucmdiID0gZGl0aGVyaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7CiNlbmRpZmAsSHc9YCNpZmRlZiBESVRIRVJJTkcKCXZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkgewoJCWZsb2F0IGdyaWRfcG9zaXRpb24gPSByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTsKCQl2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgPSB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApOwoJCWRpdGhlcl9zaGlmdF9SR0IgPSBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7CgkJcmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjsKCX0KI2VuZGlmYCxXdz1gZmxvYXQgcm91Z2huZXNzRmFjdG9yID0gcm91Z2huZXNzOwojaWZkZWYgVVNFX1JPVUdITkVTU01BUAoJdmVjNCB0ZXhlbFJvdWdobmVzcyA9IHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2Um91Z2huZXNzTWFwVXYgKTsKCXJvdWdobmVzc0ZhY3RvciAqPSB0ZXhlbFJvdWdobmVzcy5nOwojZW5kaWZgLFh3PWAjaWZkZWYgVVNFX1JPVUdITkVTU01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgcm91Z2huZXNzTWFwOwojZW5kaWZgLCR3PWAjaWYgTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMAoJdmFyeWluZyB2ZWM0IHZTcG90TGlnaHRDb29yZFsgTlVNX1NQT1RfTElHSFRfQ09PUkRTIF07CiNlbmRpZgojaWYgTlVNX1NQT1RfTElHSFRfTUFQUyA+IDAKCXVuaWZvcm0gc2FtcGxlcjJEIHNwb3RMaWdodE1hcFsgTlVNX1NQT1RfTElHSFRfTUFQUyBdOwojZW5kaWYKI2lmZGVmIFVTRV9TSEFET1dNQVAKCSNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJCXZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07CgkJc3RydWN0IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dJbnRlbnNpdHk7CgkJCWZsb2F0IHNoYWRvd0JpYXM7CgkJCWZsb2F0IHNoYWRvd05vcm1hbEJpYXM7CgkJCWZsb2F0IHNoYWRvd1JhZGl1czsKCQkJdmVjMiBzaGFkb3dNYXBTaXplOwoJCX07CgkJdW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTsKCSNlbmRpZgoJI2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBTcG90TGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dJbnRlbnNpdHk7CgkJCWZsb2F0IHNoYWRvd0JpYXM7CgkJCWZsb2F0IHNoYWRvd05vcm1hbEJpYXM7CgkJCWZsb2F0IHNoYWRvd1JhZGl1czsKCQkJdmVjMiBzaGFkb3dNYXBTaXplOwoJCX07CgkJdW5pZm9ybSBTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93c1sgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCgkjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07CgkJdmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93SW50ZW5zaXR5OwoJCQlmbG9hdCBzaGFkb3dCaWFzOwoJCQlmbG9hdCBzaGFkb3dOb3JtYWxCaWFzOwoJCQlmbG9hdCBzaGFkb3dSYWRpdXM7CgkJCXZlYzIgc2hhZG93TWFwU2l6ZTsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhRmFyOwoJCX07CgkJdW5pZm9ybSBQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3dzWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCglmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkgewoJCXJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApOwoJfQoJdmVjMiB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYgKSB7CgkJcmV0dXJuIHVucGFja1JHQkFUbzJIYWxmKCB0ZXh0dXJlMkQoIHNoYWRvdywgdXYgKSApOwoJfQoJZmxvYXQgVlNNU2hhZG93IChzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICl7CgkJZmxvYXQgb2NjbHVzaW9uID0gMS4wOwoJCXZlYzIgZGlzdHJpYnV0aW9uID0gdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzaGFkb3csIHV2ICk7CgkJZmxvYXQgaGFyZF9zaGFkb3cgPSBzdGVwKCBjb21wYXJlICwgZGlzdHJpYnV0aW9uLnggKTsKCQlpZiAoaGFyZF9zaGFkb3cgIT0gMS4wICkgewoJCQlmbG9hdCBkaXN0YW5jZSA9IGNvbXBhcmUgLSBkaXN0cmlidXRpb24ueCA7CgkJCWZsb2F0IHZhcmlhbmNlID0gbWF4KCAwLjAwMDAwLCBkaXN0cmlidXRpb24ueSAqIGRpc3RyaWJ1dGlvbi55ICk7CgkJCWZsb2F0IHNvZnRuZXNzX3Byb2JhYmlsaXR5ID0gdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkaXN0YW5jZSAqIGRpc3RhbmNlICk7CQkJc29mdG5lc3NfcHJvYmFiaWxpdHkgPSBjbGFtcCggKCBzb2Z0bmVzc19wcm9iYWJpbGl0eSAtIDAuMyApIC8gKCAwLjk1IC0gMC4zICksIDAuMCwgMS4wICk7CQkJb2NjbHVzaW9uID0gY2xhbXAoIG1heCggaGFyZF9zaGFkb3csIHNvZnRuZXNzX3Byb2JhYmlsaXR5ICksIDAuMCwgMS4wICk7CgkJfQoJCXJldHVybiBvY2NsdXNpb247Cgl9CglmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93SW50ZW5zaXR5LCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7CgkJZmxvYXQgc2hhZG93ID0gMS4wOwoJCXNoYWRvd0Nvb3JkLnh5eiAvPSBzaGFkb3dDb29yZC53OwoJCXNoYWRvd0Nvb3JkLnogKz0gc2hhZG93QmlhczsKCQlib29sIGluRnJ1c3R1bSA9IHNoYWRvd0Nvb3JkLnggPj0gMC4wICYmIHNoYWRvd0Nvb3JkLnggPD0gMS4wICYmIHNoYWRvd0Nvb3JkLnkgPj0gMC4wICYmIHNoYWRvd0Nvb3JkLnkgPD0gMS4wOwoJCWJvb2wgZnJ1c3R1bVRlc3QgPSBpbkZydXN0dW0gJiYgc2hhZG93Q29vcmQueiA8PSAxLjA7CgkJaWYgKCBmcnVzdHVtVGVzdCApIHsKCQkjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkKCQkJdmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7CgkJCWZsb2F0IGR4MCA9IC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7CgkJCWZsb2F0IGR5MCA9IC0gdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7CgkJCWZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7CgkJCWZsb2F0IGR5MSA9ICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7CgkJCWZsb2F0IGR4MiA9IGR4MCAvIDIuMDsKCQkJZmxvYXQgZHkyID0gZHkwIC8gMi4wOwoJCQlmbG9hdCBkeDMgPSBkeDEgLyAyLjA7CgkJCWZsb2F0IGR5MyA9IGR5MSAvIDIuMDsKCQkJc2hhZG93ID0gKAoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56ICkKCQkJKSAqICggMS4wIC8gMTcuMCApOwoJCSNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUICkKCQkJdmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7CgkJCWZsb2F0IGR4ID0gdGV4ZWxTaXplLng7CgkJCWZsb2F0IGR5ID0gdGV4ZWxTaXplLnk7CgkJCXZlYzIgdXYgPSBzaGFkb3dDb29yZC54eTsKCQkJdmVjMiBmID0gZnJhY3QoIHV2ICogc2hhZG93TWFwU2l6ZSArIDAuNSApOwoJCQl1diAtPSBmICogdGV4ZWxTaXplOwoJCQlzaGFkb3cgPSAoCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2LCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAwLjAsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdGV4ZWxTaXplLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIGYueCApICsKCQkJCW1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIC1keCwgZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgZi54ICkgKwoJCQkJbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCAtZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIGYueSApICsKCQkJCW1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgZi55ICkgKwoJCQkJbWl4KCBtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJCSAgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCQkgIGYueCApLAoJCQkJCSBtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkJICB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkJICBmLnggKSwKCQkJCQkgZi55ICkKCQkJKSAqICggMS4wIC8gOS4wICk7CgkJI2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNICkKCQkJc2hhZG93ID0gVlNNU2hhZG93KCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7CgkJI2Vsc2UKCQkJc2hhZG93ID0gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApOwoJCSNlbmRpZgoJCX0KCQlyZXR1cm4gbWl4KCAxLjAsIHNoYWRvdywgc2hhZG93SW50ZW5zaXR5ICk7Cgl9Cgl2ZWMyIGN1YmVUb1VWKCB2ZWMzIHYsIGZsb2F0IHRleGVsU2l6ZVkgKSB7CgkJdmVjMyBhYnNWID0gYWJzKCB2ICk7CgkJZmxvYXQgc2NhbGVUb0N1YmUgPSAxLjAgLyBtYXgoIGFic1YueCwgbWF4KCBhYnNWLnksIGFic1YueiApICk7CgkJYWJzViAqPSBzY2FsZVRvQ3ViZTsKCQl2ICo9IHNjYWxlVG9DdWJlICogKCAxLjAgLSAyLjAgKiB0ZXhlbFNpemVZICk7CgkJdmVjMiBwbGFuYXIgPSB2Lnh5OwoJCWZsb2F0IGFsbW9zdEFUZXhlbCA9IDEuNSAqIHRleGVsU2l6ZVk7CgkJZmxvYXQgYWxtb3N0T25lID0gMS4wIC0gYWxtb3N0QVRleGVsOwoJCWlmICggYWJzVi56ID49IGFsbW9zdE9uZSApIHsKCQkJaWYgKCB2LnogPiAwLjAgKQoJCQkJcGxhbmFyLnggPSA0LjAgLSB2Lng7CgkJfSBlbHNlIGlmICggYWJzVi54ID49IGFsbW9zdE9uZSApIHsKCQkJZmxvYXQgc2lnblggPSBzaWduKCB2LnggKTsKCQkJcGxhbmFyLnggPSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YOwoJCX0gZWxzZSBpZiAoIGFic1YueSA+PSBhbG1vc3RPbmUgKSB7CgkJCWZsb2F0IHNpZ25ZID0gc2lnbiggdi55ICk7CgkJCXBsYW5hci54ID0gdi54ICsgMi4wICogc2lnblkgKyAyLjA7CgkJCXBsYW5hci55ID0gdi56ICogc2lnblkgLSAyLjA7CgkJfQoJCXJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTsKCX0KCWZsb2F0IGdldFBvaW50U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0ludGVuc2l0eSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7CgkJZmxvYXQgc2hhZG93ID0gMS4wOwoJCXZlYzMgbGlnaHRUb1Bvc2l0aW9uID0gc2hhZG93Q29vcmQueHl6OwoJCQoJCWZsb2F0IGxpZ2h0VG9Qb3NpdGlvbkxlbmd0aCA9IGxlbmd0aCggbGlnaHRUb1Bvc2l0aW9uICk7CgkJaWYgKCBsaWdodFRvUG9zaXRpb25MZW5ndGggLSBzaGFkb3dDYW1lcmFGYXIgPD0gMC4wICYmIGxpZ2h0VG9Qb3NpdGlvbkxlbmd0aCAtIHNoYWRvd0NhbWVyYU5lYXIgPj0gMC4wICkgewoJCQlmbG9hdCBkcCA9ICggbGlnaHRUb1Bvc2l0aW9uTGVuZ3RoIC0gc2hhZG93Q2FtZXJhTmVhciApIC8gKCBzaGFkb3dDYW1lcmFGYXIgLSBzaGFkb3dDYW1lcmFOZWFyICk7CQkJZHAgKz0gc2hhZG93QmlhczsKCQkJdmVjMyBiZDNEID0gbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTsKCQkJdmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTsKCQkJI2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNICkKCQkJCXZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTsKCQkJCXNoYWRvdyA9ICgKCQkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXksIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh5LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArCgkJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwICkKCQkJCSkgKiAoIDEuMCAvIDkuMCApOwoJCQkjZWxzZQoJCQkJc2hhZG93ID0gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKTsKCQkJI2VuZGlmCgkJfQoJCXJldHVybiBtaXgoIDEuMCwgc2hhZG93LCBzaGFkb3dJbnRlbnNpdHkgKTsKCX0KI2VuZGlmYCxxdz1gI2lmIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyA+IDAKCXVuaWZvcm0gbWF0NCBzcG90TGlnaHRNYXRyaXhbIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyBdOwoJdmFyeWluZyB2ZWM0IHZTcG90TGlnaHRDb29yZFsgTlVNX1NQT1RfTElHSFRfQ09PUkRTIF07CiNlbmRpZgojaWZkZWYgVVNFX1NIQURPV01BUAoJI2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAKCQl1bmlmb3JtIG1hdDQgZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJCXZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07CgkJc3RydWN0IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dJbnRlbnNpdHk7CgkJCWZsb2F0IHNoYWRvd0JpYXM7CgkJCWZsb2F0IHNoYWRvd05vcm1hbEJpYXM7CgkJCWZsb2F0IHNoYWRvd1JhZGl1czsKCQkJdmVjMiBzaGFkb3dNYXBTaXplOwoJCX07CgkJdW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTsKCSNlbmRpZgoJI2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwCgkJc3RydWN0IFNwb3RMaWdodFNoYWRvdyB7CgkJCWZsb2F0IHNoYWRvd0ludGVuc2l0eTsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJfTsKCQl1bmlmb3JtIFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3dzWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07CgkjZW5kaWYKCSNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAKCQl1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07CgkJdmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93SW50ZW5zaXR5OwoJCQlmbG9hdCBzaGFkb3dCaWFzOwoJCQlmbG9hdCBzaGFkb3dOb3JtYWxCaWFzOwoJCQlmbG9hdCBzaGFkb3dSYWRpdXM7CgkJCXZlYzIgc2hhZG93TWFwU2l6ZTsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhRmFyOwoJCX07CgkJdW5pZm9ybSBQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3dzWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCiNlbmRpZmAsWXc9YCNpZiAoIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAgfHwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwICkgKSB8fCAoIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyA+IDAgKQoJdmVjMyBzaGFkb3dXb3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7Cgl2ZWM0IHNoYWRvd1dvcmxkUG9zaXRpb247CiNlbmRpZgojaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApCgkjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMAoJCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7CgkJCXNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uICsgdmVjNCggc2hhZG93V29ybGROb3JtYWwgKiBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdLnNoYWRvd05vcm1hbEJpYXMsIDAgKTsKCQkJdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSA9IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBpIF0gKiBzaGFkb3dXb3JsZFBvc2l0aW9uOwoJCX0KCQkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwCgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTOyBpICsrICkgewoJCQlzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbiArIHZlYzQoIHNoYWRvd1dvcmxkTm9ybWFsICogcG9pbnRMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7CgkJCXZQb2ludFNoYWRvd0Nvb3JkWyBpIF0gPSBwb2ludFNoYWRvd01hdHJpeFsgaSBdICogc2hhZG93V29ybGRQb3NpdGlvbjsKCQl9CgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKCSNlbmRpZgojZW5kaWYKI2lmIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyA+IDAKCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUX0NPT1JEUzsgaSArKyApIHsKCQlzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbjsKCQkjaWYgKCBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKQoJCQlzaGFkb3dXb3JsZFBvc2l0aW9uLnh5eiArPSBzaGFkb3dXb3JsZE5vcm1hbCAqIHNwb3RMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzOwoJCSNlbmRpZgoJCXZTcG90TGlnaHRDb29yZFsgaSBdID0gc3BvdExpZ2h0TWF0cml4WyBpIF0gKiBzaGFkb3dXb3JsZFBvc2l0aW9uOwoJfQoJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKI2VuZGlmYCxadz1gZmxvYXQgZ2V0U2hhZG93TWFzaygpIHsKCWZsb2F0IHNoYWRvdyA9IDEuMDsKCSNpZmRlZiBVU0VfU0hBRE9XTUFQCgkjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMAoJRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0OwoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkgewoJCWRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdOwoJCXNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93SW50ZW5zaXR5LCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDAKCVNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHQ7CgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkgewoJCXNwb3RMaWdodCA9IHNwb3RMaWdodFNoYWRvd3NbIGkgXTsKCQlzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0ludGVuc2l0eSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90TGlnaHRDb29yZFsgaSBdICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwCglQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHQ7CgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHsKCQlwb2ludExpZ2h0ID0gcG9pbnRMaWdodFNoYWRvd3NbIGkgXTsKCQlzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93SW50ZW5zaXR5LCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjZW5kaWYKCXJldHVybiBzaGFkb3c7Cn1gLEp3PWAjaWZkZWYgVVNFX1NLSU5OSU5HCgltYXQ0IGJvbmVNYXRYID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTsKCW1hdDQgYm9uZU1hdFkgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueSApOwoJbWF0NCBib25lTWF0WiA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC56ICk7CgltYXQ0IGJvbmVNYXRXID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTsKI2VuZGlmYCxLdz1gI2lmZGVmIFVTRV9TS0lOTklORwoJdW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7Cgl1bmlmb3JtIG1hdDQgYmluZE1hdHJpeEludmVyc2U7Cgl1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBib25lVGV4dHVyZTsKCW1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHsKCQlpbnQgc2l6ZSA9IHRleHR1cmVTaXplKCBib25lVGV4dHVyZSwgMCApLng7CgkJaW50IGogPSBpbnQoIGkgKSAqIDQ7CgkJaW50IHggPSBqICUgc2l6ZTsKCQlpbnQgeSA9IGogLyBzaXplOwoJCXZlYzQgdjEgPSB0ZXhlbEZldGNoKCBib25lVGV4dHVyZSwgaXZlYzIoIHgsIHkgKSwgMCApOwoJCXZlYzQgdjIgPSB0ZXhlbEZldGNoKCBib25lVGV4dHVyZSwgaXZlYzIoIHggKyAxLCB5ICksIDAgKTsKCQl2ZWM0IHYzID0gdGV4ZWxGZXRjaCggYm9uZVRleHR1cmUsIGl2ZWMyKCB4ICsgMiwgeSApLCAwICk7CgkJdmVjNCB2NCA9IHRleGVsRmV0Y2goIGJvbmVUZXh0dXJlLCBpdmVjMiggeCArIDMsIHkgKSwgMCApOwoJCXJldHVybiBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApOwoJfQojZW5kaWZgLGp3PWAjaWZkZWYgVVNFX1NLSU5OSU5HCgl2ZWM0IHNraW5WZXJ0ZXggPSBiaW5kTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApOwoJdmVjNCBza2lubmVkID0gdmVjNCggMC4wICk7Cglza2lubmVkICs9IGJvbmVNYXRYICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueDsKCXNraW5uZWQgKz0gYm9uZU1hdFkgKiBza2luVmVydGV4ICogc2tpbldlaWdodC55OwoJc2tpbm5lZCArPSBib25lTWF0WiAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lno7Cglza2lubmVkICs9IGJvbmVNYXRXICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQudzsKCXRyYW5zZm9ybWVkID0gKCBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5uZWQgKS54eXo7CiNlbmRpZmAsUXc9YCNpZmRlZiBVU0VfU0tJTk5JTkcKCW1hdDQgc2tpbk1hdHJpeCA9IG1hdDQoIDAuMCApOwoJc2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnggKiBib25lTWF0WDsKCXNraW5NYXRyaXggKz0gc2tpbldlaWdodC55ICogYm9uZU1hdFk7Cglza2luTWF0cml4ICs9IHNraW5XZWlnaHQueiAqIGJvbmVNYXRaOwoJc2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LncgKiBib25lTWF0VzsKCXNraW5NYXRyaXggPSBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5NYXRyaXggKiBiaW5kTWF0cml4OwoJb2JqZWN0Tm9ybWFsID0gdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdE5vcm1hbCwgMC4wICkgKS54eXo7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQlvYmplY3RUYW5nZW50ID0gdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdFRhbmdlbnQsIDAuMCApICkueHl6OwoJI2VuZGlmCiNlbmRpZmAsdEE9YGZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7CiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVAKCXZlYzQgdGV4ZWxTcGVjdWxhciA9IHRleHR1cmUyRCggc3BlY3VsYXJNYXAsIHZTcGVjdWxhck1hcFV2ICk7CglzcGVjdWxhclN0cmVuZ3RoID0gdGV4ZWxTcGVjdWxhci5yOwojZWxzZQoJc3BlY3VsYXJTdHJlbmd0aCA9IDEuMDsKI2VuZGlmYCxlQT1gI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJNYXA7CiNlbmRpZmAsbkE9YCNpZiBkZWZpbmVkKCBUT05FX01BUFBJTkcgKQoJZ2xfRnJhZ0NvbG9yLnJnYiA9IHRvbmVNYXBwaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7CiNlbmRpZmAsaUE9YCNpZm5kZWYgc2F0dXJhdGUKI2RlZmluZSBzYXR1cmF0ZSggYSApIGNsYW1wKCBhLCAwLjAsIDEuMCApCiNlbmRpZgp1bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7CnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7CglyZXR1cm4gc2F0dXJhdGUoIHRvbmVNYXBwaW5nRXhwb3N1cmUgKiBjb2xvciApOwp9CnZlYzMgUmVpbmhhcmRUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHsKCWNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7CglyZXR1cm4gc2F0dXJhdGUoIGNvbG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTsKfQp2ZWMzIENpbmVvblRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgewoJY29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTsKCWNvbG9yID0gbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApOwoJcmV0dXJuIHBvdyggKCBjb2xvciAqICggNi4yICogY29sb3IgKyAwLjUgKSApIC8gKCBjb2xvciAqICggNi4yICogY29sb3IgKyAxLjcgKSArIDAuMDYgKSwgdmVjMyggMi4yICkgKTsKfQp2ZWMzIFJSVEFuZE9EVEZpdCggdmVjMyB2ICkgewoJdmVjMyBhID0gdiAqICggdiArIDAuMDI0NTc4NiApIC0gMC4wMDAwOTA1Mzc7Cgl2ZWMzIGIgPSB2ICogKCAwLjk4MzcyOSAqIHYgKyAwLjQzMjk1MTAgKSArIDAuMjM4MDgxOwoJcmV0dXJuIGEgLyBiOwp9CnZlYzMgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgewoJY29uc3QgbWF0MyBBQ0VTSW5wdXRNYXQgPSBtYXQzKAoJCXZlYzMoIDAuNTk3MTksIDAuMDc2MDAsIDAuMDI4NDAgKSwJCXZlYzMoIDAuMzU0NTgsIDAuOTA4MzQsIDAuMTMzODMgKSwKCQl2ZWMzKCAwLjA0ODIzLCAwLjAxNTY2LCAwLjgzNzc3ICkKCSk7Cgljb25zdCBtYXQzIEFDRVNPdXRwdXRNYXQgPSBtYXQzKAoJCXZlYzMoICAxLjYwNDc1LCAtMC4xMDIwOCwgLTAuMDAzMjcgKSwJCXZlYzMoIC0wLjUzMTA4LCAgMS4xMDgxMywgLTAuMDcyNzYgKSwKCQl2ZWMzKCAtMC4wNzM2NywgLTAuMDA2MDUsICAxLjA3NjAyICkKCSk7Cgljb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlIC8gMC42OwoJY29sb3IgPSBBQ0VTSW5wdXRNYXQgKiBjb2xvcjsKCWNvbG9yID0gUlJUQW5kT0RURml0KCBjb2xvciApOwoJY29sb3IgPSBBQ0VTT3V0cHV0TWF0ICogY29sb3I7CglyZXR1cm4gc2F0dXJhdGUoIGNvbG9yICk7Cn0KY29uc3QgbWF0MyBMSU5FQVJfUkVDMjAyMF9UT19MSU5FQVJfU1JHQiA9IG1hdDMoCgl2ZWMzKCAxLjY2MDUsIC0gMC4xMjQ2LCAtIDAuMDE4MiApLAoJdmVjMyggLSAwLjU4NzYsIDEuMTMyOSwgLSAwLjEwMDYgKSwKCXZlYzMoIC0gMC4wNzI4LCAtIDAuMDA4MywgMS4xMTg3ICkKKTsKY29uc3QgbWF0MyBMSU5FQVJfU1JHQl9UT19MSU5FQVJfUkVDMjAyMCA9IG1hdDMoCgl2ZWMzKCAwLjYyNzQsIDAuMDY5MSwgMC4wMTY0ICksCgl2ZWMzKCAwLjMyOTMsIDAuOTE5NSwgMC4wODgwICksCgl2ZWMzKCAwLjA0MzMsIDAuMDExMywgMC44OTU2ICkKKTsKdmVjMyBhZ3hEZWZhdWx0Q29udHJhc3RBcHByb3goIHZlYzMgeCApIHsKCXZlYzMgeDIgPSB4ICogeDsKCXZlYzMgeDQgPSB4MiAqIHgyOwoJcmV0dXJuICsgMTUuNSAqIHg0ICogeDIKCQktIDQwLjE0ICogeDQgKiB4CgkJKyAzMS45NiAqIHg0CgkJLSA2Ljg2OCAqIHgyICogeAoJCSsgMC40Mjk4ICogeDIKCQkrIDAuMTE5MSAqIHgKCQktIDAuMDAyMzI7Cn0KdmVjMyBBZ1hUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHsKCWNvbnN0IG1hdDMgQWdYSW5zZXRNYXRyaXggPSBtYXQzKAoJCXZlYzMoIDAuODU2NjI3MTUzMzE1OTgzLCAwLjEzNzMxODk3MjkyOTg0NywgMC4xMTE4OTgyMTI5OTk5NSApLAoJCXZlYzMoIDAuMDk1MTIxMjQwNTM4MTU4OCwgMC43NjEyNDE5OTA2MDI1OTEsIDAuMDc2Nzk5NDE4NjAzMTkwMyApLAoJCXZlYzMoIDAuMDQ4MjUxNjA2MTQ1ODU4MywgMC4xMDE0MzkwMzY0Njc1NjIsIDAuODExMzAyMzY4Mzk2ODU5ICkKCSk7Cgljb25zdCBtYXQzIEFnWE91dHNldE1hdHJpeCA9IG1hdDMoCgkJdmVjMyggMS4xMjcxMDA1ODE4MTQ0MzY4LCAtIDAuMTQxMzI5NzYzNDk4NDM4MywgLSAwLjE0MTMyOTc2MzQ5ODQzODI2ICksCgkJdmVjMyggLSAwLjExMDYwNjY0MzA5NjYwMzIzLCAxLjE1NzgyMzcwMjIxNjI3MiwgLSAwLjExMDYwNjY0MzA5NjYwMjk0ICksCgkJdmVjMyggLSAwLjAxNjQ5MzkzODcxNzgzNDU3MywgLSAwLjAxNjQ5MzkzODcxNzgzNDI1NywgMS4yNTE5MzY0MDY1OTUwNDA1ICkKCSk7Cgljb25zdCBmbG9hdCBBZ3hNaW5FdiA9IC0gMTIuNDczOTM7CWNvbnN0IGZsb2F0IEFneE1heEV2ID0gNC4wMjYwNjk7Cgljb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlOwoJY29sb3IgPSBMSU5FQVJfU1JHQl9UT19MSU5FQVJfUkVDMjAyMCAqIGNvbG9yOwoJY29sb3IgPSBBZ1hJbnNldE1hdHJpeCAqIGNvbG9yOwoJY29sb3IgPSBtYXgoIGNvbG9yLCAxZS0xMCApOwljb2xvciA9IGxvZzIoIGNvbG9yICk7Cgljb2xvciA9ICggY29sb3IgLSBBZ3hNaW5FdiApIC8gKCBBZ3hNYXhFdiAtIEFneE1pbkV2ICk7Cgljb2xvciA9IGNsYW1wKCBjb2xvciwgMC4wLCAxLjAgKTsKCWNvbG9yID0gYWd4RGVmYXVsdENvbnRyYXN0QXBwcm94KCBjb2xvciApOwoJY29sb3IgPSBBZ1hPdXRzZXRNYXRyaXggKiBjb2xvcjsKCWNvbG9yID0gcG93KCBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciApLCB2ZWMzKCAyLjIgKSApOwoJY29sb3IgPSBMSU5FQVJfUkVDMjAyMF9UT19MSU5FQVJfU1JHQiAqIGNvbG9yOwoJY29sb3IgPSBjbGFtcCggY29sb3IsIDAuMCwgMS4wICk7CglyZXR1cm4gY29sb3I7Cn0KdmVjMyBOZXV0cmFsVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7Cgljb25zdCBmbG9hdCBTdGFydENvbXByZXNzaW9uID0gMC44IC0gMC4wNDsKCWNvbnN0IGZsb2F0IERlc2F0dXJhdGlvbiA9IDAuMTU7Cgljb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlOwoJZmxvYXQgeCA9IG1pbiggY29sb3IuciwgbWluKCBjb2xvci5nLCBjb2xvci5iICkgKTsKCWZsb2F0IG9mZnNldCA9IHggPCAwLjA4ID8geCAtIDYuMjUgKiB4ICogeCA6IDAuMDQ7Cgljb2xvciAtPSBvZmZzZXQ7CglmbG9hdCBwZWFrID0gbWF4KCBjb2xvci5yLCBtYXgoIGNvbG9yLmcsIGNvbG9yLmIgKSApOwoJaWYgKCBwZWFrIDwgU3RhcnRDb21wcmVzc2lvbiApIHJldHVybiBjb2xvcjsKCWZsb2F0IGQgPSAxLiAtIFN0YXJ0Q29tcHJlc3Npb247CglmbG9hdCBuZXdQZWFrID0gMS4gLSBkICogZCAvICggcGVhayArIGQgLSBTdGFydENvbXByZXNzaW9uICk7Cgljb2xvciAqPSBuZXdQZWFrIC8gcGVhazsKCWZsb2F0IGcgPSAxLiAtIDEuIC8gKCBEZXNhdHVyYXRpb24gKiAoIHBlYWsgLSBuZXdQZWFrICkgKyAxLiApOwoJcmV0dXJuIG1peCggY29sb3IsIHZlYzMoIG5ld1BlYWsgKSwgZyApOwp9CnZlYzMgQ3VzdG9tVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7IHJldHVybiBjb2xvcjsgfWAsckE9YCNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OCgltYXRlcmlhbC50cmFuc21pc3Npb24gPSB0cmFuc21pc3Npb247CgltYXRlcmlhbC50cmFuc21pc3Npb25BbHBoYSA9IDEuMDsKCW1hdGVyaWFsLnRoaWNrbmVzcyA9IHRoaWNrbmVzczsKCW1hdGVyaWFsLmF0dGVudWF0aW9uRGlzdGFuY2UgPSBhdHRlbnVhdGlvbkRpc3RhbmNlOwoJbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciA9IGF0dGVudWF0aW9uQ29sb3I7CgkjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUAoJCW1hdGVyaWFsLnRyYW5zbWlzc2lvbiAqPSB0ZXh0dXJlMkQoIHRyYW5zbWlzc2lvbk1hcCwgdlRyYW5zbWlzc2lvbk1hcFV2ICkucjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9USElDS05FU1NNQVAKCQltYXRlcmlhbC50aGlja25lc3MgKj0gdGV4dHVyZTJEKCB0aGlja25lc3NNYXAsIHZUaGlja25lc3NNYXBVdiApLmc7CgkjZW5kaWYKCXZlYzMgcG9zID0gdldvcmxkUG9zaXRpb247Cgl2ZWMzIHYgPSBub3JtYWxpemUoIGNhbWVyYVBvc2l0aW9uIC0gcG9zICk7Cgl2ZWMzIG4gPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTsKCXZlYzQgdHJhbnNtaXR0ZWQgPSBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKAoJCW4sIHYsIG1hdGVyaWFsLnJvdWdobmVzcywgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCwKCQlwb3MsIG1vZGVsTWF0cml4LCB2aWV3TWF0cml4LCBwcm9qZWN0aW9uTWF0cml4LCBtYXRlcmlhbC5kaXNwZXJzaW9uLCBtYXRlcmlhbC5pb3IsIG1hdGVyaWFsLnRoaWNrbmVzcywKCQltYXRlcmlhbC5hdHRlbnVhdGlvbkNvbG9yLCBtYXRlcmlhbC5hdHRlbnVhdGlvbkRpc3RhbmNlICk7CgltYXRlcmlhbC50cmFuc21pc3Npb25BbHBoYSA9IG1peCggbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEsIHRyYW5zbWl0dGVkLmEsIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiApOwoJdG90YWxEaWZmdXNlID0gbWl4KCB0b3RhbERpZmZ1c2UsIHRyYW5zbWl0dGVkLnJnYiwgbWF0ZXJpYWwudHJhbnNtaXNzaW9uICk7CiNlbmRpZmAsc0E9YCNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OCgl1bmlmb3JtIGZsb2F0IHRyYW5zbWlzc2lvbjsKCXVuaWZvcm0gZmxvYXQgdGhpY2tuZXNzOwoJdW5pZm9ybSBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlOwoJdW5pZm9ybSB2ZWMzIGF0dGVudWF0aW9uQ29sb3I7CgkjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUAoJCXVuaWZvcm0gc2FtcGxlcjJEIHRyYW5zbWlzc2lvbk1hcDsKCSNlbmRpZgoJI2lmZGVmIFVTRV9USElDS05FU1NNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCB0aGlja25lc3NNYXA7CgkjZW5kaWYKCXVuaWZvcm0gdmVjMiB0cmFuc21pc3Npb25TYW1wbGVyU2l6ZTsKCXVuaWZvcm0gc2FtcGxlcjJEIHRyYW5zbWlzc2lvblNhbXBsZXJNYXA7Cgl1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7Cgl1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsKCXZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjsKCWZsb2F0IHcwKCBmbG9hdCBhICkgewoJCXJldHVybiAoIDEuMCAvIDYuMCApICogKCBhICogKCBhICogKCAtIGEgKyAzLjAgKSAtIDMuMCApICsgMS4wICk7Cgl9CglmbG9hdCB3MSggZmxvYXQgYSApIHsKCQlyZXR1cm4gKCAxLjAgLyA2LjAgKSAqICggYSAqICBhICogKCAzLjAgKiBhIC0gNi4wICkgKyA0LjAgKTsKCX0KCWZsb2F0IHcyKCBmbG9hdCBhICl7CgkJcmV0dXJuICggMS4wIC8gNi4wICkgKiAoIGEgKiAoIGEgKiAoIC0gMy4wICogYSArIDMuMCApICsgMy4wICkgKyAxLjAgKTsKCX0KCWZsb2F0IHczKCBmbG9hdCBhICkgewoJCXJldHVybiAoIDEuMCAvIDYuMCApICogKCBhICogYSAqIGEgKTsKCX0KCWZsb2F0IGcwKCBmbG9hdCBhICkgewoJCXJldHVybiB3MCggYSApICsgdzEoIGEgKTsKCX0KCWZsb2F0IGcxKCBmbG9hdCBhICkgewoJCXJldHVybiB3MiggYSApICsgdzMoIGEgKTsKCX0KCWZsb2F0IGgwKCBmbG9hdCBhICkgewoJCXJldHVybiAtIDEuMCArIHcxKCBhICkgLyAoIHcwKCBhICkgKyB3MSggYSApICk7Cgl9CglmbG9hdCBoMSggZmxvYXQgYSApIHsKCQlyZXR1cm4gMS4wICsgdzMoIGEgKSAvICggdzIoIGEgKSArIHczKCBhICkgKTsKCX0KCXZlYzQgYmljdWJpYyggc2FtcGxlcjJEIHRleCwgdmVjMiB1diwgdmVjNCB0ZXhlbFNpemUsIGZsb2F0IGxvZCApIHsKCQl1diA9IHV2ICogdGV4ZWxTaXplLnp3ICsgMC41OwoJCXZlYzIgaXV2ID0gZmxvb3IoIHV2ICk7CgkJdmVjMiBmdXYgPSBmcmFjdCggdXYgKTsKCQlmbG9hdCBnMHggPSBnMCggZnV2LnggKTsKCQlmbG9hdCBnMXggPSBnMSggZnV2LnggKTsKCQlmbG9hdCBoMHggPSBoMCggZnV2LnggKTsKCQlmbG9hdCBoMXggPSBoMSggZnV2LnggKTsKCQlmbG9hdCBoMHkgPSBoMCggZnV2LnkgKTsKCQlmbG9hdCBoMXkgPSBoMSggZnV2LnkgKTsKCQl2ZWMyIHAwID0gKCB2ZWMyKCBpdXYueCArIGgweCwgaXV2LnkgKyBoMHkgKSAtIDAuNSApICogdGV4ZWxTaXplLnh5OwoJCXZlYzIgcDEgPSAoIHZlYzIoIGl1di54ICsgaDF4LCBpdXYueSArIGgweSApIC0gMC41ICkgKiB0ZXhlbFNpemUueHk7CgkJdmVjMiBwMiA9ICggdmVjMiggaXV2LnggKyBoMHgsIGl1di55ICsgaDF5ICkgLSAwLjUgKSAqIHRleGVsU2l6ZS54eTsKCQl2ZWMyIHAzID0gKCB2ZWMyKCBpdXYueCArIGgxeCwgaXV2LnkgKyBoMXkgKSAtIDAuNSApICogdGV4ZWxTaXplLnh5OwoJCXJldHVybiBnMCggZnV2LnkgKSAqICggZzB4ICogdGV4dHVyZUxvZCggdGV4LCBwMCwgbG9kICkgKyBnMXggKiB0ZXh0dXJlTG9kKCB0ZXgsIHAxLCBsb2QgKSApICsKCQkJZzEoIGZ1di55ICkgKiAoIGcweCAqIHRleHR1cmVMb2QoIHRleCwgcDIsIGxvZCApICsgZzF4ICogdGV4dHVyZUxvZCggdGV4LCBwMywgbG9kICkgKTsKCX0KCXZlYzQgdGV4dHVyZUJpY3ViaWMoIHNhbXBsZXIyRCBzYW1wbGVyLCB2ZWMyIHV2LCBmbG9hdCBsb2QgKSB7CgkJdmVjMiBmTG9kU2l6ZSA9IHZlYzIoIHRleHR1cmVTaXplKCBzYW1wbGVyLCBpbnQoIGxvZCApICkgKTsKCQl2ZWMyIGNMb2RTaXplID0gdmVjMiggdGV4dHVyZVNpemUoIHNhbXBsZXIsIGludCggbG9kICsgMS4wICkgKSApOwoJCXZlYzIgZkxvZFNpemVJbnYgPSAxLjAgLyBmTG9kU2l6ZTsKCQl2ZWMyIGNMb2RTaXplSW52ID0gMS4wIC8gY0xvZFNpemU7CgkJdmVjNCBmU2FtcGxlID0gYmljdWJpYyggc2FtcGxlciwgdXYsIHZlYzQoIGZMb2RTaXplSW52LCBmTG9kU2l6ZSApLCBmbG9vciggbG9kICkgKTsKCQl2ZWM0IGNTYW1wbGUgPSBiaWN1YmljKCBzYW1wbGVyLCB1diwgdmVjNCggY0xvZFNpemVJbnYsIGNMb2RTaXplICksIGNlaWwoIGxvZCApICk7CgkJcmV0dXJuIG1peCggZlNhbXBsZSwgY1NhbXBsZSwgZnJhY3QoIGxvZCApICk7Cgl9Cgl2ZWMzIGdldFZvbHVtZVRyYW5zbWlzc2lvblJheSggY29uc3QgaW4gdmVjMyBuLCBjb25zdCBpbiB2ZWMzIHYsIGNvbnN0IGluIGZsb2F0IHRoaWNrbmVzcywgY29uc3QgaW4gZmxvYXQgaW9yLCBjb25zdCBpbiBtYXQ0IG1vZGVsTWF0cml4ICkgewoJCXZlYzMgcmVmcmFjdGlvblZlY3RvciA9IHJlZnJhY3QoIC0gdiwgbm9ybWFsaXplKCBuICksIDEuMCAvIGlvciApOwoJCXZlYzMgbW9kZWxTY2FsZTsKCQltb2RlbFNjYWxlLnggPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAwIF0ueHl6ICkgKTsKCQltb2RlbFNjYWxlLnkgPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueHl6ICkgKTsKCQltb2RlbFNjYWxlLnogPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAyIF0ueHl6ICkgKTsKCQlyZXR1cm4gbm9ybWFsaXplKCByZWZyYWN0aW9uVmVjdG9yICkgKiB0aGlja25lc3MgKiBtb2RlbFNjYWxlOwoJfQoJZmxvYXQgYXBwbHlJb3JUb1JvdWdobmVzcyggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBmbG9hdCBpb3IgKSB7CgkJcmV0dXJuIHJvdWdobmVzcyAqIGNsYW1wKCBpb3IgKiAyLjAgLSAyLjAsIDAuMCwgMS4wICk7Cgl9Cgl2ZWM0IGdldFRyYW5zbWlzc2lvblNhbXBsZSggY29uc3QgaW4gdmVjMiBmcmFnQ29vcmQsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgaW9yICkgewoJCWZsb2F0IGxvZCA9IGxvZzIoIHRyYW5zbWlzc2lvblNhbXBsZXJTaXplLnggKSAqIGFwcGx5SW9yVG9Sb3VnaG5lc3MoIHJvdWdobmVzcywgaW9yICk7CgkJcmV0dXJuIHRleHR1cmVCaWN1YmljKCB0cmFuc21pc3Npb25TYW1wbGVyTWFwLCBmcmFnQ29vcmQueHksIGxvZCApOwoJfQoJdmVjMyB2b2x1bWVBdHRlbnVhdGlvbiggY29uc3QgaW4gZmxvYXQgdHJhbnNtaXNzaW9uRGlzdGFuY2UsIGNvbnN0IGluIHZlYzMgYXR0ZW51YXRpb25Db2xvciwgY29uc3QgaW4gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZSApIHsKCQlpZiAoIGlzaW5mKCBhdHRlbnVhdGlvbkRpc3RhbmNlICkgKSB7CgkJCXJldHVybiB2ZWMzKCAxLjAgKTsKCQl9IGVsc2UgewoJCQl2ZWMzIGF0dGVudWF0aW9uQ29lZmZpY2llbnQgPSAtbG9nKCBhdHRlbnVhdGlvbkNvbG9yICkgLyBhdHRlbnVhdGlvbkRpc3RhbmNlOwoJCQl2ZWMzIHRyYW5zbWl0dGFuY2UgPSBleHAoIC0gYXR0ZW51YXRpb25Db2VmZmljaWVudCAqIHRyYW5zbWlzc2lvbkRpc3RhbmNlICk7CQkJcmV0dXJuIHRyYW5zbWl0dGFuY2U7CgkJfQoJfQoJdmVjNCBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKCBjb25zdCBpbiB2ZWMzIG4sIGNvbnN0IGluIHZlYzMgdiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiB2ZWMzIGRpZmZ1c2VDb2xvciwKCQljb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiB2ZWMzIHBvc2l0aW9uLCBjb25zdCBpbiBtYXQ0IG1vZGVsTWF0cml4LAoJCWNvbnN0IGluIG1hdDQgdmlld01hdHJpeCwgY29uc3QgaW4gbWF0NCBwcm9qTWF0cml4LCBjb25zdCBpbiBmbG9hdCBkaXNwZXJzaW9uLCBjb25zdCBpbiBmbG9hdCBpb3IsIGNvbnN0IGluIGZsb2F0IHRoaWNrbmVzcywKCQljb25zdCBpbiB2ZWMzIGF0dGVudWF0aW9uQ29sb3IsIGNvbnN0IGluIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2UgKSB7CgkJdmVjNCB0cmFuc21pdHRlZExpZ2h0OwoJCXZlYzMgdHJhbnNtaXR0YW5jZTsKCQkjaWZkZWYgVVNFX0RJU1BFUlNJT04KCQkJZmxvYXQgaGFsZlNwcmVhZCA9ICggaW9yIC0gMS4wICkgKiAwLjAyNSAqIGRpc3BlcnNpb247CgkJCXZlYzMgaW9ycyA9IHZlYzMoIGlvciAtIGhhbGZTcHJlYWQsIGlvciwgaW9yICsgaGFsZlNwcmVhZCApOwoJCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCAzOyBpICsrICkgewoJCQkJdmVjMyB0cmFuc21pc3Npb25SYXkgPSBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIG4sIHYsIHRoaWNrbmVzcywgaW9yc1sgaSBdLCBtb2RlbE1hdHJpeCApOwoJCQkJdmVjMyByZWZyYWN0ZWRSYXlFeGl0ID0gcG9zaXRpb24gKyB0cmFuc21pc3Npb25SYXk7CgkJCQl2ZWM0IG5kY1BvcyA9IHByb2pNYXRyaXggKiB2aWV3TWF0cml4ICogdmVjNCggcmVmcmFjdGVkUmF5RXhpdCwgMS4wICk7CgkJCQl2ZWMyIHJlZnJhY3Rpb25Db29yZHMgPSBuZGNQb3MueHkgLyBuZGNQb3MudzsKCQkJCXJlZnJhY3Rpb25Db29yZHMgKz0gMS4wOwoJCQkJcmVmcmFjdGlvbkNvb3JkcyAvPSAyLjA7CgkJCQl2ZWM0IHRyYW5zbWlzc2lvblNhbXBsZSA9IGdldFRyYW5zbWlzc2lvblNhbXBsZSggcmVmcmFjdGlvbkNvb3Jkcywgcm91Z2huZXNzLCBpb3JzWyBpIF0gKTsKCQkJCXRyYW5zbWl0dGVkTGlnaHRbIGkgXSA9IHRyYW5zbWlzc2lvblNhbXBsZVsgaSBdOwoJCQkJdHJhbnNtaXR0ZWRMaWdodC5hICs9IHRyYW5zbWlzc2lvblNhbXBsZS5hOwoJCQkJdHJhbnNtaXR0YW5jZVsgaSBdID0gZGlmZnVzZUNvbG9yWyBpIF0gKiB2b2x1bWVBdHRlbnVhdGlvbiggbGVuZ3RoKCB0cmFuc21pc3Npb25SYXkgKSwgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSApWyBpIF07CgkJCX0KCQkJdHJhbnNtaXR0ZWRMaWdodC5hIC89IDMuMDsKCQkjZWxzZQoJCQl2ZWMzIHRyYW5zbWlzc2lvblJheSA9IGdldFZvbHVtZVRyYW5zbWlzc2lvblJheSggbiwgdiwgdGhpY2tuZXNzLCBpb3IsIG1vZGVsTWF0cml4ICk7CgkJCXZlYzMgcmVmcmFjdGVkUmF5RXhpdCA9IHBvc2l0aW9uICsgdHJhbnNtaXNzaW9uUmF5OwoJCQl2ZWM0IG5kY1BvcyA9IHByb2pNYXRyaXggKiB2aWV3TWF0cml4ICogdmVjNCggcmVmcmFjdGVkUmF5RXhpdCwgMS4wICk7CgkJCXZlYzIgcmVmcmFjdGlvbkNvb3JkcyA9IG5kY1Bvcy54eSAvIG5kY1Bvcy53OwoJCQlyZWZyYWN0aW9uQ29vcmRzICs9IDEuMDsKCQkJcmVmcmFjdGlvbkNvb3JkcyAvPSAyLjA7CgkJCXRyYW5zbWl0dGVkTGlnaHQgPSBnZXRUcmFuc21pc3Npb25TYW1wbGUoIHJlZnJhY3Rpb25Db29yZHMsIHJvdWdobmVzcywgaW9yICk7CgkJCXRyYW5zbWl0dGFuY2UgPSBkaWZmdXNlQ29sb3IgKiB2b2x1bWVBdHRlbnVhdGlvbiggbGVuZ3RoKCB0cmFuc21pc3Npb25SYXkgKSwgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSApOwoJCSNlbmRpZgoJCXZlYzMgYXR0ZW51YXRlZENvbG9yID0gdHJhbnNtaXR0YW5jZSAqIHRyYW5zbWl0dGVkTGlnaHQucmdiOwoJCXZlYzMgRiA9IEVudmlyb25tZW50QlJERiggbiwgdiwgc3BlY3VsYXJDb2xvciwgc3BlY3VsYXJGOTAsIHJvdWdobmVzcyApOwoJCWZsb2F0IHRyYW5zbWl0dGFuY2VGYWN0b3IgPSAoIHRyYW5zbWl0dGFuY2UuciArIHRyYW5zbWl0dGFuY2UuZyArIHRyYW5zbWl0dGFuY2UuYiApIC8gMy4wOwoJCXJldHVybiB2ZWM0KCAoIDEuMCAtIEYgKSAqIGF0dGVudWF0ZWRDb2xvciwgMS4wIC0gKCAxLjAgLSB0cmFuc21pdHRlZExpZ2h0LmEgKSAqIHRyYW5zbWl0dGFuY2VGYWN0b3IgKTsKCX0KI2VuZGlmYCxvQT1gI2lmIGRlZmluZWQoIFVTRV9VViApIHx8IGRlZmluZWQoIFVTRV9BTklTT1RST1BZICkKCXZhcnlpbmcgdmVjMiB2VXY7CiNlbmRpZgojaWZkZWYgVVNFX01BUAoJdmFyeWluZyB2ZWMyIHZNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQUxQSEFNQVAKCXZhcnlpbmcgdmVjMiB2QWxwaGFNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTElHSFRNQVAKCXZhcnlpbmcgdmVjMiB2TGlnaHRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQU9NQVAKCXZhcnlpbmcgdmVjMiB2QW9NYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQlVNUE1BUAoJdmFyeWluZyB2ZWMyIHZCdW1wTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX05PUk1BTE1BUAoJdmFyeWluZyB2ZWMyIHZOb3JtYWxNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfRU1JU1NJVkVNQVAKCXZhcnlpbmcgdmVjMiB2RW1pc3NpdmVNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQCgl2YXJ5aW5nIHZlYzIgdk1ldGFsbmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVAKCXZhcnlpbmcgdmVjMiB2Um91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVAKCXZhcnlpbmcgdmVjMiB2QW5pc290cm9weU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVAKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0Tm9ybWFsTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0Um91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFTUFQCgl2YXJ5aW5nIHZlYzIgdklyaWRlc2NlbmNlTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUAoJdmFyeWluZyB2ZWMyIHZJcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUAoJdmFyeWluZyB2ZWMyIHZTaGVlbkNvbG9yTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NIRUVOX1JPVUdITkVTU01BUAoJdmFyeWluZyB2ZWMyIHZTaGVlblJvdWdobmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdmFyeWluZyB2ZWMyIHZTcGVjdWxhck1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUl9DT0xPUk1BUAoJdmFyeWluZyB2ZWMyIHZTcGVjdWxhckNvbG9yTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUAoJdmFyeWluZyB2ZWMyIHZTcGVjdWxhckludGVuc2l0eU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVAKCXVuaWZvcm0gbWF0MyB0cmFuc21pc3Npb25NYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlRyYW5zbWlzc2lvbk1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9USElDS05FU1NNQVAKCXVuaWZvcm0gbWF0MyB0aGlja25lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlRoaWNrbmVzc01hcFV2OwojZW5kaWZgLGFBPWAjaWYgZGVmaW5lZCggVVNFX1VWICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKQoJdmFyeWluZyB2ZWMyIHZVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTUFQCgl1bmlmb3JtIG1hdDMgbWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQUxQSEFNQVAKCXVuaWZvcm0gbWF0MyBhbHBoYU1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2QWxwaGFNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTElHSFRNQVAKCXVuaWZvcm0gbWF0MyBsaWdodE1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2TGlnaHRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQU9NQVAKCXVuaWZvcm0gbWF0MyBhb01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2QW9NYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQlVNUE1BUAoJdW5pZm9ybSBtYXQzIGJ1bXBNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkJ1bXBNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTk9STUFMTUFQCgl1bmlmb3JtIG1hdDMgbm9ybWFsTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZOb3JtYWxNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgl1bmlmb3JtIG1hdDMgZGlzcGxhY2VtZW50TWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZEaXNwbGFjZW1lbnRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfRU1JU1NJVkVNQVAKCXVuaWZvcm0gbWF0MyBlbWlzc2l2ZU1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2RW1pc3NpdmVNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQCgl1bmlmb3JtIG1hdDMgbWV0YWxuZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZNZXRhbG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQCgl1bmlmb3JtIG1hdDMgcm91Z2huZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZSb3VnaG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUAoJdW5pZm9ybSBtYXQzIGFuaXNvdHJvcHlNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkFuaXNvdHJvcHlNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQCgl1bmlmb3JtIG1hdDMgY2xlYXJjb2F0TWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJdW5pZm9ybSBtYXQzIGNsZWFyY29hdE5vcm1hbE1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0Tm9ybWFsTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAKCXVuaWZvcm0gbWF0MyBjbGVhcmNvYXRSb3VnaG5lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkNsZWFyY29hdFJvdWdobmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUAoJdW5pZm9ybSBtYXQzIHNoZWVuQ29sb3JNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNoZWVuQ29sb3JNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgl1bmlmb3JtIG1hdDMgc2hlZW5Sb3VnaG5lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNoZWVuUm91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFTUFQCgl1bmlmb3JtIG1hdDMgaXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdklyaWRlc2NlbmNlTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUAoJdW5pZm9ybSBtYXQzIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZJcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdW5pZm9ybSBtYXQzIHNwZWN1bGFyTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZTcGVjdWxhck1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUl9DT0xPUk1BUAoJdW5pZm9ybSBtYXQzIHNwZWN1bGFyQ29sb3JNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyQ29sb3JNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQCgl1bmlmb3JtIG1hdDMgc3BlY3VsYXJJbnRlbnNpdHlNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFySW50ZW5zaXR5TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUAoJdW5pZm9ybSBtYXQzIHRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2VHJhbnNtaXNzaW9uTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1RISUNLTkVTU01BUAoJdW5pZm9ybSBtYXQzIHRoaWNrbmVzc01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2VGhpY2tuZXNzTWFwVXY7CiNlbmRpZmAsY0E9YCNpZiBkZWZpbmVkKCBVU0VfVVYgKSB8fCBkZWZpbmVkKCBVU0VfQU5JU09UUk9QWSApCgl2VXYgPSB2ZWMzKCB1diwgMSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9NQVAKCXZNYXBVdiA9ICggbWFwVHJhbnNmb3JtICogdmVjMyggTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfQUxQSEFNQVAKCXZBbHBoYU1hcFV2ID0gKCBhbHBoYU1hcFRyYW5zZm9ybSAqIHZlYzMoIEFMUEhBTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfTElHSFRNQVAKCXZMaWdodE1hcFV2ID0gKCBsaWdodE1hcFRyYW5zZm9ybSAqIHZlYzMoIExJR0hUTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfQU9NQVAKCXZBb01hcFV2ID0gKCBhb01hcFRyYW5zZm9ybSAqIHZlYzMoIEFPTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfQlVNUE1BUAoJdkJ1bXBNYXBVdiA9ICggYnVtcE1hcFRyYW5zZm9ybSAqIHZlYzMoIEJVTVBNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9OT1JNQUxNQVAKCXZOb3JtYWxNYXBVdiA9ICggbm9ybWFsTWFwVHJhbnNmb3JtICogdmVjMyggTk9STUFMTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgl2RGlzcGxhY2VtZW50TWFwVXYgPSAoIGRpc3BsYWNlbWVudE1hcFRyYW5zZm9ybSAqIHZlYzMoIERJU1BMQUNFTUVOVE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0VNSVNTSVZFTUFQCgl2RW1pc3NpdmVNYXBVdiA9ICggZW1pc3NpdmVNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBFTUlTU0lWRU1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX01FVEFMTkVTU01BUAoJdk1ldGFsbmVzc01hcFV2ID0gKCBtZXRhbG5lc3NNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBNRVRBTE5FU1NNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVAKCXZSb3VnaG5lc3NNYXBVdiA9ICggcm91Z2huZXNzTWFwVHJhbnNmb3JtICogdmVjMyggUk9VR0hORVNTTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUAoJdkFuaXNvdHJvcHlNYXBVdiA9ICggYW5pc290cm9weU1hcFRyYW5zZm9ybSAqIHZlYzMoIEFOSVNPVFJPUFlNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVAKCXZDbGVhcmNvYXRNYXBVdiA9ICggY2xlYXJjb2F0TWFwVHJhbnNmb3JtICogdmVjMyggQ0xFQVJDT0FUTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJdkNsZWFyY29hdE5vcm1hbE1hcFV2ID0gKCBjbGVhcmNvYXROb3JtYWxNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBDTEVBUkNPQVRfTk9STUFMTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUAoJdkNsZWFyY29hdFJvdWdobmVzc01hcFV2ID0gKCBjbGVhcmNvYXRSb3VnaG5lc3NNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBDTEVBUkNPQVRfUk9VR0hORVNTTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVAKCXZJcmlkZXNjZW5jZU1hcFV2ID0gKCBpcmlkZXNjZW5jZU1hcFRyYW5zZm9ybSAqIHZlYzMoIElSSURFU0NFTkNFTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQCgl2SXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdiA9ICggaXJpZGVzY2VuY2VUaGlja25lc3NNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBJUklERVNDRU5DRV9USElDS05FU1NNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUAoJdlNoZWVuQ29sb3JNYXBVdiA9ICggc2hlZW5Db2xvck1hcFRyYW5zZm9ybSAqIHZlYzMoIFNIRUVOX0NPTE9STUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgl2U2hlZW5Sb3VnaG5lc3NNYXBVdiA9ICggc2hlZW5Sb3VnaG5lc3NNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBTSEVFTl9ST1VHSE5FU1NNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdlNwZWN1bGFyTWFwVXYgPSAoIHNwZWN1bGFyTWFwVHJhbnNmb3JtICogdmVjMyggU1BFQ1VMQVJNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUl9DT0xPUk1BUAoJdlNwZWN1bGFyQ29sb3JNYXBVdiA9ICggc3BlY3VsYXJDb2xvck1hcFRyYW5zZm9ybSAqIHZlYzMoIFNQRUNVTEFSX0NPTE9STUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQCgl2U3BlY3VsYXJJbnRlbnNpdHlNYXBVdiA9ICggc3BlY3VsYXJJbnRlbnNpdHlNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBTUEVDVUxBUl9JTlRFTlNJVFlNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVAKCXZUcmFuc21pc3Npb25NYXBVdiA9ICggdHJhbnNtaXNzaW9uTWFwVHJhbnNmb3JtICogdmVjMyggVFJBTlNNSVNTSU9OTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQCgl2VGhpY2tuZXNzTWFwVXYgPSAoIHRoaWNrbmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIFRISUNLTkVTU01BUF9VViwgMSApICkueHk7CiNlbmRpZmAsbEE9YCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggRElTVEFOQ0UgKSB8fCBkZWZpbmVkICggVVNFX1NIQURPV01BUCApIHx8IGRlZmluZWQgKCBVU0VfVFJBTlNNSVNTSU9OICkgfHwgTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMAoJdmVjNCB3b3JsZFBvc2l0aW9uID0gdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApOwoJI2lmZGVmIFVTRV9CQVRDSElORwoJCXdvcmxkUG9zaXRpb24gPSBiYXRjaGluZ01hdHJpeCAqIHdvcmxkUG9zaXRpb247CgkjZW5kaWYKCSNpZmRlZiBVU0VfSU5TVEFOQ0lORwoJCXdvcmxkUG9zaXRpb24gPSBpbnN0YW5jZU1hdHJpeCAqIHdvcmxkUG9zaXRpb247CgkjZW5kaWYKCXdvcmxkUG9zaXRpb24gPSBtb2RlbE1hdHJpeCAqIHdvcmxkUG9zaXRpb247CiNlbmRpZmA7Y29uc3QgS3Q9e2FscGhhaGFzaF9mcmFnbWVudDpoMSxhbHBoYWhhc2hfcGFyc19mcmFnbWVudDpmMSxhbHBoYW1hcF9mcmFnbWVudDpkMSxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50OnAxLGFscGhhdGVzdF9mcmFnbWVudDptMSxhbHBoYXRlc3RfcGFyc19mcmFnbWVudDpnMSxhb21hcF9mcmFnbWVudDp4MSxhb21hcF9wYXJzX2ZyYWdtZW50Ol8xLGJhdGNoaW5nX3BhcnNfdmVydGV4OnkxLGJhdGNoaW5nX3ZlcnRleDp2MSxiZWdpbl92ZXJ0ZXg6TTEsYmVnaW5ub3JtYWxfdmVydGV4OlMxLGJzZGZzOmIxLGlyaWRlc2NlbmNlX2ZyYWdtZW50OncxLGJ1bXBtYXBfcGFyc19mcmFnbWVudDpBMSxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ6VDEsY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ6RTEsY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OkMxLGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6UjEsY29sb3JfZnJhZ21lbnQ6STEsY29sb3JfcGFyc19mcmFnbWVudDpQMSxjb2xvcl9wYXJzX3ZlcnRleDpMMSxjb2xvcl92ZXJ0ZXg6RDEsY29tbW9uOlUxLGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudDpOMSxkZWZhdWx0bm9ybWFsX3ZlcnRleDpGMSxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg6QjEsZGlzcGxhY2VtZW50bWFwX3ZlcnRleDpPMSxlbWlzc2l2ZW1hcF9mcmFnbWVudDp6MSxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50OmsxLGNvbG9yc3BhY2VfZnJhZ21lbnQ6VjEsY29sb3JzcGFjZV9wYXJzX2ZyYWdtZW50OkcxLGVudm1hcF9mcmFnbWVudDpIMSxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ6VzEsZW52bWFwX3BhcnNfZnJhZ21lbnQ6WDEsZW52bWFwX3BhcnNfdmVydGV4OiQxLGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50Oml3LGVudm1hcF92ZXJ0ZXg6cTEsZm9nX3ZlcnRleDpZMSxmb2dfcGFyc192ZXJ0ZXg6WjEsZm9nX2ZyYWdtZW50OkoxLGZvZ19wYXJzX2ZyYWdtZW50OksxLGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ6ajEsbGlnaHRtYXBfcGFyc19mcmFnbWVudDpRMSxsaWdodHNfbGFtYmVydF9mcmFnbWVudDp0dyxsaWdodHNfbGFtYmVydF9wYXJzX2ZyYWdtZW50OmV3LGxpZ2h0c19wYXJzX2JlZ2luOm53LGxpZ2h0c190b29uX2ZyYWdtZW50OnJ3LGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQ6c3csbGlnaHRzX3Bob25nX2ZyYWdtZW50Om93LGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50OmF3LGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudDpjdyxsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudDpsdyxsaWdodHNfZnJhZ21lbnRfYmVnaW46dXcsbGlnaHRzX2ZyYWdtZW50X21hcHM6aHcsbGlnaHRzX2ZyYWdtZW50X2VuZDpmdyxsb2dkZXB0aGJ1Zl9mcmFnbWVudDpkdyxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50OnB3LGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4Om13LGxvZ2RlcHRoYnVmX3ZlcnRleDpndyxtYXBfZnJhZ21lbnQ6eHcsbWFwX3BhcnNfZnJhZ21lbnQ6X3csbWFwX3BhcnRpY2xlX2ZyYWdtZW50Onl3LG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50OnZ3LG1ldGFsbmVzc21hcF9mcmFnbWVudDpNdyxtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDpTdyxtb3JwaGluc3RhbmNlX3ZlcnRleDpidyxtb3JwaGNvbG9yX3ZlcnRleDp3dyxtb3JwaG5vcm1hbF92ZXJ0ZXg6QXcsbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg6VHcsbW9ycGh0YXJnZXRfdmVydGV4OkV3LG5vcm1hbF9mcmFnbWVudF9iZWdpbjpDdyxub3JtYWxfZnJhZ21lbnRfbWFwczpSdyxub3JtYWxfcGFyc19mcmFnbWVudDpJdyxub3JtYWxfcGFyc192ZXJ0ZXg6UHcsbm9ybWFsX3ZlcnRleDpMdyxub3JtYWxtYXBfcGFyc19mcmFnbWVudDpEdyxjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luOlV3LGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwczpOdyxjbGVhcmNvYXRfcGFyc19mcmFnbWVudDpGdyxpcmlkZXNjZW5jZV9wYXJzX2ZyYWdtZW50OkJ3LG9wYXF1ZV9mcmFnbWVudDpPdyxwYWNraW5nOnp3LHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ6a3cscHJvamVjdF92ZXJ0ZXg6VncsZGl0aGVyaW5nX2ZyYWdtZW50Okd3LGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50Okh3LHJvdWdobmVzc21hcF9mcmFnbWVudDpXdyxyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudDpYdyxzaGFkb3dtYXBfcGFyc19mcmFnbWVudDokdyxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg6cXcsc2hhZG93bWFwX3ZlcnRleDpZdyxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ6Wncsc2tpbmJhc2VfdmVydGV4Okp3LHNraW5uaW5nX3BhcnNfdmVydGV4Okt3LHNraW5uaW5nX3ZlcnRleDpqdyxza2lubm9ybWFsX3ZlcnRleDpRdyxzcGVjdWxhcm1hcF9mcmFnbWVudDp0QSxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50OmVBLHRvbmVtYXBwaW5nX2ZyYWdtZW50Om5BLHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6aUEsdHJhbnNtaXNzaW9uX2ZyYWdtZW50OnJBLHRyYW5zbWlzc2lvbl9wYXJzX2ZyYWdtZW50OnNBLHV2X3BhcnNfZnJhZ21lbnQ6b0EsdXZfcGFyc192ZXJ0ZXg6YUEsdXZfdmVydGV4OmNBLHdvcmxkcG9zX3ZlcnRleDpsQSxiYWNrZ3JvdW5kX3ZlcnQ6YHZhcnlpbmcgdmVjMiB2VXY7CnVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTsKdm9pZCBtYWluKCkgewoJdlV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTsKCWdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24ueHksIDEuMCwgMS4wICk7Cn1gLGJhY2tncm91bmRfZnJhZzpgdW5pZm9ybSBzYW1wbGVyMkQgdDJEOwp1bmlmb3JtIGZsb2F0IGJhY2tncm91bmRJbnRlbnNpdHk7CnZhcnlpbmcgdmVjMiB2VXY7CnZvaWQgbWFpbigpIHsKCXZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQoIHQyRCwgdlV2ICk7CgkjaWZkZWYgREVDT0RFX1ZJREVPX1RFWFRVUkUKCQl0ZXhDb2xvciA9IHZlYzQoIG1peCggcG93KCB0ZXhDb2xvci5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdGV4Q29sb3IucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB0ZXhDb2xvci5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdGV4Q29sb3IudyApOwoJI2VuZGlmCgl0ZXhDb2xvci5yZ2IgKj0gYmFja2dyb3VuZEludGVuc2l0eTsKCWdsX0ZyYWdDb2xvciA9IHRleENvbG9yOwoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+Cn1gLGJhY2tncm91bmRDdWJlX3ZlcnQ6YHZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CiNpbmNsdWRlIDxjb21tb24+CnZvaWQgbWFpbigpIHsKCXZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJZ2xfUG9zaXRpb24ueiA9IGdsX1Bvc2l0aW9uLnc7Cn1gLGJhY2tncm91bmRDdWJlX2ZyYWc6YCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFCgl1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDsKI2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApCgl1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7CiNlbmRpZgp1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7CnVuaWZvcm0gZmxvYXQgYmFja2dyb3VuZEJsdXJyaW5lc3M7CnVuaWZvcm0gZmxvYXQgYmFja2dyb3VuZEludGVuc2l0eTsKdW5pZm9ybSBtYXQzIGJhY2tncm91bmRSb3RhdGlvbjsKdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkUKCQl2ZWM0IHRleENvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgYmFja2dyb3VuZFJvdGF0aW9uICogdmVjMyggZmxpcEVudk1hcCAqIHZXb3JsZERpcmVjdGlvbi54LCB2V29ybGREaXJlY3Rpb24ueXogKSApOwoJI2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApCgkJdmVjNCB0ZXhDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgYmFja2dyb3VuZFJvdGF0aW9uICogdldvcmxkRGlyZWN0aW9uLCBiYWNrZ3JvdW5kQmx1cnJpbmVzcyApOwoJI2Vsc2UKCQl2ZWM0IHRleENvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7CgkjZW5kaWYKCXRleENvbG9yLnJnYiAqPSBiYWNrZ3JvdW5kSW50ZW5zaXR5OwoJZ2xfRnJhZ0NvbG9yID0gdGV4Q29sb3I7CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KfWAsY3ViZV92ZXJ0OmB2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgp2b2lkIG1haW4oKSB7Cgl2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApOwoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCWdsX1Bvc2l0aW9uLnogPSBnbF9Qb3NpdGlvbi53Owp9YCxjdWJlX2ZyYWc6YHVuaWZvcm0gc2FtcGxlckN1YmUgdEN1YmU7CnVuaWZvcm0gZmxvYXQgdEZsaXA7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKdm9pZCBtYWluKCkgewoJdmVjNCB0ZXhDb2xvciA9IHRleHR1cmVDdWJlKCB0Q3ViZSwgdmVjMyggdEZsaXAgKiB2V29ybGREaXJlY3Rpb24ueCwgdldvcmxkRGlyZWN0aW9uLnl6ICkgKTsKCWdsX0ZyYWdDb2xvciA9IHRleENvbG9yOwoJZ2xfRnJhZ0NvbG9yLmEgKj0gb3BhY2l0eTsKCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50Pgp9YCxkZXB0aF92ZXJ0OmAjaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4KdmFyeWluZyB2ZWMyIHZIaWdoUHJlY2lzaW9uWlc7CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgkJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNlbmRpZgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+Cgl2SGlnaFByZWNpc2lvblpXID0gZ2xfUG9zaXRpb24uenc7Cn1gLGRlcHRoX2ZyYWc6YCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDAKCXVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2VuZGlmCiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxwYWNraW5nPgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZhcnlpbmcgdmVjMiB2SGlnaFByZWNpc2lvblpXOwp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCSNpZiBERVBUSF9QQUNLSU5HID09IDMyMDAKCQlkaWZmdXNlQ29sb3IuYSA9IG9wYWNpdHk7CgkjZW5kaWYKCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCWZsb2F0IGZyYWdDb29yZFogPSAwLjUgKiB2SGlnaFByZWNpc2lvblpXWzBdIC8gdkhpZ2hQcmVjaXNpb25aV1sxXSArIDAuNTsKCSNpZiBERVBUSF9QQUNLSU5HID09IDMyMDAKCQlnbF9GcmFnQ29sb3IgPSB2ZWM0KCB2ZWMzKCAxLjAgLSBmcmFnQ29vcmRaICksIG9wYWNpdHkgKTsKCSNlbGlmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMQoJCWdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZnJhZ0Nvb3JkWiApOwoJI2VsaWYgREVQVEhfUEFDS0lORyA9PSAzMjAyCgkJZ2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja0RlcHRoVG9SR0IoIGZyYWdDb29yZFogKSwgMS4wICk7CgkjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDMKCQlnbF9GcmFnQ29sb3IgPSB2ZWM0KCBwYWNrRGVwdGhUb1JHKCBmcmFnQ29vcmRaICksIDAuMCwgMS4wICk7CgkjZW5kaWYKfWAsZGlzdGFuY2VSR0JBX3ZlcnQ6YCNkZWZpbmUgRElTVEFOQ0UKdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgkJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNlbmRpZgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+Cgl2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6Owp9YCxkaXN0YW5jZVJHQkFfZnJhZzpgI2RlZmluZSBESVNUQU5DRQp1bmlmb3JtIHZlYzMgcmVmZXJlbmNlUG9zaXRpb247CnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlOwp1bmlmb3JtIGZsb2F0IGZhckRpc3RhbmNlOwp2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxwYWNraW5nPgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluICgpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMS4wICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJZmxvYXQgZGlzdCA9IGxlbmd0aCggdldvcmxkUG9zaXRpb24gLSByZWZlcmVuY2VQb3NpdGlvbiApOwoJZGlzdCA9ICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApOwoJZGlzdCA9IHNhdHVyYXRlKCBkaXN0ICk7CglnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGRpc3QgKTsKfWAsZXF1aXJlY3RfdmVydDpgdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4Kdm9pZCBtYWluKCkgewoJdldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTsKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+Cn1gLGVxdWlyZWN0X2ZyYWc6YHVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDsKdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4Kdm9pZCBtYWluKCkgewoJdmVjMyBkaXJlY3Rpb24gPSBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApOwoJdmVjMiBzYW1wbGVVViA9IGVxdWlyZWN0VXYoIGRpcmVjdGlvbiApOwoJZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KfWAsbGluZWRhc2hlZF92ZXJ0OmB1bmlmb3JtIGZsb2F0IHNjYWxlOwphdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlOwp2YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJdkxpbmVEaXN0YW5jZSA9IHNjYWxlICogbGluZURpc3RhbmNlOwoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCxsaW5lZGFzaGVkX2ZyYWc6YHVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7CnVuaWZvcm0gZmxvYXQgdG90YWxTaXplOwp2YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCWlmICggbW9kKCB2TGluZURpc3RhbmNlLCB0b3RhbFNpemUgKSA+IGRhc2hTaXplICkgewoJCWRpc2NhcmQ7Cgl9Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CglvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjsKCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KfWAsbWVzaGJhc2ljX3ZlcnQ6YCNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpZiBkZWZpbmVkICggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQgKCBVU0VfU0tJTk5JTkcgKQoJCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjZW5kaWYKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCxtZXNoYmFzaWNfZnJhZzpgdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2lmbmRlZiBGTEFUX1NIQURFRAoJdmFyeWluZyB2ZWMzIHZOb3JtYWw7CiNlbmRpZgojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJI2lmZGVmIFVTRV9MSUdIVE1BUAoJCXZlYzQgbGlnaHRNYXBUZXhlbCA9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZMaWdodE1hcFV2ICk7CgkJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGxpZ2h0TWFwVGV4ZWwucmdiICogbGlnaHRNYXBJbnRlbnNpdHkgKiBSRUNJUFJPQ0FMX1BJOwoJI2Vsc2UKCQlyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdmVjMyggMS4wICk7CgkjZW5kaWYKCSNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD4KCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBkaWZmdXNlQ29sb3IucmdiOwoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlOwoJI2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KCSNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+Cn1gLG1lc2hsYW1iZXJ0X3ZlcnQ6YCNkZWZpbmUgTEFNQkVSVAp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsbWVzaGxhbWJlcnRfZnJhZzpgI2RlZmluZSBMQU1CRVJUCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxic2Rmcz4KI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodHNfbGFtYmVydF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCVJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7Cgl2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfbGFtYmVydF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD4KCSNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD4KCXZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7CgkjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD4KfWAsbWVzaG1hdGNhcF92ZXJ0OmAjZGVmaW5lIE1BVENBUAp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4PgoJdlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7Cn1gLG1lc2htYXRjYXBfZnJhZzpgI2RlZmluZSBNQVRDQVAKdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKdW5pZm9ybSBzYW1wbGVyMkQgbWF0Y2FwOwp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPgoJdmVjMyB2aWV3RGlyID0gbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7Cgl2ZWMzIHggPSBub3JtYWxpemUoIHZlYzMoIHZpZXdEaXIueiwgMC4wLCAtIHZpZXdEaXIueCApICk7Cgl2ZWMzIHkgPSBjcm9zcyggdmlld0RpciwgeCApOwoJdmVjMiB1diA9IHZlYzIoIGRvdCggeCwgbm9ybWFsICksIGRvdCggeSwgbm9ybWFsICkgKSAqIDAuNDk1ICsgMC41OwoJI2lmZGVmIFVTRV9NQVRDQVAKCQl2ZWM0IG1hdGNhcENvbG9yID0gdGV4dHVyZTJEKCBtYXRjYXAsIHV2ICk7CgkjZWxzZQoJCXZlYzQgbWF0Y2FwQ29sb3IgPSB2ZWM0KCB2ZWMzKCBtaXgoIDAuMiwgMC44LCB1di55ICkgKSwgMS4wICk7CgkjZW5kaWYKCXZlYzMgb3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2IgKiBtYXRjYXBDb2xvci5yZ2I7CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCxtZXNobm9ybWFsX3ZlcnQ6YCNkZWZpbmUgTk9STUFMCiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKQoJdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNlbmRpZgojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgojaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFICkKCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwojZW5kaWYKfWAsbWVzaG5vcm1hbF9mcmFnOmAjZGVmaW5lIE5PUk1BTAp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKQoJdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNlbmRpZgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPgoJZ2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgZGlmZnVzZUNvbG9yLmEgKTsKCSNpZmRlZiBPUEFRVUUKCQlnbF9GcmFnQ29sb3IuYSA9IDEuMDsKCSNlbmRpZgp9YCxtZXNocGhvbmdfdmVydDpgI2RlZmluZSBQSE9ORwp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsbWVzaHBob25nX2ZyYWc6YCNkZWZpbmUgUEhPTkcKdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTsKdW5pZm9ybSB2ZWMzIHNwZWN1bGFyOwp1bmlmb3JtIGZsb2F0IHNoaW5pbmVzczsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJzZGZzPgojaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCVJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7Cgl2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfcGhvbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+CgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlOwoJI2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KCSNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+Cn1gLG1lc2hwaHlzaWNhbF92ZXJ0OmAjZGVmaW5lIFNUQU5EQVJECnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uOwojZW5kaWYKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+CiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OCgl2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6OwojZW5kaWYKfWAsbWVzaHBoeXNpY2FsX2ZyYWc6YCNkZWZpbmUgU1RBTkRBUkQKI2lmZGVmIFBIWVNJQ0FMCgkjZGVmaW5lIElPUgoJI2RlZmluZSBVU0VfU1BFQ1VMQVIKI2VuZGlmCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzOwp1bmlmb3JtIGZsb2F0IG1ldGFsbmVzczsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaWZkZWYgSU9SCgl1bmlmb3JtIGZsb2F0IGlvcjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVIKCXVuaWZvcm0gZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHk7Cgl1bmlmb3JtIHZlYzMgc3BlY3VsYXJDb2xvcjsKCSNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhckNvbG9yTWFwOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFySW50ZW5zaXR5TWFwOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVAoJdW5pZm9ybSBmbG9hdCBjbGVhcmNvYXQ7Cgl1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzczsKI2VuZGlmCiNpZmRlZiBVU0VfRElTUEVSU0lPTgoJdW5pZm9ybSBmbG9hdCBkaXNwZXJzaW9uOwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJdW5pZm9ybSBmbG9hdCBpcmlkZXNjZW5jZTsKCXVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2VJT1I7Cgl1bmlmb3JtIGZsb2F0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTsKCXVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtOwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTgoJdW5pZm9ybSB2ZWMzIHNoZWVuQ29sb3I7Cgl1bmlmb3JtIGZsb2F0IHNoZWVuUm91Z2huZXNzOwoJI2lmZGVmIFVTRV9TSEVFTl9DT0xPUk1BUAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNoZWVuQ29sb3JNYXA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgkJdW5pZm9ybSBzYW1wbGVyMkQgc2hlZW5Sb3VnaG5lc3NNYXA7CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfQU5JU09UUk9QWQoJdW5pZm9ybSB2ZWMyIGFuaXNvdHJvcHlWZWN0b3I7CgkjaWZkZWYgVVNFX0FOSVNPVFJPUFlNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCBhbmlzb3Ryb3B5TWFwOwoJI2VuZGlmCiNlbmRpZgp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGlyaWRlc2NlbmNlX2ZyYWdtZW50PgojaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHRyYW5zbWlzc2lvbl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8aXJpZGVzY2VuY2VfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCVJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7Cgl2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHJvdWdobmVzc21hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD4KCSNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD4KCXZlYzMgdG90YWxEaWZmdXNlID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTsKCXZlYzMgdG90YWxTcGVjdWxhciA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhcjsKCSNpbmNsdWRlIDx0cmFuc21pc3Npb25fZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSB0b3RhbERpZmZ1c2UgKyB0b3RhbFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlOwoJI2lmZGVmIFVTRV9TSEVFTgoJCWZsb2F0IHNoZWVuRW5lcmd5Q29tcCA9IDEuMCAtIDAuMTU3ICogbWF4MyggbWF0ZXJpYWwuc2hlZW5Db2xvciApOwoJCW91dGdvaW5nTGlnaHQgPSBvdXRnb2luZ0xpZ2h0ICogc2hlZW5FbmVyZ3lDb21wICsgc2hlZW5TcGVjdWxhckRpcmVjdCArIHNoZWVuU3BlY3VsYXJJbmRpcmVjdDsKCSNlbmRpZgoJI2lmZGVmIFVTRV9DTEVBUkNPQVQKCQlmbG9hdCBkb3ROVmNjID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGdlb21ldHJ5Vmlld0RpciApICk7CgkJdmVjMyBGY2MgPSBGX1NjaGxpY2soIG1hdGVyaWFsLmNsZWFyY29hdEYwLCBtYXRlcmlhbC5jbGVhcmNvYXRGOTAsIGRvdE5WY2MgKTsKCQlvdXRnb2luZ0xpZ2h0ID0gb3V0Z29pbmdMaWdodCAqICggMS4wIC0gbWF0ZXJpYWwuY2xlYXJjb2F0ICogRmNjICkgKyAoIGNsZWFyY29hdFNwZWN1bGFyRGlyZWN0ICsgY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdCApICogbWF0ZXJpYWwuY2xlYXJjb2F0OwoJI2VuZGlmCgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCxtZXNodG9vbl92ZXJ0OmAjZGVmaW5lIFRPT04KdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoaW5zdGFuY2VfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+Cgl2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejsKCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCxtZXNodG9vbl9mcmFnOmAjZGVmaW5lIFRPT04KdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnNkZnM+CiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bGlnaHRzX3Rvb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCVJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7Cgl2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfdG9vbl9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD4KCSNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD4KCXZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCxwb2ludHNfdmVydDpgdW5pZm9ybSBmbG9hdCBzaXplOwp1bmlmb3JtIGZsb2F0IHNjYWxlOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PgojaWZkZWYgVVNFX1BPSU5UU19VVgoJdmFyeWluZyB2ZWMyIHZVdjsKCXVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTsKI2VuZGlmCnZvaWQgbWFpbigpIHsKCSNpZmRlZiBVU0VfUE9JTlRTX1VWCgkJdlV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTsKCSNlbmRpZgoJI2luY2x1ZGUgPGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGluc3RhbmNlX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJZ2xfUG9pbnRTaXplID0gc2l6ZTsKCSNpZmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OCgkJYm9vbCBpc1BlcnNwZWN0aXZlID0gaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApOwoJCWlmICggaXNQZXJzcGVjdGl2ZSApIGdsX1BvaW50U2l6ZSAqPSAoIHNjYWxlIC8gLSBtdlBvc2l0aW9uLnogKTsKCSNlbmRpZgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCxwb2ludHNfZnJhZzpgdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWFwX3BhcnRpY2xlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+CglvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjsKCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KfWAsc2hhZG93X3ZlcnQ6YCNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhpbnN0YW5jZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsc2hhZG93X2ZyYWc6YHVuaWZvcm0gdmVjMyBjb2xvcjsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnNkZnM+CiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNoYWRvd21hc2tfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJZ2xfRnJhZ0NvbG9yID0gdmVjNCggY29sb3IsIG9wYWNpdHkgKiAoIDEuMCAtIGdldFNoYWRvd01hc2soKSApICk7CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+Cn1gLHNwcml0ZV92ZXJ0OmB1bmlmb3JtIGZsb2F0IHJvdGF0aW9uOwp1bmlmb3JtIHZlYzIgY2VudGVyOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCXZlYzQgbXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeFsgMyBdOwoJdmVjMiBzY2FsZSA9IHZlYzIoIGxlbmd0aCggbW9kZWxNYXRyaXhbIDAgXS54eXogKSwgbGVuZ3RoKCBtb2RlbE1hdHJpeFsgMSBdLnh5eiApICk7CgkjaWZuZGVmIFVTRV9TSVpFQVRURU5VQVRJT04KCQlib29sIGlzUGVyc3BlY3RpdmUgPSBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICk7CgkJaWYgKCBpc1BlcnNwZWN0aXZlICkgc2NhbGUgKj0gLSBtdlBvc2l0aW9uLno7CgkjZW5kaWYKCXZlYzIgYWxpZ25lZFBvc2l0aW9uID0gKCBwb3NpdGlvbi54eSAtICggY2VudGVyIC0gdmVjMiggMC41ICkgKSApICogc2NhbGU7Cgl2ZWMyIHJvdGF0ZWRQb3NpdGlvbjsKCXJvdGF0ZWRQb3NpdGlvbi54ID0gY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTsKCXJvdGF0ZWRQb3NpdGlvbi55ID0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggKyBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTsKCW12UG9zaXRpb24ueHkgKz0gcm90YXRlZFBvc2l0aW9uOwoJZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCxzcHJpdGVfZnJhZzpgdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD4KCXZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJb3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Pgp9YH0scHQ9e2NvbW1vbjp7ZGlmZnVzZTp7dmFsdWU6bmV3IHl0KDE2Nzc3MjE1KX0sb3BhY2l0eTp7dmFsdWU6MX0sbWFwOnt2YWx1ZTpudWxsfSxtYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH0sYWxwaGFNYXA6e3ZhbHVlOm51bGx9LGFscGhhTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LGFscGhhVGVzdDp7dmFsdWU6MH19LHNwZWN1bGFybWFwOntzcGVjdWxhck1hcDp7dmFsdWU6bnVsbH0sc3BlY3VsYXJNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH19LGVudm1hcDp7ZW52TWFwOnt2YWx1ZTpudWxsfSxlbnZNYXBSb3RhdGlvbjp7dmFsdWU6bmV3IFd0fSxmbGlwRW52TWFwOnt2YWx1ZTotMX0scmVmbGVjdGl2aXR5Ont2YWx1ZToxfSxpb3I6e3ZhbHVlOjEuNX0scmVmcmFjdGlvblJhdGlvOnt2YWx1ZTouOTh9fSxhb21hcDp7YW9NYXA6e3ZhbHVlOm51bGx9LGFvTWFwSW50ZW5zaXR5Ont2YWx1ZToxfSxhb01hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fX0sbGlnaHRtYXA6e2xpZ2h0TWFwOnt2YWx1ZTpudWxsfSxsaWdodE1hcEludGVuc2l0eTp7dmFsdWU6MX0sbGlnaHRNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH19LGJ1bXBtYXA6e2J1bXBNYXA6e3ZhbHVlOm51bGx9LGJ1bXBNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH0sYnVtcFNjYWxlOnt2YWx1ZToxfX0sbm9ybWFsbWFwOntub3JtYWxNYXA6e3ZhbHVlOm51bGx9LG5vcm1hbE1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fSxub3JtYWxTY2FsZTp7dmFsdWU6bmV3IHEoMSwxKX19LGRpc3BsYWNlbWVudG1hcDp7ZGlzcGxhY2VtZW50TWFwOnt2YWx1ZTpudWxsfSxkaXNwbGFjZW1lbnRNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH0sZGlzcGxhY2VtZW50U2NhbGU6e3ZhbHVlOjF9LGRpc3BsYWNlbWVudEJpYXM6e3ZhbHVlOjB9fSxlbWlzc2l2ZW1hcDp7ZW1pc3NpdmVNYXA6e3ZhbHVlOm51bGx9LGVtaXNzaXZlTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9fSxtZXRhbG5lc3NtYXA6e21ldGFsbmVzc01hcDp7dmFsdWU6bnVsbH0sbWV0YWxuZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9fSxyb3VnaG5lc3NtYXA6e3JvdWdobmVzc01hcDp7dmFsdWU6bnVsbH0scm91Z2huZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9fSxncmFkaWVudG1hcDp7Z3JhZGllbnRNYXA6e3ZhbHVlOm51bGx9fSxmb2c6e2ZvZ0RlbnNpdHk6e3ZhbHVlOjI1ZS01fSxmb2dOZWFyOnt2YWx1ZToxfSxmb2dGYXI6e3ZhbHVlOjJlM30sZm9nQ29sb3I6e3ZhbHVlOm5ldyB5dCgxNjc3NzIxNSl9fSxsaWdodHM6e2FtYmllbnRMaWdodENvbG9yOnt2YWx1ZTpbXX0sbGlnaHRQcm9iZTp7dmFsdWU6W119LGRpcmVjdGlvbmFsTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntkaXJlY3Rpb246e30sY29sb3I6e319fSxkaXJlY3Rpb25hbExpZ2h0U2hhZG93czp7dmFsdWU6W10scHJvcGVydGllczp7c2hhZG93SW50ZW5zaXR5OjEsc2hhZG93Qmlhczp7fSxzaGFkb3dOb3JtYWxCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sZGlyZWN0aW9uYWxTaGFkb3dNYXA6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDp7dmFsdWU6W119LHNwb3RMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LGRpcmVjdGlvbjp7fSxkaXN0YW5jZTp7fSxjb25lQ29zOnt9LHBlbnVtYnJhQ29zOnt9LGRlY2F5Ont9fX0sc3BvdExpZ2h0U2hhZG93czp7dmFsdWU6W10scHJvcGVydGllczp7c2hhZG93SW50ZW5zaXR5OjEsc2hhZG93Qmlhczp7fSxzaGFkb3dOb3JtYWxCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sc3BvdExpZ2h0TWFwOnt2YWx1ZTpbXX0sc3BvdFNoYWRvd01hcDp7dmFsdWU6W119LHNwb3RMaWdodE1hdHJpeDp7dmFsdWU6W119LHBvaW50TGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSxkZWNheTp7fSxkaXN0YW5jZTp7fX19LHBvaW50TGlnaHRTaGFkb3dzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntzaGFkb3dJbnRlbnNpdHk6MSxzaGFkb3dCaWFzOnt9LHNoYWRvd05vcm1hbEJpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e30sc2hhZG93Q2FtZXJhTmVhcjp7fSxzaGFkb3dDYW1lcmFGYXI6e319fSxwb2ludFNoYWRvd01hcDp7dmFsdWU6W119LHBvaW50U2hhZG93TWF0cml4Ont2YWx1ZTpbXX0saGVtaXNwaGVyZUxpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7ZGlyZWN0aW9uOnt9LHNreUNvbG9yOnt9LGdyb3VuZENvbG9yOnt9fX0scmVjdEFyZWFMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LHdpZHRoOnt9LGhlaWdodDp7fX19LGx0Y18xOnt2YWx1ZTpudWxsfSxsdGNfMjp7dmFsdWU6bnVsbH19LHBvaW50czp7ZGlmZnVzZTp7dmFsdWU6bmV3IHl0KDE2Nzc3MjE1KX0sb3BhY2l0eTp7dmFsdWU6MX0sc2l6ZTp7dmFsdWU6MX0sc2NhbGU6e3ZhbHVlOjF9LG1hcDp7dmFsdWU6bnVsbH0sYWxwaGFNYXA6e3ZhbHVlOm51bGx9LGFscGhhTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LGFscGhhVGVzdDp7dmFsdWU6MH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH19LHNwcml0ZTp7ZGlmZnVzZTp7dmFsdWU6bmV3IHl0KDE2Nzc3MjE1KX0sb3BhY2l0eTp7dmFsdWU6MX0sY2VudGVyOnt2YWx1ZTpuZXcgcSguNSwuNSl9LHJvdGF0aW9uOnt2YWx1ZTowfSxtYXA6e3ZhbHVlOm51bGx9LG1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fSxhbHBoYU1hcDp7dmFsdWU6bnVsbH0sYWxwaGFNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH0sYWxwaGFUZXN0Ont2YWx1ZTowfX19LGxpPXtiYXNpYzp7dW5pZm9ybXM6c24oW3B0LmNvbW1vbixwdC5zcGVjdWxhcm1hcCxwdC5lbnZtYXAscHQuYW9tYXAscHQubGlnaHRtYXAscHQuZm9nXSksdmVydGV4U2hhZGVyOkt0Lm1lc2hiYXNpY192ZXJ0LGZyYWdtZW50U2hhZGVyOkt0Lm1lc2hiYXNpY19mcmFnfSxsYW1iZXJ0Ont1bmlmb3JtczpzbihbcHQuY29tbW9uLHB0LnNwZWN1bGFybWFwLHB0LmVudm1hcCxwdC5hb21hcCxwdC5saWdodG1hcCxwdC5lbWlzc2l2ZW1hcCxwdC5idW1wbWFwLHB0Lm5vcm1hbG1hcCxwdC5kaXNwbGFjZW1lbnRtYXAscHQuZm9nLHB0LmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyB5dCgwKX19XSksdmVydGV4U2hhZGVyOkt0Lm1lc2hsYW1iZXJ0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6S3QubWVzaGxhbWJlcnRfZnJhZ30scGhvbmc6e3VuaWZvcm1zOnNuKFtwdC5jb21tb24scHQuc3BlY3VsYXJtYXAscHQuZW52bWFwLHB0LmFvbWFwLHB0LmxpZ2h0bWFwLHB0LmVtaXNzaXZlbWFwLHB0LmJ1bXBtYXAscHQubm9ybWFsbWFwLHB0LmRpc3BsYWNlbWVudG1hcCxwdC5mb2cscHQubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3IHl0KDApfSxzcGVjdWxhcjp7dmFsdWU6bmV3IHl0KDExMTg0ODEpfSxzaGluaW5lc3M6e3ZhbHVlOjMwfX1dKSx2ZXJ0ZXhTaGFkZXI6S3QubWVzaHBob25nX3ZlcnQsZnJhZ21lbnRTaGFkZXI6S3QubWVzaHBob25nX2ZyYWd9LHN0YW5kYXJkOnt1bmlmb3JtczpzbihbcHQuY29tbW9uLHB0LmVudm1hcCxwdC5hb21hcCxwdC5saWdodG1hcCxwdC5lbWlzc2l2ZW1hcCxwdC5idW1wbWFwLHB0Lm5vcm1hbG1hcCxwdC5kaXNwbGFjZW1lbnRtYXAscHQucm91Z2huZXNzbWFwLHB0Lm1ldGFsbmVzc21hcCxwdC5mb2cscHQubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3IHl0KDApfSxyb3VnaG5lc3M6e3ZhbHVlOjF9LG1ldGFsbmVzczp7dmFsdWU6MH0sZW52TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6S3QubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6S3QubWVzaHBoeXNpY2FsX2ZyYWd9LHRvb246e3VuaWZvcm1zOnNuKFtwdC5jb21tb24scHQuYW9tYXAscHQubGlnaHRtYXAscHQuZW1pc3NpdmVtYXAscHQuYnVtcG1hcCxwdC5ub3JtYWxtYXAscHQuZGlzcGxhY2VtZW50bWFwLHB0LmdyYWRpZW50bWFwLHB0LmZvZyxwdC5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgeXQoMCl9fV0pLHZlcnRleFNoYWRlcjpLdC5tZXNodG9vbl92ZXJ0LGZyYWdtZW50U2hhZGVyOkt0Lm1lc2h0b29uX2ZyYWd9LG1hdGNhcDp7dW5pZm9ybXM6c24oW3B0LmNvbW1vbixwdC5idW1wbWFwLHB0Lm5vcm1hbG1hcCxwdC5kaXNwbGFjZW1lbnRtYXAscHQuZm9nLHttYXRjYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjpLdC5tZXNobWF0Y2FwX3ZlcnQsZnJhZ21lbnRTaGFkZXI6S3QubWVzaG1hdGNhcF9mcmFnfSxwb2ludHM6e3VuaWZvcm1zOnNuKFtwdC5wb2ludHMscHQuZm9nXSksdmVydGV4U2hhZGVyOkt0LnBvaW50c192ZXJ0LGZyYWdtZW50U2hhZGVyOkt0LnBvaW50c19mcmFnfSxkYXNoZWQ6e3VuaWZvcm1zOnNuKFtwdC5jb21tb24scHQuZm9nLHtzY2FsZTp7dmFsdWU6MX0sZGFzaFNpemU6e3ZhbHVlOjF9LHRvdGFsU2l6ZTp7dmFsdWU6Mn19XSksdmVydGV4U2hhZGVyOkt0LmxpbmVkYXNoZWRfdmVydCxmcmFnbWVudFNoYWRlcjpLdC5saW5lZGFzaGVkX2ZyYWd9LGRlcHRoOnt1bmlmb3JtczpzbihbcHQuY29tbW9uLHB0LmRpc3BsYWNlbWVudG1hcF0pLHZlcnRleFNoYWRlcjpLdC5kZXB0aF92ZXJ0LGZyYWdtZW50U2hhZGVyOkt0LmRlcHRoX2ZyYWd9LG5vcm1hbDp7dW5pZm9ybXM6c24oW3B0LmNvbW1vbixwdC5idW1wbWFwLHB0Lm5vcm1hbG1hcCxwdC5kaXNwbGFjZW1lbnRtYXAse29wYWNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjpLdC5tZXNobm9ybWFsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6S3QubWVzaG5vcm1hbF9mcmFnfSxzcHJpdGU6e3VuaWZvcm1zOnNuKFtwdC5zcHJpdGUscHQuZm9nXSksdmVydGV4U2hhZGVyOkt0LnNwcml0ZV92ZXJ0LGZyYWdtZW50U2hhZGVyOkt0LnNwcml0ZV9mcmFnfSxiYWNrZ3JvdW5kOnt1bmlmb3Jtczp7dXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH0sdDJEOnt2YWx1ZTpudWxsfSxiYWNrZ3JvdW5kSW50ZW5zaXR5Ont2YWx1ZToxfX0sdmVydGV4U2hhZGVyOkt0LmJhY2tncm91bmRfdmVydCxmcmFnbWVudFNoYWRlcjpLdC5iYWNrZ3JvdW5kX2ZyYWd9LGJhY2tncm91bmRDdWJlOnt1bmlmb3Jtczp7ZW52TWFwOnt2YWx1ZTpudWxsfSxmbGlwRW52TWFwOnt2YWx1ZTotMX0sYmFja2dyb3VuZEJsdXJyaW5lc3M6e3ZhbHVlOjB9LGJhY2tncm91bmRJbnRlbnNpdHk6e3ZhbHVlOjF9LGJhY2tncm91bmRSb3RhdGlvbjp7dmFsdWU6bmV3IFd0fX0sdmVydGV4U2hhZGVyOkt0LmJhY2tncm91bmRDdWJlX3ZlcnQsZnJhZ21lbnRTaGFkZXI6S3QuYmFja2dyb3VuZEN1YmVfZnJhZ30sY3ViZTp7dW5pZm9ybXM6e3RDdWJlOnt2YWx1ZTpudWxsfSx0RmxpcDp7dmFsdWU6LTF9LG9wYWNpdHk6e3ZhbHVlOjF9fSx2ZXJ0ZXhTaGFkZXI6S3QuY3ViZV92ZXJ0LGZyYWdtZW50U2hhZGVyOkt0LmN1YmVfZnJhZ30sZXF1aXJlY3Q6e3VuaWZvcm1zOnt0RXF1aXJlY3Q6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6S3QuZXF1aXJlY3RfdmVydCxmcmFnbWVudFNoYWRlcjpLdC5lcXVpcmVjdF9mcmFnfSxkaXN0YW5jZVJHQkE6e3VuaWZvcm1zOnNuKFtwdC5jb21tb24scHQuZGlzcGxhY2VtZW50bWFwLHtyZWZlcmVuY2VQb3NpdGlvbjp7dmFsdWU6bmV3IEl9LG5lYXJEaXN0YW5jZTp7dmFsdWU6MX0sZmFyRGlzdGFuY2U6e3ZhbHVlOjFlM319XSksdmVydGV4U2hhZGVyOkt0LmRpc3RhbmNlUkdCQV92ZXJ0LGZyYWdtZW50U2hhZGVyOkt0LmRpc3RhbmNlUkdCQV9mcmFnfSxzaGFkb3c6e3VuaWZvcm1zOnNuKFtwdC5saWdodHMscHQuZm9nLHtjb2xvcjp7dmFsdWU6bmV3IHl0KDApfSxvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6S3Quc2hhZG93X3ZlcnQsZnJhZ21lbnRTaGFkZXI6S3Quc2hhZG93X2ZyYWd9fTtsaS5waHlzaWNhbD17dW5pZm9ybXM6c24oW2xpLnN0YW5kYXJkLnVuaWZvcm1zLHtjbGVhcmNvYXQ6e3ZhbHVlOjB9LGNsZWFyY29hdE1hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LGNsZWFyY29hdE5vcm1hbE1hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LGNsZWFyY29hdE5vcm1hbFNjYWxlOnt2YWx1ZTpuZXcgcSgxLDEpfSxjbGVhcmNvYXRSb3VnaG5lc3M6e3ZhbHVlOjB9LGNsZWFyY29hdFJvdWdobmVzc01hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0Um91Z2huZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LGRpc3BlcnNpb246e3ZhbHVlOjB9LGlyaWRlc2NlbmNlOnt2YWx1ZTowfSxpcmlkZXNjZW5jZU1hcDp7dmFsdWU6bnVsbH0saXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH0saXJpZGVzY2VuY2VJT1I6e3ZhbHVlOjEuM30saXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtOnt2YWx1ZToxMDB9LGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTp7dmFsdWU6NDAwfSxpcmlkZXNjZW5jZVRoaWNrbmVzc01hcDp7dmFsdWU6bnVsbH0saXJpZGVzY2VuY2VUaGlja25lc3NNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH0sc2hlZW46e3ZhbHVlOjB9LHNoZWVuQ29sb3I6e3ZhbHVlOm5ldyB5dCgwKX0sc2hlZW5Db2xvck1hcDp7dmFsdWU6bnVsbH0sc2hlZW5Db2xvck1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fSxzaGVlblJvdWdobmVzczp7dmFsdWU6MX0sc2hlZW5Sb3VnaG5lc3NNYXA6e3ZhbHVlOm51bGx9LHNoZWVuUm91Z2huZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LHRyYW5zbWlzc2lvbjp7dmFsdWU6MH0sdHJhbnNtaXNzaW9uTWFwOnt2YWx1ZTpudWxsfSx0cmFuc21pc3Npb25NYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBXdH0sdHJhbnNtaXNzaW9uU2FtcGxlclNpemU6e3ZhbHVlOm5ldyBxfSx0cmFuc21pc3Npb25TYW1wbGVyTWFwOnt2YWx1ZTpudWxsfSx0aGlja25lc3M6e3ZhbHVlOjB9LHRoaWNrbmVzc01hcDp7dmFsdWU6bnVsbH0sdGhpY2tuZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LGF0dGVudWF0aW9uRGlzdGFuY2U6e3ZhbHVlOjB9LGF0dGVudWF0aW9uQ29sb3I6e3ZhbHVlOm5ldyB5dCgwKX0sc3BlY3VsYXJDb2xvcjp7dmFsdWU6bmV3IHl0KDEsMSwxKX0sc3BlY3VsYXJDb2xvck1hcDp7dmFsdWU6bnVsbH0sc3BlY3VsYXJDb2xvck1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFd0fSxzcGVjdWxhckludGVuc2l0eTp7dmFsdWU6MX0sc3BlY3VsYXJJbnRlbnNpdHlNYXA6e3ZhbHVlOm51bGx9LHNwZWN1bGFySW50ZW5zaXR5TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9LGFuaXNvdHJvcHlWZWN0b3I6e3ZhbHVlOm5ldyBxfSxhbmlzb3Ryb3B5TWFwOnt2YWx1ZTpudWxsfSxhbmlzb3Ryb3B5TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgV3R9fV0pLHZlcnRleFNoYWRlcjpLdC5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjpLdC5tZXNocGh5c2ljYWxfZnJhZ307Y29uc3QgZHU9e3I6MCxiOjAsZzowfSx0cz1uZXcgVW4sdUE9bmV3IEN0O2Z1bmN0aW9uIGhBKHIsdCxlLG4saSxzLG8pe2NvbnN0IGE9bmV3IHl0KDApO2xldCBjPXM9PT0hMD8wOjEsbCx1LGg9bnVsbCxmPTAsZD1udWxsO2Z1bmN0aW9uIHAoeSl7bGV0IF89eS5pc1NjZW5lPT09ITA/eS5iYWNrZ3JvdW5kOm51bGw7cmV0dXJuIF8mJl8uaXNUZXh0dXJlJiYoXz0oeS5iYWNrZ3JvdW5kQmx1cnJpbmVzcz4wP2U6dCkuZ2V0KF8pKSxffWZ1bmN0aW9uIHgoeSl7bGV0IF89ITE7Y29uc3QgUz1wKHkpO1M9PT1udWxsP20oYSxjKTpTJiZTLmlzQ29sb3ImJihtKFMsMSksXz0hMCk7Y29uc3Qgdz1yLnhyLmdldEVudmlyb25tZW50QmxlbmRNb2RlKCk7dz09PSJhZGRpdGl2ZSI/bi5idWZmZXJzLmNvbG9yLnNldENsZWFyKDAsMCwwLDEsbyk6dz09PSJhbHBoYS1ibGVuZCImJm4uYnVmZmVycy5jb2xvci5zZXRDbGVhcigwLDAsMCwwLG8pLChyLmF1dG9DbGVhcnx8XykmJihuLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCksbi5idWZmZXJzLmRlcHRoLnNldE1hc2soITApLG4uYnVmZmVycy5jb2xvci5zZXRNYXNrKCEwKSxyLmNsZWFyKHIuYXV0b0NsZWFyQ29sb3Isci5hdXRvQ2xlYXJEZXB0aCxyLmF1dG9DbGVhclN0ZW5jaWwpKX1mdW5jdGlvbiBnKHksXyl7Y29uc3QgUz1wKF8pO1MmJihTLmlzQ3ViZVRleHR1cmV8fFMubWFwcGluZz09PWJzKT8odT09PXZvaWQgMCYmKHU9bmV3IExlKG5ldyB6cigxLDEsMSksbmV3IG9pKHtuYW1lOiJCYWNrZ3JvdW5kQ3ViZU1hdGVyaWFsIix1bmlmb3JtczpIcyhsaS5iYWNrZ3JvdW5kQ3ViZS51bmlmb3JtcyksdmVydGV4U2hhZGVyOmxpLmJhY2tncm91bmRDdWJlLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjpsaS5iYWNrZ3JvdW5kQ3ViZS5mcmFnbWVudFNoYWRlcixzaWRlOlllLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExLGZvZzohMSxhbGxvd092ZXJyaWRlOiExfSkpLHUuZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCJub3JtYWwiKSx1Lmdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSgidXYiKSx1Lm9uQmVmb3JlUmVuZGVyPWZ1bmN0aW9uKHcsQSxUKXt0aGlzLm1hdHJpeFdvcmxkLmNvcHlQb3NpdGlvbihULm1hdHJpeFdvcmxkKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHUubWF0ZXJpYWwsImVudk1hcCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuaWZvcm1zLmVudk1hcC52YWx1ZX19KSxpLnVwZGF0ZSh1KSksdHMuY29weShfLmJhY2tncm91bmRSb3RhdGlvbiksdHMueCo9LTEsdHMueSo9LTEsdHMueio9LTEsUy5pc0N1YmVUZXh0dXJlJiZTLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT09PSExJiYodHMueSo9LTEsdHMueio9LTEpLHUubWF0ZXJpYWwudW5pZm9ybXMuZW52TWFwLnZhbHVlPVMsdS5tYXRlcmlhbC51bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlPVMuaXNDdWJlVGV4dHVyZSYmUy5pc1JlbmRlclRhcmdldFRleHR1cmU9PT0hMT8tMToxLHUubWF0ZXJpYWwudW5pZm9ybXMuYmFja2dyb3VuZEJsdXJyaW5lc3MudmFsdWU9Xy5iYWNrZ3JvdW5kQmx1cnJpbmVzcyx1Lm1hdGVyaWFsLnVuaWZvcm1zLmJhY2tncm91bmRJbnRlbnNpdHkudmFsdWU9Xy5iYWNrZ3JvdW5kSW50ZW5zaXR5LHUubWF0ZXJpYWwudW5pZm9ybXMuYmFja2dyb3VuZFJvdGF0aW9uLnZhbHVlLnNldEZyb21NYXRyaXg0KHVBLm1ha2VSb3RhdGlvbkZyb21FdWxlcih0cykpLHUubWF0ZXJpYWwudG9uZU1hcHBlZD1uZS5nZXRUcmFuc2ZlcihTLmNvbG9yU3BhY2UpIT09ZGUsKGghPT1TfHxmIT09Uy52ZXJzaW9ufHxkIT09ci50b25lTWFwcGluZykmJih1Lm1hdGVyaWFsLm5lZWRzVXBkYXRlPSEwLGg9UyxmPVMudmVyc2lvbixkPXIudG9uZU1hcHBpbmcpLHUubGF5ZXJzLmVuYWJsZUFsbCgpLHkudW5zaGlmdCh1LHUuZ2VvbWV0cnksdS5tYXRlcmlhbCwwLDAsbnVsbCkpOlMmJlMuaXNUZXh0dXJlJiYobD09PXZvaWQgMCYmKGw9bmV3IExlKG5ldyBYcigyLDIpLG5ldyBvaSh7bmFtZToiQmFja2dyb3VuZE1hdGVyaWFsIix1bmlmb3JtczpIcyhsaS5iYWNrZ3JvdW5kLnVuaWZvcm1zKSx2ZXJ0ZXhTaGFkZXI6bGkuYmFja2dyb3VuZC52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6bGkuYmFja2dyb3VuZC5mcmFnbWVudFNoYWRlcixzaWRlOmVpLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExLGZvZzohMSxhbGxvd092ZXJyaWRlOiExfSkpLGwuZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCJub3JtYWwiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobC5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudDJELnZhbHVlfX0pLGkudXBkYXRlKGwpKSxsLm1hdGVyaWFsLnVuaWZvcm1zLnQyRC52YWx1ZT1TLGwubWF0ZXJpYWwudW5pZm9ybXMuYmFja2dyb3VuZEludGVuc2l0eS52YWx1ZT1fLmJhY2tncm91bmRJbnRlbnNpdHksbC5tYXRlcmlhbC50b25lTWFwcGVkPW5lLmdldFRyYW5zZmVyKFMuY29sb3JTcGFjZSkhPT1kZSxTLm1hdHJpeEF1dG9VcGRhdGU9PT0hMCYmUy51cGRhdGVNYXRyaXgoKSxsLm1hdGVyaWFsLnVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoUy5tYXRyaXgpLChoIT09U3x8ZiE9PVMudmVyc2lvbnx8ZCE9PXIudG9uZU1hcHBpbmcpJiYobC5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxoPVMsZj1TLnZlcnNpb24sZD1yLnRvbmVNYXBwaW5nKSxsLmxheWVycy5lbmFibGVBbGwoKSx5LnVuc2hpZnQobCxsLmdlb21ldHJ5LGwubWF0ZXJpYWwsMCwwLG51bGwpKX1mdW5jdGlvbiBtKHksXyl7eS5nZXRSR0IoZHUsZmcocikpLG4uYnVmZmVycy5jb2xvci5zZXRDbGVhcihkdS5yLGR1LmcsZHUuYixfLG8pfWZ1bmN0aW9uIHYoKXt1IT09dm9pZCAwJiYodS5nZW9tZXRyeS5kaXNwb3NlKCksdS5tYXRlcmlhbC5kaXNwb3NlKCksdT12b2lkIDApLGwhPT12b2lkIDAmJihsLmdlb21ldHJ5LmRpc3Bvc2UoKSxsLm1hdGVyaWFsLmRpc3Bvc2UoKSxsPXZvaWQgMCl9cmV0dXJue2dldENsZWFyQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4gYX0sc2V0Q2xlYXJDb2xvcjpmdW5jdGlvbih5LF89MSl7YS5zZXQoeSksYz1fLG0oYSxjKX0sZ2V0Q2xlYXJBbHBoYTpmdW5jdGlvbigpe3JldHVybiBjfSxzZXRDbGVhckFscGhhOmZ1bmN0aW9uKHkpe2M9eSxtKGEsYyl9LHJlbmRlcjp4LGFkZFRvUmVuZGVyTGlzdDpnLGRpc3Bvc2U6dn19ZnVuY3Rpb24gZkEocix0KXtjb25zdCBlPXIuZ2V0UGFyYW1ldGVyKHIuTUFYX1ZFUlRFWF9BVFRSSUJTKSxuPXt9LGk9ZihudWxsKTtsZXQgcz1pLG89ITE7ZnVuY3Rpb24gYShNLEUsRCxMLEYpe2xldCBOPSExO2NvbnN0IE89aChMLEQsRSk7cyE9PU8mJihzPU8sbChzLm9iamVjdCkpLE49ZChNLEwsRCxGKSxOJiZwKE0sTCxELEYpLEYhPT1udWxsJiZ0LnVwZGF0ZShGLHIuRUxFTUVOVF9BUlJBWV9CVUZGRVIpLChOfHxvKSYmKG89ITEsXyhNLEUsRCxMKSxGIT09bnVsbCYmci5iaW5kQnVmZmVyKHIuRUxFTUVOVF9BUlJBWV9CVUZGRVIsdC5nZXQoRikuYnVmZmVyKSl9ZnVuY3Rpb24gYygpe3JldHVybiByLmNyZWF0ZVZlcnRleEFycmF5KCl9ZnVuY3Rpb24gbChNKXtyZXR1cm4gci5iaW5kVmVydGV4QXJyYXkoTSl9ZnVuY3Rpb24gdShNKXtyZXR1cm4gci5kZWxldGVWZXJ0ZXhBcnJheShNKX1mdW5jdGlvbiBoKE0sRSxEKXtjb25zdCBMPUQud2lyZWZyYW1lPT09ITA7bGV0IEY9bltNLmlkXTtGPT09dm9pZCAwJiYoRj17fSxuW00uaWRdPUYpO2xldCBOPUZbRS5pZF07Tj09PXZvaWQgMCYmKE49e30sRltFLmlkXT1OKTtsZXQgTz1OW0xdO3JldHVybiBPPT09dm9pZCAwJiYoTz1mKGMoKSksTltMXT1PKSxPfWZ1bmN0aW9uIGYoTSl7Y29uc3QgRT1bXSxEPVtdLEw9W107Zm9yKGxldCBGPTA7RjxlO0YrKylFW0ZdPTAsRFtGXT0wLExbRl09MDtyZXR1cm57Z2VvbWV0cnk6bnVsbCxwcm9ncmFtOm51bGwsd2lyZWZyYW1lOiExLG5ld0F0dHJpYnV0ZXM6RSxlbmFibGVkQXR0cmlidXRlczpELGF0dHJpYnV0ZURpdmlzb3JzOkwsb2JqZWN0Ok0sYXR0cmlidXRlczp7fSxpbmRleDpudWxsfX1mdW5jdGlvbiBkKE0sRSxELEwpe2NvbnN0IEY9cy5hdHRyaWJ1dGVzLE49RS5hdHRyaWJ1dGVzO2xldCBPPTA7Y29uc3QgSD1ELmdldEF0dHJpYnV0ZXMoKTtmb3IoY29uc3QgeiBpbiBIKWlmKEhbel0ubG9jYXRpb24+PTApe2NvbnN0IHN0PUZbel07bGV0IGZ0PU5bel07aWYoZnQ9PT12b2lkIDAmJih6PT09Imluc3RhbmNlTWF0cml4IiYmTS5pbnN0YW5jZU1hdHJpeCYmKGZ0PU0uaW5zdGFuY2VNYXRyaXgpLHo9PT0iaW5zdGFuY2VDb2xvciImJk0uaW5zdGFuY2VDb2xvciYmKGZ0PU0uaW5zdGFuY2VDb2xvcikpLHN0PT09dm9pZCAwfHxzdC5hdHRyaWJ1dGUhPT1mdHx8ZnQmJnN0LmRhdGEhPT1mdC5kYXRhKXJldHVybiEwO08rK31yZXR1cm4gcy5hdHRyaWJ1dGVzTnVtIT09T3x8cy5pbmRleCE9PUx9ZnVuY3Rpb24gcChNLEUsRCxMKXtjb25zdCBGPXt9LE49RS5hdHRyaWJ1dGVzO2xldCBPPTA7Y29uc3QgSD1ELmdldEF0dHJpYnV0ZXMoKTtmb3IoY29uc3QgeiBpbiBIKWlmKEhbel0ubG9jYXRpb24+PTApe2xldCBzdD1OW3pdO3N0PT09dm9pZCAwJiYoej09PSJpbnN0YW5jZU1hdHJpeCImJk0uaW5zdGFuY2VNYXRyaXgmJihzdD1NLmluc3RhbmNlTWF0cml4KSx6PT09Imluc3RhbmNlQ29sb3IiJiZNLmluc3RhbmNlQ29sb3ImJihzdD1NLmluc3RhbmNlQ29sb3IpKTtjb25zdCBmdD17fTtmdC5hdHRyaWJ1dGU9c3Qsc3QmJnN0LmRhdGEmJihmdC5kYXRhPXN0LmRhdGEpLEZbel09ZnQsTysrfXMuYXR0cmlidXRlcz1GLHMuYXR0cmlidXRlc051bT1PLHMuaW5kZXg9TH1mdW5jdGlvbiB4KCl7Y29uc3QgTT1zLm5ld0F0dHJpYnV0ZXM7Zm9yKGxldCBFPTAsRD1NLmxlbmd0aDtFPEQ7RSsrKU1bRV09MH1mdW5jdGlvbiBnKE0pe20oTSwwKX1mdW5jdGlvbiBtKE0sRSl7Y29uc3QgRD1zLm5ld0F0dHJpYnV0ZXMsTD1zLmVuYWJsZWRBdHRyaWJ1dGVzLEY9cy5hdHRyaWJ1dGVEaXZpc29ycztEW01dPTEsTFtNXT09PTAmJihyLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KE0pLExbTV09MSksRltNXSE9PUUmJihyLnZlcnRleEF0dHJpYkRpdmlzb3IoTSxFKSxGW01dPUUpfWZ1bmN0aW9uIHYoKXtjb25zdCBNPXMubmV3QXR0cmlidXRlcyxFPXMuZW5hYmxlZEF0dHJpYnV0ZXM7Zm9yKGxldCBEPTAsTD1FLmxlbmd0aDtEPEw7RCsrKUVbRF0hPT1NW0RdJiYoci5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoRCksRVtEXT0wKX1mdW5jdGlvbiB5KE0sRSxELEwsRixOLE8pe089PT0hMD9yLnZlcnRleEF0dHJpYklQb2ludGVyKE0sRSxELEYsTik6ci52ZXJ0ZXhBdHRyaWJQb2ludGVyKE0sRSxELEwsRixOKX1mdW5jdGlvbiBfKE0sRSxELEwpe3goKTtjb25zdCBGPUwuYXR0cmlidXRlcyxOPUQuZ2V0QXR0cmlidXRlcygpLE89RS5kZWZhdWx0QXR0cmlidXRlVmFsdWVzO2Zvcihjb25zdCBIIGluIE4pe2NvbnN0IHo9TltIXTtpZih6LmxvY2F0aW9uPj0wKXtsZXQgUT1GW0hdO2lmKFE9PT12b2lkIDAmJihIPT09Imluc3RhbmNlTWF0cml4IiYmTS5pbnN0YW5jZU1hdHJpeCYmKFE9TS5pbnN0YW5jZU1hdHJpeCksSD09PSJpbnN0YW5jZUNvbG9yIiYmTS5pbnN0YW5jZUNvbG9yJiYoUT1NLmluc3RhbmNlQ29sb3IpKSxRIT09dm9pZCAwKXtjb25zdCBzdD1RLm5vcm1hbGl6ZWQsZnQ9US5pdGVtU2l6ZSxSdD10LmdldChRKTtpZihSdD09PXZvaWQgMCljb250aW51ZTtjb25zdCBGdD1SdC5idWZmZXIsSz1SdC50eXBlLG90PVJ0LmJ5dGVzUGVyRWxlbWVudCxNdD1LPT09ci5JTlR8fEs9PT1yLlVOU0lHTkVEX0lOVHx8US5ncHVUeXBlPT09ZGM7aWYoUS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXtjb25zdCBkdD1RLmRhdGEsSXQ9ZHQuc3RyaWRlLCR0PVEub2Zmc2V0O2lmKGR0LmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIpe2ZvcihsZXQgUHQ9MDtQdDx6LmxvY2F0aW9uU2l6ZTtQdCsrKW0oei5sb2NhdGlvbitQdCxkdC5tZXNoUGVyQXR0cmlidXRlKTtNLmlzSW5zdGFuY2VkTWVzaCE9PSEwJiZMLl9tYXhJbnN0YW5jZUNvdW50PT09dm9pZCAwJiYoTC5fbWF4SW5zdGFuY2VDb3VudD1kdC5tZXNoUGVyQXR0cmlidXRlKmR0LmNvdW50KX1lbHNlIGZvcihsZXQgUHQ9MDtQdDx6LmxvY2F0aW9uU2l6ZTtQdCsrKWcoei5sb2NhdGlvbitQdCk7ci5iaW5kQnVmZmVyKHIuQVJSQVlfQlVGRkVSLEZ0KTtmb3IobGV0IFB0PTA7UHQ8ei5sb2NhdGlvblNpemU7UHQrKyl5KHoubG9jYXRpb24rUHQsZnQvei5sb2NhdGlvblNpemUsSyxzdCxJdCpvdCwoJHQrZnQvei5sb2NhdGlvblNpemUqUHQpKm90LE10KX1lbHNle2lmKFEuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUpe2ZvcihsZXQgZHQ9MDtkdDx6LmxvY2F0aW9uU2l6ZTtkdCsrKW0oei5sb2NhdGlvbitkdCxRLm1lc2hQZXJBdHRyaWJ1dGUpO00uaXNJbnN0YW5jZWRNZXNoIT09ITAmJkwuX21heEluc3RhbmNlQ291bnQ9PT12b2lkIDAmJihMLl9tYXhJbnN0YW5jZUNvdW50PVEubWVzaFBlckF0dHJpYnV0ZSpRLmNvdW50KX1lbHNlIGZvcihsZXQgZHQ9MDtkdDx6LmxvY2F0aW9uU2l6ZTtkdCsrKWcoei5sb2NhdGlvbitkdCk7ci5iaW5kQnVmZmVyKHIuQVJSQVlfQlVGRkVSLEZ0KTtmb3IobGV0IGR0PTA7ZHQ8ei5sb2NhdGlvblNpemU7ZHQrKyl5KHoubG9jYXRpb24rZHQsZnQvei5sb2NhdGlvblNpemUsSyxzdCxmdCpvdCxmdC96LmxvY2F0aW9uU2l6ZSpkdCpvdCxNdCl9fWVsc2UgaWYoTyE9PXZvaWQgMCl7Y29uc3Qgc3Q9T1tIXTtpZihzdCE9PXZvaWQgMClzd2l0Y2goc3QubGVuZ3RoKXtjYXNlIDI6ci52ZXJ0ZXhBdHRyaWIyZnYoei5sb2NhdGlvbixzdCk7YnJlYWs7Y2FzZSAzOnIudmVydGV4QXR0cmliM2Z2KHoubG9jYXRpb24sc3QpO2JyZWFrO2Nhc2UgNDpyLnZlcnRleEF0dHJpYjRmdih6LmxvY2F0aW9uLHN0KTticmVhaztkZWZhdWx0OnIudmVydGV4QXR0cmliMWZ2KHoubG9jYXRpb24sc3QpfX19fXYoKX1mdW5jdGlvbiBTKCl7VCgpO2Zvcihjb25zdCBNIGluIG4pe2NvbnN0IEU9bltNXTtmb3IoY29uc3QgRCBpbiBFKXtjb25zdCBMPUVbRF07Zm9yKGNvbnN0IEYgaW4gTCl1KExbRl0ub2JqZWN0KSxkZWxldGUgTFtGXTtkZWxldGUgRVtEXX1kZWxldGUgbltNXX19ZnVuY3Rpb24gdyhNKXtpZihuW00uaWRdPT09dm9pZCAwKXJldHVybjtjb25zdCBFPW5bTS5pZF07Zm9yKGNvbnN0IEQgaW4gRSl7Y29uc3QgTD1FW0RdO2Zvcihjb25zdCBGIGluIEwpdShMW0ZdLm9iamVjdCksZGVsZXRlIExbRl07ZGVsZXRlIEVbRF19ZGVsZXRlIG5bTS5pZF19ZnVuY3Rpb24gQShNKXtmb3IoY29uc3QgRSBpbiBuKXtjb25zdCBEPW5bRV07aWYoRFtNLmlkXT09PXZvaWQgMCljb250aW51ZTtjb25zdCBMPURbTS5pZF07Zm9yKGNvbnN0IEYgaW4gTCl1KExbRl0ub2JqZWN0KSxkZWxldGUgTFtGXTtkZWxldGUgRFtNLmlkXX19ZnVuY3Rpb24gVCgpe2IoKSxvPSEwLHMhPT1pJiYocz1pLGwocy5vYmplY3QpKX1mdW5jdGlvbiBiKCl7aS5nZW9tZXRyeT1udWxsLGkucHJvZ3JhbT1udWxsLGkud2lyZWZyYW1lPSExfXJldHVybntzZXR1cDphLHJlc2V0OlQscmVzZXREZWZhdWx0U3RhdGU6YixkaXNwb3NlOlMscmVsZWFzZVN0YXRlc09mR2VvbWV0cnk6dyxyZWxlYXNlU3RhdGVzT2ZQcm9ncmFtOkEsaW5pdEF0dHJpYnV0ZXM6eCxlbmFibGVBdHRyaWJ1dGU6ZyxkaXNhYmxlVW51c2VkQXR0cmlidXRlczp2fX1mdW5jdGlvbiBkQShyLHQsZSl7bGV0IG47ZnVuY3Rpb24gaShsKXtuPWx9ZnVuY3Rpb24gcyhsLHUpe3IuZHJhd0FycmF5cyhuLGwsdSksZS51cGRhdGUodSxuLDEpfWZ1bmN0aW9uIG8obCx1LGgpe2ghPT0wJiYoci5kcmF3QXJyYXlzSW5zdGFuY2VkKG4sbCx1LGgpLGUudXBkYXRlKHUsbixoKSl9ZnVuY3Rpb24gYShsLHUsaCl7aWYoaD09PTApcmV0dXJuO3QuZ2V0KCJXRUJHTF9tdWx0aV9kcmF3IikubXVsdGlEcmF3QXJyYXlzV0VCR0wobixsLDAsdSwwLGgpO2xldCBkPTA7Zm9yKGxldCBwPTA7cDxoO3ArKylkKz11W3BdO2UudXBkYXRlKGQsbiwxKX1mdW5jdGlvbiBjKGwsdSxoLGYpe2lmKGg9PT0wKXJldHVybjtjb25zdCBkPXQuZ2V0KCJXRUJHTF9tdWx0aV9kcmF3Iik7aWYoZD09PW51bGwpZm9yKGxldCBwPTA7cDxsLmxlbmd0aDtwKyspbyhsW3BdLHVbcF0sZltwXSk7ZWxzZXtkLm11bHRpRHJhd0FycmF5c0luc3RhbmNlZFdFQkdMKG4sbCwwLHUsMCxmLDAsaCk7bGV0IHA9MDtmb3IobGV0IHg9MDt4PGg7eCsrKXArPXVbeF0qZlt4XTtlLnVwZGF0ZShwLG4sMSl9fXRoaXMuc2V0TW9kZT1pLHRoaXMucmVuZGVyPXMsdGhpcy5yZW5kZXJJbnN0YW5jZXM9byx0aGlzLnJlbmRlck11bHRpRHJhdz1hLHRoaXMucmVuZGVyTXVsdGlEcmF3SW5zdGFuY2VzPWN9ZnVuY3Rpb24gcEEocix0LGUsbil7bGV0IGk7ZnVuY3Rpb24gcygpe2lmKGkhPT12b2lkIDApcmV0dXJuIGk7aWYodC5oYXMoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpPT09ITApe2NvbnN0IEE9dC5nZXQoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO2k9ci5nZXRQYXJhbWV0ZXIoQS5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQpfWVsc2UgaT0wO3JldHVybiBpfWZ1bmN0aW9uIG8oQSl7cmV0dXJuIShBIT09bm4mJm4uY29udmVydChBKSE9PXIuZ2V0UGFyYW1ldGVyKHIuSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQpKX1mdW5jdGlvbiBhKEEpe2NvbnN0IFQ9QT09PVRzJiYodC5oYXMoIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIpfHx0LmhhcygiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIpKTtyZXR1cm4hKEEhPT1uaSYmbi5jb252ZXJ0KEEpIT09ci5nZXRQYXJhbWV0ZXIoci5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEUpJiZBIT09eG4mJiFUKX1mdW5jdGlvbiBjKEEpe2lmKEE9PT0iaGlnaHAiKXtpZihyLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdChyLlZFUlRFWF9TSEFERVIsci5ISUdIX0ZMT0FUKS5wcmVjaXNpb24+MCYmci5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoci5GUkFHTUVOVF9TSEFERVIsci5ISUdIX0ZMT0FUKS5wcmVjaXNpb24+MClyZXR1cm4iaGlnaHAiO0E9Im1lZGl1bXAifXJldHVybiBBPT09Im1lZGl1bXAiJiZyLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdChyLlZFUlRFWF9TSEFERVIsci5NRURJVU1fRkxPQVQpLnByZWNpc2lvbj4wJiZyLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdChyLkZSQUdNRU5UX1NIQURFUixyLk1FRElVTV9GTE9BVCkucHJlY2lzaW9uPjA/Im1lZGl1bXAiOiJsb3dwIn1sZXQgbD1lLnByZWNpc2lvbiE9PXZvaWQgMD9lLnByZWNpc2lvbjoiaGlnaHAiO2NvbnN0IHU9YyhsKTt1IT09bCYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjoiLGwsIm5vdCBzdXBwb3J0ZWQsIHVzaW5nIix1LCJpbnN0ZWFkLiIpLGw9dSk7Y29uc3QgaD1lLmxvZ2FyaXRobWljRGVwdGhCdWZmZXI9PT0hMCxmPWUucmV2ZXJzZURlcHRoQnVmZmVyPT09ITAmJnQuaGFzKCJFWFRfY2xpcF9jb250cm9sIiksZD1yLmdldFBhcmFtZXRlcihyLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKSxwPXIuZ2V0UGFyYW1ldGVyKHIuTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTKSx4PXIuZ2V0UGFyYW1ldGVyKHIuTUFYX1RFWFRVUkVfU0laRSksZz1yLmdldFBhcmFtZXRlcihyLk1BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUpLG09ci5nZXRQYXJhbWV0ZXIoci5NQVhfVkVSVEVYX0FUVFJJQlMpLHY9ci5nZXRQYXJhbWV0ZXIoci5NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUykseT1yLmdldFBhcmFtZXRlcihyLk1BWF9WQVJZSU5HX1ZFQ1RPUlMpLF89ci5nZXRQYXJhbWV0ZXIoci5NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTKSxTPXA+MCx3PXIuZ2V0UGFyYW1ldGVyKHIuTUFYX1NBTVBMRVMpO3JldHVybntpc1dlYkdMMjohMCxnZXRNYXhBbmlzb3Ryb3B5OnMsZ2V0TWF4UHJlY2lzaW9uOmMsdGV4dHVyZUZvcm1hdFJlYWRhYmxlOm8sdGV4dHVyZVR5cGVSZWFkYWJsZTphLHByZWNpc2lvbjpsLGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6aCxyZXZlcnNlRGVwdGhCdWZmZXI6ZixtYXhUZXh0dXJlczpkLG1heFZlcnRleFRleHR1cmVzOnAsbWF4VGV4dHVyZVNpemU6eCxtYXhDdWJlbWFwU2l6ZTpnLG1heEF0dHJpYnV0ZXM6bSxtYXhWZXJ0ZXhVbmlmb3Jtczp2LG1heFZhcnlpbmdzOnksbWF4RnJhZ21lbnRVbmlmb3JtczpfLHZlcnRleFRleHR1cmVzOlMsbWF4U2FtcGxlczp3fX1mdW5jdGlvbiBtQShyKXtjb25zdCB0PXRoaXM7bGV0IGU9bnVsbCxuPTAsaT0hMSxzPSExO2NvbnN0IG89bmV3IGFpLGE9bmV3IFd0LGM9e3ZhbHVlOm51bGwsbmVlZHNVcGRhdGU6ITF9O3RoaXMudW5pZm9ybT1jLHRoaXMubnVtUGxhbmVzPTAsdGhpcy5udW1JbnRlcnNlY3Rpb249MCx0aGlzLmluaXQ9ZnVuY3Rpb24oaCxmKXtjb25zdCBkPWgubGVuZ3RoIT09MHx8Znx8biE9PTB8fGk7cmV0dXJuIGk9ZixuPWgubGVuZ3RoLGR9LHRoaXMuYmVnaW5TaGFkb3dzPWZ1bmN0aW9uKCl7cz0hMCx1KG51bGwpfSx0aGlzLmVuZFNoYWRvd3M9ZnVuY3Rpb24oKXtzPSExfSx0aGlzLnNldEdsb2JhbFN0YXRlPWZ1bmN0aW9uKGgsZil7ZT11KGgsZiwwKX0sdGhpcy5zZXRTdGF0ZT1mdW5jdGlvbihoLGYsZCl7Y29uc3QgcD1oLmNsaXBwaW5nUGxhbmVzLHg9aC5jbGlwSW50ZXJzZWN0aW9uLGc9aC5jbGlwU2hhZG93cyxtPXIuZ2V0KGgpO2lmKCFpfHxwPT09bnVsbHx8cC5sZW5ndGg9PT0wfHxzJiYhZylzP3UobnVsbCk6bCgpO2Vsc2V7Y29uc3Qgdj1zPzA6bix5PXYqNDtsZXQgXz1tLmNsaXBwaW5nU3RhdGV8fG51bGw7Yy52YWx1ZT1fLF89dShwLGYseSxkKTtmb3IobGV0IFM9MDtTIT09eTsrK1MpX1tTXT1lW1NdO20uY2xpcHBpbmdTdGF0ZT1fLHRoaXMubnVtSW50ZXJzZWN0aW9uPXg/dGhpcy5udW1QbGFuZXM6MCx0aGlzLm51bVBsYW5lcys9dn19O2Z1bmN0aW9uIGwoKXtjLnZhbHVlIT09ZSYmKGMudmFsdWU9ZSxjLm5lZWRzVXBkYXRlPW4+MCksdC5udW1QbGFuZXM9bix0Lm51bUludGVyc2VjdGlvbj0wfWZ1bmN0aW9uIHUoaCxmLGQscCl7Y29uc3QgeD1oIT09bnVsbD9oLmxlbmd0aDowO2xldCBnPW51bGw7aWYoeCE9PTApe2lmKGc9Yy52YWx1ZSxwIT09ITB8fGc9PT1udWxsKXtjb25zdCBtPWQreCo0LHY9Zi5tYXRyaXhXb3JsZEludmVyc2U7YS5nZXROb3JtYWxNYXRyaXgodiksKGc9PT1udWxsfHxnLmxlbmd0aDxtKSYmKGc9bmV3IEZsb2F0MzJBcnJheShtKSk7Zm9yKGxldCB5PTAsXz1kO3khPT14OysreSxfKz00KW8uY29weShoW3ldKS5hcHBseU1hdHJpeDQodixhKSxvLm5vcm1hbC50b0FycmF5KGcsXyksZ1tfKzNdPW8uY29uc3RhbnR9Yy52YWx1ZT1nLGMubmVlZHNVcGRhdGU9ITB9cmV0dXJuIHQubnVtUGxhbmVzPXgsdC5udW1JbnRlcnNlY3Rpb249MCxnfX1mdW5jdGlvbiBnQShyKXtsZXQgdD1uZXcgV2Vha01hcDtmdW5jdGlvbiBlKG8sYSl7cmV0dXJuIGE9PT1Jbz9vLm1hcHBpbmc9UGk6YT09PVBvJiYoby5tYXBwaW5nPXNyKSxvfWZ1bmN0aW9uIG4obyl7aWYobyYmby5pc1RleHR1cmUpe2NvbnN0IGE9by5tYXBwaW5nO2lmKGE9PT1Jb3x8YT09PVBvKWlmKHQuaGFzKG8pKXtjb25zdCBjPXQuZ2V0KG8pLnRleHR1cmU7cmV0dXJuIGUoYyxvLm1hcHBpbmcpfWVsc2V7Y29uc3QgYz1vLmltYWdlO2lmKGMmJmMuaGVpZ2h0PjApe2NvbnN0IGw9bmV3IHhnKGMuaGVpZ2h0KTtyZXR1cm4gbC5mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZShyLG8pLHQuc2V0KG8sbCksby5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixpKSxlKGwudGV4dHVyZSxvLm1hcHBpbmcpfWVsc2UgcmV0dXJuIG51bGx9fXJldHVybiBvfWZ1bmN0aW9uIGkobyl7Y29uc3QgYT1vLnRhcmdldDthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGkpO2NvbnN0IGM9dC5nZXQoYSk7YyE9PXZvaWQgMCYmKHQuZGVsZXRlKGEpLGMuZGlzcG9zZSgpKX1mdW5jdGlvbiBzKCl7dD1uZXcgV2Vha01hcH1yZXR1cm57Z2V0Om4sZGlzcG9zZTpzfX1jb25zdCBlbz00LGx4PVsuMTI1LC4yMTUsLjM1LC40NDYsLjUyNiwuNTgyXSxlcz0yMCxnZD1uZXcgcnUsdXg9bmV3IHl0O2xldCB4ZD1udWxsLF9kPTAseWQ9MCx2ZD0hMTtjb25zdCBucz0oMStNYXRoLnNxcnQoNSkpLzIsbm89MS9ucyxoeD1bbmV3IEkoLW5zLG5vLDApLG5ldyBJKG5zLG5vLDApLG5ldyBJKC1ubywwLG5zKSxuZXcgSShubywwLG5zKSxuZXcgSSgwLG5zLC1ubyksbmV3IEkoMCxucyxubyksbmV3IEkoLTEsMSwtMSksbmV3IEkoMSwxLC0xKSxuZXcgSSgtMSwxLDEpLG5ldyBJKDEsMSwxKV0seEE9bmV3IEk7Y2xhc3MgTWR7Y29uc3RydWN0b3IodCl7dGhpcy5fcmVuZGVyZXI9dCx0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldD1udWxsLHRoaXMuX2xvZE1heD0wLHRoaXMuX2N1YmVTaXplPTAsdGhpcy5fbG9kUGxhbmVzPVtdLHRoaXMuX3NpemVMb2RzPVtdLHRoaXMuX3NpZ21hcz1bXSx0aGlzLl9ibHVyTWF0ZXJpYWw9bnVsbCx0aGlzLl9jdWJlbWFwTWF0ZXJpYWw9bnVsbCx0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPW51bGwsdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2JsdXJNYXRlcmlhbCl9ZnJvbVNjZW5lKHQsZT0wLG49LjEsaT0xMDAscz17fSl7Y29uc3R7c2l6ZTpvPTI1Nixwb3NpdGlvbjphPXhBfT1zO3hkPXRoaXMuX3JlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpLF9kPXRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZUN1YmVGYWNlKCkseWQ9dGhpcy5fcmVuZGVyZXIuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKSx2ZD10aGlzLl9yZW5kZXJlci54ci5lbmFibGVkLHRoaXMuX3JlbmRlcmVyLnhyLmVuYWJsZWQ9ITEsdGhpcy5fc2V0U2l6ZShvKTtjb25zdCBjPXRoaXMuX2FsbG9jYXRlVGFyZ2V0cygpO3JldHVybiBjLmRlcHRoQnVmZmVyPSEwLHRoaXMuX3NjZW5lVG9DdWJlVVYodCxuLGksYyxhKSxlPjAmJnRoaXMuX2JsdXIoYywwLDAsZSksdGhpcy5fYXBwbHlQTVJFTShjKSx0aGlzLl9jbGVhbnVwKGMpLGN9ZnJvbUVxdWlyZWN0YW5ndWxhcih0LGU9bnVsbCl7cmV0dXJuIHRoaXMuX2Zyb21UZXh0dXJlKHQsZSl9ZnJvbUN1YmVtYXAodCxlPW51bGwpe3JldHVybiB0aGlzLl9mcm9tVGV4dHVyZSh0LGUpfWNvbXBpbGVDdWJlbWFwU2hhZGVyKCl7dGhpcy5fY3ViZW1hcE1hdGVyaWFsPT09bnVsbCYmKHRoaXMuX2N1YmVtYXBNYXRlcmlhbD1weCgpLHRoaXMuX2NvbXBpbGVNYXRlcmlhbCh0aGlzLl9jdWJlbWFwTWF0ZXJpYWwpKX1jb21waWxlRXF1aXJlY3Rhbmd1bGFyU2hhZGVyKCl7dGhpcy5fZXF1aXJlY3RNYXRlcmlhbD09PW51bGwmJih0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPWR4KCksdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwpKX1kaXNwb3NlKCl7dGhpcy5fZGlzcG9zZSgpLHRoaXMuX2N1YmVtYXBNYXRlcmlhbCE9PW51bGwmJnRoaXMuX2N1YmVtYXBNYXRlcmlhbC5kaXNwb3NlKCksdGhpcy5fZXF1aXJlY3RNYXRlcmlhbCE9PW51bGwmJnRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwuZGlzcG9zZSgpfV9zZXRTaXplKHQpe3RoaXMuX2xvZE1heD1NYXRoLmZsb29yKE1hdGgubG9nMih0KSksdGhpcy5fY3ViZVNpemU9TWF0aC5wb3coMix0aGlzLl9sb2RNYXgpfV9kaXNwb3NlKCl7dGhpcy5fYmx1ck1hdGVyaWFsIT09bnVsbCYmdGhpcy5fYmx1ck1hdGVyaWFsLmRpc3Bvc2UoKSx0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldCE9PW51bGwmJnRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LmRpc3Bvc2UoKTtmb3IobGV0IHQ9MDt0PHRoaXMuX2xvZFBsYW5lcy5sZW5ndGg7dCsrKXRoaXMuX2xvZFBsYW5lc1t0XS5kaXNwb3NlKCl9X2NsZWFudXAodCl7dGhpcy5fcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHhkLF9kLHlkKSx0aGlzLl9yZW5kZXJlci54ci5lbmFibGVkPXZkLHQuc2Npc3NvclRlc3Q9ITEscHUodCwwLDAsdC53aWR0aCx0LmhlaWdodCl9X2Zyb21UZXh0dXJlKHQsZSl7dC5tYXBwaW5nPT09UGl8fHQubWFwcGluZz09PXNyP3RoaXMuX3NldFNpemUodC5pbWFnZS5sZW5ndGg9PT0wPzE2OnQuaW1hZ2VbMF0ud2lkdGh8fHQuaW1hZ2VbMF0uaW1hZ2Uud2lkdGgpOnRoaXMuX3NldFNpemUodC5pbWFnZS53aWR0aC80KSx4ZD10aGlzLl9yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKSxfZD10aGlzLl9yZW5kZXJlci5nZXRBY3RpdmVDdWJlRmFjZSgpLHlkPXRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZU1pcG1hcExldmVsKCksdmQ9dGhpcy5fcmVuZGVyZXIueHIuZW5hYmxlZCx0aGlzLl9yZW5kZXJlci54ci5lbmFibGVkPSExO2NvbnN0IG49ZXx8dGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7cmV0dXJuIHRoaXMuX3RleHR1cmVUb0N1YmVVVih0LG4pLHRoaXMuX2FwcGx5UE1SRU0obiksdGhpcy5fY2xlYW51cChuKSxufV9hbGxvY2F0ZVRhcmdldHMoKXtjb25zdCB0PTMqTWF0aC5tYXgodGhpcy5fY3ViZVNpemUsMTEyKSxlPTQqdGhpcy5fY3ViZVNpemUsbj17bWFnRmlsdGVyOnplLG1pbkZpbHRlcjp6ZSxnZW5lcmF0ZU1pcG1hcHM6ITEsdHlwZTpUcyxmb3JtYXQ6bm4sY29sb3JTcGFjZTpEcixkZXB0aEJ1ZmZlcjohMX0saT1meCh0LGUsbik7aWYodGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQ9PT1udWxsfHx0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldC53aWR0aCE9PXR8fHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LmhlaWdodCE9PWUpe3RoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0IT09bnVsbCYmdGhpcy5fZGlzcG9zZSgpLHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0PWZ4KHQsZSxuKTtjb25zdHtfbG9kTWF4OnN9PXRoaXM7KHtzaXplTG9kczp0aGlzLl9zaXplTG9kcyxsb2RQbGFuZXM6dGhpcy5fbG9kUGxhbmVzLHNpZ21hczp0aGlzLl9zaWdtYXN9PV9BKHMpKSx0aGlzLl9ibHVyTWF0ZXJpYWw9eUEocyx0LGUpfXJldHVybiBpfV9jb21waWxlTWF0ZXJpYWwodCl7Y29uc3QgZT1uZXcgTGUodGhpcy5fbG9kUGxhbmVzWzBdLHQpO3RoaXMuX3JlbmRlcmVyLmNvbXBpbGUoZSxnZCl9X3NjZW5lVG9DdWJlVVYodCxlLG4saSxzKXtjb25zdCBjPW5ldyAkZSg5MCwxLGUsbiksbD1bMSwtMSwxLDEsMSwxXSx1PVsxLDEsMSwtMSwtMSwtMV0saD10aGlzLl9yZW5kZXJlcixmPWguYXV0b0NsZWFyLGQ9aC50b25lTWFwcGluZztoLmdldENsZWFyQ29sb3IodXgpLGgudG9uZU1hcHBpbmc9SWksaC5hdXRvQ2xlYXI9ITE7Y29uc3QgcD1uZXcgcHIoe25hbWU6IlBNUkVNLkJhY2tncm91bmQiLHNpZGU6WWUsZGVwdGhXcml0ZTohMSxkZXB0aFRlc3Q6ITF9KSx4PW5ldyBMZShuZXcgenIscCk7bGV0IGc9ITE7Y29uc3QgbT10LmJhY2tncm91bmQ7bT9tLmlzQ29sb3ImJihwLmNvbG9yLmNvcHkobSksdC5iYWNrZ3JvdW5kPW51bGwsZz0hMCk6KHAuY29sb3IuY29weSh1eCksZz0hMCk7Zm9yKGxldCB2PTA7djw2O3YrKyl7Y29uc3QgeT12JTM7eT09PTA/KGMudXAuc2V0KDAsbFt2XSwwKSxjLnBvc2l0aW9uLnNldChzLngscy55LHMueiksYy5sb29rQXQocy54K3Vbdl0scy55LHMueikpOnk9PT0xPyhjLnVwLnNldCgwLDAsbFt2XSksYy5wb3NpdGlvbi5zZXQocy54LHMueSxzLnopLGMubG9va0F0KHMueCxzLnkrdVt2XSxzLnopKTooYy51cC5zZXQoMCxsW3ZdLDApLGMucG9zaXRpb24uc2V0KHMueCxzLnkscy56KSxjLmxvb2tBdChzLngscy55LHMueit1W3ZdKSk7Y29uc3QgXz10aGlzLl9jdWJlU2l6ZTtwdShpLHkqXyx2PjI/XzowLF8sXyksaC5zZXRSZW5kZXJUYXJnZXQoaSksZyYmaC5yZW5kZXIoeCxjKSxoLnJlbmRlcih0LGMpfXguZ2VvbWV0cnkuZGlzcG9zZSgpLHgubWF0ZXJpYWwuZGlzcG9zZSgpLGgudG9uZU1hcHBpbmc9ZCxoLmF1dG9DbGVhcj1mLHQuYmFja2dyb3VuZD1tfV90ZXh0dXJlVG9DdWJlVVYodCxlKXtjb25zdCBuPXRoaXMuX3JlbmRlcmVyLGk9dC5tYXBwaW5nPT09UGl8fHQubWFwcGluZz09PXNyO2k/KHRoaXMuX2N1YmVtYXBNYXRlcmlhbD09PW51bGwmJih0aGlzLl9jdWJlbWFwTWF0ZXJpYWw9cHgoKSksdGhpcy5fY3ViZW1hcE1hdGVyaWFsLnVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWU9dC5pc1JlbmRlclRhcmdldFRleHR1cmU9PT0hMT8tMToxKTp0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPT09bnVsbCYmKHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWw9ZHgoKSk7Y29uc3Qgcz1pP3RoaXMuX2N1YmVtYXBNYXRlcmlhbDp0aGlzLl9lcXVpcmVjdE1hdGVyaWFsLG89bmV3IExlKHRoaXMuX2xvZFBsYW5lc1swXSxzKSxhPXMudW5pZm9ybXM7YS5lbnZNYXAudmFsdWU9dDtjb25zdCBjPXRoaXMuX2N1YmVTaXplO3B1KGUsMCwwLDMqYywyKmMpLG4uc2V0UmVuZGVyVGFyZ2V0KGUpLG4ucmVuZGVyKG8sZ2QpfV9hcHBseVBNUkVNKHQpe2NvbnN0IGU9dGhpcy5fcmVuZGVyZXIsbj1lLmF1dG9DbGVhcjtlLmF1dG9DbGVhcj0hMTtjb25zdCBpPXRoaXMuX2xvZFBsYW5lcy5sZW5ndGg7Zm9yKGxldCBzPTE7czxpO3MrKyl7Y29uc3Qgbz1NYXRoLnNxcnQodGhpcy5fc2lnbWFzW3NdKnRoaXMuX3NpZ21hc1tzXS10aGlzLl9zaWdtYXNbcy0xXSp0aGlzLl9zaWdtYXNbcy0xXSksYT1oeFsoaS1zLTEpJWh4Lmxlbmd0aF07dGhpcy5fYmx1cih0LHMtMSxzLG8sYSl9ZS5hdXRvQ2xlYXI9bn1fYmx1cih0LGUsbixpLHMpe2NvbnN0IG89dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQ7dGhpcy5faGFsZkJsdXIodCxvLGUsbixpLCJsYXRpdHVkaW5hbCIscyksdGhpcy5faGFsZkJsdXIobyx0LG4sbixpLCJsb25naXR1ZGluYWwiLHMpfV9oYWxmQmx1cih0LGUsbixpLHMsbyxhKXtjb25zdCBjPXRoaXMuX3JlbmRlcmVyLGw9dGhpcy5fYmx1ck1hdGVyaWFsO28hPT0ibGF0aXR1ZGluYWwiJiZvIT09ImxvbmdpdHVkaW5hbCImJmNvbnNvbGUuZXJyb3IoImJsdXIgZGlyZWN0aW9uIG11c3QgYmUgZWl0aGVyIGxhdGl0dWRpbmFsIG9yIGxvbmdpdHVkaW5hbCEiKTtjb25zdCB1PTMsaD1uZXcgTGUodGhpcy5fbG9kUGxhbmVzW2ldLGwpLGY9bC51bmlmb3JtcyxkPXRoaXMuX3NpemVMb2RzW25dLTEscD1pc0Zpbml0ZShzKT9NYXRoLlBJLygyKmQpOjIqTWF0aC5QSS8oMiplcy0xKSx4PXMvcCxnPWlzRmluaXRlKHMpPzErTWF0aC5mbG9vcih1KngpOmVzO2c+ZXMmJmNvbnNvbGUud2Fybihgc2lnbWFSYWRpYW5zLCAke3N9LCBpcyB0b28gbGFyZ2UgYW5kIHdpbGwgY2xpcCwgYXMgaXQgcmVxdWVzdGVkICR7Z30gc2FtcGxlcyB3aGVuIHRoZSBtYXhpbXVtIGlzIHNldCB0byAke2VzfWApO2NvbnN0IG09W107bGV0IHY9MDtmb3IobGV0IEE9MDtBPGVzOysrQSl7Y29uc3QgVD1BL3gsYj1NYXRoLmV4cCgtVCpULzIpO20ucHVzaChiKSxBPT09MD92Kz1iOkE8ZyYmKHYrPTIqYil9Zm9yKGxldCBBPTA7QTxtLmxlbmd0aDtBKyspbVtBXT1tW0FdL3Y7Zi5lbnZNYXAudmFsdWU9dC50ZXh0dXJlLGYuc2FtcGxlcy52YWx1ZT1nLGYud2VpZ2h0cy52YWx1ZT1tLGYubGF0aXR1ZGluYWwudmFsdWU9bz09PSJsYXRpdHVkaW5hbCIsYSYmKGYucG9sZUF4aXMudmFsdWU9YSk7Y29uc3R7X2xvZE1heDp5fT10aGlzO2YuZFRoZXRhLnZhbHVlPXAsZi5taXBJbnQudmFsdWU9eS1uO2NvbnN0IF89dGhpcy5fc2l6ZUxvZHNbaV0sUz0zKl8qKGk+eS1lbz9pLXkrZW86MCksdz00Kih0aGlzLl9jdWJlU2l6ZS1fKTtwdShlLFMsdywzKl8sMipfKSxjLnNldFJlbmRlclRhcmdldChlKSxjLnJlbmRlcihoLGdkKX19ZnVuY3Rpb24gX0Eocil7Y29uc3QgdD1bXSxlPVtdLG49W107bGV0IGk9cjtjb25zdCBzPXItZW8rMStseC5sZW5ndGg7Zm9yKGxldCBvPTA7bzxzO28rKyl7Y29uc3QgYT1NYXRoLnBvdygyLGkpO2UucHVzaChhKTtsZXQgYz0xL2E7bz5yLWVvP2M9bHhbby1yK2VvLTFdOm89PT0wJiYoYz0wKSxuLnB1c2goYyk7Y29uc3QgbD0xLyhhLTIpLHU9LWwsaD0xK2wsZj1bdSx1LGgsdSxoLGgsdSx1LGgsaCx1LGhdLGQ9NixwPTYseD0zLGc9MixtPTEsdj1uZXcgRmxvYXQzMkFycmF5KHgqcCpkKSx5PW5ldyBGbG9hdDMyQXJyYXkoZypwKmQpLF89bmV3IEZsb2F0MzJBcnJheShtKnAqZCk7Zm9yKGxldCB3PTA7dzxkO3crKyl7Y29uc3QgQT13JTMqMi8zLTEsVD13PjI/MDotMSxiPVtBLFQsMCxBKzIvMyxULDAsQSsyLzMsVCsxLDAsQSxULDAsQSsyLzMsVCsxLDAsQSxUKzEsMF07di5zZXQoYix4KnAqdykseS5zZXQoZixnKnAqdyk7Y29uc3QgTT1bdyx3LHcsdyx3LHddO18uc2V0KE0sbSpwKncpfWNvbnN0IFM9bmV3IE50O1Muc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEp0KHYseCkpLFMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEp0KHksZykpLFMuc2V0QXR0cmlidXRlKCJmYWNlSW5kZXgiLG5ldyBKdChfLG0pKSx0LnB1c2goUyksaT5lbyYmaS0tfXJldHVybntsb2RQbGFuZXM6dCxzaXplTG9kczplLHNpZ21hczpufX1mdW5jdGlvbiBmeChyLHQsZSl7Y29uc3Qgbj1uZXcgdmkocix0LGUpO3JldHVybiBuLnRleHR1cmUubWFwcGluZz1icyxuLnRleHR1cmUubmFtZT0iUE1SRU0uY3ViZVV2IixuLnNjaXNzb3JUZXN0PSEwLG59ZnVuY3Rpb24gcHUocix0LGUsbixpKXtyLnZpZXdwb3J0LnNldCh0LGUsbixpKSxyLnNjaXNzb3Iuc2V0KHQsZSxuLGkpfWZ1bmN0aW9uIHlBKHIsdCxlKXtjb25zdCBuPW5ldyBGbG9hdDMyQXJyYXkoZXMpLGk9bmV3IEkoMCwxLDApO3JldHVybiBuZXcgb2koe25hbWU6IlNwaGVyaWNhbEdhdXNzaWFuQmx1ciIsZGVmaW5lczp7bjplcyxDVUJFVVZfVEVYRUxfV0lEVEg6MS90LENVQkVVVl9URVhFTF9IRUlHSFQ6MS9lLENVQkVVVl9NQVhfTUlQOmAke3J9LjBgfSx1bmlmb3Jtczp7ZW52TWFwOnt2YWx1ZTpudWxsfSxzYW1wbGVzOnt2YWx1ZToxfSx3ZWlnaHRzOnt2YWx1ZTpufSxsYXRpdHVkaW5hbDp7dmFsdWU6ITF9LGRUaGV0YTp7dmFsdWU6MH0sbWlwSW50Ont2YWx1ZTowfSxwb2xlQXhpczp7dmFsdWU6aX19LHZlcnRleFNoYWRlcjpTZCgpLGZyYWdtZW50U2hhZGVyOmAKCgkJCXByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoJCQlwcmVjaXNpb24gbWVkaXVtcCBpbnQ7CgoJCQl2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjsKCgkJCXVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDsKCQkJdW5pZm9ybSBpbnQgc2FtcGxlczsKCQkJdW5pZm9ybSBmbG9hdCB3ZWlnaHRzWyBuIF07CgkJCXVuaWZvcm0gYm9vbCBsYXRpdHVkaW5hbDsKCQkJdW5pZm9ybSBmbG9hdCBkVGhldGE7CgkJCXVuaWZvcm0gZmxvYXQgbWlwSW50OwoJCQl1bmlmb3JtIHZlYzMgcG9sZUF4aXM7CgoJCQkjZGVmaW5lIEVOVk1BUF9UWVBFX0NVQkVfVVYKCQkJI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD4KCgkJCXZlYzMgZ2V0U2FtcGxlKCBmbG9hdCB0aGV0YSwgdmVjMyBheGlzICkgewoKCQkJCWZsb2F0IGNvc1RoZXRhID0gY29zKCB0aGV0YSApOwoJCQkJLy8gUm9kcmlndWVzJyBheGlzLWFuZ2xlIHJvdGF0aW9uCgkJCQl2ZWMzIHNhbXBsZURpcmVjdGlvbiA9IHZPdXRwdXREaXJlY3Rpb24gKiBjb3NUaGV0YQoJCQkJCSsgY3Jvc3MoIGF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKSAqIHNpbiggdGhldGEgKQoJCQkJCSsgYXhpcyAqIGRvdCggYXhpcywgdk91dHB1dERpcmVjdGlvbiApICogKCAxLjAgLSBjb3NUaGV0YSApOwoKCQkJCXJldHVybiBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXJlY3Rpb24sIG1pcEludCApOwoKCQkJfQoKCQkJdm9pZCBtYWluKCkgewoKCQkJCXZlYzMgYXhpcyA9IGxhdGl0dWRpbmFsID8gcG9sZUF4aXMgOiBjcm9zcyggcG9sZUF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKTsKCgkJCQlpZiAoIGFsbCggZXF1YWwoIGF4aXMsIHZlYzMoIDAuMCApICkgKSApIHsKCgkJCQkJYXhpcyA9IHZlYzMoIHZPdXRwdXREaXJlY3Rpb24ueiwgMC4wLCAtIHZPdXRwdXREaXJlY3Rpb24ueCApOwoKCQkJCX0KCgkJCQlheGlzID0gbm9ybWFsaXplKCBheGlzICk7CgoJCQkJZ2xfRnJhZ0NvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7CgkJCQlnbF9GcmFnQ29sb3IucmdiICs9IHdlaWdodHNbIDAgXSAqIGdldFNhbXBsZSggMC4wLCBheGlzICk7CgoJCQkJZm9yICggaW50IGkgPSAxOyBpIDwgbjsgaSsrICkgewoKCQkJCQlpZiAoIGkgPj0gc2FtcGxlcyApIHsKCgkJCQkJCWJyZWFrOwoKCQkJCQl9CgoJCQkJCWZsb2F0IHRoZXRhID0gZFRoZXRhICogZmxvYXQoIGkgKTsKCQkJCQlnbF9GcmFnQ29sb3IucmdiICs9IHdlaWdodHNbIGkgXSAqIGdldFNhbXBsZSggLTEuMCAqIHRoZXRhLCBheGlzICk7CgkJCQkJZ2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyBpIF0gKiBnZXRTYW1wbGUoIHRoZXRhLCBheGlzICk7CgoJCQkJfQoKCQkJfQoJCWAsYmxlbmRpbmc6UmksZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITF9KX1mdW5jdGlvbiBkeCgpe3JldHVybiBuZXcgb2koe25hbWU6IkVxdWlyZWN0YW5ndWxhclRvQ3ViZVVWIix1bmlmb3Jtczp7ZW52TWFwOnt2YWx1ZTpudWxsfX0sdmVydGV4U2hhZGVyOlNkKCksZnJhZ21lbnRTaGFkZXI6YAoKCQkJcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7CgkJCXByZWNpc2lvbiBtZWRpdW1wIGludDsKCgkJCXZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uOwoKCQkJdW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwOwoKCQkJI2luY2x1ZGUgPGNvbW1vbj4KCgkJCXZvaWQgbWFpbigpIHsKCgkJCQl2ZWMzIG91dHB1dERpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdk91dHB1dERpcmVjdGlvbiApOwoJCQkJdmVjMiB1diA9IGVxdWlyZWN0VXYoIG91dHB1dERpcmVjdGlvbiApOwoKCQkJCWdsX0ZyYWdDb2xvciA9IHZlYzQoIHRleHR1cmUyRCAoIGVudk1hcCwgdXYgKS5yZ2IsIDEuMCApOwoKCQkJfQoJCWAsYmxlbmRpbmc6UmksZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITF9KX1mdW5jdGlvbiBweCgpe3JldHVybiBuZXcgb2koe25hbWU6IkN1YmVtYXBUb0N1YmVVViIsdW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH0sZmxpcEVudk1hcDp7dmFsdWU6LTF9fSx2ZXJ0ZXhTaGFkZXI6U2QoKSxmcmFnbWVudFNoYWRlcjpgCgoJCQlwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCQkJcHJlY2lzaW9uIG1lZGl1bXAgaW50OwoKCQkJdW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwOwoKCQkJdmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247CgoJCQl1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDsKCgkJCXZvaWQgbWFpbigpIHsKCgkJCQlnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCB2ZWMzKCBmbGlwRW52TWFwICogdk91dHB1dERpcmVjdGlvbi54LCB2T3V0cHV0RGlyZWN0aW9uLnl6ICkgKTsKCgkJCX0KCQlgLGJsZW5kaW5nOlJpLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExfSl9ZnVuY3Rpb24gU2QoKXtyZXR1cm5gCgoJCXByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoJCXByZWNpc2lvbiBtZWRpdW1wIGludDsKCgkJYXR0cmlidXRlIGZsb2F0IGZhY2VJbmRleDsKCgkJdmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247CgoJCS8vIFJIIGNvb3JkaW5hdGUgc3lzdGVtOyBQTVJFTSBmYWNlLWluZGV4aW5nIGNvbnZlbnRpb24KCQl2ZWMzIGdldERpcmVjdGlvbiggdmVjMiB1diwgZmxvYXQgZmFjZSApIHsKCgkJCXV2ID0gMi4wICogdXYgLSAxLjA7CgoJCQl2ZWMzIGRpcmVjdGlvbiA9IHZlYzMoIHV2LCAxLjAgKTsKCgkJCWlmICggZmFjZSA9PSAwLjAgKSB7CgoJCQkJZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDsgLy8gKCAxLCB2LCB1ICkgcG9zIHgKCgkJCX0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkgewoKCQkJCWRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7CgkJCQlkaXJlY3Rpb24ueHogKj0gLTEuMDsgLy8gKCAtdSwgMSwgLXYgKSBwb3MgeQoKCQkJfSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7CgoJCQkJZGlyZWN0aW9uLnggKj0gLTEuMDsgLy8gKCAtdSwgdiwgMSApIHBvcyB6CgoJCQl9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHsKCgkJCQlkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4OwoJCQkJZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLTEsIHYsIC11ICkgbmVnIHgKCgkJCX0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkgewoKCQkJCWRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7CgkJCQlkaXJlY3Rpb24ueHkgKj0gLTEuMDsgLy8gKCAtdSwgLTEsIHYgKSBuZWcgeQoKCQkJfSBlbHNlIGlmICggZmFjZSA9PSA1LjAgKSB7CgoJCQkJZGlyZWN0aW9uLnogKj0gLTEuMDsgLy8gKCB1LCB2LCAtMSApIG5lZyB6CgoJCQl9CgoJCQlyZXR1cm4gZGlyZWN0aW9uOwoKCQl9CgoJCXZvaWQgbWFpbigpIHsKCgkJCXZPdXRwdXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oIHV2LCBmYWNlSW5kZXggKTsKCQkJZ2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7CgoJCX0KCWB9ZnVuY3Rpb24gdkEocil7bGV0IHQ9bmV3IFdlYWtNYXAsZT1udWxsO2Z1bmN0aW9uIG4oYSl7aWYoYSYmYS5pc1RleHR1cmUpe2NvbnN0IGM9YS5tYXBwaW5nLGw9Yz09PUlvfHxjPT09UG8sdT1jPT09UGl8fGM9PT1zcjtpZihsfHx1KXtsZXQgaD10LmdldChhKTtjb25zdCBmPWghPT12b2lkIDA/aC50ZXh0dXJlLnBtcmVtVmVyc2lvbjowO2lmKGEuaXNSZW5kZXJUYXJnZXRUZXh0dXJlJiZhLnBtcmVtVmVyc2lvbiE9PWYpcmV0dXJuIGU9PT1udWxsJiYoZT1uZXcgTWQocikpLGg9bD9lLmZyb21FcXVpcmVjdGFuZ3VsYXIoYSxoKTplLmZyb21DdWJlbWFwKGEsaCksaC50ZXh0dXJlLnBtcmVtVmVyc2lvbj1hLnBtcmVtVmVyc2lvbix0LnNldChhLGgpLGgudGV4dHVyZTtpZihoIT09dm9pZCAwKXJldHVybiBoLnRleHR1cmU7e2NvbnN0IGQ9YS5pbWFnZTtyZXR1cm4gbCYmZCYmZC5oZWlnaHQ+MHx8dSYmZCYmaShkKT8oZT09PW51bGwmJihlPW5ldyBNZChyKSksaD1sP2UuZnJvbUVxdWlyZWN0YW5ndWxhcihhKTplLmZyb21DdWJlbWFwKGEpLGgudGV4dHVyZS5wbXJlbVZlcnNpb249YS5wbXJlbVZlcnNpb24sdC5zZXQoYSxoKSxhLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHMpLGgudGV4dHVyZSk6bnVsbH19fXJldHVybiBhfWZ1bmN0aW9uIGkoYSl7bGV0IGM9MDtjb25zdCBsPTY7Zm9yKGxldCB1PTA7dTxsO3UrKylhW3VdIT09dm9pZCAwJiZjKys7cmV0dXJuIGM9PT1sfWZ1bmN0aW9uIHMoYSl7Y29uc3QgYz1hLnRhcmdldDtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHMpO2NvbnN0IGw9dC5nZXQoYyk7bCE9PXZvaWQgMCYmKHQuZGVsZXRlKGMpLGwuZGlzcG9zZSgpKX1mdW5jdGlvbiBvKCl7dD1uZXcgV2Vha01hcCxlIT09bnVsbCYmKGUuZGlzcG9zZSgpLGU9bnVsbCl9cmV0dXJue2dldDpuLGRpc3Bvc2U6b319ZnVuY3Rpb24gTUEocil7Y29uc3QgdD17fTtmdW5jdGlvbiBlKG4pe2lmKHRbbl0hPT12b2lkIDApcmV0dXJuIHRbbl07bGV0IGk7c3dpdGNoKG4pe2Nhc2UiV0VCR0xfZGVwdGhfdGV4dHVyZSI6aT1yLmdldEV4dGVuc2lvbigiV0VCR0xfZGVwdGhfdGV4dHVyZSIpfHxyLmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2RlcHRoX3RleHR1cmUiKXx8ci5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlIik7YnJlYWs7Y2FzZSJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiOmk9ci5nZXRFeHRlbnNpb24oIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpfHxyLmdldEV4dGVuc2lvbigiTU9aX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpfHxyLmdldEV4dGVuc2lvbigiV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO2JyZWFrO2Nhc2UiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiOmk9ci5nZXRFeHRlbnNpb24oIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fHIuZ2V0RXh0ZW5zaW9uKCJNT1pfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKXx8ci5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpO2JyZWFrO2Nhc2UiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIjppPXIuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKXx8ci5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKTticmVhaztkZWZhdWx0Omk9ci5nZXRFeHRlbnNpb24obil9cmV0dXJuIHRbbl09aSxpfXJldHVybntoYXM6ZnVuY3Rpb24obil7cmV0dXJuIGUobikhPT1udWxsfSxpbml0OmZ1bmN0aW9uKCl7ZSgiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIpLGUoIldFQkdMX2NsaXBfY3VsbF9kaXN0YW5jZSIpLGUoIk9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciIpLGUoIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIpLGUoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpLGUoIldFQkdMX3JlbmRlcl9zaGFyZWRfZXhwb25lbnQiKX0sZ2V0OmZ1bmN0aW9uKG4pe2NvbnN0IGk9ZShuKTtyZXR1cm4gaT09PW51bGwmJlljKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK24rIiBleHRlbnNpb24gbm90IHN1cHBvcnRlZC4iKSxpfX19ZnVuY3Rpb24gU0Eocix0LGUsbil7Y29uc3QgaT17fSxzPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIG8oaCl7Y29uc3QgZj1oLnRhcmdldDtmLmluZGV4IT09bnVsbCYmdC5yZW1vdmUoZi5pbmRleCk7Zm9yKGNvbnN0IHAgaW4gZi5hdHRyaWJ1dGVzKXQucmVtb3ZlKGYuYXR0cmlidXRlc1twXSk7Zi5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixvKSxkZWxldGUgaVtmLmlkXTtjb25zdCBkPXMuZ2V0KGYpO2QmJih0LnJlbW92ZShkKSxzLmRlbGV0ZShmKSksbi5yZWxlYXNlU3RhdGVzT2ZHZW9tZXRyeShmKSxmLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk9PT0hMCYmZGVsZXRlIGYuX21heEluc3RhbmNlQ291bnQsZS5tZW1vcnkuZ2VvbWV0cmllcy0tfWZ1bmN0aW9uIGEoaCxmKXtyZXR1cm4gaVtmLmlkXT09PSEwfHwoZi5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixvKSxpW2YuaWRdPSEwLGUubWVtb3J5Lmdlb21ldHJpZXMrKyksZn1mdW5jdGlvbiBjKGgpe2NvbnN0IGY9aC5hdHRyaWJ1dGVzO2Zvcihjb25zdCBkIGluIGYpdC51cGRhdGUoZltkXSxyLkFSUkFZX0JVRkZFUil9ZnVuY3Rpb24gbChoKXtjb25zdCBmPVtdLGQ9aC5pbmRleCxwPWguYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgeD0wO2lmKGQhPT1udWxsKXtjb25zdCB2PWQuYXJyYXk7eD1kLnZlcnNpb247Zm9yKGxldCB5PTAsXz12Lmxlbmd0aDt5PF87eSs9Myl7Y29uc3QgUz12W3krMF0sdz12W3krMV0sQT12W3krMl07Zi5wdXNoKFMsdyx3LEEsQSxTKX19ZWxzZSBpZihwIT09dm9pZCAwKXtjb25zdCB2PXAuYXJyYXk7eD1wLnZlcnNpb247Zm9yKGxldCB5PTAsXz12Lmxlbmd0aC8zLTE7eTxfO3krPTMpe2NvbnN0IFM9eSswLHc9eSsxLEE9eSsyO2YucHVzaChTLHcsdyxBLEEsUyl9fWVsc2UgcmV0dXJuO2NvbnN0IGc9bmV3KHFtKGYpP2JmOlNmKShmLDEpO2cudmVyc2lvbj14O2NvbnN0IG09cy5nZXQoaCk7bSYmdC5yZW1vdmUobSkscy5zZXQoaCxnKX1mdW5jdGlvbiB1KGgpe2NvbnN0IGY9cy5nZXQoaCk7aWYoZil7Y29uc3QgZD1oLmluZGV4O2QhPT1udWxsJiZmLnZlcnNpb248ZC52ZXJzaW9uJiZsKGgpfWVsc2UgbChoKTtyZXR1cm4gcy5nZXQoaCl9cmV0dXJue2dldDphLHVwZGF0ZTpjLGdldFdpcmVmcmFtZUF0dHJpYnV0ZTp1fX1mdW5jdGlvbiBiQShyLHQsZSl7bGV0IG47ZnVuY3Rpb24gaShmKXtuPWZ9bGV0IHMsbztmdW5jdGlvbiBhKGYpe3M9Zi50eXBlLG89Zi5ieXRlc1BlckVsZW1lbnR9ZnVuY3Rpb24gYyhmLGQpe3IuZHJhd0VsZW1lbnRzKG4sZCxzLGYqbyksZS51cGRhdGUoZCxuLDEpfWZ1bmN0aW9uIGwoZixkLHApe3AhPT0wJiYoci5kcmF3RWxlbWVudHNJbnN0YW5jZWQobixkLHMsZipvLHApLGUudXBkYXRlKGQsbixwKSl9ZnVuY3Rpb24gdShmLGQscCl7aWYocD09PTApcmV0dXJuO3QuZ2V0KCJXRUJHTF9tdWx0aV9kcmF3IikubXVsdGlEcmF3RWxlbWVudHNXRUJHTChuLGQsMCxzLGYsMCxwKTtsZXQgZz0wO2ZvcihsZXQgbT0wO208cDttKyspZys9ZFttXTtlLnVwZGF0ZShnLG4sMSl9ZnVuY3Rpb24gaChmLGQscCx4KXtpZihwPT09MClyZXR1cm47Y29uc3QgZz10LmdldCgiV0VCR0xfbXVsdGlfZHJhdyIpO2lmKGc9PT1udWxsKWZvcihsZXQgbT0wO208Zi5sZW5ndGg7bSsrKWwoZlttXS9vLGRbbV0seFttXSk7ZWxzZXtnLm11bHRpRHJhd0VsZW1lbnRzSW5zdGFuY2VkV0VCR0wobixkLDAscyxmLDAseCwwLHApO2xldCBtPTA7Zm9yKGxldCB2PTA7djxwO3YrKyltKz1kW3ZdKnhbdl07ZS51cGRhdGUobSxuLDEpfX10aGlzLnNldE1vZGU9aSx0aGlzLnNldEluZGV4PWEsdGhpcy5yZW5kZXI9Yyx0aGlzLnJlbmRlckluc3RhbmNlcz1sLHRoaXMucmVuZGVyTXVsdGlEcmF3PXUsdGhpcy5yZW5kZXJNdWx0aURyYXdJbnN0YW5jZXM9aH1mdW5jdGlvbiB3QShyKXtjb25zdCB0PXtnZW9tZXRyaWVzOjAsdGV4dHVyZXM6MH0sZT17ZnJhbWU6MCxjYWxsczowLHRyaWFuZ2xlczowLHBvaW50czowLGxpbmVzOjB9O2Z1bmN0aW9uIG4ocyxvLGEpe3N3aXRjaChlLmNhbGxzKyssbyl7Y2FzZSByLlRSSUFOR0xFUzplLnRyaWFuZ2xlcys9YSoocy8zKTticmVhaztjYXNlIHIuTElORVM6ZS5saW5lcys9YSoocy8yKTticmVhaztjYXNlIHIuTElORV9TVFJJUDplLmxpbmVzKz1hKihzLTEpO2JyZWFrO2Nhc2Ugci5MSU5FX0xPT1A6ZS5saW5lcys9YSpzO2JyZWFrO2Nhc2Ugci5QT0lOVFM6ZS5wb2ludHMrPWEqczticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMSW5mbzogVW5rbm93biBkcmF3IG1vZGU6IixvKTticmVha319ZnVuY3Rpb24gaSgpe2UuY2FsbHM9MCxlLnRyaWFuZ2xlcz0wLGUucG9pbnRzPTAsZS5saW5lcz0wfXJldHVybnttZW1vcnk6dCxyZW5kZXI6ZSxwcm9ncmFtczpudWxsLGF1dG9SZXNldDohMCxyZXNldDppLHVwZGF0ZTpufX1mdW5jdGlvbiBBQShyLHQsZSl7Y29uc3Qgbj1uZXcgV2Vha01hcCxpPW5ldyBRdDtmdW5jdGlvbiBzKG8sYSxjKXtjb25zdCBsPW8ubW9ycGhUYXJnZXRJbmZsdWVuY2VzLHU9YS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb258fGEubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbHx8YS5tb3JwaEF0dHJpYnV0ZXMuY29sb3IsaD11IT09dm9pZCAwP3UubGVuZ3RoOjA7bGV0IGY9bi5nZXQoYSk7aWYoZj09PXZvaWQgMHx8Zi5jb3VudCE9PWgpe2xldCBiPWZ1bmN0aW9uKCl7QS5kaXNwb3NlKCksbi5kZWxldGUoYSksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixiKX07ZiE9PXZvaWQgMCYmZi50ZXh0dXJlLmRpc3Bvc2UoKTtjb25zdCBkPWEubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uIT09dm9pZCAwLHA9YS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsIT09dm9pZCAwLHg9YS5tb3JwaEF0dHJpYnV0ZXMuY29sb3IhPT12b2lkIDAsZz1hLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbnx8W10sbT1hLm1vcnBoQXR0cmlidXRlcy5ub3JtYWx8fFtdLHY9YS5tb3JwaEF0dHJpYnV0ZXMuY29sb3J8fFtdO2xldCB5PTA7ZD09PSEwJiYoeT0xKSxwPT09ITAmJih5PTIpLHg9PT0hMCYmKHk9Myk7bGV0IF89YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50KnksUz0xO18+dC5tYXhUZXh0dXJlU2l6ZSYmKFM9TWF0aC5jZWlsKF8vdC5tYXhUZXh0dXJlU2l6ZSksXz10Lm1heFRleHR1cmVTaXplKTtjb25zdCB3PW5ldyBGbG9hdDMyQXJyYXkoXypTKjQqaCksQT1uZXcgWW8odyxfLFMsaCk7QS50eXBlPXhuLEEubmVlZHNVcGRhdGU9ITA7Y29uc3QgVD15KjQ7Zm9yKGxldCBNPTA7TTxoO00rKyl7Y29uc3QgRT1nW01dLEQ9bVtNXSxMPXZbTV0sRj1fKlMqNCpNO2ZvcihsZXQgTj0wO048RS5jb3VudDtOKyspe2NvbnN0IE89TipUO2Q9PT0hMCYmKGkuZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLE4pLHdbRitPKzBdPWkueCx3W0YrTysxXT1pLnksd1tGK08rMl09aS56LHdbRitPKzNdPTApLHA9PT0hMCYmKGkuZnJvbUJ1ZmZlckF0dHJpYnV0ZShELE4pLHdbRitPKzRdPWkueCx3W0YrTys1XT1pLnksd1tGK08rNl09aS56LHdbRitPKzddPTApLHg9PT0hMCYmKGkuZnJvbUJ1ZmZlckF0dHJpYnV0ZShMLE4pLHdbRitPKzhdPWkueCx3W0YrTys5XT1pLnksd1tGK08rMTBdPWkueix3W0YrTysxMV09TC5pdGVtU2l6ZT09PTQ/aS53OjEpfX1mPXtjb3VudDpoLHRleHR1cmU6QSxzaXplOm5ldyBxKF8sUyl9LG4uc2V0KGEsZiksYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixiKX1pZihvLmlzSW5zdGFuY2VkTWVzaD09PSEwJiZvLm1vcnBoVGV4dHVyZSE9PW51bGwpYy5nZXRVbmlmb3JtcygpLnNldFZhbHVlKHIsIm1vcnBoVGV4dHVyZSIsby5tb3JwaFRleHR1cmUsZSk7ZWxzZXtsZXQgZD0wO2ZvcihsZXQgeD0wO3g8bC5sZW5ndGg7eCsrKWQrPWxbeF07Y29uc3QgcD1hLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPzE6MS1kO2MuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZShyLCJtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2UiLHApLGMuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZShyLCJtb3JwaFRhcmdldEluZmx1ZW5jZXMiLGwpfWMuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZShyLCJtb3JwaFRhcmdldHNUZXh0dXJlIixmLnRleHR1cmUsZSksYy5nZXRVbmlmb3JtcygpLnNldFZhbHVlKHIsIm1vcnBoVGFyZ2V0c1RleHR1cmVTaXplIixmLnNpemUpfXJldHVybnt1cGRhdGU6c319ZnVuY3Rpb24gVEEocix0LGUsbil7bGV0IGk9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gcyhjKXtjb25zdCBsPW4ucmVuZGVyLmZyYW1lLHU9Yy5nZW9tZXRyeSxoPXQuZ2V0KGMsdSk7aWYoaS5nZXQoaCkhPT1sJiYodC51cGRhdGUoaCksaS5zZXQoaCxsKSksYy5pc0luc3RhbmNlZE1lc2gmJihjLmhhc0V2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpPT09ITEmJmMuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSksaS5nZXQoYykhPT1sJiYoZS51cGRhdGUoYy5pbnN0YW5jZU1hdHJpeCxyLkFSUkFZX0JVRkZFUiksYy5pbnN0YW5jZUNvbG9yIT09bnVsbCYmZS51cGRhdGUoYy5pbnN0YW5jZUNvbG9yLHIuQVJSQVlfQlVGRkVSKSxpLnNldChjLGwpKSksYy5pc1NraW5uZWRNZXNoKXtjb25zdCBmPWMuc2tlbGV0b247aS5nZXQoZikhPT1sJiYoZi51cGRhdGUoKSxpLnNldChmLGwpKX1yZXR1cm4gaH1mdW5jdGlvbiBvKCl7aT1uZXcgV2Vha01hcH1mdW5jdGlvbiBhKGMpe2NvbnN0IGw9Yy50YXJnZXQ7bC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKSxlLnJlbW92ZShsLmluc3RhbmNlTWF0cml4KSxsLmluc3RhbmNlQ29sb3IhPT1udWxsJiZlLnJlbW92ZShsLmluc3RhbmNlQ29sb3IpfXJldHVybnt1cGRhdGU6cyxkaXNwb3NlOm99fWNvbnN0IG14PW5ldyBBZSxneD1uZXcgQmwoMSwxKSx4eD1uZXcgWW8sX3g9bmV3IEpjLHl4PW5ldyB0YSx2eD1bXSxNeD1bXSxTeD1uZXcgRmxvYXQzMkFycmF5KDE2KSxieD1uZXcgRmxvYXQzMkFycmF5KDkpLHd4PW5ldyBGbG9hdDMyQXJyYXkoNCk7ZnVuY3Rpb24gaW8ocix0LGUpe2NvbnN0IG49clswXTtpZihuPD0wfHxuPjApcmV0dXJuIHI7Y29uc3QgaT10KmU7bGV0IHM9dnhbaV07aWYocz09PXZvaWQgMCYmKHM9bmV3IEZsb2F0MzJBcnJheShpKSx2eFtpXT1zKSx0IT09MCl7bi50b0FycmF5KHMsMCk7Zm9yKGxldCBvPTEsYT0wO28hPT10OysrbylhKz1lLHJbb10udG9BcnJheShzLGEpfXJldHVybiBzfWZ1bmN0aW9uIGtlKHIsdCl7aWYoci5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IGU9MCxuPXIubGVuZ3RoO2U8bjtlKyspaWYocltlXSE9PXRbZV0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gVmUocix0KXtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspcltlXT10W2VdfWZ1bmN0aW9uIG11KHIsdCl7bGV0IGU9TXhbdF07ZT09PXZvaWQgMCYmKGU9bmV3IEludDMyQXJyYXkodCksTXhbdF09ZSk7Zm9yKGxldCBuPTA7biE9PXQ7KytuKWVbbl09ci5hbGxvY2F0ZVRleHR1cmVVbml0KCk7cmV0dXJuIGV9ZnVuY3Rpb24gRUEocix0KXtjb25zdCBlPXRoaXMuY2FjaGU7ZVswXSE9PXQmJihyLnVuaWZvcm0xZih0aGlzLmFkZHIsdCksZVswXT10KX1mdW5jdGlvbiBDQShyLHQpe2NvbnN0IGU9dGhpcy5jYWNoZTtpZih0LnghPT12b2lkIDApKGVbMF0hPT10Lnh8fGVbMV0hPT10LnkpJiYoci51bmlmb3JtMmYodGhpcy5hZGRyLHQueCx0LnkpLGVbMF09dC54LGVbMV09dC55KTtlbHNle2lmKGtlKGUsdCkpcmV0dXJuO3IudW5pZm9ybTJmdih0aGlzLmFkZHIsdCksVmUoZSx0KX19ZnVuY3Rpb24gUkEocix0KXtjb25zdCBlPXRoaXMuY2FjaGU7aWYodC54IT09dm9pZCAwKShlWzBdIT09dC54fHxlWzFdIT09dC55fHxlWzJdIT09dC56KSYmKHIudW5pZm9ybTNmKHRoaXMuYWRkcix0LngsdC55LHQueiksZVswXT10LngsZVsxXT10LnksZVsyXT10LnopO2Vsc2UgaWYodC5yIT09dm9pZCAwKShlWzBdIT09dC5yfHxlWzFdIT09dC5nfHxlWzJdIT09dC5iKSYmKHIudW5pZm9ybTNmKHRoaXMuYWRkcix0LnIsdC5nLHQuYiksZVswXT10LnIsZVsxXT10LmcsZVsyXT10LmIpO2Vsc2V7aWYoa2UoZSx0KSlyZXR1cm47ci51bmlmb3JtM2Z2KHRoaXMuYWRkcix0KSxWZShlLHQpfX1mdW5jdGlvbiBJQShyLHQpe2NvbnN0IGU9dGhpcy5jYWNoZTtpZih0LnghPT12b2lkIDApKGVbMF0hPT10Lnh8fGVbMV0hPT10Lnl8fGVbMl0hPT10Lnp8fGVbM10hPT10LncpJiYoci51bmlmb3JtNGYodGhpcy5hZGRyLHQueCx0LnksdC56LHQudyksZVswXT10LngsZVsxXT10LnksZVsyXT10LnosZVszXT10LncpO2Vsc2V7aWYoa2UoZSx0KSlyZXR1cm47ci51bmlmb3JtNGZ2KHRoaXMuYWRkcix0KSxWZShlLHQpfX1mdW5jdGlvbiBQQShyLHQpe2NvbnN0IGU9dGhpcy5jYWNoZSxuPXQuZWxlbWVudHM7aWYobj09PXZvaWQgMCl7aWYoa2UoZSx0KSlyZXR1cm47ci51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSx0KSxWZShlLHQpfWVsc2V7aWYoa2UoZSxuKSlyZXR1cm47d3guc2V0KG4pLHIudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsITEsd3gpLFZlKGUsbil9fWZ1bmN0aW9uIExBKHIsdCl7Y29uc3QgZT10aGlzLmNhY2hlLG49dC5lbGVtZW50cztpZihuPT09dm9pZCAwKXtpZihrZShlLHQpKXJldHVybjtyLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLHQpLFZlKGUsdCl9ZWxzZXtpZihrZShlLG4pKXJldHVybjtieC5zZXQobiksci51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxieCksVmUoZSxuKX19ZnVuY3Rpb24gREEocix0KXtjb25zdCBlPXRoaXMuY2FjaGUsbj10LmVsZW1lbnRzO2lmKG49PT12b2lkIDApe2lmKGtlKGUsdCkpcmV0dXJuO3IudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEsdCksVmUoZSx0KX1lbHNle2lmKGtlKGUsbikpcmV0dXJuO1N4LnNldChuKSxyLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLCExLFN4KSxWZShlLG4pfX1mdW5jdGlvbiBVQShyLHQpe2NvbnN0IGU9dGhpcy5jYWNoZTtlWzBdIT09dCYmKHIudW5pZm9ybTFpKHRoaXMuYWRkcix0KSxlWzBdPXQpfWZ1bmN0aW9uIE5BKHIsdCl7Y29uc3QgZT10aGlzLmNhY2hlO2lmKHQueCE9PXZvaWQgMCkoZVswXSE9PXQueHx8ZVsxXSE9PXQueSkmJihyLnVuaWZvcm0yaSh0aGlzLmFkZHIsdC54LHQueSksZVswXT10LngsZVsxXT10LnkpO2Vsc2V7aWYoa2UoZSx0KSlyZXR1cm47ci51bmlmb3JtMml2KHRoaXMuYWRkcix0KSxWZShlLHQpfX1mdW5jdGlvbiBGQShyLHQpe2NvbnN0IGU9dGhpcy5jYWNoZTtpZih0LnghPT12b2lkIDApKGVbMF0hPT10Lnh8fGVbMV0hPT10Lnl8fGVbMl0hPT10LnopJiYoci51bmlmb3JtM2kodGhpcy5hZGRyLHQueCx0LnksdC56KSxlWzBdPXQueCxlWzFdPXQueSxlWzJdPXQueik7ZWxzZXtpZihrZShlLHQpKXJldHVybjtyLnVuaWZvcm0zaXYodGhpcy5hZGRyLHQpLFZlKGUsdCl9fWZ1bmN0aW9uIEJBKHIsdCl7Y29uc3QgZT10aGlzLmNhY2hlO2lmKHQueCE9PXZvaWQgMCkoZVswXSE9PXQueHx8ZVsxXSE9PXQueXx8ZVsyXSE9PXQuenx8ZVszXSE9PXQudykmJihyLnVuaWZvcm00aSh0aGlzLmFkZHIsdC54LHQueSx0LnosdC53KSxlWzBdPXQueCxlWzFdPXQueSxlWzJdPXQueixlWzNdPXQudyk7ZWxzZXtpZihrZShlLHQpKXJldHVybjtyLnVuaWZvcm00aXYodGhpcy5hZGRyLHQpLFZlKGUsdCl9fWZ1bmN0aW9uIE9BKHIsdCl7Y29uc3QgZT10aGlzLmNhY2hlO2VbMF0hPT10JiYoci51bmlmb3JtMXVpKHRoaXMuYWRkcix0KSxlWzBdPXQpfWZ1bmN0aW9uIHpBKHIsdCl7Y29uc3QgZT10aGlzLmNhY2hlO2lmKHQueCE9PXZvaWQgMCkoZVswXSE9PXQueHx8ZVsxXSE9PXQueSkmJihyLnVuaWZvcm0ydWkodGhpcy5hZGRyLHQueCx0LnkpLGVbMF09dC54LGVbMV09dC55KTtlbHNle2lmKGtlKGUsdCkpcmV0dXJuO3IudW5pZm9ybTJ1aXYodGhpcy5hZGRyLHQpLFZlKGUsdCl9fWZ1bmN0aW9uIGtBKHIsdCl7Y29uc3QgZT10aGlzLmNhY2hlO2lmKHQueCE9PXZvaWQgMCkoZVswXSE9PXQueHx8ZVsxXSE9PXQueXx8ZVsyXSE9PXQueikmJihyLnVuaWZvcm0zdWkodGhpcy5hZGRyLHQueCx0LnksdC56KSxlWzBdPXQueCxlWzFdPXQueSxlWzJdPXQueik7ZWxzZXtpZihrZShlLHQpKXJldHVybjtyLnVuaWZvcm0zdWl2KHRoaXMuYWRkcix0KSxWZShlLHQpfX1mdW5jdGlvbiBWQShyLHQpe2NvbnN0IGU9dGhpcy5jYWNoZTtpZih0LnghPT12b2lkIDApKGVbMF0hPT10Lnh8fGVbMV0hPT10Lnl8fGVbMl0hPT10Lnp8fGVbM10hPT10LncpJiYoci51bmlmb3JtNHVpKHRoaXMuYWRkcix0LngsdC55LHQueix0LncpLGVbMF09dC54LGVbMV09dC55LGVbMl09dC56LGVbM109dC53KTtlbHNle2lmKGtlKGUsdCkpcmV0dXJuO3IudW5pZm9ybTR1aXYodGhpcy5hZGRyLHQpLFZlKGUsdCl9fWZ1bmN0aW9uIEdBKHIsdCxlKXtjb25zdCBuPXRoaXMuY2FjaGUsaT1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtuWzBdIT09aSYmKHIudW5pZm9ybTFpKHRoaXMuYWRkcixpKSxuWzBdPWkpO2xldCBzO3RoaXMudHlwZT09PXIuU0FNUExFUl8yRF9TSEFET1c/KGd4LmNvbXBhcmVGdW5jdGlvbj1lZixzPWd4KTpzPW14LGUuc2V0VGV4dHVyZTJEKHR8fHMsaSl9ZnVuY3Rpb24gSEEocix0LGUpe2NvbnN0IG49dGhpcy5jYWNoZSxpPWUuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO25bMF0hPT1pJiYoci51bmlmb3JtMWkodGhpcy5hZGRyLGkpLG5bMF09aSksZS5zZXRUZXh0dXJlM0QodHx8X3gsaSl9ZnVuY3Rpb24gV0Eocix0LGUpe2NvbnN0IG49dGhpcy5jYWNoZSxpPWUuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO25bMF0hPT1pJiYoci51bmlmb3JtMWkodGhpcy5hZGRyLGkpLG5bMF09aSksZS5zZXRUZXh0dXJlQ3ViZSh0fHx5eCxpKX1mdW5jdGlvbiBYQShyLHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlLGk9ZS5hbGxvY2F0ZVRleHR1cmVVbml0KCk7blswXSE9PWkmJihyLnVuaWZvcm0xaSh0aGlzLmFkZHIsaSksblswXT1pKSxlLnNldFRleHR1cmUyREFycmF5KHR8fHh4LGkpfWZ1bmN0aW9uICRBKHIpe3N3aXRjaChyKXtjYXNlIDUxMjY6cmV0dXJuIEVBO2Nhc2UgMzU2NjQ6cmV0dXJuIENBO2Nhc2UgMzU2NjU6cmV0dXJuIFJBO2Nhc2UgMzU2NjY6cmV0dXJuIElBO2Nhc2UgMzU2NzQ6cmV0dXJuIFBBO2Nhc2UgMzU2NzU6cmV0dXJuIExBO2Nhc2UgMzU2NzY6cmV0dXJuIERBO2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiBVQTtjYXNlIDM1NjY3OmNhc2UgMzU2NzE6cmV0dXJuIE5BO2Nhc2UgMzU2Njg6Y2FzZSAzNTY3MjpyZXR1cm4gRkE7Y2FzZSAzNTY2OTpjYXNlIDM1NjczOnJldHVybiBCQTtjYXNlIDUxMjU6cmV0dXJuIE9BO2Nhc2UgMzYyOTQ6cmV0dXJuIHpBO2Nhc2UgMzYyOTU6cmV0dXJuIGtBO2Nhc2UgMzYyOTY6cmV0dXJuIFZBO2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpjYXNlIDM2Mjk4OmNhc2UgMzYzMDY6Y2FzZSAzNTY4MjpyZXR1cm4gR0E7Y2FzZSAzNTY3OTpjYXNlIDM2Mjk5OmNhc2UgMzYzMDc6cmV0dXJuIEhBO2Nhc2UgMzU2ODA6Y2FzZSAzNjMwMDpjYXNlIDM2MzA4OmNhc2UgMzYyOTM6cmV0dXJuIFdBO2Nhc2UgMzYyODk6Y2FzZSAzNjMwMzpjYXNlIDM2MzExOmNhc2UgMzYyOTI6cmV0dXJuIFhBfX1mdW5jdGlvbiBxQShyLHQpe3IudW5pZm9ybTFmdih0aGlzLmFkZHIsdCl9ZnVuY3Rpb24gWUEocix0KXtjb25zdCBlPWlvKHQsdGhpcy5zaXplLDIpO3IudW5pZm9ybTJmdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gWkEocix0KXtjb25zdCBlPWlvKHQsdGhpcy5zaXplLDMpO3IudW5pZm9ybTNmdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gSkEocix0KXtjb25zdCBlPWlvKHQsdGhpcy5zaXplLDQpO3IudW5pZm9ybTRmdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gS0Eocix0KXtjb25zdCBlPWlvKHQsdGhpcy5zaXplLDQpO3IudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsITEsZSl9ZnVuY3Rpb24gakEocix0KXtjb25zdCBlPWlvKHQsdGhpcy5zaXplLDkpO3IudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsITEsZSl9ZnVuY3Rpb24gUUEocix0KXtjb25zdCBlPWlvKHQsdGhpcy5zaXplLDE2KTtyLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLCExLGUpfWZ1bmN0aW9uIHRUKHIsdCl7ci51bmlmb3JtMWl2KHRoaXMuYWRkcix0KX1mdW5jdGlvbiBlVChyLHQpe3IudW5pZm9ybTJpdih0aGlzLmFkZHIsdCl9ZnVuY3Rpb24gblQocix0KXtyLnVuaWZvcm0zaXYodGhpcy5hZGRyLHQpfWZ1bmN0aW9uIGlUKHIsdCl7ci51bmlmb3JtNGl2KHRoaXMuYWRkcix0KX1mdW5jdGlvbiByVChyLHQpe3IudW5pZm9ybTF1aXYodGhpcy5hZGRyLHQpfWZ1bmN0aW9uIHNUKHIsdCl7ci51bmlmb3JtMnVpdih0aGlzLmFkZHIsdCl9ZnVuY3Rpb24gb1Qocix0KXtyLnVuaWZvcm0zdWl2KHRoaXMuYWRkcix0KX1mdW5jdGlvbiBhVChyLHQpe3IudW5pZm9ybTR1aXYodGhpcy5hZGRyLHQpfWZ1bmN0aW9uIGNUKHIsdCxlKXtjb25zdCBuPXRoaXMuY2FjaGUsaT10Lmxlbmd0aCxzPW11KGUsaSk7a2UobixzKXx8KHIudW5pZm9ybTFpdih0aGlzLmFkZHIscyksVmUobixzKSk7Zm9yKGxldCBvPTA7byE9PWk7KytvKWUuc2V0VGV4dHVyZTJEKHRbb118fG14LHNbb10pfWZ1bmN0aW9uIGxUKHIsdCxlKXtjb25zdCBuPXRoaXMuY2FjaGUsaT10Lmxlbmd0aCxzPW11KGUsaSk7a2UobixzKXx8KHIudW5pZm9ybTFpdih0aGlzLmFkZHIscyksVmUobixzKSk7Zm9yKGxldCBvPTA7byE9PWk7KytvKWUuc2V0VGV4dHVyZTNEKHRbb118fF94LHNbb10pfWZ1bmN0aW9uIHVUKHIsdCxlKXtjb25zdCBuPXRoaXMuY2FjaGUsaT10Lmxlbmd0aCxzPW11KGUsaSk7a2UobixzKXx8KHIudW5pZm9ybTFpdih0aGlzLmFkZHIscyksVmUobixzKSk7Zm9yKGxldCBvPTA7byE9PWk7KytvKWUuc2V0VGV4dHVyZUN1YmUodFtvXXx8eXgsc1tvXSl9ZnVuY3Rpb24gaFQocix0LGUpe2NvbnN0IG49dGhpcy5jYWNoZSxpPXQubGVuZ3RoLHM9bXUoZSxpKTtrZShuLHMpfHwoci51bmlmb3JtMWl2KHRoaXMuYWRkcixzKSxWZShuLHMpKTtmb3IobGV0IG89MDtvIT09aTsrK28pZS5zZXRUZXh0dXJlMkRBcnJheSh0W29dfHx4eCxzW29dKX1mdW5jdGlvbiBmVChyKXtzd2l0Y2gocil7Y2FzZSA1MTI2OnJldHVybiBxQTtjYXNlIDM1NjY0OnJldHVybiBZQTtjYXNlIDM1NjY1OnJldHVybiBaQTtjYXNlIDM1NjY2OnJldHVybiBKQTtjYXNlIDM1Njc0OnJldHVybiBLQTtjYXNlIDM1Njc1OnJldHVybiBqQTtjYXNlIDM1Njc2OnJldHVybiBRQTtjYXNlIDUxMjQ6Y2FzZSAzNTY3MDpyZXR1cm4gdFQ7Y2FzZSAzNTY2NzpjYXNlIDM1NjcxOnJldHVybiBlVDtjYXNlIDM1NjY4OmNhc2UgMzU2NzI6cmV0dXJuIG5UO2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gaVQ7Y2FzZSA1MTI1OnJldHVybiByVDtjYXNlIDM2Mjk0OnJldHVybiBzVDtjYXNlIDM2Mjk1OnJldHVybiBvVDtjYXNlIDM2Mjk2OnJldHVybiBhVDtjYXNlIDM1Njc4OmNhc2UgMzYxOTg6Y2FzZSAzNjI5ODpjYXNlIDM2MzA2OmNhc2UgMzU2ODI6cmV0dXJuIGNUO2Nhc2UgMzU2Nzk6Y2FzZSAzNjI5OTpjYXNlIDM2MzA3OnJldHVybiBsVDtjYXNlIDM1NjgwOmNhc2UgMzYzMDA6Y2FzZSAzNjMwODpjYXNlIDM2MjkzOnJldHVybiB1VDtjYXNlIDM2Mjg5OmNhc2UgMzYzMDM6Y2FzZSAzNjMxMTpjYXNlIDM2MjkyOnJldHVybiBoVH19Y2xhc3MgZFR7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuaWQ9dCx0aGlzLmFkZHI9bix0aGlzLmNhY2hlPVtdLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5zZXRWYWx1ZT0kQShlLnR5cGUpfX1jbGFzcyBwVHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5pZD10LHRoaXMuYWRkcj1uLHRoaXMuY2FjaGU9W10sdGhpcy50eXBlPWUudHlwZSx0aGlzLnNpemU9ZS5zaXplLHRoaXMuc2V0VmFsdWU9ZlQoZS50eXBlKX19Y2xhc3MgbVR7Y29uc3RydWN0b3IodCl7dGhpcy5pZD10LHRoaXMuc2VxPVtdLHRoaXMubWFwPXt9fXNldFZhbHVlKHQsZSxuKXtjb25zdCBpPXRoaXMuc2VxO2ZvcihsZXQgcz0wLG89aS5sZW5ndGg7cyE9PW87KytzKXtjb25zdCBhPWlbc107YS5zZXRWYWx1ZSh0LGVbYS5pZF0sbil9fX1jb25zdCBiZD0vKFx3KykoXF0pPyhcW3xcLik/L2c7ZnVuY3Rpb24gQXgocix0KXtyLnNlcS5wdXNoKHQpLHIubWFwW3QuaWRdPXR9ZnVuY3Rpb24gZ1Qocix0LGUpe2NvbnN0IG49ci5uYW1lLGk9bi5sZW5ndGg7Zm9yKGJkLmxhc3RJbmRleD0wOzspe2NvbnN0IHM9YmQuZXhlYyhuKSxvPWJkLmxhc3RJbmRleDtsZXQgYT1zWzFdO2NvbnN0IGM9c1syXT09PSJdIixsPXNbM107aWYoYyYmKGE9YXwwKSxsPT09dm9pZCAwfHxsPT09IlsiJiZvKzI9PT1pKXtBeChlLGw9PT12b2lkIDA/bmV3IGRUKGEscix0KTpuZXcgcFQoYSxyLHQpKTticmVha31lbHNle2xldCBoPWUubWFwW2FdO2g9PT12b2lkIDAmJihoPW5ldyBtVChhKSxBeChlLGgpKSxlPWh9fX1jbGFzcyBndXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuc2VxPVtdLHRoaXMubWFwPXt9O2NvbnN0IG49dC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsdC5BQ1RJVkVfVU5JRk9STVMpO2ZvcihsZXQgaT0wO2k8bjsrK2kpe2NvbnN0IHM9dC5nZXRBY3RpdmVVbmlmb3JtKGUsaSksbz10LmdldFVuaWZvcm1Mb2NhdGlvbihlLHMubmFtZSk7Z1QocyxvLHRoaXMpfX1zZXRWYWx1ZSh0LGUsbixpKXtjb25zdCBzPXRoaXMubWFwW2VdO3MhPT12b2lkIDAmJnMuc2V0VmFsdWUodCxuLGkpfXNldE9wdGlvbmFsKHQsZSxuKXtjb25zdCBpPWVbbl07aSE9PXZvaWQgMCYmdGhpcy5zZXRWYWx1ZSh0LG4saSl9c3RhdGljIHVwbG9hZCh0LGUsbixpKXtmb3IobGV0IHM9MCxvPWUubGVuZ3RoO3MhPT1vOysrcyl7Y29uc3QgYT1lW3NdLGM9blthLmlkXTtjLm5lZWRzVXBkYXRlIT09ITEmJmEuc2V0VmFsdWUodCxjLnZhbHVlLGkpfX1zdGF0aWMgc2VxV2l0aFZhbHVlKHQsZSl7Y29uc3Qgbj1bXTtmb3IobGV0IGk9MCxzPXQubGVuZ3RoO2khPT1zOysraSl7Y29uc3Qgbz10W2ldO28uaWQgaW4gZSYmbi5wdXNoKG8pfXJldHVybiBufX1mdW5jdGlvbiBUeChyLHQsZSl7Y29uc3Qgbj1yLmNyZWF0ZVNoYWRlcih0KTtyZXR1cm4gci5zaGFkZXJTb3VyY2UobixlKSxyLmNvbXBpbGVTaGFkZXIobiksbn1jb25zdCB4VD0zNzI5NztsZXQgX1Q9MDtmdW5jdGlvbiB5VChyLHQpe2NvbnN0IGU9ci5zcGxpdChgCmApLG49W10saT1NYXRoLm1heCh0LTYsMCkscz1NYXRoLm1pbih0KzYsZS5sZW5ndGgpO2ZvcihsZXQgbz1pO288cztvKyspe2NvbnN0IGE9bysxO24ucHVzaChgJHthPT09dD8iPiI6IiAifSAke2F9OiAke2Vbb119YCl9cmV0dXJuIG4uam9pbihgCmApfWNvbnN0IEV4PW5ldyBXdDtmdW5jdGlvbiB2VChyKXtuZS5fZ2V0TWF0cml4KEV4LG5lLndvcmtpbmdDb2xvclNwYWNlLHIpO2NvbnN0IHQ9YG1hdDMoICR7RXguZWxlbWVudHMubWFwKGU9PmUudG9GaXhlZCg0KSl9IClgO3N3aXRjaChuZS5nZXRUcmFuc2ZlcihyKSl7Y2FzZSBIbzpyZXR1cm5bdCwiTGluZWFyVHJhbnNmZXJPRVRGIl07Y2FzZSBkZTpyZXR1cm5bdCwic1JHQlRyYW5zZmVyT0VURiJdO2RlZmF1bHQ6cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtOiBVbnN1cHBvcnRlZCBjb2xvciBzcGFjZTogIixyKSxbdCwiTGluZWFyVHJhbnNmZXJPRVRGIl19fWZ1bmN0aW9uIEN4KHIsdCxlKXtjb25zdCBuPXIuZ2V0U2hhZGVyUGFyYW1ldGVyKHQsci5DT01QSUxFX1NUQVRVUyksaT1yLmdldFNoYWRlckluZm9Mb2codCkudHJpbSgpO2lmKG4mJmk9PT0iIilyZXR1cm4iIjtjb25zdCBzPS9FUlJPUjogMDooXGQrKS8uZXhlYyhpKTtpZihzKXtjb25zdCBvPXBhcnNlSW50KHNbMV0pO3JldHVybiBlLnRvVXBwZXJDYXNlKCkrYAoKYCtpK2AKCmAreVQoci5nZXRTaGFkZXJTb3VyY2UodCksbyl9ZWxzZSByZXR1cm4gaX1mdW5jdGlvbiBNVChyLHQpe2NvbnN0IGU9dlQodCk7cmV0dXJuW2B2ZWM0ICR7cn0oIHZlYzQgdmFsdWUgKSB7YCxgCXJldHVybiAke2VbMV19KCB2ZWM0KCB2YWx1ZS5yZ2IgKiAke2VbMF19LCB2YWx1ZS5hICkgKTtgLCJ9Il0uam9pbihgCmApfWZ1bmN0aW9uIFNUKHIsdCl7bGV0IGU7c3dpdGNoKHQpe2Nhc2UgQW06ZT0iTGluZWFyIjticmVhaztjYXNlIFRtOmU9IlJlaW5oYXJkIjticmVhaztjYXNlIEVtOmU9IkNpbmVvbiI7YnJlYWs7Y2FzZSBDbTplPSJBQ0VTRmlsbWljIjticmVhaztjYXNlIEltOmU9IkFnWCI7YnJlYWs7Y2FzZSBQbTplPSJOZXV0cmFsIjticmVhaztjYXNlIFJtOmU9IkN1c3RvbSI7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbTogVW5zdXBwb3J0ZWQgdG9uZU1hcHBpbmc6Iix0KSxlPSJMaW5lYXIifXJldHVybiJ2ZWMzICIrcisiKCB2ZWMzIGNvbG9yICkgeyByZXR1cm4gIitlKyJUb25lTWFwcGluZyggY29sb3IgKTsgfSJ9Y29uc3QgeHU9bmV3IEk7ZnVuY3Rpb24gYlQoKXtuZS5nZXRMdW1pbmFuY2VDb2VmZmljaWVudHMoeHUpO2NvbnN0IHI9eHUueC50b0ZpeGVkKDQpLHQ9eHUueS50b0ZpeGVkKDQpLGU9eHUuei50b0ZpeGVkKDQpO3JldHVyblsiZmxvYXQgbHVtaW5hbmNlKCBjb25zdCBpbiB2ZWMzIHJnYiApIHsiLGAJY29uc3QgdmVjMyB3ZWlnaHRzID0gdmVjMyggJHtyfSwgJHt0fSwgJHtlfSApO2AsIglyZXR1cm4gZG90KCB3ZWlnaHRzLCByZ2IgKTsiLCJ9Il0uam9pbihgCmApfWZ1bmN0aW9uIHdUKHIpe3JldHVybltyLmV4dGVuc2lvbkNsaXBDdWxsRGlzdGFuY2U/IiNleHRlbnNpb24gR0xfQU5HTEVfY2xpcF9jdWxsX2Rpc3RhbmNlIDogcmVxdWlyZSI6IiIsci5leHRlbnNpb25NdWx0aURyYXc/IiNleHRlbnNpb24gR0xfQU5HTEVfbXVsdGlfZHJhdyA6IHJlcXVpcmUiOiIiXS5maWx0ZXIoQWEpLmpvaW4oYApgKX1mdW5jdGlvbiBBVChyKXtjb25zdCB0PVtdO2Zvcihjb25zdCBlIGluIHIpe2NvbnN0IG49cltlXTtuIT09ITEmJnQucHVzaCgiI2RlZmluZSAiK2UrIiAiK24pfXJldHVybiB0LmpvaW4oYApgKX1mdW5jdGlvbiBUVChyLHQpe2NvbnN0IGU9e30sbj1yLmdldFByb2dyYW1QYXJhbWV0ZXIodCxyLkFDVElWRV9BVFRSSUJVVEVTKTtmb3IobGV0IGk9MDtpPG47aSsrKXtjb25zdCBzPXIuZ2V0QWN0aXZlQXR0cmliKHQsaSksbz1zLm5hbWU7bGV0IGE9MTtzLnR5cGU9PT1yLkZMT0FUX01BVDImJihhPTIpLHMudHlwZT09PXIuRkxPQVRfTUFUMyYmKGE9Mykscy50eXBlPT09ci5GTE9BVF9NQVQ0JiYoYT00KSxlW29dPXt0eXBlOnMudHlwZSxsb2NhdGlvbjpyLmdldEF0dHJpYkxvY2F0aW9uKHQsbyksbG9jYXRpb25TaXplOmF9fXJldHVybiBlfWZ1bmN0aW9uIEFhKHIpe3JldHVybiByIT09IiJ9ZnVuY3Rpb24gUngocix0KXtjb25zdCBlPXQubnVtU3BvdExpZ2h0U2hhZG93cyt0Lm51bVNwb3RMaWdodE1hcHMtdC5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHM7cmV0dXJuIHIucmVwbGFjZSgvTlVNX0RJUl9MSUdIVFMvZyx0Lm51bURpckxpZ2h0cykucmVwbGFjZSgvTlVNX1NQT1RfTElHSFRTL2csdC5udW1TcG90TGlnaHRzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9NQVBTL2csdC5udW1TcG90TGlnaHRNYXBzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9DT09SRFMvZyxlKS5yZXBsYWNlKC9OVU1fUkVDVF9BUkVBX0xJR0hUUy9nLHQubnVtUmVjdEFyZWFMaWdodHMpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVFMvZyx0Lm51bVBvaW50TGlnaHRzKS5yZXBsYWNlKC9OVU1fSEVNSV9MSUdIVFMvZyx0Lm51bUhlbWlMaWdodHMpLnJlcGxhY2UoL05VTV9ESVJfTElHSFRfU0hBRE9XUy9nLHQubnVtRGlyTGlnaHRTaGFkb3dzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUy9nLHQubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9TSEFET1dTL2csdC5udW1TcG90TGlnaHRTaGFkb3dzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRfU0hBRE9XUy9nLHQubnVtUG9pbnRMaWdodFNoYWRvd3MpfWZ1bmN0aW9uIEl4KHIsdCl7cmV0dXJuIHIucmVwbGFjZSgvTlVNX0NMSVBQSU5HX1BMQU5FUy9nLHQubnVtQ2xpcHBpbmdQbGFuZXMpLnJlcGxhY2UoL1VOSU9OX0NMSVBQSU5HX1BMQU5FUy9nLHQubnVtQ2xpcHBpbmdQbGFuZXMtdC5udW1DbGlwSW50ZXJzZWN0aW9uKX1jb25zdCBFVD0vXlsgXHRdKiNpbmNsdWRlICs8KFtcd1xkLi9dKyk+L2dtO2Z1bmN0aW9uIHdkKHIpe3JldHVybiByLnJlcGxhY2UoRVQsUlQpfWNvbnN0IENUPW5ldyBNYXA7ZnVuY3Rpb24gUlQocix0KXtsZXQgZT1LdFt0XTtpZihlPT09dm9pZCAwKXtjb25zdCBuPUNULmdldCh0KTtpZihuIT09dm9pZCAwKWU9S3Rbbl0sY29uc29sZS53YXJuKCdUSFJFRS5XZWJHTFJlbmRlcmVyOiBTaGFkZXIgY2h1bmsgIiVzIiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgIiVzIiBpbnN0ZWFkLicsdCxuKTtlbHNlIHRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIDwiK3QrIj4iKX1yZXR1cm4gd2QoZSl9Y29uc3QgSVQ9LyNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRccytmb3JccypcKFxzKmludFxzK2lccyo9XHMqKFxkKylccyo7XHMqaVxzKjxccyooXGQrKVxzKjtccyppXHMqXCtcK1xzKlwpXHMqeyhbXHNcU10rPyl9XHMrI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQvZztmdW5jdGlvbiBQeChyKXtyZXR1cm4gci5yZXBsYWNlKElULFBUKX1mdW5jdGlvbiBQVChyLHQsZSxuKXtsZXQgaT0iIjtmb3IobGV0IHM9cGFyc2VJbnQodCk7czxwYXJzZUludChlKTtzKyspaSs9bi5yZXBsYWNlKC9cW1xzKmlccypcXS9nLCJbICIrcysiIF0iKS5yZXBsYWNlKC9VTlJPTExFRF9MT09QX0lOREVYL2cscyk7cmV0dXJuIGl9ZnVuY3Rpb24gTHgocil7bGV0IHQ9YHByZWNpc2lvbiAke3IucHJlY2lzaW9ufSBmbG9hdDsKCXByZWNpc2lvbiAke3IucHJlY2lzaW9ufSBpbnQ7CglwcmVjaXNpb24gJHtyLnByZWNpc2lvbn0gc2FtcGxlcjJEOwoJcHJlY2lzaW9uICR7ci5wcmVjaXNpb259IHNhbXBsZXJDdWJlOwoJcHJlY2lzaW9uICR7ci5wcmVjaXNpb259IHNhbXBsZXIzRDsKCXByZWNpc2lvbiAke3IucHJlY2lzaW9ufSBzYW1wbGVyMkRBcnJheTsKCXByZWNpc2lvbiAke3IucHJlY2lzaW9ufSBzYW1wbGVyMkRTaGFkb3c7CglwcmVjaXNpb24gJHtyLnByZWNpc2lvbn0gc2FtcGxlckN1YmVTaGFkb3c7CglwcmVjaXNpb24gJHtyLnByZWNpc2lvbn0gc2FtcGxlcjJEQXJyYXlTaGFkb3c7CglwcmVjaXNpb24gJHtyLnByZWNpc2lvbn0gaXNhbXBsZXIyRDsKCXByZWNpc2lvbiAke3IucHJlY2lzaW9ufSBpc2FtcGxlcjNEOwoJcHJlY2lzaW9uICR7ci5wcmVjaXNpb259IGlzYW1wbGVyQ3ViZTsKCXByZWNpc2lvbiAke3IucHJlY2lzaW9ufSBpc2FtcGxlcjJEQXJyYXk7CglwcmVjaXNpb24gJHtyLnByZWNpc2lvbn0gdXNhbXBsZXIyRDsKCXByZWNpc2lvbiAke3IucHJlY2lzaW9ufSB1c2FtcGxlcjNEOwoJcHJlY2lzaW9uICR7ci5wcmVjaXNpb259IHVzYW1wbGVyQ3ViZTsKCXByZWNpc2lvbiAke3IucHJlY2lzaW9ufSB1c2FtcGxlcjJEQXJyYXk7CglgO3JldHVybiByLnByZWNpc2lvbj09PSJoaWdocCI/dCs9YAojZGVmaW5lIEhJR0hfUFJFQ0lTSU9OYDpyLnByZWNpc2lvbj09PSJtZWRpdW1wIj90Kz1gCiNkZWZpbmUgTUVESVVNX1BSRUNJU0lPTmA6ci5wcmVjaXNpb249PT0ibG93cCImJih0Kz1gCiNkZWZpbmUgTE9XX1BSRUNJU0lPTmApLHR9ZnVuY3Rpb24gTFQocil7bGV0IHQ9IlNIQURPV01BUF9UWVBFX0JBU0lDIjtyZXR1cm4gci5zaGFkb3dNYXBUeXBlPT09Z24/dD0iU0hBRE9XTUFQX1RZUEVfUENGIjpyLnNoYWRvd01hcFR5cGU9PT1Tcz90PSJTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCI6ci5zaGFkb3dNYXBUeXBlPT09eGkmJih0PSJTSEFET1dNQVBfVFlQRV9WU00iKSx0fWZ1bmN0aW9uIERUKHIpe2xldCB0PSJFTlZNQVBfVFlQRV9DVUJFIjtpZihyLmVudk1hcClzd2l0Y2goci5lbnZNYXBNb2RlKXtjYXNlIFBpOmNhc2Ugc3I6dD0iRU5WTUFQX1RZUEVfQ1VCRSI7YnJlYWs7Y2FzZSBiczp0PSJFTlZNQVBfVFlQRV9DVUJFX1VWIjticmVha31yZXR1cm4gdH1mdW5jdGlvbiBVVChyKXtsZXQgdD0iRU5WTUFQX01PREVfUkVGTEVDVElPTiI7aWYoci5lbnZNYXApc3dpdGNoKHIuZW52TWFwTW9kZSl7Y2FzZSBzcjp0PSJFTlZNQVBfTU9ERV9SRUZSQUNUSU9OIjticmVha31yZXR1cm4gdH1mdW5jdGlvbiBOVChyKXtsZXQgdD0iRU5WTUFQX0JMRU5ESU5HX05PTkUiO2lmKHIuZW52TWFwKXN3aXRjaChyLmNvbWJpbmUpe2Nhc2UgUm86dD0iRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZIjticmVhaztjYXNlIGJtOnQ9IkVOVk1BUF9CTEVORElOR19NSVgiO2JyZWFrO2Nhc2Ugd206dD0iRU5WTUFQX0JMRU5ESU5HX0FERCI7YnJlYWt9cmV0dXJuIHR9ZnVuY3Rpb24gRlQocil7Y29uc3QgdD1yLmVudk1hcEN1YmVVVkhlaWdodDtpZih0PT09bnVsbClyZXR1cm4gbnVsbDtjb25zdCBlPU1hdGgubG9nMih0KS0yLG49MS90O3JldHVybnt0ZXhlbFdpZHRoOjEvKDMqTWF0aC5tYXgoTWF0aC5wb3coMixlKSw3KjE2KSksdGV4ZWxIZWlnaHQ6bixtYXhNaXA6ZX19ZnVuY3Rpb24gQlQocix0LGUsbil7Y29uc3QgaT1yLmdldENvbnRleHQoKSxzPWUuZGVmaW5lcztsZXQgbz1lLnZlcnRleFNoYWRlcixhPWUuZnJhZ21lbnRTaGFkZXI7Y29uc3QgYz1MVChlKSxsPURUKGUpLHU9VVQoZSksaD1OVChlKSxmPUZUKGUpLGQ9d1QoZSkscD1BVChzKSx4PWkuY3JlYXRlUHJvZ3JhbSgpO2xldCBnLG0sdj1lLmdsc2xWZXJzaW9uPyIjdmVyc2lvbiAiK2UuZ2xzbFZlcnNpb24rYApgOiIiO2UuaXNSYXdTaGFkZXJNYXRlcmlhbD8oZz1bIiNkZWZpbmUgU0hBREVSX1RZUEUgIitlLnNoYWRlclR5cGUsIiNkZWZpbmUgU0hBREVSX05BTUUgIitlLnNoYWRlck5hbWUscF0uZmlsdGVyKEFhKS5qb2luKGAKYCksZy5sZW5ndGg+MCYmKGcrPWAKYCksbT1bIiNkZWZpbmUgU0hBREVSX1RZUEUgIitlLnNoYWRlclR5cGUsIiNkZWZpbmUgU0hBREVSX05BTUUgIitlLnNoYWRlck5hbWUscF0uZmlsdGVyKEFhKS5qb2luKGAKYCksbS5sZW5ndGg+MCYmKG0rPWAKYCkpOihnPVtMeChlKSwiI2RlZmluZSBTSEFERVJfVFlQRSAiK2Uuc2hhZGVyVHlwZSwiI2RlZmluZSBTSEFERVJfTkFNRSAiK2Uuc2hhZGVyTmFtZSxwLGUuZXh0ZW5zaW9uQ2xpcEN1bGxEaXN0YW5jZT8iI2RlZmluZSBVU0VfQ0xJUF9ESVNUQU5DRSI6IiIsZS5iYXRjaGluZz8iI2RlZmluZSBVU0VfQkFUQ0hJTkciOiIiLGUuYmF0Y2hpbmdDb2xvcj8iI2RlZmluZSBVU0VfQkFUQ0hJTkdfQ09MT1IiOiIiLGUuaW5zdGFuY2luZz8iI2RlZmluZSBVU0VfSU5TVEFOQ0lORyI6IiIsZS5pbnN0YW5jaW5nQ29sb3I/IiNkZWZpbmUgVVNFX0lOU1RBTkNJTkdfQ09MT1IiOiIiLGUuaW5zdGFuY2luZ01vcnBoPyIjZGVmaW5lIFVTRV9JTlNUQU5DSU5HX01PUlBIIjoiIixlLnVzZUZvZyYmZS5mb2c/IiNkZWZpbmUgVVNFX0ZPRyI6IiIsZS51c2VGb2cmJmUuZm9nRXhwMj8iI2RlZmluZSBGT0dfRVhQMiI6IiIsZS5tYXA/IiNkZWZpbmUgVVNFX01BUCI6IiIsZS5lbnZNYXA/IiNkZWZpbmUgVVNFX0VOVk1BUCI6IiIsZS5lbnZNYXA/IiNkZWZpbmUgIit1OiIiLGUubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIixlLmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsZS5idW1wTWFwPyIjZGVmaW5lIFVTRV9CVU1QTUFQIjoiIixlLm5vcm1hbE1hcD8iI2RlZmluZSBVU0VfTk9STUFMTUFQIjoiIixlLm5vcm1hbE1hcE9iamVjdFNwYWNlPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVBfT0JKRUNUU1BBQ0UiOiIiLGUubm9ybWFsTWFwVGFuZ2VudFNwYWNlPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFIjoiIixlLmRpc3BsYWNlbWVudE1hcD8iI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQIjoiIixlLmVtaXNzaXZlTWFwPyIjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCI6IiIsZS5hbmlzb3Ryb3B5PyIjZGVmaW5lIFVTRV9BTklTT1RST1BZIjoiIixlLmFuaXNvdHJvcHlNYXA/IiNkZWZpbmUgVVNFX0FOSVNPVFJPUFlNQVAiOiIiLGUuY2xlYXJjb2F0TWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRNQVAiOiIiLGUuY2xlYXJjb2F0Um91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQIjoiIixlLmNsZWFyY29hdE5vcm1hbE1hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsZS5pcmlkZXNjZW5jZU1hcD8iI2RlZmluZSBVU0VfSVJJREVTQ0VOQ0VNQVAiOiIiLGUuaXJpZGVzY2VuY2VUaGlja25lc3NNYXA/IiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUCI6IiIsZS5zcGVjdWxhck1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAiOiIiLGUuc3BlY3VsYXJDb2xvck1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAiOiIiLGUuc3BlY3VsYXJJbnRlbnNpdHlNYXA/IiNkZWZpbmUgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUCI6IiIsZS5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsZS5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsZS5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLGUuYWxwaGFIYXNoPyIjZGVmaW5lIFVTRV9BTFBIQUhBU0giOiIiLGUudHJhbnNtaXNzaW9uPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT04iOiIiLGUudHJhbnNtaXNzaW9uTWFwPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT05NQVAiOiIiLGUudGhpY2tuZXNzTWFwPyIjZGVmaW5lIFVTRV9USElDS05FU1NNQVAiOiIiLGUuc2hlZW5Db2xvck1hcD8iI2RlZmluZSBVU0VfU0hFRU5fQ09MT1JNQVAiOiIiLGUuc2hlZW5Sb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1NIRUVOX1JPVUdITkVTU01BUCI6IiIsZS5tYXBVdj8iI2RlZmluZSBNQVBfVVYgIitlLm1hcFV2OiIiLGUuYWxwaGFNYXBVdj8iI2RlZmluZSBBTFBIQU1BUF9VViAiK2UuYWxwaGFNYXBVdjoiIixlLmxpZ2h0TWFwVXY/IiNkZWZpbmUgTElHSFRNQVBfVVYgIitlLmxpZ2h0TWFwVXY6IiIsZS5hb01hcFV2PyIjZGVmaW5lIEFPTUFQX1VWICIrZS5hb01hcFV2OiIiLGUuZW1pc3NpdmVNYXBVdj8iI2RlZmluZSBFTUlTU0lWRU1BUF9VViAiK2UuZW1pc3NpdmVNYXBVdjoiIixlLmJ1bXBNYXBVdj8iI2RlZmluZSBCVU1QTUFQX1VWICIrZS5idW1wTWFwVXY6IiIsZS5ub3JtYWxNYXBVdj8iI2RlZmluZSBOT1JNQUxNQVBfVVYgIitlLm5vcm1hbE1hcFV2OiIiLGUuZGlzcGxhY2VtZW50TWFwVXY/IiNkZWZpbmUgRElTUExBQ0VNRU5UTUFQX1VWICIrZS5kaXNwbGFjZW1lbnRNYXBVdjoiIixlLm1ldGFsbmVzc01hcFV2PyIjZGVmaW5lIE1FVEFMTkVTU01BUF9VViAiK2UubWV0YWxuZXNzTWFwVXY6IiIsZS5yb3VnaG5lc3NNYXBVdj8iI2RlZmluZSBST1VHSE5FU1NNQVBfVVYgIitlLnJvdWdobmVzc01hcFV2OiIiLGUuYW5pc290cm9weU1hcFV2PyIjZGVmaW5lIEFOSVNPVFJPUFlNQVBfVVYgIitlLmFuaXNvdHJvcHlNYXBVdjoiIixlLmNsZWFyY29hdE1hcFV2PyIjZGVmaW5lIENMRUFSQ09BVE1BUF9VViAiK2UuY2xlYXJjb2F0TWFwVXY6IiIsZS5jbGVhcmNvYXROb3JtYWxNYXBVdj8iI2RlZmluZSBDTEVBUkNPQVRfTk9STUFMTUFQX1VWICIrZS5jbGVhcmNvYXROb3JtYWxNYXBVdjoiIixlLmNsZWFyY29hdFJvdWdobmVzc01hcFV2PyIjZGVmaW5lIENMRUFSQ09BVF9ST1VHSE5FU1NNQVBfVVYgIitlLmNsZWFyY29hdFJvdWdobmVzc01hcFV2OiIiLGUuaXJpZGVzY2VuY2VNYXBVdj8iI2RlZmluZSBJUklERVNDRU5DRU1BUF9VViAiK2UuaXJpZGVzY2VuY2VNYXBVdjoiIixlLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXY/IiNkZWZpbmUgSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQX1VWICIrZS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2OiIiLGUuc2hlZW5Db2xvck1hcFV2PyIjZGVmaW5lIFNIRUVOX0NPTE9STUFQX1VWICIrZS5zaGVlbkNvbG9yTWFwVXY6IiIsZS5zaGVlblJvdWdobmVzc01hcFV2PyIjZGVmaW5lIFNIRUVOX1JPVUdITkVTU01BUF9VViAiK2Uuc2hlZW5Sb3VnaG5lc3NNYXBVdjoiIixlLnNwZWN1bGFyTWFwVXY/IiNkZWZpbmUgU1BFQ1VMQVJNQVBfVVYgIitlLnNwZWN1bGFyTWFwVXY6IiIsZS5zcGVjdWxhckNvbG9yTWFwVXY/IiNkZWZpbmUgU1BFQ1VMQVJfQ09MT1JNQVBfVVYgIitlLnNwZWN1bGFyQ29sb3JNYXBVdjoiIixlLnNwZWN1bGFySW50ZW5zaXR5TWFwVXY/IiNkZWZpbmUgU1BFQ1VMQVJfSU5URU5TSVRZTUFQX1VWICIrZS5zcGVjdWxhckludGVuc2l0eU1hcFV2OiIiLGUudHJhbnNtaXNzaW9uTWFwVXY/IiNkZWZpbmUgVFJBTlNNSVNTSU9OTUFQX1VWICIrZS50cmFuc21pc3Npb25NYXBVdjoiIixlLnRoaWNrbmVzc01hcFV2PyIjZGVmaW5lIFRISUNLTkVTU01BUF9VViAiK2UudGhpY2tuZXNzTWFwVXY6IiIsZS52ZXJ0ZXhUYW5nZW50cyYmZS5mbGF0U2hhZGluZz09PSExPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoiIixlLnZlcnRleENvbG9ycz8iI2RlZmluZSBVU0VfQ09MT1IiOiIiLGUudmVydGV4QWxwaGFzPyIjZGVmaW5lIFVTRV9DT0xPUl9BTFBIQSI6IiIsZS52ZXJ0ZXhVdjFzPyIjZGVmaW5lIFVTRV9VVjEiOiIiLGUudmVydGV4VXYycz8iI2RlZmluZSBVU0VfVVYyIjoiIixlLnZlcnRleFV2M3M/IiNkZWZpbmUgVVNFX1VWMyI6IiIsZS5wb2ludHNVdnM/IiNkZWZpbmUgVVNFX1BPSU5UU19VViI6IiIsZS5mbGF0U2hhZGluZz8iI2RlZmluZSBGTEFUX1NIQURFRCI6IiIsZS5za2lubmluZz8iI2RlZmluZSBVU0VfU0tJTk5JTkciOiIiLGUubW9ycGhUYXJnZXRzPyIjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMiOiIiLGUubW9ycGhOb3JtYWxzJiZlLmZsYXRTaGFkaW5nPT09ITE/IiNkZWZpbmUgVVNFX01PUlBITk9STUFMUyI6IiIsZS5tb3JwaENvbG9ycz8iI2RlZmluZSBVU0VfTU9SUEhDT0xPUlMiOiIiLGUubW9ycGhUYXJnZXRzQ291bnQ+MD8iI2RlZmluZSBNT1JQSFRBUkdFVFNfVEVYVFVSRV9TVFJJREUgIitlLm1vcnBoVGV4dHVyZVN0cmlkZToiIixlLm1vcnBoVGFyZ2V0c0NvdW50PjA/IiNkZWZpbmUgTU9SUEhUQVJHRVRTX0NPVU5UICIrZS5tb3JwaFRhcmdldHNDb3VudDoiIixlLmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsZS5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsZS5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLGUuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK2M6IiIsZS5zaXplQXR0ZW51YXRpb24/IiNkZWZpbmUgVVNFX1NJWkVBVFRFTlVBVElPTiI6IiIsZS5udW1MaWdodFByb2Jlcz4wPyIjZGVmaW5lIFVTRV9MSUdIVF9QUk9CRVMiOiIiLGUubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUYiOiIiLGUucmV2ZXJzZURlcHRoQnVmZmVyPyIjZGVmaW5lIFVTRV9SRVZFUlNFREVQVEhCVUYiOiIiLCJ1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7IiwidW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4OyIsInVuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsiLCJ1bmlmb3JtIGJvb2wgaXNPcnRob2dyYXBoaWM7IiwiI2lmZGVmIFVTRV9JTlNUQU5DSU5HIiwiCWF0dHJpYnV0ZSBtYXQ0IGluc3RhbmNlTWF0cml4OyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfSU5TVEFOQ0lOR19DT0xPUiIsIglhdHRyaWJ1dGUgdmVjMyBpbnN0YW5jZUNvbG9yOyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfSU5TVEFOQ0lOR19NT1JQSCIsIgl1bmlmb3JtIHNhbXBsZXIyRCBtb3JwaFRleHR1cmU7IiwiI2VuZGlmIiwiYXR0cmlidXRlIHZlYzMgcG9zaXRpb247IiwiYXR0cmlidXRlIHZlYzMgbm9ybWFsOyIsImF0dHJpYnV0ZSB2ZWMyIHV2OyIsIiNpZmRlZiBVU0VfVVYxIiwiCWF0dHJpYnV0ZSB2ZWMyIHV2MTsiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1VWMiIsIglhdHRyaWJ1dGUgdmVjMiB1djI7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9VVjMiLCIJYXR0cmlidXRlIHZlYzIgdXYzOyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfVEFOR0VOVCIsIglhdHRyaWJ1dGUgdmVjNCB0YW5nZW50OyIsIiNlbmRpZiIsIiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKSIsIglhdHRyaWJ1dGUgdmVjNCBjb2xvcjsiLCIjZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSIsIglhdHRyaWJ1dGUgdmVjMyBjb2xvcjsiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1NLSU5OSU5HIiwiCWF0dHJpYnV0ZSB2ZWM0IHNraW5JbmRleDsiLCIJYXR0cmlidXRlIHZlYzQgc2tpbldlaWdodDsiLCIjZW5kaWYiLGAKYF0uZmlsdGVyKEFhKS5qb2luKGAKYCksbT1bTHgoZSksIiNkZWZpbmUgU0hBREVSX1RZUEUgIitlLnNoYWRlclR5cGUsIiNkZWZpbmUgU0hBREVSX05BTUUgIitlLnNoYWRlck5hbWUscCxlLnVzZUZvZyYmZS5mb2c/IiNkZWZpbmUgVVNFX0ZPRyI6IiIsZS51c2VGb2cmJmUuZm9nRXhwMj8iI2RlZmluZSBGT0dfRVhQMiI6IiIsZS5hbHBoYVRvQ292ZXJhZ2U/IiNkZWZpbmUgQUxQSEFfVE9fQ09WRVJBR0UiOiIiLGUubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLGUubWF0Y2FwPyIjZGVmaW5lIFVTRV9NQVRDQVAiOiIiLGUuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLGUuZW52TWFwPyIjZGVmaW5lICIrbDoiIixlLmVudk1hcD8iI2RlZmluZSAiK3U6IiIsZS5lbnZNYXA/IiNkZWZpbmUgIitoOiIiLGY/IiNkZWZpbmUgQ1VCRVVWX1RFWEVMX1dJRFRIICIrZi50ZXhlbFdpZHRoOiIiLGY/IiNkZWZpbmUgQ1VCRVVWX1RFWEVMX0hFSUdIVCAiK2YudGV4ZWxIZWlnaHQ6IiIsZj8iI2RlZmluZSBDVUJFVVZfTUFYX01JUCAiK2YubWF4TWlwKyIuMCI6IiIsZS5saWdodE1hcD8iI2RlZmluZSBVU0VfTElHSFRNQVAiOiIiLGUuYW9NYXA/IiNkZWZpbmUgVVNFX0FPTUFQIjoiIixlLmJ1bXBNYXA/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLGUubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLGUubm9ybWFsTWFwT2JqZWN0U3BhY2U/IiNkZWZpbmUgVVNFX05PUk1BTE1BUF9PQkpFQ1RTUEFDRSI6IiIsZS5ub3JtYWxNYXBUYW5nZW50U3BhY2U/IiNkZWZpbmUgVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UiOiIiLGUuZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIixlLmFuaXNvdHJvcHk/IiNkZWZpbmUgVVNFX0FOSVNPVFJPUFkiOiIiLGUuYW5pc290cm9weU1hcD8iI2RlZmluZSBVU0VfQU5JU09UUk9QWU1BUCI6IiIsZS5jbGVhcmNvYXQ/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVCI6IiIsZS5jbGVhcmNvYXRNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVE1BUCI6IiIsZS5jbGVhcmNvYXRSb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAiOiIiLGUuY2xlYXJjb2F0Tm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIjoiIixlLmRpc3BlcnNpb24/IiNkZWZpbmUgVVNFX0RJU1BFUlNJT04iOiIiLGUuaXJpZGVzY2VuY2U/IiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFIjoiIixlLmlyaWRlc2NlbmNlTWFwPyIjZGVmaW5lIFVTRV9JUklERVNDRU5DRU1BUCI6IiIsZS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD8iI2RlZmluZSBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQIjoiIixlLnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsZS5zcGVjdWxhckNvbG9yTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUl9DT0xPUk1BUCI6IiIsZS5zcGVjdWxhckludGVuc2l0eU1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQIjoiIixlLnJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQIjoiIixlLm1ldGFsbmVzc01hcD8iI2RlZmluZSBVU0VfTUVUQUxORVNTTUFQIjoiIixlLmFscGhhTWFwPyIjZGVmaW5lIFVTRV9BTFBIQU1BUCI6IiIsZS5hbHBoYVRlc3Q/IiNkZWZpbmUgVVNFX0FMUEhBVEVTVCI6IiIsZS5hbHBoYUhhc2g/IiNkZWZpbmUgVVNFX0FMUEhBSEFTSCI6IiIsZS5zaGVlbj8iI2RlZmluZSBVU0VfU0hFRU4iOiIiLGUuc2hlZW5Db2xvck1hcD8iI2RlZmluZSBVU0VfU0hFRU5fQ09MT1JNQVAiOiIiLGUuc2hlZW5Sb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1NIRUVOX1JPVUdITkVTU01BUCI6IiIsZS50cmFuc21pc3Npb24/IiNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTiI6IiIsZS50cmFuc21pc3Npb25NYXA/IiNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTk1BUCI6IiIsZS50aGlja25lc3NNYXA/IiNkZWZpbmUgVVNFX1RISUNLTkVTU01BUCI6IiIsZS52ZXJ0ZXhUYW5nZW50cyYmZS5mbGF0U2hhZGluZz09PSExPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoiIixlLnZlcnRleENvbG9yc3x8ZS5pbnN0YW5jaW5nQ29sb3J8fGUuYmF0Y2hpbmdDb2xvcj8iI2RlZmluZSBVU0VfQ09MT1IiOiIiLGUudmVydGV4QWxwaGFzPyIjZGVmaW5lIFVTRV9DT0xPUl9BTFBIQSI6IiIsZS52ZXJ0ZXhVdjFzPyIjZGVmaW5lIFVTRV9VVjEiOiIiLGUudmVydGV4VXYycz8iI2RlZmluZSBVU0VfVVYyIjoiIixlLnZlcnRleFV2M3M/IiNkZWZpbmUgVVNFX1VWMyI6IiIsZS5wb2ludHNVdnM/IiNkZWZpbmUgVVNFX1BPSU5UU19VViI6IiIsZS5ncmFkaWVudE1hcD8iI2RlZmluZSBVU0VfR1JBRElFTlRNQVAiOiIiLGUuZmxhdFNoYWRpbmc/IiNkZWZpbmUgRkxBVF9TSEFERUQiOiIiLGUuZG91YmxlU2lkZWQ/IiNkZWZpbmUgRE9VQkxFX1NJREVEIjoiIixlLmZsaXBTaWRlZD8iI2RlZmluZSBGTElQX1NJREVEIjoiIixlLnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgVVNFX1NIQURPV01BUCI6IiIsZS5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lICIrYzoiIixlLnByZW11bHRpcGxpZWRBbHBoYT8iI2RlZmluZSBQUkVNVUxUSVBMSUVEX0FMUEhBIjoiIixlLm51bUxpZ2h0UHJvYmVzPjA/IiNkZWZpbmUgVVNFX0xJR0hUX1BST0JFUyI6IiIsZS5kZWNvZGVWaWRlb1RleHR1cmU/IiNkZWZpbmUgREVDT0RFX1ZJREVPX1RFWFRVUkUiOiIiLGUuZGVjb2RlVmlkZW9UZXh0dXJlRW1pc3NpdmU/IiNkZWZpbmUgREVDT0RFX1ZJREVPX1RFWFRVUkVfRU1JU1NJVkUiOiIiLGUubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUYiOiIiLGUucmV2ZXJzZURlcHRoQnVmZmVyPyIjZGVmaW5lIFVTRV9SRVZFUlNFREVQVEhCVUYiOiIiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247IiwidW5pZm9ybSBib29sIGlzT3J0aG9ncmFwaGljOyIsZS50b25lTWFwcGluZyE9PUlpPyIjZGVmaW5lIFRPTkVfTUFQUElORyI6IiIsZS50b25lTWFwcGluZyE9PUlpP0t0LnRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiIsZS50b25lTWFwcGluZyE9PUlpP1NUKCJ0b25lTWFwcGluZyIsZS50b25lTWFwcGluZyk6IiIsZS5kaXRoZXJpbmc/IiNkZWZpbmUgRElUSEVSSU5HIjoiIixlLm9wYXF1ZT8iI2RlZmluZSBPUEFRVUUiOiIiLEt0LmNvbG9yc3BhY2VfcGFyc19mcmFnbWVudCxNVCgibGluZWFyVG9PdXRwdXRUZXhlbCIsZS5vdXRwdXRDb2xvclNwYWNlKSxiVCgpLGUudXNlRGVwdGhQYWNraW5nPyIjZGVmaW5lIERFUFRIX1BBQ0tJTkcgIitlLmRlcHRoUGFja2luZzoiIixgCmBdLmZpbHRlcihBYSkuam9pbihgCmApKSxvPXdkKG8pLG89UngobyxlKSxvPUl4KG8sZSksYT13ZChhKSxhPVJ4KGEsZSksYT1JeChhLGUpLG89UHgobyksYT1QeChhKSxlLmlzUmF3U2hhZGVyTWF0ZXJpYWwhPT0hMCYmKHY9YCN2ZXJzaW9uIDMwMCBlcwpgLGc9W2QsIiNkZWZpbmUgYXR0cmlidXRlIGluIiwiI2RlZmluZSB2YXJ5aW5nIG91dCIsIiNkZWZpbmUgdGV4dHVyZTJEIHRleHR1cmUiXS5qb2luKGAKYCkrYApgK2csbT1bIiNkZWZpbmUgdmFyeWluZyBpbiIsZS5nbHNsVmVyc2lvbj09PW5mPyIiOiJsYXlvdXQobG9jYXRpb24gPSAwKSBvdXQgaGlnaHAgdmVjNCBwY19mcmFnQ29sb3I7IixlLmdsc2xWZXJzaW9uPT09bmY/IiI6IiNkZWZpbmUgZ2xfRnJhZ0NvbG9yIHBjX2ZyYWdDb2xvciIsIiNkZWZpbmUgZ2xfRnJhZ0RlcHRoRVhUIGdsX0ZyYWdEZXB0aCIsIiNkZWZpbmUgdGV4dHVyZTJEIHRleHR1cmUiLCIjZGVmaW5lIHRleHR1cmVDdWJlIHRleHR1cmUiLCIjZGVmaW5lIHRleHR1cmUyRFByb2ogdGV4dHVyZVByb2oiLCIjZGVmaW5lIHRleHR1cmUyRExvZEVYVCB0ZXh0dXJlTG9kIiwiI2RlZmluZSB0ZXh0dXJlMkRQcm9qTG9kRVhUIHRleHR1cmVQcm9qTG9kIiwiI2RlZmluZSB0ZXh0dXJlQ3ViZUxvZEVYVCB0ZXh0dXJlTG9kIiwiI2RlZmluZSB0ZXh0dXJlMkRHcmFkRVhUIHRleHR1cmVHcmFkIiwiI2RlZmluZSB0ZXh0dXJlMkRQcm9qR3JhZEVYVCB0ZXh0dXJlUHJvakdyYWQiLCIjZGVmaW5lIHRleHR1cmVDdWJlR3JhZEVYVCB0ZXh0dXJlR3JhZCJdLmpvaW4oYApgKStgCmArbSk7Y29uc3QgeT12K2crbyxfPXYrbSthLFM9VHgoaSxpLlZFUlRFWF9TSEFERVIseSksdz1UeChpLGkuRlJBR01FTlRfU0hBREVSLF8pO2kuYXR0YWNoU2hhZGVyKHgsUyksaS5hdHRhY2hTaGFkZXIoeCx3KSxlLmluZGV4MEF0dHJpYnV0ZU5hbWUhPT12b2lkIDA/aS5iaW5kQXR0cmliTG9jYXRpb24oeCwwLGUuaW5kZXgwQXR0cmlidXRlTmFtZSk6ZS5tb3JwaFRhcmdldHM9PT0hMCYmaS5iaW5kQXR0cmliTG9jYXRpb24oeCwwLCJwb3NpdGlvbiIpLGkubGlua1Byb2dyYW0oeCk7ZnVuY3Rpb24gQShFKXtpZihyLmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzKXtjb25zdCBEPWkuZ2V0UHJvZ3JhbUluZm9Mb2coeCkudHJpbSgpLEw9aS5nZXRTaGFkZXJJbmZvTG9nKFMpLnRyaW0oKSxGPWkuZ2V0U2hhZGVySW5mb0xvZyh3KS50cmltKCk7bGV0IE49ITAsTz0hMDtpZihpLmdldFByb2dyYW1QYXJhbWV0ZXIoeCxpLkxJTktfU1RBVFVTKT09PSExKWlmKE49ITEsdHlwZW9mIHIuZGVidWcub25TaGFkZXJFcnJvcj09ImZ1bmN0aW9uIilyLmRlYnVnLm9uU2hhZGVyRXJyb3IoaSx4LFMsdyk7ZWxzZXtjb25zdCBIPUN4KGksUywidmVydGV4Iiksej1DeChpLHcsImZyYWdtZW50Iik7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xQcm9ncmFtOiBTaGFkZXIgRXJyb3IgIitpLmdldEVycm9yKCkrIiAtIFZBTElEQVRFX1NUQVRVUyAiK2kuZ2V0UHJvZ3JhbVBhcmFtZXRlcih4LGkuVkFMSURBVEVfU1RBVFVTKStgCgpNYXRlcmlhbCBOYW1lOiBgK0UubmFtZStgCk1hdGVyaWFsIFR5cGU6IGArRS50eXBlK2AKClByb2dyYW0gSW5mbyBMb2c6IGArRCtgCmArSCtgCmAreil9ZWxzZSBEIT09IiI/Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IFByb2dyYW0gSW5mbyBMb2c6IixEKTooTD09PSIifHxGPT09IiIpJiYoTz0hMSk7TyYmKEUuZGlhZ25vc3RpY3M9e3J1bm5hYmxlOk4scHJvZ3JhbUxvZzpELHZlcnRleFNoYWRlcjp7bG9nOkwscHJlZml4Omd9LGZyYWdtZW50U2hhZGVyOntsb2c6RixwcmVmaXg6bX19KX1pLmRlbGV0ZVNoYWRlcihTKSxpLmRlbGV0ZVNoYWRlcih3KSxUPW5ldyBndShpLHgpLGI9VFQoaSx4KX1sZXQgVDt0aGlzLmdldFVuaWZvcm1zPWZ1bmN0aW9uKCl7cmV0dXJuIFQ9PT12b2lkIDAmJkEodGhpcyksVH07bGV0IGI7dGhpcy5nZXRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGI9PT12b2lkIDAmJkEodGhpcyksYn07bGV0IE09ZS5yZW5kZXJlckV4dGVuc2lvblBhcmFsbGVsU2hhZGVyQ29tcGlsZT09PSExO3JldHVybiB0aGlzLmlzUmVhZHk9ZnVuY3Rpb24oKXtyZXR1cm4gTT09PSExJiYoTT1pLmdldFByb2dyYW1QYXJhbWV0ZXIoeCx4VCkpLE19LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe24ucmVsZWFzZVN0YXRlc09mUHJvZ3JhbSh0aGlzKSxpLmRlbGV0ZVByb2dyYW0oeCksdGhpcy5wcm9ncmFtPXZvaWQgMH0sdGhpcy50eXBlPWUuc2hhZGVyVHlwZSx0aGlzLm5hbWU9ZS5zaGFkZXJOYW1lLHRoaXMuaWQ9X1QrKyx0aGlzLmNhY2hlS2V5PXQsdGhpcy51c2VkVGltZXM9MSx0aGlzLnByb2dyYW09eCx0aGlzLnZlcnRleFNoYWRlcj1TLHRoaXMuZnJhZ21lbnRTaGFkZXI9dyx0aGlzfWxldCBPVD0wO2NsYXNzIHpUe2NvbnN0cnVjdG9yKCl7dGhpcy5zaGFkZXJDYWNoZT1uZXcgTWFwLHRoaXMubWF0ZXJpYWxDYWNoZT1uZXcgTWFwfXVwZGF0ZSh0KXtjb25zdCBlPXQudmVydGV4U2hhZGVyLG49dC5mcmFnbWVudFNoYWRlcixpPXRoaXMuX2dldFNoYWRlclN0YWdlKGUpLHM9dGhpcy5fZ2V0U2hhZGVyU3RhZ2Uobiksbz10aGlzLl9nZXRTaGFkZXJDYWNoZUZvck1hdGVyaWFsKHQpO3JldHVybiBvLmhhcyhpKT09PSExJiYoby5hZGQoaSksaS51c2VkVGltZXMrKyksby5oYXMocyk9PT0hMSYmKG8uYWRkKHMpLHMudXNlZFRpbWVzKyspLHRoaXN9cmVtb3ZlKHQpe2NvbnN0IGU9dGhpcy5tYXRlcmlhbENhY2hlLmdldCh0KTtmb3IoY29uc3QgbiBvZiBlKW4udXNlZFRpbWVzLS0sbi51c2VkVGltZXM9PT0wJiZ0aGlzLnNoYWRlckNhY2hlLmRlbGV0ZShuLmNvZGUpO3JldHVybiB0aGlzLm1hdGVyaWFsQ2FjaGUuZGVsZXRlKHQpLHRoaXN9Z2V0VmVydGV4U2hhZGVySUQodCl7cmV0dXJuIHRoaXMuX2dldFNoYWRlclN0YWdlKHQudmVydGV4U2hhZGVyKS5pZH1nZXRGcmFnbWVudFNoYWRlcklEKHQpe3JldHVybiB0aGlzLl9nZXRTaGFkZXJTdGFnZSh0LmZyYWdtZW50U2hhZGVyKS5pZH1kaXNwb3NlKCl7dGhpcy5zaGFkZXJDYWNoZS5jbGVhcigpLHRoaXMubWF0ZXJpYWxDYWNoZS5jbGVhcigpfV9nZXRTaGFkZXJDYWNoZUZvck1hdGVyaWFsKHQpe2NvbnN0IGU9dGhpcy5tYXRlcmlhbENhY2hlO2xldCBuPWUuZ2V0KHQpO3JldHVybiBuPT09dm9pZCAwJiYobj1uZXcgU2V0LGUuc2V0KHQsbikpLG59X2dldFNoYWRlclN0YWdlKHQpe2NvbnN0IGU9dGhpcy5zaGFkZXJDYWNoZTtsZXQgbj1lLmdldCh0KTtyZXR1cm4gbj09PXZvaWQgMCYmKG49bmV3IGtUKHQpLGUuc2V0KHQsbikpLG59fWNsYXNzIGtUe2NvbnN0cnVjdG9yKHQpe3RoaXMuaWQ9T1QrKyx0aGlzLmNvZGU9dCx0aGlzLnVzZWRUaW1lcz0wfX1mdW5jdGlvbiBWVChyLHQsZSxuLGkscyxvKXtjb25zdCBhPW5ldyBpbCxjPW5ldyB6VCxsPW5ldyBTZXQsdT1bXSxoPWkubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixmPWkudmVydGV4VGV4dHVyZXM7bGV0IGQ9aS5wcmVjaXNpb247Y29uc3QgcD17TWVzaERlcHRoTWF0ZXJpYWw6ImRlcHRoIixNZXNoRGlzdGFuY2VNYXRlcmlhbDoiZGlzdGFuY2VSR0JBIixNZXNoTm9ybWFsTWF0ZXJpYWw6Im5vcm1hbCIsTWVzaEJhc2ljTWF0ZXJpYWw6ImJhc2ljIixNZXNoTGFtYmVydE1hdGVyaWFsOiJsYW1iZXJ0IixNZXNoUGhvbmdNYXRlcmlhbDoicGhvbmciLE1lc2hUb29uTWF0ZXJpYWw6InRvb24iLE1lc2hTdGFuZGFyZE1hdGVyaWFsOiJwaHlzaWNhbCIsTWVzaFBoeXNpY2FsTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoTWF0Y2FwTWF0ZXJpYWw6Im1hdGNhcCIsTGluZUJhc2ljTWF0ZXJpYWw6ImJhc2ljIixMaW5lRGFzaGVkTWF0ZXJpYWw6ImRhc2hlZCIsUG9pbnRzTWF0ZXJpYWw6InBvaW50cyIsU2hhZG93TWF0ZXJpYWw6InNoYWRvdyIsU3ByaXRlTWF0ZXJpYWw6InNwcml0ZSJ9O2Z1bmN0aW9uIHgoYil7cmV0dXJuIGwuYWRkKGIpLGI9PT0wPyJ1diI6YHV2JHtifWB9ZnVuY3Rpb24gZyhiLE0sRSxELEwpe2NvbnN0IEY9RC5mb2csTj1MLmdlb21ldHJ5LE89Yi5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP0QuZW52aXJvbm1lbnQ6bnVsbCxIPShiLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/ZTp0KS5nZXQoYi5lbnZNYXB8fE8pLHo9SCYmSC5tYXBwaW5nPT09YnM/SC5pbWFnZS5oZWlnaHQ6bnVsbCxRPXBbYi50eXBlXTtiLnByZWNpc2lvbiE9PW51bGwmJihkPWkuZ2V0TWF4UHJlY2lzaW9uKGIucHJlY2lzaW9uKSxkIT09Yi5wcmVjaXNpb24mJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6IixiLnByZWNpc2lvbiwibm90IHN1cHBvcnRlZCwgdXNpbmciLGQsImluc3RlYWQuIikpO2NvbnN0IHN0PU4ubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9ufHxOLm1vcnBoQXR0cmlidXRlcy5ub3JtYWx8fE4ubW9ycGhBdHRyaWJ1dGVzLmNvbG9yLGZ0PXN0IT09dm9pZCAwP3N0Lmxlbmd0aDowO2xldCBSdD0wO04ubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uIT09dm9pZCAwJiYoUnQ9MSksTi5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsIT09dm9pZCAwJiYoUnQ9MiksTi5tb3JwaEF0dHJpYnV0ZXMuY29sb3IhPT12b2lkIDAmJihSdD0zKTtsZXQgRnQsSyxvdCxNdDtpZihRKXtjb25zdCBtZT1saVtRXTtGdD1tZS52ZXJ0ZXhTaGFkZXIsSz1tZS5mcmFnbWVudFNoYWRlcn1lbHNlIEZ0PWIudmVydGV4U2hhZGVyLEs9Yi5mcmFnbWVudFNoYWRlcixjLnVwZGF0ZShiKSxvdD1jLmdldFZlcnRleFNoYWRlcklEKGIpLE10PWMuZ2V0RnJhZ21lbnRTaGFkZXJJRChiKTtjb25zdCBkdD1yLmdldFJlbmRlclRhcmdldCgpLEl0PXIuc3RhdGUuYnVmZmVycy5kZXB0aC5nZXRSZXZlcnNlZCgpLCR0PUwuaXNJbnN0YW5jZWRNZXNoPT09ITAsUHQ9TC5pc0JhdGNoZWRNZXNoPT09ITAsX2U9ISFiLm1hcCxxdD0hIWIubWF0Y2FwLEJ0PSEhSCxVPSEhYi5hb01hcCxsdD0hIWIubGlnaHRNYXAsZXQ9ISFiLmJ1bXBNYXAsYXQ9ISFiLm5vcm1hbE1hcCx0dD0hIWIuZGlzcGxhY2VtZW50TWFwLEV0PSEhYi5lbWlzc2l2ZU1hcCxYPSEhYi5tZXRhbG5lc3NNYXAsUj0hIWIucm91Z2huZXNzTWFwLEM9Yi5hbmlzb3Ryb3B5PjAsQj1iLmNsZWFyY29hdD4wLFY9Yi5kaXNwZXJzaW9uPjAsSj1iLmlyaWRlc2NlbmNlPjAsJD1iLnNoZWVuPjAsdXQ9Yi50cmFuc21pc3Npb24+MCxydD1DJiYhIWIuYW5pc290cm9weU1hcCxtdD1CJiYhIWIuY2xlYXJjb2F0TWFwLEF0PUImJiEhYi5jbGVhcmNvYXROb3JtYWxNYXAsaXQ9QiYmISFiLmNsZWFyY29hdFJvdWdobmVzc01hcCxodD1KJiYhIWIuaXJpZGVzY2VuY2VNYXAsTHQ9SiYmISFiLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLHp0PSQmJiEhYi5zaGVlbkNvbG9yTWFwLGJ0PSQmJiEhYi5zaGVlblJvdWdobmVzc01hcCxlZT0hIWIuc3BlY3VsYXJNYXAsWnQ9ISFiLnNwZWN1bGFyQ29sb3JNYXAscGU9ISFiLnNwZWN1bGFySW50ZW5zaXR5TWFwLGs9dXQmJiEhYi50cmFuc21pc3Npb25NYXAseHQ9dXQmJiEhYi50aGlja25lc3NNYXAsaj0hIWIuZ3JhZGllbnRNYXAsbnQ9ISFiLmFscGhhTWFwLFN0PWIuYWxwaGFUZXN0PjAsX3Q9ISFiLmFscGhhSGFzaCxqdD0hIWIuZXh0ZW5zaW9ucztsZXQgSWU9SWk7Yi50b25lTWFwcGVkJiYoZHQ9PT1udWxsfHxkdC5pc1hSUmVuZGVyVGFyZ2V0PT09ITApJiYoSWU9ci50b25lTWFwcGluZyk7Y29uc3QgZW49e3NoYWRlcklEOlEsc2hhZGVyVHlwZTpiLnR5cGUsc2hhZGVyTmFtZTpiLm5hbWUsdmVydGV4U2hhZGVyOkZ0LGZyYWdtZW50U2hhZGVyOkssZGVmaW5lczpiLmRlZmluZXMsY3VzdG9tVmVydGV4U2hhZGVySUQ6b3QsY3VzdG9tRnJhZ21lbnRTaGFkZXJJRDpNdCxpc1Jhd1NoYWRlck1hdGVyaWFsOmIuaXNSYXdTaGFkZXJNYXRlcmlhbD09PSEwLGdsc2xWZXJzaW9uOmIuZ2xzbFZlcnNpb24scHJlY2lzaW9uOmQsYmF0Y2hpbmc6UHQsYmF0Y2hpbmdDb2xvcjpQdCYmTC5fY29sb3JzVGV4dHVyZSE9PW51bGwsaW5zdGFuY2luZzokdCxpbnN0YW5jaW5nQ29sb3I6JHQmJkwuaW5zdGFuY2VDb2xvciE9PW51bGwsaW5zdGFuY2luZ01vcnBoOiR0JiZMLm1vcnBoVGV4dHVyZSE9PW51bGwsc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczpmLG91dHB1dENvbG9yU3BhY2U6ZHQ9PT1udWxsP3Iub3V0cHV0Q29sb3JTcGFjZTpkdC5pc1hSUmVuZGVyVGFyZ2V0PT09ITA/ZHQudGV4dHVyZS5jb2xvclNwYWNlOkRyLGFscGhhVG9Db3ZlcmFnZTohIWIuYWxwaGFUb0NvdmVyYWdlLG1hcDpfZSxtYXRjYXA6cXQsZW52TWFwOkJ0LGVudk1hcE1vZGU6QnQmJkgubWFwcGluZyxlbnZNYXBDdWJlVVZIZWlnaHQ6eixhb01hcDpVLGxpZ2h0TWFwOmx0LGJ1bXBNYXA6ZXQsbm9ybWFsTWFwOmF0LGRpc3BsYWNlbWVudE1hcDpmJiZ0dCxlbWlzc2l2ZU1hcDpFdCxub3JtYWxNYXBPYmplY3RTcGFjZTphdCYmYi5ub3JtYWxNYXBUeXBlPT09T20sbm9ybWFsTWFwVGFuZ2VudFNwYWNlOmF0JiZiLm5vcm1hbE1hcFR5cGU9PT1vcixtZXRhbG5lc3NNYXA6WCxyb3VnaG5lc3NNYXA6Uixhbmlzb3Ryb3B5OkMsYW5pc290cm9weU1hcDpydCxjbGVhcmNvYXQ6QixjbGVhcmNvYXRNYXA6bXQsY2xlYXJjb2F0Tm9ybWFsTWFwOkF0LGNsZWFyY29hdFJvdWdobmVzc01hcDppdCxkaXNwZXJzaW9uOlYsaXJpZGVzY2VuY2U6SixpcmlkZXNjZW5jZU1hcDpodCxpcmlkZXNjZW5jZVRoaWNrbmVzc01hcDpMdCxzaGVlbjokLHNoZWVuQ29sb3JNYXA6enQsc2hlZW5Sb3VnaG5lc3NNYXA6YnQsc3BlY3VsYXJNYXA6ZWUsc3BlY3VsYXJDb2xvck1hcDpadCxzcGVjdWxhckludGVuc2l0eU1hcDpwZSx0cmFuc21pc3Npb246dXQsdHJhbnNtaXNzaW9uTWFwOmssdGhpY2tuZXNzTWFwOnh0LGdyYWRpZW50TWFwOmosb3BhcXVlOmIudHJhbnNwYXJlbnQ9PT0hMSYmYi5ibGVuZGluZz09PVJyJiZiLmFscGhhVG9Db3ZlcmFnZT09PSExLGFscGhhTWFwOm50LGFscGhhVGVzdDpTdCxhbHBoYUhhc2g6X3QsY29tYmluZTpiLmNvbWJpbmUsbWFwVXY6X2UmJngoYi5tYXAuY2hhbm5lbCksYW9NYXBVdjpVJiZ4KGIuYW9NYXAuY2hhbm5lbCksbGlnaHRNYXBVdjpsdCYmeChiLmxpZ2h0TWFwLmNoYW5uZWwpLGJ1bXBNYXBVdjpldCYmeChiLmJ1bXBNYXAuY2hhbm5lbCksbm9ybWFsTWFwVXY6YXQmJngoYi5ub3JtYWxNYXAuY2hhbm5lbCksZGlzcGxhY2VtZW50TWFwVXY6dHQmJngoYi5kaXNwbGFjZW1lbnRNYXAuY2hhbm5lbCksZW1pc3NpdmVNYXBVdjpFdCYmeChiLmVtaXNzaXZlTWFwLmNoYW5uZWwpLG1ldGFsbmVzc01hcFV2OlgmJngoYi5tZXRhbG5lc3NNYXAuY2hhbm5lbCkscm91Z2huZXNzTWFwVXY6UiYmeChiLnJvdWdobmVzc01hcC5jaGFubmVsKSxhbmlzb3Ryb3B5TWFwVXY6cnQmJngoYi5hbmlzb3Ryb3B5TWFwLmNoYW5uZWwpLGNsZWFyY29hdE1hcFV2Om10JiZ4KGIuY2xlYXJjb2F0TWFwLmNoYW5uZWwpLGNsZWFyY29hdE5vcm1hbE1hcFV2OkF0JiZ4KGIuY2xlYXJjb2F0Tm9ybWFsTWFwLmNoYW5uZWwpLGNsZWFyY29hdFJvdWdobmVzc01hcFV2Oml0JiZ4KGIuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmNoYW5uZWwpLGlyaWRlc2NlbmNlTWFwVXY6aHQmJngoYi5pcmlkZXNjZW5jZU1hcC5jaGFubmVsKSxpcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2Okx0JiZ4KGIuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuY2hhbm5lbCksc2hlZW5Db2xvck1hcFV2Onp0JiZ4KGIuc2hlZW5Db2xvck1hcC5jaGFubmVsKSxzaGVlblJvdWdobmVzc01hcFV2OmJ0JiZ4KGIuc2hlZW5Sb3VnaG5lc3NNYXAuY2hhbm5lbCksc3BlY3VsYXJNYXBVdjplZSYmeChiLnNwZWN1bGFyTWFwLmNoYW5uZWwpLHNwZWN1bGFyQ29sb3JNYXBVdjpadCYmeChiLnNwZWN1bGFyQ29sb3JNYXAuY2hhbm5lbCksc3BlY3VsYXJJbnRlbnNpdHlNYXBVdjpwZSYmeChiLnNwZWN1bGFySW50ZW5zaXR5TWFwLmNoYW5uZWwpLHRyYW5zbWlzc2lvbk1hcFV2OmsmJngoYi50cmFuc21pc3Npb25NYXAuY2hhbm5lbCksdGhpY2tuZXNzTWFwVXY6eHQmJngoYi50aGlja25lc3NNYXAuY2hhbm5lbCksYWxwaGFNYXBVdjpudCYmeChiLmFscGhhTWFwLmNoYW5uZWwpLHZlcnRleFRhbmdlbnRzOiEhTi5hdHRyaWJ1dGVzLnRhbmdlbnQmJihhdHx8QyksdmVydGV4Q29sb3JzOmIudmVydGV4Q29sb3JzLHZlcnRleEFscGhhczpiLnZlcnRleENvbG9ycz09PSEwJiYhIU4uYXR0cmlidXRlcy5jb2xvciYmTi5hdHRyaWJ1dGVzLmNvbG9yLml0ZW1TaXplPT09NCxwb2ludHNVdnM6TC5pc1BvaW50cz09PSEwJiYhIU4uYXR0cmlidXRlcy51diYmKF9lfHxudCksZm9nOiEhRix1c2VGb2c6Yi5mb2c9PT0hMCxmb2dFeHAyOiEhRiYmRi5pc0ZvZ0V4cDIsZmxhdFNoYWRpbmc6Yi5mbGF0U2hhZGluZz09PSEwLHNpemVBdHRlbnVhdGlvbjpiLnNpemVBdHRlbnVhdGlvbj09PSEwLGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6aCxyZXZlcnNlRGVwdGhCdWZmZXI6SXQsc2tpbm5pbmc6TC5pc1NraW5uZWRNZXNoPT09ITAsbW9ycGhUYXJnZXRzOk4ubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uIT09dm9pZCAwLG1vcnBoTm9ybWFsczpOLm1vcnBoQXR0cmlidXRlcy5ub3JtYWwhPT12b2lkIDAsbW9ycGhDb2xvcnM6Ti5tb3JwaEF0dHJpYnV0ZXMuY29sb3IhPT12b2lkIDAsbW9ycGhUYXJnZXRzQ291bnQ6ZnQsbW9ycGhUZXh0dXJlU3RyaWRlOlJ0LG51bURpckxpZ2h0czpNLmRpcmVjdGlvbmFsLmxlbmd0aCxudW1Qb2ludExpZ2h0czpNLnBvaW50Lmxlbmd0aCxudW1TcG90TGlnaHRzOk0uc3BvdC5sZW5ndGgsbnVtU3BvdExpZ2h0TWFwczpNLnNwb3RMaWdodE1hcC5sZW5ndGgsbnVtUmVjdEFyZWFMaWdodHM6TS5yZWN0QXJlYS5sZW5ndGgsbnVtSGVtaUxpZ2h0czpNLmhlbWkubGVuZ3RoLG51bURpckxpZ2h0U2hhZG93czpNLmRpcmVjdGlvbmFsU2hhZG93TWFwLmxlbmd0aCxudW1Qb2ludExpZ2h0U2hhZG93czpNLnBvaW50U2hhZG93TWFwLmxlbmd0aCxudW1TcG90TGlnaHRTaGFkb3dzOk0uc3BvdFNoYWRvd01hcC5sZW5ndGgsbnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzOk0ubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzLG51bUxpZ2h0UHJvYmVzOk0ubnVtTGlnaHRQcm9iZXMsbnVtQ2xpcHBpbmdQbGFuZXM6by5udW1QbGFuZXMsbnVtQ2xpcEludGVyc2VjdGlvbjpvLm51bUludGVyc2VjdGlvbixkaXRoZXJpbmc6Yi5kaXRoZXJpbmcsc2hhZG93TWFwRW5hYmxlZDpyLnNoYWRvd01hcC5lbmFibGVkJiZFLmxlbmd0aD4wLHNoYWRvd01hcFR5cGU6ci5zaGFkb3dNYXAudHlwZSx0b25lTWFwcGluZzpJZSxkZWNvZGVWaWRlb1RleHR1cmU6X2UmJmIubWFwLmlzVmlkZW9UZXh0dXJlPT09ITAmJm5lLmdldFRyYW5zZmVyKGIubWFwLmNvbG9yU3BhY2UpPT09ZGUsZGVjb2RlVmlkZW9UZXh0dXJlRW1pc3NpdmU6RXQmJmIuZW1pc3NpdmVNYXAuaXNWaWRlb1RleHR1cmU9PT0hMCYmbmUuZ2V0VHJhbnNmZXIoYi5lbWlzc2l2ZU1hcC5jb2xvclNwYWNlKT09PWRlLHByZW11bHRpcGxpZWRBbHBoYTpiLnByZW11bHRpcGxpZWRBbHBoYSxkb3VibGVTaWRlZDpiLnNpZGU9PT1QbixmbGlwU2lkZWQ6Yi5zaWRlPT09WWUsdXNlRGVwdGhQYWNraW5nOmIuZGVwdGhQYWNraW5nPj0wLGRlcHRoUGFja2luZzpiLmRlcHRoUGFja2luZ3x8MCxpbmRleDBBdHRyaWJ1dGVOYW1lOmIuaW5kZXgwQXR0cmlidXRlTmFtZSxleHRlbnNpb25DbGlwQ3VsbERpc3RhbmNlOmp0JiZiLmV4dGVuc2lvbnMuY2xpcEN1bGxEaXN0YW5jZT09PSEwJiZuLmhhcygiV0VCR0xfY2xpcF9jdWxsX2Rpc3RhbmNlIiksZXh0ZW5zaW9uTXVsdGlEcmF3OihqdCYmYi5leHRlbnNpb25zLm11bHRpRHJhdz09PSEwfHxQdCkmJm4uaGFzKCJXRUJHTF9tdWx0aV9kcmF3IikscmVuZGVyZXJFeHRlbnNpb25QYXJhbGxlbFNoYWRlckNvbXBpbGU6bi5oYXMoIktIUl9wYXJhbGxlbF9zaGFkZXJfY29tcGlsZSIpLGN1c3RvbVByb2dyYW1DYWNoZUtleTpiLmN1c3RvbVByb2dyYW1DYWNoZUtleSgpfTtyZXR1cm4gZW4udmVydGV4VXYxcz1sLmhhcygxKSxlbi52ZXJ0ZXhVdjJzPWwuaGFzKDIpLGVuLnZlcnRleFV2M3M9bC5oYXMoMyksbC5jbGVhcigpLGVufWZ1bmN0aW9uIG0oYil7Y29uc3QgTT1bXTtpZihiLnNoYWRlcklEP00ucHVzaChiLnNoYWRlcklEKTooTS5wdXNoKGIuY3VzdG9tVmVydGV4U2hhZGVySUQpLE0ucHVzaChiLmN1c3RvbUZyYWdtZW50U2hhZGVySUQpKSxiLmRlZmluZXMhPT12b2lkIDApZm9yKGNvbnN0IEUgaW4gYi5kZWZpbmVzKU0ucHVzaChFKSxNLnB1c2goYi5kZWZpbmVzW0VdKTtyZXR1cm4gYi5pc1Jhd1NoYWRlck1hdGVyaWFsPT09ITEmJih2KE0sYikseShNLGIpLE0ucHVzaChyLm91dHB1dENvbG9yU3BhY2UpKSxNLnB1c2goYi5jdXN0b21Qcm9ncmFtQ2FjaGVLZXkpLE0uam9pbigpfWZ1bmN0aW9uIHYoYixNKXtiLnB1c2goTS5wcmVjaXNpb24pLGIucHVzaChNLm91dHB1dENvbG9yU3BhY2UpLGIucHVzaChNLmVudk1hcE1vZGUpLGIucHVzaChNLmVudk1hcEN1YmVVVkhlaWdodCksYi5wdXNoKE0ubWFwVXYpLGIucHVzaChNLmFscGhhTWFwVXYpLGIucHVzaChNLmxpZ2h0TWFwVXYpLGIucHVzaChNLmFvTWFwVXYpLGIucHVzaChNLmJ1bXBNYXBVdiksYi5wdXNoKE0ubm9ybWFsTWFwVXYpLGIucHVzaChNLmRpc3BsYWNlbWVudE1hcFV2KSxiLnB1c2goTS5lbWlzc2l2ZU1hcFV2KSxiLnB1c2goTS5tZXRhbG5lc3NNYXBVdiksYi5wdXNoKE0ucm91Z2huZXNzTWFwVXYpLGIucHVzaChNLmFuaXNvdHJvcHlNYXBVdiksYi5wdXNoKE0uY2xlYXJjb2F0TWFwVXYpLGIucHVzaChNLmNsZWFyY29hdE5vcm1hbE1hcFV2KSxiLnB1c2goTS5jbGVhcmNvYXRSb3VnaG5lc3NNYXBVdiksYi5wdXNoKE0uaXJpZGVzY2VuY2VNYXBVdiksYi5wdXNoKE0uaXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdiksYi5wdXNoKE0uc2hlZW5Db2xvck1hcFV2KSxiLnB1c2goTS5zaGVlblJvdWdobmVzc01hcFV2KSxiLnB1c2goTS5zcGVjdWxhck1hcFV2KSxiLnB1c2goTS5zcGVjdWxhckNvbG9yTWFwVXYpLGIucHVzaChNLnNwZWN1bGFySW50ZW5zaXR5TWFwVXYpLGIucHVzaChNLnRyYW5zbWlzc2lvbk1hcFV2KSxiLnB1c2goTS50aGlja25lc3NNYXBVdiksYi5wdXNoKE0uY29tYmluZSksYi5wdXNoKE0uZm9nRXhwMiksYi5wdXNoKE0uc2l6ZUF0dGVudWF0aW9uKSxiLnB1c2goTS5tb3JwaFRhcmdldHNDb3VudCksYi5wdXNoKE0ubW9ycGhBdHRyaWJ1dGVDb3VudCksYi5wdXNoKE0ubnVtRGlyTGlnaHRzKSxiLnB1c2goTS5udW1Qb2ludExpZ2h0cyksYi5wdXNoKE0ubnVtU3BvdExpZ2h0cyksYi5wdXNoKE0ubnVtU3BvdExpZ2h0TWFwcyksYi5wdXNoKE0ubnVtSGVtaUxpZ2h0cyksYi5wdXNoKE0ubnVtUmVjdEFyZWFMaWdodHMpLGIucHVzaChNLm51bURpckxpZ2h0U2hhZG93cyksYi5wdXNoKE0ubnVtUG9pbnRMaWdodFNoYWRvd3MpLGIucHVzaChNLm51bVNwb3RMaWdodFNoYWRvd3MpLGIucHVzaChNLm51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwcyksYi5wdXNoKE0ubnVtTGlnaHRQcm9iZXMpLGIucHVzaChNLnNoYWRvd01hcFR5cGUpLGIucHVzaChNLnRvbmVNYXBwaW5nKSxiLnB1c2goTS5udW1DbGlwcGluZ1BsYW5lcyksYi5wdXNoKE0ubnVtQ2xpcEludGVyc2VjdGlvbiksYi5wdXNoKE0uZGVwdGhQYWNraW5nKX1mdW5jdGlvbiB5KGIsTSl7YS5kaXNhYmxlQWxsKCksTS5zdXBwb3J0c1ZlcnRleFRleHR1cmVzJiZhLmVuYWJsZSgwKSxNLmluc3RhbmNpbmcmJmEuZW5hYmxlKDEpLE0uaW5zdGFuY2luZ0NvbG9yJiZhLmVuYWJsZSgyKSxNLmluc3RhbmNpbmdNb3JwaCYmYS5lbmFibGUoMyksTS5tYXRjYXAmJmEuZW5hYmxlKDQpLE0uZW52TWFwJiZhLmVuYWJsZSg1KSxNLm5vcm1hbE1hcE9iamVjdFNwYWNlJiZhLmVuYWJsZSg2KSxNLm5vcm1hbE1hcFRhbmdlbnRTcGFjZSYmYS5lbmFibGUoNyksTS5jbGVhcmNvYXQmJmEuZW5hYmxlKDgpLE0uaXJpZGVzY2VuY2UmJmEuZW5hYmxlKDkpLE0uYWxwaGFUZXN0JiZhLmVuYWJsZSgxMCksTS52ZXJ0ZXhDb2xvcnMmJmEuZW5hYmxlKDExKSxNLnZlcnRleEFscGhhcyYmYS5lbmFibGUoMTIpLE0udmVydGV4VXYxcyYmYS5lbmFibGUoMTMpLE0udmVydGV4VXYycyYmYS5lbmFibGUoMTQpLE0udmVydGV4VXYzcyYmYS5lbmFibGUoMTUpLE0udmVydGV4VGFuZ2VudHMmJmEuZW5hYmxlKDE2KSxNLmFuaXNvdHJvcHkmJmEuZW5hYmxlKDE3KSxNLmFscGhhSGFzaCYmYS5lbmFibGUoMTgpLE0uYmF0Y2hpbmcmJmEuZW5hYmxlKDE5KSxNLmRpc3BlcnNpb24mJmEuZW5hYmxlKDIwKSxNLmJhdGNoaW5nQ29sb3ImJmEuZW5hYmxlKDIxKSxiLnB1c2goYS5tYXNrKSxhLmRpc2FibGVBbGwoKSxNLmZvZyYmYS5lbmFibGUoMCksTS51c2VGb2cmJmEuZW5hYmxlKDEpLE0uZmxhdFNoYWRpbmcmJmEuZW5hYmxlKDIpLE0ubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmYS5lbmFibGUoMyksTS5yZXZlcnNlRGVwdGhCdWZmZXImJmEuZW5hYmxlKDQpLE0uc2tpbm5pbmcmJmEuZW5hYmxlKDUpLE0ubW9ycGhUYXJnZXRzJiZhLmVuYWJsZSg2KSxNLm1vcnBoTm9ybWFscyYmYS5lbmFibGUoNyksTS5tb3JwaENvbG9ycyYmYS5lbmFibGUoOCksTS5wcmVtdWx0aXBsaWVkQWxwaGEmJmEuZW5hYmxlKDkpLE0uc2hhZG93TWFwRW5hYmxlZCYmYS5lbmFibGUoMTApLE0uZG91YmxlU2lkZWQmJmEuZW5hYmxlKDExKSxNLmZsaXBTaWRlZCYmYS5lbmFibGUoMTIpLE0udXNlRGVwdGhQYWNraW5nJiZhLmVuYWJsZSgxMyksTS5kaXRoZXJpbmcmJmEuZW5hYmxlKDE0KSxNLnRyYW5zbWlzc2lvbiYmYS5lbmFibGUoMTUpLE0uc2hlZW4mJmEuZW5hYmxlKDE2KSxNLm9wYXF1ZSYmYS5lbmFibGUoMTcpLE0ucG9pbnRzVXZzJiZhLmVuYWJsZSgxOCksTS5kZWNvZGVWaWRlb1RleHR1cmUmJmEuZW5hYmxlKDE5KSxNLmRlY29kZVZpZGVvVGV4dHVyZUVtaXNzaXZlJiZhLmVuYWJsZSgyMCksTS5hbHBoYVRvQ292ZXJhZ2UmJmEuZW5hYmxlKDIxKSxiLnB1c2goYS5tYXNrKX1mdW5jdGlvbiBfKGIpe2NvbnN0IE09cFtiLnR5cGVdO2xldCBFO2lmKE0pe2NvbnN0IEQ9bGlbTV07RT1kZy5jbG9uZShELnVuaWZvcm1zKX1lbHNlIEU9Yi51bmlmb3JtcztyZXR1cm4gRX1mdW5jdGlvbiBTKGIsTSl7bGV0IEU7Zm9yKGxldCBEPTAsTD11Lmxlbmd0aDtEPEw7RCsrKXtjb25zdCBGPXVbRF07aWYoRi5jYWNoZUtleT09PU0pe0U9RiwrK0UudXNlZFRpbWVzO2JyZWFrfX1yZXR1cm4gRT09PXZvaWQgMCYmKEU9bmV3IEJUKHIsTSxiLHMpLHUucHVzaChFKSksRX1mdW5jdGlvbiB3KGIpe2lmKC0tYi51c2VkVGltZXM9PT0wKXtjb25zdCBNPXUuaW5kZXhPZihiKTt1W01dPXVbdS5sZW5ndGgtMV0sdS5wb3AoKSxiLmRlc3Ryb3koKX19ZnVuY3Rpb24gQShiKXtjLnJlbW92ZShiKX1mdW5jdGlvbiBUKCl7Yy5kaXNwb3NlKCl9cmV0dXJue2dldFBhcmFtZXRlcnM6ZyxnZXRQcm9ncmFtQ2FjaGVLZXk6bSxnZXRVbmlmb3JtczpfLGFjcXVpcmVQcm9ncmFtOlMscmVsZWFzZVByb2dyYW06dyxyZWxlYXNlU2hhZGVyQ2FjaGU6QSxwcm9ncmFtczp1LGRpc3Bvc2U6VH19ZnVuY3Rpb24gR1QoKXtsZXQgcj1uZXcgV2Vha01hcDtmdW5jdGlvbiB0KG8pe3JldHVybiByLmhhcyhvKX1mdW5jdGlvbiBlKG8pe2xldCBhPXIuZ2V0KG8pO3JldHVybiBhPT09dm9pZCAwJiYoYT17fSxyLnNldChvLGEpKSxhfWZ1bmN0aW9uIG4obyl7ci5kZWxldGUobyl9ZnVuY3Rpb24gaShvLGEsYyl7ci5nZXQobylbYV09Y31mdW5jdGlvbiBzKCl7cj1uZXcgV2Vha01hcH1yZXR1cm57aGFzOnQsZ2V0OmUscmVtb3ZlOm4sdXBkYXRlOmksZGlzcG9zZTpzfX1mdW5jdGlvbiBIVChyLHQpe3JldHVybiByLmdyb3VwT3JkZXIhPT10Lmdyb3VwT3JkZXI/ci5ncm91cE9yZGVyLXQuZ3JvdXBPcmRlcjpyLnJlbmRlck9yZGVyIT09dC5yZW5kZXJPcmRlcj9yLnJlbmRlck9yZGVyLXQucmVuZGVyT3JkZXI6ci5tYXRlcmlhbC5pZCE9PXQubWF0ZXJpYWwuaWQ/ci5tYXRlcmlhbC5pZC10Lm1hdGVyaWFsLmlkOnIueiE9PXQuej9yLnotdC56OnIuaWQtdC5pZH1mdW5jdGlvbiBEeChyLHQpe3JldHVybiByLmdyb3VwT3JkZXIhPT10Lmdyb3VwT3JkZXI/ci5ncm91cE9yZGVyLXQuZ3JvdXBPcmRlcjpyLnJlbmRlck9yZGVyIT09dC5yZW5kZXJPcmRlcj9yLnJlbmRlck9yZGVyLXQucmVuZGVyT3JkZXI6ci56IT09dC56P3Quei1yLno6ci5pZC10LmlkfWZ1bmN0aW9uIFV4KCl7Y29uc3Qgcj1bXTtsZXQgdD0wO2NvbnN0IGU9W10sbj1bXSxpPVtdO2Z1bmN0aW9uIHMoKXt0PTAsZS5sZW5ndGg9MCxuLmxlbmd0aD0wLGkubGVuZ3RoPTB9ZnVuY3Rpb24gbyhoLGYsZCxwLHgsZyl7bGV0IG09clt0XTtyZXR1cm4gbT09PXZvaWQgMD8obT17aWQ6aC5pZCxvYmplY3Q6aCxnZW9tZXRyeTpmLG1hdGVyaWFsOmQsZ3JvdXBPcmRlcjpwLHJlbmRlck9yZGVyOmgucmVuZGVyT3JkZXIsejp4LGdyb3VwOmd9LHJbdF09bSk6KG0uaWQ9aC5pZCxtLm9iamVjdD1oLG0uZ2VvbWV0cnk9ZixtLm1hdGVyaWFsPWQsbS5ncm91cE9yZGVyPXAsbS5yZW5kZXJPcmRlcj1oLnJlbmRlck9yZGVyLG0uej14LG0uZ3JvdXA9ZyksdCsrLG19ZnVuY3Rpb24gYShoLGYsZCxwLHgsZyl7Y29uc3QgbT1vKGgsZixkLHAseCxnKTtkLnRyYW5zbWlzc2lvbj4wP24ucHVzaChtKTpkLnRyYW5zcGFyZW50PT09ITA/aS5wdXNoKG0pOmUucHVzaChtKX1mdW5jdGlvbiBjKGgsZixkLHAseCxnKXtjb25zdCBtPW8oaCxmLGQscCx4LGcpO2QudHJhbnNtaXNzaW9uPjA/bi51bnNoaWZ0KG0pOmQudHJhbnNwYXJlbnQ9PT0hMD9pLnVuc2hpZnQobSk6ZS51bnNoaWZ0KG0pfWZ1bmN0aW9uIGwoaCxmKXtlLmxlbmd0aD4xJiZlLnNvcnQoaHx8SFQpLG4ubGVuZ3RoPjEmJm4uc29ydChmfHxEeCksaS5sZW5ndGg+MSYmaS5zb3J0KGZ8fER4KX1mdW5jdGlvbiB1KCl7Zm9yKGxldCBoPXQsZj1yLmxlbmd0aDtoPGY7aCsrKXtjb25zdCBkPXJbaF07aWYoZC5pZD09PW51bGwpYnJlYWs7ZC5pZD1udWxsLGQub2JqZWN0PW51bGwsZC5nZW9tZXRyeT1udWxsLGQubWF0ZXJpYWw9bnVsbCxkLmdyb3VwPW51bGx9fXJldHVybntvcGFxdWU6ZSx0cmFuc21pc3NpdmU6bix0cmFuc3BhcmVudDppLGluaXQ6cyxwdXNoOmEsdW5zaGlmdDpjLGZpbmlzaDp1LHNvcnQ6bH19ZnVuY3Rpb24gV1QoKXtsZXQgcj1uZXcgV2Vha01hcDtmdW5jdGlvbiB0KG4saSl7Y29uc3Qgcz1yLmdldChuKTtsZXQgbztyZXR1cm4gcz09PXZvaWQgMD8obz1uZXcgVXgsci5zZXQobixbb10pKTppPj1zLmxlbmd0aD8obz1uZXcgVXgscy5wdXNoKG8pKTpvPXNbaV0sb31mdW5jdGlvbiBlKCl7cj1uZXcgV2Vha01hcH1yZXR1cm57Z2V0OnQsZGlzcG9zZTplfX1mdW5jdGlvbiBYVCgpe2NvbnN0IHI9e307cmV0dXJue2dldDpmdW5jdGlvbih0KXtpZihyW3QuaWRdIT09dm9pZCAwKXJldHVybiByW3QuaWRdO2xldCBlO3N3aXRjaCh0LnR5cGUpe2Nhc2UiRGlyZWN0aW9uYWxMaWdodCI6ZT17ZGlyZWN0aW9uOm5ldyBJLGNvbG9yOm5ldyB5dH07YnJlYWs7Y2FzZSJTcG90TGlnaHQiOmU9e3Bvc2l0aW9uOm5ldyBJLGRpcmVjdGlvbjpuZXcgSSxjb2xvcjpuZXcgeXQsZGlzdGFuY2U6MCxjb25lQ29zOjAscGVudW1icmFDb3M6MCxkZWNheTowfTticmVhaztjYXNlIlBvaW50TGlnaHQiOmU9e3Bvc2l0aW9uOm5ldyBJLGNvbG9yOm5ldyB5dCxkaXN0YW5jZTowLGRlY2F5OjB9O2JyZWFrO2Nhc2UiSGVtaXNwaGVyZUxpZ2h0IjplPXtkaXJlY3Rpb246bmV3IEksc2t5Q29sb3I6bmV3IHl0LGdyb3VuZENvbG9yOm5ldyB5dH07YnJlYWs7Y2FzZSJSZWN0QXJlYUxpZ2h0IjplPXtjb2xvcjpuZXcgeXQscG9zaXRpb246bmV3IEksaGFsZldpZHRoOm5ldyBJLGhhbGZIZWlnaHQ6bmV3IEl9O2JyZWFrfXJldHVybiByW3QuaWRdPWUsZX19fWZ1bmN0aW9uICRUKCl7Y29uc3Qgcj17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKHQpe2lmKHJbdC5pZF0hPT12b2lkIDApcmV0dXJuIHJbdC5pZF07bGV0IGU7c3dpdGNoKHQudHlwZSl7Y2FzZSJEaXJlY3Rpb25hbExpZ2h0IjplPXtzaGFkb3dJbnRlbnNpdHk6MSxzaGFkb3dCaWFzOjAsc2hhZG93Tm9ybWFsQmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IHF9O2JyZWFrO2Nhc2UiU3BvdExpZ2h0IjplPXtzaGFkb3dJbnRlbnNpdHk6MSxzaGFkb3dCaWFzOjAsc2hhZG93Tm9ybWFsQmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IHF9O2JyZWFrO2Nhc2UiUG9pbnRMaWdodCI6ZT17c2hhZG93SW50ZW5zaXR5OjEsc2hhZG93QmlhczowLHNoYWRvd05vcm1hbEJpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBxLHNoYWRvd0NhbWVyYU5lYXI6MSxzaGFkb3dDYW1lcmFGYXI6MWUzfTticmVha31yZXR1cm4gclt0LmlkXT1lLGV9fX1sZXQgcVQ9MDtmdW5jdGlvbiBZVChyLHQpe3JldHVybih0LmNhc3RTaGFkb3c/MjowKS0oci5jYXN0U2hhZG93PzI6MCkrKHQubWFwPzE6MCktKHIubWFwPzE6MCl9ZnVuY3Rpb24gWlQocil7Y29uc3QgdD1uZXcgWFQsZT0kVCgpLG49e3ZlcnNpb246MCxoYXNoOntkaXJlY3Rpb25hbExlbmd0aDotMSxwb2ludExlbmd0aDotMSxzcG90TGVuZ3RoOi0xLHJlY3RBcmVhTGVuZ3RoOi0xLGhlbWlMZW5ndGg6LTEsbnVtRGlyZWN0aW9uYWxTaGFkb3dzOi0xLG51bVBvaW50U2hhZG93czotMSxudW1TcG90U2hhZG93czotMSxudW1TcG90TWFwczotMSxudW1MaWdodFByb2JlczotMX0sYW1iaWVudDpbMCwwLDBdLHByb2JlOltdLGRpcmVjdGlvbmFsOltdLGRpcmVjdGlvbmFsU2hhZG93OltdLGRpcmVjdGlvbmFsU2hhZG93TWFwOltdLGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OltdLHNwb3Q6W10sc3BvdExpZ2h0TWFwOltdLHNwb3RTaGFkb3c6W10sc3BvdFNoYWRvd01hcDpbXSxzcG90TGlnaHRNYXRyaXg6W10scmVjdEFyZWE6W10scmVjdEFyZWFMVEMxOm51bGwscmVjdEFyZWFMVEMyOm51bGwscG9pbnQ6W10scG9pbnRTaGFkb3c6W10scG9pbnRTaGFkb3dNYXA6W10scG9pbnRTaGFkb3dNYXRyaXg6W10saGVtaTpbXSxudW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHM6MCxudW1MaWdodFByb2JlczowfTtmb3IobGV0IGw9MDtsPDk7bCsrKW4ucHJvYmUucHVzaChuZXcgSSk7Y29uc3QgaT1uZXcgSSxzPW5ldyBDdCxvPW5ldyBDdDtmdW5jdGlvbiBhKGwpe2xldCB1PTAsaD0wLGY9MDtmb3IobGV0IGI9MDtiPDk7YisrKW4ucHJvYmVbYl0uc2V0KDAsMCwwKTtsZXQgZD0wLHA9MCx4PTAsZz0wLG09MCx2PTAseT0wLF89MCxTPTAsdz0wLEE9MDtsLnNvcnQoWVQpO2ZvcihsZXQgYj0wLE09bC5sZW5ndGg7YjxNO2IrKyl7Y29uc3QgRT1sW2JdLEQ9RS5jb2xvcixMPUUuaW50ZW5zaXR5LEY9RS5kaXN0YW5jZSxOPUUuc2hhZG93JiZFLnNoYWRvdy5tYXA/RS5zaGFkb3cubWFwLnRleHR1cmU6bnVsbDtpZihFLmlzQW1iaWVudExpZ2h0KXUrPUQucipMLGgrPUQuZypMLGYrPUQuYipMO2Vsc2UgaWYoRS5pc0xpZ2h0UHJvYmUpe2ZvcihsZXQgTz0wO088OTtPKyspbi5wcm9iZVtPXS5hZGRTY2FsZWRWZWN0b3IoRS5zaC5jb2VmZmljaWVudHNbT10sTCk7QSsrfWVsc2UgaWYoRS5pc0RpcmVjdGlvbmFsTGlnaHQpe2NvbnN0IE89dC5nZXQoRSk7aWYoTy5jb2xvci5jb3B5KEUuY29sb3IpLm11bHRpcGx5U2NhbGFyKEUuaW50ZW5zaXR5KSxFLmNhc3RTaGFkb3cpe2NvbnN0IEg9RS5zaGFkb3csej1lLmdldChFKTt6LnNoYWRvd0ludGVuc2l0eT1ILmludGVuc2l0eSx6LnNoYWRvd0JpYXM9SC5iaWFzLHouc2hhZG93Tm9ybWFsQmlhcz1ILm5vcm1hbEJpYXMsei5zaGFkb3dSYWRpdXM9SC5yYWRpdXMsei5zaGFkb3dNYXBTaXplPUgubWFwU2l6ZSxuLmRpcmVjdGlvbmFsU2hhZG93W2RdPXosbi5kaXJlY3Rpb25hbFNoYWRvd01hcFtkXT1OLG4uZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbZF09RS5zaGFkb3cubWF0cml4LHYrK31uLmRpcmVjdGlvbmFsW2RdPU8sZCsrfWVsc2UgaWYoRS5pc1Nwb3RMaWdodCl7Y29uc3QgTz10LmdldChFKTtPLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihFLm1hdHJpeFdvcmxkKSxPLmNvbG9yLmNvcHkoRCkubXVsdGlwbHlTY2FsYXIoTCksTy5kaXN0YW5jZT1GLE8uY29uZUNvcz1NYXRoLmNvcyhFLmFuZ2xlKSxPLnBlbnVtYnJhQ29zPU1hdGguY29zKEUuYW5nbGUqKDEtRS5wZW51bWJyYSkpLE8uZGVjYXk9RS5kZWNheSxuLnNwb3RbeF09Tztjb25zdCBIPUUuc2hhZG93O2lmKEUubWFwJiYobi5zcG90TGlnaHRNYXBbU109RS5tYXAsUysrLEgudXBkYXRlTWF0cmljZXMoRSksRS5jYXN0U2hhZG93JiZ3KyspLG4uc3BvdExpZ2h0TWF0cml4W3hdPUgubWF0cml4LEUuY2FzdFNoYWRvdyl7Y29uc3Qgej1lLmdldChFKTt6LnNoYWRvd0ludGVuc2l0eT1ILmludGVuc2l0eSx6LnNoYWRvd0JpYXM9SC5iaWFzLHouc2hhZG93Tm9ybWFsQmlhcz1ILm5vcm1hbEJpYXMsei5zaGFkb3dSYWRpdXM9SC5yYWRpdXMsei5zaGFkb3dNYXBTaXplPUgubWFwU2l6ZSxuLnNwb3RTaGFkb3dbeF09eixuLnNwb3RTaGFkb3dNYXBbeF09TixfKyt9eCsrfWVsc2UgaWYoRS5pc1JlY3RBcmVhTGlnaHQpe2NvbnN0IE89dC5nZXQoRSk7Ty5jb2xvci5jb3B5KEQpLm11bHRpcGx5U2NhbGFyKEwpLE8uaGFsZldpZHRoLnNldChFLndpZHRoKi41LDAsMCksTy5oYWxmSGVpZ2h0LnNldCgwLEUuaGVpZ2h0Ki41LDApLG4ucmVjdEFyZWFbZ109TyxnKyt9ZWxzZSBpZihFLmlzUG9pbnRMaWdodCl7Y29uc3QgTz10LmdldChFKTtpZihPLmNvbG9yLmNvcHkoRS5jb2xvcikubXVsdGlwbHlTY2FsYXIoRS5pbnRlbnNpdHkpLE8uZGlzdGFuY2U9RS5kaXN0YW5jZSxPLmRlY2F5PUUuZGVjYXksRS5jYXN0U2hhZG93KXtjb25zdCBIPUUuc2hhZG93LHo9ZS5nZXQoRSk7ei5zaGFkb3dJbnRlbnNpdHk9SC5pbnRlbnNpdHksei5zaGFkb3dCaWFzPUguYmlhcyx6LnNoYWRvd05vcm1hbEJpYXM9SC5ub3JtYWxCaWFzLHouc2hhZG93UmFkaXVzPUgucmFkaXVzLHouc2hhZG93TWFwU2l6ZT1ILm1hcFNpemUsei5zaGFkb3dDYW1lcmFOZWFyPUguY2FtZXJhLm5lYXIsei5zaGFkb3dDYW1lcmFGYXI9SC5jYW1lcmEuZmFyLG4ucG9pbnRTaGFkb3dbcF09eixuLnBvaW50U2hhZG93TWFwW3BdPU4sbi5wb2ludFNoYWRvd01hdHJpeFtwXT1FLnNoYWRvdy5tYXRyaXgseSsrfW4ucG9pbnRbcF09TyxwKyt9ZWxzZSBpZihFLmlzSGVtaXNwaGVyZUxpZ2h0KXtjb25zdCBPPXQuZ2V0KEUpO08uc2t5Q29sb3IuY29weShFLmNvbG9yKS5tdWx0aXBseVNjYWxhcihMKSxPLmdyb3VuZENvbG9yLmNvcHkoRS5ncm91bmRDb2xvcikubXVsdGlwbHlTY2FsYXIoTCksbi5oZW1pW21dPU8sbSsrfX1nPjAmJihyLmhhcygiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik9PT0hMD8obi5yZWN0QXJlYUxUQzE9cHQuTFRDX0ZMT0FUXzEsbi5yZWN0QXJlYUxUQzI9cHQuTFRDX0ZMT0FUXzIpOihuLnJlY3RBcmVhTFRDMT1wdC5MVENfSEFMRl8xLG4ucmVjdEFyZWFMVEMyPXB0LkxUQ19IQUxGXzIpKSxuLmFtYmllbnRbMF09dSxuLmFtYmllbnRbMV09aCxuLmFtYmllbnRbMl09Zjtjb25zdCBUPW4uaGFzaDsoVC5kaXJlY3Rpb25hbExlbmd0aCE9PWR8fFQucG9pbnRMZW5ndGghPT1wfHxULnNwb3RMZW5ndGghPT14fHxULnJlY3RBcmVhTGVuZ3RoIT09Z3x8VC5oZW1pTGVuZ3RoIT09bXx8VC5udW1EaXJlY3Rpb25hbFNoYWRvd3MhPT12fHxULm51bVBvaW50U2hhZG93cyE9PXl8fFQubnVtU3BvdFNoYWRvd3MhPT1ffHxULm51bVNwb3RNYXBzIT09U3x8VC5udW1MaWdodFByb2JlcyE9PUEpJiYobi5kaXJlY3Rpb25hbC5sZW5ndGg9ZCxuLnNwb3QubGVuZ3RoPXgsbi5yZWN0QXJlYS5sZW5ndGg9ZyxuLnBvaW50Lmxlbmd0aD1wLG4uaGVtaS5sZW5ndGg9bSxuLmRpcmVjdGlvbmFsU2hhZG93Lmxlbmd0aD12LG4uZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoPXYsbi5wb2ludFNoYWRvdy5sZW5ndGg9eSxuLnBvaW50U2hhZG93TWFwLmxlbmd0aD15LG4uc3BvdFNoYWRvdy5sZW5ndGg9XyxuLnNwb3RTaGFkb3dNYXAubGVuZ3RoPV8sbi5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGg9dixuLnBvaW50U2hhZG93TWF0cml4Lmxlbmd0aD15LG4uc3BvdExpZ2h0TWF0cml4Lmxlbmd0aD1fK1MtdyxuLnNwb3RMaWdodE1hcC5sZW5ndGg9UyxuLm51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwcz13LG4ubnVtTGlnaHRQcm9iZXM9QSxULmRpcmVjdGlvbmFsTGVuZ3RoPWQsVC5wb2ludExlbmd0aD1wLFQuc3BvdExlbmd0aD14LFQucmVjdEFyZWFMZW5ndGg9ZyxULmhlbWlMZW5ndGg9bSxULm51bURpcmVjdGlvbmFsU2hhZG93cz12LFQubnVtUG9pbnRTaGFkb3dzPXksVC5udW1TcG90U2hhZG93cz1fLFQubnVtU3BvdE1hcHM9UyxULm51bUxpZ2h0UHJvYmVzPUEsbi52ZXJzaW9uPXFUKyspfWZ1bmN0aW9uIGMobCx1KXtsZXQgaD0wLGY9MCxkPTAscD0wLHg9MDtjb25zdCBnPXUubWF0cml4V29ybGRJbnZlcnNlO2ZvcihsZXQgbT0wLHY9bC5sZW5ndGg7bTx2O20rKyl7Y29uc3QgeT1sW21dO2lmKHkuaXNEaXJlY3Rpb25hbExpZ2h0KXtjb25zdCBfPW4uZGlyZWN0aW9uYWxbaF07Xy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHkubWF0cml4V29ybGQpLGkuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHkudGFyZ2V0Lm1hdHJpeFdvcmxkKSxfLmRpcmVjdGlvbi5zdWIoaSksXy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKGcpLGgrK31lbHNlIGlmKHkuaXNTcG90TGlnaHQpe2NvbnN0IF89bi5zcG90W2RdO18ucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHkubWF0cml4V29ybGQpLF8ucG9zaXRpb24uYXBwbHlNYXRyaXg0KGcpLF8uZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbih5Lm1hdHJpeFdvcmxkKSxpLnNldEZyb21NYXRyaXhQb3NpdGlvbih5LnRhcmdldC5tYXRyaXhXb3JsZCksXy5kaXJlY3Rpb24uc3ViKGkpLF8uZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihnKSxkKyt9ZWxzZSBpZih5LmlzUmVjdEFyZWFMaWdodCl7Y29uc3QgXz1uLnJlY3RBcmVhW3BdO18ucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHkubWF0cml4V29ybGQpLF8ucG9zaXRpb24uYXBwbHlNYXRyaXg0KGcpLG8uaWRlbnRpdHkoKSxzLmNvcHkoeS5tYXRyaXhXb3JsZCkscy5wcmVtdWx0aXBseShnKSxvLmV4dHJhY3RSb3RhdGlvbihzKSxfLmhhbGZXaWR0aC5zZXQoeS53aWR0aCouNSwwLDApLF8uaGFsZkhlaWdodC5zZXQoMCx5LmhlaWdodCouNSwwKSxfLmhhbGZXaWR0aC5hcHBseU1hdHJpeDQobyksXy5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NChvKSxwKyt9ZWxzZSBpZih5LmlzUG9pbnRMaWdodCl7Y29uc3QgXz1uLnBvaW50W2ZdO18ucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHkubWF0cml4V29ybGQpLF8ucG9zaXRpb24uYXBwbHlNYXRyaXg0KGcpLGYrK31lbHNlIGlmKHkuaXNIZW1pc3BoZXJlTGlnaHQpe2NvbnN0IF89bi5oZW1pW3hdO18uZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbih5Lm1hdHJpeFdvcmxkKSxfLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oZykseCsrfX19cmV0dXJue3NldHVwOmEsc2V0dXBWaWV3OmMsc3RhdGU6bn19ZnVuY3Rpb24gTngocil7Y29uc3QgdD1uZXcgWlQociksZT1bXSxuPVtdO2Z1bmN0aW9uIGkodSl7bC5jYW1lcmE9dSxlLmxlbmd0aD0wLG4ubGVuZ3RoPTB9ZnVuY3Rpb24gcyh1KXtlLnB1c2godSl9ZnVuY3Rpb24gbyh1KXtuLnB1c2godSl9ZnVuY3Rpb24gYSgpe3Quc2V0dXAoZSl9ZnVuY3Rpb24gYyh1KXt0LnNldHVwVmlldyhlLHUpfWNvbnN0IGw9e2xpZ2h0c0FycmF5OmUsc2hhZG93c0FycmF5Om4sY2FtZXJhOm51bGwsbGlnaHRzOnQsdHJhbnNtaXNzaW9uUmVuZGVyVGFyZ2V0Ont9fTtyZXR1cm57aW5pdDppLHN0YXRlOmwsc2V0dXBMaWdodHM6YSxzZXR1cExpZ2h0c1ZpZXc6YyxwdXNoTGlnaHQ6cyxwdXNoU2hhZG93Om99fWZ1bmN0aW9uIEpUKHIpe2xldCB0PW5ldyBXZWFrTWFwO2Z1bmN0aW9uIGUoaSxzPTApe2NvbnN0IG89dC5nZXQoaSk7bGV0IGE7cmV0dXJuIG89PT12b2lkIDA/KGE9bmV3IE54KHIpLHQuc2V0KGksW2FdKSk6cz49by5sZW5ndGg/KGE9bmV3IE54KHIpLG8ucHVzaChhKSk6YT1vW3NdLGF9ZnVuY3Rpb24gbigpe3Q9bmV3IFdlYWtNYXB9cmV0dXJue2dldDplLGRpc3Bvc2U6bn19Y29uc3QgS1Q9YHZvaWQgbWFpbigpIHsKCWdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApOwp9YCxqVD1gdW5pZm9ybSBzYW1wbGVyMkQgc2hhZG93X3Bhc3M7CnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uOwp1bmlmb3JtIGZsb2F0IHJhZGl1czsKI2luY2x1ZGUgPHBhY2tpbmc+CnZvaWQgbWFpbigpIHsKCWNvbnN0IGZsb2F0IHNhbXBsZXMgPSBmbG9hdCggVlNNX1NBTVBMRVMgKTsKCWZsb2F0IG1lYW4gPSAwLjA7CglmbG9hdCBzcXVhcmVkX21lYW4gPSAwLjA7CglmbG9hdCB1dlN0cmlkZSA9IHNhbXBsZXMgPD0gMS4wID8gMC4wIDogMi4wIC8gKCBzYW1wbGVzIC0gMS4wICk7CglmbG9hdCB1dlN0YXJ0ID0gc2FtcGxlcyA8PSAxLjAgPyAwLjAgOiAtIDEuMDsKCWZvciAoIGZsb2F0IGkgPSAwLjA7IGkgPCBzYW1wbGVzOyBpICsrICkgewoJCWZsb2F0IHV2T2Zmc2V0ID0gdXZTdGFydCArIGkgKiB1dlN0cmlkZTsKCQkjaWZkZWYgSE9SSVpPTlRBTF9QQVNTCgkJCXZlYzIgZGlzdHJpYnV0aW9uID0gdW5wYWNrUkdCQVRvMkhhbGYoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggdXZPZmZzZXQsIDAuMCApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTsKCQkJbWVhbiArPSBkaXN0cmlidXRpb24ueDsKCQkJc3F1YXJlZF9tZWFuICs9IGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54OwoJCSNlbHNlCgkJCWZsb2F0IGRlcHRoID0gdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggMC4wLCB1dk9mZnNldCApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTsKCQkJbWVhbiArPSBkZXB0aDsKCQkJc3F1YXJlZF9tZWFuICs9IGRlcHRoICogZGVwdGg7CgkJI2VuZGlmCgl9CgltZWFuID0gbWVhbiAvIHNhbXBsZXM7CglzcXVhcmVkX21lYW4gPSBzcXVhcmVkX21lYW4gLyBzYW1wbGVzOwoJZmxvYXQgc3RkX2RldiA9IHNxcnQoIHNxdWFyZWRfbWVhbiAtIG1lYW4gKiBtZWFuICk7CglnbF9GcmFnQ29sb3IgPSBwYWNrMkhhbGZUb1JHQkEoIHZlYzIoIG1lYW4sIHN0ZF9kZXYgKSApOwp9YDtmdW5jdGlvbiBRVChyLHQsZSl7bGV0IG49bmV3IFFzO2NvbnN0IGk9bmV3IHEscz1uZXcgcSxvPW5ldyBRdCxhPW5ldyBKZih7ZGVwdGhQYWNraW5nOkJtfSksYz1uZXcgS2YsbD17fSx1PWUubWF4VGV4dHVyZVNpemUsaD17W2VpXTpZZSxbWWVdOmVpLFtQbl06UG59LGY9bmV3IG9pKHtkZWZpbmVzOntWU01fU0FNUExFUzo4fSx1bmlmb3Jtczp7c2hhZG93X3Bhc3M6e3ZhbHVlOm51bGx9LHJlc29sdXRpb246e3ZhbHVlOm5ldyBxfSxyYWRpdXM6e3ZhbHVlOjR9fSx2ZXJ0ZXhTaGFkZXI6S1QsZnJhZ21lbnRTaGFkZXI6alR9KSxkPWYuY2xvbmUoKTtkLmRlZmluZXMuSE9SSVpPTlRBTF9QQVNTPTE7Y29uc3QgcD1uZXcgTnQ7cC5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgSnQobmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLjUsMywtMSwuNSwtMSwzLC41XSksMykpO2NvbnN0IHg9bmV3IExlKHAsZiksZz10aGlzO3RoaXMuZW5hYmxlZD0hMSx0aGlzLmF1dG9VcGRhdGU9ITAsdGhpcy5uZWVkc1VwZGF0ZT0hMSx0aGlzLnR5cGU9Z247bGV0IG09dGhpcy50eXBlO3RoaXMucmVuZGVyPWZ1bmN0aW9uKHcsQSxUKXtpZihnLmVuYWJsZWQ9PT0hMXx8Zy5hdXRvVXBkYXRlPT09ITEmJmcubmVlZHNVcGRhdGU9PT0hMXx8dy5sZW5ndGg9PT0wKXJldHVybjtjb25zdCBiPXIuZ2V0UmVuZGVyVGFyZ2V0KCksTT1yLmdldEFjdGl2ZUN1YmVGYWNlKCksRT1yLmdldEFjdGl2ZU1pcG1hcExldmVsKCksRD1yLnN0YXRlO0Quc2V0QmxlbmRpbmcoUmkpLEQuYnVmZmVycy5jb2xvci5zZXRDbGVhcigxLDEsMSwxKSxELmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCksRC5zZXRTY2lzc29yVGVzdCghMSk7Y29uc3QgTD1tIT09eGkmJnRoaXMudHlwZT09PXhpLEY9bT09PXhpJiZ0aGlzLnR5cGUhPT14aTtmb3IobGV0IE49MCxPPXcubGVuZ3RoO048TztOKyspe2NvbnN0IEg9d1tOXSx6PUguc2hhZG93O2lmKHo9PT12b2lkIDApe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6IixILCJoYXMgbm8gc2hhZG93LiIpO2NvbnRpbnVlfWlmKHouYXV0b1VwZGF0ZT09PSExJiZ6Lm5lZWRzVXBkYXRlPT09ITEpY29udGludWU7aS5jb3B5KHoubWFwU2l6ZSk7Y29uc3QgUT16LmdldEZyYW1lRXh0ZW50cygpO2lmKGkubXVsdGlwbHkoUSkscy5jb3B5KHoubWFwU2l6ZSksKGkueD51fHxpLnk+dSkmJihpLng+dSYmKHMueD1NYXRoLmZsb29yKHUvUS54KSxpLng9cy54KlEueCx6Lm1hcFNpemUueD1zLngpLGkueT51JiYocy55PU1hdGguZmxvb3IodS9RLnkpLGkueT1zLnkqUS55LHoubWFwU2l6ZS55PXMueSkpLHoubWFwPT09bnVsbHx8TD09PSEwfHxGPT09ITApe2NvbnN0IGZ0PXRoaXMudHlwZSE9PXhpP3ttaW5GaWx0ZXI6WGUsbWFnRmlsdGVyOlhlfTp7fTt6Lm1hcCE9PW51bGwmJnoubWFwLmRpc3Bvc2UoKSx6Lm1hcD1uZXcgdmkoaS54LGkueSxmdCksei5tYXAudGV4dHVyZS5uYW1lPUgubmFtZSsiLnNoYWRvd01hcCIsei5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfXIuc2V0UmVuZGVyVGFyZ2V0KHoubWFwKSxyLmNsZWFyKCk7Y29uc3Qgc3Q9ei5nZXRWaWV3cG9ydENvdW50KCk7Zm9yKGxldCBmdD0wO2Z0PHN0O2Z0Kyspe2NvbnN0IFJ0PXouZ2V0Vmlld3BvcnQoZnQpO28uc2V0KHMueCpSdC54LHMueSpSdC55LHMueCpSdC56LHMueSpSdC53KSxELnZpZXdwb3J0KG8pLHoudXBkYXRlTWF0cmljZXMoSCxmdCksbj16LmdldEZydXN0dW0oKSxfKEEsVCx6LmNhbWVyYSxILHRoaXMudHlwZSl9ei5pc1BvaW50TGlnaHRTaGFkb3chPT0hMCYmdGhpcy50eXBlPT09eGkmJnYoeixUKSx6Lm5lZWRzVXBkYXRlPSExfW09dGhpcy50eXBlLGcubmVlZHNVcGRhdGU9ITEsci5zZXRSZW5kZXJUYXJnZXQoYixNLEUpfTtmdW5jdGlvbiB2KHcsQSl7Y29uc3QgVD10LnVwZGF0ZSh4KTtmLmRlZmluZXMuVlNNX1NBTVBMRVMhPT13LmJsdXJTYW1wbGVzJiYoZi5kZWZpbmVzLlZTTV9TQU1QTEVTPXcuYmx1clNhbXBsZXMsZC5kZWZpbmVzLlZTTV9TQU1QTEVTPXcuYmx1clNhbXBsZXMsZi5uZWVkc1VwZGF0ZT0hMCxkLm5lZWRzVXBkYXRlPSEwKSx3Lm1hcFBhc3M9PT1udWxsJiYody5tYXBQYXNzPW5ldyB2aShpLngsaS55KSksZi51bmlmb3Jtcy5zaGFkb3dfcGFzcy52YWx1ZT13Lm1hcC50ZXh0dXJlLGYudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT13Lm1hcFNpemUsZi51bmlmb3Jtcy5yYWRpdXMudmFsdWU9dy5yYWRpdXMsci5zZXRSZW5kZXJUYXJnZXQody5tYXBQYXNzKSxyLmNsZWFyKCksci5yZW5kZXJCdWZmZXJEaXJlY3QoQSxudWxsLFQsZix4LG51bGwpLGQudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWU9dy5tYXBQYXNzLnRleHR1cmUsZC51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlPXcubWFwU2l6ZSxkLnVuaWZvcm1zLnJhZGl1cy52YWx1ZT13LnJhZGl1cyxyLnNldFJlbmRlclRhcmdldCh3Lm1hcCksci5jbGVhcigpLHIucmVuZGVyQnVmZmVyRGlyZWN0KEEsbnVsbCxULGQseCxudWxsKX1mdW5jdGlvbiB5KHcsQSxULGIpe2xldCBNPW51bGw7Y29uc3QgRT1ULmlzUG9pbnRMaWdodD09PSEwP3cuY3VzdG9tRGlzdGFuY2VNYXRlcmlhbDp3LmN1c3RvbURlcHRoTWF0ZXJpYWw7aWYoRSE9PXZvaWQgMClNPUU7ZWxzZSBpZihNPVQuaXNQb2ludExpZ2h0PT09ITA/YzphLHIubG9jYWxDbGlwcGluZ0VuYWJsZWQmJkEuY2xpcFNoYWRvd3M9PT0hMCYmQXJyYXkuaXNBcnJheShBLmNsaXBwaW5nUGxhbmVzKSYmQS5jbGlwcGluZ1BsYW5lcy5sZW5ndGghPT0wfHxBLmRpc3BsYWNlbWVudE1hcCYmQS5kaXNwbGFjZW1lbnRTY2FsZSE9PTB8fEEuYWxwaGFNYXAmJkEuYWxwaGFUZXN0PjB8fEEubWFwJiZBLmFscGhhVGVzdD4wfHxBLmFscGhhVG9Db3ZlcmFnZT09PSEwKXtjb25zdCBEPU0udXVpZCxMPUEudXVpZDtsZXQgRj1sW0RdO0Y9PT12b2lkIDAmJihGPXt9LGxbRF09Rik7bGV0IE49RltMXTtOPT09dm9pZCAwJiYoTj1NLmNsb25lKCksRltMXT1OLEEuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsUykpLE09Tn1pZihNLnZpc2libGU9QS52aXNpYmxlLE0ud2lyZWZyYW1lPUEud2lyZWZyYW1lLGI9PT14aT9NLnNpZGU9QS5zaGFkb3dTaWRlIT09bnVsbD9BLnNoYWRvd1NpZGU6QS5zaWRlOk0uc2lkZT1BLnNoYWRvd1NpZGUhPT1udWxsP0Euc2hhZG93U2lkZTpoW0Euc2lkZV0sTS5hbHBoYU1hcD1BLmFscGhhTWFwLE0uYWxwaGFUZXN0PUEuYWxwaGFUb0NvdmVyYWdlPT09ITA/LjU6QS5hbHBoYVRlc3QsTS5tYXA9QS5tYXAsTS5jbGlwU2hhZG93cz1BLmNsaXBTaGFkb3dzLE0uY2xpcHBpbmdQbGFuZXM9QS5jbGlwcGluZ1BsYW5lcyxNLmNsaXBJbnRlcnNlY3Rpb249QS5jbGlwSW50ZXJzZWN0aW9uLE0uZGlzcGxhY2VtZW50TWFwPUEuZGlzcGxhY2VtZW50TWFwLE0uZGlzcGxhY2VtZW50U2NhbGU9QS5kaXNwbGFjZW1lbnRTY2FsZSxNLmRpc3BsYWNlbWVudEJpYXM9QS5kaXNwbGFjZW1lbnRCaWFzLE0ud2lyZWZyYW1lTGluZXdpZHRoPUEud2lyZWZyYW1lTGluZXdpZHRoLE0ubGluZXdpZHRoPUEubGluZXdpZHRoLFQuaXNQb2ludExpZ2h0PT09ITAmJk0uaXNNZXNoRGlzdGFuY2VNYXRlcmlhbD09PSEwKXtjb25zdCBEPXIucHJvcGVydGllcy5nZXQoTSk7RC5saWdodD1UfXJldHVybiBNfWZ1bmN0aW9uIF8odyxBLFQsYixNKXtpZih3LnZpc2libGU9PT0hMSlyZXR1cm47aWYody5sYXllcnMudGVzdChBLmxheWVycykmJih3LmlzTWVzaHx8dy5pc0xpbmV8fHcuaXNQb2ludHMpJiYody5jYXN0U2hhZG93fHx3LnJlY2VpdmVTaGFkb3cmJk09PT14aSkmJighdy5mcnVzdHVtQ3VsbGVkfHxuLmludGVyc2VjdHNPYmplY3QodykpKXt3Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKFQubWF0cml4V29ybGRJbnZlcnNlLHcubWF0cml4V29ybGQpO2NvbnN0IEw9dC51cGRhdGUodyksRj13Lm1hdGVyaWFsO2lmKEFycmF5LmlzQXJyYXkoRikpe2NvbnN0IE49TC5ncm91cHM7Zm9yKGxldCBPPTAsSD1OLmxlbmd0aDtPPEg7TysrKXtjb25zdCB6PU5bT10sUT1GW3oubWF0ZXJpYWxJbmRleF07aWYoUSYmUS52aXNpYmxlKXtjb25zdCBzdD15KHcsUSxiLE0pO3cub25CZWZvcmVTaGFkb3cocix3LEEsVCxMLHN0LHopLHIucmVuZGVyQnVmZmVyRGlyZWN0KFQsbnVsbCxMLHN0LHcseiksdy5vbkFmdGVyU2hhZG93KHIsdyxBLFQsTCxzdCx6KX19fWVsc2UgaWYoRi52aXNpYmxlKXtjb25zdCBOPXkodyxGLGIsTSk7dy5vbkJlZm9yZVNoYWRvdyhyLHcsQSxULEwsTixudWxsKSxyLnJlbmRlckJ1ZmZlckRpcmVjdChULG51bGwsTCxOLHcsbnVsbCksdy5vbkFmdGVyU2hhZG93KHIsdyxBLFQsTCxOLG51bGwpfX1jb25zdCBEPXcuY2hpbGRyZW47Zm9yKGxldCBMPTAsRj1ELmxlbmd0aDtMPEY7TCsrKV8oRFtMXSxBLFQsYixNKX1mdW5jdGlvbiBTKHcpe3cudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLFMpO2Zvcihjb25zdCBUIGluIGwpe2NvbnN0IGI9bFtUXSxNPXcudGFyZ2V0LnV1aWQ7TSBpbiBiJiYoYltNXS5kaXNwb3NlKCksZGVsZXRlIGJbTV0pfX19Y29uc3QgdEU9e1tzY106b2MsW2FjXTp1YyxbY2NdOmhjLFtJcl06bGMsW29jXTpzYyxbdWNdOmFjLFtoY106Y2MsW2xjXTpJcn07ZnVuY3Rpb24gZUUocix0KXtmdW5jdGlvbiBlKCl7bGV0IGs9ITE7Y29uc3QgeHQ9bmV3IFF0O2xldCBqPW51bGw7Y29uc3QgbnQ9bmV3IFF0KDAsMCwwLDApO3JldHVybntzZXRNYXNrOmZ1bmN0aW9uKFN0KXtqIT09U3QmJiFrJiYoci5jb2xvck1hc2soU3QsU3QsU3QsU3QpLGo9U3QpfSxzZXRMb2NrZWQ6ZnVuY3Rpb24oU3Qpe2s9U3R9LHNldENsZWFyOmZ1bmN0aW9uKFN0LF90LGp0LEllLGVuKXtlbj09PSEwJiYoU3QqPUllLF90Kj1JZSxqdCo9SWUpLHh0LnNldChTdCxfdCxqdCxJZSksbnQuZXF1YWxzKHh0KT09PSExJiYoci5jbGVhckNvbG9yKFN0LF90LGp0LEllKSxudC5jb3B5KHh0KSl9LHJlc2V0OmZ1bmN0aW9uKCl7az0hMSxqPW51bGwsbnQuc2V0KC0xLDAsMCwwKX19fWZ1bmN0aW9uIG4oKXtsZXQgaz0hMSx4dD0hMSxqPW51bGwsbnQ9bnVsbCxTdD1udWxsO3JldHVybntzZXRSZXZlcnNlZDpmdW5jdGlvbihfdCl7aWYoeHQhPT1fdCl7Y29uc3QganQ9dC5nZXQoIkVYVF9jbGlwX2NvbnRyb2wiKTtfdD9qdC5jbGlwQ29udHJvbEVYVChqdC5MT1dFUl9MRUZUX0VYVCxqdC5aRVJPX1RPX09ORV9FWFQpOmp0LmNsaXBDb250cm9sRVhUKGp0LkxPV0VSX0xFRlRfRVhULGp0Lk5FR0FUSVZFX09ORV9UT19PTkVfRVhUKSx4dD1fdDtjb25zdCBJZT1TdDtTdD1udWxsLHRoaXMuc2V0Q2xlYXIoSWUpfX0sZ2V0UmV2ZXJzZWQ6ZnVuY3Rpb24oKXtyZXR1cm4geHR9LHNldFRlc3Q6ZnVuY3Rpb24oX3Qpe190P2R0KHIuREVQVEhfVEVTVCk6SXQoci5ERVBUSF9URVNUKX0sc2V0TWFzazpmdW5jdGlvbihfdCl7aiE9PV90JiYhayYmKHIuZGVwdGhNYXNrKF90KSxqPV90KX0sc2V0RnVuYzpmdW5jdGlvbihfdCl7aWYoeHQmJihfdD10RVtfdF0pLG50IT09X3Qpe3N3aXRjaChfdCl7Y2FzZSBzYzpyLmRlcHRoRnVuYyhyLk5FVkVSKTticmVhaztjYXNlIG9jOnIuZGVwdGhGdW5jKHIuQUxXQVlTKTticmVhaztjYXNlIGFjOnIuZGVwdGhGdW5jKHIuTEVTUyk7YnJlYWs7Y2FzZSBJcjpyLmRlcHRoRnVuYyhyLkxFUVVBTCk7YnJlYWs7Y2FzZSBjYzpyLmRlcHRoRnVuYyhyLkVRVUFMKTticmVhaztjYXNlIGxjOnIuZGVwdGhGdW5jKHIuR0VRVUFMKTticmVhaztjYXNlIHVjOnIuZGVwdGhGdW5jKHIuR1JFQVRFUik7YnJlYWs7Y2FzZSBoYzpyLmRlcHRoRnVuYyhyLk5PVEVRVUFMKTticmVhaztkZWZhdWx0OnIuZGVwdGhGdW5jKHIuTEVRVUFMKX1udD1fdH19LHNldExvY2tlZDpmdW5jdGlvbihfdCl7az1fdH0sc2V0Q2xlYXI6ZnVuY3Rpb24oX3Qpe1N0IT09X3QmJih4dCYmKF90PTEtX3QpLHIuY2xlYXJEZXB0aChfdCksU3Q9X3QpfSxyZXNldDpmdW5jdGlvbigpe2s9ITEsaj1udWxsLG50PW51bGwsU3Q9bnVsbCx4dD0hMX19fWZ1bmN0aW9uIGkoKXtsZXQgaz0hMSx4dD1udWxsLGo9bnVsbCxudD1udWxsLFN0PW51bGwsX3Q9bnVsbCxqdD1udWxsLEllPW51bGwsZW49bnVsbDtyZXR1cm57c2V0VGVzdDpmdW5jdGlvbihtZSl7a3x8KG1lP2R0KHIuU1RFTkNJTF9URVNUKTpJdChyLlNURU5DSUxfVEVTVCkpfSxzZXRNYXNrOmZ1bmN0aW9uKG1lKXt4dCE9PW1lJiYhayYmKHIuc3RlbmNpbE1hc2sobWUpLHh0PW1lKX0sc2V0RnVuYzpmdW5jdGlvbihtZSxwaSxpcil7KGohPT1tZXx8bnQhPT1waXx8U3QhPT1pcikmJihyLnN0ZW5jaWxGdW5jKG1lLHBpLGlyKSxqPW1lLG50PXBpLFN0PWlyKX0sc2V0T3A6ZnVuY3Rpb24obWUscGksaXIpeyhfdCE9PW1lfHxqdCE9PXBpfHxJZSE9PWlyKSYmKHIuc3RlbmNpbE9wKG1lLHBpLGlyKSxfdD1tZSxqdD1waSxJZT1pcil9LHNldExvY2tlZDpmdW5jdGlvbihtZSl7az1tZX0sc2V0Q2xlYXI6ZnVuY3Rpb24obWUpe2VuIT09bWUmJihyLmNsZWFyU3RlbmNpbChtZSksZW49bWUpfSxyZXNldDpmdW5jdGlvbigpe2s9ITEseHQ9bnVsbCxqPW51bGwsbnQ9bnVsbCxTdD1udWxsLF90PW51bGwsanQ9bnVsbCxJZT1udWxsLGVuPW51bGx9fX1jb25zdCBzPW5ldyBlLG89bmV3IG4sYT1uZXcgaSxjPW5ldyBXZWFrTWFwLGw9bmV3IFdlYWtNYXA7bGV0IHU9e30saD17fSxmPW5ldyBXZWFrTWFwLGQ9W10scD1udWxsLHg9ITEsZz1udWxsLG09bnVsbCx2PW51bGwseT1udWxsLF89bnVsbCxTPW51bGwsdz1udWxsLEE9bmV3IHl0KDAsMCwwKSxUPTAsYj0hMSxNPW51bGwsRT1udWxsLEQ9bnVsbCxMPW51bGwsRj1udWxsO2NvbnN0IE49ci5nZXRQYXJhbWV0ZXIoci5NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyk7bGV0IE89ITEsSD0wO2NvbnN0IHo9ci5nZXRQYXJhbWV0ZXIoci5WRVJTSU9OKTt6LmluZGV4T2YoIldlYkdMIikhPT0tMT8oSD1wYXJzZUZsb2F0KC9eV2ViR0wgKFxkKS8uZXhlYyh6KVsxXSksTz1IPj0xKTp6LmluZGV4T2YoIk9wZW5HTCBFUyIpIT09LTEmJihIPXBhcnNlRmxvYXQoL15PcGVuR0wgRVMgKFxkKS8uZXhlYyh6KVsxXSksTz1IPj0yKTtsZXQgUT1udWxsLHN0PXt9O2NvbnN0IGZ0PXIuZ2V0UGFyYW1ldGVyKHIuU0NJU1NPUl9CT1gpLFJ0PXIuZ2V0UGFyYW1ldGVyKHIuVklFV1BPUlQpLEZ0PW5ldyBRdCgpLmZyb21BcnJheShmdCksSz1uZXcgUXQoKS5mcm9tQXJyYXkoUnQpO2Z1bmN0aW9uIG90KGsseHQsaixudCl7Y29uc3QgU3Q9bmV3IFVpbnQ4QXJyYXkoNCksX3Q9ci5jcmVhdGVUZXh0dXJlKCk7ci5iaW5kVGV4dHVyZShrLF90KSxyLnRleFBhcmFtZXRlcmkoayxyLlRFWFRVUkVfTUlOX0ZJTFRFUixyLk5FQVJFU1QpLHIudGV4UGFyYW1ldGVyaShrLHIuVEVYVFVSRV9NQUdfRklMVEVSLHIuTkVBUkVTVCk7Zm9yKGxldCBqdD0wO2p0PGo7anQrKylrPT09ci5URVhUVVJFXzNEfHxrPT09ci5URVhUVVJFXzJEX0FSUkFZP3IudGV4SW1hZ2UzRCh4dCwwLHIuUkdCQSwxLDEsbnQsMCxyLlJHQkEsci5VTlNJR05FRF9CWVRFLFN0KTpyLnRleEltYWdlMkQoeHQranQsMCxyLlJHQkEsMSwxLDAsci5SR0JBLHIuVU5TSUdORURfQllURSxTdCk7cmV0dXJuIF90fWNvbnN0IE10PXt9O010W3IuVEVYVFVSRV8yRF09b3Qoci5URVhUVVJFXzJELHIuVEVYVFVSRV8yRCwxKSxNdFtyLlRFWFRVUkVfQ1VCRV9NQVBdPW90KHIuVEVYVFVSRV9DVUJFX01BUCxyLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCw2KSxNdFtyLlRFWFRVUkVfMkRfQVJSQVldPW90KHIuVEVYVFVSRV8yRF9BUlJBWSxyLlRFWFRVUkVfMkRfQVJSQVksMSwxKSxNdFtyLlRFWFRVUkVfM0RdPW90KHIuVEVYVFVSRV8zRCxyLlRFWFRVUkVfM0QsMSwxKSxzLnNldENsZWFyKDAsMCwwLDEpLG8uc2V0Q2xlYXIoMSksYS5zZXRDbGVhcigwKSxkdChyLkRFUFRIX1RFU1QpLG8uc2V0RnVuYyhJciksZXQoITEpLGF0KFJuKSxkdChyLkNVTExfRkFDRSksVShSaSk7ZnVuY3Rpb24gZHQoayl7dVtrXSE9PSEwJiYoci5lbmFibGUoayksdVtrXT0hMCl9ZnVuY3Rpb24gSXQoayl7dVtrXSE9PSExJiYoci5kaXNhYmxlKGspLHVba109ITEpfWZ1bmN0aW9uICR0KGsseHQpe3JldHVybiBoW2tdIT09eHQ/KHIuYmluZEZyYW1lYnVmZmVyKGsseHQpLGhba109eHQsaz09PXIuRFJBV19GUkFNRUJVRkZFUiYmKGhbci5GUkFNRUJVRkZFUl09eHQpLGs9PT1yLkZSQU1FQlVGRkVSJiYoaFtyLkRSQVdfRlJBTUVCVUZGRVJdPXh0KSwhMCk6ITF9ZnVuY3Rpb24gUHQoayx4dCl7bGV0IGo9ZCxudD0hMTtpZihrKXtqPWYuZ2V0KHh0KSxqPT09dm9pZCAwJiYoaj1bXSxmLnNldCh4dCxqKSk7Y29uc3QgU3Q9ay50ZXh0dXJlcztpZihqLmxlbmd0aCE9PVN0Lmxlbmd0aHx8alswXSE9PXIuQ09MT1JfQVRUQUNITUVOVDApe2ZvcihsZXQgX3Q9MCxqdD1TdC5sZW5ndGg7X3Q8anQ7X3QrKylqW190XT1yLkNPTE9SX0FUVEFDSE1FTlQwK190O2oubGVuZ3RoPVN0Lmxlbmd0aCxudD0hMH19ZWxzZSBqWzBdIT09ci5CQUNLJiYoalswXT1yLkJBQ0ssbnQ9ITApO250JiZyLmRyYXdCdWZmZXJzKGopfWZ1bmN0aW9uIF9lKGspe3JldHVybiBwIT09az8oci51c2VQcm9ncmFtKGspLHA9aywhMCk6ITF9Y29uc3QgcXQ9e1tycl06ci5GVU5DX0FERCxbb21dOnIuRlVOQ19TVUJUUkFDVCxbYW1dOnIuRlVOQ19SRVZFUlNFX1NVQlRSQUNUfTtxdFtjbV09ci5NSU4scXRbbG1dPXIuTUFYO2NvbnN0IEJ0PXtbdW1dOnIuWkVSTyxbaG1dOnIuT05FLFtmbV06ci5TUkNfQ09MT1IsW2ljXTpyLlNSQ19BTFBIQSxbX21dOnIuU1JDX0FMUEhBX1NBVFVSQVRFLFtnbV06ci5EU1RfQ09MT1IsW3BtXTpyLkRTVF9BTFBIQSxbZG1dOnIuT05FX01JTlVTX1NSQ19DT0xPUixbcmNdOnIuT05FX01JTlVTX1NSQ19BTFBIQSxbeG1dOnIuT05FX01JTlVTX0RTVF9DT0xPUixbbW1dOnIuT05FX01JTlVTX0RTVF9BTFBIQSxbeW1dOnIuQ09OU1RBTlRfQ09MT1IsW3ZtXTpyLk9ORV9NSU5VU19DT05TVEFOVF9DT0xPUixbTW1dOnIuQ09OU1RBTlRfQUxQSEEsW1NtXTpyLk9ORV9NSU5VU19DT05TVEFOVF9BTFBIQX07ZnVuY3Rpb24gVShrLHh0LGosbnQsU3QsX3QsanQsSWUsZW4sbWUpe2lmKGs9PT1SaSl7eD09PSEwJiYoSXQoci5CTEVORCkseD0hMSk7cmV0dXJufWlmKHg9PT0hMSYmKGR0KHIuQkxFTkQpLHg9ITApLGshPT1zbSl7aWYoayE9PWd8fG1lIT09Yil7aWYoKG0hPT1ycnx8XyE9PXJyKSYmKHIuYmxlbmRFcXVhdGlvbihyLkZVTkNfQUREKSxtPXJyLF89cnIpLG1lKXN3aXRjaChrKXtjYXNlIFJyOnIuYmxlbmRGdW5jU2VwYXJhdGUoci5PTkUsci5PTkVfTUlOVVNfU1JDX0FMUEhBLHIuT05FLHIuT05FX01JTlVTX1NSQ19BTFBIQSk7YnJlYWs7Y2FzZSBWaDpyLmJsZW5kRnVuYyhyLk9ORSxyLk9ORSk7YnJlYWs7Y2FzZSBHaDpyLmJsZW5kRnVuY1NlcGFyYXRlKHIuWkVSTyxyLk9ORV9NSU5VU19TUkNfQ09MT1Isci5aRVJPLHIuT05FKTticmVhaztjYXNlIEhoOnIuYmxlbmRGdW5jU2VwYXJhdGUoci5aRVJPLHIuU1JDX0NPTE9SLHIuWkVSTyxyLlNSQ19BTFBIQSk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLGspO2JyZWFrfWVsc2Ugc3dpdGNoKGspe2Nhc2UgUnI6ci5ibGVuZEZ1bmNTZXBhcmF0ZShyLlNSQ19BTFBIQSxyLk9ORV9NSU5VU19TUkNfQUxQSEEsci5PTkUsci5PTkVfTUlOVVNfU1JDX0FMUEhBKTticmVhaztjYXNlIFZoOnIuYmxlbmRGdW5jKHIuU1JDX0FMUEhBLHIuT05FKTticmVhaztjYXNlIEdoOnIuYmxlbmRGdW5jU2VwYXJhdGUoci5aRVJPLHIuT05FX01JTlVTX1NSQ19DT0xPUixyLlpFUk8sci5PTkUpO2JyZWFrO2Nhc2UgSGg6ci5ibGVuZEZ1bmMoci5aRVJPLHIuU1JDX0NPTE9SKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIsayk7YnJlYWt9dj1udWxsLHk9bnVsbCxTPW51bGwsdz1udWxsLEEuc2V0KDAsMCwwKSxUPTAsZz1rLGI9bWV9cmV0dXJufVN0PVN0fHx4dCxfdD1fdHx8aixqdD1qdHx8bnQsKHh0IT09bXx8U3QhPT1fKSYmKHIuYmxlbmRFcXVhdGlvblNlcGFyYXRlKHF0W3h0XSxxdFtTdF0pLG09eHQsXz1TdCksKGohPT12fHxudCE9PXl8fF90IT09U3x8anQhPT13KSYmKHIuYmxlbmRGdW5jU2VwYXJhdGUoQnRbal0sQnRbbnRdLEJ0W190XSxCdFtqdF0pLHY9aix5PW50LFM9X3Qsdz1qdCksKEllLmVxdWFscyhBKT09PSExfHxlbiE9PVQpJiYoci5ibGVuZENvbG9yKEllLnIsSWUuZyxJZS5iLGVuKSxBLmNvcHkoSWUpLFQ9ZW4pLGc9ayxiPSExfWZ1bmN0aW9uIGx0KGsseHQpe2suc2lkZT09PVBuP0l0KHIuQ1VMTF9GQUNFKTpkdChyLkNVTExfRkFDRSk7bGV0IGo9ay5zaWRlPT09WWU7eHQmJihqPSFqKSxldChqKSxrLmJsZW5kaW5nPT09UnImJmsudHJhbnNwYXJlbnQ9PT0hMT9VKFJpKTpVKGsuYmxlbmRpbmcsay5ibGVuZEVxdWF0aW9uLGsuYmxlbmRTcmMsay5ibGVuZERzdCxrLmJsZW5kRXF1YXRpb25BbHBoYSxrLmJsZW5kU3JjQWxwaGEsay5ibGVuZERzdEFscGhhLGsuYmxlbmRDb2xvcixrLmJsZW5kQWxwaGEsay5wcmVtdWx0aXBsaWVkQWxwaGEpLG8uc2V0RnVuYyhrLmRlcHRoRnVuYyksby5zZXRUZXN0KGsuZGVwdGhUZXN0KSxvLnNldE1hc2soay5kZXB0aFdyaXRlKSxzLnNldE1hc2soay5jb2xvcldyaXRlKTtjb25zdCBudD1rLnN0ZW5jaWxXcml0ZTthLnNldFRlc3QobnQpLG50JiYoYS5zZXRNYXNrKGsuc3RlbmNpbFdyaXRlTWFzayksYS5zZXRGdW5jKGsuc3RlbmNpbEZ1bmMsay5zdGVuY2lsUmVmLGsuc3RlbmNpbEZ1bmNNYXNrKSxhLnNldE9wKGsuc3RlbmNpbEZhaWwsay5zdGVuY2lsWkZhaWwsay5zdGVuY2lsWlBhc3MpKSxFdChrLnBvbHlnb25PZmZzZXQsay5wb2x5Z29uT2Zmc2V0RmFjdG9yLGsucG9seWdvbk9mZnNldFVuaXRzKSxrLmFscGhhVG9Db3ZlcmFnZT09PSEwP2R0KHIuU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKTpJdChyLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSl9ZnVuY3Rpb24gZXQoayl7TSE9PWsmJihrP3IuZnJvbnRGYWNlKHIuQ1cpOnIuZnJvbnRGYWNlKHIuQ0NXKSxNPWspfWZ1bmN0aW9uIGF0KGspe2shPT1OZT8oZHQoci5DVUxMX0ZBQ0UpLGshPT1FJiYoaz09PVJuP3IuY3VsbEZhY2Uoci5CQUNLKTprPT09SW4/ci5jdWxsRmFjZShyLkZST05UKTpyLmN1bGxGYWNlKHIuRlJPTlRfQU5EX0JBQ0spKSk6SXQoci5DVUxMX0ZBQ0UpLEU9a31mdW5jdGlvbiB0dChrKXtrIT09RCYmKE8mJnIubGluZVdpZHRoKGspLEQ9ayl9ZnVuY3Rpb24gRXQoayx4dCxqKXtrPyhkdChyLlBPTFlHT05fT0ZGU0VUX0ZJTEwpLChMIT09eHR8fEYhPT1qKSYmKHIucG9seWdvbk9mZnNldCh4dCxqKSxMPXh0LEY9aikpOkl0KHIuUE9MWUdPTl9PRkZTRVRfRklMTCl9ZnVuY3Rpb24gWChrKXtrP2R0KHIuU0NJU1NPUl9URVNUKTpJdChyLlNDSVNTT1JfVEVTVCl9ZnVuY3Rpb24gUihrKXtrPT09dm9pZCAwJiYoaz1yLlRFWFRVUkUwK04tMSksUSE9PWsmJihyLmFjdGl2ZVRleHR1cmUoayksUT1rKX1mdW5jdGlvbiBDKGsseHQsail7aj09PXZvaWQgMCYmKFE9PT1udWxsP2o9ci5URVhUVVJFMCtOLTE6aj1RKTtsZXQgbnQ9c3Rbal07bnQ9PT12b2lkIDAmJihudD17dHlwZTp2b2lkIDAsdGV4dHVyZTp2b2lkIDB9LHN0W2pdPW50KSwobnQudHlwZSE9PWt8fG50LnRleHR1cmUhPT14dCkmJihRIT09aiYmKHIuYWN0aXZlVGV4dHVyZShqKSxRPWopLHIuYmluZFRleHR1cmUoayx4dHx8TXRba10pLG50LnR5cGU9ayxudC50ZXh0dXJlPXh0KX1mdW5jdGlvbiBCKCl7Y29uc3Qgaz1zdFtRXTtrIT09dm9pZCAwJiZrLnR5cGUhPT12b2lkIDAmJihyLmJpbmRUZXh0dXJlKGsudHlwZSxudWxsKSxrLnR5cGU9dm9pZCAwLGsudGV4dHVyZT12b2lkIDApfWZ1bmN0aW9uIFYoKXt0cnl7ci5jb21wcmVzc2VkVGV4SW1hZ2UyRCguLi5hcmd1bWVudHMpfWNhdGNoKGspe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IixrKX19ZnVuY3Rpb24gSigpe3RyeXtyLmNvbXByZXNzZWRUZXhJbWFnZTNEKC4uLmFyZ3VtZW50cyl9Y2F0Y2goayl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGspfX1mdW5jdGlvbiAkKCl7dHJ5e3IudGV4U3ViSW1hZ2UyRCguLi5hcmd1bWVudHMpfWNhdGNoKGspe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IixrKX19ZnVuY3Rpb24gdXQoKXt0cnl7ci50ZXhTdWJJbWFnZTNEKC4uLmFyZ3VtZW50cyl9Y2F0Y2goayl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGspfX1mdW5jdGlvbiBydCgpe3RyeXtyLmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKC4uLmFyZ3VtZW50cyl9Y2F0Y2goayl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGspfX1mdW5jdGlvbiBtdCgpe3RyeXtyLmNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKC4uLmFyZ3VtZW50cyl9Y2F0Y2goayl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGspfX1mdW5jdGlvbiBBdCgpe3RyeXtyLnRleFN0b3JhZ2UyRCguLi5hcmd1bWVudHMpfWNhdGNoKGspe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IixrKX19ZnVuY3Rpb24gaXQoKXt0cnl7ci50ZXhTdG9yYWdlM0QoLi4uYXJndW1lbnRzKX1jYXRjaChrKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsayl9fWZ1bmN0aW9uIGh0KCl7dHJ5e3IudGV4SW1hZ2UyRCguLi5hcmd1bWVudHMpfWNhdGNoKGspe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IixrKX19ZnVuY3Rpb24gTHQoKXt0cnl7ci50ZXhJbWFnZTNEKC4uLmFyZ3VtZW50cyl9Y2F0Y2goayl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGspfX1mdW5jdGlvbiB6dChrKXtGdC5lcXVhbHMoayk9PT0hMSYmKHIuc2Npc3NvcihrLngsay55LGsueixrLncpLEZ0LmNvcHkoaykpfWZ1bmN0aW9uIGJ0KGspe0suZXF1YWxzKGspPT09ITEmJihyLnZpZXdwb3J0KGsueCxrLnksay56LGsudyksSy5jb3B5KGspKX1mdW5jdGlvbiBlZShrLHh0KXtsZXQgaj1sLmdldCh4dCk7aj09PXZvaWQgMCYmKGo9bmV3IFdlYWtNYXAsbC5zZXQoeHQsaikpO2xldCBudD1qLmdldChrKTtudD09PXZvaWQgMCYmKG50PXIuZ2V0VW5pZm9ybUJsb2NrSW5kZXgoeHQsay5uYW1lKSxqLnNldChrLG50KSl9ZnVuY3Rpb24gWnQoayx4dCl7Y29uc3QgbnQ9bC5nZXQoeHQpLmdldChrKTtjLmdldCh4dCkhPT1udCYmKHIudW5pZm9ybUJsb2NrQmluZGluZyh4dCxudCxrLl9fYmluZGluZ1BvaW50SW5kZXgpLGMuc2V0KHh0LG50KSl9ZnVuY3Rpb24gcGUoKXtyLmRpc2FibGUoci5CTEVORCksci5kaXNhYmxlKHIuQ1VMTF9GQUNFKSxyLmRpc2FibGUoci5ERVBUSF9URVNUKSxyLmRpc2FibGUoci5QT0xZR09OX09GRlNFVF9GSUxMKSxyLmRpc2FibGUoci5TQ0lTU09SX1RFU1QpLHIuZGlzYWJsZShyLlNURU5DSUxfVEVTVCksci5kaXNhYmxlKHIuU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxyLmJsZW5kRXF1YXRpb24oci5GVU5DX0FERCksci5ibGVuZEZ1bmMoci5PTkUsci5aRVJPKSxyLmJsZW5kRnVuY1NlcGFyYXRlKHIuT05FLHIuWkVSTyxyLk9ORSxyLlpFUk8pLHIuYmxlbmRDb2xvcigwLDAsMCwwKSxyLmNvbG9yTWFzayghMCwhMCwhMCwhMCksci5jbGVhckNvbG9yKDAsMCwwLDApLHIuZGVwdGhNYXNrKCEwKSxyLmRlcHRoRnVuYyhyLkxFU1MpLG8uc2V0UmV2ZXJzZWQoITEpLHIuY2xlYXJEZXB0aCgxKSxyLnN0ZW5jaWxNYXNrKDQyOTQ5NjcyOTUpLHIuc3RlbmNpbEZ1bmMoci5BTFdBWVMsMCw0Mjk0OTY3Mjk1KSxyLnN0ZW5jaWxPcChyLktFRVAsci5LRUVQLHIuS0VFUCksci5jbGVhclN0ZW5jaWwoMCksci5jdWxsRmFjZShyLkJBQ0spLHIuZnJvbnRGYWNlKHIuQ0NXKSxyLnBvbHlnb25PZmZzZXQoMCwwKSxyLmFjdGl2ZVRleHR1cmUoci5URVhUVVJFMCksci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixudWxsKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLkRSQVdfRlJBTUVCVUZGRVIsbnVsbCksci5iaW5kRnJhbWVidWZmZXIoci5SRUFEX0ZSQU1FQlVGRkVSLG51bGwpLHIudXNlUHJvZ3JhbShudWxsKSxyLmxpbmVXaWR0aCgxKSxyLnNjaXNzb3IoMCwwLHIuY2FudmFzLndpZHRoLHIuY2FudmFzLmhlaWdodCksci52aWV3cG9ydCgwLDAsci5jYW52YXMud2lkdGgsci5jYW52YXMuaGVpZ2h0KSx1PXt9LFE9bnVsbCxzdD17fSxoPXt9LGY9bmV3IFdlYWtNYXAsZD1bXSxwPW51bGwseD0hMSxnPW51bGwsbT1udWxsLHY9bnVsbCx5PW51bGwsXz1udWxsLFM9bnVsbCx3PW51bGwsQT1uZXcgeXQoMCwwLDApLFQ9MCxiPSExLE09bnVsbCxFPW51bGwsRD1udWxsLEw9bnVsbCxGPW51bGwsRnQuc2V0KDAsMCxyLmNhbnZhcy53aWR0aCxyLmNhbnZhcy5oZWlnaHQpLEsuc2V0KDAsMCxyLmNhbnZhcy53aWR0aCxyLmNhbnZhcy5oZWlnaHQpLHMucmVzZXQoKSxvLnJlc2V0KCksYS5yZXNldCgpfXJldHVybntidWZmZXJzOntjb2xvcjpzLGRlcHRoOm8sc3RlbmNpbDphfSxlbmFibGU6ZHQsZGlzYWJsZTpJdCxiaW5kRnJhbWVidWZmZXI6JHQsZHJhd0J1ZmZlcnM6UHQsdXNlUHJvZ3JhbTpfZSxzZXRCbGVuZGluZzpVLHNldE1hdGVyaWFsOmx0LHNldEZsaXBTaWRlZDpldCxzZXRDdWxsRmFjZTphdCxzZXRMaW5lV2lkdGg6dHQsc2V0UG9seWdvbk9mZnNldDpFdCxzZXRTY2lzc29yVGVzdDpYLGFjdGl2ZVRleHR1cmU6UixiaW5kVGV4dHVyZTpDLHVuYmluZFRleHR1cmU6Qixjb21wcmVzc2VkVGV4SW1hZ2UyRDpWLGNvbXByZXNzZWRUZXhJbWFnZTNEOkosdGV4SW1hZ2UyRDpodCx0ZXhJbWFnZTNEOkx0LHVwZGF0ZVVCT01hcHBpbmc6ZWUsdW5pZm9ybUJsb2NrQmluZGluZzpadCx0ZXhTdG9yYWdlMkQ6QXQsdGV4U3RvcmFnZTNEOml0LHRleFN1YkltYWdlMkQ6JCx0ZXhTdWJJbWFnZTNEOnV0LGNvbXByZXNzZWRUZXhTdWJJbWFnZTJEOnJ0LGNvbXByZXNzZWRUZXhTdWJJbWFnZTNEOm10LHNjaXNzb3I6enQsdmlld3BvcnQ6YnQscmVzZXQ6cGV9fWZ1bmN0aW9uIG5FKHIsdCxlLG4saSxzLG8pe2NvbnN0IGE9dC5oYXMoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpP3QuZ2V0KCJXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiKTpudWxsLGM9dHlwZW9mIG5hdmlnYXRvcj09InVuZGVmaW5lZCI/ITE6L09jdWx1c0Jyb3dzZXIvZy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGw9bmV3IHEsdT1uZXcgV2Vha01hcDtsZXQgaDtjb25zdCBmPW5ldyBXZWFrTWFwO2xldCBkPSExO3RyeXtkPXR5cGVvZiBPZmZzY3JlZW5DYW52YXMhPSJ1bmRlZmluZWQiJiZuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSkuZ2V0Q29udGV4dCgiMmQiKSE9PW51bGx9Y2F0Y2goUil7fWZ1bmN0aW9uIHAoUixDKXtyZXR1cm4gZD9uZXcgT2Zmc2NyZWVuQ2FudmFzKFIsQyk6cW8oImNhbnZhcyIpfWZ1bmN0aW9uIHgoUixDLEIpe2xldCBWPTE7Y29uc3QgSj1YKFIpO2lmKChKLndpZHRoPkJ8fEouaGVpZ2h0PkIpJiYoVj1CL01hdGgubWF4KEoud2lkdGgsSi5oZWlnaHQpKSxWPDEpaWYodHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQhPSJ1bmRlZmluZWQiJiZSIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50IT0idW5kZWZpbmVkIiYmUiBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHx0eXBlb2YgSW1hZ2VCaXRtYXAhPSJ1bmRlZmluZWQiJiZSIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXB8fHR5cGVvZiBWaWRlb0ZyYW1lIT0idW5kZWZpbmVkIiYmUiBpbnN0YW5jZW9mIFZpZGVvRnJhbWUpe2NvbnN0ICQ9TWF0aC5mbG9vcihWKkoud2lkdGgpLHV0PU1hdGguZmxvb3IoVipKLmhlaWdodCk7aD09PXZvaWQgMCYmKGg9cCgkLHV0KSk7Y29uc3QgcnQ9Qz9wKCQsdXQpOmg7cmV0dXJuIHJ0LndpZHRoPSQscnQuaGVpZ2h0PXV0LHJ0LmdldENvbnRleHQoIjJkIikuZHJhd0ltYWdlKFIsMCwwLCQsdXQpLGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBoYXMgYmVlbiByZXNpemVkIGZyb20gKCIrSi53aWR0aCsieCIrSi5oZWlnaHQrIikgdG8gKCIrJCsieCIrdXQrIikuIikscnR9ZWxzZSByZXR1cm4iZGF0YSJpbiBSJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEltYWdlIGluIERhdGFUZXh0dXJlIGlzIHRvbyBiaWcgKCIrSi53aWR0aCsieCIrSi5oZWlnaHQrIikuIiksUjtyZXR1cm4gUn1mdW5jdGlvbiBnKFIpe3JldHVybiBSLmdlbmVyYXRlTWlwbWFwc31mdW5jdGlvbiBtKFIpe3IuZ2VuZXJhdGVNaXBtYXAoUil9ZnVuY3Rpb24gdihSKXtyZXR1cm4gUi5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldD9yLlRFWFRVUkVfQ1VCRV9NQVA6Ui5pc1dlYkdMM0RSZW5kZXJUYXJnZXQ/ci5URVhUVVJFXzNEOlIuaXNXZWJHTEFycmF5UmVuZGVyVGFyZ2V0fHxSLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZT9yLlRFWFRVUkVfMkRfQVJSQVk6ci5URVhUVVJFXzJEfWZ1bmN0aW9uIHkoUixDLEIsVixKPSExKXtpZihSIT09bnVsbCl7aWYocltSXSE9PXZvaWQgMClyZXR1cm4gcltSXTtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gdXNlIG5vbi1leGlzdGluZyBXZWJHTCBpbnRlcm5hbCBmb3JtYXQgJyIrUisiJyIpfWxldCAkPUM7aWYoQz09PXIuUkVEJiYoQj09PXIuRkxPQVQmJigkPXIuUjMyRiksQj09PXIuSEFMRl9GTE9BVCYmKCQ9ci5SMTZGKSxCPT09ci5VTlNJR05FRF9CWVRFJiYoJD1yLlI4KSksQz09PXIuUkVEX0lOVEVHRVImJihCPT09ci5VTlNJR05FRF9CWVRFJiYoJD1yLlI4VUkpLEI9PT1yLlVOU0lHTkVEX1NIT1JUJiYoJD1yLlIxNlVJKSxCPT09ci5VTlNJR05FRF9JTlQmJigkPXIuUjMyVUkpLEI9PT1yLkJZVEUmJigkPXIuUjhJKSxCPT09ci5TSE9SVCYmKCQ9ci5SMTZJKSxCPT09ci5JTlQmJigkPXIuUjMySSkpLEM9PT1yLlJHJiYoQj09PXIuRkxPQVQmJigkPXIuUkczMkYpLEI9PT1yLkhBTEZfRkxPQVQmJigkPXIuUkcxNkYpLEI9PT1yLlVOU0lHTkVEX0JZVEUmJigkPXIuUkc4KSksQz09PXIuUkdfSU5URUdFUiYmKEI9PT1yLlVOU0lHTkVEX0JZVEUmJigkPXIuUkc4VUkpLEI9PT1yLlVOU0lHTkVEX1NIT1JUJiYoJD1yLlJHMTZVSSksQj09PXIuVU5TSUdORURfSU5UJiYoJD1yLlJHMzJVSSksQj09PXIuQllURSYmKCQ9ci5SRzhJKSxCPT09ci5TSE9SVCYmKCQ9ci5SRzE2SSksQj09PXIuSU5UJiYoJD1yLlJHMzJJKSksQz09PXIuUkdCX0lOVEVHRVImJihCPT09ci5VTlNJR05FRF9CWVRFJiYoJD1yLlJHQjhVSSksQj09PXIuVU5TSUdORURfU0hPUlQmJigkPXIuUkdCMTZVSSksQj09PXIuVU5TSUdORURfSU5UJiYoJD1yLlJHQjMyVUkpLEI9PT1yLkJZVEUmJigkPXIuUkdCOEkpLEI9PT1yLlNIT1JUJiYoJD1yLlJHQjE2SSksQj09PXIuSU5UJiYoJD1yLlJHQjMySSkpLEM9PT1yLlJHQkFfSU5URUdFUiYmKEI9PT1yLlVOU0lHTkVEX0JZVEUmJigkPXIuUkdCQThVSSksQj09PXIuVU5TSUdORURfU0hPUlQmJigkPXIuUkdCQTE2VUkpLEI9PT1yLlVOU0lHTkVEX0lOVCYmKCQ9ci5SR0JBMzJVSSksQj09PXIuQllURSYmKCQ9ci5SR0JBOEkpLEI9PT1yLlNIT1JUJiYoJD1yLlJHQkExNkkpLEI9PT1yLklOVCYmKCQ9ci5SR0JBMzJJKSksQz09PXIuUkdCJiZCPT09ci5VTlNJR05FRF9JTlRfNV85XzlfOV9SRVYmJigkPXIuUkdCOV9FNSksQz09PXIuUkdCQSl7Y29uc3QgdXQ9Sj9IbzpuZS5nZXRUcmFuc2ZlcihWKTtCPT09ci5GTE9BVCYmKCQ9ci5SR0JBMzJGKSxCPT09ci5IQUxGX0ZMT0FUJiYoJD1yLlJHQkExNkYpLEI9PT1yLlVOU0lHTkVEX0JZVEUmJigkPXV0PT09ZGU/ci5TUkdCOF9BTFBIQTg6ci5SR0JBOCksQj09PXIuVU5TSUdORURfU0hPUlRfNF80XzRfNCYmKCQ9ci5SR0JBNCksQj09PXIuVU5TSUdORURfU0hPUlRfNV81XzVfMSYmKCQ9ci5SR0I1X0ExKX1yZXR1cm4oJD09PXIuUjE2Rnx8JD09PXIuUjMyRnx8JD09PXIuUkcxNkZ8fCQ9PT1yLlJHMzJGfHwkPT09ci5SR0JBMTZGfHwkPT09ci5SR0JBMzJGKSYmdC5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKSwkfWZ1bmN0aW9uIF8oUixDKXtsZXQgQjtyZXR1cm4gUj9DPT09bnVsbHx8Qz09PUxpfHxDPT09RXM/Qj1yLkRFUFRIMjRfU1RFTkNJTDg6Qz09PXhuP0I9ci5ERVBUSDMyRl9TVEVOQ0lMODpDPT09QXMmJihCPXIuREVQVEgyNF9TVEVOQ0lMOCxjb25zb2xlLndhcm4oIkRlcHRoVGV4dHVyZTogMTYgYml0IGRlcHRoIGF0dGFjaG1lbnQgaXMgbm90IHN1cHBvcnRlZCB3aXRoIHN0ZW5jaWwuIFVzaW5nIDI0LWJpdCBhdHRhY2htZW50LiIpKTpDPT09bnVsbHx8Qz09PUxpfHxDPT09RXM/Qj1yLkRFUFRIX0NPTVBPTkVOVDI0OkM9PT14bj9CPXIuREVQVEhfQ09NUE9ORU5UMzJGOkM9PT1BcyYmKEI9ci5ERVBUSF9DT01QT05FTlQxNiksQn1mdW5jdGlvbiBTKFIsQyl7cmV0dXJuIGcoUik9PT0hMHx8Ui5pc0ZyYW1lYnVmZmVyVGV4dHVyZSYmUi5taW5GaWx0ZXIhPT1YZSYmUi5taW5GaWx0ZXIhPT16ZT9NYXRoLmxvZzIoTWF0aC5tYXgoQy53aWR0aCxDLmhlaWdodCkpKzE6Ui5taXBtYXBzIT09dm9pZCAwJiZSLm1pcG1hcHMubGVuZ3RoPjA/Ui5taXBtYXBzLmxlbmd0aDpSLmlzQ29tcHJlc3NlZFRleHR1cmUmJkFycmF5LmlzQXJyYXkoUi5pbWFnZSk/Qy5taXBtYXBzLmxlbmd0aDoxfWZ1bmN0aW9uIHcoUil7Y29uc3QgQz1SLnRhcmdldDtDLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHcpLFQoQyksQy5pc1ZpZGVvVGV4dHVyZSYmdS5kZWxldGUoQyl9ZnVuY3Rpb24gQShSKXtjb25zdCBDPVIudGFyZ2V0O0MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsQSksTShDKX1mdW5jdGlvbiBUKFIpe2NvbnN0IEM9bi5nZXQoUik7aWYoQy5fX3dlYmdsSW5pdD09PXZvaWQgMClyZXR1cm47Y29uc3QgQj1SLnNvdXJjZSxWPWYuZ2V0KEIpO2lmKFYpe2NvbnN0IEo9VltDLl9fY2FjaGVLZXldO0oudXNlZFRpbWVzLS0sSi51c2VkVGltZXM9PT0wJiZiKFIpLE9iamVjdC5rZXlzKFYpLmxlbmd0aD09PTAmJmYuZGVsZXRlKEIpfW4ucmVtb3ZlKFIpfWZ1bmN0aW9uIGIoUil7Y29uc3QgQz1uLmdldChSKTtyLmRlbGV0ZVRleHR1cmUoQy5fX3dlYmdsVGV4dHVyZSk7Y29uc3QgQj1SLnNvdXJjZSxWPWYuZ2V0KEIpO2RlbGV0ZSBWW0MuX19jYWNoZUtleV0sby5tZW1vcnkudGV4dHVyZXMtLX1mdW5jdGlvbiBNKFIpe2NvbnN0IEM9bi5nZXQoUik7aWYoUi5kZXB0aFRleHR1cmUmJihSLmRlcHRoVGV4dHVyZS5kaXNwb3NlKCksbi5yZW1vdmUoUi5kZXB0aFRleHR1cmUpKSxSLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KWZvcihsZXQgVj0wO1Y8NjtWKyspe2lmKEFycmF5LmlzQXJyYXkoQy5fX3dlYmdsRnJhbWVidWZmZXJbVl0pKWZvcihsZXQgSj0wO0o8Qy5fX3dlYmdsRnJhbWVidWZmZXJbVl0ubGVuZ3RoO0orKylyLmRlbGV0ZUZyYW1lYnVmZmVyKEMuX193ZWJnbEZyYW1lYnVmZmVyW1ZdW0pdKTtlbHNlIHIuZGVsZXRlRnJhbWVidWZmZXIoQy5fX3dlYmdsRnJhbWVidWZmZXJbVl0pO0MuX193ZWJnbERlcHRoYnVmZmVyJiZyLmRlbGV0ZVJlbmRlcmJ1ZmZlcihDLl9fd2ViZ2xEZXB0aGJ1ZmZlcltWXSl9ZWxzZXtpZihBcnJheS5pc0FycmF5KEMuX193ZWJnbEZyYW1lYnVmZmVyKSlmb3IobGV0IFY9MDtWPEMuX193ZWJnbEZyYW1lYnVmZmVyLmxlbmd0aDtWKyspci5kZWxldGVGcmFtZWJ1ZmZlcihDLl9fd2ViZ2xGcmFtZWJ1ZmZlcltWXSk7ZWxzZSByLmRlbGV0ZUZyYW1lYnVmZmVyKEMuX193ZWJnbEZyYW1lYnVmZmVyKTtpZihDLl9fd2ViZ2xEZXB0aGJ1ZmZlciYmci5kZWxldGVSZW5kZXJidWZmZXIoQy5fX3dlYmdsRGVwdGhidWZmZXIpLEMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyJiZyLmRlbGV0ZUZyYW1lYnVmZmVyKEMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKSxDLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcilmb3IobGV0IFY9MDtWPEMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyLmxlbmd0aDtWKyspQy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbVl0mJnIuZGVsZXRlUmVuZGVyYnVmZmVyKEMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW1ZdKTtDLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlciYmci5kZWxldGVSZW5kZXJidWZmZXIoQy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIpfWNvbnN0IEI9Ui50ZXh0dXJlcztmb3IobGV0IFY9MCxKPUIubGVuZ3RoO1Y8SjtWKyspe2NvbnN0ICQ9bi5nZXQoQltWXSk7JC5fX3dlYmdsVGV4dHVyZSYmKHIuZGVsZXRlVGV4dHVyZSgkLl9fd2ViZ2xUZXh0dXJlKSxvLm1lbW9yeS50ZXh0dXJlcy0tKSxuLnJlbW92ZShCW1ZdKX1uLnJlbW92ZShSKX1sZXQgRT0wO2Z1bmN0aW9uIEQoKXtFPTB9ZnVuY3Rpb24gTCgpe2NvbnN0IFI9RTtyZXR1cm4gUj49aS5tYXhUZXh0dXJlcyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFRleHR1cmVzOiBUcnlpbmcgdG8gdXNlICIrUisiIHRleHR1cmUgdW5pdHMgd2hpbGUgdGhpcyBHUFUgc3VwcG9ydHMgb25seSAiK2kubWF4VGV4dHVyZXMpLEUrPTEsUn1mdW5jdGlvbiBGKFIpe2NvbnN0IEM9W107cmV0dXJuIEMucHVzaChSLndyYXBTKSxDLnB1c2goUi53cmFwVCksQy5wdXNoKFIud3JhcFJ8fDApLEMucHVzaChSLm1hZ0ZpbHRlciksQy5wdXNoKFIubWluRmlsdGVyKSxDLnB1c2goUi5hbmlzb3Ryb3B5KSxDLnB1c2goUi5pbnRlcm5hbEZvcm1hdCksQy5wdXNoKFIuZm9ybWF0KSxDLnB1c2goUi50eXBlKSxDLnB1c2goUi5nZW5lcmF0ZU1pcG1hcHMpLEMucHVzaChSLnByZW11bHRpcGx5QWxwaGEpLEMucHVzaChSLmZsaXBZKSxDLnB1c2goUi51bnBhY2tBbGlnbm1lbnQpLEMucHVzaChSLmNvbG9yU3BhY2UpLEMuam9pbigpfWZ1bmN0aW9uIE4oUixDKXtjb25zdCBCPW4uZ2V0KFIpO2lmKFIuaXNWaWRlb1RleHR1cmUmJnR0KFIpLFIuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPT09ITEmJlIudmVyc2lvbj4wJiZCLl9fdmVyc2lvbiE9PVIudmVyc2lvbil7Y29uc3QgVj1SLmltYWdlO2lmKFY9PT1udWxsKWNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgbm8gaW1hZ2UgZGF0YSBmb3VuZC4iKTtlbHNlIGlmKFYuY29tcGxldGU9PT0hMSljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIGluY29tcGxldGUiKTtlbHNle0soQixSLEMpO3JldHVybn19ZS5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsQi5fX3dlYmdsVGV4dHVyZSxyLlRFWFRVUkUwK0MpfWZ1bmN0aW9uIE8oUixDKXtjb25zdCBCPW4uZ2V0KFIpO2lmKFIudmVyc2lvbj4wJiZCLl9fdmVyc2lvbiE9PVIudmVyc2lvbil7SyhCLFIsQyk7cmV0dXJufWUuYmluZFRleHR1cmUoci5URVhUVVJFXzJEX0FSUkFZLEIuX193ZWJnbFRleHR1cmUsci5URVhUVVJFMCtDKX1mdW5jdGlvbiBIKFIsQyl7Y29uc3QgQj1uLmdldChSKTtpZihSLnZlcnNpb24+MCYmQi5fX3ZlcnNpb24hPT1SLnZlcnNpb24pe0soQixSLEMpO3JldHVybn1lLmJpbmRUZXh0dXJlKHIuVEVYVFVSRV8zRCxCLl9fd2ViZ2xUZXh0dXJlLHIuVEVYVFVSRTArQyl9ZnVuY3Rpb24geihSLEMpe2NvbnN0IEI9bi5nZXQoUik7aWYoUi52ZXJzaW9uPjAmJkIuX192ZXJzaW9uIT09Ui52ZXJzaW9uKXtvdChCLFIsQyk7cmV0dXJufWUuYmluZFRleHR1cmUoci5URVhUVVJFX0NVQkVfTUFQLEIuX193ZWJnbFRleHR1cmUsci5URVhUVVJFMCtDKX1jb25zdCBRPXtbTG9dOnIuUkVQRUFULFtHbl06ci5DTEFNUF9UT19FREdFLFtEb106ci5NSVJST1JFRF9SRVBFQVR9LHN0PXtbWGVdOnIuTkVBUkVTVCxbWGhdOnIuTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCxbd3NdOnIuTkVBUkVTVF9NSVBNQVBfTElORUFSLFt6ZV06ci5MSU5FQVIsW1VvXTpyLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCxbX2ldOnIuTElORUFSX01JUE1BUF9MSU5FQVJ9LGZ0PXtbem1dOnIuTkVWRVIsW1htXTpyLkFMV0FZUyxba21dOnIuTEVTUyxbZWZdOnIuTEVRVUFMLFtWbV06ci5FUVVBTCxbV21dOnIuR0VRVUFMLFtHbV06ci5HUkVBVEVSLFtIbV06ci5OT1RFUVVBTH07ZnVuY3Rpb24gUnQoUixDKXtpZihDLnR5cGU9PT14biYmdC5oYXMoIk9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciIpPT09ITEmJihDLm1hZ0ZpbHRlcj09PXplfHxDLm1hZ0ZpbHRlcj09PVVvfHxDLm1hZ0ZpbHRlcj09PXdzfHxDLm1hZ0ZpbHRlcj09PV9pfHxDLm1pbkZpbHRlcj09PXplfHxDLm1pbkZpbHRlcj09PVVvfHxDLm1pbkZpbHRlcj09PXdzfHxDLm1pbkZpbHRlcj09PV9pKSYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBVbmFibGUgdG8gdXNlIGxpbmVhciBmaWx0ZXJpbmcgd2l0aCBmbG9hdGluZyBwb2ludCB0ZXh0dXJlcy4gT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UuIiksci50ZXhQYXJhbWV0ZXJpKFIsci5URVhUVVJFX1dSQVBfUyxRW0Mud3JhcFNdKSxyLnRleFBhcmFtZXRlcmkoUixyLlRFWFRVUkVfV1JBUF9ULFFbQy53cmFwVF0pLChSPT09ci5URVhUVVJFXzNEfHxSPT09ci5URVhUVVJFXzJEX0FSUkFZKSYmci50ZXhQYXJhbWV0ZXJpKFIsci5URVhUVVJFX1dSQVBfUixRW0Mud3JhcFJdKSxyLnRleFBhcmFtZXRlcmkoUixyLlRFWFRVUkVfTUFHX0ZJTFRFUixzdFtDLm1hZ0ZpbHRlcl0pLHIudGV4UGFyYW1ldGVyaShSLHIuVEVYVFVSRV9NSU5fRklMVEVSLHN0W0MubWluRmlsdGVyXSksQy5jb21wYXJlRnVuY3Rpb24mJihyLnRleFBhcmFtZXRlcmkoUixyLlRFWFRVUkVfQ09NUEFSRV9NT0RFLHIuQ09NUEFSRV9SRUZfVE9fVEVYVFVSRSksci50ZXhQYXJhbWV0ZXJpKFIsci5URVhUVVJFX0NPTVBBUkVfRlVOQyxmdFtDLmNvbXBhcmVGdW5jdGlvbl0pKSx0LmhhcygiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik9PT0hMCl7aWYoQy5tYWdGaWx0ZXI9PT1YZXx8Qy5taW5GaWx0ZXIhPT13cyYmQy5taW5GaWx0ZXIhPT1faXx8Qy50eXBlPT09eG4mJnQuaGFzKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKT09PSExKXJldHVybjtpZihDLmFuaXNvdHJvcHk+MXx8bi5nZXQoQykuX19jdXJyZW50QW5pc290cm9weSl7Y29uc3QgQj10LmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7ci50ZXhQYXJhbWV0ZXJmKFIsQi5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCxNYXRoLm1pbihDLmFuaXNvdHJvcHksaS5nZXRNYXhBbmlzb3Ryb3B5KCkpKSxuLmdldChDKS5fX2N1cnJlbnRBbmlzb3Ryb3B5PUMuYW5pc290cm9weX19fWZ1bmN0aW9uIEZ0KFIsQyl7bGV0IEI9ITE7Ui5fX3dlYmdsSW5pdD09PXZvaWQgMCYmKFIuX193ZWJnbEluaXQ9ITAsQy5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIix3KSk7Y29uc3QgVj1DLnNvdXJjZTtsZXQgSj1mLmdldChWKTtKPT09dm9pZCAwJiYoSj17fSxmLnNldChWLEopKTtjb25zdCAkPUYoQyk7aWYoJCE9PVIuX19jYWNoZUtleSl7SlskXT09PXZvaWQgMCYmKEpbJF09e3RleHR1cmU6ci5jcmVhdGVUZXh0dXJlKCksdXNlZFRpbWVzOjB9LG8ubWVtb3J5LnRleHR1cmVzKyssQj0hMCksSlskXS51c2VkVGltZXMrKztjb25zdCB1dD1KW1IuX19jYWNoZUtleV07dXQhPT12b2lkIDAmJihKW1IuX19jYWNoZUtleV0udXNlZFRpbWVzLS0sdXQudXNlZFRpbWVzPT09MCYmYihDKSksUi5fX2NhY2hlS2V5PSQsUi5fX3dlYmdsVGV4dHVyZT1KWyRdLnRleHR1cmV9cmV0dXJuIEJ9ZnVuY3Rpb24gSyhSLEMsQil7bGV0IFY9ci5URVhUVVJFXzJEOyhDLmlzRGF0YUFycmF5VGV4dHVyZXx8Qy5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUpJiYoVj1yLlRFWFRVUkVfMkRfQVJSQVkpLEMuaXNEYXRhM0RUZXh0dXJlJiYoVj1yLlRFWFRVUkVfM0QpO2NvbnN0IEo9RnQoUixDKSwkPUMuc291cmNlO2UuYmluZFRleHR1cmUoVixSLl9fd2ViZ2xUZXh0dXJlLHIuVEVYVFVSRTArQik7Y29uc3QgdXQ9bi5nZXQoJCk7aWYoJC52ZXJzaW9uIT09dXQuX192ZXJzaW9ufHxKPT09ITApe2UuYWN0aXZlVGV4dHVyZShyLlRFWFRVUkUwK0IpO2NvbnN0IHJ0PW5lLmdldFByaW1hcmllcyhuZS53b3JraW5nQ29sb3JTcGFjZSksbXQ9Qy5jb2xvclNwYWNlPT09RGk/bnVsbDpuZS5nZXRQcmltYXJpZXMoQy5jb2xvclNwYWNlKSxBdD1DLmNvbG9yU3BhY2U9PT1EaXx8cnQ9PT1tdD9yLk5PTkU6ci5CUk9XU0VSX0RFRkFVTFRfV0VCR0w7ci5waXhlbFN0b3JlaShyLlVOUEFDS19GTElQX1lfV0VCR0wsQy5mbGlwWSksci5waXhlbFN0b3JlaShyLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCxDLnByZW11bHRpcGx5QWxwaGEpLHIucGl4ZWxTdG9yZWkoci5VTlBBQ0tfQUxJR05NRU5ULEMudW5wYWNrQWxpZ25tZW50KSxyLnBpeGVsU3RvcmVpKHIuVU5QQUNLX0NPTE9SU1BBQ0VfQ09OVkVSU0lPTl9XRUJHTCxBdCk7bGV0IGl0PXgoQy5pbWFnZSwhMSxpLm1heFRleHR1cmVTaXplKTtpdD1FdChDLGl0KTtjb25zdCBodD1zLmNvbnZlcnQoQy5mb3JtYXQsQy5jb2xvclNwYWNlKSxMdD1zLmNvbnZlcnQoQy50eXBlKTtsZXQgenQ9eShDLmludGVybmFsRm9ybWF0LGh0LEx0LEMuY29sb3JTcGFjZSxDLmlzVmlkZW9UZXh0dXJlKTtSdChWLEMpO2xldCBidDtjb25zdCBlZT1DLm1pcG1hcHMsWnQ9Qy5pc1ZpZGVvVGV4dHVyZSE9PSEwLHBlPXV0Ll9fdmVyc2lvbj09PXZvaWQgMHx8Sj09PSEwLGs9JC5kYXRhUmVhZHkseHQ9UyhDLGl0KTtpZihDLmlzRGVwdGhUZXh0dXJlKXp0PV8oQy5mb3JtYXQ9PT1ScyxDLnR5cGUpLHBlJiYoWnQ/ZS50ZXhTdG9yYWdlMkQoci5URVhUVVJFXzJELDEsenQsaXQud2lkdGgsaXQuaGVpZ2h0KTplLnRleEltYWdlMkQoci5URVhUVVJFXzJELDAsenQsaXQud2lkdGgsaXQuaGVpZ2h0LDAsaHQsTHQsbnVsbCkpO2Vsc2UgaWYoQy5pc0RhdGFUZXh0dXJlKWlmKGVlLmxlbmd0aD4wKXtadCYmcGUmJmUudGV4U3RvcmFnZTJEKHIuVEVYVFVSRV8yRCx4dCx6dCxlZVswXS53aWR0aCxlZVswXS5oZWlnaHQpO2ZvcihsZXQgaj0wLG50PWVlLmxlbmd0aDtqPG50O2orKylidD1lZVtqXSxadD9rJiZlLnRleFN1YkltYWdlMkQoci5URVhUVVJFXzJELGosMCwwLGJ0LndpZHRoLGJ0LmhlaWdodCxodCxMdCxidC5kYXRhKTplLnRleEltYWdlMkQoci5URVhUVVJFXzJELGosenQsYnQud2lkdGgsYnQuaGVpZ2h0LDAsaHQsTHQsYnQuZGF0YSk7Qy5nZW5lcmF0ZU1pcG1hcHM9ITF9ZWxzZSBadD8ocGUmJmUudGV4U3RvcmFnZTJEKHIuVEVYVFVSRV8yRCx4dCx6dCxpdC53aWR0aCxpdC5oZWlnaHQpLGsmJmUudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfMkQsMCwwLDAsaXQud2lkdGgsaXQuaGVpZ2h0LGh0LEx0LGl0LmRhdGEpKTplLnRleEltYWdlMkQoci5URVhUVVJFXzJELDAsenQsaXQud2lkdGgsaXQuaGVpZ2h0LDAsaHQsTHQsaXQuZGF0YSk7ZWxzZSBpZihDLmlzQ29tcHJlc3NlZFRleHR1cmUpaWYoQy5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUpe1p0JiZwZSYmZS50ZXhTdG9yYWdlM0Qoci5URVhUVVJFXzJEX0FSUkFZLHh0LHp0LGVlWzBdLndpZHRoLGVlWzBdLmhlaWdodCxpdC5kZXB0aCk7Zm9yKGxldCBqPTAsbnQ9ZWUubGVuZ3RoO2o8bnQ7aisrKWlmKGJ0PWVlW2pdLEMuZm9ybWF0IT09bm4paWYoaHQhPT1udWxsKWlmKFp0KXtpZihrKWlmKEMubGF5ZXJVcGRhdGVzLnNpemU+MCl7Y29uc3QgU3Q9bWQoYnQud2lkdGgsYnQuaGVpZ2h0LEMuZm9ybWF0LEMudHlwZSk7Zm9yKGNvbnN0IF90IG9mIEMubGF5ZXJVcGRhdGVzKXtjb25zdCBqdD1idC5kYXRhLnN1YmFycmF5KF90KlN0L2J0LmRhdGEuQllURVNfUEVSX0VMRU1FTlQsKF90KzEpKlN0L2J0LmRhdGEuQllURVNfUEVSX0VMRU1FTlQpO2UuY29tcHJlc3NlZFRleFN1YkltYWdlM0Qoci5URVhUVVJFXzJEX0FSUkFZLGosMCwwLF90LGJ0LndpZHRoLGJ0LmhlaWdodCwxLGh0LGp0KX1DLmNsZWFyTGF5ZXJVcGRhdGVzKCl9ZWxzZSBlLmNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKHIuVEVYVFVSRV8yRF9BUlJBWSxqLDAsMCwwLGJ0LndpZHRoLGJ0LmhlaWdodCxpdC5kZXB0aCxodCxidC5kYXRhKX1lbHNlIGUuY29tcHJlc3NlZFRleEltYWdlM0Qoci5URVhUVVJFXzJEX0FSUkFZLGosenQsYnQud2lkdGgsYnQuaGVpZ2h0LGl0LmRlcHRoLDAsYnQuZGF0YSwwLDApO2Vsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpIik7ZWxzZSBadD9rJiZlLnRleFN1YkltYWdlM0Qoci5URVhUVVJFXzJEX0FSUkFZLGosMCwwLDAsYnQud2lkdGgsYnQuaGVpZ2h0LGl0LmRlcHRoLGh0LEx0LGJ0LmRhdGEpOmUudGV4SW1hZ2UzRChyLlRFWFRVUkVfMkRfQVJSQVksaix6dCxidC53aWR0aCxidC5oZWlnaHQsaXQuZGVwdGgsMCxodCxMdCxidC5kYXRhKX1lbHNle1p0JiZwZSYmZS50ZXhTdG9yYWdlMkQoci5URVhUVVJFXzJELHh0LHp0LGVlWzBdLndpZHRoLGVlWzBdLmhlaWdodCk7Zm9yKGxldCBqPTAsbnQ9ZWUubGVuZ3RoO2o8bnQ7aisrKWJ0PWVlW2pdLEMuZm9ybWF0IT09bm4/aHQhPT1udWxsP1p0P2smJmUuY29tcHJlc3NlZFRleFN1YkltYWdlMkQoci5URVhUVVJFXzJELGosMCwwLGJ0LndpZHRoLGJ0LmhlaWdodCxodCxidC5kYXRhKTplLmNvbXByZXNzZWRUZXhJbWFnZTJEKHIuVEVYVFVSRV8yRCxqLHp0LGJ0LndpZHRoLGJ0LmhlaWdodCwwLGJ0LmRhdGEpOmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnVwbG9hZFRleHR1cmUoKSIpOlp0P2smJmUudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfMkQsaiwwLDAsYnQud2lkdGgsYnQuaGVpZ2h0LGh0LEx0LGJ0LmRhdGEpOmUudGV4SW1hZ2UyRChyLlRFWFRVUkVfMkQsaix6dCxidC53aWR0aCxidC5oZWlnaHQsMCxodCxMdCxidC5kYXRhKX1lbHNlIGlmKEMuaXNEYXRhQXJyYXlUZXh0dXJlKWlmKFp0KXtpZihwZSYmZS50ZXhTdG9yYWdlM0Qoci5URVhUVVJFXzJEX0FSUkFZLHh0LHp0LGl0LndpZHRoLGl0LmhlaWdodCxpdC5kZXB0aCksaylpZihDLmxheWVyVXBkYXRlcy5zaXplPjApe2NvbnN0IGo9bWQoaXQud2lkdGgsaXQuaGVpZ2h0LEMuZm9ybWF0LEMudHlwZSk7Zm9yKGNvbnN0IG50IG9mIEMubGF5ZXJVcGRhdGVzKXtjb25zdCBTdD1pdC5kYXRhLnN1YmFycmF5KG50KmovaXQuZGF0YS5CWVRFU19QRVJfRUxFTUVOVCwobnQrMSkqai9pdC5kYXRhLkJZVEVTX1BFUl9FTEVNRU5UKTtlLnRleFN1YkltYWdlM0Qoci5URVhUVVJFXzJEX0FSUkFZLDAsMCwwLG50LGl0LndpZHRoLGl0LmhlaWdodCwxLGh0LEx0LFN0KX1DLmNsZWFyTGF5ZXJVcGRhdGVzKCl9ZWxzZSBlLnRleFN1YkltYWdlM0Qoci5URVhUVVJFXzJEX0FSUkFZLDAsMCwwLDAsaXQud2lkdGgsaXQuaGVpZ2h0LGl0LmRlcHRoLGh0LEx0LGl0LmRhdGEpfWVsc2UgZS50ZXhJbWFnZTNEKHIuVEVYVFVSRV8yRF9BUlJBWSwwLHp0LGl0LndpZHRoLGl0LmhlaWdodCxpdC5kZXB0aCwwLGh0LEx0LGl0LmRhdGEpO2Vsc2UgaWYoQy5pc0RhdGEzRFRleHR1cmUpWnQ/KHBlJiZlLnRleFN0b3JhZ2UzRChyLlRFWFRVUkVfM0QseHQsenQsaXQud2lkdGgsaXQuaGVpZ2h0LGl0LmRlcHRoKSxrJiZlLnRleFN1YkltYWdlM0Qoci5URVhUVVJFXzNELDAsMCwwLDAsaXQud2lkdGgsaXQuaGVpZ2h0LGl0LmRlcHRoLGh0LEx0LGl0LmRhdGEpKTplLnRleEltYWdlM0Qoci5URVhUVVJFXzNELDAsenQsaXQud2lkdGgsaXQuaGVpZ2h0LGl0LmRlcHRoLDAsaHQsTHQsaXQuZGF0YSk7ZWxzZSBpZihDLmlzRnJhbWVidWZmZXJUZXh0dXJlKXtpZihwZSlpZihadCllLnRleFN0b3JhZ2UyRChyLlRFWFRVUkVfMkQseHQsenQsaXQud2lkdGgsaXQuaGVpZ2h0KTtlbHNle2xldCBqPWl0LndpZHRoLG50PWl0LmhlaWdodDtmb3IobGV0IFN0PTA7U3Q8eHQ7U3QrKyllLnRleEltYWdlMkQoci5URVhUVVJFXzJELFN0LHp0LGosbnQsMCxodCxMdCxudWxsKSxqPj49MSxudD4+PTF9fWVsc2UgaWYoZWUubGVuZ3RoPjApe2lmKFp0JiZwZSl7Y29uc3Qgaj1YKGVlWzBdKTtlLnRleFN0b3JhZ2UyRChyLlRFWFRVUkVfMkQseHQsenQsai53aWR0aCxqLmhlaWdodCl9Zm9yKGxldCBqPTAsbnQ9ZWUubGVuZ3RoO2o8bnQ7aisrKWJ0PWVlW2pdLFp0P2smJmUudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfMkQsaiwwLDAsaHQsTHQsYnQpOmUudGV4SW1hZ2UyRChyLlRFWFRVUkVfMkQsaix6dCxodCxMdCxidCk7Qy5nZW5lcmF0ZU1pcG1hcHM9ITF9ZWxzZSBpZihadCl7aWYocGUpe2NvbnN0IGo9WChpdCk7ZS50ZXhTdG9yYWdlMkQoci5URVhUVVJFXzJELHh0LHp0LGoud2lkdGgsai5oZWlnaHQpfWsmJmUudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfMkQsMCwwLDAsaHQsTHQsaXQpfWVsc2UgZS50ZXhJbWFnZTJEKHIuVEVYVFVSRV8yRCwwLHp0LGh0LEx0LGl0KTtnKEMpJiZtKFYpLHV0Ll9fdmVyc2lvbj0kLnZlcnNpb24sQy5vblVwZGF0ZSYmQy5vblVwZGF0ZShDKX1SLl9fdmVyc2lvbj1DLnZlcnNpb259ZnVuY3Rpb24gb3QoUixDLEIpe2lmKEMuaW1hZ2UubGVuZ3RoIT09NilyZXR1cm47Y29uc3QgVj1GdChSLEMpLEo9Qy5zb3VyY2U7ZS5iaW5kVGV4dHVyZShyLlRFWFRVUkVfQ1VCRV9NQVAsUi5fX3dlYmdsVGV4dHVyZSxyLlRFWFRVUkUwK0IpO2NvbnN0ICQ9bi5nZXQoSik7aWYoSi52ZXJzaW9uIT09JC5fX3ZlcnNpb258fFY9PT0hMCl7ZS5hY3RpdmVUZXh0dXJlKHIuVEVYVFVSRTArQik7Y29uc3QgdXQ9bmUuZ2V0UHJpbWFyaWVzKG5lLndvcmtpbmdDb2xvclNwYWNlKSxydD1DLmNvbG9yU3BhY2U9PT1EaT9udWxsOm5lLmdldFByaW1hcmllcyhDLmNvbG9yU3BhY2UpLG10PUMuY29sb3JTcGFjZT09PURpfHx1dD09PXJ0P3IuTk9ORTpyLkJST1dTRVJfREVGQVVMVF9XRUJHTDtyLnBpeGVsU3RvcmVpKHIuVU5QQUNLX0ZMSVBfWV9XRUJHTCxDLmZsaXBZKSxyLnBpeGVsU3RvcmVpKHIuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLEMucHJlbXVsdGlwbHlBbHBoYSksci5waXhlbFN0b3JlaShyLlVOUEFDS19BTElHTk1FTlQsQy51bnBhY2tBbGlnbm1lbnQpLHIucGl4ZWxTdG9yZWkoci5VTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMLG10KTtjb25zdCBBdD1DLmlzQ29tcHJlc3NlZFRleHR1cmV8fEMuaW1hZ2VbMF0uaXNDb21wcmVzc2VkVGV4dHVyZSxpdD1DLmltYWdlWzBdJiZDLmltYWdlWzBdLmlzRGF0YVRleHR1cmUsaHQ9W107Zm9yKGxldCBudD0wO250PDY7bnQrKykhQXQmJiFpdD9odFtudF09eChDLmltYWdlW250XSwhMCxpLm1heEN1YmVtYXBTaXplKTpodFtudF09aXQ/Qy5pbWFnZVtudF0uaW1hZ2U6Qy5pbWFnZVtudF0saHRbbnRdPUV0KEMsaHRbbnRdKTtjb25zdCBMdD1odFswXSx6dD1zLmNvbnZlcnQoQy5mb3JtYXQsQy5jb2xvclNwYWNlKSxidD1zLmNvbnZlcnQoQy50eXBlKSxlZT15KEMuaW50ZXJuYWxGb3JtYXQsenQsYnQsQy5jb2xvclNwYWNlKSxadD1DLmlzVmlkZW9UZXh0dXJlIT09ITAscGU9JC5fX3ZlcnNpb249PT12b2lkIDB8fFY9PT0hMCxrPUouZGF0YVJlYWR5O2xldCB4dD1TKEMsTHQpO1J0KHIuVEVYVFVSRV9DVUJFX01BUCxDKTtsZXQgajtpZihBdCl7WnQmJnBlJiZlLnRleFN0b3JhZ2UyRChyLlRFWFRVUkVfQ1VCRV9NQVAseHQsZWUsTHQud2lkdGgsTHQuaGVpZ2h0KTtmb3IobGV0IG50PTA7bnQ8NjtudCsrKXtqPWh0W250XS5taXBtYXBzO2ZvcihsZXQgU3Q9MDtTdDxqLmxlbmd0aDtTdCsrKXtjb25zdCBfdD1qW1N0XTtDLmZvcm1hdCE9PW5uP3p0IT09bnVsbD9adD9rJiZlLmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK250LFN0LDAsMCxfdC53aWR0aCxfdC5oZWlnaHQsenQsX3QuZGF0YSk6ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRChyLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtudCxTdCxlZSxfdC53aWR0aCxfdC5oZWlnaHQsMCxfdC5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpIik6WnQ/ayYmZS50ZXhTdWJJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK250LFN0LDAsMCxfdC53aWR0aCxfdC5oZWlnaHQsenQsYnQsX3QuZGF0YSk6ZS50ZXhJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK250LFN0LGVlLF90LndpZHRoLF90LmhlaWdodCwwLHp0LGJ0LF90LmRhdGEpfX19ZWxzZXtpZihqPUMubWlwbWFwcyxadCYmcGUpe2oubGVuZ3RoPjAmJnh0Kys7Y29uc3QgbnQ9WChodFswXSk7ZS50ZXhTdG9yYWdlMkQoci5URVhUVVJFX0NVQkVfTUFQLHh0LGVlLG50LndpZHRoLG50LmhlaWdodCl9Zm9yKGxldCBudD0wO250PDY7bnQrKylpZihpdCl7WnQ/ayYmZS50ZXhTdWJJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK250LDAsMCwwLGh0W250XS53aWR0aCxodFtudF0uaGVpZ2h0LHp0LGJ0LGh0W250XS5kYXRhKTplLnRleEltYWdlMkQoci5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1grbnQsMCxlZSxodFtudF0ud2lkdGgsaHRbbnRdLmhlaWdodCwwLHp0LGJ0LGh0W250XS5kYXRhKTtmb3IobGV0IFN0PTA7U3Q8ai5sZW5ndGg7U3QrKyl7Y29uc3QganQ9altTdF0uaW1hZ2VbbnRdLmltYWdlO1p0P2smJmUudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtudCxTdCsxLDAsMCxqdC53aWR0aCxqdC5oZWlnaHQsenQsYnQsanQuZGF0YSk6ZS50ZXhJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK250LFN0KzEsZWUsanQud2lkdGgsanQuaGVpZ2h0LDAsenQsYnQsanQuZGF0YSl9fWVsc2V7WnQ/ayYmZS50ZXhTdWJJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK250LDAsMCwwLHp0LGJ0LGh0W250XSk6ZS50ZXhJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK250LDAsZWUsenQsYnQsaHRbbnRdKTtmb3IobGV0IFN0PTA7U3Q8ai5sZW5ndGg7U3QrKyl7Y29uc3QgX3Q9altTdF07WnQ/ayYmZS50ZXhTdWJJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK250LFN0KzEsMCwwLHp0LGJ0LF90LmltYWdlW250XSk6ZS50ZXhJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK250LFN0KzEsZWUsenQsYnQsX3QuaW1hZ2VbbnRdKX19fWcoQykmJm0oci5URVhUVVJFX0NVQkVfTUFQKSwkLl9fdmVyc2lvbj1KLnZlcnNpb24sQy5vblVwZGF0ZSYmQy5vblVwZGF0ZShDKX1SLl9fdmVyc2lvbj1DLnZlcnNpb259ZnVuY3Rpb24gTXQoUixDLEIsVixKLCQpe2NvbnN0IHV0PXMuY29udmVydChCLmZvcm1hdCxCLmNvbG9yU3BhY2UpLHJ0PXMuY29udmVydChCLnR5cGUpLG10PXkoQi5pbnRlcm5hbEZvcm1hdCx1dCxydCxCLmNvbG9yU3BhY2UpLEF0PW4uZ2V0KEMpLGl0PW4uZ2V0KEIpO2lmKGl0Ll9fcmVuZGVyVGFyZ2V0PUMsIUF0Ll9faGFzRXh0ZXJuYWxUZXh0dXJlcyl7Y29uc3QgaHQ9TWF0aC5tYXgoMSxDLndpZHRoPj4kKSxMdD1NYXRoLm1heCgxLEMuaGVpZ2h0Pj4kKTtKPT09ci5URVhUVVJFXzNEfHxKPT09ci5URVhUVVJFXzJEX0FSUkFZP2UudGV4SW1hZ2UzRChKLCQsbXQsaHQsTHQsQy5kZXB0aCwwLHV0LHJ0LG51bGwpOmUudGV4SW1hZ2UyRChKLCQsbXQsaHQsTHQsMCx1dCxydCxudWxsKX1lLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLFIpLGF0KEMpP2EuZnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVChyLkZSQU1FQlVGRkVSLFYsSixpdC5fX3dlYmdsVGV4dHVyZSwwLGV0KEMpKTooSj09PXIuVEVYVFVSRV8yRHx8Sj49ci5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gmJko8PXIuVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aKSYmci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkZSQU1FQlVGRkVSLFYsSixpdC5fX3dlYmdsVGV4dHVyZSwkKSxlLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLG51bGwpfWZ1bmN0aW9uIGR0KFIsQyxCKXtpZihyLmJpbmRSZW5kZXJidWZmZXIoci5SRU5ERVJCVUZGRVIsUiksQy5kZXB0aEJ1ZmZlcil7Y29uc3QgVj1DLmRlcHRoVGV4dHVyZSxKPVYmJlYuaXNEZXB0aFRleHR1cmU/Vi50eXBlOm51bGwsJD1fKEMuc3RlbmNpbEJ1ZmZlcixKKSx1dD1DLnN0ZW5jaWxCdWZmZXI/ci5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQ6ci5ERVBUSF9BVFRBQ0hNRU5ULHJ0PWV0KEMpO2F0KEMpP2EucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKHIuUkVOREVSQlVGRkVSLHJ0LCQsQy53aWR0aCxDLmhlaWdodCk6Qj9yLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZShyLlJFTkRFUkJVRkZFUixydCwkLEMud2lkdGgsQy5oZWlnaHQpOnIucmVuZGVyYnVmZmVyU3RvcmFnZShyLlJFTkRFUkJVRkZFUiwkLEMud2lkdGgsQy5oZWlnaHQpLHIuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoci5GUkFNRUJVRkZFUix1dCxyLlJFTkRFUkJVRkZFUixSKX1lbHNle2NvbnN0IFY9Qy50ZXh0dXJlcztmb3IobGV0IEo9MDtKPFYubGVuZ3RoO0orKyl7Y29uc3QgJD1WW0pdLHV0PXMuY29udmVydCgkLmZvcm1hdCwkLmNvbG9yU3BhY2UpLHJ0PXMuY29udmVydCgkLnR5cGUpLG10PXkoJC5pbnRlcm5hbEZvcm1hdCx1dCxydCwkLmNvbG9yU3BhY2UpLEF0PWV0KEMpO0ImJmF0KEMpPT09ITE/ci5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoci5SRU5ERVJCVUZGRVIsQXQsbXQsQy53aWR0aCxDLmhlaWdodCk6YXQoQyk/YS5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoci5SRU5ERVJCVUZGRVIsQXQsbXQsQy53aWR0aCxDLmhlaWdodCk6ci5yZW5kZXJidWZmZXJTdG9yYWdlKHIuUkVOREVSQlVGRkVSLG10LEMud2lkdGgsQy5oZWlnaHQpfX1yLmJpbmRSZW5kZXJidWZmZXIoci5SRU5ERVJCVUZGRVIsbnVsbCl9ZnVuY3Rpb24gSXQoUixDKXtpZihDJiZDLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KXRocm93IG5ldyBFcnJvcigiRGVwdGggVGV4dHVyZSB3aXRoIGN1YmUgcmVuZGVyIHRhcmdldHMgaXMgbm90IHN1cHBvcnRlZCIpO2lmKGUuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsUiksIShDLmRlcHRoVGV4dHVyZSYmQy5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUpKXRocm93IG5ldyBFcnJvcigicmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFRIUkVFLkRlcHRoVGV4dHVyZSIpO2NvbnN0IFY9bi5nZXQoQy5kZXB0aFRleHR1cmUpO1YuX19yZW5kZXJUYXJnZXQ9QywoIVYuX193ZWJnbFRleHR1cmV8fEMuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoIT09Qy53aWR0aHx8Qy5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0IT09Qy5oZWlnaHQpJiYoQy5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGg9Qy53aWR0aCxDLmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQ9Qy5oZWlnaHQsQy5kZXB0aFRleHR1cmUubmVlZHNVcGRhdGU9ITApLE4oQy5kZXB0aFRleHR1cmUsMCk7Y29uc3QgSj1WLl9fd2ViZ2xUZXh0dXJlLCQ9ZXQoQyk7aWYoQy5kZXB0aFRleHR1cmUuZm9ybWF0PT09Q3MpYXQoQyk/YS5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKHIuRlJBTUVCVUZGRVIsci5ERVBUSF9BVFRBQ0hNRU5ULHIuVEVYVFVSRV8yRCxKLDAsJCk6ci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkZSQU1FQlVGRkVSLHIuREVQVEhfQVRUQUNITUVOVCxyLlRFWFRVUkVfMkQsSiwwKTtlbHNlIGlmKEMuZGVwdGhUZXh0dXJlLmZvcm1hdD09PVJzKWF0KEMpP2EuZnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVChyLkZSQU1FQlVGRkVSLHIuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULHIuVEVYVFVSRV8yRCxKLDAsJCk6ci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkZSQU1FQlVGRkVSLHIuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULHIuVEVYVFVSRV8yRCxKLDApO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGRlcHRoVGV4dHVyZSBmb3JtYXQiKX1mdW5jdGlvbiAkdChSKXtjb25zdCBDPW4uZ2V0KFIpLEI9Ui5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldD09PSEwO2lmKEMuX19ib3VuZERlcHRoVGV4dHVyZSE9PVIuZGVwdGhUZXh0dXJlKXtjb25zdCBWPVIuZGVwdGhUZXh0dXJlO2lmKEMuX19kZXB0aERpc3Bvc2VDYWxsYmFjayYmQy5fX2RlcHRoRGlzcG9zZUNhbGxiYWNrKCksVil7Y29uc3QgSj0oKT0+e2RlbGV0ZSBDLl9fYm91bmREZXB0aFRleHR1cmUsZGVsZXRlIEMuX19kZXB0aERpc3Bvc2VDYWxsYmFjayxWLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLEopfTtWLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLEopLEMuX19kZXB0aERpc3Bvc2VDYWxsYmFjaz1KfUMuX19ib3VuZERlcHRoVGV4dHVyZT1WfWlmKFIuZGVwdGhUZXh0dXJlJiYhQy5fX2F1dG9BbGxvY2F0ZURlcHRoQnVmZmVyKXtpZihCKXRocm93IG5ldyBFcnJvcigidGFyZ2V0LmRlcHRoVGV4dHVyZSBub3Qgc3VwcG9ydGVkIGluIEN1YmUgcmVuZGVyIHRhcmdldHMiKTtjb25zdCBWPVIudGV4dHVyZS5taXBtYXBzO1YmJlYubGVuZ3RoPjA/SXQoQy5fX3dlYmdsRnJhbWVidWZmZXJbMF0sUik6SXQoQy5fX3dlYmdsRnJhbWVidWZmZXIsUil9ZWxzZSBpZihCKXtDLl9fd2ViZ2xEZXB0aGJ1ZmZlcj1bXTtmb3IobGV0IFY9MDtWPDY7VisrKWlmKGUuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsQy5fX3dlYmdsRnJhbWVidWZmZXJbVl0pLEMuX193ZWJnbERlcHRoYnVmZmVyW1ZdPT09dm9pZCAwKUMuX193ZWJnbERlcHRoYnVmZmVyW1ZdPXIuY3JlYXRlUmVuZGVyYnVmZmVyKCksZHQoQy5fX3dlYmdsRGVwdGhidWZmZXJbVl0sUiwhMSk7ZWxzZXtjb25zdCBKPVIuc3RlbmNpbEJ1ZmZlcj9yLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVDpyLkRFUFRIX0FUVEFDSE1FTlQsJD1DLl9fd2ViZ2xEZXB0aGJ1ZmZlcltWXTtyLmJpbmRSZW5kZXJidWZmZXIoci5SRU5ERVJCVUZGRVIsJCksci5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihyLkZSQU1FQlVGRkVSLEosci5SRU5ERVJCVUZGRVIsJCl9fWVsc2V7Y29uc3QgVj1SLnRleHR1cmUubWlwbWFwcztpZihWJiZWLmxlbmd0aD4wP2UuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsQy5fX3dlYmdsRnJhbWVidWZmZXJbMF0pOmUuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsQy5fX3dlYmdsRnJhbWVidWZmZXIpLEMuX193ZWJnbERlcHRoYnVmZmVyPT09dm9pZCAwKUMuX193ZWJnbERlcHRoYnVmZmVyPXIuY3JlYXRlUmVuZGVyYnVmZmVyKCksZHQoQy5fX3dlYmdsRGVwdGhidWZmZXIsUiwhMSk7ZWxzZXtjb25zdCBKPVIuc3RlbmNpbEJ1ZmZlcj9yLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVDpyLkRFUFRIX0FUVEFDSE1FTlQsJD1DLl9fd2ViZ2xEZXB0aGJ1ZmZlcjtyLmJpbmRSZW5kZXJidWZmZXIoci5SRU5ERVJCVUZGRVIsJCksci5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihyLkZSQU1FQlVGRkVSLEosci5SRU5ERVJCVUZGRVIsJCl9fWUuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsbnVsbCl9ZnVuY3Rpb24gUHQoUixDLEIpe2NvbnN0IFY9bi5nZXQoUik7QyE9PXZvaWQgMCYmTXQoVi5fX3dlYmdsRnJhbWVidWZmZXIsUixSLnRleHR1cmUsci5DT0xPUl9BVFRBQ0hNRU5UMCxyLlRFWFRVUkVfMkQsMCksQiE9PXZvaWQgMCYmJHQoUil9ZnVuY3Rpb24gX2UoUil7Y29uc3QgQz1SLnRleHR1cmUsQj1uLmdldChSKSxWPW4uZ2V0KEMpO1IuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsQSk7Y29uc3QgSj1SLnRleHR1cmVzLCQ9Ui5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldD09PSEwLHV0PUoubGVuZ3RoPjE7aWYodXR8fChWLl9fd2ViZ2xUZXh0dXJlPT09dm9pZCAwJiYoVi5fX3dlYmdsVGV4dHVyZT1yLmNyZWF0ZVRleHR1cmUoKSksVi5fX3ZlcnNpb249Qy52ZXJzaW9uLG8ubWVtb3J5LnRleHR1cmVzKyspLCQpe0IuX193ZWJnbEZyYW1lYnVmZmVyPVtdO2ZvcihsZXQgcnQ9MDtydDw2O3J0KyspaWYoQy5taXBtYXBzJiZDLm1pcG1hcHMubGVuZ3RoPjApe0IuX193ZWJnbEZyYW1lYnVmZmVyW3J0XT1bXTtmb3IobGV0IG10PTA7bXQ8Qy5taXBtYXBzLmxlbmd0aDttdCsrKUIuX193ZWJnbEZyYW1lYnVmZmVyW3J0XVttdF09ci5jcmVhdGVGcmFtZWJ1ZmZlcigpfWVsc2UgQi5fX3dlYmdsRnJhbWVidWZmZXJbcnRdPXIuY3JlYXRlRnJhbWVidWZmZXIoKX1lbHNle2lmKEMubWlwbWFwcyYmQy5taXBtYXBzLmxlbmd0aD4wKXtCLl9fd2ViZ2xGcmFtZWJ1ZmZlcj1bXTtmb3IobGV0IHJ0PTA7cnQ8Qy5taXBtYXBzLmxlbmd0aDtydCsrKUIuX193ZWJnbEZyYW1lYnVmZmVyW3J0XT1yLmNyZWF0ZUZyYW1lYnVmZmVyKCl9ZWxzZSBCLl9fd2ViZ2xGcmFtZWJ1ZmZlcj1yLmNyZWF0ZUZyYW1lYnVmZmVyKCk7aWYodXQpZm9yKGxldCBydD0wLG10PUoubGVuZ3RoO3J0PG10O3J0Kyspe2NvbnN0IEF0PW4uZ2V0KEpbcnRdKTtBdC5fX3dlYmdsVGV4dHVyZT09PXZvaWQgMCYmKEF0Ll9fd2ViZ2xUZXh0dXJlPXIuY3JlYXRlVGV4dHVyZSgpLG8ubWVtb3J5LnRleHR1cmVzKyspfWlmKFIuc2FtcGxlcz4wJiZhdChSKT09PSExKXtCLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcj1yLmNyZWF0ZUZyYW1lYnVmZmVyKCksQi5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXI9W10sZS5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixCLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7Zm9yKGxldCBydD0wO3J0PEoubGVuZ3RoO3J0Kyspe2NvbnN0IG10PUpbcnRdO0IuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW3J0XT1yLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLHIuYmluZFJlbmRlcmJ1ZmZlcihyLlJFTkRFUkJVRkZFUixCLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltydF0pO2NvbnN0IEF0PXMuY29udmVydChtdC5mb3JtYXQsbXQuY29sb3JTcGFjZSksaXQ9cy5jb252ZXJ0KG10LnR5cGUpLGh0PXkobXQuaW50ZXJuYWxGb3JtYXQsQXQsaXQsbXQuY29sb3JTcGFjZSxSLmlzWFJSZW5kZXJUYXJnZXQ9PT0hMCksTHQ9ZXQoUik7ci5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoci5SRU5ERVJCVUZGRVIsTHQsaHQsUi53aWR0aCxSLmhlaWdodCksci5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihyLkZSQU1FQlVGRkVSLHIuQ09MT1JfQVRUQUNITUVOVDArcnQsci5SRU5ERVJCVUZGRVIsQi5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbcnRdKX1yLmJpbmRSZW5kZXJidWZmZXIoci5SRU5ERVJCVUZGRVIsbnVsbCksUi5kZXB0aEJ1ZmZlciYmKEIuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyPXIuY3JlYXRlUmVuZGVyYnVmZmVyKCksZHQoQi5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIsUiwhMCkpLGUuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsbnVsbCl9fWlmKCQpe2UuYmluZFRleHR1cmUoci5URVhUVVJFX0NVQkVfTUFQLFYuX193ZWJnbFRleHR1cmUpLFJ0KHIuVEVYVFVSRV9DVUJFX01BUCxDKTtmb3IobGV0IHJ0PTA7cnQ8NjtydCsrKWlmKEMubWlwbWFwcyYmQy5taXBtYXBzLmxlbmd0aD4wKWZvcihsZXQgbXQ9MDttdDxDLm1pcG1hcHMubGVuZ3RoO210KyspTXQoQi5fX3dlYmdsRnJhbWVidWZmZXJbcnRdW210XSxSLEMsci5DT0xPUl9BVFRBQ0hNRU5UMCxyLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtydCxtdCk7ZWxzZSBNdChCLl9fd2ViZ2xGcmFtZWJ1ZmZlcltydF0sUixDLHIuQ09MT1JfQVRUQUNITUVOVDAsci5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1grcnQsMCk7ZyhDKSYmbShyLlRFWFRVUkVfQ1VCRV9NQVApLGUudW5iaW5kVGV4dHVyZSgpfWVsc2UgaWYodXQpe2ZvcihsZXQgcnQ9MCxtdD1KLmxlbmd0aDtydDxtdDtydCsrKXtjb25zdCBBdD1KW3J0XSxpdD1uLmdldChBdCk7ZS5iaW5kVGV4dHVyZShyLlRFWFRVUkVfMkQsaXQuX193ZWJnbFRleHR1cmUpLFJ0KHIuVEVYVFVSRV8yRCxBdCksTXQoQi5fX3dlYmdsRnJhbWVidWZmZXIsUixBdCxyLkNPTE9SX0FUVEFDSE1FTlQwK3J0LHIuVEVYVFVSRV8yRCwwKSxnKEF0KSYmbShyLlRFWFRVUkVfMkQpfWUudW5iaW5kVGV4dHVyZSgpfWVsc2V7bGV0IHJ0PXIuVEVYVFVSRV8yRDtpZigoUi5pc1dlYkdMM0RSZW5kZXJUYXJnZXR8fFIuaXNXZWJHTEFycmF5UmVuZGVyVGFyZ2V0KSYmKHJ0PVIuaXNXZWJHTDNEUmVuZGVyVGFyZ2V0P3IuVEVYVFVSRV8zRDpyLlRFWFRVUkVfMkRfQVJSQVkpLGUuYmluZFRleHR1cmUocnQsVi5fX3dlYmdsVGV4dHVyZSksUnQocnQsQyksQy5taXBtYXBzJiZDLm1pcG1hcHMubGVuZ3RoPjApZm9yKGxldCBtdD0wO210PEMubWlwbWFwcy5sZW5ndGg7bXQrKylNdChCLl9fd2ViZ2xGcmFtZWJ1ZmZlclttdF0sUixDLHIuQ09MT1JfQVRUQUNITUVOVDAscnQsbXQpO2Vsc2UgTXQoQi5fX3dlYmdsRnJhbWVidWZmZXIsUixDLHIuQ09MT1JfQVRUQUNITUVOVDAscnQsMCk7ZyhDKSYmbShydCksZS51bmJpbmRUZXh0dXJlKCl9Ui5kZXB0aEJ1ZmZlciYmJHQoUil9ZnVuY3Rpb24gcXQoUil7Y29uc3QgQz1SLnRleHR1cmVzO2ZvcihsZXQgQj0wLFY9Qy5sZW5ndGg7QjxWO0IrKyl7Y29uc3QgSj1DW0JdO2lmKGcoSikpe2NvbnN0ICQ9dihSKSx1dD1uLmdldChKKS5fX3dlYmdsVGV4dHVyZTtlLmJpbmRUZXh0dXJlKCQsdXQpLG0oJCksZS51bmJpbmRUZXh0dXJlKCl9fX1jb25zdCBCdD1bXSxVPVtdO2Z1bmN0aW9uIGx0KFIpe2lmKFIuc2FtcGxlcz4wKXtpZihhdChSKT09PSExKXtjb25zdCBDPVIudGV4dHVyZXMsQj1SLndpZHRoLFY9Ui5oZWlnaHQ7bGV0IEo9ci5DT0xPUl9CVUZGRVJfQklUO2NvbnN0ICQ9Ui5zdGVuY2lsQnVmZmVyP3IuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UOnIuREVQVEhfQVRUQUNITUVOVCx1dD1uLmdldChSKSxydD1DLmxlbmd0aD4xO2lmKHJ0KWZvcihsZXQgQXQ9MDtBdDxDLmxlbmd0aDtBdCsrKWUuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsdXQuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKSxyLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHIuRlJBTUVCVUZGRVIsci5DT0xPUl9BVFRBQ0hNRU5UMCtBdCxyLlJFTkRFUkJVRkZFUixudWxsKSxlLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLHV0Ll9fd2ViZ2xGcmFtZWJ1ZmZlciksci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkRSQVdfRlJBTUVCVUZGRVIsci5DT0xPUl9BVFRBQ0hNRU5UMCtBdCxyLlRFWFRVUkVfMkQsbnVsbCwwKTtlLmJpbmRGcmFtZWJ1ZmZlcihyLlJFQURfRlJBTUVCVUZGRVIsdXQuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKTtjb25zdCBtdD1SLnRleHR1cmUubWlwbWFwczttdCYmbXQubGVuZ3RoPjA/ZS5iaW5kRnJhbWVidWZmZXIoci5EUkFXX0ZSQU1FQlVGRkVSLHV0Ll9fd2ViZ2xGcmFtZWJ1ZmZlclswXSk6ZS5iaW5kRnJhbWVidWZmZXIoci5EUkFXX0ZSQU1FQlVGRkVSLHV0Ll9fd2ViZ2xGcmFtZWJ1ZmZlcik7Zm9yKGxldCBBdD0wO0F0PEMubGVuZ3RoO0F0Kyspe2lmKFIucmVzb2x2ZURlcHRoQnVmZmVyJiYoUi5kZXB0aEJ1ZmZlciYmKEp8PXIuREVQVEhfQlVGRkVSX0JJVCksUi5zdGVuY2lsQnVmZmVyJiZSLnJlc29sdmVTdGVuY2lsQnVmZmVyJiYoSnw9ci5TVEVOQ0lMX0JVRkZFUl9CSVQpKSxydCl7ci5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihyLlJFQURfRlJBTUVCVUZGRVIsci5DT0xPUl9BVFRBQ0hNRU5UMCxyLlJFTkRFUkJVRkZFUix1dC5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbQXRdKTtjb25zdCBpdD1uLmdldChDW0F0XSkuX193ZWJnbFRleHR1cmU7ci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkRSQVdfRlJBTUVCVUZGRVIsci5DT0xPUl9BVFRBQ0hNRU5UMCxyLlRFWFRVUkVfMkQsaXQsMCl9ci5ibGl0RnJhbWVidWZmZXIoMCwwLEIsViwwLDAsQixWLEosci5ORUFSRVNUKSxjPT09ITAmJihCdC5sZW5ndGg9MCxVLmxlbmd0aD0wLEJ0LnB1c2goci5DT0xPUl9BVFRBQ0hNRU5UMCtBdCksUi5kZXB0aEJ1ZmZlciYmUi5yZXNvbHZlRGVwdGhCdWZmZXI9PT0hMSYmKEJ0LnB1c2goJCksVS5wdXNoKCQpLHIuaW52YWxpZGF0ZUZyYW1lYnVmZmVyKHIuRFJBV19GUkFNRUJVRkZFUixVKSksci5pbnZhbGlkYXRlRnJhbWVidWZmZXIoci5SRUFEX0ZSQU1FQlVGRkVSLEJ0KSl9aWYoZS5iaW5kRnJhbWVidWZmZXIoci5SRUFEX0ZSQU1FQlVGRkVSLG51bGwpLGUuYmluZEZyYW1lYnVmZmVyKHIuRFJBV19GUkFNRUJVRkZFUixudWxsKSxydClmb3IobGV0IEF0PTA7QXQ8Qy5sZW5ndGg7QXQrKyl7ZS5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUix1dC5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpLHIuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoci5GUkFNRUJVRkZFUixyLkNPTE9SX0FUVEFDSE1FTlQwK0F0LHIuUkVOREVSQlVGRkVSLHV0Ll9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltBdF0pO2NvbnN0IGl0PW4uZ2V0KENbQXRdKS5fX3dlYmdsVGV4dHVyZTtlLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLHV0Ll9fd2ViZ2xGcmFtZWJ1ZmZlciksci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkRSQVdfRlJBTUVCVUZGRVIsci5DT0xPUl9BVFRBQ0hNRU5UMCtBdCxyLlRFWFRVUkVfMkQsaXQsMCl9ZS5iaW5kRnJhbWVidWZmZXIoci5EUkFXX0ZSQU1FQlVGRkVSLHV0Ll9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcil9ZWxzZSBpZihSLmRlcHRoQnVmZmVyJiZSLnJlc29sdmVEZXB0aEJ1ZmZlcj09PSExJiZjKXtjb25zdCBDPVIuc3RlbmNpbEJ1ZmZlcj9yLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVDpyLkRFUFRIX0FUVEFDSE1FTlQ7ci5pbnZhbGlkYXRlRnJhbWVidWZmZXIoci5EUkFXX0ZSQU1FQlVGRkVSLFtDXSl9fX1mdW5jdGlvbiBldChSKXtyZXR1cm4gTWF0aC5taW4oaS5tYXhTYW1wbGVzLFIuc2FtcGxlcyl9ZnVuY3Rpb24gYXQoUil7Y29uc3QgQz1uLmdldChSKTtyZXR1cm4gUi5zYW1wbGVzPjAmJnQuaGFzKCJXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiKT09PSEwJiZDLl9fdXNlUmVuZGVyVG9UZXh0dXJlIT09ITF9ZnVuY3Rpb24gdHQoUil7Y29uc3QgQz1vLnJlbmRlci5mcmFtZTt1LmdldChSKSE9PUMmJih1LnNldChSLEMpLFIudXBkYXRlKCkpfWZ1bmN0aW9uIEV0KFIsQyl7Y29uc3QgQj1SLmNvbG9yU3BhY2UsVj1SLmZvcm1hdCxKPVIudHlwZTtyZXR1cm4gUi5pc0NvbXByZXNzZWRUZXh0dXJlPT09ITB8fFIuaXNWaWRlb1RleHR1cmU9PT0hMHx8QiE9PURyJiZCIT09RGkmJihuZS5nZXRUcmFuc2ZlcihCKT09PWRlPyhWIT09bm58fEohPT1uaSkmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogc1JHQiBlbmNvZGVkIHRleHR1cmVzIGhhdmUgdG8gdXNlIFJHQkFGb3JtYXQgYW5kIFVuc2lnbmVkQnl0ZVR5cGUuIik6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xUZXh0dXJlczogVW5zdXBwb3J0ZWQgdGV4dHVyZSBjb2xvciBzcGFjZToiLEIpKSxDfWZ1bmN0aW9uIFgoUil7cmV0dXJuIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IT0idW5kZWZpbmVkIiYmUiBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ/KGwud2lkdGg9Ui5uYXR1cmFsV2lkdGh8fFIud2lkdGgsbC5oZWlnaHQ9Ui5uYXR1cmFsSGVpZ2h0fHxSLmhlaWdodCk6dHlwZW9mIFZpZGVvRnJhbWUhPSJ1bmRlZmluZWQiJiZSIGluc3RhbmNlb2YgVmlkZW9GcmFtZT8obC53aWR0aD1SLmRpc3BsYXlXaWR0aCxsLmhlaWdodD1SLmRpc3BsYXlIZWlnaHQpOihsLndpZHRoPVIud2lkdGgsbC5oZWlnaHQ9Ui5oZWlnaHQpLGx9dGhpcy5hbGxvY2F0ZVRleHR1cmVVbml0PUwsdGhpcy5yZXNldFRleHR1cmVVbml0cz1ELHRoaXMuc2V0VGV4dHVyZTJEPU4sdGhpcy5zZXRUZXh0dXJlMkRBcnJheT1PLHRoaXMuc2V0VGV4dHVyZTNEPUgsdGhpcy5zZXRUZXh0dXJlQ3ViZT16LHRoaXMucmViaW5kVGV4dHVyZXM9UHQsdGhpcy5zZXR1cFJlbmRlclRhcmdldD1fZSx0aGlzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcD1xdCx0aGlzLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0PWx0LHRoaXMuc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlcj0kdCx0aGlzLnNldHVwRnJhbWVCdWZmZXJUZXh0dXJlPU10LHRoaXMudXNlTXVsdGlzYW1wbGVkUlRUPWF0fWZ1bmN0aW9uIEZ4KHIsdCl7ZnVuY3Rpb24gZShuLGk9RGkpe2xldCBzO2NvbnN0IG89bmUuZ2V0VHJhbnNmZXIoaSk7aWYobj09PW5pKXJldHVybiByLlVOU0lHTkVEX0JZVEU7aWYobj09PXBjKXJldHVybiByLlVOU0lHTkVEX1NIT1JUXzRfNF80XzQ7aWYobj09PW1jKXJldHVybiByLlVOU0lHTkVEX1NIT1JUXzVfNV81XzE7aWYobj09PVloKXJldHVybiByLlVOU0lHTkVEX0lOVF81XzlfOV85X1JFVjtpZihuPT09JGgpcmV0dXJuIHIuQllURTtpZihuPT09cWgpcmV0dXJuIHIuU0hPUlQ7aWYobj09PUFzKXJldHVybiByLlVOU0lHTkVEX1NIT1JUO2lmKG49PT1kYylyZXR1cm4gci5JTlQ7aWYobj09PUxpKXJldHVybiByLlVOU0lHTkVEX0lOVDtpZihuPT09eG4pcmV0dXJuIHIuRkxPQVQ7aWYobj09PVRzKXJldHVybiByLkhBTEZfRkxPQVQ7aWYobj09PVpoKXJldHVybiByLkFMUEhBO2lmKG49PT1KaClyZXR1cm4gci5SR0I7aWYobj09PW5uKXJldHVybiByLlJHQkE7aWYobj09PUNzKXJldHVybiByLkRFUFRIX0NPTVBPTkVOVDtpZihuPT09UnMpcmV0dXJuIHIuREVQVEhfU1RFTkNJTDtpZihuPT09Z2MpcmV0dXJuIHIuUkVEO2lmKG49PT1ObylyZXR1cm4gci5SRURfSU5URUdFUjtpZihuPT09S2gpcmV0dXJuIHIuUkc7aWYobj09PXhjKXJldHVybiByLlJHX0lOVEVHRVI7aWYobj09PV9jKXJldHVybiByLlJHQkFfSU5URUdFUjtpZihuPT09Rm98fG49PT1Cb3x8bj09PU9vfHxuPT09em8paWYobz09PWRlKWlmKHM9dC5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjX3NyZ2IiKSxzIT09bnVsbCl7aWYobj09PUZvKXJldHVybiBzLkNPTVBSRVNTRURfU1JHQl9TM1RDX0RYVDFfRVhUO2lmKG49PT1CbylyZXR1cm4gcy5DT01QUkVTU0VEX1NSR0JfQUxQSEFfUzNUQ19EWFQxX0VYVDtpZihuPT09T28pcmV0dXJuIHMuQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUM19FWFQ7aWYobj09PXpvKXJldHVybiBzLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDVfRVhUfWVsc2UgcmV0dXJuIG51bGw7ZWxzZSBpZihzPXQuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpLHMhPT1udWxsKXtpZihuPT09Rm8pcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDtpZihuPT09Qm8pcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7aWYobj09PU9vKXJldHVybiBzLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUO2lmKG49PT16bylyZXR1cm4gcy5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVH1lbHNlIHJldHVybiBudWxsO2lmKG49PT15Y3x8bj09PXZjfHxuPT09TWN8fG49PT1TYylpZihzPXQuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKSxzIT09bnVsbCl7aWYobj09PXljKXJldHVybiBzLkNPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUc7aWYobj09PXZjKXJldHVybiBzLkNPTVBSRVNTRURfUkdCX1BWUlRDXzJCUFBWMV9JTUc7aWYobj09PU1jKXJldHVybiBzLkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HO2lmKG49PT1TYylyZXR1cm4gcy5DT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNR31lbHNlIHJldHVybiBudWxsO2lmKG49PT1iY3x8bj09PXdjfHxuPT09QWMpaWYocz10LmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YyIpLHMhPT1udWxsKXtpZihuPT09YmN8fG49PT13YylyZXR1cm4gbz09PWRlP3MuQ09NUFJFU1NFRF9TUkdCOF9FVEMyOnMuQ09NUFJFU1NFRF9SR0I4X0VUQzI7aWYobj09PUFjKXJldHVybiBvPT09ZGU/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9FVEMyX0VBQzpzLkNPTVBSRVNTRURfUkdCQThfRVRDMl9FQUN9ZWxzZSByZXR1cm4gbnVsbDtpZihuPT09VGN8fG49PT1FY3x8bj09PUNjfHxuPT09UmN8fG49PT1JY3x8bj09PVBjfHxuPT09TGN8fG49PT1EY3x8bj09PVVjfHxuPT09TmN8fG49PT1GY3x8bj09PUJjfHxuPT09T2N8fG49PT16YylpZihzPXQuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXN0YyIpLHMhPT1udWxsKXtpZihuPT09VGMpcmV0dXJuIG89PT1kZT9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNHg0X0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzR4NF9LSFI7aWYobj09PUVjKXJldHVybiBvPT09ZGU/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzV4NF9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ181eDRfS0hSO2lmKG49PT1DYylyZXR1cm4gbz09PWRlP3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ181eDVfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfNXg1X0tIUjtpZihuPT09UmMpcmV0dXJuIG89PT1kZT9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNng1X0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzZ4NV9LSFI7aWYobj09PUljKXJldHVybiBvPT09ZGU/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzZ4Nl9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ182eDZfS0hSO2lmKG49PT1QYylyZXR1cm4gbz09PWRlP3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ184eDVfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfOHg1X0tIUjtpZihuPT09TGMpcmV0dXJuIG89PT1kZT9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOHg2X0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzh4Nl9LSFI7aWYobj09PURjKXJldHVybiBvPT09ZGU/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzh4OF9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDhfS0hSO2lmKG49PT1VYylyZXR1cm4gbz09PWRlP3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMHg1X0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDVfS0hSO2lmKG49PT1OYylyZXR1cm4gbz09PWRlP3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMHg2X0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDZfS0hSO2lmKG49PT1GYylyZXR1cm4gbz09PWRlP3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMHg4X0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDhfS0hSO2lmKG49PT1CYylyZXR1cm4gbz09PWRlP3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMHgxMF9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHgxMF9LSFI7aWYobj09PU9jKXJldHVybiBvPT09ZGU/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEyeDEwX0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEyeDEwX0tIUjtpZihuPT09emMpcmV0dXJuIG89PT1kZT9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTJ4MTJfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfMTJ4MTJfS0hSfWVsc2UgcmV0dXJuIG51bGw7aWYobj09PWtvfHxuPT09a2N8fG49PT1WYylpZihzPXQuZ2V0KCJFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9icHRjIikscyE9PW51bGwpe2lmKG49PT1rbylyZXR1cm4gbz09PWRlP3MuQ09NUFJFU1NFRF9TUkdCX0FMUEhBX0JQVENfVU5PUk1fRVhUOnMuQ09NUFJFU1NFRF9SR0JBX0JQVENfVU5PUk1fRVhUO2lmKG49PT1rYylyZXR1cm4gcy5DT01QUkVTU0VEX1JHQl9CUFRDX1NJR05FRF9GTE9BVF9FWFQ7aWYobj09PVZjKXJldHVybiBzLkNPTVBSRVNTRURfUkdCX0JQVENfVU5TSUdORURfRkxPQVRfRVhUfWVsc2UgcmV0dXJuIG51bGw7aWYobj09PWpofHxuPT09R2N8fG49PT1IY3x8bj09PVdjKWlmKHM9dC5nZXQoIkVYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3JndGMiKSxzIT09bnVsbCl7aWYobj09PWtvKXJldHVybiBzLkNPTVBSRVNTRURfUkVEX1JHVEMxX0VYVDtpZihuPT09R2MpcmV0dXJuIHMuQ09NUFJFU1NFRF9TSUdORURfUkVEX1JHVEMxX0VYVDtpZihuPT09SGMpcmV0dXJuIHMuQ09NUFJFU1NFRF9SRURfR1JFRU5fUkdUQzJfRVhUO2lmKG49PT1XYylyZXR1cm4gcy5DT01QUkVTU0VEX1NJR05FRF9SRURfR1JFRU5fUkdUQzJfRVhUfWVsc2UgcmV0dXJuIG51bGw7cmV0dXJuIG49PT1Fcz9yLlVOU0lHTkVEX0lOVF8yNF84OnJbbl0hPT12b2lkIDA/cltuXTpudWxsfXJldHVybntjb252ZXJ0OmV9fWNvbnN0IGlFPWAKdm9pZCBtYWluKCkgewoKCWdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApOwoKfWAsckU9YAp1bmlmb3JtIHNhbXBsZXIyREFycmF5IGRlcHRoQ29sb3I7CnVuaWZvcm0gZmxvYXQgZGVwdGhXaWR0aDsKdW5pZm9ybSBmbG9hdCBkZXB0aEhlaWdodDsKCnZvaWQgbWFpbigpIHsKCgl2ZWMyIGNvb3JkID0gdmVjMiggZ2xfRnJhZ0Nvb3JkLnggLyBkZXB0aFdpZHRoLCBnbF9GcmFnQ29vcmQueSAvIGRlcHRoSGVpZ2h0ICk7CgoJaWYgKCBjb29yZC54ID49IDEuMCApIHsKCgkJZ2xfRnJhZ0RlcHRoID0gdGV4dHVyZSggZGVwdGhDb2xvciwgdmVjMyggY29vcmQueCAtIDEuMCwgY29vcmQueSwgMSApICkucjsKCgl9IGVsc2UgewoKCQlnbF9GcmFnRGVwdGggPSB0ZXh0dXJlKCBkZXB0aENvbG9yLCB2ZWMzKCBjb29yZC54LCBjb29yZC55LCAwICkgKS5yOwoKCX0KCn1gO2NsYXNzIHNFe2NvbnN0cnVjdG9yKCl7dGhpcy50ZXh0dXJlPW51bGwsdGhpcy5tZXNoPW51bGwsdGhpcy5kZXB0aE5lYXI9MCx0aGlzLmRlcHRoRmFyPTB9aW5pdCh0LGUsbil7aWYodGhpcy50ZXh0dXJlPT09bnVsbCl7Y29uc3QgaT1uZXcgQWUscz10LnByb3BlcnRpZXMuZ2V0KGkpO3MuX193ZWJnbFRleHR1cmU9ZS50ZXh0dXJlLChlLmRlcHRoTmVhciE9PW4uZGVwdGhOZWFyfHxlLmRlcHRoRmFyIT09bi5kZXB0aEZhcikmJih0aGlzLmRlcHRoTmVhcj1lLmRlcHRoTmVhcix0aGlzLmRlcHRoRmFyPWUuZGVwdGhGYXIpLHRoaXMudGV4dHVyZT1pfX1nZXRNZXNoKHQpe2lmKHRoaXMudGV4dHVyZSE9PW51bGwmJnRoaXMubWVzaD09PW51bGwpe2NvbnN0IGU9dC5jYW1lcmFzWzBdLnZpZXdwb3J0LG49bmV3IG9pKHt2ZXJ0ZXhTaGFkZXI6aUUsZnJhZ21lbnRTaGFkZXI6ckUsdW5pZm9ybXM6e2RlcHRoQ29sb3I6e3ZhbHVlOnRoaXMudGV4dHVyZX0sZGVwdGhXaWR0aDp7dmFsdWU6ZS56fSxkZXB0aEhlaWdodDp7dmFsdWU6ZS53fX19KTt0aGlzLm1lc2g9bmV3IExlKG5ldyBYcigyMCwyMCksbil9cmV0dXJuIHRoaXMubWVzaH1yZXNldCgpe3RoaXMudGV4dHVyZT1udWxsLHRoaXMubWVzaD1udWxsfWdldERlcHRoVGV4dHVyZSgpe3JldHVybiB0aGlzLnRleHR1cmV9fWNsYXNzIG9FIGV4dGVuZHMgeWl7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpO2NvbnN0IG49dGhpcztsZXQgaT1udWxsLHM9MSxvPW51bGwsYT0ibG9jYWwtZmxvb3IiLGM9MSxsPW51bGwsdT1udWxsLGg9bnVsbCxmPW51bGwsZD1udWxsLHA9bnVsbDtjb25zdCB4PW5ldyBzRSxnPWUuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKTtsZXQgbT1udWxsLHY9bnVsbDtjb25zdCB5PVtdLF89W10sUz1uZXcgcTtsZXQgdz1udWxsO2NvbnN0IEE9bmV3ICRlO0Eudmlld3BvcnQ9bmV3IFF0O2NvbnN0IFQ9bmV3ICRlO1Qudmlld3BvcnQ9bmV3IFF0O2NvbnN0IGI9W0EsVF0sTT1uZXcgSDA7bGV0IEU9bnVsbCxEPW51bGw7dGhpcy5jYW1lcmFBdXRvVXBkYXRlPSEwLHRoaXMuZW5hYmxlZD0hMSx0aGlzLmlzUHJlc2VudGluZz0hMSx0aGlzLmdldENvbnRyb2xsZXI9ZnVuY3Rpb24oSyl7bGV0IG90PXlbS107cmV0dXJuIG90PT09dm9pZCAwJiYob3Q9bmV3IG1sLHlbS109b3QpLG90LmdldFRhcmdldFJheVNwYWNlKCl9LHRoaXMuZ2V0Q29udHJvbGxlckdyaXA9ZnVuY3Rpb24oSyl7bGV0IG90PXlbS107cmV0dXJuIG90PT09dm9pZCAwJiYob3Q9bmV3IG1sLHlbS109b3QpLG90LmdldEdyaXBTcGFjZSgpfSx0aGlzLmdldEhhbmQ9ZnVuY3Rpb24oSyl7bGV0IG90PXlbS107cmV0dXJuIG90PT09dm9pZCAwJiYob3Q9bmV3IG1sLHlbS109b3QpLG90LmdldEhhbmRTcGFjZSgpfTtmdW5jdGlvbiBMKEspe2NvbnN0IG90PV8uaW5kZXhPZihLLmlucHV0U291cmNlKTtpZihvdD09PS0xKXJldHVybjtjb25zdCBNdD15W290XTtNdCE9PXZvaWQgMCYmKE10LnVwZGF0ZShLLmlucHV0U291cmNlLEsuZnJhbWUsbHx8byksTXQuZGlzcGF0Y2hFdmVudCh7dHlwZTpLLnR5cGUsZGF0YTpLLmlucHV0U291cmNlfSkpfWZ1bmN0aW9uIEYoKXtpLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlbGVjdCIsTCksaS5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3RzdGFydCIsTCksaS5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3RlbmQiLEwpLGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZSIsTCksaS5yZW1vdmVFdmVudExpc3RlbmVyKCJzcXVlZXplc3RhcnQiLEwpLGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZWVuZCIsTCksaS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmQiLEYpLGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaW5wdXRzb3VyY2VzY2hhbmdlIixOKTtmb3IobGV0IEs9MDtLPHkubGVuZ3RoO0srKyl7Y29uc3Qgb3Q9X1tLXTtvdCE9PW51bGwmJihfW0tdPW51bGwseVtLXS5kaXNjb25uZWN0KG90KSl9RT1udWxsLEQ9bnVsbCx4LnJlc2V0KCksdC5zZXRSZW5kZXJUYXJnZXQobSksZD1udWxsLGY9bnVsbCxoPW51bGwsaT1udWxsLHY9bnVsbCxGdC5zdG9wKCksbi5pc1ByZXNlbnRpbmc9ITEsdC5zZXRQaXhlbFJhdGlvKHcpLHQuc2V0U2l6ZShTLndpZHRoLFMuaGVpZ2h0LCExKSxuLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9dGhpcy5zZXRGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yPWZ1bmN0aW9uKEspe3M9SyxuLmlzUHJlc2VudGluZz09PSEwJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYlhSTWFuYWdlcjogQ2Fubm90IGNoYW5nZSBmcmFtZWJ1ZmZlciBzY2FsZSB3aGlsZSBwcmVzZW50aW5nLiIpfSx0aGlzLnNldFJlZmVyZW5jZVNwYWNlVHlwZT1mdW5jdGlvbihLKXthPUssbi5pc1ByZXNlbnRpbmc9PT0hMCYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IENhbm5vdCBjaGFuZ2UgcmVmZXJlbmNlIHNwYWNlIHR5cGUgd2hpbGUgcHJlc2VudGluZy4iKX0sdGhpcy5nZXRSZWZlcmVuY2VTcGFjZT1mdW5jdGlvbigpe3JldHVybiBsfHxvfSx0aGlzLnNldFJlZmVyZW5jZVNwYWNlPWZ1bmN0aW9uKEspe2w9S30sdGhpcy5nZXRCYXNlTGF5ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gZiE9PW51bGw/ZjpkfSx0aGlzLmdldEJpbmRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gaH0sdGhpcy5nZXRGcmFtZT1mdW5jdGlvbigpe3JldHVybiBwfSx0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gaX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKEspe3JldHVybiBNcyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoaT1LLGkhPT1udWxsKXtpZihtPXQuZ2V0UmVuZGVyVGFyZ2V0KCksaS5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3QiLEwpLGkuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLEwpLGkuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIixMKSxpLmFkZEV2ZW50TGlzdGVuZXIoInNxdWVlemUiLEwpLGkuYWRkRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZXN0YXJ0IixMKSxpLmFkZEV2ZW50TGlzdGVuZXIoInNxdWVlemVlbmQiLEwpLGkuYWRkRXZlbnRMaXN0ZW5lcigiZW5kIixGKSxpLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0c291cmNlc2NoYW5nZSIsTiksZy54ckNvbXBhdGlibGUhPT0hMCYmKHlpZWxkIGUubWFrZVhSQ29tcGF0aWJsZSgpKSx3PXQuZ2V0UGl4ZWxSYXRpbygpLHQuZ2V0U2l6ZShTKSx0eXBlb2YgWFJXZWJHTEJpbmRpbmchPSJ1bmRlZmluZWQiJiYiY3JlYXRlUHJvamVjdGlvbkxheWVyImluIFhSV2ViR0xCaW5kaW5nLnByb3RvdHlwZSl7bGV0IE10PW51bGwsZHQ9bnVsbCxJdD1udWxsO2cuZGVwdGgmJihJdD1nLnN0ZW5jaWw/ZS5ERVBUSDI0X1NURU5DSUw4OmUuREVQVEhfQ09NUE9ORU5UMjQsTXQ9Zy5zdGVuY2lsP1JzOkNzLGR0PWcuc3RlbmNpbD9FczpMaSk7Y29uc3QgJHQ9e2NvbG9yRm9ybWF0OmUuUkdCQTgsZGVwdGhGb3JtYXQ6SXQsc2NhbGVGYWN0b3I6c307aD1uZXcgWFJXZWJHTEJpbmRpbmcoaSxlKSxmPWguY3JlYXRlUHJvamVjdGlvbkxheWVyKCR0KSxpLnVwZGF0ZVJlbmRlclN0YXRlKHtsYXllcnM6W2ZdfSksdC5zZXRQaXhlbFJhdGlvKDEpLHQuc2V0U2l6ZShmLnRleHR1cmVXaWR0aCxmLnRleHR1cmVIZWlnaHQsITEpLHY9bmV3IHZpKGYudGV4dHVyZVdpZHRoLGYudGV4dHVyZUhlaWdodCx7Zm9ybWF0Om5uLHR5cGU6bmksZGVwdGhUZXh0dXJlOm5ldyBCbChmLnRleHR1cmVXaWR0aCxmLnRleHR1cmVIZWlnaHQsZHQsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsTXQpLHN0ZW5jaWxCdWZmZXI6Zy5zdGVuY2lsLGNvbG9yU3BhY2U6dC5vdXRwdXRDb2xvclNwYWNlLHNhbXBsZXM6Zy5hbnRpYWxpYXM/NDowLHJlc29sdmVEZXB0aEJ1ZmZlcjpmLmlnbm9yZURlcHRoVmFsdWVzPT09ITEscmVzb2x2ZVN0ZW5jaWxCdWZmZXI6Zi5pZ25vcmVEZXB0aFZhbHVlcz09PSExfSl9ZWxzZXtjb25zdCBNdD17YW50aWFsaWFzOmcuYW50aWFsaWFzLGFscGhhOiEwLGRlcHRoOmcuZGVwdGgsc3RlbmNpbDpnLnN0ZW5jaWwsZnJhbWVidWZmZXJTY2FsZUZhY3RvcjpzfTtkPW5ldyBYUldlYkdMTGF5ZXIoaSxlLE10KSxpLnVwZGF0ZVJlbmRlclN0YXRlKHtiYXNlTGF5ZXI6ZH0pLHQuc2V0UGl4ZWxSYXRpbygxKSx0LnNldFNpemUoZC5mcmFtZWJ1ZmZlcldpZHRoLGQuZnJhbWVidWZmZXJIZWlnaHQsITEpLHY9bmV3IHZpKGQuZnJhbWVidWZmZXJXaWR0aCxkLmZyYW1lYnVmZmVySGVpZ2h0LHtmb3JtYXQ6bm4sdHlwZTpuaSxjb2xvclNwYWNlOnQub3V0cHV0Q29sb3JTcGFjZSxzdGVuY2lsQnVmZmVyOmcuc3RlbmNpbCxyZXNvbHZlRGVwdGhCdWZmZXI6ZC5pZ25vcmVEZXB0aFZhbHVlcz09PSExLHJlc29sdmVTdGVuY2lsQnVmZmVyOmQuaWdub3JlRGVwdGhWYWx1ZXM9PT0hMX0pfXYuaXNYUlJlbmRlclRhcmdldD0hMCx0aGlzLnNldEZvdmVhdGlvbihjKSxsPW51bGwsbz15aWVsZCBpLnJlcXVlc3RSZWZlcmVuY2VTcGFjZShhKSxGdC5zZXRDb250ZXh0KGkpLEZ0LnN0YXJ0KCksbi5pc1ByZXNlbnRpbmc9ITAsbi5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uc3RhcnQifSl9fSl9LHRoaXMuZ2V0RW52aXJvbm1lbnRCbGVuZE1vZGU9ZnVuY3Rpb24oKXtpZihpIT09bnVsbClyZXR1cm4gaS5lbnZpcm9ubWVudEJsZW5kTW9kZX0sdGhpcy5nZXREZXB0aFRleHR1cmU9ZnVuY3Rpb24oKXtyZXR1cm4geC5nZXREZXB0aFRleHR1cmUoKX07ZnVuY3Rpb24gTihLKXtmb3IobGV0IG90PTA7b3Q8Sy5yZW1vdmVkLmxlbmd0aDtvdCsrKXtjb25zdCBNdD1LLnJlbW92ZWRbb3RdLGR0PV8uaW5kZXhPZihNdCk7ZHQ+PTAmJihfW2R0XT1udWxsLHlbZHRdLmRpc2Nvbm5lY3QoTXQpKX1mb3IobGV0IG90PTA7b3Q8Sy5hZGRlZC5sZW5ndGg7b3QrKyl7Y29uc3QgTXQ9Sy5hZGRlZFtvdF07bGV0IGR0PV8uaW5kZXhPZihNdCk7aWYoZHQ9PT0tMSl7Zm9yKGxldCAkdD0wOyR0PHkubGVuZ3RoOyR0KyspaWYoJHQ+PV8ubGVuZ3RoKXtfLnB1c2goTXQpLGR0PSR0O2JyZWFrfWVsc2UgaWYoX1skdF09PT1udWxsKXtfWyR0XT1NdCxkdD0kdDticmVha31pZihkdD09PS0xKWJyZWFrfWNvbnN0IEl0PXlbZHRdO0l0JiZJdC5jb25uZWN0KE10KX19Y29uc3QgTz1uZXcgSSxIPW5ldyBJO2Z1bmN0aW9uIHooSyxvdCxNdCl7Ty5zZXRGcm9tTWF0cml4UG9zaXRpb24ob3QubWF0cml4V29ybGQpLEguc2V0RnJvbU1hdHJpeFBvc2l0aW9uKE10Lm1hdHJpeFdvcmxkKTtjb25zdCBkdD1PLmRpc3RhbmNlVG8oSCksSXQ9b3QucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cywkdD1NdC5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzLFB0PUl0WzE0XS8oSXRbMTBdLTEpLF9lPUl0WzE0XS8oSXRbMTBdKzEpLHF0PShJdFs5XSsxKS9JdFs1XSxCdD0oSXRbOV0tMSkvSXRbNV0sVT0oSXRbOF0tMSkvSXRbMF0sbHQ9KCR0WzhdKzEpLyR0WzBdLGV0PVB0KlUsYXQ9UHQqbHQsdHQ9ZHQvKC1VK2x0KSxFdD10dCotVTtpZihvdC5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoSy5wb3NpdGlvbixLLnF1YXRlcm5pb24sSy5zY2FsZSksSy50cmFuc2xhdGVYKEV0KSxLLnRyYW5zbGF0ZVoodHQpLEsubWF0cml4V29ybGQuY29tcG9zZShLLnBvc2l0aW9uLEsucXVhdGVybmlvbixLLnNjYWxlKSxLLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KEsubWF0cml4V29ybGQpLmludmVydCgpLEl0WzEwXT09PS0xKUsucHJvamVjdGlvbk1hdHJpeC5jb3B5KG90LnByb2plY3Rpb25NYXRyaXgpLEsucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weShvdC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSk7ZWxzZXtjb25zdCBYPVB0K3R0LFI9X2UrdHQsQz1ldC1FdCxCPWF0KyhkdC1FdCksVj1xdCpfZS9SKlgsSj1CdCpfZS9SKlg7Sy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZShDLEIsVixKLFgsUiksSy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KEsucHJvamVjdGlvbk1hdHJpeCkuaW52ZXJ0KCl9fWZ1bmN0aW9uIFEoSyxvdCl7b3Q9PT1udWxsP0subWF0cml4V29ybGQuY29weShLLm1hdHJpeCk6Sy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKG90Lm1hdHJpeFdvcmxkLEsubWF0cml4KSxLLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KEsubWF0cml4V29ybGQpLmludmVydCgpfXRoaXMudXBkYXRlQ2FtZXJhPWZ1bmN0aW9uKEspe2lmKGk9PT1udWxsKXJldHVybjtsZXQgb3Q9Sy5uZWFyLE10PUsuZmFyO3gudGV4dHVyZSE9PW51bGwmJih4LmRlcHRoTmVhcj4wJiYob3Q9eC5kZXB0aE5lYXIpLHguZGVwdGhGYXI+MCYmKE10PXguZGVwdGhGYXIpKSxNLm5lYXI9VC5uZWFyPUEubmVhcj1vdCxNLmZhcj1ULmZhcj1BLmZhcj1NdCwoRSE9PU0ubmVhcnx8RCE9PU0uZmFyKSYmKGkudXBkYXRlUmVuZGVyU3RhdGUoe2RlcHRoTmVhcjpNLm5lYXIsZGVwdGhGYXI6TS5mYXJ9KSxFPU0ubmVhcixEPU0uZmFyKSxBLmxheWVycy5tYXNrPUsubGF5ZXJzLm1hc2t8MixULmxheWVycy5tYXNrPUsubGF5ZXJzLm1hc2t8NCxNLmxheWVycy5tYXNrPUEubGF5ZXJzLm1hc2t8VC5sYXllcnMubWFzaztjb25zdCBkdD1LLnBhcmVudCxJdD1NLmNhbWVyYXM7UShNLGR0KTtmb3IobGV0ICR0PTA7JHQ8SXQubGVuZ3RoOyR0KyspUShJdFskdF0sZHQpO0l0Lmxlbmd0aD09PTI/eihNLEEsVCk6TS5wcm9qZWN0aW9uTWF0cml4LmNvcHkoQS5wcm9qZWN0aW9uTWF0cml4KSxzdChLLE0sZHQpfTtmdW5jdGlvbiBzdChLLG90LE10KXtNdD09PW51bGw/Sy5tYXRyaXguY29weShvdC5tYXRyaXhXb3JsZCk6KEsubWF0cml4LmNvcHkoTXQubWF0cml4V29ybGQpLEsubWF0cml4LmludmVydCgpLEsubWF0cml4Lm11bHRpcGx5KG90Lm1hdHJpeFdvcmxkKSksSy5tYXRyaXguZGVjb21wb3NlKEsucG9zaXRpb24sSy5xdWF0ZXJuaW9uLEsuc2NhbGUpLEsudXBkYXRlTWF0cml4V29ybGQoITApLEsucHJvamVjdGlvbk1hdHJpeC5jb3B5KG90LnByb2plY3Rpb25NYXRyaXgpLEsucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weShvdC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSksSy5pc1BlcnNwZWN0aXZlQ2FtZXJhJiYoSy5mb3Y9SXMqMipNYXRoLmF0YW4oMS9LLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbNV0pLEsuem9vbT0xKX10aGlzLmdldENhbWVyYT1mdW5jdGlvbigpe3JldHVybiBNfSx0aGlzLmdldEZvdmVhdGlvbj1mdW5jdGlvbigpe2lmKCEoZj09PW51bGwmJmQ9PT1udWxsKSlyZXR1cm4gY30sdGhpcy5zZXRGb3ZlYXRpb249ZnVuY3Rpb24oSyl7Yz1LLGYhPT1udWxsJiYoZi5maXhlZEZvdmVhdGlvbj1LKSxkIT09bnVsbCYmZC5maXhlZEZvdmVhdGlvbiE9PXZvaWQgMCYmKGQuZml4ZWRGb3ZlYXRpb249Syl9LHRoaXMuaGFzRGVwdGhTZW5zaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHgudGV4dHVyZSE9PW51bGx9LHRoaXMuZ2V0RGVwdGhTZW5zaW5nTWVzaD1mdW5jdGlvbigpe3JldHVybiB4LmdldE1lc2goTSl9O2xldCBmdD1udWxsO2Z1bmN0aW9uIFJ0KEssb3Qpe2lmKHU9b3QuZ2V0Vmlld2VyUG9zZShsfHxvKSxwPW90LHUhPT1udWxsKXtjb25zdCBNdD11LnZpZXdzO2QhPT1udWxsJiYodC5zZXRSZW5kZXJUYXJnZXRGcmFtZWJ1ZmZlcih2LGQuZnJhbWVidWZmZXIpLHQuc2V0UmVuZGVyVGFyZ2V0KHYpKTtsZXQgZHQ9ITE7TXQubGVuZ3RoIT09TS5jYW1lcmFzLmxlbmd0aCYmKE0uY2FtZXJhcy5sZW5ndGg9MCxkdD0hMCk7Zm9yKGxldCBQdD0wO1B0PE10Lmxlbmd0aDtQdCsrKXtjb25zdCBfZT1NdFtQdF07bGV0IHF0PW51bGw7aWYoZCE9PW51bGwpcXQ9ZC5nZXRWaWV3cG9ydChfZSk7ZWxzZXtjb25zdCBVPWguZ2V0Vmlld1N1YkltYWdlKGYsX2UpO3F0PVUudmlld3BvcnQsUHQ9PT0wJiYodC5zZXRSZW5kZXJUYXJnZXRUZXh0dXJlcyh2LFUuY29sb3JUZXh0dXJlLFUuZGVwdGhTdGVuY2lsVGV4dHVyZSksdC5zZXRSZW5kZXJUYXJnZXQodikpfWxldCBCdD1iW1B0XTtCdD09PXZvaWQgMCYmKEJ0PW5ldyAkZSxCdC5sYXllcnMuZW5hYmxlKFB0KSxCdC52aWV3cG9ydD1uZXcgUXQsYltQdF09QnQpLEJ0Lm1hdHJpeC5mcm9tQXJyYXkoX2UudHJhbnNmb3JtLm1hdHJpeCksQnQubWF0cml4LmRlY29tcG9zZShCdC5wb3NpdGlvbixCdC5xdWF0ZXJuaW9uLEJ0LnNjYWxlKSxCdC5wcm9qZWN0aW9uTWF0cml4LmZyb21BcnJheShfZS5wcm9qZWN0aW9uTWF0cml4KSxCdC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KEJ0LnByb2plY3Rpb25NYXRyaXgpLmludmVydCgpLEJ0LnZpZXdwb3J0LnNldChxdC54LHF0LnkscXQud2lkdGgscXQuaGVpZ2h0KSxQdD09PTAmJihNLm1hdHJpeC5jb3B5KEJ0Lm1hdHJpeCksTS5tYXRyaXguZGVjb21wb3NlKE0ucG9zaXRpb24sTS5xdWF0ZXJuaW9uLE0uc2NhbGUpKSxkdD09PSEwJiZNLmNhbWVyYXMucHVzaChCdCl9Y29uc3QgSXQ9aS5lbmFibGVkRmVhdHVyZXM7aWYoSXQmJkl0LmluY2x1ZGVzKCJkZXB0aC1zZW5zaW5nIikmJmkuZGVwdGhVc2FnZT09ImdwdS1vcHRpbWl6ZWQiJiZoKXtjb25zdCBQdD1oLmdldERlcHRoSW5mb3JtYXRpb24oTXRbMF0pO1B0JiZQdC5pc1ZhbGlkJiZQdC50ZXh0dXJlJiZ4LmluaXQodCxQdCxpLnJlbmRlclN0YXRlKX19Zm9yKGxldCBNdD0wO010PHkubGVuZ3RoO010Kyspe2NvbnN0IGR0PV9bTXRdLEl0PXlbTXRdO2R0IT09bnVsbCYmSXQhPT12b2lkIDAmJkl0LnVwZGF0ZShkdCxvdCxsfHxvKX1mdCYmZnQoSyxvdCksb3QuZGV0ZWN0ZWRQbGFuZXMmJm4uZGlzcGF0Y2hFdmVudCh7dHlwZToicGxhbmVzZGV0ZWN0ZWQiLGRhdGE6b3R9KSxwPW51bGx9Y29uc3QgRnQ9bmV3IGN4O0Z0LnNldEFuaW1hdGlvbkxvb3AoUnQpLHRoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbihLKXtmdD1LfSx0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXt9fX1jb25zdCBpcz1uZXcgVW4sYUU9bmV3IEN0O2Z1bmN0aW9uIGNFKHIsdCl7ZnVuY3Rpb24gZShnLG0pe2cubWF0cml4QXV0b1VwZGF0ZT09PSEwJiZnLnVwZGF0ZU1hdHJpeCgpLG0udmFsdWUuY29weShnLm1hdHJpeCl9ZnVuY3Rpb24gbihnLG0pe20uY29sb3IuZ2V0UkdCKGcuZm9nQ29sb3IudmFsdWUsZmcocikpLG0uaXNGb2c/KGcuZm9nTmVhci52YWx1ZT1tLm5lYXIsZy5mb2dGYXIudmFsdWU9bS5mYXIpOm0uaXNGb2dFeHAyJiYoZy5mb2dEZW5zaXR5LnZhbHVlPW0uZGVuc2l0eSl9ZnVuY3Rpb24gaShnLG0sdix5LF8pe20uaXNNZXNoQmFzaWNNYXRlcmlhbHx8bS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWw/cyhnLG0pOm0uaXNNZXNoVG9vbk1hdGVyaWFsPyhzKGcsbSksaChnLG0pKTptLmlzTWVzaFBob25nTWF0ZXJpYWw/KHMoZyxtKSx1KGcsbSkpOm0uaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD8ocyhnLG0pLGYoZyxtKSxtLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwmJmQoZyxtLF8pKTptLmlzTWVzaE1hdGNhcE1hdGVyaWFsPyhzKGcsbSkscChnLG0pKTptLmlzTWVzaERlcHRoTWF0ZXJpYWw/cyhnLG0pOm0uaXNNZXNoRGlzdGFuY2VNYXRlcmlhbD8ocyhnLG0pLHgoZyxtKSk6bS5pc01lc2hOb3JtYWxNYXRlcmlhbD9zKGcsbSk6bS5pc0xpbmVCYXNpY01hdGVyaWFsPyhvKGcsbSksbS5pc0xpbmVEYXNoZWRNYXRlcmlhbCYmYShnLG0pKTptLmlzUG9pbnRzTWF0ZXJpYWw/YyhnLG0sdix5KTptLmlzU3ByaXRlTWF0ZXJpYWw/bChnLG0pOm0uaXNTaGFkb3dNYXRlcmlhbD8oZy5jb2xvci52YWx1ZS5jb3B5KG0uY29sb3IpLGcub3BhY2l0eS52YWx1ZT1tLm9wYWNpdHkpOm0uaXNTaGFkZXJNYXRlcmlhbCYmKG0udW5pZm9ybXNOZWVkVXBkYXRlPSExKX1mdW5jdGlvbiBzKGcsbSl7Zy5vcGFjaXR5LnZhbHVlPW0ub3BhY2l0eSxtLmNvbG9yJiZnLmRpZmZ1c2UudmFsdWUuY29weShtLmNvbG9yKSxtLmVtaXNzaXZlJiZnLmVtaXNzaXZlLnZhbHVlLmNvcHkobS5lbWlzc2l2ZSkubXVsdGlwbHlTY2FsYXIobS5lbWlzc2l2ZUludGVuc2l0eSksbS5tYXAmJihnLm1hcC52YWx1ZT1tLm1hcCxlKG0ubWFwLGcubWFwVHJhbnNmb3JtKSksbS5hbHBoYU1hcCYmKGcuYWxwaGFNYXAudmFsdWU9bS5hbHBoYU1hcCxlKG0uYWxwaGFNYXAsZy5hbHBoYU1hcFRyYW5zZm9ybSkpLG0uYnVtcE1hcCYmKGcuYnVtcE1hcC52YWx1ZT1tLmJ1bXBNYXAsZShtLmJ1bXBNYXAsZy5idW1wTWFwVHJhbnNmb3JtKSxnLmJ1bXBTY2FsZS52YWx1ZT1tLmJ1bXBTY2FsZSxtLnNpZGU9PT1ZZSYmKGcuYnVtcFNjYWxlLnZhbHVlKj0tMSkpLG0ubm9ybWFsTWFwJiYoZy5ub3JtYWxNYXAudmFsdWU9bS5ub3JtYWxNYXAsZShtLm5vcm1hbE1hcCxnLm5vcm1hbE1hcFRyYW5zZm9ybSksZy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KG0ubm9ybWFsU2NhbGUpLG0uc2lkZT09PVllJiZnLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKSxtLmRpc3BsYWNlbWVudE1hcCYmKGcuZGlzcGxhY2VtZW50TWFwLnZhbHVlPW0uZGlzcGxhY2VtZW50TWFwLGUobS5kaXNwbGFjZW1lbnRNYXAsZy5kaXNwbGFjZW1lbnRNYXBUcmFuc2Zvcm0pLGcuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9bS5kaXNwbGFjZW1lbnRTY2FsZSxnLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9bS5kaXNwbGFjZW1lbnRCaWFzKSxtLmVtaXNzaXZlTWFwJiYoZy5lbWlzc2l2ZU1hcC52YWx1ZT1tLmVtaXNzaXZlTWFwLGUobS5lbWlzc2l2ZU1hcCxnLmVtaXNzaXZlTWFwVHJhbnNmb3JtKSksbS5zcGVjdWxhck1hcCYmKGcuc3BlY3VsYXJNYXAudmFsdWU9bS5zcGVjdWxhck1hcCxlKG0uc3BlY3VsYXJNYXAsZy5zcGVjdWxhck1hcFRyYW5zZm9ybSkpLG0uYWxwaGFUZXN0PjAmJihnLmFscGhhVGVzdC52YWx1ZT1tLmFscGhhVGVzdCk7Y29uc3Qgdj10LmdldChtKSx5PXYuZW52TWFwLF89di5lbnZNYXBSb3RhdGlvbjt5JiYoZy5lbnZNYXAudmFsdWU9eSxpcy5jb3B5KF8pLGlzLngqPS0xLGlzLnkqPS0xLGlzLnoqPS0xLHkuaXNDdWJlVGV4dHVyZSYmeS5pc1JlbmRlclRhcmdldFRleHR1cmU9PT0hMSYmKGlzLnkqPS0xLGlzLnoqPS0xKSxnLmVudk1hcFJvdGF0aW9uLnZhbHVlLnNldEZyb21NYXRyaXg0KGFFLm1ha2VSb3RhdGlvbkZyb21FdWxlcihpcykpLGcuZmxpcEVudk1hcC52YWx1ZT15LmlzQ3ViZVRleHR1cmUmJnkuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPT09ITE/LTE6MSxnLnJlZmxlY3Rpdml0eS52YWx1ZT1tLnJlZmxlY3Rpdml0eSxnLmlvci52YWx1ZT1tLmlvcixnLnJlZnJhY3Rpb25SYXRpby52YWx1ZT1tLnJlZnJhY3Rpb25SYXRpbyksbS5saWdodE1hcCYmKGcubGlnaHRNYXAudmFsdWU9bS5saWdodE1hcCxnLmxpZ2h0TWFwSW50ZW5zaXR5LnZhbHVlPW0ubGlnaHRNYXBJbnRlbnNpdHksZShtLmxpZ2h0TWFwLGcubGlnaHRNYXBUcmFuc2Zvcm0pKSxtLmFvTWFwJiYoZy5hb01hcC52YWx1ZT1tLmFvTWFwLGcuYW9NYXBJbnRlbnNpdHkudmFsdWU9bS5hb01hcEludGVuc2l0eSxlKG0uYW9NYXAsZy5hb01hcFRyYW5zZm9ybSkpfWZ1bmN0aW9uIG8oZyxtKXtnLmRpZmZ1c2UudmFsdWUuY29weShtLmNvbG9yKSxnLm9wYWNpdHkudmFsdWU9bS5vcGFjaXR5LG0ubWFwJiYoZy5tYXAudmFsdWU9bS5tYXAsZShtLm1hcCxnLm1hcFRyYW5zZm9ybSkpfWZ1bmN0aW9uIGEoZyxtKXtnLmRhc2hTaXplLnZhbHVlPW0uZGFzaFNpemUsZy50b3RhbFNpemUudmFsdWU9bS5kYXNoU2l6ZSttLmdhcFNpemUsZy5zY2FsZS52YWx1ZT1tLnNjYWxlfWZ1bmN0aW9uIGMoZyxtLHYseSl7Zy5kaWZmdXNlLnZhbHVlLmNvcHkobS5jb2xvciksZy5vcGFjaXR5LnZhbHVlPW0ub3BhY2l0eSxnLnNpemUudmFsdWU9bS5zaXplKnYsZy5zY2FsZS52YWx1ZT15Ki41LG0ubWFwJiYoZy5tYXAudmFsdWU9bS5tYXAsZShtLm1hcCxnLnV2VHJhbnNmb3JtKSksbS5hbHBoYU1hcCYmKGcuYWxwaGFNYXAudmFsdWU9bS5hbHBoYU1hcCxlKG0uYWxwaGFNYXAsZy5hbHBoYU1hcFRyYW5zZm9ybSkpLG0uYWxwaGFUZXN0PjAmJihnLmFscGhhVGVzdC52YWx1ZT1tLmFscGhhVGVzdCl9ZnVuY3Rpb24gbChnLG0pe2cuZGlmZnVzZS52YWx1ZS5jb3B5KG0uY29sb3IpLGcub3BhY2l0eS52YWx1ZT1tLm9wYWNpdHksZy5yb3RhdGlvbi52YWx1ZT1tLnJvdGF0aW9uLG0ubWFwJiYoZy5tYXAudmFsdWU9bS5tYXAsZShtLm1hcCxnLm1hcFRyYW5zZm9ybSkpLG0uYWxwaGFNYXAmJihnLmFscGhhTWFwLnZhbHVlPW0uYWxwaGFNYXAsZShtLmFscGhhTWFwLGcuYWxwaGFNYXBUcmFuc2Zvcm0pKSxtLmFscGhhVGVzdD4wJiYoZy5hbHBoYVRlc3QudmFsdWU9bS5hbHBoYVRlc3QpfWZ1bmN0aW9uIHUoZyxtKXtnLnNwZWN1bGFyLnZhbHVlLmNvcHkobS5zcGVjdWxhciksZy5zaGluaW5lc3MudmFsdWU9TWF0aC5tYXgobS5zaGluaW5lc3MsMWUtNCl9ZnVuY3Rpb24gaChnLG0pe20uZ3JhZGllbnRNYXAmJihnLmdyYWRpZW50TWFwLnZhbHVlPW0uZ3JhZGllbnRNYXApfWZ1bmN0aW9uIGYoZyxtKXtnLm1ldGFsbmVzcy52YWx1ZT1tLm1ldGFsbmVzcyxtLm1ldGFsbmVzc01hcCYmKGcubWV0YWxuZXNzTWFwLnZhbHVlPW0ubWV0YWxuZXNzTWFwLGUobS5tZXRhbG5lc3NNYXAsZy5tZXRhbG5lc3NNYXBUcmFuc2Zvcm0pKSxnLnJvdWdobmVzcy52YWx1ZT1tLnJvdWdobmVzcyxtLnJvdWdobmVzc01hcCYmKGcucm91Z2huZXNzTWFwLnZhbHVlPW0ucm91Z2huZXNzTWFwLGUobS5yb3VnaG5lc3NNYXAsZy5yb3VnaG5lc3NNYXBUcmFuc2Zvcm0pKSxtLmVudk1hcCYmKGcuZW52TWFwSW50ZW5zaXR5LnZhbHVlPW0uZW52TWFwSW50ZW5zaXR5KX1mdW5jdGlvbiBkKGcsbSx2KXtnLmlvci52YWx1ZT1tLmlvcixtLnNoZWVuPjAmJihnLnNoZWVuQ29sb3IudmFsdWUuY29weShtLnNoZWVuQ29sb3IpLm11bHRpcGx5U2NhbGFyKG0uc2hlZW4pLGcuc2hlZW5Sb3VnaG5lc3MudmFsdWU9bS5zaGVlblJvdWdobmVzcyxtLnNoZWVuQ29sb3JNYXAmJihnLnNoZWVuQ29sb3JNYXAudmFsdWU9bS5zaGVlbkNvbG9yTWFwLGUobS5zaGVlbkNvbG9yTWFwLGcuc2hlZW5Db2xvck1hcFRyYW5zZm9ybSkpLG0uc2hlZW5Sb3VnaG5lc3NNYXAmJihnLnNoZWVuUm91Z2huZXNzTWFwLnZhbHVlPW0uc2hlZW5Sb3VnaG5lc3NNYXAsZShtLnNoZWVuUm91Z2huZXNzTWFwLGcuc2hlZW5Sb3VnaG5lc3NNYXBUcmFuc2Zvcm0pKSksbS5jbGVhcmNvYXQ+MCYmKGcuY2xlYXJjb2F0LnZhbHVlPW0uY2xlYXJjb2F0LGcuY2xlYXJjb2F0Um91Z2huZXNzLnZhbHVlPW0uY2xlYXJjb2F0Um91Z2huZXNzLG0uY2xlYXJjb2F0TWFwJiYoZy5jbGVhcmNvYXRNYXAudmFsdWU9bS5jbGVhcmNvYXRNYXAsZShtLmNsZWFyY29hdE1hcCxnLmNsZWFyY29hdE1hcFRyYW5zZm9ybSkpLG0uY2xlYXJjb2F0Um91Z2huZXNzTWFwJiYoZy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAudmFsdWU9bS5jbGVhcmNvYXRSb3VnaG5lc3NNYXAsZShtLmNsZWFyY29hdFJvdWdobmVzc01hcCxnLmNsZWFyY29hdFJvdWdobmVzc01hcFRyYW5zZm9ybSkpLG0uY2xlYXJjb2F0Tm9ybWFsTWFwJiYoZy5jbGVhcmNvYXROb3JtYWxNYXAudmFsdWU9bS5jbGVhcmNvYXROb3JtYWxNYXAsZShtLmNsZWFyY29hdE5vcm1hbE1hcCxnLmNsZWFyY29hdE5vcm1hbE1hcFRyYW5zZm9ybSksZy5jbGVhcmNvYXROb3JtYWxTY2FsZS52YWx1ZS5jb3B5KG0uY2xlYXJjb2F0Tm9ybWFsU2NhbGUpLG0uc2lkZT09PVllJiZnLmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKSksbS5kaXNwZXJzaW9uPjAmJihnLmRpc3BlcnNpb24udmFsdWU9bS5kaXNwZXJzaW9uKSxtLmlyaWRlc2NlbmNlPjAmJihnLmlyaWRlc2NlbmNlLnZhbHVlPW0uaXJpZGVzY2VuY2UsZy5pcmlkZXNjZW5jZUlPUi52YWx1ZT1tLmlyaWRlc2NlbmNlSU9SLGcuaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtLnZhbHVlPW0uaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZVswXSxnLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bS52YWx1ZT1tLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2VbMV0sbS5pcmlkZXNjZW5jZU1hcCYmKGcuaXJpZGVzY2VuY2VNYXAudmFsdWU9bS5pcmlkZXNjZW5jZU1hcCxlKG0uaXJpZGVzY2VuY2VNYXAsZy5pcmlkZXNjZW5jZU1hcFRyYW5zZm9ybSkpLG0uaXJpZGVzY2VuY2VUaGlja25lc3NNYXAmJihnLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLnZhbHVlPW0uaXJpZGVzY2VuY2VUaGlja25lc3NNYXAsZShtLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLGcuaXJpZGVzY2VuY2VUaGlja25lc3NNYXBUcmFuc2Zvcm0pKSksbS50cmFuc21pc3Npb24+MCYmKGcudHJhbnNtaXNzaW9uLnZhbHVlPW0udHJhbnNtaXNzaW9uLGcudHJhbnNtaXNzaW9uU2FtcGxlck1hcC52YWx1ZT12LnRleHR1cmUsZy50cmFuc21pc3Npb25TYW1wbGVyU2l6ZS52YWx1ZS5zZXQodi53aWR0aCx2LmhlaWdodCksbS50cmFuc21pc3Npb25NYXAmJihnLnRyYW5zbWlzc2lvbk1hcC52YWx1ZT1tLnRyYW5zbWlzc2lvbk1hcCxlKG0udHJhbnNtaXNzaW9uTWFwLGcudHJhbnNtaXNzaW9uTWFwVHJhbnNmb3JtKSksZy50aGlja25lc3MudmFsdWU9bS50aGlja25lc3MsbS50aGlja25lc3NNYXAmJihnLnRoaWNrbmVzc01hcC52YWx1ZT1tLnRoaWNrbmVzc01hcCxlKG0udGhpY2tuZXNzTWFwLGcudGhpY2tuZXNzTWFwVHJhbnNmb3JtKSksZy5hdHRlbnVhdGlvbkRpc3RhbmNlLnZhbHVlPW0uYXR0ZW51YXRpb25EaXN0YW5jZSxnLmF0dGVudWF0aW9uQ29sb3IudmFsdWUuY29weShtLmF0dGVudWF0aW9uQ29sb3IpKSxtLmFuaXNvdHJvcHk+MCYmKGcuYW5pc290cm9weVZlY3Rvci52YWx1ZS5zZXQobS5hbmlzb3Ryb3B5Kk1hdGguY29zKG0uYW5pc290cm9weVJvdGF0aW9uKSxtLmFuaXNvdHJvcHkqTWF0aC5zaW4obS5hbmlzb3Ryb3B5Um90YXRpb24pKSxtLmFuaXNvdHJvcHlNYXAmJihnLmFuaXNvdHJvcHlNYXAudmFsdWU9bS5hbmlzb3Ryb3B5TWFwLGUobS5hbmlzb3Ryb3B5TWFwLGcuYW5pc290cm9weU1hcFRyYW5zZm9ybSkpKSxnLnNwZWN1bGFySW50ZW5zaXR5LnZhbHVlPW0uc3BlY3VsYXJJbnRlbnNpdHksZy5zcGVjdWxhckNvbG9yLnZhbHVlLmNvcHkobS5zcGVjdWxhckNvbG9yKSxtLnNwZWN1bGFyQ29sb3JNYXAmJihnLnNwZWN1bGFyQ29sb3JNYXAudmFsdWU9bS5zcGVjdWxhckNvbG9yTWFwLGUobS5zcGVjdWxhckNvbG9yTWFwLGcuc3BlY3VsYXJDb2xvck1hcFRyYW5zZm9ybSkpLG0uc3BlY3VsYXJJbnRlbnNpdHlNYXAmJihnLnNwZWN1bGFySW50ZW5zaXR5TWFwLnZhbHVlPW0uc3BlY3VsYXJJbnRlbnNpdHlNYXAsZShtLnNwZWN1bGFySW50ZW5zaXR5TWFwLGcuc3BlY3VsYXJJbnRlbnNpdHlNYXBUcmFuc2Zvcm0pKX1mdW5jdGlvbiBwKGcsbSl7bS5tYXRjYXAmJihnLm1hdGNhcC52YWx1ZT1tLm1hdGNhcCl9ZnVuY3Rpb24geChnLG0pe2NvbnN0IHY9dC5nZXQobSkubGlnaHQ7Zy5yZWZlcmVuY2VQb3NpdGlvbi52YWx1ZS5zZXRGcm9tTWF0cml4UG9zaXRpb24odi5tYXRyaXhXb3JsZCksZy5uZWFyRGlzdGFuY2UudmFsdWU9di5zaGFkb3cuY2FtZXJhLm5lYXIsZy5mYXJEaXN0YW5jZS52YWx1ZT12LnNoYWRvdy5jYW1lcmEuZmFyfXJldHVybntyZWZyZXNoRm9nVW5pZm9ybXM6bixyZWZyZXNoTWF0ZXJpYWxVbmlmb3JtczppfX1mdW5jdGlvbiBsRShyLHQsZSxuKXtsZXQgaT17fSxzPXt9LG89W107Y29uc3QgYT1yLmdldFBhcmFtZXRlcihyLk1BWF9VTklGT1JNX0JVRkZFUl9CSU5ESU5HUyk7ZnVuY3Rpb24gYyh2LHkpe2NvbnN0IF89eS5wcm9ncmFtO24udW5pZm9ybUJsb2NrQmluZGluZyh2LF8pfWZ1bmN0aW9uIGwodix5KXtsZXQgXz1pW3YuaWRdO189PT12b2lkIDAmJihwKHYpLF89dSh2KSxpW3YuaWRdPV8sdi5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixnKSk7Y29uc3QgUz15LnByb2dyYW07bi51cGRhdGVVQk9NYXBwaW5nKHYsUyk7Y29uc3Qgdz10LnJlbmRlci5mcmFtZTtzW3YuaWRdIT09dyYmKGYodiksc1t2LmlkXT13KX1mdW5jdGlvbiB1KHYpe2NvbnN0IHk9aCgpO3YuX19iaW5kaW5nUG9pbnRJbmRleD15O2NvbnN0IF89ci5jcmVhdGVCdWZmZXIoKSxTPXYuX19zaXplLHc9di51c2FnZTtyZXR1cm4gci5iaW5kQnVmZmVyKHIuVU5JRk9STV9CVUZGRVIsXyksci5idWZmZXJEYXRhKHIuVU5JRk9STV9CVUZGRVIsUyx3KSxyLmJpbmRCdWZmZXIoci5VTklGT1JNX0JVRkZFUixudWxsKSxyLmJpbmRCdWZmZXJCYXNlKHIuVU5JRk9STV9CVUZGRVIseSxfKSxffWZ1bmN0aW9uIGgoKXtmb3IobGV0IHY9MDt2PGE7disrKWlmKG8uaW5kZXhPZih2KT09PS0xKXJldHVybiBvLnB1c2godiksdjtyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlcjogTWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzbHkgdXNhYmxlIHVuaWZvcm1zIGdyb3VwcyByZWFjaGVkLiIpLDB9ZnVuY3Rpb24gZih2KXtjb25zdCB5PWlbdi5pZF0sXz12LnVuaWZvcm1zLFM9di5fX2NhY2hlO3IuYmluZEJ1ZmZlcihyLlVOSUZPUk1fQlVGRkVSLHkpO2ZvcihsZXQgdz0wLEE9Xy5sZW5ndGg7dzxBO3crKyl7Y29uc3QgVD1BcnJheS5pc0FycmF5KF9bd10pP19bd106W19bd11dO2ZvcihsZXQgYj0wLE09VC5sZW5ndGg7YjxNO2IrKyl7Y29uc3QgRT1UW2JdO2lmKGQoRSx3LGIsUyk9PT0hMCl7Y29uc3QgRD1FLl9fb2Zmc2V0LEw9QXJyYXkuaXNBcnJheShFLnZhbHVlKT9FLnZhbHVlOltFLnZhbHVlXTtsZXQgRj0wO2ZvcihsZXQgTj0wO048TC5sZW5ndGg7TisrKXtjb25zdCBPPUxbTl0sSD14KE8pO3R5cGVvZiBPPT0ibnVtYmVyInx8dHlwZW9mIE89PSJib29sZWFuIj8oRS5fX2RhdGFbMF09TyxyLmJ1ZmZlclN1YkRhdGEoci5VTklGT1JNX0JVRkZFUixEK0YsRS5fX2RhdGEpKTpPLmlzTWF0cml4Mz8oRS5fX2RhdGFbMF09Ty5lbGVtZW50c1swXSxFLl9fZGF0YVsxXT1PLmVsZW1lbnRzWzFdLEUuX19kYXRhWzJdPU8uZWxlbWVudHNbMl0sRS5fX2RhdGFbM109MCxFLl9fZGF0YVs0XT1PLmVsZW1lbnRzWzNdLEUuX19kYXRhWzVdPU8uZWxlbWVudHNbNF0sRS5fX2RhdGFbNl09Ty5lbGVtZW50c1s1XSxFLl9fZGF0YVs3XT0wLEUuX19kYXRhWzhdPU8uZWxlbWVudHNbNl0sRS5fX2RhdGFbOV09Ty5lbGVtZW50c1s3XSxFLl9fZGF0YVsxMF09Ty5lbGVtZW50c1s4XSxFLl9fZGF0YVsxMV09MCk6KE8udG9BcnJheShFLl9fZGF0YSxGKSxGKz1ILnN0b3JhZ2UvRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKX1yLmJ1ZmZlclN1YkRhdGEoci5VTklGT1JNX0JVRkZFUixELEUuX19kYXRhKX19fXIuYmluZEJ1ZmZlcihyLlVOSUZPUk1fQlVGRkVSLG51bGwpfWZ1bmN0aW9uIGQodix5LF8sUyl7Y29uc3Qgdz12LnZhbHVlLEE9eSsiXyIrXztpZihTW0FdPT09dm9pZCAwKXJldHVybiB0eXBlb2Ygdz09Im51bWJlciJ8fHR5cGVvZiB3PT0iYm9vbGVhbiI/U1tBXT13OlNbQV09dy5jbG9uZSgpLCEwO3tjb25zdCBUPVNbQV07aWYodHlwZW9mIHc9PSJudW1iZXIifHx0eXBlb2Ygdz09ImJvb2xlYW4iKXtpZihUIT09dylyZXR1cm4gU1tBXT13LCEwfWVsc2UgaWYoVC5lcXVhbHModyk9PT0hMSlyZXR1cm4gVC5jb3B5KHcpLCEwfXJldHVybiExfWZ1bmN0aW9uIHAodil7Y29uc3QgeT12LnVuaWZvcm1zO2xldCBfPTA7Y29uc3QgUz0xNjtmb3IobGV0IEE9MCxUPXkubGVuZ3RoO0E8VDtBKyspe2NvbnN0IGI9QXJyYXkuaXNBcnJheSh5W0FdKT95W0FdOlt5W0FdXTtmb3IobGV0IE09MCxFPWIubGVuZ3RoO008RTtNKyspe2NvbnN0IEQ9YltNXSxMPUFycmF5LmlzQXJyYXkoRC52YWx1ZSk/RC52YWx1ZTpbRC52YWx1ZV07Zm9yKGxldCBGPTAsTj1MLmxlbmd0aDtGPE47RisrKXtjb25zdCBPPUxbRl0sSD14KE8pLHo9XyVTLFE9eiVILmJvdW5kYXJ5LHN0PXorUTtfKz1RLHN0IT09MCYmUy1zdDxILnN0b3JhZ2UmJihfKz1TLXN0KSxELl9fZGF0YT1uZXcgRmxvYXQzMkFycmF5KEguc3RvcmFnZS9GbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpLEQuX19vZmZzZXQ9XyxfKz1ILnN0b3JhZ2V9fX1jb25zdCB3PV8lUztyZXR1cm4gdz4wJiYoXys9Uy13KSx2Ll9fc2l6ZT1fLHYuX19jYWNoZT17fSx0aGlzfWZ1bmN0aW9uIHgodil7Y29uc3QgeT17Ym91bmRhcnk6MCxzdG9yYWdlOjB9O3JldHVybiB0eXBlb2Ygdj09Im51bWJlciJ8fHR5cGVvZiB2PT0iYm9vbGVhbiI/KHkuYm91bmRhcnk9NCx5LnN0b3JhZ2U9NCk6di5pc1ZlY3RvcjI/KHkuYm91bmRhcnk9OCx5LnN0b3JhZ2U9OCk6di5pc1ZlY3RvcjN8fHYuaXNDb2xvcj8oeS5ib3VuZGFyeT0xNix5LnN0b3JhZ2U9MTIpOnYuaXNWZWN0b3I0Pyh5LmJvdW5kYXJ5PTE2LHkuc3RvcmFnZT0xNik6di5pc01hdHJpeDM/KHkuYm91bmRhcnk9NDgseS5zdG9yYWdlPTQ4KTp2LmlzTWF0cml4ND8oeS5ib3VuZGFyeT02NCx5LnN0b3JhZ2U9NjQpOnYuaXNUZXh0dXJlP2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBzYW1wbGVycyBjYW4gbm90IGJlIHBhcnQgb2YgYW4gdW5pZm9ybXMgZ3JvdXAuIik6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBVbnN1cHBvcnRlZCB1bmlmb3JtIHZhbHVlIHR5cGUuIix2KSx5fWZ1bmN0aW9uIGcodil7Y29uc3QgeT12LnRhcmdldDt5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGcpO2NvbnN0IF89by5pbmRleE9mKHkuX19iaW5kaW5nUG9pbnRJbmRleCk7by5zcGxpY2UoXywxKSxyLmRlbGV0ZUJ1ZmZlcihpW3kuaWRdKSxkZWxldGUgaVt5LmlkXSxkZWxldGUgc1t5LmlkXX1mdW5jdGlvbiBtKCl7Zm9yKGNvbnN0IHYgaW4gaSlyLmRlbGV0ZUJ1ZmZlcihpW3ZdKTtvPVtdLGk9e30scz17fX1yZXR1cm57YmluZDpjLHVwZGF0ZTpsLGRpc3Bvc2U6bX19Y2xhc3MgdUV7Y29uc3RydWN0b3IodD17fSl7Y29uc3R7Y2FudmFzOmU9WW0oKSxjb250ZXh0Om49bnVsbCxkZXB0aDppPSEwLHN0ZW5jaWw6cz0hMSxhbHBoYTpvPSExLGFudGlhbGlhczphPSExLHByZW11bHRpcGxpZWRBbHBoYTpjPSEwLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjpsPSExLHBvd2VyUHJlZmVyZW5jZTp1PSJkZWZhdWx0IixmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0Omg9ITEscmV2ZXJzZURlcHRoQnVmZmVyOmY9ITF9PXQ7dGhpcy5pc1dlYkdMUmVuZGVyZXI9ITA7bGV0IGQ7aWYobiE9PW51bGwpe2lmKHR5cGVvZiBXZWJHTFJlbmRlcmluZ0NvbnRleHQhPSJ1bmRlZmluZWQiJiZuIGluc3RhbmNlb2YgV2ViR0xSZW5kZXJpbmdDb250ZXh0KXRocm93IG5ldyBFcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlcjogV2ViR0wgMSBpcyBub3Qgc3VwcG9ydGVkIHNpbmNlIHIxNjMuIik7ZD1uLmdldENvbnRleHRBdHRyaWJ1dGVzKCkuYWxwaGF9ZWxzZSBkPW87Y29uc3QgcD1uZXcgVWludDMyQXJyYXkoNCkseD1uZXcgSW50MzJBcnJheSg0KTtsZXQgZz1udWxsLG09bnVsbDtjb25zdCB2PVtdLHk9W107dGhpcy5kb21FbGVtZW50PWUsdGhpcy5kZWJ1Zz17Y2hlY2tTaGFkZXJFcnJvcnM6ITAsb25TaGFkZXJFcnJvcjpudWxsfSx0aGlzLmF1dG9DbGVhcj0hMCx0aGlzLmF1dG9DbGVhckNvbG9yPSEwLHRoaXMuYXV0b0NsZWFyRGVwdGg9ITAsdGhpcy5hdXRvQ2xlYXJTdGVuY2lsPSEwLHRoaXMuc29ydE9iamVjdHM9ITAsdGhpcy5jbGlwcGluZ1BsYW5lcz1bXSx0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkPSExLHRoaXMudG9uZU1hcHBpbmc9SWksdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlPTEsdGhpcy50cmFuc21pc3Npb25SZXNvbHV0aW9uU2NhbGU9MTtjb25zdCBfPXRoaXM7bGV0IFM9ITE7dGhpcy5fb3V0cHV0Q29sb3JTcGFjZT1fbjtsZXQgdz0wLEE9MCxUPW51bGwsYj0tMSxNPW51bGw7Y29uc3QgRT1uZXcgUXQsRD1uZXcgUXQ7bGV0IEw9bnVsbDtjb25zdCBGPW5ldyB5dCgwKTtsZXQgTj0wLE89ZS53aWR0aCxIPWUuaGVpZ2h0LHo9MSxRPW51bGwsc3Q9bnVsbDtjb25zdCBmdD1uZXcgUXQoMCwwLE8sSCksUnQ9bmV3IFF0KDAsMCxPLEgpO2xldCBGdD0hMTtjb25zdCBLPW5ldyBRcztsZXQgb3Q9ITEsTXQ9ITE7Y29uc3QgZHQ9bmV3IEN0LEl0PW5ldyBDdCwkdD1uZXcgSSxQdD1uZXcgUXQsX2U9e2JhY2tncm91bmQ6bnVsbCxmb2c6bnVsbCxlbnZpcm9ubWVudDpudWxsLG92ZXJyaWRlTWF0ZXJpYWw6bnVsbCxpc1NjZW5lOiEwfTtsZXQgcXQ9ITE7ZnVuY3Rpb24gQnQoKXtyZXR1cm4gVD09PW51bGw/ejoxfWxldCBVPW47ZnVuY3Rpb24gbHQoUCxHKXtyZXR1cm4gZS5nZXRDb250ZXh0KFAsRyl9dHJ5e2NvbnN0IFA9e2FscGhhOiEwLGRlcHRoOmksc3RlbmNpbDpzLGFudGlhbGlhczphLHByZW11bHRpcGxpZWRBbHBoYTpjLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjpsLHBvd2VyUHJlZmVyZW5jZTp1LGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6aH07aWYoInNldEF0dHJpYnV0ZSJpbiBlJiZlLnNldEF0dHJpYnV0ZSgiZGF0YS1lbmdpbmUiLGB0aHJlZS5qcyByJHt0ZX1gKSxlLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLG50LCExKSxlLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIixTdCwhMSksZS5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yIixfdCwhMSksVT09PW51bGwpe2NvbnN0IEc9IndlYmdsMiI7aWYoVT1sdChHLFApLFU9PT1udWxsKXRocm93IGx0KEcpP25ldyBFcnJvcigiRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dCB3aXRoIHlvdXIgc2VsZWN0ZWQgYXR0cmlidXRlcy4iKTpuZXcgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQuIil9fWNhdGNoKFApe3Rocm93IGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6ICIrUC5tZXNzYWdlKSxQfWxldCBldCxhdCx0dCxFdCxYLFIsQyxCLFYsSiwkLHV0LHJ0LG10LEF0LGl0LGh0LEx0LHp0LGJ0LGVlLFp0LHBlLGs7ZnVuY3Rpb24geHQoKXtldD1uZXcgTUEoVSksZXQuaW5pdCgpLFp0PW5ldyBGeChVLGV0KSxhdD1uZXcgcEEoVSxldCx0LFp0KSx0dD1uZXcgZUUoVSxldCksYXQucmV2ZXJzZURlcHRoQnVmZmVyJiZmJiZ0dC5idWZmZXJzLmRlcHRoLnNldFJldmVyc2VkKCEwKSxFdD1uZXcgd0EoVSksWD1uZXcgR1QsUj1uZXcgbkUoVSxldCx0dCxYLGF0LFp0LEV0KSxDPW5ldyBnQShfKSxCPW5ldyB2QShfKSxWPW5ldyB1MShVKSxwZT1uZXcgZkEoVSxWKSxKPW5ldyBTQShVLFYsRXQscGUpLCQ9bmV3IFRBKFUsSixWLEV0KSx6dD1uZXcgQUEoVSxhdCxSKSxpdD1uZXcgbUEoWCksdXQ9bmV3IFZUKF8sQyxCLGV0LGF0LHBlLGl0KSxydD1uZXcgY0UoXyxYKSxtdD1uZXcgV1QsQXQ9bmV3IEpUKGV0KSxMdD1uZXcgaEEoXyxDLEIsdHQsJCxkLGMpLGh0PW5ldyBRVChfLCQsYXQpLGs9bmV3IGxFKFUsRXQsYXQsdHQpLGJ0PW5ldyBkQShVLGV0LEV0KSxlZT1uZXcgYkEoVSxldCxFdCksRXQucHJvZ3JhbXM9dXQucHJvZ3JhbXMsXy5jYXBhYmlsaXRpZXM9YXQsXy5leHRlbnNpb25zPWV0LF8ucHJvcGVydGllcz1YLF8ucmVuZGVyTGlzdHM9bXQsXy5zaGFkb3dNYXA9aHQsXy5zdGF0ZT10dCxfLmluZm89RXR9eHQoKTtjb25zdCBqPW5ldyBvRShfLFUpO3RoaXMueHI9aix0aGlzLmdldENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gVX0sdGhpcy5nZXRDb250ZXh0QXR0cmlidXRlcz1mdW5jdGlvbigpe3JldHVybiBVLmdldENvbnRleHRBdHRyaWJ1dGVzKCl9LHRoaXMuZm9yY2VDb250ZXh0TG9zcz1mdW5jdGlvbigpe2NvbnN0IFA9ZXQuZ2V0KCJXRUJHTF9sb3NlX2NvbnRleHQiKTtQJiZQLmxvc2VDb250ZXh0KCl9LHRoaXMuZm9yY2VDb250ZXh0UmVzdG9yZT1mdW5jdGlvbigpe2NvbnN0IFA9ZXQuZ2V0KCJXRUJHTF9sb3NlX2NvbnRleHQiKTtQJiZQLnJlc3RvcmVDb250ZXh0KCl9LHRoaXMuZ2V0UGl4ZWxSYXRpbz1mdW5jdGlvbigpe3JldHVybiB6fSx0aGlzLnNldFBpeGVsUmF0aW89ZnVuY3Rpb24oUCl7UCE9PXZvaWQgMCYmKHo9UCx0aGlzLnNldFNpemUoTyxILCExKSl9LHRoaXMuZ2V0U2l6ZT1mdW5jdGlvbihQKXtyZXR1cm4gUC5zZXQoTyxIKX0sdGhpcy5zZXRTaXplPWZ1bmN0aW9uKFAsRyxZPSEwKXtpZihqLmlzUHJlc2VudGluZyl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDYW4ndCBjaGFuZ2Ugc2l6ZSB3aGlsZSBWUiBkZXZpY2UgaXMgcHJlc2VudGluZy4iKTtyZXR1cm59Tz1QLEg9RyxlLndpZHRoPU1hdGguZmxvb3IoUCp6KSxlLmhlaWdodD1NYXRoLmZsb29yKEcqeiksWT09PSEwJiYoZS5zdHlsZS53aWR0aD1QKyJweCIsZS5zdHlsZS5oZWlnaHQ9RysicHgiKSx0aGlzLnNldFZpZXdwb3J0KDAsMCxQLEcpfSx0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKFApe3JldHVybiBQLnNldChPKnosSCp6KS5mbG9vcigpfSx0aGlzLnNldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKFAsRyxZKXtPPVAsSD1HLHo9WSxlLndpZHRoPU1hdGguZmxvb3IoUCpZKSxlLmhlaWdodD1NYXRoLmZsb29yKEcqWSksdGhpcy5zZXRWaWV3cG9ydCgwLDAsUCxHKX0sdGhpcy5nZXRDdXJyZW50Vmlld3BvcnQ9ZnVuY3Rpb24oUCl7cmV0dXJuIFAuY29weShFKX0sdGhpcy5nZXRWaWV3cG9ydD1mdW5jdGlvbihQKXtyZXR1cm4gUC5jb3B5KGZ0KX0sdGhpcy5zZXRWaWV3cG9ydD1mdW5jdGlvbihQLEcsWSxaKXtQLmlzVmVjdG9yND9mdC5zZXQoUC54LFAueSxQLnosUC53KTpmdC5zZXQoUCxHLFksWiksdHQudmlld3BvcnQoRS5jb3B5KGZ0KS5tdWx0aXBseVNjYWxhcih6KS5yb3VuZCgpKX0sdGhpcy5nZXRTY2lzc29yPWZ1bmN0aW9uKFApe3JldHVybiBQLmNvcHkoUnQpfSx0aGlzLnNldFNjaXNzb3I9ZnVuY3Rpb24oUCxHLFksWil7UC5pc1ZlY3RvcjQ/UnQuc2V0KFAueCxQLnksUC56LFAudyk6UnQuc2V0KFAsRyxZLFopLHR0LnNjaXNzb3IoRC5jb3B5KFJ0KS5tdWx0aXBseVNjYWxhcih6KS5yb3VuZCgpKX0sdGhpcy5nZXRTY2lzc29yVGVzdD1mdW5jdGlvbigpe3JldHVybiBGdH0sdGhpcy5zZXRTY2lzc29yVGVzdD1mdW5jdGlvbihQKXt0dC5zZXRTY2lzc29yVGVzdChGdD1QKX0sdGhpcy5zZXRPcGFxdWVTb3J0PWZ1bmN0aW9uKFApe1E9UH0sdGhpcy5zZXRUcmFuc3BhcmVudFNvcnQ9ZnVuY3Rpb24oUCl7c3Q9UH0sdGhpcy5nZXRDbGVhckNvbG9yPWZ1bmN0aW9uKFApe3JldHVybiBQLmNvcHkoTHQuZ2V0Q2xlYXJDb2xvcigpKX0sdGhpcy5zZXRDbGVhckNvbG9yPWZ1bmN0aW9uKCl7THQuc2V0Q2xlYXJDb2xvciguLi5hcmd1bWVudHMpfSx0aGlzLmdldENsZWFyQWxwaGE9ZnVuY3Rpb24oKXtyZXR1cm4gTHQuZ2V0Q2xlYXJBbHBoYSgpfSx0aGlzLnNldENsZWFyQWxwaGE9ZnVuY3Rpb24oKXtMdC5zZXRDbGVhckFscGhhKC4uLmFyZ3VtZW50cyl9LHRoaXMuY2xlYXI9ZnVuY3Rpb24oUD0hMCxHPSEwLFk9ITApe2xldCBaPTA7aWYoUCl7bGV0IFc9ITE7aWYoVCE9PW51bGwpe2NvbnN0IGN0PVQudGV4dHVyZS5mb3JtYXQ7Vz1jdD09PV9jfHxjdD09PXhjfHxjdD09PU5vfWlmKFcpe2NvbnN0IGN0PVQudGV4dHVyZS50eXBlLGd0PWN0PT09bml8fGN0PT09TGl8fGN0PT09QXN8fGN0PT09RXN8fGN0PT09cGN8fGN0PT09bWMsd3Q9THQuZ2V0Q2xlYXJDb2xvcigpLFR0PUx0LmdldENsZWFyQWxwaGEoKSxHdD13dC5yLFZ0PXd0LmcsRHQ9d3QuYjtndD8ocFswXT1HdCxwWzFdPVZ0LHBbMl09RHQscFszXT1UdCxVLmNsZWFyQnVmZmVydWl2KFUuQ09MT1IsMCxwKSk6KHhbMF09R3QseFsxXT1WdCx4WzJdPUR0LHhbM109VHQsVS5jbGVhckJ1ZmZlcml2KFUuQ09MT1IsMCx4KSl9ZWxzZSBafD1VLkNPTE9SX0JVRkZFUl9CSVR9RyYmKFp8PVUuREVQVEhfQlVGRkVSX0JJVCksWSYmKFp8PVUuU1RFTkNJTF9CVUZGRVJfQklULHRoaXMuc3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldE1hc2soNDI5NDk2NzI5NSkpLFUuY2xlYXIoWil9LHRoaXMuY2xlYXJDb2xvcj1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITAsITEsITEpfSx0aGlzLmNsZWFyRGVwdGg9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCExLCEwLCExKX0sdGhpcy5jbGVhclN0ZW5jaWw9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCExLCExLCEwKX0sdGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0IixudCwhMSksZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsU3QsITEpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0Y3JlYXRpb25lcnJvciIsX3QsITEpLEx0LmRpc3Bvc2UoKSxtdC5kaXNwb3NlKCksQXQuZGlzcG9zZSgpLFguZGlzcG9zZSgpLEMuZGlzcG9zZSgpLEIuZGlzcG9zZSgpLCQuZGlzcG9zZSgpLHBlLmRpc3Bvc2UoKSxrLmRpc3Bvc2UoKSx1dC5kaXNwb3NlKCksai5kaXNwb3NlKCksai5yZW1vdmVFdmVudExpc3RlbmVyKCJzZXNzaW9uc3RhcnQiLG12KSxqLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlc3Npb25lbmQiLGd2KSx5cy5zdG9wKCl9O2Z1bmN0aW9uIG50KFApe1AucHJldmVudERlZmF1bHQoKSxjb25zb2xlLmxvZygiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBMb3N0LiIpLFM9ITB9ZnVuY3Rpb24gU3QoKXtjb25zb2xlLmxvZygiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBSZXN0b3JlZC4iKSxTPSExO2NvbnN0IFA9RXQuYXV0b1Jlc2V0LEc9aHQuZW5hYmxlZCxZPWh0LmF1dG9VcGRhdGUsWj1odC5uZWVkc1VwZGF0ZSxXPWh0LnR5cGU7eHQoKSxFdC5hdXRvUmVzZXQ9UCxodC5lbmFibGVkPUcsaHQuYXV0b1VwZGF0ZT1ZLGh0Lm5lZWRzVXBkYXRlPVosaHQudHlwZT1XfWZ1bmN0aW9uIF90KFApe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6IEEgV2ViR0wgY29udGV4dCBjb3VsZCBub3QgYmUgY3JlYXRlZC4gUmVhc29uOiAiLFAuc3RhdHVzTWVzc2FnZSl9ZnVuY3Rpb24ganQoUCl7Y29uc3QgRz1QLnRhcmdldDtHLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGp0KSxJZShHKX1mdW5jdGlvbiBJZShQKXtlbihQKSxYLnJlbW92ZShQKX1mdW5jdGlvbiBlbihQKXtjb25zdCBHPVguZ2V0KFApLnByb2dyYW1zO0chPT12b2lkIDAmJihHLmZvckVhY2goZnVuY3Rpb24oWSl7dXQucmVsZWFzZVByb2dyYW0oWSl9KSxQLmlzU2hhZGVyTWF0ZXJpYWwmJnV0LnJlbGVhc2VTaGFkZXJDYWNoZShQKSl9dGhpcy5yZW5kZXJCdWZmZXJEaXJlY3Q9ZnVuY3Rpb24oUCxHLFksWixXLGN0KXtHPT09bnVsbCYmKEc9X2UpO2NvbnN0IGd0PVcuaXNNZXNoJiZXLm1hdHJpeFdvcmxkLmRldGVybWluYW50KCk8MCx3dD1XUChQLEcsWSxaLFcpO3R0LnNldE1hdGVyaWFsKFosZ3QpO2xldCBUdD1ZLmluZGV4LEd0PTE7aWYoWi53aXJlZnJhbWU9PT0hMCl7aWYoVHQ9Si5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUoWSksVHQ9PT12b2lkIDApcmV0dXJuO0d0PTJ9Y29uc3QgVnQ9WS5kcmF3UmFuZ2UsRHQ9WS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2xldCBhZT1WdC5zdGFydCpHdCxoZT0oVnQuc3RhcnQrVnQuY291bnQpKkd0O2N0IT09bnVsbCYmKGFlPU1hdGgubWF4KGFlLGN0LnN0YXJ0Kkd0KSxoZT1NYXRoLm1pbihoZSwoY3Quc3RhcnQrY3QuY291bnQpKkd0KSksVHQhPT1udWxsPyhhZT1NYXRoLm1heChhZSwwKSxoZT1NYXRoLm1pbihoZSxUdC5jb3VudCkpOkR0IT1udWxsJiYoYWU9TWF0aC5tYXgoYWUsMCksaGU9TWF0aC5taW4oaGUsRHQuY291bnQpKTtjb25zdCBPZT1oZS1hZTtpZihPZTwwfHxPZT09PTEvMClyZXR1cm47cGUuc2V0dXAoVyxaLHd0LFksVHQpO2xldCBQZSxjZT1idDtpZihUdCE9PW51bGwmJihQZT1WLmdldChUdCksY2U9ZWUsY2Uuc2V0SW5kZXgoUGUpKSxXLmlzTWVzaClaLndpcmVmcmFtZT09PSEwPyh0dC5zZXRMaW5lV2lkdGgoWi53aXJlZnJhbWVMaW5ld2lkdGgqQnQoKSksY2Uuc2V0TW9kZShVLkxJTkVTKSk6Y2Uuc2V0TW9kZShVLlRSSUFOR0xFUyk7ZWxzZSBpZihXLmlzTGluZSl7bGV0IFV0PVoubGluZXdpZHRoO1V0PT09dm9pZCAwJiYoVXQ9MSksdHQuc2V0TGluZVdpZHRoKFV0KkJ0KCkpLFcuaXNMaW5lU2VnbWVudHM/Y2Uuc2V0TW9kZShVLkxJTkVTKTpXLmlzTGluZUxvb3A/Y2Uuc2V0TW9kZShVLkxJTkVfTE9PUCk6Y2Uuc2V0TW9kZShVLkxJTkVfU1RSSVApfWVsc2UgVy5pc1BvaW50cz9jZS5zZXRNb2RlKFUuUE9JTlRTKTpXLmlzU3ByaXRlJiZjZS5zZXRNb2RlKFUuVFJJQU5HTEVTKTtpZihXLmlzQmF0Y2hlZE1lc2gpaWYoVy5fbXVsdGlEcmF3SW5zdGFuY2VzIT09bnVsbClZYygiVEhSRUUuV2ViR0xSZW5kZXJlcjogcmVuZGVyTXVsdGlEcmF3SW5zdGFuY2VzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiByMTg0LiBBcHBlbmQgdG8gcmVuZGVyTXVsdGlEcmF3IGFyZ3VtZW50cyBhbmQgdXNlIGluZGlyZWN0aW9uLiIpLGNlLnJlbmRlck11bHRpRHJhd0luc3RhbmNlcyhXLl9tdWx0aURyYXdTdGFydHMsVy5fbXVsdGlEcmF3Q291bnRzLFcuX211bHRpRHJhd0NvdW50LFcuX211bHRpRHJhd0luc3RhbmNlcyk7ZWxzZSBpZihldC5nZXQoIldFQkdMX211bHRpX2RyYXciKSljZS5yZW5kZXJNdWx0aURyYXcoVy5fbXVsdGlEcmF3U3RhcnRzLFcuX211bHRpRHJhd0NvdW50cyxXLl9tdWx0aURyYXdDb3VudCk7ZWxzZXtjb25zdCBVdD1XLl9tdWx0aURyYXdTdGFydHMscWU9Vy5fbXVsdGlEcmF3Q291bnRzLGZlPVcuX211bHRpRHJhd0NvdW50LG1pPVR0P1YuZ2V0KFR0KS5ieXRlc1BlckVsZW1lbnQ6MSxFbz1YLmdldChaKS5jdXJyZW50UHJvZ3JhbS5nZXRVbmlmb3JtcygpO2ZvcihsZXQgVm49MDtWbjxmZTtWbisrKUVvLnNldFZhbHVlKFUsIl9nbF9EcmF3SUQiLFZuKSxjZS5yZW5kZXIoVXRbVm5dL21pLHFlW1ZuXSl9ZWxzZSBpZihXLmlzSW5zdGFuY2VkTWVzaCljZS5yZW5kZXJJbnN0YW5jZXMoYWUsT2UsVy5jb3VudCk7ZWxzZSBpZihZLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkpe2NvbnN0IFV0PVkuX21heEluc3RhbmNlQ291bnQhPT12b2lkIDA/WS5fbWF4SW5zdGFuY2VDb3VudDoxLzAscWU9TWF0aC5taW4oWS5pbnN0YW5jZUNvdW50LFV0KTtjZS5yZW5kZXJJbnN0YW5jZXMoYWUsT2UscWUpfWVsc2UgY2UucmVuZGVyKGFlLE9lKX07ZnVuY3Rpb24gbWUoUCxHLFkpe1AudHJhbnNwYXJlbnQ9PT0hMCYmUC5zaWRlPT09UG4mJlAuZm9yY2VTaW5nbGVQYXNzPT09ITE/KFAuc2lkZT1ZZSxQLm5lZWRzVXBkYXRlPSEwLHpoKFAsRyxZKSxQLnNpZGU9ZWksUC5uZWVkc1VwZGF0ZT0hMCx6aChQLEcsWSksUC5zaWRlPVBuKTp6aChQLEcsWSl9dGhpcy5jb21waWxlPWZ1bmN0aW9uKFAsRyxZPW51bGwpe1k9PT1udWxsJiYoWT1QKSxtPUF0LmdldChZKSxtLmluaXQoRykseS5wdXNoKG0pLFkudHJhdmVyc2VWaXNpYmxlKGZ1bmN0aW9uKFcpe1cuaXNMaWdodCYmVy5sYXllcnMudGVzdChHLmxheWVycykmJihtLnB1c2hMaWdodChXKSxXLmNhc3RTaGFkb3cmJm0ucHVzaFNoYWRvdyhXKSl9KSxQIT09WSYmUC50cmF2ZXJzZVZpc2libGUoZnVuY3Rpb24oVyl7Vy5pc0xpZ2h0JiZXLmxheWVycy50ZXN0KEcubGF5ZXJzKSYmKG0ucHVzaExpZ2h0KFcpLFcuY2FzdFNoYWRvdyYmbS5wdXNoU2hhZG93KFcpKX0pLG0uc2V0dXBMaWdodHMoKTtjb25zdCBaPW5ldyBTZXQ7cmV0dXJuIFAudHJhdmVyc2UoZnVuY3Rpb24oVyl7aWYoIShXLmlzTWVzaHx8Vy5pc1BvaW50c3x8Vy5pc0xpbmV8fFcuaXNTcHJpdGUpKXJldHVybjtjb25zdCBjdD1XLm1hdGVyaWFsO2lmKGN0KWlmKEFycmF5LmlzQXJyYXkoY3QpKWZvcihsZXQgZ3Q9MDtndDxjdC5sZW5ndGg7Z3QrKyl7Y29uc3Qgd3Q9Y3RbZ3RdO21lKHd0LFksVyksWi5hZGQod3QpfWVsc2UgbWUoY3QsWSxXKSxaLmFkZChjdCl9KSxtPXkucG9wKCksWn0sdGhpcy5jb21waWxlQXN5bmM9ZnVuY3Rpb24oUCxHLFk9bnVsbCl7Y29uc3QgWj10aGlzLmNvbXBpbGUoUCxHLFkpO3JldHVybiBuZXcgUHJvbWlzZShXPT57ZnVuY3Rpb24gY3QoKXtpZihaLmZvckVhY2goZnVuY3Rpb24oZ3Qpe1guZ2V0KGd0KS5jdXJyZW50UHJvZ3JhbS5pc1JlYWR5KCkmJlouZGVsZXRlKGd0KX0pLFouc2l6ZT09PTApe1coUCk7cmV0dXJufXNldFRpbWVvdXQoY3QsMTApfWV0LmdldCgiS0hSX3BhcmFsbGVsX3NoYWRlcl9jb21waWxlIikhPT1udWxsP2N0KCk6c2V0VGltZW91dChjdCwxMCl9KX07bGV0IHBpPW51bGw7ZnVuY3Rpb24gaXIoUCl7cGkmJnBpKFApfWZ1bmN0aW9uIG12KCl7eXMuc3RvcCgpfWZ1bmN0aW9uIGd2KCl7eXMuc3RhcnQoKX1jb25zdCB5cz1uZXcgY3g7eXMuc2V0QW5pbWF0aW9uTG9vcChpciksdHlwZW9mIHNlbGYhPSJ1bmRlZmluZWQiJiZ5cy5zZXRDb250ZXh0KHNlbGYpLHRoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbihQKXtwaT1QLGouc2V0QW5pbWF0aW9uTG9vcChQKSxQPT09bnVsbD95cy5zdG9wKCk6eXMuc3RhcnQoKX0sai5hZGRFdmVudExpc3RlbmVyKCJzZXNzaW9uc3RhcnQiLG12KSxqLmFkZEV2ZW50TGlzdGVuZXIoInNlc3Npb25lbmQiLGd2KSx0aGlzLnJlbmRlcj1mdW5jdGlvbihQLEcpe2lmKEchPT12b2lkIDAmJkcuaXNDYW1lcmEhPT0hMCl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLiIpO3JldHVybn1pZihTPT09ITApcmV0dXJuO2lmKFAubWF0cml4V29ybGRBdXRvVXBkYXRlPT09ITAmJlAudXBkYXRlTWF0cml4V29ybGQoKSxHLnBhcmVudD09PW51bGwmJkcubWF0cml4V29ybGRBdXRvVXBkYXRlPT09ITAmJkcudXBkYXRlTWF0cml4V29ybGQoKSxqLmVuYWJsZWQ9PT0hMCYmai5pc1ByZXNlbnRpbmc9PT0hMCYmKGouY2FtZXJhQXV0b1VwZGF0ZT09PSEwJiZqLnVwZGF0ZUNhbWVyYShHKSxHPWouZ2V0Q2FtZXJhKCkpLFAuaXNTY2VuZT09PSEwJiZQLm9uQmVmb3JlUmVuZGVyKF8sUCxHLFQpLG09QXQuZ2V0KFAseS5sZW5ndGgpLG0uaW5pdChHKSx5LnB1c2gobSksSXQubXVsdGlwbHlNYXRyaWNlcyhHLnByb2plY3Rpb25NYXRyaXgsRy5tYXRyaXhXb3JsZEludmVyc2UpLEsuc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoSXQpLE10PXRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQsb3Q9aXQuaW5pdCh0aGlzLmNsaXBwaW5nUGxhbmVzLE10KSxnPW10LmdldChQLHYubGVuZ3RoKSxnLmluaXQoKSx2LnB1c2goZyksai5lbmFibGVkPT09ITAmJmouaXNQcmVzZW50aW5nPT09ITApe2NvbnN0IGN0PV8ueHIuZ2V0RGVwdGhTZW5zaW5nTWVzaCgpO2N0IT09bnVsbCYmbm0oY3QsRywtMS8wLF8uc29ydE9iamVjdHMpfW5tKFAsRywwLF8uc29ydE9iamVjdHMpLGcuZmluaXNoKCksXy5zb3J0T2JqZWN0cz09PSEwJiZnLnNvcnQoUSxzdCkscXQ9ai5lbmFibGVkPT09ITF8fGouaXNQcmVzZW50aW5nPT09ITF8fGouaGFzRGVwdGhTZW5zaW5nKCk9PT0hMSxxdCYmTHQuYWRkVG9SZW5kZXJMaXN0KGcsUCksdGhpcy5pbmZvLnJlbmRlci5mcmFtZSsrLG90PT09ITAmJml0LmJlZ2luU2hhZG93cygpO2NvbnN0IFk9bS5zdGF0ZS5zaGFkb3dzQXJyYXk7aHQucmVuZGVyKFksUCxHKSxvdD09PSEwJiZpdC5lbmRTaGFkb3dzKCksdGhpcy5pbmZvLmF1dG9SZXNldD09PSEwJiZ0aGlzLmluZm8ucmVzZXQoKTtjb25zdCBaPWcub3BhcXVlLFc9Zy50cmFuc21pc3NpdmU7aWYobS5zZXR1cExpZ2h0cygpLEcuaXNBcnJheUNhbWVyYSl7Y29uc3QgY3Q9Ry5jYW1lcmFzO2lmKFcubGVuZ3RoPjApZm9yKGxldCBndD0wLHd0PWN0Lmxlbmd0aDtndDx3dDtndCsrKXtjb25zdCBUdD1jdFtndF07X3YoWixXLFAsVHQpfXF0JiZMdC5yZW5kZXIoUCk7Zm9yKGxldCBndD0wLHd0PWN0Lmxlbmd0aDtndDx3dDtndCsrKXtjb25zdCBUdD1jdFtndF07eHYoZyxQLFR0LFR0LnZpZXdwb3J0KX19ZWxzZSBXLmxlbmd0aD4wJiZfdihaLFcsUCxHKSxxdCYmTHQucmVuZGVyKFApLHh2KGcsUCxHKTtUIT09bnVsbCYmQT09PTAmJihSLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KFQpLFIudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKFQpKSxQLmlzU2NlbmU9PT0hMCYmUC5vbkFmdGVyUmVuZGVyKF8sUCxHKSxwZS5yZXNldERlZmF1bHRTdGF0ZSgpLGI9LTEsTT1udWxsLHkucG9wKCkseS5sZW5ndGg+MD8obT15W3kubGVuZ3RoLTFdLG90PT09ITAmJml0LnNldEdsb2JhbFN0YXRlKF8uY2xpcHBpbmdQbGFuZXMsbS5zdGF0ZS5jYW1lcmEpKTptPW51bGwsdi5wb3AoKSx2Lmxlbmd0aD4wP2c9dlt2Lmxlbmd0aC0xXTpnPW51bGx9O2Z1bmN0aW9uIG5tKFAsRyxZLFope2lmKFAudmlzaWJsZT09PSExKXJldHVybjtpZihQLmxheWVycy50ZXN0KEcubGF5ZXJzKSl7aWYoUC5pc0dyb3VwKVk9UC5yZW5kZXJPcmRlcjtlbHNlIGlmKFAuaXNMT0QpUC5hdXRvVXBkYXRlPT09ITAmJlAudXBkYXRlKEcpO2Vsc2UgaWYoUC5pc0xpZ2h0KW0ucHVzaExpZ2h0KFApLFAuY2FzdFNoYWRvdyYmbS5wdXNoU2hhZG93KFApO2Vsc2UgaWYoUC5pc1Nwcml0ZSl7aWYoIVAuZnJ1c3R1bUN1bGxlZHx8Sy5pbnRlcnNlY3RzU3ByaXRlKFApKXtaJiZQdC5zZXRGcm9tTWF0cml4UG9zaXRpb24oUC5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KEl0KTtjb25zdCBndD0kLnVwZGF0ZShQKSx3dD1QLm1hdGVyaWFsO3d0LnZpc2libGUmJmcucHVzaChQLGd0LHd0LFksUHQueixudWxsKX19ZWxzZSBpZigoUC5pc01lc2h8fFAuaXNMaW5lfHxQLmlzUG9pbnRzKSYmKCFQLmZydXN0dW1DdWxsZWR8fEsuaW50ZXJzZWN0c09iamVjdChQKSkpe2NvbnN0IGd0PSQudXBkYXRlKFApLHd0PVAubWF0ZXJpYWw7aWYoWiYmKFAuYm91bmRpbmdTcGhlcmUhPT12b2lkIDA/KFAuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZQLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLFB0LmNvcHkoUC5ib3VuZGluZ1NwaGVyZS5jZW50ZXIpKTooZ3QuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZndC5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxQdC5jb3B5KGd0LmJvdW5kaW5nU3BoZXJlLmNlbnRlcikpLFB0LmFwcGx5TWF0cml4NChQLm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoSXQpKSxBcnJheS5pc0FycmF5KHd0KSl7Y29uc3QgVHQ9Z3QuZ3JvdXBzO2ZvcihsZXQgR3Q9MCxWdD1UdC5sZW5ndGg7R3Q8VnQ7R3QrKyl7Y29uc3QgRHQ9VHRbR3RdLGFlPXd0W0R0Lm1hdGVyaWFsSW5kZXhdO2FlJiZhZS52aXNpYmxlJiZnLnB1c2goUCxndCxhZSxZLFB0LnosRHQpfX1lbHNlIHd0LnZpc2libGUmJmcucHVzaChQLGd0LHd0LFksUHQueixudWxsKX19Y29uc3QgY3Q9UC5jaGlsZHJlbjtmb3IobGV0IGd0PTAsd3Q9Y3QubGVuZ3RoO2d0PHd0O2d0Kyspbm0oY3RbZ3RdLEcsWSxaKX1mdW5jdGlvbiB4dihQLEcsWSxaKXtjb25zdCBXPVAub3BhcXVlLGN0PVAudHJhbnNtaXNzaXZlLGd0PVAudHJhbnNwYXJlbnQ7bS5zZXR1cExpZ2h0c1ZpZXcoWSksb3Q9PT0hMCYmaXQuc2V0R2xvYmFsU3RhdGUoXy5jbGlwcGluZ1BsYW5lcyxZKSxaJiZ0dC52aWV3cG9ydChFLmNvcHkoWikpLFcubGVuZ3RoPjAmJk9oKFcsRyxZKSxjdC5sZW5ndGg+MCYmT2goY3QsRyxZKSxndC5sZW5ndGg+MCYmT2goZ3QsRyxZKSx0dC5idWZmZXJzLmRlcHRoLnNldFRlc3QoITApLHR0LmJ1ZmZlcnMuZGVwdGguc2V0TWFzayghMCksdHQuYnVmZmVycy5jb2xvci5zZXRNYXNrKCEwKSx0dC5zZXRQb2x5Z29uT2Zmc2V0KCExKX1mdW5jdGlvbiBfdihQLEcsWSxaKXtpZigoWS5pc1NjZW5lPT09ITA/WS5vdmVycmlkZU1hdGVyaWFsOm51bGwpIT09bnVsbClyZXR1cm47bS5zdGF0ZS50cmFuc21pc3Npb25SZW5kZXJUYXJnZXRbWi5pZF09PT12b2lkIDAmJihtLnN0YXRlLnRyYW5zbWlzc2lvblJlbmRlclRhcmdldFtaLmlkXT1uZXcgdmkoMSwxLHtnZW5lcmF0ZU1pcG1hcHM6ITAsdHlwZTpldC5oYXMoIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIpfHxldC5oYXMoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKT9UczpuaSxtaW5GaWx0ZXI6X2ksc2FtcGxlczo0LHN0ZW5jaWxCdWZmZXI6cyxyZXNvbHZlRGVwdGhCdWZmZXI6ITEscmVzb2x2ZVN0ZW5jaWxCdWZmZXI6ITEsY29sb3JTcGFjZTpuZS53b3JraW5nQ29sb3JTcGFjZX0pKTtjb25zdCBjdD1tLnN0YXRlLnRyYW5zbWlzc2lvblJlbmRlclRhcmdldFtaLmlkXSxndD1aLnZpZXdwb3J0fHxFO2N0LnNldFNpemUoZ3QueipfLnRyYW5zbWlzc2lvblJlc29sdXRpb25TY2FsZSxndC53Kl8udHJhbnNtaXNzaW9uUmVzb2x1dGlvblNjYWxlKTtjb25zdCB3dD1fLmdldFJlbmRlclRhcmdldCgpO18uc2V0UmVuZGVyVGFyZ2V0KGN0KSxfLmdldENsZWFyQ29sb3IoRiksTj1fLmdldENsZWFyQWxwaGEoKSxOPDEmJl8uc2V0Q2xlYXJDb2xvcigxNjc3NzIxNSwuNSksXy5jbGVhcigpLHF0JiZMdC5yZW5kZXIoWSk7Y29uc3QgVHQ9Xy50b25lTWFwcGluZztfLnRvbmVNYXBwaW5nPUlpO2NvbnN0IEd0PVoudmlld3BvcnQ7aWYoWi52aWV3cG9ydCE9PXZvaWQgMCYmKFoudmlld3BvcnQ9dm9pZCAwKSxtLnNldHVwTGlnaHRzVmlldyhaKSxvdD09PSEwJiZpdC5zZXRHbG9iYWxTdGF0ZShfLmNsaXBwaW5nUGxhbmVzLFopLE9oKFAsWSxaKSxSLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KGN0KSxSLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcChjdCksZXQuaGFzKCJXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiKT09PSExKXtsZXQgVnQ9ITE7Zm9yKGxldCBEdD0wLGFlPUcubGVuZ3RoO0R0PGFlO0R0Kyspe2NvbnN0IGhlPUdbRHRdLE9lPWhlLm9iamVjdCxQZT1oZS5nZW9tZXRyeSxjZT1oZS5tYXRlcmlhbCxVdD1oZS5ncm91cDtpZihjZS5zaWRlPT09UG4mJk9lLmxheWVycy50ZXN0KFoubGF5ZXJzKSl7Y29uc3QgcWU9Y2Uuc2lkZTtjZS5zaWRlPVllLGNlLm5lZWRzVXBkYXRlPSEwLHl2KE9lLFksWixQZSxjZSxVdCksY2Uuc2lkZT1xZSxjZS5uZWVkc1VwZGF0ZT0hMCxWdD0hMH19VnQ9PT0hMCYmKFIudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoY3QpLFIudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKGN0KSl9Xy5zZXRSZW5kZXJUYXJnZXQod3QpLF8uc2V0Q2xlYXJDb2xvcihGLE4pLEd0IT09dm9pZCAwJiYoWi52aWV3cG9ydD1HdCksXy50b25lTWFwcGluZz1UdH1mdW5jdGlvbiBPaChQLEcsWSl7Y29uc3QgWj1HLmlzU2NlbmU9PT0hMD9HLm92ZXJyaWRlTWF0ZXJpYWw6bnVsbDtmb3IobGV0IFc9MCxjdD1QLmxlbmd0aDtXPGN0O1crKyl7Y29uc3QgZ3Q9UFtXXSx3dD1ndC5vYmplY3QsVHQ9Z3QuZ2VvbWV0cnksR3Q9Z3QuZ3JvdXA7bGV0IFZ0PWd0Lm1hdGVyaWFsO1Z0LmFsbG93T3ZlcnJpZGU9PT0hMCYmWiE9PW51bGwmJihWdD1aKSx3dC5sYXllcnMudGVzdChZLmxheWVycykmJnl2KHd0LEcsWSxUdCxWdCxHdCl9fWZ1bmN0aW9uIHl2KFAsRyxZLFosVyxjdCl7UC5vbkJlZm9yZVJlbmRlcihfLEcsWSxaLFcsY3QpLFAubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoWS5tYXRyaXhXb3JsZEludmVyc2UsUC5tYXRyaXhXb3JsZCksUC5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KFAubW9kZWxWaWV3TWF0cml4KSxXLm9uQmVmb3JlUmVuZGVyKF8sRyxZLFosUCxjdCksVy50cmFuc3BhcmVudD09PSEwJiZXLnNpZGU9PT1QbiYmVy5mb3JjZVNpbmdsZVBhc3M9PT0hMT8oVy5zaWRlPVllLFcubmVlZHNVcGRhdGU9ITAsXy5yZW5kZXJCdWZmZXJEaXJlY3QoWSxHLFosVyxQLGN0KSxXLnNpZGU9ZWksVy5uZWVkc1VwZGF0ZT0hMCxfLnJlbmRlckJ1ZmZlckRpcmVjdChZLEcsWixXLFAsY3QpLFcuc2lkZT1Qbik6Xy5yZW5kZXJCdWZmZXJEaXJlY3QoWSxHLFosVyxQLGN0KSxQLm9uQWZ0ZXJSZW5kZXIoXyxHLFksWixXLGN0KX1mdW5jdGlvbiB6aChQLEcsWSl7Ry5pc1NjZW5lIT09ITAmJihHPV9lKTtjb25zdCBaPVguZ2V0KFApLFc9bS5zdGF0ZS5saWdodHMsY3Q9bS5zdGF0ZS5zaGFkb3dzQXJyYXksZ3Q9Vy5zdGF0ZS52ZXJzaW9uLHd0PXV0LmdldFBhcmFtZXRlcnMoUCxXLnN0YXRlLGN0LEcsWSksVHQ9dXQuZ2V0UHJvZ3JhbUNhY2hlS2V5KHd0KTtsZXQgR3Q9Wi5wcm9ncmFtcztaLmVudmlyb25tZW50PVAuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9HLmVudmlyb25tZW50Om51bGwsWi5mb2c9Ry5mb2csWi5lbnZNYXA9KFAuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9COkMpLmdldChQLmVudk1hcHx8Wi5lbnZpcm9ubWVudCksWi5lbnZNYXBSb3RhdGlvbj1aLmVudmlyb25tZW50IT09bnVsbCYmUC5lbnZNYXA9PT1udWxsP0cuZW52aXJvbm1lbnRSb3RhdGlvbjpQLmVudk1hcFJvdGF0aW9uLEd0PT09dm9pZCAwJiYoUC5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixqdCksR3Q9bmV3IE1hcCxaLnByb2dyYW1zPUd0KTtsZXQgVnQ9R3QuZ2V0KFR0KTtpZihWdCE9PXZvaWQgMCl7aWYoWi5jdXJyZW50UHJvZ3JhbT09PVZ0JiZaLmxpZ2h0c1N0YXRlVmVyc2lvbj09PWd0KXJldHVybiBNdihQLHd0KSxWdH1lbHNlIHd0LnVuaWZvcm1zPXV0LmdldFVuaWZvcm1zKFApLFAub25CZWZvcmVDb21waWxlKHd0LF8pLFZ0PXV0LmFjcXVpcmVQcm9ncmFtKHd0LFR0KSxHdC5zZXQoVHQsVnQpLFoudW5pZm9ybXM9d3QudW5pZm9ybXM7Y29uc3QgRHQ9Wi51bmlmb3JtcztyZXR1cm4oIVAuaXNTaGFkZXJNYXRlcmlhbCYmIVAuaXNSYXdTaGFkZXJNYXRlcmlhbHx8UC5jbGlwcGluZz09PSEwKSYmKER0LmNsaXBwaW5nUGxhbmVzPWl0LnVuaWZvcm0pLE12KFAsd3QpLFoubmVlZHNMaWdodHM9JFAoUCksWi5saWdodHNTdGF0ZVZlcnNpb249Z3QsWi5uZWVkc0xpZ2h0cyYmKER0LmFtYmllbnRMaWdodENvbG9yLnZhbHVlPVcuc3RhdGUuYW1iaWVudCxEdC5saWdodFByb2JlLnZhbHVlPVcuc3RhdGUucHJvYmUsRHQuZGlyZWN0aW9uYWxMaWdodHMudmFsdWU9Vy5zdGF0ZS5kaXJlY3Rpb25hbCxEdC5kaXJlY3Rpb25hbExpZ2h0U2hhZG93cy52YWx1ZT1XLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93LER0LnNwb3RMaWdodHMudmFsdWU9Vy5zdGF0ZS5zcG90LER0LnNwb3RMaWdodFNoYWRvd3MudmFsdWU9Vy5zdGF0ZS5zcG90U2hhZG93LER0LnJlY3RBcmVhTGlnaHRzLnZhbHVlPVcuc3RhdGUucmVjdEFyZWEsRHQubHRjXzEudmFsdWU9Vy5zdGF0ZS5yZWN0QXJlYUxUQzEsRHQubHRjXzIudmFsdWU9Vy5zdGF0ZS5yZWN0QXJlYUxUQzIsRHQucG9pbnRMaWdodHMudmFsdWU9Vy5zdGF0ZS5wb2ludCxEdC5wb2ludExpZ2h0U2hhZG93cy52YWx1ZT1XLnN0YXRlLnBvaW50U2hhZG93LER0LmhlbWlzcGhlcmVMaWdodHMudmFsdWU9Vy5zdGF0ZS5oZW1pLER0LmRpcmVjdGlvbmFsU2hhZG93TWFwLnZhbHVlPVcuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXAsRHQuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgudmFsdWU9Vy5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeCxEdC5zcG90U2hhZG93TWFwLnZhbHVlPVcuc3RhdGUuc3BvdFNoYWRvd01hcCxEdC5zcG90TGlnaHRNYXRyaXgudmFsdWU9Vy5zdGF0ZS5zcG90TGlnaHRNYXRyaXgsRHQuc3BvdExpZ2h0TWFwLnZhbHVlPVcuc3RhdGUuc3BvdExpZ2h0TWFwLER0LnBvaW50U2hhZG93TWFwLnZhbHVlPVcuc3RhdGUucG9pbnRTaGFkb3dNYXAsRHQucG9pbnRTaGFkb3dNYXRyaXgudmFsdWU9Vy5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeCksWi5jdXJyZW50UHJvZ3JhbT1WdCxaLnVuaWZvcm1zTGlzdD1udWxsLFZ0fWZ1bmN0aW9uIHZ2KFApe2lmKFAudW5pZm9ybXNMaXN0PT09bnVsbCl7Y29uc3QgRz1QLmN1cnJlbnRQcm9ncmFtLmdldFVuaWZvcm1zKCk7UC51bmlmb3Jtc0xpc3Q9Z3Uuc2VxV2l0aFZhbHVlKEcuc2VxLFAudW5pZm9ybXMpfXJldHVybiBQLnVuaWZvcm1zTGlzdH1mdW5jdGlvbiBNdihQLEcpe2NvbnN0IFk9WC5nZXQoUCk7WS5vdXRwdXRDb2xvclNwYWNlPUcub3V0cHV0Q29sb3JTcGFjZSxZLmJhdGNoaW5nPUcuYmF0Y2hpbmcsWS5iYXRjaGluZ0NvbG9yPUcuYmF0Y2hpbmdDb2xvcixZLmluc3RhbmNpbmc9Ry5pbnN0YW5jaW5nLFkuaW5zdGFuY2luZ0NvbG9yPUcuaW5zdGFuY2luZ0NvbG9yLFkuaW5zdGFuY2luZ01vcnBoPUcuaW5zdGFuY2luZ01vcnBoLFkuc2tpbm5pbmc9Ry5za2lubmluZyxZLm1vcnBoVGFyZ2V0cz1HLm1vcnBoVGFyZ2V0cyxZLm1vcnBoTm9ybWFscz1HLm1vcnBoTm9ybWFscyxZLm1vcnBoQ29sb3JzPUcubW9ycGhDb2xvcnMsWS5tb3JwaFRhcmdldHNDb3VudD1HLm1vcnBoVGFyZ2V0c0NvdW50LFkubnVtQ2xpcHBpbmdQbGFuZXM9Ry5udW1DbGlwcGluZ1BsYW5lcyxZLm51bUludGVyc2VjdGlvbj1HLm51bUNsaXBJbnRlcnNlY3Rpb24sWS52ZXJ0ZXhBbHBoYXM9Ry52ZXJ0ZXhBbHBoYXMsWS52ZXJ0ZXhUYW5nZW50cz1HLnZlcnRleFRhbmdlbnRzLFkudG9uZU1hcHBpbmc9Ry50b25lTWFwcGluZ31mdW5jdGlvbiBXUChQLEcsWSxaLFcpe0cuaXNTY2VuZSE9PSEwJiYoRz1fZSksUi5yZXNldFRleHR1cmVVbml0cygpO2NvbnN0IGN0PUcuZm9nLGd0PVouaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9HLmVudmlyb25tZW50Om51bGwsd3Q9VD09PW51bGw/Xy5vdXRwdXRDb2xvclNwYWNlOlQuaXNYUlJlbmRlclRhcmdldD09PSEwP1QudGV4dHVyZS5jb2xvclNwYWNlOkRyLFR0PShaLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/QjpDKS5nZXQoWi5lbnZNYXB8fGd0KSxHdD1aLnZlcnRleENvbG9ycz09PSEwJiYhIVkuYXR0cmlidXRlcy5jb2xvciYmWS5hdHRyaWJ1dGVzLmNvbG9yLml0ZW1TaXplPT09NCxWdD0hIVkuYXR0cmlidXRlcy50YW5nZW50JiYoISFaLm5vcm1hbE1hcHx8Wi5hbmlzb3Ryb3B5PjApLER0PSEhWS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sYWU9ISFZLm1vcnBoQXR0cmlidXRlcy5ub3JtYWwsaGU9ISFZLm1vcnBoQXR0cmlidXRlcy5jb2xvcjtsZXQgT2U9SWk7Wi50b25lTWFwcGVkJiYoVD09PW51bGx8fFQuaXNYUlJlbmRlclRhcmdldD09PSEwKSYmKE9lPV8udG9uZU1hcHBpbmcpO2NvbnN0IFBlPVkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9ufHxZLm1vcnBoQXR0cmlidXRlcy5ub3JtYWx8fFkubW9ycGhBdHRyaWJ1dGVzLmNvbG9yLGNlPVBlIT09dm9pZCAwP1BlLmxlbmd0aDowLFV0PVguZ2V0KFopLHFlPW0uc3RhdGUubGlnaHRzO2lmKG90PT09ITAmJihNdD09PSEwfHxQIT09TSkpe2NvbnN0IG1uPVA9PT1NJiZaLmlkPT09YjtpdC5zZXRTdGF0ZShaLFAsbW4pfWxldCBmZT0hMTtaLnZlcnNpb249PT1VdC5fX3ZlcnNpb24/KFV0Lm5lZWRzTGlnaHRzJiZVdC5saWdodHNTdGF0ZVZlcnNpb24hPT1xZS5zdGF0ZS52ZXJzaW9ufHxVdC5vdXRwdXRDb2xvclNwYWNlIT09d3R8fFcuaXNCYXRjaGVkTWVzaCYmVXQuYmF0Y2hpbmc9PT0hMXx8IVcuaXNCYXRjaGVkTWVzaCYmVXQuYmF0Y2hpbmc9PT0hMHx8Vy5pc0JhdGNoZWRNZXNoJiZVdC5iYXRjaGluZ0NvbG9yPT09ITAmJlcuY29sb3JUZXh0dXJlPT09bnVsbHx8Vy5pc0JhdGNoZWRNZXNoJiZVdC5iYXRjaGluZ0NvbG9yPT09ITEmJlcuY29sb3JUZXh0dXJlIT09bnVsbHx8Vy5pc0luc3RhbmNlZE1lc2gmJlV0Lmluc3RhbmNpbmc9PT0hMXx8IVcuaXNJbnN0YW5jZWRNZXNoJiZVdC5pbnN0YW5jaW5nPT09ITB8fFcuaXNTa2lubmVkTWVzaCYmVXQuc2tpbm5pbmc9PT0hMXx8IVcuaXNTa2lubmVkTWVzaCYmVXQuc2tpbm5pbmc9PT0hMHx8Vy5pc0luc3RhbmNlZE1lc2gmJlV0Lmluc3RhbmNpbmdDb2xvcj09PSEwJiZXLmluc3RhbmNlQ29sb3I9PT1udWxsfHxXLmlzSW5zdGFuY2VkTWVzaCYmVXQuaW5zdGFuY2luZ0NvbG9yPT09ITEmJlcuaW5zdGFuY2VDb2xvciE9PW51bGx8fFcuaXNJbnN0YW5jZWRNZXNoJiZVdC5pbnN0YW5jaW5nTW9ycGg9PT0hMCYmVy5tb3JwaFRleHR1cmU9PT1udWxsfHxXLmlzSW5zdGFuY2VkTWVzaCYmVXQuaW5zdGFuY2luZ01vcnBoPT09ITEmJlcubW9ycGhUZXh0dXJlIT09bnVsbHx8VXQuZW52TWFwIT09VHR8fFouZm9nPT09ITAmJlV0LmZvZyE9PWN0fHxVdC5udW1DbGlwcGluZ1BsYW5lcyE9PXZvaWQgMCYmKFV0Lm51bUNsaXBwaW5nUGxhbmVzIT09aXQubnVtUGxhbmVzfHxVdC5udW1JbnRlcnNlY3Rpb24hPT1pdC5udW1JbnRlcnNlY3Rpb24pfHxVdC52ZXJ0ZXhBbHBoYXMhPT1HdHx8VXQudmVydGV4VGFuZ2VudHMhPT1WdHx8VXQubW9ycGhUYXJnZXRzIT09RHR8fFV0Lm1vcnBoTm9ybWFscyE9PWFlfHxVdC5tb3JwaENvbG9ycyE9PWhlfHxVdC50b25lTWFwcGluZyE9PU9lfHxVdC5tb3JwaFRhcmdldHNDb3VudCE9PWNlKSYmKGZlPSEwKTooZmU9ITAsVXQuX192ZXJzaW9uPVoudmVyc2lvbik7bGV0IG1pPVV0LmN1cnJlbnRQcm9ncmFtO2ZlPT09ITAmJihtaT16aChaLEcsVykpO2xldCBFbz0hMSxWbj0hMSxuYz0hMTtjb25zdCBNZT1taS5nZXRVbmlmb3JtcygpLFFuPVV0LnVuaWZvcm1zO2lmKHR0LnVzZVByb2dyYW0obWkucHJvZ3JhbSkmJihFbz0hMCxWbj0hMCxuYz0hMCksWi5pZCE9PWImJihiPVouaWQsVm49ITApLEVvfHxNIT09UCl7dHQuYnVmZmVycy5kZXB0aC5nZXRSZXZlcnNlZCgpPyhkdC5jb3B5KFAucHJvamVjdGlvbk1hdHJpeCksUk0oZHQpLElNKGR0KSxNZS5zZXRWYWx1ZShVLCJwcm9qZWN0aW9uTWF0cml4IixkdCkpOk1lLnNldFZhbHVlKFUsInByb2plY3Rpb25NYXRyaXgiLFAucHJvamVjdGlvbk1hdHJpeCksTWUuc2V0VmFsdWUoVSwidmlld01hdHJpeCIsUC5tYXRyaXhXb3JsZEludmVyc2UpO2NvbnN0IENuPU1lLm1hcC5jYW1lcmFQb3NpdGlvbjtDbiE9PXZvaWQgMCYmQ24uc2V0VmFsdWUoVSwkdC5zZXRGcm9tTWF0cml4UG9zaXRpb24oUC5tYXRyaXhXb3JsZCkpLGF0LmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJk1lLnNldFZhbHVlKFUsImxvZ0RlcHRoQnVmRkMiLDIvKE1hdGgubG9nKFAuZmFyKzEpL01hdGguTE4yKSksKFouaXNNZXNoUGhvbmdNYXRlcmlhbHx8Wi5pc01lc2hUb29uTWF0ZXJpYWx8fFouaXNNZXNoTGFtYmVydE1hdGVyaWFsfHxaLmlzTWVzaEJhc2ljTWF0ZXJpYWx8fFouaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8Wi5pc1NoYWRlck1hdGVyaWFsKSYmTWUuc2V0VmFsdWUoVSwiaXNPcnRob2dyYXBoaWMiLFAuaXNPcnRob2dyYXBoaWNDYW1lcmE9PT0hMCksTSE9PVAmJihNPVAsVm49ITAsbmM9ITApfWlmKFcuaXNTa2lubmVkTWVzaCl7TWUuc2V0T3B0aW9uYWwoVSxXLCJiaW5kTWF0cml4IiksTWUuc2V0T3B0aW9uYWwoVSxXLCJiaW5kTWF0cml4SW52ZXJzZSIpO2NvbnN0IG1uPVcuc2tlbGV0b247bW4mJihtbi5ib25lVGV4dHVyZT09PW51bGwmJm1uLmNvbXB1dGVCb25lVGV4dHVyZSgpLE1lLnNldFZhbHVlKFUsImJvbmVUZXh0dXJlIixtbi5ib25lVGV4dHVyZSxSKSl9Vy5pc0JhdGNoZWRNZXNoJiYoTWUuc2V0T3B0aW9uYWwoVSxXLCJiYXRjaGluZ1RleHR1cmUiKSxNZS5zZXRWYWx1ZShVLCJiYXRjaGluZ1RleHR1cmUiLFcuX21hdHJpY2VzVGV4dHVyZSxSKSxNZS5zZXRPcHRpb25hbChVLFcsImJhdGNoaW5nSWRUZXh0dXJlIiksTWUuc2V0VmFsdWUoVSwiYmF0Y2hpbmdJZFRleHR1cmUiLFcuX2luZGlyZWN0VGV4dHVyZSxSKSxNZS5zZXRPcHRpb25hbChVLFcsImJhdGNoaW5nQ29sb3JUZXh0dXJlIiksVy5fY29sb3JzVGV4dHVyZSE9PW51bGwmJk1lLnNldFZhbHVlKFUsImJhdGNoaW5nQ29sb3JUZXh0dXJlIixXLl9jb2xvcnNUZXh0dXJlLFIpKTtjb25zdCB0aT1ZLm1vcnBoQXR0cmlidXRlcztpZigodGkucG9zaXRpb24hPT12b2lkIDB8fHRpLm5vcm1hbCE9PXZvaWQgMHx8dGkuY29sb3IhPT12b2lkIDApJiZ6dC51cGRhdGUoVyxZLG1pKSwoVm58fFV0LnJlY2VpdmVTaGFkb3chPT1XLnJlY2VpdmVTaGFkb3cpJiYoVXQucmVjZWl2ZVNoYWRvdz1XLnJlY2VpdmVTaGFkb3csTWUuc2V0VmFsdWUoVSwicmVjZWl2ZVNoYWRvdyIsVy5yZWNlaXZlU2hhZG93KSksWi5pc01lc2hHb3VyYXVkTWF0ZXJpYWwmJlouZW52TWFwIT09bnVsbCYmKFFuLmVudk1hcC52YWx1ZT1UdCxRbi5mbGlwRW52TWFwLnZhbHVlPVR0LmlzQ3ViZVRleHR1cmUmJlR0LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT09PSExPy0xOjEpLFouaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCYmWi5lbnZNYXA9PT1udWxsJiZHLmVudmlyb25tZW50IT09bnVsbCYmKFFuLmVudk1hcEludGVuc2l0eS52YWx1ZT1HLmVudmlyb25tZW50SW50ZW5zaXR5KSxWbiYmKE1lLnNldFZhbHVlKFUsInRvbmVNYXBwaW5nRXhwb3N1cmUiLF8udG9uZU1hcHBpbmdFeHBvc3VyZSksVXQubmVlZHNMaWdodHMmJlhQKFFuLG5jKSxjdCYmWi5mb2c9PT0hMCYmcnQucmVmcmVzaEZvZ1VuaWZvcm1zKFFuLGN0KSxydC5yZWZyZXNoTWF0ZXJpYWxVbmlmb3JtcyhRbixaLHosSCxtLnN0YXRlLnRyYW5zbWlzc2lvblJlbmRlclRhcmdldFtQLmlkXSksZ3UudXBsb2FkKFUsdnYoVXQpLFFuLFIpKSxaLmlzU2hhZGVyTWF0ZXJpYWwmJloudW5pZm9ybXNOZWVkVXBkYXRlPT09ITAmJihndS51cGxvYWQoVSx2dihVdCksUW4sUiksWi51bmlmb3Jtc05lZWRVcGRhdGU9ITEpLFouaXNTcHJpdGVNYXRlcmlhbCYmTWUuc2V0VmFsdWUoVSwiY2VudGVyIixXLmNlbnRlciksTWUuc2V0VmFsdWUoVSwibW9kZWxWaWV3TWF0cml4IixXLm1vZGVsVmlld01hdHJpeCksTWUuc2V0VmFsdWUoVSwibm9ybWFsTWF0cml4IixXLm5vcm1hbE1hdHJpeCksTWUuc2V0VmFsdWUoVSwibW9kZWxNYXRyaXgiLFcubWF0cml4V29ybGQpLFouaXNTaGFkZXJNYXRlcmlhbHx8Wi5pc1Jhd1NoYWRlck1hdGVyaWFsKXtjb25zdCBtbj1aLnVuaWZvcm1zR3JvdXBzO2ZvcihsZXQgQ249MCxpbT1tbi5sZW5ndGg7Q248aW07Q24rKyl7Y29uc3QgdnM9bW5bQ25dO2sudXBkYXRlKHZzLG1pKSxrLmJpbmQodnMsbWkpfX1yZXR1cm4gbWl9ZnVuY3Rpb24gWFAoUCxHKXtQLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlPUcsUC5saWdodFByb2JlLm5lZWRzVXBkYXRlPUcsUC5kaXJlY3Rpb25hbExpZ2h0cy5uZWVkc1VwZGF0ZT1HLFAuZGlyZWN0aW9uYWxMaWdodFNoYWRvd3MubmVlZHNVcGRhdGU9RyxQLnBvaW50TGlnaHRzLm5lZWRzVXBkYXRlPUcsUC5wb2ludExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZT1HLFAuc3BvdExpZ2h0cy5uZWVkc1VwZGF0ZT1HLFAuc3BvdExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZT1HLFAucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGU9RyxQLmhlbWlzcGhlcmVMaWdodHMubmVlZHNVcGRhdGU9R31mdW5jdGlvbiAkUChQKXtyZXR1cm4gUC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWx8fFAuaXNNZXNoVG9vbk1hdGVyaWFsfHxQLmlzTWVzaFBob25nTWF0ZXJpYWx8fFAuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8UC5pc1NoYWRvd01hdGVyaWFsfHxQLmlzU2hhZGVyTWF0ZXJpYWwmJlAubGlnaHRzPT09ITB9dGhpcy5nZXRBY3RpdmVDdWJlRmFjZT1mdW5jdGlvbigpe3JldHVybiB3fSx0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIEF9LHRoaXMuZ2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFR9LHRoaXMuc2V0UmVuZGVyVGFyZ2V0VGV4dHVyZXM9ZnVuY3Rpb24oUCxHLFkpe2NvbnN0IFo9WC5nZXQoUCk7Wi5fX2F1dG9BbGxvY2F0ZURlcHRoQnVmZmVyPVAucmVzb2x2ZURlcHRoQnVmZmVyPT09ITEsWi5fX2F1dG9BbGxvY2F0ZURlcHRoQnVmZmVyPT09ITEmJihaLl9fdXNlUmVuZGVyVG9UZXh0dXJlPSExKSxYLmdldChQLnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlPUcsWC5nZXQoUC5kZXB0aFRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlPVouX19hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlcj92b2lkIDA6WSxaLl9faGFzRXh0ZXJuYWxUZXh0dXJlcz0hMH0sdGhpcy5zZXRSZW5kZXJUYXJnZXRGcmFtZWJ1ZmZlcj1mdW5jdGlvbihQLEcpe2NvbnN0IFk9WC5nZXQoUCk7WS5fX3dlYmdsRnJhbWVidWZmZXI9RyxZLl9fdXNlRGVmYXVsdEZyYW1lYnVmZmVyPUc9PT12b2lkIDB9O2NvbnN0IHFQPVUuY3JlYXRlRnJhbWVidWZmZXIoKTt0aGlzLnNldFJlbmRlclRhcmdldD1mdW5jdGlvbihQLEc9MCxZPTApe1Q9UCx3PUcsQT1ZO2xldCBaPSEwLFc9bnVsbCxjdD0hMSxndD0hMTtpZihQKXtjb25zdCBUdD1YLmdldChQKTtpZihUdC5fX3VzZURlZmF1bHRGcmFtZWJ1ZmZlciE9PXZvaWQgMCl0dC5iaW5kRnJhbWVidWZmZXIoVS5GUkFNRUJVRkZFUixudWxsKSxaPSExO2Vsc2UgaWYoVHQuX193ZWJnbEZyYW1lYnVmZmVyPT09dm9pZCAwKVIuc2V0dXBSZW5kZXJUYXJnZXQoUCk7ZWxzZSBpZihUdC5fX2hhc0V4dGVybmFsVGV4dHVyZXMpUi5yZWJpbmRUZXh0dXJlcyhQLFguZ2V0KFAudGV4dHVyZSkuX193ZWJnbFRleHR1cmUsWC5nZXQoUC5kZXB0aFRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlKTtlbHNlIGlmKFAuZGVwdGhCdWZmZXIpe2NvbnN0IER0PVAuZGVwdGhUZXh0dXJlO2lmKFR0Ll9fYm91bmREZXB0aFRleHR1cmUhPT1EdCl7aWYoRHQhPT1udWxsJiZYLmhhcyhEdCkmJihQLndpZHRoIT09RHQuaW1hZ2Uud2lkdGh8fFAuaGVpZ2h0IT09RHQuaW1hZ2UuaGVpZ2h0KSl0aHJvdyBuZXcgRXJyb3IoIldlYkdMUmVuZGVyVGFyZ2V0OiBBdHRhY2hlZCBEZXB0aFRleHR1cmUgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIGluY29ycmVjdCBzaXplLiIpO1Iuc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlcihQKX19Y29uc3QgR3Q9UC50ZXh0dXJlOyhHdC5pc0RhdGEzRFRleHR1cmV8fEd0LmlzRGF0YUFycmF5VGV4dHVyZXx8R3QuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlKSYmKGd0PSEwKTtjb25zdCBWdD1YLmdldChQKS5fX3dlYmdsRnJhbWVidWZmZXI7UC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldD8oQXJyYXkuaXNBcnJheShWdFtHXSk/Vz1WdFtHXVtZXTpXPVZ0W0ddLGN0PSEwKTpQLnNhbXBsZXM+MCYmUi51c2VNdWx0aXNhbXBsZWRSVFQoUCk9PT0hMT9XPVguZ2V0KFApLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcjpBcnJheS5pc0FycmF5KFZ0KT9XPVZ0W1ldOlc9VnQsRS5jb3B5KFAudmlld3BvcnQpLEQuY29weShQLnNjaXNzb3IpLEw9UC5zY2lzc29yVGVzdH1lbHNlIEUuY29weShmdCkubXVsdGlwbHlTY2FsYXIoeikuZmxvb3IoKSxELmNvcHkoUnQpLm11bHRpcGx5U2NhbGFyKHopLmZsb29yKCksTD1GdDtpZihZIT09MCYmKFc9cVApLHR0LmJpbmRGcmFtZWJ1ZmZlcihVLkZSQU1FQlVGRkVSLFcpJiZaJiZ0dC5kcmF3QnVmZmVycyhQLFcpLHR0LnZpZXdwb3J0KEUpLHR0LnNjaXNzb3IoRCksdHQuc2V0U2Npc3NvclRlc3QoTCksY3Qpe2NvbnN0IFR0PVguZ2V0KFAudGV4dHVyZSk7VS5mcmFtZWJ1ZmZlclRleHR1cmUyRChVLkZSQU1FQlVGRkVSLFUuQ09MT1JfQVRUQUNITUVOVDAsVS5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1grRyxUdC5fX3dlYmdsVGV4dHVyZSxZKX1lbHNlIGlmKGd0KXtjb25zdCBUdD1YLmdldChQLnRleHR1cmUpLEd0PUc7VS5mcmFtZWJ1ZmZlclRleHR1cmVMYXllcihVLkZSQU1FQlVGRkVSLFUuQ09MT1JfQVRUQUNITUVOVDAsVHQuX193ZWJnbFRleHR1cmUsWSxHdCl9ZWxzZSBpZihQIT09bnVsbCYmWSE9PTApe2NvbnN0IFR0PVguZ2V0KFAudGV4dHVyZSk7VS5mcmFtZWJ1ZmZlclRleHR1cmUyRChVLkZSQU1FQlVGRkVSLFUuQ09MT1JfQVRUQUNITUVOVDAsVS5URVhUVVJFXzJELFR0Ll9fd2ViZ2xUZXh0dXJlLFkpfWI9LTF9LHRoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscz1mdW5jdGlvbihQLEcsWSxaLFcsY3QsZ3Qpe2lmKCEoUCYmUC5pc1dlYkdMUmVuZGVyVGFyZ2V0KSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LiIpO3JldHVybn1sZXQgd3Q9WC5nZXQoUCkuX193ZWJnbEZyYW1lYnVmZmVyO2lmKFAuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQmJmd0IT09dm9pZCAwJiYod3Q9d3RbZ3RdKSx3dCl7dHQuYmluZEZyYW1lYnVmZmVyKFUuRlJBTUVCVUZGRVIsd3QpO3RyeXtjb25zdCBUdD1QLnRleHR1cmUsR3Q9VHQuZm9ybWF0LFZ0PVR0LnR5cGU7aWYoIWF0LnRleHR1cmVGb3JtYXRSZWFkYWJsZShHdCkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LiIpO3JldHVybn1pZighYXQudGV4dHVyZVR5cGVSZWFkYWJsZShWdCkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4iKTtyZXR1cm59Rz49MCYmRzw9UC53aWR0aC1aJiZZPj0wJiZZPD1QLmhlaWdodC1XJiZVLnJlYWRQaXhlbHMoRyxZLFosVyxadC5jb252ZXJ0KEd0KSxadC5jb252ZXJ0KFZ0KSxjdCl9ZmluYWxseXtjb25zdCBUdD1UIT09bnVsbD9YLmdldChUKS5fX3dlYmdsRnJhbWVidWZmZXI6bnVsbDt0dC5iaW5kRnJhbWVidWZmZXIoVS5GUkFNRUJVRkZFUixUdCl9fX0sdGhpcy5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzQXN5bmM9ZnVuY3Rpb24oUCxHLFksWixXLGN0LGd0KXtyZXR1cm4gTXModGhpcyxudWxsLGZ1bmN0aW9uKigpe2lmKCEoUCYmUC5pc1dlYkdMUmVuZGVyVGFyZ2V0KSl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBUSFJFRS5XZWJHTFJlbmRlclRhcmdldC4iKTtsZXQgd3Q9WC5nZXQoUCkuX193ZWJnbEZyYW1lYnVmZmVyO2lmKFAuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQmJmd0IT09dm9pZCAwJiYod3Q9d3RbZ3RdKSx3dClpZihHPj0wJiZHPD1QLndpZHRoLVomJlk+PTAmJlk8PVAuaGVpZ2h0LVcpe3R0LmJpbmRGcmFtZWJ1ZmZlcihVLkZSQU1FQlVGRkVSLHd0KTtjb25zdCBUdD1QLnRleHR1cmUsR3Q9VHQuZm9ybWF0LFZ0PVR0LnR5cGU7aWYoIWF0LnRleHR1cmVGb3JtYXRSZWFkYWJsZShHdCkpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHNBc3luYzogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LiIpO2lmKCFhdC50ZXh0dXJlVHlwZVJlYWRhYmxlKFZ0KSl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsc0FzeW5jOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFVuc2lnbmVkQnl0ZVR5cGUgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlLiIpO2NvbnN0IER0PVUuY3JlYXRlQnVmZmVyKCk7VS5iaW5kQnVmZmVyKFUuUElYRUxfUEFDS19CVUZGRVIsRHQpLFUuYnVmZmVyRGF0YShVLlBJWEVMX1BBQ0tfQlVGRkVSLGN0LmJ5dGVMZW5ndGgsVS5TVFJFQU1fUkVBRCksVS5yZWFkUGl4ZWxzKEcsWSxaLFcsWnQuY29udmVydChHdCksWnQuY29udmVydChWdCksMCk7Y29uc3QgYWU9VCE9PW51bGw/WC5nZXQoVCkuX193ZWJnbEZyYW1lYnVmZmVyOm51bGw7dHQuYmluZEZyYW1lYnVmZmVyKFUuRlJBTUVCVUZGRVIsYWUpO2NvbnN0IGhlPVUuZmVuY2VTeW5jKFUuU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUsMCk7cmV0dXJuIFUuZmx1c2goKSx5aWVsZCBDTShVLGhlLDQpLFUuYmluZEJ1ZmZlcihVLlBJWEVMX1BBQ0tfQlVGRkVSLER0KSxVLmdldEJ1ZmZlclN1YkRhdGEoVS5QSVhFTF9QQUNLX0JVRkZFUiwwLGN0KSxVLmRlbGV0ZUJ1ZmZlcihEdCksVS5kZWxldGVTeW5jKGhlKSxjdH1lbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzQXN5bmM6IHJlcXVlc3RlZCByZWFkIGJvdW5kcyBhcmUgb3V0IG9mIHJhbmdlLiIpfSl9LHRoaXMuY29weUZyYW1lYnVmZmVyVG9UZXh0dXJlPWZ1bmN0aW9uKFAsRz1udWxsLFk9MCl7Y29uc3QgWj1NYXRoLnBvdygyLC1ZKSxXPU1hdGguZmxvb3IoUC5pbWFnZS53aWR0aCpaKSxjdD1NYXRoLmZsb29yKFAuaW1hZ2UuaGVpZ2h0KlopLGd0PUchPT1udWxsP0cueDowLHd0PUchPT1udWxsP0cueTowO1Iuc2V0VGV4dHVyZTJEKFAsMCksVS5jb3B5VGV4U3ViSW1hZ2UyRChVLlRFWFRVUkVfMkQsWSwwLDAsZ3Qsd3QsVyxjdCksdHQudW5iaW5kVGV4dHVyZSgpfTtjb25zdCBZUD1VLmNyZWF0ZUZyYW1lYnVmZmVyKCksWlA9VS5jcmVhdGVGcmFtZWJ1ZmZlcigpO3RoaXMuY29weVRleHR1cmVUb1RleHR1cmU9ZnVuY3Rpb24oUCxHLFk9bnVsbCxaPW51bGwsVz0wLGN0PW51bGwpe2N0PT09bnVsbCYmKFchPT0wPyhZYygiV2ViR0xSZW5kZXJlcjogY29weVRleHR1cmVUb1RleHR1cmUgZnVuY3Rpb24gc2lnbmF0dXJlIGhhcyBjaGFuZ2VkIHRvIHN1cHBvcnQgc3JjIGFuZCBkc3QgbWlwbWFwIGxldmVscy4iKSxjdD1XLFc9MCk6Y3Q9MCk7bGV0IGd0LHd0LFR0LEd0LFZ0LER0LGFlLGhlLE9lO2NvbnN0IFBlPVAuaXNDb21wcmVzc2VkVGV4dHVyZT9QLm1pcG1hcHNbY3RdOlAuaW1hZ2U7aWYoWSE9PW51bGwpZ3Q9WS5tYXgueC1ZLm1pbi54LHd0PVkubWF4LnktWS5taW4ueSxUdD1ZLmlzQm94Mz9ZLm1heC56LVkubWluLno6MSxHdD1ZLm1pbi54LFZ0PVkubWluLnksRHQ9WS5pc0JveDM/WS5taW4uejowO2Vsc2V7Y29uc3QgdGk9TWF0aC5wb3coMiwtVyk7Z3Q9TWF0aC5mbG9vcihQZS53aWR0aCp0aSksd3Q9TWF0aC5mbG9vcihQZS5oZWlnaHQqdGkpLFAuaXNEYXRhQXJyYXlUZXh0dXJlP1R0PVBlLmRlcHRoOlAuaXNEYXRhM0RUZXh0dXJlP1R0PU1hdGguZmxvb3IoUGUuZGVwdGgqdGkpOlR0PTEsR3Q9MCxWdD0wLER0PTB9WiE9PW51bGw/KGFlPVoueCxoZT1aLnksT2U9Wi56KTooYWU9MCxoZT0wLE9lPTApO2NvbnN0IGNlPVp0LmNvbnZlcnQoRy5mb3JtYXQpLFV0PVp0LmNvbnZlcnQoRy50eXBlKTtsZXQgcWU7Ry5pc0RhdGEzRFRleHR1cmU/KFIuc2V0VGV4dHVyZTNEKEcsMCkscWU9VS5URVhUVVJFXzNEKTpHLmlzRGF0YUFycmF5VGV4dHVyZXx8Ry5pc0NvbXByZXNzZWRBcnJheVRleHR1cmU/KFIuc2V0VGV4dHVyZTJEQXJyYXkoRywwKSxxZT1VLlRFWFRVUkVfMkRfQVJSQVkpOihSLnNldFRleHR1cmUyRChHLDApLHFlPVUuVEVYVFVSRV8yRCksVS5waXhlbFN0b3JlaShVLlVOUEFDS19GTElQX1lfV0VCR0wsRy5mbGlwWSksVS5waXhlbFN0b3JlaShVLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCxHLnByZW11bHRpcGx5QWxwaGEpLFUucGl4ZWxTdG9yZWkoVS5VTlBBQ0tfQUxJR05NRU5ULEcudW5wYWNrQWxpZ25tZW50KTtjb25zdCBmZT1VLmdldFBhcmFtZXRlcihVLlVOUEFDS19ST1dfTEVOR1RIKSxtaT1VLmdldFBhcmFtZXRlcihVLlVOUEFDS19JTUFHRV9IRUlHSFQpLEVvPVUuZ2V0UGFyYW1ldGVyKFUuVU5QQUNLX1NLSVBfUElYRUxTKSxWbj1VLmdldFBhcmFtZXRlcihVLlVOUEFDS19TS0lQX1JPV1MpLG5jPVUuZ2V0UGFyYW1ldGVyKFUuVU5QQUNLX1NLSVBfSU1BR0VTKTtVLnBpeGVsU3RvcmVpKFUuVU5QQUNLX1JPV19MRU5HVEgsUGUud2lkdGgpLFUucGl4ZWxTdG9yZWkoVS5VTlBBQ0tfSU1BR0VfSEVJR0hULFBlLmhlaWdodCksVS5waXhlbFN0b3JlaShVLlVOUEFDS19TS0lQX1BJWEVMUyxHdCksVS5waXhlbFN0b3JlaShVLlVOUEFDS19TS0lQX1JPV1MsVnQpLFUucGl4ZWxTdG9yZWkoVS5VTlBBQ0tfU0tJUF9JTUFHRVMsRHQpO2NvbnN0IE1lPVAuaXNEYXRhQXJyYXlUZXh0dXJlfHxQLmlzRGF0YTNEVGV4dHVyZSxRbj1HLmlzRGF0YUFycmF5VGV4dHVyZXx8Ry5pc0RhdGEzRFRleHR1cmU7aWYoUC5pc0RlcHRoVGV4dHVyZSl7Y29uc3QgdGk9WC5nZXQoUCksbW49WC5nZXQoRyksQ249WC5nZXQodGkuX19yZW5kZXJUYXJnZXQpLGltPVguZ2V0KG1uLl9fcmVuZGVyVGFyZ2V0KTt0dC5iaW5kRnJhbWVidWZmZXIoVS5SRUFEX0ZSQU1FQlVGRkVSLENuLl9fd2ViZ2xGcmFtZWJ1ZmZlciksdHQuYmluZEZyYW1lYnVmZmVyKFUuRFJBV19GUkFNRUJVRkZFUixpbS5fX3dlYmdsRnJhbWVidWZmZXIpO2ZvcihsZXQgdnM9MDt2czxUdDt2cysrKU1lJiYoVS5mcmFtZWJ1ZmZlclRleHR1cmVMYXllcihVLlJFQURfRlJBTUVCVUZGRVIsVS5DT0xPUl9BVFRBQ0hNRU5UMCxYLmdldChQKS5fX3dlYmdsVGV4dHVyZSxXLER0K3ZzKSxVLmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKFUuRFJBV19GUkFNRUJVRkZFUixVLkNPTE9SX0FUVEFDSE1FTlQwLFguZ2V0KEcpLl9fd2ViZ2xUZXh0dXJlLGN0LE9lK3ZzKSksVS5ibGl0RnJhbWVidWZmZXIoR3QsVnQsZ3Qsd3QsYWUsaGUsZ3Qsd3QsVS5ERVBUSF9CVUZGRVJfQklULFUuTkVBUkVTVCk7dHQuYmluZEZyYW1lYnVmZmVyKFUuUkVBRF9GUkFNRUJVRkZFUixudWxsKSx0dC5iaW5kRnJhbWVidWZmZXIoVS5EUkFXX0ZSQU1FQlVGRkVSLG51bGwpfWVsc2UgaWYoVyE9PTB8fFAuaXNSZW5kZXJUYXJnZXRUZXh0dXJlfHxYLmhhcyhQKSl7Y29uc3QgdGk9WC5nZXQoUCksbW49WC5nZXQoRyk7dHQuYmluZEZyYW1lYnVmZmVyKFUuUkVBRF9GUkFNRUJVRkZFUixZUCksdHQuYmluZEZyYW1lYnVmZmVyKFUuRFJBV19GUkFNRUJVRkZFUixaUCk7Zm9yKGxldCBDbj0wO0NuPFR0O0NuKyspTWU/VS5mcmFtZWJ1ZmZlclRleHR1cmVMYXllcihVLlJFQURfRlJBTUVCVUZGRVIsVS5DT0xPUl9BVFRBQ0hNRU5UMCx0aS5fX3dlYmdsVGV4dHVyZSxXLER0K0NuKTpVLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFUuUkVBRF9GUkFNRUJVRkZFUixVLkNPTE9SX0FUVEFDSE1FTlQwLFUuVEVYVFVSRV8yRCx0aS5fX3dlYmdsVGV4dHVyZSxXKSxRbj9VLmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKFUuRFJBV19GUkFNRUJVRkZFUixVLkNPTE9SX0FUVEFDSE1FTlQwLG1uLl9fd2ViZ2xUZXh0dXJlLGN0LE9lK0NuKTpVLmZyYW1lYnVmZmVyVGV4dHVyZTJEKFUuRFJBV19GUkFNRUJVRkZFUixVLkNPTE9SX0FUVEFDSE1FTlQwLFUuVEVYVFVSRV8yRCxtbi5fX3dlYmdsVGV4dHVyZSxjdCksVyE9PTA/VS5ibGl0RnJhbWVidWZmZXIoR3QsVnQsZ3Qsd3QsYWUsaGUsZ3Qsd3QsVS5DT0xPUl9CVUZGRVJfQklULFUuTkVBUkVTVCk6UW4/VS5jb3B5VGV4U3ViSW1hZ2UzRChxZSxjdCxhZSxoZSxPZStDbixHdCxWdCxndCx3dCk6VS5jb3B5VGV4U3ViSW1hZ2UyRChxZSxjdCxhZSxoZSxHdCxWdCxndCx3dCk7dHQuYmluZEZyYW1lYnVmZmVyKFUuUkVBRF9GUkFNRUJVRkZFUixudWxsKSx0dC5iaW5kRnJhbWVidWZmZXIoVS5EUkFXX0ZSQU1FQlVGRkVSLG51bGwpfWVsc2UgUW4/UC5pc0RhdGFUZXh0dXJlfHxQLmlzRGF0YTNEVGV4dHVyZT9VLnRleFN1YkltYWdlM0QocWUsY3QsYWUsaGUsT2UsZ3Qsd3QsVHQsY2UsVXQsUGUuZGF0YSk6Ry5pc0NvbXByZXNzZWRBcnJheVRleHR1cmU/VS5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRChxZSxjdCxhZSxoZSxPZSxndCx3dCxUdCxjZSxQZS5kYXRhKTpVLnRleFN1YkltYWdlM0QocWUsY3QsYWUsaGUsT2UsZ3Qsd3QsVHQsY2UsVXQsUGUpOlAuaXNEYXRhVGV4dHVyZT9VLnRleFN1YkltYWdlMkQoVS5URVhUVVJFXzJELGN0LGFlLGhlLGd0LHd0LGNlLFV0LFBlLmRhdGEpOlAuaXNDb21wcmVzc2VkVGV4dHVyZT9VLmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKFUuVEVYVFVSRV8yRCxjdCxhZSxoZSxQZS53aWR0aCxQZS5oZWlnaHQsY2UsUGUuZGF0YSk6VS50ZXhTdWJJbWFnZTJEKFUuVEVYVFVSRV8yRCxjdCxhZSxoZSxndCx3dCxjZSxVdCxQZSk7VS5waXhlbFN0b3JlaShVLlVOUEFDS19ST1dfTEVOR1RILGZlKSxVLnBpeGVsU3RvcmVpKFUuVU5QQUNLX0lNQUdFX0hFSUdIVCxtaSksVS5waXhlbFN0b3JlaShVLlVOUEFDS19TS0lQX1BJWEVMUyxFbyksVS5waXhlbFN0b3JlaShVLlVOUEFDS19TS0lQX1JPV1MsVm4pLFUucGl4ZWxTdG9yZWkoVS5VTlBBQ0tfU0tJUF9JTUFHRVMsbmMpLGN0PT09MCYmRy5nZW5lcmF0ZU1pcG1hcHMmJlUuZ2VuZXJhdGVNaXBtYXAocWUpLHR0LnVuYmluZFRleHR1cmUoKX0sdGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZTNEPWZ1bmN0aW9uKFAsRyxZPW51bGwsWj1udWxsLFc9MCl7cmV0dXJuIFljKCdXZWJHTFJlbmRlcmVyOiBjb3B5VGV4dHVyZVRvVGV4dHVyZTNEIGZ1bmN0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAiY29weVRleHR1cmVUb1RleHR1cmUiIGluc3RlYWQuJyksdGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZShQLEcsWSxaLFcpfSx0aGlzLmluaXRSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oUCl7WC5nZXQoUCkuX193ZWJnbEZyYW1lYnVmZmVyPT09dm9pZCAwJiZSLnNldHVwUmVuZGVyVGFyZ2V0KFApfSx0aGlzLmluaXRUZXh0dXJlPWZ1bmN0aW9uKFApe1AuaXNDdWJlVGV4dHVyZT9SLnNldFRleHR1cmVDdWJlKFAsMCk6UC5pc0RhdGEzRFRleHR1cmU/Ui5zZXRUZXh0dXJlM0QoUCwwKTpQLmlzRGF0YUFycmF5VGV4dHVyZXx8UC5pc0NvbXByZXNzZWRBcnJheVRleHR1cmU/Ui5zZXRUZXh0dXJlMkRBcnJheShQLDApOlIuc2V0VGV4dHVyZTJEKFAsMCksdHQudW5iaW5kVGV4dHVyZSgpfSx0aGlzLnJlc2V0U3RhdGU9ZnVuY3Rpb24oKXt3PTAsQT0wLFQ9bnVsbCx0dC5yZXNldCgpLHBlLnJlc2V0KCl9LHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18hPSJ1bmRlZmluZWQiJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1nZXQgY29vcmRpbmF0ZVN5c3RlbSgpe3JldHVybiBIbn1nZXQgb3V0cHV0Q29sb3JTcGFjZSgpe3JldHVybiB0aGlzLl9vdXRwdXRDb2xvclNwYWNlfXNldCBvdXRwdXRDb2xvclNwYWNlKHQpe3RoaXMuX291dHB1dENvbG9yU3BhY2U9dDtjb25zdCBlPXRoaXMuZ2V0Q29udGV4dCgpO2UuZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U9bmUuX2dldERyYXdpbmdCdWZmZXJDb2xvclNwYWNlKHQpLGUudW5wYWNrQ29sb3JTcGFjZT1uZS5fZ2V0VW5wYWNrQ29sb3JTcGFjZSgpfX12YXIgaEU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQUNFU0ZpbG1pY1RvbmVNYXBwaW5nOkNtLEFkZEVxdWF0aW9uOnJyLEFkZE9wZXJhdGlvbjp3bSxBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZTpRaCxBZGRpdGl2ZUJsZW5kaW5nOlZoLEFnWFRvbmVNYXBwaW5nOkltLEFscGhhRm9ybWF0OlpoLEFsd2F5c0NvbXBhcmU6WG0sQWx3YXlzRGVwdGg6b2MsQWx3YXlzU3RlbmNpbEZ1bmM6dGYsQW1iaWVudExpZ2h0OkQwLEFuaW1hdGlvbkFjdGlvbjpKMCxBbmltYXRpb25DbGlwOlNhLEFuaW1hdGlvbkxvYWRlcjppYixBbmltYXRpb25NaXhlcjpMYixBbmltYXRpb25PYmplY3RHcm91cDpJYixBbmltYXRpb25VdGlsczpRUyxBcmNDdXJ2ZTpZZyxBcnJheUNhbWVyYTpIMCxBcnJvd0hlbHBlcjplMSxBdHRhY2hlZEJpbmRNb2RlOldoLEF1ZGlvOnEwLEF1ZGlvQW5hbHlzZXI6dmIsQXVkaW9Db250ZXh0OmFkLEF1ZGlvTGlzdGVuZXI6eGIsQXVkaW9Mb2FkZXI6cGIsQXhlc0hlbHBlcjpuMSxCYWNrU2lkZTpZZSxCYXNpY0RlcHRoUGFja2luZzpGbSxCYXNpY1NoYWRvd01hcDpDcixCYXRjaGVkTWVzaDpCZyxCb25lOklmLEJvb2xlYW5LZXlmcmFtZVRyYWNrOnFyLEJveDI6R2IsQm94MzpsZSxCb3gzSGVscGVyOlFiLEJveEdlb21ldHJ5OnpyLEJveEhlbHBlcjpqYixCdWZmZXJBdHRyaWJ1dGU6SnQsQnVmZmVyR2VvbWV0cnk6TnQsQnVmZmVyR2VvbWV0cnlMb2FkZXI6TzAsQnl0ZVR5cGU6JGgsQ2FjaGU6R2ksQ2FtZXJhOnBsLENhbWVyYUhlbHBlcjpLYixDYW52YXNUZXh0dXJlOk1TLENhcHN1bGVHZW9tZXRyeTpPbCxDYXRtdWxsUm9tQ3VydmUzOlpnLENpbmVvblRvbmVNYXBwaW5nOkVtLENpcmNsZUdlb21ldHJ5OnpsLENsYW1wVG9FZGdlV3JhcHBpbmc6R24sQ2xvY2s6VzAsQ29sb3I6eXQsQ29sb3JLZXlmcmFtZVRyYWNrOmVkLENvbG9yTWFuYWdlbWVudDpuZSxDb21wcmVzc2VkQXJyYXlUZXh0dXJlOnlTLENvbXByZXNzZWRDdWJlVGV4dHVyZTp2UyxDb21wcmVzc2VkVGV4dHVyZTpGbCxDb21wcmVzc2VkVGV4dHVyZUxvYWRlcjpyYixDb25lR2VvbWV0cnk6bGEsQ29uc3RhbnRBbHBoYUZhY3RvcjpNbSxDb25zdGFudENvbG9yRmFjdG9yOnltLENvbnRyb2xzOnIxLEN1YmVDYW1lcmE6Z2csQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOlBpLEN1YmVSZWZyYWN0aW9uTWFwcGluZzpzcixDdWJlVGV4dHVyZTp0YSxDdWJlVGV4dHVyZUxvYWRlcjpzYixDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzpicyxDdWJpY0JlemllckN1cnZlOkdmLEN1YmljQmV6aWVyQ3VydmUzOktnLEN1YmljSW50ZXJwb2xhbnQ6UzAsQ3VsbEZhY2VCYWNrOlJuLEN1bGxGYWNlRnJvbnQ6SW4sQ3VsbEZhY2VGcm9udEJhY2s6Q2ksQ3VsbEZhY2VOb25lOk5lLEN1cnZlOmNpLEN1cnZlUGF0aDpRZyxDdXN0b21CbGVuZGluZzpzbSxDdXN0b21Ub25lTWFwcGluZzpSbSxDeWxpbmRlckdlb21ldHJ5OmNhLEN5bGluZHJpY2FsOlZiLERhdGEzRFRleHR1cmU6SmMsRGF0YUFycmF5VGV4dHVyZTpZbyxEYXRhVGV4dHVyZTpNaSxEYXRhVGV4dHVyZUxvYWRlcjpvYixEYXRhVXRpbHM6WE0sRGVjcmVtZW50U3RlbmNpbE9wOlZ2LERlY3JlbWVudFdyYXBTdGVuY2lsT3A6SHYsRGVmYXVsdExvYWRpbmdNYW5hZ2VyOkEwLERlcHRoQXJyYXlUZXh0dXJlOlNTLERlcHRoRm9ybWF0OkNzLERlcHRoU3RlbmNpbEZvcm1hdDpScyxEZXB0aFRleHR1cmU6QmwsRGV0YWNoZWRCaW5kTW9kZTpMbSxEaXJlY3Rpb25hbExpZ2h0OkwwLERpcmVjdGlvbmFsTGlnaHRIZWxwZXI6SmIsRGlzY3JldGVJbnRlcnBvbGFudDpiMCxEb2RlY2FoZWRyb25HZW9tZXRyeTprbCxEb3VibGVTaWRlOlBuLERzdEFscGhhRmFjdG9yOnBtLERzdENvbG9yRmFjdG9yOmdtLER5bmFtaWNDb3B5VXNhZ2U6ck0sRHluYW1pY0RyYXdVc2FnZTpqdixEeW5hbWljUmVhZFVzYWdlOmVNLEVkZ2VzR2VvbWV0cnk6cWcsRWxsaXBzZUN1cnZlOldsLEVxdWFsQ29tcGFyZTpWbSxFcXVhbERlcHRoOmNjLEVxdWFsU3RlbmNpbEZ1bmM6cXYsRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6SW8sRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6UG8sRXVsZXI6VW4sRXZlbnREaXNwYXRjaGVyOnlpLEV4dHJ1ZGVHZW9tZXRyeTphMCxGaWxlTG9hZGVyOldpLEZsb2F0MTZCdWZmZXJBdHRyaWJ1dGU6ak0sRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTp2dCxGbG9hdFR5cGU6eG4sRm9nOnhsLEZvZ0V4cDI6Z2wsRnJhbWVidWZmZXJUZXh0dXJlOl9TLEZyb250U2lkZTplaSxGcnVzdHVtOlFzLEZydXN0dW1BcnJheTpFbCxHTEJ1ZmZlckF0dHJpYnV0ZTpPYixHTFNMMTpvTSxHTFNMMzpuZixHcmVhdGVyQ29tcGFyZTpHbSxHcmVhdGVyRGVwdGg6dWMsR3JlYXRlckVxdWFsQ29tcGFyZTpXbSxHcmVhdGVyRXF1YWxEZXB0aDpsYyxHcmVhdGVyRXF1YWxTdGVuY2lsRnVuYzpLdixHcmVhdGVyU3RlbmNpbEZ1bmM6WnYsR3JpZEhlbHBlcjpZYixHcm91cDokcyxIYWxmRmxvYXRUeXBlOlRzLEhlbWlzcGhlcmVMaWdodDpUMCxIZW1pc3BoZXJlTGlnaHRIZWxwZXI6cWIsSWNvc2FoZWRyb25HZW9tZXRyeTpKbCxJbWFnZUJpdG1hcExvYWRlcjpkYixJbWFnZUxvYWRlcjpiYSxJbWFnZVV0aWxzOmptLEluY3JlbWVudFN0ZW5jaWxPcDprdixJbmNyZW1lbnRXcmFwU3RlbmNpbE9wOkd2LEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTpLcyxJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeTpCMCxJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcjpCYixJbnN0YW5jZWRNZXNoOlVnLEludDE2QnVmZmVyQXR0cmlidXRlOkpNLEludDMyQnVmZmVyQXR0cmlidXRlOktNLEludDhCdWZmZXJBdHRyaWJ1dGU6cU0sSW50VHlwZTpkYyxJbnRlcmxlYXZlZEJ1ZmZlcjpfbCxJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZTprcixJbnRlcnBvbGFudDpfYSxJbnRlcnBvbGF0ZURpc2NyZXRlOlZvLEludGVycG9sYXRlTGluZWFyOlhjLEludGVycG9sYXRlU21vb3RoOiRjLEludGVycG9sYXRpb25TYW1wbGluZ01vZGU6bE0sSW50ZXJwb2xhdGlvblNhbXBsaW5nVHlwZTpjTSxJbnZlcnRTdGVuY2lsT3A6V3YsS2VlcFN0ZW5jaWxPcDpVcixLZXlmcmFtZVRyYWNrOlhuLExPRDp3ZyxMYXRoZUdlb21ldHJ5OktsLExheWVyczppbCxMZXNzQ29tcGFyZTprbSxMZXNzRGVwdGg6YWMsTGVzc0VxdWFsQ29tcGFyZTplZixMZXNzRXF1YWxEZXB0aDpJcixMZXNzRXF1YWxTdGVuY2lsRnVuYzpZdixMZXNzU3RlbmNpbEZ1bmM6JHYsTGlnaHQ6X3IsTGlnaHRQcm9iZTpGMCxMaW5lOmdyLExpbmUzOkZuLExpbmVCYXNpY01hdGVyaWFsOmFuLExpbmVDdXJ2ZTpIZixMaW5lQ3VydmUzOmpnLExpbmVEYXNoZWRNYXRlcmlhbDp5MCxMaW5lTG9vcDpHZyxMaW5lU2VnbWVudHM6d2ksTGluZWFyRmlsdGVyOnplLExpbmVhckludGVycG9sYW50OnRkLExpbmVhck1pcE1hcExpbmVhckZpbHRlcjpQdixMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyOkl2LExpbmVhck1pcG1hcExpbmVhckZpbHRlcjpfaSxMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyOlVvLExpbmVhclNSR0JDb2xvclNwYWNlOkRyLExpbmVhclRvbmVNYXBwaW5nOkFtLExpbmVhclRyYW5zZmVyOkhvLExvYWRlcjpTbixMb2FkZXJVdGlsczpvZCxMb2FkaW5nTWFuYWdlcjpuZCxMb29wT25jZTpEbSxMb29wUGluZ1Bvbmc6Tm0sTG9vcFJlcGVhdDpVbSxNT1VTRTpyZSxNYXRlcmlhbDpLZSxNYXRlcmlhbExvYWRlcjpzdSxNYXRoVXRpbHM6VE0sTWF0cml4MjpmZCxNYXRyaXgzOld0LE1hdHJpeDQ6Q3QsTWF4RXF1YXRpb246bG0sTWVzaDpMZSxNZXNoQmFzaWNNYXRlcmlhbDpwcixNZXNoRGVwdGhNYXRlcmlhbDpKZixNZXNoRGlzdGFuY2VNYXRlcmlhbDpLZixNZXNoTGFtYmVydE1hdGVyaWFsOngwLE1lc2hNYXRjYXBNYXRlcmlhbDpfMCxNZXNoTm9ybWFsTWF0ZXJpYWw6ZzAsTWVzaFBob25nTWF0ZXJpYWw6cDAsTWVzaFBoeXNpY2FsTWF0ZXJpYWw6ZDAsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6WmYsTWVzaFRvb25NYXRlcmlhbDptMCxNaW5FcXVhdGlvbjpjbSxNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOkRvLE1peE9wZXJhdGlvbjpibSxNdWx0aXBseUJsZW5kaW5nOkhoLE11bHRpcGx5T3BlcmF0aW9uOlJvLE5lYXJlc3RGaWx0ZXI6WGUsTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlcjpSdixOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcjpDdixOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOndzLE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyOlhoLE5ldXRyYWxUb25lTWFwcGluZzpQbSxOZXZlckNvbXBhcmU6em0sTmV2ZXJEZXB0aDpzYyxOZXZlclN0ZW5jaWxGdW5jOlh2LE5vQmxlbmRpbmc6UmksTm9Db2xvclNwYWNlOkRpLE5vVG9uZU1hcHBpbmc6SWksTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlOnFjLE5vcm1hbEJsZW5kaW5nOlJyLE5vdEVxdWFsQ29tcGFyZTpIbSxOb3RFcXVhbERlcHRoOmhjLE5vdEVxdWFsU3RlbmNpbEZ1bmM6SnYsTnVtYmVyS2V5ZnJhbWVUcmFjazp5YSxPYmplY3QzRDpzZSxPYmplY3RMb2FkZXI6aGIsT2JqZWN0U3BhY2VOb3JtYWxNYXA6T20sT2N0YWhlZHJvbkdlb21ldHJ5OmdhLE9uZUZhY3RvcjpobSxPbmVNaW51c0NvbnN0YW50QWxwaGFGYWN0b3I6U20sT25lTWludXNDb25zdGFudENvbG9yRmFjdG9yOnZtLE9uZU1pbnVzRHN0QWxwaGFGYWN0b3I6bW0sT25lTWludXNEc3RDb2xvckZhY3Rvcjp4bSxPbmVNaW51c1NyY0FscGhhRmFjdG9yOnJjLE9uZU1pbnVzU3JjQ29sb3JGYWN0b3I6ZG0sT3J0aG9ncmFwaGljQ2FtZXJhOnJ1LFBDRlNoYWRvd01hcDpnbixQQ0ZTb2Z0U2hhZG93TWFwOlNzLFBNUkVNR2VuZXJhdG9yOk1kLFBhdGg6cWwsUGVyc3BlY3RpdmVDYW1lcmE6JGUsUGxhbmU6YWksUGxhbmVHZW9tZXRyeTpYcixQbGFuZUhlbHBlcjp0MSxQb2ludExpZ2h0OlAwLFBvaW50TGlnaHRIZWxwZXI6WGIsUG9pbnRzOldnLFBvaW50c01hdGVyaWFsOk5mLFBvbGFyR3JpZEhlbHBlcjpaYixQb2x5aGVkcm9uR2VvbWV0cnk6eHIsUG9zaXRpb25hbEF1ZGlvOnliLFByb3BlcnR5QmluZGluZzpvZSxQcm9wZXJ0eU1peGVyOlowLFF1YWRyYXRpY0JlemllckN1cnZlOldmLFF1YWRyYXRpY0JlemllckN1cnZlMzpYZixRdWF0ZXJuaW9uOnluLFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrOnZhLFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudDp3MCxSRURfR1JFRU5fUkdUQzJfRm9ybWF0OkhjLFJFRF9SR1RDMV9Gb3JtYXQ6amgsUkVWSVNJT046dGUsUkdCQURlcHRoUGFja2luZzpCbSxSR0JBRm9ybWF0Om5uLFJHQkFJbnRlZ2VyRm9ybWF0Ol9jLFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ6QmMsUkdCQV9BU1RDXzEweDVfRm9ybWF0OlVjLFJHQkFfQVNUQ18xMHg2X0Zvcm1hdDpOYyxSR0JBX0FTVENfMTB4OF9Gb3JtYXQ6RmMsUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdDpPYyxSR0JBX0FTVENfMTJ4MTJfRm9ybWF0OnpjLFJHQkFfQVNUQ180eDRfRm9ybWF0OlRjLFJHQkFfQVNUQ181eDRfRm9ybWF0OkVjLFJHQkFfQVNUQ181eDVfRm9ybWF0OkNjLFJHQkFfQVNUQ182eDVfRm9ybWF0OlJjLFJHQkFfQVNUQ182eDZfRm9ybWF0OkljLFJHQkFfQVNUQ184eDVfRm9ybWF0OlBjLFJHQkFfQVNUQ184eDZfRm9ybWF0OkxjLFJHQkFfQVNUQ184eDhfRm9ybWF0OkRjLFJHQkFfQlBUQ19Gb3JtYXQ6a28sUkdCQV9FVEMyX0VBQ19Gb3JtYXQ6QWMsUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0OlNjLFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdDpNYyxSR0JBX1MzVENfRFhUMV9Gb3JtYXQ6Qm8sUkdCQV9TM1RDX0RYVDNfRm9ybWF0Ok9vLFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdDp6byxSR0JEZXB0aFBhY2tpbmc6RnYsUkdCRm9ybWF0OkpoLFJHQkludGVnZXJGb3JtYXQ6THYsUkdCX0JQVENfU0lHTkVEX0Zvcm1hdDprYyxSR0JfQlBUQ19VTlNJR05FRF9Gb3JtYXQ6VmMsUkdCX0VUQzFfRm9ybWF0OmJjLFJHQl9FVEMyX0Zvcm1hdDp3YyxSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdDp2YyxSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdDp5YyxSR0JfUzNUQ19EWFQxX0Zvcm1hdDpGbyxSR0RlcHRoUGFja2luZzpCdixSR0Zvcm1hdDpLaCxSR0ludGVnZXJGb3JtYXQ6eGMsUmF3U2hhZGVyTWF0ZXJpYWw6ZjAsUmF5OmhyLFJheWNhc3Rlcjp6YixSZWN0QXJlYUxpZ2h0OlUwLFJlZEZvcm1hdDpnYyxSZWRJbnRlZ2VyRm9ybWF0Ok5vLFJlaW5oYXJkVG9uZU1hcHBpbmc6VG0sUmVuZGVyVGFyZ2V0OlpjLFJlbmRlclRhcmdldDNEOkRiLFJlbmRlclRhcmdldEFycmF5OlViLFJlcGVhdFdyYXBwaW5nOkxvLFJlcGxhY2VTdGVuY2lsT3A6enYsUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb246YW0sUmluZ0dlb21ldHJ5OmpsLFNJR05FRF9SRURfR1JFRU5fUkdUQzJfRm9ybWF0OldjLFNJR05FRF9SRURfUkdUQzFfRm9ybWF0OkdjLFNSR0JDb2xvclNwYWNlOl9uLFNSR0JUcmFuc2ZlcjpkZSxTY2VuZTpfZyxTaGFkZXJDaHVuazpLdCxTaGFkZXJMaWI6bGksU2hhZGVyTWF0ZXJpYWw6b2ksU2hhZG93TWF0ZXJpYWw6aDAsU2hhcGU6VmksU2hhcGVHZW9tZXRyeTpRbCxTaGFwZVBhdGg6aTEsU2hhcGVVdGlsczpjbixTaG9ydFR5cGU6cWgsU2tlbGV0b246d2wsU2tlbGV0b25IZWxwZXI6V2IsU2tpbm5lZE1lc2g6SWcsU291cmNlOmFyLFNwaGVyZTpHZSxTcGhlcmVHZW9tZXRyeTp4YSxTcGhlcmljYWw6a2IsU3BoZXJpY2FsSGFybW9uaWNzMzpOMCxTcGxpbmVDdXJ2ZTokZixTcG90TGlnaHQ6UjAsU3BvdExpZ2h0SGVscGVyOkhiLFNwcml0ZTpTZyxTcHJpdGVNYXRlcmlhbDpUZixTcmNBbHBoYUZhY3RvcjppYyxTcmNBbHBoYVNhdHVyYXRlRmFjdG9yOl9tLFNyY0NvbG9yRmFjdG9yOmZtLFN0YXRpY0NvcHlVc2FnZTppTSxTdGF0aWNEcmF3VXNhZ2U6V28sU3RhdGljUmVhZFVzYWdlOnRNLFN0ZXJlb0NhbWVyYTptYixTdHJlYW1Db3B5VXNhZ2U6c00sU3RyZWFtRHJhd1VzYWdlOlF2LFN0cmVhbVJlYWRVc2FnZTpuTSxTdHJpbmdLZXlmcmFtZVRyYWNrOllyLFN1YnRyYWN0RXF1YXRpb246b20sU3VidHJhY3RpdmVCbGVuZGluZzpHaCxUT1VDSDp5ZSxUYW5nZW50U3BhY2VOb3JtYWxNYXA6b3IsVGV0cmFoZWRyb25HZW9tZXRyeTp0dSxUZXh0dXJlOkFlLFRleHR1cmVMb2FkZXI6YWIsVGV4dHVyZVV0aWxzOmwxLFRpbWVzdGFtcFF1ZXJ5OmFNLFRvcnVzR2VvbWV0cnk6ZXUsVG9ydXNLbm90R2VvbWV0cnk6bnUsVHJpYW5nbGU6Z2UsVHJpYW5nbGVGYW5EcmF3TW9kZTpOdixUcmlhbmdsZVN0cmlwRHJhd01vZGU6VXYsVHJpYW5nbGVzRHJhd01vZGU6RHYsVHViZUdlb21ldHJ5Oml1LFVWTWFwcGluZzpmYyxVaW50MTZCdWZmZXJBdHRyaWJ1dGU6U2YsVWludDMyQnVmZmVyQXR0cmlidXRlOmJmLFVpbnQ4QnVmZmVyQXR0cmlidXRlOllNLFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZTpaTSxVbmlmb3JtOnVkLFVuaWZvcm1zR3JvdXA6RmIsVW5pZm9ybXNMaWI6cHQsVW5pZm9ybXNVdGlsczpkZyxVbnNpZ25lZEJ5dGVUeXBlOm5pLFVuc2lnbmVkSW50MjQ4VHlwZTpFcyxVbnNpZ25lZEludDU5OTlUeXBlOlloLFVuc2lnbmVkSW50VHlwZTpMaSxVbnNpZ25lZFNob3J0NDQ0NFR5cGU6cGMsVW5zaWduZWRTaG9ydDU1NTFUeXBlOm1jLFVuc2lnbmVkU2hvcnRUeXBlOkFzLFZTTVNoYWRvd01hcDp4aSxWZWN0b3IyOnEsVmVjdG9yMzpJLFZlY3RvcjQ6UXQsVmVjdG9yS2V5ZnJhbWVUcmFjazpNYSxWaWRlb0ZyYW1lVGV4dHVyZTp4UyxWaWRlb1RleHR1cmU6JGcsV2ViR0wzRFJlbmRlclRhcmdldDpOTSxXZWJHTEFycmF5UmVuZGVyVGFyZ2V0OlVNLFdlYkdMQ29vcmRpbmF0ZVN5c3RlbTpIbixXZWJHTEN1YmVSZW5kZXJUYXJnZXQ6eGcsV2ViR0xSZW5kZXJUYXJnZXQ6dmksV2ViR0xSZW5kZXJlcjp1RSxXZWJHTFV0aWxzOkZ4LFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW06WG8sV2ViWFJDb250cm9sbGVyOm1sLFdpcmVmcmFtZUdlb21ldHJ5OmMwLFdyYXBBcm91bmRFbmRpbmc6R28sWmVyb0N1cnZhdHVyZUVuZGluZzpQcixaZXJvRmFjdG9yOnVtLFplcm9TbG9wZUVuZGluZzpMcixaZXJvU3RlbmNpbE9wOk92LGNyZWF0ZUNhbnZhc0VsZW1lbnQ6WW19KTtjb25zdCBycz1uZXcgTWFwLGZFPShyPXt9KT0+KHtnZW5lcmF0ZVRvcFVWKHQsZSxuLGkscyl7Y29uc3Qgbz1lW24qM10sYT1lW24qMysxXSxjPWVbaSozXSxsPWVbaSozKzFdLHU9ZVtzKjNdLGg9ZVtzKjMrMV07bGV0IGY7aWYocnMuaGFzKHQpKWY9cnMuZ2V0KHQpO2Vsc2V7bGV0IGc9ci5ib3gzO2lmKCFnKXtnPW5ldyBsZTtjb25zdCB5PXQucGFyYW1ldGVycy5zaGFwZXMuZ2V0UG9pbnRzKCkubWFwKF89PltfLngsXy55LDBdKS5mbGF0KCk7Zy5zZXRGcm9tQXJyYXkoeSl9Y29uc3QgbT1nLmdldFNpemUobmV3IEkpO3Iuc3BsaXQmJihtLnkvPXIuc3BsaXQpLGY9e2JveDpnLHNpemU6bX0scnMuc2V0KHQsZil9Y29uc3R7Ym94OmQsc2l6ZTpwfT1mLHg9ci5zcGxpdD8xLXIuc3BsaXQ6MDtyZXR1cm5bbmV3IHEoKG8tZC5taW4ueCkvcC54LChhLWQubWluLnkpL3AueSt4KSxuZXcgcSgoYy1kLm1pbi54KS9wLngsKGwtZC5taW4ueSkvcC55K3gpLG5ldyBxKCh1LWQubWluLngpL3AueCwoaC1kLm1pbi55KS9wLnkreCldfSxnZW5lcmF0ZVNpZGVXYWxsVVYodCxlLG4saSxzLG8pe2NvbnN0IGE9ZVtuKjNdLGM9ZVtuKjMrMV0sbD1lW24qMysyXSx1PWVbaSozXSxoPWVbaSozKzFdLGY9ZVtpKjMrMl0sZD1lW3MqM10scD1lW3MqMysxXSx4PWVbcyozKzJdLGc9ZVtvKjNdLG09ZVtvKjMrMV0sdj1lW28qMysyXTtsZXQgeTtpZihycy5oYXMoZSkpeT1ycy5nZXQoZSk7ZWxzZXtjb25zdCB3PW5ldyBsZTt3LnNldEZyb21BcnJheShlKTtjb25zdCBBPXcuZ2V0U2l6ZShuZXcgSSk7ci5zcGxpdCYmKEEuei89MS1yLnNwbGl0KSxyLnNpZGVSZXBlYXQmJihBLnovPXIuc2lkZVJlcGVhdCkseT17Ym94Oncsc2l6ZTpBfSxycy5zZXQoZSx5KX1jb25zdHtib3g6XyxzaXplOlN9PXk7cmV0dXJuIE1hdGguYWJzKGMtaCk8TWF0aC5hYnMoYS11KT9bbmV3IHEoKGEtXy5taW4ueCkvUy54LChsLV8ubWluLnopL1MueiksbmV3IHEoKHUtXy5taW4ueCkvUy54LChmLV8ubWluLnopL1MueiksbmV3IHEoKGQtXy5taW4ueCkvUy54LCh4LV8ubWluLnopL1MueiksbmV3IHEoKGctXy5taW4ueCkvUy54LCh2LV8ubWluLnopL1MueildOltuZXcgcSgoYy1fLm1pbi55KS9TLnksKGwtXy5taW4ueikvUy56KSxuZXcgcSgoaC1fLm1pbi55KS9TLnksKGYtXy5taW4ueikvUy56KSxuZXcgcSgocC1fLm1pbi55KS9TLnksKHgtXy5taW4ueikvUy56KSxuZXcgcSgobS1fLm1pbi55KS9TLnksKHYtXy5taW4ueikvUy56KV19fSksZEU9KCk9Pntycy5jbGVhcigpfTtjbGFzcyBybyBleHRlbmRzIE50e2NvbnN0cnVjdG9yKHQ9bmV3IFZpKFtuZXcgcSguNSwuNSksbmV3IHEoLS41LC41KSxuZXcgcSgtLjUsLS41KSxuZXcgcSguNSwtLjUpXSksZT17fSl7c3VwZXIoKSx0aGlzLnR5cGU9IkV4dHJ1ZGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6dCxvcHRpb25zOmV9LHQ9QXJyYXkuaXNBcnJheSh0KT90Olt0XTtjb25zdCBuPXRoaXMsaT1bXSxzPVtdO2ZvcihsZXQgYT0wLGM9dC5sZW5ndGg7YTxjO2ErKyl7Y29uc3QgbD10W2FdO28obCl9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgdnQoaSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgdnQocywyKSksdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO2Z1bmN0aW9uIG8oYSl7dmFyIGF0LHR0LEV0O2NvbnN0IGM9W10sbD1lLmN1cnZlU2VnbWVudHMhPT12b2lkIDA/ZS5jdXJ2ZVNlZ21lbnRzOjEyLHU9ZS5zdGVwcyE9PXZvaWQgMD9lLnN0ZXBzOjEsaD1lLmRlcHRoIT09dm9pZCAwP2UuZGVwdGg6MTtsZXQgZj1lLmJldmVsRW5hYmxlZCE9PXZvaWQgMD9lLmJldmVsRW5hYmxlZDohMCxkPWUuYmV2ZWxUaGlja25lc3MhPT12b2lkIDA/ZS5iZXZlbFRoaWNrbmVzczouMixwPWUuYmV2ZWxTaXplIT09dm9pZCAwP2UuYmV2ZWxTaXplOmQtLjEseD1lLmJldmVsT2Zmc2V0IT09dm9pZCAwP2UuYmV2ZWxPZmZzZXQ6MCxnPWUuYmV2ZWxTZWdtZW50cyE9PXZvaWQgMD9lLmJldmVsU2VnbWVudHM6Mztjb25zdCBtPWUuZXh0cnVkZVBhdGgsdj1lLlVWR2VuZXJhdG9yIT09dm9pZCAwP2UuVVZHZW5lcmF0b3I6cEUseT0oYXQ9ZS5oYXNUb3ApIT1udWxsP2F0OiEwLF89KHR0PWUuaGFzQm90dG9tKSE9bnVsbD90dDohMCxTPShFdD1lLmhhc1NpZGUpIT1udWxsP0V0OiEwO2xldCB3LEE9ITEsVCxiLE0sRTttJiYodz1tLmdldFNwYWNlZFBvaW50cyh1KSxBPSEwLGY9ITEsVD1tLmNvbXB1dGVGcmVuZXRGcmFtZXModSwhMSksYj1uZXcgSSxNPW5ldyBJLEU9bmV3IEkpLGZ8fChnPTAsZD0wLHA9MCx4PTApO2NvbnN0IEQ9YS5leHRyYWN0UG9pbnRzKGwpO2xldCBMPUQuc2hhcGU7Y29uc3QgRj1ELmhvbGVzO2lmKCFjbi5pc0Nsb2NrV2lzZShMKSl7TD1MLnJldmVyc2UoKTtmb3IobGV0IFg9MCxSPUYubGVuZ3RoO1g8UjtYKyspe2NvbnN0IEM9RltYXTtjbi5pc0Nsb2NrV2lzZShDKSYmKEZbWF09Qy5yZXZlcnNlKCkpfX1mdW5jdGlvbiBPKFgpe2NvbnN0IEM9MTAwMDAwMDAwMDAwMDAwMDFlLTM2O2xldCBCPVhbMF07Zm9yKGxldCBWPTE7Vjw9WC5sZW5ndGg7VisrKXtjb25zdCBKPVYlWC5sZW5ndGgsJD1YW0pdLHV0PSQueC1CLngscnQ9JC55LUIueSxtdD11dCp1dCtydCpydCxBdD1NYXRoLm1heChNYXRoLmFicygkLngpLE1hdGguYWJzKCQueSksTWF0aC5hYnMoQi54KSxNYXRoLmFicyhCLnkpKSxpdD1DKkF0KkF0O2lmKG10PD1pdCl7WC5zcGxpY2UoSiwxKSxWLS07Y29udGludWV9Qj0kfX1PKEwpLEYuZm9yRWFjaChPKTtjb25zdCBIPUYubGVuZ3RoLHo9TDtmb3IobGV0IFg9MDtYPEg7WCsrKXtjb25zdCBSPUZbWF07TD1MLmNvbmNhdChSKX1mdW5jdGlvbiBRKFgsUixDKXtyZXR1cm4gUnx8Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3QiKSxYLmNsb25lKCkuYWRkU2NhbGVkVmVjdG9yKFIsQyl9Y29uc3Qgc3Q9TC5sZW5ndGg7ZnVuY3Rpb24gZnQoWCxSLEMpe2xldCBCLFYsSjtjb25zdCAkPVgueC1SLngsdXQ9WC55LVIueSxydD1DLngtWC54LG10PUMueS1YLnksQXQ9JCokK3V0KnV0LGl0PSQqbXQtdXQqcnQ7aWYoTWF0aC5hYnMoaXQpPk51bWJlci5FUFNJTE9OKXtjb25zdCBodD1NYXRoLnNxcnQoQXQpLEx0PU1hdGguc3FydChydCpydCttdCptdCksenQ9Ui54LXV0L2h0LGJ0PVIueSskL2h0LGVlPUMueC1tdC9MdCxadD1DLnkrcnQvTHQscGU9KChlZS16dCkqbXQtKFp0LWJ0KSpydCkvKCQqbXQtdXQqcnQpO0I9enQrJCpwZS1YLngsVj1idCt1dCpwZS1YLnk7Y29uc3Qgaz1CKkIrVipWO2lmKGs8PTIpcmV0dXJuIG5ldyBxKEIsVik7Sj1NYXRoLnNxcnQoay8yKX1lbHNle2xldCBodD0hMTskPk51bWJlci5FUFNJTE9OP3J0Pk51bWJlci5FUFNJTE9OJiYoaHQ9ITApOiQ8LU51bWJlci5FUFNJTE9OP3J0PC1OdW1iZXIuRVBTSUxPTiYmKGh0PSEwKTpNYXRoLnNpZ24odXQpPT09TWF0aC5zaWduKG10KSYmKGh0PSEwKSxodD8oQj0tdXQsVj0kLEo9TWF0aC5zcXJ0KEF0KSk6KEI9JCxWPXV0LEo9TWF0aC5zcXJ0KEF0LzIpKX1yZXR1cm4gbmV3IHEoQi9KLFYvSil9Y29uc3QgUnQ9W107Zm9yKGxldCBYPTAsUj16Lmxlbmd0aCxDPVItMSxCPVgrMTtYPFI7WCsrLEMrKyxCKyspQz09PVImJihDPTApLEI9PT1SJiYoQj0wKSxSdFtYXT1mdCh6W1hdLHpbQ10seltCXSk7Y29uc3QgRnQ9W107bGV0IEssb3Q9UnQuY29uY2F0KCk7Zm9yKGxldCBYPTAsUj1IO1g8UjtYKyspe2NvbnN0IEM9RltYXTtLPVtdO2ZvcihsZXQgQj0wLFY9Qy5sZW5ndGgsSj1WLTEsJD1CKzE7QjxWO0IrKyxKKyssJCsrKUo9PT1WJiYoSj0wKSwkPT09ViYmKCQ9MCksS1tCXT1mdChDW0JdLENbSl0sQ1skXSk7RnQucHVzaChLKSxvdD1vdC5jb25jYXQoSyl9bGV0IE10O2lmKGc9PT0wKU10PWNuLnRyaWFuZ3VsYXRlU2hhcGUoeixGKTtlbHNle2NvbnN0IFg9W10sUj1bXTtmb3IobGV0IEM9MDtDPGc7QysrKXtjb25zdCBCPUMvZyxWPWQqTWF0aC5jb3MoQipNYXRoLlBJLzIpLEo9cCpNYXRoLnNpbihCKk1hdGguUEkvMikreDtmb3IobGV0ICQ9MCx1dD16Lmxlbmd0aDskPHV0OyQrKyl7Y29uc3QgcnQ9USh6WyRdLFJ0WyRdLEopO3F0KHJ0LngscnQueSwtViksQj09PTAmJlgucHVzaChydCl9Zm9yKGxldCAkPTAsdXQ9SDskPHV0OyQrKyl7Y29uc3QgcnQ9RlskXTtLPUZ0WyRdO2NvbnN0IG10PVtdO2ZvcihsZXQgQXQ9MCxpdD1ydC5sZW5ndGg7QXQ8aXQ7QXQrKyl7Y29uc3QgaHQ9UShydFtBdF0sS1tBdF0sSik7cXQoaHQueCxodC55LC1WKSxCPT09MCYmbXQucHVzaChodCl9Qj09PTAmJlIucHVzaChtdCl9fU10PWNuLnRyaWFuZ3VsYXRlU2hhcGUoWCxSKX1jb25zdCBkdD1NdC5sZW5ndGgsSXQ9cCt4O2ZvcihsZXQgWD0wO1g8c3Q7WCsrKXtjb25zdCBSPWY/UShMW1hdLG90W1hdLEl0KTpMW1hdO0E/KE0uY29weShULm5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKFIueCksYi5jb3B5KFQuYmlub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihSLnkpLEUuY29weSh3WzBdKS5hZGQoTSkuYWRkKGIpLHF0KEUueCxFLnksRS56KSk6cXQoUi54LFIueSwwKX1mb3IobGV0IFg9MTtYPD11O1grKylmb3IobGV0IFI9MDtSPHN0O1IrKyl7Y29uc3QgQz1mP1EoTFtSXSxvdFtSXSxJdCk6TFtSXTtBPyhNLmNvcHkoVC5ub3JtYWxzW1hdKS5tdWx0aXBseVNjYWxhcihDLngpLGIuY29weShULmJpbm9ybWFsc1tYXSkubXVsdGlwbHlTY2FsYXIoQy55KSxFLmNvcHkod1tYXSkuYWRkKE0pLmFkZChiKSxxdChFLngsRS55LEUueikpOnF0KEMueCxDLnksaC91KlgpfWZvcihsZXQgWD1nLTE7WD49MDtYLS0pe2NvbnN0IFI9WC9nLEM9ZCpNYXRoLmNvcyhSKk1hdGguUEkvMiksQj1wKk1hdGguc2luKFIqTWF0aC5QSS8yKSt4O2ZvcihsZXQgVj0wLEo9ei5sZW5ndGg7VjxKO1YrKyl7Y29uc3QgJD1RKHpbVl0sUnRbVl0sQik7cXQoJC54LCQueSxoK0MpfWZvcihsZXQgVj0wLEo9Ri5sZW5ndGg7VjxKO1YrKyl7Y29uc3QgJD1GW1ZdO0s9RnRbVl07Zm9yKGxldCB1dD0wLHJ0PSQubGVuZ3RoO3V0PHJ0O3V0Kyspe2NvbnN0IG10PVEoJFt1dF0sS1t1dF0sQik7QT9xdChtdC54LG10Lnkrd1t1LTFdLnksd1t1LTFdLngrQyk6cXQobXQueCxtdC55LGgrQyl9fX0kdCgpLFMmJlB0KCk7ZnVuY3Rpb24gJHQoKXtjb25zdCBYPWkubGVuZ3RoLzM7aWYoZil7bGV0IFI9MCxDPXN0KlI7aWYoXylmb3IobGV0IEI9MDtCPGR0O0IrKyl7Y29uc3QgVj1NdFtCXTtCdChWWzJdK0MsVlsxXStDLFZbMF0rQyl9aWYoUj11K2cqMixDPXN0KlIseSlmb3IobGV0IEI9MDtCPGR0O0IrKyl7Y29uc3QgVj1NdFtCXTtCdChWWzBdK0MsVlsxXStDLFZbMl0rQyl9fWVsc2V7aWYoXylmb3IobGV0IFI9MDtSPGR0O1IrKyl7Y29uc3QgQz1NdFtSXTtCdChDWzJdLENbMV0sQ1swXSl9aWYoeSlmb3IobGV0IFI9MDtSPGR0O1IrKyl7Y29uc3QgQz1NdFtSXTtCdChDWzBdK3N0KnUsQ1sxXStzdCp1LENbMl0rc3QqdSl9fW4uYWRkR3JvdXAoWCxpLmxlbmd0aC8zLVgsMCl9ZnVuY3Rpb24gUHQoKXtjb25zdCBYPWkubGVuZ3RoLzM7bGV0IFI9MDtfZSh6LFIpLFIrPXoubGVuZ3RoO2ZvcihsZXQgQz0wLEI9Ri5sZW5ndGg7QzxCO0MrKyl7Y29uc3QgVj1GW0NdO19lKFYsUiksUis9Vi5sZW5ndGh9bi5hZGRHcm91cChYLGkubGVuZ3RoLzMtWCwxKX1mdW5jdGlvbiBfZShYLFIpe2xldCBDPVgubGVuZ3RoO2Zvcig7LS1DPj0wOyl7Y29uc3QgQj1DO2xldCBWPUMtMTtWPDAmJihWPVgubGVuZ3RoLTEpO2ZvcihsZXQgSj0wLCQ9dStnKjI7SjwkO0orKyl7Y29uc3QgdXQ9c3QqSixydD1zdCooSisxKSxtdD1SK0IrdXQsQXQ9UitWK3V0LGl0PVIrVitydCxodD1SK0IrcnQ7VShtdCxBdCxpdCxodCl9fX1mdW5jdGlvbiBxdChYLFIsQyl7Yy5wdXNoKFgpLGMucHVzaChSKSxjLnB1c2goQyl9ZnVuY3Rpb24gQnQoWCxSLEMpe2x0KFgpLGx0KFIpLGx0KEMpO2NvbnN0IEI9aS5sZW5ndGgvMyxWPXYuZ2VuZXJhdGVUb3BVVihuLGksQi0zLEItMixCLTEpO2V0KFZbMF0pLGV0KFZbMV0pLGV0KFZbMl0pfWZ1bmN0aW9uIFUoWCxSLEMsQil7bHQoWCksbHQoUiksbHQoQiksbHQoUiksbHQoQyksbHQoQik7Y29uc3QgVj1pLmxlbmd0aC8zLEo9di5nZW5lcmF0ZVNpZGVXYWxsVVYobixpLFYtNixWLTMsVi0yLFYtMSk7ZXQoSlswXSksZXQoSlsxXSksZXQoSlszXSksZXQoSlsxXSksZXQoSlsyXSksZXQoSlszXSl9ZnVuY3Rpb24gbHQoWCl7aS5wdXNoKGNbWCozKzBdKSxpLnB1c2goY1tYKjMrMV0pLGkucHVzaChjW1gqMysyXSl9ZnVuY3Rpb24gZXQoWCl7cy5wdXNoKFgueCkscy5wdXNoKFgueSl9fX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpLGU9dGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyxuPXRoaXMucGFyYW1ldGVycy5vcHRpb25zO3JldHVybiBtRShlLG4sdCl9c3RhdGljIGZyb21KU09OKHQsZSl7Y29uc3Qgbj1bXTtmb3IobGV0IHM9MCxvPXQuc2hhcGVzLmxlbmd0aDtzPG87cysrKXtjb25zdCBhPWVbdC5zaGFwZXNbc11dO24ucHVzaChhKX1jb25zdCBpPXQub3B0aW9ucy5leHRydWRlUGF0aDtyZXR1cm4gaSE9PXZvaWQgMCYmKHQub3B0aW9ucy5leHRydWRlUGF0aD1uZXcgaEVbYCR7aS50eXBlfUN1cnZlYF0oKS5mcm9tSlNPTihpKSksbmV3IHJvKG4sdC5vcHRpb25zKX19Y29uc3QgcEU9e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24ocix0LGUsbixpKXtjb25zdCBzPXRbZSozXSxvPXRbZSozKzFdLGE9dFtuKjNdLGM9dFtuKjMrMV0sbD10W2kqM10sdT10W2kqMysxXTtyZXR1cm5bbmV3IHEocyxvKSxuZXcgcShhLGMpLG5ldyBxKGwsdSldfSxnZW5lcmF0ZVNpZGVXYWxsVVY6ZnVuY3Rpb24ocix0LGUsbixpLHMpe2NvbnN0IG89dFtlKjNdLGE9dFtlKjMrMV0sYz10W2UqMysyXSxsPXRbbiozXSx1PXRbbiozKzFdLGg9dFtuKjMrMl0sZj10W2kqM10sZD10W2kqMysxXSxwPXRbaSozKzJdLHg9dFtzKjNdLGc9dFtzKjMrMV0sbT10W3MqMysyXTtyZXR1cm4gTWF0aC5hYnMoYS11KTxNYXRoLmFicyhvLWwpP1tuZXcgcShvLDEtYyksbmV3IHEobCwxLWgpLG5ldyBxKGYsMS1wKSxuZXcgcSh4LDEtbSldOltuZXcgcShhLDEtYyksbmV3IHEodSwxLWgpLG5ldyBxKGQsMS1wKSxuZXcgcShnLDEtbSldfX07ZnVuY3Rpb24gbUUocix0LGUpe2lmKGUuc2hhcGVzPVtdLEFycmF5LmlzQXJyYXkocikpZm9yKGxldCBuPTAsaT1yLmxlbmd0aDtuPGk7bisrKXtjb25zdCBzPXJbbl07ZS5zaGFwZXMucHVzaChzLnV1aWQpfWVsc2UgZS5zaGFwZXMucHVzaChyLnV1aWQpO3JldHVybiBlLm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSx0KSx0LmV4dHJ1ZGVQYXRoIT09dm9pZCAwJiYoZS5vcHRpb25zLmV4dHJ1ZGVQYXRoPXQuZXh0cnVkZVBhdGgudG9KU09OKCkpLGV9Y29uc3QgQng9MCxnRT0xLHhFPTIsT3g9MixBZD0xLjI1LHp4PTEsVGE9Nio0KzQrNCxfdT02NTUzNSxfRT1NYXRoLnBvdygyLC0yNCksVGQ9U3ltYm9sKCJTS0lQX0dFTkVSQVRJT04iKTtmdW5jdGlvbiB5RShyKXtyZXR1cm4gci5pbmRleD9yLmluZGV4LmNvdW50OnIuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1mdW5jdGlvbiBzbyhyKXtyZXR1cm4geUUocikvM31mdW5jdGlvbiB2RShyLHQ9QXJyYXlCdWZmZXIpe3JldHVybiByPjY1NTM1P25ldyBVaW50MzJBcnJheShuZXcgdCg0KnIpKTpuZXcgVWludDE2QXJyYXkobmV3IHQoMipyKSl9ZnVuY3Rpb24gTUUocix0KXtpZighci5pbmRleCl7Y29uc3QgZT1yLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQsbj10LnVzZVNoYXJlZEFycmF5QnVmZmVyP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLGk9dkUoZSxuKTtyLnNldEluZGV4KG5ldyBKdChpLDEpKTtmb3IobGV0IHM9MDtzPGU7cysrKWlbc109c319ZnVuY3Rpb24ga3gocix0KXtjb25zdCBlPXNvKHIpLG49dHx8ci5kcmF3UmFuZ2UsaT1uLnN0YXJ0LzMscz0obi5zdGFydCtuLmNvdW50KS8zLG89TWF0aC5tYXgoMCxpKSxhPU1hdGgubWluKGUscyktbztyZXR1cm5be29mZnNldDpNYXRoLmZsb29yKG8pLGNvdW50Ok1hdGguZmxvb3IoYSl9XX1mdW5jdGlvbiBWeChyLHQpe2lmKCFyLmdyb3Vwc3x8IXIuZ3JvdXBzLmxlbmd0aClyZXR1cm4ga3gocix0KTtjb25zdCBlPVtdLG49bmV3IFNldCxpPXR8fHIuZHJhd1JhbmdlLHM9aS5zdGFydC8zLG89KGkuc3RhcnQraS5jb3VudCkvMztmb3IoY29uc3QgYyBvZiByLmdyb3Vwcyl7Y29uc3QgbD1jLnN0YXJ0LzMsdT0oYy5zdGFydCtjLmNvdW50KS8zO24uYWRkKE1hdGgubWF4KHMsbCkpLG4uYWRkKE1hdGgubWluKG8sdSkpfWNvbnN0IGE9QXJyYXkuZnJvbShuLnZhbHVlcygpKS5zb3J0KChjLGwpPT5jLWwpO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGgtMTtjKyspe2NvbnN0IGw9YVtjXSx1PWFbYysxXTtlLnB1c2goe29mZnNldDpNYXRoLmZsb29yKGwpLGNvdW50Ok1hdGguZmxvb3IodS1sKX0pfXJldHVybiBlfWZ1bmN0aW9uIFNFKHIsdCl7Y29uc3QgZT1zbyhyKSxuPVZ4KHIsdCkuc29ydCgobyxhKT0+by5vZmZzZXQtYS5vZmZzZXQpLGk9bltuLmxlbmd0aC0xXTtpLmNvdW50PU1hdGgubWluKGUtaS5vZmZzZXQsaS5jb3VudCk7bGV0IHM9MDtyZXR1cm4gbi5mb3JFYWNoKCh7Y291bnQ6b30pPT5zKz1vKSxlIT09c31mdW5jdGlvbiBFZChyLHQsZSxuLGkpe2xldCBzPTEvMCxvPTEvMCxhPTEvMCxjPS0xLzAsbD0tMS8wLHU9LTEvMCxoPTEvMCxmPTEvMCxkPTEvMCxwPS0xLzAseD0tMS8wLGc9LTEvMDtmb3IobGV0IG09dCo2LHY9KHQrZSkqNjttPHY7bSs9Nil7Y29uc3QgeT1yW20rMF0sXz1yW20rMV0sUz15LV8sdz15K187UzxzJiYocz1TKSx3PmMmJihjPXcpLHk8aCYmKGg9eSkseT5wJiYocD15KTtjb25zdCBBPXJbbSsyXSxUPXJbbSszXSxiPUEtVCxNPUErVDtiPG8mJihvPWIpLE0+bCYmKGw9TSksQTxmJiYoZj1BKSxBPngmJih4PUEpO2NvbnN0IEU9clttKzRdLEQ9clttKzVdLEw9RS1ELEY9RStEO0w8YSYmKGE9TCksRj51JiYodT1GKSxFPGQmJihkPUUpLEU+ZyYmKGc9RSl9blswXT1zLG5bMV09byxuWzJdPWEsblszXT1jLG5bNF09bCxuWzVdPXUsaVswXT1oLGlbMV09ZixpWzJdPWQsaVszXT1wLGlbNF09eCxpWzVdPWd9ZnVuY3Rpb24gYkUocix0PW51bGwsZT1udWxsLG49bnVsbCl7Y29uc3QgaT1yLmF0dHJpYnV0ZXMucG9zaXRpb24scz1yLmluZGV4P3IuaW5kZXguYXJyYXk6bnVsbCxvPXNvKHIpLGE9aS5ub3JtYWxpemVkO2xldCBjO3Q9PT1udWxsPyhjPW5ldyBGbG9hdDMyQXJyYXkobyo2KSxlPTAsbj1vKTooYz10LGU9ZXx8MCxuPW58fG8pO2NvbnN0IGw9aS5hcnJheSx1PWkub2Zmc2V0fHwwO2xldCBoPTM7aS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYoaD1pLmRhdGEuc3RyaWRlKTtjb25zdCBmPVsiZ2V0WCIsImdldFkiLCJnZXRaIl07Zm9yKGxldCBkPWU7ZDxlK247ZCsrKXtjb25zdCBwPWQqMyx4PWQqNjtsZXQgZz1wKzAsbT1wKzEsdj1wKzI7cyYmKGc9c1tnXSxtPXNbbV0sdj1zW3ZdKSxhfHwoZz1nKmgrdSxtPW0qaCt1LHY9dipoK3UpO2ZvcihsZXQgeT0wO3k8Mzt5Kyspe2xldCBfLFMsdzthPyhfPWlbZlt5XV0oZyksUz1pW2ZbeV1dKG0pLHc9aVtmW3ldXSh2KSk6KF89bFtnK3ldLFM9bFttK3ldLHc9bFt2K3ldKTtsZXQgQT1fO1M8QSYmKEE9UyksdzxBJiYoQT13KTtsZXQgVD1fO1M+VCYmKFQ9Uyksdz5UJiYoVD13KTtjb25zdCBiPShULUEpLzIsTT15KjI7Y1t4K00rMF09QStiLGNbeCtNKzFdPWIrKE1hdGguYWJzKEEpK2IpKl9FfX1yZXR1cm4gY31mdW5jdGlvbiBFZShyLHQsZSl7cmV0dXJuIGUubWluLng9dFtyXSxlLm1pbi55PXRbcisxXSxlLm1pbi56PXRbcisyXSxlLm1heC54PXRbciszXSxlLm1heC55PXRbcis0XSxlLm1heC56PXRbcis1XSxlfWZ1bmN0aW9uIEd4KHIpe2xldCB0PS0xLGU9LTEvMDtmb3IobGV0IG49MDtuPDM7bisrKXtjb25zdCBpPXJbbiszXS1yW25dO2k+ZSYmKGU9aSx0PW4pfXJldHVybiB0fWZ1bmN0aW9uIEh4KHIsdCl7dC5zZXQocil9ZnVuY3Rpb24gV3gocix0LGUpe2xldCBuLGk7Zm9yKGxldCBzPTA7czwzO3MrKyl7Y29uc3Qgbz1zKzM7bj1yW3NdLGk9dFtzXSxlW3NdPW48aT9uOmksbj1yW29dLGk9dFtvXSxlW29dPW4+aT9uOml9fWZ1bmN0aW9uIHl1KHIsdCxlKXtmb3IobGV0IG49MDtuPDM7bisrKXtjb25zdCBpPXRbcisyKm5dLHM9dFtyKzIqbisxXSxvPWktcyxhPWkrcztvPGVbbl0mJihlW25dPW8pLGE+ZVtuKzNdJiYoZVtuKzNdPWEpfX1mdW5jdGlvbiBFYShyKXtjb25zdCB0PXJbM10tclswXSxlPXJbNF0tclsxXSxuPXJbNV0tclsyXTtyZXR1cm4gMioodCplK2UqbituKnQpfWNvbnN0IFhpPTMyLHdFPShyLHQpPT5yLmNhbmRpZGF0ZS10LmNhbmRpZGF0ZSx2cj1uZXcgQXJyYXkoWGkpLmZpbGwoKS5tYXAoKCk9Pih7Y291bnQ6MCxib3VuZHM6bmV3IEZsb2F0MzJBcnJheSg2KSxyaWdodENhY2hlQm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNiksbGVmdENhY2hlQm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNiksY2FuZGlkYXRlOjB9KSksdnU9bmV3IEZsb2F0MzJBcnJheSg2KTtmdW5jdGlvbiBBRShyLHQsZSxuLGkscyl7bGV0IG89LTEsYT0wO2lmKHM9PT1CeClvPUd4KHQpLG8hPT0tMSYmKGE9KHRbb10rdFtvKzNdKS8yKTtlbHNlIGlmKHM9PT1nRSlvPUd4KHIpLG8hPT0tMSYmKGE9VEUoZSxuLGksbykpO2Vsc2UgaWYocz09PXhFKXtjb25zdCBjPUVhKHIpO2xldCBsPUFkKmk7Y29uc3QgdT1uKjYsaD0obitpKSo2O2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9dFtmXSxnPSh0W2YrM10tZCkvWGk7aWYoaTxYaS80KXtjb25zdCBtPVsuLi52cl07bS5sZW5ndGg9aTtsZXQgdj0wO2ZvcihsZXQgXz11O188aDtfKz02LHYrKyl7Y29uc3QgUz1tW3ZdO1MuY2FuZGlkYXRlPWVbXysyKmZdLFMuY291bnQ9MDtjb25zdHtib3VuZHM6dyxsZWZ0Q2FjaGVCb3VuZHM6QSxyaWdodENhY2hlQm91bmRzOlR9PVM7Zm9yKGxldCBiPTA7YjwzO2IrKylUW2JdPTEvMCxUW2IrM109LTEvMCxBW2JdPTEvMCxBW2IrM109LTEvMCx3W2JdPTEvMCx3W2IrM109LTEvMDt5dShfLGUsdyl9bS5zb3J0KHdFKTtsZXQgeT1pO2ZvcihsZXQgXz0wO188eTtfKyspe2NvbnN0IFM9bVtfXTtmb3IoO18rMTx5JiZtW18rMV0uY2FuZGlkYXRlPT09Uy5jYW5kaWRhdGU7KW0uc3BsaWNlKF8rMSwxKSx5LS19Zm9yKGxldCBfPXU7XzxoO18rPTYpe2NvbnN0IFM9ZVtfKzIqZl07Zm9yKGxldCB3PTA7dzx5O3crKyl7Y29uc3QgQT1tW3ddO1M+PUEuY2FuZGlkYXRlP3l1KF8sZSxBLnJpZ2h0Q2FjaGVCb3VuZHMpOih5dShfLGUsQS5sZWZ0Q2FjaGVCb3VuZHMpLEEuY291bnQrKyl9fWZvcihsZXQgXz0wO188eTtfKyspe2NvbnN0IFM9bVtfXSx3PVMuY291bnQsQT1pLVMuY291bnQsVD1TLmxlZnRDYWNoZUJvdW5kcyxiPVMucmlnaHRDYWNoZUJvdW5kcztsZXQgTT0wO3chPT0wJiYoTT1FYShUKS9jKTtsZXQgRT0wO0EhPT0wJiYoRT1FYShiKS9jKTtjb25zdCBEPXp4K0FkKihNKncrRSpBKTtEPGwmJihvPWYsbD1ELGE9Uy5jYW5kaWRhdGUpfX1lbHNle2ZvcihsZXQgeT0wO3k8WGk7eSsrKXtjb25zdCBfPXZyW3ldO18uY291bnQ9MCxfLmNhbmRpZGF0ZT1kK2creSpnO2NvbnN0IFM9Xy5ib3VuZHM7Zm9yKGxldCB3PTA7dzwzO3crKylTW3ddPTEvMCxTW3crM109LTEvMH1mb3IobGV0IHk9dTt5PGg7eSs9Nil7bGV0IHc9fn4oKGVbeSsyKmZdLWQpL2cpO3c+PVhpJiYodz1YaS0xKTtjb25zdCBBPXZyW3ddO0EuY291bnQrKyx5dSh5LGUsQS5ib3VuZHMpfWNvbnN0IG09dnJbWGktMV07SHgobS5ib3VuZHMsbS5yaWdodENhY2hlQm91bmRzKTtmb3IobGV0IHk9WGktMjt5Pj0wO3ktLSl7Y29uc3QgXz12clt5XSxTPXZyW3krMV07V3goXy5ib3VuZHMsUy5yaWdodENhY2hlQm91bmRzLF8ucmlnaHRDYWNoZUJvdW5kcyl9bGV0IHY9MDtmb3IobGV0IHk9MDt5PFhpLTE7eSsrKXtjb25zdCBfPXZyW3ldLFM9Xy5jb3VudCx3PV8uYm91bmRzLFQ9dnJbeSsxXS5yaWdodENhY2hlQm91bmRzO1MhPT0wJiYodj09PTA/SHgodyx2dSk6V3godyx2dSx2dSkpLHYrPVM7bGV0IGI9MCxNPTA7diE9PTAmJihiPUVhKHZ1KS9jKTtjb25zdCBFPWktdjtFIT09MCYmKE09RWEoVCkvYyk7Y29uc3QgRD16eCtBZCooYip2K00qRSk7RDxsJiYobz1mLGw9RCxhPV8uY2FuZGlkYXRlKX19fX1lbHNlIGNvbnNvbGUud2FybihgTWVzaEJWSDogSW52YWxpZCBidWlsZCBzdHJhdGVneSB2YWx1ZSAke3N9IHVzZWQuYCk7cmV0dXJue2F4aXM6byxwb3M6YX19ZnVuY3Rpb24gVEUocix0LGUsbil7bGV0IGk9MDtmb3IobGV0IHM9dCxvPXQrZTtzPG87cysrKWkrPXJbcyo2K24qMl07cmV0dXJuIGkvZX1jbGFzcyBDZHtjb25zdHJ1Y3Rvcigpe3RoaXMuYm91bmRpbmdEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNil9fWZ1bmN0aW9uIEVFKHIsdCxlLG4saSxzKXtsZXQgbz1uLGE9bitpLTE7Y29uc3QgYz1zLnBvcyxsPXMuYXhpcyoyO2Zvcig7Oyl7Zm9yKDtvPD1hJiZlW28qNitsXTxjOylvKys7Zm9yKDtvPD1hJiZlW2EqNitsXT49YzspYS0tO2lmKG88YSl7Zm9yKGxldCB1PTA7dTwzO3UrKyl7bGV0IGg9dFtvKjMrdV07dFtvKjMrdV09dFthKjMrdV0sdFthKjMrdV09aH1mb3IobGV0IHU9MDt1PDY7dSsrKXtsZXQgaD1lW28qNit1XTtlW28qNit1XT1lW2EqNit1XSxlW2EqNit1XT1ofW8rKyxhLS19ZWxzZSByZXR1cm4gb319ZnVuY3Rpb24gQ0Uocix0LGUsbixpLHMpe2xldCBvPW4sYT1uK2ktMTtjb25zdCBjPXMucG9zLGw9cy5heGlzKjI7Zm9yKDs7KXtmb3IoO288PWEmJmVbbyo2K2xdPGM7KW8rKztmb3IoO288PWEmJmVbYSo2K2xdPj1jOylhLS07aWYobzxhKXtsZXQgdT1yW29dO3Jbb109clthXSxyW2FdPXU7Zm9yKGxldCBoPTA7aDw2O2grKyl7bGV0IGY9ZVtvKjYraF07ZVtvKjYraF09ZVthKjYraF0sZVthKjYraF09Zn1vKyssYS0tfWVsc2UgcmV0dXJuIG99fWZ1bmN0aW9uIGJuKHIsdCl7cmV0dXJuIHRbcisxNV09PT02NTUzNX1mdW5jdGlvbiBCbihyLHQpe3JldHVybiB0W3IrNl19ZnVuY3Rpb24gJG4ocix0KXtyZXR1cm4gdFtyKzE0XX1mdW5jdGlvbiBxbihyKXtyZXR1cm4gcis4fWZ1bmN0aW9uIFluKHIsdCl7cmV0dXJuIHRbcis2XX1mdW5jdGlvbiBYeChyLHQpe3JldHVybiB0W3IrN119ZnVuY3Rpb24gTjMocil7cmV0dXJuIHJ9bGV0ICR4LENhLE11LHF4O2NvbnN0IFJFPU1hdGgucG93KDIsMzIpO2Z1bmN0aW9uIFJkKHIpe3JldHVybiJjb3VudCJpbiByPzE6MStSZChyLmxlZnQpK1JkKHIucmlnaHQpfWZ1bmN0aW9uIElFKHIsdCxlKXtyZXR1cm4gJHg9bmV3IEZsb2F0MzJBcnJheShlKSxDYT1uZXcgVWludDMyQXJyYXkoZSksTXU9bmV3IFVpbnQxNkFycmF5KGUpLHF4PW5ldyBVaW50OEFycmF5KGUpLElkKHIsdCl9ZnVuY3Rpb24gSWQocix0KXtjb25zdCBlPXIvNCxuPXIvMixpPSJjb3VudCJpbiB0LHM9dC5ib3VuZGluZ0RhdGE7Zm9yKGxldCBvPTA7bzw2O28rKykkeFtlK29dPXNbb107aWYoaSlpZih0LmJ1ZmZlcil7Y29uc3Qgbz10LmJ1ZmZlcjtxeC5zZXQobmV3IFVpbnQ4QXJyYXkobykscik7Zm9yKGxldCBhPXIsYz1yK28uYnl0ZUxlbmd0aDthPGM7YSs9VGEpe2NvbnN0IGw9YS8yO2JuKGwsTXUpfHwoQ2FbYS80KzZdKz1lKX1yZXR1cm4gcitvLmJ5dGVMZW5ndGh9ZWxzZXtjb25zdCBvPXQub2Zmc2V0LGE9dC5jb3VudDtyZXR1cm4gQ2FbZSs2XT1vLE11W24rMTRdPWEsTXVbbisxNV09X3UscitUYX1lbHNle2NvbnN0IG89dC5sZWZ0LGE9dC5yaWdodCxjPXQuc3BsaXRBeGlzO2xldCBsO2lmKGw9SWQocitUYSxvKSxsLzQ+UkUpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBDYW5ub3Qgc3RvcmUgY2hpbGQgcG9pbnRlciBncmVhdGVyIHRoYW4gMzIgYml0cy4iKTtyZXR1cm4gQ2FbZSs2XT1sLzQsbD1JZChsLGEpLENhW2UrN109YyxsfX1mdW5jdGlvbiBQRShyLHQpe2NvbnN0IGU9KHIuaW5kZXg/ci5pbmRleC5jb3VudDpyLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQpLzMsbj1lPkNvKDIsMTYpLGk9bj80OjIscz10P25ldyBTaGFyZWRBcnJheUJ1ZmZlcihlKmkpOm5ldyBBcnJheUJ1ZmZlcihlKmkpLG89bj9uZXcgVWludDMyQXJyYXkocyk6bmV3IFVpbnQxNkFycmF5KHMpO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKylvW2FdPWE7cmV0dXJuIG99ZnVuY3Rpb24gTEUocix0LGUsbixpKXtjb25zdHttYXhEZXB0aDpzLHZlcmJvc2U6byxtYXhMZWFmVHJpczphLHN0cmF0ZWd5OmMsb25Qcm9ncmVzczpsLGluZGlyZWN0OnV9PWksaD1yLl9pbmRpcmVjdEJ1ZmZlcixmPXIuZ2VvbWV0cnksZD1mLmluZGV4P2YuaW5kZXguYXJyYXk6bnVsbCxwPXU/Q0U6RUUseD1zbyhmKSxnPW5ldyBGbG9hdDMyQXJyYXkoNik7bGV0IG09ITE7Y29uc3Qgdj1uZXcgQ2Q7cmV0dXJuIEVkKHQsZSxuLHYuYm91bmRpbmdEYXRhLGcpLF8odixlLG4sZyksdjtmdW5jdGlvbiB5KFMpe2wmJmwoUy94KX1mdW5jdGlvbiBfKFMsdyxBLFQ9bnVsbCxiPTApe2lmKCFtJiZiPj1zJiYobT0hMCxvJiYoY29uc29sZS53YXJuKGBNZXNoQlZIOiBNYXggZGVwdGggb2YgJHtzfSByZWFjaGVkIHdoZW4gZ2VuZXJhdGluZyBCVkguIENvbnNpZGVyIGluY3JlYXNpbmcgbWF4RGVwdGguYCksY29uc29sZS53YXJuKGYpKSksQTw9YXx8Yj49cylyZXR1cm4geSh3K0EpLFMub2Zmc2V0PXcsUy5jb3VudD1BLFM7Y29uc3QgTT1BRShTLmJvdW5kaW5nRGF0YSxULHQsdyxBLGMpO2lmKE0uYXhpcz09PS0xKXJldHVybiB5KHcrQSksUy5vZmZzZXQ9dyxTLmNvdW50PUEsUztjb25zdCBFPXAoaCxkLHQsdyxBLE0pO2lmKEU9PT13fHxFPT09dytBKXkodytBKSxTLm9mZnNldD13LFMuY291bnQ9QTtlbHNle1Muc3BsaXRBeGlzPU0uYXhpcztjb25zdCBEPW5ldyBDZCxMPXcsRj1FLXc7Uy5sZWZ0PUQsRWQodCxMLEYsRC5ib3VuZGluZ0RhdGEsZyksXyhELEwsRixnLGIrMSk7Y29uc3QgTj1uZXcgQ2QsTz1FLEg9QS1GO1MucmlnaHQ9TixFZCh0LE8sSCxOLmJvdW5kaW5nRGF0YSxnKSxfKE4sTyxILGcsYisxKX1yZXR1cm4gU319ZnVuY3Rpb24gREUocix0KXtjb25zdCBlPXIuZ2VvbWV0cnk7dC5pbmRpcmVjdCYmKHIuX2luZGlyZWN0QnVmZmVyPVBFKGUsdC51c2VTaGFyZWRBcnJheUJ1ZmZlciksU0UoZSx0LnJhbmdlKSYmIXQudmVyYm9zZSYmY29uc29sZS53YXJuKCdNZXNoQlZIOiBQcm92aWRlZCBnZW9tZXRyeSBjb250YWlucyBncm91cHMgb3IgYSByYW5nZSB0aGF0IGRvIG5vdCBmdWxseSBzcGFuIHRoZSB2ZXJ0ZXggY29udGVudHMgd2hpbGUgdXNpbmcgdGhlICJpbmRpcmVjdCIgb3B0aW9uLiBCVkggbWF5IGluY29ycmVjdGx5IHJlcG9ydCBpbnRlcnNlY3Rpb25zIG9uIHVucmVuZGVyZWQgcG9ydGlvbnMgb2YgdGhlIGdlb21ldHJ5LicpKSxyLl9pbmRpcmVjdEJ1ZmZlcnx8TUUoZSx0KTtjb25zdCBuPXQudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIsaT1iRShlKSxzPXQuaW5kaXJlY3Q/a3goZSx0LnJhbmdlKTpWeChlLHQucmFuZ2UpO3IuX3Jvb3RzPXMubWFwKG89Pntjb25zdCBhPUxFKHIsaSxvLm9mZnNldCxvLmNvdW50LHQpLGM9UmQoYSksbD1uZXcgbihUYSpjKTtyZXR1cm4gSUUoMCxhLGwpLGx9KX1jbGFzcyAkaXtjb25zdHJ1Y3Rvcigpe3RoaXMubWluPTEvMCx0aGlzLm1heD0tMS8wfXNldEZyb21Qb2ludHNGaWVsZCh0LGUpe2xldCBuPTEvMCxpPS0xLzA7Zm9yKGxldCBzPTAsbz10Lmxlbmd0aDtzPG87cysrKXtjb25zdCBjPXRbc11bZV07bj1jPG4/YzpuLGk9Yz5pP2M6aX10aGlzLm1pbj1uLHRoaXMubWF4PWl9c2V0RnJvbVBvaW50cyh0LGUpe2xldCBuPTEvMCxpPS0xLzA7Zm9yKGxldCBzPTAsbz1lLmxlbmd0aDtzPG87cysrKXtjb25zdCBhPWVbc10sYz10LmRvdChhKTtuPWM8bj9jOm4saT1jPmk/YzppfXRoaXMubWluPW4sdGhpcy5tYXg9aX1pc1NlcGFyYXRlZCh0KXtyZXR1cm4gdGhpcy5taW4+dC5tYXh8fHQubWluPnRoaXMubWF4fX0kaS5wcm90b3R5cGUuc2V0RnJvbUJveD1mdW5jdGlvbigpe2NvbnN0IHI9bmV3IEk7cmV0dXJuIGZ1bmN0aW9uKGUsbil7Y29uc3QgaT1uLm1pbixzPW4ubWF4O2xldCBvPTEvMCxhPS0xLzA7Zm9yKGxldCBjPTA7Yzw9MTtjKyspZm9yKGxldCBsPTA7bDw9MTtsKyspZm9yKGxldCB1PTA7dTw9MTt1Kyspe3IueD1pLngqYytzLngqKDEtYyksci55PWkueSpsK3MueSooMS1sKSxyLno9aS56KnUrcy56KigxLXUpO2NvbnN0IGg9ZS5kb3Qocik7bz1NYXRoLm1pbihoLG8pLGE9TWF0aC5tYXgoaCxhKX10aGlzLm1pbj1vLHRoaXMubWF4PWF9fSgpO2NvbnN0IFVFPWZ1bmN0aW9uKCl7Y29uc3Qgcj1uZXcgSSx0PW5ldyBJLGU9bmV3IEk7cmV0dXJuIGZ1bmN0aW9uKGkscyxvKXtjb25zdCBhPWkuc3RhcnQsYz1yLGw9cy5zdGFydCx1PXQ7ZS5zdWJWZWN0b3JzKGEsbCksci5zdWJWZWN0b3JzKGkuZW5kLGkuc3RhcnQpLHQuc3ViVmVjdG9ycyhzLmVuZCxzLnN0YXJ0KTtjb25zdCBoPWUuZG90KHUpLGY9dS5kb3QoYyksZD11LmRvdCh1KSxwPWUuZG90KGMpLGc9Yy5kb3QoYykqZC1mKmY7bGV0IG0sdjtnIT09MD9tPShoKmYtcCpkKS9nOm09MCx2PShoK20qZikvZCxvLng9bSxvLnk9dn19KCksUGQ9ZnVuY3Rpb24oKXtjb25zdCByPW5ldyBxLHQ9bmV3IEksZT1uZXcgSTtyZXR1cm4gZnVuY3Rpb24oaSxzLG8sYSl7VUUoaSxzLHIpO2xldCBjPXIueCxsPXIueTtpZihjPj0wJiZjPD0xJiZsPj0wJiZsPD0xKXtpLmF0KGMsbykscy5hdChsLGEpO3JldHVybn1lbHNlIGlmKGM+PTAmJmM8PTEpe2w8MD9zLmF0KDAsYSk6cy5hdCgxLGEpLGkuY2xvc2VzdFBvaW50VG9Qb2ludChhLCEwLG8pO3JldHVybn1lbHNlIGlmKGw+PTAmJmw8PTEpe2M8MD9pLmF0KDAsbyk6aS5hdCgxLG8pLHMuY2xvc2VzdFBvaW50VG9Qb2ludChvLCEwLGEpO3JldHVybn1lbHNle2xldCB1O2M8MD91PWkuc3RhcnQ6dT1pLmVuZDtsZXQgaDtsPDA/aD1zLnN0YXJ0Omg9cy5lbmQ7Y29uc3QgZj10LGQ9ZTtpZihpLmNsb3Nlc3RQb2ludFRvUG9pbnQoaCwhMCx0KSxzLmNsb3Nlc3RQb2ludFRvUG9pbnQodSwhMCxlKSxmLmRpc3RhbmNlVG9TcXVhcmVkKGgpPD1kLmRpc3RhbmNlVG9TcXVhcmVkKHUpKXtvLmNvcHkoZiksYS5jb3B5KGgpO3JldHVybn1lbHNle28uY29weSh1KSxhLmNvcHkoZCk7cmV0dXJufX19fSgpLE5FPWZ1bmN0aW9uKCl7Y29uc3Qgcj1uZXcgSSx0PW5ldyBJLGU9bmV3IGFpLG49bmV3IEZuO3JldHVybiBmdW5jdGlvbihzLG8pe2NvbnN0e3JhZGl1czphLGNlbnRlcjpjfT1zLHthOmwsYjp1LGM6aH09bztpZihuLnN0YXJ0PWwsbi5lbmQ9dSxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYywhMCxyKS5kaXN0YW5jZVRvKGMpPD1hfHwobi5zdGFydD1sLG4uZW5kPWgsbi5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAscikuZGlzdGFuY2VUbyhjKTw9YSl8fChuLnN0YXJ0PXUsbi5lbmQ9aCxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYywhMCxyKS5kaXN0YW5jZVRvKGMpPD1hKSlyZXR1cm4hMDtjb25zdCB4PW8uZ2V0UGxhbmUoZSk7aWYoTWF0aC5hYnMoeC5kaXN0YW5jZVRvUG9pbnQoYykpPD1hKXtjb25zdCBtPXgucHJvamVjdFBvaW50KGMsdCk7aWYoby5jb250YWluc1BvaW50KG0pKXJldHVybiEwfXJldHVybiExfX0oKSxGRT0xZS0xNTtmdW5jdGlvbiBMZChyKXtyZXR1cm4gTWF0aC5hYnMocik8RkV9Y2xhc3MgWm4gZXh0ZW5kcyBnZXtjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLmlzRXh0ZW5kZWRUcmlhbmdsZT0hMCx0aGlzLnNhdEF4ZXM9bmV3IEFycmF5KDQpLmZpbGwoKS5tYXAoKCk9Pm5ldyBJKSx0aGlzLnNhdEJvdW5kcz1uZXcgQXJyYXkoNCkuZmlsbCgpLm1hcCgoKT0+bmV3ICRpKSx0aGlzLnBvaW50cz1bdGhpcy5hLHRoaXMuYix0aGlzLmNdLHRoaXMuc3BoZXJlPW5ldyBHZSx0aGlzLnBsYW5lPW5ldyBhaSx0aGlzLm5lZWRzVXBkYXRlPSEwfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIE5FKHQsdGhpcyl9dXBkYXRlKCl7Y29uc3QgdD10aGlzLmEsZT10aGlzLmIsbj10aGlzLmMsaT10aGlzLnBvaW50cyxzPXRoaXMuc2F0QXhlcyxvPXRoaXMuc2F0Qm91bmRzLGE9c1swXSxjPW9bMF07dGhpcy5nZXROb3JtYWwoYSksYy5zZXRGcm9tUG9pbnRzKGEsaSk7Y29uc3QgbD1zWzFdLHU9b1sxXTtsLnN1YlZlY3RvcnModCxlKSx1LnNldEZyb21Qb2ludHMobCxpKTtjb25zdCBoPXNbMl0sZj1vWzJdO2guc3ViVmVjdG9ycyhlLG4pLGYuc2V0RnJvbVBvaW50cyhoLGkpO2NvbnN0IGQ9c1szXSxwPW9bM107ZC5zdWJWZWN0b3JzKG4sdCkscC5zZXRGcm9tUG9pbnRzKGQsaSksdGhpcy5zcGhlcmUuc2V0RnJvbVBvaW50cyh0aGlzLnBvaW50cyksdGhpcy5wbGFuZS5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChhLHQpLHRoaXMubmVlZHNVcGRhdGU9ITF9fVpuLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1NlZ21lbnQ9ZnVuY3Rpb24oKXtjb25zdCByPW5ldyBJLHQ9bmV3IEksZT1uZXcgRm47cmV0dXJuIGZ1bmN0aW9uKGkscz1udWxsLG89bnVsbCl7Y29uc3R7c3RhcnQ6YSxlbmQ6Y309aSxsPXRoaXMucG9pbnRzO2xldCB1LGg9MS8wO2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9KGYrMSklMztlLnN0YXJ0LmNvcHkobFtmXSksZS5lbmQuY29weShsW2RdKSxQZChlLGkscix0KSx1PXIuZGlzdGFuY2VUb1NxdWFyZWQodCksdTxoJiYoaD11LHMmJnMuY29weShyKSxvJiZvLmNvcHkodCkpfXJldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoYSxyKSx1PWEuZGlzdGFuY2VUb1NxdWFyZWQociksdTxoJiYoaD11LHMmJnMuY29weShyKSxvJiZvLmNvcHkoYSkpLHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChjLHIpLHU9Yy5kaXN0YW5jZVRvU3F1YXJlZChyKSx1PGgmJihoPXUscyYmcy5jb3B5KHIpLG8mJm8uY29weShjKSksTWF0aC5zcXJ0KGgpfX0oKSxabi5wcm90b3R5cGUuaW50ZXJzZWN0c1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3Qgcj1uZXcgWm4sdD1uZXcgQXJyYXkoMyksZT1uZXcgQXJyYXkoMyksbj1uZXcgJGksaT1uZXcgJGkscz1uZXcgSSxvPW5ldyBJLGE9bmV3IEksYz1uZXcgSSxsPW5ldyBJLHU9bmV3IEZuLGg9bmV3IEZuLGY9bmV3IEZuLGQ9bmV3IEk7ZnVuY3Rpb24gcCh4LGcsbSl7Y29uc3Qgdj14LnBvaW50cztsZXQgeT0wLF89LTE7Zm9yKGxldCBTPTA7UzwzO1MrKyl7Y29uc3R7c3RhcnQ6dyxlbmQ6QX09dTt3LmNvcHkodltTXSksQS5jb3B5KHZbKFMrMSklM10pLHUuZGVsdGEobyk7Y29uc3QgVD1MZChnLmRpc3RhbmNlVG9Qb2ludCh3KSk7aWYoTGQoZy5ub3JtYWwuZG90KG8pKSYmVCl7bS5jb3B5KHUpLHk9MjticmVha31jb25zdCBiPWcuaW50ZXJzZWN0TGluZSh1LGQpO2lmKCFiJiZUJiZkLmNvcHkodyksKGJ8fFQpJiYhTGQoZC5kaXN0YW5jZVRvKEEpKSl7aWYoeTw9MSkoeT09PTE/bS5zdGFydDptLmVuZCkuY29weShkKSxUJiYoXz15KTtlbHNlIGlmKHk+PTIpeyhfPT09MT9tLnN0YXJ0Om0uZW5kKS5jb3B5KGQpLHk9MjticmVha31pZih5KysseT09PTImJl89PT0tMSlicmVha319cmV0dXJuIHl9cmV0dXJuIGZ1bmN0aW9uKGcsbT1udWxsLHY9ITEpe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksZy5pc0V4dGVuZGVkVHJpYW5nbGU/Zy5uZWVkc1VwZGF0ZSYmZy51cGRhdGUoKTooci5jb3B5KGcpLHIudXBkYXRlKCksZz1yKTtjb25zdCB5PXRoaXMucGxhbmUsXz1nLnBsYW5lO2lmKE1hdGguYWJzKHkubm9ybWFsLmRvdChfLm5vcm1hbCkpPjEtMWUtMTApe2NvbnN0IFM9dGhpcy5zYXRCb3VuZHMsdz10aGlzLnNhdEF4ZXM7ZVswXT1nLmEsZVsxXT1nLmIsZVsyXT1nLmM7Zm9yKGxldCBiPTA7Yjw0O2IrKyl7Y29uc3QgTT1TW2JdLEU9d1tiXTtpZihuLnNldEZyb21Qb2ludHMoRSxlKSxNLmlzU2VwYXJhdGVkKG4pKXJldHVybiExfWNvbnN0IEE9Zy5zYXRCb3VuZHMsVD1nLnNhdEF4ZXM7dFswXT10aGlzLmEsdFsxXT10aGlzLmIsdFsyXT10aGlzLmM7Zm9yKGxldCBiPTA7Yjw0O2IrKyl7Y29uc3QgTT1BW2JdLEU9VFtiXTtpZihuLnNldEZyb21Qb2ludHMoRSx0KSxNLmlzU2VwYXJhdGVkKG4pKXJldHVybiExfWZvcihsZXQgYj0wO2I8NDtiKyspe2NvbnN0IE09d1tiXTtmb3IobGV0IEU9MDtFPDQ7RSsrKXtjb25zdCBEPVRbRV07aWYocy5jcm9zc1ZlY3RvcnMoTSxEKSxuLnNldEZyb21Qb2ludHMocyx0KSxpLnNldEZyb21Qb2ludHMocyxlKSxuLmlzU2VwYXJhdGVkKGkpKXJldHVybiExfX1yZXR1cm4gbSYmKHZ8fGNvbnNvbGUud2FybigiRXh0ZW5kZWRUcmlhbmdsZS5pbnRlcnNlY3RzVHJpYW5nbGU6IFRyaWFuZ2xlcyBhcmUgY29wbGFuYXIgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBhbiBvdXRwdXQgZWRnZS4gU2V0dGluZyBlZGdlIHRvIDAsIDAsIDAuIiksbS5zdGFydC5zZXQoMCwwLDApLG0uZW5kLnNldCgwLDAsMCkpLCEwfWVsc2V7Y29uc3QgUz1wKHRoaXMsXyxoKTtpZihTPT09MSYmZy5jb250YWluc1BvaW50KGguZW5kKSlyZXR1cm4gbSYmKG0uc3RhcnQuY29weShoLmVuZCksbS5lbmQuY29weShoLmVuZCkpLCEwO2lmKFMhPT0yKXJldHVybiExO2NvbnN0IHc9cChnLHksZik7aWYodz09PTEmJnRoaXMuY29udGFpbnNQb2ludChmLmVuZCkpcmV0dXJuIG0mJihtLnN0YXJ0LmNvcHkoZi5lbmQpLG0uZW5kLmNvcHkoZi5lbmQpKSwhMDtpZih3IT09MilyZXR1cm4hMTtpZihoLmRlbHRhKGEpLGYuZGVsdGEoYyksYS5kb3QoYyk8MCl7bGV0IEw9Zi5zdGFydDtmLnN0YXJ0PWYuZW5kLGYuZW5kPUx9Y29uc3QgQT1oLnN0YXJ0LmRvdChhKSxUPWguZW5kLmRvdChhKSxiPWYuc3RhcnQuZG90KGEpLE09Zi5lbmQuZG90KGEpLEU9VDxiLEQ9QTxNO3JldHVybiBBIT09TSYmYiE9PVQmJkU9PT1EPyExOihtJiYobC5zdWJWZWN0b3JzKGguc3RhcnQsZi5zdGFydCksbC5kb3QoYSk+MD9tLnN0YXJ0LmNvcHkoaC5zdGFydCk6bS5zdGFydC5jb3B5KGYuc3RhcnQpLGwuc3ViVmVjdG9ycyhoLmVuZCxmLmVuZCksbC5kb3QoYSk8MD9tLmVuZC5jb3B5KGguZW5kKTptLmVuZC5jb3B5KGYuZW5kKSksITApfX19KCksWm4ucHJvdG90eXBlLmRpc3RhbmNlVG9Qb2ludD1mdW5jdGlvbigpe2NvbnN0IHI9bmV3IEk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoZSxyKSxlLmRpc3RhbmNlVG8ocil9fSgpLFpuLnByb3RvdHlwZS5kaXN0YW5jZVRvVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCByPW5ldyBJLHQ9bmV3IEksZT1bImEiLCJiIiwiYyJdLG49bmV3IEZuLGk9bmV3IEZuO3JldHVybiBmdW5jdGlvbihvLGE9bnVsbCxjPW51bGwpe2NvbnN0IGw9YXx8Yz9uOm51bGw7aWYodGhpcy5pbnRlcnNlY3RzVHJpYW5nbGUobyxsKSlyZXR1cm4oYXx8YykmJihhJiZsLmdldENlbnRlcihhKSxjJiZsLmdldENlbnRlcihjKSksMDtsZXQgdT0xLzA7Zm9yKGxldCBoPTA7aDwzO2grKyl7bGV0IGY7Y29uc3QgZD1lW2hdLHA9b1tkXTt0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocCxyKSxmPXAuZGlzdGFuY2VUb1NxdWFyZWQociksZjx1JiYodT1mLGEmJmEuY29weShyKSxjJiZjLmNvcHkocCkpO2NvbnN0IHg9dGhpc1tkXTtvLmNsb3Nlc3RQb2ludFRvUG9pbnQoeCxyKSxmPXguZGlzdGFuY2VUb1NxdWFyZWQociksZjx1JiYodT1mLGEmJmEuY29weSh4KSxjJiZjLmNvcHkocikpfWZvcihsZXQgaD0wO2g8MztoKyspe2NvbnN0IGY9ZVtoXSxkPWVbKGgrMSklM107bi5zZXQodGhpc1tmXSx0aGlzW2RdKTtmb3IobGV0IHA9MDtwPDM7cCsrKXtjb25zdCB4PWVbcF0sZz1lWyhwKzEpJTNdO2kuc2V0KG9beF0sb1tnXSksUGQobixpLHIsdCk7Y29uc3QgbT1yLmRpc3RhbmNlVG9TcXVhcmVkKHQpO208dSYmKHU9bSxhJiZhLmNvcHkociksYyYmYy5jb3B5KHQpKX19cmV0dXJuIE1hdGguc3FydCh1KX19KCk7Y2xhc3MgbG57Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuaXNPcmllbnRlZEJveD0hMCx0aGlzLm1pbj1uZXcgSSx0aGlzLm1heD1uZXcgSSx0aGlzLm1hdHJpeD1uZXcgQ3QsdGhpcy5pbnZNYXRyaXg9bmV3IEN0LHRoaXMucG9pbnRzPW5ldyBBcnJheSg4KS5maWxsKCkubWFwKCgpPT5uZXcgSSksdGhpcy5zYXRBeGVzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgSSksdGhpcy5zYXRCb3VuZHM9bmV3IEFycmF5KDMpLmZpbGwoKS5tYXAoKCk9Pm5ldyAkaSksdGhpcy5hbGlnbmVkU2F0Qm91bmRzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgJGkpLHRoaXMubmVlZHNVcGRhdGU9ITEsdCYmdGhpcy5taW4uY29weSh0KSxlJiZ0aGlzLm1heC5jb3B5KGUpLG4mJnRoaXMubWF0cml4LmNvcHkobil9c2V0KHQsZSxuKXt0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpcy5tYXRyaXguY29weShuKSx0aGlzLm5lZWRzVXBkYXRlPSEwfWNvcHkodCl7dGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5uZWVkc1VwZGF0ZT0hMH19bG4ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5tYXRyaXgsZT10aGlzLm1pbixuPXRoaXMubWF4LGk9dGhpcy5wb2ludHM7Zm9yKGxldCBsPTA7bDw9MTtsKyspZm9yKGxldCB1PTA7dTw9MTt1KyspZm9yKGxldCBoPTA7aDw9MTtoKyspe2NvbnN0IGY9MSpsfDIqdXw0KmgsZD1pW2ZdO2QueD1sP24ueDplLngsZC55PXU/bi55OmUueSxkLno9aD9uLno6ZS56LGQuYXBwbHlNYXRyaXg0KHQpfWNvbnN0IHM9dGhpcy5zYXRCb3VuZHMsbz10aGlzLnNhdEF4ZXMsYT1pWzBdO2ZvcihsZXQgbD0wO2w8MztsKyspe2NvbnN0IHU9b1tsXSxoPXNbbF0sZj0xPDxsLGQ9aVtmXTt1LnN1YlZlY3RvcnMoYSxkKSxoLnNldEZyb21Qb2ludHModSxpKX1jb25zdCBjPXRoaXMuYWxpZ25lZFNhdEJvdW5kcztjWzBdLnNldEZyb21Qb2ludHNGaWVsZChpLCJ4IiksY1sxXS5zZXRGcm9tUG9pbnRzRmllbGQoaSwieSIpLGNbMl0uc2V0RnJvbVBvaW50c0ZpZWxkKGksInoiKSx0aGlzLmludk1hdHJpeC5jb3B5KHRoaXMubWF0cml4KS5pbnZlcnQoKSx0aGlzLm5lZWRzVXBkYXRlPSExfX0oKSxsbi5wcm90b3R5cGUuaW50ZXJzZWN0c0JveD1mdW5jdGlvbigpe2NvbnN0IHI9bmV3ICRpO3JldHVybiBmdW5jdGlvbihlKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpO2NvbnN0IG49ZS5taW4saT1lLm1heCxzPXRoaXMuc2F0Qm91bmRzLG89dGhpcy5zYXRBeGVzLGE9dGhpcy5hbGlnbmVkU2F0Qm91bmRzO2lmKHIubWluPW4ueCxyLm1heD1pLngsYVswXS5pc1NlcGFyYXRlZChyKXx8KHIubWluPW4ueSxyLm1heD1pLnksYVsxXS5pc1NlcGFyYXRlZChyKSl8fChyLm1pbj1uLnosci5tYXg9aS56LGFbMl0uaXNTZXBhcmF0ZWQocikpKXJldHVybiExO2ZvcihsZXQgYz0wO2M8MztjKyspe2NvbnN0IGw9b1tjXSx1PXNbY107aWYoci5zZXRGcm9tQm94KGwsZSksdS5pc1NlcGFyYXRlZChyKSlyZXR1cm4hMX1yZXR1cm4hMH19KCksbG4ucHJvdG90eXBlLmludGVyc2VjdHNUcmlhbmdsZT1mdW5jdGlvbigpe2NvbnN0IHI9bmV3IFpuLHQ9bmV3IEFycmF5KDMpLGU9bmV3ICRpLG49bmV3ICRpLGk9bmV3IEk7cmV0dXJuIGZ1bmN0aW9uKG8pe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksby5pc0V4dGVuZGVkVHJpYW5nbGU/by5uZWVkc1VwZGF0ZSYmby51cGRhdGUoKTooci5jb3B5KG8pLHIudXBkYXRlKCksbz1yKTtjb25zdCBhPXRoaXMuc2F0Qm91bmRzLGM9dGhpcy5zYXRBeGVzO3RbMF09by5hLHRbMV09by5iLHRbMl09by5jO2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9YVtmXSxwPWNbZl07aWYoZS5zZXRGcm9tUG9pbnRzKHAsdCksZC5pc1NlcGFyYXRlZChlKSlyZXR1cm4hMX1jb25zdCBsPW8uc2F0Qm91bmRzLHU9by5zYXRBeGVzLGg9dGhpcy5wb2ludHM7Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD1sW2ZdLHA9dVtmXTtpZihlLnNldEZyb21Qb2ludHMocCxoKSxkLmlzU2VwYXJhdGVkKGUpKXJldHVybiExfWZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9Y1tmXTtmb3IobGV0IHA9MDtwPDQ7cCsrKXtjb25zdCB4PXVbcF07aWYoaS5jcm9zc1ZlY3RvcnMoZCx4KSxlLnNldEZyb21Qb2ludHMoaSx0KSxuLnNldEZyb21Qb2ludHMoaSxoKSxlLmlzU2VwYXJhdGVkKG4pKXJldHVybiExfX1yZXR1cm4hMH19KCksbG4ucHJvdG90eXBlLmNsb3Nlc3RQb2ludFRvUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSxlLmNvcHkodCkuYXBwbHlNYXRyaXg0KHRoaXMuaW52TWF0cml4KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4KSxlfX0oKSxsbi5wcm90b3R5cGUuZGlzdGFuY2VUb1BvaW50PWZ1bmN0aW9uKCl7Y29uc3Qgcj1uZXcgSTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChlLHIpLGUuZGlzdGFuY2VUbyhyKX19KCksbG4ucHJvdG90eXBlLmRpc3RhbmNlVG9Cb3g9ZnVuY3Rpb24oKXtjb25zdCByPVsieCIsInkiLCJ6Il0sdD1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCk9Pm5ldyBGbiksZT1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCk9Pm5ldyBGbiksbj1uZXcgSSxpPW5ldyBJO3JldHVybiBmdW5jdGlvbihvLGE9MCxjPW51bGwsbD1udWxsKXtpZih0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLHRoaXMuaW50ZXJzZWN0c0JveChvKSlyZXR1cm4oY3x8bCkmJihvLmdldENlbnRlcihpKSx0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoaSxuKSxvLmNsb3Nlc3RQb2ludFRvUG9pbnQobixpKSxjJiZjLmNvcHkobiksbCYmbC5jb3B5KGkpKSwwO2NvbnN0IHU9YSphLGg9by5taW4sZj1vLm1heCxkPXRoaXMucG9pbnRzO2xldCBwPTEvMDtmb3IobGV0IGc9MDtnPDg7ZysrKXtjb25zdCBtPWRbZ107aS5jb3B5KG0pLmNsYW1wKGgsZik7Y29uc3Qgdj1tLmRpc3RhbmNlVG9TcXVhcmVkKGkpO2lmKHY8cCYmKHA9dixjJiZjLmNvcHkobSksbCYmbC5jb3B5KGkpLHY8dSkpcmV0dXJuIE1hdGguc3FydCh2KX1sZXQgeD0wO2ZvcihsZXQgZz0wO2c8MztnKyspZm9yKGxldCBtPTA7bTw9MTttKyspZm9yKGxldCB2PTA7djw9MTt2Kyspe2NvbnN0IHk9KGcrMSklMyxfPShnKzIpJTMsUz1tPDx5fHY8PF8sdz0xPDxnfG08PHl8djw8XyxBPWRbU10sVD1kW3ddO3RbeF0uc2V0KEEsVCk7Y29uc3QgTT1yW2ddLEU9clt5XSxEPXJbX10sTD1lW3hdLEY9TC5zdGFydCxOPUwuZW5kO0ZbTV09aFtNXSxGW0VdPW0/aFtFXTpmW0VdLEZbRF09dj9oW0RdOmZbRV0sTltNXT1mW01dLE5bRV09bT9oW0VdOmZbRV0sTltEXT12P2hbRF06ZltFXSx4Kyt9Zm9yKGxldCBnPTA7Zzw9MTtnKyspZm9yKGxldCBtPTA7bTw9MTttKyspZm9yKGxldCB2PTA7djw9MTt2Kyspe2kueD1nP2YueDpoLngsaS55PW0/Zi55OmgueSxpLno9dj9mLno6aC56LHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChpLG4pO2NvbnN0IHk9aS5kaXN0YW5jZVRvU3F1YXJlZChuKTtpZih5PHAmJihwPXksYyYmYy5jb3B5KG4pLGwmJmwuY29weShpKSx5PHUpKXJldHVybiBNYXRoLnNxcnQoeSl9Zm9yKGxldCBnPTA7ZzwxMjtnKyspe2NvbnN0IG09dFtnXTtmb3IobGV0IHY9MDt2PDEyO3YrKyl7Y29uc3QgeT1lW3ZdO1BkKG0seSxuLGkpO2NvbnN0IF89bi5kaXN0YW5jZVRvU3F1YXJlZChpKTtpZihfPHAmJihwPV8sYyYmYy5jb3B5KG4pLGwmJmwuY29weShpKSxfPHUpKXJldHVybiBNYXRoLnNxcnQoXyl9fXJldHVybiBNYXRoLnNxcnQocCl9fSgpO2NsYXNzIERke2NvbnN0cnVjdG9yKHQpe3RoaXMuX2dldE5ld1ByaW1pdGl2ZT10LHRoaXMuX3ByaW1pdGl2ZXM9W119Z2V0UHJpbWl0aXZlKCl7Y29uc3QgdD10aGlzLl9wcmltaXRpdmVzO3JldHVybiB0Lmxlbmd0aD09PTA/dGhpcy5fZ2V0TmV3UHJpbWl0aXZlKCk6dC5wb3AoKX1yZWxlYXNlUHJpbWl0aXZlKHQpe3RoaXMuX3ByaW1pdGl2ZXMucHVzaCh0KX19Y2xhc3MgQkUgZXh0ZW5kcyBEZHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCgpPT5uZXcgWm4pfX1jb25zdCBKbj1uZXcgQkU7Y2xhc3MgT0V7Y29uc3RydWN0b3IoKXt0aGlzLmZsb2F0MzJBcnJheT1udWxsLHRoaXMudWludDE2QXJyYXk9bnVsbCx0aGlzLnVpbnQzMkFycmF5PW51bGw7Y29uc3QgdD1bXTtsZXQgZT1udWxsO3RoaXMuc2V0QnVmZmVyPW49PntlJiZ0LnB1c2goZSksZT1uLHRoaXMuZmxvYXQzMkFycmF5PW5ldyBGbG9hdDMyQXJyYXkobiksdGhpcy51aW50MTZBcnJheT1uZXcgVWludDE2QXJyYXkobiksdGhpcy51aW50MzJBcnJheT1uZXcgVWludDMyQXJyYXkobil9LHRoaXMuY2xlYXJCdWZmZXI9KCk9PntlPW51bGwsdGhpcy5mbG9hdDMyQXJyYXk9bnVsbCx0aGlzLnVpbnQxNkFycmF5PW51bGwsdGhpcy51aW50MzJBcnJheT1udWxsLHQubGVuZ3RoIT09MCYmdGhpcy5zZXRCdWZmZXIodC5wb3AoKSl9fX1jb25zdCB2ZT1uZXcgT0U7bGV0IE1yLG9vO2NvbnN0IGFvPVtdLFN1PW5ldyBEZCgoKT0+bmV3IGxlKTtmdW5jdGlvbiB6RShyLHQsZSxuLGkscyl7TXI9U3UuZ2V0UHJpbWl0aXZlKCksb289U3UuZ2V0UHJpbWl0aXZlKCksYW8ucHVzaChNcixvbyksdmUuc2V0QnVmZmVyKHIuX3Jvb3RzW3RdKTtjb25zdCBvPVVkKDAsci5nZW9tZXRyeSxlLG4saSxzKTt2ZS5jbGVhckJ1ZmZlcigpLFN1LnJlbGVhc2VQcmltaXRpdmUoTXIpLFN1LnJlbGVhc2VQcmltaXRpdmUob28pLGFvLnBvcCgpLGFvLnBvcCgpO2NvbnN0IGE9YW8ubGVuZ3RoO3JldHVybiBhPjAmJihvbz1hb1thLTFdLE1yPWFvW2EtMl0pLG99ZnVuY3Rpb24gVWQocix0LGUsbixpPW51bGwscz0wLG89MCl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTpsfT12ZTtsZXQgdT1yKjI7aWYoYm4odSxjKSl7Y29uc3QgZj1CbihyLGwpLGQ9JG4odSxjKTtyZXR1cm4gRWUocixhLE1yKSxuKGYsZCwhMSxvLHMrcixNcil9ZWxzZXtsZXQgTT1mdW5jdGlvbihEKXtjb25zdHt1aW50MTZBcnJheTpMLHVpbnQzMkFycmF5OkZ9PXZlO2xldCBOPUQqMjtmb3IoOyFibihOLEwpOylEPXFuKEQpLE49RCoyO3JldHVybiBCbihELEYpfSxFPWZ1bmN0aW9uKEQpe2NvbnN0e3VpbnQxNkFycmF5OkwsdWludDMyQXJyYXk6Rn09dmU7bGV0IE49RCoyO2Zvcig7IWJuKE4sTCk7KUQ9WW4oRCxGKSxOPUQqMjtyZXR1cm4gQm4oRCxGKSskbihOLEwpfTtjb25zdCBmPXFuKHIpLGQ9WW4ocixsKTtsZXQgcD1mLHg9ZCxnLG0sdix5O2lmKGkmJih2PU1yLHk9b28sRWUocCxhLHYpLEVlKHgsYSx5KSxnPWkodiksbT1pKHkpLG08Zykpe3A9ZCx4PWY7Y29uc3QgRD1nO2c9bSxtPUQsdj15fXZ8fCh2PU1yLEVlKHAsYSx2KSk7Y29uc3QgXz1ibihwKjIsYyksUz1lKHYsXyxnLG8rMSxzK3ApO2xldCB3O2lmKFM9PT1PeCl7Y29uc3QgRD1NKHApLEY9RShwKS1EO3c9bihELEYsITAsbysxLHMrcCx2KX1lbHNlIHc9UyYmVWQocCx0LGUsbixpLHMsbysxKTtpZih3KXJldHVybiEwO3k9b28sRWUoeCxhLHkpO2NvbnN0IEE9Ym4oeCoyLGMpLFQ9ZSh5LEEsbSxvKzEscyt4KTtsZXQgYjtpZihUPT09T3gpe2NvbnN0IEQ9TSh4KSxGPUUoeCktRDtiPW4oRCxGLCEwLG8rMSxzK3gseSl9ZWxzZSBiPVQmJlVkKHgsdCxlLG4saSxzLG8rMSk7cmV0dXJuISFifX1jb25zdCBSYT1uZXcgSSxOZD1uZXcgSTtmdW5jdGlvbiBrRShyLHQsZT17fSxuPTAsaT0xLzApe2NvbnN0IHM9bipuLG89aSppO2xldCBhPTEvMCxjPW51bGw7aWYoci5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6dT0+KFJhLmNvcHkodCkuY2xhbXAodS5taW4sdS5tYXgpLFJhLmRpc3RhbmNlVG9TcXVhcmVkKHQpKSxpbnRlcnNlY3RzQm91bmRzOih1LGgsZik9PmY8YSYmZjxvLGludGVyc2VjdHNUcmlhbmdsZToodSxoKT0+e3UuY2xvc2VzdFBvaW50VG9Qb2ludCh0LFJhKTtjb25zdCBmPXQuZGlzdGFuY2VUb1NxdWFyZWQoUmEpO3JldHVybiBmPGEmJihOZC5jb3B5KFJhKSxhPWYsYz1oKSxmPHN9fSksYT09PTEvMClyZXR1cm4gbnVsbDtjb25zdCBsPU1hdGguc3FydChhKTtyZXR1cm4gZS5wb2ludD9lLnBvaW50LmNvcHkoTmQpOmUucG9pbnQ9TmQuY2xvbmUoKSxlLmRpc3RhbmNlPWwsZS5mYWNlSW5kZXg9YyxlfWNvbnN0IFZFPXBhcnNlSW50KHRlKT49MTY5LHNzPW5ldyBJLG9zPW5ldyBJLGFzPW5ldyBJLGJ1PW5ldyBxLHd1PW5ldyBxLEF1PW5ldyBxLFl4PW5ldyBJLFp4PW5ldyBJLEp4PW5ldyBJLElhPW5ldyBJO2Z1bmN0aW9uIEdFKHIsdCxlLG4saSxzLG8sYSl7bGV0IGM7aWYocz09PVllP2M9ci5pbnRlcnNlY3RUcmlhbmdsZShuLGUsdCwhMCxpKTpjPXIuaW50ZXJzZWN0VHJpYW5nbGUodCxlLG4scyE9PVBuLGkpLGM9PT1udWxsKXJldHVybiBudWxsO2NvbnN0IGw9ci5vcmlnaW4uZGlzdGFuY2VUbyhpKTtyZXR1cm4gbDxvfHxsPmE/bnVsbDp7ZGlzdGFuY2U6bCxwb2ludDppLmNsb25lKCl9fWZ1bmN0aW9uIEhFKHIsdCxlLG4saSxzLG8sYSxjLGwsdSl7c3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LHMpLG9zLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxvKSxhcy5mcm9tQnVmZmVyQXR0cmlidXRlKHQsYSk7Y29uc3QgaD1HRShyLHNzLG9zLGFzLElhLGMsbCx1KTtpZihoKXtjb25zdCBmPW5ldyBJO2dlLmdldEJhcnljb29yZChJYSxzcyxvcyxhcyxmKSxuJiYoYnUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHMpLHd1LmZyb21CdWZmZXJBdHRyaWJ1dGUobixvKSxBdS5mcm9tQnVmZmVyQXR0cmlidXRlKG4sYSksaC51dj1nZS5nZXRJbnRlcnBvbGF0aW9uKElhLHNzLG9zLGFzLGJ1LHd1LEF1LG5ldyBxKSksaSYmKGJ1LmZyb21CdWZmZXJBdHRyaWJ1dGUoaSxzKSx3dS5mcm9tQnVmZmVyQXR0cmlidXRlKGksbyksQXUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLGEpLGgudXYxPWdlLmdldEludGVycG9sYXRpb24oSWEsc3Msb3MsYXMsYnUsd3UsQXUsbmV3IHEpKSxlJiYoWXguZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHMpLFp4LmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxvKSxKeC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsYSksaC5ub3JtYWw9Z2UuZ2V0SW50ZXJwb2xhdGlvbihJYSxzcyxvcyxhcyxZeCxaeCxKeCxuZXcgSSksaC5ub3JtYWwuZG90KHIuZGlyZWN0aW9uKT4wJiZoLm5vcm1hbC5tdWx0aXBseVNjYWxhcigtMSkpO2NvbnN0IGQ9e2E6cyxiOm8sYzphLG5vcm1hbDpuZXcgSSxtYXRlcmlhbEluZGV4OjB9O2dlLmdldE5vcm1hbChzcyxvcyxhcyxkLm5vcm1hbCksaC5mYWNlPWQsaC5mYWNlSW5kZXg9cyxWRSYmKGguYmFyeWNvb3JkPWYpfXJldHVybiBofWZ1bmN0aW9uIFR1KHIsdCxlLG4saSxzLG8pe2NvbnN0IGE9biozO2xldCBjPWErMCxsPWErMSx1PWErMjtjb25zdCBoPXIuaW5kZXg7ci5pbmRleCYmKGM9aC5nZXRYKGMpLGw9aC5nZXRYKGwpLHU9aC5nZXRYKHUpKTtjb25zdHtwb3NpdGlvbjpmLG5vcm1hbDpkLHV2OnAsdXYxOnh9PXIuYXR0cmlidXRlcyxnPUhFKGUsZixkLHAseCxjLGwsdSx0LHMsbyk7cmV0dXJuIGc/KGcuZmFjZUluZGV4PW4saSYmaS5wdXNoKGcpLGcpOm51bGx9ZnVuY3Rpb24gQmUocix0LGUsbil7Y29uc3QgaT1yLmEscz1yLmIsbz1yLmM7bGV0IGE9dCxjPXQrMSxsPXQrMjtlJiYoYT1lLmdldFgoYSksYz1lLmdldFgoYyksbD1lLmdldFgobCkpLGkueD1uLmdldFgoYSksaS55PW4uZ2V0WShhKSxpLno9bi5nZXRaKGEpLHMueD1uLmdldFgoYykscy55PW4uZ2V0WShjKSxzLno9bi5nZXRaKGMpLG8ueD1uLmdldFgobCksby55PW4uZ2V0WShsKSxvLno9bi5nZXRaKGwpfWZ1bmN0aW9uIFdFKHIsdCxlLG4saSxzLG8sYSl7Y29uc3R7Z2VvbWV0cnk6YyxfaW5kaXJlY3RCdWZmZXI6bH09cjtmb3IobGV0IHU9bixoPW4raTt1PGg7dSsrKVR1KGMsdCxlLHUscyxvLGEpfWZ1bmN0aW9uIFhFKHIsdCxlLG4saSxzLG8pe2NvbnN0e2dlb21ldHJ5OmEsX2luZGlyZWN0QnVmZmVyOmN9PXI7bGV0IGw9MS8wLHU9bnVsbDtmb3IobGV0IGg9bixmPW4raTtoPGY7aCsrKXtsZXQgZDtkPVR1KGEsdCxlLGgsbnVsbCxzLG8pLGQmJmQuZGlzdGFuY2U8bCYmKHU9ZCxsPWQuZGlzdGFuY2UpfXJldHVybiB1fWZ1bmN0aW9uICRFKHIsdCxlLG4saSxzLG8pe2NvbnN0e2dlb21ldHJ5OmF9PWUse2luZGV4OmN9PWEsbD1hLmF0dHJpYnV0ZXMucG9zaXRpb247Zm9yKGxldCB1PXIsaD10K3I7dTxoO3UrKyl7bGV0IGY7aWYoZj11LEJlKG8sZiozLGMsbCksby5uZWVkc1VwZGF0ZT0hMCxuKG8sZixpLHMpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIHFFKHIsdD1udWxsKXt0JiZBcnJheS5pc0FycmF5KHQpJiYodD1uZXcgU2V0KHQpKTtjb25zdCBlPXIuZ2VvbWV0cnksbj1lLmluZGV4P2UuaW5kZXguYXJyYXk6bnVsbCxpPWUuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgcyxvLGEsYyxsPTA7Y29uc3QgdT1yLl9yb290cztmb3IobGV0IGY9MCxkPXUubGVuZ3RoO2Y8ZDtmKyspcz11W2ZdLG89bmV3IFVpbnQzMkFycmF5KHMpLGE9bmV3IFVpbnQxNkFycmF5KHMpLGM9bmV3IEZsb2F0MzJBcnJheShzKSxoKDAsbCksbCs9cy5ieXRlTGVuZ3RoO2Z1bmN0aW9uIGgoZixkLHA9ITEpe2NvbnN0IHg9ZioyO2lmKGFbeCsxNV09PT1fdSl7Y29uc3QgbT1vW2YrNl0sdj1hW3grMTRdO2xldCB5PTEvMCxfPTEvMCxTPTEvMCx3PS0xLzAsQT0tMS8wLFQ9LTEvMDtmb3IobGV0IGI9MyptLE09MyoobSt2KTtiPE07YisrKXtsZXQgRT1uW2JdO2NvbnN0IEQ9aS5nZXRYKEUpLEw9aS5nZXRZKEUpLEY9aS5nZXRaKEUpO0Q8eSYmKHk9RCksRD53JiYodz1EKSxMPF8mJihfPUwpLEw+QSYmKEE9TCksRjxTJiYoUz1GKSxGPlQmJihUPUYpfXJldHVybiBjW2YrMF0hPT15fHxjW2YrMV0hPT1ffHxjW2YrMl0hPT1TfHxjW2YrM10hPT13fHxjW2YrNF0hPT1BfHxjW2YrNV0hPT1UPyhjW2YrMF09eSxjW2YrMV09XyxjW2YrMl09UyxjW2YrM109dyxjW2YrNF09QSxjW2YrNV09VCwhMCk6ITF9ZWxzZXtjb25zdCBtPWYrOCx2PW9bZis2XSx5PW0rZCxfPXYrZDtsZXQgUz1wLHc9ITEsQT0hMTt0P1N8fCh3PXQuaGFzKHkpLEE9dC5oYXMoXyksUz0hdyYmIUEpOih3PSEwLEE9ITApO2NvbnN0IFQ9U3x8dyxiPVN8fEE7bGV0IE09ITE7VCYmKE09aChtLGQsUykpO2xldCBFPSExO2ImJihFPWgodixkLFMpKTtjb25zdCBEPU18fEU7aWYoRClmb3IobGV0IEw9MDtMPDM7TCsrKXtjb25zdCBGPW0rTCxOPXYrTCxPPWNbRl0sSD1jW0YrM10sej1jW05dLFE9Y1tOKzNdO2NbZitMXT1PPHo/Tzp6LGNbZitMKzNdPUg+UT9IOlF9cmV0dXJuIER9fX1mdW5jdGlvbiBTcihyLHQsZSxuLGkpe2xldCBzLG8sYSxjLGwsdTtjb25zdCBoPTEvZS5kaXJlY3Rpb24ueCxmPTEvZS5kaXJlY3Rpb24ueSxkPTEvZS5kaXJlY3Rpb24ueixwPWUub3JpZ2luLngseD1lLm9yaWdpbi55LGc9ZS5vcmlnaW4uejtsZXQgbT10W3JdLHY9dFtyKzNdLHk9dFtyKzFdLF89dFtyKzMrMV0sUz10W3IrMl0sdz10W3IrMysyXTtyZXR1cm4gaD49MD8ocz0obS1wKSpoLG89KHYtcCkqaCk6KHM9KHYtcCkqaCxvPShtLXApKmgpLGY+PTA/KGE9KHkteCkqZixjPShfLXgpKmYpOihhPShfLXgpKmYsYz0oeS14KSpmKSxzPmN8fGE+b3x8KChhPnN8fGlzTmFOKHMpKSYmKHM9YSksKGM8b3x8aXNOYU4obykpJiYobz1jKSxkPj0wPyhsPShTLWcpKmQsdT0ody1nKSpkKToobD0ody1nKSpkLHU9KFMtZykqZCkscz51fHxsPm8pPyExOigobD5zfHxzIT09cykmJihzPWwpLCh1PG98fG8hPT1vKSYmKG89dSksczw9aSYmbz49bil9ZnVuY3Rpb24gWUUocix0LGUsbixpLHMsbyxhKXtjb25zdHtnZW9tZXRyeTpjLF9pbmRpcmVjdEJ1ZmZlcjpsfT1yO2ZvcihsZXQgdT1uLGg9bitpO3U8aDt1Kyspe2xldCBmPWw/bFt1XTp1O1R1KGMsdCxlLGYscyxvLGEpfX1mdW5jdGlvbiBaRShyLHQsZSxuLGkscyxvKXtjb25zdHtnZW9tZXRyeTphLF9pbmRpcmVjdEJ1ZmZlcjpjfT1yO2xldCBsPTEvMCx1PW51bGw7Zm9yKGxldCBoPW4sZj1uK2k7aDxmO2grKyl7bGV0IGQ7ZD1UdShhLHQsZSxjP2NbaF06aCxudWxsLHMsbyksZCYmZC5kaXN0YW5jZTxsJiYodT1kLGw9ZC5kaXN0YW5jZSl9cmV0dXJuIHV9ZnVuY3Rpb24gSkUocix0LGUsbixpLHMsbyl7Y29uc3R7Z2VvbWV0cnk6YX09ZSx7aW5kZXg6Y309YSxsPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IHU9cixoPXQrcjt1PGg7dSsrKXtsZXQgZjtpZihmPWUucmVzb2x2ZVRyaWFuZ2xlSW5kZXgodSksQmUobyxmKjMsYyxsKSxvLm5lZWRzVXBkYXRlPSEwLG4obyxmLGkscykpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gS0Uocix0LGUsbixpLHMsbyl7dmUuc2V0QnVmZmVyKHIuX3Jvb3RzW3RdKSxGZCgwLHIsZSxuLGkscyxvKSx2ZS5jbGVhckJ1ZmZlcigpfWZ1bmN0aW9uIEZkKHIsdCxlLG4saSxzLG8pe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6bH09dmUsdT1yKjI7aWYoYm4odSxjKSl7Y29uc3QgZj1CbihyLGwpLGQ9JG4odSxjKTtXRSh0LGUsbixmLGQsaSxzLG8pfWVsc2V7Y29uc3QgZj1xbihyKTtTcihmLGEsbixzLG8pJiZGZChmLHQsZSxuLGkscyxvKTtjb25zdCBkPVluKHIsbCk7U3IoZCxhLG4scyxvKSYmRmQoZCx0LGUsbixpLHMsbyl9fWNvbnN0IGpFPVsieCIsInkiLCJ6Il07ZnVuY3Rpb24gUUUocix0LGUsbixpLHMpe3ZlLnNldEJ1ZmZlcihyLl9yb290c1t0XSk7Y29uc3Qgbz1CZCgwLHIsZSxuLGkscyk7cmV0dXJuIHZlLmNsZWFyQnVmZmVyKCksb31mdW5jdGlvbiBCZChyLHQsZSxuLGkscyl7Y29uc3R7ZmxvYXQzMkFycmF5Om8sdWludDE2QXJyYXk6YSx1aW50MzJBcnJheTpjfT12ZTtsZXQgbD1yKjI7aWYoYm4obCxhKSl7Y29uc3QgaD1CbihyLGMpLGY9JG4obCxhKTtyZXR1cm4gWEUodCxlLG4saCxmLGkscyl9ZWxzZXtjb25zdCBoPVh4KHIsYyksZj1qRVtoXSxwPW4uZGlyZWN0aW9uW2ZdPj0wO2xldCB4LGc7cD8oeD1xbihyKSxnPVluKHIsYykpOih4PVluKHIsYyksZz1xbihyKSk7Y29uc3Qgdj1Tcih4LG8sbixpLHMpP0JkKHgsdCxlLG4saSxzKTpudWxsO2lmKHYpe2NvbnN0IFM9di5wb2ludFtmXTtpZihwP1M8PW9bZytoXTpTPj1vW2craCszXSlyZXR1cm4gdn1jb25zdCBfPVNyKGcsbyxuLGkscyk/QmQoZyx0LGUsbixpLHMpOm51bGw7cmV0dXJuIHYmJl8/di5kaXN0YW5jZTw9Xy5kaXN0YW5jZT92Ol86dnx8X3x8bnVsbH19Y29uc3QgRXU9bmV3IGxlLGNvPW5ldyBabixsbz1uZXcgWm4sUGE9bmV3IEN0LEt4PW5ldyBsbixDdT1uZXcgbG47ZnVuY3Rpb24gdEMocix0LGUsbil7dmUuc2V0QnVmZmVyKHIuX3Jvb3RzW3RdKTtjb25zdCBpPU9kKDAscixlLG4pO3JldHVybiB2ZS5jbGVhckJ1ZmZlcigpLGl9ZnVuY3Rpb24gT2Qocix0LGUsbixpPW51bGwpe2NvbnN0e2Zsb2F0MzJBcnJheTpzLHVpbnQxNkFycmF5Om8sdWludDMyQXJyYXk6YX09dmU7bGV0IGM9cioyO2lmKGk9PT1udWxsJiYoZS5ib3VuZGluZ0JveHx8ZS5jb21wdXRlQm91bmRpbmdCb3goKSxLeC5zZXQoZS5ib3VuZGluZ0JveC5taW4sZS5ib3VuZGluZ0JveC5tYXgsbiksaT1LeCksYm4oYyxvKSl7Y29uc3QgdT10Lmdlb21ldHJ5LGg9dS5pbmRleCxmPXUuYXR0cmlidXRlcy5wb3NpdGlvbixkPWUuaW5kZXgscD1lLmF0dHJpYnV0ZXMucG9zaXRpb24seD1CbihyLGEpLGc9JG4oYyxvKTtpZihQYS5jb3B5KG4pLmludmVydCgpLGUuYm91bmRzVHJlZSlyZXR1cm4gRWUocixzLEN1KSxDdS5tYXRyaXguY29weShQYSksQ3UubmVlZHNVcGRhdGU9ITAsZS5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczp2PT5DdS5pbnRlcnNlY3RzQm94KHYpLGludGVyc2VjdHNUcmlhbmdsZTp2PT57di5hLmFwcGx5TWF0cml4NChuKSx2LmIuYXBwbHlNYXRyaXg0KG4pLHYuYy5hcHBseU1hdHJpeDQobiksdi5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHk9eCozLF89KGcreCkqMzt5PF87eSs9MylpZihCZShsbyx5LGgsZiksbG8ubmVlZHNVcGRhdGU9ITAsdi5pbnRlcnNlY3RzVHJpYW5nbGUobG8pKXJldHVybiEwO3JldHVybiExfX0pO2ZvcihsZXQgbT14KjMsdj0oZyt4KSozO208djttKz0zKXtCZShjbyxtLGgsZiksY28uYS5hcHBseU1hdHJpeDQoUGEpLGNvLmIuYXBwbHlNYXRyaXg0KFBhKSxjby5jLmFwcGx5TWF0cml4NChQYSksY28ubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB5PTAsXz1kLmNvdW50O3k8Xzt5Kz0zKWlmKEJlKGxvLHksZCxwKSxsby5uZWVkc1VwZGF0ZT0hMCxjby5pbnRlcnNlY3RzVHJpYW5nbGUobG8pKXJldHVybiEwfX1lbHNle2NvbnN0IHU9cis4LGg9YVtyKzZdO3JldHVybiBFZSh1LHMsRXUpLCEhKGkuaW50ZXJzZWN0c0JveChFdSkmJk9kKHUsdCxlLG4saSl8fChFZShoLHMsRXUpLGkuaW50ZXJzZWN0c0JveChFdSkmJk9kKGgsdCxlLG4saSkpKX19Y29uc3QgUnU9bmV3IEN0LHpkPW5ldyBsbixMYT1uZXcgbG4sZUM9bmV3IEksbkM9bmV3IEksaUM9bmV3IEksckM9bmV3IEk7ZnVuY3Rpb24gc0Mocix0LGUsbj17fSxpPXt9LHM9MCxvPTEvMCl7dC5ib3VuZGluZ0JveHx8dC5jb21wdXRlQm91bmRpbmdCb3goKSx6ZC5zZXQodC5ib3VuZGluZ0JveC5taW4sdC5ib3VuZGluZ0JveC5tYXgsZSksemQubmVlZHNVcGRhdGU9ITA7Y29uc3QgYT1yLmdlb21ldHJ5LGM9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9YS5pbmRleCx1PXQuYXR0cmlidXRlcy5wb3NpdGlvbixoPXQuaW5kZXgsZj1Kbi5nZXRQcmltaXRpdmUoKSxkPUpuLmdldFByaW1pdGl2ZSgpO2xldCBwPWVDLHg9bkMsZz1udWxsLG09bnVsbDtpJiYoZz1pQyxtPXJDKTtsZXQgdj0xLzAseT1udWxsLF89bnVsbDtyZXR1cm4gUnUuY29weShlKS5pbnZlcnQoKSxMYS5tYXRyaXguY29weShSdSksci5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6Uz0+emQuZGlzdGFuY2VUb0JveChTKSxpbnRlcnNlY3RzQm91bmRzOihTLHcsQSk9PkE8diYmQTxvPyh3JiYoTGEubWluLmNvcHkoUy5taW4pLExhLm1heC5jb3B5KFMubWF4KSxMYS5uZWVkc1VwZGF0ZT0hMCksITApOiExLGludGVyc2VjdHNSYW5nZTooUyx3KT0+e2lmKHQuYm91bmRzVHJlZSlyZXR1cm4gdC5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpUPT5MYS5kaXN0YW5jZVRvQm94KFQpLGludGVyc2VjdHNCb3VuZHM6KFQsYixNKT0+TTx2JiZNPG8saW50ZXJzZWN0c1JhbmdlOihULGIpPT57Zm9yKGxldCBNPVQsRT1UK2I7TTxFO00rKyl7QmUoZCwzKk0saCx1KSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgRD1TLEw9Uyt3O0Q8TDtEKyspe0JlKGYsMypELGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBGPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxnKTtpZihGPHYmJih4LmNvcHkocCksbSYmbS5jb3B5KGcpLHY9Rix5PUQsXz1NKSxGPHMpcmV0dXJuITB9fX19KTt7Y29uc3QgQT1zbyh0KTtmb3IobGV0IFQ9MCxiPUE7VDxiO1QrKyl7QmUoZCwzKlQsaCx1KSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgTT1TLEU9Uyt3O008RTtNKyspe0JlKGYsMypNLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBEPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxnKTtpZihEPHYmJih4LmNvcHkocCksbSYmbS5jb3B5KGcpLHY9RCx5PU0sXz1UKSxEPHMpcmV0dXJuITB9fX19fSksSm4ucmVsZWFzZVByaW1pdGl2ZShmKSxKbi5yZWxlYXNlUHJpbWl0aXZlKGQpLHY9PT0xLzA/bnVsbDoobi5wb2ludD9uLnBvaW50LmNvcHkoeCk6bi5wb2ludD14LmNsb25lKCksbi5kaXN0YW5jZT12LG4uZmFjZUluZGV4PXksaSYmKGkucG9pbnQ/aS5wb2ludC5jb3B5KG0pOmkucG9pbnQ9bS5jbG9uZSgpLGkucG9pbnQuYXBwbHlNYXRyaXg0KFJ1KSx4LmFwcGx5TWF0cml4NChSdSksaS5kaXN0YW5jZT14LnN1YihpLnBvaW50KS5sZW5ndGgoKSxpLmZhY2VJbmRleD1fKSxuKX1mdW5jdGlvbiBvQyhyLHQ9bnVsbCl7dCYmQXJyYXkuaXNBcnJheSh0KSYmKHQ9bmV3IFNldCh0KSk7Y29uc3QgZT1yLmdlb21ldHJ5LG49ZS5pbmRleD9lLmluZGV4LmFycmF5Om51bGwsaT1lLmF0dHJpYnV0ZXMucG9zaXRpb247bGV0IHMsbyxhLGMsbD0wO2NvbnN0IHU9ci5fcm9vdHM7Zm9yKGxldCBmPTAsZD11Lmxlbmd0aDtmPGQ7ZisrKXM9dVtmXSxvPW5ldyBVaW50MzJBcnJheShzKSxhPW5ldyBVaW50MTZBcnJheShzKSxjPW5ldyBGbG9hdDMyQXJyYXkocyksaCgwLGwpLGwrPXMuYnl0ZUxlbmd0aDtmdW5jdGlvbiBoKGYsZCxwPSExKXtjb25zdCB4PWYqMjtpZihhW3grMTVdPT09X3Upe2NvbnN0IG09b1tmKzZdLHY9YVt4KzE0XTtsZXQgeT0xLzAsXz0xLzAsUz0xLzAsdz0tMS8wLEE9LTEvMCxUPS0xLzA7Zm9yKGxldCBiPW0sTT1tK3Y7YjxNO2IrKyl7Y29uc3QgRT0zKnIucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoYik7Zm9yKGxldCBEPTA7RDwzO0QrKyl7bGV0IEw9RStEO0w9bj9uW0xdOkw7Y29uc3QgRj1pLmdldFgoTCksTj1pLmdldFkoTCksTz1pLmdldFooTCk7Rjx5JiYoeT1GKSxGPncmJih3PUYpLE48XyYmKF89TiksTj5BJiYoQT1OKSxPPFMmJihTPU8pLE8+VCYmKFQ9Tyl9fXJldHVybiBjW2YrMF0hPT15fHxjW2YrMV0hPT1ffHxjW2YrMl0hPT1TfHxjW2YrM10hPT13fHxjW2YrNF0hPT1BfHxjW2YrNV0hPT1UPyhjW2YrMF09eSxjW2YrMV09XyxjW2YrMl09UyxjW2YrM109dyxjW2YrNF09QSxjW2YrNV09VCwhMCk6ITF9ZWxzZXtjb25zdCBtPWYrOCx2PW9bZis2XSx5PW0rZCxfPXYrZDtsZXQgUz1wLHc9ITEsQT0hMTt0P1N8fCh3PXQuaGFzKHkpLEE9dC5oYXMoXyksUz0hdyYmIUEpOih3PSEwLEE9ITApO2NvbnN0IFQ9U3x8dyxiPVN8fEE7bGV0IE09ITE7VCYmKE09aChtLGQsUykpO2xldCBFPSExO2ImJihFPWgodixkLFMpKTtjb25zdCBEPU18fEU7aWYoRClmb3IobGV0IEw9MDtMPDM7TCsrKXtjb25zdCBGPW0rTCxOPXYrTCxPPWNbRl0sSD1jW0YrM10sej1jW05dLFE9Y1tOKzNdO2NbZitMXT1PPHo/Tzp6LGNbZitMKzNdPUg+UT9IOlF9cmV0dXJuIER9fX1mdW5jdGlvbiBhQyhyLHQsZSxuLGkscyxvKXt2ZS5zZXRCdWZmZXIoci5fcm9vdHNbdF0pLGtkKDAscixlLG4saSxzLG8pLHZlLmNsZWFyQnVmZmVyKCl9ZnVuY3Rpb24ga2Qocix0LGUsbixpLHMsbyl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTpsfT12ZSx1PXIqMjtpZihibih1LGMpKXtjb25zdCBmPUJuKHIsbCksZD0kbih1LGMpO1lFKHQsZSxuLGYsZCxpLHMsbyl9ZWxzZXtjb25zdCBmPXFuKHIpO1NyKGYsYSxuLHMsbykmJmtkKGYsdCxlLG4saSxzLG8pO2NvbnN0IGQ9WW4ocixsKTtTcihkLGEsbixzLG8pJiZrZChkLHQsZSxuLGkscyxvKX19Y29uc3QgY0M9WyJ4IiwieSIsInoiXTtmdW5jdGlvbiBsQyhyLHQsZSxuLGkscyl7dmUuc2V0QnVmZmVyKHIuX3Jvb3RzW3RdKTtjb25zdCBvPVZkKDAscixlLG4saSxzKTtyZXR1cm4gdmUuY2xlYXJCdWZmZXIoKSxvfWZ1bmN0aW9uIFZkKHIsdCxlLG4saSxzKXtjb25zdHtmbG9hdDMyQXJyYXk6byx1aW50MTZBcnJheTphLHVpbnQzMkFycmF5OmN9PXZlO2xldCBsPXIqMjtpZihibihsLGEpKXtjb25zdCBoPUJuKHIsYyksZj0kbihsLGEpO3JldHVybiBaRSh0LGUsbixoLGYsaSxzKX1lbHNle2NvbnN0IGg9WHgocixjKSxmPWNDW2hdLHA9bi5kaXJlY3Rpb25bZl0+PTA7bGV0IHgsZztwPyh4PXFuKHIpLGc9WW4ocixjKSk6KHg9WW4ocixjKSxnPXFuKHIpKTtjb25zdCB2PVNyKHgsbyxuLGkscyk/VmQoeCx0LGUsbixpLHMpOm51bGw7aWYodil7Y29uc3QgUz12LnBvaW50W2ZdO2lmKHA/Uzw9b1tnK2hdOlM+PW9bZytoKzNdKXJldHVybiB2fWNvbnN0IF89U3IoZyxvLG4saSxzKT9WZChnLHQsZSxuLGkscyk6bnVsbDtyZXR1cm4gdiYmXz92LmRpc3RhbmNlPD1fLmRpc3RhbmNlP3Y6Xzp2fHxffHxudWxsfX1jb25zdCBJdT1uZXcgbGUsdW89bmV3IFpuLGhvPW5ldyBabixEYT1uZXcgQ3Qsang9bmV3IGxuLFB1PW5ldyBsbjtmdW5jdGlvbiB1QyhyLHQsZSxuKXt2ZS5zZXRCdWZmZXIoci5fcm9vdHNbdF0pO2NvbnN0IGk9R2QoMCxyLGUsbik7cmV0dXJuIHZlLmNsZWFyQnVmZmVyKCksaX1mdW5jdGlvbiBHZChyLHQsZSxuLGk9bnVsbCl7Y29uc3R7ZmxvYXQzMkFycmF5OnMsdWludDE2QXJyYXk6byx1aW50MzJBcnJheTphfT12ZTtsZXQgYz1yKjI7aWYoaT09PW51bGwmJihlLmJvdW5kaW5nQm94fHxlLmNvbXB1dGVCb3VuZGluZ0JveCgpLGp4LnNldChlLmJvdW5kaW5nQm94Lm1pbixlLmJvdW5kaW5nQm94Lm1heCxuKSxpPWp4KSxibihjLG8pKXtjb25zdCB1PXQuZ2VvbWV0cnksaD11LmluZGV4LGY9dS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGQ9ZS5pbmRleCxwPWUuYXR0cmlidXRlcy5wb3NpdGlvbix4PUJuKHIsYSksZz0kbihjLG8pO2lmKERhLmNvcHkobikuaW52ZXJ0KCksZS5ib3VuZHNUcmVlKXJldHVybiBFZShyLHMsUHUpLFB1Lm1hdHJpeC5jb3B5KERhKSxQdS5uZWVkc1VwZGF0ZT0hMCxlLmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOnY9PlB1LmludGVyc2VjdHNCb3godiksaW50ZXJzZWN0c1RyaWFuZ2xlOnY9Pnt2LmEuYXBwbHlNYXRyaXg0KG4pLHYuYi5hcHBseU1hdHJpeDQobiksdi5jLmFwcGx5TWF0cml4NChuKSx2Lm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgeT14LF89Zyt4O3k8Xzt5KyspaWYoQmUoaG8sMyp0LnJlc29sdmVUcmlhbmdsZUluZGV4KHkpLGgsZiksaG8ubmVlZHNVcGRhdGU9ITAsdi5pbnRlcnNlY3RzVHJpYW5nbGUoaG8pKXJldHVybiEwO3JldHVybiExfX0pO2ZvcihsZXQgbT14LHY9Zyt4O208djttKyspe2NvbnN0IHk9dC5yZXNvbHZlVHJpYW5nbGVJbmRleChtKTtCZSh1bywzKnksaCxmKSx1by5hLmFwcGx5TWF0cml4NChEYSksdW8uYi5hcHBseU1hdHJpeDQoRGEpLHVvLmMuYXBwbHlNYXRyaXg0KERhKSx1by5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IF89MCxTPWQuY291bnQ7XzxTO18rPTMpaWYoQmUoaG8sXyxkLHApLGhvLm5lZWRzVXBkYXRlPSEwLHVvLmludGVyc2VjdHNUcmlhbmdsZShobykpcmV0dXJuITB9fWVsc2V7Y29uc3QgdT1yKzgsaD1hW3IrNl07cmV0dXJuIEVlKHUscyxJdSksISEoaS5pbnRlcnNlY3RzQm94KEl1KSYmR2QodSx0LGUsbixpKXx8KEVlKGgscyxJdSksaS5pbnRlcnNlY3RzQm94KEl1KSYmR2QoaCx0LGUsbixpKSkpfX1jb25zdCBMdT1uZXcgQ3QsSGQ9bmV3IGxuLFVhPW5ldyBsbixoQz1uZXcgSSxmQz1uZXcgSSxkQz1uZXcgSSxwQz1uZXcgSTtmdW5jdGlvbiBtQyhyLHQsZSxuPXt9LGk9e30scz0wLG89MS8wKXt0LmJvdW5kaW5nQm94fHx0LmNvbXB1dGVCb3VuZGluZ0JveCgpLEhkLnNldCh0LmJvdW5kaW5nQm94Lm1pbix0LmJvdW5kaW5nQm94Lm1heCxlKSxIZC5uZWVkc1VwZGF0ZT0hMDtjb25zdCBhPXIuZ2VvbWV0cnksYz1hLmF0dHJpYnV0ZXMucG9zaXRpb24sbD1hLmluZGV4LHU9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGg9dC5pbmRleCxmPUpuLmdldFByaW1pdGl2ZSgpLGQ9Sm4uZ2V0UHJpbWl0aXZlKCk7bGV0IHA9aEMseD1mQyxnPW51bGwsbT1udWxsO2kmJihnPWRDLG09cEMpO2xldCB2PTEvMCx5PW51bGwsXz1udWxsO3JldHVybiBMdS5jb3B5KGUpLmludmVydCgpLFVhLm1hdHJpeC5jb3B5KEx1KSxyLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpTPT5IZC5kaXN0YW5jZVRvQm94KFMpLGludGVyc2VjdHNCb3VuZHM6KFMsdyxBKT0+QTx2JiZBPG8/KHcmJihVYS5taW4uY29weShTLm1pbiksVWEubWF4LmNvcHkoUy5tYXgpLFVhLm5lZWRzVXBkYXRlPSEwKSwhMCk6ITEsaW50ZXJzZWN0c1JhbmdlOihTLHcpPT57aWYodC5ib3VuZHNUcmVlKXtjb25zdCBBPXQuYm91bmRzVHJlZTtyZXR1cm4gQS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6VD0+VWEuZGlzdGFuY2VUb0JveChUKSxpbnRlcnNlY3RzQm91bmRzOihULGIsTSk9Pk08diYmTTxvLGludGVyc2VjdHNSYW5nZTooVCxiKT0+e2ZvcihsZXQgTT1ULEU9VCtiO008RTtNKyspe2NvbnN0IEQ9QS5yZXNvbHZlVHJpYW5nbGVJbmRleChNKTtCZShkLDMqRCxoLHUpLGQuYS5hcHBseU1hdHJpeDQoZSksZC5iLmFwcGx5TWF0cml4NChlKSxkLmMuYXBwbHlNYXRyaXg0KGUpLGQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBMPVMsRj1TK3c7TDxGO0wrKyl7Y29uc3QgTj1yLnJlc29sdmVUcmlhbmdsZUluZGV4KEwpO0JlKGYsMypOLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBPPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxnKTtpZihPPHYmJih4LmNvcHkocCksbSYmbS5jb3B5KGcpLHY9Tyx5PUwsXz1NKSxPPHMpcmV0dXJuITB9fX19KX1lbHNle2NvbnN0IEE9c28odCk7Zm9yKGxldCBUPTAsYj1BO1Q8YjtUKyspe0JlKGQsMypULGgsdSksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IE09UyxFPVMrdztNPEU7TSsrKXtjb25zdCBEPXIucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoTSk7QmUoZiwzKkQsbCxjKSxmLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEw9Zi5kaXN0YW5jZVRvVHJpYW5nbGUoZCxwLGcpO2lmKEw8diYmKHguY29weShwKSxtJiZtLmNvcHkoZyksdj1MLHk9TSxfPVQpLEw8cylyZXR1cm4hMH19fX19KSxKbi5yZWxlYXNlUHJpbWl0aXZlKGYpLEpuLnJlbGVhc2VQcmltaXRpdmUoZCksdj09PTEvMD9udWxsOihuLnBvaW50P24ucG9pbnQuY29weSh4KTpuLnBvaW50PXguY2xvbmUoKSxuLmRpc3RhbmNlPXYsbi5mYWNlSW5kZXg9eSxpJiYoaS5wb2ludD9pLnBvaW50LmNvcHkobSk6aS5wb2ludD1tLmNsb25lKCksaS5wb2ludC5hcHBseU1hdHJpeDQoTHUpLHguYXBwbHlNYXRyaXg0KEx1KSxpLmRpc3RhbmNlPXguc3ViKGkucG9pbnQpLmxlbmd0aCgpLGkuZmFjZUluZGV4PV8pLG4pfWZ1bmN0aW9uIGdDKCl7cmV0dXJuIHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciE9InVuZGVmaW5lZCJ9Y29uc3QgTmE9bmV3IHZlLmNvbnN0cnVjdG9yLER1PW5ldyB2ZS5jb25zdHJ1Y3Rvcixicj1uZXcgRGQoKCk9Pm5ldyBsZSksZm89bmV3IGxlLHBvPW5ldyBsZSxXZD1uZXcgbGUsWGQ9bmV3IGxlO2xldCAkZD0hMTtmdW5jdGlvbiB4QyhyLHQsZSxuKXtpZigkZCl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFJlY3Vyc2l2ZSBjYWxscyB0byBidmhjYXN0IG5vdCBzdXBwb3J0ZWQuIik7JGQ9ITA7Y29uc3QgaT1yLl9yb290cyxzPXQuX3Jvb3RzO2xldCBvLGE9MCxjPTA7Y29uc3QgbD1uZXcgQ3QoKS5jb3B5KGUpLmludmVydCgpO2ZvcihsZXQgdT0wLGg9aS5sZW5ndGg7dTxoO3UrKyl7TmEuc2V0QnVmZmVyKGlbdV0pLGM9MDtjb25zdCBmPWJyLmdldFByaW1pdGl2ZSgpO0VlKDAsTmEuZmxvYXQzMkFycmF5LGYpLGYuYXBwbHlNYXRyaXg0KGwpO2ZvcihsZXQgZD0wLHA9cy5sZW5ndGg7ZDxwJiYoRHUuc2V0QnVmZmVyKHNbZF0pLG89dWkoMCwwLGUsbCxuLGEsYywwLDAsZiksRHUuY2xlYXJCdWZmZXIoKSxjKz1zW2RdLmxlbmd0aCwhbyk7ZCsrKTtpZihici5yZWxlYXNlUHJpbWl0aXZlKGYpLE5hLmNsZWFyQnVmZmVyKCksYSs9aVt1XS5sZW5ndGgsbylicmVha31yZXR1cm4gJGQ9ITEsb31mdW5jdGlvbiB1aShyLHQsZSxuLGkscz0wLG89MCxhPTAsYz0wLGw9bnVsbCx1PSExKXtsZXQgaCxmO3U/KGg9RHUsZj1OYSk6KGg9TmEsZj1EdSk7Y29uc3QgZD1oLmZsb2F0MzJBcnJheSxwPWgudWludDMyQXJyYXkseD1oLnVpbnQxNkFycmF5LGc9Zi5mbG9hdDMyQXJyYXksbT1mLnVpbnQzMkFycmF5LHY9Zi51aW50MTZBcnJheSx5PXIqMixfPXQqMixTPWJuKHkseCksdz1ibihfLHYpO2xldCBBPSExO2lmKHcmJlMpdT9BPWkoQm4odCxtKSwkbih0KjIsdiksQm4ocixwKSwkbihyKjIseCksYyxvK3QsYSxzK3IpOkE9aShCbihyLHApLCRuKHIqMix4KSxCbih0LG0pLCRuKHQqMix2KSxhLHMrcixjLG8rdCk7ZWxzZSBpZih3KXtjb25zdCBUPWJyLmdldFByaW1pdGl2ZSgpO0VlKHQsZyxUKSxULmFwcGx5TWF0cml4NChlKTtjb25zdCBiPXFuKHIpLE09WW4ocixwKTtFZShiLGQsZm8pLEVlKE0sZCxwbyk7Y29uc3QgRT1ULmludGVyc2VjdHNCb3goZm8pLEQ9VC5pbnRlcnNlY3RzQm94KHBvKTtBPUUmJnVpKHQsYixuLGUsaSxvLHMsYyxhKzEsVCwhdSl8fEQmJnVpKHQsTSxuLGUsaSxvLHMsYyxhKzEsVCwhdSksYnIucmVsZWFzZVByaW1pdGl2ZShUKX1lbHNle2NvbnN0IFQ9cW4odCksYj1Zbih0LG0pO0VlKFQsZyxXZCksRWUoYixnLFhkKTtjb25zdCBNPWwuaW50ZXJzZWN0c0JveChXZCksRT1sLmludGVyc2VjdHNCb3goWGQpO2lmKE0mJkUpQT11aShyLFQsZSxuLGkscyxvLGEsYysxLGwsdSl8fHVpKHIsYixlLG4saSxzLG8sYSxjKzEsbCx1KTtlbHNlIGlmKE0paWYoUylBPXVpKHIsVCxlLG4saSxzLG8sYSxjKzEsbCx1KTtlbHNle2NvbnN0IEQ9YnIuZ2V0UHJpbWl0aXZlKCk7RC5jb3B5KFdkKS5hcHBseU1hdHJpeDQoZSk7Y29uc3QgTD1xbihyKSxGPVluKHIscCk7RWUoTCxkLGZvKSxFZShGLGQscG8pO2NvbnN0IE49RC5pbnRlcnNlY3RzQm94KGZvKSxPPUQuaW50ZXJzZWN0c0JveChwbyk7QT1OJiZ1aShULEwsbixlLGksbyxzLGMsYSsxLEQsIXUpfHxPJiZ1aShULEYsbixlLGksbyxzLGMsYSsxLEQsIXUpLGJyLnJlbGVhc2VQcmltaXRpdmUoRCl9ZWxzZSBpZihFKWlmKFMpQT11aShyLGIsZSxuLGkscyxvLGEsYysxLGwsdSk7ZWxzZXtjb25zdCBEPWJyLmdldFByaW1pdGl2ZSgpO0QuY29weShYZCkuYXBwbHlNYXRyaXg0KGUpO2NvbnN0IEw9cW4ociksRj1ZbihyLHApO0VlKEwsZCxmbyksRWUoRixkLHBvKTtjb25zdCBOPUQuaW50ZXJzZWN0c0JveChmbyksTz1ELmludGVyc2VjdHNCb3gocG8pO0E9TiYmdWkoYixMLG4sZSxpLG8scyxjLGErMSxELCF1KXx8TyYmdWkoYixGLG4sZSxpLG8scyxjLGErMSxELCF1KSxici5yZWxlYXNlUHJpbWl0aXZlKEQpfX1yZXR1cm4gQX1jb25zdCBVdT1uZXcgbG4sUXg9bmV3IGxlLF9DPXtzdHJhdGVneTpCeCxtYXhEZXB0aDo0MCxtYXhMZWFmVHJpczoxMCx1c2VTaGFyZWRBcnJheUJ1ZmZlcjohMSxzZXRCb3VuZGluZ0JveDohMCxvblByb2dyZXNzOm51bGwsaW5kaXJlY3Q6ITEsdmVyYm9zZTohMCxyYW5nZTpudWxsfTtjbGFzcyBxZHtzdGF0aWMgc2VyaWFsaXplKHQsZT17fSl7ZT1XZSh7Y2xvbmVCdWZmZXJzOiEwfSxlKTtjb25zdCBuPXQuZ2VvbWV0cnksaT10Ll9yb290cyxzPXQuX2luZGlyZWN0QnVmZmVyLG89bi5nZXRJbmRleCgpO2xldCBhO3JldHVybiBlLmNsb25lQnVmZmVycz9hPXtyb290czppLm1hcChjPT5jLnNsaWNlKCkpLGluZGV4Om8/by5hcnJheS5zbGljZSgpOm51bGwsaW5kaXJlY3RCdWZmZXI6cz9zLnNsaWNlKCk6bnVsbH06YT17cm9vdHM6aSxpbmRleDpvP28uYXJyYXk6bnVsbCxpbmRpcmVjdEJ1ZmZlcjpzfSxhfXN0YXRpYyBkZXNlcmlhbGl6ZSh0LGUsbj17fSl7bj1XZSh7c2V0SW5kZXg6ITAsaW5kaXJlY3Q6ISF0LmluZGlyZWN0QnVmZmVyfSxuKTtjb25zdHtpbmRleDppLHJvb3RzOnMsaW5kaXJlY3RCdWZmZXI6b309dCxhPW5ldyBxZChlLGdpKFdlKHt9LG4pLHtbVGRdOiEwfSkpO2lmKGEuX3Jvb3RzPXMsYS5faW5kaXJlY3RCdWZmZXI9b3x8bnVsbCxuLnNldEluZGV4KXtjb25zdCBjPWUuZ2V0SW5kZXgoKTtpZihjPT09bnVsbCl7Y29uc3QgbD1uZXcgSnQodC5pbmRleCwxLCExKTtlLnNldEluZGV4KGwpfWVsc2UgYy5hcnJheSE9PWkmJihjLmFycmF5LnNldChpKSxjLm5lZWRzVXBkYXRlPSEwKX1yZXR1cm4gYX1nZXQgaW5kaXJlY3QoKXtyZXR1cm4hIXRoaXMuX2luZGlyZWN0QnVmZmVyfWNvbnN0cnVjdG9yKHQsZT17fSl7aWYodC5pc0J1ZmZlckdlb21ldHJ5KXtpZih0LmluZGV4JiZ0LmluZGV4LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgaW5kZXggYXR0cmlidXRlLiIpfWVsc2UgdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBPbmx5IEJ1ZmZlckdlb21ldHJpZXMgYXJlIHN1cHBvcnRlZC4iKTtpZihlPU9iamVjdC5hc3NpZ24oZ2koV2Uoe30sX0MpLHtbVGRdOiExfSksZSksZS51c2VTaGFyZWRBcnJheUJ1ZmZlciYmIWdDKCkpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYXZhaWxhYmxlLiIpO3RoaXMuZ2VvbWV0cnk9dCx0aGlzLl9yb290cz1udWxsLHRoaXMuX2luZGlyZWN0QnVmZmVyPW51bGwsZVtUZF18fChERSh0aGlzLGUpLCF0LmJvdW5kaW5nQm94JiZlLnNldEJvdW5kaW5nQm94JiYodC5ib3VuZGluZ0JveD10aGlzLmdldEJvdW5kaW5nQm94KG5ldyBsZSkpKSx0aGlzLnJlc29sdmVUcmlhbmdsZUluZGV4PWUuaW5kaXJlY3Q/bj0+dGhpcy5faW5kaXJlY3RCdWZmZXJbbl06bj0+bn1yZWZpdCh0PW51bGwpe3JldHVybih0aGlzLmluZGlyZWN0P29DOnFFKSh0aGlzLHQpfXRyYXZlcnNlKHQsZT0wKXtjb25zdCBuPXRoaXMuX3Jvb3RzW2VdLGk9bmV3IFVpbnQzMkFycmF5KG4pLHM9bmV3IFVpbnQxNkFycmF5KG4pO28oMCk7ZnVuY3Rpb24gbyhhLGM9MCl7Y29uc3QgbD1hKjIsdT1zW2wrMTVdPT09X3U7aWYodSl7Y29uc3QgaD1pW2ErNl0sZj1zW2wrMTRdO3QoYyx1LG5ldyBGbG9hdDMyQXJyYXkobixhKjQsNiksaCxmKX1lbHNle2NvbnN0IGg9YStUYS80LGY9aVthKzZdLGQ9aVthKzddO3QoYyx1LG5ldyBGbG9hdDMyQXJyYXkobixhKjQsNiksZCl8fChvKGgsYysxKSxvKGYsYysxKSl9fX1yYXljYXN0KHQsZT1laSxuPTAsaT0xLzApe2NvbnN0IHM9dGhpcy5fcm9vdHMsbz10aGlzLmdlb21ldHJ5LGE9W10sYz1lLmlzTWF0ZXJpYWwsbD1BcnJheS5pc0FycmF5KGUpLHU9by5ncm91cHMsaD1jP2Uuc2lkZTplLGY9dGhpcy5pbmRpcmVjdD9hQzpLRTtmb3IobGV0IGQ9MCxwPXMubGVuZ3RoO2Q8cDtkKyspe2NvbnN0IHg9bD9lW3VbZF0ubWF0ZXJpYWxJbmRleF0uc2lkZTpoLGc9YS5sZW5ndGg7aWYoZih0aGlzLGQseCx0LGEsbixpKSxsKXtjb25zdCBtPXVbZF0ubWF0ZXJpYWxJbmRleDtmb3IobGV0IHY9Zyx5PWEubGVuZ3RoO3Y8eTt2KyspYVt2XS5mYWNlLm1hdGVyaWFsSW5kZXg9bX19cmV0dXJuIGF9cmF5Y2FzdEZpcnN0KHQsZT1laSxuPTAsaT0xLzApe2NvbnN0IHM9dGhpcy5fcm9vdHMsbz10aGlzLmdlb21ldHJ5LGE9ZS5pc01hdGVyaWFsLGM9QXJyYXkuaXNBcnJheShlKTtsZXQgbD1udWxsO2NvbnN0IHU9by5ncm91cHMsaD1hP2Uuc2lkZTplLGY9dGhpcy5pbmRpcmVjdD9sQzpRRTtmb3IobGV0IGQ9MCxwPXMubGVuZ3RoO2Q8cDtkKyspe2NvbnN0IHg9Yz9lW3VbZF0ubWF0ZXJpYWxJbmRleF0uc2lkZTpoLGc9Zih0aGlzLGQseCx0LG4saSk7ZyE9bnVsbCYmKGw9PW51bGx8fGcuZGlzdGFuY2U8bC5kaXN0YW5jZSkmJihsPWcsYyYmKGcuZmFjZS5tYXRlcmlhbEluZGV4PXVbZF0ubWF0ZXJpYWxJbmRleCkpfXJldHVybiBsfWludGVyc2VjdHNHZW9tZXRyeSh0LGUpe2xldCBuPSExO2NvbnN0IGk9dGhpcy5fcm9vdHMscz10aGlzLmluZGlyZWN0P3VDOnRDO2ZvcihsZXQgbz0wLGE9aS5sZW5ndGg7bzxhJiYobj1zKHRoaXMsbyx0LGUpLCFuKTtvKyspO3JldHVybiBufXNoYXBlY2FzdCh0KXtjb25zdCBlPUpuLmdldFByaW1pdGl2ZSgpLG49dGhpcy5pbmRpcmVjdD9KRTokRTtsZXR7Ym91bmRzVHJhdmVyc2VPcmRlcjppLGludGVyc2VjdHNCb3VuZHM6cyxpbnRlcnNlY3RzUmFuZ2U6byxpbnRlcnNlY3RzVHJpYW5nbGU6YX09dDtpZihvJiZhKXtjb25zdCBoPW87bz0oZixkLHAseCxnKT0+aChmLGQscCx4LGcpPyEwOm4oZixkLHRoaXMsYSxwLHgsZSl9ZWxzZSBvfHwoYT9vPShoLGYsZCxwKT0+bihoLGYsdGhpcyxhLGQscCxlKTpvPShoLGYsZCk9PmQpO2xldCBjPSExLGw9MDtjb25zdCB1PXRoaXMuX3Jvb3RzO2ZvcihsZXQgaD0wLGY9dS5sZW5ndGg7aDxmO2grKyl7Y29uc3QgZD11W2hdO2lmKGM9ekUodGhpcyxoLHMsbyxpLGwpLGMpYnJlYWs7bCs9ZC5ieXRlTGVuZ3RofXJldHVybiBKbi5yZWxlYXNlUHJpbWl0aXZlKGUpLGN9YnZoY2FzdCh0LGUsbil7bGV0e2ludGVyc2VjdHNSYW5nZXM6aSxpbnRlcnNlY3RzVHJpYW5nbGVzOnN9PW47Y29uc3Qgbz1Kbi5nZXRQcmltaXRpdmUoKSxhPXRoaXMuZ2VvbWV0cnkuaW5kZXgsYz10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sbD10aGlzLmluZGlyZWN0P3A9Pntjb25zdCB4PXRoaXMucmVzb2x2ZVRyaWFuZ2xlSW5kZXgocCk7QmUobyx4KjMsYSxjKX06cD0+e0JlKG8scCozLGEsYyl9LHU9Sm4uZ2V0UHJpbWl0aXZlKCksaD10Lmdlb21ldHJ5LmluZGV4LGY9dC5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGQ9dC5pbmRpcmVjdD9wPT57Y29uc3QgeD10LnJlc29sdmVUcmlhbmdsZUluZGV4KHApO0JlKHUseCozLGgsZil9OnA9PntCZSh1LHAqMyxoLGYpfTtpZihzKXtjb25zdCBwPSh4LGcsbSx2LHksXyxTLHcpPT57Zm9yKGxldCBBPW0sVD1tK3Y7QTxUO0ErKyl7ZChBKSx1LmEuYXBwbHlNYXRyaXg0KGUpLHUuYi5hcHBseU1hdHJpeDQoZSksdS5jLmFwcGx5TWF0cml4NChlKSx1Lm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgYj14LE09eCtnO2I8TTtiKyspaWYobChiKSxvLm5lZWRzVXBkYXRlPSEwLHMobyx1LGIsQSx5LF8sUyx3KSlyZXR1cm4hMH1yZXR1cm4hMX07aWYoaSl7Y29uc3QgeD1pO2k9ZnVuY3Rpb24oZyxtLHYseSxfLFMsdyxBKXtyZXR1cm4geChnLG0sdix5LF8sUyx3LEEpPyEwOnAoZyxtLHYseSxfLFMsdyxBKX19ZWxzZSBpPXB9cmV0dXJuIHhDKHRoaXMsdCxlLGkpfWludGVyc2VjdHNCb3godCxlKXtyZXR1cm4gVXUuc2V0KHQubWluLHQubWF4LGUpLFV1Lm5lZWRzVXBkYXRlPSEwLHRoaXMuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOm49PlV1LmludGVyc2VjdHNCb3gobiksaW50ZXJzZWN0c1RyaWFuZ2xlOm49PlV1LmludGVyc2VjdHNUcmlhbmdsZShuKX0pfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOmU9PnQuaW50ZXJzZWN0c0JveChlKSxpbnRlcnNlY3RzVHJpYW5nbGU6ZT0+ZS5pbnRlcnNlY3RzU3BoZXJlKHQpfSl9Y2xvc2VzdFBvaW50VG9HZW9tZXRyeSh0LGUsbj17fSxpPXt9LHM9MCxvPTEvMCl7cmV0dXJuKHRoaXMuaW5kaXJlY3Q/bUM6c0MpKHRoaXMsdCxlLG4saSxzLG8pfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlPXt9LG49MCxpPTEvMCl7cmV0dXJuIGtFKHRoaXMsdCxlLG4saSl9Z2V0Qm91bmRpbmdCb3godCl7cmV0dXJuIHQubWFrZUVtcHR5KCksdGhpcy5fcm9vdHMuZm9yRWFjaChuPT57RWUoMCxuZXcgRmxvYXQzMkFycmF5KG4pLFF4KSx0LnVuaW9uKFF4KX0pLHR9fWNvbnN0IHRfPTFlLTYseUM9dF8qLjUsZV89TWF0aC5wb3coMTAsLU1hdGgubG9nMTAodF8pKSx2Qz15QyplXztmdW5jdGlvbiBBaShyKXtyZXR1cm5+fihyKmVfK3ZDKX1mdW5jdGlvbiBNQyhyKXtyZXR1cm5gJHtBaShyLngpfSwke0FpKHIueSl9YH1mdW5jdGlvbiBuXyhyKXtyZXR1cm5gJHtBaShyLngpfSwke0FpKHIueSl9LCR7QWkoci56KX1gfWZ1bmN0aW9uIFNDKHIpe3JldHVybmAke0FpKHIueCl9LCR7QWkoci55KX0sJHtBaShyLnopfSwke0FpKHIudyl9YH1mdW5jdGlvbiBiQyhyLHQsZSl7ZS5kaXJlY3Rpb24uc3ViVmVjdG9ycyh0LHIpLm5vcm1hbGl6ZSgpO2NvbnN0IG49ci5kb3QoZS5kaXJlY3Rpb24pO3JldHVybiBlLm9yaWdpbi5jb3B5KHIpLmFkZFNjYWxlZFZlY3RvcihlLmRpcmVjdGlvbiwtbiksZX1mdW5jdGlvbiBpXygpe3JldHVybiB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIhPSJ1bmRlZmluZWQifWZ1bmN0aW9uIHdDKHIpe2lmKHIuYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpcmV0dXJuIHI7Y29uc3QgdD1yLmNvbnN0cnVjdG9yLGU9ci5idWZmZXIsbj1uZXcgU2hhcmVkQXJyYXlCdWZmZXIoZS5ieXRlTGVuZ3RoKSxpPW5ldyBVaW50OEFycmF5KGUpO3JldHVybiBuZXcgVWludDhBcnJheShuKS5zZXQoaSwwKSxuZXcgdChuKX1mdW5jdGlvbiBBQyhyLHQ9QXJyYXlCdWZmZXIpe3JldHVybiByPjY1NTM1P25ldyBVaW50MzJBcnJheShuZXcgdCg0KnIpKTpuZXcgVWludDE2QXJyYXkobmV3IHQoMipyKSl9ZnVuY3Rpb24gVEMocix0KXtpZighci5pbmRleCl7Y29uc3QgZT1yLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQsbj10LnVzZVNoYXJlZEFycmF5QnVmZmVyP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLGk9QUMoZSxuKTtyLnNldEluZGV4KG5ldyBKdChpLDEpKTtmb3IobGV0IHM9MDtzPGU7cysrKWlbc109c319ZnVuY3Rpb24gRUMocil7cmV0dXJuIHIuaW5kZXg/ci5pbmRleC5jb3VudDpyLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnR9ZnVuY3Rpb24gWWQocil7cmV0dXJuIEVDKHIpLzN9Y29uc3QgQ0M9MWUtOCxSQz1uZXcgSTtmdW5jdGlvbiBJQyhyKXtyZXR1cm5+fihyLzMpfWZ1bmN0aW9uIFBDKHIpe3JldHVybiByJTN9ZnVuY3Rpb24gcl8ocix0KXtyZXR1cm4gci5zdGFydC10LnN0YXJ0fWZ1bmN0aW9uIHNfKHIsdCl7cmV0dXJuIFJDLnN1YlZlY3RvcnModCxyLm9yaWdpbikuZG90KHIuZGlyZWN0aW9uKX1mdW5jdGlvbiBMQyhyLHQsZSxuPUNDKXtyLnNvcnQocl8pLHQuc29ydChyXyk7Zm9yKGxldCBhPTA7YTxyLmxlbmd0aDthKyspe2NvbnN0IGM9clthXTtmb3IobGV0IGw9MDtsPHQubGVuZ3RoO2wrKyl7Y29uc3QgdT10W2xdO2lmKCEodS5zdGFydD5jLmVuZCkpe2lmKGMuZW5kPHUuc3RhcnR8fHUuZW5kPGMuc3RhcnQpY29udGludWU7aWYoYy5zdGFydDw9dS5zdGFydCYmYy5lbmQ+PXUuZW5kKXModS5lbmQsYy5lbmQpfHxyLnNwbGljZShhKzEsMCx7c3RhcnQ6dS5lbmQsZW5kOmMuZW5kLGluZGV4OmMuaW5kZXh9KSxjLmVuZD11LnN0YXJ0LHUuc3RhcnQ9MCx1LmVuZD0wO2Vsc2UgaWYoYy5zdGFydD49dS5zdGFydCYmYy5lbmQ8PXUuZW5kKXMoYy5lbmQsdS5lbmQpfHx0LnNwbGljZShsKzEsMCx7c3RhcnQ6Yy5lbmQsZW5kOnUuZW5kLGluZGV4OnUuaW5kZXh9KSx1LmVuZD1jLnN0YXJ0LGMuc3RhcnQ9MCxjLmVuZD0wO2Vsc2UgaWYoYy5zdGFydDw9dS5zdGFydCYmYy5lbmQ8PXUuZW5kKXtjb25zdCBoPWMuZW5kO2MuZW5kPXUuc3RhcnQsdS5zdGFydD1ofWVsc2UgaWYoYy5zdGFydD49dS5zdGFydCYmYy5lbmQ+PXUuZW5kKXtjb25zdCBoPXUuZW5kO3UuZW5kPWMuc3RhcnQsYy5zdGFydD1ofWVsc2UgdGhyb3cgbmV3IEVycm9yfWlmKGUuaGFzKGMuaW5kZXgpfHxlLnNldChjLmluZGV4LFtdKSxlLmhhcyh1LmluZGV4KXx8ZS5zZXQodS5pbmRleCxbXSksZS5nZXQoYy5pbmRleCkucHVzaCh1LmluZGV4KSxlLmdldCh1LmluZGV4KS5wdXNoKGMuaW5kZXgpLG8odSkmJih0LnNwbGljZShsLDEpLGwtLSksbyhjKSl7ci5zcGxpY2UoYSwxKSxhLS07YnJlYWt9fX1pKHIpLGkodCk7ZnVuY3Rpb24gaShhKXtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKylvKGFbY10pJiYoYS5zcGxpY2UoYywxKSxjLS0pfWZ1bmN0aW9uIHMoYSxjKXtyZXR1cm4gTWF0aC5hYnMoYy1hKTxufWZ1bmN0aW9uIG8oYSl7cmV0dXJuIE1hdGguYWJzKGEuZW5kLWEuc3RhcnQpPG59fWNvbnN0IG9fPTFlLTUsYV89MWUtNDtjbGFzcyBEQ3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3JheXM9W119YWRkUmF5KHQpe3RoaXMuX3JheXMucHVzaCh0KX1maW5kQ2xvc2VzdFJheSh0KXtjb25zdCBlPXRoaXMuX3JheXMsbj10LmNsb25lKCk7bi5kaXJlY3Rpb24ubXVsdGlwbHlTY2FsYXIoLTEpO2xldCBpPTEvMCxzPW51bGw7Zm9yKGxldCBjPTAsbD1lLmxlbmd0aDtjPGw7YysrKXtjb25zdCB1PWVbY107aWYobyh1LHQpJiZvKHUsbikpY29udGludWU7Y29uc3QgaD1hKHUsdCksZj1hKHUsbiksZD1NYXRoLm1pbihoLGYpO2Q8aSYmKGk9ZCxzPXUpfXJldHVybiBzO2Z1bmN0aW9uIG8oYyxsKXtjb25zdCB1PWMub3JpZ2luLmRpc3RhbmNlVG8obC5vcmlnaW4pPm9fO3JldHVybiBjLmRpcmVjdGlvbi5hbmdsZVRvKGwuZGlyZWN0aW9uKT5hX3x8dX1mdW5jdGlvbiBhKGMsbCl7Y29uc3QgdT1jLm9yaWdpbi5kaXN0YW5jZVRvKGwub3JpZ2luKSxoPWMuZGlyZWN0aW9uLmFuZ2xlVG8obC5kaXJlY3Rpb24pO3JldHVybiB1L29fK2gvYV99fX1jb25zdCBaZD1uZXcgSSxKZD1uZXcgSSxOdT1uZXcgaHI7ZnVuY3Rpb24gVUMocix0LGUpe2NvbnN0IG49ci5hdHRyaWJ1dGVzLGk9ci5pbmRleCxzPW4ucG9zaXRpb24sbz1uZXcgTWFwLGE9bmV3IE1hcCxjPUFycmF5LmZyb20odCksbD1uZXcgREM7Zm9yKGxldCB1PTAsaD1jLmxlbmd0aDt1PGg7dSsrKXtjb25zdCBmPWNbdV0sZD1JQyhmKSxwPVBDKGYpO2xldCB4PTMqZCtwLGc9MypkKyhwKzEpJTM7aSYmKHg9aS5nZXRYKHgpLGc9aS5nZXRYKGcpKSxaZC5mcm9tQnVmZmVyQXR0cmlidXRlKHMseCksSmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGcpLGJDKFpkLEpkLE51KTtsZXQgbSx2PWwuZmluZENsb3Nlc3RSYXkoTnUpO3Y9PT1udWxsJiYodj1OdS5jbG9uZSgpLGwuYWRkUmF5KHYpKSxhLmhhcyh2KXx8YS5zZXQodix7Zm9yd2FyZDpbXSxyZXZlcnNlOltdLHJheTp2fSksbT1hLmdldCh2KTtsZXQgeT1zXyh2LFpkKSxfPXNfKHYsSmQpO3k+XyYmKFt5LF9dPVtfLHldKSxOdS5kaXJlY3Rpb24uZG90KHYuZGlyZWN0aW9uKTwwP20ucmV2ZXJzZS5wdXNoKHtzdGFydDp5LGVuZDpfLGluZGV4OmZ9KTptLmZvcndhcmQucHVzaCh7c3RhcnQ6eSxlbmQ6XyxpbmRleDpmfSl9cmV0dXJuIGEuZm9yRWFjaCgoe2ZvcndhcmQ6dSxyZXZlcnNlOmh9LGYpPT57TEModSxoLG8sZSksdS5sZW5ndGg9PT0wJiZoLmxlbmd0aD09PTAmJmEuZGVsZXRlKGYpfSkse2Rpc2pvaW50Q29ubmVjdGl2aXR5TWFwOm8sZnJhZ21lbnRNYXA6YX19Y29uc3QgTkM9bmV3IHEsS2Q9bmV3IEksRkM9bmV3IFF0LGpkPVsiIiwiIiwiIl07Y2xhc3MgQkN7Y29uc3RydWN0b3IodD1udWxsKXt0aGlzLmRhdGE9bnVsbCx0aGlzLmRpc2pvaW50Q29ubmVjdGlvbnM9bnVsbCx0aGlzLnVubWF0Y2hlZERpc2pvaW50RWRnZXM9bnVsbCx0aGlzLnVubWF0Y2hlZEVkZ2VzPS0xLHRoaXMubWF0Y2hlZEVkZ2VzPS0xLHRoaXMudXNlRHJhd1JhbmdlPSEwLHRoaXMudXNlQWxsQXR0cmlidXRlcz0hMSx0aGlzLm1hdGNoRGlzam9pbnRFZGdlcz0hMSx0aGlzLmRlZ2VuZXJhdGVFcHNpbG9uPTFlLTgsdCYmdGhpcy51cGRhdGVGcm9tKHQpfWdldFNpYmxpbmdUcmlhbmdsZUluZGV4KHQsZSl7Y29uc3Qgbj10aGlzLmRhdGFbdCozK2VdO3JldHVybiBuPT09LTE/LTE6fn4obi8zKX1nZXRTaWJsaW5nRWRnZUluZGV4KHQsZSl7Y29uc3Qgbj10aGlzLmRhdGFbdCozK2VdO3JldHVybiBuPT09LTE/LTE6biUzfWdldERpc2pvaW50U2libGluZ1RyaWFuZ2xlSW5kaWNlcyh0LGUpe2NvbnN0IG49dCozK2UsaT10aGlzLmRpc2pvaW50Q29ubmVjdGlvbnMuZ2V0KG4pO3JldHVybiBpP2kubWFwKHM9Pn5+KHMvMykpOltdfWdldERpc2pvaW50U2libGluZ0VkZ2VJbmRpY2VzKHQsZSl7Y29uc3Qgbj10KjMrZSxpPXRoaXMuZGlzam9pbnRDb25uZWN0aW9ucy5nZXQobik7cmV0dXJuIGk/aS5tYXAocz0+cyUzKTpbXX1pc0Z1bGx5Q29ubmVjdGVkKCl7cmV0dXJuIHRoaXMudW5tYXRjaGVkRWRnZXM9PT0wfXVwZGF0ZUZyb20odCl7Y29uc3R7dXNlQWxsQXR0cmlidXRlczplLHVzZURyYXdSYW5nZTpuLG1hdGNoRGlzam9pbnRFZGdlczppLGRlZ2VuZXJhdGVFcHNpbG9uOnN9PXRoaXMsbz1lP3k6dixhPW5ldyBNYXAse2F0dHJpYnV0ZXM6Y309dCxsPWU/T2JqZWN0LmtleXMoYyk6bnVsbCx1PXQuaW5kZXgsaD1jLnBvc2l0aW9uO2xldCBmPVlkKHQpO2NvbnN0IGQ9ZjtsZXQgcD0wO24mJihwPXQuZHJhd1JhbmdlLnN0YXJ0LHQuZHJhd1JhbmdlLmNvdW50IT09MS8wJiYoZj1+fih0LmRyYXdSYW5nZS5jb3VudC8zKSkpO2xldCB4PXRoaXMuZGF0YTsoIXh8fHgubGVuZ3RoPDMqZCkmJih4PW5ldyBJbnQzMkFycmF5KDMqZCkpLHguZmlsbCgtMSk7bGV0IGc9MCxtPW5ldyBTZXQ7Zm9yKGxldCBfPXAsUz1mKjMrcDtfPFM7Xys9Myl7Y29uc3Qgdz1fO2ZvcihsZXQgQT0wO0E8MztBKyspe2xldCBUPXcrQTt1JiYoVD11LmdldFgoVCkpLGpkW0FdPW8oVCl9Zm9yKGxldCBBPTA7QTwzO0ErKyl7Y29uc3QgVD0oQSsxKSUzLGI9amRbQV0sTT1qZFtUXSxFPWAke019XyR7Yn1gO2lmKGEuaGFzKEUpKXtjb25zdCBEPXcrQSxMPWEuZ2V0KEUpO3hbRF09TCx4W0xdPUQsYS5kZWxldGUoRSksZys9MixtLmRlbGV0ZShMKX1lbHNle2NvbnN0IEQ9YCR7Yn1fJHtNfWAsTD13K0E7YS5zZXQoRCxMKSxtLmFkZChMKX19fWlmKGkpe2NvbnN0e2ZyYWdtZW50TWFwOl8sZGlzam9pbnRDb25uZWN0aXZpdHlNYXA6U309VUModCxtLHMpO20uY2xlYXIoKSxfLmZvckVhY2goKHtmb3J3YXJkOncscmV2ZXJzZTpBfSk9Pnt3LmZvckVhY2goKHtpbmRleDpUfSk9Pm0uYWRkKFQpKSxBLmZvckVhY2goKHtpbmRleDpUfSk9Pm0uYWRkKFQpKX0pLHRoaXMudW5tYXRjaGVkRGlzam9pbnRFZGdlcz1fLHRoaXMuZGlzam9pbnRDb25uZWN0aW9ucz1TLGc9ZiozLW0uc2l6ZX10aGlzLm1hdGNoZWRFZGdlcz1nLHRoaXMudW5tYXRjaGVkRWRnZXM9bS5zaXplLHRoaXMuZGF0YT14O2Z1bmN0aW9uIHYoXyl7cmV0dXJuIEtkLmZyb21CdWZmZXJBdHRyaWJ1dGUoaCxfKSxuXyhLZCl9ZnVuY3Rpb24geShfKXtsZXQgUz0iIjtmb3IobGV0IHc9MCxBPWwubGVuZ3RoO3c8QTt3Kyspe2NvbnN0IFQ9Y1tsW3ddXTtsZXQgYjtzd2l0Y2goVC5pdGVtU2l6ZSl7Y2FzZSAxOmI9QWkoVC5nZXRYKF8pKTticmVhaztjYXNlIDI6Yj1NQyhOQy5mcm9tQnVmZmVyQXR0cmlidXRlKFQsXykpO2JyZWFrO2Nhc2UgMzpiPW5fKEtkLmZyb21CdWZmZXJBdHRyaWJ1dGUoVCxfKSk7YnJlYWs7Y2FzZSA0OmI9U0MoRkMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShULF8pKTticmVha31TIT09IiImJihTKz0ifCIpLFMrPWJ9cmV0dXJuIFN9fX1jbGFzcyBGdSBleHRlbmRzIExle2NvbnN0cnVjdG9yKC4uLnQpe3N1cGVyKC4uLnQpLHRoaXMuaXNCcnVzaD0hMCx0aGlzLl9wcmV2aW91c01hdHJpeD1uZXcgQ3QsdGhpcy5fcHJldmlvdXNNYXRyaXguZWxlbWVudHMuZmlsbCgwKX1tYXJrVXBkYXRlZCgpe3RoaXMuX3ByZXZpb3VzTWF0cml4LmNvcHkodGhpcy5tYXRyaXgpfWlzRGlydHkoKXtjb25zdHttYXRyaXg6dCxfcHJldmlvdXNNYXRyaXg6ZX09dGhpcyxuPXQuZWxlbWVudHMsaT1lLmVsZW1lbnRzO2ZvcihsZXQgcz0wO3M8MTY7cysrKWlmKG5bc10hPT1pW3NdKXJldHVybiEwO3JldHVybiExfXByZXBhcmVHZW9tZXRyeSgpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeSxlPXQuYXR0cmlidXRlcyxuPWlfKCk7aWYobilmb3IoY29uc3QgaSBpbiBlKXtjb25zdCBzPWVbaV07aWYocy5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXRocm93IG5ldyBFcnJvcigiQnJ1c2g6IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZC4iKTtzLmFycmF5PXdDKHMuYXJyYXkpfWlmKHQuYm91bmRzVHJlZXx8KFRDKHQse3VzZVNoYXJlZEFycmF5QnVmZmVyOm59KSx0LmJvdW5kc1RyZWU9bmV3IHFkKHQse21heExlYWZUcmlzOjMsaW5kaXJlY3Q6ITAsdXNlU2hhcmVkQXJyYXlCdWZmZXI6bn0pKSx0LmhhbGZFZGdlc3x8KHQuaGFsZkVkZ2VzPW5ldyBCQyh0KSksIXQuZ3JvdXBJbmRpY2VzKXtjb25zdCBpPVlkKHQpLHM9bmV3IFVpbnQxNkFycmF5KGkpLG89dC5ncm91cHM7Zm9yKGxldCBhPTAsYz1vLmxlbmd0aDthPGM7YSsrKXtjb25zdHtzdGFydDpsLGNvdW50OnV9PW9bYV07Zm9yKGxldCBoPWwvMyxmPShsK3UpLzM7aDxmO2grKylzW2hdPWF9dC5ncm91cEluZGljZXM9c319ZGlzcG9zZUNhY2hlRGF0YSgpe2NvbnN0e2dlb21ldHJ5OnR9PXRoaXM7dC5oYWxmRWRnZXM9bnVsbCx0LmJvdW5kc1RyZWU9bnVsbCx0Lmdyb3VwSW5kaWNlcz1udWxsfX1jb25zdCBPQz0xZS0xNCxRZD1uZXcgSSxjXz1uZXcgSSxsXz1uZXcgSTtmdW5jdGlvbiB3cihyLHQ9T0Mpe1FkLnN1YlZlY3RvcnMoci5iLHIuYSksY18uc3ViVmVjdG9ycyhyLmMsci5hKSxsXy5zdWJWZWN0b3JzKHIuYixyLmMpO2NvbnN0IGU9UWQuYW5nbGVUbyhjXyksbj1RZC5hbmdsZVRvKGxfKSxpPU1hdGguUEktZS1uO3JldHVybiBNYXRoLmFicyhlKTx0fHxNYXRoLmFicyhuKTx0fHxNYXRoLmFicyhpKTx0fHxyLmEuZGlzdGFuY2VUb1NxdWFyZWQoci5iKTx0fHxyLmEuZGlzdGFuY2VUb1NxdWFyZWQoci5jKTx0fHxyLmIuZGlzdGFuY2VUb1NxdWFyZWQoci5jKTx0fWNvbnN0IHRwPTFlLTEwLEZhPTFlLTEwLHpDPTFlLTEwLHFpPW5ldyBGbixVZT1uZXcgRm4sWWk9bmV3IEksZXA9bmV3IEksdV89bmV3IEksQnU9bmV3IGFpLG5wPW5ldyBabjtjbGFzcyBrQ3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3Bvb2w9W10sdGhpcy5faW5kZXg9MH1nZXRUcmlhbmdsZSgpe3JldHVybiB0aGlzLl9pbmRleD49dGhpcy5fcG9vbC5sZW5ndGgmJnRoaXMuX3Bvb2wucHVzaChuZXcgZ2UpLHRoaXMuX3Bvb2xbdGhpcy5faW5kZXgrK119Y2xlYXIoKXt0aGlzLl9pbmRleD0wfXJlc2V0KCl7dGhpcy5fcG9vbC5sZW5ndGg9MCx0aGlzLl9pbmRleD0wfX1jbGFzcyBWQ3tjb25zdHJ1Y3Rvcigpe3RoaXMudHJpYW5nbGVQb29sPW5ldyBrQyx0aGlzLnRyaWFuZ2xlcz1bXSx0aGlzLm5vcm1hbD1uZXcgSSx0aGlzLmNvcGxhbmFyVHJpYW5nbGVVc2VkPSExfWluaXRpYWxpemUodCl7dGhpcy5yZXNldCgpO2NvbnN0e3RyaWFuZ2xlczplLHRyaWFuZ2xlUG9vbDpuLG5vcm1hbDppfT10aGlzO2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKGxldCBzPTAsbz10Lmxlbmd0aDtzPG87cysrKXtjb25zdCBhPXRbc107aWYocz09PTApYS5nZXROb3JtYWwoaSk7ZWxzZSBpZihNYXRoLmFicygxLWEuZ2V0Tm9ybWFsKFlpKS5kb3QoaSkpPnRwKXRocm93IG5ldyBFcnJvcigiVHJpYW5nbGUgU3BsaXR0ZXI6IENhbm5vdCBpbml0aWFsaXplIHdpdGggdHJpYW5nbGVzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgbm9ybWFscy4iKTtjb25zdCBjPW4uZ2V0VHJpYW5nbGUoKTtjLmNvcHkoYSksZS5wdXNoKGMpfWVsc2V7dC5nZXROb3JtYWwoaSk7Y29uc3Qgcz1uLmdldFRyaWFuZ2xlKCk7cy5jb3B5KHQpLGUucHVzaChzKX19c3BsaXRCeVRyaWFuZ2xlKHQpe2NvbnN0e25vcm1hbDplLHRyaWFuZ2xlczpufT10aGlzO2lmKHQuZ2V0Tm9ybWFsKGVwKS5ub3JtYWxpemUoKSxNYXRoLmFicygxLU1hdGguYWJzKGVwLmRvdChlKSkpPHpDKXt0aGlzLmNvcGxhbmFyVHJpYW5nbGVVc2VkPSEwO2ZvcihsZXQgcz0wLG89bi5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT1uW3NdO2EuY29wbGFuYXJDb3VudD0wfWNvbnN0IGk9W3QuYSx0LmIsdC5jXTtmb3IobGV0IHM9MDtzPDM7cysrKXtjb25zdCBvPShzKzEpJTMsYT1pW3NdLGM9aVtvXTtZaS5zdWJWZWN0b3JzKGMsYSkubm9ybWFsaXplKCksdV8uY3Jvc3NWZWN0b3JzKGVwLFlpKSxCdS5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCh1XyxhKSx0aGlzLnNwbGl0QnlQbGFuZShCdSx0KX19ZWxzZSB0LmdldFBsYW5lKEJ1KSx0aGlzLnNwbGl0QnlQbGFuZShCdSx0KX1zcGxpdEJ5UGxhbmUodCxlKXtjb25zdHt0cmlhbmdsZXM6bix0cmlhbmdsZVBvb2w6aX09dGhpcztucC5jb3B5KGUpLG5wLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgcz0wLG89bi5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT1uW3NdO2lmKCFucC5pbnRlcnNlY3RzVHJpYW5nbGUoYSxxaSwhMCkpY29udGludWU7Y29uc3R7YTpjLGI6bCxjOnV9PWE7bGV0IGg9MCxmPS0xLGQ9ITEscD1bXSx4PVtdO2NvbnN0IGc9W2MsbCx1XTtmb3IobGV0IG09MDttPDM7bSsrKXtjb25zdCB2PShtKzEpJTM7cWkuc3RhcnQuY29weShnW21dKSxxaS5lbmQuY29weShnW3ZdKTtjb25zdCB5PXQuZGlzdGFuY2VUb1BvaW50KHFpLnN0YXJ0KSxfPXQuZGlzdGFuY2VUb1BvaW50KHFpLmVuZCk7aWYoTWF0aC5hYnMoeSk8RmEmJk1hdGguYWJzKF8pPEZhKXtkPSEwO2JyZWFrfWlmKHk+MD9wLnB1c2gobSk6eC5wdXNoKG0pLE1hdGguYWJzKHkpPEZhKWNvbnRpbnVlO2xldCBTPSEhdC5pbnRlcnNlY3RMaW5lKHFpLFlpKTshUyYmTWF0aC5hYnMoXyk8RmEmJihZaS5jb3B5KHFpLmVuZCksUz0hMCksUyYmIShZaS5kaXN0YW5jZVRvKHFpLnN0YXJ0KTx0cCkmJihZaS5kaXN0YW5jZVRvKHFpLmVuZCk8dHAmJihmPW0pLGg9PT0wP1VlLnN0YXJ0LmNvcHkoWWkpOlVlLmVuZC5jb3B5KFlpKSxoKyspfWlmKCFkJiZoPT09MiYmVWUuZGlzdGFuY2UoKT5GYSlpZihmIT09LTEpe2Y9KGYrMSklMztsZXQgbT0wO209PT1mJiYobT0obSsxKSUzKTtsZXQgdj1tKzE7dj09PWYmJih2PSh2KzEpJTMpO2NvbnN0IHk9aS5nZXRUcmlhbmdsZSgpO3kuYS5jb3B5KGdbdl0pLHkuYi5jb3B5KFVlLmVuZCkseS5jLmNvcHkoVWUuc3RhcnQpLHdyKHkpfHxuLnB1c2goeSksYS5hLmNvcHkoZ1ttXSksYS5iLmNvcHkoVWUuc3RhcnQpLGEuYy5jb3B5KFVlLmVuZCksd3IoYSkmJihuLnNwbGljZShzLDEpLHMtLSxvLS0pfWVsc2V7Y29uc3QgbT1wLmxlbmd0aD49Mj94WzBdOnBbMF07aWYobT09PTApe2xldCB3PVVlLnN0YXJ0O1VlLnN0YXJ0PVVlLmVuZCxVZS5lbmQ9d31jb25zdCB2PShtKzEpJTMseT0obSsyKSUzLF89aS5nZXRUcmlhbmdsZSgpLFM9aS5nZXRUcmlhbmdsZSgpO2dbdl0uZGlzdGFuY2VUb1NxdWFyZWQoVWUuc3RhcnQpPGdbeV0uZGlzdGFuY2VUb1NxdWFyZWQoVWUuZW5kKT8oXy5hLmNvcHkoZ1t2XSksXy5iLmNvcHkoVWUuc3RhcnQpLF8uYy5jb3B5KFVlLmVuZCksUy5hLmNvcHkoZ1t2XSksUy5iLmNvcHkoZ1t5XSksUy5jLmNvcHkoVWUuc3RhcnQpKTooXy5hLmNvcHkoZ1t5XSksXy5iLmNvcHkoVWUuc3RhcnQpLF8uYy5jb3B5KFVlLmVuZCksUy5hLmNvcHkoZ1t2XSksUy5iLmNvcHkoZ1t5XSksUy5jLmNvcHkoVWUuZW5kKSksYS5hLmNvcHkoZ1ttXSksYS5iLmNvcHkoVWUuZW5kKSxhLmMuY29weShVZS5zdGFydCksd3IoXyl8fG4ucHVzaChfKSx3cihTKXx8bi5wdXNoKFMpLHdyKGEpJiYobi5zcGxpY2UocywxKSxzLS0sby0tKX1lbHNlIGg9PT0zJiZjb25zb2xlLndhcm4oIlRyaWFuZ2xlQ2xpcHBlcjogQ29wbGFuYXIgY2xpcCBub3QgaGFuZGxlZCIpfX1yZXNldCgpe3RoaXMudHJpYW5nbGVzLmxlbmd0aD0wLHRoaXMudHJpYW5nbGVQb29sLmNsZWFyKCksdGhpcy5jb3BsYW5hclRyaWFuZ2xlVXNlZD0hMX19ZnVuY3Rpb24gR0Mocil7cmV0dXJuIHI9fn5yLHIrNC1yJTR9Y2xhc3MgaF97Y29uc3RydWN0b3IodCxlPTUwMCl7dGhpcy5leHBhbnNpb25GYWN0b3I9MS41LHRoaXMudHlwZT10LHRoaXMubGVuZ3RoPTAsdGhpcy5hcnJheT1udWxsLHRoaXMuc2V0U2l6ZShlKX1zZXRUeXBlKHQpe2lmKHRoaXMubGVuZ3RoIT09MCl0aHJvdyBuZXcgRXJyb3IoIlR5cGVCYWNrZWRBcnJheTogQ2Fubm90IGNoYW5nZSB0aGUgdHlwZSB3aGlsZSB0aGVyZSBpcyB1c2VkIGRhdGEgaW4gdGhlIGJ1ZmZlci4iKTtjb25zdCBlPXRoaXMuYXJyYXkuYnVmZmVyO3RoaXMuYXJyYXk9bmV3IHQoZSksdGhpcy50eXBlPXR9c2V0U2l6ZSh0KXtpZih0aGlzLmFycmF5JiZ0PT09dGhpcy5hcnJheS5sZW5ndGgpcmV0dXJuO2NvbnN0IGU9dGhpcy50eXBlLG49aV8oKT9TaGFyZWRBcnJheUJ1ZmZlcjpBcnJheUJ1ZmZlcixpPW5ldyBlKG5ldyBuKEdDKHQqZS5CWVRFU19QRVJfRUxFTUVOVCkpKTt0aGlzLmFycmF5JiZpLnNldCh0aGlzLmFycmF5LDApLHRoaXMuYXJyYXk9aX1leHBhbmQoKXtjb25zdHthcnJheTp0LGV4cGFuc2lvbkZhY3RvcjplfT10aGlzO3RoaXMuc2V0U2l6ZSh0Lmxlbmd0aCplKX1wdXNoKC4uLnQpe2xldHthcnJheTplLGxlbmd0aDpufT10aGlzO24rdC5sZW5ndGg+ZS5sZW5ndGgmJih0aGlzLmV4cGFuZCgpLGU9dGhpcy5hcnJheSk7Zm9yKGxldCBpPTAscz10Lmxlbmd0aDtpPHM7aSsrKWVbbitpXT10W2ldO3RoaXMubGVuZ3RoKz10Lmxlbmd0aH1jbGVhcigpe3RoaXMubGVuZ3RoPTB9fWNsYXNzIEhDe2NvbnN0cnVjdG9yKCl7dGhpcy5ncm91cEF0dHJpYnV0ZXM9W3t9XSx0aGlzLmdyb3VwQ291bnQ9MH1nZXRUeXBlKHQpe3JldHVybiB0aGlzLmdyb3VwQXR0cmlidXRlc1swXVt0XS50eXBlfWdldEl0ZW1TaXplKHQpe3JldHVybiB0aGlzLmdyb3VwQXR0cmlidXRlc1swXVt0XS5pdGVtU2l6ZX1nZXROb3JtYWxpemVkKHQpe3JldHVybiB0aGlzLmdyb3VwQXR0cmlidXRlc1swXVt0XS5ub3JtYWxpemVkfWdldENvdW50KHQpe2lmKHRoaXMuZ3JvdXBDb3VudDw9dClyZXR1cm4gMDtjb25zdCBlPXRoaXMuZ2V0R3JvdXBBdHRyQXJyYXkoInBvc2l0aW9uIix0KTtyZXR1cm4gZS5sZW5ndGgvZS5pdGVtU2l6ZX1nZXRUb3RhbExlbmd0aCh0KXtjb25zdHtncm91cENvdW50OmUsZ3JvdXBBdHRyaWJ1dGVzOm59PXRoaXM7bGV0IGk9MDtmb3IobGV0IHM9MDtzPGU7cysrKXtjb25zdCBvPW5bc107aSs9b1t0XS5sZW5ndGh9cmV0dXJuIGl9Z2V0R3JvdXBBdHRyU2V0KHQ9MCl7Y29uc3R7Z3JvdXBBdHRyaWJ1dGVzOmV9PXRoaXM7aWYoZVt0XSlyZXR1cm4gdGhpcy5ncm91cENvdW50PU1hdGgubWF4KHRoaXMuZ3JvdXBDb3VudCx0KzEpLGVbdF07Y29uc3Qgbj1lWzBdO2Zvcih0aGlzLmdyb3VwQ291bnQ9TWF0aC5tYXgodGhpcy5ncm91cENvdW50LHQrMSk7dD49ZS5sZW5ndGg7KXtjb25zdCBpPXt9O2UucHVzaChpKTtmb3IoY29uc3QgcyBpbiBuKXtjb25zdCBvPW5bc10sYT1uZXcgaF8oby50eXBlKTthLml0ZW1TaXplPW8uaXRlbVNpemUsYS5ub3JtYWxpemVkPW8ubm9ybWFsaXplZCxpW3NdPWF9fXJldHVybiBlW3RdfWdldEdyb3VwQXR0ckFycmF5KHQsZT0wKXtjb25zdHtncm91cEF0dHJpYnV0ZXM6bn09dGhpcztpZighblswXVt0XSl0aHJvdyBuZXcgRXJyb3IoYFR5cGVkQXR0cmlidXRlRGF0YTogQXR0cmlidXRlIHdpdGggIiR7dH0iIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZGApO3JldHVybiB0aGlzLmdldEdyb3VwQXR0clNldChlKVt0XX1pbml0aWFsaXplQXJyYXkodCxlLG4saSl7Y29uc3R7Z3JvdXBBdHRyaWJ1dGVzOnN9PXRoaXMsYT1zWzBdW3RdO2lmKGEpe2lmKGEudHlwZSE9PWUpZm9yKGxldCBjPTAsbD1zLmxlbmd0aDtjPGw7YysrKXtjb25zdCB1PXNbY11bdF07dS5zZXRUeXBlKGUpLHUuaXRlbVNpemU9bix1Lm5vcm1hbGl6ZWQ9aX19ZWxzZSBmb3IobGV0IGM9MCxsPXMubGVuZ3RoO2M8bDtjKyspe2NvbnN0IHU9bmV3IGhfKGUpO3UuaXRlbVNpemU9bix1Lm5vcm1hbGl6ZWQ9aSxzW2NdW3RdPXV9fWNsZWFyKCl7dGhpcy5ncm91cENvdW50PTA7Y29uc3R7Z3JvdXBBdHRyaWJ1dGVzOnR9PXRoaXM7dC5mb3JFYWNoKGU9Pntmb3IoY29uc3QgbiBpbiBlKWVbbl0uY2xlYXIoKX0pfWRlbGV0ZSh0KXt0aGlzLmdyb3VwQXR0cmlidXRlcy5mb3JFYWNoKGU9PntkZWxldGUgZVt0XX0pfXJlc2V0KCl7dGhpcy5ncm91cEF0dHJpYnV0ZXM9W10sdGhpcy5ncm91cENvdW50PTB9fWNsYXNzIGZfe2NvbnN0cnVjdG9yKCl7dGhpcy5pbnRlcnNlY3Rpb25TZXQ9e30sdGhpcy5pZHM9W119YWRkKHQsZSl7Y29uc3R7aW50ZXJzZWN0aW9uU2V0Om4saWRzOml9PXRoaXM7blt0XXx8KG5bdF09W10saS5wdXNoKHQpKSxuW3RdLnB1c2goZSl9fWNvbnN0IFdDPTAsWEM9MSwkQz0yLGRfPTMscUM9NCxwXz01LG1fPTYsS249bmV3IGhyLGdfPW5ldyBDdCx1bj1uZXcgZ2UsWmk9bmV3IEkseF89bmV3IFF0LF9fPW5ldyBRdCx5Xz1uZXcgUXQsaXA9bmV3IFF0LE91PW5ldyBRdCx6dT1uZXcgUXQsdl89bmV3IEZuLHJwPW5ldyBJLHNwPTFlLTgsWUM9MWUtMTUsY3M9LTEsbHM9MSxrdT0tMixWdT0yLEJhPTAsdXM9MSxvcD0yLFpDPTFlLTE0O2xldCBHdT1udWxsO2Z1bmN0aW9uIE1fKHIpe0d1PXJ9ZnVuY3Rpb24gU18ocix0KXtyLmdldE1pZHBvaW50KEtuLm9yaWdpbiksci5nZXROb3JtYWwoS24uZGlyZWN0aW9uKTtjb25zdCBlPXQucmF5Y2FzdEZpcnN0KEtuLFBuKTtyZXR1cm4hIShlJiZLbi5kaXJlY3Rpb24uZG90KGUuZmFjZS5ub3JtYWwpPjApP2NzOmxzfWZ1bmN0aW9uIEpDKHIsdCl7ZnVuY3Rpb24gZSgpe3JldHVybiBNYXRoLnJhbmRvbSgpLS41fXIuZ2V0Tm9ybWFsKHJwKSxLbi5kaXJlY3Rpb24uY29weShycCksci5nZXRNaWRwb2ludChLbi5vcmlnaW4pO2NvbnN0IG49MztsZXQgaT0wLHM9MS8wO2ZvcihsZXQgbz0wO288bjtvKyspe0tuLmRpcmVjdGlvbi54Kz1lKCkqc3AsS24uZGlyZWN0aW9uLnkrPWUoKSpzcCxLbi5kaXJlY3Rpb24ueis9ZSgpKnNwLEtuLmRpcmVjdGlvbi5tdWx0aXBseVNjYWxhcigtMSk7Y29uc3QgYT10LnJheWNhc3RGaXJzdChLbixQbik7aWYoISEoYSYmS24uZGlyZWN0aW9uLmRvdChhLmZhY2Uubm9ybWFsKT4wKSYmaSsrLGEhPT1udWxsJiYocz1NYXRoLm1pbihzLGEuZGlzdGFuY2UpKSxzPD1ZQylyZXR1cm4gYS5mYWNlLm5vcm1hbC5kb3QocnApPjA/VnU6a3U7aWYoaS9uPi41fHwoby1pKzEpL24+LjUpYnJlYWt9cmV0dXJuIGkvbj4uNT9jczpsc31mdW5jdGlvbiBLQyhyLHQpe2NvbnN0IGU9bmV3IGZfLG49bmV3IGZfO3JldHVybiBnXy5jb3B5KHIubWF0cml4V29ybGQpLmludmVydCgpLm11bHRpcGx5KHQubWF0cml4V29ybGQpLHIuZ2VvbWV0cnkuYm91bmRzVHJlZS5idmhjYXN0KHQuZ2VvbWV0cnkuYm91bmRzVHJlZSxnXyx7aW50ZXJzZWN0c1RyaWFuZ2xlcyhpLHMsbyxhKXtpZighd3IoaSkmJiF3cihzKSl7bGV0IGM9aS5pbnRlcnNlY3RzVHJpYW5nbGUocyx2XywhMCk7aWYoIWMpe2NvbnN0IGw9aS5wbGFuZSx1PXMucGxhbmUsaD1sLm5vcm1hbCxmPXUubm9ybWFsO2guZG90KGYpPT09MSYmTWF0aC5hYnMobC5jb25zdGFudC11LmNvbnN0YW50KTxaQyYmKGM9ITApfWlmKGMpe2xldCBsPXIuZ2VvbWV0cnkuYm91bmRzVHJlZS5yZXNvbHZlVHJpYW5nbGVJbmRleChvKSx1PXQuZ2VvbWV0cnkuYm91bmRzVHJlZS5yZXNvbHZlVHJpYW5nbGVJbmRleChhKTtlLmFkZChsLHUpLG4uYWRkKHUsbCksR3UmJihHdS5hZGRFZGdlKHZfKSxHdS5hZGRJbnRlcnNlY3RpbmdUcmlhbmdsZXMobyxpLGEscykpfX1yZXR1cm4hMX19KSx7YUludGVyc2VjdGlvbnM6ZSxiSW50ZXJzZWN0aW9uczpufX1mdW5jdGlvbiBqQyhyLHQsZSxuLGkscyxvPSExKXtjb25zdCBhPWUuYXR0cmlidXRlcyxjPWUuaW5kZXgsbD1yKjMsdT1jLmdldFgobCswKSxoPWMuZ2V0WChsKzEpLGY9Yy5nZXRYKGwrMik7Zm9yKGNvbnN0IGQgaW4gcyl7Y29uc3QgcD1hW2RdLHg9c1tkXTtpZighKGQgaW4gYSkpdGhyb3cgbmV3IEVycm9yKGBDU0cgT3BlcmF0aW9uczogQXR0cmlidXRlICR7ZH0gbm90IGF2YWlsYWJsZSBvbiBnZW9tZXRyeS5gKTtjb25zdCBnPXAuaXRlbVNpemU7ZD09PSJwb3NpdGlvbiI/KHVuLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLHUpLmFwcGx5TWF0cml4NChuKSx1bi5iLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxoKS5hcHBseU1hdHJpeDQobiksdW4uYy5mcm9tQnVmZmVyQXR0cmlidXRlKHAsZikuYXBwbHlNYXRyaXg0KG4pLGFwKHVuLmEsdW4uYix1bi5jLHQsMyx4LG8pKTpkPT09Im5vcm1hbCI/KHVuLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLHUpLmFwcGx5Tm9ybWFsTWF0cml4KGkpLHVuLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGgpLmFwcGx5Tm9ybWFsTWF0cml4KGkpLHVuLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGYpLmFwcGx5Tm9ybWFsTWF0cml4KGkpLG8mJih1bi5hLm11bHRpcGx5U2NhbGFyKC0xKSx1bi5iLm11bHRpcGx5U2NhbGFyKC0xKSx1bi5jLm11bHRpcGx5U2NhbGFyKC0xKSksYXAodW4uYSx1bi5iLHVuLmMsdCwzLHgsbywhMCkpOih4Xy5mcm9tQnVmZmVyQXR0cmlidXRlKHAsdSksX18uZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGgpLHlfLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxmKSxhcCh4XyxfXyx5Xyx0LGcseCxvKSl9fWZ1bmN0aW9uIFFDKHIsdCxlLG4saSxzLG8sYT0hMSl7Y3AocixuLGkscyxvLGEpLGNwKGE/ZTp0LG4saSxzLG8sYSksY3AoYT90OmUsbixpLHMsbyxhKX1mdW5jdGlvbiBiXyhyLHQsZT0hMSl7c3dpdGNoKHIpe2Nhc2UgV0M6aWYodD09PWxzfHx0PT09VnUmJiFlKXJldHVybiB1czticmVhaztjYXNlIFhDOmlmKGUpe2lmKHQ9PT1jcylyZXR1cm4gQmF9ZWxzZSBpZih0PT09bHN8fHQ9PT1rdSlyZXR1cm4gdXM7YnJlYWs7Y2FzZSAkQzppZihlKXtpZih0PT09bHN8fHQ9PT1rdSlyZXR1cm4gdXN9ZWxzZSBpZih0PT09Y3MpcmV0dXJuIEJhO2JyZWFrO2Nhc2UgcUM6aWYodD09PWNzKXJldHVybiBCYTtpZih0PT09bHMpcmV0dXJuIHVzO2JyZWFrO2Nhc2UgZF86aWYodD09PWNzfHx0PT09VnUmJiFlKXJldHVybiB1czticmVhaztjYXNlIHBfOmlmKCFlJiYodD09PWxzfHx0PT09a3UpKXJldHVybiB1czticmVhaztjYXNlIG1fOmlmKCFlJiYodD09PWNzfHx0PT09VnUpKXJldHVybiB1czticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIENTRyBvcGVyYXRpb24gZW51bSAiJHtyfSIuYCl9cmV0dXJuIG9wfWZ1bmN0aW9uIGFwKHIsdCxlLG4saSxzLG89ITEsYT0hMSl7Y29uc3QgYz1sPT57cy5wdXNoKGwueCksaT4xJiZzLnB1c2gobC55KSxpPjImJnMucHVzaChsLnopLGk+MyYmcy5wdXNoKGwudyl9O2lwLnNldCgwLDAsMCwwKS5hZGRTY2FsZWRWZWN0b3IocixuLmEueCkuYWRkU2NhbGVkVmVjdG9yKHQsbi5hLnkpLmFkZFNjYWxlZFZlY3RvcihlLG4uYS56KSxPdS5zZXQoMCwwLDAsMCkuYWRkU2NhbGVkVmVjdG9yKHIsbi5iLngpLmFkZFNjYWxlZFZlY3Rvcih0LG4uYi55KS5hZGRTY2FsZWRWZWN0b3IoZSxuLmIueiksenUuc2V0KDAsMCwwLDApLmFkZFNjYWxlZFZlY3RvcihyLG4uYy54KS5hZGRTY2FsZWRWZWN0b3IodCxuLmMueSkuYWRkU2NhbGVkVmVjdG9yKGUsbi5jLnopLGEmJihpcC5ub3JtYWxpemUoKSxPdS5ub3JtYWxpemUoKSx6dS5ub3JtYWxpemUoKSksYyhpcCksbz8oYyh6dSksYyhPdSkpOihjKE91KSxjKHp1KSl9ZnVuY3Rpb24gY3Aocix0LGUsbixpLHM9ITEpe2Zvcihjb25zdCBvIGluIGkpe2NvbnN0IGE9dFtvXSxjPWlbb107aWYoIShvIGluIHQpKXRocm93IG5ldyBFcnJvcihgQ1NHIE9wZXJhdGlvbnM6IEF0dHJpYnV0ZSAke299IG5vIGF2YWlsYWJsZSBvbiBnZW9tZXRyeS5gKTtjb25zdCBsPWEuaXRlbVNpemU7bz09PSJwb3NpdGlvbiI/KFppLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxyKS5hcHBseU1hdHJpeDQoZSksYy5wdXNoKFppLngsWmkueSxaaS56KSk6bz09PSJub3JtYWwiPyhaaS5mcm9tQnVmZmVyQXR0cmlidXRlKGEscikuYXBwbHlOb3JtYWxNYXRyaXgobikscyYmWmkubXVsdGlwbHlTY2FsYXIoLTEpLGMucHVzaChaaS54LFppLnksWmkueikpOihjLnB1c2goYS5nZXRYKHIpKSxsPjEmJmMucHVzaChhLmdldFkocikpLGw+MiYmYy5wdXNoKGEuZ2V0WihyKSksbD4zJiZjLnB1c2goYS5nZXRXKHIpKSl9fWNsYXNzIHRSe2NvbnN0cnVjdG9yKHQpe3RoaXMudHJpYW5nbGU9bmV3IGdlKCkuY29weSh0KSx0aGlzLmludGVyc2VjdHM9e319YWRkVHJpYW5nbGUodCxlKXt0aGlzLmludGVyc2VjdHNbdF09bmV3IGdlKCkuY29weShlKX1nZXRJbnRlcnNlY3RBcnJheSgpe2NvbnN0IHQ9W10se2ludGVyc2VjdHM6ZX09dGhpcztmb3IoY29uc3QgbiBpbiBlKXQucHVzaChlW25dKTtyZXR1cm4gdH19Y2xhc3Mgd197Y29uc3RydWN0b3IoKXt0aGlzLmRhdGE9e319YWRkVHJpYW5nbGVJbnRlcnNlY3Rpb24odCxlLG4saSl7Y29uc3R7ZGF0YTpzfT10aGlzO3NbdF18fChzW3RdPW5ldyB0UihlKSksc1t0XS5hZGRUcmlhbmdsZShuLGkpfWdldFRyaWFuZ2xlc0FzQXJyYXkodD1udWxsKXtjb25zdHtkYXRhOmV9PXRoaXMsbj1bXTtpZih0IT09bnVsbCl0IGluIGUmJm4ucHVzaChlW3RdLnRyaWFuZ2xlKTtlbHNlIGZvcihjb25zdCBpIGluIGUpbi5wdXNoKGVbaV0udHJpYW5nbGUpO3JldHVybiBufWdldFRyaWFuZ2xlSW5kaWNlcygpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLmRhdGEpLm1hcCh0PT5wYXJzZUludCh0KSl9Z2V0SW50ZXJzZWN0aW9uSW5kaWNlcyh0KXtjb25zdHtkYXRhOmV9PXRoaXM7cmV0dXJuIGVbdF0/T2JqZWN0LmtleXMoZVt0XS5pbnRlcnNlY3RzKS5tYXAobj0+cGFyc2VJbnQobikpOltdfWdldEludGVyc2VjdGlvbnNBc0FycmF5KHQ9bnVsbCxlPW51bGwpe2NvbnN0e2RhdGE6bn09dGhpcyxpPW5ldyBTZXQscz1bXSxvPWE9PntpZihuW2FdKWlmKGUhPT1udWxsKW5bYV0uaW50ZXJzZWN0c1tlXSYmcy5wdXNoKG5bYV0uaW50ZXJzZWN0c1tlXSk7ZWxzZXtjb25zdCBjPW5bYV0uaW50ZXJzZWN0cztmb3IoY29uc3QgbCBpbiBjKWkuaGFzKGwpfHwoaS5hZGQobCkscy5wdXNoKGNbbF0pKX19O2lmKHQhPT1udWxsKW8odCk7ZWxzZSBmb3IoY29uc3QgYSBpbiBuKW8oYSk7cmV0dXJuIHN9cmVzZXQoKXt0aGlzLmRhdGE9e319fWNsYXNzIGVSe2NvbnN0cnVjdG9yKCl7dGhpcy5lbmFibGVkPSExLHRoaXMudHJpYW5nbGVJbnRlcnNlY3RzQT1uZXcgd18sdGhpcy50cmlhbmdsZUludGVyc2VjdHNCPW5ldyB3Xyx0aGlzLmludGVyc2VjdGlvbkVkZ2VzPVtdfWFkZEludGVyc2VjdGluZ1RyaWFuZ2xlcyh0LGUsbixpKXtjb25zdHt0cmlhbmdsZUludGVyc2VjdHNBOnMsdHJpYW5nbGVJbnRlcnNlY3RzQjpvfT10aGlzO3MuYWRkVHJpYW5nbGVJbnRlcnNlY3Rpb24odCxlLG4saSksby5hZGRUcmlhbmdsZUludGVyc2VjdGlvbihuLGksdCxlKX1hZGRFZGdlKHQpe3RoaXMuaW50ZXJzZWN0aW9uRWRnZXMucHVzaCh0LmNsb25lKCkpfXJlc2V0KCl7dGhpcy50cmlhbmdsZUludGVyc2VjdHNBLnJlc2V0KCksdGhpcy50cmlhbmdsZUludGVyc2VjdHNCLnJlc2V0KCksdGhpcy5pbnRlcnNlY3Rpb25FZGdlcz1bXX1pbml0KCl7dGhpcy5lbmFibGVkJiYodGhpcy5yZXNldCgpLE1fKHRoaXMpKX1jb21wbGV0ZSgpe3RoaXMuZW5hYmxlZCYmTV8obnVsbCl9fWNvbnN0IEFyPW5ldyBDdCxIdT1uZXcgV3QsaHM9bmV3IGdlLFd1PW5ldyBnZSxUcj1uZXcgZ2UsWHU9bmV3IGdlLGhpPVtdLGZzPVtdO2Z1bmN0aW9uIG5SKHIpe2Zvcihjb25zdCB0IG9mIHIpcmV0dXJuIHR9ZnVuY3Rpb24gaVIocix0LGUsbixpLHM9e30pe2NvbnN0e3VzZUdyb3VwczpvPSEwfT1zLHthSW50ZXJzZWN0aW9uczphLGJJbnRlcnNlY3Rpb25zOmN9PUtDKHIsdCksbD1bXTtsZXQgdT1udWxsLGg7cmV0dXJuIGg9bz8wOi0xLEFfKHIsdCxhLGUsITEsbixpLGgpLFRfKHIsdCxhLGUsITEsaSxoKSxlLmZpbmRJbmRleChkPT5kIT09bV8mJmQhPT1wXykhPT0tMSYmKGg9bz9yLmdlb21ldHJ5Lmdyb3Vwcy5sZW5ndGh8fDE6LTEsQV8odCxyLGMsZSwhMCxuLGksaCksVF8odCxyLGMsZSwhMCxpLGgpKSxoaS5sZW5ndGg9MCxmcy5sZW5ndGg9MCx7Z3JvdXBzOmwsbWF0ZXJpYWxzOnV9fWZ1bmN0aW9uIEFfKHIsdCxlLG4saSxzLG8sYT0wKXtjb25zdCBjPXIubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKTwwO0FyLmNvcHkodC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkoci5tYXRyaXhXb3JsZCksSHUuZ2V0Tm9ybWFsTWF0cml4KHIubWF0cml4V29ybGQpLm11bHRpcGx5U2NhbGFyKGM/LTE6MSk7Y29uc3QgbD1yLmdlb21ldHJ5Lmdyb3VwSW5kaWNlcyx1PXIuZ2VvbWV0cnkuaW5kZXgsaD1yLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZj10Lmdlb21ldHJ5LmJvdW5kc1RyZWUsZD10Lmdlb21ldHJ5LmluZGV4LHA9dC5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHg9ZS5pZHMsZz1lLmludGVyc2VjdGlvblNldDtmb3IobGV0IG09MCx2PXgubGVuZ3RoO208djttKyspe2NvbnN0IHk9eFttXSxfPWE9PT0tMT8wOmxbeV0rYSxTPTMqeSx3PXUuZ2V0WChTKzApLEE9dS5nZXRYKFMrMSksVD11LmdldFgoUysyKTtocy5hLmZyb21CdWZmZXJBdHRyaWJ1dGUoaCx3KS5hcHBseU1hdHJpeDQoQXIpLGhzLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShoLEEpLmFwcGx5TWF0cml4NChBciksaHMuYy5mcm9tQnVmZmVyQXR0cmlidXRlKGgsVCkuYXBwbHlNYXRyaXg0KEFyKSxzLnJlc2V0KCkscy5pbml0aWFsaXplKGhzKTtjb25zdCBiPWdbeV07Zm9yKGxldCBFPTAsRD1iLmxlbmd0aDtFPEQ7RSsrKXtjb25zdCBMPTMqYltFXSxGPWQuZ2V0WChMKzApLE49ZC5nZXRYKEwrMSksTz1kLmdldFgoTCsyKTtXdS5hLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxGKSxXdS5iLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxOKSxXdS5jLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxPKSxzLnNwbGl0QnlUcmlhbmdsZShXdSl9Y29uc3QgTT1zLnRyaWFuZ2xlcztmb3IobGV0IEU9MCxEPU0ubGVuZ3RoO0U8RDtFKyspe2NvbnN0IEw9TVtFXSxGPXMuY29wbGFuYXJUcmlhbmdsZVVzZWQ/SkMoTCxmKTpTXyhMLGYpO2hpLmxlbmd0aD0wLGZzLmxlbmd0aD0wO2ZvcihsZXQgTj0wLE89bi5sZW5ndGg7TjxPO04rKyl7Y29uc3QgSD1iXyhuW05dLEYsaSk7SCE9PW9wJiYoZnMucHVzaChIKSxoaS5wdXNoKG9bTl0uZ2V0R3JvdXBBdHRyU2V0KF8pKSl9aWYoaGkubGVuZ3RoIT09MCl7aHMuZ2V0QmFyeWNvb3JkKEwuYSxYdS5hKSxocy5nZXRCYXJ5Y29vcmQoTC5iLFh1LmIpLGhzLmdldEJhcnljb29yZChMLmMsWHUuYyk7Zm9yKGxldCBOPTAsTz1oaS5sZW5ndGg7TjxPO04rKyl7Y29uc3QgSD1oaVtOXSxRPWZzW05dPT09QmE7akMoeSxYdSxyLmdlb21ldHJ5LHIubWF0cml4V29ybGQsSHUsSCxjIT09USl9fX19cmV0dXJuIHgubGVuZ3RofWZ1bmN0aW9uIFRfKHIsdCxlLG4saSxzLG89MCl7Y29uc3QgYT1yLm1hdHJpeFdvcmxkLmRldGVybWluYW50KCk8MDtBci5jb3B5KHQubWF0cml4V29ybGQpLmludmVydCgpLm11bHRpcGx5KHIubWF0cml4V29ybGQpLEh1LmdldE5vcm1hbE1hdHJpeChyLm1hdHJpeFdvcmxkKS5tdWx0aXBseVNjYWxhcihhPy0xOjEpO2NvbnN0IGM9dC5nZW9tZXRyeS5ib3VuZHNUcmVlLGw9ci5nZW9tZXRyeS5ncm91cEluZGljZXMsdT1yLmdlb21ldHJ5LmluZGV4LGg9ci5nZW9tZXRyeS5hdHRyaWJ1dGVzLGY9aC5wb3NpdGlvbixkPVtdLHA9ci5nZW9tZXRyeS5oYWxmRWRnZXMseD1uZXcgU2V0LGc9WWQoci5nZW9tZXRyeSk7Zm9yKGxldCBtPTAsdj1nO208djttKyspbSBpbiBlLmludGVyc2VjdGlvblNldHx8eC5hZGQobSk7Zm9yKDt4LnNpemU+MDspe2NvbnN0IG09blIoeCk7eC5kZWxldGUobSksZC5wdXNoKG0pO2NvbnN0IHY9MyptLHk9dS5nZXRYKHYrMCksXz11LmdldFgodisxKSxTPXUuZ2V0WCh2KzIpO1RyLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLHkpLmFwcGx5TWF0cml4NChBciksVHIuYi5mcm9tQnVmZmVyQXR0cmlidXRlKGYsXykuYXBwbHlNYXRyaXg0KEFyKSxUci5jLmZyb21CdWZmZXJBdHRyaWJ1dGUoZixTKS5hcHBseU1hdHJpeDQoQXIpO2NvbnN0IHc9U18oVHIsYyk7ZnMubGVuZ3RoPTAsaGkubGVuZ3RoPTA7Zm9yKGxldCBBPTAsVD1uLmxlbmd0aDtBPFQ7QSsrKXtjb25zdCBiPWJfKG5bQV0sdyxpKTtiIT09b3AmJihmcy5wdXNoKGIpLGhpLnB1c2goc1tBXSkpfWZvcig7ZC5sZW5ndGg+MDspe2NvbnN0IEE9ZC5wb3AoKTtmb3IobGV0IFQ9MDtUPDM7VCsrKXtjb25zdCBiPXAuZ2V0U2libGluZ1RyaWFuZ2xlSW5kZXgoQSxUKTtiIT09LTEmJnguaGFzKGIpJiYoZC5wdXNoKGIpLHguZGVsZXRlKGIpKX1pZihoaS5sZW5ndGghPT0wKXtjb25zdCBUPTMqQSxiPXUuZ2V0WChUKzApLE09dS5nZXRYKFQrMSksRT11LmdldFgoVCsyKSxEPW89PT0tMT8wOmxbQV0rbztpZihUci5hLmZyb21CdWZmZXJBdHRyaWJ1dGUoZixiKSxUci5iLmZyb21CdWZmZXJBdHRyaWJ1dGUoZixNKSxUci5jLmZyb21CdWZmZXJBdHRyaWJ1dGUoZixFKSwhd3IoVHIpKWZvcihsZXQgTD0wLEY9aGkubGVuZ3RoO0w8RjtMKyspe2NvbnN0IE49ZnNbTF0sTz1oaVtMXS5nZXRHcm91cEF0dHJTZXQoRCksSD1OPT09QmE7UUMoYixNLEUsaCxyLm1hdHJpeFdvcmxkLEh1LE8sSCE9PWEpfX19fX1mdW5jdGlvbiByUihyKXtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoLTE7dCsrKXtjb25zdCBlPXJbdF0sbj1yW3QrMV07aWYoZS5tYXRlcmlhbEluZGV4PT09bi5tYXRlcmlhbEluZGV4KXtjb25zdCBpPWUuc3RhcnQscz1uLnN0YXJ0K24uY291bnQ7bi5zdGFydD1pLG4uY291bnQ9cy1pLHIuc3BsaWNlKHQsMSksdC0tfX19ZnVuY3Rpb24gc1Iocix0LGUsbil7ZS5jbGVhcigpO2NvbnN0IGk9ci5hdHRyaWJ1dGVzO2ZvcihsZXQgcz0wLG89bi5sZW5ndGg7czxvO3MrKyl7Y29uc3QgYT1uW3NdLGM9aVthXTtlLmluaXRpYWxpemVBcnJheShhLGMuYXJyYXkuY29uc3RydWN0b3IsYy5pdGVtU2l6ZSxjLm5vcm1hbGl6ZWQpfWZvcihjb25zdCBzIGluIGUuYXR0cmlidXRlcyluLmluY2x1ZGVzKHMpfHxlLmRlbGV0ZShzKTtmb3IoY29uc3QgcyBpbiB0LmF0dHJpYnV0ZXMpbi5pbmNsdWRlcyhzKXx8KHQuZGVsZXRlQXR0cmlidXRlKHMpLHQuZGlzcG9zZSgpKX1mdW5jdGlvbiBvUihyLHQsZSl7bGV0IG49ITEsaT0tMTtjb25zdCBzPXIuYXR0cmlidXRlcyxvPXQuZ3JvdXBBdHRyaWJ1dGVzWzBdO2Zvcihjb25zdCBjIGluIG8pe2NvbnN0IGw9dC5nZXRUb3RhbExlbmd0aChjKSx1PXQuZ2V0VHlwZShjKSxoPXQuZ2V0SXRlbVNpemUoYyksZj10LmdldE5vcm1hbGl6ZWQoYyk7bGV0IGQ9c1tjXTsoIWR8fGQuYXJyYXkubGVuZ3RoPGwpJiYoZD1uZXcgSnQobmV3IHUobCksaCxmKSxyLnNldEF0dHJpYnV0ZShjLGQpLG49ITApO2xldCBwPTA7Zm9yKGxldCB4PTAsZz1NYXRoLm1pbihlLmxlbmd0aCx0Lmdyb3VwQ291bnQpO3g8Zzt4Kyspe2NvbnN0IG09ZVt4XS5pbmRleCx7YXJyYXk6dix0eXBlOnksbGVuZ3RoOl99PXQuZ3JvdXBBdHRyaWJ1dGVzW21dW2NdLFM9bmV3IHkodi5idWZmZXIsMCxfKTtkLmFycmF5LnNldChTLHApLHArPVMubGVuZ3RofWQubmVlZHNVcGRhdGU9ITAsaT1sL2QuaXRlbVNpemV9aWYoci5pbmRleCl7Y29uc3QgYz1yLmluZGV4LmFycmF5O2lmKGMubGVuZ3RoPGkpci5pbmRleD1udWxsLG49ITA7ZWxzZSBmb3IobGV0IGw9MCx1PWMubGVuZ3RoO2w8dTtsKyspY1tsXT1sfWxldCBhPTA7ci5jbGVhckdyb3VwcygpO2ZvcihsZXQgYz0wLGw9TWF0aC5taW4oZS5sZW5ndGgsdC5ncm91cENvdW50KTtjPGw7YysrKXtjb25zdHtpbmRleDp1LG1hdGVyaWFsSW5kZXg6aH09ZVtjXSxmPXQuZ2V0Q291bnQodSk7ZiE9PTAmJihyLmFkZEdyb3VwKGEsZixoKSxhKz1mKX1yLnNldERyYXdSYW5nZSgwLGkpLHIuYm91bmRzVHJlZT1udWxsLG4mJnIuZGlzcG9zZSgpfWZ1bmN0aW9uIEVfKHIsdCl7bGV0IGU9dDtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KXx8KGU9W10sci5mb3JFYWNoKG49PntlW24ubWF0ZXJpYWxJbmRleF09dH0pKSxlfWNsYXNzIGFSe2NvbnN0cnVjdG9yKCl7dGhpcy50cmlhbmdsZVNwbGl0dGVyPW5ldyBWQyx0aGlzLmF0dHJpYnV0ZURhdGE9W10sdGhpcy5hdHRyaWJ1dGVzPVsicG9zaXRpb24iLCJ1diIsIm5vcm1hbCJdLHRoaXMudXNlR3JvdXBzPSEwLHRoaXMuY29uc29saWRhdGVHcm91cHM9ITAsdGhpcy5kZWJ1Zz1uZXcgZVJ9Z2V0R3JvdXBSYW5nZXModCl7cmV0dXJuIXRoaXMudXNlR3JvdXBzfHx0Lmdyb3Vwcy5sZW5ndGg9PT0wP1t7c3RhcnQ6MCxjb3VudDoxLzAsbWF0ZXJpYWxJbmRleDowfV06dC5ncm91cHMubWFwKGU9PldlKHt9LGUpKX1ldmFsdWF0ZSh0LGUsbixpPW5ldyBGdSl7bGV0IHM9ITA7aWYoQXJyYXkuaXNBcnJheShuKXx8KG49W25dKSxBcnJheS5pc0FycmF5KGkpfHwoaT1baV0scz0hMSksaS5sZW5ndGghPT1uLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkV2YWx1YXRvcjogb3BlcmF0aW9ucyBhbmQgdGFyZ2V0IGFycmF5IHBhc3NlZCBhcyBkaWZmZXJlbnQgc2l6ZXMuIik7dC5wcmVwYXJlR2VvbWV0cnkoKSxlLnByZXBhcmVHZW9tZXRyeSgpO2NvbnN0e3RyaWFuZ2xlU3BsaXR0ZXI6byxhdHRyaWJ1dGVEYXRhOmEsYXR0cmlidXRlczpjLHVzZUdyb3VwczpsLGNvbnNvbGlkYXRlR3JvdXBzOnUsZGVidWc6aH09dGhpcztmb3IoO2EubGVuZ3RoPGkubGVuZ3RoOylhLnB1c2gobmV3IEhDKTtpLmZvckVhY2goKG0sdik9PntzUih0Lmdlb21ldHJ5LG0uZ2VvbWV0cnksYVt2XSxjKX0pLGguaW5pdCgpLGlSKHQsZSxuLG8sYSx7dXNlR3JvdXBzOmx9KSxoLmNvbXBsZXRlKCk7Y29uc3QgZj10aGlzLmdldEdyb3VwUmFuZ2VzKHQuZ2VvbWV0cnkpLGQ9RV8oZix0Lm1hdGVyaWFsKSxwPXRoaXMuZ2V0R3JvdXBSYW5nZXMoZS5nZW9tZXRyeSkseD1FXyhwLGUubWF0ZXJpYWwpO3AuZm9yRWFjaChtPT5tLm1hdGVyaWFsSW5kZXgrPWQubGVuZ3RoKTtsZXQgZz1bLi4uZiwuLi5wXS5tYXAoKG0sdik9PmdpKFdlKHt9LG0pLHtpbmRleDp2fSkpO2lmKGwpe2NvbnN0IG09Wy4uLmQsLi4ueF07dSYmKGc9Zy5tYXAoeT0+e2NvbnN0IF89bVt5Lm1hdGVyaWFsSW5kZXhdO3JldHVybiB5Lm1hdGVyaWFsSW5kZXg9bS5pbmRleE9mKF8pLHl9KS5zb3J0KCh5LF8pPT55Lm1hdGVyaWFsSW5kZXgtXy5tYXRlcmlhbEluZGV4KSk7Y29uc3Qgdj1bXTtmb3IobGV0IHk9MCxfPW0ubGVuZ3RoO3k8Xzt5Kyspe2xldCBTPSExO2ZvcihsZXQgdz0wLEE9Zy5sZW5ndGg7dzxBO3crKyl7Y29uc3QgVD1nW3ddO1QubWF0ZXJpYWxJbmRleD09PXkmJihTPSEwLFQubWF0ZXJpYWxJbmRleD12Lmxlbmd0aCl9UyYmdi5wdXNoKG1beV0pfWkuZm9yRWFjaCh5PT57eS5tYXRlcmlhbD12fSl9ZWxzZSBnPVt7c3RhcnQ6MCxjb3VudDoxLzAsaW5kZXg6MCxtYXRlcmlhbEluZGV4OjB9XSxpLmZvckVhY2gobT0+e20ubWF0ZXJpYWw9ZFswXX0pO3JldHVybiBpLmZvckVhY2goKG0sdik9Pntjb25zdCB5PW0uZ2VvbWV0cnk7b1IoeSxhW3ZdLGcpLHUmJnJSKHkuZ3JvdXBzKX0pLHM/aTppWzBdfWV2YWx1YXRlSGllcmFyY2h5KHQsZT1uZXcgRnUpe3QudXBkYXRlTWF0cml4V29ybGQoITApO2NvbnN0IG49KHMsbyk9Pntjb25zdCBhPXMuY2hpbGRyZW47Zm9yKGxldCBjPTAsbD1hLmxlbmd0aDtjPGw7YysrKXtjb25zdCB1PWFbY107dS5pc09wZXJhdGlvbkdyb3VwP24odSxvKTpvKHUpfX0saT1zPT57Y29uc3Qgbz1zLmNoaWxkcmVuO2xldCBhPSExO2ZvcihsZXQgbD0wLHU9by5sZW5ndGg7bDx1O2wrKyl7Y29uc3QgaD1vW2xdO2E9aShoKXx8YX1jb25zdCBjPXMuaXNEaXJ0eSgpO2lmKGMmJnMubWFya1VwZGF0ZWQoKSxhJiYhcy5pc09wZXJhdGlvbkdyb3VwKXtsZXQgbDtyZXR1cm4gbihzLHU9PntsP2w9dGhpcy5ldmFsdWF0ZShsLHUsdS5vcGVyYXRpb24pOmw9dGhpcy5ldmFsdWF0ZShzLHUsdS5vcGVyYXRpb24pfSkscy5fY2FjaGVkR2VvbWV0cnk9bC5nZW9tZXRyeSxzLl9jYWNoZWRNYXRlcmlhbHM9bC5tYXRlcmlhbCwhMH1lbHNlIHJldHVybiBhfHxjfTtyZXR1cm4gaSh0KSxlLmdlb21ldHJ5PXQuX2NhY2hlZEdlb21ldHJ5LGUubWF0ZXJpYWw9dC5fY2FjaGVkTWF0ZXJpYWxzLGV9cmVzZXQoKXt0aGlzLnRyaWFuZ2xlU3BsaXR0ZXIucmVzZXQoKX19ZnVuY3Rpb24gQ18ocil7bGV0IHQsZSxuLGk9LTEscz0wO2ZvcihsZXQgbD0wO2w8ci5sZW5ndGg7KytsKXtjb25zdCB1PXJbbF07aWYodD09PXZvaWQgMCYmKHQ9dS5hcnJheS5jb25zdHJ1Y3RvciksdCE9PXUuYXJyYXkuY29uc3RydWN0b3IpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5hcnJheSBtdXN0IGJlIG9mIGNvbnNpc3RlbnQgYXJyYXkgdHlwZXMgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihlPT09dm9pZCAwJiYoZT11Lml0ZW1TaXplKSxlIT09dS5pdGVtU2l6ZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLml0ZW1TaXplIG11c3QgYmUgY29uc2lzdGVudCBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO2lmKG49PT12b2lkIDAmJihuPXUubm9ybWFsaXplZCksbiE9PXUubm9ybWFsaXplZClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLm5vcm1hbGl6ZWQgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7aWYoaT09PS0xJiYoaT11LmdwdVR5cGUpLGkhPT11LmdwdVR5cGUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5ncHVUeXBlIG11c3QgYmUgY29uc2lzdGVudCBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO3MrPXUuY291bnQqZX1jb25zdCBvPW5ldyB0KHMpLGE9bmV3IEp0KG8sZSxuKTtsZXQgYz0wO2ZvcihsZXQgbD0wO2w8ci5sZW5ndGg7KytsKXtjb25zdCB1PXJbbF07aWYodS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXtjb25zdCBoPWMvZTtmb3IobGV0IGY9MCxkPXUuY291bnQ7ZjxkO2YrKylmb3IobGV0IHA9MDtwPGU7cCsrKXtjb25zdCB4PXUuZ2V0Q29tcG9uZW50KGYscCk7YS5zZXRDb21wb25lbnQoZitoLHAseCl9fWVsc2Ugby5zZXQodS5hcnJheSxjKTtjKz11LmNvdW50KmV9cmV0dXJuIGkhPT12b2lkIDAmJihhLmdwdVR5cGU9aSksYX1mdW5jdGlvbiBjUihyKXtpZihyLmdyb3Vwcy5sZW5ndGg9PT0wKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VHcm91cHMoKTogTm8gZ3JvdXBzIGFyZSBkZWZpbmVkLiBOb3RoaW5nIHRvIG1lcmdlLiIpLHI7bGV0IHQ9ci5ncm91cHM7aWYodD10LnNvcnQoKG8sYSk9Pm8ubWF0ZXJpYWxJbmRleCE9PWEubWF0ZXJpYWxJbmRleD9vLm1hdGVyaWFsSW5kZXgtYS5tYXRlcmlhbEluZGV4Om8uc3RhcnQtYS5zdGFydCksci5nZXRJbmRleCgpPT09bnVsbCl7Y29uc3Qgbz1yLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxhPVtdO2ZvcihsZXQgYz0wO2M8by5jb3VudDtjKz0zKWEucHVzaChjLGMrMSxjKzIpO3Iuc2V0SW5kZXgoYSl9Y29uc3QgZT1yLmdldEluZGV4KCksbj1bXTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgYT10W29dLGM9YS5zdGFydCxsPWMrYS5jb3VudDtmb3IobGV0IHU9Yzt1PGw7dSsrKW4ucHVzaChlLmdldFgodSkpfXIuZGlzcG9zZSgpLHIuc2V0SW5kZXgobik7bGV0IGk9MDtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgYT10W29dO2Euc3RhcnQ9aSxpKz1hLmNvdW50fWxldCBzPXRbMF07ci5ncm91cHM9W3NdO2ZvcihsZXQgbz0xO288dC5sZW5ndGg7bysrKXtjb25zdCBhPXRbb107cy5tYXRlcmlhbEluZGV4PT09YS5tYXRlcmlhbEluZGV4P3MuY291bnQrPWEuY291bnQ6KHM9YSxyLmdyb3Vwcy5wdXNoKHMpKX1yZXR1cm4gcn1mdW5jdGlvbiBSXyhyLHQ9MCl7Y29uc3QgZT1yWzBdLmluZGV4IT09bnVsbCxuPW5ldyBTZXQoT2JqZWN0LmtleXMoclswXS5hdHRyaWJ1dGVzKSksaT1uZXcgU2V0KE9iamVjdC5rZXlzKHJbMF0ubW9ycGhBdHRyaWJ1dGVzKSkscz17fSxvPXt9LGE9clswXS5tb3JwaFRhcmdldHNSZWxhdGl2ZSxjPW5ldyBOdDtsZXQgbD0wO2ZvcihsZXQgdT0wO3U8ci5sZW5ndGg7Kyt1KXtjb25zdCBoPXJbdV07bGV0IGY9MDtpZihlIT09KGguaW5kZXghPT1udWxsKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIrdSsiLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29tcGF0aWJsZSBhdHRyaWJ1dGVzOyBtYWtlIHN1cmUgaW5kZXggYXR0cmlidXRlIGV4aXN0cyBhbW9uZyBhbGwgZ2VvbWV0cmllcywgb3IgaW4gbm9uZSBvZiB0aGVtLiIpLG51bGw7Zm9yKGNvbnN0IGQgaW4gaC5hdHRyaWJ1dGVzKXtpZighbi5oYXMoZCkpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK3UrJy4gQWxsIGdlb21ldHJpZXMgbXVzdCBoYXZlIGNvbXBhdGlibGUgYXR0cmlidXRlczsgbWFrZSBzdXJlICInK2QrJyIgYXR0cmlidXRlIGV4aXN0cyBhbW9uZyBhbGwgZ2VvbWV0cmllcywgb3IgaW4gbm9uZSBvZiB0aGVtLicpLG51bGw7c1tkXT09PXZvaWQgMCYmKHNbZF09W10pLHNbZF0ucHVzaChoLmF0dHJpYnV0ZXNbZF0pLGYrK31pZihmIT09bi5zaXplKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIit1KyIuIE1ha2Ugc3VyZSBhbGwgZ2VvbWV0cmllcyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhdHRyaWJ1dGVzLiIpLG51bGw7aWYoYSE9PWgubW9ycGhUYXJnZXRzUmVsYXRpdmUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK3UrIi4gLm1vcnBoVGFyZ2V0c1JlbGF0aXZlIG11c3QgYmUgY29uc2lzdGVudCB0aHJvdWdob3V0IGFsbCBnZW9tZXRyaWVzLiIpLG51bGw7Zm9yKGNvbnN0IGQgaW4gaC5tb3JwaEF0dHJpYnV0ZXMpe2lmKCFpLmhhcyhkKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIrdSsiLiAgLm1vcnBoQXR0cmlidXRlcyBtdXN0IGJlIGNvbnNpc3RlbnQgdGhyb3VnaG91dCBhbGwgZ2VvbWV0cmllcy4iKSxudWxsO29bZF09PT12b2lkIDAmJihvW2RdPVtdKSxvW2RdLnB1c2goaC5tb3JwaEF0dHJpYnV0ZXNbZF0pfWlmKHQpe2xldCBkO2lmKGUpZD1oLmluZGV4LmNvdW50O2Vsc2UgaWYoaC5hdHRyaWJ1dGVzLnBvc2l0aW9uIT09dm9pZCAwKWQ9aC5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50O2Vsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK3UrIi4gVGhlIGdlb21ldHJ5IG11c3QgaGF2ZSBlaXRoZXIgYW4gaW5kZXggb3IgYSBwb3NpdGlvbiBhdHRyaWJ1dGUiKSxudWxsO2lmKHQ9PT0xKWMuYWRkR3JvdXAobCxkLHUpO2Vsc2UgaWYodD09PTImJmguZ3JvdXBzLmxlbmd0aD4wKWZvcihsZXQgcCBvZiBoLmdyb3Vwcyl7bGV0IHg9cC5tYXRlcmlhbEluZGV4O2MuYWRkR3JvdXAobCtwLnN0YXJ0LE1hdGgubWluKHAuY291bnQsZCkseCl9bCs9ZH19aWYoZSl7bGV0IHU9MDtjb25zdCBoPVtdO2ZvcihsZXQgZj0wO2Y8ci5sZW5ndGg7KytmKXtjb25zdCBkPXJbZl0uaW5kZXg7Zm9yKGxldCBwPTA7cDxkLmNvdW50OysrcCloLnB1c2goZC5nZXRYKHApK3UpO3UrPXJbZl0uYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1jLnNldEluZGV4KGgpfWZvcihjb25zdCB1IGluIHMpe2NvbnN0IGg9Q18oc1t1XSk7aWYoIWgpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2hpbGUgdHJ5aW5nIHRvIG1lcmdlIHRoZSAiK3UrIiBhdHRyaWJ1dGUuIiksbnVsbDtjLnNldEF0dHJpYnV0ZSh1LGgpfWZvcihjb25zdCB1IGluIG8pe2NvbnN0IGg9b1t1XVswXS5sZW5ndGg7aWYoaD09PTApYnJlYWs7Yy5tb3JwaEF0dHJpYnV0ZXM9Yy5tb3JwaEF0dHJpYnV0ZXN8fHt9LGMubW9ycGhBdHRyaWJ1dGVzW3VdPVtdO2ZvcihsZXQgZj0wO2Y8aDsrK2Ype2NvbnN0IGQ9W107Zm9yKGxldCB4PTA7eDxvW3VdLmxlbmd0aDsrK3gpZC5wdXNoKG9bdV1beF1bZl0pO2NvbnN0IHA9Q18oZCk7aWYoIXApcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2hpbGUgdHJ5aW5nIHRvIG1lcmdlIHRoZSAiK3UrIiBtb3JwaEF0dHJpYnV0ZS4iKSxudWxsO2MubW9ycGhBdHRyaWJ1dGVzW3VdLnB1c2gocCl9fXJldHVybiB0PT09Mj9jUihjKTpjfWNsYXNzIGxSIGV4dGVuZHMgcm97Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpO2NvbnN0IG49bmV3IEZ1KG5ldyBybyh0LGdpKFdlKHt9LGUpLHtoYXNUb3A6ITAsaGFzU2lkZTohMCxoYXNCb3R0b206ITF9KSkpO24udXBkYXRlTWF0cml4V29ybGQoKTtjb25zdCBpPW5ldyBsZSgpLnNldEZyb21PYmplY3Qobikscz1uZXcgSTtpLmdldFNpemUocyk7Y29uc3Qgbz1uZXcgSShpLm1pbi54K3MueC8yLGkubWluLnkrcy55LzIsMCk7bGV0IGE9ZS50b3BTZWdtZW50cyxjPWUuYm94MztpZihjKXtjPWMudW5pb24oaSk7Y29uc3QgbT1uZXcgSTtjLmdldFNpemUobSk7Y29uc3Qgdj1NYXRoLm1heChzLngvbS54LHMueS9tLnkpO2E9TWF0aC5jZWlsKGUudG9wU2VnbWVudHMqdil9aWYoYTw0KXJldHVybiB0aGlzO2NvbnN0IGw9bmV3IFhyKHMueCxzLnksYSxhKSx1PW5ldyBGdShsKTt1LnBvc2l0aW9uLnNldChvLngsby55LG8ueiksdS51cGRhdGVNYXRyaXhXb3JsZCgpO2NvbnN0IGY9bmV3IGFSKCkuZXZhbHVhdGUodSxuLGRfKSxkPWYuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLHA9bmV3IHZ0KGQuY291bnQqMiwyKTtmb3IobGV0IG09MDttPGQuY291bnQ7bSsrKXtjb25zdCB2PWQuZ2V0WihtKTtkLnNldFoobSxlLmRlcHRoK3YpfWlmKGMpe2NvbnN0IG09Yy5taW4sdj1jLm1heCx5PW5ldyBJKCkuc3ViVmVjdG9ycyh2LG0pO2ZvcihsZXQgXz0wO188ZC5jb3VudDtfKyspe2NvbnN0IFM9ZC5nZXRYKF8pLHc9ZC5nZXRZKF8pLEE9KFMtbS54KS95LngsVD0ody1tLnkpL3kueTtwLnNldFhZKF8sQSxUKX1mLmdlb21ldHJ5LnNldEF0dHJpYnV0ZSgidXYiLHApfWQubmVlZHNVcGRhdGU9ITA7Y29uc3QgeD1uZXcgcm8odCxnaShXZSh7fSxlKSx7aGFzVG9wOiExfSkpLGc9Ul8oW2YuZ2VvbWV0cnkseF0sMik7dGhpcy5jb3B5KGcudG9Ob25JbmRleGVkKCkpfX12YXIgdVI9cj0+e2NvbnN0e3NwbGl0OnQsZGVwdGg6ZSxwb2ludHM6bixib3gzOmksaGFzVG9wOnMsaGFzQm90dG9tOm8saGFzU2lkZTphLHNpZGVSZXBlYXQ6Yyx0b3BTZWdtZW50czpsfT1yLHU9bD9sUjpybyxoPW5ldyB1KG5ldyBWaShuKSx7ZGVwdGg6ZSxiZXZlbEVuYWJsZWQ6ITEsYm94MzppLFVWR2VuZXJhdG9yOmZFKHtzcGxpdDp0LGJveDM6aSxzaWRlUmVwZWF0OmN9KSxoYXNUb3A6cyxoYXNCb3R0b206byxoYXNTaWRlOmEsdG9wU2VnbWVudHM6bH0pO3JldHVybiBkRSgpLGh9O2Z1bmN0aW9uIGhSKHIsdCxlPTApe2NvbnN0IG49KDkwLXQpKk1hdGguUEkvMTgwLGk9KDkwLXIpKk1hdGguUEkvMTgwO3JldHVybltlKk1hdGguc2luKG4pKk1hdGguY29zKGkpLGUqTWF0aC5jb3MobiksZSpNYXRoLnNpbihuKSpNYXRoLnNpbihpKV19ZnVuY3Rpb24gJHUocix0KXtyZXR1cm4gcj09bnVsbHx8dD09bnVsbD9OYU46cjx0Py0xOnI+dD8xOnI+PXQ/MDpOYU59ZnVuY3Rpb24gZlIocix0KXtyZXR1cm4gcj09bnVsbHx8dD09bnVsbD9OYU46dDxyPy0xOnQ+cj8xOnQ+PXI/MDpOYU59ZnVuY3Rpb24gSV8ocil7bGV0IHQsZSxuO3IubGVuZ3RoIT09Mj8odD0kdSxlPShhLGMpPT4kdShyKGEpLGMpLG49KGEsYyk9PnIoYSktYyk6KHQ9cj09PSR1fHxyPT09ZlI/cjpkUixlPXIsbj1yKTtmdW5jdGlvbiBpKGEsYyxsPTAsdT1hLmxlbmd0aCl7aWYobDx1KXtpZih0KGMsYykhPT0wKXJldHVybiB1O2Rve2NvbnN0IGg9bCt1Pj4+MTtlKGFbaF0sYyk8MD9sPWgrMTp1PWh9d2hpbGUobDx1KX1yZXR1cm4gbH1mdW5jdGlvbiBzKGEsYyxsPTAsdT1hLmxlbmd0aCl7aWYobDx1KXtpZih0KGMsYykhPT0wKXJldHVybiB1O2Rve2NvbnN0IGg9bCt1Pj4+MTtlKGFbaF0sYyk8PTA/bD1oKzE6dT1ofXdoaWxlKGw8dSl9cmV0dXJuIGx9ZnVuY3Rpb24gbyhhLGMsbD0wLHU9YS5sZW5ndGgpe2NvbnN0IGg9aShhLGMsbCx1LTEpO3JldHVybiBoPmwmJm4oYVtoLTFdLGMpPi1uKGFbaF0sYyk/aC0xOmh9cmV0dXJue2xlZnQ6aSxjZW50ZXI6byxyaWdodDpzfX1mdW5jdGlvbiBkUigpe3JldHVybiAwfWZ1bmN0aW9uIHBSKHIpe3JldHVybiByPT09bnVsbD9OYU46K3J9Y29uc3QgbVI9SV8oJHUpLnJpZ2h0O0lfKHBSKS5jZW50ZXI7ZnVuY3Rpb24gcXUocix0KXtsZXQgZSxuO2lmKHQ9PT12b2lkIDApZm9yKGNvbnN0IGkgb2YgcilpIT1udWxsJiYoZT09PXZvaWQgMD9pPj1pJiYoZT1uPWkpOihlPmkmJihlPWkpLG48aSYmKG49aSkpKTtlbHNle2xldCBpPS0xO2ZvcihsZXQgcyBvZiByKShzPXQocywrK2kscikpIT1udWxsJiYoZT09PXZvaWQgMD9zPj1zJiYoZT1uPXMpOihlPnMmJihlPXMpLG48cyYmKG49cykpKX1yZXR1cm5bZSxuXX1jbGFzcyBKaXtjb25zdHJ1Y3Rvcigpe3RoaXMuX3BhcnRpYWxzPW5ldyBGbG9hdDY0QXJyYXkoMzIpLHRoaXMuX249MH1hZGQodCl7Y29uc3QgZT10aGlzLl9wYXJ0aWFscztsZXQgbj0wO2ZvcihsZXQgaT0wO2k8dGhpcy5fbiYmaTwzMjtpKyspe2NvbnN0IHM9ZVtpXSxvPXQrcyxhPU1hdGguYWJzKHQpPE1hdGguYWJzKHMpP3QtKG8tcyk6cy0oby10KTthJiYoZVtuKytdPWEpLHQ9b31yZXR1cm4gZVtuXT10LHRoaXMuX249bisxLHRoaXN9dmFsdWVPZigpe2NvbnN0IHQ9dGhpcy5fcGFydGlhbHM7bGV0IGU9dGhpcy5fbixuLGkscyxvPTA7aWYoZT4wKXtmb3Iobz10Wy0tZV07ZT4wJiYobj1vLGk9dFstLWVdLG89bitpLHM9aS0oby1uKSwhcyk7KTtlPjAmJihzPDAmJnRbZS0xXTwwfHxzPjAmJnRbZS0xXT4wKSYmKGk9cyoyLG49bytpLGk9PW4tbyYmKG89bikpfXJldHVybiBvfX1jb25zdCBnUj1NYXRoLnNxcnQoNTApLHhSPU1hdGguc3FydCgxMCksX1I9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIFl1KHIsdCxlKXtjb25zdCBuPSh0LXIpL01hdGgubWF4KDAsZSksaT1NYXRoLmZsb29yKE1hdGgubG9nMTAobikpLHM9bi9NYXRoLnBvdygxMCxpKSxvPXM+PWdSPzEwOnM+PXhSPzU6cz49X1I/MjoxO2xldCBhLGMsbDtyZXR1cm4gaTwwPyhsPU1hdGgucG93KDEwLC1pKS9vLGE9TWF0aC5yb3VuZChyKmwpLGM9TWF0aC5yb3VuZCh0KmwpLGEvbDxyJiYrK2EsYy9sPnQmJi0tYyxsPS1sKToobD1NYXRoLnBvdygxMCxpKSpvLGE9TWF0aC5yb3VuZChyL2wpLGM9TWF0aC5yb3VuZCh0L2wpLGEqbDxyJiYrK2EsYypsPnQmJi0tYyksYzxhJiYuNTw9ZSYmZTwyP1l1KHIsdCxlKjIpOlthLGMsbF19ZnVuY3Rpb24geVIocix0LGUpe2lmKHQ9K3Qscj0rcixlPStlLCEoZT4wKSlyZXR1cm5bXTtpZihyPT09dClyZXR1cm5bcl07Y29uc3Qgbj10PHIsW2kscyxvXT1uP1l1KHQscixlKTpZdShyLHQsZSk7aWYoIShzPj1pKSlyZXR1cm5bXTtjb25zdCBhPXMtaSsxLGM9bmV3IEFycmF5KGEpO2lmKG4paWYobzwwKWZvcihsZXQgbD0wO2w8YTsrK2wpY1tsXT0ocy1sKS8tbztlbHNlIGZvcihsZXQgbD0wO2w8YTsrK2wpY1tsXT0ocy1sKSpvO2Vsc2UgaWYobzwwKWZvcihsZXQgbD0wO2w8YTsrK2wpY1tsXT0oaStsKS8tbztlbHNlIGZvcihsZXQgbD0wO2w8YTsrK2wpY1tsXT0oaStsKSpvO3JldHVybiBjfWZ1bmN0aW9uIGxwKHIsdCxlKXtyZXR1cm4gdD0rdCxyPStyLGU9K2UsWXUocix0LGUpWzJdfWZ1bmN0aW9uIHZSKHIsdCxlKXt0PSt0LHI9K3IsZT0rZTtjb25zdCBuPXQ8cixpPW4/bHAodCxyLGUpOmxwKHIsdCxlKTtyZXR1cm4obj8tMToxKSooaTwwPzEvLWk6aSl9ZnVuY3Rpb24gTVIocix0KXtsZXQgZT0wLG49MDtpZih0PT09dm9pZCAwKWZvcihsZXQgaSBvZiByKWkhPW51bGwmJihpPStpKT49aSYmKCsrZSxuKz1pKTtlbHNle2xldCBpPS0xO2ZvcihsZXQgcyBvZiByKShzPXQocywrK2kscikpIT1udWxsJiYocz0rcyk+PXMmJigrK2Usbis9cyl9aWYoZSlyZXR1cm4gbi9lfWZ1bmN0aW9uKlNSKHIpe2Zvcihjb25zdCB0IG9mIHIpeWllbGQqVHYodCl9ZnVuY3Rpb24gT2Eocil7cmV0dXJuIEFycmF5LmZyb20oU1IocikpfXZhciB1ZT0xZS02LFp1PTFlLTEyLGllPU1hdGguUEksd249aWUvMixKdT1pZS80LEFuPWllKjIsQ2U9MTgwL2llLGt0PWllLzE4MCx4ZT1NYXRoLmFicyx1cD1NYXRoLmF0YW4sam49TWF0aC5hdGFuMixYdD1NYXRoLmNvcyxiUj1NYXRoLmV4cCxocD1NYXRoLmh5cG90LHdSPU1hdGgubG9nLE90PU1hdGguc2luLEFSPU1hdGguc2lnbnx8ZnVuY3Rpb24ocil7cmV0dXJuIHI+MD8xOnI8MD8tMTowfSxLaT1NYXRoLnNxcnQsVFI9TWF0aC50YW47ZnVuY3Rpb24gRVIocil7cmV0dXJuIHI+MT8wOnI8LTE/aWU6TWF0aC5hY29zKHIpfWZ1bmN0aW9uIGppKHIpe3JldHVybiByPjE/d246cjwtMT8td246TWF0aC5hc2luKHIpfWZ1bmN0aW9uIFBfKHIpe3JldHVybihyPU90KHIvMikpKnJ9ZnVuY3Rpb24gUWUoKXt9ZnVuY3Rpb24gS3Uocix0KXtyJiZEXy5oYXNPd25Qcm9wZXJ0eShyLnR5cGUpJiZEX1tyLnR5cGVdKHIsdCl9dmFyIExfPXtGZWF0dXJlOmZ1bmN0aW9uKHIsdCl7S3Uoci5nZW9tZXRyeSx0KX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24ocix0KXtmb3IodmFyIGU9ci5mZWF0dXJlcyxuPS0xLGk9ZS5sZW5ndGg7KytuPGk7KUt1KGVbbl0uZ2VvbWV0cnksdCl9fSxEXz17U3BoZXJlOmZ1bmN0aW9uKHIsdCl7dC5zcGhlcmUoKX0sUG9pbnQ6ZnVuY3Rpb24ocix0KXtyPXIuY29vcmRpbmF0ZXMsdC5wb2ludChyWzBdLHJbMV0sclsyXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24ocix0KXtmb3IodmFyIGU9ci5jb29yZGluYXRlcyxuPS0xLGk9ZS5sZW5ndGg7KytuPGk7KXI9ZVtuXSx0LnBvaW50KHJbMF0sclsxXSxyWzJdKX0sTGluZVN0cmluZzpmdW5jdGlvbihyLHQpe2ZwKHIuY29vcmRpbmF0ZXMsdCwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHIsdCl7Zm9yKHZhciBlPXIuY29vcmRpbmF0ZXMsbj0tMSxpPWUubGVuZ3RoOysrbjxpOylmcChlW25dLHQsMCl9LFBvbHlnb246ZnVuY3Rpb24ocix0KXtVXyhyLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24ocix0KXtmb3IodmFyIGU9ci5jb29yZGluYXRlcyxuPS0xLGk9ZS5sZW5ndGg7KytuPGk7KVVfKGVbbl0sdCl9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihyLHQpe2Zvcih2YXIgZT1yLmdlb21ldHJpZXMsbj0tMSxpPWUubGVuZ3RoOysrbjxpOylLdShlW25dLHQpfX07ZnVuY3Rpb24gZnAocix0LGUpe3ZhciBuPS0xLGk9ci5sZW5ndGgtZSxzO2Zvcih0LmxpbmVTdGFydCgpOysrbjxpOylzPXJbbl0sdC5wb2ludChzWzBdLHNbMV0sc1syXSk7dC5saW5lRW5kKCl9ZnVuY3Rpb24gVV8ocix0KXt2YXIgZT0tMSxuPXIubGVuZ3RoO2Zvcih0LnBvbHlnb25TdGFydCgpOysrZTxuOylmcChyW2VdLHQsMSk7dC5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24ganUocix0KXtyJiZMXy5oYXNPd25Qcm9wZXJ0eShyLnR5cGUpP0xfW3IudHlwZV0ocix0KTpLdShyLHQpfXZhciBRdT1uZXcgSmksTl89bmV3IEppLEZfLEJfLGRwLHBwLG1wLFFpPXtwb2ludDpRZSxsaW5lU3RhcnQ6UWUsbGluZUVuZDpRZSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtRdT1uZXcgSmksUWkubGluZVN0YXJ0PUNSLFFpLmxpbmVFbmQ9UlJ9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgcj0rUXU7Tl8uYWRkKHI8MD9BbityOnIpLHRoaXMubGluZVN0YXJ0PXRoaXMubGluZUVuZD10aGlzLnBvaW50PVFlfSxzcGhlcmU6ZnVuY3Rpb24oKXtOXy5hZGQoQW4pfX07ZnVuY3Rpb24gQ1IoKXtRaS5wb2ludD1JUn1mdW5jdGlvbiBSUigpe09fKEZfLEJfKX1mdW5jdGlvbiBJUihyLHQpe1FpLnBvaW50PU9fLEZfPXIsQl89dCxyKj1rdCx0Kj1rdCxkcD1yLHBwPVh0KHQ9dC8yK0p1KSxtcD1PdCh0KX1mdW5jdGlvbiBPXyhyLHQpe3IqPWt0LHQqPWt0LHQ9dC8yK0p1O3ZhciBlPXItZHAsbj1lPj0wPzE6LTEsaT1uKmUscz1YdCh0KSxvPU90KHQpLGE9bXAqbyxjPXBwKnMrYSpYdChpKSxsPWEqbipPdChpKTtRdS5hZGQoam4obCxjKSksZHA9cixwcD1zLG1wPW99ZnVuY3Rpb24gdGgocil7cmV0dXJuW2puKHJbMV0sclswXSksamkoclsyXSldfWZ1bmN0aW9uIGRzKHIpe3ZhciB0PXJbMF0sZT1yWzFdLG49WHQoZSk7cmV0dXJuW24qWHQodCksbipPdCh0KSxPdChlKV19ZnVuY3Rpb24gZWgocix0KXtyZXR1cm4gclswXSp0WzBdK3JbMV0qdFsxXStyWzJdKnRbMl19ZnVuY3Rpb24gbW8ocix0KXtyZXR1cm5bclsxXSp0WzJdLXJbMl0qdFsxXSxyWzJdKnRbMF0tclswXSp0WzJdLHJbMF0qdFsxXS1yWzFdKnRbMF1dfWZ1bmN0aW9uIGdwKHIsdCl7clswXSs9dFswXSxyWzFdKz10WzFdLHJbMl0rPXRbMl19ZnVuY3Rpb24gbmgocix0KXtyZXR1cm5bclswXSp0LHJbMV0qdCxyWzJdKnRdfWZ1bmN0aW9uIGloKHIpe3ZhciB0PUtpKHJbMF0qclswXStyWzFdKnJbMV0rclsyXSpyWzJdKTtyWzBdLz10LHJbMV0vPXQsclsyXS89dH12YXIgYmUsVG4sUmUsT24scHMsel8sa18sZ28semEsRXIsdHIsZXI9e3BvaW50OnhwLGxpbmVTdGFydDpHXyxsaW5lRW5kOkhfLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2VyLnBvaW50PVdfLGVyLmxpbmVTdGFydD1QUixlci5saW5lRW5kPUxSLHphPW5ldyBKaSxRaS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe1FpLnBvbHlnb25FbmQoKSxlci5wb2ludD14cCxlci5saW5lU3RhcnQ9R18sZXIubGluZUVuZD1IXyxRdTwwPyhiZT0tKFJlPTE4MCksVG49LShPbj05MCkpOnphPnVlP09uPTkwOnphPC11ZSYmKFRuPS05MCksdHJbMF09YmUsdHJbMV09UmV9LHNwaGVyZTpmdW5jdGlvbigpe2JlPS0oUmU9MTgwKSxUbj0tKE9uPTkwKX19O2Z1bmN0aW9uIHhwKHIsdCl7RXIucHVzaCh0cj1bYmU9cixSZT1yXSksdDxUbiYmKFRuPXQpLHQ+T24mJihPbj10KX1mdW5jdGlvbiBWXyhyLHQpe3ZhciBlPWRzKFtyKmt0LHQqa3RdKTtpZihnbyl7dmFyIG49bW8oZ28sZSksaT1bblsxXSwtblswXSwwXSxzPW1vKGksbik7aWgocykscz10aChzKTt2YXIgbz1yLXBzLGE9bz4wPzE6LTEsYz1zWzBdKkNlKmEsbCx1PXhlKG8pPjE4MDt1XihhKnBzPGMmJmM8YSpyKT8obD1zWzFdKkNlLGw+T24mJihPbj1sKSk6KGM9KGMrMzYwKSUzNjAtMTgwLHVeKGEqcHM8YyYmYzxhKnIpPyhsPS1zWzFdKkNlLGw8VG4mJihUbj1sKSk6KHQ8VG4mJihUbj10KSx0Pk9uJiYoT249dCkpKSx1P3I8cHM/em4oYmUscik+em4oYmUsUmUpJiYoUmU9cik6em4ocixSZSk+em4oYmUsUmUpJiYoYmU9cik6UmU+PWJlPyhyPGJlJiYoYmU9cikscj5SZSYmKFJlPXIpKTpyPnBzP3puKGJlLHIpPnpuKGJlLFJlKSYmKFJlPXIpOnpuKHIsUmUpPnpuKGJlLFJlKSYmKGJlPXIpfWVsc2UgRXIucHVzaCh0cj1bYmU9cixSZT1yXSk7dDxUbiYmKFRuPXQpLHQ+T24mJihPbj10KSxnbz1lLHBzPXJ9ZnVuY3Rpb24gR18oKXtlci5wb2ludD1WX31mdW5jdGlvbiBIXygpe3RyWzBdPWJlLHRyWzFdPVJlLGVyLnBvaW50PXhwLGdvPW51bGx9ZnVuY3Rpb24gV18ocix0KXtpZihnbyl7dmFyIGU9ci1wczt6YS5hZGQoeGUoZSk+MTgwP2UrKGU+MD8zNjA6LTM2MCk6ZSl9ZWxzZSB6Xz1yLGtfPXQ7UWkucG9pbnQocix0KSxWXyhyLHQpfWZ1bmN0aW9uIFBSKCl7UWkubGluZVN0YXJ0KCl9ZnVuY3Rpb24gTFIoKXtXXyh6XyxrXyksUWkubGluZUVuZCgpLHhlKHphKT51ZSYmKGJlPS0oUmU9MTgwKSksdHJbMF09YmUsdHJbMV09UmUsZ289bnVsbH1mdW5jdGlvbiB6bihyLHQpe3JldHVybih0LT1yKTwwP3QrMzYwOnR9ZnVuY3Rpb24gRFIocix0KXtyZXR1cm4gclswXS10WzBdfWZ1bmN0aW9uIFhfKHIsdCl7cmV0dXJuIHJbMF08PXJbMV0/clswXTw9dCYmdDw9clsxXTp0PHJbMF18fHJbMV08dH1mdW5jdGlvbiAkXyhyKXt2YXIgdCxlLG4saSxzLG8sYTtpZihPbj1SZT0tKGJlPVRuPTEvMCksRXI9W10sanUocixlciksZT1Fci5sZW5ndGgpe2ZvcihFci5zb3J0KERSKSx0PTEsbj1FclswXSxzPVtuXTt0PGU7Kyt0KWk9RXJbdF0sWF8obixpWzBdKXx8WF8obixpWzFdKT8oem4oblswXSxpWzFdKT56bihuWzBdLG5bMV0pJiYoblsxXT1pWzFdKSx6bihpWzBdLG5bMV0pPnpuKG5bMF0sblsxXSkmJihuWzBdPWlbMF0pKTpzLnB1c2gobj1pKTtmb3Iobz0tMS8wLGU9cy5sZW5ndGgtMSx0PTAsbj1zW2VdO3Q8PWU7bj1pLCsrdClpPXNbdF0sKGE9em4oblsxXSxpWzBdKSk+byYmKG89YSxiZT1pWzBdLFJlPW5bMV0pfXJldHVybiBFcj10cj1udWxsLGJlPT09MS8wfHxUbj09PTEvMD9bW05hTixOYU5dLFtOYU4sTmFOXV06W1tiZSxUbl0sW1JlLE9uXV19dmFyIGthLHJoLHNoLG9oLGFoLGNoLGxoLHVoLF9wLHlwLHZwLHFfLFlfLGhuLGZuLGRuLGZpPXtzcGhlcmU6UWUscG9pbnQ6TXAsbGluZVN0YXJ0OlpfLGxpbmVFbmQ6Sl8scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7ZmkubGluZVN0YXJ0PUZSLGZpLmxpbmVFbmQ9QlJ9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtmaS5saW5lU3RhcnQ9Wl8sZmkubGluZUVuZD1KX319O2Z1bmN0aW9uIE1wKHIsdCl7cio9a3QsdCo9a3Q7dmFyIGU9WHQodCk7VmEoZSpYdChyKSxlKk90KHIpLE90KHQpKX1mdW5jdGlvbiBWYShyLHQsZSl7KytrYSxzaCs9KHItc2gpL2thLG9oKz0odC1vaCkva2EsYWgrPShlLWFoKS9rYX1mdW5jdGlvbiBaXygpe2ZpLnBvaW50PVVSfWZ1bmN0aW9uIFVSKHIsdCl7cio9a3QsdCo9a3Q7dmFyIGU9WHQodCk7aG49ZSpYdChyKSxmbj1lKk90KHIpLGRuPU90KHQpLGZpLnBvaW50PU5SLFZhKGhuLGZuLGRuKX1mdW5jdGlvbiBOUihyLHQpe3IqPWt0LHQqPWt0O3ZhciBlPVh0KHQpLG49ZSpYdChyKSxpPWUqT3Qocikscz1PdCh0KSxvPWpuKEtpKChvPWZuKnMtZG4qaSkqbysobz1kbipuLWhuKnMpKm8rKG89aG4qaS1mbipuKSpvKSxobipuK2ZuKmkrZG4qcyk7cmgrPW8sY2grPW8qKGhuKyhobj1uKSksbGgrPW8qKGZuKyhmbj1pKSksdWgrPW8qKGRuKyhkbj1zKSksVmEoaG4sZm4sZG4pfWZ1bmN0aW9uIEpfKCl7ZmkucG9pbnQ9TXB9ZnVuY3Rpb24gRlIoKXtmaS5wb2ludD1PUn1mdW5jdGlvbiBCUigpe0tfKHFfLFlfKSxmaS5wb2ludD1NcH1mdW5jdGlvbiBPUihyLHQpe3FfPXIsWV89dCxyKj1rdCx0Kj1rdCxmaS5wb2ludD1LXzt2YXIgZT1YdCh0KTtobj1lKlh0KHIpLGZuPWUqT3QociksZG49T3QodCksVmEoaG4sZm4sZG4pfWZ1bmN0aW9uIEtfKHIsdCl7cio9a3QsdCo9a3Q7dmFyIGU9WHQodCksbj1lKlh0KHIpLGk9ZSpPdChyKSxzPU90KHQpLG89Zm4qcy1kbippLGE9ZG4qbi1obipzLGM9aG4qaS1mbipuLGw9aHAobyxhLGMpLHU9amkobCksaD1sJiYtdS9sO19wLmFkZChoKm8pLHlwLmFkZChoKmEpLHZwLmFkZChoKmMpLHJoKz11LGNoKz11KihobisoaG49bikpLGxoKz11KihmbisoZm49aSkpLHVoKz11KihkbisoZG49cykpLFZhKGhuLGZuLGRuKX1mdW5jdGlvbiBqXyhyKXtrYT1yaD1zaD1vaD1haD1jaD1saD11aD0wLF9wPW5ldyBKaSx5cD1uZXcgSmksdnA9bmV3IEppLGp1KHIsZmkpO3ZhciB0PStfcCxlPSt5cCxuPSt2cCxpPWhwKHQsZSxuKTtyZXR1cm4gaTxadSYmKHQ9Y2gsZT1saCxuPXVoLHJoPHVlJiYodD1zaCxlPW9oLG49YWgpLGk9aHAodCxlLG4pLGk8WnUpP1tOYU4sTmFOXTpbam4oZSx0KSpDZSxqaShuL2kpKkNlXX1mdW5jdGlvbiBTcChyLHQpe2Z1bmN0aW9uIGUobixpKXtyZXR1cm4gbj1yKG4saSksdChuWzBdLG5bMV0pfXJldHVybiByLmludmVydCYmdC5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihuLGkpe3JldHVybiBuPXQuaW52ZXJ0KG4saSksbiYmci5pbnZlcnQoblswXSxuWzFdKX0pLGV9ZnVuY3Rpb24gYnAocix0KXtyZXR1cm4geGUocik+aWUmJihyLT1NYXRoLnJvdW5kKHIvQW4pKkFuKSxbcix0XX1icC5pbnZlcnQ9YnA7ZnVuY3Rpb24gUV8ocix0LGUpe3JldHVybihyJT1Bbik/dHx8ZT9TcChleShyKSxueSh0LGUpKTpleShyKTp0fHxlP255KHQsZSk6YnB9ZnVuY3Rpb24gdHkocil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrPXIseGUodCk+aWUmJih0LT1NYXRoLnJvdW5kKHQvQW4pKkFuKSxbdCxlXX19ZnVuY3Rpb24gZXkocil7dmFyIHQ9dHkocik7cmV0dXJuIHQuaW52ZXJ0PXR5KC1yKSx0fWZ1bmN0aW9uIG55KHIsdCl7dmFyIGU9WHQociksbj1PdChyKSxpPVh0KHQpLHM9T3QodCk7ZnVuY3Rpb24gbyhhLGMpe3ZhciBsPVh0KGMpLHU9WHQoYSkqbCxoPU90KGEpKmwsZj1PdChjKSxkPWYqZSt1Km47cmV0dXJuW2puKGgqaS1kKnMsdSplLWYqbiksamkoZCppK2gqcyldfXJldHVybiBvLmludmVydD1mdW5jdGlvbihhLGMpe3ZhciBsPVh0KGMpLHU9WHQoYSkqbCxoPU90KGEpKmwsZj1PdChjKSxkPWYqaS1oKnM7cmV0dXJuW2puKGgqaStmKnMsdSplK2QqbiksamkoZCplLXUqbildfSxvfWZ1bmN0aW9uIGl5KHIpe3I9UV8oclswXSprdCxyWzFdKmt0LHIubGVuZ3RoPjI/clsyXSprdDowKTtmdW5jdGlvbiB0KGUpe3JldHVybiBlPXIoZVswXSprdCxlWzFdKmt0KSxlWzBdKj1DZSxlWzFdKj1DZSxlfXJldHVybiB0LmludmVydD1mdW5jdGlvbihlKXtyZXR1cm4gZT1yLmludmVydChlWzBdKmt0LGVbMV0qa3QpLGVbMF0qPUNlLGVbMV0qPUNlLGV9LHR9ZnVuY3Rpb24gelIocix0LGUsbixpLHMpe2lmKGUpe3ZhciBvPVh0KHQpLGE9T3QodCksYz1uKmU7aT09bnVsbD8oaT10K24qQW4scz10LWMvMik6KGk9cnkobyxpKSxzPXJ5KG8scyksKG4+MD9pPHM6aT5zKSYmKGkrPW4qQW4pKTtmb3IodmFyIGwsdT1pO24+MD91PnM6dTxzO3UtPWMpbD10aChbbywtYSpYdCh1KSwtYSpPdCh1KV0pLHIucG9pbnQobFswXSxsWzFdKX19ZnVuY3Rpb24gcnkocix0KXt0PWRzKHQpLHRbMF0tPXIsaWgodCk7dmFyIGU9RVIoLXRbMV0pO3JldHVybigoLXRbMl08MD8tZTplKStBbi11ZSklQW59ZnVuY3Rpb24gc3koKXt2YXIgcj1bXSx0O3JldHVybntwb2ludDpmdW5jdGlvbihlLG4saSl7dC5wdXNoKFtlLG4saV0pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtyLnB1c2godD1bXSl9LGxpbmVFbmQ6UWUscmVqb2luOmZ1bmN0aW9uKCl7ci5sZW5ndGg+MSYmci5wdXNoKHIucG9wKCkuY29uY2F0KHIuc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgZT1yO3JldHVybiByPVtdLHQ9bnVsbCxlfX19ZnVuY3Rpb24gaGgocix0KXtyZXR1cm4geGUoclswXS10WzBdKTx1ZSYmeGUoclsxXS10WzFdKTx1ZX1mdW5jdGlvbiBmaChyLHQsZSxuKXt0aGlzLng9cix0aGlzLno9dCx0aGlzLm89ZSx0aGlzLmU9bix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIG95KHIsdCxlLG4saSl7dmFyIHM9W10sbz1bXSxhLGM7aWYoci5mb3JFYWNoKGZ1bmN0aW9uKHApe2lmKCEoKHg9cC5sZW5ndGgtMSk8PTApKXt2YXIgeCxnPXBbMF0sbT1wW3hdLHY7aWYoaGgoZyxtKSl7aWYoIWdbMl0mJiFtWzJdKXtmb3IoaS5saW5lU3RhcnQoKSxhPTA7YTx4OysrYSlpLnBvaW50KChnPXBbYV0pWzBdLGdbMV0pO2kubGluZUVuZCgpO3JldHVybn1tWzBdKz0yKnVlfXMucHVzaCh2PW5ldyBmaChnLHAsbnVsbCwhMCkpLG8ucHVzaCh2Lm89bmV3IGZoKGcsbnVsbCx2LCExKSkscy5wdXNoKHY9bmV3IGZoKG0scCxudWxsLCExKSksby5wdXNoKHYubz1uZXcgZmgobSxudWxsLHYsITApKX19KSwhIXMubGVuZ3RoKXtmb3Ioby5zb3J0KHQpLGF5KHMpLGF5KG8pLGE9MCxjPW8ubGVuZ3RoO2E8YzsrK2Epb1thXS5lPWU9IWU7Zm9yKHZhciBsPXNbMF0sdSxoOzspe2Zvcih2YXIgZj1sLGQ9ITA7Zi52OylpZigoZj1mLm4pPT09bClyZXR1cm47dT1mLnosaS5saW5lU3RhcnQoKTtkb3tpZihmLnY9Zi5vLnY9ITAsZi5lKXtpZihkKWZvcihhPTAsYz11Lmxlbmd0aDthPGM7KythKWkucG9pbnQoKGg9dVthXSlbMF0saFsxXSk7ZWxzZSBuKGYueCxmLm4ueCwxLGkpO2Y9Zi5ufWVsc2V7aWYoZClmb3IodT1mLnAueixhPXUubGVuZ3RoLTE7YT49MDstLWEpaS5wb2ludCgoaD11W2FdKVswXSxoWzFdKTtlbHNlIG4oZi54LGYucC54LC0xLGkpO2Y9Zi5wfWY9Zi5vLHU9Zi56LGQ9IWR9d2hpbGUoIWYudik7aS5saW5lRW5kKCl9fX1mdW5jdGlvbiBheShyKXtpZih0PXIubGVuZ3RoKXtmb3IodmFyIHQsZT0wLG49clswXSxpOysrZTx0OyluLm49aT1yW2VdLGkucD1uLG49aTtuLm49aT1yWzBdLGkucD1ufX1mdW5jdGlvbiB3cChyKXtyZXR1cm4geGUoclswXSk8PWllP3JbMF06QVIoclswXSkqKCh4ZShyWzBdKStpZSklQW4taWUpfWZ1bmN0aW9uIGN5KHIsdCl7dmFyIGU9d3AodCksbj10WzFdLGk9T3Qobikscz1bT3QoZSksLVh0KGUpLDBdLG89MCxhPTAsYz1uZXcgSmk7aT09PTE/bj13bit1ZTppPT09LTEmJihuPS13bi11ZSk7Zm9yKHZhciBsPTAsdT1yLmxlbmd0aDtsPHU7KytsKWlmKGY9KGg9cltsXSkubGVuZ3RoKWZvcih2YXIgaCxmLGQ9aFtmLTFdLHA9d3AoZCkseD1kWzFdLzIrSnUsZz1PdCh4KSxtPVh0KHgpLHY9MDt2PGY7Kyt2LHA9XyxnPXcsbT1BLGQ9eSl7dmFyIHk9aFt2XSxfPXdwKHkpLFM9eVsxXS8yK0p1LHc9T3QoUyksQT1YdChTKSxUPV8tcCxiPVQ+PTA/MTotMSxNPWIqVCxFPU0+aWUsRD1nKnc7aWYoYy5hZGQoam4oRCpiKk90KE0pLG0qQStEKlh0KE0pKSksbys9RT9UK2IqQW46VCxFXnA+PWVeXz49ZSl7dmFyIEw9bW8oZHMoZCksZHMoeSkpO2loKEwpO3ZhciBGPW1vKHMsTCk7aWgoRik7dmFyIE49KEVeVD49MD8tMToxKSpqaShGWzJdKTsobj5OfHxuPT09TiYmKExbMF18fExbMV0pKSYmKGErPUVeVD49MD8xOi0xKX19cmV0dXJuKG88LXVlfHxvPHVlJiZjPC1adSleYSYxfWZ1bmN0aW9uIGx5KHIsdCxlLG4pe3JldHVybiBmdW5jdGlvbihpKXt2YXIgcz10KGkpLG89c3koKSxhPXQobyksYz0hMSxsLHUsaCxmPXtwb2ludDpkLGxpbmVTdGFydDp4LGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtmLnBvaW50PW0sZi5saW5lU3RhcnQ9dixmLmxpbmVFbmQ9eSx1PVtdLGw9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtmLnBvaW50PWQsZi5saW5lU3RhcnQ9eCxmLmxpbmVFbmQ9Zyx1PU9hKHUpO3ZhciBfPWN5KGwsbik7dS5sZW5ndGg/KGN8fChpLnBvbHlnb25TdGFydCgpLGM9ITApLG95KHUsVlIsXyxlLGkpKTpfJiYoY3x8KGkucG9seWdvblN0YXJ0KCksYz0hMCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpKSxjJiYoaS5wb2x5Z29uRW5kKCksYz0hMSksdT1sPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe2kucG9seWdvblN0YXJ0KCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpLGkucG9seWdvbkVuZCgpfX07ZnVuY3Rpb24gZChfLFMpe3IoXyxTKSYmaS5wb2ludChfLFMpfWZ1bmN0aW9uIHAoXyxTKXtzLnBvaW50KF8sUyl9ZnVuY3Rpb24geCgpe2YucG9pbnQ9cCxzLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGcoKXtmLnBvaW50PWQscy5saW5lRW5kKCl9ZnVuY3Rpb24gbShfLFMpe2gucHVzaChbXyxTXSksYS5wb2ludChfLFMpfWZ1bmN0aW9uIHYoKXthLmxpbmVTdGFydCgpLGg9W119ZnVuY3Rpb24geSgpe20oaFswXVswXSxoWzBdWzFdKSxhLmxpbmVFbmQoKTt2YXIgXz1hLmNsZWFuKCksUz1vLnJlc3VsdCgpLHcsQT1TLmxlbmd0aCxULGIsTTtpZihoLnBvcCgpLGwucHVzaChoKSxoPW51bGwsISFBKXtpZihfJjEpe2lmKGI9U1swXSwoVD1iLmxlbmd0aC0xKT4wKXtmb3IoY3x8KGkucG9seWdvblN0YXJ0KCksYz0hMCksaS5saW5lU3RhcnQoKSx3PTA7dzxUOysrdylpLnBvaW50KChNPWJbd10pWzBdLE1bMV0pO2kubGluZUVuZCgpfXJldHVybn1BPjEmJl8mMiYmUy5wdXNoKFMucG9wKCkuY29uY2F0KFMuc2hpZnQoKSkpLHUucHVzaChTLmZpbHRlcihrUikpfX1yZXR1cm4gZn19ZnVuY3Rpb24ga1Iocil7cmV0dXJuIHIubGVuZ3RoPjF9ZnVuY3Rpb24gVlIocix0KXtyZXR1cm4oKHI9ci54KVswXTwwP3JbMV0td24tdWU6d24tclsxXSktKCh0PXQueClbMF08MD90WzFdLXduLXVlOnduLXRbMV0pfXZhciB1eT1seShmdW5jdGlvbigpe3JldHVybiEwfSxHUixXUixbLWllLC13bl0pO2Z1bmN0aW9uIEdSKHIpe3ZhciB0PU5hTixlPU5hTixuPU5hTixpO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtyLmxpbmVTdGFydCgpLGk9MX0scG9pbnQ6ZnVuY3Rpb24ocyxvKXt2YXIgYT1zPjA/aWU6LWllLGM9eGUocy10KTt4ZShjLWllKTx1ZT8oci5wb2ludCh0LGU9KGUrbykvMj4wP3duOi13biksci5wb2ludChuLGUpLHIubGluZUVuZCgpLHIubGluZVN0YXJ0KCksci5wb2ludChhLGUpLHIucG9pbnQocyxlKSxpPTApOm4hPT1hJiZjPj1pZSYmKHhlKHQtbik8dWUmJih0LT1uKnVlKSx4ZShzLWEpPHVlJiYocy09YSp1ZSksZT1IUih0LGUscyxvKSxyLnBvaW50KG4sZSksci5saW5lRW5kKCksci5saW5lU3RhcnQoKSxyLnBvaW50KGEsZSksaT0wKSxyLnBvaW50KHQ9cyxlPW8pLG49YX0sbGluZUVuZDpmdW5jdGlvbigpe3IubGluZUVuZCgpLHQ9ZT1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItaX19fWZ1bmN0aW9uIEhSKHIsdCxlLG4pe3ZhciBpLHMsbz1PdChyLWUpO3JldHVybiB4ZShvKT51ZT91cCgoT3QodCkqKHM9WHQobikpKk90KGUpLU90KG4pKihpPVh0KHQpKSpPdChyKSkvKGkqcypvKSk6KHQrbikvMn1mdW5jdGlvbiBXUihyLHQsZSxuKXt2YXIgaTtpZihyPT1udWxsKWk9ZSp3bixuLnBvaW50KC1pZSxpKSxuLnBvaW50KDAsaSksbi5wb2ludChpZSxpKSxuLnBvaW50KGllLDApLG4ucG9pbnQoaWUsLWkpLG4ucG9pbnQoMCwtaSksbi5wb2ludCgtaWUsLWkpLG4ucG9pbnQoLWllLDApLG4ucG9pbnQoLWllLGkpO2Vsc2UgaWYoeGUoclswXS10WzBdKT51ZSl7dmFyIHM9clswXTx0WzBdP2llOi1pZTtpPWUqcy8yLG4ucG9pbnQoLXMsaSksbi5wb2ludCgwLGkpLG4ucG9pbnQocyxpKX1lbHNlIG4ucG9pbnQodFswXSx0WzFdKX1mdW5jdGlvbiBYUihyKXt2YXIgdD1YdChyKSxlPTIqa3Qsbj10PjAsaT14ZSh0KT51ZTtmdW5jdGlvbiBzKHUsaCxmLGQpe3pSKGQscixlLGYsdSxoKX1mdW5jdGlvbiBvKHUsaCl7cmV0dXJuIFh0KHUpKlh0KGgpPnR9ZnVuY3Rpb24gYSh1KXt2YXIgaCxmLGQscCx4O3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtwPWQ9ITEseD0xfSxwb2ludDpmdW5jdGlvbihnLG0pe3ZhciB2PVtnLG1dLHksXz1vKGcsbSksUz1uP18/MDpsKGcsbSk6Xz9sKGcrKGc8MD9pZTotaWUpLG0pOjA7aWYoIWgmJihwPWQ9XykmJnUubGluZVN0YXJ0KCksXyE9PWQmJih5PWMoaCx2KSwoIXl8fGhoKGgseSl8fGhoKHYseSkpJiYodlsyXT0xKSksXyE9PWQpeD0wLF8/KHUubGluZVN0YXJ0KCkseT1jKHYsaCksdS5wb2ludCh5WzBdLHlbMV0pKTooeT1jKGgsdiksdS5wb2ludCh5WzBdLHlbMV0sMiksdS5saW5lRW5kKCkpLGg9eTtlbHNlIGlmKGkmJmgmJm5eXyl7dmFyIHc7IShTJmYpJiYodz1jKHYsaCwhMCkpJiYoeD0wLG4/KHUubGluZVN0YXJ0KCksdS5wb2ludCh3WzBdWzBdLHdbMF1bMV0pLHUucG9pbnQod1sxXVswXSx3WzFdWzFdKSx1LmxpbmVFbmQoKSk6KHUucG9pbnQod1sxXVswXSx3WzFdWzFdKSx1LmxpbmVFbmQoKSx1LmxpbmVTdGFydCgpLHUucG9pbnQod1swXVswXSx3WzBdWzFdLDMpKSl9XyYmKCFofHwhaGgoaCx2KSkmJnUucG9pbnQodlswXSx2WzFdKSxoPXYsZD1fLGY9U30sbGluZUVuZDpmdW5jdGlvbigpe2QmJnUubGluZUVuZCgpLGg9bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4geHwocCYmZCk8PDF9fX1mdW5jdGlvbiBjKHUsaCxmKXt2YXIgZD1kcyh1KSxwPWRzKGgpLHg9WzEsMCwwXSxnPW1vKGQscCksbT1laChnLGcpLHY9Z1swXSx5PW0tdip2O2lmKCF5KXJldHVybiFmJiZ1O3ZhciBfPXQqbS95LFM9LXQqdi95LHc9bW8oeCxnKSxBPW5oKHgsXyksVD1uaChnLFMpO2dwKEEsVCk7dmFyIGI9dyxNPWVoKEEsYiksRT1laChiLGIpLEQ9TSpNLUUqKGVoKEEsQSktMSk7aWYoIShEPDApKXt2YXIgTD1LaShEKSxGPW5oKGIsKC1NLUwpL0UpO2lmKGdwKEYsQSksRj10aChGKSwhZilyZXR1cm4gRjt2YXIgTj11WzBdLE89aFswXSxIPXVbMV0sej1oWzFdLFE7TzxOJiYoUT1OLE49TyxPPVEpO3ZhciBzdD1PLU4sZnQ9eGUoc3QtaWUpPHVlLFJ0PWZ0fHxzdDx1ZTtpZighZnQmJno8SCYmKFE9SCxIPXosej1RKSxSdD9mdD9IK3o+MF5GWzFdPCh4ZShGWzBdLU4pPHVlP0g6eik6SDw9RlsxXSYmRlsxXTw9ejpzdD5pZV4oTjw9RlswXSYmRlswXTw9Tykpe3ZhciBGdD1uaChiLCgtTStMKS9FKTtyZXR1cm4gZ3AoRnQsQSksW0YsdGgoRnQpXX19fWZ1bmN0aW9uIGwodSxoKXt2YXIgZj1uP3I6aWUtcixkPTA7cmV0dXJuIHU8LWY/ZHw9MTp1PmYmJihkfD0yKSxoPC1mP2R8PTQ6aD5mJiYoZHw9OCksZH1yZXR1cm4gbHkobyxhLHMsbj9bMCwtcl06Wy1pZSxyLWllXSl9ZnVuY3Rpb24gJFIocix0LGUsbixpLHMpe3ZhciBvPXJbMF0sYT1yWzFdLGM9dFswXSxsPXRbMV0sdT0wLGg9MSxmPWMtbyxkPWwtYSxwO2lmKHA9ZS1vLCEoIWYmJnA+MCkpe2lmKHAvPWYsZjwwKXtpZihwPHUpcmV0dXJuO3A8aCYmKGg9cCl9ZWxzZSBpZihmPjApe2lmKHA+aClyZXR1cm47cD51JiYodT1wKX1pZihwPWktbywhKCFmJiZwPDApKXtpZihwLz1mLGY8MCl7aWYocD5oKXJldHVybjtwPnUmJih1PXApfWVsc2UgaWYoZj4wKXtpZihwPHUpcmV0dXJuO3A8aCYmKGg9cCl9aWYocD1uLWEsISghZCYmcD4wKSl7aWYocC89ZCxkPDApe2lmKHA8dSlyZXR1cm47cDxoJiYoaD1wKX1lbHNlIGlmKGQ+MCl7aWYocD5oKXJldHVybjtwPnUmJih1PXApfWlmKHA9cy1hLCEoIWQmJnA8MCkpe2lmKHAvPWQsZDwwKXtpZihwPmgpcmV0dXJuO3A+dSYmKHU9cCl9ZWxzZSBpZihkPjApe2lmKHA8dSlyZXR1cm47cDxoJiYoaD1wKX1yZXR1cm4gdT4wJiYoclswXT1vK3UqZixyWzFdPWErdSpkKSxoPDEmJih0WzBdPW8raCpmLHRbMV09YStoKmQpLCEwfX19fX12YXIgR2E9MWU5LGRoPS1HYTtmdW5jdGlvbiBxUihyLHQsZSxuKXtmdW5jdGlvbiBpKGwsdSl7cmV0dXJuIHI8PWwmJmw8PWUmJnQ8PXUmJnU8PW59ZnVuY3Rpb24gcyhsLHUsaCxmKXt2YXIgZD0wLHA9MDtpZihsPT1udWxsfHwoZD1vKGwsaCkpIT09KHA9byh1LGgpKXx8YyhsLHUpPDBeaD4wKWRvIGYucG9pbnQoZD09PTB8fGQ9PT0zP3I6ZSxkPjE/bjp0KTt3aGlsZSgoZD0oZCtoKzQpJTQpIT09cCk7ZWxzZSBmLnBvaW50KHVbMF0sdVsxXSl9ZnVuY3Rpb24gbyhsLHUpe3JldHVybiB4ZShsWzBdLXIpPHVlP3U+MD8wOjM6eGUobFswXS1lKTx1ZT91PjA/MjoxOnhlKGxbMV0tdCk8dWU/dT4wPzE6MDp1PjA/MzoyfWZ1bmN0aW9uIGEobCx1KXtyZXR1cm4gYyhsLngsdS54KX1mdW5jdGlvbiBjKGwsdSl7dmFyIGg9byhsLDEpLGY9byh1LDEpO3JldHVybiBoIT09Zj9oLWY6aD09PTA/dVsxXS1sWzFdOmg9PT0xP2xbMF0tdVswXTpoPT09Mj9sWzFdLXVbMV06dVswXS1sWzBdfXJldHVybiBmdW5jdGlvbihsKXt2YXIgdT1sLGg9c3koKSxmLGQscCx4LGcsbSx2LHksXyxTLHcsQT17cG9pbnQ6VCxsaW5lU3RhcnQ6RCxsaW5lRW5kOkwscG9seWdvblN0YXJ0Ok0scG9seWdvbkVuZDpFfTtmdW5jdGlvbiBUKE4sTyl7aShOLE8pJiZ1LnBvaW50KE4sTyl9ZnVuY3Rpb24gYigpe2Zvcih2YXIgTj0wLE89MCxIPWQubGVuZ3RoO088SDsrK08pZm9yKHZhciB6PWRbT10sUT0xLHN0PXoubGVuZ3RoLGZ0PXpbMF0sUnQsRnQsSz1mdFswXSxvdD1mdFsxXTtRPHN0OysrUSlSdD1LLEZ0PW90LGZ0PXpbUV0sSz1mdFswXSxvdD1mdFsxXSxGdDw9bj9vdD5uJiYoSy1SdCkqKG4tRnQpPihvdC1GdCkqKHItUnQpJiYrK046b3Q8PW4mJihLLVJ0KSoobi1GdCk8KG90LUZ0KSooci1SdCkmJi0tTjtyZXR1cm4gTn1mdW5jdGlvbiBNKCl7dT1oLGY9W10sZD1bXSx3PSEwfWZ1bmN0aW9uIEUoKXt2YXIgTj1iKCksTz13JiZOLEg9KGY9T2EoZikpLmxlbmd0aDsoT3x8SCkmJihsLnBvbHlnb25TdGFydCgpLE8mJihsLmxpbmVTdGFydCgpLHMobnVsbCxudWxsLDEsbCksbC5saW5lRW5kKCkpLEgmJm95KGYsYSxOLHMsbCksbC5wb2x5Z29uRW5kKCkpLHU9bCxmPWQ9cD1udWxsfWZ1bmN0aW9uIEQoKXtBLnBvaW50PUYsZCYmZC5wdXNoKHA9W10pLFM9ITAsXz0hMSx2PXk9TmFOfWZ1bmN0aW9uIEwoKXtmJiYoRih4LGcpLG0mJl8mJmgucmVqb2luKCksZi5wdXNoKGgucmVzdWx0KCkpKSxBLnBvaW50PVQsXyYmdS5saW5lRW5kKCl9ZnVuY3Rpb24gRihOLE8pe3ZhciBIPWkoTixPKTtpZihkJiZwLnB1c2goW04sT10pLFMpeD1OLGc9TyxtPUgsUz0hMSxIJiYodS5saW5lU3RhcnQoKSx1LnBvaW50KE4sTykpO2Vsc2UgaWYoSCYmXyl1LnBvaW50KE4sTyk7ZWxzZXt2YXIgej1bdj1NYXRoLm1heChkaCxNYXRoLm1pbihHYSx2KSkseT1NYXRoLm1heChkaCxNYXRoLm1pbihHYSx5KSldLFE9W049TWF0aC5tYXgoZGgsTWF0aC5taW4oR2EsTikpLE89TWF0aC5tYXgoZGgsTWF0aC5taW4oR2EsTykpXTskUih6LFEscix0LGUsbik/KF98fCh1LmxpbmVTdGFydCgpLHUucG9pbnQoelswXSx6WzFdKSksdS5wb2ludChRWzBdLFFbMV0pLEh8fHUubGluZUVuZCgpLHc9ITEpOkgmJih1LmxpbmVTdGFydCgpLHUucG9pbnQoTixPKSx3PSExKX12PU4seT1PLF89SH1yZXR1cm4gQX19dmFyIEFwLFRwLHBoLG1oLHhvPXtzcGhlcmU6UWUscG9pbnQ6UWUsbGluZVN0YXJ0OllSLGxpbmVFbmQ6UWUscG9seWdvblN0YXJ0OlFlLHBvbHlnb25FbmQ6UWV9O2Z1bmN0aW9uIFlSKCl7eG8ucG9pbnQ9SlIseG8ubGluZUVuZD1aUn1mdW5jdGlvbiBaUigpe3hvLnBvaW50PXhvLmxpbmVFbmQ9UWV9ZnVuY3Rpb24gSlIocix0KXtyKj1rdCx0Kj1rdCxUcD1yLHBoPU90KHQpLG1oPVh0KHQpLHhvLnBvaW50PUtSfWZ1bmN0aW9uIEtSKHIsdCl7cio9a3QsdCo9a3Q7dmFyIGU9T3QodCksbj1YdCh0KSxpPXhlKHItVHApLHM9WHQoaSksbz1PdChpKSxhPW4qbyxjPW1oKmUtcGgqbipzLGw9cGgqZSttaCpuKnM7QXAuYWRkKGpuKEtpKGEqYStjKmMpLGwpKSxUcD1yLHBoPWUsbWg9bn1mdW5jdGlvbiBqUihyKXtyZXR1cm4gQXA9bmV3IEppLGp1KHIseG8pLCtBcH12YXIgRXA9W251bGwsbnVsbF0sUVI9e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOkVwfTtmdW5jdGlvbiBfbyhyLHQpe3JldHVybiBFcFswXT1yLEVwWzFdPXQsalIoUVIpfXZhciBoeT17RmVhdHVyZTpmdW5jdGlvbihyLHQpe3JldHVybiBnaChyLmdlb21ldHJ5LHQpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihyLHQpe2Zvcih2YXIgZT1yLmZlYXR1cmVzLG49LTEsaT1lLmxlbmd0aDsrK248aTspaWYoZ2goZVtuXS5nZW9tZXRyeSx0KSlyZXR1cm4hMDtyZXR1cm4hMX19LGZ5PXtTcGhlcmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUG9pbnQ6ZnVuY3Rpb24ocix0KXtyZXR1cm4gZHkoci5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2ludDpmdW5jdGlvbihyLHQpe2Zvcih2YXIgZT1yLmNvb3JkaW5hdGVzLG49LTEsaT1lLmxlbmd0aDsrK248aTspaWYoZHkoZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX0sTGluZVN0cmluZzpmdW5jdGlvbihyLHQpe3JldHVybiBweShyLmNvb3JkaW5hdGVzLHQpfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24ocix0KXtmb3IodmFyIGU9ci5jb29yZGluYXRlcyxuPS0xLGk9ZS5sZW5ndGg7KytuPGk7KWlmKHB5KGVbbl0sdCkpcmV0dXJuITA7cmV0dXJuITF9LFBvbHlnb246ZnVuY3Rpb24ocix0KXtyZXR1cm4gbXkoci5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHIsdCl7Zm9yKHZhciBlPXIuY29vcmRpbmF0ZXMsbj0tMSxpPWUubGVuZ3RoOysrbjxpOylpZihteShlW25dLHQpKXJldHVybiEwO3JldHVybiExfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24ocix0KXtmb3IodmFyIGU9ci5nZW9tZXRyaWVzLG49LTEsaT1lLmxlbmd0aDsrK248aTspaWYoZ2goZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX19O2Z1bmN0aW9uIGdoKHIsdCl7cmV0dXJuIHImJmZ5Lmhhc093blByb3BlcnR5KHIudHlwZSk/Znlbci50eXBlXShyLHQpOiExfWZ1bmN0aW9uIGR5KHIsdCl7cmV0dXJuIF9vKHIsdCk9PT0wfWZ1bmN0aW9uIHB5KHIsdCl7Zm9yKHZhciBlLG4saSxzPTAsbz1yLmxlbmd0aDtzPG87cysrKXtpZihuPV9vKHJbc10sdCksbj09PTB8fHM+MCYmKGk9X28ocltzXSxyW3MtMV0pLGk+MCYmZTw9aSYmbjw9aSYmKGUrbi1pKSooMS1NYXRoLnBvdygoZS1uKS9pLDIpKTxadSppKSlyZXR1cm4hMDtlPW59cmV0dXJuITF9ZnVuY3Rpb24gbXkocix0KXtyZXR1cm4hIWN5KHIubWFwKHQyKSxneSh0KSl9ZnVuY3Rpb24gdDIocil7cmV0dXJuIHI9ci5tYXAoZ3kpLHIucG9wKCkscn1mdW5jdGlvbiBneShyKXtyZXR1cm5bclswXSprdCxyWzFdKmt0XX1mdW5jdGlvbiBlMihyLHQpe3JldHVybihyJiZoeS5oYXNPd25Qcm9wZXJ0eShyLnR5cGUpP2h5W3IudHlwZV06Z2gpKHIsdCl9ZnVuY3Rpb24gbjIocix0KXt2YXIgZT1yWzBdKmt0LG49clsxXSprdCxpPXRbMF0qa3Qscz10WzFdKmt0LG89WHQobiksYT1PdChuKSxjPVh0KHMpLGw9T3QocyksdT1vKlh0KGUpLGg9bypPdChlKSxmPWMqWHQoaSksZD1jKk90KGkpLHA9MipqaShLaShQXyhzLW4pK28qYypQXyhpLWUpKSkseD1PdChwKSxnPXA/ZnVuY3Rpb24obSl7dmFyIHY9T3QobSo9cCkveCx5PU90KHAtbSkveCxfPXkqdSt2KmYsUz15KmgrdipkLHc9eSphK3YqbDtyZXR1cm5bam4oUyxfKSpDZSxqbih3LEtpKF8qXytTKlMpKSpDZV19OmZ1bmN0aW9uKCl7cmV0dXJuW2UqQ2UsbipDZV19O3JldHVybiBnLmRpc3RhbmNlPXAsZ312YXIgeHk9cj0+cix5bz0xLzAseGg9eW8sSGE9LXlvLF9oPUhhLF95PXtwb2ludDppMixsaW5lU3RhcnQ6UWUsbGluZUVuZDpRZSxwb2x5Z29uU3RhcnQ6UWUscG9seWdvbkVuZDpRZSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgcj1bW3lvLHhoXSxbSGEsX2hdXTtyZXR1cm4gSGE9X2g9LSh4aD15bz0xLzApLHJ9fTtmdW5jdGlvbiBpMihyLHQpe3I8eW8mJih5bz1yKSxyPkhhJiYoSGE9ciksdDx4aCYmKHhoPXQpLHQ+X2gmJihfaD10KX1mdW5jdGlvbiBDcChyKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9bmV3IFJwO2Zvcih2YXIgbiBpbiByKWVbbl09cltuXTtyZXR1cm4gZS5zdHJlYW09dCxlfX1mdW5jdGlvbiBScCgpe31ScC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlJwLHBvaW50OmZ1bmN0aW9uKHIsdCl7dGhpcy5zdHJlYW0ucG9pbnQocix0KX0sc3BoZXJlOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25FbmQoKX19O2Z1bmN0aW9uIElwKHIsdCxlKXt2YXIgbj1yLmNsaXBFeHRlbnQmJnIuY2xpcEV4dGVudCgpO3JldHVybiByLnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLDBdKSxuIT1udWxsJiZyLmNsaXBFeHRlbnQobnVsbCksanUoZSxyLnN0cmVhbShfeSkpLHQoX3kucmVzdWx0KCkpLG4hPW51bGwmJnIuY2xpcEV4dGVudChuKSxyfWZ1bmN0aW9uIHl5KHIsdCxlKXtyZXR1cm4gSXAocixmdW5jdGlvbihuKXt2YXIgaT10WzFdWzBdLXRbMF1bMF0scz10WzFdWzFdLXRbMF1bMV0sbz1NYXRoLm1pbihpLyhuWzFdWzBdLW5bMF1bMF0pLHMvKG5bMV1bMV0tblswXVsxXSkpLGE9K3RbMF1bMF0rKGktbyooblsxXVswXStuWzBdWzBdKSkvMixjPSt0WzBdWzFdKyhzLW8qKG5bMV1bMV0rblswXVsxXSkpLzI7ci5zY2FsZSgxNTAqbykudHJhbnNsYXRlKFthLGNdKX0sZSl9ZnVuY3Rpb24gcjIocix0LGUpe3JldHVybiB5eShyLFtbMCwwXSx0XSxlKX1mdW5jdGlvbiBzMihyLHQsZSl7cmV0dXJuIElwKHIsZnVuY3Rpb24obil7dmFyIGk9K3Qscz1pLyhuWzFdWzBdLW5bMF1bMF0pLG89KGktcyooblsxXVswXStuWzBdWzBdKSkvMixhPS1zKm5bMF1bMV07ci5zY2FsZSgxNTAqcykudHJhbnNsYXRlKFtvLGFdKX0sZSl9ZnVuY3Rpb24gbzIocix0LGUpe3JldHVybiBJcChyLGZ1bmN0aW9uKG4pe3ZhciBpPSt0LHM9aS8oblsxXVsxXS1uWzBdWzFdKSxvPS1zKm5bMF1bMF0sYT0oaS1zKihuWzFdWzFdK25bMF1bMV0pKS8yO3Iuc2NhbGUoMTUwKnMpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfXZhciB2eT0xNixhMj1YdCgzMCprdCk7ZnVuY3Rpb24gTXkocix0KXtyZXR1cm4rdD9sMihyLHQpOmMyKHIpfWZ1bmN0aW9uIGMyKHIpe3JldHVybiBDcCh7cG9pbnQ6ZnVuY3Rpb24odCxlKXt0PXIodCxlKSx0aGlzLnN0cmVhbS5wb2ludCh0WzBdLHRbMV0pfX0pfWZ1bmN0aW9uIGwyKHIsdCl7ZnVuY3Rpb24gZShuLGkscyxvLGEsYyxsLHUsaCxmLGQscCx4LGcpe3ZhciBtPWwtbix2PXUtaSx5PW0qbSt2KnY7aWYoeT40KnQmJngtLSl7dmFyIF89bytmLFM9YStkLHc9YytwLEE9S2koXypfK1MqUyt3KncpLFQ9amkody89QSksYj14ZSh4ZSh3KS0xKTx1ZXx8eGUocy1oKTx1ZT8ocytoKS8yOmpuKFMsXyksTT1yKGIsVCksRT1NWzBdLEQ9TVsxXSxMPUUtbixGPUQtaSxOPXYqTC1tKkY7KE4qTi95PnR8fHhlKChtKkwrdipGKS95LS41KT4uM3x8bypmK2EqZCtjKnA8YTIpJiYoZShuLGkscyxvLGEsYyxFLEQsYixfLz1BLFMvPUEsdyx4LGcpLGcucG9pbnQoRSxEKSxlKEUsRCxiLF8sUyx3LGwsdSxoLGYsZCxwLHgsZykpfX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIGkscyxvLGEsYyxsLHUsaCxmLGQscCx4LGc9e3BvaW50Om0sbGluZVN0YXJ0OnYsbGluZUVuZDpfLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksZy5saW5lU3RhcnQ9U30scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLGcubGluZVN0YXJ0PXZ9fTtmdW5jdGlvbiBtKFQsYil7VD1yKFQsYiksbi5wb2ludChUWzBdLFRbMV0pfWZ1bmN0aW9uIHYoKXtoPU5hTixnLnBvaW50PXksbi5saW5lU3RhcnQoKX1mdW5jdGlvbiB5KFQsYil7dmFyIE09ZHMoW1QsYl0pLEU9cihULGIpO2UoaCxmLHUsZCxwLHgsaD1FWzBdLGY9RVsxXSx1PVQsZD1NWzBdLHA9TVsxXSx4PU1bMl0sdnksbiksbi5wb2ludChoLGYpfWZ1bmN0aW9uIF8oKXtnLnBvaW50PW0sbi5saW5lRW5kKCl9ZnVuY3Rpb24gUygpe3YoKSxnLnBvaW50PXcsZy5saW5lRW5kPUF9ZnVuY3Rpb24gdyhULGIpe3koaT1ULGIpLHM9aCxvPWYsYT1kLGM9cCxsPXgsZy5wb2ludD15fWZ1bmN0aW9uIEEoKXtlKGgsZix1LGQscCx4LHMsbyxpLGEsYyxsLHZ5LG4pLGcubGluZUVuZD1fLF8oKX1yZXR1cm4gZ319dmFyIHUyPUNwKHtwb2ludDpmdW5jdGlvbihyLHQpe3RoaXMuc3RyZWFtLnBvaW50KHIqa3QsdCprdCl9fSk7ZnVuY3Rpb24gaDIocil7cmV0dXJuIENwKHtwb2ludDpmdW5jdGlvbih0LGUpe3ZhciBuPXIodCxlKTtyZXR1cm4gdGhpcy5zdHJlYW0ucG9pbnQoblswXSxuWzFdKX19KX1mdW5jdGlvbiBmMihyLHQsZSxuLGkpe2Z1bmN0aW9uIHMobyxhKXtyZXR1cm4gbyo9bixhKj1pLFt0K3IqbyxlLXIqYV19cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKG8sYSl7cmV0dXJuWyhvLXQpL3IqbiwoZS1hKS9yKmldfSxzfWZ1bmN0aW9uIFN5KHIsdCxlLG4saSxzKXtpZighcylyZXR1cm4gZjIocix0LGUsbixpKTt2YXIgbz1YdChzKSxhPU90KHMpLGM9bypyLGw9YSpyLHU9by9yLGg9YS9yLGY9KGEqZS1vKnQpL3IsZD0oYSp0K28qZSkvcjtmdW5jdGlvbiBwKHgsZyl7cmV0dXJuIHgqPW4sZyo9aSxbYyp4LWwqZyt0LGUtbCp4LWMqZ119cmV0dXJuIHAuaW52ZXJ0PWZ1bmN0aW9uKHgsZyl7cmV0dXJuW24qKHUqeC1oKmcrZiksaSooZC1oKngtdSpnKV19LHB9ZnVuY3Rpb24geWgocil7cmV0dXJuIGQyKGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSgpfWZ1bmN0aW9uIGQyKHIpe3ZhciB0LGU9MTUwLG49NDgwLGk9MjUwLHM9MCxvPTAsYT0wLGM9MCxsPTAsdSxoPTAsZj0xLGQ9MSxwPW51bGwseD11eSxnPW51bGwsbSx2LHksXz14eSxTPS41LHcsQSxULGIsTTtmdW5jdGlvbiBFKE4pe3JldHVybiBUKE5bMF0qa3QsTlsxXSprdCl9ZnVuY3Rpb24gRChOKXtyZXR1cm4gTj1ULmludmVydChOWzBdLE5bMV0pLE4mJltOWzBdKkNlLE5bMV0qQ2VdfUUuc3RyZWFtPWZ1bmN0aW9uKE4pe3JldHVybiBiJiZNPT09Tj9iOmI9dTIoaDIodSkoeCh3KF8oTT1OKSkpKSl9LEUucHJlY2xpcD1mdW5jdGlvbihOKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD1OLHA9dm9pZCAwLEYoKSk6eH0sRS5wb3N0Y2xpcD1mdW5jdGlvbihOKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz1OLGc9bT12PXk9bnVsbCxGKCkpOl99LEUuY2xpcEFuZ2xlPWZ1bmN0aW9uKE4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PStOP1hSKHA9TiprdCk6KHA9bnVsbCx1eSksRigpKTpwKkNlfSxFLmNsaXBFeHRlbnQ9ZnVuY3Rpb24oTil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KF89Tj09bnVsbD8oZz1tPXY9eT1udWxsLHh5KTpxUihnPStOWzBdWzBdLG09K05bMF1bMV0sdj0rTlsxXVswXSx5PStOWzFdWzFdKSxGKCkpOmc9PW51bGw/bnVsbDpbW2csbV0sW3YseV1dfSxFLnNjYWxlPWZ1bmN0aW9uKE4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPStOLEwoKSk6ZX0sRS50cmFuc2xhdGU9ZnVuY3Rpb24oTil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K05bMF0saT0rTlsxXSxMKCkpOltuLGldfSxFLmNlbnRlcj1mdW5jdGlvbihOKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1OWzBdJTM2MCprdCxvPU5bMV0lMzYwKmt0LEwoKSk6W3MqQ2UsbypDZV19LEUucm90YXRlPWZ1bmN0aW9uKE4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPU5bMF0lMzYwKmt0LGM9TlsxXSUzNjAqa3QsbD1OLmxlbmd0aD4yP05bMl0lMzYwKmt0OjAsTCgpKTpbYSpDZSxjKkNlLGwqQ2VdfSxFLmFuZ2xlPWZ1bmN0aW9uKE4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPU4lMzYwKmt0LEwoKSk6aCpDZX0sRS5yZWZsZWN0WD1mdW5jdGlvbihOKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1OPy0xOjEsTCgpKTpmPDB9LEUucmVmbGVjdFk9ZnVuY3Rpb24oTil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9Tj8tMToxLEwoKSk6ZDwwfSxFLnByZWNpc2lvbj1mdW5jdGlvbihOKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odz1NeShBLFM9TipOKSxGKCkpOktpKFMpfSxFLmZpdEV4dGVudD1mdW5jdGlvbihOLE8pe3JldHVybiB5eShFLE4sTyl9LEUuZml0U2l6ZT1mdW5jdGlvbihOLE8pe3JldHVybiByMihFLE4sTyl9LEUuZml0V2lkdGg9ZnVuY3Rpb24oTixPKXtyZXR1cm4gczIoRSxOLE8pfSxFLmZpdEhlaWdodD1mdW5jdGlvbihOLE8pe3JldHVybiBvMihFLE4sTyl9O2Z1bmN0aW9uIEwoKXt2YXIgTj1TeShlLDAsMCxmLGQsaCkuYXBwbHkobnVsbCx0KHMsbykpLE89U3koZSxuLU5bMF0saS1OWzFdLGYsZCxoKTtyZXR1cm4gdT1RXyhhLGMsbCksQT1TcCh0LE8pLFQ9U3AodSxBKSx3PU15KEEsUyksRigpfWZ1bmN0aW9uIEYoKXtyZXR1cm4gYj1NPW51bGwsRX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdD1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxFLmludmVydD10LmludmVydCYmRCxMKCl9fWZ1bmN0aW9uIHAyKHIpe3JldHVybiBmdW5jdGlvbih0LGUpe3ZhciBuPUtpKHQqdCtlKmUpLGk9cihuKSxzPU90KGkpLG89WHQoaSk7cmV0dXJuW2puKHQqcyxuKm8pLGppKG4mJmUqcy9uKV19fWZ1bmN0aW9uIFBwKHIsdCl7cmV0dXJuW3Isd1IoVFIoKHduK3QpLzIpKV19UHAuaW52ZXJ0PWZ1bmN0aW9uKHIsdCl7cmV0dXJuW3IsMip1cChiUih0KSktd25dfTtmdW5jdGlvbiBtMigpe3JldHVybiBnMihQcCkuc2NhbGUoOTYxL0FuKX1mdW5jdGlvbiBnMihyKXt2YXIgdD15aChyKSxlPXQuY2VudGVyLG49dC5zY2FsZSxpPXQudHJhbnNsYXRlLHM9dC5jbGlwRXh0ZW50LG89bnVsbCxhLGMsbDt0LnNjYWxlPWZ1bmN0aW9uKGgpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuKGgpLHUoKSk6bigpfSx0LnRyYW5zbGF0ZT1mdW5jdGlvbihoKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaShoKSx1KCkpOmkoKX0sdC5jZW50ZXI9ZnVuY3Rpb24oaCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGUoaCksdSgpKTplKCl9LHQuY2xpcEV4dGVudD1mdW5jdGlvbihoKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD09bnVsbD9vPWE9Yz1sPW51bGw6KG89K2hbMF1bMF0sYT0raFswXVsxXSxjPStoWzFdWzBdLGw9K2hbMV1bMV0pLHUoKSk6bz09bnVsbD9udWxsOltbbyxhXSxbYyxsXV19O2Z1bmN0aW9uIHUoKXt2YXIgaD1pZSpuKCksZj10KGl5KHQucm90YXRlKCkpLmludmVydChbMCwwXSkpO3JldHVybiBzKG89PW51bGw/W1tmWzBdLWgsZlsxXS1oXSxbZlswXStoLGZbMV0raF1dOnI9PT1QcD9bW01hdGgubWF4KGZbMF0taCxvKSxhXSxbTWF0aC5taW4oZlswXStoLGMpLGxdXTpbW28sTWF0aC5tYXgoZlsxXS1oLGEpXSxbYyxNYXRoLm1pbihmWzFdK2gsbCldXSl9cmV0dXJuIHUoKX1mdW5jdGlvbiBMcChyLHQpe3JldHVybltyLHRdfUxwLmludmVydD1McDtmdW5jdGlvbiB4Migpe3JldHVybiB5aChMcCkuc2NhbGUoMTUyLjYzKX1mdW5jdGlvbiBieShyLHQpe3ZhciBlPVh0KHQpLG49MStYdChyKSplO3JldHVybltlKk90KHIpL24sT3QodCkvbl19YnkuaW52ZXJ0PXAyKGZ1bmN0aW9uKHIpe3JldHVybiAyKnVwKHIpfSk7ZnVuY3Rpb24gXzIoKXtyZXR1cm4geWgoYnkpLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9dmFyIHkyPU1hdGguYXRhbix2Mj1NYXRoLmNvcyxNMj1NYXRoLnRhbixTMj1NYXRoLlBJLGIyPVMyLzE4MDtmdW5jdGlvbiB3eShyKXtyZXR1cm4gcj4wP01hdGguc3FydChyKTowfXZhciB2aD12MigzNSpiMik7ZnVuY3Rpb24gQXkocix0KXt2YXIgZT1NMih0LzIpO3JldHVybltyKnZoKnd5KDEtZSplKSwoMSt2aCkqZV19QXkuaW52ZXJ0PWZ1bmN0aW9uKHIsdCl7dmFyIGU9dC8oMSt2aCk7cmV0dXJuW3ImJnIvKHZoKnd5KDEtZSplKSksMip5MihlKV19O2Z1bmN0aW9uIHcyKCl7cmV0dXJuIHloKEF5KS5zY2FsZSgxMzcuMTUyKX1jb25zdCBBMj17bWVyY2F0b3I6bTIsZXF1aXJlY3Rhbmd1bGFyOngyLGZhaGV5OncyfSxEcD17fSxXYT1yPT57dmFyIG4saSxzO2NvbnN0IHQ9SlNPTi5zdHJpbmdpZnkocik7aWYoRHBbdF0pcmV0dXJuIERwW3RdO2NvbnN0IGU9QTJbKG49ci5wcm9qZWN0aW9uVHlwZSkhPW51bGw/bjoibWVyY2F0b3IiXSgpLmNlbnRlcihyLmNlbnRlcikuc2NhbGUoci5zY2FsZSkudHJhbnNsYXRlKChpPXIudHJhbnNsYXRlKSE9bnVsbD9pOlswLDBdKS5wcmVjaXNpb24oKHM9ci5wcmVjaXNpb24pIT1udWxsP3M6LjEpO3JldHVybiByLnJvdGF0ZSYmZS5yb3RhdGUoci5yb3RhdGUpLERwW3RdPWUsZX0sTWg9KHIsdCk9PnIubWFwKChbZSxuXSk9PntsZXQgaTtpZih0KXtjb25zdFtzLG9dPXQoW2Usbl0pO2k9bmV3IHEocywtbyl9ZWxzZSBpPW5ldyBxKGUsbik7cmV0dXJuIGl9KTt2YXIgWGE9KHIsdCk9Pntjb25zdCBlPVJfKHIsdCE9bnVsbD90OjApLG49e30saT1bXSxzPU9iamVjdC5rZXlzKGUuYXR0cmlidXRlcyk7cmV0dXJuIGUuaW5kZXgmJnMucHVzaCgiaW5kZXgiKSxzLmZvckVhY2gobz0+e2NvbnN0IGE9bz09PSJpbmRleCI/ZS5pbmRleDplLmF0dHJpYnV0ZXNbb107bltvXT17YXJyYXk6YS5hcnJheSxpdGVtU2l6ZTphLml0ZW1TaXplfSxpLnB1c2goYS5hcnJheS5idWZmZXIpfSksdCYmKG4uZ3JvdXBzPWUuZ3JvdXBzKSxlLmRpc3Bvc2UoKSxyLmZvckVhY2gobz0+e28uZGlzcG9zZSgpfSkse21lc3NhZ2U6bix0cmFuc2ZlcjppfX0sVXA9KHIsdD0zMDApPT57Y29uc3QgZT1bXTtyZXR1cm4gci5mb3JFYWNoKG49PntsZXQgaT0hMTtmb3IobGV0IHM9MTtzPG4ubGVuZ3RoO3MrKylpZihNYXRoLmFicyhuW3NdLngtbltzLTFdLngpPnQpe2k9ITA7YnJlYWt9aWYoaSl7Y29uc3Qgcz1bXSxvPVtdO24uZm9yRWFjaChhPT57YS54PDA/cy5wdXNoKGEpOm8ucHVzaChhKX0pLGUucHVzaChzLG8pfWVsc2UgZS5wdXNoKG4pfSksZX07Y29uc3QgVDI9KHtjb29yZGluYXRlc0FycjpyLHNwbGl0OnQsc2lkZVJlcGVhdDplLGJib3g6bixiYm94T2Zmc2V0OmksZGVwdGg6cyxwcm9qZWN0aW9uOm8sdXNlR3JvdXBzOmEsaGFzVG9wOmMsaGFzQm90dG9tOmwsaGFzU2lkZTp1LHNwbGl0UG9seWdvbnM6aCx0b3BTZWdtZW50czpmfSk9Pntjb25zdCBkPW8mJldhKG8pO2xldCBwPXIubWFwKG09Pk1oKG0sZCkpO2gmJihwPVVwKHAsaCkpO2xldCB4O2lmKG4pe2NvbnN0W20sdl09TWgoW1tuWzBdLG5bMV1dLFtuWzJdLG5bM11dXSxvIT1udWxsJiZvLnJvdGF0ZT9XYShnaShXZSh7fSxvKSx7cm90YXRlOnZvaWQgMH0pKTpkKTtpJiYobS54Kz1pWzBdLG0ueSs9aVsxXSx2LngrPWlbMl0sdi55Kz1pWzNdKSx4PW5ldyBsZShuZXcgSShtLngsbS55LDApLG5ldyBJKHYueCx2LnksMCkpfWNvbnN0IGc9cC5tYXAoKG0sdik9Pnt2YXIgeTtyZXR1cm4gdVIoe3BvaW50czptLHNwbGl0OnQsc2lkZVJlcGVhdDplLGRlcHRoOih5PXNbdl0pIT1udWxsP3k6c1swXSxoYXNUb3A6YyxoYXNCb3R0b206bCxoYXNTaWRlOnUsYm94Mzp4LHRvcFNlZ21lbnRzOmZ9KX0pO3JldHVybiBYYShnLGEpfTtmdW5jdGlvbiBOcChyLHQsZSxuLGkpe2xldCBzO2lmKHI9ci5zdWJhcnJheXx8ci5zbGljZT9yOnIuYnVmZmVyLGU9ZS5zdWJhcnJheXx8ZS5zbGljZT9lOmUuYnVmZmVyLHI9dD9yLnN1YmFycmF5P3Iuc3ViYXJyYXkodCxpJiZ0K2kpOnIuc2xpY2UodCxpJiZ0K2kpOnIsZS5zZXQpZS5zZXQocixuKTtlbHNlIGZvcihzPTA7czxyLmxlbmd0aDtzKyspZVtzK25dPXJbc107cmV0dXJuIGV9ZnVuY3Rpb24gRTIocil7cmV0dXJuIHIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXk/cjpyIGluc3RhbmNlb2YgTnQ/ci5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikuYXJyYXk6ci5tYXAodD0+e2NvbnN0IGU9QXJyYXkuaXNBcnJheSh0KTtyZXR1cm4gdCBpbnN0YW5jZW9mIEk/W3QueCx0LnksdC56XTp0IGluc3RhbmNlb2YgcT9bdC54LHQueSwwXTplJiZ0Lmxlbmd0aD09PTM/W3RbMF0sdFsxXSx0WzJdXTplJiZ0Lmxlbmd0aD09PTI/W3RbMF0sdFsxXSwwXTp0fSkuZmxhdCgpfWNsYXNzIEMyIGV4dGVuZHMgTnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaExpbmUiLHRoaXMuaXNNZXNoTGluZT0hMCx0aGlzLnBvc2l0aW9ucz1bXSx0aGlzLnByZXZpb3VzPVtdLHRoaXMubmV4dD1bXSx0aGlzLnNpZGU9W10sdGhpcy53aWR0aD1bXSx0aGlzLmluZGljZXNfYXJyYXk9W10sdGhpcy51dnM9W10sdGhpcy5jb3VudGVycz1bXSx0aGlzLndpZHRoQ2FsbGJhY2s9bnVsbCx0aGlzLl9wb2ludHM9W10sdGhpcy5tYXRyaXhXb3JsZD1uZXcgQ3QsT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cG9pbnRzOntlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiB0aGlzLl9wb2ludHN9LHNldCh0KXt0aGlzLnNldFBvaW50cyh0LHRoaXMud2lkdGhDYWxsYmFjayl9fX0pfXNldE1hdHJpeFdvcmxkKHQpe3RoaXMubWF0cml4V29ybGQ9dH1zZXRQb2ludHModCxlKXtpZih0PUUyKHQpLHRoaXMuX3BvaW50cz10LHRoaXMud2lkdGhDYWxsYmFjaz1lIT1udWxsP2U6bnVsbCx0aGlzLnBvc2l0aW9ucz1bXSx0aGlzLmNvdW50ZXJzPVtdLHQubGVuZ3RoJiZ0WzBdaW5zdGFuY2VvZiBJKWZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBpPXRbbl0scz1uLyh0Lmxlbmd0aC0xKTt0aGlzLnBvc2l0aW9ucy5wdXNoKGkueCxpLnksaS56KSx0aGlzLnBvc2l0aW9ucy5wdXNoKGkueCxpLnksaS56KSx0aGlzLmNvdW50ZXJzLnB1c2gocyksdGhpcy5jb3VudGVycy5wdXNoKHMpfWVsc2UgZm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKz0zKXtjb25zdCBpPW4vKHQubGVuZ3RoLTEpO3RoaXMucG9zaXRpb25zLnB1c2godFtuXSx0W24rMV0sdFtuKzJdKSx0aGlzLnBvc2l0aW9ucy5wdXNoKHRbbl0sdFtuKzFdLHRbbisyXSksdGhpcy5jb3VudGVycy5wdXNoKGkpLHRoaXMuY291bnRlcnMucHVzaChpKX10aGlzLnByb2Nlc3MoKX1jb21wYXJlVjModCxlKXtjb25zdCBuPXQqNixpPWUqNjtyZXR1cm4gdGhpcy5wb3NpdGlvbnNbbl09PT10aGlzLnBvc2l0aW9uc1tpXSYmdGhpcy5wb3NpdGlvbnNbbisxXT09PXRoaXMucG9zaXRpb25zW2krMV0mJnRoaXMucG9zaXRpb25zW24rMl09PT10aGlzLnBvc2l0aW9uc1tpKzJdfWNvcHlWMyh0KXtjb25zdCBlPXQqNjtyZXR1cm5bdGhpcy5wb3NpdGlvbnNbZV0sdGhpcy5wb3NpdGlvbnNbZSsxXSx0aGlzLnBvc2l0aW9uc1tlKzJdXX1wcm9jZXNzKCl7Y29uc3QgdD10aGlzLnBvc2l0aW9ucy5sZW5ndGgvNjt0aGlzLnByZXZpb3VzPVtdLHRoaXMubmV4dD1bXSx0aGlzLnNpZGU9W10sdGhpcy53aWR0aD1bXSx0aGlzLmluZGljZXNfYXJyYXk9W10sdGhpcy51dnM9W107bGV0IGUsbjt0aGlzLmNvbXBhcmVWMygwLHQtMSk/bj10aGlzLmNvcHlWMyh0LTIpOm49dGhpcy5jb3B5VjMoMCksdGhpcy5wcmV2aW91cy5wdXNoKG5bMF0sblsxXSxuWzJdKSx0aGlzLnByZXZpb3VzLnB1c2goblswXSxuWzFdLG5bMl0pO2ZvcihsZXQgaT0wO2k8dDtpKyspe2lmKHRoaXMuc2lkZS5wdXNoKDEpLHRoaXMuc2lkZS5wdXNoKC0xKSx0aGlzLndpZHRoQ2FsbGJhY2s/ZT10aGlzLndpZHRoQ2FsbGJhY2soaS8odC0xKSk6ZT0xLHRoaXMud2lkdGgucHVzaChlKSx0aGlzLndpZHRoLnB1c2goZSksdGhpcy51dnMucHVzaChpLyh0LTEpLDApLHRoaXMudXZzLnB1c2goaS8odC0xKSwxKSxpPHQtMSl7bj10aGlzLmNvcHlWMyhpKSx0aGlzLnByZXZpb3VzLnB1c2goblswXSxuWzFdLG5bMl0pLHRoaXMucHJldmlvdXMucHVzaChuWzBdLG5bMV0sblsyXSk7Y29uc3Qgcz1pKjI7dGhpcy5pbmRpY2VzX2FycmF5LnB1c2gocyxzKzEscysyKSx0aGlzLmluZGljZXNfYXJyYXkucHVzaChzKzIscysxLHMrMyl9aT4wJiYobj10aGlzLmNvcHlWMyhpKSx0aGlzLm5leHQucHVzaChuWzBdLG5bMV0sblsyXSksdGhpcy5uZXh0LnB1c2goblswXSxuWzFdLG5bMl0pKX10aGlzLmNvbXBhcmVWMyh0LTEsMCk/bj10aGlzLmNvcHlWMygxKTpuPXRoaXMuY29weVYzKHQtMSksdGhpcy5uZXh0LnB1c2goblswXSxuWzFdLG5bMl0pLHRoaXMubmV4dC5wdXNoKG5bMF0sblsxXSxuWzJdKSwhdGhpcy5fYXR0cmlidXRlc3x8dGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCE9PXRoaXMuY291bnRlcnMubGVuZ3RoP3RoaXMuX2F0dHJpYnV0ZXM9e3Bvc2l0aW9uOm5ldyBKdChuZXcgRmxvYXQzMkFycmF5KHRoaXMucG9zaXRpb25zKSwzKSxwcmV2aW91czpuZXcgSnQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnByZXZpb3VzKSwzKSxuZXh0Om5ldyBKdChuZXcgRmxvYXQzMkFycmF5KHRoaXMubmV4dCksMyksc2lkZTpuZXcgSnQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnNpZGUpLDEpLHdpZHRoOm5ldyBKdChuZXcgRmxvYXQzMkFycmF5KHRoaXMud2lkdGgpLDEpLHV2Om5ldyBKdChuZXcgRmxvYXQzMkFycmF5KHRoaXMudXZzKSwyKSxpbmRleDpuZXcgSnQobmV3IFVpbnQxNkFycmF5KHRoaXMuaW5kaWNlc19hcnJheSksMSksY291bnRlcnM6bmV3IEp0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5jb3VudGVycyksMSl9Oih0aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvcHlBcnJheShuZXcgRmxvYXQzMkFycmF5KHRoaXMucG9zaXRpb25zKSksdGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbi5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzLmNvcHlBcnJheShuZXcgRmxvYXQzMkFycmF5KHRoaXMucHJldmlvdXMpKSx0aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzLm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMubmV4dC5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLm5leHQpKSx0aGlzLl9hdHRyaWJ1dGVzLm5leHQubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5zaWRlLmNvcHlBcnJheShuZXcgRmxvYXQzMkFycmF5KHRoaXMuc2lkZSkpLHRoaXMuX2F0dHJpYnV0ZXMuc2lkZS5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLndpZHRoLmNvcHlBcnJheShuZXcgRmxvYXQzMkFycmF5KHRoaXMud2lkdGgpKSx0aGlzLl9hdHRyaWJ1dGVzLndpZHRoLm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMudXYuY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy51dnMpKSx0aGlzLl9hdHRyaWJ1dGVzLnV2Lm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMuaW5kZXguY29weUFycmF5KG5ldyBVaW50MTZBcnJheSh0aGlzLmluZGljZXNfYXJyYXkpKSx0aGlzLl9hdHRyaWJ1dGVzLmluZGV4Lm5lZWRzVXBkYXRlPSEwKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLHRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24pLHRoaXMuc2V0QXR0cmlidXRlKCJwcmV2aW91cyIsdGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cyksdGhpcy5zZXRBdHRyaWJ1dGUoIm5leHQiLHRoaXMuX2F0dHJpYnV0ZXMubmV4dCksdGhpcy5zZXRBdHRyaWJ1dGUoInNpZGUiLHRoaXMuX2F0dHJpYnV0ZXMuc2lkZSksdGhpcy5zZXRBdHRyaWJ1dGUoIndpZHRoIix0aGlzLl9hdHRyaWJ1dGVzLndpZHRoKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLHRoaXMuX2F0dHJpYnV0ZXMudXYpLHRoaXMuc2V0QXR0cmlidXRlKCJjb3VudGVycyIsdGhpcy5fYXR0cmlidXRlcy5jb3VudGVycyksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIix0aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uKSx0aGlzLnNldEF0dHJpYnV0ZSgicHJldmlvdXMiLHRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMpLHRoaXMuc2V0QXR0cmlidXRlKCJuZXh0Iix0aGlzLl9hdHRyaWJ1dGVzLm5leHQpLHRoaXMuc2V0QXR0cmlidXRlKCJzaWRlIix0aGlzLl9hdHRyaWJ1dGVzLnNpZGUpLHRoaXMuc2V0QXR0cmlidXRlKCJ3aWR0aCIsdGhpcy5fYXR0cmlidXRlcy53aWR0aCksdGhpcy5zZXRBdHRyaWJ1dGUoInV2Iix0aGlzLl9hdHRyaWJ1dGVzLnV2KSx0aGlzLnNldEF0dHJpYnV0ZSgiY291bnRlcnMiLHRoaXMuX2F0dHJpYnV0ZXMuY291bnRlcnMpLHRoaXMuc2V0SW5kZXgodGhpcy5fYXR0cmlidXRlcy5pbmRleCksdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSx0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpfWFkdmFuY2Uoe3g6dCx5OmUsejpufSl7Y29uc3QgaT10aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5LHM9dGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cy5hcnJheSxvPXRoaXMuX2F0dHJpYnV0ZXMubmV4dC5hcnJheSxhPWkubGVuZ3RoO05wKGksMCxzLDAsYSksTnAoaSw2LGksMCxhLTYpLGlbYS02XT10LGlbYS01XT1lLGlbYS00XT1uLGlbYS0zXT10LGlbYS0yXT1lLGlbYS0xXT1uLE5wKGksNixvLDAsYS02KSxvW2EtNl09dCxvW2EtNV09ZSxvW2EtNF09bixvW2EtM109dCxvW2EtMl09ZSxvW2EtMV09bix0aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uLm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5uZXh0Lm5lZWRzVXBkYXRlPSEwfX12YXIgVHk9cj0+e2NvbnN0e3NldFBvaW50V2lkdGg6dCxub2RlczplfT1yLG49bmV3IEMyO3JldHVybiBuLnNldFBvaW50cyhlLHQpLG59O2NvbnN0IFIyPSh7Y29vcmRpbmF0ZXNBcnI6cixwcm9qZWN0aW9uOnQsbGluZVdpZHRoOmUsdXNlR3JvdXBzOm4sc3BsaXRQb2x5Z29uczppfSk9Pntjb25zdCBzPXQmJldhKHQpO2xldCBvPXIubWFwKGM9Pk1oKGMscykpO2kmJihvPVVwKG8saSkpO2NvbnN0IGE9by5tYXAoKGMsbCk9Pnt2YXIgaDtjb25zdCB1PShoPWVbbF0pIT1udWxsP2g6ZVswXTtyZXR1cm4gVHkoe25vZGVzOmMsc2V0UG9pbnRXaWR0aDooKT0+dX0pfSk7cmV0dXJuIFhhKGEsbil9O3ZhciBJMj1yPT57Y29uc3R7cG9pbnRzOnR9PXIsZT10LnJlZHVjZSgoaSxzLG8pPT4obzx0Lmxlbmd0aC0xJiZpLnB1c2gocyx0W28rMV0pLGkpLFtdKTtyZXR1cm4gbmV3IE50KCkuc2V0RnJvbVBvaW50cyhlKX07Y29uc3QgUDI9KHtjb29yZGluYXRlc0FycjpyLHByb2plY3Rpb246dCxsaW5lV2lkdGg6ZSx1c2VHcm91cHM6bixzcGxpdFBvbHlnb25zOml9KT0+e2NvbnN0IHM9dCYmV2EodCk7bGV0IG89ci5tYXAoYz0+TWgoYyxzKSk7aSYmKG89VXAobyxpKSk7Y29uc3QgYT1vLm1hcCgoYyxsKT0+STIoe3BvaW50czpjLm1hcCh1PT5uZXcgSSh1LngsdS55LDApKX0pKTtyZXR1cm4gWGEoYSxuKX07ZnVuY3Rpb24gTDIocix0LGU9Mil7Y29uc3Qgbj10JiZ0Lmxlbmd0aCxpPW4/dFswXSplOnIubGVuZ3RoO2xldCBzPUV5KHIsMCxpLGUsITApO2NvbnN0IG89W107aWYoIXN8fHMubmV4dD09PXMucHJldilyZXR1cm4gbztsZXQgYSxjLGw7aWYobiYmKHM9QjIocix0LHMsZSkpLHIubGVuZ3RoPjgwKmUpe2E9MS8wLGM9MS8wO2xldCB1PS0xLzAsaD0tMS8wO2ZvcihsZXQgZj1lO2Y8aTtmKz1lKXtjb25zdCBkPXJbZl0scD1yW2YrMV07ZDxhJiYoYT1kKSxwPGMmJihjPXApLGQ+dSYmKHU9ZCkscD5oJiYoaD1wKX1sPU1hdGgubWF4KHUtYSxoLWMpLGw9bCE9PTA/MzI3NjcvbDowfXJldHVybiAkYShzLG8sZSxhLGMsbCwwKSxvfWZ1bmN0aW9uIEV5KHIsdCxlLG4saSl7bGV0IHM7aWYoaT09PVkyKHIsdCxlLG4pPjApZm9yKGxldCBvPXQ7bzxlO28rPW4pcz1JeShvL258MCxyW29dLHJbbysxXSxzKTtlbHNlIGZvcihsZXQgbz1lLW47bz49dDtvLT1uKXM9SXkoby9ufDAscltvXSxyW28rMV0scyk7cmV0dXJuIHMmJlNoKHMscy5uZXh0KSYmKFlhKHMpLHM9cy5uZXh0KSxzfWZ1bmN0aW9uIG1zKHIsdCl7aWYoIXIpcmV0dXJuIHI7dHx8KHQ9cik7bGV0IGU9cixuO2RvIGlmKG49ITEsIWUuc3RlaW5lciYmKFNoKGUsZS5uZXh0KXx8d2UoZS5wcmV2LGUsZS5uZXh0KT09PTApKXtpZihZYShlKSxlPXQ9ZS5wcmV2LGU9PT1lLm5leHQpYnJlYWs7bj0hMH1lbHNlIGU9ZS5uZXh0O3doaWxlKG58fGUhPT10KTtyZXR1cm4gdH1mdW5jdGlvbiAkYShyLHQsZSxuLGkscyxvKXtpZighcilyZXR1cm47IW8mJnMmJkcyKHIsbixpLHMpO2xldCBhPXI7Zm9yKDtyLnByZXYhPT1yLm5leHQ7KXtjb25zdCBjPXIucHJldixsPXIubmV4dDtpZihzP1UyKHIsbixpLHMpOkQyKHIpKXt0LnB1c2goYy5pLHIuaSxsLmkpLFlhKHIpLHI9bC5uZXh0LGE9bC5uZXh0O2NvbnRpbnVlfWlmKHI9bCxyPT09YSl7bz9vPT09MT8ocj1OMihtcyhyKSx0KSwkYShyLHQsZSxuLGkscywyKSk6bz09PTImJkYyKHIsdCxlLG4saSxzKTokYShtcyhyKSx0LGUsbixpLHMsMSk7YnJlYWt9fX1mdW5jdGlvbiBEMihyKXtjb25zdCB0PXIucHJldixlPXIsbj1yLm5leHQ7aWYod2UodCxlLG4pPj0wKXJldHVybiExO2NvbnN0IGk9dC54LHM9ZS54LG89bi54LGE9dC55LGM9ZS55LGw9bi55LHU9aTxzP2k8bz9pOm86czxvP3M6byxoPWE8Yz9hPGw/YTpsOmM8bD9jOmwsZj1pPnM/aT5vP2k6bzpzPm8/czpvLGQ9YT5jP2E+bD9hOmw6Yz5sP2M6bDtsZXQgcD1uLm5leHQ7Zm9yKDtwIT09dDspe2lmKHAueD49dSYmcC54PD1mJiZwLnk+PWgmJnAueTw9ZCYmdm8oaSxhLHMsYyxvLGwscC54LHAueSkmJndlKHAucHJldixwLHAubmV4dCk+PTApcmV0dXJuITE7cD1wLm5leHR9cmV0dXJuITB9ZnVuY3Rpb24gVTIocix0LGUsbil7Y29uc3QgaT1yLnByZXYscz1yLG89ci5uZXh0O2lmKHdlKGkscyxvKT49MClyZXR1cm4hMTtjb25zdCBhPWkueCxjPXMueCxsPW8ueCx1PWkueSxoPXMueSxmPW8ueSxkPWE8Yz9hPGw/YTpsOmM8bD9jOmwscD11PGg/dTxmP3U6ZjpoPGY/aDpmLHg9YT5jP2E+bD9hOmw6Yz5sP2M6bCxnPXU+aD91PmY/dTpmOmg+Zj9oOmYsbT1GcChkLHAsdCxlLG4pLHY9RnAoeCxnLHQsZSxuKTtsZXQgeT1yLnByZXZaLF89ci5uZXh0Wjtmb3IoO3kmJnkuej49bSYmXyYmXy56PD12Oyl7aWYoeS54Pj1kJiZ5Lng8PXgmJnkueT49cCYmeS55PD1nJiZ5IT09aSYmeSE9PW8mJnZvKGEsdSxjLGgsbCxmLHkueCx5LnkpJiZ3ZSh5LnByZXYseSx5Lm5leHQpPj0wfHwoeT15LnByZXZaLF8ueD49ZCYmXy54PD14JiZfLnk+PXAmJl8ueTw9ZyYmXyE9PWkmJl8hPT1vJiZ2byhhLHUsYyxoLGwsZixfLngsXy55KSYmd2UoXy5wcmV2LF8sXy5uZXh0KT49MCkpcmV0dXJuITE7Xz1fLm5leHRafWZvcig7eSYmeS56Pj1tOyl7aWYoeS54Pj1kJiZ5Lng8PXgmJnkueT49cCYmeS55PD1nJiZ5IT09aSYmeSE9PW8mJnZvKGEsdSxjLGgsbCxmLHkueCx5LnkpJiZ3ZSh5LnByZXYseSx5Lm5leHQpPj0wKXJldHVybiExO3k9eS5wcmV2Wn1mb3IoO18mJl8uejw9djspe2lmKF8ueD49ZCYmXy54PD14JiZfLnk+PXAmJl8ueTw9ZyYmXyE9PWkmJl8hPT1vJiZ2byhhLHUsYyxoLGwsZixfLngsXy55KSYmd2UoXy5wcmV2LF8sXy5uZXh0KT49MClyZXR1cm4hMTtfPV8ubmV4dFp9cmV0dXJuITB9ZnVuY3Rpb24gTjIocix0KXtsZXQgZT1yO2Rve2NvbnN0IG49ZS5wcmV2LGk9ZS5uZXh0Lm5leHQ7IVNoKG4saSkmJkN5KG4sZSxlLm5leHQsaSkmJnFhKG4saSkmJnFhKGksbikmJih0LnB1c2gobi5pLGUuaSxpLmkpLFlhKGUpLFlhKGUubmV4dCksZT1yPWkpLGU9ZS5uZXh0fXdoaWxlKGUhPT1yKTtyZXR1cm4gbXMoZSl9ZnVuY3Rpb24gRjIocix0LGUsbixpLHMpe2xldCBvPXI7ZG97bGV0IGE9by5uZXh0Lm5leHQ7Zm9yKDthIT09by5wcmV2Oyl7aWYoby5pIT09YS5pJiZYMihvLGEpKXtsZXQgYz1SeShvLGEpO289bXMobyxvLm5leHQpLGM9bXMoYyxjLm5leHQpLCRhKG8sdCxlLG4saSxzLDApLCRhKGMsdCxlLG4saSxzLDApO3JldHVybn1hPWEubmV4dH1vPW8ubmV4dH13aGlsZShvIT09cil9ZnVuY3Rpb24gQjIocix0LGUsbil7Y29uc3QgaT1bXTtmb3IobGV0IHM9MCxvPXQubGVuZ3RoO3M8bztzKyspe2NvbnN0IGE9dFtzXSpuLGM9czxvLTE/dFtzKzFdKm46ci5sZW5ndGgsbD1FeShyLGEsYyxuLCExKTtsPT09bC5uZXh0JiYobC5zdGVpbmVyPSEwKSxpLnB1c2goVzIobCkpfWkuc29ydChPMik7Zm9yKGxldCBzPTA7czxpLmxlbmd0aDtzKyspZT16MihpW3NdLGUpO3JldHVybiBlfWZ1bmN0aW9uIE8yKHIsdCl7cmV0dXJuIHIueC10Lnh9ZnVuY3Rpb24gejIocix0KXtjb25zdCBlPWsyKHIsdCk7aWYoIWUpcmV0dXJuIHQ7Y29uc3Qgbj1SeShlLHIpO3JldHVybiBtcyhuLG4ubmV4dCksbXMoZSxlLm5leHQpfWZ1bmN0aW9uIGsyKHIsdCl7bGV0IGU9dDtjb25zdCBuPXIueCxpPXIueTtsZXQgcz0tMS8wLG87ZG97aWYoaTw9ZS55JiZpPj1lLm5leHQueSYmZS5uZXh0LnkhPT1lLnkpe2NvbnN0IGg9ZS54KyhpLWUueSkqKGUubmV4dC54LWUueCkvKGUubmV4dC55LWUueSk7aWYoaDw9biYmaD5zJiYocz1oLG89ZS54PGUubmV4dC54P2U6ZS5uZXh0LGg9PT1uKSlyZXR1cm4gb31lPWUubmV4dH13aGlsZShlIT09dCk7aWYoIW8pcmV0dXJuIG51bGw7Y29uc3QgYT1vLGM9by54LGw9by55O2xldCB1PTEvMDtlPW87ZG97aWYobj49ZS54JiZlLng+PWMmJm4hPT1lLngmJnZvKGk8bD9uOnMsaSxjLGwsaTxsP3M6bixpLGUueCxlLnkpKXtjb25zdCBoPU1hdGguYWJzKGktZS55KS8obi1lLngpO3FhKGUscikmJihoPHV8fGg9PT11JiYoZS54Pm8ueHx8ZS54PT09by54JiZWMihvLGUpKSkmJihvPWUsdT1oKX1lPWUubmV4dH13aGlsZShlIT09YSk7cmV0dXJuIG99ZnVuY3Rpb24gVjIocix0KXtyZXR1cm4gd2Uoci5wcmV2LHIsdC5wcmV2KTwwJiZ3ZSh0Lm5leHQscixyLm5leHQpPDB9ZnVuY3Rpb24gRzIocix0LGUsbil7bGV0IGk9cjtkbyBpLno9PT0wJiYoaS56PUZwKGkueCxpLnksdCxlLG4pKSxpLnByZXZaPWkucHJldixpLm5leHRaPWkubmV4dCxpPWkubmV4dDt3aGlsZShpIT09cik7aS5wcmV2Wi5uZXh0Wj1udWxsLGkucHJldlo9bnVsbCxIMihpKX1mdW5jdGlvbiBIMihyKXtsZXQgdCxlPTE7ZG97bGV0IG49cixpO3I9bnVsbDtsZXQgcz1udWxsO2Zvcih0PTA7bjspe3QrKztsZXQgbz1uLGE9MDtmb3IobGV0IGw9MDtsPGUmJihhKyssbz1vLm5leHRaLCEhbyk7bCsrKTtsZXQgYz1lO2Zvcig7YT4wfHxjPjAmJm87KWEhPT0wJiYoYz09PTB8fCFvfHxuLno8PW8ueik/KGk9bixuPW4ubmV4dFosYS0tKTooaT1vLG89by5uZXh0WixjLS0pLHM/cy5uZXh0Wj1pOnI9aSxpLnByZXZaPXMscz1pO249b31zLm5leHRaPW51bGwsZSo9Mn13aGlsZSh0PjEpO3JldHVybiByfWZ1bmN0aW9uIEZwKHIsdCxlLG4saSl7cmV0dXJuIHI9KHItZSkqaXwwLHQ9KHQtbikqaXwwLHI9KHJ8cjw8OCkmMTY3MTE5MzUscj0ocnxyPDw0KSYyNTI2NDUxMzUscj0ocnxyPDwyKSY4NTg5OTM0NTkscj0ocnxyPDwxKSYxNDMxNjU1NzY1LHQ9KHR8dDw8OCkmMTY3MTE5MzUsdD0odHx0PDw0KSYyNTI2NDUxMzUsdD0odHx0PDwyKSY4NTg5OTM0NTksdD0odHx0PDwxKSYxNDMxNjU1NzY1LHJ8dDw8MX1mdW5jdGlvbiBXMihyKXtsZXQgdD1yLGU9cjtkbyh0Lng8ZS54fHx0Lng9PT1lLngmJnQueTxlLnkpJiYoZT10KSx0PXQubmV4dDt3aGlsZSh0IT09cik7cmV0dXJuIGV9ZnVuY3Rpb24gdm8ocix0LGUsbixpLHMsbyxhKXtyZXR1cm4oaS1vKSoodC1hKT49KHItbykqKHMtYSkmJihyLW8pKihuLWEpPj0oZS1vKSoodC1hKSYmKGUtbykqKHMtYSk+PShpLW8pKihuLWEpfWZ1bmN0aW9uIFgyKHIsdCl7cmV0dXJuIHIubmV4dC5pIT09dC5pJiZyLnByZXYuaSE9PXQuaSYmISQyKHIsdCkmJihxYShyLHQpJiZxYSh0LHIpJiZxMihyLHQpJiYod2Uoci5wcmV2LHIsdC5wcmV2KXx8d2Uocix0LnByZXYsdCkpfHxTaChyLHQpJiZ3ZShyLnByZXYscixyLm5leHQpPjAmJndlKHQucHJldix0LHQubmV4dCk+MCl9ZnVuY3Rpb24gd2Uocix0LGUpe3JldHVybih0Lnktci55KSooZS54LXQueCktKHQueC1yLngpKihlLnktdC55KX1mdW5jdGlvbiBTaChyLHQpe3JldHVybiByLng9PT10LngmJnIueT09PXQueX1mdW5jdGlvbiBDeShyLHQsZSxuKXtjb25zdCBpPXdoKHdlKHIsdCxlKSkscz13aCh3ZShyLHQsbikpLG89d2god2UoZSxuLHIpKSxhPXdoKHdlKGUsbix0KSk7cmV0dXJuISEoaSE9PXMmJm8hPT1hfHxpPT09MCYmYmgocixlLHQpfHxzPT09MCYmYmgocixuLHQpfHxvPT09MCYmYmgoZSxyLG4pfHxhPT09MCYmYmgoZSx0LG4pKX1mdW5jdGlvbiBiaChyLHQsZSl7cmV0dXJuIHQueDw9TWF0aC5tYXgoci54LGUueCkmJnQueD49TWF0aC5taW4oci54LGUueCkmJnQueTw9TWF0aC5tYXgoci55LGUueSkmJnQueT49TWF0aC5taW4oci55LGUueSl9ZnVuY3Rpb24gd2gocil7cmV0dXJuIHI+MD8xOnI8MD8tMTowfWZ1bmN0aW9uICQyKHIsdCl7bGV0IGU9cjtkb3tpZihlLmkhPT1yLmkmJmUubmV4dC5pIT09ci5pJiZlLmkhPT10LmkmJmUubmV4dC5pIT09dC5pJiZDeShlLGUubmV4dCxyLHQpKXJldHVybiEwO2U9ZS5uZXh0fXdoaWxlKGUhPT1yKTtyZXR1cm4hMX1mdW5jdGlvbiBxYShyLHQpe3JldHVybiB3ZShyLnByZXYscixyLm5leHQpPDA/d2Uocix0LHIubmV4dCk+PTAmJndlKHIsci5wcmV2LHQpPj0wOndlKHIsdCxyLnByZXYpPDB8fHdlKHIsci5uZXh0LHQpPDB9ZnVuY3Rpb24gcTIocix0KXtsZXQgZT1yLG49ITE7Y29uc3QgaT0oci54K3QueCkvMixzPShyLnkrdC55KS8yO2RvIGUueT5zIT1lLm5leHQueT5zJiZlLm5leHQueSE9PWUueSYmaTwoZS5uZXh0LngtZS54KSoocy1lLnkpLyhlLm5leHQueS1lLnkpK2UueCYmKG49IW4pLGU9ZS5uZXh0O3doaWxlKGUhPT1yKTtyZXR1cm4gbn1mdW5jdGlvbiBSeShyLHQpe2NvbnN0IGU9QnAoci5pLHIueCxyLnkpLG49QnAodC5pLHQueCx0LnkpLGk9ci5uZXh0LHM9dC5wcmV2O3JldHVybiByLm5leHQ9dCx0LnByZXY9cixlLm5leHQ9aSxpLnByZXY9ZSxuLm5leHQ9ZSxlLnByZXY9bixzLm5leHQ9bixuLnByZXY9cyxufWZ1bmN0aW9uIEl5KHIsdCxlLG4pe2NvbnN0IGk9QnAocix0LGUpO3JldHVybiBuPyhpLm5leHQ9bi5uZXh0LGkucHJldj1uLG4ubmV4dC5wcmV2PWksbi5uZXh0PWkpOihpLnByZXY9aSxpLm5leHQ9aSksaX1mdW5jdGlvbiBZYShyKXtyLm5leHQucHJldj1yLnByZXYsci5wcmV2Lm5leHQ9ci5uZXh0LHIucHJldlomJihyLnByZXZaLm5leHRaPXIubmV4dFopLHIubmV4dFomJihyLm5leHRaLnByZXZaPXIucHJldlopfWZ1bmN0aW9uIEJwKHIsdCxlKXtyZXR1cm57aTpyLHg6dCx5OmUscHJldjpudWxsLG5leHQ6bnVsbCx6OjAscHJldlo6bnVsbCxuZXh0WjpudWxsLHN0ZWluZXI6ITF9fWZ1bmN0aW9uIFkyKHIsdCxlLG4pe2xldCBpPTA7Zm9yKGxldCBzPXQsbz1lLW47czxlO3MrPW4paSs9KHJbb10tcltzXSkqKHJbcysxXStyW28rMV0pLG89cztyZXR1cm4gaX1mdW5jdGlvbiBQeShyKXtjb25zdCB0PVtdLGU9W10sbj1yWzBdWzBdLmxlbmd0aDtsZXQgaT0wLHM9MDtmb3IoY29uc3QgbyBvZiByKXtmb3IoY29uc3QgYSBvZiBvKWZvcihsZXQgYz0wO2M8bjtjKyspdC5wdXNoKGFbY10pO3MmJihpKz1zLGUucHVzaChpKSkscz1vLmxlbmd0aH1yZXR1cm57dmVydGljZXM6dCxob2xlczplLGRpbWVuc2lvbnM6bn19ZnVuY3Rpb24gWjIocil7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJjb29yZCBpcyByZXF1aXJlZCIpO2lmKCFBcnJheS5pc0FycmF5KHIpKXtpZihyLnR5cGU9PT0iRmVhdHVyZSImJnIuZ2VvbWV0cnkhPT1udWxsJiZyLmdlb21ldHJ5LnR5cGU9PT0iUG9pbnQiKXJldHVyblsuLi5yLmdlb21ldHJ5LmNvb3JkaW5hdGVzXTtpZihyLnR5cGU9PT0iUG9pbnQiKXJldHVyblsuLi5yLmNvb3JkaW5hdGVzXX1pZihBcnJheS5pc0FycmF5KHIpJiZyLmxlbmd0aD49MiYmIUFycmF5LmlzQXJyYXkoclswXSkmJiFBcnJheS5pc0FycmF5KHJbMV0pKXJldHVyblsuLi5yXTt0aHJvdyBuZXcgRXJyb3IoImNvb3JkIG11c3QgYmUgR2VvSlNPTiBQb2ludCBvciBhbiBBcnJheSBvZiBudW1iZXJzIil9ZnVuY3Rpb24gSjIocil7aWYoQXJyYXkuaXNBcnJheShyKSlyZXR1cm4gcjtpZihyLnR5cGU9PT0iRmVhdHVyZSIpe2lmKHIuZ2VvbWV0cnkhPT1udWxsKXJldHVybiByLmdlb21ldHJ5LmNvb3JkaW5hdGVzfWVsc2UgaWYoci5jb29yZGluYXRlcylyZXR1cm4gci5jb29yZGluYXRlczt0aHJvdyBuZXcgRXJyb3IoImNvb3JkcyBtdXN0IGJlIEdlb0pTT04gRmVhdHVyZSwgR2VvbWV0cnkgT2JqZWN0IG9yIGFuIEFycmF5Iil9ZnVuY3Rpb24gSzIocil7cmV0dXJuIHIudHlwZT09PSJGZWF0dXJlIj9yLmdlb21ldHJ5OnJ9ZnVuY3Rpb24gajIocil7Y29uc3QgdD1KMihyKTtsZXQgZT0wLG49MSxpLHM7Zm9yKDtuPHQubGVuZ3RoOylpPXN8fHRbMF0scz10W25dLGUrPShzWzBdLWlbMF0pKihzWzFdK2lbMV0pLG4rKztyZXR1cm4gZT4wfXZhciBRMj1qMjtjb25zdCBucj0xMTEwMjIzMDI0NjI1MTU2NWUtMzIsdG49MTM0MjE3NzI5LHRJPSgzKzgqbnIpKm5yO2Z1bmN0aW9uIE9wKHIsdCxlLG4saSl7bGV0IHMsbyxhLGMsbD10WzBdLHU9blswXSxoPTAsZj0wO3U+bD09dT4tbD8ocz1sLGw9dFsrK2hdKToocz11LHU9blsrK2ZdKTtsZXQgZD0wO2lmKGg8ciYmZjxlKWZvcih1Pmw9PXU+LWw/KG89bCtzLGE9cy0oby1sKSxsPXRbKytoXSk6KG89dStzLGE9cy0oby11KSx1PW5bKytmXSkscz1vLGEhPT0wJiYoaVtkKytdPWEpO2g8ciYmZjxlOyl1Pmw9PXU+LWw/KG89cytsLGM9by1zLGE9cy0oby1jKSsobC1jKSxsPXRbKytoXSk6KG89cyt1LGM9by1zLGE9cy0oby1jKSsodS1jKSx1PW5bKytmXSkscz1vLGEhPT0wJiYoaVtkKytdPWEpO2Zvcig7aDxyOylvPXMrbCxjPW8tcyxhPXMtKG8tYykrKGwtYyksbD10WysraF0scz1vLGEhPT0wJiYoaVtkKytdPWEpO2Zvcig7ZjxlOylvPXMrdSxjPW8tcyxhPXMtKG8tYykrKHUtYyksdT1uWysrZl0scz1vLGEhPT0wJiYoaVtkKytdPWEpO3JldHVybihzIT09MHx8ZD09PTApJiYoaVtkKytdPXMpLGR9ZnVuY3Rpb24gZUkocix0KXtsZXQgZT10WzBdO2ZvcihsZXQgbj0xO248cjtuKyspZSs9dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBaYShyKXtyZXR1cm4gbmV3IEZsb2F0NjRBcnJheShyKX1jb25zdCBuST0oMysxNipucikqbnIsaUk9KDIrMTIqbnIpKm5yLHJJPSg5KzY0Km5yKSpucipucixNbz1aYSg0KSxMeT1aYSg4KSxEeT1aYSgxMiksVXk9WmEoMTYpLHBuPVphKDQpO2Z1bmN0aW9uIHNJKHIsdCxlLG4saSxzLG8pe2xldCBhLGMsbCx1LGgsZixkLHAseCxnLG0sdix5LF8sUyx3LEEsVDtjb25zdCBiPXItaSxNPWUtaSxFPXQtcyxEPW4tcztfPWIqRCxmPXRuKmIsZD1mLShmLWIpLHA9Yi1kLGY9dG4qRCx4PWYtKGYtRCksZz1ELXgsUz1wKmctKF8tZCp4LXAqeC1kKmcpLHc9RSpNLGY9dG4qRSxkPWYtKGYtRSkscD1FLWQsZj10bipNLHg9Zi0oZi1NKSxnPU0teCxBPXAqZy0ody1kKngtcCp4LWQqZyksbT1TLUEsaD1TLW0sTW9bMF09Uy0obStoKSsoaC1BKSx2PV8rbSxoPXYtXyx5PV8tKHYtaCkrKG0taCksbT15LXcsaD15LW0sTW9bMV09eS0obStoKSsoaC13KSxUPXYrbSxoPVQtdixNb1syXT12LShULWgpKyhtLWgpLE1vWzNdPVQ7bGV0IEw9ZUkoNCxNbyksRj1pSSpvO2lmKEw+PUZ8fC1MPj1GfHwoaD1yLWIsYT1yLShiK2gpKyhoLWkpLGg9ZS1NLGw9ZS0oTStoKSsoaC1pKSxoPXQtRSxjPXQtKEUraCkrKGgtcyksaD1uLUQsdT1uLShEK2gpKyhoLXMpLGE9PT0wJiZjPT09MCYmbD09PTAmJnU9PT0wKXx8KEY9ckkqbyt0SSpNYXRoLmFicyhMKSxMKz1iKnUrRCphLShFKmwrTSpjKSxMPj1GfHwtTD49RikpcmV0dXJuIEw7Xz1hKkQsZj10biphLGQ9Zi0oZi1hKSxwPWEtZCxmPXRuKkQseD1mLShmLUQpLGc9RC14LFM9cCpnLShfLWQqeC1wKngtZCpnKSx3PWMqTSxmPXRuKmMsZD1mLShmLWMpLHA9Yy1kLGY9dG4qTSx4PWYtKGYtTSksZz1NLXgsQT1wKmctKHctZCp4LXAqeC1kKmcpLG09Uy1BLGg9Uy1tLHBuWzBdPVMtKG0raCkrKGgtQSksdj1fK20saD12LV8seT1fLSh2LWgpKyhtLWgpLG09eS13LGg9eS1tLHBuWzFdPXktKG0raCkrKGgtdyksVD12K20saD1ULXYscG5bMl09di0oVC1oKSsobS1oKSxwblszXT1UO2NvbnN0IE49T3AoNCxNbyw0LHBuLEx5KTtfPWIqdSxmPXRuKmIsZD1mLShmLWIpLHA9Yi1kLGY9dG4qdSx4PWYtKGYtdSksZz11LXgsUz1wKmctKF8tZCp4LXAqeC1kKmcpLHc9RSpsLGY9dG4qRSxkPWYtKGYtRSkscD1FLWQsZj10bipsLHg9Zi0oZi1sKSxnPWwteCxBPXAqZy0ody1kKngtcCp4LWQqZyksbT1TLUEsaD1TLW0scG5bMF09Uy0obStoKSsoaC1BKSx2PV8rbSxoPXYtXyx5PV8tKHYtaCkrKG0taCksbT15LXcsaD15LW0scG5bMV09eS0obStoKSsoaC13KSxUPXYrbSxoPVQtdixwblsyXT12LShULWgpKyhtLWgpLHBuWzNdPVQ7Y29uc3QgTz1PcChOLEx5LDQscG4sRHkpO189YSp1LGY9dG4qYSxkPWYtKGYtYSkscD1hLWQsZj10bip1LHg9Zi0oZi11KSxnPXUteCxTPXAqZy0oXy1kKngtcCp4LWQqZyksdz1jKmwsZj10bipjLGQ9Zi0oZi1jKSxwPWMtZCxmPXRuKmwseD1mLShmLWwpLGc9bC14LEE9cCpnLSh3LWQqeC1wKngtZCpnKSxtPVMtQSxoPVMtbSxwblswXT1TLShtK2gpKyhoLUEpLHY9XyttLGg9di1fLHk9Xy0odi1oKSsobS1oKSxtPXktdyxoPXktbSxwblsxXT15LShtK2gpKyhoLXcpLFQ9dittLGg9VC12LHBuWzJdPXYtKFQtaCkrKG0taCkscG5bM109VDtjb25zdCBIPU9wKE8sRHksNCxwbixVeSk7cmV0dXJuIFV5W0gtMV19ZnVuY3Rpb24gQWgocix0LGUsbixpLHMpe2NvbnN0IG89KHQtcykqKGUtaSksYT0oci1pKSoobi1zKSxjPW8tYTtpZihvPT09MHx8YT09PTB8fG8+MCE9YT4wKXJldHVybiBjO2NvbnN0IGw9TWF0aC5hYnMobythKTtyZXR1cm4gTWF0aC5hYnMoYyk+PW5JKmw/Yzotc0kocix0LGUsbixpLHMsbCl9Y29uc3QgTnk9TWF0aC5wb3coMiwtNTIpLFRoPW5ldyBVaW50MzJBcnJheSg1MTIpO2NsYXNzIEphe3N0YXRpYyBmcm9tKHQsZT11SSxuPWhJKXtjb25zdCBpPXQubGVuZ3RoLHM9bmV3IEZsb2F0NjRBcnJheShpKjIpO2ZvcihsZXQgbz0wO288aTtvKyspe2NvbnN0IGE9dFtvXTtzWzIqb109ZShhKSxzWzIqbysxXT1uKGEpfXJldHVybiBuZXcgSmEocyl9Y29uc3RydWN0b3IodCl7Y29uc3QgZT10Lmxlbmd0aD4+MTtpZihlPjAmJnR5cGVvZiB0WzBdIT0ibnVtYmVyIil0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGNvb3JkcyB0byBjb250YWluIG51bWJlcnMuIik7dGhpcy5jb29yZHM9dDtjb25zdCBuPU1hdGgubWF4KDIqZS01LDApO3RoaXMuX3RyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkobiozKSx0aGlzLl9oYWxmZWRnZXM9bmV3IEludDMyQXJyYXkobiozKSx0aGlzLl9oYXNoU2l6ZT1NYXRoLmNlaWwoTWF0aC5zcXJ0KGUpKSx0aGlzLl9odWxsUHJldj1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbE5leHQ9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxUcmk9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2h1bGxIYXNoPW5ldyBJbnQzMkFycmF5KHRoaXMuX2hhc2hTaXplKS5maWxsKC0xKSx0aGlzLl9pZHM9bmV3IFVpbnQzMkFycmF5KGUpLHRoaXMuX2Rpc3RzPW5ldyBGbG9hdDY0QXJyYXkoZSksdGhpcy51cGRhdGUoKX11cGRhdGUoKXtjb25zdHtjb29yZHM6dCxfaHVsbFByZXY6ZSxfaHVsbE5leHQ6bixfaHVsbFRyaTppLF9odWxsSGFzaDpzfT10aGlzLG89dC5sZW5ndGg+PjE7bGV0IGE9MS8wLGM9MS8wLGw9LTEvMCx1PS0xLzA7Zm9yKGxldCBNPTA7TTxvO00rKyl7Y29uc3QgRT10WzIqTV0sRD10WzIqTSsxXTtFPGEmJihhPUUpLEQ8YyYmKGM9RCksRT5sJiYobD1FKSxEPnUmJih1PUQpLHRoaXMuX2lkc1tNXT1NfWNvbnN0IGg9KGErbCkvMixmPShjK3UpLzI7bGV0IGQ9MS8wLHAseCxnO2ZvcihsZXQgTT0wO008bztNKyspe2NvbnN0IEU9enAoaCxmLHRbMipNXSx0WzIqTSsxXSk7RTxkJiYocD1NLGQ9RSl9Y29uc3QgbT10WzIqcF0sdj10WzIqcCsxXTtkPTEvMDtmb3IobGV0IE09MDtNPG87TSsrKXtpZihNPT09cCljb250aW51ZTtjb25zdCBFPXpwKG0sdix0WzIqTV0sdFsyKk0rMV0pO0U8ZCYmRT4wJiYoeD1NLGQ9RSl9bGV0IHk9dFsyKnhdLF89dFsyKngrMV0sUz0xLzA7Zm9yKGxldCBNPTA7TTxvO00rKyl7aWYoTT09PXB8fE09PT14KWNvbnRpbnVlO2NvbnN0IEU9Y0kobSx2LHksXyx0WzIqTV0sdFsyKk0rMV0pO0U8UyYmKGc9TSxTPUUpfWxldCB3PXRbMipnXSxBPXRbMipnKzFdO2lmKFM9PT0xLzApe2ZvcihsZXQgRD0wO0Q8bztEKyspdGhpcy5fZGlzdHNbRF09dFsyKkRdLXRbMF18fHRbMipEKzFdLXRbMV07U28odGhpcy5faWRzLHRoaXMuX2Rpc3RzLDAsby0xKTtjb25zdCBNPW5ldyBVaW50MzJBcnJheShvKTtsZXQgRT0wO2ZvcihsZXQgRD0wLEw9LTEvMDtEPG87RCsrKXtjb25zdCBGPXRoaXMuX2lkc1tEXTt0aGlzLl9kaXN0c1tGXT5MJiYoTVtFKytdPUYsTD10aGlzLl9kaXN0c1tGXSl9dGhpcy5odWxsPU0uc3ViYXJyYXkoMCxFKSx0aGlzLnRyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkoMCksdGhpcy5oYWxmZWRnZXM9bmV3IFVpbnQzMkFycmF5KDApO3JldHVybn1pZihBaChtLHYseSxfLHcsQSk8MCl7Y29uc3QgTT14LEU9eSxEPV87eD1nLHk9dyxfPUEsZz1NLHc9RSxBPUR9Y29uc3QgVD1sSShtLHYseSxfLHcsQSk7dGhpcy5fY3g9VC54LHRoaXMuX2N5PVQueTtmb3IobGV0IE09MDtNPG87TSsrKXRoaXMuX2Rpc3RzW01dPXpwKHRbMipNXSx0WzIqTSsxXSxULngsVC55KTtTbyh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpLHRoaXMuX2h1bGxTdGFydD1wO2xldCBiPTM7bltwXT1lW2ddPXgsblt4XT1lW3BdPWcsbltnXT1lW3hdPXAsaVtwXT0wLGlbeF09MSxpW2ddPTIscy5maWxsKC0xKSxzW3RoaXMuX2hhc2hLZXkobSx2KV09cCxzW3RoaXMuX2hhc2hLZXkoeSxfKV09eCxzW3RoaXMuX2hhc2hLZXkodyxBKV09Zyx0aGlzLnRyaWFuZ2xlc0xlbj0wLHRoaXMuX2FkZFRyaWFuZ2xlKHAseCxnLC0xLC0xLC0xKTtmb3IobGV0IE09MCxFLEQ7TTx0aGlzLl9pZHMubGVuZ3RoO00rKyl7Y29uc3QgTD10aGlzLl9pZHNbTV0sRj10WzIqTF0sTj10WzIqTCsxXTtpZihNPjAmJk1hdGguYWJzKEYtRSk8PU55JiZNYXRoLmFicyhOLUQpPD1OeXx8KEU9RixEPU4sTD09PXB8fEw9PT14fHxMPT09ZykpY29udGludWU7bGV0IE89MDtmb3IobGV0IGZ0PTAsUnQ9dGhpcy5faGFzaEtleShGLE4pO2Z0PHRoaXMuX2hhc2hTaXplJiYoTz1zWyhSdCtmdCkldGhpcy5faGFzaFNpemVdLCEoTyE9PS0xJiZPIT09bltPXSkpO2Z0KyspO089ZVtPXTtsZXQgSD1PLHo7Zm9yKDt6PW5bSF0sQWgoRixOLHRbMipIXSx0WzIqSCsxXSx0WzIqel0sdFsyKnorMV0pPj0wOylpZihIPXosSD09PU8pe0g9LTE7YnJlYWt9aWYoSD09PS0xKWNvbnRpbnVlO2xldCBRPXRoaXMuX2FkZFRyaWFuZ2xlKEgsTCxuW0hdLC0xLC0xLGlbSF0pO2lbTF09dGhpcy5fbGVnYWxpemUoUSsyKSxpW0hdPVEsYisrO2xldCBzdD1uW0hdO2Zvcig7ej1uW3N0XSxBaChGLE4sdFsyKnN0XSx0WzIqc3QrMV0sdFsyKnpdLHRbMip6KzFdKTwwOylRPXRoaXMuX2FkZFRyaWFuZ2xlKHN0LEwseixpW0xdLC0xLGlbc3RdKSxpW0xdPXRoaXMuX2xlZ2FsaXplKFErMiksbltzdF09c3QsYi0tLHN0PXo7aWYoSD09PU8pZm9yKDt6PWVbSF0sQWgoRixOLHRbMip6XSx0WzIqeisxXSx0WzIqSF0sdFsyKkgrMV0pPDA7KVE9dGhpcy5fYWRkVHJpYW5nbGUoeixMLEgsLTEsaVtIXSxpW3pdKSx0aGlzLl9sZWdhbGl6ZShRKzIpLGlbel09USxuW0hdPUgsYi0tLEg9ejt0aGlzLl9odWxsU3RhcnQ9ZVtMXT1ILG5bSF09ZVtzdF09TCxuW0xdPXN0LHNbdGhpcy5faGFzaEtleShGLE4pXT1MLHNbdGhpcy5faGFzaEtleSh0WzIqSF0sdFsyKkgrMV0pXT1IfXRoaXMuaHVsbD1uZXcgVWludDMyQXJyYXkoYik7Zm9yKGxldCBNPTAsRT10aGlzLl9odWxsU3RhcnQ7TTxiO00rKyl0aGlzLmh1bGxbTV09RSxFPW5bRV07dGhpcy50cmlhbmdsZXM9dGhpcy5fdHJpYW5nbGVzLnN1YmFycmF5KDAsdGhpcy50cmlhbmdsZXNMZW4pLHRoaXMuaGFsZmVkZ2VzPXRoaXMuX2hhbGZlZGdlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKX1faGFzaEtleSh0LGUpe3JldHVybiBNYXRoLmZsb29yKG9JKHQtdGhpcy5fY3gsZS10aGlzLl9jeSkqdGhpcy5faGFzaFNpemUpJXRoaXMuX2hhc2hTaXplfV9sZWdhbGl6ZSh0KXtjb25zdHtfdHJpYW5nbGVzOmUsX2hhbGZlZGdlczpuLGNvb3JkczppfT10aGlzO2xldCBzPTAsbz0wO2Zvcig7Oyl7Y29uc3QgYT1uW3RdLGM9dC10JTM7aWYobz1jKyh0KzIpJTMsYT09PS0xKXtpZihzPT09MClicmVhazt0PVRoWy0tc107Y29udGludWV9Y29uc3QgbD1hLWElMyx1PWMrKHQrMSklMyxoPWwrKGErMiklMyxmPWVbb10sZD1lW3RdLHA9ZVt1XSx4PWVbaF07aWYoYUkoaVsyKmZdLGlbMipmKzFdLGlbMipkXSxpWzIqZCsxXSxpWzIqcF0saVsyKnArMV0saVsyKnhdLGlbMip4KzFdKSl7ZVt0XT14LGVbYV09Zjtjb25zdCBtPW5baF07aWYobT09PS0xKXtsZXQgeT10aGlzLl9odWxsU3RhcnQ7ZG97aWYodGhpcy5faHVsbFRyaVt5XT09PWgpe3RoaXMuX2h1bGxUcmlbeV09dDticmVha315PXRoaXMuX2h1bGxQcmV2W3ldfXdoaWxlKHkhPT10aGlzLl9odWxsU3RhcnQpfXRoaXMuX2xpbmsodCxtKSx0aGlzLl9saW5rKGEsbltvXSksdGhpcy5fbGluayhvLGgpO2NvbnN0IHY9bCsoYSsxKSUzO3M8VGgubGVuZ3RoJiYoVGhbcysrXT12KX1lbHNle2lmKHM9PT0wKWJyZWFrO3Q9VGhbLS1zXX19cmV0dXJuIG99X2xpbmsodCxlKXt0aGlzLl9oYWxmZWRnZXNbdF09ZSxlIT09LTEmJih0aGlzLl9oYWxmZWRnZXNbZV09dCl9X2FkZFRyaWFuZ2xlKHQsZSxuLGkscyxvKXtjb25zdCBhPXRoaXMudHJpYW5nbGVzTGVuO3JldHVybiB0aGlzLl90cmlhbmdsZXNbYV09dCx0aGlzLl90cmlhbmdsZXNbYSsxXT1lLHRoaXMuX3RyaWFuZ2xlc1thKzJdPW4sdGhpcy5fbGluayhhLGkpLHRoaXMuX2xpbmsoYSsxLHMpLHRoaXMuX2xpbmsoYSsyLG8pLHRoaXMudHJpYW5nbGVzTGVuKz0zLGF9fWZ1bmN0aW9uIG9JKHIsdCl7Y29uc3QgZT1yLyhNYXRoLmFicyhyKStNYXRoLmFicyh0KSk7cmV0dXJuKHQ+MD8zLWU6MStlKS80fWZ1bmN0aW9uIHpwKHIsdCxlLG4pe2NvbnN0IGk9ci1lLHM9dC1uO3JldHVybiBpKmkrcypzfWZ1bmN0aW9uIGFJKHIsdCxlLG4saSxzLG8sYSl7Y29uc3QgYz1yLW8sbD10LWEsdT1lLW8saD1uLWEsZj1pLW8sZD1zLWEscD1jKmMrbCpsLHg9dSp1K2gqaCxnPWYqZitkKmQ7cmV0dXJuIGMqKGgqZy14KmQpLWwqKHUqZy14KmYpK3AqKHUqZC1oKmYpPDB9ZnVuY3Rpb24gY0kocix0LGUsbixpLHMpe2NvbnN0IG89ZS1yLGE9bi10LGM9aS1yLGw9cy10LHU9bypvK2EqYSxoPWMqYytsKmwsZj0uNS8obypsLWEqYyksZD0obCp1LWEqaCkqZixwPShvKmgtYyp1KSpmO3JldHVybiBkKmQrcCpwfWZ1bmN0aW9uIGxJKHIsdCxlLG4saSxzKXtjb25zdCBvPWUtcixhPW4tdCxjPWktcixsPXMtdCx1PW8qbythKmEsaD1jKmMrbCpsLGY9LjUvKG8qbC1hKmMpLGQ9cisobCp1LWEqaCkqZixwPXQrKG8qaC1jKnUpKmY7cmV0dXJue3g6ZCx5OnB9fWZ1bmN0aW9uIFNvKHIsdCxlLG4pe2lmKG4tZTw9MjApZm9yKGxldCBpPWUrMTtpPD1uO2krKyl7Y29uc3Qgcz1yW2ldLG89dFtzXTtsZXQgYT1pLTE7Zm9yKDthPj1lJiZ0W3JbYV1dPm87KXJbYSsxXT1yW2EtLV07clthKzFdPXN9ZWxzZXtjb25zdCBpPWUrbj4+MTtsZXQgcz1lKzEsbz1uO0thKHIsaSxzKSx0W3JbZV1dPnRbcltuXV0mJkthKHIsZSxuKSx0W3Jbc11dPnRbcltuXV0mJkthKHIscyxuKSx0W3JbZV1dPnRbcltzXV0mJkthKHIsZSxzKTtjb25zdCBhPXJbc10sYz10W2FdO2Zvcig7Oyl7ZG8gcysrO3doaWxlKHRbcltzXV08Yyk7ZG8gby0tO3doaWxlKHRbcltvXV0+Yyk7aWYobzxzKWJyZWFrO0thKHIscyxvKX1yW2UrMV09cltvXSxyW29dPWEsbi1zKzE+PW8tZT8oU28ocix0LHMsbiksU28ocix0LGUsby0xKSk6KFNvKHIsdCxlLG8tMSksU28ocix0LHMsbikpfX1mdW5jdGlvbiBLYShyLHQsZSl7Y29uc3Qgbj1yW3RdO3JbdF09cltlXSxyW2VdPW59ZnVuY3Rpb24gdUkocil7cmV0dXJuIHJbMF19ZnVuY3Rpb24gaEkocil7cmV0dXJuIHJbMV19ZnVuY3Rpb24gZkkocix0KXt2YXIgZT0wLG49MCxpPTAscz0wLG89MCxhPTAsYz0wLGw9MCx1PW51bGwsaD1udWxsLGY9clswXSxkPXJbMV0scD10Lmxlbmd0aDtmb3IoZTtlPHA7ZSsrKXtuPTA7dmFyIHg9dFtlXS5sZW5ndGgtMSxnPXRbZV07aWYodT1nWzBdLHVbMF0hPT1nW3hdWzBdJiZ1WzFdIT09Z1t4XVsxXSl0aHJvdyBuZXcgRXJyb3IoIkZpcnN0IGFuZCBsYXN0IGNvb3JkaW5hdGVzIGluIGEgcmluZyBtdXN0IGJlIHRoZSBzYW1lIik7Zm9yKG89dVswXS1mLGE9dVsxXS1kLG47bjx4O24rKyl7aWYoaD1nW24rMV0sbD1oWzFdLWQsYTwwJiZsPDB8fGE+MCYmbD4wKXt1PWgsYT1sLG89dVswXS1mO2NvbnRpbnVlfWlmKGM9aFswXS1yWzBdLGw+MCYmYTw9MCl7aWYocz1vKmwtYyphLHM+MClpPWkrMTtlbHNlIGlmKHM9PT0wKXJldHVybiAwfWVsc2UgaWYoYT4wJiZsPD0wKXtpZihzPW8qbC1jKmEsczwwKWk9aSsxO2Vsc2UgaWYocz09PTApcmV0dXJuIDB9ZWxzZSBpZihsPT09MCYmYTwwKXtpZihzPW8qbC1jKmEscz09PTApcmV0dXJuIDB9ZWxzZSBpZihhPT09MCYmbDwwKXtpZihzPW8qbC1jKmEscz09PTApcmV0dXJuIDB9ZWxzZSBpZihhPT09MCYmbD09PTApe2lmKGM8PTAmJm8+PTApcmV0dXJuIDA7aWYobzw9MCYmYz49MClyZXR1cm4gMH11PWgsYT1sLG89Y319cmV0dXJuIGklMiE9PTB9ZnVuY3Rpb24gZEkocix0LGU9e30pe2lmKCFyKXRocm93IG5ldyBFcnJvcigicG9pbnQgaXMgcmVxdWlyZWQiKTtpZighdCl0aHJvdyBuZXcgRXJyb3IoInBvbHlnb24gaXMgcmVxdWlyZWQiKTtjb25zdCBuPVoyKHIpLGk9SzIodCkscz1pLnR5cGUsbz10LmJib3g7bGV0IGE9aS5jb29yZGluYXRlcztpZihvJiZwSShuLG8pPT09ITEpcmV0dXJuITE7cz09PSJQb2x5Z29uIiYmKGE9W2FdKTtsZXQgYz0hMTtmb3IodmFyIGw9MDtsPGEubGVuZ3RoOysrbCl7Y29uc3QgdT1mSShuLGFbbF0pO2lmKHU9PT0wKXJldHVybiFlLmlnbm9yZUJvdW5kYXJ5O3UmJihjPSEwKX1yZXR1cm4gY31mdW5jdGlvbiBwSShyLHQpe3JldHVybiB0WzBdPD1yWzBdJiZ0WzFdPD1yWzFdJiZ0WzJdPj1yWzBdJiZ0WzNdPj1yWzFdfXZhciBtST1kSTtjb25zdCBGeT0xZS02O2NsYXNzIGdze2NvbnN0cnVjdG9yKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9bW92ZVRvKHQsZSl7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K2V9YH1jbG9zZVBhdGgoKXt0aGlzLl94MSE9PW51bGwmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9bGluZVRvKHQsZSl7dGhpcy5fKz1gTCR7dGhpcy5feDE9K3R9LCR7dGhpcy5feTE9K2V9YH1hcmModCxlLG4pe3Q9K3QsZT0rZSxuPStuO2NvbnN0IGk9dCtuLHM9ZTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXMiKTt0aGlzLl94MT09PW51bGw/dGhpcy5fKz1gTSR7aX0sJHtzfWA6KE1hdGguYWJzKHRoaXMuX3gxLWkpPkZ5fHxNYXRoLmFicyh0aGlzLl95MS1zKT5GeSkmJih0aGlzLl8rPSJMIitpKyIsIitzKSxuJiYodGhpcy5fKz1gQSR7bn0sJHtufSwwLDEsMSwke3Qtbn0sJHtlfUEke259LCR7bn0sMCwxLDEsJHt0aGlzLl94MT1pfSwke3RoaXMuX3kxPXN9YCl9cmVjdCh0LGUsbixpKXt0aGlzLl8rPWBNJHt0aGlzLl94MD10aGlzLl94MT0rdH0sJHt0aGlzLl95MD10aGlzLl95MT0rZX1oJHsrbn12JHsraX1oJHstbn1aYH12YWx1ZSgpe3JldHVybiB0aGlzLl98fG51bGx9fWNsYXNzIGtwe2NvbnN0cnVjdG9yKCl7dGhpcy5fPVtdfW1vdmVUbyh0LGUpe3RoaXMuXy5wdXNoKFt0LGVdKX1jbG9zZVBhdGgoKXt0aGlzLl8ucHVzaCh0aGlzLl9bMF0uc2xpY2UoKSl9bGluZVRvKHQsZSl7dGhpcy5fLnB1c2goW3QsZV0pfXZhbHVlKCl7cmV0dXJuIHRoaXMuXy5sZW5ndGg/dGhpcy5fOm51bGx9fWNsYXNzIGdJe2NvbnN0cnVjdG9yKHQsW2UsbixpLHNdPVswLDAsOTYwLDUwMF0pe2lmKCEoKGk9K2kpPj0oZT0rZSkpfHwhKChzPStzKT49KG49K24pKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYm91bmRzIik7dGhpcy5kZWxhdW5heT10LHRoaXMuX2NpcmN1bWNlbnRlcnM9bmV3IEZsb2F0NjRBcnJheSh0LnBvaW50cy5sZW5ndGgqMiksdGhpcy52ZWN0b3JzPW5ldyBGbG9hdDY0QXJyYXkodC5wb2ludHMubGVuZ3RoKjIpLHRoaXMueG1heD1pLHRoaXMueG1pbj1lLHRoaXMueW1heD1zLHRoaXMueW1pbj1uLHRoaXMuX2luaXQoKX11cGRhdGUoKXtyZXR1cm4gdGhpcy5kZWxhdW5heS51cGRhdGUoKSx0aGlzLl9pbml0KCksdGhpc31faW5pdCgpe2NvbnN0e2RlbGF1bmF5Ontwb2ludHM6dCxodWxsOmUsdHJpYW5nbGVzOm59LHZlY3RvcnM6aX09dGhpcyxzPXRoaXMuY2lyY3VtY2VudGVycz10aGlzLl9jaXJjdW1jZW50ZXJzLnN1YmFycmF5KDAsbi5sZW5ndGgvMyoyKTtmb3IobGV0IGQ9MCxwPTAseD1uLmxlbmd0aCxnLG07ZDx4O2QrPTMscCs9Mil7Y29uc3Qgdj1uW2RdKjIseT1uW2QrMV0qMixfPW5bZCsyXSoyLFM9dFt2XSx3PXRbdisxXSxBPXRbeV0sVD10W3krMV0sYj10W19dLE09dFtfKzFdLEU9QS1TLEQ9VC13LEw9Yi1TLEY9TS13LE49KEUqRi1EKkwpKjI7aWYoTWF0aC5hYnMoTik8MWUtOSl7bGV0IE89MWU5O2NvbnN0IEg9blswXSoyO08qPU1hdGguc2lnbigodFtIXS1TKSpGLSh0W0grMV0tdykqTCksZz0oUytiKS8yLU8qRixtPSh3K00pLzIrTypMfWVsc2V7Y29uc3QgTz0xL04sSD1FKkUrRCpELHo9TCpMK0YqRjtnPVMrKEYqSC1EKnopKk8sbT13KyhFKnotTCpIKSpPfXNbcF09ZyxzW3ArMV09bX1sZXQgbz1lW2UubGVuZ3RoLTFdLGEsYz1vKjQsbCx1PXRbMipvXSxoLGY9dFsyKm8rMV07aS5maWxsKDApO2ZvcihsZXQgZD0wO2Q8ZS5sZW5ndGg7KytkKW89ZVtkXSxhPWMsbD11LGg9ZixjPW8qNCx1PXRbMipvXSxmPXRbMipvKzFdLGlbYSsyXT1pW2NdPWgtZixpW2ErM109aVtjKzFdPXUtbH1yZW5kZXIodCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IGdzOnZvaWQgMCx7ZGVsYXVuYXk6e2hhbGZlZGdlczpuLGluZWRnZXM6aSxodWxsOnN9LGNpcmN1bWNlbnRlcnM6byx2ZWN0b3JzOmF9PXRoaXM7aWYocy5sZW5ndGg8PTEpcmV0dXJuIG51bGw7Zm9yKGxldCB1PTAsaD1uLmxlbmd0aDt1PGg7Kyt1KXtjb25zdCBmPW5bdV07aWYoZjx1KWNvbnRpbnVlO2NvbnN0IGQ9TWF0aC5mbG9vcih1LzMpKjIscD1NYXRoLmZsb29yKGYvMykqMix4PW9bZF0sZz1vW2QrMV0sbT1vW3BdLHY9b1twKzFdO3RoaXMuX3JlbmRlclNlZ21lbnQoeCxnLG0sdix0KX1sZXQgYyxsPXNbcy5sZW5ndGgtMV07Zm9yKGxldCB1PTA7dTxzLmxlbmd0aDsrK3Upe2M9bCxsPXNbdV07Y29uc3QgaD1NYXRoLmZsb29yKGlbbF0vMykqMixmPW9baF0sZD1vW2grMV0scD1jKjQseD10aGlzLl9wcm9qZWN0KGYsZCxhW3ArMl0sYVtwKzNdKTt4JiZ0aGlzLl9yZW5kZXJTZWdtZW50KGYsZCx4WzBdLHhbMV0sdCl9cmV0dXJuIGUmJmUudmFsdWUoKX1yZW5kZXJCb3VuZHModCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IGdzOnZvaWQgMDtyZXR1cm4gdC5yZWN0KHRoaXMueG1pbix0aGlzLnltaW4sdGhpcy54bWF4LXRoaXMueG1pbix0aGlzLnltYXgtdGhpcy55bWluKSxlJiZlLnZhbHVlKCl9cmVuZGVyQ2VsbCh0LGUpe2NvbnN0IG49ZT09bnVsbD9lPW5ldyBnczp2b2lkIDAsaT10aGlzLl9jbGlwKHQpO2lmKGk9PT1udWxsfHwhaS5sZW5ndGgpcmV0dXJuO2UubW92ZVRvKGlbMF0saVsxXSk7bGV0IHM9aS5sZW5ndGg7Zm9yKDtpWzBdPT09aVtzLTJdJiZpWzFdPT09aVtzLTFdJiZzPjE7KXMtPTI7Zm9yKGxldCBvPTI7bzxzO28rPTIpKGlbb10hPT1pW28tMl18fGlbbysxXSE9PWlbby0xXSkmJmUubGluZVRvKGlbb10saVtvKzFdKTtyZXR1cm4gZS5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9KmNlbGxQb2x5Z29ucygpe2NvbnN0e2RlbGF1bmF5Ontwb2ludHM6dH19PXRoaXM7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aC8yO2U8bjsrK2Upe2NvbnN0IGk9dGhpcy5jZWxsUG9seWdvbihlKTtpJiYoaS5pbmRleD1lLHlpZWxkIGkpfX1jZWxsUG9seWdvbih0KXtjb25zdCBlPW5ldyBrcDtyZXR1cm4gdGhpcy5yZW5kZXJDZWxsKHQsZSksZS52YWx1ZSgpfV9yZW5kZXJTZWdtZW50KHQsZSxuLGkscyl7bGV0IG87Y29uc3QgYT10aGlzLl9yZWdpb25jb2RlKHQsZSksYz10aGlzLl9yZWdpb25jb2RlKG4saSk7YT09PTAmJmM9PT0wPyhzLm1vdmVUbyh0LGUpLHMubGluZVRvKG4saSkpOihvPXRoaXMuX2NsaXBTZWdtZW50KHQsZSxuLGksYSxjKSkmJihzLm1vdmVUbyhvWzBdLG9bMV0pLHMubGluZVRvKG9bMl0sb1szXSkpfWNvbnRhaW5zKHQsZSxuKXtyZXR1cm4gZT0rZSxlIT09ZXx8KG49K24sbiE9PW4pPyExOnRoaXMuZGVsYXVuYXkuX3N0ZXAodCxlLG4pPT09dH0qbmVpZ2hib3JzKHQpe2NvbnN0IGU9dGhpcy5fY2xpcCh0KTtpZihlKWZvcihjb25zdCBuIG9mIHRoaXMuZGVsYXVuYXkubmVpZ2hib3JzKHQpKXtjb25zdCBpPXRoaXMuX2NsaXAobik7aWYoaSl7dDpmb3IobGV0IHM9MCxvPWUubGVuZ3RoO3M8bztzKz0yKWZvcihsZXQgYT0wLGM9aS5sZW5ndGg7YTxjO2ErPTIpaWYoZVtzXT09aVthXSYmZVtzKzFdPT1pW2ErMV0mJmVbKHMrMiklb109PWlbKGErYy0yKSVjXSYmZVsocyszKSVvXT09aVsoYStjLTEpJWNdKXt5aWVsZCBuO2JyZWFrIHR9fX19X2NlbGwodCl7Y29uc3R7Y2lyY3VtY2VudGVyczplLGRlbGF1bmF5OntpbmVkZ2VzOm4saGFsZmVkZ2VzOmksdHJpYW5nbGVzOnN9fT10aGlzLG89blt0XTtpZihvPT09LTEpcmV0dXJuIG51bGw7Y29uc3QgYT1bXTtsZXQgYz1vO2Rve2NvbnN0IGw9TWF0aC5mbG9vcihjLzMpO2lmKGEucHVzaChlW2wqMl0sZVtsKjIrMV0pLGM9YyUzPT09Mj9jLTI6YysxLHNbY10hPT10KWJyZWFrO2M9aVtjXX13aGlsZShjIT09byYmYyE9PS0xKTtyZXR1cm4gYX1fY2xpcCh0KXtpZih0PT09MCYmdGhpcy5kZWxhdW5heS5odWxsLmxlbmd0aD09PTEpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO2NvbnN0IGU9dGhpcy5fY2VsbCh0KTtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtjb25zdHt2ZWN0b3JzOm59PXRoaXMsaT10KjQ7cmV0dXJuIG5baV18fG5baSsxXT90aGlzLl9jbGlwSW5maW5pdGUodCxlLG5baV0sbltpKzFdLG5baSsyXSxuW2krM10pOnRoaXMuX2NsaXBGaW5pdGUodCxlKX1fY2xpcEZpbml0ZSh0LGUpe2NvbnN0IG49ZS5sZW5ndGg7bGV0IGk9bnVsbCxzLG8sYT1lW24tMl0sYz1lW24tMV0sbCx1PXRoaXMuX3JlZ2lvbmNvZGUoYSxjKSxoLGY9MDtmb3IobGV0IGQ9MDtkPG47ZCs9MilpZihzPWEsbz1jLGE9ZVtkXSxjPWVbZCsxXSxsPXUsdT10aGlzLl9yZWdpb25jb2RlKGEsYyksbD09PTAmJnU9PT0wKWg9ZixmPTAsaT9pLnB1c2goYSxjKTppPVthLGNdO2Vsc2V7bGV0IHAseCxnLG0sdjtpZihsPT09MCl7aWYoKHA9dGhpcy5fY2xpcFNlZ21lbnQocyxvLGEsYyxsLHUpKT09PW51bGwpY29udGludWU7W3gsZyxtLHZdPXB9ZWxzZXtpZigocD10aGlzLl9jbGlwU2VnbWVudChhLGMscyxvLHUsbCkpPT09bnVsbCljb250aW51ZTtbbSx2LHgsZ109cCxoPWYsZj10aGlzLl9lZGdlY29kZSh4LGcpLGgmJmYmJnRoaXMuX2VkZ2UodCxoLGYsaSxpLmxlbmd0aCksaT9pLnB1c2goeCxnKTppPVt4LGddfWg9ZixmPXRoaXMuX2VkZ2Vjb2RlKG0sdiksaCYmZiYmdGhpcy5fZWRnZSh0LGgsZixpLGkubGVuZ3RoKSxpP2kucHVzaChtLHYpOmk9W20sdl19aWYoaSloPWYsZj10aGlzLl9lZGdlY29kZShpWzBdLGlbMV0pLGgmJmYmJnRoaXMuX2VkZ2UodCxoLGYsaSxpLmxlbmd0aCk7ZWxzZSBpZih0aGlzLmNvbnRhaW5zKHQsKHRoaXMueG1pbit0aGlzLnhtYXgpLzIsKHRoaXMueW1pbit0aGlzLnltYXgpLzIpKXJldHVyblt0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWluXTtyZXR1cm4gaX1fY2xpcFNlZ21lbnQodCxlLG4saSxzLG8pe2Zvcig7Oyl7aWYocz09PTAmJm89PT0wKXJldHVyblt0LGUsbixpXTtpZihzJm8pcmV0dXJuIG51bGw7bGV0IGEsYyxsPXN8fG87bCY4PyhhPXQrKG4tdCkqKHRoaXMueW1heC1lKS8oaS1lKSxjPXRoaXMueW1heCk6bCY0PyhhPXQrKG4tdCkqKHRoaXMueW1pbi1lKS8oaS1lKSxjPXRoaXMueW1pbik6bCYyPyhjPWUrKGktZSkqKHRoaXMueG1heC10KS8obi10KSxhPXRoaXMueG1heCk6KGM9ZSsoaS1lKSoodGhpcy54bWluLXQpLyhuLXQpLGE9dGhpcy54bWluKSxzPyh0PWEsZT1jLHM9dGhpcy5fcmVnaW9uY29kZSh0LGUpKToobj1hLGk9YyxvPXRoaXMuX3JlZ2lvbmNvZGUobixpKSl9fV9jbGlwSW5maW5pdGUodCxlLG4saSxzLG8pe2xldCBhPUFycmF5LmZyb20oZSksYztpZigoYz10aGlzLl9wcm9qZWN0KGFbMF0sYVsxXSxuLGkpKSYmYS51bnNoaWZ0KGNbMF0sY1sxXSksKGM9dGhpcy5fcHJvamVjdChhW2EubGVuZ3RoLTJdLGFbYS5sZW5ndGgtMV0scyxvKSkmJmEucHVzaChjWzBdLGNbMV0pLGE9dGhpcy5fY2xpcEZpbml0ZSh0LGEpKWZvcihsZXQgbD0wLHU9YS5sZW5ndGgsaCxmPXRoaXMuX2VkZ2Vjb2RlKGFbdS0yXSxhW3UtMV0pO2w8dTtsKz0yKWg9ZixmPXRoaXMuX2VkZ2Vjb2RlKGFbbF0sYVtsKzFdKSxoJiZmJiYobD10aGlzLl9lZGdlKHQsaCxmLGEsbCksdT1hLmxlbmd0aCk7ZWxzZSB0aGlzLmNvbnRhaW5zKHQsKHRoaXMueG1pbit0aGlzLnhtYXgpLzIsKHRoaXMueW1pbit0aGlzLnltYXgpLzIpJiYoYT1bdGhpcy54bWluLHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heF0pO3JldHVybiBhfV9lZGdlKHQsZSxuLGkscyl7Zm9yKDtlIT09bjspe2xldCBvLGE7c3dpdGNoKGUpe2Nhc2UgNTplPTQ7Y29udGludWU7Y2FzZSA0OmU9NixvPXRoaXMueG1heCxhPXRoaXMueW1pbjticmVhaztjYXNlIDY6ZT0yO2NvbnRpbnVlO2Nhc2UgMjplPTEwLG89dGhpcy54bWF4LGE9dGhpcy55bWF4O2JyZWFrO2Nhc2UgMTA6ZT04O2NvbnRpbnVlO2Nhc2UgODplPTksbz10aGlzLnhtaW4sYT10aGlzLnltYXg7YnJlYWs7Y2FzZSA5OmU9MTtjb250aW51ZTtjYXNlIDE6ZT01LG89dGhpcy54bWluLGE9dGhpcy55bWluO2JyZWFrfShpW3NdIT09b3x8aVtzKzFdIT09YSkmJnRoaXMuY29udGFpbnModCxvLGEpJiYoaS5zcGxpY2UocywwLG8sYSkscys9Mil9aWYoaS5sZW5ndGg+NClmb3IobGV0IG89MDtvPGkubGVuZ3RoO28rPTIpe2NvbnN0IGE9KG8rMiklaS5sZW5ndGgsYz0obys0KSVpLmxlbmd0aDsoaVtvXT09PWlbYV0mJmlbYV09PT1pW2NdfHxpW28rMV09PT1pW2ErMV0mJmlbYSsxXT09PWlbYysxXSkmJihpLnNwbGljZShhLDIpLG8tPTIpfXJldHVybiBzfV9wcm9qZWN0KHQsZSxuLGkpe2xldCBzPTEvMCxvLGEsYztpZihpPDApe2lmKGU8PXRoaXMueW1pbilyZXR1cm4gbnVsbDsobz0odGhpcy55bWluLWUpL2kpPHMmJihjPXRoaXMueW1pbixhPXQrKHM9bykqbil9ZWxzZSBpZihpPjApe2lmKGU+PXRoaXMueW1heClyZXR1cm4gbnVsbDsobz0odGhpcy55bWF4LWUpL2kpPHMmJihjPXRoaXMueW1heCxhPXQrKHM9bykqbil9aWYobj4wKXtpZih0Pj10aGlzLnhtYXgpcmV0dXJuIG51bGw7KG89KHRoaXMueG1heC10KS9uKTxzJiYoYT10aGlzLnhtYXgsYz1lKyhzPW8pKmkpfWVsc2UgaWYobjwwKXtpZih0PD10aGlzLnhtaW4pcmV0dXJuIG51bGw7KG89KHRoaXMueG1pbi10KS9uKTxzJiYoYT10aGlzLnhtaW4sYz1lKyhzPW8pKmkpfXJldHVyblthLGNdfV9lZGdlY29kZSh0LGUpe3JldHVybih0PT09dGhpcy54bWluPzE6dD09PXRoaXMueG1heD8yOjApfChlPT09dGhpcy55bWluPzQ6ZT09PXRoaXMueW1heD84OjApfV9yZWdpb25jb2RlKHQsZSl7cmV0dXJuKHQ8dGhpcy54bWluPzE6dD50aGlzLnhtYXg/MjowKXwoZTx0aGlzLnltaW4/NDplPnRoaXMueW1heD84OjApfX1jb25zdCB4ST0yKk1hdGguUEksYm89TWF0aC5wb3c7ZnVuY3Rpb24gX0kocil7cmV0dXJuIHJbMF19ZnVuY3Rpb24geUkocil7cmV0dXJuIHJbMV19ZnVuY3Rpb24gdkkocil7Y29uc3R7dHJpYW5nbGVzOnQsY29vcmRzOmV9PXI7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKz0zKXtjb25zdCBpPTIqdFtuXSxzPTIqdFtuKzFdLG89Mip0W24rMl07aWYoKGVbb10tZVtpXSkqKGVbcysxXS1lW2krMV0pLShlW3NdLWVbaV0pKihlW28rMV0tZVtpKzFdKT4xZS0xMClyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBNSShyLHQsZSl7cmV0dXJuW3IrTWF0aC5zaW4ocit0KSplLHQrTWF0aC5jb3Moci10KSplXX1jbGFzcyBWcHtzdGF0aWMgZnJvbSh0LGU9X0ksbj15SSxpKXtyZXR1cm4gbmV3IFZwKCJsZW5ndGgiaW4gdD9TSSh0LGUsbixpKTpGbG9hdDY0QXJyYXkuZnJvbShiSSh0LGUsbixpKSkpfWNvbnN0cnVjdG9yKHQpe3RoaXMuX2RlbGF1bmF0b3I9bmV3IEphKHQpLHRoaXMuaW5lZGdlcz1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aC8yKSx0aGlzLl9odWxsSW5kZXg9bmV3IEludDMyQXJyYXkodC5sZW5ndGgvMiksdGhpcy5wb2ludHM9dGhpcy5fZGVsYXVuYXRvci5jb29yZHMsdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLl9kZWxhdW5hdG9yLnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3QgdD10aGlzLl9kZWxhdW5hdG9yLGU9dGhpcy5wb2ludHM7aWYodC5odWxsJiZ0Lmh1bGwubGVuZ3RoPjImJnZJKHQpKXt0aGlzLmNvbGxpbmVhcj1JbnQzMkFycmF5LmZyb20oe2xlbmd0aDplLmxlbmd0aC8yfSwoZixkKT0+ZCkuc29ydCgoZixkKT0+ZVsyKmZdLWVbMipkXXx8ZVsyKmYrMV0tZVsyKmQrMV0pO2NvbnN0IGM9dGhpcy5jb2xsaW5lYXJbMF0sbD10aGlzLmNvbGxpbmVhclt0aGlzLmNvbGxpbmVhci5sZW5ndGgtMV0sdT1bZVsyKmNdLGVbMipjKzFdLGVbMipsXSxlWzIqbCsxXV0saD0xZS04Kk1hdGguaHlwb3QodVszXS11WzFdLHVbMl0tdVswXSk7Zm9yKGxldCBmPTAsZD1lLmxlbmd0aC8yO2Y8ZDsrK2Ype2NvbnN0IHA9TUkoZVsyKmZdLGVbMipmKzFdLGgpO2VbMipmXT1wWzBdLGVbMipmKzFdPXBbMV19dGhpcy5fZGVsYXVuYXRvcj1uZXcgSmEoZSl9ZWxzZSBkZWxldGUgdGhpcy5jb2xsaW5lYXI7Y29uc3Qgbj10aGlzLmhhbGZlZGdlcz10aGlzLl9kZWxhdW5hdG9yLmhhbGZlZGdlcyxpPXRoaXMuaHVsbD10aGlzLl9kZWxhdW5hdG9yLmh1bGwscz10aGlzLnRyaWFuZ2xlcz10aGlzLl9kZWxhdW5hdG9yLnRyaWFuZ2xlcyxvPXRoaXMuaW5lZGdlcy5maWxsKC0xKSxhPXRoaXMuX2h1bGxJbmRleC5maWxsKC0xKTtmb3IobGV0IGM9MCxsPW4ubGVuZ3RoO2M8bDsrK2Mpe2NvbnN0IHU9c1tjJTM9PT0yP2MtMjpjKzFdOyhuW2NdPT09LTF8fG9bdV09PT0tMSkmJihvW3VdPWMpfWZvcihsZXQgYz0wLGw9aS5sZW5ndGg7YzxsOysrYylhW2lbY11dPWM7aS5sZW5ndGg8PTImJmkubGVuZ3RoPjAmJih0aGlzLnRyaWFuZ2xlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLmhhbGZlZGdlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLnRyaWFuZ2xlc1swXT1pWzBdLG9baVswXV09MSxpLmxlbmd0aD09PTImJihvW2lbMV1dPTAsdGhpcy50cmlhbmdsZXNbMV09aVsxXSx0aGlzLnRyaWFuZ2xlc1syXT1pWzFdKSl9dm9yb25vaSh0KXtyZXR1cm4gbmV3IGdJKHRoaXMsdCl9Km5laWdoYm9ycyh0KXtjb25zdHtpbmVkZ2VzOmUsaHVsbDpuLF9odWxsSW5kZXg6aSxoYWxmZWRnZXM6cyx0cmlhbmdsZXM6byxjb2xsaW5lYXI6YX09dGhpcztpZihhKXtjb25zdCBoPWEuaW5kZXhPZih0KTtoPjAmJih5aWVsZCBhW2gtMV0pLGg8YS5sZW5ndGgtMSYmKHlpZWxkIGFbaCsxXSk7cmV0dXJufWNvbnN0IGM9ZVt0XTtpZihjPT09LTEpcmV0dXJuO2xldCBsPWMsdT0tMTtkb3tpZih5aWVsZCB1PW9bbF0sbD1sJTM9PT0yP2wtMjpsKzEsb1tsXSE9PXQpcmV0dXJuO2lmKGw9c1tsXSxsPT09LTEpe2NvbnN0IGg9blsoaVt0XSsxKSVuLmxlbmd0aF07aCE9PXUmJih5aWVsZCBoKTtyZXR1cm59fXdoaWxlKGwhPT1jKX1maW5kKHQsZSxuPTApe2lmKHQ9K3QsdCE9PXR8fChlPStlLGUhPT1lKSlyZXR1cm4tMTtjb25zdCBpPW47bGV0IHM7Zm9yKDsocz10aGlzLl9zdGVwKG4sdCxlKSk+PTAmJnMhPT1uJiZzIT09aTspbj1zO3JldHVybiBzfV9zdGVwKHQsZSxuKXtjb25zdHtpbmVkZ2VzOmksaHVsbDpzLF9odWxsSW5kZXg6byxoYWxmZWRnZXM6YSx0cmlhbmdsZXM6Yyxwb2ludHM6bH09dGhpcztpZihpW3RdPT09LTF8fCFsLmxlbmd0aClyZXR1cm4odCsxKSUobC5sZW5ndGg+PjEpO2xldCB1PXQsaD1ibyhlLWxbdCoyXSwyKStibyhuLWxbdCoyKzFdLDIpO2NvbnN0IGY9aVt0XTtsZXQgZD1mO2Rve2xldCBwPWNbZF07Y29uc3QgeD1ibyhlLWxbcCoyXSwyKStibyhuLWxbcCoyKzFdLDIpO2lmKHg8aCYmKGg9eCx1PXApLGQ9ZCUzPT09Mj9kLTI6ZCsxLGNbZF0hPT10KWJyZWFrO2lmKGQ9YVtkXSxkPT09LTEpe2lmKGQ9c1sob1t0XSsxKSVzLmxlbmd0aF0sZCE9PXAmJmJvKGUtbFtkKjJdLDIpK2JvKG4tbFtkKjIrMV0sMik8aClyZXR1cm4gZDticmVha319d2hpbGUoZCE9PWYpO3JldHVybiB1fXJlbmRlcih0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgZ3M6dm9pZCAwLHtwb2ludHM6bixoYWxmZWRnZXM6aSx0cmlhbmdsZXM6c309dGhpcztmb3IobGV0IG89MCxhPWkubGVuZ3RoO288YTsrK28pe2NvbnN0IGM9aVtvXTtpZihjPG8pY29udGludWU7Y29uc3QgbD1zW29dKjIsdT1zW2NdKjI7dC5tb3ZlVG8obltsXSxuW2wrMV0pLHQubGluZVRvKG5bdV0sblt1KzFdKX1yZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLGUmJmUudmFsdWUoKX1yZW5kZXJQb2ludHModCxlKXtlPT09dm9pZCAwJiYoIXR8fHR5cGVvZiB0Lm1vdmVUbyE9ImZ1bmN0aW9uIikmJihlPXQsdD1udWxsKSxlPWU9PW51bGw/MjorZTtjb25zdCBuPXQ9PW51bGw/dD1uZXcgZ3M6dm9pZCAwLHtwb2ludHM6aX09dGhpcztmb3IobGV0IHM9MCxvPWkubGVuZ3RoO3M8bztzKz0yKXtjb25zdCBhPWlbc10sYz1pW3MrMV07dC5tb3ZlVG8oYStlLGMpLHQuYXJjKGEsYyxlLDAseEkpfXJldHVybiBuJiZuLnZhbHVlKCl9cmVuZGVySHVsbCh0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgZ3M6dm9pZCAwLHtodWxsOm4scG9pbnRzOml9PXRoaXMscz1uWzBdKjIsbz1uLmxlbmd0aDt0Lm1vdmVUbyhpW3NdLGlbcysxXSk7Zm9yKGxldCBhPTE7YTxvOysrYSl7Y29uc3QgYz0yKm5bYV07dC5saW5lVG8oaVtjXSxpW2MrMV0pfXJldHVybiB0LmNsb3NlUGF0aCgpLGUmJmUudmFsdWUoKX1odWxsUG9seWdvbigpe2NvbnN0IHQ9bmV3IGtwO3JldHVybiB0aGlzLnJlbmRlckh1bGwodCksdC52YWx1ZSgpfXJlbmRlclRyaWFuZ2xlKHQsZSl7Y29uc3Qgbj1lPT1udWxsP2U9bmV3IGdzOnZvaWQgMCx7cG9pbnRzOmksdHJpYW5nbGVzOnN9PXRoaXMsbz1zW3QqPTNdKjIsYT1zW3QrMV0qMixjPXNbdCsyXSoyO3JldHVybiBlLm1vdmVUbyhpW29dLGlbbysxXSksZS5saW5lVG8oaVthXSxpW2ErMV0pLGUubGluZVRvKGlbY10saVtjKzFdKSxlLmNsb3NlUGF0aCgpLG4mJm4udmFsdWUoKX0qdHJpYW5nbGVQb2x5Z29ucygpe2NvbnN0e3RyaWFuZ2xlczp0fT10aGlzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGgvMztlPG47KytlKXlpZWxkIHRoaXMudHJpYW5nbGVQb2x5Z29uKGUpfXRyaWFuZ2xlUG9seWdvbih0KXtjb25zdCBlPW5ldyBrcDtyZXR1cm4gdGhpcy5yZW5kZXJUcmlhbmdsZSh0LGUpLGUudmFsdWUoKX19ZnVuY3Rpb24gU0kocix0LGUsbil7Y29uc3QgaT1yLmxlbmd0aCxzPW5ldyBGbG9hdDY0QXJyYXkoaSoyKTtmb3IobGV0IG89MDtvPGk7KytvKXtjb25zdCBhPXJbb107c1tvKjJdPXQuY2FsbChuLGEsbyxyKSxzW28qMisxXT1lLmNhbGwobixhLG8scil9cmV0dXJuIHN9ZnVuY3Rpb24qYkkocix0LGUsbil7bGV0IGk9MDtmb3IoY29uc3QgcyBvZiByKXlpZWxkIHQuY2FsbChuLHMsaSxyKSx5aWVsZCBlLmNhbGwobixzLGksciksKytpfWNvbnN0IEdwPU1hdGguUEksQnk9R3AvMixPeT0xODAvR3Asenk9R3AvMTgwLHdJPU1hdGguYXRhbjIsa3k9TWF0aC5jb3MsQUk9TWF0aC5tYXgsVEk9TWF0aC5taW4sVnk9TWF0aC5zaW4sRUk9TWF0aC5zaWdufHxmdW5jdGlvbihyKXtyZXR1cm4gcj4wPzE6cjwwPy0xOjB9LEd5PU1hdGguc3FydDtmdW5jdGlvbiBDSShyKXtyZXR1cm4gcj4xP0J5OnI8LTE/LUJ5Ok1hdGguYXNpbihyKX1mdW5jdGlvbiBIeShyLHQpe3JldHVybiByWzBdKnRbMF0rclsxXSp0WzFdK3JbMl0qdFsyXX1mdW5jdGlvbiBrbihyLHQpe3JldHVybltyWzFdKnRbMl0tclsyXSp0WzFdLHJbMl0qdFswXS1yWzBdKnRbMl0sclswXSp0WzFdLXJbMV0qdFswXV19ZnVuY3Rpb24gRWgocix0KXtyZXR1cm5bclswXSt0WzBdLHJbMV0rdFsxXSxyWzJdK3RbMl1dfWZ1bmN0aW9uIENoKHIpe3ZhciB0PUd5KHJbMF0qclswXStyWzFdKnJbMV0rclsyXSpyWzJdKTtyZXR1cm5bclswXS90LHJbMV0vdCxyWzJdL3RdfWZ1bmN0aW9uIEhwKHIpe3JldHVyblt3SShyWzFdLHJbMF0pKk95LENJKEFJKC0xLFRJKDEsclsyXSkpKSpPeV19ZnVuY3Rpb24gVGkocil7Y29uc3QgdD1yWzBdKnp5LGU9clsxXSp6eSxuPWt5KGUpO3JldHVybltuKmt5KHQpLG4qVnkodCksVnkoZSldfWZ1bmN0aW9uIFdwKHIpe3JldHVybiByPXIubWFwKHQ9PlRpKHQpKSxIeShyWzBdLGtuKHJbMl0sclsxXSkpfWZ1bmN0aW9uIFJJKHIpe2NvbnN0IHQ9UEkociksZT1ESSh0KSxuPUxJKGUsciksaT1OSShlLHIubGVuZ3RoKSxzPUlJKGksciksbz1VSShlLHIpLHtwb2x5Z29uczphLGNlbnRlcnM6Y309RkkobyxlLHIpLGw9QkkoYSksdT16SShlLHIpLGg9T0kobixlKTtyZXR1cm57ZGVsYXVuYXk6dCxlZGdlczpuLHRyaWFuZ2xlczplLGNlbnRlcnM6YyxuZWlnaGJvcnM6aSxwb2x5Z29uczphLG1lc2g6bCxodWxsOnUsdXJxdWhhcnQ6aCxmaW5kOnN9fWZ1bmN0aW9uIElJKHIsdCl7ZnVuY3Rpb24gZShuLGkpe2xldCBzPW5bMF0taVswXSxvPW5bMV0taVsxXSxhPW5bMl0taVsyXTtyZXR1cm4gcypzK28qbythKmF9cmV0dXJuIGZ1bmN0aW9uKGkscyxvKXtvPT09dm9pZCAwJiYobz0wKTtsZXQgYSxjLGw9bztjb25zdCB1PVRpKFtpLHNdKTtkbyBhPW8sbz1udWxsLGM9ZSh1LFRpKHRbYV0pKSxyW2FdLmZvckVhY2goaD0+e2xldCBmPWUodSxUaSh0W2hdKSk7aWYoZjxjKXtjPWYsbz1oLGw9aDtyZXR1cm59fSk7d2hpbGUobyE9PW51bGwpO3JldHVybiBsfX1mdW5jdGlvbiBQSShyKXtpZihyLmxlbmd0aDwyKXJldHVybnt9O2xldCB0PTA7Zm9yKDtpc05hTihyW3RdWzBdK3JbdF1bMV0pJiZ0Kys8ci5sZW5ndGg7KTtjb25zdCBlPWl5KHJbdF0pLG49XzIoKS50cmFuc2xhdGUoWzAsMF0pLnNjYWxlKDEpLnJvdGF0ZShlLmludmVydChbMTgwLDBdKSk7cj1yLm1hcChuKTtjb25zdCBpPVtdO2xldCBzPTE7Zm9yKGxldCBoPTAsZj1yLmxlbmd0aDtoPGY7aCsrKXtsZXQgZD1DbyhyW2hdWzBdLDIpK0NvKHJbaF1bMV0sMik7IWlzRmluaXRlKGQpfHxkPjFlMzI/aS5wdXNoKGgpOmQ+cyYmKHM9ZCl9Y29uc3Qgbz0xZTYqR3kocyk7aS5mb3JFYWNoKGg9PnJbaF09W28sMF0pLHIucHVzaChbMCxvXSksci5wdXNoKFstbywwXSksci5wdXNoKFswLC1vXSk7Y29uc3QgYT1WcC5mcm9tKHIpO2EucHJvamVjdGlvbj1uO2NvbnN0e3RyaWFuZ2xlczpjLGhhbGZlZGdlczpsLGluZWRnZXM6dX09YTtmb3IobGV0IGg9MCxmPWwubGVuZ3RoO2g8ZjtoKyspaWYobFtoXTwwKXtjb25zdCBkPWglMz09Mj9oLTI6aCsxLHA9aCUzPT0wP2grMjpoLTEseD1sW2RdLGc9bFtwXTtsW3hdPWcsbFtnXT14LGxbZF09bFtwXT0tMSxjW2hdPWNbZF09Y1twXT10LHVbY1t4XV09eCUzPT0wP3grMjp4LTEsdVtjW2ddXT1nJTM9PTA/ZysyOmctMSxoKz0yLWglM31lbHNlIGNbaF0+ci5sZW5ndGgtMy0xJiYoY1toXT10KTtyZXR1cm4gYX1mdW5jdGlvbiBMSShyLHQpe2NvbnN0IGU9bmV3IFNldDtyZXR1cm4gdC5sZW5ndGg9PT0yP1tbMCwxXV06KHIuZm9yRWFjaChuPT57aWYoblswXSE9PW5bMV0mJiEoV3Aobi5tYXAoaT0+dFtpXSkpPDApKWZvcihsZXQgaT0wLHM7aTwzO2krKylzPShpKzEpJTMsZS5hZGQocXUoW25baV0sbltzXV0pLmpvaW4oIi0iKSl9KSxBcnJheS5mcm9tKGUsbj0+bi5zcGxpdCgiLSIpLm1hcChOdW1iZXIpKSl9ZnVuY3Rpb24gREkocil7Y29uc3R7dHJpYW5nbGVzOnR9PXI7aWYoIXQpcmV0dXJuW107Y29uc3QgZT1bXTtmb3IobGV0IG49MCxpPXQubGVuZ3RoLzM7bjxpO24rKyl7Y29uc3Qgcz10WzMqbl0sbz10WzMqbisxXSxhPXRbMypuKzJdO3MhPT1vJiZvIT09YSYmZS5wdXNoKFtzLGEsb10pfXJldHVybiBlfWZ1bmN0aW9uIFVJKHIsdCl7cmV0dXJuIHIubWFwKGU9Pntjb25zdCBuPWUubWFwKHM9PnRbc10pLm1hcChUaSksaT1FaChFaChrbihuWzFdLG5bMF0pLGtuKG5bMl0sblsxXSkpLGtuKG5bMF0sblsyXSkpO3JldHVybiBIcChDaChpKSl9KX1mdW5jdGlvbiBOSShyLHQpe2NvbnN0IGU9W107cmV0dXJuIHIuZm9yRWFjaChuPT57Zm9yKGxldCBpPTA7aTwzO2krKyl7Y29uc3Qgcz1uW2ldLG89blsoaSsxKSUzXTtlW3NdPWVbc118fFtdLGVbc10ucHVzaChvKX19KSxyLmxlbmd0aD09PTAmJih0PT09Mj8oZVswXT1bMV0sZVsxXT1bMF0pOnQ9PT0xJiYoZVswXT1bXSkpLGV9ZnVuY3Rpb24gRkkocix0LGUpe2NvbnN0IG49W10saT1yLnNsaWNlKCk7aWYodC5sZW5ndGg9PT0wKXtpZihlLmxlbmd0aDwyKXJldHVybntwb2x5Z29uczpuLGNlbnRlcnM6aX07aWYoZS5sZW5ndGg9PT0yKXtjb25zdCBhPVRpKGVbMF0pLGM9VGkoZVsxXSksbD1DaChFaChhLGMpKSx1PUNoKGtuKGEsYykpLGg9a24obCx1KSxmPVtsLGtuKGwsaCksa24oa24obCxoKSxoKSxrbihrbihrbihsLGgpLGgpLGgpXS5tYXAoSHApLm1hcChvKTtyZXR1cm4gbi5wdXNoKGYpLG4ucHVzaChmLnNsaWNlKCkucmV2ZXJzZSgpKSx7cG9seWdvbnM6bixjZW50ZXJzOml9fX10LmZvckVhY2goKGEsYyk9Pntmb3IobGV0IGw9MDtsPDM7bCsrKXtjb25zdCB1PWFbbF0saD1hWyhsKzEpJTNdLGY9YVsobCsyKSUzXTtuW3VdPW5bdV18fFtdLG5bdV0ucHVzaChbaCxmLGMsW3UsaCxmXV0pfX0pO2NvbnN0IHM9bi5tYXAoYT0+e2NvbnN0IGM9W2FbMF1bMl1dO2xldCBsPWFbMF1bMV07Zm9yKGxldCB1PTE7dTxhLmxlbmd0aDt1KyspZm9yKGxldCBoPTA7aDxhLmxlbmd0aDtoKyspaWYoYVtoXVswXT09bCl7bD1hW2hdWzFdLGMucHVzaChhW2hdWzJdKTticmVha31pZihjLmxlbmd0aD4yKXJldHVybiBjO2lmKGMubGVuZ3RoPT0yKXtjb25zdCB1PVd5KGVbYVswXVszXVswXV0sZVthWzBdWzNdWzFdXSxpW2NbMF1dKSxoPVd5KGVbYVswXVszXVsyXV0sZVthWzBdWzNdWzBdXSxpW2NbMF1dKSxmPW8odSksZD1vKGgpO3JldHVybltjWzBdLGQsY1sxXSxmXX19KTtmdW5jdGlvbiBvKGEpe2xldCBjPS0xO3JldHVybiBpLnNsaWNlKHQubGVuZ3RoLDEvMCkuZm9yRWFjaCgobCx1KT0+e2xbMF09PT1hWzBdJiZsWzFdPT09YVsxXSYmKGM9dSt0Lmxlbmd0aCl9KSxjPDAmJihjPWkubGVuZ3RoLGkucHVzaChhKSksY31yZXR1cm57cG9seWdvbnM6cyxjZW50ZXJzOml9fWZ1bmN0aW9uIFd5KHIsdCxlKXtyPVRpKHIpLHQ9VGkodCksZT1UaShlKTtjb25zdCBuPUVJKEh5KGtuKHQsciksZSkpO3JldHVybiBIcChDaChFaChyLHQpKS5tYXAoaT0+bippKSl9ZnVuY3Rpb24gQkkocil7Y29uc3QgdD1bXTtyZXR1cm4gci5mb3JFYWNoKGU9PntpZighZSlyZXR1cm47bGV0IG49ZVtlLmxlbmd0aC0xXTtmb3IobGV0IGkgb2YgZSlpPm4mJnQucHVzaChbbixpXSksbj1pfSksdH1mdW5jdGlvbiBPSShyLHQpe3JldHVybiBmdW5jdGlvbihlKXtjb25zdCBuPW5ldyBNYXAsaT1uZXcgTWFwO3JldHVybiByLmZvckVhY2goKHMsbyk9Pntjb25zdCBhPXMuam9pbigiLSIpO24uc2V0KGEsZVtvXSksaS5zZXQoYSwhMCl9KSx0LmZvckVhY2gocz0+e2xldCBvPTAsYT0tMTtmb3IobGV0IGM9MDtjPDM7YysrKXtsZXQgbD1xdShbc1tjXSxzWyhjKzEpJTNdXSkuam9pbigiLSIpO24uZ2V0KGwpPm8mJihvPW4uZ2V0KGwpLGE9bCl9aS5zZXQoYSwhMSl9KSxyLm1hcChzPT5pLmdldChzLmpvaW4oIi0iKSkpfX1mdW5jdGlvbiB6SShyLHQpe2NvbnN0IGU9bmV3IFNldCxuPVtdO3IubWFwKGE9PntpZighKFdwKGEubWFwKGM9PnRbYz50Lmxlbmd0aD8wOmNdKSk+MWUtMTIpKWZvcihsZXQgYz0wO2M8MztjKyspe2xldCBsPVthW2NdLGFbKGMrMSklM11dLHU9YCR7bFswXX0tJHtsWzFdfWA7ZS5oYXModSk/ZS5kZWxldGUodSk6ZS5hZGQoYCR7bFsxXX0tJHtsWzBdfWApfX0pO2NvbnN0IGk9bmV3IE1hcDtsZXQgcztpZihlLmZvckVhY2goYT0+e2E9YS5zcGxpdCgiLSIpLm1hcChOdW1iZXIpLGkuc2V0KGFbMF0sYVsxXSkscz1hWzBdfSkscz09PXZvaWQgMClyZXR1cm4gbjtsZXQgbz1zO2Rve24ucHVzaChvKTtsZXQgYT1pLmdldChvKTtpLnNldChvLC0xKSxvPWF9d2hpbGUobz4tMSYmbyE9PXMpO3JldHVybiBufWZ1bmN0aW9uIGtJKHIpe2NvbnN0IHQ9ZnVuY3Rpb24oZSl7aWYodC5kZWxhdW5heT1udWxsLHQuX2RhdGE9ZSx0eXBlb2YgdC5fZGF0YT09Im9iamVjdCImJnQuX2RhdGEudHlwZT09PSJGZWF0dXJlQ29sbGVjdGlvbiImJih0Ll9kYXRhPXQuX2RhdGEuZmVhdHVyZXMpLHR5cGVvZiB0Ll9kYXRhPT0ib2JqZWN0Iil7Y29uc3Qgbj10Ll9kYXRhLm1hcChpPT5bdC5fdngoaSksdC5fdnkoaSksaV0pLmZpbHRlcihpPT5pc0Zpbml0ZShpWzBdK2lbMV0pKTt0LnBvaW50cz1uLm1hcChpPT5baVswXSxpWzFdXSksdC52YWxpZD1uLm1hcChpPT5pWzJdKSx0LmRlbGF1bmF5PVJJKHQucG9pbnRzKX1yZXR1cm4gdH07cmV0dXJuIHQuX3Z4PWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlPT0ib2JqZWN0IiYmInR5cGUiaW4gZSlyZXR1cm4gal8oZSlbMF07aWYoMCBpbiBlKXJldHVybiBlWzBdfSx0Ll92eT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09Im9iamVjdCImJiJ0eXBlImluIGUpcmV0dXJuIGpfKGUpWzFdO2lmKDEgaW4gZSlyZXR1cm4gZVsxXX0sdC54PWZ1bmN0aW9uKGUpe3JldHVybiBlPyh0Ll92eD1lLHQpOnQuX3Z4fSx0Lnk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/KHQuX3Z5PWUsdCk6dC5fdnl9LHQucG9seWdvbnM9ZnVuY3Rpb24oZSl7aWYoZSE9PXZvaWQgMCYmdChlKSwhdC5kZWxhdW5heSlyZXR1cm4hMTtjb25zdCBuPXt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6W119O3JldHVybiB0LnZhbGlkLmxlbmd0aD09PTB8fCh0LmRlbGF1bmF5LnBvbHlnb25zLmZvckVhY2goKGkscyk9Pm4uZmVhdHVyZXMucHVzaCh7dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6aT97dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1suLi5pLGlbMF1dLm1hcChvPT50LmRlbGF1bmF5LmNlbnRlcnNbb10pXX06bnVsbCxwcm9wZXJ0aWVzOntzaXRlOnQudmFsaWRbc10sc2l0ZWNvb3JkaW5hdGVzOnQucG9pbnRzW3NdLG5laWdoYm91cnM6dC5kZWxhdW5heS5uZWlnaGJvcnNbc119fSkpLHQudmFsaWQubGVuZ3RoPT09MSYmbi5mZWF0dXJlcy5wdXNoKHt0eXBlOiJGZWF0dXJlIixnZW9tZXRyeTp7dHlwZToiU3BoZXJlIn0scHJvcGVydGllczp7c2l0ZTp0LnZhbGlkWzBdLHNpdGVjb29yZGluYXRlczp0LnBvaW50c1swXSxuZWlnaGJvdXJzOltdfX0pKSxufSx0LnRyaWFuZ2xlcz1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXZvaWQgMCYmdChlKSx0LmRlbGF1bmF5P3t0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6dC5kZWxhdW5heS50cmlhbmdsZXMubWFwKChuLGkpPT4obj1uLm1hcChzPT50LnBvaW50c1tzXSksbi5jZW50ZXI9dC5kZWxhdW5heS5jZW50ZXJzW2ldLG4pKS5maWx0ZXIobj0+V3Aobik+MCkubWFwKG49Pih7dHlwZToiRmVhdHVyZSIscHJvcGVydGllczp7Y2lyY3VtY2VudGVyOm4uY2VudGVyfSxnZW9tZXRyeTp7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1suLi5uLG5bMF1dXX19KSl9OiExfSx0LmxpbmtzPWZ1bmN0aW9uKGUpe2lmKGUhPT12b2lkIDAmJnQoZSksIXQuZGVsYXVuYXkpcmV0dXJuITE7Y29uc3Qgbj10LmRlbGF1bmF5LmVkZ2VzLm1hcChzPT5fbyh0LnBvaW50c1tzWzBdXSx0LnBvaW50c1tzWzFdXSkpLGk9dC5kZWxhdW5heS51cnF1aGFydChuKTtyZXR1cm57dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOnQuZGVsYXVuYXkuZWRnZXMubWFwKChzLG8pPT4oe3R5cGU6IkZlYXR1cmUiLHByb3BlcnRpZXM6e3NvdXJjZTp0LnZhbGlkW3NbMF1dLHRhcmdldDp0LnZhbGlkW3NbMV1dLGxlbmd0aDpuW29dLHVycXVoYXJ0OiEhaVtvXX0sZ2VvbWV0cnk6e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOlt0LnBvaW50c1tzWzBdXSx0LnBvaW50c1tzWzFdXV19fSkpfX0sdC5tZXNoPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dm9pZCAwJiZ0KGUpLHQuZGVsYXVuYXk/e3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dC5kZWxhdW5heS5lZGdlcy5tYXAobj0+W3QucG9pbnRzW25bMF1dLHQucG9pbnRzW25bMV1dXSl9OiExfSx0LmNlbGxNZXNoPWZ1bmN0aW9uKGUpe2lmKGUhPT12b2lkIDAmJnQoZSksIXQuZGVsYXVuYXkpcmV0dXJuITE7Y29uc3R7Y2VudGVyczpuLHBvbHlnb25zOml9PXQuZGVsYXVuYXkscz1bXTtmb3IoY29uc3QgbyBvZiBpKWlmKG8pZm9yKGxldCBhPW8ubGVuZ3RoLGM9b1thLTFdLGw9b1swXSx1PTA7dTxhO2M9bCxsPW9bKyt1XSlsPmMmJnMucHVzaChbbltjXSxuW2xdXSk7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6c319LHQuX2ZvdW5kPXZvaWQgMCx0LmZpbmQ9ZnVuY3Rpb24oZSxuLGkpe2lmKHQuX2ZvdW5kPXQuZGVsYXVuYXkuZmluZChlLG4sdC5fZm91bmQpLCFpfHxfbyhbZSxuXSx0LnBvaW50c1t0Ll9mb3VuZF0pPGkpcmV0dXJuIHQuX2ZvdW5kfSx0Lmh1bGw9ZnVuY3Rpb24oZSl7ZSE9PXZvaWQgMCYmdChlKTtjb25zdCBuPXQuZGVsYXVuYXkuaHVsbCxpPXQucG9pbnRzO3JldHVybiBuLmxlbmd0aD09PTA/bnVsbDp7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1suLi5uLm1hcChzPT5pW3NdKSxpW25bMF1dXV19fSxyP3Qocik6dH1mdW5jdGlvbiBWSShyLHQpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOnRoaXMucmFuZ2Uocik7YnJlYWs7ZGVmYXVsdDp0aGlzLnJhbmdlKHQpLmRvbWFpbihyKTticmVha31yZXR1cm4gdGhpc31mdW5jdGlvbiBYcChyLHQsZSl7ci5wcm90b3R5cGU9dC5wcm90b3R5cGU9ZSxlLmNvbnN0cnVjdG9yPXJ9ZnVuY3Rpb24gWHkocix0KXt2YXIgZT1PYmplY3QuY3JlYXRlKHIucHJvdG90eXBlKTtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gamEoKXt9dmFyIFFhPS43LFJoPTEvUWEsd289IlxccyooWystXT9cXGQrKVxccyoiLHRjPSJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixFaT0iXFxzKihbKy1dPyg/OlxcZCpcXC4pP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLEdJPS9eIyhbMC05YS1mXXszLDh9KSQvLEhJPW5ldyBSZWdFeHAoYF5yZ2JcXCgke3dvfSwke3dvfSwke3dvfVxcKSRgKSxXST1uZXcgUmVnRXhwKGBecmdiXFwoJHtFaX0sJHtFaX0sJHtFaX1cXCkkYCksWEk9bmV3IFJlZ0V4cChgXnJnYmFcXCgke3dvfSwke3dvfSwke3dvfSwke3RjfVxcKSRgKSwkST1uZXcgUmVnRXhwKGBecmdiYVxcKCR7RWl9LCR7RWl9LCR7RWl9LCR7dGN9XFwpJGApLHFJPW5ldyBSZWdFeHAoYF5oc2xcXCgke3RjfSwke0VpfSwke0VpfVxcKSRgKSxZST1uZXcgUmVnRXhwKGBeaHNsYVxcKCR7dGN9LCR7RWl9LCR7RWl9LCR7dGN9XFwpJGApLCR5PXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O1hwKGphLGVjLHtjb3B5KHIpe3JldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLHRoaXMscil9LGRpc3BsYXlhYmxlKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4OnF5LGZvcm1hdEhleDpxeSxmb3JtYXRIZXg4OlpJLGZvcm1hdEhzbDpKSSxmb3JtYXRSZ2I6WXksdG9TdHJpbmc6WXl9KTtmdW5jdGlvbiBxeSgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIFpJKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpfWZ1bmN0aW9uIEpJKCl7cmV0dXJuIFF5KHRoaXMpLmZvcm1hdEhzbCgpfWZ1bmN0aW9uIFl5KCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gZWMocil7dmFyIHQsZTtyZXR1cm4gcj0ocisiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKHQ9R0kuZXhlYyhyKSk/KGU9dFsxXS5sZW5ndGgsdD1wYXJzZUludCh0WzFdLDE2KSxlPT09Nj9aeSh0KTplPT09Mz9uZXcgRW4odD4+OCYxNXx0Pj40JjI0MCx0Pj40JjE1fHQmMjQwLCh0JjE1KTw8NHx0JjE1LDEpOmU9PT04P0loKHQ+PjI0JjI1NSx0Pj4xNiYyNTUsdD4+OCYyNTUsKHQmMjU1KS8yNTUpOmU9PT00P0loKHQ+PjEyJjE1fHQ+PjgmMjQwLHQ+PjgmMTV8dD4+NCYyNDAsdD4+NCYxNXx0JjI0MCwoKHQmMTUpPDw0fHQmMTUpLzI1NSk6bnVsbCk6KHQ9SEkuZXhlYyhyKSk/bmV3IEVuKHRbMV0sdFsyXSx0WzNdLDEpOih0PVdJLmV4ZWMocikpP25ldyBFbih0WzFdKjI1NS8xMDAsdFsyXSoyNTUvMTAwLHRbM10qMjU1LzEwMCwxKToodD1YSS5leGVjKHIpKT9JaCh0WzFdLHRbMl0sdFszXSx0WzRdKToodD0kSS5leGVjKHIpKT9JaCh0WzFdKjI1NS8xMDAsdFsyXSoyNTUvMTAwLHRbM10qMjU1LzEwMCx0WzRdKToodD1xSS5leGVjKHIpKT9qeSh0WzFdLHRbMl0vMTAwLHRbM10vMTAwLDEpOih0PVlJLmV4ZWMocikpP2p5KHRbMV0sdFsyXS8xMDAsdFszXS8xMDAsdFs0XSk6JHkuaGFzT3duUHJvcGVydHkocik/WnkoJHlbcl0pOnI9PT0idHJhbnNwYXJlbnQiP25ldyBFbihOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIFp5KHIpe3JldHVybiBuZXcgRW4ocj4+MTYmMjU1LHI+PjgmMjU1LHImMjU1LDEpfWZ1bmN0aW9uIEloKHIsdCxlLG4pe3JldHVybiBuPD0wJiYocj10PWU9TmFOKSxuZXcgRW4ocix0LGUsbil9ZnVuY3Rpb24gS0kocil7cmV0dXJuIHIgaW5zdGFuY2VvZiBqYXx8KHI9ZWMocikpLHI/KHI9ci5yZ2IoKSxuZXcgRW4oci5yLHIuZyxyLmIsci5vcGFjaXR5KSk6bmV3IEVufWZ1bmN0aW9uICRwKHIsdCxlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MT9LSShyKTpuZXcgRW4ocix0LGUsbj09bnVsbD8xOm4pfWZ1bmN0aW9uIEVuKHIsdCxlLG4pe3RoaXMucj0rcix0aGlzLmc9K3QsdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rbn1YcChFbiwkcCxYeShqYSx7YnJpZ2h0ZXIocil7cmV0dXJuIHI9cj09bnVsbD9SaDpNYXRoLnBvdyhSaCxyKSxuZXcgRW4odGhpcy5yKnIsdGhpcy5nKnIsdGhpcy5iKnIsdGhpcy5vcGFjaXR5KX0sZGFya2VyKHIpe3JldHVybiByPXI9PW51bGw/UWE6TWF0aC5wb3coUWEsciksbmV3IEVuKHRoaXMucipyLHRoaXMuZypyLHRoaXMuYipyLHRoaXMub3BhY2l0eSl9LHJnYigpe3JldHVybiB0aGlzfSxjbGFtcCgpe3JldHVybiBuZXcgRW4oeHModGhpcy5yKSx4cyh0aGlzLmcpLHhzKHRoaXMuYiksUGgodGhpcy5vcGFjaXR5KSl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuLS41PD10aGlzLnImJnRoaXMucjwyNTUuNSYmLS41PD10aGlzLmcmJnRoaXMuZzwyNTUuNSYmLS41PD10aGlzLmImJnRoaXMuYjwyNTUuNSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDpKeSxmb3JtYXRIZXg6SnksZm9ybWF0SGV4ODpqSSxmb3JtYXRSZ2I6S3ksdG9TdHJpbmc6S3l9KSk7ZnVuY3Rpb24gSnkoKXtyZXR1cm5gIyR7X3ModGhpcy5yKX0ke19zKHRoaXMuZyl9JHtfcyh0aGlzLmIpfWB9ZnVuY3Rpb24gakkoKXtyZXR1cm5gIyR7X3ModGhpcy5yKX0ke19zKHRoaXMuZyl9JHtfcyh0aGlzLmIpfSR7X3MoKGlzTmFOKHRoaXMub3BhY2l0eSk/MTp0aGlzLm9wYWNpdHkpKjI1NSl9YH1mdW5jdGlvbiBLeSgpe2NvbnN0IHI9UGgodGhpcy5vcGFjaXR5KTtyZXR1cm5gJHtyPT09MT8icmdiKCI6InJnYmEoIn0ke3hzKHRoaXMucil9LCAke3hzKHRoaXMuZyl9LCAke3hzKHRoaXMuYil9JHtyPT09MT8iKSI6YCwgJHtyfSlgfWB9ZnVuY3Rpb24gUGgocil7cmV0dXJuIGlzTmFOKHIpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLHIpKX1mdW5jdGlvbiB4cyhyKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZChyKXx8MCkpfWZ1bmN0aW9uIF9zKHIpe3JldHVybiByPXhzKHIpLChyPDE2PyIwIjoiIikrci50b1N0cmluZygxNil9ZnVuY3Rpb24gankocix0LGUsbil7cmV0dXJuIG48PTA/cj10PWU9TmFOOmU8PTB8fGU+PTE/cj10PU5hTjp0PD0wJiYocj1OYU4pLG5ldyBkaShyLHQsZSxuKX1mdW5jdGlvbiBReShyKXtpZihyIGluc3RhbmNlb2YgZGkpcmV0dXJuIG5ldyBkaShyLmgsci5zLHIubCxyLm9wYWNpdHkpO2lmKHIgaW5zdGFuY2VvZiBqYXx8KHI9ZWMocikpLCFyKXJldHVybiBuZXcgZGk7aWYociBpbnN0YW5jZW9mIGRpKXJldHVybiByO3I9ci5yZ2IoKTt2YXIgdD1yLnIvMjU1LGU9ci5nLzI1NSxuPXIuYi8yNTUsaT1NYXRoLm1pbih0LGUsbikscz1NYXRoLm1heCh0LGUsbiksbz1OYU4sYT1zLWksYz0ocytpKS8yO3JldHVybiBhPyh0PT09cz9vPShlLW4pL2ErKGU8bikqNjplPT09cz9vPShuLXQpL2ErMjpvPSh0LWUpL2ErNCxhLz1jPC41P3MraToyLXMtaSxvKj02MCk6YT1jPjAmJmM8MT8wOm8sbmV3IGRpKG8sYSxjLHIub3BhY2l0eSl9ZnVuY3Rpb24gUUkocix0LGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0xP1F5KHIpOm5ldyBkaShyLHQsZSxuPT1udWxsPzE6bil9ZnVuY3Rpb24gZGkocix0LGUsbil7dGhpcy5oPStyLHRoaXMucz0rdCx0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStufVhwKGRpLFFJLFh5KGphLHticmlnaHRlcihyKXtyZXR1cm4gcj1yPT1udWxsP1JoOk1hdGgucG93KFJoLHIpLG5ldyBkaSh0aGlzLmgsdGhpcy5zLHRoaXMubCpyLHRoaXMub3BhY2l0eSl9LGRhcmtlcihyKXtyZXR1cm4gcj1yPT1udWxsP1FhOk1hdGgucG93KFFhLHIpLG5ldyBkaSh0aGlzLmgsdGhpcy5zLHRoaXMubCpyLHRoaXMub3BhY2l0eSl9LHJnYigpe3ZhciByPXRoaXMuaCUzNjArKHRoaXMuaDwwKSozNjAsdD1pc05hTihyKXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxuPWUrKGU8LjU/ZToxLWUpKnQsaT0yKmUtbjtyZXR1cm4gbmV3IEVuKHFwKHI+PTI0MD9yLTI0MDpyKzEyMCxpLG4pLHFwKHIsaSxuKSxxcChyPDEyMD9yKzI0MDpyLTEyMCxpLG4pLHRoaXMub3BhY2l0eSl9LGNsYW1wKCl7cmV0dXJuIG5ldyBkaSh0dih0aGlzLmgpLExoKHRoaXMucyksTGgodGhpcy5sKSxQaCh0aGlzLm9wYWNpdHkpKX0sZGlzcGxheWFibGUoKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGZvcm1hdEhzbCgpe2NvbnN0IHI9UGgodGhpcy5vcGFjaXR5KTtyZXR1cm5gJHtyPT09MT8iaHNsKCI6ImhzbGEoIn0ke3R2KHRoaXMuaCl9LCAke0xoKHRoaXMucykqMTAwfSUsICR7TGgodGhpcy5sKSoxMDB9JSR7cj09PTE/IikiOmAsICR7cn0pYH1gfX0pKTtmdW5jdGlvbiB0dihyKXtyZXR1cm4gcj0ocnx8MCklMzYwLHI8MD9yKzM2MDpyfWZ1bmN0aW9uIExoKHIpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDEscnx8MCkpfWZ1bmN0aW9uIHFwKHIsdCxlKXtyZXR1cm4ocjw2MD90KyhlLXQpKnIvNjA6cjwxODA/ZTpyPDI0MD90KyhlLXQpKigyNDAtcikvNjA6dCkqMjU1fXZhciBZcD1yPT4oKT0+cjtmdW5jdGlvbiB0UChyLHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gcitlKnR9fWZ1bmN0aW9uIGVQKHIsdCxlKXtyZXR1cm4gcj1NYXRoLnBvdyhyLGUpLHQ9TWF0aC5wb3codCxlKS1yLGU9MS9lLGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnBvdyhyK24qdCxlKX19ZnVuY3Rpb24gblAocil7cmV0dXJuKHI9K3IpPT0xP2V2OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdD9lUCh0LGUscik6WXAoaXNOYU4odCk/ZTp0KX19ZnVuY3Rpb24gZXYocix0KXt2YXIgZT10LXI7cmV0dXJuIGU/dFAocixlKTpZcChpc05hTihyKT90OnIpfXZhciBudj1mdW5jdGlvbiByKHQpe3ZhciBlPW5QKHQpO2Z1bmN0aW9uIG4oaSxzKXt2YXIgbz1lKChpPSRwKGkpKS5yLChzPSRwKHMpKS5yKSxhPWUoaS5nLHMuZyksYz1lKGkuYixzLmIpLGw9ZXYoaS5vcGFjaXR5LHMub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHUpe3JldHVybiBpLnI9byh1KSxpLmc9YSh1KSxpLmI9Yyh1KSxpLm9wYWNpdHk9bCh1KSxpKyIifX1yZXR1cm4gbi5nYW1tYT1yLG59KDEpO2Z1bmN0aW9uIGlQKHIsdCl7dHx8KHQ9W10pO3ZhciBlPXI/TWF0aC5taW4odC5sZW5ndGgsci5sZW5ndGgpOjAsbj10LnNsaWNlKCksaTtyZXR1cm4gZnVuY3Rpb24ocyl7Zm9yKGk9MDtpPGU7KytpKW5baV09cltpXSooMS1zKSt0W2ldKnM7cmV0dXJuIG59fWZ1bmN0aW9uIHJQKHIpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcocikmJiEociBpbnN0YW5jZW9mIERhdGFWaWV3KX1mdW5jdGlvbiBzUChyLHQpe3ZhciBlPXQ/dC5sZW5ndGg6MCxuPXI/TWF0aC5taW4oZSxyLmxlbmd0aCk6MCxpPW5ldyBBcnJheShuKSxzPW5ldyBBcnJheShlKSxvO2ZvcihvPTA7bzxuOysrbylpW29dPUtwKHJbb10sdFtvXSk7Zm9yKDtvPGU7KytvKXNbb109dFtvXTtyZXR1cm4gZnVuY3Rpb24oYSl7Zm9yKG89MDtvPG47KytvKXNbb109aVtvXShhKTtyZXR1cm4gc319ZnVuY3Rpb24gb1Aocix0KXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gcj0rcix0PSt0LGZ1bmN0aW9uKG4pe3JldHVybiBlLnNldFRpbWUociooMS1uKSt0Km4pLGV9fWZ1bmN0aW9uIERoKHIsdCl7cmV0dXJuIHI9K3IsdD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gciooMS1lKSt0KmV9fWZ1bmN0aW9uIGFQKHIsdCl7dmFyIGU9e30sbj17fSxpOyhyPT09bnVsbHx8dHlwZW9mIHIhPSJvYmplY3QiKSYmKHI9e30pLCh0PT09bnVsbHx8dHlwZW9mIHQhPSJvYmplY3QiKSYmKHQ9e30pO2ZvcihpIGluIHQpaSBpbiByP2VbaV09S3AocltpXSx0W2ldKTpuW2ldPXRbaV07cmV0dXJuIGZ1bmN0aW9uKHMpe2ZvcihpIGluIGUpbltpXT1lW2ldKHMpO3JldHVybiBufX12YXIgWnA9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLEpwPW5ldyBSZWdFeHAoWnAuc291cmNlLCJnIik7ZnVuY3Rpb24gY1Aocil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHJ9fWZ1bmN0aW9uIGxQKHIpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gcih0KSsiIn19ZnVuY3Rpb24gdVAocix0KXt2YXIgZT1acC5sYXN0SW5kZXg9SnAubGFzdEluZGV4PTAsbixpLHMsbz0tMSxhPVtdLGM9W107Zm9yKHI9cisiIix0PXQrIiI7KG49WnAuZXhlYyhyKSkmJihpPUpwLmV4ZWModCkpOykocz1pLmluZGV4KT5lJiYocz10LnNsaWNlKGUscyksYVtvXT9hW29dKz1zOmFbKytvXT1zKSwobj1uWzBdKT09PShpPWlbMF0pP2Fbb10/YVtvXSs9aTphWysrb109aTooYVsrK29dPW51bGwsYy5wdXNoKHtpOm8seDpEaChuLGkpfSkpLGU9SnAubGFzdEluZGV4O3JldHVybiBlPHQubGVuZ3RoJiYocz10LnNsaWNlKGUpLGFbb10/YVtvXSs9czphWysrb109cyksYS5sZW5ndGg8Mj9jWzBdP2xQKGNbMF0ueCk6Y1AodCk6KHQ9Yy5sZW5ndGgsZnVuY3Rpb24obCl7Zm9yKHZhciB1PTAsaDt1PHQ7Kyt1KWFbKGg9Y1t1XSkuaV09aC54KGwpO3JldHVybiBhLmpvaW4oIiIpfSl9ZnVuY3Rpb24gS3Aocix0KXt2YXIgZT10eXBlb2YgdCxuO3JldHVybiB0PT1udWxsfHxlPT09ImJvb2xlYW4iP1lwKHQpOihlPT09Im51bWJlciI/RGg6ZT09PSJzdHJpbmciPyhuPWVjKHQpKT8odD1uLG52KTp1UDp0IGluc3RhbmNlb2YgZWM/bnY6dCBpbnN0YW5jZW9mIERhdGU/b1A6clAodCk/aVA6QXJyYXkuaXNBcnJheSh0KT9zUDp0eXBlb2YgdC52YWx1ZU9mIT0iZnVuY3Rpb24iJiZ0eXBlb2YgdC50b1N0cmluZyE9ImZ1bmN0aW9uInx8aXNOYU4odCk/YVA6RGgpKHIsdCl9ZnVuY3Rpb24gaFAocix0KXtyZXR1cm4gcj0rcix0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKHIqKDEtZSkrdCplKX19ZnVuY3Rpb24gZlAocil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHJ9fWZ1bmN0aW9uIGRQKHIpe3JldHVybityfXZhciBpdj1bMCwxXTtmdW5jdGlvbiBBbyhyKXtyZXR1cm4gcn1mdW5jdGlvbiBqcChyLHQpe3JldHVybih0LT1yPStyKT9mdW5jdGlvbihlKXtyZXR1cm4oZS1yKS90fTpmUChpc05hTih0KT9OYU46LjUpfWZ1bmN0aW9uIHBQKHIsdCl7dmFyIGU7cmV0dXJuIHI+dCYmKGU9cixyPXQsdD1lKSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5tYXgocixNYXRoLm1pbih0LG4pKX19ZnVuY3Rpb24gbVAocix0LGUpe3ZhciBuPXJbMF0saT1yWzFdLHM9dFswXSxvPXRbMV07cmV0dXJuIGk8bj8obj1qcChpLG4pLHM9ZShvLHMpKToobj1qcChuLGkpLHM9ZShzLG8pKSxmdW5jdGlvbihhKXtyZXR1cm4gcyhuKGEpKX19ZnVuY3Rpb24gZ1Aocix0LGUpe3ZhciBuPU1hdGgubWluKHIubGVuZ3RoLHQubGVuZ3RoKS0xLGk9bmV3IEFycmF5KG4pLHM9bmV3IEFycmF5KG4pLG89LTE7Zm9yKHJbbl08clswXSYmKHI9ci5zbGljZSgpLnJldmVyc2UoKSx0PXQuc2xpY2UoKS5yZXZlcnNlKCkpOysrbzxuOylpW29dPWpwKHJbb10scltvKzFdKSxzW29dPWUodFtvXSx0W28rMV0pO3JldHVybiBmdW5jdGlvbihhKXt2YXIgYz1tUihyLGEsMSxuKS0xO3JldHVybiBzW2NdKGlbY10oYSkpfX1mdW5jdGlvbiB4UChyLHQpe3JldHVybiB0LmRvbWFpbihyLmRvbWFpbigpKS5yYW5nZShyLnJhbmdlKCkpLmludGVycG9sYXRlKHIuaW50ZXJwb2xhdGUoKSkuY2xhbXAoci5jbGFtcCgpKS51bmtub3duKHIudW5rbm93bigpKX1mdW5jdGlvbiBfUCgpe3ZhciByPWl2LHQ9aXYsZT1LcCxuLGkscyxvPUFvLGEsYyxsO2Z1bmN0aW9uIHUoKXt2YXIgZj1NYXRoLm1pbihyLmxlbmd0aCx0Lmxlbmd0aCk7cmV0dXJuIG8hPT1BbyYmKG89cFAoclswXSxyW2YtMV0pKSxhPWY+Mj9nUDptUCxjPWw9bnVsbCxofWZ1bmN0aW9uIGgoZil7cmV0dXJuIGY9PW51bGx8fGlzTmFOKGY9K2YpP3M6KGN8fChjPWEoci5tYXAobiksdCxlKSkpKG4obyhmKSkpfXJldHVybiBoLmludmVydD1mdW5jdGlvbihmKXtyZXR1cm4gbyhpKChsfHwobD1hKHQsci5tYXAobiksRGgpKSkoZikpKX0saC5kb21haW49ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9QXJyYXkuZnJvbShmLGRQKSx1KCkpOnIuc2xpY2UoKX0saC5yYW5nZT1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1BcnJheS5mcm9tKGYpLHUoKSk6dC5zbGljZSgpfSxoLnJhbmdlUm91bmQ9ZnVuY3Rpb24oZil7cmV0dXJuIHQ9QXJyYXkuZnJvbShmKSxlPWhQLHUoKX0saC5jbGFtcD1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1mPyEwOkFvLHUoKSk6byE9PUFvfSxoLmludGVycG9sYXRlPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWYsdSgpKTplfSxoLnVua25vd249ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ZixoKTpzfSxmdW5jdGlvbihmLGQpe3JldHVybiBuPWYsaT1kLHUoKX19ZnVuY3Rpb24geVAoKXtyZXR1cm4gX1AoKShBbyxBbyl9ZnVuY3Rpb24gdlAocil7cmV0dXJuIE1hdGguYWJzKHI9TWF0aC5yb3VuZChyKSk+PTFlMjE/ci50b0xvY2FsZVN0cmluZygiZW4iKS5yZXBsYWNlKC8sL2csIiIpOnIudG9TdHJpbmcoMTApfWZ1bmN0aW9uIFVoKHIsdCl7aWYoKGU9KHI9dD9yLnRvRXhwb25lbnRpYWwodC0xKTpyLnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLG49ci5zbGljZSgwLGUpO3JldHVybltuLmxlbmd0aD4xP25bMF0rbi5zbGljZSgyKTpuLCtyLnNsaWNlKGUrMSldfWZ1bmN0aW9uIFRvKHIpe3JldHVybiByPVVoKE1hdGguYWJzKHIpKSxyP3JbMV06TmFOfWZ1bmN0aW9uIE1QKHIsdCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7Zm9yKHZhciBpPWUubGVuZ3RoLHM9W10sbz0wLGE9clswXSxjPTA7aT4wJiZhPjAmJihjK2ErMT5uJiYoYT1NYXRoLm1heCgxLG4tYykpLHMucHVzaChlLnN1YnN0cmluZyhpLT1hLGkrYSkpLCEoKGMrPWErMSk+bikpOylhPXJbbz0obysxKSVyLmxlbmd0aF07cmV0dXJuIHMucmV2ZXJzZSgpLmpvaW4odCl9fWZ1bmN0aW9uIFNQKHIpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKGUpe3JldHVybiByWytlXX0pfX12YXIgYlA9L14oPzooLik/KFs8Pj1eXSkpPyhbK1wtKCBdKT8oWyQjXSk/KDApPyhcZCspPygsKT8oXC5cZCspPyh+KT8oW2EteiVdKT8kL2k7ZnVuY3Rpb24gTmgocil7aWYoISh0PWJQLmV4ZWMocikpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrcik7dmFyIHQ7cmV0dXJuIG5ldyBRcCh7ZmlsbDp0WzFdLGFsaWduOnRbMl0sc2lnbjp0WzNdLHN5bWJvbDp0WzRdLHplcm86dFs1XSx3aWR0aDp0WzZdLGNvbW1hOnRbN10scHJlY2lzaW9uOnRbOF0mJnRbOF0uc2xpY2UoMSksdHJpbTp0WzldLHR5cGU6dFsxMF19KX1OaC5wcm90b3R5cGU9UXAucHJvdG90eXBlO2Z1bmN0aW9uIFFwKHIpe3RoaXMuZmlsbD1yLmZpbGw9PT12b2lkIDA/IiAiOnIuZmlsbCsiIix0aGlzLmFsaWduPXIuYWxpZ249PT12b2lkIDA/Ij4iOnIuYWxpZ24rIiIsdGhpcy5zaWduPXIuc2lnbj09PXZvaWQgMD8iLSI6ci5zaWduKyIiLHRoaXMuc3ltYm9sPXIuc3ltYm9sPT09dm9pZCAwPyIiOnIuc3ltYm9sKyIiLHRoaXMuemVybz0hIXIuemVybyx0aGlzLndpZHRoPXIud2lkdGg9PT12b2lkIDA/dm9pZCAwOityLndpZHRoLHRoaXMuY29tbWE9ISFyLmNvbW1hLHRoaXMucHJlY2lzaW9uPXIucHJlY2lzaW9uPT09dm9pZCAwP3ZvaWQgMDorci5wcmVjaXNpb24sdGhpcy50cmltPSEhci50cmltLHRoaXMudHlwZT1yLnR5cGU9PT12b2lkIDA/IiI6ci50eXBlKyIifVFwLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyh0aGlzLndpZHRoPT09dm9pZCAwPyIiOk1hdGgubWF4KDEsdGhpcy53aWR0aHwwKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsodGhpcy5wcmVjaXNpb249PT12b2lkIDA/IiI6Ii4iK01hdGgubWF4KDAsdGhpcy5wcmVjaXNpb258MCkpKyh0aGlzLnRyaW0/In4iOiIiKSt0aGlzLnR5cGV9O2Z1bmN0aW9uIHdQKHIpe3Q6Zm9yKHZhciB0PXIubGVuZ3RoLGU9MSxuPS0xLGk7ZTx0OysrZSlzd2l0Y2gocltlXSl7Y2FzZSIuIjpuPWk9ZTticmVhaztjYXNlIjAiOm49PT0wJiYobj1lKSxpPWU7YnJlYWs7ZGVmYXVsdDppZighK3JbZV0pYnJlYWsgdDtuPjAmJihuPTApO2JyZWFrfXJldHVybiBuPjA/ci5zbGljZSgwLG4pK3Iuc2xpY2UoaSsxKTpyfXZhciBydjtmdW5jdGlvbiBBUChyLHQpe3ZhciBlPVVoKHIsdCk7aWYoIWUpcmV0dXJuIHIrIiI7dmFyIG49ZVswXSxpPWVbMV0scz1pLShydj1NYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoaS8zKSkpKjMpKzEsbz1uLmxlbmd0aDtyZXR1cm4gcz09PW8/bjpzPm8/bituZXcgQXJyYXkocy1vKzEpLmpvaW4oIjAiKTpzPjA/bi5zbGljZSgwLHMpKyIuIituLnNsaWNlKHMpOiIwLiIrbmV3IEFycmF5KDEtcykuam9pbigiMCIpK1VoKHIsTWF0aC5tYXgoMCx0K3MtMSkpWzBdfWZ1bmN0aW9uIHN2KHIsdCl7dmFyIGU9VWgocix0KTtpZighZSlyZXR1cm4gcisiIjt2YXIgbj1lWzBdLGk9ZVsxXTtyZXR1cm4gaTwwPyIwLiIrbmV3IEFycmF5KC1pKS5qb2luKCIwIikrbjpuLmxlbmd0aD5pKzE/bi5zbGljZSgwLGkrMSkrIi4iK24uc2xpY2UoaSsxKTpuK25ldyBBcnJheShpLW4ubGVuZ3RoKzIpLmpvaW4oIjAiKX12YXIgb3Y9eyIlIjoocix0KT0+KHIqMTAwKS50b0ZpeGVkKHQpLGI6cj0+TWF0aC5yb3VuZChyKS50b1N0cmluZygyKSxjOnI9PnIrIiIsZDp2UCxlOihyLHQpPT5yLnRvRXhwb25lbnRpYWwodCksZjoocix0KT0+ci50b0ZpeGVkKHQpLGc6KHIsdCk9PnIudG9QcmVjaXNpb24odCksbzpyPT5NYXRoLnJvdW5kKHIpLnRvU3RyaW5nKDgpLHA6KHIsdCk9PnN2KHIqMTAwLHQpLHI6c3YsczpBUCxYOnI9Pk1hdGgucm91bmQocikudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkseDpyPT5NYXRoLnJvdW5kKHIpLnRvU3RyaW5nKDE2KX07ZnVuY3Rpb24gYXYocil7cmV0dXJuIHJ9dmFyIGN2PUFycmF5LnByb3RvdHlwZS5tYXAsbHY9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdO2Z1bmN0aW9uIFRQKHIpe3ZhciB0PXIuZ3JvdXBpbmc9PT12b2lkIDB8fHIudGhvdXNhbmRzPT09dm9pZCAwP2F2Ok1QKGN2LmNhbGwoci5ncm91cGluZyxOdW1iZXIpLHIudGhvdXNhbmRzKyIiKSxlPXIuY3VycmVuY3k9PT12b2lkIDA/IiI6ci5jdXJyZW5jeVswXSsiIixuPXIuY3VycmVuY3k9PT12b2lkIDA/IiI6ci5jdXJyZW5jeVsxXSsiIixpPXIuZGVjaW1hbD09PXZvaWQgMD8iLiI6ci5kZWNpbWFsKyIiLHM9ci5udW1lcmFscz09PXZvaWQgMD9hdjpTUChjdi5jYWxsKHIubnVtZXJhbHMsU3RyaW5nKSksbz1yLnBlcmNlbnQ9PT12b2lkIDA/IiUiOnIucGVyY2VudCsiIixhPXIubWludXM9PT12b2lkIDA/IuKIkiI6ci5taW51cysiIixjPXIubmFuPT09dm9pZCAwPyJOYU4iOnIubmFuKyIiO2Z1bmN0aW9uIGwoaCl7aD1OaChoKTt2YXIgZj1oLmZpbGwsZD1oLmFsaWduLHA9aC5zaWduLHg9aC5zeW1ib2wsZz1oLnplcm8sbT1oLndpZHRoLHY9aC5jb21tYSx5PWgucHJlY2lzaW9uLF89aC50cmltLFM9aC50eXBlO1M9PT0ibiI/KHY9ITAsUz0iZyIpOm92W1NdfHwoeT09PXZvaWQgMCYmKHk9MTIpLF89ITAsUz0iZyIpLChnfHxmPT09IjAiJiZkPT09Ij0iKSYmKGc9ITAsZj0iMCIsZD0iPSIpO3ZhciB3PXg9PT0iJCI/ZTp4PT09IiMiJiYvW2JveFhdLy50ZXN0KFMpPyIwIitTLnRvTG93ZXJDYXNlKCk6IiIsQT14PT09IiQiP246L1slcF0vLnRlc3QoUyk/bzoiIixUPW92W1NdLGI9L1tkZWZncHJzJV0vLnRlc3QoUyk7eT15PT09dm9pZCAwPzY6L1tncHJzXS8udGVzdChTKT9NYXRoLm1heCgxLE1hdGgubWluKDIxLHkpKTpNYXRoLm1heCgwLE1hdGgubWluKDIwLHkpKTtmdW5jdGlvbiBNKEUpe3ZhciBEPXcsTD1BLEYsTixPO2lmKFM9PT0iYyIpTD1UKEUpK0wsRT0iIjtlbHNle0U9K0U7dmFyIEg9RTwwfHwxL0U8MDtpZihFPWlzTmFOKEUpP2M6VChNYXRoLmFicyhFKSx5KSxfJiYoRT13UChFKSksSCYmK0U9PTAmJnAhPT0iKyImJihIPSExKSxEPShIP3A9PT0iKCI/cDphOnA9PT0iLSJ8fHA9PT0iKCI/IiI6cCkrRCxMPShTPT09InMiP2x2WzgrcnYvM106IiIpK0wrKEgmJnA9PT0iKCI/IikiOiIiKSxiKXtmb3IoRj0tMSxOPUUubGVuZ3RoOysrRjxOOylpZihPPUUuY2hhckNvZGVBdChGKSw0OD5PfHxPPjU3KXtMPShPPT09NDY/aStFLnNsaWNlKEYrMSk6RS5zbGljZShGKSkrTCxFPUUuc2xpY2UoMCxGKTticmVha319fXYmJiFnJiYoRT10KEUsMS8wKSk7dmFyIHo9RC5sZW5ndGgrRS5sZW5ndGgrTC5sZW5ndGgsUT16PG0/bmV3IEFycmF5KG0teisxKS5qb2luKGYpOiIiO3N3aXRjaCh2JiZnJiYoRT10KFErRSxRLmxlbmd0aD9tLUwubGVuZ3RoOjEvMCksUT0iIiksZCl7Y2FzZSI8IjpFPUQrRStMK1E7YnJlYWs7Y2FzZSI9IjpFPUQrUStFK0w7YnJlYWs7Y2FzZSJeIjpFPVEuc2xpY2UoMCx6PVEubGVuZ3RoPj4xKStEK0UrTCtRLnNsaWNlKHopO2JyZWFrO2RlZmF1bHQ6RT1RK0QrRStMO2JyZWFrfXJldHVybiBzKEUpfXJldHVybiBNLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIGgrIiJ9LE19ZnVuY3Rpb24gdShoLGYpe3ZhciBkPWwoKGg9TmgoaCksaC50eXBlPSJmIixoKSkscD1NYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoVG8oZikvMykpKSozLHg9TWF0aC5wb3coMTAsLXApLGc9bHZbOCtwLzNdO3JldHVybiBmdW5jdGlvbihtKXtyZXR1cm4gZCh4Km0pK2d9fXJldHVybntmb3JtYXQ6bCxmb3JtYXRQcmVmaXg6dX19dmFyIEZoLHV2LGh2O0VQKHt0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pO2Z1bmN0aW9uIEVQKHIpe3JldHVybiBGaD1UUChyKSx1dj1GaC5mb3JtYXQsaHY9RmguZm9ybWF0UHJlZml4LEZofWZ1bmN0aW9uIENQKHIpe3JldHVybiBNYXRoLm1heCgwLC1UbyhNYXRoLmFicyhyKSkpfWZ1bmN0aW9uIFJQKHIsdCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKFRvKHQpLzMpKSkqMy1UbyhNYXRoLmFicyhyKSkpfWZ1bmN0aW9uIElQKHIsdCl7cmV0dXJuIHI9TWF0aC5hYnMociksdD1NYXRoLmFicyh0KS1yLE1hdGgubWF4KDAsVG8odCktVG8ocikpKzF9ZnVuY3Rpb24gUFAocix0LGUsbil7dmFyIGk9dlIocix0LGUpLHM7c3dpdGNoKG49Tmgobj09bnVsbD8iLGYiOm4pLG4udHlwZSl7Y2FzZSJzIjp7dmFyIG89TWF0aC5tYXgoTWF0aC5hYnMociksTWF0aC5hYnModCkpO3JldHVybiBuLnByZWNpc2lvbj09bnVsbCYmIWlzTmFOKHM9UlAoaSxvKSkmJihuLnByZWNpc2lvbj1zKSxodihuLG8pfWNhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOntuLnByZWNpc2lvbj09bnVsbCYmIWlzTmFOKHM9SVAoaSxNYXRoLm1heChNYXRoLmFicyhyKSxNYXRoLmFicyh0KSkpKSYmKG4ucHJlY2lzaW9uPXMtKG4udHlwZT09PSJlIikpO2JyZWFrfWNhc2UiZiI6Y2FzZSIlIjp7bi5wcmVjaXNpb249PW51bGwmJiFpc05hTihzPUNQKGkpKSYmKG4ucHJlY2lzaW9uPXMtKG4udHlwZT09PSIlIikqMik7YnJlYWt9fXJldHVybiB1dihuKX1mdW5jdGlvbiBMUChyKXt2YXIgdD1yLmRvbWFpbjtyZXR1cm4gci50aWNrcz1mdW5jdGlvbihlKXt2YXIgbj10KCk7cmV0dXJuIHlSKG5bMF0sbltuLmxlbmd0aC0xXSxlPT1udWxsPzEwOmUpfSxyLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSxuKXt2YXIgaT10KCk7cmV0dXJuIFBQKGlbMF0saVtpLmxlbmd0aC0xXSxlPT1udWxsPzEwOmUsbil9LHIubmljZT1mdW5jdGlvbihlKXtlPT1udWxsJiYoZT0xMCk7dmFyIG49dCgpLGk9MCxzPW4ubGVuZ3RoLTEsbz1uW2ldLGE9bltzXSxjLGwsdT0xMDtmb3IoYTxvJiYobD1vLG89YSxhPWwsbD1pLGk9cyxzPWwpO3UtLSA+MDspe2lmKGw9bHAobyxhLGUpLGw9PT1jKXJldHVybiBuW2ldPW8sbltzXT1hLHQobik7aWYobD4wKW89TWF0aC5mbG9vcihvL2wpKmwsYT1NYXRoLmNlaWwoYS9sKSpsO2Vsc2UgaWYobDwwKW89TWF0aC5jZWlsKG8qbCkvbCxhPU1hdGguZmxvb3IoYSpsKS9sO2Vsc2UgYnJlYWs7Yz1sfXJldHVybiByfSxyfWZ1bmN0aW9uIHRtKCl7dmFyIHI9eVAoKTtyZXR1cm4gci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHhQKHIsdG0oKSl9LFZJLmFwcGx5KHIsYXJndW1lbnRzKSxMUChyKX1mdW5jdGlvbiBEUChyLHQpe3JldHVybiByLm1hcChlPT57Y29uc3Qgbj1bXTtsZXQgaTtyZXR1cm4gZS5mb3JFYWNoKHM9PntpZihpKXtjb25zdCBvPV9vKHMsaSkqMTgwL01hdGguUEk7aWYobz50KXtjb25zdCBhPW4yKGkscyksYz0xL01hdGguY2VpbChvL3QpO2xldCBsPWM7Zm9yKDtsPDE7KW4ucHVzaChhKGwpKSxsKz1jfX1uLnB1c2goaT1zKX0pLG59KX1mdW5jdGlvbiBVUChyLHttaW5Mbmc6dCxtYXhMbmc6ZSxtaW5MYXQ6bixtYXhMYXQ6aX09e30pe2NvbnN0IHM9TWF0aC5yb3VuZChDbygzNjAvciwyKS9NYXRoLlBJKSxvPSgxK01hdGguc3FydCg1KSkvMixhPWQ9PmQvbyozNjAlMzYwLTE4MCxjPWQ9Pk1hdGguYWNvcygyKmQvcy0xKS9NYXRoLlBJKjE4MC05MCxsPWQ9PnMqKE1hdGguY29zKChkKzkwKSpNYXRoLlBJLzE4MCkrMSkvMix1PVtpIT09dm9pZCAwP01hdGguY2VpbChsKGkpKTowLG4hPT12b2lkIDA/TWF0aC5mbG9vcihsKG4pKTpzLTFdLGg9dD09PXZvaWQgMCYmZT09PXZvaWQgMD8oKT0+ITA6dD09PXZvaWQgMD9kPT5kPD1lOmU9PT12b2lkIDA/ZD0+ZD49dDplPj10P2Q9PmQ+PXQmJmQ8PWU6ZD0+ZD49dHx8ZDw9ZSxmPVtdO2ZvcihsZXQgZD11WzBdO2Q8PXVbMV07ZCsrKXtjb25zdCBwPWEoZCk7aChwKSYmZi5wdXNoKFtwLGMoZCldKX1yZXR1cm4gZn1mdW5jdGlvbiBlbShyLHQsZT0hMSl7cmV0dXJuIGU/ZTIodCxyKTptSShyLHQpfWZ1bmN0aW9uIE5QKHIsdCl7Y29uc3QgZT17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6cn0sW1tuLGldLFtzLG9dXT0kXyhlKTtpZihNYXRoLm1pbihNYXRoLmFicyhzLW4pLE1hdGguYWJzKG8taSkpPHQpcmV0dXJuW107Y29uc3QgYT1uPnN8fG8+PTg5fHxpPD0tODk7cmV0dXJuIFVQKHQse21pbkxuZzpuLG1heExuZzpzLG1pbkxhdDppLG1heExhdDpvfSkuZmlsdGVyKGM9PmVtKGMsZSxhKSl9ZnVuY3Rpb24gRlAocix7cmVzb2x1dGlvbjp0PTEvMCxiYm94OmUscHJvamVjdGlvbjpufT17fSl7Y29uc3QgaT1EUChyLHQpLHM9T2EoaSksbz1OUChyLHQpLGE9Wy4uLnMsLi4ub10sYz17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6cn0sW1tsLHVdLFtoLGZdXT0kXyhjKSxkPWw+aHx8Zj49ODl8fHU8PS04OTtsZXQgcD1bXTtpZihkKXtjb25zdCBTPWtJKGEpLnRyaWFuZ2xlcygpLHc9bmV3IE1hcChhLm1hcCgoW0EsVF0sYik9PltgJHtBfS0ke1R9YCxiXSkpO1MuZmVhdHVyZXMuZm9yRWFjaChBPT57Y29uc3QgVD1BLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLnNsaWNlKDAsMykucmV2ZXJzZSgpLGI9W107aWYoVC5mb3JFYWNoKChbTSxFXSk9Pntjb25zdCBEPWAke019LSR7RX1gO3cuaGFzKEQpJiZiLnB1c2gody5nZXQoRCkpfSksYi5sZW5ndGg9PT0zKXtpZihiLnNvbWUoTT0+TTxzLmxlbmd0aCkpe2NvbnN0IE09QS5wcm9wZXJ0aWVzLmNpcmN1bWNlbnRlcjtpZighZW0oTSxjLGQpKXJldHVybn1wLnB1c2goLi4uYil9fSl9ZWxzZSBpZihvLmxlbmd0aCl7Y29uc3QgUz1KYS5mcm9tKGEpO2ZvcihsZXQgdz0wLEE9Uy50cmlhbmdsZXMubGVuZ3RoO3c8QTt3Kz0zKXtjb25zdCBUPVsyLDEsMF0ubWFwKE09PlMudHJpYW5nbGVzW3crTV0pLGI9VC5tYXAoTT0+YVtNXSk7aWYoVC5zb21lKE09Pk08cy5sZW5ndGgpKXtjb25zdCBNPVswLDFdLm1hcChFPT5NUihiLEQ9PkRbRV0pKTtpZighZW0oTSxjLGQpKWNvbnRpbnVlfXAucHVzaCguLi5UKX19ZWxzZXtjb25zdHt2ZXJ0aWNlczpTLGhvbGVzOnc9W119PVB5KGkpO3A9TDIoUyx3LDIpfWxldCB4PWU/W2VbMF0sZVsyXV06cXUoYSxTPT5TWzBdKSxnPWU/W2VbMV0sZVszXV06cXUoYSxTPT5TWzFdKTtpZihuKXtjb25zdFtTLHddPW4oW3hbMF0sZ1swXV0pLFtBLFRdPW4oW3hbMV0sZ1sxXV0pO3g9W1MsQV0sZz1bLXcsLVRdfWNvbnN0IG09dG0oeCxbMCwxXSksdj10bShnLFswLDFdKSx5PWEubWFwKChbUyx3XSk9PntpZihuKXtjb25zdFtBLFRdPW4oW1Msd10pO3JldHVyblttKEEpLHYoLVQpXX1lbHNlIHJldHVyblttKFMpLHYodyldfSk7cmV0dXJue2NvbnRvdXI6aSx0cmlhbmdsZXM6e3BvaW50czphLGluZGljZXM6cCx1dnM6eX19fWNvbnN0IGZ2PW5ldyBOdCgpLnNldEF0dHJpYnV0ZT8ic2V0QXR0cmlidXRlIjoiYWRkQXR0cmlidXRlIjtmdW5jdGlvbiBCaChyLHQsZSxuKXtjb25zdCBpPXIubWFwKHM9PnMubWFwKChbbyxhXSk9PntpZihuKXtjb25zdFtjLGxdPW4oW28sYV0pO3JldHVybltjLC1sLHRdfXJldHVybiBlP2hSKG8sYSx0KTpbbyxhLHRdfSkpO3JldHVybiBQeShpKX1mdW5jdGlvbiBCUChyLHQsZSxuLGkpe2NvbnN0e3ZlcnRpY2VzOnMsaG9sZXM6b309Qmgocix0LG4saSkse3ZlcnRpY2VzOmF9PUJoKHIsZSxuLGkpLGM9T2EoW2Esc10pLGw9TWF0aC5yb3VuZChhLmxlbmd0aC8zKSx1PW5ldyBTZXQobyk7bGV0IGg9MDtjb25zdCBmPVtdO2ZvcihsZXQgcD0wO3A8bDtwKyspe2xldCB4PXArMTtpZih4PT09bCl4PWg7ZWxzZSBpZih1Lmhhcyh4KSl7Y29uc3QgZz14O3g9aCxoPWd9Zi5wdXNoKHAscCtsLHgrbCksZi5wdXNoKHgrbCx4LHApfWNvbnN0IGQ9W107Zm9yKGxldCBwPTE7cD49MDtwLS0pZm9yKGxldCB4PTA7eDxsO3grPTEpZC5wdXNoKHgvKGwtMSkscCk7cmV0dXJue2luZGljZXM6Zix2ZXJ0aWNlczpjLHV2czpkLHRvcFZlcnRzOmF9fWZ1bmN0aW9uIGR2KHIsdCxlLG4saSxzKXtyZXR1cm57aW5kaWNlczpuP3IuaW5kaWNlczpyLmluZGljZXMuc2xpY2UoKS5yZXZlcnNlKCksdmVydGljZXM6QmgoW3IucG9pbnRzXSx0LGkscykudmVydGljZXMsdXZzOmV9fWNvbnN0IHB2PSh7cG9seWdvbkdlb0pzb246cixzdGFydEhlaWdodDp0LGVuZEhlaWdodDplLGN1cnZhdHVyZVJlc29sdXRpb246bj0xLGNhcnRlc2lhbjppPSEwLGhhc1NpZGU6cz0hMCxoYXNCb3R0b206bz0hMSxoYXNUb3A6YT0hMSxwcm9qZWN0aW9uOmMsYmJveDpsfSk9PntyLmZvckVhY2gobT0+e1EyKG0pfHxtLnJldmVyc2UoKX0pO2NvbnN0e2NvbnRvdXI6dSx0cmlhbmdsZXM6aH09RlAocix7cmVzb2x1dGlvbjpuLGJib3g6bCxwcm9qZWN0aW9uOmN9KTtsZXQgZj17fSxkO3MmJihmPUJQKHUsdCE9bnVsbD90OmUsZSE9bnVsbD9lOnQsaSxjKSxkPWYudG9wVmVydHMpO2xldCBwPVtdOyhvfHxhKSYmKHA9T2EoaC51dnMpKTtsZXQgeD17fTtvJiYoeD1kdihoLHQscCwhMSxpLGMpKTtsZXQgZz17fTtyZXR1cm4gYSYmKGc9ZHYoaCxlLHAsITAsaSxjKSkse2NvbnRvdXI6dSx0cmlhbmdsZXM6aCxzaWRlVG9yc286Zixib3R0b21DYXA6eCx0b3BDYXA6Zyx0b3BWZXJ0czpkfX07Y2xhc3MgT1AgZXh0ZW5kcyBOdHtjb25zdHJ1Y3Rvcih0LGU9e30pe3N1cGVyKCksdGhpcy50eXBlPSJQb2x5Z29uQnVmZmVyR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz1XZSh7cG9seWdvbkdlb0pzb246dCxzdGFydEhlaWdodDowLGVuZEhlaWdodDoxLGhhc1RvcDohMCx0b3BGaXJzdDohMSxoYXNCb3R0b206ITAsaGFzU2lkZTohMCxjdXJ2YXR1cmVSZXNvbHV0aW9uOjEsY2FydGVzaWFuOiEwLHVzZXJEYXRhUnNvT2Zmc2V0OjB9LGUpO2NvbnN0e2VuZEhlaWdodDpuLGhhc1RvcDppLHRvcEZpcnN0OnMsaGFzQm90dG9tOm8saGFzU2lkZTphLGNhcnRlc2lhbjpjLHVzZXJEYXRhUnNvT2Zmc2V0OmwscHJvamVjdGlvbjp1fT10aGlzLnBhcmFtZXRlcnMse2NvbnRvdXI6aCxzaWRlVG9yc286Zix0b3BWZXJ0czpkLGJvdHRvbUNhcDpwLHRvcENhcDp4fT1wdihXZSh7fSx0aGlzLnBhcmFtZXRlcnMpKTtsZXQgZz1bXSxtPVtdLHY9W10seT0wO2NvbnN0IF89Uz0+e2NvbnN0IHc9TWF0aC5yb3VuZChnLmxlbmd0aC8zKSxBPXYubGVuZ3RoO2c9Zy5jb25jYXQoUy52ZXJ0aWNlcyksbT1tLmNvbmNhdChTLnV2cyksdj12LmNvbmNhdCh3P1MuaW5kaWNlcy5tYXAoVD0+VCt3KTpTLmluZGljZXMpLHRoaXMuYWRkR3JvdXAoQSx2Lmxlbmd0aC1BLHkrKyl9O2kmJnMmJl8oeCksYSYmKF8oZiksdGhpcy51c2VyRGF0YS50b3BWZXJ0cz1sP0JoKGgsbitsLGMsdSkudmVydGljZXM6ZCksbyYmXyhwKSxpJiYhcyYmXyh4KSx0aGlzLnNldEluZGV4KHYpLHRoaXNbZnZdKCJwb3NpdGlvbiIsbmV3IHZ0KGcsMykpLHRoaXNbZnZdKCJ1diIsbmV3IHZ0KG0sMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX19dmFyIHpQPXI9Pntjb25zdCBhPXIse2Nvb3JkaW5hdGU6dCxzdGFydEhlaWdodDplLGhlaWdodDpufT1hLGk9QXYoYSxbImNvb3JkaW5hdGUiLCJzdGFydEhlaWdodCIsImhlaWdodCJdKTtsZXQgcz1lfHwwO3JldHVybiB0eXBlb2YgZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuIT0idW5kZWZpbmVkIiYmKHM9ZStuKSxuZXcgT1AoW3RdLGdpKFdlKHt9LGkpLHtzdGFydEhlaWdodDplLGVuZEhlaWdodDpzfSkpfTtjb25zdCBrUD0oe2Nvb3JkaW5hdGVzQXJyOnIsc3RhcnQ6dCxkZXB0aDplLHVzZUdyb3VwczpuLGhhc1RvcDppLHRvcEZpcnN0OnMsaGFzQm90dG9tOm8saGFzU2lkZTphLGNhcnRlc2lhbjpjLHByb2plY3Rpb246bCxjdXJ2YXR1cmVSZXNvbHV0aW9uOnUsYmJveDpoLGJib3hPZmZzZXQ6Zn0pPT57Y29uc3QgZD1sJiZXYShsKTtpZihkJiYoYz0hMSxoJiZmKSl7bGV0IHg9ZChbaFswXSxoWzFdXSksZz1kKFtoWzJdLGhbM11dKTt4WzFdPS14WzFdLGdbMV09LWdbMV0seFswXSs9ZlswXSx4WzFdKz1mWzFdLGdbMF0rPWZbMl0sZ1sxXSs9ZlszXSx4PWQuaW52ZXJ0KFt4WzBdLC14WzFdXSl8fHgsZz1kLmludmVydChbZ1swXSwtZ1sxXV0pfHxnLGg9W3hbMF0seFsxXSxnWzBdLGdbMV1dfXR8fCh0PVswXSk7Y29uc3QgcD1yLm1hcCgoeCxnKT0+e3ZhciBtLHY7cmV0dXJuIHpQKHtjb29yZGluYXRlOngscHJvamVjdGlvbjpkLHN0YXJ0SGVpZ2h0OihtPXRbZ10pIT1udWxsP206dFswXSxoZWlnaHQ6KHY9ZVtnXSkhPW51bGw/djplWzBdLGhhc1RvcDppIT1udWxsP2k6ITAsdG9wRmlyc3Q6cyE9bnVsbD9zOiExLGhhc0JvdHRvbTpvIT1udWxsP286ITAsaGFzU2lkZTphIT1udWxsP2E6ITAsY2FydGVzaWFuOmMhPW51bGw/YzohMCxjdXJ2YXR1cmVSZXNvbHV0aW9uOnUhPW51bGw/dToxLGJib3g6aH0pfSk7cmV0dXJuIFhhKHAsbil9LFZQPSh7Y29vcmRpbmF0ZXNBcnI6cixsaW5lV2lkdGg6dCxzdGFydDplLHVzZUdyb3VwczpufSk9Pntjb25zdCBzPXIubWFwKChvLGEpPT57dmFyIGM7cmV0dXJuIHB2KHtwb2x5Z29uR2VvSnNvbjpbb10sc3RhcnRIZWlnaHQ6KGM9ZVthXSkhPW51bGw/YzplWzBdfSkudG9wVmVydHN9KS5tYXAoKG8sYSk9Pnt2YXIgbDtjb25zdCBjPShsPXRbYV0pIT1udWxsP2w6dFswXTtyZXR1cm4gVHkoe25vZGVzOm8sc2V0UG9pbnRXaWR0aDooKT0+Y30pfSk7cmV0dXJuIFhhKHMsbil9O3ZhciBHUD0ocix0LGUpPT5uZXcgUHJvbWlzZSgobixpKT0+e3ZhciBzPWM9Pnt0cnl7YShlLm5leHQoYykpfWNhdGNoKGwpe2kobCl9fSxvPWM9Pnt0cnl7YShlLnRocm93KGMpKX1jYXRjaChsKXtpKGwpfX0sYT1jPT5jLmRvbmU/bihjLnZhbHVlKTpQcm9taXNlLnJlc29sdmUoYy52YWx1ZSkudGhlbihzLG8pO2EoKGU9ZS5hcHBseShyLHQpKS5uZXh0KCkpfSk7ZnVuY3Rpb24gSFAocil7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHIpLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpyW2VdLGVudW1lcmFibGU6ITB9KX0se30pfShyPT57Y29uc3QgdD17cnVuKGUsbil7Y29uc3QgaT1uZXcgRnVuY3Rpb24oInJldHVybiAoIitlKyIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Iik7cmV0dXJuIGkuYXBwbHkoaSxuKX0sbWV0aG9kcygpe3JldHVybiBPYmplY3Qua2V5cyh0KX19O2FkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGU9PkdQKHZvaWQgMCxbZV0sZnVuY3Rpb24qKHtkYXRhOm59KXt0cnl7Y29uc3QgaT10W24ubWV0aG9kXTtpZihpKXtjb25zdCBzPXlpZWxkIGkuYXBwbHkoaSxuLnBhcmFtcyk7cy50cmFuc2ZlciYmcy5tZXNzYWdlP3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpzLm1lc3NhZ2UsZXJyb3I6bnVsbH0scy50cmFuc2Zlcik6cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0OnMsZXJyb3I6bnVsbH0pfWVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1ldGhvZCAiJytuLm1ldGhvZCsnIicpfWNhdGNoKGkpe3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpudWxsLGVycm9yOkhQKGkpfSl9fSkpLE9iamVjdC5rZXlzKHIpLmZvckVhY2goZT0+e3RbZV09cltlXX0pLHBvc3RNZXNzYWdlKCJyZWFkeSIpfSkoe2V4dHJ1ZGVQb2x5Z29uOlQyLGxpbmU6UjIsbGluZTI6UDIsY29uaWNQb2x5Z29uOmtQLGNvbmljTGluZTpWUH0pfSkoKTsK", k = (b) => Uint8Array.from(atob(b), (Z) => Z.charCodeAt(0)), x = typeof window != "undefined" && window.Blob && new Blob([k(S)], { type: "text/javascript;charset=utf-8" });
|
|
41
|
-
function
|
|
42
|
-
let
|
|
37
|
+
import { createStore as C, get as M, setMany as n } from "idb-keyval";
|
|
38
|
+
import { BufferGeometry as k, BufferAttribute as S, BufferGeometryLoader as i } from "three";
|
|
39
|
+
import { WorkerPool as J } from "esus-lite";
|
|
40
|
+
const o = "dmFyIFNnPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSx2Zz1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgemc9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIFhyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIEx1PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksT3U9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgaGM9KEosUSk9PihRPVN5bWJvbFtKXSk/UTpTeW1ib2wuZm9yKCJTeW1ib2wuIitKKSxUZz1KPT57dGhyb3cgVHlwZUVycm9yKEopfSxkaT1NYXRoLnBvdyxSdT0oSixRLG10KT0+USBpbiBKP1NnKEosUSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bXR9KTpKW1FdPW10LEZ0PShKLFEpPT57Zm9yKHZhciBtdCBpbiBRfHwoUT17fSkpTHUuY2FsbChRLG10KSYmUnUoSixtdCxRW210XSk7aWYoWHIpZm9yKHZhciBtdCBvZiBYcihRKSlPdS5jYWxsKFEsbXQpJiZSdShKLG10LFFbbXRdKTtyZXR1cm4gSn0sR2U9KEosUSk9PnZnKEosemcoUSkpO3ZhciBEdT0oSixRKT0+e3ZhciBtdD17fTtmb3IodmFyIE10IGluIEopTHUuY2FsbChKLE10KSYmUS5pbmRleE9mKE10KTwwJiYobXRbTXRdPUpbTXRdKTtpZihKIT1udWxsJiZYcilmb3IodmFyIE10IG9mIFhyKEopKVEuaW5kZXhPZihNdCk8MCYmT3UuY2FsbChKLE10KSYmKG10W010XT1KW010XSk7cmV0dXJuIG10fTt2YXIgRWc9ZnVuY3Rpb24oSixRKXt0aGlzWzBdPUosdGhpc1sxXT1RfTt2YXIgJHU9Sj0+e3ZhciBRPUpbaGMoImFzeW5jSXRlcmF0b3IiKV0sbXQ9ITEsTXQsYW49e307cmV0dXJuIFE9PW51bGw/KFE9SltoYygiaXRlcmF0b3IiKV0oKSxNdD1BZT0+YW5bQWVdPUNuPT5RW0FlXShDbikpOihRPVEuY2FsbChKKSxNdD1BZT0+YW5bQWVdPUNuPT57aWYobXQpe2lmKG10PSExLEFlPT09InRocm93Iil0aHJvdyBDbjtyZXR1cm4gQ259cmV0dXJuIG10PSEwLHtkb25lOiExLHZhbHVlOm5ldyBFZyhuZXcgUHJvbWlzZSh1Yz0+e3ZhciBKcj1RW0FlXShDbik7SnIgaW5zdGFuY2VvZiBPYmplY3R8fFRnKCJPYmplY3QgZXhwZWN0ZWQiKSx1YyhKcil9KSwxKX19KSxhbltoYygiaXRlcmF0b3IiKV09KCk9PmFuLE10KCJuZXh0IiksInRocm93ImluIFE/TXQoInRocm93Iik6YW4udGhyb3c9QWU9Pnt0aHJvdyBBZX0sInJldHVybiJpbiBRJiZNdCgicmV0dXJuIiksYW59OyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjsvKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IDIwMTAtMjAyNSBUaHJlZS5qcyBBdXRob3JzCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICovY29uc3QgSj0iMTc2IixmYz0iIixvZT0ic3JnYiIsZGM9InNyZ2ItbGluZWFyIixwYz0ibGluZWFyIixZcj0ic3JnYiI7Y2xhc3MgaXN7YWRkRXZlbnRMaXN0ZW5lcih0LGUpe3RoaXMuX2xpc3RlbmVycz09PXZvaWQgMCYmKHRoaXMuX2xpc3RlbmVycz17fSk7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7blt0XT09PXZvaWQgMCYmKG5bdF09W10pLG5bdF0uaW5kZXhPZihlKT09PS0xJiZuW3RdLnB1c2goZSl9aGFzRXZlbnRMaXN0ZW5lcih0LGUpe2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiBuPT09dm9pZCAwPyExOm5bdF0hPT12b2lkIDAmJm5bdF0uaW5kZXhPZihlKSE9PS0xfXJlbW92ZUV2ZW50TGlzdGVuZXIodCxlKXtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztpZihuPT09dm9pZCAwKXJldHVybjtjb25zdCBzPW5bdF07aWYocyE9PXZvaWQgMCl7Y29uc3Qgcj1zLmluZGV4T2YoZSk7ciE9PS0xJiZzLnNwbGljZShyLDEpfX1kaXNwYXRjaEV2ZW50KHQpe2NvbnN0IGU9dGhpcy5fbGlzdGVuZXJzO2lmKGU9PT12b2lkIDApcmV0dXJuO2NvbnN0IG49ZVt0LnR5cGVdO2lmKG4hPT12b2lkIDApe3QudGFyZ2V0PXRoaXM7Y29uc3Qgcz1uLnNsaWNlKDApO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKylzW3JdLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3QgQXQ9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2Z1bmN0aW9uIEJuKCl7Y29uc3QgaT1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCx0PU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLGU9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAsbj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MDtyZXR1cm4oQXRbaSYyNTVdK0F0W2k+PjgmMjU1XStBdFtpPj4xNiYyNTVdK0F0W2k+PjI0JjI1NV0rIi0iK0F0W3QmMjU1XStBdFt0Pj44JjI1NV0rIi0iK0F0W3Q+PjE2JjE1fDY0XStBdFt0Pj4yNCYyNTVdKyItIitBdFtlJjYzfDEyOF0rQXRbZT4+OCYyNTVdKyItIitBdFtlPj4xNiYyNTVdK0F0W2U+PjI0JjI1NV0rQXRbbiYyNTVdK0F0W24+PjgmMjU1XStBdFtuPj4xNiYyNTVdK0F0W24+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gWihpLHQsZSl7cmV0dXJuIE1hdGgubWF4KHQsTWF0aC5taW4oZSxpKSl9ZnVuY3Rpb24gVXUoaSx0KXtyZXR1cm4oaSV0K3QpJXR9ZnVuY3Rpb24ganIoaSx0LGUpe3JldHVybigxLWUpKmkrZSp0fWZ1bmN0aW9uIHBpKGksdCl7c3dpdGNoKHQuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiBpO2Nhc2UgVWludDMyQXJyYXk6cmV0dXJuIGkvNDI5NDk2NzI5NTtjYXNlIFVpbnQxNkFycmF5OnJldHVybiBpLzY1NTM1O2Nhc2UgVWludDhBcnJheTpyZXR1cm4gaS8yNTU7Y2FzZSBJbnQzMkFycmF5OnJldHVybiBNYXRoLm1heChpLzIxNDc0ODM2NDcsLTEpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5tYXgoaS8zMjc2NywtMSk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgubWF4KGkvMTI3LC0xKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb21wb25lbnQgdHlwZS4iKX19ZnVuY3Rpb24gSXQoaSx0KXtzd2l0Y2godC5jb25zdHJ1Y3Rvcil7Y2FzZSBGbG9hdDMyQXJyYXk6cmV0dXJuIGk7Y2FzZSBVaW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjQyOTQ5NjcyOTUpO2Nhc2UgVWludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSo2NTUzNSk7Y2FzZSBVaW50OEFycmF5OnJldHVybiBNYXRoLnJvdW5kKGkqMjU1KTtjYXNlIEludDMyQXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoyMTQ3NDgzNjQ3KTtjYXNlIEludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSozMjc2Nyk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoxMjcpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCB0eXBlLiIpfX1jbGFzcyBSe2NvbnN0cnVjdG9yKHQ9MCxlPTApe1IucHJvdG90eXBlLmlzVmVjdG9yMj0hMCx0aGlzLng9dCx0aGlzLnk9ZX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy54fXNldCB3aWR0aCh0KXt0aGlzLng9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMueX1zZXQgaGVpZ2h0KHQpe3RoaXMueT10fXNldCh0LGUpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc31kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHM9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PXNbMF0qZStzWzNdKm4rc1s2XSx0aGlzLnk9c1sxXSplK3NbNF0qbitzWzddLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PVoodGhpcy54LHQueCxlLngpLHRoaXMueT1aKHRoaXMueSx0LnksZS55KSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1aKHRoaXMueCx0LGUpLHRoaXMueT1aKHRoaXMueSx0LGUpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKFoobix0LGUpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueX1jcm9zcyh0KXtyZXR1cm4gdGhpcy54KnQueS10aGlzLnkqdC54fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9YW5nbGUoKXtyZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LC10aGlzLngpK01hdGguUEl9YW5nbGVUbyh0KXtjb25zdCBlPU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqdC5sZW5ndGhTcSgpKTtpZihlPT09MClyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QodCkvZTtyZXR1cm4gTWF0aC5hY29zKFoobiwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnk7cmV0dXJuIGUqZStuKm59bWFuaGF0dGFuRGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5hYnModGhpcy54LXQueCkrTWF0aC5hYnModGhpcy55LXQueSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXN9cm90YXRlQXJvdW5kKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxzPU1hdGguc2luKGUpLHI9dGhpcy54LXQueCxvPXRoaXMueS10Lnk7cmV0dXJuIHRoaXMueD1yKm4tbypzK3QueCx0aGlzLnk9cipzK28qbit0LnksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55fX1jbGFzcyBnZXtjb25zdHJ1Y3Rvcih0LGUsbixzLHIsbyxhLGMsbCl7Z2UucHJvdG90eXBlLmlzTWF0cml4Mz0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDEsMCwwLDAsMV0sdCE9PXZvaWQgMCYmdGhpcy5zZXQodCxlLG4scyxyLG8sYSxjLGwpfXNldCh0LGUsbixzLHIsbyxhLGMsbCl7Y29uc3QgaD10aGlzLmVsZW1lbnRzO3JldHVybiBoWzBdPXQsaFsxXT1zLGhbMl09YSxoWzNdPWUsaFs0XT1yLGhbNV09YyxoWzZdPW4saFs3XT1vLGhbOF09bCx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMSwwLDAsMCwxKSx0aGlzfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sdGhpc31leHRyYWN0QmFzaXModCxlLG4pe3JldHVybiB0LnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywyKSx0aGlzfXNldEZyb21NYXRyaXg0KHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQoZVswXSxlWzRdLGVbOF0sZVsxXSxlWzVdLGVbOV0sZVsyXSxlWzZdLGVbMTBdKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxzPWUuZWxlbWVudHMscj10aGlzLmVsZW1lbnRzLG89blswXSxhPW5bM10sYz1uWzZdLGw9blsxXSxoPW5bNF0sdT1uWzddLGY9blsyXSxkPW5bNV0scD1uWzhdLHk9c1swXSxtPXNbM10sZz1zWzZdLGI9c1sxXSx3PXNbNF0seD1zWzddLE09c1syXSxBPXNbNV0sXz1zWzhdO3JldHVybiByWzBdPW8qeSthKmIrYypNLHJbM109byptK2EqdytjKkEscls2XT1vKmcrYSp4K2MqXyxyWzFdPWwqeStoKmIrdSpNLHJbNF09bCptK2gqdyt1KkEscls3XT1sKmcraCp4K3UqXyxyWzJdPWYqeStkKmIrcCpNLHJbNV09ZiptK2QqdytwKkEscls4XT1mKmcrZCp4K3AqXyx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzNdKj10LGVbNl0qPXQsZVsxXSo9dCxlWzRdKj10LGVbN10qPXQsZVsyXSo9dCxlWzVdKj10LGVbOF0qPXQsdGhpc31kZXRlcm1pbmFudCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHM9dFsyXSxyPXRbM10sbz10WzRdLGE9dFs1XSxjPXRbNl0sbD10WzddLGg9dFs4XTtyZXR1cm4gZSpvKmgtZSphKmwtbipyKmgrbiphKmMrcypyKmwtcypvKmN9aW52ZXJ0KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0scz10WzJdLHI9dFszXSxvPXRbNF0sYT10WzVdLGM9dFs2XSxsPXRbN10saD10WzhdLHU9aCpvLWEqbCxmPWEqYy1oKnIsZD1sKnItbypjLHA9ZSp1K24qZitzKmQ7aWYocD09PTApcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwKTtjb25zdCB5PTEvcDtyZXR1cm4gdFswXT11KnksdFsxXT0ocypsLWgqbikqeSx0WzJdPShhKm4tcypvKSp5LHRbM109Zip5LHRbNF09KGgqZS1zKmMpKnksdFs1XT0ocypyLWEqZSkqeSx0WzZdPWQqeSx0WzddPShuKmMtbCplKSp5LHRbOF09KG8qZS1uKnIpKnksdGhpc310cmFuc3Bvc2UoKXtsZXQgdDtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQ9ZVsxXSxlWzFdPWVbM10sZVszXT10LHQ9ZVsyXSxlWzJdPWVbNl0sZVs2XT10LHQ9ZVs1XSxlWzVdPWVbN10sZVs3XT10LHRoaXN9Z2V0Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KHQpLmludmVydCgpLnRyYW5zcG9zZSgpfXRyYW5zcG9zZUludG9BcnJheSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbM10sdFsyXT1lWzZdLHRbM109ZVsxXSx0WzRdPWVbNF0sdFs1XT1lWzddLHRbNl09ZVsyXSx0WzddPWVbNV0sdFs4XT1lWzhdLHRoaXN9c2V0VXZUcmFuc2Zvcm0odCxlLG4scyxyLG8sYSl7Y29uc3QgYz1NYXRoLmNvcyhyKSxsPU1hdGguc2luKHIpO3JldHVybiB0aGlzLnNldChuKmMsbipsLC1uKihjKm8rbCphKStvK3QsLXMqbCxzKmMsLXMqKC1sKm8rYyphKSthK2UsMCwwLDEpLHRoaXN9c2NhbGUodCxlKXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShRci5tYWtlU2NhbGUodCxlKSksdGhpc31yb3RhdGUodCl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkoUXIubWFrZVJvdGF0aW9uKC10KSksdGhpc310cmFuc2xhdGUodCxlKXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShRci5tYWtlVHJhbnNsYXRpb24odCxlKSksdGhpc31tYWtlVHJhbnNsYXRpb24odCxlKXtyZXR1cm4gdC5pc1ZlY3RvcjI/dGhpcy5zZXQoMSwwLHQueCwwLDEsdC55LDAsMCwxKTp0aGlzLnNldCgxLDAsdCwwLDEsZSwwLDAsMSksdGhpc31tYWtlUm90YXRpb24odCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1uLDAsbixlLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSl7cmV0dXJuIHRoaXMuc2V0KHQsMCwwLDAsZSwwLDAsMCwxKSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO2ZvcihsZXQgcz0wO3M8OTtzKyspaWYoZVtzXSE9PW5bc10pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQsZT0wKXtmb3IobGV0IG49MDtuPDk7bisrKXRoaXMuZWxlbWVudHNbbl09dFtuK2VdO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gdFtlXT1uWzBdLHRbZSsxXT1uWzFdLHRbZSsyXT1uWzJdLHRbZSszXT1uWzNdLHRbZSs0XT1uWzRdLHRbZSs1XT1uWzVdLHRbZSs2XT1uWzZdLHRbZSs3XT1uWzddLHRbZSs4XT1uWzhdLHR9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9fWNvbnN0IFFyPW5ldyBnZTtmdW5jdGlvbiBWdShpKXtmb3IobGV0IHQ9aS5sZW5ndGgtMTt0Pj0wOy0tdClpZihpW3RdPj02NTUzNSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiB5YyhpKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixpKX1jb25zdCBtYz1uZXcgZ2UoKS5zZXQoLjQxMjM5MDgsLjM1NzU4NDMsLjE4MDQ4MDgsLjIxMjYzOSwuNzE1MTY4NywuMDcyMTkyMywuMDE5MzMwOCwuMTE5MTk0OCwuOTUwNTMyMiksZ2M9bmV3IGdlKCkuc2V0KDMuMjQwOTY5OSwtMS41MzczODMyLC0uNDk4NjEwOCwtLjk2OTI0MzYsMS44NzU5Njc1LC4wNDE1NTUxLC4wNTU2MzAxLC0uMjAzOTc3LDEuMDU2OTcxNSk7ZnVuY3Rpb24gcXUoKXtjb25zdCBpPXtlbmFibGVkOiEwLHdvcmtpbmdDb2xvclNwYWNlOmRjLHNwYWNlczp7fSxjb252ZXJ0OmZ1bmN0aW9uKHMscixvKXtyZXR1cm4gdGhpcy5lbmFibGVkPT09ITF8fHI9PT1vfHwhcnx8IW98fCh0aGlzLnNwYWNlc1tyXS50cmFuc2Zlcj09PVlyJiYocy5yPV9lKHMucikscy5nPV9lKHMuZykscy5iPV9lKHMuYikpLHRoaXMuc3BhY2VzW3JdLnByaW1hcmllcyE9PXRoaXMuc3BhY2VzW29dLnByaW1hcmllcyYmKHMuYXBwbHlNYXRyaXgzKHRoaXMuc3BhY2VzW3JdLnRvWFlaKSxzLmFwcGx5TWF0cml4Myh0aGlzLnNwYWNlc1tvXS5mcm9tWFlaKSksdGhpcy5zcGFjZXNbb10udHJhbnNmZXI9PT1ZciYmKHMucj1GbihzLnIpLHMuZz1GbihzLmcpLHMuYj1GbihzLmIpKSksc30sZnJvbVdvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHMscil7cmV0dXJuIHRoaXMuY29udmVydChzLHRoaXMud29ya2luZ0NvbG9yU3BhY2Uscil9LHRvV29ya2luZ0NvbG9yU3BhY2U6ZnVuY3Rpb24ocyxyKXtyZXR1cm4gdGhpcy5jb252ZXJ0KHMscix0aGlzLndvcmtpbmdDb2xvclNwYWNlKX0sZ2V0UHJpbWFyaWVzOmZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnNwYWNlc1tzXS5wcmltYXJpZXN9LGdldFRyYW5zZmVyOmZ1bmN0aW9uKHMpe3JldHVybiBzPT09ZmM/cGM6dGhpcy5zcGFjZXNbc10udHJhbnNmZXJ9LGdldEx1bWluYW5jZUNvZWZmaWNpZW50czpmdW5jdGlvbihzLHI9dGhpcy53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHMuZnJvbUFycmF5KHRoaXMuc3BhY2VzW3JdLmx1bWluYW5jZUNvZWZmaWNpZW50cyl9LGRlZmluZTpmdW5jdGlvbihzKXtPYmplY3QuYXNzaWduKHRoaXMuc3BhY2VzLHMpfSxfZ2V0TWF0cml4OmZ1bmN0aW9uKHMscixvKXtyZXR1cm4gcy5jb3B5KHRoaXMuc3BhY2VzW3JdLnRvWFlaKS5tdWx0aXBseSh0aGlzLnNwYWNlc1tvXS5mcm9tWFlaKX0sX2dldERyYXdpbmdCdWZmZXJDb2xvclNwYWNlOmZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnNwYWNlc1tzXS5vdXRwdXRDb2xvclNwYWNlQ29uZmlnLmRyYXdpbmdCdWZmZXJDb2xvclNwYWNlfSxfZ2V0VW5wYWNrQ29sb3JTcGFjZTpmdW5jdGlvbihzPXRoaXMud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB0aGlzLnNwYWNlc1tzXS53b3JraW5nQ29sb3JTcGFjZUNvbmZpZy51bnBhY2tDb2xvclNwYWNlfX0sdD1bLjY0LC4zMywuMywuNiwuMTUsLjA2XSxlPVsuMjEyNiwuNzE1MiwuMDcyMl0sbj1bLjMxMjcsLjMyOV07cmV0dXJuIGkuZGVmaW5lKHtbZGNdOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6cGMsdG9YWVo6bWMsZnJvbVhZWjpnYyxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSx3b3JraW5nQ29sb3JTcGFjZUNvbmZpZzp7dW5wYWNrQ29sb3JTcGFjZTpvZX0sb3V0cHV0Q29sb3JTcGFjZUNvbmZpZzp7ZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6b2V9fSxbb2VdOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6WXIsdG9YWVo6bWMsZnJvbVhZWjpnYyxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSxvdXRwdXRDb2xvclNwYWNlQ29uZmlnOntkcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTpvZX19fSksaX1jb25zdCBhZT1xdSgpO2Z1bmN0aW9uIF9lKGkpe3JldHVybiBpPC4wNDA0NT9pKi4wNzczOTkzODA4Ok1hdGgucG93KGkqLjk0Nzg2NzI5ODYrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBGbihpKXtyZXR1cm4gaTwuMDAzMTMwOD9pKjEyLjkyOjEuMDU1Kk1hdGgucG93KGksLjQxNjY2KS0uMDU1fWxldCBJbjtjbGFzcyBIdXtzdGF0aWMgZ2V0RGF0YVVSTCh0LGU9ImltYWdlL3BuZyIpe2lmKC9eZGF0YTovaS50ZXN0KHQuc3JjKXx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50PT0idW5kZWZpbmVkIilyZXR1cm4gdC5zcmM7bGV0IG47aWYodCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KW49dDtlbHNle0luPT09dm9pZCAwJiYoSW49eWMoImNhbnZhcyIpKSxJbi53aWR0aD10LndpZHRoLEluLmhlaWdodD10LmhlaWdodDtjb25zdCBzPUluLmdldENvbnRleHQoIjJkIik7dCBpbnN0YW5jZW9mIEltYWdlRGF0YT9zLnB1dEltYWdlRGF0YSh0LDAsMCk6cy5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksbj1Jbn1yZXR1cm4gbi50b0RhdGFVUkwoZSl9c3RhdGljIHNSR0JUb0xpbmVhcih0KXtpZih0eXBlb2YgSFRNTEltYWdlRWxlbWVudCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fHR5cGVvZiBJbWFnZUJpdG1hcCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgZT15YygiY2FudmFzIik7ZS53aWR0aD10LndpZHRoLGUuaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49ZS5nZXRDb250ZXh0KCIyZCIpO24uZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpO2NvbnN0IHM9bi5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLHI9cy5kYXRhO2ZvcihsZXQgbz0wO288ci5sZW5ndGg7bysrKXJbb109X2UocltvXS8yNTUpKjI1NTtyZXR1cm4gbi5wdXRJbWFnZURhdGEocywwLDApLGV9ZWxzZSBpZih0LmRhdGEpe2NvbnN0IGU9dC5kYXRhLnNsaWNlKDApO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxlIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/ZVtuXT1NYXRoLmZsb29yKF9lKGVbbl0vMjU1KSoyNTUpOmVbbl09X2UoZVtuXSk7cmV0dXJue2RhdGE6ZSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19ZWxzZSByZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLnNSR0JUb0xpbmVhcigpOiBVbnN1cHBvcnRlZCBpbWFnZSB0eXBlLiBObyBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGFwcGxpZWQuIiksdH19bGV0IFd1PTA7Y2xhc3MgR3V7Y29uc3RydWN0b3IodD1udWxsKXt0aGlzLmlzU291cmNlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOld1Kyt9KSx0aGlzLnV1aWQ9Qm4oKSx0aGlzLmRhdGE9dCx0aGlzLmRhdGFSZWFkeT0hMCx0aGlzLnZlcnNpb249MH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK310b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQuaW1hZ2VzW3RoaXMudXVpZF0hPT12b2lkIDApcmV0dXJuIHQuaW1hZ2VzW3RoaXMudXVpZF07Y29uc3Qgbj17dXVpZDp0aGlzLnV1aWQsdXJsOiIifSxzPXRoaXMuZGF0YTtpZihzIT09bnVsbCl7bGV0IHI7aWYoQXJyYXkuaXNBcnJheShzKSl7cj1bXTtmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YTtvKyspc1tvXS5pc0RhdGFUZXh0dXJlP3IucHVzaChLcihzW29dLmltYWdlKSk6ci5wdXNoKEtyKHNbb10pKX1lbHNlIHI9S3Iocyk7bi51cmw9cn1yZXR1cm4gZXx8KHQuaW1hZ2VzW3RoaXMudXVpZF09biksbn19ZnVuY3Rpb24gS3IoaSl7cmV0dXJuIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCE9InVuZGVmaW5lZCImJmkgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8dHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEltYWdlQml0bWFwP0h1LmdldERhdGFVUkwoaSk6aS5kYXRhP3tkYXRhOkFycmF5LmZyb20oaS5kYXRhKSx3aWR0aDppLndpZHRoLGhlaWdodDppLmhlaWdodCx0eXBlOmkuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTooY29uc29sZS53YXJuKCJUSFJFRS5UZXh0dXJlOiBVbmFibGUgdG8gc2VyaWFsaXplIFRleHR1cmUuIikse30pfWxldCBadT0wO2NsYXNzIGNuIGV4dGVuZHMgaXN7Y29uc3RydWN0b3IodD1jbi5ERUZBVUxUX0lNQUdFLGU9Y24uREVGQVVMVF9NQVBQSU5HLG49MTAwMSxzPTEwMDEscj0xMDA2LG89MTAwOCxhPTEwMjMsYz0xMDA5LGw9Y24uREVGQVVMVF9BTklTT1RST1BZLGg9ZmMpe3N1cGVyKCksdGhpcy5pc1RleHR1cmU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6WnUrK30pLHRoaXMudXVpZD1CbigpLHRoaXMubmFtZT0iIix0aGlzLnNvdXJjZT1uZXcgR3UodCksdGhpcy5taXBtYXBzPVtdLHRoaXMubWFwcGluZz1lLHRoaXMuY2hhbm5lbD0wLHRoaXMud3JhcFM9bix0aGlzLndyYXBUPXMsdGhpcy5tYWdGaWx0ZXI9cix0aGlzLm1pbkZpbHRlcj1vLHRoaXMuYW5pc290cm9weT1sLHRoaXMuZm9ybWF0PWEsdGhpcy5pbnRlcm5hbEZvcm1hdD1udWxsLHRoaXMudHlwZT1jLHRoaXMub2Zmc2V0PW5ldyBSKDAsMCksdGhpcy5yZXBlYXQ9bmV3IFIoMSwxKSx0aGlzLmNlbnRlcj1uZXcgUigwLDApLHRoaXMucm90YXRpb249MCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITAsdGhpcy5tYXRyaXg9bmV3IGdlLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdGhpcy5jb2xvclNwYWNlPWgsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLm9uVXBkYXRlPW51bGwsdGhpcy5yZW5kZXJUYXJnZXQ9bnVsbCx0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMSx0aGlzLmlzVGV4dHVyZUFycmF5PSExLHRoaXMucG1yZW1WZXJzaW9uPTB9Z2V0IGltYWdlKCl7cmV0dXJuIHRoaXMuc291cmNlLmRhdGF9c2V0IGltYWdlKHQ9bnVsbCl7dGhpcy5zb3VyY2UuZGF0YT10fXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueSx0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnksdGhpcy5yb3RhdGlvbix0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnkpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuc291cmNlPXQuc291cmNlLHRoaXMubWlwbWFwcz10Lm1pcG1hcHMuc2xpY2UoMCksdGhpcy5tYXBwaW5nPXQubWFwcGluZyx0aGlzLmNoYW5uZWw9dC5jaGFubmVsLHRoaXMud3JhcFM9dC53cmFwUyx0aGlzLndyYXBUPXQud3JhcFQsdGhpcy5tYWdGaWx0ZXI9dC5tYWdGaWx0ZXIsdGhpcy5taW5GaWx0ZXI9dC5taW5GaWx0ZXIsdGhpcy5hbmlzb3Ryb3B5PXQuYW5pc290cm9weSx0aGlzLmZvcm1hdD10LmZvcm1hdCx0aGlzLmludGVybmFsRm9ybWF0PXQuaW50ZXJuYWxGb3JtYXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLm9mZnNldC5jb3B5KHQub2Zmc2V0KSx0aGlzLnJlcGVhdC5jb3B5KHQucmVwZWF0KSx0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLmdlbmVyYXRlTWlwbWFwcz10LmdlbmVyYXRlTWlwbWFwcyx0aGlzLnByZW11bHRpcGx5QWxwaGE9dC5wcmVtdWx0aXBseUFscGhhLHRoaXMuZmxpcFk9dC5mbGlwWSx0aGlzLnVucGFja0FsaWdubWVudD10LnVucGFja0FsaWdubWVudCx0aGlzLmNvbG9yU3BhY2U9dC5jb2xvclNwYWNlLHRoaXMucmVuZGVyVGFyZ2V0PXQucmVuZGVyVGFyZ2V0LHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPXQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlLHRoaXMuaXNUZXh0dXJlQXJyYXk9dC5pc1RleHR1cmVBcnJheSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpc310b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQudGV4dHVyZXNbdGhpcy51dWlkXSE9PXZvaWQgMClyZXR1cm4gdC50ZXh0dXJlc1t0aGlzLnV1aWRdO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsaW1hZ2U6dGhpcy5zb3VyY2UudG9KU09OKHQpLnV1aWQsbWFwcGluZzp0aGlzLm1hcHBpbmcsY2hhbm5lbDp0aGlzLmNoYW5uZWwscmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCxpbnRlcm5hbEZvcm1hdDp0aGlzLmludGVybmFsRm9ybWF0LHR5cGU6dGhpcy50eXBlLGNvbG9yU3BhY2U6dGhpcy5jb2xvclNwYWNlLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxnZW5lcmF0ZU1pcG1hcHM6dGhpcy5nZW5lcmF0ZU1pcG1hcHMscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihuLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09biksbn1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKHRoaXMubWFwcGluZyE9PTMwMClyZXR1cm4gdDtpZih0LmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksdC54PDB8fHQueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFlMzp0Lng9dC54LU1hdGguZmxvb3IodC54KTticmVhaztjYXNlIDEwMDE6dC54PXQueDwwPzA6MTticmVhaztjYXNlIDEwMDI6TWF0aC5hYnMoTWF0aC5mbG9vcih0LngpJTIpPT09MT90Lng9TWF0aC5jZWlsKHQueCktdC54OnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrfWlmKHQueTwwfHx0Lnk+MSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSAxZTM6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWs7Y2FzZSAxMDAxOnQueT10Lnk8MD8wOjE7YnJlYWs7Y2FzZSAxMDAyOk1hdGguYWJzKE1hdGguZmxvb3IodC55KSUyKT09PTE/dC55PU1hdGguY2VpbCh0LnkpLXQueTp0Lnk9dC55LU1hdGguZmxvb3IodC55KTticmVha31yZXR1cm4gdGhpcy5mbGlwWSYmKHQueT0xLXQueSksdH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiYodGhpcy52ZXJzaW9uKyssdGhpcy5zb3VyY2UubmVlZHNVcGRhdGU9ITApfXNldCBuZWVkc1BNUkVNVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy5wbXJlbVZlcnNpb24rK319Y24uREVGQVVMVF9JTUFHRT1udWxsLGNuLkRFRkFVTFRfTUFQUElORz0zMDAsY24uREVGQVVMVF9BTklTT1RST1BZPTE7Y2xhc3MgWXR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscz0xKXtZdC5wcm90b3R5cGUuaXNWZWN0b3I0PSEwLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1zfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnp9c2V0IHdpZHRoKHQpe3RoaXMuej10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy53fXNldCBoZWlnaHQodCl7dGhpcy53PXR9c2V0KHQsZSxuLHMpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzLnc9cyx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpcy53PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRXKHQpe3JldHVybiB0aGlzLnc9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztjYXNlIDM6dGhpcy53PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56LHRoaXMudyl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpcy53PXQudyE9PXZvaWQgMD90Lnc6MSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcy53Kz10LncsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcy53LT10LncsdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXMudy09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpcy53PXQudy1lLncsdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcy53Kj10LncsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzLnoqPXQsdGhpcy53Kj10LHRoaXN9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHM9dGhpcy56LHI9dGhpcy53LG89dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PW9bMF0qZStvWzRdKm4rb1s4XSpzK29bMTJdKnIsdGhpcy55PW9bMV0qZStvWzVdKm4rb1s5XSpzK29bMTNdKnIsdGhpcy56PW9bMl0qZStvWzZdKm4rb1sxMF0qcytvWzE0XSpyLHRoaXMudz1vWzNdKmUrb1s3XSpuK29bMTFdKnMrb1sxNV0qcix0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpcy53Lz10LncsdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1zZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbih0KXt0aGlzLnc9MipNYXRoLmFjb3ModC53KTtjb25zdCBlPU1hdGguc3FydCgxLXQudyp0LncpO3JldHVybiBlPDFlLTQ/KHRoaXMueD0xLHRoaXMueT0wLHRoaXMuej0wKToodGhpcy54PXQueC9lLHRoaXMueT10LnkvZSx0aGlzLno9dC56L2UpLHRoaXN9c2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4KHQpe2xldCBlLG4scyxyO2NvbnN0IGM9dC5lbGVtZW50cyxsPWNbMF0saD1jWzRdLHU9Y1s4XSxmPWNbMV0sZD1jWzVdLHA9Y1s5XSx5PWNbMl0sbT1jWzZdLGc9Y1sxMF07aWYoTWF0aC5hYnMoaC1mKTwuMDEmJk1hdGguYWJzKHUteSk8LjAxJiZNYXRoLmFicyhwLW0pPC4wMSl7aWYoTWF0aC5hYnMoaCtmKTwuMSYmTWF0aC5hYnModSt5KTwuMSYmTWF0aC5hYnMocCttKTwuMSYmTWF0aC5hYnMobCtkK2ctMyk8LjEpcmV0dXJuIHRoaXMuc2V0KDEsMCwwLDApLHRoaXM7ZT1NYXRoLlBJO2NvbnN0IHc9KGwrMSkvMix4PShkKzEpLzIsTT0oZysxKS8yLEE9KGgrZikvNCxfPSh1K3kpLzQsUz0ocCttKS80O3JldHVybiB3PngmJnc+TT93PC4wMT8obj0wLHM9LjcwNzEwNjc4MSxyPS43MDcxMDY3ODEpOihuPU1hdGguc3FydCh3KSxzPUEvbixyPV8vbik6eD5NP3g8LjAxPyhuPS43MDcxMDY3ODEscz0wLHI9LjcwNzEwNjc4MSk6KHM9TWF0aC5zcXJ0KHgpLG49QS9zLHI9Uy9zKTpNPC4wMT8obj0uNzA3MTA2NzgxLHM9LjcwNzEwNjc4MSxyPTApOihyPU1hdGguc3FydChNKSxuPV8vcixzPVMvciksdGhpcy5zZXQobixzLHIsZSksdGhpc31sZXQgYj1NYXRoLnNxcnQoKG0tcCkqKG0tcCkrKHUteSkqKHUteSkrKGYtaCkqKGYtaCkpO3JldHVybiBNYXRoLmFicyhiKTwuMDAxJiYoYj0xKSx0aGlzLng9KG0tcCkvYix0aGlzLnk9KHUteSkvYix0aGlzLno9KGYtaCkvYix0aGlzLnc9TWF0aC5hY29zKChsK2QrZy0xKS8yKSx0aGlzfXNldEZyb21NYXRyaXhQb3NpdGlvbih0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1lWzEyXSx0aGlzLnk9ZVsxM10sdGhpcy56PWVbMTRdLHRoaXMudz1lWzE1XSx0aGlzfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzLno9TWF0aC5taW4odGhpcy56LHQueiksdGhpcy53PU1hdGgubWluKHRoaXMudyx0LncpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5tYXgodGhpcy53LHQudyksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9Wih0aGlzLngsdC54LGUueCksdGhpcy55PVoodGhpcy55LHQueSxlLnkpLHRoaXMuej1aKHRoaXMueix0LnosZS56KSx0aGlzLnc9Wih0aGlzLncsdC53LGUudyksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9Wih0aGlzLngsdCxlKSx0aGlzLnk9Wih0aGlzLnksdCxlKSx0aGlzLno9Wih0aGlzLnosdCxlKSx0aGlzLnc9Wih0aGlzLncsdCxlKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihaKG4sdCxlKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpcy53PU1hdGguZmxvb3IodGhpcy53KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpcy53PU1hdGguY2VpbCh0aGlzLncpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpcy53PU1hdGgucm91bmQodGhpcy53KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzLno9TWF0aC50cnVuYyh0aGlzLnopLHRoaXMudz1NYXRoLnRydW5jKHRoaXMudyksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpcy53PS10aGlzLncsdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56K3RoaXMudyp0Lnd9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLncpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KStNYXRoLmFicyh0aGlzLncpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzLncrPSh0LnctdGhpcy53KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzLnc9dC53KyhlLnctdC53KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56JiZ0Lnc9PT10aGlzLnd9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXMudz10W2UrM10sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHRbZSszXT10aGlzLncsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXMudz10LmdldFcoZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpcy53PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMueix5aWVsZCB0aGlzLnd9fWNsYXNzIHlpe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wLHM9MSl7dGhpcy5pc1F1YXRlcm5pb249ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fdz1zfXN0YXRpYyBzbGVycEZsYXQodCxlLG4scyxyLG8sYSl7bGV0IGM9bltzKzBdLGw9bltzKzFdLGg9bltzKzJdLHU9bltzKzNdO2NvbnN0IGY9cltvKzBdLGQ9cltvKzFdLHA9cltvKzJdLHk9cltvKzNdO2lmKGE9PT0wKXt0W2UrMF09Yyx0W2UrMV09bCx0W2UrMl09aCx0W2UrM109dTtyZXR1cm59aWYoYT09PTEpe3RbZSswXT1mLHRbZSsxXT1kLHRbZSsyXT1wLHRbZSszXT15O3JldHVybn1pZih1IT09eXx8YyE9PWZ8fGwhPT1kfHxoIT09cCl7bGV0IG09MS1hO2NvbnN0IGc9YypmK2wqZCtoKnArdSp5LGI9Zz49MD8xOi0xLHc9MS1nKmc7aWYodz5OdW1iZXIuRVBTSUxPTil7Y29uc3QgTT1NYXRoLnNxcnQodyksQT1NYXRoLmF0YW4yKE0sZypiKTttPU1hdGguc2luKG0qQSkvTSxhPU1hdGguc2luKGEqQSkvTX1jb25zdCB4PWEqYjtpZihjPWMqbStmKngsbD1sKm0rZCp4LGg9aCptK3AqeCx1PXUqbSt5KngsbT09PTEtYSl7Y29uc3QgTT0xL01hdGguc3FydChjKmMrbCpsK2gqaCt1KnUpO2MqPU0sbCo9TSxoKj1NLHUqPU19fXRbZV09Yyx0W2UrMV09bCx0W2UrMl09aCx0W2UrM109dX1zdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQodCxlLG4scyxyLG8pe2NvbnN0IGE9bltzXSxjPW5bcysxXSxsPW5bcysyXSxoPW5bcyszXSx1PXJbb10sZj1yW28rMV0sZD1yW28rMl0scD1yW28rM107cmV0dXJuIHRbZV09YSpwK2gqdStjKmQtbCpmLHRbZSsxXT1jKnAraCpmK2wqdS1hKmQsdFtlKzJdPWwqcCtoKmQrYSpmLWMqdSx0W2UrM109aCpwLWEqdS1jKmYtbCpkLHR9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHcoKXtyZXR1cm4gdGhpcy5fd31zZXQgdyh0KXt0aGlzLl93PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsbixzKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fdz1zLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC54LHRoaXMuX3k9dC55LHRoaXMuX3o9dC56LHRoaXMuX3c9dC53LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21FdWxlcih0LGU9ITApe2NvbnN0IG49dC5feCxzPXQuX3kscj10Ll96LG89dC5fb3JkZXIsYT1NYXRoLmNvcyxjPU1hdGguc2luLGw9YShuLzIpLGg9YShzLzIpLHU9YShyLzIpLGY9YyhuLzIpLGQ9YyhzLzIpLHA9YyhyLzIpO3N3aXRjaChvKXtjYXNlIlhZWiI6dGhpcy5feD1mKmgqdStsKmQqcCx0aGlzLl95PWwqZCp1LWYqaCpwLHRoaXMuX3o9bCpoKnArZipkKnUsdGhpcy5fdz1sKmgqdS1mKmQqcDticmVhaztjYXNlIllYWiI6dGhpcy5feD1mKmgqdStsKmQqcCx0aGlzLl95PWwqZCp1LWYqaCpwLHRoaXMuX3o9bCpoKnAtZipkKnUsdGhpcy5fdz1sKmgqdStmKmQqcDticmVhaztjYXNlIlpYWSI6dGhpcy5feD1mKmgqdS1sKmQqcCx0aGlzLl95PWwqZCp1K2YqaCpwLHRoaXMuX3o9bCpoKnArZipkKnUsdGhpcy5fdz1sKmgqdS1mKmQqcDticmVhaztjYXNlIlpZWCI6dGhpcy5feD1mKmgqdS1sKmQqcCx0aGlzLl95PWwqZCp1K2YqaCpwLHRoaXMuX3o9bCpoKnAtZipkKnUsdGhpcy5fdz1sKmgqdStmKmQqcDticmVhaztjYXNlIllaWCI6dGhpcy5feD1mKmgqdStsKmQqcCx0aGlzLl95PWwqZCp1K2YqaCpwLHRoaXMuX3o9bCpoKnAtZipkKnUsdGhpcy5fdz1sKmgqdS1mKmQqcDticmVhaztjYXNlIlhaWSI6dGhpcy5feD1mKmgqdS1sKmQqcCx0aGlzLl95PWwqZCp1LWYqaCpwLHRoaXMuX3o9bCpoKnArZipkKnUsdGhpcy5fdz1sKmgqdStmKmQqcDticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrbyl9cmV0dXJuIGU9PT0hMCYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUF4aXNBbmdsZSh0LGUpe2NvbnN0IG49ZS8yLHM9TWF0aC5zaW4obik7cmV0dXJuIHRoaXMuX3g9dC54KnMsdGhpcy5feT10Lnkqcyx0aGlzLl96PXQueipzLHRoaXMuX3c9TWF0aC5jb3MobiksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpe2NvbnN0IGU9dC5lbGVtZW50cyxuPWVbMF0scz1lWzRdLHI9ZVs4XSxvPWVbMV0sYT1lWzVdLGM9ZVs5XSxsPWVbMl0saD1lWzZdLHU9ZVsxMF0sZj1uK2ErdTtpZihmPjApe2NvbnN0IGQ9LjUvTWF0aC5zcXJ0KGYrMSk7dGhpcy5fdz0uMjUvZCx0aGlzLl94PShoLWMpKmQsdGhpcy5feT0oci1sKSpkLHRoaXMuX3o9KG8tcykqZH1lbHNlIGlmKG4+YSYmbj51KXtjb25zdCBkPTIqTWF0aC5zcXJ0KDErbi1hLXUpO3RoaXMuX3c9KGgtYykvZCx0aGlzLl94PS4yNSpkLHRoaXMuX3k9KHMrbykvZCx0aGlzLl96PShyK2wpL2R9ZWxzZSBpZihhPnUpe2NvbnN0IGQ9MipNYXRoLnNxcnQoMSthLW4tdSk7dGhpcy5fdz0oci1sKS9kLHRoaXMuX3g9KHMrbykvZCx0aGlzLl95PS4yNSpkLHRoaXMuX3o9KGMraCkvZH1lbHNle2NvbnN0IGQ9MipNYXRoLnNxcnQoMSt1LW4tYSk7dGhpcy5fdz0oby1zKS9kLHRoaXMuX3g9KHIrbCkvZCx0aGlzLl95PShjK2gpL2QsdGhpcy5fej0uMjUqZH1yZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVVuaXRWZWN0b3JzKHQsZSl7bGV0IG49dC5kb3QoZSkrMTtyZXR1cm4gbjxOdW1iZXIuRVBTSUxPTj8obj0wLE1hdGguYWJzKHQueCk+TWF0aC5hYnModC56KT8odGhpcy5feD0tdC55LHRoaXMuX3k9dC54LHRoaXMuX3o9MCx0aGlzLl93PW4pOih0aGlzLl94PTAsdGhpcy5feT0tdC56LHRoaXMuX3o9dC55LHRoaXMuX3c9bikpOih0aGlzLl94PXQueSplLnotdC56KmUueSx0aGlzLl95PXQueiplLngtdC54KmUueix0aGlzLl96PXQueCplLnktdC55KmUueCx0aGlzLl93PW4pLHRoaXMubm9ybWFsaXplKCl9YW5nbGVUbyh0KXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoWih0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBuPXRoaXMuYW5nbGVUbyh0KTtpZihuPT09MClyZXR1cm4gdGhpcztjb25zdCBzPU1hdGgubWluKDEsZS9uKTtyZXR1cm4gdGhpcy5zbGVycCh0LHMpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdD09PTA/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBuPXQuX3gscz10Ll95LHI9dC5feixvPXQuX3csYT1lLl94LGM9ZS5feSxsPWUuX3osaD1lLl93O3JldHVybiB0aGlzLl94PW4qaCtvKmErcypsLXIqYyx0aGlzLl95PXMqaCtvKmMrciphLW4qbCx0aGlzLl96PXIqaCtvKmwrbipjLXMqYSx0aGlzLl93PW8qaC1uKmEtcypjLXIqbCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKGU9PT0wKXJldHVybiB0aGlzO2lmKGU9PT0xKXJldHVybiB0aGlzLmNvcHkodCk7Y29uc3Qgbj10aGlzLl94LHM9dGhpcy5feSxyPXRoaXMuX3osbz10aGlzLl93O2xldCBhPW8qdC5fdytuKnQuX3grcyp0Ll95K3IqdC5fejtpZihhPDA/KHRoaXMuX3c9LXQuX3csdGhpcy5feD0tdC5feCx0aGlzLl95PS10Ll95LHRoaXMuX3o9LXQuX3osYT0tYSk6dGhpcy5jb3B5KHQpLGE+PTEpcmV0dXJuIHRoaXMuX3c9byx0aGlzLl94PW4sdGhpcy5feT1zLHRoaXMuX3o9cix0aGlzO2NvbnN0IGM9MS1hKmE7aWYoYzw9TnVtYmVyLkVQU0lMT04pe2NvbnN0IGQ9MS1lO3JldHVybiB0aGlzLl93PWQqbytlKnRoaXMuX3csdGhpcy5feD1kKm4rZSp0aGlzLl94LHRoaXMuX3k9ZCpzK2UqdGhpcy5feSx0aGlzLl96PWQqcitlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzfWNvbnN0IGw9TWF0aC5zcXJ0KGMpLGg9TWF0aC5hdGFuMihsLGEpLHU9TWF0aC5zaW4oKDEtZSkqaCkvbCxmPU1hdGguc2luKGUqaCkvbDtyZXR1cm4gdGhpcy5fdz1vKnUrdGhpcy5fdypmLHRoaXMuX3g9bip1K3RoaXMuX3gqZix0aGlzLl95PXMqdSt0aGlzLl95KmYsdGhpcy5fej1yKnUrdGhpcy5feipmLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLG4pe3JldHVybiB0aGlzLmNvcHkodCkuc2xlcnAoZSxuKX1yYW5kb20oKXtjb25zdCB0PTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLGU9MipNYXRoLlBJKk1hdGgucmFuZG9tKCksbj1NYXRoLnJhbmRvbSgpLHM9TWF0aC5zcXJ0KDEtbikscj1NYXRoLnNxcnQobik7cmV0dXJuIHRoaXMuc2V0KHMqTWF0aC5zaW4odCkscypNYXRoLmNvcyh0KSxyKk1hdGguc2luKGUpLHIqTWF0aC5jb3MoZSkpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5feD10W2VdLHRoaXMuX3k9dFtlKzFdLHRoaXMuX3o9dFtlKzJdLHRoaXMuX3c9dFtlKzNdLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLnRvQXJyYXkoKX1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX3d9fWNsYXNzIFR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTApe1QucHJvdG90eXBlLmlzVmVjdG9yMz0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bn1zZXQodCxlLG4pe3JldHVybiBuPT09dm9pZCAwJiYobj10aGlzLnopLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXMuej10LnotZS56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXN9bXVsdGlwbHlWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngqZS54LHRoaXMueT10LnkqZS55LHRoaXMuej10LnoqZS56LHRoaXN9YXBwbHlFdWxlcih0KXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oeGMuc2V0RnJvbUV1bGVyKHQpKX1hcHBseUF4aXNBbmdsZSh0LGUpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbih4Yy5zZXRGcm9tQXhpc0FuZ2xlKHQsZSkpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrclszXSpuK3JbNl0qcyx0aGlzLnk9clsxXSplK3JbNF0qbityWzddKnMsdGhpcy56PXJbMl0qZStyWzVdKm4rcls4XSpzLHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXgzKHQpLm5vcm1hbGl6ZSgpfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHMsbz0xLyhyWzNdKmUrcls3XSpuK3JbMTFdKnMrclsxNV0pO3JldHVybiB0aGlzLng9KHJbMF0qZStyWzRdKm4rcls4XSpzK3JbMTJdKSpvLHRoaXMueT0oclsxXSplK3JbNV0qbityWzldKnMrclsxM10pKm8sdGhpcy56PShyWzJdKmUrcls2XSpuK3JbMTBdKnMrclsxNF0pKm8sdGhpc31hcHBseVF1YXRlcm5pb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10aGlzLnoscj10Lngsbz10LnksYT10LnosYz10LncsbD0yKihvKnMtYSpuKSxoPTIqKGEqZS1yKnMpLHU9MioocipuLW8qZSk7cmV0dXJuIHRoaXMueD1lK2MqbCtvKnUtYSpoLHRoaXMueT1uK2MqaCthKmwtcip1LHRoaXMuej1zK2MqdStyKmgtbypsLHRoaXN9cHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZEludmVyc2UpLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXgpfXVucHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpfXRyYW5zZm9ybURpcmVjdGlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrcls0XSpuK3JbOF0qcyx0aGlzLnk9clsxXSplK3JbNV0qbityWzldKnMsdGhpcy56PXJbMl0qZStyWzZdKm4rclsxMF0qcyx0aGlzLm5vcm1hbGl6ZSgpfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1aKHRoaXMueCx0LngsZS54KSx0aGlzLnk9Wih0aGlzLnksdC55LGUueSksdGhpcy56PVoodGhpcy56LHQueixlLnopLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PVoodGhpcy54LHQsZSksdGhpcy55PVoodGhpcy55LHQsZSksdGhpcy56PVoodGhpcy56LHQsZSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoWihuLHQsZSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXN9Y3Jvc3ModCl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3Qgbj10Lngscz10Lnkscj10Lnosbz1lLngsYT1lLnksYz1lLno7cmV0dXJuIHRoaXMueD1zKmMtciphLHRoaXMueT1yKm8tbipjLHRoaXMuej1uKmEtcypvLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKGU9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgbj10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIobil9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIHRvLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKHRvKX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1Yih0by5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKGU9PT0wKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoWihuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueSxzPXRoaXMuei10Lno7cmV0dXJuIGUqZStuKm4rcypzfW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpK01hdGguYWJzKHRoaXMuei10LnopfXNldEZyb21TcGhlcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnBoaSx0LnRoZXRhKX1zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQsZSxuKXtjb25zdCBzPU1hdGguc2luKGUpKnQ7cmV0dXJuIHRoaXMueD1zKk1hdGguc2luKG4pLHRoaXMueT1NYXRoLmNvcyhlKSp0LHRoaXMuej1zKk1hdGguY29zKG4pLHRoaXN9c2V0RnJvbUN5bGluZHJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnRoZXRhLHQueSl9c2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQqTWF0aC5zaW4oZSksdGhpcy55PW4sdGhpcy56PXQqTWF0aC5jb3MoZSksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzfXNldEZyb21NYXRyaXhTY2FsZSh0KXtjb25zdCBlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLG49dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCkscz10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gdGhpcy54PWUsdGhpcy55PW4sdGhpcy56PXMsdGhpc31zZXRGcm9tTWF0cml4Q29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsZSo0KX1zZXRGcm9tTWF0cml4M0NvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLGUqMyl9c2V0RnJvbUV1bGVyKHQpe3JldHVybiB0aGlzLng9dC5feCx0aGlzLnk9dC5feSx0aGlzLno9dC5feix0aGlzfXNldEZyb21Db2xvcih0KXtyZXR1cm4gdGhpcy54PXQucix0aGlzLnk9dC5nLHRoaXMuej10LmIsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnp9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdFtlKzJdPXRoaXMueix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpc31yYW5kb21EaXJlY3Rpb24oKXtjb25zdCB0PU1hdGgucmFuZG9tKCkqTWF0aC5QSSoyLGU9TWF0aC5yYW5kb20oKSoyLTEsbj1NYXRoLnNxcnQoMS1lKmUpO3JldHVybiB0aGlzLng9bipNYXRoLmNvcyh0KSx0aGlzLnk9ZSx0aGlzLno9bipNYXRoLnNpbih0KSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56fX1jb25zdCB0bz1uZXcgVCx4Yz1uZXcgeWk7Y2xhc3MgZ3R7Y29uc3RydWN0b3IodD1uZXcgVCgxLzAsMS8wLDEvMCksZT1uZXcgVCgtMS8wLC0xLzAsLTEvMCkpe3RoaXMuaXNCb3gzPSEwLHRoaXMubWluPXQsdGhpcy5tYXg9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5taW4uY29weSh0KSx0aGlzLm1heC5jb3B5KGUpLHRoaXN9c2V0RnJvbUFycmF5KHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSs9Myl0aGlzLmV4cGFuZEJ5UG9pbnQoY2UuZnJvbUFycmF5KHQsZSkpO3JldHVybiB0aGlzfXNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQuY291bnQ7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoY2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tUG9pbnRzKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMuZXhwYW5kQnlQb2ludCh0W2VdKTtyZXR1cm4gdGhpc31zZXRGcm9tQ2VudGVyQW5kU2l6ZSh0LGUpe2NvbnN0IG49Y2UuY29weShlKS5tdWx0aXBseVNjYWxhciguNSk7cmV0dXJuIHRoaXMubWluLmNvcHkodCkuc3ViKG4pLHRoaXMubWF4LmNvcHkodCkuYWRkKG4pLHRoaXN9c2V0RnJvbU9iamVjdCh0LGU9ITEpe3JldHVybiB0aGlzLm1ha2VFbXB0eSgpLHRoaXMuZXhwYW5kQnlPYmplY3QodCxlKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PXRoaXMubWluLno9MS8wLHRoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS0xLzAsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fHx0aGlzLm1heC56PHRoaXMubWluLnp9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9Z2V0U2l6ZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9ZXhwYW5kQnlQb2ludCh0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQpLHRoaXMubWF4Lm1heCh0KSx0aGlzfWV4cGFuZEJ5VmVjdG9yKHQpe3JldHVybiB0aGlzLm1pbi5zdWIodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXhwYW5kQnlTY2FsYXIodCl7cmV0dXJuIHRoaXMubWluLmFkZFNjYWxhcigtdCksdGhpcy5tYXguYWRkU2NhbGFyKHQpLHRoaXN9ZXhwYW5kQnlPYmplY3QodCxlPSExKXt0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTtjb25zdCBuPXQuZ2VvbWV0cnk7aWYobiE9PXZvaWQgMCl7Y29uc3Qgcj1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZihlPT09ITAmJnIhPT12b2lkIDAmJnQuaXNJbnN0YW5jZWRNZXNoIT09ITApZm9yKGxldCBvPTAsYT1yLmNvdW50O288YTtvKyspdC5pc01lc2g9PT0hMD90LmdldFZlcnRleFBvc2l0aW9uKG8sY2UpOmNlLmZyb21CdWZmZXJBdHRyaWJ1dGUocixvKSxjZS5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KGNlKTtlbHNlIHQuYm91bmRpbmdCb3ghPT12b2lkIDA/KHQuYm91bmRpbmdCb3g9PT1udWxsJiZ0LmNvbXB1dGVCb3VuZGluZ0JveCgpLHNzLmNvcHkodC5ib3VuZGluZ0JveCkpOihuLmJvdW5kaW5nQm94PT09bnVsbCYmbi5jb21wdXRlQm91bmRpbmdCb3goKSxzcy5jb3B5KG4uYm91bmRpbmdCb3gpKSxzcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy51bmlvbihzcyl9Y29uc3Qgcz10LmNoaWxkcmVuO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKyl0aGlzLmV4cGFuZEJ5T2JqZWN0KHNbcl0sZSk7cmV0dXJuIHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC54Pj10aGlzLm1pbi54JiZ0Lng8PXRoaXMubWF4LngmJnQueT49dGhpcy5taW4ueSYmdC55PD10aGlzLm1heC55JiZ0Lno+PXRoaXMubWluLnomJnQuejw9dGhpcy5tYXguen1jb250YWluc0JveCh0KXtyZXR1cm4gdGhpcy5taW4ueDw9dC5taW4ueCYmdC5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9dC5taW4ueSYmdC5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9dC5taW4ueiYmdC5tYXguejw9dGhpcy5tYXguen1nZXRQYXJhbWV0ZXIodCxlKXtyZXR1cm4gZS5zZXQoKHQueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwodC55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLCh0LnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQubWF4Lng+PXRoaXMubWluLngmJnQubWluLng8PXRoaXMubWF4LngmJnQubWF4Lnk+PXRoaXMubWluLnkmJnQubWluLnk8PXRoaXMubWF4LnkmJnQubWF4Lno+PXRoaXMubWluLnomJnQubWluLno8PXRoaXMubWF4Lnp9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQuY2VudGVyLGNlKSxjZS5kaXN0YW5jZVRvU3F1YXJlZCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWludGVyc2VjdHNQbGFuZSh0KXtsZXQgZSxuO3JldHVybiB0Lm5vcm1hbC54PjA/KGU9dC5ub3JtYWwueCp0aGlzLm1pbi54LG49dC5ub3JtYWwueCp0aGlzLm1heC54KTooZT10Lm5vcm1hbC54KnRoaXMubWF4Lngsbj10Lm5vcm1hbC54KnRoaXMubWluLngpLHQubm9ybWFsLnk+MD8oZSs9dC5ub3JtYWwueSp0aGlzLm1pbi55LG4rPXQubm9ybWFsLnkqdGhpcy5tYXgueSk6KGUrPXQubm9ybWFsLnkqdGhpcy5tYXgueSxuKz10Lm5vcm1hbC55KnRoaXMubWluLnkpLHQubm9ybWFsLno+MD8oZSs9dC5ub3JtYWwueip0aGlzLm1pbi56LG4rPXQubm9ybWFsLnoqdGhpcy5tYXgueik6KGUrPXQubm9ybWFsLnoqdGhpcy5tYXgueixuKz10Lm5vcm1hbC56KnRoaXMubWluLnopLGU8PS10LmNvbnN0YW50JiZuPj0tdC5jb25zdGFudH1pbnRlcnNlY3RzVHJpYW5nbGUodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7dGhpcy5nZXRDZW50ZXIobWkpLHJzLnN1YlZlY3RvcnModGhpcy5tYXgsbWkpLGtuLnN1YlZlY3RvcnModC5hLG1pKSxObi5zdWJWZWN0b3JzKHQuYixtaSksUm4uc3ViVmVjdG9ycyh0LmMsbWkpLFplLnN1YlZlY3RvcnMoTm4sa24pLFhlLnN1YlZlY3RvcnMoUm4sTm4pLGxuLnN1YlZlY3RvcnMoa24sUm4pO2xldCBlPVswLC1aZS56LFplLnksMCwtWGUueixYZS55LDAsLWxuLnosbG4ueSxaZS56LDAsLVplLngsWGUueiwwLC1YZS54LGxuLnosMCwtbG4ueCwtWmUueSxaZS54LDAsLVhlLnksWGUueCwwLC1sbi55LGxuLngsMF07cmV0dXJuIWVvKGUsa24sTm4sUm4scnMpfHwoZT1bMSwwLDAsMCwxLDAsMCwwLDFdLCFlbyhlLGtuLE5uLFJuLHJzKSk/ITE6KG9zLmNyb3NzVmVjdG9ycyhaZSxYZSksZT1bb3MueCxvcy55LG9zLnpdLGVvKGUsa24sTm4sUm4scnMpKX1jbGFtcFBvaW50KHQsZSl7cmV0dXJuIGUuY29weSh0KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodCxjZSkuZGlzdGFuY2VUbyh0KX1nZXRCb3VuZGluZ1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5tYWtlRW1wdHkoKToodGhpcy5nZXRDZW50ZXIodC5jZW50ZXIpLHQucmFkaXVzPXRoaXMuZ2V0U2l6ZShjZSkubGVuZ3RoKCkqLjUpLHR9aW50ZXJzZWN0KHQpe3JldHVybiB0aGlzLm1pbi5tYXgodC5taW4pLHRoaXMubWF4Lm1pbih0Lm1heCksdGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCksdGhpc311bmlvbih0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQubWluKSx0aGlzLm1heC5tYXgodC5tYXgpLHRoaXN9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90aGlzOihTZVswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxTZVsxXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxTZVsyXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxTZVszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxTZVs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxTZVs1XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxTZVs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxTZVs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldEZyb21Qb2ludHMoU2UpLHRoaXMpfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5taW4uYWRkKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5taW4uZXF1YWxzKHRoaXMubWluKSYmdC5tYXguZXF1YWxzKHRoaXMubWF4KX19Y29uc3QgU2U9W25ldyBULG5ldyBULG5ldyBULG5ldyBULG5ldyBULG5ldyBULG5ldyBULG5ldyBUXSxjZT1uZXcgVCxzcz1uZXcgZ3Qsa249bmV3IFQsTm49bmV3IFQsUm49bmV3IFQsWmU9bmV3IFQsWGU9bmV3IFQsbG49bmV3IFQsbWk9bmV3IFQscnM9bmV3IFQsb3M9bmV3IFQsaG49bmV3IFQ7ZnVuY3Rpb24gZW8oaSx0LGUsbixzKXtmb3IobGV0IHI9MCxvPWkubGVuZ3RoLTM7cjw9bztyKz0zKXtobi5mcm9tQXJyYXkoaSxyKTtjb25zdCBhPXMueCpNYXRoLmFicyhobi54KStzLnkqTWF0aC5hYnMoaG4ueSkrcy56Kk1hdGguYWJzKGhuLnopLGM9dC5kb3QoaG4pLGw9ZS5kb3QoaG4pLGg9bi5kb3QoaG4pO2lmKE1hdGgubWF4KC1NYXRoLm1heChjLGwsaCksTWF0aC5taW4oYyxsLGgpKT5hKXJldHVybiExfXJldHVybiEwfWNvbnN0IFh1PW5ldyBndCxnaT1uZXcgVCxubz1uZXcgVDtjbGFzcyBpb3tjb25zdHJ1Y3Rvcih0PW5ldyBULGU9LTEpe3RoaXMuaXNTcGhlcmU9ITAsdGhpcy5jZW50ZXI9dCx0aGlzLnJhZGl1cz1lfXNldCh0LGUpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQpLHRoaXMucmFkaXVzPWUsdGhpc31zZXRGcm9tUG9pbnRzKHQsZSl7Y29uc3Qgbj10aGlzLmNlbnRlcjtlIT09dm9pZCAwP24uY29weShlKTpYdS5zZXRGcm9tUG9pbnRzKHQpLmdldENlbnRlcihuKTtsZXQgcz0wO2ZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKylzPU1hdGgubWF4KHMsbi5kaXN0YW5jZVRvU3F1YXJlZCh0W3JdKSk7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydChzKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucmFkaXVzPXQucmFkaXVzLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLnJhZGl1czwwfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLmNlbnRlci5zZXQoMCwwLDApLHRoaXMucmFkaXVzPS0xLHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PXRoaXMucmFkaXVzKnRoaXMucmFkaXVzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKS10aGlzLnJhZGl1c31pbnRlcnNlY3RzU3BoZXJlKHQpe2NvbnN0IGU9dGhpcy5yYWRpdXMrdC5yYWRpdXM7cmV0dXJuIHQuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9ZSplfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX1pbnRlcnNlY3RzUGxhbmUodCl7cmV0dXJuIE1hdGguYWJzKHQuZGlzdGFuY2VUb1BvaW50KHRoaXMuY2VudGVyKSk8PXRoaXMucmFkaXVzfWNsYW1wUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHQpO3JldHVybiBlLmNvcHkodCksbj50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyYmKGUuc3ViKHRoaXMuY2VudGVyKS5ub3JtYWxpemUoKSxlLm11bHRpcGx5U2NhbGFyKHRoaXMucmFkaXVzKS5hZGQodGhpcy5jZW50ZXIpKSxlfWdldEJvdW5kaW5nQm94KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT8odC5tYWtlRW1wdHkoKSx0KToodC5zZXQodGhpcy5jZW50ZXIsdGhpcy5jZW50ZXIpLHQuZXhwYW5kQnlTY2FsYXIodGhpcy5yYWRpdXMpLHQpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KHQpLHRoaXMucmFkaXVzPXRoaXMucmFkaXVzKnQuZ2V0TWF4U2NhbGVPbkF4aXMoKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYWRkKHQpLHRoaXN9ZXhwYW5kQnlQb2ludCh0KXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz0wLHRoaXM7Z2kuc3ViVmVjdG9ycyh0LHRoaXMuY2VudGVyKTtjb25zdCBlPWdpLmxlbmd0aFNxKCk7aWYoZT50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyl7Y29uc3Qgbj1NYXRoLnNxcnQoZSkscz0obi10aGlzLnJhZGl1cykqLjU7dGhpcy5jZW50ZXIuYWRkU2NhbGVkVmVjdG9yKGdpLHMvbiksdGhpcy5yYWRpdXMrPXN9cmV0dXJuIHRoaXN9dW5pb24odCl7cmV0dXJuIHQuaXNFbXB0eSgpP3RoaXM6dGhpcy5pc0VtcHR5KCk/KHRoaXMuY29weSh0KSx0aGlzKToodGhpcy5jZW50ZXIuZXF1YWxzKHQuY2VudGVyKT09PSEwP3RoaXMucmFkaXVzPU1hdGgubWF4KHRoaXMucmFkaXVzLHQucmFkaXVzKToobm8uc3ViVmVjdG9ycyh0LmNlbnRlcix0aGlzLmNlbnRlcikuc2V0TGVuZ3RoKHQucmFkaXVzKSx0aGlzLmV4cGFuZEJ5UG9pbnQoZ2kuY29weSh0LmNlbnRlcikuYWRkKG5vKSksdGhpcy5leHBhbmRCeVBvaW50KGdpLmNvcHkodC5jZW50ZXIpLnN1YihubykpKSx0aGlzKX1lcXVhbHModCl7cmV0dXJuIHQuY2VudGVyLmVxdWFscyh0aGlzLmNlbnRlcikmJnQucmFkaXVzPT09dGhpcy5yYWRpdXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jb25zdCB2ZT1uZXcgVCxzbz1uZXcgVCxhcz1uZXcgVCxKZT1uZXcgVCxybz1uZXcgVCxjcz1uZXcgVCxvbz1uZXcgVDtjbGFzcyBhb3tjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQoMCwwLC0xKSl7dGhpcy5vcmlnaW49dCx0aGlzLmRpcmVjdGlvbj1lfXNldCh0LGUpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQpLHRoaXMuZGlyZWN0aW9uLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQub3JpZ2luKSx0aGlzLmRpcmVjdGlvbi5jb3B5KHQuZGlyZWN0aW9uKSx0aGlzfWF0KHQsZSl7cmV0dXJuIGUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLHQpfWxvb2tBdCh0KXtyZXR1cm4gdGhpcy5kaXJlY3Rpb24uY29weSh0KS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpLHRoaXN9cmVjYXN0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHRoaXMuYXQodCx2ZSkpLHRoaXN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2Uuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKTtjb25zdCBuPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gbjwwP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sbil9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0KSl9ZGlzdGFuY2VTcVRvUG9pbnQodCl7Y29uc3QgZT12ZS5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIGU8MD90aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCh0KToodmUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLGUpLHZlLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVNxVG9TZWdtZW50KHQsZSxuLHMpe3NvLmNvcHkodCkuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KSxhcy5jb3B5KGUpLnN1Yih0KS5ub3JtYWxpemUoKSxKZS5jb3B5KHRoaXMub3JpZ2luKS5zdWIoc28pO2NvbnN0IHI9dC5kaXN0YW5jZVRvKGUpKi41LG89LXRoaXMuZGlyZWN0aW9uLmRvdChhcyksYT1KZS5kb3QodGhpcy5kaXJlY3Rpb24pLGM9LUplLmRvdChhcyksbD1KZS5sZW5ndGhTcSgpLGg9TWF0aC5hYnMoMS1vKm8pO2xldCB1LGYsZCxwO2lmKGg+MClpZih1PW8qYy1hLGY9byphLWMscD1yKmgsdT49MClpZihmPj0tcClpZihmPD1wKXtjb25zdCB5PTEvaDt1Kj15LGYqPXksZD11Kih1K28qZisyKmEpK2YqKG8qdStmKzIqYykrbH1lbHNlIGY9cix1PU1hdGgubWF4KDAsLShvKmYrYSkpLGQ9LXUqdStmKihmKzIqYykrbDtlbHNlIGY9LXIsdT1NYXRoLm1heCgwLC0obypmK2EpKSxkPS11KnUrZiooZisyKmMpK2w7ZWxzZSBmPD0tcD8odT1NYXRoLm1heCgwLC0oLW8qcithKSksZj11PjA/LXI6TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9LXUqdStmKihmKzIqYykrbCk6Zjw9cD8odT0wLGY9TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9ZiooZisyKmMpK2wpOih1PU1hdGgubWF4KDAsLShvKnIrYSkpLGY9dT4wP3I6TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9LXUqdStmKihmKzIqYykrbCk7ZWxzZSBmPW8+MD8tcjpyLHU9TWF0aC5tYXgoMCwtKG8qZithKSksZD0tdSp1K2YqKGYrMipjKStsO3JldHVybiBuJiZuLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbix1KSxzJiZzLmNvcHkoc28pLmFkZFNjYWxlZFZlY3RvcihhcyxmKSxkfWludGVyc2VjdFNwaGVyZSh0LGUpe3ZlLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5vcmlnaW4pO2NvbnN0IG49dmUuZG90KHRoaXMuZGlyZWN0aW9uKSxzPXZlLmRvdCh2ZSktbipuLHI9dC5yYWRpdXMqdC5yYWRpdXM7aWYocz5yKXJldHVybiBudWxsO2NvbnN0IG89TWF0aC5zcXJ0KHItcyksYT1uLW8sYz1uK287cmV0dXJuIGM8MD9udWxsOmE8MD90aGlzLmF0KGMsZSk6dGhpcy5hdChhLGUpfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31kaXN0YW5jZVRvUGxhbmUodCl7Y29uc3QgZT10Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKGU9PT0wKXJldHVybiB0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik9PT0wPzA6bnVsbDtjb25zdCBuPS0odGhpcy5vcmlnaW4uZG90KHQubm9ybWFsKSt0LmNvbnN0YW50KS9lO3JldHVybiBuPj0wP246bnVsbH1pbnRlcnNlY3RQbGFuZSh0LGUpe2NvbnN0IG49dGhpcy5kaXN0YW5jZVRvUGxhbmUodCk7cmV0dXJuIG49PT1udWxsP251bGw6dGhpcy5hdChuLGUpfWludGVyc2VjdHNQbGFuZSh0KXtjb25zdCBlPXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTtyZXR1cm4gZT09PTB8fHQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqZTwwfWludGVyc2VjdEJveCh0LGUpe2xldCBuLHMscixvLGEsYztjb25zdCBsPTEvdGhpcy5kaXJlY3Rpb24ueCxoPTEvdGhpcy5kaXJlY3Rpb24ueSx1PTEvdGhpcy5kaXJlY3Rpb24ueixmPXRoaXMub3JpZ2luO3JldHVybiBsPj0wPyhuPSh0Lm1pbi54LWYueCkqbCxzPSh0Lm1heC54LWYueCkqbCk6KG49KHQubWF4LngtZi54KSpsLHM9KHQubWluLngtZi54KSpsKSxoPj0wPyhyPSh0Lm1pbi55LWYueSkqaCxvPSh0Lm1heC55LWYueSkqaCk6KHI9KHQubWF4LnktZi55KSpoLG89KHQubWluLnktZi55KSpoKSxuPm98fHI+c3x8KChyPm58fGlzTmFOKG4pKSYmKG49ciksKG88c3x8aXNOYU4ocykpJiYocz1vKSx1Pj0wPyhhPSh0Lm1pbi56LWYueikqdSxjPSh0Lm1heC56LWYueikqdSk6KGE9KHQubWF4LnotZi56KSp1LGM9KHQubWluLnotZi56KSp1KSxuPmN8fGE+cyl8fCgoYT5ufHxuIT09bikmJihuPWEpLChjPHN8fHMhPT1zKSYmKHM9YyksczwwKT9udWxsOnRoaXMuYXQobj49MD9uOnMsZSl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3godCx2ZSkhPT1udWxsfWludGVyc2VjdFRyaWFuZ2xlKHQsZSxuLHMscil7cm8uc3ViVmVjdG9ycyhlLHQpLGNzLnN1YlZlY3RvcnMobix0KSxvby5jcm9zc1ZlY3RvcnMocm8sY3MpO2xldCBvPXRoaXMuZGlyZWN0aW9uLmRvdChvbyksYTtpZihvPjApe2lmKHMpcmV0dXJuIG51bGw7YT0xfWVsc2UgaWYobzwwKWE9LTEsbz0tbztlbHNlIHJldHVybiBudWxsO0plLnN1YlZlY3RvcnModGhpcy5vcmlnaW4sdCk7Y29uc3QgYz1hKnRoaXMuZGlyZWN0aW9uLmRvdChjcy5jcm9zc1ZlY3RvcnMoSmUsY3MpKTtpZihjPDApcmV0dXJuIG51bGw7Y29uc3QgbD1hKnRoaXMuZGlyZWN0aW9uLmRvdChyby5jcm9zcyhKZSkpO2lmKGw8MHx8YytsPm8pcmV0dXJuIG51bGw7Y29uc3QgaD0tYSpKZS5kb3Qob28pO3JldHVybiBoPDA/bnVsbDp0aGlzLmF0KGgvbyxyKX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMub3JpZ2luLmFwcGx5TWF0cml4NCh0KSx0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24odCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQub3JpZ2luLmVxdWFscyh0aGlzLm9yaWdpbikmJnQuZGlyZWN0aW9uLmVxdWFscyh0aGlzLmRpcmVjdGlvbil9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jbGFzcyBzdHtjb25zdHJ1Y3Rvcih0LGUsbixzLHIsbyxhLGMsbCxoLHUsZixkLHAseSxtKXtzdC5wcm90b3R5cGUuaXNNYXRyaXg0PSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdLHQhPT12b2lkIDAmJnRoaXMuc2V0KHQsZSxuLHMscixvLGEsYyxsLGgsdSxmLGQscCx5LG0pfXNldCh0LGUsbixzLHIsbyxhLGMsbCxoLHUsZixkLHAseSxtKXtjb25zdCBnPXRoaXMuZWxlbWVudHM7cmV0dXJuIGdbMF09dCxnWzRdPWUsZ1s4XT1uLGdbMTJdPXMsZ1sxXT1yLGdbNV09byxnWzldPWEsZ1sxM109YyxnWzJdPWwsZ1s2XT1oLGdbMTBdPXUsZ1sxNF09ZixnWzNdPWQsZ1s3XT1wLGdbMTFdPXksZ1sxNV09bSx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHN0KCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sZVs5XT1uWzldLGVbMTBdPW5bMTBdLGVbMTFdPW5bMTFdLGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLGVbMTVdPW5bMTVdLHRoaXN9Y29weVBvc2l0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLHRoaXN9c2V0RnJvbU1hdHJpeDModCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbM10sZVs2XSwwLGVbMV0sZVs0XSxlWzddLDAsZVsyXSxlWzVdLGVbOF0sMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpLHRoaXN9bWFrZUJhc2lzKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodC54LGUueCxuLngsMCx0LnksZS55LG4ueSwwLHQueixlLnosbi56LDAsMCwwLDAsMSksdGhpc31leHRyYWN0Um90YXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cyxzPTEvTG4uc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLHI9MS9Mbi5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCksbz0xL0xuLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gZVswXT1uWzBdKnMsZVsxXT1uWzFdKnMsZVsyXT1uWzJdKnMsZVszXT0wLGVbNF09bls0XSpyLGVbNV09bls1XSpyLGVbNl09bls2XSpyLGVbN109MCxlWzhdPW5bOF0qbyxlWzldPW5bOV0qbyxlWzEwXT1uWzEwXSpvLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21FdWxlcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10Lngscz10Lnkscj10Lnosbz1NYXRoLmNvcyhuKSxhPU1hdGguc2luKG4pLGM9TWF0aC5jb3MocyksbD1NYXRoLnNpbihzKSxoPU1hdGguY29zKHIpLHU9TWF0aC5zaW4ocik7aWYodC5vcmRlcj09PSJYWVoiKXtjb25zdCBmPW8qaCxkPW8qdSxwPWEqaCx5PWEqdTtlWzBdPWMqaCxlWzRdPS1jKnUsZVs4XT1sLGVbMV09ZCtwKmwsZVs1XT1mLXkqbCxlWzldPS1hKmMsZVsyXT15LWYqbCxlWzZdPXArZCpsLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWVhaIil7Y29uc3QgZj1jKmgsZD1jKnUscD1sKmgseT1sKnU7ZVswXT1mK3kqYSxlWzRdPXAqYS1kLGVbOF09bypsLGVbMV09byp1LGVbNV09bypoLGVbOV09LWEsZVsyXT1kKmEtcCxlWzZdPXkrZiphLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWlhZIil7Y29uc3QgZj1jKmgsZD1jKnUscD1sKmgseT1sKnU7ZVswXT1mLXkqYSxlWzRdPS1vKnUsZVs4XT1wK2QqYSxlWzFdPWQrcCphLGVbNV09bypoLGVbOV09eS1mKmEsZVsyXT0tbypsLGVbNl09YSxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IlpZWCIpe2NvbnN0IGY9bypoLGQ9byp1LHA9YSpoLHk9YSp1O2VbMF09YypoLGVbNF09cCpsLWQsZVs4XT1mKmwreSxlWzFdPWMqdSxlWzVdPXkqbCtmLGVbOV09ZCpsLXAsZVsyXT0tbCxlWzZdPWEqYyxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IllaWCIpe2NvbnN0IGY9bypjLGQ9bypsLHA9YSpjLHk9YSpsO2VbMF09YypoLGVbNF09eS1mKnUsZVs4XT1wKnUrZCxlWzFdPXUsZVs1XT1vKmgsZVs5XT0tYSpoLGVbMl09LWwqaCxlWzZdPWQqdStwLGVbMTBdPWYteSp1fWVsc2UgaWYodC5vcmRlcj09PSJYWlkiKXtjb25zdCBmPW8qYyxkPW8qbCxwPWEqYyx5PWEqbDtlWzBdPWMqaCxlWzRdPS11LGVbOF09bCpoLGVbMV09Zip1K3ksZVs1XT1vKmgsZVs5XT1kKnUtcCxlWzJdPXAqdS1kLGVbNl09YSpoLGVbMTBdPXkqdStmfXJldHVybiBlWzNdPTAsZVs3XT0wLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLmNvbXBvc2UoSnUsdCxZdSl9bG9va0F0KHQsZSxuKXtjb25zdCBzPXRoaXMuZWxlbWVudHM7cmV0dXJuICR0LnN1YlZlY3RvcnModCxlKSwkdC5sZW5ndGhTcSgpPT09MCYmKCR0Lno9MSksJHQubm9ybWFsaXplKCksWWUuY3Jvc3NWZWN0b3JzKG4sJHQpLFllLmxlbmd0aFNxKCk9PT0wJiYoTWF0aC5hYnMobi56KT09PTE/JHQueCs9MWUtNDokdC56Kz0xZS00LCR0Lm5vcm1hbGl6ZSgpLFllLmNyb3NzVmVjdG9ycyhuLCR0KSksWWUubm9ybWFsaXplKCksbHMuY3Jvc3NWZWN0b3JzKCR0LFllKSxzWzBdPVllLngsc1s0XT1scy54LHNbOF09JHQueCxzWzFdPVllLnksc1s1XT1scy55LHNbOV09JHQueSxzWzJdPVllLnosc1s2XT1scy56LHNbMTBdPSR0LnosdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMscz1lLmVsZW1lbnRzLHI9dGhpcy5lbGVtZW50cyxvPW5bMF0sYT1uWzRdLGM9bls4XSxsPW5bMTJdLGg9blsxXSx1PW5bNV0sZj1uWzldLGQ9blsxM10scD1uWzJdLHk9bls2XSxtPW5bMTBdLGc9blsxNF0sYj1uWzNdLHc9bls3XSx4PW5bMTFdLE09blsxNV0sQT1zWzBdLF89c1s0XSxTPXNbOF0sRT1zWzEyXSx6PXNbMV0sdj1zWzVdLEM9c1s5XSxQPXNbMTNdLEY9c1syXSxCPXNbNl0sST1zWzEwXSxrPXNbMTRdLEQ9c1szXSxWPXNbN10saj1zWzExXSxkdD1zWzE1XTtyZXR1cm4gclswXT1vKkErYSp6K2MqRitsKkQscls0XT1vKl8rYSp2K2MqQitsKlYscls4XT1vKlMrYSpDK2MqSStsKmosclsxMl09bypFK2EqUCtjKmsrbCpkdCxyWzFdPWgqQSt1KnorZipGK2QqRCxyWzVdPWgqXyt1KnYrZipCK2QqVixyWzldPWgqUyt1KkMrZipJK2QqaixyWzEzXT1oKkUrdSpQK2YqaytkKmR0LHJbMl09cCpBK3kqeittKkYrZypELHJbNl09cCpfK3kqdittKkIrZypWLHJbMTBdPXAqUyt5KkMrbSpJK2cqaixyWzE0XT1wKkUreSpQK20qaytnKmR0LHJbM109YipBK3cqeit4KkYrTSpELHJbN109YipfK3cqdit4KkIrTSpWLHJbMTFdPWIqUyt3KkMreCpJK00qaixyWzE1XT1iKkUrdypQK3gqaytNKmR0LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbNF0qPXQsZVs4XSo9dCxlWzEyXSo9dCxlWzFdKj10LGVbNV0qPXQsZVs5XSo9dCxlWzEzXSo9dCxlWzJdKj10LGVbNl0qPXQsZVsxMF0qPXQsZVsxNF0qPXQsZVszXSo9dCxlWzddKj10LGVbMTFdKj10LGVbMTVdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFs0XSxzPXRbOF0scj10WzEyXSxvPXRbMV0sYT10WzVdLGM9dFs5XSxsPXRbMTNdLGg9dFsyXSx1PXRbNl0sZj10WzEwXSxkPXRbMTRdLHA9dFszXSx5PXRbN10sbT10WzExXSxnPXRbMTVdO3JldHVybiBwKigrcipjKnUtcypsKnUtciphKmYrbipsKmYrcyphKmQtbipjKmQpK3kqKCtlKmMqZC1lKmwqZityKm8qZi1zKm8qZCtzKmwqaC1yKmMqaCkrbSooK2UqbCp1LWUqYSpkLXIqbyp1K24qbypkK3IqYSpoLW4qbCpoKStnKigtcyphKmgtZSpjKnUrZSphKmYrcypvKnUtbipvKmYrbipjKmgpfXRyYW5zcG9zZSgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztsZXQgZTtyZXR1cm4gZT10WzFdLHRbMV09dFs0XSx0WzRdPWUsZT10WzJdLHRbMl09dFs4XSx0WzhdPWUsZT10WzZdLHRbNl09dFs5XSx0WzldPWUsZT10WzNdLHRbM109dFsxMl0sdFsxMl09ZSxlPXRbN10sdFs3XT10WzEzXSx0WzEzXT1lLGU9dFsxMV0sdFsxMV09dFsxNF0sdFsxNF09ZSx0aGlzfXNldFBvc2l0aW9uKHQsZSxuKXtjb25zdCBzPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQuaXNWZWN0b3IzPyhzWzEyXT10Lngsc1sxM109dC55LHNbMTRdPXQueik6KHNbMTJdPXQsc1sxM109ZSxzWzE0XT1uKSx0aGlzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHM9dFsyXSxyPXRbM10sbz10WzRdLGE9dFs1XSxjPXRbNl0sbD10WzddLGg9dFs4XSx1PXRbOV0sZj10WzEwXSxkPXRbMTFdLHA9dFsxMl0seT10WzEzXSxtPXRbMTRdLGc9dFsxNV0sYj11Km0qbC15KmYqbCt5KmMqZC1hKm0qZC11KmMqZythKmYqZyx3PXAqZipsLWgqbSpsLXAqYypkK28qbSpkK2gqYypnLW8qZipnLHg9aCp5KmwtcCp1KmwrcCphKmQtbyp5KmQtaCphKmcrbyp1KmcsTT1wKnUqYy1oKnkqYy1wKmEqZitvKnkqZitoKmEqbS1vKnUqbSxBPWUqYituKncrcyp4K3IqTTtpZihBPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgXz0xL0E7cmV0dXJuIHRbMF09YipfLHRbMV09KHkqZipyLXUqbSpyLXkqcypkK24qbSpkK3UqcypnLW4qZipnKSpfLHRbMl09KGEqbSpyLXkqYypyK3kqcypsLW4qbSpsLWEqcypnK24qYypnKSpfLHRbM109KHUqYypyLWEqZipyLXUqcypsK24qZipsK2EqcypkLW4qYypkKSpfLHRbNF09dypfLHRbNV09KGgqbSpyLXAqZipyK3AqcypkLWUqbSpkLWgqcypnK2UqZipnKSpfLHRbNl09KHAqYypyLW8qbSpyLXAqcypsK2UqbSpsK28qcypnLWUqYypnKSpfLHRbN109KG8qZipyLWgqYypyK2gqcypsLWUqZipsLW8qcypkK2UqYypkKSpfLHRbOF09eCpfLHRbOV09KHAqdSpyLWgqeSpyLXAqbipkK2UqeSpkK2gqbipnLWUqdSpnKSpfLHRbMTBdPShvKnkqci1wKmEqcitwKm4qbC1lKnkqbC1vKm4qZytlKmEqZykqXyx0WzExXT0oaCphKnItbyp1KnItaCpuKmwrZSp1KmwrbypuKmQtZSphKmQpKl8sdFsxMl09TSpfLHRbMTNdPShoKnkqcy1wKnUqcytwKm4qZi1lKnkqZi1oKm4qbStlKnUqbSkqXyx0WzE0XT0ocCphKnMtbyp5KnMtcCpuKmMrZSp5KmMrbypuKm0tZSphKm0pKl8sdFsxNV09KG8qdSpzLWgqYSpzK2gqbipjLWUqdSpjLW8qbipmK2UqYSpmKSpfLHRoaXN9c2NhbGUodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC54LHM9dC55LHI9dC56O3JldHVybiBlWzBdKj1uLGVbNF0qPXMsZVs4XSo9cixlWzFdKj1uLGVbNV0qPXMsZVs5XSo9cixlWzJdKj1uLGVbNl0qPXMsZVsxMF0qPXIsZVszXSo9bixlWzddKj1zLGVbMTFdKj1yLHRoaXN9Z2V0TWF4U2NhbGVPbkF4aXMoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSxuPXRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLHM9dFs4XSp0WzhdK3RbOV0qdFs5XSt0WzEwXSp0WzEwXTtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGUsbixzKSl9bWFrZVRyYW5zbGF0aW9uKHQsZSxuKXtyZXR1cm4gdC5pc1ZlY3RvcjM/dGhpcy5zZXQoMSwwLDAsdC54LDAsMSwwLHQueSwwLDAsMSx0LnosMCwwLDAsMSk6dGhpcy5zZXQoMSwwLDAsdCwwLDEsMCxlLDAsMCwxLG4sMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25YKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWSh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsMCxuLDAsMCwxLDAsMCwtbiwwLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbloodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1uLDAsMCxuLGUsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25BeGlzKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxzPU1hdGguc2luKGUpLHI9MS1uLG89dC54LGE9dC55LGM9dC56LGw9cipvLGg9ciphO3JldHVybiB0aGlzLnNldChsKm8rbixsKmEtcypjLGwqYytzKmEsMCxsKmErcypjLGgqYStuLGgqYy1zKm8sMCxsKmMtcyphLGgqYytzKm8scipjKmMrbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCwwLGUsMCwwLDAsMCxuLDAsMCwwLDAsMSksdGhpc31tYWtlU2hlYXIodCxlLG4scyxyLG8pe3JldHVybiB0aGlzLnNldCgxLG4sciwwLHQsMSxvLDAsZSxzLDEsMCwwLDAsMCwxKSx0aGlzfWNvbXBvc2UodCxlLG4pe2NvbnN0IHM9dGhpcy5lbGVtZW50cyxyPWUuX3gsbz1lLl95LGE9ZS5feixjPWUuX3csbD1yK3IsaD1vK28sdT1hK2EsZj1yKmwsZD1yKmgscD1yKnUseT1vKmgsbT1vKnUsZz1hKnUsYj1jKmwsdz1jKmgseD1jKnUsTT1uLngsQT1uLnksXz1uLno7cmV0dXJuIHNbMF09KDEtKHkrZykpKk0sc1sxXT0oZCt4KSpNLHNbMl09KHAtdykqTSxzWzNdPTAsc1s0XT0oZC14KSpBLHNbNV09KDEtKGYrZykpKkEsc1s2XT0obStiKSpBLHNbN109MCxzWzhdPShwK3cpKl8sc1s5XT0obS1iKSpfLHNbMTBdPSgxLShmK3kpKSpfLHNbMTFdPTAsc1sxMl09dC54LHNbMTNdPXQueSxzWzE0XT10Lnosc1sxNV09MSx0aGlzfWRlY29tcG9zZSh0LGUsbil7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO2xldCByPUxuLnNldChzWzBdLHNbMV0sc1syXSkubGVuZ3RoKCk7Y29uc3Qgbz1Mbi5zZXQoc1s0XSxzWzVdLHNbNl0pLmxlbmd0aCgpLGE9TG4uc2V0KHNbOF0sc1s5XSxzWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihyPS1yKSx0Lng9c1sxMl0sdC55PXNbMTNdLHQuej1zWzE0XSxsZS5jb3B5KHRoaXMpO2NvbnN0IGw9MS9yLGg9MS9vLHU9MS9hO3JldHVybiBsZS5lbGVtZW50c1swXSo9bCxsZS5lbGVtZW50c1sxXSo9bCxsZS5lbGVtZW50c1syXSo9bCxsZS5lbGVtZW50c1s0XSo9aCxsZS5lbGVtZW50c1s1XSo9aCxsZS5lbGVtZW50c1s2XSo9aCxsZS5lbGVtZW50c1s4XSo9dSxsZS5lbGVtZW50c1s5XSo9dSxsZS5lbGVtZW50c1sxMF0qPXUsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgobGUpLG4ueD1yLG4ueT1vLG4uej1hLHRoaXN9bWFrZVBlcnNwZWN0aXZlKHQsZSxuLHMscixvLGE9MmUzKXtjb25zdCBjPXRoaXMuZWxlbWVudHMsbD0yKnIvKGUtdCksaD0yKnIvKG4tcyksdT0oZSt0KS8oZS10KSxmPShuK3MpLyhuLXMpO2xldCBkLHA7aWYoYT09PTJlMylkPS0obytyKS8oby1yKSxwPS0yKm8qci8oby1yKTtlbHNlIGlmKGE9PT0yMDAxKWQ9LW8vKG8tcikscD0tbypyLyhvLXIpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VQZXJzcGVjdGl2ZSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2EpO3JldHVybiBjWzBdPWwsY1s0XT0wLGNbOF09dSxjWzEyXT0wLGNbMV09MCxjWzVdPWgsY1s5XT1mLGNbMTNdPTAsY1syXT0wLGNbNl09MCxjWzEwXT1kLGNbMTRdPXAsY1szXT0wLGNbN109MCxjWzExXT0tMSxjWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyh0LGUsbixzLHIsbyxhPTJlMyl7Y29uc3QgYz10aGlzLmVsZW1lbnRzLGw9MS8oZS10KSxoPTEvKG4tcyksdT0xLyhvLXIpLGY9KGUrdCkqbCxkPShuK3MpKmg7bGV0IHAseTtpZihhPT09MmUzKXA9KG8rcikqdSx5PS0yKnU7ZWxzZSBpZihhPT09MjAwMSlwPXIqdSx5PS0xKnU7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZU9ydGhvZ3JhcGhpYygpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2EpO3JldHVybiBjWzBdPTIqbCxjWzRdPTAsY1s4XT0wLGNbMTJdPS1mLGNbMV09MCxjWzVdPTIqaCxjWzldPTAsY1sxM109LWQsY1syXT0wLGNbNl09MCxjWzEwXT15LGNbMTRdPS1wLGNbM109MCxjWzddPTAsY1sxMV09MCxjWzE1XT0xLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7Zm9yKGxldCBzPTA7czwxNjtzKyspaWYoZVtzXSE9PW5bc10pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQsZT0wKXtmb3IobGV0IG49MDtuPDE2O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09blswXSx0W2UrMV09blsxXSx0W2UrMl09blsyXSx0W2UrM109blszXSx0W2UrNF09bls0XSx0W2UrNV09bls1XSx0W2UrNl09bls2XSx0W2UrN109bls3XSx0W2UrOF09bls4XSx0W2UrOV09bls5XSx0W2UrMTBdPW5bMTBdLHRbZSsxMV09blsxMV0sdFtlKzEyXT1uWzEyXSx0W2UrMTNdPW5bMTNdLHRbZSsxNF09blsxNF0sdFtlKzE1XT1uWzE1XSx0fX1jb25zdCBMbj1uZXcgVCxsZT1uZXcgc3QsSnU9bmV3IFQoMCwwLDApLFl1PW5ldyBUKDEsMSwxKSxZZT1uZXcgVCxscz1uZXcgVCwkdD1uZXcgVCx3Yz1uZXcgc3QsYmM9bmV3IHlpO2NsYXNzIHhpe2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wLHM9eGkuREVGQVVMVF9PUkRFUil7dGhpcy5pc0V1bGVyPSEwLHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX29yZGVyPXN9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IG9yZGVyKCl7cmV0dXJuIHRoaXMuX29yZGVyfXNldCBvcmRlcih0KXt0aGlzLl9vcmRlcj10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4scz10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX29yZGVyPXMsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fb3JkZXIpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC5feCx0aGlzLl95PXQuX3ksdGhpcy5fej10Ll96LHRoaXMuX29yZGVyPXQuX29yZGVyLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0LGU9dGhpcy5fb3JkZXIsbj0hMCl7Y29uc3Qgcz10LmVsZW1lbnRzLHI9c1swXSxvPXNbNF0sYT1zWzhdLGM9c1sxXSxsPXNbNV0saD1zWzldLHU9c1syXSxmPXNbNl0sZD1zWzEwXTtzd2l0Y2goZSl7Y2FzZSJYWVoiOnRoaXMuX3k9TWF0aC5hc2luKFooYSwtMSwxKSksTWF0aC5hYnMoYSk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtaCxkKSx0aGlzLl96PU1hdGguYXRhbjIoLW8scikpOih0aGlzLl94PU1hdGguYXRhbjIoZixsKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PU1hdGguYXNpbigtWihoLC0xLDEpKSxNYXRoLmFicyhoKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKGEsZCksdGhpcy5fej1NYXRoLmF0YW4yKGMsbCkpOih0aGlzLl95PU1hdGguYXRhbjIoLXUsciksdGhpcy5fej0wKTticmVhaztjYXNlIlpYWSI6dGhpcy5feD1NYXRoLmFzaW4oWihmLC0xLDEpKSxNYXRoLmFicyhmKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKC11LGQpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxsKSk6KHRoaXMuX3k9MCx0aGlzLl96PU1hdGguYXRhbjIoYyxyKSk7YnJlYWs7Y2FzZSJaWVgiOnRoaXMuX3k9TWF0aC5hc2luKC1aKHUsLTEsMSkpLE1hdGguYWJzKHUpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZixkKSx0aGlzLl96PU1hdGguYXRhbjIoYyxyKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLW8sbCkpO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl96PU1hdGguYXNpbihaKGMsLTEsMSkpLE1hdGguYWJzKGMpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoLWgsbCksdGhpcy5feT1NYXRoLmF0YW4yKC11LHIpKToodGhpcy5feD0wLHRoaXMuX3k9TWF0aC5hdGFuMihhLGQpKTticmVhaztjYXNlIlhaWSI6dGhpcy5fej1NYXRoLmFzaW4oLVoobywtMSwxKSksTWF0aC5hYnMobyk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihmLGwpLHRoaXMuX3k9TWF0aC5hdGFuMihhLHIpKToodGhpcy5feD1NYXRoLmF0YW4yKC1oLGQpLHRoaXMuX3k9MCk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIitlKX1yZXR1cm4gdGhpcy5fb3JkZXI9ZSxuPT09ITAmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21RdWF0ZXJuaW9uKHQsZSxuKXtyZXR1cm4gd2MubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCksdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgod2MsZSxuKX1zZXRGcm9tVmVjdG9yMyh0LGU9dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLnNldCh0LngsdC55LHQueixlKX1yZW9yZGVyKHQpe3JldHVybiBiYy5zZXRGcm9tRXVsZXIodGhpcyksdGhpcy5zZXRGcm9tUXVhdGVybmlvbihiYyx0KX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX29yZGVyPT09dGhpcy5fb3JkZXJ9ZnJvbUFycmF5KHQpe3JldHVybiB0aGlzLl94PXRbMF0sdGhpcy5feT10WzFdLHRoaXMuX3o9dFsyXSx0WzNdIT09dm9pZCAwJiYodGhpcy5fb3JkZXI9dFszXSksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5feCx0W2UrMV09dGhpcy5feSx0W2UrMl09dGhpcy5feix0W2UrM109dGhpcy5fb3JkZXIsdH1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX29yZGVyfX14aS5ERUZBVUxUX09SREVSPSJYWVoiO2NsYXNzIGp1e2NvbnN0cnVjdG9yKCl7dGhpcy5tYXNrPTF9c2V0KHQpe3RoaXMubWFzaz0oMTw8dHwwKT4+PjB9ZW5hYmxlKHQpe3RoaXMubWFza3w9MTw8dHwwfWVuYWJsZUFsbCgpe3RoaXMubWFzaz0tMX10b2dnbGUodCl7dGhpcy5tYXNrXj0xPDx0fDB9ZGlzYWJsZSh0KXt0aGlzLm1hc2smPX4oMTw8dHwwKX1kaXNhYmxlQWxsKCl7dGhpcy5tYXNrPTB9dGVzdCh0KXtyZXR1cm4odGhpcy5tYXNrJnQubWFzaykhPT0wfWlzRW5hYmxlZCh0KXtyZXR1cm4odGhpcy5tYXNrJigxPDx0fDApKSE9PTB9fWxldCBRdT0wO2NvbnN0IE1jPW5ldyBULE9uPW5ldyB5aSx6ZT1uZXcgc3QsaHM9bmV3IFQsd2k9bmV3IFQsS3U9bmV3IFQsdGY9bmV3IHlpLEFjPW5ldyBUKDEsMCwwKSxfYz1uZXcgVCgwLDEsMCksU2M9bmV3IFQoMCwwLDEpLHZjPXt0eXBlOiJhZGRlZCJ9LGVmPXt0eXBlOiJyZW1vdmVkIn0sRG49e3R5cGU6ImNoaWxkYWRkZWQiLGNoaWxkOm51bGx9LGNvPXt0eXBlOiJjaGlsZHJlbW92ZWQiLGNoaWxkOm51bGx9O2NsYXNzIFRlIGV4dGVuZHMgaXN7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNPYmplY3QzRD0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpRdSsrfSksdGhpcy51dWlkPUJuKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iT2JqZWN0M0QiLHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnVwPVRlLkRFRkFVTFRfVVAuY2xvbmUoKTtjb25zdCB0PW5ldyBULGU9bmV3IHhpLG49bmV3IHlpLHM9bmV3IFQoMSwxLDEpO2Z1bmN0aW9uIHIoKXtuLnNldEZyb21FdWxlcihlLCExKX1mdW5jdGlvbiBvKCl7ZS5zZXRGcm9tUXVhdGVybmlvbihuLHZvaWQgMCwhMSl9ZS5fb25DaGFuZ2Uociksbi5fb25DaGFuZ2UobyksT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cG9zaXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnR9LHJvdGF0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTplfSxxdWF0ZXJuaW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpufSxzY2FsZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6c30sbW9kZWxWaWV3TWF0cml4Ont2YWx1ZTpuZXcgc3R9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3IGdlfX0pLHRoaXMubWF0cml4PW5ldyBzdCx0aGlzLm1hdHJpeFdvcmxkPW5ldyBzdCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9VGUuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9VGUuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHRoaXMubGF5ZXJzPW5ldyBqdSx0aGlzLnZpc2libGU9ITAsdGhpcy5jYXN0U2hhZG93PSExLHRoaXMucmVjZWl2ZVNoYWRvdz0hMSx0aGlzLmZydXN0dW1DdWxsZWQ9ITAsdGhpcy5yZW5kZXJPcmRlcj0wLHRoaXMuYW5pbWF0aW9ucz1bXSx0aGlzLmN1c3RvbURlcHRoTWF0ZXJpYWw9dm9pZCAwLHRoaXMuY3VzdG9tRGlzdGFuY2VNYXRlcmlhbD12b2lkIDAsdGhpcy51c2VyRGF0YT17fX1vbkJlZm9yZVNoYWRvdygpe31vbkFmdGVyU2hhZG93KCl7fW9uQmVmb3JlUmVuZGVyKCl7fW9uQWZ0ZXJSZW5kZXIoKXt9YXBwbHlNYXRyaXg0KHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeC5wcmVtdWx0aXBseSh0KSx0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9YXBwbHlRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkodCksdGhpc31zZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUodCxlKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh0LGUpfXNldFJvdGF0aW9uRnJvbUV1bGVyKHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIodCwhMCl9c2V0Um90YXRpb25Gcm9tTWF0cml4KHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgodCl9c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbih0KXt0aGlzLnF1YXRlcm5pb24uY29weSh0KX1yb3RhdGVPbkF4aXModCxlKXtyZXR1cm4gT24uc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5tdWx0aXBseShPbiksdGhpc31yb3RhdGVPbldvcmxkQXhpcyh0LGUpe3JldHVybiBPbi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KE9uKSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKEFjLHQpfXJvdGF0ZVkodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKF9jLHQpfXJvdGF0ZVoodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKFNjLHQpfXRyYW5zbGF0ZU9uQXhpcyh0LGUpe3JldHVybiBNYy5jb3B5KHQpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKE1jLm11bHRpcGx5U2NhbGFyKGUpKSx0aGlzfXRyYW5zbGF0ZVgodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKEFjLHQpfXRyYW5zbGF0ZVkodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKF9jLHQpfXRyYW5zbGF0ZVoodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKFNjLHQpfWxvY2FsVG9Xb3JsZCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCl9d29ybGRUb0xvY2FsKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LmFwcGx5TWF0cml4NCh6ZS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKX1sb29rQXQodCxlLG4pe3QuaXNWZWN0b3IzP2hzLmNvcHkodCk6aHMuc2V0KHQsZSxuKTtjb25zdCBzPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHdpLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmlzQ2FtZXJhfHx0aGlzLmlzTGlnaHQ/emUubG9va0F0KHdpLGhzLHRoaXMudXApOnplLmxvb2tBdChocyx3aSx0aGlzLnVwKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KHplKSxzJiYoemUuZXh0cmFjdFJvdGF0aW9uKHMubWF0cml4V29ybGQpLE9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh6ZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KE9uLmludmVydCgpKSl9YWRkKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCBlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0aGlzLmFkZChhcmd1bWVudHNbZV0pO3JldHVybiB0aGlzfXJldHVybiB0PT09dGhpcz8oY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuIix0KSx0aGlzKToodCYmdC5pc09iamVjdDNEPyh0LnJlbW92ZUZyb21QYXJlbnQoKSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LmRpc3BhdGNoRXZlbnQodmMpLERuLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KERuKSxEbi5jaGlsZD1udWxsKTpjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIix0KSx0aGlzKX1yZW1vdmUodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1tuXSk7cmV0dXJuIHRoaXN9Y29uc3QgZT10aGlzLmNoaWxkcmVuLmluZGV4T2YodCk7cmV0dXJuIGUhPT0tMSYmKHQucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbi5zcGxpY2UoZSwxKSx0LmRpc3BhdGNoRXZlbnQoZWYpLGNvLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KGNvKSxjby5jaGlsZD1udWxsKSx0aGlzfXJlbW92ZUZyb21QYXJlbnQoKXtjb25zdCB0PXRoaXMucGFyZW50O3JldHVybiB0IT09bnVsbCYmdC5yZW1vdmUodGhpcyksdGhpc31jbGVhcigpe3JldHVybiB0aGlzLnJlbW92ZSguLi50aGlzLmNoaWxkcmVuKX1hdHRhY2godCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHplLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksdC5wYXJlbnQhPT1udWxsJiYodC5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHplLm11bHRpcGx5KHQucGFyZW50Lm1hdHJpeFdvcmxkKSksdC5hcHBseU1hdHJpeDQoemUpLHQucmVtb3ZlRnJvbVBhcmVudCgpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQudXBkYXRlV29ybGRNYXRyaXgoITEsITApLHQuZGlzcGF0Y2hFdmVudCh2YyksRG4uY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQoRG4pLERuLmNoaWxkPW51bGwsdGhpc31nZXRPYmplY3RCeUlkKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoImlkIix0KX1nZXRPYmplY3RCeU5hbWUodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgibmFtZSIsdCl9Z2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpe2lmKHRoaXNbdF09PT1lKXJldHVybiB0aGlzO2ZvcihsZXQgbj0wLHM9dGhpcy5jaGlsZHJlbi5sZW5ndGg7bjxzO24rKyl7Y29uc3Qgbz10aGlzLmNoaWxkcmVuW25dLmdldE9iamVjdEJ5UHJvcGVydHkodCxlKTtpZihvIT09dm9pZCAwKXJldHVybiBvfX1nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LGUsbj1bXSl7dGhpc1t0XT09PWUmJm4ucHVzaCh0aGlzKTtjb25zdCBzPXRoaXMuY2hpbGRyZW47Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cisrKXNbcl0uZ2V0T2JqZWN0c0J5UHJvcGVydHkodCxlLG4pO3JldHVybiBufWdldFdvcmxkUG9zaXRpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpfWdldFdvcmxkUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2Uod2ksdCxLdSksdH1nZXRXb3JsZFNjYWxlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSh3aSx0Zix0KSx0fWdldFdvcmxkRGlyZWN0aW9uKHQpe3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpO2NvbnN0IGU9dGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50cztyZXR1cm4gdC5zZXQoZVs4XSxlWzldLGVbMTBdKS5ub3JtYWxpemUoKX1yYXljYXN0KCl7fXRyYXZlcnNlKHQpe3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyllW25dLnRyYXZlcnNlKHQpfXRyYXZlcnNlVmlzaWJsZSh0KXtpZih0aGlzLnZpc2libGU9PT0hMSlyZXR1cm47dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAscz1lLmxlbmd0aDtuPHM7bisrKWVbbl0udHJhdmVyc2VWaXNpYmxlKHQpfXRyYXZlcnNlQW5jZXN0b3JzKHQpe2NvbnN0IGU9dGhpcy5wYXJlbnQ7ZSE9PW51bGwmJih0KGUpLGUudHJhdmVyc2VBbmNlc3RvcnModCkpfXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSwodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHx0KSYmKHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPT09ITAmJih0aGlzLnBhcmVudD09PW51bGw/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdD0hMCk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyllW25dLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfXVwZGF0ZVdvcmxkTWF0cml4KHQsZSl7Y29uc3Qgbj10aGlzLnBhcmVudDtpZih0PT09ITAmJm4hPT1udWxsJiZuLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmKHRoaXMucGFyZW50PT09bnVsbD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCkpLGU9PT0hMCl7Y29uc3Qgcz10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKylzW3JdLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciLG49e307ZSYmKHQ9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e30sc2tlbGV0b25zOnt9LGFuaW1hdGlvbnM6e30sbm9kZXM6e319LG4ubWV0YWRhdGE9e3ZlcnNpb246NC42LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7Y29uc3Qgcz17fTtzLnV1aWQ9dGhpcy51dWlkLHMudHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJihzLm5hbWU9dGhpcy5uYW1lKSx0aGlzLmNhc3RTaGFkb3c9PT0hMCYmKHMuY2FzdFNoYWRvdz0hMCksdGhpcy5yZWNlaXZlU2hhZG93PT09ITAmJihzLnJlY2VpdmVTaGFkb3c9ITApLHRoaXMudmlzaWJsZT09PSExJiYocy52aXNpYmxlPSExKSx0aGlzLmZydXN0dW1DdWxsZWQ9PT0hMSYmKHMuZnJ1c3R1bUN1bGxlZD0hMSksdGhpcy5yZW5kZXJPcmRlciE9PTAmJihzLnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYocy51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxzLmxheWVycz10aGlzLmxheWVycy5tYXNrLHMubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKSxzLnVwPXRoaXMudXAudG9BcnJheSgpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT09PSExJiYocy5tYXRyaXhBdXRvVXBkYXRlPSExKSx0aGlzLmlzSW5zdGFuY2VkTWVzaCYmKHMudHlwZT0iSW5zdGFuY2VkTWVzaCIscy5jb3VudD10aGlzLmNvdW50LHMuaW5zdGFuY2VNYXRyaXg9dGhpcy5pbnN0YW5jZU1hdHJpeC50b0pTT04oKSx0aGlzLmluc3RhbmNlQ29sb3IhPT1udWxsJiYocy5pbnN0YW5jZUNvbG9yPXRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKSkpLHRoaXMuaXNCYXRjaGVkTWVzaCYmKHMudHlwZT0iQmF0Y2hlZE1lc2giLHMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD10aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQscy5zb3J0T2JqZWN0cz10aGlzLnNvcnRPYmplY3RzLHMuZHJhd1Jhbmdlcz10aGlzLl9kcmF3UmFuZ2VzLHMucmVzZXJ2ZWRSYW5nZXM9dGhpcy5fcmVzZXJ2ZWRSYW5nZXMscy5nZW9tZXRyeUluZm89dGhpcy5fZ2VvbWV0cnlJbmZvLm1hcChhPT5HZShGdCh7fSxhKSx7Ym91bmRpbmdCb3g6YS5ib3VuZGluZ0JveD97bWluOmEuYm91bmRpbmdCb3gubWluLnRvQXJyYXkoKSxtYXg6YS5ib3VuZGluZ0JveC5tYXgudG9BcnJheSgpfTp2b2lkIDAsYm91bmRpbmdTcGhlcmU6YS5ib3VuZGluZ1NwaGVyZT97cmFkaXVzOmEuYm91bmRpbmdTcGhlcmUucmFkaXVzLGNlbnRlcjphLmJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCl9OnZvaWQgMH0pKSxzLmluc3RhbmNlSW5mbz10aGlzLl9pbnN0YW5jZUluZm8ubWFwKGE9PkZ0KHt9LGEpKSxzLmF2YWlsYWJsZUluc3RhbmNlSWRzPXRoaXMuX2F2YWlsYWJsZUluc3RhbmNlSWRzLnNsaWNlKCkscy5hdmFpbGFibGVHZW9tZXRyeUlkcz10aGlzLl9hdmFpbGFibGVHZW9tZXRyeUlkcy5zbGljZSgpLHMubmV4dEluZGV4U3RhcnQ9dGhpcy5fbmV4dEluZGV4U3RhcnQscy5uZXh0VmVydGV4U3RhcnQ9dGhpcy5fbmV4dFZlcnRleFN0YXJ0LHMuZ2VvbWV0cnlDb3VudD10aGlzLl9nZW9tZXRyeUNvdW50LHMubWF4SW5zdGFuY2VDb3VudD10aGlzLl9tYXhJbnN0YW5jZUNvdW50LHMubWF4VmVydGV4Q291bnQ9dGhpcy5fbWF4VmVydGV4Q291bnQscy5tYXhJbmRleENvdW50PXRoaXMuX21heEluZGV4Q291bnQscy5nZW9tZXRyeUluaXRpYWxpemVkPXRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQscy5tYXRyaWNlc1RleHR1cmU9dGhpcy5fbWF0cmljZXNUZXh0dXJlLnRvSlNPTih0KSxzLmluZGlyZWN0VGV4dHVyZT10aGlzLl9pbmRpcmVjdFRleHR1cmUudG9KU09OKHQpLHRoaXMuX2NvbG9yc1RleHR1cmUhPT1udWxsJiYocy5jb2xvcnNUZXh0dXJlPXRoaXMuX2NvbG9yc1RleHR1cmUudG9KU09OKHQpKSx0aGlzLmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmKHMuYm91bmRpbmdTcGhlcmU9e2NlbnRlcjp0aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCkscmFkaXVzOnRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzfSksdGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJihzLmJvdW5kaW5nQm94PXttaW46dGhpcy5ib3VuZGluZ0JveC5taW4udG9BcnJheSgpLG1heDp0aGlzLmJvdW5kaW5nQm94Lm1heC50b0FycmF5KCl9KSk7ZnVuY3Rpb24gcihhLGMpe3JldHVybiBhW2MudXVpZF09PT12b2lkIDAmJihhW2MudXVpZF09Yy50b0pTT04odCkpLGMudXVpZH1pZih0aGlzLmlzU2NlbmUpdGhpcy5iYWNrZ3JvdW5kJiYodGhpcy5iYWNrZ3JvdW5kLmlzQ29sb3I/cy5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04oKTp0aGlzLmJhY2tncm91bmQuaXNUZXh0dXJlJiYocy5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04odCkudXVpZCkpLHRoaXMuZW52aXJvbm1lbnQmJnRoaXMuZW52aXJvbm1lbnQuaXNUZXh0dXJlJiZ0aGlzLmVudmlyb25tZW50LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSE9PSEwJiYocy5lbnZpcm9ubWVudD10aGlzLmVudmlyb25tZW50LnRvSlNPTih0KS51dWlkKTtlbHNlIGlmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7cy5nZW9tZXRyeT1yKHQuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTtjb25zdCBhPXRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztpZihhIT09dm9pZCAwJiZhLnNoYXBlcyE9PXZvaWQgMCl7Y29uc3QgYz1hLnNoYXBlcztpZihBcnJheS5pc0FycmF5KGMpKWZvcihsZXQgbD0wLGg9Yy5sZW5ndGg7bDxoO2wrKyl7Y29uc3QgdT1jW2xdO3IodC5zaGFwZXMsdSl9ZWxzZSByKHQuc2hhcGVzLGMpfX1pZih0aGlzLmlzU2tpbm5lZE1lc2gmJihzLmJpbmRNb2RlPXRoaXMuYmluZE1vZGUscy5iaW5kTWF0cml4PXRoaXMuYmluZE1hdHJpeC50b0FycmF5KCksdGhpcy5za2VsZXRvbiE9PXZvaWQgMCYmKHIodC5za2VsZXRvbnMsdGhpcy5za2VsZXRvbikscy5za2VsZXRvbj10aGlzLnNrZWxldG9uLnV1aWQpKSx0aGlzLm1hdGVyaWFsIT09dm9pZCAwKWlmKEFycmF5LmlzQXJyYXkodGhpcy5tYXRlcmlhbCkpe2NvbnN0IGE9W107Zm9yKGxldCBjPTAsbD10aGlzLm1hdGVyaWFsLmxlbmd0aDtjPGw7YysrKWEucHVzaChyKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbY10pKTtzLm1hdGVyaWFsPWF9ZWxzZSBzLm1hdGVyaWFsPXIodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYodGhpcy5jaGlsZHJlbi5sZW5ndGg+MCl7cy5jaGlsZHJlbj1bXTtmb3IobGV0IGE9MDthPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2ErKylzLmNoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlblthXS50b0pTT04odCkub2JqZWN0KX1pZih0aGlzLmFuaW1hdGlvbnMubGVuZ3RoPjApe3MuYW5pbWF0aW9ucz1bXTtmb3IobGV0IGE9MDthPHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg7YSsrKXtjb25zdCBjPXRoaXMuYW5pbWF0aW9uc1thXTtzLmFuaW1hdGlvbnMucHVzaChyKHQuYW5pbWF0aW9ucyxjKSl9fWlmKGUpe2NvbnN0IGE9byh0Lmdlb21ldHJpZXMpLGM9byh0Lm1hdGVyaWFscyksbD1vKHQudGV4dHVyZXMpLGg9byh0LmltYWdlcyksdT1vKHQuc2hhcGVzKSxmPW8odC5za2VsZXRvbnMpLGQ9byh0LmFuaW1hdGlvbnMpLHA9byh0Lm5vZGVzKTthLmxlbmd0aD4wJiYobi5nZW9tZXRyaWVzPWEpLGMubGVuZ3RoPjAmJihuLm1hdGVyaWFscz1jKSxsLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1sKSxoLmxlbmd0aD4wJiYobi5pbWFnZXM9aCksdS5sZW5ndGg+MCYmKG4uc2hhcGVzPXUpLGYubGVuZ3RoPjAmJihuLnNrZWxldG9ucz1mKSxkLmxlbmd0aD4wJiYobi5hbmltYXRpb25zPWQpLHAubGVuZ3RoPjAmJihuLm5vZGVzPXApfXJldHVybiBuLm9iamVjdD1zLG47ZnVuY3Rpb24gbyhhKXtjb25zdCBjPVtdO2Zvcihjb25zdCBsIGluIGEpe2NvbnN0IGg9YVtsXTtkZWxldGUgaC5tZXRhZGF0YSxjLnB1c2goaCl9cmV0dXJuIGN9fWNsb25lKHQpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyx0KX1jb3B5KHQsZT0hMCl7aWYodGhpcy5uYW1lPXQubmFtZSx0aGlzLnVwLmNvcHkodC51cCksdGhpcy5wb3NpdGlvbi5jb3B5KHQucG9zaXRpb24pLHRoaXMucm90YXRpb24ub3JkZXI9dC5yb3RhdGlvbi5vcmRlcix0aGlzLnF1YXRlcm5pb24uY29weSh0LnF1YXRlcm5pb24pLHRoaXMuc2NhbGUuY29weSh0LnNjYWxlKSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT10Lm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlLHRoaXMubGF5ZXJzLm1hc2s9dC5sYXllcnMubWFzayx0aGlzLnZpc2libGU9dC52aXNpYmxlLHRoaXMuY2FzdFNoYWRvdz10LmNhc3RTaGFkb3csdGhpcy5yZWNlaXZlU2hhZG93PXQucmVjZWl2ZVNoYWRvdyx0aGlzLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkLHRoaXMucmVuZGVyT3JkZXI9dC5yZW5kZXJPcmRlcix0aGlzLmFuaW1hdGlvbnM9dC5hbmltYXRpb25zLnNsaWNlKCksdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSxlPT09ITApZm9yKGxldCBuPTA7bjx0LmNoaWxkcmVuLmxlbmd0aDtuKyspe2NvbnN0IHM9dC5jaGlsZHJlbltuXTt0aGlzLmFkZChzLmNsb25lKCkpfXJldHVybiB0aGlzfX1UZS5ERUZBVUxUX1VQPW5ldyBUKDAsMSwwKSxUZS5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURT0hMCxUZS5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURT0hMDtjb25zdCBoZT1uZXcgVCxFZT1uZXcgVCxsbz1uZXcgVCxQZT1uZXcgVCwkbj1uZXcgVCxVbj1uZXcgVCx6Yz1uZXcgVCxobz1uZXcgVCx1bz1uZXcgVCxmbz1uZXcgVCxwbz1uZXcgWXQseW89bmV3IFl0LG1vPW5ldyBZdDtjbGFzcyBldHtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQsbj1uZXcgVCl7dGhpcy5hPXQsdGhpcy5iPWUsdGhpcy5jPW59c3RhdGljIGdldE5vcm1hbCh0LGUsbixzKXtzLnN1YlZlY3RvcnMobixlKSxoZS5zdWJWZWN0b3JzKHQsZSkscy5jcm9zcyhoZSk7Y29uc3Qgcj1zLmxlbmd0aFNxKCk7cmV0dXJuIHI+MD9zLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KHIpKTpzLnNldCgwLDAsMCl9c3RhdGljIGdldEJhcnljb29yZCh0LGUsbixzLHIpe2hlLnN1YlZlY3RvcnMocyxlKSxFZS5zdWJWZWN0b3JzKG4sZSksbG8uc3ViVmVjdG9ycyh0LGUpO2NvbnN0IG89aGUuZG90KGhlKSxhPWhlLmRvdChFZSksYz1oZS5kb3QobG8pLGw9RWUuZG90KEVlKSxoPUVlLmRvdChsbyksdT1vKmwtYSphO2lmKHU9PT0wKXJldHVybiByLnNldCgwLDAsMCksbnVsbDtjb25zdCBmPTEvdSxkPShsKmMtYSpoKSpmLHA9KG8qaC1hKmMpKmY7cmV0dXJuIHIuc2V0KDEtZC1wLHAsZCl9c3RhdGljIGNvbnRhaW5zUG9pbnQodCxlLG4scyl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxuLHMsUGUpPT09bnVsbD8hMTpQZS54Pj0wJiZQZS55Pj0wJiZQZS54K1BlLnk8PTF9c3RhdGljIGdldEludGVycG9sYXRpb24odCxlLG4scyxyLG8sYSxjKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLG4scyxQZSk9PT1udWxsPyhjLng9MCxjLnk9MCwieiJpbiBjJiYoYy56PTApLCJ3ImluIGMmJihjLnc9MCksbnVsbCk6KGMuc2V0U2NhbGFyKDApLGMuYWRkU2NhbGVkVmVjdG9yKHIsUGUueCksYy5hZGRTY2FsZWRWZWN0b3IobyxQZS55KSxjLmFkZFNjYWxlZFZlY3RvcihhLFBlLnopLGMpfXN0YXRpYyBnZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUodCxlLG4scyxyLG8pe3JldHVybiBwby5zZXRTY2FsYXIoMCkseW8uc2V0U2NhbGFyKDApLG1vLnNldFNjYWxhcigwKSxwby5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSkseW8uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG4pLG1vLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSxvLnNldFNjYWxhcigwKSxvLmFkZFNjYWxlZFZlY3RvcihwbyxyLngpLG8uYWRkU2NhbGVkVmVjdG9yKHlvLHIueSksby5hZGRTY2FsZWRWZWN0b3IobW8sci56KSxvfXN0YXRpYyBpc0Zyb250RmFjaW5nKHQsZSxuLHMpe3JldHVybiBoZS5zdWJWZWN0b3JzKG4sZSksRWUuc3ViVmVjdG9ycyh0LGUpLGhlLmNyb3NzKEVlKS5kb3Qocyk8MH1zZXQodCxlLG4pe3JldHVybiB0aGlzLmEuY29weSh0KSx0aGlzLmIuY29weShlKSx0aGlzLmMuY29weShuKSx0aGlzfXNldEZyb21Qb2ludHNBbmRJbmRpY2VzKHQsZSxuLHMpe3JldHVybiB0aGlzLmEuY29weSh0W2VdKSx0aGlzLmIuY29weSh0W25dKSx0aGlzLmMuY29weSh0W3NdKSx0aGlzfXNldEZyb21BdHRyaWJ1dGVBbmRJbmRpY2VzKHQsZSxuLHMpe3JldHVybiB0aGlzLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLHRoaXMuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbiksdGhpcy5jLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmEuY29weSh0LmEpLHRoaXMuYi5jb3B5KHQuYiksdGhpcy5jLmNvcHkodC5jKSx0aGlzfWdldEFyZWEoKXtyZXR1cm4gaGUuc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKSxFZS5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLGhlLmNyb3NzKEVlKS5sZW5ndGgoKSouNX1nZXRNaWRwb2ludCh0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9Z2V0Tm9ybWFsKHQpe3JldHVybiBldC5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9Z2V0UGxhbmUodCl7cmV0dXJuIHQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1nZXRCYXJ5Y29vcmQodCxlKXtyZXR1cm4gZXQuZ2V0QmFyeWNvb3JkKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSl9Z2V0SW50ZXJwb2xhdGlvbih0LGUsbixzLHIpe3JldHVybiBldC5nZXRJbnRlcnBvbGF0aW9uKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSxuLHMscil9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gZXQuY29udGFpbnNQb2ludCh0LHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1pc0Zyb250RmFjaW5nKHQpe3JldHVybiBldC5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLHQpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1RyaWFuZ2xlKHRoaXMpfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuYSxzPXRoaXMuYixyPXRoaXMuYztsZXQgbyxhOyRuLnN1YlZlY3RvcnMocyxuKSxVbi5zdWJWZWN0b3JzKHIsbiksaG8uc3ViVmVjdG9ycyh0LG4pO2NvbnN0IGM9JG4uZG90KGhvKSxsPVVuLmRvdChobyk7aWYoYzw9MCYmbDw9MClyZXR1cm4gZS5jb3B5KG4pO3VvLnN1YlZlY3RvcnModCxzKTtjb25zdCBoPSRuLmRvdCh1byksdT1Vbi5kb3QodW8pO2lmKGg+PTAmJnU8PWgpcmV0dXJuIGUuY29weShzKTtjb25zdCBmPWMqdS1oKmw7aWYoZjw9MCYmYz49MCYmaDw9MClyZXR1cm4gbz1jLyhjLWgpLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoJG4sbyk7Zm8uc3ViVmVjdG9ycyh0LHIpO2NvbnN0IGQ9JG4uZG90KGZvKSxwPVVuLmRvdChmbyk7aWYocD49MCYmZDw9cClyZXR1cm4gZS5jb3B5KHIpO2NvbnN0IHk9ZCpsLWMqcDtpZih5PD0wJiZsPj0wJiZwPD0wKXJldHVybiBhPWwvKGwtcCksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihVbixhKTtjb25zdCBtPWgqcC1kKnU7aWYobTw9MCYmdS1oPj0wJiZkLXA+PTApcmV0dXJuIHpjLnN1YlZlY3RvcnMocixzKSxhPSh1LWgpLyh1LWgrKGQtcCkpLGUuY29weShzKS5hZGRTY2FsZWRWZWN0b3IoemMsYSk7Y29uc3QgZz0xLyhtK3krZik7cmV0dXJuIG89eSpnLGE9ZipnLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoJG4sbykuYWRkU2NhbGVkVmVjdG9yKFVuLGEpfWVxdWFscyh0KXtyZXR1cm4gdC5hLmVxdWFscyh0aGlzLmEpJiZ0LmIuZXF1YWxzKHRoaXMuYikmJnQuYy5lcXVhbHModGhpcy5jKX19Y29uc3QgVGM9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0samU9e2g6MCxzOjAsbDowfSx1cz17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIGdvKGksdCxlKXtyZXR1cm4gZTwwJiYoZSs9MSksZT4xJiYoZS09MSksZTwxLzY/aSsodC1pKSo2KmU6ZTwxLzI/dDplPDIvMz9pKyh0LWkpKjYqKDIvMy1lKTppfWxldCBmcz1jbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbil7cmV0dXJuIHRoaXMuaXNDb2xvcj0hMCx0aGlzLnI9MSx0aGlzLmc9MSx0aGlzLmI9MSx0aGlzLnNldCh0LGUsbil9c2V0KHQsZSxuKXtpZihlPT09dm9pZCAwJiZuPT09dm9pZCAwKXtjb25zdCBzPXQ7cyYmcy5pc0NvbG9yP3RoaXMuY29weShzKTp0eXBlb2Ygcz09Im51bWJlciI/dGhpcy5zZXRIZXgocyk6dHlwZW9mIHM9PSJzdHJpbmciJiZ0aGlzLnNldFN0eWxlKHMpfWVsc2UgdGhpcy5zZXRSR0IodCxlLG4pO3JldHVybiB0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPXQsdGhpcy5iPXQsdGhpc31zZXRIZXgodCxlPW9lKXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLHRoaXMucj0odD4+MTYmMjU1KS8yNTUsdGhpcy5nPSh0Pj44JjI1NSkvMjU1LHRoaXMuYj0odCYyNTUpLzI1NSxhZS50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMsZSksdGhpc31zZXRSR0IodCxlLG4scz1hZS53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz1lLHRoaXMuYj1uLGFlLnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxzKSx0aGlzfXNldEhTTCh0LGUsbixzPWFlLndvcmtpbmdDb2xvclNwYWNlKXtpZih0PVV1KHQsMSksZT1aKGUsMCwxKSxuPVoobiwwLDEpLGU9PT0wKXRoaXMucj10aGlzLmc9dGhpcy5iPW47ZWxzZXtjb25zdCByPW48PS41P24qKDErZSk6bitlLW4qZSxvPTIqbi1yO3RoaXMucj1nbyhvLHIsdCsxLzMpLHRoaXMuZz1nbyhvLHIsdCksdGhpcy5iPWdvKG8scix0LTEvMyl9cmV0dXJuIGFlLnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxzKSx0aGlzfXNldFN0eWxlKHQsZT1vZSl7ZnVuY3Rpb24gbihyKXtyIT09dm9pZCAwJiZwYXJzZUZsb2F0KHIpPDEmJmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK3QrIiB3aWxsIGJlIGlnbm9yZWQuIil9bGV0IHM7aWYocz0vXihcdyspXCgoW15cKV0qKVwpLy5leGVjKHQpKXtsZXQgcjtjb25zdCBvPXNbMV0sYT1zWzJdO3N3aXRjaChvKXtjYXNlInJnYiI6Y2FzZSJyZ2JhIjppZihyPS9eXHMqKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4ocls0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbMV0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbMl0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KHJbM10sMTApKS8yNTUsZSk7aWYocj0vXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGEpKXJldHVybiBuKHJbNF0pLHRoaXMuc2V0UkdCKE1hdGgubWluKDEwMCxwYXJzZUludChyWzFdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChyWzJdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChyWzNdLDEwKSkvMTAwLGUpO2JyZWFrO2Nhc2UiaHNsIjpjYXNlImhzbGEiOmlmKHI9L15ccyooXGQqXC4/XGQrKVxzKixccyooXGQqXC4/XGQrKVwlXHMqLFxzKihcZCpcLj9cZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4ocls0XSksdGhpcy5zZXRIU0wocGFyc2VGbG9hdChyWzFdKS8zNjAscGFyc2VGbG9hdChyWzJdKS8xMDAscGFyc2VGbG9hdChyWzNdKS8xMDAsZSk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yIG1vZGVsICIrdCl9fWVsc2UgaWYocz0vXlwjKFtBLUZhLWZcZF0rKSQvLmV4ZWModCkpe2NvbnN0IHI9c1sxXSxvPXIubGVuZ3RoO2lmKG89PT0zKXJldHVybiB0aGlzLnNldFJHQihwYXJzZUludChyLmNoYXJBdCgwKSwxNikvMTUscGFyc2VJbnQoci5jaGFyQXQoMSksMTYpLzE1LHBhcnNlSW50KHIuY2hhckF0KDIpLDE2KS8xNSxlKTtpZihvPT09NilyZXR1cm4gdGhpcy5zZXRIZXgocGFyc2VJbnQociwxNiksZSk7Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogSW52YWxpZCBoZXggY29sb3IgIit0KX1lbHNlIGlmKHQmJnQubGVuZ3RoPjApcmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKHQsZSk7cmV0dXJuIHRoaXN9c2V0Q29sb3JOYW1lKHQsZT1vZSl7Y29uc3Qgbj1UY1t0LnRvTG93ZXJDYXNlKCldO3JldHVybiBuIT09dm9pZCAwP3RoaXMuc2V0SGV4KG4sZSk6Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAiK3QpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfWNvcHkodCl7cmV0dXJuIHRoaXMucj10LnIsdGhpcy5nPXQuZyx0aGlzLmI9dC5iLHRoaXN9Y29weVNSR0JUb0xpbmVhcih0KXtyZXR1cm4gdGhpcy5yPV9lKHQuciksdGhpcy5nPV9lKHQuZyksdGhpcy5iPV9lKHQuYiksdGhpc31jb3B5TGluZWFyVG9TUkdCKHQpe3JldHVybiB0aGlzLnI9Rm4odC5yKSx0aGlzLmc9Rm4odC5nKSx0aGlzLmI9Rm4odC5iKSx0aGlzfWNvbnZlcnRTUkdCVG9MaW5lYXIoKXtyZXR1cm4gdGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpLHRoaXN9Y29udmVydExpbmVhclRvU1JHQigpe3JldHVybiB0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyksdGhpc31nZXRIZXgodD1vZSl7cmV0dXJuIGFlLmZyb21Xb3JraW5nQ29sb3JTcGFjZShfdC5jb3B5KHRoaXMpLHQpLE1hdGgucm91bmQoWihfdC5yKjI1NSwwLDI1NSkpKjY1NTM2K01hdGgucm91bmQoWihfdC5nKjI1NSwwLDI1NSkpKjI1NitNYXRoLnJvdW5kKFooX3QuYioyNTUsMCwyNTUpKX1nZXRIZXhTdHJpbmcodD1vZSl7cmV0dXJuKCIwMDAwMDAiK3RoaXMuZ2V0SGV4KHQpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpfWdldEhTTCh0LGU9YWUud29ya2luZ0NvbG9yU3BhY2Upe2FlLmZyb21Xb3JraW5nQ29sb3JTcGFjZShfdC5jb3B5KHRoaXMpLGUpO2NvbnN0IG49X3QucixzPV90Lmcscj1fdC5iLG89TWF0aC5tYXgobixzLHIpLGE9TWF0aC5taW4obixzLHIpO2xldCBjLGw7Y29uc3QgaD0oYStvKS8yO2lmKGE9PT1vKWM9MCxsPTA7ZWxzZXtjb25zdCB1PW8tYTtzd2l0Y2gobD1oPD0uNT91LyhvK2EpOnUvKDItby1hKSxvKXtjYXNlIG46Yz0ocy1yKS91KyhzPHI/NjowKTticmVhaztjYXNlIHM6Yz0oci1uKS91KzI7YnJlYWs7Y2FzZSByOmM9KG4tcykvdSs0O2JyZWFrfWMvPTZ9cmV0dXJuIHQuaD1jLHQucz1sLHQubD1oLHR9Z2V0UkdCKHQsZT1hZS53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIGFlLmZyb21Xb3JraW5nQ29sb3JTcGFjZShfdC5jb3B5KHRoaXMpLGUpLHQucj1fdC5yLHQuZz1fdC5nLHQuYj1fdC5iLHR9Z2V0U3R5bGUodD1vZSl7YWUuZnJvbVdvcmtpbmdDb2xvclNwYWNlKF90LmNvcHkodGhpcyksdCk7Y29uc3QgZT1fdC5yLG49X3QuZyxzPV90LmI7cmV0dXJuIHQhPT1vZT9gY29sb3IoJHt0fSAke2UudG9GaXhlZCgzKX0gJHtuLnRvRml4ZWQoMyl9ICR7cy50b0ZpeGVkKDMpfSlgOmByZ2IoJHtNYXRoLnJvdW5kKGUqMjU1KX0sJHtNYXRoLnJvdW5kKG4qMjU1KX0sJHtNYXRoLnJvdW5kKHMqMjU1KX0pYH1vZmZzZXRIU0wodCxlLG4pe3JldHVybiB0aGlzLmdldEhTTChqZSksdGhpcy5zZXRIU0woamUuaCt0LGplLnMrZSxqZS5sK24pfWFkZCh0KXtyZXR1cm4gdGhpcy5yKz10LnIsdGhpcy5nKz10LmcsdGhpcy5iKz10LmIsdGhpc31hZGRDb2xvcnModCxlKXtyZXR1cm4gdGhpcy5yPXQucitlLnIsdGhpcy5nPXQuZytlLmcsdGhpcy5iPXQuYitlLmIsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMucis9dCx0aGlzLmcrPXQsdGhpcy5iKz10LHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLnI9TWF0aC5tYXgoMCx0aGlzLnItdC5yKSx0aGlzLmc9TWF0aC5tYXgoMCx0aGlzLmctdC5nKSx0aGlzLmI9TWF0aC5tYXgoMCx0aGlzLmItdC5iKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLnIqPXQucix0aGlzLmcqPXQuZyx0aGlzLmIqPXQuYix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLnIqPXQsdGhpcy5nKj10LHRoaXMuYio9dCx0aGlzfWxlcnAodCxlKXtyZXR1cm4gdGhpcy5yKz0odC5yLXRoaXMucikqZSx0aGlzLmcrPSh0LmctdGhpcy5nKSplLHRoaXMuYis9KHQuYi10aGlzLmIpKmUsdGhpc31sZXJwQ29sb3JzKHQsZSxuKXtyZXR1cm4gdGhpcy5yPXQucisoZS5yLXQucikqbix0aGlzLmc9dC5nKyhlLmctdC5nKSpuLHRoaXMuYj10LmIrKGUuYi10LmIpKm4sdGhpc31sZXJwSFNMKHQsZSl7dGhpcy5nZXRIU0woamUpLHQuZ2V0SFNMKHVzKTtjb25zdCBuPWpyKGplLmgsdXMuaCxlKSxzPWpyKGplLnMsdXMucyxlKSxyPWpyKGplLmwsdXMubCxlKTtyZXR1cm4gdGhpcy5zZXRIU0wobixzLHIpLHRoaXN9c2V0RnJvbVZlY3RvcjModCl7cmV0dXJuIHRoaXMucj10LngsdGhpcy5nPXQueSx0aGlzLmI9dC56LHRoaXN9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy5yLG49dGhpcy5nLHM9dGhpcy5iLHI9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5yPXJbMF0qZStyWzNdKm4rcls2XSpzLHRoaXMuZz1yWzFdKmUrcls0XSpuK3JbN10qcyx0aGlzLmI9clsyXSplK3JbNV0qbityWzhdKnMsdGhpc31lcXVhbHModCl7cmV0dXJuIHQucj09PXRoaXMuciYmdC5nPT09dGhpcy5nJiZ0LmI9PT10aGlzLmJ9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5yPXRbZV0sdGhpcy5nPXRbZSsxXSx0aGlzLmI9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5yLHRbZSsxXT10aGlzLmcsdFtlKzJdPXRoaXMuYix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5yPXQuZ2V0WChlKSx0aGlzLmc9dC5nZXRZKGUpLHRoaXMuYj10LmdldFooZSksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX0qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLnIseWllbGQgdGhpcy5nLHlpZWxkIHRoaXMuYn19O2NvbnN0IF90PW5ldyBmcztmcy5OQU1FUz1UYztsZXQgbmY9MDtjbGFzcyBzZiBleHRlbmRzIGlze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzTWF0ZXJpYWw9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6bmYrK30pLHRoaXMudXVpZD1CbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik1hdGVyaWFsIix0aGlzLmJsZW5kaW5nPTEsdGhpcy5zaWRlPTAsdGhpcy52ZXJ0ZXhDb2xvcnM9ITEsdGhpcy5vcGFjaXR5PTEsdGhpcy50cmFuc3BhcmVudD0hMSx0aGlzLmFscGhhSGFzaD0hMSx0aGlzLmJsZW5kU3JjPTIwNCx0aGlzLmJsZW5kRHN0PTIwNSx0aGlzLmJsZW5kRXF1YXRpb249MTAwLHRoaXMuYmxlbmRTcmNBbHBoYT1udWxsLHRoaXMuYmxlbmREc3RBbHBoYT1udWxsLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPW51bGwsdGhpcy5ibGVuZENvbG9yPW5ldyBmcygwLDAsMCksdGhpcy5ibGVuZEFscGhhPTAsdGhpcy5kZXB0aEZ1bmM9Myx0aGlzLmRlcHRoVGVzdD0hMCx0aGlzLmRlcHRoV3JpdGU9ITAsdGhpcy5zdGVuY2lsV3JpdGVNYXNrPTI1NSx0aGlzLnN0ZW5jaWxGdW5jPTUxOSx0aGlzLnN0ZW5jaWxSZWY9MCx0aGlzLnN0ZW5jaWxGdW5jTWFzaz0yNTUsdGhpcy5zdGVuY2lsRmFpbD03NjgwLHRoaXMuc3RlbmNpbFpGYWlsPTc2ODAsdGhpcy5zdGVuY2lsWlBhc3M9NzY4MCx0aGlzLnN0ZW5jaWxXcml0ZT0hMSx0aGlzLmNsaXBwaW5nUGxhbmVzPW51bGwsdGhpcy5jbGlwSW50ZXJzZWN0aW9uPSExLHRoaXMuY2xpcFNoYWRvd3M9ITEsdGhpcy5zaGFkb3dTaWRlPW51bGwsdGhpcy5jb2xvcldyaXRlPSEwLHRoaXMucHJlY2lzaW9uPW51bGwsdGhpcy5wb2x5Z29uT2Zmc2V0PSExLHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj0wLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPTAsdGhpcy5kaXRoZXJpbmc9ITEsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9ITEsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9ITEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9ITEsdGhpcy5hbGxvd092ZXJyaWRlPSEwLHRoaXMudmlzaWJsZT0hMCx0aGlzLnRvbmVNYXBwZWQ9ITAsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLl9hbHBoYVRlc3Q9MH1nZXQgYWxwaGFUZXN0KCl7cmV0dXJuIHRoaXMuX2FscGhhVGVzdH1zZXQgYWxwaGFUZXN0KHQpe3RoaXMuX2FscGhhVGVzdD4wIT10PjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX2FscGhhVGVzdD10fW9uQmVmb3JlUmVuZGVyKCl7fW9uQmVmb3JlQ29tcGlsZSgpe31jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKXtyZXR1cm4gdGhpcy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKX1zZXRWYWx1ZXModCl7aWYodCE9PXZvaWQgMClmb3IoY29uc3QgZSBpbiB0KXtjb25zdCBuPXRbZV07aWYobj09PXZvaWQgMCl7Y29uc29sZS53YXJuKGBUSFJFRS5NYXRlcmlhbDogcGFyYW1ldGVyICcke2V9JyBoYXMgdmFsdWUgb2YgdW5kZWZpbmVkLmApO2NvbnRpbnVlfWNvbnN0IHM9dGhpc1tlXTtpZihzPT09dm9pZCAwKXtjb25zb2xlLndhcm4oYFRIUkVFLk1hdGVyaWFsOiAnJHtlfScgaXMgbm90IGEgcHJvcGVydHkgb2YgVEhSRUUuJHt0aGlzLnR5cGV9LmApO2NvbnRpbnVlfXMmJnMuaXNDb2xvcj9zLnNldChuKTpzJiZzLmlzVmVjdG9yMyYmbiYmbi5pc1ZlY3RvcjM/cy5jb3B5KG4pOnRoaXNbZV09bn19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciO2UmJih0PXt0ZXh0dXJlczp7fSxpbWFnZXM6e319KTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O24udXVpZD10aGlzLnV1aWQsbi50eXBlPXRoaXMudHlwZSx0aGlzLm5hbWUhPT0iIiYmKG4ubmFtZT10aGlzLm5hbWUpLHRoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKG4uY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSksdGhpcy5yb3VnaG5lc3MhPT12b2lkIDAmJihuLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyksdGhpcy5tZXRhbG5lc3MhPT12b2lkIDAmJihuLm1ldGFsbmVzcz10aGlzLm1ldGFsbmVzcyksdGhpcy5zaGVlbiE9PXZvaWQgMCYmKG4uc2hlZW49dGhpcy5zaGVlbiksdGhpcy5zaGVlbkNvbG9yJiZ0aGlzLnNoZWVuQ29sb3IuaXNDb2xvciYmKG4uc2hlZW5Db2xvcj10aGlzLnNoZWVuQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2hlZW5Sb3VnaG5lc3MhPT12b2lkIDAmJihuLnNoZWVuUm91Z2huZXNzPXRoaXMuc2hlZW5Sb3VnaG5lc3MpLHRoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKG4uZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSksdGhpcy5lbWlzc2l2ZUludGVuc2l0eSE9PXZvaWQgMCYmdGhpcy5lbWlzc2l2ZUludGVuc2l0eSE9PTEmJihuLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXImJnRoaXMuc3BlY3VsYXIuaXNDb2xvciYmKG4uc3BlY3VsYXI9dGhpcy5zcGVjdWxhci5nZXRIZXgoKSksdGhpcy5zcGVjdWxhckludGVuc2l0eSE9PXZvaWQgMCYmKG4uc3BlY3VsYXJJbnRlbnNpdHk9dGhpcy5zcGVjdWxhckludGVuc2l0eSksdGhpcy5zcGVjdWxhckNvbG9yJiZ0aGlzLnNwZWN1bGFyQ29sb3IuaXNDb2xvciYmKG4uc3BlY3VsYXJDb2xvcj10aGlzLnNwZWN1bGFyQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2hpbmluZXNzIT09dm9pZCAwJiYobi5zaGluaW5lc3M9dGhpcy5zaGluaW5lc3MpLHRoaXMuY2xlYXJjb2F0IT09dm9pZCAwJiYobi5jbGVhcmNvYXQ9dGhpcy5jbGVhcmNvYXQpLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzIT09dm9pZCAwJiYobi5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MpLHRoaXMuY2xlYXJjb2F0TWFwJiZ0aGlzLmNsZWFyY29hdE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE1hcD10aGlzLmNsZWFyY29hdE1hcC50b0pTT04odCkudXVpZCksdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJnRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0Um91Z2huZXNzTWFwPXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCYmdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXROb3JtYWxNYXA9dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5jbGVhcmNvYXROb3JtYWxTY2FsZT10aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKSksdGhpcy5kaXNwZXJzaW9uIT09dm9pZCAwJiYobi5kaXNwZXJzaW9uPXRoaXMuZGlzcGVyc2lvbiksdGhpcy5pcmlkZXNjZW5jZSE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2U9dGhpcy5pcmlkZXNjZW5jZSksdGhpcy5pcmlkZXNjZW5jZUlPUiE9PXZvaWQgMCYmKG4uaXJpZGVzY2VuY2VJT1I9dGhpcy5pcmlkZXNjZW5jZUlPUiksdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPXRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSksdGhpcy5pcmlkZXNjZW5jZU1hcCYmdGhpcy5pcmlkZXNjZW5jZU1hcC5pc1RleHR1cmUmJihuLmlyaWRlc2NlbmNlTWFwPXRoaXMuaXJpZGVzY2VuY2VNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAmJnRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD10aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmFuaXNvdHJvcHkhPT12b2lkIDAmJihuLmFuaXNvdHJvcHk9dGhpcy5hbmlzb3Ryb3B5KSx0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbiE9PXZvaWQgMCYmKG4uYW5pc290cm9weVJvdGF0aW9uPXRoaXMuYW5pc290cm9weVJvdGF0aW9uKSx0aGlzLmFuaXNvdHJvcHlNYXAmJnRoaXMuYW5pc290cm9weU1hcC5pc1RleHR1cmUmJihuLmFuaXNvdHJvcHlNYXA9dGhpcy5hbmlzb3Ryb3B5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYobi5tYXA9dGhpcy5tYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihuLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04odCkudXVpZCksdGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihuLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYobi5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTih0KS51dWlkLG4ubGlnaHRNYXBJbnRlbnNpdHk9dGhpcy5saWdodE1hcEludGVuc2l0eSksdGhpcy5hb01hcCYmdGhpcy5hb01hcC5pc1RleHR1cmUmJihuLmFvTWFwPXRoaXMuYW9NYXAudG9KU09OKHQpLnV1aWQsbi5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KSx0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihuLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTih0KS51dWlkLG4uYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKSx0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYobi5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxuLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYobi5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKHQpLnV1aWQsbi5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLG4uZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpLHRoaXMucm91Z2huZXNzTWFwJiZ0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUmJihuLnJvdWdobmVzc01hcD10aGlzLnJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5tZXRhbG5lc3NNYXAmJnRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSYmKG4ubWV0YWxuZXNzTWFwPXRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVtaXNzaXZlTWFwJiZ0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSYmKG4uZW1pc3NpdmVNYXA9dGhpcy5lbWlzc2l2ZU1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhck1hcCYmdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyTWFwPXRoaXMuc3BlY3VsYXJNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJnRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhckludGVuc2l0eU1hcD10aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFyQ29sb3JNYXAmJnRoaXMuc3BlY3VsYXJDb2xvck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyQ29sb3JNYXA9dGhpcy5zcGVjdWxhckNvbG9yTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYobi5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKHQpLnV1aWQsdGhpcy5jb21iaW5lIT09dm9pZCAwJiYobi5jb21iaW5lPXRoaXMuY29tYmluZSkpLHRoaXMuZW52TWFwUm90YXRpb24hPT12b2lkIDAmJihuLmVudk1hcFJvdGF0aW9uPXRoaXMuZW52TWFwUm90YXRpb24udG9BcnJheSgpKSx0aGlzLmVudk1hcEludGVuc2l0eSE9PXZvaWQgMCYmKG4uZW52TWFwSW50ZW5zaXR5PXRoaXMuZW52TWFwSW50ZW5zaXR5KSx0aGlzLnJlZmxlY3Rpdml0eSE9PXZvaWQgMCYmKG4ucmVmbGVjdGl2aXR5PXRoaXMucmVmbGVjdGl2aXR5KSx0aGlzLnJlZnJhY3Rpb25SYXRpbyE9PXZvaWQgMCYmKG4ucmVmcmFjdGlvblJhdGlvPXRoaXMucmVmcmFjdGlvblJhdGlvKSx0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKG4uZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04odCkudXVpZCksdGhpcy50cmFuc21pc3Npb24hPT12b2lkIDAmJihuLnRyYW5zbWlzc2lvbj10aGlzLnRyYW5zbWlzc2lvbiksdGhpcy50cmFuc21pc3Npb25NYXAmJnRoaXMudHJhbnNtaXNzaW9uTWFwLmlzVGV4dHVyZSYmKG4udHJhbnNtaXNzaW9uTWFwPXRoaXMudHJhbnNtaXNzaW9uTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnRoaWNrbmVzcyE9PXZvaWQgMCYmKG4udGhpY2tuZXNzPXRoaXMudGhpY2tuZXNzKSx0aGlzLnRoaWNrbmVzc01hcCYmdGhpcy50aGlja25lc3NNYXAuaXNUZXh0dXJlJiYobi50aGlja25lc3NNYXA9dGhpcy50aGlja25lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSE9PXZvaWQgMCYmdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlIT09MS8wJiYobi5hdHRlbnVhdGlvbkRpc3RhbmNlPXRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSksdGhpcy5hdHRlbnVhdGlvbkNvbG9yIT09dm9pZCAwJiYobi5hdHRlbnVhdGlvbkNvbG9yPXRoaXMuYXR0ZW51YXRpb25Db2xvci5nZXRIZXgoKSksdGhpcy5zaXplIT09dm9pZCAwJiYobi5zaXplPXRoaXMuc2l6ZSksdGhpcy5zaGFkb3dTaWRlIT09bnVsbCYmKG4uc2hhZG93U2lkZT10aGlzLnNoYWRvd1NpZGUpLHRoaXMuc2l6ZUF0dGVudWF0aW9uIT09dm9pZCAwJiYobi5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pLHRoaXMuYmxlbmRpbmchPT0xJiYobi5ibGVuZGluZz10aGlzLmJsZW5kaW5nKSx0aGlzLnNpZGUhPT0wJiYobi5zaWRlPXRoaXMuc2lkZSksdGhpcy52ZXJ0ZXhDb2xvcnM9PT0hMCYmKG4udmVydGV4Q29sb3JzPSEwKSx0aGlzLm9wYWNpdHk8MSYmKG4ub3BhY2l0eT10aGlzLm9wYWNpdHkpLHRoaXMudHJhbnNwYXJlbnQ9PT0hMCYmKG4udHJhbnNwYXJlbnQ9ITApLHRoaXMuYmxlbmRTcmMhPT0yMDQmJihuLmJsZW5kU3JjPXRoaXMuYmxlbmRTcmMpLHRoaXMuYmxlbmREc3QhPT0yMDUmJihuLmJsZW5kRHN0PXRoaXMuYmxlbmREc3QpLHRoaXMuYmxlbmRFcXVhdGlvbiE9PTEwMCYmKG4uYmxlbmRFcXVhdGlvbj10aGlzLmJsZW5kRXF1YXRpb24pLHRoaXMuYmxlbmRTcmNBbHBoYSE9PW51bGwmJihuLmJsZW5kU3JjQWxwaGE9dGhpcy5ibGVuZFNyY0FscGhhKSx0aGlzLmJsZW5kRHN0QWxwaGEhPT1udWxsJiYobi5ibGVuZERzdEFscGhhPXRoaXMuYmxlbmREc3RBbHBoYSksdGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEhPT1udWxsJiYobi5ibGVuZEVxdWF0aW9uQWxwaGE9dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEpLHRoaXMuYmxlbmRDb2xvciYmdGhpcy5ibGVuZENvbG9yLmlzQ29sb3ImJihuLmJsZW5kQ29sb3I9dGhpcy5ibGVuZENvbG9yLmdldEhleCgpKSx0aGlzLmJsZW5kQWxwaGEhPT0wJiYobi5ibGVuZEFscGhhPXRoaXMuYmxlbmRBbHBoYSksdGhpcy5kZXB0aEZ1bmMhPT0zJiYobi5kZXB0aEZ1bmM9dGhpcy5kZXB0aEZ1bmMpLHRoaXMuZGVwdGhUZXN0PT09ITEmJihuLmRlcHRoVGVzdD10aGlzLmRlcHRoVGVzdCksdGhpcy5kZXB0aFdyaXRlPT09ITEmJihuLmRlcHRoV3JpdGU9dGhpcy5kZXB0aFdyaXRlKSx0aGlzLmNvbG9yV3JpdGU9PT0hMSYmKG4uY29sb3JXcml0ZT10aGlzLmNvbG9yV3JpdGUpLHRoaXMuc3RlbmNpbFdyaXRlTWFzayE9PTI1NSYmKG4uc3RlbmNpbFdyaXRlTWFzaz10aGlzLnN0ZW5jaWxXcml0ZU1hc2spLHRoaXMuc3RlbmNpbEZ1bmMhPT01MTkmJihuLnN0ZW5jaWxGdW5jPXRoaXMuc3RlbmNpbEZ1bmMpLHRoaXMuc3RlbmNpbFJlZiE9PTAmJihuLnN0ZW5jaWxSZWY9dGhpcy5zdGVuY2lsUmVmKSx0aGlzLnN0ZW5jaWxGdW5jTWFzayE9PTI1NSYmKG4uc3RlbmNpbEZ1bmNNYXNrPXRoaXMuc3RlbmNpbEZ1bmNNYXNrKSx0aGlzLnN0ZW5jaWxGYWlsIT09NzY4MCYmKG4uc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbCksdGhpcy5zdGVuY2lsWkZhaWwhPT03NjgwJiYobi5zdGVuY2lsWkZhaWw9dGhpcy5zdGVuY2lsWkZhaWwpLHRoaXMuc3RlbmNpbFpQYXNzIT09NzY4MCYmKG4uc3RlbmNpbFpQYXNzPXRoaXMuc3RlbmNpbFpQYXNzKSx0aGlzLnN0ZW5jaWxXcml0ZT09PSEwJiYobi5zdGVuY2lsV3JpdGU9dGhpcy5zdGVuY2lsV3JpdGUpLHRoaXMucm90YXRpb24hPT12b2lkIDAmJnRoaXMucm90YXRpb24hPT0wJiYobi5yb3RhdGlvbj10aGlzLnJvdGF0aW9uKSx0aGlzLnBvbHlnb25PZmZzZXQ9PT0hMCYmKG4ucG9seWdvbk9mZnNldD0hMCksdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yIT09MCYmKG4ucG9seWdvbk9mZnNldEZhY3Rvcj10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IpLHRoaXMucG9seWdvbk9mZnNldFVuaXRzIT09MCYmKG4ucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldFVuaXRzKSx0aGlzLmxpbmV3aWR0aCE9PXZvaWQgMCYmdGhpcy5saW5ld2lkdGghPT0xJiYobi5saW5ld2lkdGg9dGhpcy5saW5ld2lkdGgpLHRoaXMuZGFzaFNpemUhPT12b2lkIDAmJihuLmRhc2hTaXplPXRoaXMuZGFzaFNpemUpLHRoaXMuZ2FwU2l6ZSE9PXZvaWQgMCYmKG4uZ2FwU2l6ZT10aGlzLmdhcFNpemUpLHRoaXMuc2NhbGUhPT12b2lkIDAmJihuLnNjYWxlPXRoaXMuc2NhbGUpLHRoaXMuZGl0aGVyaW5nPT09ITAmJihuLmRpdGhlcmluZz0hMCksdGhpcy5hbHBoYVRlc3Q+MCYmKG4uYWxwaGFUZXN0PXRoaXMuYWxwaGFUZXN0KSx0aGlzLmFscGhhSGFzaD09PSEwJiYobi5hbHBoYUhhc2g9ITApLHRoaXMuYWxwaGFUb0NvdmVyYWdlPT09ITAmJihuLmFscGhhVG9Db3ZlcmFnZT0hMCksdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9PT0hMCYmKG4ucHJlbXVsdGlwbGllZEFscGhhPSEwKSx0aGlzLmZvcmNlU2luZ2xlUGFzcz09PSEwJiYobi5mb3JjZVNpbmdsZVBhc3M9ITApLHRoaXMud2lyZWZyYW1lPT09ITAmJihuLndpcmVmcmFtZT0hMCksdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg+MSYmKG4ud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKSx0aGlzLndpcmVmcmFtZUxpbmVjYXAhPT0icm91bmQiJiYobi53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCksdGhpcy53aXJlZnJhbWVMaW5lam9pbiE9PSJyb3VuZCImJihuLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pLHRoaXMuZmxhdFNoYWRpbmc9PT0hMCYmKG4uZmxhdFNoYWRpbmc9ITApLHRoaXMudmlzaWJsZT09PSExJiYobi52aXNpYmxlPSExKSx0aGlzLnRvbmVNYXBwZWQ9PT0hMSYmKG4udG9uZU1hcHBlZD0hMSksdGhpcy5mb2c9PT0hMSYmKG4uZm9nPSExKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKG4udXNlckRhdGE9dGhpcy51c2VyRGF0YSk7ZnVuY3Rpb24gcyhyKXtjb25zdCBvPVtdO2Zvcihjb25zdCBhIGluIHIpe2NvbnN0IGM9clthXTtkZWxldGUgYy5tZXRhZGF0YSxvLnB1c2goYyl9cmV0dXJuIG99aWYoZSl7Y29uc3Qgcj1zKHQudGV4dHVyZXMpLG89cyh0LmltYWdlcyk7ci5sZW5ndGg+MCYmKG4udGV4dHVyZXM9ciksby5sZW5ndGg+MCYmKG4uaW1hZ2VzPW8pfXJldHVybiBufWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMubmFtZT10Lm5hbWUsdGhpcy5ibGVuZGluZz10LmJsZW5kaW5nLHRoaXMuc2lkZT10LnNpZGUsdGhpcy52ZXJ0ZXhDb2xvcnM9dC52ZXJ0ZXhDb2xvcnMsdGhpcy5vcGFjaXR5PXQub3BhY2l0eSx0aGlzLnRyYW5zcGFyZW50PXQudHJhbnNwYXJlbnQsdGhpcy5ibGVuZFNyYz10LmJsZW5kU3JjLHRoaXMuYmxlbmREc3Q9dC5ibGVuZERzdCx0aGlzLmJsZW5kRXF1YXRpb249dC5ibGVuZEVxdWF0aW9uLHRoaXMuYmxlbmRTcmNBbHBoYT10LmJsZW5kU3JjQWxwaGEsdGhpcy5ibGVuZERzdEFscGhhPXQuYmxlbmREc3RBbHBoYSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT10LmJsZW5kRXF1YXRpb25BbHBoYSx0aGlzLmJsZW5kQ29sb3IuY29weSh0LmJsZW5kQ29sb3IpLHRoaXMuYmxlbmRBbHBoYT10LmJsZW5kQWxwaGEsdGhpcy5kZXB0aEZ1bmM9dC5kZXB0aEZ1bmMsdGhpcy5kZXB0aFRlc3Q9dC5kZXB0aFRlc3QsdGhpcy5kZXB0aFdyaXRlPXQuZGVwdGhXcml0ZSx0aGlzLnN0ZW5jaWxXcml0ZU1hc2s9dC5zdGVuY2lsV3JpdGVNYXNrLHRoaXMuc3RlbmNpbEZ1bmM9dC5zdGVuY2lsRnVuYyx0aGlzLnN0ZW5jaWxSZWY9dC5zdGVuY2lsUmVmLHRoaXMuc3RlbmNpbEZ1bmNNYXNrPXQuc3RlbmNpbEZ1bmNNYXNrLHRoaXMuc3RlbmNpbEZhaWw9dC5zdGVuY2lsRmFpbCx0aGlzLnN0ZW5jaWxaRmFpbD10LnN0ZW5jaWxaRmFpbCx0aGlzLnN0ZW5jaWxaUGFzcz10LnN0ZW5jaWxaUGFzcyx0aGlzLnN0ZW5jaWxXcml0ZT10LnN0ZW5jaWxXcml0ZTtjb25zdCBlPXQuY2xpcHBpbmdQbGFuZXM7bGV0IG49bnVsbDtpZihlIT09bnVsbCl7Y29uc3Qgcz1lLmxlbmd0aDtuPW5ldyBBcnJheShzKTtmb3IobGV0IHI9MDtyIT09czsrK3IpbltyXT1lW3JdLmNsb25lKCl9cmV0dXJuIHRoaXMuY2xpcHBpbmdQbGFuZXM9bix0aGlzLmNsaXBJbnRlcnNlY3Rpb249dC5jbGlwSW50ZXJzZWN0aW9uLHRoaXMuY2xpcFNoYWRvd3M9dC5jbGlwU2hhZG93cyx0aGlzLnNoYWRvd1NpZGU9dC5zaGFkb3dTaWRlLHRoaXMuY29sb3JXcml0ZT10LmNvbG9yV3JpdGUsdGhpcy5wcmVjaXNpb249dC5wcmVjaXNpb24sdGhpcy5wb2x5Z29uT2Zmc2V0PXQucG9seWdvbk9mZnNldCx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9dC5wb2x5Z29uT2Zmc2V0RmFjdG9yLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPXQucG9seWdvbk9mZnNldFVuaXRzLHRoaXMuZGl0aGVyaW5nPXQuZGl0aGVyaW5nLHRoaXMuYWxwaGFUZXN0PXQuYWxwaGFUZXN0LHRoaXMuYWxwaGFIYXNoPXQuYWxwaGFIYXNoLHRoaXMuYWxwaGFUb0NvdmVyYWdlPXQuYWxwaGFUb0NvdmVyYWdlLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPXQucHJlbXVsdGlwbGllZEFscGhhLHRoaXMuZm9yY2VTaW5nbGVQYXNzPXQuZm9yY2VTaW5nbGVQYXNzLHRoaXMudmlzaWJsZT10LnZpc2libGUsdGhpcy50b25lTWFwcGVkPXQudG9uZU1hcHBlZCx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK319Y2xhc3MgcmYgZXh0ZW5kcyBzZntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoQmFzaWNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBmcygxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuZW52TWFwUm90YXRpb249bmV3IHhpLHRoaXMuY29tYmluZT0wLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLnNwZWN1bGFyTWFwPXQuc3BlY3VsYXJNYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZW52TWFwPXQuZW52TWFwLHRoaXMuZW52TWFwUm90YXRpb24uY29weSh0LmVudk1hcFJvdGF0aW9uKSx0aGlzLmNvbWJpbmU9dC5jb21iaW5lLHRoaXMucmVmbGVjdGl2aXR5PXQucmVmbGVjdGl2aXR5LHRoaXMucmVmcmFjdGlvblJhdGlvPXQucmVmcmFjdGlvblJhdGlvLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMud2lyZWZyYW1lTGluZWNhcD10LndpcmVmcmFtZUxpbmVjYXAsdGhpcy53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNvbnN0IHB0PW5ldyBULGRzPW5ldyBSO2xldCBvZj0wO2NsYXNzIHh0e2NvbnN0cnVjdG9yKHQsZSxuPSExKXtpZihBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7dGhpcy5pc0J1ZmZlckF0dHJpYnV0ZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpvZisrfSksdGhpcy5uYW1lPSIiLHRoaXMuYXJyYXk9dCx0aGlzLml0ZW1TaXplPWUsdGhpcy5jb3VudD10IT09dm9pZCAwP3QubGVuZ3RoL2U6MCx0aGlzLm5vcm1hbGl6ZWQ9bix0aGlzLnVzYWdlPTM1MDQ0LHRoaXMudXBkYXRlUmFuZ2VzPVtdLHRoaXMuZ3B1VHlwZT0xMDE1LHRoaXMudmVyc2lvbj0wfW9uVXBsb2FkQ2FsbGJhY2soKXt9c2V0IG5lZWRzVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy52ZXJzaW9uKyt9c2V0VXNhZ2UodCl7cmV0dXJuIHRoaXMudXNhZ2U9dCx0aGlzfWFkZFVwZGF0ZVJhbmdlKHQsZSl7dGhpcy51cGRhdGVSYW5nZXMucHVzaCh7c3RhcnQ6dCxjb3VudDplfSl9Y2xlYXJVcGRhdGVSYW5nZXMoKXt0aGlzLnVwZGF0ZVJhbmdlcy5sZW5ndGg9MH1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuYXJyYXk9bmV3IHQuYXJyYXkuY29uc3RydWN0b3IodC5hcnJheSksdGhpcy5pdGVtU2l6ZT10Lml0ZW1TaXplLHRoaXMuY291bnQ9dC5jb3VudCx0aGlzLm5vcm1hbGl6ZWQ9dC5ub3JtYWxpemVkLHRoaXMudXNhZ2U9dC51c2FnZSx0aGlzLmdwdVR5cGU9dC5ncHVUeXBlLHRoaXN9Y29weUF0KHQsZSxuKXt0Kj10aGlzLml0ZW1TaXplLG4qPWUuaXRlbVNpemU7Zm9yKGxldCBzPTAscj10aGlzLml0ZW1TaXplO3M8cjtzKyspdGhpcy5hcnJheVt0K3NdPWUuYXJyYXlbbitzXTtyZXR1cm4gdGhpc31jb3B5QXJyYXkodCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQpLHRoaXN9YXBwbHlNYXRyaXgzKHQpe2lmKHRoaXMuaXRlbVNpemU9PT0yKWZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKWRzLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxkcy5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWShlLGRzLngsZHMueSk7ZWxzZSBpZih0aGlzLml0ZW1TaXplPT09Mylmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylwdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSkscHQuYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFlaKGUscHQueCxwdC55LHB0LnopO3JldHVybiB0aGlzfWFwcGx5TWF0cml4NCh0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylwdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSkscHQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUscHQueCxwdC55LHB0LnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKXB0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxwdC5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLHB0LngscHQueSxwdC56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspcHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLHB0LnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLHB0LngscHQueSxwdC56KTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Z2V0Q29tcG9uZW50KHQsZSl7bGV0IG49dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKG49cGkobix0aGlzLmFycmF5KSksbn1zZXRDb21wb25lbnQodCxlLG4pe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihuPUl0KG4sdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplK2VdPW4sdGhpc31nZXRYKHQpe2xldCBlPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1waShlLHRoaXMuYXJyYXkpKSxlfXNldFgodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1JdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV09ZSx0aGlzfWdldFkodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9cGkoZSx0aGlzLmFycmF5KSksZX1zZXRZKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9SXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV09ZSx0aGlzfWdldFoodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9cGkoZSx0aGlzLmFycmF5KSksZX1zZXRaKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9SXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl09ZSx0aGlzfWdldFcodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM107cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9cGkoZSx0aGlzLmFycmF5KSksZX1zZXRXKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9SXQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM109ZSx0aGlzfXNldFhZKHQsZSxuKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPUl0KGUsdGhpcy5hcnJheSksbj1JdChuLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzfXNldFhZWih0LGUsbixzKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPUl0KGUsdGhpcy5hcnJheSksbj1JdChuLHRoaXMuYXJyYXkpLHM9SXQocyx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPWUsdGhpcy5hcnJheVt0KzFdPW4sdGhpcy5hcnJheVt0KzJdPXMsdGhpc31zZXRYWVpXKHQsZSxuLHMscil7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT1JdChlLHRoaXMuYXJyYXkpLG49SXQobix0aGlzLmFycmF5KSxzPUl0KHMsdGhpcy5hcnJheSkscj1JdChyLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzLmFycmF5W3QrMl09cyx0aGlzLmFycmF5W3QrM109cix0aGlzfW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkuY29weSh0aGlzKX10b0pTT04oKXtjb25zdCB0PXtpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LmZyb20odGhpcy5hcnJheSksbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9O3JldHVybiB0aGlzLm5hbWUhPT0iIiYmKHQubmFtZT10aGlzLm5hbWUpLHRoaXMudXNhZ2UhPT0zNTA0NCYmKHQudXNhZ2U9dGhpcy51c2FnZSksdH19Y2xhc3MgYWYgZXh0ZW5kcyB4dHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUsbil9fWNsYXNzIGNmIGV4dGVuZHMgeHR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50MzJBcnJheSh0KSxlLG4pfX1jbGFzcyBDZSBleHRlbmRzIHh0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgRmxvYXQzMkFycmF5KHQpLGUsbil9fWxldCBsZj0wO2NvbnN0IGp0PW5ldyBzdCx4bz1uZXcgVGUsVm49bmV3IFQsVXQ9bmV3IGd0LGJpPW5ldyBndCxidD1uZXcgVDtjbGFzcyB1ZSBleHRlbmRzIGlze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzQnVmZmVyR2VvbWV0cnk9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6bGYrK30pLHRoaXMudXVpZD1CbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9IkJ1ZmZlckdlb21ldHJ5Iix0aGlzLmluZGV4PW51bGwsdGhpcy5pbmRpcmVjdD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSExLHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6MS8wfSx0aGlzLnVzZXJEYXRhPXt9fWdldEluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh9c2V0SW5kZXgodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dGhpcy5pbmRleD1uZXcoVnUodCk/Y2Y6YWYpKHQsMSk6dGhpcy5pbmRleD10LHRoaXN9c2V0SW5kaXJlY3QodCl7cmV0dXJuIHRoaXMuaW5kaXJlY3Q9dCx0aGlzfWdldEluZGlyZWN0KCl7cmV0dXJuIHRoaXMuaW5kaXJlY3R9Z2V0QXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF19c2V0QXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XT1lLHRoaXN9ZGVsZXRlQXR0cmlidXRlKHQpe3JldHVybiBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW3RdLHRoaXN9aGFzQXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF0hPT12b2lkIDB9YWRkR3JvdXAodCxlLG49MCl7dGhpcy5ncm91cHMucHVzaCh7c3RhcnQ6dCxjb3VudDplLG1hdGVyaWFsSW5kZXg6bn0pfWNsZWFyR3JvdXBzKCl7dGhpcy5ncm91cHM9W119c2V0RHJhd1JhbmdlKHQsZSl7dGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dCx0aGlzLmRyYXdSYW5nZS5jb3VudD1lfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtlIT09dm9pZCAwJiYoZS5hcHBseU1hdHJpeDQodCksZS5uZWVkc1VwZGF0ZT0hMCk7Y29uc3Qgbj10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2lmKG4hPT12b2lkIDApe2NvbnN0IHI9bmV3IGdlKCkuZ2V0Tm9ybWFsTWF0cml4KHQpO24uYXBwbHlOb3JtYWxNYXRyaXgociksbi5uZWVkc1VwZGF0ZT0hMH1jb25zdCBzPXRoaXMuYXR0cmlidXRlcy50YW5nZW50O3JldHVybiBzIT09dm9pZCAwJiYocy50cmFuc2Zvcm1EaXJlY3Rpb24odCkscy5uZWVkc1VwZGF0ZT0hMCksdGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksdGhpcy5ib3VuZGluZ1NwaGVyZSE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpc31hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIGp0Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuYXBwbHlNYXRyaXg0KGp0KSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIGp0Lm1ha2VSb3RhdGlvblgodCksdGhpcy5hcHBseU1hdHJpeDQoanQpLHRoaXN9cm90YXRlWSh0KXtyZXR1cm4ganQubWFrZVJvdGF0aW9uWSh0KSx0aGlzLmFwcGx5TWF0cml4NChqdCksdGhpc31yb3RhdGVaKHQpe3JldHVybiBqdC5tYWtlUm90YXRpb25aKHQpLHRoaXMuYXBwbHlNYXRyaXg0KGp0KSx0aGlzfXRyYW5zbGF0ZSh0LGUsbil7cmV0dXJuIGp0Lm1ha2VUcmFuc2xhdGlvbih0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoanQpLHRoaXN9c2NhbGUodCxlLG4pe3JldHVybiBqdC5tYWtlU2NhbGUodCxlLG4pLHRoaXMuYXBwbHlNYXRyaXg0KGp0KSx0aGlzfWxvb2tBdCh0KXtyZXR1cm4geG8ubG9va0F0KHQpLHhvLnVwZGF0ZU1hdHJpeCgpLHRoaXMuYXBwbHlNYXRyaXg0KHhvLm1hdHJpeCksdGhpc31jZW50ZXIoKXtyZXR1cm4gdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihWbikubmVnYXRlKCksdGhpcy50cmFuc2xhdGUoVm4ueCxWbi55LFZuLnopLHRoaXN9c2V0RnJvbVBvaW50cyh0KXtjb25zdCBlPXRoaXMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKGU9PT12b2lkIDApe2NvbnN0IG49W107Zm9yKGxldCBzPTAscj10Lmxlbmd0aDtzPHI7cysrKXtjb25zdCBvPXRbc107bi5wdXNoKG8ueCxvLnksby56fHwwKX10aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBDZShuLDMpKX1lbHNle2NvbnN0IG49TWF0aC5taW4odC5sZW5ndGgsZS5jb3VudCk7Zm9yKGxldCBzPTA7czxuO3MrKyl7Y29uc3Qgcj10W3NdO2Uuc2V0WFlaKHMsci54LHIueSxyLnp8fDApfXQubGVuZ3RoPmUuY291bnQmJmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IEJ1ZmZlciBzaXplIHRvbyBzbWFsbCBmb3IgcG9pbnRzIGRhdGEuIFVzZSAuZGlzcG9zZSgpIGFuZCBjcmVhdGUgYSBuZXcgZ2VvbWV0cnkuIiksZS5uZWVkc1VwZGF0ZT0hMH1yZXR1cm4gdGhpc31jb21wdXRlQm91bmRpbmdCb3goKXt0aGlzLmJvdW5kaW5nQm94PT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IGd0KTtjb25zdCB0PXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbixlPXRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKHQmJnQuaXNHTEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIGJveC4iLHRoaXMpLHRoaXMuYm91bmRpbmdCb3guc2V0KG5ldyBUKC0xLzAsLTEvMCwtMS8wKSxuZXcgVCgxLzAsMS8wLDEvMCkpO3JldHVybn1pZih0IT09dm9pZCAwKXtpZih0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IG49MCxzPWUubGVuZ3RoO248cztuKyspe2NvbnN0IHI9ZVtuXTtVdC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHIpLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU/KGJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5taW4sVXQubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoYnQpLGJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5tYXgsVXQubWF4KSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoYnQpKToodGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFV0Lm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFV0Lm1heCkpfX1lbHNlIHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7KGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLngpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi55KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueikpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7dGhpcy5ib3VuZGluZ1NwaGVyZT09PW51bGwmJih0aGlzLmJvdW5kaW5nU3BoZXJlPW5ldyBpbyk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBzcGhlcmUuIix0aGlzKSx0aGlzLmJvdW5kaW5nU3BoZXJlLnNldChuZXcgVCwxLzApO3JldHVybn1pZih0KXtjb25zdCBuPXRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO2lmKFV0LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IHI9MCxvPWUubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9ZVtyXTtiaS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGEpLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU/KGJ0LmFkZFZlY3RvcnMoVXQubWluLGJpLm1pbiksVXQuZXhwYW5kQnlQb2ludChidCksYnQuYWRkVmVjdG9ycyhVdC5tYXgsYmkubWF4KSxVdC5leHBhbmRCeVBvaW50KGJ0KSk6KFV0LmV4cGFuZEJ5UG9pbnQoYmkubWluKSxVdC5leHBhbmRCeVBvaW50KGJpLm1heCkpfVV0LmdldENlbnRlcihuKTtsZXQgcz0wO2ZvcihsZXQgcj0wLG89dC5jb3VudDtyPG87cisrKWJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxyKSxzPU1hdGgubWF4KHMsbi5kaXN0YW5jZVRvU3F1YXJlZChidCkpO2lmKGUpZm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPWVbcl0sYz10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2ZvcihsZXQgbD0wLGg9YS5jb3VudDtsPGg7bCsrKWJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxsKSxjJiYoVm4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGwpLGJ0LmFkZChWbikpLHM9TWF0aC5tYXgocyxuLmRpc3RhbmNlVG9TcXVhcmVkKGJ0KSl9dGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXM9TWF0aC5zcXJ0KHMpLGlzTmFOKHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9fWNvbXB1dGVUYW5nZW50cygpe2NvbnN0IHQ9dGhpcy5pbmRleCxlPXRoaXMuYXR0cmlidXRlcztpZih0PT09bnVsbHx8ZS5wb3NpdGlvbj09PXZvaWQgMHx8ZS5ub3JtYWw9PT12b2lkIDB8fGUudXY9PT12b2lkIDApe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgZmFpbGVkLiBNaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZXMgKGluZGV4LCBwb3NpdGlvbiwgbm9ybWFsIG9yIHV2KSIpO3JldHVybn1jb25zdCBuPWUucG9zaXRpb24scz1lLm5vcm1hbCxyPWUudXY7dGhpcy5oYXNBdHRyaWJ1dGUoInRhbmdlbnQiKT09PSExJiZ0aGlzLnNldEF0dHJpYnV0ZSgidGFuZ2VudCIsbmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkoNCpuLmNvdW50KSw0KSk7Y29uc3Qgbz10aGlzLmdldEF0dHJpYnV0ZSgidGFuZ2VudCIpLGE9W10sYz1bXTtmb3IobGV0IFM9MDtTPG4uY291bnQ7UysrKWFbU109bmV3IFQsY1tTXT1uZXcgVDtjb25zdCBsPW5ldyBULGg9bmV3IFQsdT1uZXcgVCxmPW5ldyBSLGQ9bmV3IFIscD1uZXcgUix5PW5ldyBULG09bmV3IFQ7ZnVuY3Rpb24gZyhTLEUseil7bC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sUyksaC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sRSksdS5mcm9tQnVmZmVyQXR0cmlidXRlKG4seiksZi5mcm9tQnVmZmVyQXR0cmlidXRlKHIsUyksZC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsRSkscC5mcm9tQnVmZmVyQXR0cmlidXRlKHIseiksaC5zdWIobCksdS5zdWIobCksZC5zdWIoZikscC5zdWIoZik7Y29uc3Qgdj0xLyhkLngqcC55LXAueCpkLnkpO2lzRmluaXRlKHYpJiYoeS5jb3B5KGgpLm11bHRpcGx5U2NhbGFyKHAueSkuYWRkU2NhbGVkVmVjdG9yKHUsLWQueSkubXVsdGlwbHlTY2FsYXIodiksbS5jb3B5KHUpLm11bHRpcGx5U2NhbGFyKGQueCkuYWRkU2NhbGVkVmVjdG9yKGgsLXAueCkubXVsdGlwbHlTY2FsYXIodiksYVtTXS5hZGQoeSksYVtFXS5hZGQoeSksYVt6XS5hZGQoeSksY1tTXS5hZGQobSksY1tFXS5hZGQobSksY1t6XS5hZGQobSkpfWxldCBiPXRoaXMuZ3JvdXBzO2IubGVuZ3RoPT09MCYmKGI9W3tzdGFydDowLGNvdW50OnQuY291bnR9XSk7Zm9yKGxldCBTPTAsRT1iLmxlbmd0aDtTPEU7KytTKXtjb25zdCB6PWJbU10sdj16LnN0YXJ0LEM9ei5jb3VudDtmb3IobGV0IFA9dixGPXYrQztQPEY7UCs9MylnKHQuZ2V0WChQKzApLHQuZ2V0WChQKzEpLHQuZ2V0WChQKzIpKX1jb25zdCB3PW5ldyBULHg9bmV3IFQsTT1uZXcgVCxBPW5ldyBUO2Z1bmN0aW9uIF8oUyl7TS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsUyksQS5jb3B5KE0pO2NvbnN0IEU9YVtTXTt3LmNvcHkoRSksdy5zdWIoTS5tdWx0aXBseVNjYWxhcihNLmRvdChFKSkpLm5vcm1hbGl6ZSgpLHguY3Jvc3NWZWN0b3JzKEEsRSk7Y29uc3Qgdj14LmRvdChjW1NdKTwwPy0xOjE7by5zZXRYWVpXKFMsdy54LHcueSx3Lnosdil9Zm9yKGxldCBTPTAsRT1iLmxlbmd0aDtTPEU7KytTKXtjb25zdCB6PWJbU10sdj16LnN0YXJ0LEM9ei5jb3VudDtmb3IobGV0IFA9dixGPXYrQztQPEY7UCs9MylfKHQuZ2V0WChQKzApKSxfKHQuZ2V0WChQKzEpKSxfKHQuZ2V0WChQKzIpKX19Y29tcHV0ZVZlcnRleE5vcm1hbHMoKXtjb25zdCB0PXRoaXMuaW5kZXgsZT10aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZihlIT09dm9pZCAwKXtsZXQgbj10aGlzLmdldEF0dHJpYnV0ZSgibm9ybWFsIik7aWYobj09PXZvaWQgMCluPW5ldyB4dChuZXcgRmxvYXQzMkFycmF5KGUuY291bnQqMyksMyksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbik7ZWxzZSBmb3IobGV0IGY9MCxkPW4uY291bnQ7ZjxkO2YrKyluLnNldFhZWihmLDAsMCwwKTtjb25zdCBzPW5ldyBULHI9bmV3IFQsbz1uZXcgVCxhPW5ldyBULGM9bmV3IFQsbD1uZXcgVCxoPW5ldyBULHU9bmV3IFQ7aWYodClmb3IobGV0IGY9MCxkPXQuY291bnQ7ZjxkO2YrPTMpe2NvbnN0IHA9dC5nZXRYKGYrMCkseT10LmdldFgoZisxKSxtPXQuZ2V0WChmKzIpO3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHApLHIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHkpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG0pLGguc3ViVmVjdG9ycyhvLHIpLHUuc3ViVmVjdG9ycyhzLHIpLGguY3Jvc3ModSksYS5mcm9tQnVmZmVyQXR0cmlidXRlKG4scCksYy5mcm9tQnVmZmVyQXR0cmlidXRlKG4seSksbC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sbSksYS5hZGQoaCksYy5hZGQoaCksbC5hZGQoaCksbi5zZXRYWVoocCxhLngsYS55LGEueiksbi5zZXRYWVooeSxjLngsYy55LGMueiksbi5zZXRYWVoobSxsLngsbC55LGwueil9ZWxzZSBmb3IobGV0IGY9MCxkPWUuY291bnQ7ZjxkO2YrPTMpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZiswKSxyLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxmKzEpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGYrMiksaC5zdWJWZWN0b3JzKG8sciksdS5zdWJWZWN0b3JzKHMsciksaC5jcm9zcyh1KSxuLnNldFhZWihmKzAsaC54LGgueSxoLnopLG4uc2V0WFlaKGYrMSxoLngsaC55LGgueiksbi5zZXRYWVooZisyLGgueCxoLnksaC56KTt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKSxuLm5lZWRzVXBkYXRlPSEwfX1ub3JtYWxpemVOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2ZvcihsZXQgZT0wLG49dC5jb3VudDtlPG47ZSsrKWJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSxidC5ub3JtYWxpemUoKSx0LnNldFhZWihlLGJ0LngsYnQueSxidC56KX10b05vbkluZGV4ZWQoKXtmdW5jdGlvbiB0KGEsYyl7Y29uc3QgbD1hLmFycmF5LGg9YS5pdGVtU2l6ZSx1PWEubm9ybWFsaXplZCxmPW5ldyBsLmNvbnN0cnVjdG9yKGMubGVuZ3RoKmgpO2xldCBkPTAscD0wO2ZvcihsZXQgeT0wLG09Yy5sZW5ndGg7eTxtO3krKyl7YS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlP2Q9Y1t5XSphLmRhdGEuc3RyaWRlK2Eub2Zmc2V0OmQ9Y1t5XSpoO2ZvcihsZXQgZz0wO2c8aDtnKyspZltwKytdPWxbZCsrXX1yZXR1cm4gbmV3IHh0KGYsaCx1KX1pZih0aGlzLmluZGV4PT09bnVsbClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogQnVmZmVyR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO2NvbnN0IGU9bmV3IHVlLG49dGhpcy5pbmRleC5hcnJheSxzPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgYSBpbiBzKXtjb25zdCBjPXNbYV0sbD10KGMsbik7ZS5zZXRBdHRyaWJ1dGUoYSxsKX1jb25zdCByPXRoaXMubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBhIGluIHIpe2NvbnN0IGM9W10sbD1yW2FdO2ZvcihsZXQgaD0wLHU9bC5sZW5ndGg7aDx1O2grKyl7Y29uc3QgZj1sW2hdLGQ9dChmLG4pO2MucHVzaChkKX1lLm1vcnBoQXR0cmlidXRlc1thXT1jfWUubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBvPXRoaXMuZ3JvdXBzO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKyl7Y29uc3QgbD1vW2FdO2UuYWRkR3JvdXAobC5zdGFydCxsLmNvdW50LGwubWF0ZXJpYWxJbmRleCl9cmV0dXJuIGV9dG9KU09OKCl7Y29uc3QgdD17bWV0YWRhdGE6e3ZlcnNpb246NC42LHR5cGU6IkJ1ZmZlckdlb21ldHJ5IixnZW5lcmF0b3I6IkJ1ZmZlckdlb21ldHJ5LnRvSlNPTiJ9fTtpZih0LnV1aWQ9dGhpcy51dWlkLHQudHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJih0Lm5hbWU9dGhpcy5uYW1lKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKHQudXNlckRhdGE9dGhpcy51c2VyRGF0YSksdGhpcy5wYXJhbWV0ZXJzIT09dm9pZCAwKXtjb25zdCBjPXRoaXMucGFyYW1ldGVycztmb3IoY29uc3QgbCBpbiBjKWNbbF0hPT12b2lkIDAmJih0W2xdPWNbbF0pO3JldHVybiB0fXQuZGF0YT17YXR0cmlidXRlczp7fX07Y29uc3QgZT10aGlzLmluZGV4O2UhPT1udWxsJiYodC5kYXRhLmluZGV4PXt0eXBlOmUuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmFycmF5KX0pO2NvbnN0IG49dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBjIGluIG4pe2NvbnN0IGw9bltjXTt0LmRhdGEuYXR0cmlidXRlc1tjXT1sLnRvSlNPTih0LmRhdGEpfWNvbnN0IHM9e307bGV0IHI9ITE7Zm9yKGNvbnN0IGMgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IGw9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbY10saD1bXTtmb3IobGV0IHU9MCxmPWwubGVuZ3RoO3U8Zjt1Kyspe2NvbnN0IGQ9bFt1XTtoLnB1c2goZC50b0pTT04odC5kYXRhKSl9aC5sZW5ndGg+MCYmKHNbY109aCxyPSEwKX1yJiYodC5kYXRhLm1vcnBoQXR0cmlidXRlcz1zLHQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKTtjb25zdCBvPXRoaXMuZ3JvdXBzO28ubGVuZ3RoPjAmJih0LmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobykpKTtjb25zdCBhPXRoaXMuYm91bmRpbmdTcGhlcmU7cmV0dXJuIGEhPT1udWxsJiYodC5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6YS5jZW50ZXIudG9BcnJheSgpLHJhZGl1czphLnJhZGl1c30pLHR9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsO2NvbnN0IGU9e307dGhpcy5uYW1lPXQubmFtZTtjb25zdCBuPXQuaW5kZXg7biE9PW51bGwmJnRoaXMuc2V0SW5kZXgobi5jbG9uZSgpKTtjb25zdCBzPXQuYXR0cmlidXRlcztmb3IoY29uc3QgbCBpbiBzKXtjb25zdCBoPXNbbF07dGhpcy5zZXRBdHRyaWJ1dGUobCxoLmNsb25lKGUpKX1jb25zdCByPXQubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBsIGluIHIpe2NvbnN0IGg9W10sdT1yW2xdO2ZvcihsZXQgZj0wLGQ9dS5sZW5ndGg7ZjxkO2YrKyloLnB1c2godVtmXS5jbG9uZShlKSk7dGhpcy5tb3JwaEF0dHJpYnV0ZXNbbF09aH10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXQubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbz10Lmdyb3Vwcztmb3IobGV0IGw9MCxoPW8ubGVuZ3RoO2w8aDtsKyspe2NvbnN0IHU9b1tsXTt0aGlzLmFkZEdyb3VwKHUuc3RhcnQsdS5jb3VudCx1Lm1hdGVyaWFsSW5kZXgpfWNvbnN0IGE9dC5ib3VuZGluZ0JveDthIT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9YS5jbG9uZSgpKTtjb25zdCBjPXQuYm91bmRpbmdTcGhlcmU7cmV0dXJuIGMhPT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1jLmNsb25lKCkpLHRoaXMuZHJhd1JhbmdlLnN0YXJ0PXQuZHJhd1JhbmdlLnN0YXJ0LHRoaXMuZHJhd1JhbmdlLmNvdW50PXQuZHJhd1JhbmdlLmNvdW50LHRoaXMudXNlckRhdGE9dC51c2VyRGF0YSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWNvbnN0IEVjPW5ldyBzdCx1bj1uZXcgYW8scHM9bmV3IGlvLFBjPW5ldyBULHlzPW5ldyBULG1zPW5ldyBULGdzPW5ldyBULHdvPW5ldyBULHhzPW5ldyBULENjPW5ldyBULHdzPW5ldyBUO2NsYXNzIGhmIGV4dGVuZHMgVGV7Y29uc3RydWN0b3IodD1uZXcgdWUsZT1uZXcgcmYpe3N1cGVyKCksdGhpcy5pc01lc2g9ITAsdGhpcy50eXBlPSJNZXNoIix0aGlzLmdlb21ldHJ5PXQsdGhpcy5tYXRlcmlhbD1lLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXZvaWQgMCx0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz12b2lkIDAsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyE9PXZvaWQgMCYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPXQubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCkpLHQubW9ycGhUYXJnZXREaWN0aW9uYXJ5IT09dm9pZCAwJiYodGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9T2JqZWN0LmFzc2lnbih7fSx0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeSkpLHRoaXMubWF0ZXJpYWw9QXJyYXkuaXNBcnJheSh0Lm1hdGVyaWFsKT90Lm1hdGVyaWFsLnNsaWNlKCk6dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc311cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCBlPXRoaXMuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXMoZSk7aWYobi5sZW5ndGg+MCl7Y29uc3Qgcz1lW25bMF1dO2lmKHMhPT12b2lkIDApe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1zW3JdLm5hbWV8fFN0cmluZyhyKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2FdPXJ9fX19Z2V0VmVydGV4UG9zaXRpb24odCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnkscz1uLmF0dHJpYnV0ZXMucG9zaXRpb24scj1uLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixvPW4ubW9ycGhUYXJnZXRzUmVsYXRpdmU7ZS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsdCk7Y29uc3QgYT10aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztpZihyJiZhKXt4cy5zZXQoMCwwLDApO2ZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1hW2NdLHU9cltjXTtoIT09MCYmKHdvLmZyb21CdWZmZXJBdHRyaWJ1dGUodSx0KSxvP3hzLmFkZFNjYWxlZFZlY3Rvcih3byxoKTp4cy5hZGRTY2FsZWRWZWN0b3Iod28uc3ViKGUpLGgpKX1lLmFkZCh4cyl9cmV0dXJuIGV9cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxzPXRoaXMubWF0ZXJpYWwscj10aGlzLm1hdHJpeFdvcmxkO3MhPT12b2lkIDAmJihuLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmbi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxwcy5jb3B5KG4uYm91bmRpbmdTcGhlcmUpLHBzLmFwcGx5TWF0cml4NChyKSx1bi5jb3B5KHQucmF5KS5yZWNhc3QodC5uZWFyKSwhKHBzLmNvbnRhaW5zUG9pbnQodW4ub3JpZ2luKT09PSExJiYodW4uaW50ZXJzZWN0U3BoZXJlKHBzLFBjKT09PW51bGx8fHVuLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZChQYyk+ZGkodC5mYXItdC5uZWFyLDIpKSkmJihFYy5jb3B5KHIpLmludmVydCgpLHVuLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChFYyksIShuLmJvdW5kaW5nQm94IT09bnVsbCYmdW4uaW50ZXJzZWN0c0JveChuLmJvdW5kaW5nQm94KT09PSExKSYmdGhpcy5fY29tcHV0ZUludGVyc2VjdGlvbnModCxlLHVuKSkpfV9jb21wdXRlSW50ZXJzZWN0aW9ucyh0LGUsbil7bGV0IHM7Y29uc3Qgcj10aGlzLmdlb21ldHJ5LG89dGhpcy5tYXRlcmlhbCxhPXIuaW5kZXgsYz1yLmF0dHJpYnV0ZXMucG9zaXRpb24sbD1yLmF0dHJpYnV0ZXMudXYsaD1yLmF0dHJpYnV0ZXMudXYxLHU9ci5hdHRyaWJ1dGVzLm5vcm1hbCxmPXIuZ3JvdXBzLGQ9ci5kcmF3UmFuZ2U7aWYoYSE9PW51bGwpaWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IG09ZltwXSxnPW9bbS5tYXRlcmlhbEluZGV4XSxiPU1hdGgubWF4KG0uc3RhcnQsZC5zdGFydCksdz1NYXRoLm1pbihhLmNvdW50LE1hdGgubWluKG0uc3RhcnQrbS5jb3VudCxkLnN0YXJ0K2QuY291bnQpKTtmb3IobGV0IHg9YixNPXc7eDxNO3grPTMpe2NvbnN0IEE9YS5nZXRYKHgpLF89YS5nZXRYKHgrMSksUz1hLmdldFgoeCsyKTtzPWJzKHRoaXMsZyx0LG4sbCxoLHUsQSxfLFMpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKHgvMykscy5mYWNlLm1hdGVyaWFsSW5kZXg9bS5tYXRlcmlhbEluZGV4LGUucHVzaChzKSl9fWVsc2V7Y29uc3QgcD1NYXRoLm1heCgwLGQuc3RhcnQpLHk9TWF0aC5taW4oYS5jb3VudCxkLnN0YXJ0K2QuY291bnQpO2ZvcihsZXQgbT1wLGc9eTttPGc7bSs9Myl7Y29uc3QgYj1hLmdldFgobSksdz1hLmdldFgobSsxKSx4PWEuZ2V0WChtKzIpO3M9YnModGhpcyxvLHQsbixsLGgsdSxiLHcseCkscyYmKHMuZmFjZUluZGV4PU1hdGguZmxvb3IobS8zKSxlLnB1c2gocykpfX1lbHNlIGlmKGMhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IG09ZltwXSxnPW9bbS5tYXRlcmlhbEluZGV4XSxiPU1hdGgubWF4KG0uc3RhcnQsZC5zdGFydCksdz1NYXRoLm1pbihjLmNvdW50LE1hdGgubWluKG0uc3RhcnQrbS5jb3VudCxkLnN0YXJ0K2QuY291bnQpKTtmb3IobGV0IHg9YixNPXc7eDxNO3grPTMpe2NvbnN0IEE9eCxfPXgrMSxTPXgrMjtzPWJzKHRoaXMsZyx0LG4sbCxoLHUsQSxfLFMpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKHgvMykscy5mYWNlLm1hdGVyaWFsSW5kZXg9bS5tYXRlcmlhbEluZGV4LGUucHVzaChzKSl9fWVsc2V7Y29uc3QgcD1NYXRoLm1heCgwLGQuc3RhcnQpLHk9TWF0aC5taW4oYy5jb3VudCxkLnN0YXJ0K2QuY291bnQpO2ZvcihsZXQgbT1wLGc9eTttPGc7bSs9Myl7Y29uc3QgYj1tLHc9bSsxLHg9bSsyO3M9YnModGhpcyxvLHQsbixsLGgsdSxiLHcseCkscyYmKHMuZmFjZUluZGV4PU1hdGguZmxvb3IobS8zKSxlLnB1c2gocykpfX19fWZ1bmN0aW9uIHVmKGksdCxlLG4scyxyLG8sYSl7bGV0IGM7aWYodC5zaWRlPT09MT9jPW4uaW50ZXJzZWN0VHJpYW5nbGUobyxyLHMsITAsYSk6Yz1uLmludGVyc2VjdFRyaWFuZ2xlKHMscixvLHQuc2lkZT09PTAsYSksYz09PW51bGwpcmV0dXJuIG51bGw7d3MuY29weShhKSx3cy5hcHBseU1hdHJpeDQoaS5tYXRyaXhXb3JsZCk7Y29uc3QgbD1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyh3cyk7cmV0dXJuIGw8ZS5uZWFyfHxsPmUuZmFyP251bGw6e2Rpc3RhbmNlOmwscG9pbnQ6d3MuY2xvbmUoKSxvYmplY3Q6aX19ZnVuY3Rpb24gYnMoaSx0LGUsbixzLHIsbyxhLGMsbCl7aS5nZXRWZXJ0ZXhQb3NpdGlvbihhLHlzKSxpLmdldFZlcnRleFBvc2l0aW9uKGMsbXMpLGkuZ2V0VmVydGV4UG9zaXRpb24obCxncyk7Y29uc3QgaD11ZihpLHQsZSxuLHlzLG1zLGdzLENjKTtpZihoKXtjb25zdCB1PW5ldyBUO2V0LmdldEJhcnljb29yZChDYyx5cyxtcyxncyx1KSxzJiYoaC51dj1ldC5nZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUocyxhLGMsbCx1LG5ldyBSKSksciYmKGgudXYxPWV0LmdldEludGVycG9sYXRlZEF0dHJpYnV0ZShyLGEsYyxsLHUsbmV3IFIpKSxvJiYoaC5ub3JtYWw9ZXQuZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKG8sYSxjLGwsdSxuZXcgVCksaC5ub3JtYWwuZG90KG4uZGlyZWN0aW9uKT4wJiZoLm5vcm1hbC5tdWx0aXBseVNjYWxhcigtMSkpO2NvbnN0IGY9e2EsYjpjLGM6bCxub3JtYWw6bmV3IFQsbWF0ZXJpYWxJbmRleDowfTtldC5nZXROb3JtYWwoeXMsbXMsZ3MsZi5ub3JtYWwpLGguZmFjZT1mLGguYmFyeWNvb3JkPXV9cmV0dXJuIGh9Y29uc3QgYm89bmV3IFQsZmY9bmV3IFQsZGY9bmV3IGdlO2NsYXNzIE1ve2NvbnN0cnVjdG9yKHQ9bmV3IFQoMSwwLDApLGU9MCl7dGhpcy5pc1BsYW5lPSEwLHRoaXMubm9ybWFsPXQsdGhpcy5jb25zdGFudD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLHRoaXMuY29uc3RhbnQ9ZSx0aGlzfXNldENvbXBvbmVudHModCxlLG4scyl7cmV0dXJuIHRoaXMubm9ybWFsLnNldCh0LGUsbiksdGhpcy5jb25zdGFudD1zLHRoaXN9c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PS1lLmRvdCh0aGlzLm5vcm1hbCksdGhpc31zZXRGcm9tQ29wbGFuYXJQb2ludHModCxlLG4pe2NvbnN0IHM9Ym8uc3ViVmVjdG9ycyhuLGUpLmNyb3NzKGZmLnN1YlZlY3RvcnModCxlKSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQocyx0KSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodC5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9dC5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IHQ9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIodCksdGhpcy5jb25zdGFudCo9dCx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KHQpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQodC5jZW50ZXIpLXQucmFkaXVzfXByb2plY3RQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLC10aGlzLmRpc3RhbmNlVG9Qb2ludCh0KSl9aW50ZXJzZWN0TGluZSh0LGUpe2NvbnN0IG49dC5kZWx0YShibykscz10aGlzLm5vcm1hbC5kb3Qobik7aWYocz09PTApcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpPT09MD9lLmNvcHkodC5zdGFydCk6bnVsbDtjb25zdCByPS0odC5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL3M7cmV0dXJuIHI8MHx8cj4xP251bGw6ZS5jb3B5KHQuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihuLHIpfWludGVyc2VjdHNMaW5lKHQpe2NvbnN0IGU9dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCksbj10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LmVuZCk7cmV0dXJuIGU8MCYmbj4wfHxuPDAmJmU+MH1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KHQpe3JldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQodCxlKXtjb25zdCBuPWV8fGRmLmdldE5vcm1hbE1hdHJpeCh0KSxzPXRoaXMuY29wbGFuYXJQb2ludChibykuYXBwbHlNYXRyaXg0KHQpLHI9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKG4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1zLmRvdChyKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jb25zdGFudC09dC5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZ0LmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWxldCB4ZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMudHlwZT0iQ3VydmUiLHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPTIwMCx0aGlzLm5lZWRzVXBkYXRlPSExLHRoaXMuY2FjaGVBcmNMZW5ndGhzPW51bGx9Z2V0UG9pbnQoKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVtZW50ZWQuIil9Z2V0UG9pbnRBdCh0LGUpe2NvbnN0IG49dGhpcy5nZXRVdG9UbWFwcGluZyh0KTtyZXR1cm4gdGhpcy5nZXRQb2ludChuLGUpfWdldFBvaW50cyh0PTUpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnQobi90KSk7cmV0dXJuIGV9Z2V0U3BhY2VkUG9pbnRzKHQ9NSl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPD10O24rKyllLnB1c2godGhpcy5nZXRQb2ludEF0KG4vdCkpO3JldHVybiBlfWdldExlbmd0aCgpe2NvbnN0IHQ9dGhpcy5nZXRMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19Z2V0TGVuZ3Rocyh0PXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zKXtpZih0aGlzLmNhY2hlQXJjTGVuZ3RocyYmdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoPT09dCsxJiYhdGhpcy5uZWVkc1VwZGF0ZSlyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7dGhpcy5uZWVkc1VwZGF0ZT0hMTtjb25zdCBlPVtdO2xldCBuLHM9dGhpcy5nZXRQb2ludCgwKSxyPTA7ZS5wdXNoKDApO2ZvcihsZXQgbz0xO288PXQ7bysrKW49dGhpcy5nZXRQb2ludChvL3QpLHIrPW4uZGlzdGFuY2VUbyhzKSxlLnB1c2gocikscz1uO3JldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3Rocz1lLGV9dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5nZXRMZW5ndGhzKCl9Z2V0VXRvVG1hcHBpbmcodCxlPW51bGwpe2NvbnN0IG49dGhpcy5nZXRMZW5ndGhzKCk7bGV0IHM9MDtjb25zdCByPW4ubGVuZ3RoO2xldCBvO2U/bz1lOm89dCpuW3ItMV07bGV0IGE9MCxjPXItMSxsO2Zvcig7YTw9YzspaWYocz1NYXRoLmZsb29yKGErKGMtYSkvMiksbD1uW3NdLW8sbDwwKWE9cysxO2Vsc2UgaWYobD4wKWM9cy0xO2Vsc2V7Yz1zO2JyZWFrfWlmKHM9YyxuW3NdPT09bylyZXR1cm4gcy8oci0xKTtjb25zdCBoPW5bc10sZj1uW3MrMV0taCxkPShvLWgpL2Y7cmV0dXJuKHMrZCkvKHItMSl9Z2V0VGFuZ2VudCh0LGUpe2xldCBzPXQtMWUtNCxyPXQrMWUtNDtzPDAmJihzPTApLHI+MSYmKHI9MSk7Y29uc3Qgbz10aGlzLmdldFBvaW50KHMpLGE9dGhpcy5nZXRQb2ludChyKSxjPWV8fChvLmlzVmVjdG9yMj9uZXcgUjpuZXcgVCk7cmV0dXJuIGMuY29weShhKS5zdWIobykubm9ybWFsaXplKCksY31nZXRUYW5nZW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChuLGUpfWNvbXB1dGVGcmVuZXRGcmFtZXModCxlPSExKXtjb25zdCBuPW5ldyBULHM9W10scj1bXSxvPVtdLGE9bmV3IFQsYz1uZXcgc3Q7Zm9yKGxldCBkPTA7ZDw9dDtkKyspe2NvbnN0IHA9ZC90O3NbZF09dGhpcy5nZXRUYW5nZW50QXQocCxuZXcgVCl9clswXT1uZXcgVCxvWzBdPW5ldyBUO2xldCBsPU51bWJlci5NQVhfVkFMVUU7Y29uc3QgaD1NYXRoLmFicyhzWzBdLngpLHU9TWF0aC5hYnMoc1swXS55KSxmPU1hdGguYWJzKHNbMF0ueik7aDw9bCYmKGw9aCxuLnNldCgxLDAsMCkpLHU8PWwmJihsPXUsbi5zZXQoMCwxLDApKSxmPD1sJiZuLnNldCgwLDAsMSksYS5jcm9zc1ZlY3RvcnMoc1swXSxuKS5ub3JtYWxpemUoKSxyWzBdLmNyb3NzVmVjdG9ycyhzWzBdLGEpLG9bMF0uY3Jvc3NWZWN0b3JzKHNbMF0sclswXSk7Zm9yKGxldCBkPTE7ZDw9dDtkKyspe2lmKHJbZF09cltkLTFdLmNsb25lKCksb1tkXT1vW2QtMV0uY2xvbmUoKSxhLmNyb3NzVmVjdG9ycyhzW2QtMV0sc1tkXSksYS5sZW5ndGgoKT5OdW1iZXIuRVBTSUxPTil7YS5ub3JtYWxpemUoKTtjb25zdCBwPU1hdGguYWNvcyhaKHNbZC0xXS5kb3Qoc1tkXSksLTEsMSkpO3JbZF0uYXBwbHlNYXRyaXg0KGMubWFrZVJvdGF0aW9uQXhpcyhhLHApKX1vW2RdLmNyb3NzVmVjdG9ycyhzW2RdLHJbZF0pfWlmKGU9PT0hMCl7bGV0IGQ9TWF0aC5hY29zKFooclswXS5kb3Qoclt0XSksLTEsMSkpO2QvPXQsc1swXS5kb3QoYS5jcm9zc1ZlY3RvcnMoclswXSxyW3RdKSk+MCYmKGQ9LWQpO2ZvcihsZXQgcD0xO3A8PXQ7cCsrKXJbcF0uYXBwbHlNYXRyaXg0KGMubWFrZVJvdGF0aW9uQXhpcyhzW3BdLGQqcCkpLG9bcF0uY3Jvc3NWZWN0b3JzKHNbcF0scltwXSl9cmV0dXJue3RhbmdlbnRzOnMsbm9ybWFsczpyLGJpbm9ybWFsczpvfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9dC5hcmNMZW5ndGhEaXZpc2lvbnMsdGhpc310b0pTT04oKXtjb25zdCB0PXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiQ3VydmUiLGdlbmVyYXRvcjoiQ3VydmUudG9KU09OIn19O3JldHVybiB0LmFyY0xlbmd0aERpdmlzaW9ucz10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyx0LnR5cGU9dGhpcy50eXBlLHR9ZnJvbUpTT04odCl7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPXQuYXJjTGVuZ3RoRGl2aXNpb25zLHRoaXN9fTtjbGFzcyBNcyBleHRlbmRzIHhle2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0xLHM9MSxyPTAsbz1NYXRoLlBJKjIsYT0hMSxjPTApe3N1cGVyKCksdGhpcy5pc0VsbGlwc2VDdXJ2ZT0hMCx0aGlzLnR5cGU9IkVsbGlwc2VDdXJ2ZSIsdGhpcy5hWD10LHRoaXMuYVk9ZSx0aGlzLnhSYWRpdXM9bix0aGlzLnlSYWRpdXM9cyx0aGlzLmFTdGFydEFuZ2xlPXIsdGhpcy5hRW5kQW5nbGU9byx0aGlzLmFDbG9ja3dpc2U9YSx0aGlzLmFSb3RhdGlvbj1jfWdldFBvaW50KHQsZT1uZXcgUil7Y29uc3Qgbj1lLHM9TWF0aC5QSSoyO2xldCByPXRoaXMuYUVuZEFuZ2xlLXRoaXMuYVN0YXJ0QW5nbGU7Y29uc3Qgbz1NYXRoLmFicyhyKTxOdW1iZXIuRVBTSUxPTjtmb3IoO3I8MDspcis9cztmb3IoO3I+czspci09cztyPE51bWJlci5FUFNJTE9OJiYobz9yPTA6cj1zKSx0aGlzLmFDbG9ja3dpc2U9PT0hMCYmIW8mJihyPT09cz9yPS1zOnI9ci1zKTtjb25zdCBhPXRoaXMuYVN0YXJ0QW5nbGUrdCpyO2xldCBjPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKGEpLGw9dGhpcy5hWSt0aGlzLnlSYWRpdXMqTWF0aC5zaW4oYSk7aWYodGhpcy5hUm90YXRpb24hPT0wKXtjb25zdCBoPU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSx1PU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSxmPWMtdGhpcy5hWCxkPWwtdGhpcy5hWTtjPWYqaC1kKnUrdGhpcy5hWCxsPWYqdStkKmgrdGhpcy5hWX1yZXR1cm4gbi5zZXQoYyxsKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuYVg9dC5hWCx0aGlzLmFZPXQuYVksdGhpcy54UmFkaXVzPXQueFJhZGl1cyx0aGlzLnlSYWRpdXM9dC55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9dC5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT10LmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9dC5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPXQuYVJvdGF0aW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5hWD10aGlzLmFYLHQuYVk9dGhpcy5hWSx0LnhSYWRpdXM9dGhpcy54UmFkaXVzLHQueVJhZGl1cz10aGlzLnlSYWRpdXMsdC5hU3RhcnRBbmdsZT10aGlzLmFTdGFydEFuZ2xlLHQuYUVuZEFuZ2xlPXRoaXMuYUVuZEFuZ2xlLHQuYUNsb2Nrd2lzZT10aGlzLmFDbG9ja3dpc2UsdC5hUm90YXRpb249dGhpcy5hUm90YXRpb24sdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5hWD10LmFYLHRoaXMuYVk9dC5hWSx0aGlzLnhSYWRpdXM9dC54UmFkaXVzLHRoaXMueVJhZGl1cz10LnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT10LmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPXQuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT10LmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249dC5hUm90YXRpb24sdGhpc319Y2xhc3MgQmMgZXh0ZW5kcyBNc3tjb25zdHJ1Y3Rvcih0LGUsbixzLHIsbyl7c3VwZXIodCxlLG4sbixzLHIsbyksdGhpcy5pc0FyY0N1cnZlPSEwLHRoaXMudHlwZT0iQXJjQ3VydmUifX1mdW5jdGlvbiBBbygpe2xldCBpPTAsdD0wLGU9MCxuPTA7ZnVuY3Rpb24gcyhyLG8sYSxjKXtpPXIsdD1hLGU9LTMqciszKm8tMiphLWMsbj0yKnItMipvK2ErY31yZXR1cm57aW5pdENhdG11bGxSb206ZnVuY3Rpb24ocixvLGEsYyxsKXtzKG8sYSxsKihhLXIpLGwqKGMtbykpfSxpbml0Tm9udW5pZm9ybUNhdG11bGxSb206ZnVuY3Rpb24ocixvLGEsYyxsLGgsdSl7bGV0IGY9KG8tcikvbC0oYS1yKS8obCtoKSsoYS1vKS9oLGQ9KGEtbykvaC0oYy1vKS8oaCt1KSsoYy1hKS91O2YqPWgsZCo9aCxzKG8sYSxmLGQpfSxjYWxjOmZ1bmN0aW9uKHIpe2NvbnN0IG89cipyLGE9bypyO3JldHVybiBpK3QqcitlKm8rbiphfX19Y29uc3QgQXM9bmV3IFQsX289bmV3IEFvLFNvPW5ldyBBbyx2bz1uZXcgQW87Y2xhc3MgRmMgZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PVtdLGU9ITEsbj0iY2VudHJpcGV0YWwiLHM9LjUpe3N1cGVyKCksdGhpcy5pc0NhdG11bGxSb21DdXJ2ZTM9ITAsdGhpcy50eXBlPSJDYXRtdWxsUm9tQ3VydmUzIix0aGlzLnBvaW50cz10LHRoaXMuY2xvc2VkPWUsdGhpcy5jdXJ2ZVR5cGU9bix0aGlzLnRlbnNpb249c31nZXRQb2ludCh0LGU9bmV3IFQpe2NvbnN0IG49ZSxzPXRoaXMucG9pbnRzLHI9cy5sZW5ndGgsbz0oci0odGhpcy5jbG9zZWQ/MDoxKSkqdDtsZXQgYT1NYXRoLmZsb29yKG8pLGM9by1hO3RoaXMuY2xvc2VkP2ErPWE+MD8wOihNYXRoLmZsb29yKE1hdGguYWJzKGEpL3IpKzEpKnI6Yz09PTAmJmE9PT1yLTEmJihhPXItMixjPTEpO2xldCBsLGg7dGhpcy5jbG9zZWR8fGE+MD9sPXNbKGEtMSklcl06KEFzLnN1YlZlY3RvcnMoc1swXSxzWzFdKS5hZGQoc1swXSksbD1Bcyk7Y29uc3QgdT1zW2Elcl0sZj1zWyhhKzEpJXJdO2lmKHRoaXMuY2xvc2VkfHxhKzI8cj9oPXNbKGErMiklcl06KEFzLnN1YlZlY3RvcnMoc1tyLTFdLHNbci0yXSkuYWRkKHNbci0xXSksaD1BcyksdGhpcy5jdXJ2ZVR5cGU9PT0iY2VudHJpcGV0YWwifHx0aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIil7Y29uc3QgZD10aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIj8uNTouMjU7bGV0IHA9TWF0aC5wb3cobC5kaXN0YW5jZVRvU3F1YXJlZCh1KSxkKSx5PU1hdGgucG93KHUuZGlzdGFuY2VUb1NxdWFyZWQoZiksZCksbT1NYXRoLnBvdyhmLmRpc3RhbmNlVG9TcXVhcmVkKGgpLGQpO3k8MWUtNCYmKHk9MSkscDwxZS00JiYocD15KSxtPDFlLTQmJihtPXkpLF9vLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLngsdS54LGYueCxoLngscCx5LG0pLFNvLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLnksdS55LGYueSxoLnkscCx5LG0pLHZvLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLnosdS56LGYueixoLnoscCx5LG0pfWVsc2UgdGhpcy5jdXJ2ZVR5cGU9PT0iY2F0bXVsbHJvbSImJihfby5pbml0Q2F0bXVsbFJvbShsLngsdS54LGYueCxoLngsdGhpcy50ZW5zaW9uKSxTby5pbml0Q2F0bXVsbFJvbShsLnksdS55LGYueSxoLnksdGhpcy50ZW5zaW9uKSx2by5pbml0Q2F0bXVsbFJvbShsLnosdS56LGYueixoLnosdGhpcy50ZW5zaW9uKSk7cmV0dXJuIG4uc2V0KF9vLmNhbGMoYyksU28uY2FsYyhjKSx2by5jYWxjKGMpKSxufWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gocy5jbG9uZSgpKX1yZXR1cm4gdGhpcy5jbG9zZWQ9dC5jbG9zZWQsdGhpcy5jdXJ2ZVR5cGU9dC5jdXJ2ZVR5cGUsdGhpcy50ZW5zaW9uPXQudGVuc2lvbix0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10aGlzLnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10aGlzLnBvaW50c1tlXTt0LnBvaW50cy5wdXNoKHMudG9BcnJheSgpKX1yZXR1cm4gdC5jbG9zZWQ9dGhpcy5jbG9zZWQsdC5jdXJ2ZVR5cGU9dGhpcy5jdXJ2ZVR5cGUsdC50ZW5zaW9uPXRoaXMudGVuc2lvbix0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChuZXcgVCgpLmZyb21BcnJheShzKSl9cmV0dXJuIHRoaXMuY2xvc2VkPXQuY2xvc2VkLHRoaXMuY3VydmVUeXBlPXQuY3VydmVUeXBlLHRoaXMudGVuc2lvbj10LnRlbnNpb24sdGhpc319ZnVuY3Rpb24gSWMoaSx0LGUsbixzKXtjb25zdCByPShuLXQpKi41LG89KHMtZSkqLjUsYT1pKmksYz1pKmE7cmV0dXJuKDIqZS0yKm4rcitvKSpjKygtMyplKzMqbi0yKnItbykqYStyKmkrZX1mdW5jdGlvbiBwZihpLHQpe2NvbnN0IGU9MS1pO3JldHVybiBlKmUqdH1mdW5jdGlvbiB5ZihpLHQpe3JldHVybiAyKigxLWkpKmkqdH1mdW5jdGlvbiBtZihpLHQpe3JldHVybiBpKmkqdH1mdW5jdGlvbiBNaShpLHQsZSxuKXtyZXR1cm4gcGYoaSx0KSt5ZihpLGUpK21mKGksbil9ZnVuY3Rpb24gZ2YoaSx0KXtjb25zdCBlPTEtaTtyZXR1cm4gZSplKmUqdH1mdW5jdGlvbiB4ZihpLHQpe2NvbnN0IGU9MS1pO3JldHVybiAzKmUqZSppKnR9ZnVuY3Rpb24gd2YoaSx0KXtyZXR1cm4gMyooMS1pKSppKmkqdH1mdW5jdGlvbiBiZihpLHQpe3JldHVybiBpKmkqaSp0fWZ1bmN0aW9uIEFpKGksdCxlLG4scyl7cmV0dXJuIGdmKGksdCkreGYoaSxlKSt3ZihpLG4pK2JmKGkscyl9Y2xhc3Mgem8gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBSLGU9bmV3IFIsbj1uZXcgUixzPW5ldyBSKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlPSEwLHRoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1zfWdldFBvaW50KHQsZT1uZXcgUil7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyLGE9dGhpcy52MztyZXR1cm4gbi5zZXQoQWkodCxzLngsci54LG8ueCxhLngpLEFpKHQscy55LHIueSxvLnksYS55KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319Y2xhc3Mga2MgZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQsbj1uZXcgVCxzPW5ldyBUKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlMz0hMCx0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9bix0aGlzLnYzPXN9Z2V0UG9pbnQodCxlPW5ldyBUKXtjb25zdCBuPWUscz10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjIsYT10aGlzLnYzO3JldHVybiBuLnNldChBaSh0LHMueCxyLngsby54LGEueCksQWkodCxzLnksci55LG8ueSxhLnkpLEFpKHQscy56LHIueixvLnosYS56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319Y2xhc3MgVG8gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBSLGU9bmV3IFIpe3N1cGVyKCksdGhpcy5pc0xpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZSIsdGhpcy52MT10LHRoaXMudjI9ZX1nZXRQb2ludCh0LGU9bmV3IFIpe2NvbnN0IG49ZTtyZXR1cm4gdD09PTE/bi5jb3B5KHRoaXMudjIpOihuLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLG4ubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMudjEpKSxufWdldFBvaW50QXQodCxlKXtyZXR1cm4gdGhpcy5nZXRQb2ludCh0LGUpfWdldFRhbmdlbnQodCxlPW5ldyBSKXtyZXR1cm4gZS5zdWJWZWN0b3JzKHRoaXMudjIsdGhpcy52MSkubm9ybWFsaXplKCl9Z2V0VGFuZ2VudEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCh0LGUpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBOYyBleHRlbmRzIHhle2NvbnN0cnVjdG9yKHQ9bmV3IFQsZT1uZXcgVCl7c3VwZXIoKSx0aGlzLmlzTGluZUN1cnZlMz0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZTMiLHRoaXMudjE9dCx0aGlzLnYyPWV9Z2V0UG9pbnQodCxlPW5ldyBUKXtjb25zdCBuPWU7cmV0dXJuIHQ9PT0xP24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1nZXRUYW5nZW50KHQsZT1uZXcgVCl7cmV0dXJuIGUuc3ViVmVjdG9ycyh0aGlzLnYyLHRoaXMudjEpLm5vcm1hbGl6ZSgpfWdldFRhbmdlbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFRhbmdlbnQodCxlKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgRW8gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PW5ldyBSLGU9bmV3IFIsbj1uZXcgUil7c3VwZXIoKSx0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmU9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW59Z2V0UG9pbnQodCxlPW5ldyBSKXtjb25zdCBuPWUscz10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjI7cmV0dXJuIG4uc2V0KE1pKHQscy54LHIueCxvLngpLE1pKHQscy55LHIueSxvLnkpKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBSYyBleHRlbmRzIHhle2NvbnN0cnVjdG9yKHQ9bmV3IFQsZT1uZXcgVCxuPW5ldyBUKXtzdXBlcigpLHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTM9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgVCl7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyO3JldHVybiBuLnNldChNaSh0LHMueCxyLngsby54KSxNaSh0LHMueSxyLnksby55KSxNaSh0LHMueixyLnosby56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MD10aGlzLnYwLnRvQXJyYXkoKSx0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgUG8gZXh0ZW5kcyB4ZXtjb25zdHJ1Y3Rvcih0PVtdKXtzdXBlcigpLHRoaXMuaXNTcGxpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IlNwbGluZUN1cnZlIix0aGlzLnBvaW50cz10fWdldFBvaW50KHQsZT1uZXcgUil7Y29uc3Qgbj1lLHM9dGhpcy5wb2ludHMscj0ocy5sZW5ndGgtMSkqdCxvPU1hdGguZmxvb3IociksYT1yLW8sYz1zW289PT0wP286by0xXSxsPXNbb10saD1zW28+cy5sZW5ndGgtMj9zLmxlbmd0aC0xOm8rMV0sdT1zW28+cy5sZW5ndGgtMz9zLmxlbmd0aC0xOm8rMl07cmV0dXJuIG4uc2V0KEljKGEsYy54LGwueCxoLngsdS54KSxJYyhhLGMueSxsLnksaC55LHUueSkpLG59Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChzLmNsb25lKCkpfXJldHVybiB0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10aGlzLnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10aGlzLnBvaW50c1tlXTt0LnBvaW50cy5wdXNoKHMudG9BcnJheSgpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gobmV3IFIoKS5mcm9tQXJyYXkocykpfXJldHVybiB0aGlzfX12YXIgTGM9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQXJjQ3VydmU6QmMsQ2F0bXVsbFJvbUN1cnZlMzpGYyxDdWJpY0JlemllckN1cnZlOnpvLEN1YmljQmV6aWVyQ3VydmUzOmtjLEVsbGlwc2VDdXJ2ZTpNcyxMaW5lQ3VydmU6VG8sTGluZUN1cnZlMzpOYyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpFbyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6UmMsU3BsaW5lQ3VydmU6UG99KTtjbGFzcyBNZiBleHRlbmRzIHhle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkN1cnZlUGF0aCIsdGhpcy5jdXJ2ZXM9W10sdGhpcy5hdXRvQ2xvc2U9ITF9YWRkKHQpe3RoaXMuY3VydmVzLnB1c2godCl9Y2xvc2VQYXRoKCl7Y29uc3QgdD10aGlzLmN1cnZlc1swXS5nZXRQb2ludCgwKSxlPXRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aC0xXS5nZXRQb2ludCgxKTtpZighdC5lcXVhbHMoZSkpe2NvbnN0IG49dC5pc1ZlY3RvcjI9PT0hMD8iTGluZUN1cnZlIjoiTGluZUN1cnZlMyI7dGhpcy5jdXJ2ZXMucHVzaChuZXcgTGNbbl0oZSx0KSl9cmV0dXJuIHRoaXN9Z2V0UG9pbnQodCxlKXtjb25zdCBuPXQqdGhpcy5nZXRMZW5ndGgoKSxzPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7bGV0IHI9MDtmb3IoO3I8cy5sZW5ndGg7KXtpZihzW3JdPj1uKXtjb25zdCBvPXNbcl0tbixhPXRoaXMuY3VydmVzW3JdLGM9YS5nZXRMZW5ndGgoKSxsPWM9PT0wPzA6MS1vL2M7cmV0dXJuIGEuZ2V0UG9pbnRBdChsLGUpfXIrK31yZXR1cm4gbnVsbH1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5jYWNoZUxlbmd0aHM9bnVsbCx0aGlzLmdldEN1cnZlTGVuZ3RocygpfWdldEN1cnZlTGVuZ3Rocygpe2lmKHRoaXMuY2FjaGVMZW5ndGhzJiZ0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGg9PT10aGlzLmN1cnZlcy5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO2NvbnN0IHQ9W107bGV0IGU9MDtmb3IobGV0IG49MCxzPXRoaXMuY3VydmVzLmxlbmd0aDtuPHM7bisrKWUrPXRoaXMuY3VydmVzW25dLmdldExlbmd0aCgpLHQucHVzaChlKTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9dCx0fWdldFNwYWNlZFBvaW50cyh0PTQwKXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiB0aGlzLmF1dG9DbG9zZSYmZS5wdXNoKGVbMF0pLGV9Z2V0UG9pbnRzKHQ9MTIpe2NvbnN0IGU9W107bGV0IG47Zm9yKGxldCBzPTAscj10aGlzLmN1cnZlcztzPHIubGVuZ3RoO3MrKyl7Y29uc3Qgbz1yW3NdLGE9by5pc0VsbGlwc2VDdXJ2ZT90KjI6by5pc0xpbmVDdXJ2ZXx8by5pc0xpbmVDdXJ2ZTM/MTpvLmlzU3BsaW5lQ3VydmU/dCpvLnBvaW50cy5sZW5ndGg6dCxjPW8uZ2V0UG9pbnRzKGEpO2ZvcihsZXQgbD0wO2w8Yy5sZW5ndGg7bCsrKXtjb25zdCBoPWNbbF07biYmbi5lcXVhbHMoaCl8fChlLnB1c2goaCksbj1oKX19cmV0dXJuIHRoaXMuYXV0b0Nsb3NlJiZlLmxlbmd0aD4xJiYhZVtlLmxlbmd0aC0xXS5lcXVhbHMoZVswXSkmJmUucHVzaChlWzBdKSxlfWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2gocy5jbG9uZSgpKX1yZXR1cm4gdGhpcy5hdXRvQ2xvc2U9dC5hdXRvQ2xvc2UsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlLHQuY3VydmVzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5jdXJ2ZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dGhpcy5jdXJ2ZXNbZV07dC5jdXJ2ZXMucHVzaChzLnRvSlNPTigpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLmF1dG9DbG9zZT10LmF1dG9DbG9zZSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2gobmV3IExjW3MudHlwZV0oKS5mcm9tSlNPTihzKSl9cmV0dXJuIHRoaXN9fWxldCBPYz1jbGFzcyBleHRlbmRzIE1me2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJQYXRoIix0aGlzLmN1cnJlbnRQb2ludD1uZXcgUix0JiZ0aGlzLnNldEZyb21Qb2ludHModCl9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1vdmVUbyh0WzBdLngsdFswXS55KTtmb3IobGV0IGU9MSxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5saW5lVG8odFtlXS54LHRbZV0ueSk7cmV0dXJuIHRoaXN9bW92ZVRvKHQsZSl7cmV0dXJuIHRoaXMuY3VycmVudFBvaW50LnNldCh0LGUpLHRoaXN9bGluZVRvKHQsZSl7Y29uc3Qgbj1uZXcgVG8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgUih0LGUpKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQodCxlKSx0aGlzfXF1YWRyYXRpY0N1cnZlVG8odCxlLG4scyl7Y29uc3Qgcj1uZXcgRW8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgUih0LGUpLG5ldyBSKG4scykpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKHIpLHRoaXMuY3VycmVudFBvaW50LnNldChuLHMpLHRoaXN9YmV6aWVyQ3VydmVUbyh0LGUsbixzLHIsbyl7Y29uc3QgYT1uZXcgem8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgUih0LGUpLG5ldyBSKG4scyksbmV3IFIocixvKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2goYSksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHIsbyksdGhpc31zcGxpbmVUaHJ1KHQpe2NvbnN0IGU9W3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdCh0KSxuPW5ldyBQbyhlKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHRbdC5sZW5ndGgtMV0pLHRoaXN9YXJjKHQsZSxuLHMscixvKXtjb25zdCBhPXRoaXMuY3VycmVudFBvaW50LngsYz10aGlzLmN1cnJlbnRQb2ludC55O3JldHVybiB0aGlzLmFic2FyYyh0K2EsZStjLG4scyxyLG8pLHRoaXN9YWJzYXJjKHQsZSxuLHMscixvKXtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKHQsZSxuLG4scyxyLG8pLHRoaXN9ZWxsaXBzZSh0LGUsbixzLHIsbyxhLGMpe2NvbnN0IGw9dGhpcy5jdXJyZW50UG9pbnQueCxoPXRoaXMuY3VycmVudFBvaW50Lnk7cmV0dXJuIHRoaXMuYWJzZWxsaXBzZSh0K2wsZStoLG4scyxyLG8sYSxjKSx0aGlzfWFic2VsbGlwc2UodCxlLG4scyxyLG8sYSxjKXtjb25zdCBsPW5ldyBNcyh0LGUsbixzLHIsbyxhLGMpO2lmKHRoaXMuY3VydmVzLmxlbmd0aD4wKXtjb25zdCB1PWwuZ2V0UG9pbnQoMCk7dS5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyh1LngsdS55KX10aGlzLmN1cnZlcy5wdXNoKGwpO2NvbnN0IGg9bC5nZXRQb2ludCgxKTtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuY29weShoKSx0aGlzfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jdXJyZW50UG9pbnQuY29weSh0LmN1cnJlbnRQb2ludCksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KHQuY3VycmVudFBvaW50KSx0aGlzfX07Y2xhc3MgRGMgZXh0ZW5kcyBPY3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnV1aWQ9Qm4oKSx0aGlzLnR5cGU9IlNoYXBlIix0aGlzLmhvbGVzPVtdfWdldFBvaW50c0hvbGVzKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTAscz10aGlzLmhvbGVzLmxlbmd0aDtuPHM7bisrKWVbbl09dGhpcy5ob2xlc1tuXS5nZXRQb2ludHModCk7cmV0dXJuIGV9ZXh0cmFjdFBvaW50cyh0KXtyZXR1cm57c2hhcGU6dGhpcy5nZXRQb2ludHModCksaG9sZXM6dGhpcy5nZXRQb2ludHNIb2xlcyh0KX19Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10LmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuaG9sZXNbZV07dGhpcy5ob2xlcy5wdXNoKHMuY2xvbmUoKSl9cmV0dXJuIHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LnV1aWQ9dGhpcy51dWlkLHQuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10aGlzLmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXRoaXMuaG9sZXNbZV07dC5ob2xlcy5wdXNoKHMudG9KU09OKCkpfXJldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMudXVpZD10LnV1aWQsdGhpcy5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXQuaG9sZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5ob2xlc1tlXTt0aGlzLmhvbGVzLnB1c2gobmV3IE9jKCkuZnJvbUpTT04ocykpfXJldHVybiB0aGlzfX1mdW5jdGlvbiBBZihpLHQsZT0yKXtjb25zdCBuPXQmJnQubGVuZ3RoLHM9bj90WzBdKmU6aS5sZW5ndGg7bGV0IHI9JGMoaSwwLHMsZSwhMCk7Y29uc3Qgbz1bXTtpZighcnx8ci5uZXh0PT09ci5wcmV2KXJldHVybiBvO2xldCBhLGMsbDtpZihuJiYocj1UZihpLHQscixlKSksaS5sZW5ndGg+ODAqZSl7YT0xLzAsYz0xLzA7bGV0IGg9LTEvMCx1PS0xLzA7Zm9yKGxldCBmPWU7ZjxzO2YrPWUpe2NvbnN0IGQ9aVtmXSxwPWlbZisxXTtkPGEmJihhPWQpLHA8YyYmKGM9cCksZD5oJiYoaD1kKSxwPnUmJih1PXApfWw9TWF0aC5tYXgoaC1hLHUtYyksbD1sIT09MD8zMjc2Ny9sOjB9cmV0dXJuIF9pKHIsbyxlLGEsYyxsLDApLG99ZnVuY3Rpb24gJGMoaSx0LGUsbixzKXtsZXQgcjtpZihzPT09T2YoaSx0LGUsbik+MClmb3IobGV0IG89dDtvPGU7bys9bilyPUhjKG8vbnwwLGlbb10saVtvKzFdLHIpO2Vsc2UgZm9yKGxldCBvPWUtbjtvPj10O28tPW4pcj1IYyhvL258MCxpW29dLGlbbysxXSxyKTtyZXR1cm4gciYmcW4ocixyLm5leHQpJiYoemkocikscj1yLm5leHQpLHJ9ZnVuY3Rpb24gZm4oaSx0KXtpZighaSlyZXR1cm4gaTt0fHwodD1pKTtsZXQgZT1pLG47ZG8gaWYobj0hMSwhZS5zdGVpbmVyJiYocW4oZSxlLm5leHQpfHxydChlLnByZXYsZSxlLm5leHQpPT09MCkpe2lmKHppKGUpLGU9dD1lLnByZXYsZT09PWUubmV4dClicmVhaztuPSEwfWVsc2UgZT1lLm5leHQ7d2hpbGUobnx8ZSE9PXQpO3JldHVybiB0fWZ1bmN0aW9uIF9pKGksdCxlLG4scyxyLG8pe2lmKCFpKXJldHVybjshbyYmciYmRmYoaSxuLHMscik7bGV0IGE9aTtmb3IoO2kucHJldiE9PWkubmV4dDspe2NvbnN0IGM9aS5wcmV2LGw9aS5uZXh0O2lmKHI/U2YoaSxuLHMscik6X2YoaSkpe3QucHVzaChjLmksaS5pLGwuaSksemkoaSksaT1sLm5leHQsYT1sLm5leHQ7Y29udGludWV9aWYoaT1sLGk9PT1hKXtvP289PT0xPyhpPXZmKGZuKGkpLHQpLF9pKGksdCxlLG4scyxyLDIpKTpvPT09MiYmemYoaSx0LGUsbixzLHIpOl9pKGZuKGkpLHQsZSxuLHMsciwxKTticmVha319fWZ1bmN0aW9uIF9mKGkpe2NvbnN0IHQ9aS5wcmV2LGU9aSxuPWkubmV4dDtpZihydCh0LGUsbik+PTApcmV0dXJuITE7Y29uc3Qgcz10Lngscj1lLngsbz1uLngsYT10LnksYz1lLnksbD1uLnksaD1NYXRoLm1pbihzLHIsbyksdT1NYXRoLm1pbihhLGMsbCksZj1NYXRoLm1heChzLHIsbyksZD1NYXRoLm1heChhLGMsbCk7bGV0IHA9bi5uZXh0O2Zvcig7cCE9PXQ7KXtpZihwLng+PWgmJnAueDw9ZiYmcC55Pj11JiZwLnk8PWQmJlNpKHMsYSxyLGMsbyxsLHAueCxwLnkpJiZydChwLnByZXYscCxwLm5leHQpPj0wKXJldHVybiExO3A9cC5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIFNmKGksdCxlLG4pe2NvbnN0IHM9aS5wcmV2LHI9aSxvPWkubmV4dDtpZihydChzLHIsbyk+PTApcmV0dXJuITE7Y29uc3QgYT1zLngsYz1yLngsbD1vLngsaD1zLnksdT1yLnksZj1vLnksZD1NYXRoLm1pbihhLGMsbCkscD1NYXRoLm1pbihoLHUsZikseT1NYXRoLm1heChhLGMsbCksbT1NYXRoLm1heChoLHUsZiksZz1DbyhkLHAsdCxlLG4pLGI9Q28oeSxtLHQsZSxuKTtsZXQgdz1pLnByZXZaLHg9aS5uZXh0Wjtmb3IoO3cmJncuej49ZyYmeCYmeC56PD1iOyl7aWYody54Pj1kJiZ3Lng8PXkmJncueT49cCYmdy55PD1tJiZ3IT09cyYmdyE9PW8mJlNpKGEsaCxjLHUsbCxmLHcueCx3LnkpJiZydCh3LnByZXYsdyx3Lm5leHQpPj0wfHwodz13LnByZXZaLHgueD49ZCYmeC54PD15JiZ4Lnk+PXAmJngueTw9bSYmeCE9PXMmJnghPT1vJiZTaShhLGgsYyx1LGwsZix4LngseC55KSYmcnQoeC5wcmV2LHgseC5uZXh0KT49MCkpcmV0dXJuITE7eD14Lm5leHRafWZvcig7dyYmdy56Pj1nOyl7aWYody54Pj1kJiZ3Lng8PXkmJncueT49cCYmdy55PD1tJiZ3IT09cyYmdyE9PW8mJlNpKGEsaCxjLHUsbCxmLHcueCx3LnkpJiZydCh3LnByZXYsdyx3Lm5leHQpPj0wKXJldHVybiExO3c9dy5wcmV2Wn1mb3IoO3gmJnguejw9Yjspe2lmKHgueD49ZCYmeC54PD15JiZ4Lnk+PXAmJngueTw9bSYmeCE9PXMmJnghPT1vJiZTaShhLGgsYyx1LGwsZix4LngseC55KSYmcnQoeC5wcmV2LHgseC5uZXh0KT49MClyZXR1cm4hMTt4PXgubmV4dFp9cmV0dXJuITB9ZnVuY3Rpb24gdmYoaSx0KXtsZXQgZT1pO2Rve2NvbnN0IG49ZS5wcmV2LHM9ZS5uZXh0Lm5leHQ7IXFuKG4scykmJlZjKG4sZSxlLm5leHQscykmJnZpKG4scykmJnZpKHMsbikmJih0LnB1c2gobi5pLGUuaSxzLmkpLHppKGUpLHppKGUubmV4dCksZT1pPXMpLGU9ZS5uZXh0fXdoaWxlKGUhPT1pKTtyZXR1cm4gZm4oZSl9ZnVuY3Rpb24gemYoaSx0LGUsbixzLHIpe2xldCBvPWk7ZG97bGV0IGE9by5uZXh0Lm5leHQ7Zm9yKDthIT09by5wcmV2Oyl7aWYoby5pIT09YS5pJiZOZihvLGEpKXtsZXQgYz1xYyhvLGEpO289Zm4obyxvLm5leHQpLGM9Zm4oYyxjLm5leHQpLF9pKG8sdCxlLG4scyxyLDApLF9pKGMsdCxlLG4scyxyLDApO3JldHVybn1hPWEubmV4dH1vPW8ubmV4dH13aGlsZShvIT09aSl9ZnVuY3Rpb24gVGYoaSx0LGUsbil7Y29uc3Qgcz1bXTtmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9dFtyXSpuLGM9cjxvLTE/dFtyKzFdKm46aS5sZW5ndGgsbD0kYyhpLGEsYyxuLCExKTtsPT09bC5uZXh0JiYobC5zdGVpbmVyPSEwKSxzLnB1c2goa2YobCkpfXMuc29ydChFZik7Zm9yKGxldCByPTA7cjxzLmxlbmd0aDtyKyspZT1QZihzW3JdLGUpO3JldHVybiBlfWZ1bmN0aW9uIEVmKGksdCl7bGV0IGU9aS54LXQueDtpZihlPT09MCYmKGU9aS55LXQueSxlPT09MCkpe2NvbnN0IG49KGkubmV4dC55LWkueSkvKGkubmV4dC54LWkueCkscz0odC5uZXh0LnktdC55KS8odC5uZXh0LngtdC54KTtlPW4tc31yZXR1cm4gZX1mdW5jdGlvbiBQZihpLHQpe2NvbnN0IGU9Q2YoaSx0KTtpZighZSlyZXR1cm4gdDtjb25zdCBuPXFjKGUsaSk7cmV0dXJuIGZuKG4sbi5uZXh0KSxmbihlLGUubmV4dCl9ZnVuY3Rpb24gQ2YoaSx0KXtsZXQgZT10O2NvbnN0IG49aS54LHM9aS55O2xldCByPS0xLzAsbztpZihxbihpLGUpKXJldHVybiBlO2Rve2lmKHFuKGksZS5uZXh0KSlyZXR1cm4gZS5uZXh0O2lmKHM8PWUueSYmcz49ZS5uZXh0LnkmJmUubmV4dC55IT09ZS55KXtjb25zdCB1PWUueCsocy1lLnkpKihlLm5leHQueC1lLngpLyhlLm5leHQueS1lLnkpO2lmKHU8PW4mJnU+ciYmKHI9dSxvPWUueDxlLm5leHQueD9lOmUubmV4dCx1PT09bikpcmV0dXJuIG99ZT1lLm5leHR9d2hpbGUoZSE9PXQpO2lmKCFvKXJldHVybiBudWxsO2NvbnN0IGE9byxjPW8ueCxsPW8ueTtsZXQgaD0xLzA7ZT1vO2Rve2lmKG4+PWUueCYmZS54Pj1jJiZuIT09ZS54JiZVYyhzPGw/bjpyLHMsYyxsLHM8bD9yOm4scyxlLngsZS55KSl7Y29uc3QgdT1NYXRoLmFicyhzLWUueSkvKG4tZS54KTt2aShlLGkpJiYodTxofHx1PT09aCYmKGUueD5vLnh8fGUueD09PW8ueCYmQmYobyxlKSkpJiYobz1lLGg9dSl9ZT1lLm5leHR9d2hpbGUoZSE9PWEpO3JldHVybiBvfWZ1bmN0aW9uIEJmKGksdCl7cmV0dXJuIHJ0KGkucHJldixpLHQucHJldik8MCYmcnQodC5uZXh0LGksaS5uZXh0KTwwfWZ1bmN0aW9uIEZmKGksdCxlLG4pe2xldCBzPWk7ZG8gcy56PT09MCYmKHMuej1DbyhzLngscy55LHQsZSxuKSkscy5wcmV2Wj1zLnByZXYscy5uZXh0Wj1zLm5leHQscz1zLm5leHQ7d2hpbGUocyE9PWkpO3MucHJldloubmV4dFo9bnVsbCxzLnByZXZaPW51bGwsSWYocyl9ZnVuY3Rpb24gSWYoaSl7bGV0IHQsZT0xO2Rve2xldCBuPWkscztpPW51bGw7bGV0IHI9bnVsbDtmb3IodD0wO247KXt0Kys7bGV0IG89bixhPTA7Zm9yKGxldCBsPTA7bDxlJiYoYSsrLG89by5uZXh0WiwhIW8pO2wrKyk7bGV0IGM9ZTtmb3IoO2E+MHx8Yz4wJiZvOylhIT09MCYmKGM9PT0wfHwhb3x8bi56PD1vLnopPyhzPW4sbj1uLm5leHRaLGEtLSk6KHM9byxvPW8ubmV4dFosYy0tKSxyP3IubmV4dFo9czppPXMscy5wcmV2Wj1yLHI9cztuPW99ci5uZXh0Wj1udWxsLGUqPTJ9d2hpbGUodD4xKTtyZXR1cm4gaX1mdW5jdGlvbiBDbyhpLHQsZSxuLHMpe3JldHVybiBpPShpLWUpKnN8MCx0PSh0LW4pKnN8MCxpPShpfGk8PDgpJjE2NzExOTM1LGk9KGl8aTw8NCkmMjUyNjQ1MTM1LGk9KGl8aTw8MikmODU4OTkzNDU5LGk9KGl8aTw8MSkmMTQzMTY1NTc2NSx0PSh0fHQ8PDgpJjE2NzExOTM1LHQ9KHR8dDw8NCkmMjUyNjQ1MTM1LHQ9KHR8dDw8MikmODU4OTkzNDU5LHQ9KHR8dDw8MSkmMTQzMTY1NTc2NSxpfHQ8PDF9ZnVuY3Rpb24ga2YoaSl7bGV0IHQ9aSxlPWk7ZG8odC54PGUueHx8dC54PT09ZS54JiZ0Lnk8ZS55KSYmKGU9dCksdD10Lm5leHQ7d2hpbGUodCE9PWkpO3JldHVybiBlfWZ1bmN0aW9uIFVjKGksdCxlLG4scyxyLG8sYSl7cmV0dXJuKHMtbykqKHQtYSk+PShpLW8pKihyLWEpJiYoaS1vKSoobi1hKT49KGUtbykqKHQtYSkmJihlLW8pKihyLWEpPj0ocy1vKSoobi1hKX1mdW5jdGlvbiBTaShpLHQsZSxuLHMscixvLGEpe3JldHVybiEoaT09PW8mJnQ9PT1hKSYmVWMoaSx0LGUsbixzLHIsbyxhKX1mdW5jdGlvbiBOZihpLHQpe3JldHVybiBpLm5leHQuaSE9PXQuaSYmaS5wcmV2LmkhPT10LmkmJiFSZihpLHQpJiYodmkoaSx0KSYmdmkodCxpKSYmTGYoaSx0KSYmKHJ0KGkucHJldixpLHQucHJldil8fHJ0KGksdC5wcmV2LHQpKXx8cW4oaSx0KSYmcnQoaS5wcmV2LGksaS5uZXh0KT4wJiZydCh0LnByZXYsdCx0Lm5leHQpPjApfWZ1bmN0aW9uIHJ0KGksdCxlKXtyZXR1cm4odC55LWkueSkqKGUueC10LngpLSh0LngtaS54KSooZS55LXQueSl9ZnVuY3Rpb24gcW4oaSx0KXtyZXR1cm4gaS54PT09dC54JiZpLnk9PT10Lnl9ZnVuY3Rpb24gVmMoaSx0LGUsbil7Y29uc3Qgcz1TcyhydChpLHQsZSkpLHI9U3MocnQoaSx0LG4pKSxvPVNzKHJ0KGUsbixpKSksYT1TcyhydChlLG4sdCkpO3JldHVybiEhKHMhPT1yJiZvIT09YXx8cz09PTAmJl9zKGksZSx0KXx8cj09PTAmJl9zKGksbix0KXx8bz09PTAmJl9zKGUsaSxuKXx8YT09PTAmJl9zKGUsdCxuKSl9ZnVuY3Rpb24gX3MoaSx0LGUpe3JldHVybiB0Lng8PU1hdGgubWF4KGkueCxlLngpJiZ0Lng+PU1hdGgubWluKGkueCxlLngpJiZ0Lnk8PU1hdGgubWF4KGkueSxlLnkpJiZ0Lnk+PU1hdGgubWluKGkueSxlLnkpfWZ1bmN0aW9uIFNzKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH1mdW5jdGlvbiBSZihpLHQpe2xldCBlPWk7ZG97aWYoZS5pIT09aS5pJiZlLm5leHQuaSE9PWkuaSYmZS5pIT09dC5pJiZlLm5leHQuaSE9PXQuaSYmVmMoZSxlLm5leHQsaSx0KSlyZXR1cm4hMDtlPWUubmV4dH13aGlsZShlIT09aSk7cmV0dXJuITF9ZnVuY3Rpb24gdmkoaSx0KXtyZXR1cm4gcnQoaS5wcmV2LGksaS5uZXh0KTwwP3J0KGksdCxpLm5leHQpPj0wJiZydChpLGkucHJldix0KT49MDpydChpLHQsaS5wcmV2KTwwfHxydChpLGkubmV4dCx0KTwwfWZ1bmN0aW9uIExmKGksdCl7bGV0IGU9aSxuPSExO2NvbnN0IHM9KGkueCt0LngpLzIscj0oaS55K3QueSkvMjtkbyBlLnk+ciE9ZS5uZXh0Lnk+ciYmZS5uZXh0LnkhPT1lLnkmJnM8KGUubmV4dC54LWUueCkqKHItZS55KS8oZS5uZXh0LnktZS55KStlLngmJihuPSFuKSxlPWUubmV4dDt3aGlsZShlIT09aSk7cmV0dXJuIG59ZnVuY3Rpb24gcWMoaSx0KXtjb25zdCBlPUJvKGkuaSxpLngsaS55KSxuPUJvKHQuaSx0LngsdC55KSxzPWkubmV4dCxyPXQucHJldjtyZXR1cm4gaS5uZXh0PXQsdC5wcmV2PWksZS5uZXh0PXMscy5wcmV2PWUsbi5uZXh0PWUsZS5wcmV2PW4sci5uZXh0PW4sbi5wcmV2PXIsbn1mdW5jdGlvbiBIYyhpLHQsZSxuKXtjb25zdCBzPUJvKGksdCxlKTtyZXR1cm4gbj8ocy5uZXh0PW4ubmV4dCxzLnByZXY9bixuLm5leHQucHJldj1zLG4ubmV4dD1zKToocy5wcmV2PXMscy5uZXh0PXMpLHN9ZnVuY3Rpb24gemkoaSl7aS5uZXh0LnByZXY9aS5wcmV2LGkucHJldi5uZXh0PWkubmV4dCxpLnByZXZaJiYoaS5wcmV2Wi5uZXh0Wj1pLm5leHRaKSxpLm5leHRaJiYoaS5uZXh0Wi5wcmV2Wj1pLnByZXZaKX1mdW5jdGlvbiBCbyhpLHQsZSl7cmV0dXJue2kseDp0LHk6ZSxwcmV2Om51bGwsbmV4dDpudWxsLHo6MCxwcmV2WjpudWxsLG5leHRaOm51bGwsc3RlaW5lcjohMX19ZnVuY3Rpb24gT2YoaSx0LGUsbil7bGV0IHM9MDtmb3IobGV0IHI9dCxvPWUtbjtyPGU7cis9bilzKz0oaVtvXS1pW3JdKSooaVtyKzFdK2lbbysxXSksbz1yO3JldHVybiBzfWNsYXNzIERme3N0YXRpYyB0cmlhbmd1bGF0ZSh0LGUsbj0yKXtyZXR1cm4gQWYodCxlLG4pfX1jbGFzcyBIbntzdGF0aWMgYXJlYSh0KXtjb25zdCBlPXQubGVuZ3RoO2xldCBuPTA7Zm9yKGxldCBzPWUtMSxyPTA7cjxlO3M9cisrKW4rPXRbc10ueCp0W3JdLnktdFtyXS54KnRbc10ueTtyZXR1cm4gbiouNX1zdGF0aWMgaXNDbG9ja1dpc2UodCl7cmV0dXJuIEhuLmFyZWEodCk8MH1zdGF0aWMgdHJpYW5ndWxhdGVTaGFwZSh0LGUpe2NvbnN0IG49W10scz1bXSxyPVtdO1djKHQpLEdjKG4sdCk7bGV0IG89dC5sZW5ndGg7ZS5mb3JFYWNoKFdjKTtmb3IobGV0IGM9MDtjPGUubGVuZ3RoO2MrKylzLnB1c2gobyksbys9ZVtjXS5sZW5ndGgsR2MobixlW2NdKTtjb25zdCBhPURmLnRyaWFuZ3VsYXRlKG4scyk7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKz0zKXIucHVzaChhLnNsaWNlKGMsYyszKSk7cmV0dXJuIHJ9fWZ1bmN0aW9uIFdjKGkpe2NvbnN0IHQ9aS5sZW5ndGg7dD4yJiZpW3QtMV0uZXF1YWxzKGlbMF0pJiZpLnBvcCgpfWZ1bmN0aW9uIEdjKGksdCl7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaS5wdXNoKHRbZV0ueCksaS5wdXNoKHRbZV0ueSl9Y2xhc3MgRm8gZXh0ZW5kcyB1ZXtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxzPTEpe3N1cGVyKCksdGhpcy50eXBlPSJQbGFuZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOnQsaGVpZ2h0OmUsd2lkdGhTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOnN9O2NvbnN0IHI9dC8yLG89ZS8yLGE9TWF0aC5mbG9vcihuKSxjPU1hdGguZmxvb3IocyksbD1hKzEsaD1jKzEsdT10L2EsZj1lL2MsZD1bXSxwPVtdLHk9W10sbT1bXTtmb3IobGV0IGc9MDtnPGg7ZysrKXtjb25zdCBiPWcqZi1vO2ZvcihsZXQgdz0wO3c8bDt3Kyspe2NvbnN0IHg9dyp1LXI7cC5wdXNoKHgsLWIsMCkseS5wdXNoKDAsMCwxKSxtLnB1c2gody9hKSxtLnB1c2goMS1nL2MpfX1mb3IobGV0IGc9MDtnPGM7ZysrKWZvcihsZXQgYj0wO2I8YTtiKyspe2NvbnN0IHc9YitsKmcseD1iK2wqKGcrMSksTT1iKzErbCooZysxKSxBPWIrMStsKmc7ZC5wdXNoKHcseCxBKSxkLnB1c2goeCxNLEEpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQ2UocCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IENlKHksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IENlKG0sMikpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IEZvKHQud2lkdGgsdC5oZWlnaHQsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMpfX1jb25zdCBaYz1uZXcgVCx2cz1uZXcgVDtjbGFzcyBRdHtjb25zdHJ1Y3Rvcih0PW5ldyBULGU9bmV3IFQpe3RoaXMuc3RhcnQ9dCx0aGlzLmVuZD1lfXNldCh0LGUpe3JldHVybiB0aGlzLnN0YXJ0LmNvcHkodCksdGhpcy5lbmQuY29weShlKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuc3RhcnQuY29weSh0LnN0YXJ0KSx0aGlzLmVuZC5jb3B5KHQuZW5kKSx0aGlzfWdldENlbnRlcih0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuc3RhcnQsdGhpcy5lbmQpLm11bHRpcGx5U2NhbGFyKC41KX1kZWx0YSh0KXtyZXR1cm4gdC5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpfWRpc3RhbmNlU3EoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmVuZCl9ZGlzdGFuY2UoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKHRoaXMuZW5kKX1hdCh0LGUpe3JldHVybiB0aGlzLmRlbHRhKGUpLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnN0YXJ0KX1jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKHQsZSl7WmMuc3ViVmVjdG9ycyh0LHRoaXMuc3RhcnQpLHZzLnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCk7Y29uc3Qgbj12cy5kb3QodnMpO2xldCByPXZzLmRvdChaYykvbjtyZXR1cm4gZSYmKHI9WihyLDAsMSkpLHJ9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUsbil7Y29uc3Qgcz10aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIodCxlKTtyZXR1cm4gdGhpcy5kZWx0YShuKS5tdWx0aXBseVNjYWxhcihzKS5hZGQodGhpcy5zdGFydCl9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NCh0KSx0aGlzLmVuZC5hcHBseU1hdHJpeDQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQuc3RhcnQuZXF1YWxzKHRoaXMuc3RhcnQpJiZ0LmVuZC5lcXVhbHModGhpcy5lbmQpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyE9InVuZGVmaW5lZCImJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicmVnaXN0ZXIiLHtkZXRhaWw6e3JldmlzaW9uOkp9fSkpLHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiYod2luZG93Ll9fVEhSRUVfXz9jb25zb2xlLndhcm4oIldBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4iKTp3aW5kb3cuX19USFJFRV9fPUopO2NvbnN0IGRuPW5ldyBNYXAsJGY9KGk9e30pPT4oe2dlbmVyYXRlVG9wVVYodCxlLG4scyxyKXtjb25zdCBvPWVbbiozXSxhPWVbbiozKzFdLGM9ZVtzKjNdLGw9ZVtzKjMrMV0saD1lW3IqM10sdT1lW3IqMysxXTtsZXQgZjtpZihkbi5oYXModCkpZj1kbi5nZXQodCk7ZWxzZXtsZXQgbT1pLmJveDM7aWYoIW0pe209bmV3IGd0O2NvbnN0IHc9dC5wYXJhbWV0ZXJzLnNoYXBlcy5nZXRQb2ludHMoKS5tYXAoeD0+W3gueCx4LnksMF0pLmZsYXQoKTttLnNldEZyb21BcnJheSh3KX1jb25zdCBnPW0uZ2V0U2l6ZShuZXcgVCk7aS5zcGxpdCYmKGcueS89aS5zcGxpdCksZj17Ym94Om0sc2l6ZTpnfSxkbi5zZXQodCxmKX1jb25zdHtib3g6ZCxzaXplOnB9PWYseT1pLnNwbGl0PzEtaS5zcGxpdDowO3JldHVybltuZXcgUigoby1kLm1pbi54KS9wLngsKGEtZC5taW4ueSkvcC55K3kpLG5ldyBSKChjLWQubWluLngpL3AueCwobC1kLm1pbi55KS9wLnkreSksbmV3IFIoKGgtZC5taW4ueCkvcC54LCh1LWQubWluLnkpL3AueSt5KV19LGdlbmVyYXRlU2lkZVdhbGxVVih0LGUsbixzLHIsbyl7Y29uc3QgYT1lW24qM10sYz1lW24qMysxXSxsPWVbbiozKzJdLGg9ZVtzKjNdLHU9ZVtzKjMrMV0sZj1lW3MqMysyXSxkPWVbciozXSxwPWVbciozKzFdLHk9ZVtyKjMrMl0sbT1lW28qM10sZz1lW28qMysxXSxiPWVbbyozKzJdO2xldCB3O2lmKGRuLmhhcyhlKSl3PWRuLmdldChlKTtlbHNle2NvbnN0IEE9bmV3IGd0O0Euc2V0RnJvbUFycmF5KGUpO2NvbnN0IF89QS5nZXRTaXplKG5ldyBUKTtpLnNwbGl0JiYoXy56Lz0xLWkuc3BsaXQpLGkuc2lkZVJlcGVhdCYmKF8uei89aS5zaWRlUmVwZWF0KSx3PXtib3g6QSxzaXplOl99LGRuLnNldChlLHcpfWNvbnN0e2JveDp4LHNpemU6TX09dztyZXR1cm4gTWF0aC5hYnMoYy11KTxNYXRoLmFicyhhLWgpP1tuZXcgUigoYS14Lm1pbi54KS9NLngsKGwteC5taW4ueikvTS56KSxuZXcgUigoaC14Lm1pbi54KS9NLngsKGYteC5taW4ueikvTS56KSxuZXcgUigoZC14Lm1pbi54KS9NLngsKHkteC5taW4ueikvTS56KSxuZXcgUigobS14Lm1pbi54KS9NLngsKGIteC5taW4ueikvTS56KV06W25ldyBSKChjLXgubWluLnkpL00ueSwobC14Lm1pbi56KS9NLnopLG5ldyBSKCh1LXgubWluLnkpL00ueSwoZi14Lm1pbi56KS9NLnopLG5ldyBSKChwLXgubWluLnkpL00ueSwoeS14Lm1pbi56KS9NLnopLG5ldyBSKChnLXgubWluLnkpL00ueSwoYi14Lm1pbi56KS9NLnopXX19KSxVZj0oKT0+e2RuLmNsZWFyKCl9LFZmPXtBcmNDdXJ2ZTpCYyxDYXRtdWxsUm9tQ3VydmUzOkZjLEN1YmljQmV6aWVyQ3VydmU6em8sQ3ViaWNCZXppZXJDdXJ2ZTM6a2MsRWxsaXBzZUN1cnZlOk1zLExpbmVDdXJ2ZTpUbyxMaW5lQ3VydmUzOk5jLFF1YWRyYXRpY0JlemllckN1cnZlOkVvLFF1YWRyYXRpY0JlemllckN1cnZlMzpSYyxTcGxpbmVDdXJ2ZTpQb307Y2xhc3MgV24gZXh0ZW5kcyB1ZXtjb25zdHJ1Y3Rvcih0PW5ldyBEYyhbbmV3IFIoLjUsLjUpLG5ldyBSKC0uNSwuNSksbmV3IFIoLS41LC0uNSksbmV3IFIoLjUsLS41KV0pLGU9e30pe3N1cGVyKCksdGhpcy50eXBlPSJFeHRydWRlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17c2hhcGVzOnQsb3B0aW9uczplfSx0PUFycmF5LmlzQXJyYXkodCk/dDpbdF07Y29uc3Qgbj10aGlzLHM9W10scj1bXTtmb3IobGV0IGE9MCxjPXQubGVuZ3RoO2E8YzthKyspe2NvbnN0IGw9dFthXTtvKGwpfXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IENlKHMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IENlKHIsMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtmdW5jdGlvbiBvKGEpe3ZhciBFdSxQdSxDdTtjb25zdCBjPVtdLGw9ZS5jdXJ2ZVNlZ21lbnRzIT09dm9pZCAwP2UuY3VydmVTZWdtZW50czoxMixoPWUuc3RlcHMhPT12b2lkIDA/ZS5zdGVwczoxLHU9ZS5kZXB0aCE9PXZvaWQgMD9lLmRlcHRoOjE7bGV0IGY9ZS5iZXZlbEVuYWJsZWQhPT12b2lkIDA/ZS5iZXZlbEVuYWJsZWQ6ITAsZD1lLmJldmVsVGhpY2tuZXNzIT09dm9pZCAwP2UuYmV2ZWxUaGlja25lc3M6LjIscD1lLmJldmVsU2l6ZSE9PXZvaWQgMD9lLmJldmVsU2l6ZTpkLS4xLHk9ZS5iZXZlbE9mZnNldCE9PXZvaWQgMD9lLmJldmVsT2Zmc2V0OjAsbT1lLmJldmVsU2VnbWVudHMhPT12b2lkIDA/ZS5iZXZlbFNlZ21lbnRzOjM7Y29uc3QgZz1lLmV4dHJ1ZGVQYXRoLGI9ZS5VVkdlbmVyYXRvciE9PXZvaWQgMD9lLlVWR2VuZXJhdG9yOnFmLHc9KEV1PWUuaGFzVG9wKSE9bnVsbD9FdTohMCx4PShQdT1lLmhhc0JvdHRvbSkhPW51bGw/UHU6ITAsTT0oQ3U9ZS5oYXNTaWRlKSE9bnVsbD9DdTohMDtsZXQgQSxfPSExLFMsRSx6LHY7ZyYmKEE9Zy5nZXRTcGFjZWRQb2ludHMoaCksXz0hMCxmPSExLFM9Zy5jb21wdXRlRnJlbmV0RnJhbWVzKGgsITEpLEU9bmV3IFQsej1uZXcgVCx2PW5ldyBUKSxmfHwobT0wLGQ9MCxwPTAseT0wKTtjb25zdCBDPWEuZXh0cmFjdFBvaW50cyhsKTtsZXQgUD1DLnNoYXBlO2NvbnN0IEY9Qy5ob2xlcztpZighSG4uaXNDbG9ja1dpc2UoUCkpe1A9UC5yZXZlcnNlKCk7Zm9yKGxldCBOPTAsTD1GLmxlbmd0aDtOPEw7TisrKXtjb25zdCBPPUZbTl07SG4uaXNDbG9ja1dpc2UoTykmJihGW05dPU8ucmV2ZXJzZSgpKX19ZnVuY3Rpb24gSShOKXtjb25zdCBPPTEwMDAwMDAwMDAwMDAwMDAxZS0zNjtsZXQgVT1OWzBdO2ZvcihsZXQgJD0xOyQ8PU4ubGVuZ3RoOyQrKyl7Y29uc3QgWT0kJU4ubGVuZ3RoLEc9TltZXSxpdD1HLngtVS54LGN0PUcueS1VLnksd3Q9aXQqaXQrY3QqY3QsWHQ9TWF0aC5tYXgoTWF0aC5hYnMoRy54KSxNYXRoLmFicyhHLnkpLE1hdGguYWJzKFUueCksTWF0aC5hYnMoVS55KSksUG49TypYdCpYdDtpZih3dDw9UG4pe04uc3BsaWNlKFksMSksJC0tO2NvbnRpbnVlfVU9R319SShQKSxGLmZvckVhY2goSSk7Y29uc3Qgaz1GLmxlbmd0aCxEPVA7Zm9yKGxldCBOPTA7TjxrO04rKyl7Y29uc3QgTD1GW05dO1A9UC5jb25jYXQoTCl9ZnVuY3Rpb24gVihOLEwsTyl7cmV0dXJuIEx8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0IiksTi5jbG9uZSgpLmFkZFNjYWxlZFZlY3RvcihMLE8pfWNvbnN0IGo9UC5sZW5ndGg7ZnVuY3Rpb24gZHQoTixMLE8pe2xldCBVLCQsWTtjb25zdCBHPU4ueC1MLngsaXQ9Ti55LUwueSxjdD1PLngtTi54LHd0PU8ueS1OLnksWHQ9RypHK2l0Kml0LFBuPUcqd3QtaXQqY3Q7aWYoTWF0aC5hYnMoUG4pPk51bWJlci5FUFNJTE9OKXtjb25zdCBKdD1NYXRoLnNxcnQoWHQpLEJ1PU1hdGguc3FydChjdCpjdCt3dCp3dCksRnU9TC54LWl0L0p0LEl1PUwueStHL0p0LEFnPU8ueC13dC9CdSxfZz1PLnkrY3QvQnUsa3U9KChBZy1GdSkqd3QtKF9nLUl1KSpjdCkvKEcqd3QtaXQqY3QpO1U9RnUrRyprdS1OLngsJD1JdStpdCprdS1OLnk7Y29uc3QgTnU9VSpVKyQqJDtpZihOdTw9MilyZXR1cm4gbmV3IFIoVSwkKTtZPU1hdGguc3FydChOdS8yKX1lbHNle2xldCBKdD0hMTtHPk51bWJlci5FUFNJTE9OP2N0Pk51bWJlci5FUFNJTE9OJiYoSnQ9ITApOkc8LU51bWJlci5FUFNJTE9OP2N0PC1OdW1iZXIuRVBTSUxPTiYmKEp0PSEwKTpNYXRoLnNpZ24oaXQpPT09TWF0aC5zaWduKHd0KSYmKEp0PSEwKSxKdD8oVT0taXQsJD1HLFk9TWF0aC5zcXJ0KFh0KSk6KFU9RywkPWl0LFk9TWF0aC5zcXJ0KFh0LzIpKX1yZXR1cm4gbmV3IFIoVS9ZLCQvWSl9Y29uc3QgRHQ9W107Zm9yKGxldCBOPTAsTD1ELmxlbmd0aCxPPUwtMSxVPU4rMTtOPEw7TisrLE8rKyxVKyspTz09PUwmJihPPTApLFU9PT1MJiYoVT0wKSxEdFtOXT1kdChEW05dLERbT10sRFtVXSk7Y29uc3QgR3Q9W107bGV0IFp0LG1lPUR0LmNvbmNhdCgpO2ZvcihsZXQgTj0wLEw9aztOPEw7TisrKXtjb25zdCBPPUZbTl07WnQ9W107Zm9yKGxldCBVPTAsJD1PLmxlbmd0aCxZPSQtMSxHPVUrMTtVPCQ7VSsrLFkrKyxHKyspWT09PSQmJihZPTApLEc9PT0kJiYoRz0wKSxadFtVXT1kdChPW1VdLE9bWV0sT1tHXSk7R3QucHVzaChadCksbWU9bWUuY29uY2F0KFp0KX1sZXQgRW47aWYobT09PTApRW49SG4udHJpYW5ndWxhdGVTaGFwZShELEYpO2Vsc2V7Y29uc3QgTj1bXSxMPVtdO2ZvcihsZXQgTz0wO088bTtPKyspe2NvbnN0IFU9Ty9tLCQ9ZCpNYXRoLmNvcyhVKk1hdGguUEkvMiksWT1wKk1hdGguc2luKFUqTWF0aC5QSS8yKSt5O2ZvcihsZXQgRz0wLGl0PUQubGVuZ3RoO0c8aXQ7RysrKXtjb25zdCBjdD1WKERbR10sRHRbR10sWSk7cWUoY3QueCxjdC55LC0kKSxVPT09MCYmTi5wdXNoKGN0KX1mb3IobGV0IEc9MCxpdD1rO0c8aXQ7RysrKXtjb25zdCBjdD1GW0ddO1p0PUd0W0ddO2NvbnN0IHd0PVtdO2ZvcihsZXQgWHQ9MCxQbj1jdC5sZW5ndGg7WHQ8UG47WHQrKyl7Y29uc3QgSnQ9VihjdFtYdF0sWnRbWHRdLFkpO3FlKEp0LngsSnQueSwtJCksVT09PTAmJnd0LnB1c2goSnQpfVU9PT0wJiZMLnB1c2god3QpfX1Fbj1Ibi50cmlhbmd1bGF0ZVNoYXBlKE4sTCl9Y29uc3QgR3I9RW4ubGVuZ3RoLHp1PXAreTtmb3IobGV0IE49MDtOPGo7TisrKXtjb25zdCBMPWY/VihQW05dLG1lW05dLHp1KTpQW05dO18/KHouY29weShTLm5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKEwueCksRS5jb3B5KFMuYmlub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihMLnkpLHYuY29weShBWzBdKS5hZGQoeikuYWRkKEUpLHFlKHYueCx2Lnksdi56KSk6cWUoTC54LEwueSwwKX1mb3IobGV0IE49MTtOPD1oO04rKylmb3IobGV0IEw9MDtMPGo7TCsrKXtjb25zdCBPPWY/VihQW0xdLG1lW0xdLHp1KTpQW0xdO18/KHouY29weShTLm5vcm1hbHNbTl0pLm11bHRpcGx5U2NhbGFyKE8ueCksRS5jb3B5KFMuYmlub3JtYWxzW05dKS5tdWx0aXBseVNjYWxhcihPLnkpLHYuY29weShBW05dKS5hZGQoeikuYWRkKEUpLHFlKHYueCx2Lnksdi56KSk6cWUoTy54LE8ueSx1L2gqTil9Zm9yKGxldCBOPW0tMTtOPj0wO04tLSl7Y29uc3QgTD1OL20sTz1kKk1hdGguY29zKEwqTWF0aC5QSS8yKSxVPXAqTWF0aC5zaW4oTCpNYXRoLlBJLzIpK3k7Zm9yKGxldCAkPTAsWT1ELmxlbmd0aDskPFk7JCsrKXtjb25zdCBHPVYoRFskXSxEdFskXSxVKTtxZShHLngsRy55LHUrTyl9Zm9yKGxldCAkPTAsWT1GLmxlbmd0aDskPFk7JCsrKXtjb25zdCBHPUZbJF07WnQ9R3RbJF07Zm9yKGxldCBpdD0wLGN0PUcubGVuZ3RoO2l0PGN0O2l0Kyspe2NvbnN0IHd0PVYoR1tpdF0sWnRbaXRdLFUpO18/cWUod3QueCx3dC55K0FbaC0xXS55LEFbaC0xXS54K08pOnFlKHd0Lngsd3QueSx1K08pfX19d2coKSxNJiZiZygpO2Z1bmN0aW9uIHdnKCl7Y29uc3QgTj1zLmxlbmd0aC8zO2lmKGYpe2xldCBMPTAsTz1qKkw7aWYoeClmb3IobGV0IFU9MDtVPEdyO1UrKyl7Y29uc3QgJD1FbltVXTtacigkWzJdK08sJFsxXStPLCRbMF0rTyl9aWYoTD1oK20qMixPPWoqTCx3KWZvcihsZXQgVT0wO1U8R3I7VSsrKXtjb25zdCAkPUVuW1VdO1pyKCRbMF0rTywkWzFdK08sJFsyXStPKX19ZWxzZXtpZih4KWZvcihsZXQgTD0wO0w8R3I7TCsrKXtjb25zdCBPPUVuW0xdO1pyKE9bMl0sT1sxXSxPWzBdKX1pZih3KWZvcihsZXQgTD0wO0w8R3I7TCsrKXtjb25zdCBPPUVuW0xdO1pyKE9bMF0raipoLE9bMV0raipoLE9bMl0raipoKX19bi5hZGRHcm91cChOLHMubGVuZ3RoLzMtTiwwKX1mdW5jdGlvbiBiZygpe2NvbnN0IE49cy5sZW5ndGgvMztsZXQgTD0wO1R1KEQsTCksTCs9RC5sZW5ndGg7Zm9yKGxldCBPPTAsVT1GLmxlbmd0aDtPPFU7TysrKXtjb25zdCAkPUZbT107VHUoJCxMKSxMKz0kLmxlbmd0aH1uLmFkZEdyb3VwKE4scy5sZW5ndGgvMy1OLDEpfWZ1bmN0aW9uIFR1KE4sTCl7bGV0IE89Ti5sZW5ndGg7Zm9yKDstLU8+PTA7KXtjb25zdCBVPU87bGV0ICQ9Ty0xOyQ8MCYmKCQ9Ti5sZW5ndGgtMSk7Zm9yKGxldCBZPTAsRz1oK20qMjtZPEc7WSsrKXtjb25zdCBpdD1qKlksY3Q9aiooWSsxKSx3dD1MK1UraXQsWHQ9TCskK2l0LFBuPUwrJCtjdCxKdD1MK1UrY3Q7TWcod3QsWHQsUG4sSnQpfX19ZnVuY3Rpb24gcWUoTixMLE8pe2MucHVzaChOKSxjLnB1c2goTCksYy5wdXNoKE8pfWZ1bmN0aW9uIFpyKE4sTCxPKXtIZShOKSxIZShMKSxIZShPKTtjb25zdCBVPXMubGVuZ3RoLzMsJD1iLmdlbmVyYXRlVG9wVVYobixzLFUtMyxVLTIsVS0xKTtXZSgkWzBdKSxXZSgkWzFdKSxXZSgkWzJdKX1mdW5jdGlvbiBNZyhOLEwsTyxVKXtIZShOKSxIZShMKSxIZShVKSxIZShMKSxIZShPKSxIZShVKTtjb25zdCAkPXMubGVuZ3RoLzMsWT1iLmdlbmVyYXRlU2lkZVdhbGxVVihuLHMsJC02LCQtMywkLTIsJC0xKTtXZShZWzBdKSxXZShZWzFdKSxXZShZWzNdKSxXZShZWzFdKSxXZShZWzJdKSxXZShZWzNdKX1mdW5jdGlvbiBIZShOKXtzLnB1c2goY1tOKjMrMF0pLHMucHVzaChjW04qMysxXSkscy5wdXNoKGNbTiozKzJdKX1mdW5jdGlvbiBXZShOKXtyLnB1c2goTi54KSxyLnB1c2goTi55KX19fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sdC5wYXJhbWV0ZXJzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCksZT10aGlzLnBhcmFtZXRlcnMuc2hhcGVzLG49dGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnM7cmV0dXJuIEhmKGUsbix0KX1zdGF0aWMgZnJvbUpTT04odCxlKXtjb25zdCBuPVtdO2ZvcihsZXQgcj0wLG89dC5zaGFwZXMubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9ZVt0LnNoYXBlc1tyXV07bi5wdXNoKGEpfWNvbnN0IHM9dC5vcHRpb25zLmV4dHJ1ZGVQYXRoO3JldHVybiBzIT09dm9pZCAwJiYodC5vcHRpb25zLmV4dHJ1ZGVQYXRoPW5ldyBWZltgJHtzLnR5cGV9YF0oKS5mcm9tSlNPTihzKSksbmV3IFduKG4sdC5vcHRpb25zKX19Y29uc3QgcWY9e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24oaSx0LGUsbixzKXtjb25zdCByPXRbZSozXSxvPXRbZSozKzFdLGE9dFtuKjNdLGM9dFtuKjMrMV0sbD10W3MqM10saD10W3MqMysxXTtyZXR1cm5bbmV3IFIocixvKSxuZXcgUihhLGMpLG5ldyBSKGwsaCldfSxnZW5lcmF0ZVNpZGVXYWxsVVY6ZnVuY3Rpb24oaSx0LGUsbixzLHIpe2NvbnN0IG89dFtlKjNdLGE9dFtlKjMrMV0sYz10W2UqMysyXSxsPXRbbiozXSxoPXRbbiozKzFdLHU9dFtuKjMrMl0sZj10W3MqM10sZD10W3MqMysxXSxwPXRbcyozKzJdLHk9dFtyKjNdLG09dFtyKjMrMV0sZz10W3IqMysyXTtyZXR1cm4gTWF0aC5hYnMoYS1oKTxNYXRoLmFicyhvLWwpP1tuZXcgUihvLDEtYyksbmV3IFIobCwxLXUpLG5ldyBSKGYsMS1wKSxuZXcgUih5LDEtZyldOltuZXcgUihhLDEtYyksbmV3IFIoaCwxLXUpLG5ldyBSKGQsMS1wKSxuZXcgUihtLDEtZyldfX07ZnVuY3Rpb24gSGYoaSx0LGUpe2lmKGUuc2hhcGVzPVtdLEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBuPTAscz1pLmxlbmd0aDtuPHM7bisrKXtjb25zdCByPWlbbl07ZS5zaGFwZXMucHVzaChyLnV1aWQpfWVsc2UgZS5zaGFwZXMucHVzaChpLnV1aWQpO3JldHVybiBlLm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSx0KSx0LmV4dHJ1ZGVQYXRoIT09dm9pZCAwJiYoZS5vcHRpb25zLmV4dHJ1ZGVQYXRoPXQuZXh0cnVkZVBhdGgudG9KU09OKCkpLGV9Y29uc3QgWGM9MCxXZj0xLEdmPTIsSmM9MixJbz0xLjI1LFljPTEsVGk9Nio0KzQrNCx6cz02NTUzNSxaZj1NYXRoLnBvdygyLC0yNCksa289U3ltYm9sKCJTS0lQX0dFTkVSQVRJT04iKTtmdW5jdGlvbiBYZihpKXtyZXR1cm4gaS5pbmRleD9pLmluZGV4LmNvdW50OmkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1mdW5jdGlvbiBHbihpKXtyZXR1cm4gWGYoaSkvM31mdW5jdGlvbiBKZihpLHQ9QXJyYXlCdWZmZXIpe3JldHVybiBpPjY1NTM1P25ldyBVaW50MzJBcnJheShuZXcgdCg0KmkpKTpuZXcgVWludDE2QXJyYXkobmV3IHQoMippKSl9ZnVuY3Rpb24gWWYoaSx0KXtpZighaS5pbmRleCl7Y29uc3QgZT1pLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQsbj10LnVzZVNoYXJlZEFycmF5QnVmZmVyP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLHM9SmYoZSxuKTtpLnNldEluZGV4KG5ldyB4dChzLDEpKTtmb3IobGV0IHI9MDtyPGU7cisrKXNbcl09cn19ZnVuY3Rpb24gamMoaSx0KXtjb25zdCBlPUduKGkpLG49dHx8aS5kcmF3UmFuZ2Uscz1uLnN0YXJ0LzMscj0obi5zdGFydCtuLmNvdW50KS8zLG89TWF0aC5tYXgoMCxzKSxhPU1hdGgubWluKGUsciktbztyZXR1cm5be29mZnNldDpNYXRoLmZsb29yKG8pLGNvdW50Ok1hdGguZmxvb3IoYSl9XX1mdW5jdGlvbiBRYyhpLHQpe2lmKCFpLmdyb3Vwc3x8IWkuZ3JvdXBzLmxlbmd0aClyZXR1cm4gamMoaSx0KTtjb25zdCBlPVtdLG49bmV3IFNldCxzPXR8fGkuZHJhd1JhbmdlLHI9cy5zdGFydC8zLG89KHMuc3RhcnQrcy5jb3VudCkvMztmb3IoY29uc3QgYyBvZiBpLmdyb3Vwcyl7Y29uc3QgbD1jLnN0YXJ0LzMsaD0oYy5zdGFydCtjLmNvdW50KS8zO24uYWRkKE1hdGgubWF4KHIsbCkpLG4uYWRkKE1hdGgubWluKG8saCkpfWNvbnN0IGE9QXJyYXkuZnJvbShuLnZhbHVlcygpKS5zb3J0KChjLGwpPT5jLWwpO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGgtMTtjKyspe2NvbnN0IGw9YVtjXSxoPWFbYysxXTtlLnB1c2goe29mZnNldDpNYXRoLmZsb29yKGwpLGNvdW50Ok1hdGguZmxvb3IoaC1sKX0pfXJldHVybiBlfWZ1bmN0aW9uIGpmKGksdCl7Y29uc3QgZT1HbihpKSxuPVFjKGksdCkuc29ydCgobyxhKT0+by5vZmZzZXQtYS5vZmZzZXQpLHM9bltuLmxlbmd0aC0xXTtzLmNvdW50PU1hdGgubWluKGUtcy5vZmZzZXQscy5jb3VudCk7bGV0IHI9MDtyZXR1cm4gbi5mb3JFYWNoKCh7Y291bnQ6b30pPT5yKz1vKSxlIT09cn1mdW5jdGlvbiBObyhpLHQsZSxuLHMpe2xldCByPTEvMCxvPTEvMCxhPTEvMCxjPS0xLzAsbD0tMS8wLGg9LTEvMCx1PTEvMCxmPTEvMCxkPTEvMCxwPS0xLzAseT0tMS8wLG09LTEvMDtmb3IobGV0IGc9dCo2LGI9KHQrZSkqNjtnPGI7Zys9Nil7Y29uc3Qgdz1pW2crMF0seD1pW2crMV0sTT13LXgsQT13K3g7TTxyJiYocj1NKSxBPmMmJihjPUEpLHc8dSYmKHU9dyksdz5wJiYocD13KTtjb25zdCBfPWlbZysyXSxTPWlbZyszXSxFPV8tUyx6PV8rUztFPG8mJihvPUUpLHo+bCYmKGw9eiksXzxmJiYoZj1fKSxfPnkmJih5PV8pO2NvbnN0IHY9aVtnKzRdLEM9aVtnKzVdLFA9di1DLEY9ditDO1A8YSYmKGE9UCksRj5oJiYoaD1GKSx2PGQmJihkPXYpLHY+bSYmKG09dil9blswXT1yLG5bMV09byxuWzJdPWEsblszXT1jLG5bNF09bCxuWzVdPWgsc1swXT11LHNbMV09ZixzWzJdPWQsc1szXT1wLHNbNF09eSxzWzVdPW19ZnVuY3Rpb24gUWYoaSx0PW51bGwsZT1udWxsLG49bnVsbCl7Y29uc3Qgcz1pLmF0dHJpYnV0ZXMucG9zaXRpb24scj1pLmluZGV4P2kuaW5kZXguYXJyYXk6bnVsbCxvPUduKGkpLGE9cy5ub3JtYWxpemVkO2xldCBjO3Q9PT1udWxsPyhjPW5ldyBGbG9hdDMyQXJyYXkobyo2KSxlPTAsbj1vKTooYz10LGU9ZXx8MCxuPW58fG8pO2NvbnN0IGw9cy5hcnJheSxoPXMub2Zmc2V0fHwwO2xldCB1PTM7cy5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYodT1zLmRhdGEuc3RyaWRlKTtjb25zdCBmPVsiZ2V0WCIsImdldFkiLCJnZXRaIl07Zm9yKGxldCBkPWU7ZDxlK247ZCsrKXtjb25zdCBwPWQqMyx5PWQqNjtsZXQgbT1wKzAsZz1wKzEsYj1wKzI7ciYmKG09clttXSxnPXJbZ10sYj1yW2JdKSxhfHwobT1tKnUraCxnPWcqdStoLGI9Yip1K2gpO2ZvcihsZXQgdz0wO3c8Mzt3Kyspe2xldCB4LE0sQTthPyh4PXNbZlt3XV0obSksTT1zW2Zbd11dKGcpLEE9c1tmW3ddXShiKSk6KHg9bFttK3ddLE09bFtnK3ddLEE9bFtiK3ddKTtsZXQgXz14O008XyYmKF89TSksQTxfJiYoXz1BKTtsZXQgUz14O00+UyYmKFM9TSksQT5TJiYoUz1BKTtjb25zdCBFPShTLV8pLzIsej13KjI7Y1t5K3orMF09XytFLGNbeSt6KzFdPUUrKE1hdGguYWJzKF8pK0UpKlpmfX1yZXR1cm4gY31mdW5jdGlvbiBsdChpLHQsZSl7cmV0dXJuIGUubWluLng9dFtpXSxlLm1pbi55PXRbaSsxXSxlLm1pbi56PXRbaSsyXSxlLm1heC54PXRbaSszXSxlLm1heC55PXRbaSs0XSxlLm1heC56PXRbaSs1XSxlfWZ1bmN0aW9uIEtjKGkpe2xldCB0PS0xLGU9LTEvMDtmb3IobGV0IG49MDtuPDM7bisrKXtjb25zdCBzPWlbbiszXS1pW25dO3M+ZSYmKGU9cyx0PW4pfXJldHVybiB0fWZ1bmN0aW9uIHRsKGksdCl7dC5zZXQoaSl9ZnVuY3Rpb24gZWwoaSx0LGUpe2xldCBuLHM7Zm9yKGxldCByPTA7cjwzO3IrKyl7Y29uc3Qgbz1yKzM7bj1pW3JdLHM9dFtyXSxlW3JdPW48cz9uOnMsbj1pW29dLHM9dFtvXSxlW29dPW4+cz9uOnN9fWZ1bmN0aW9uIFRzKGksdCxlKXtmb3IobGV0IG49MDtuPDM7bisrKXtjb25zdCBzPXRbaSsyKm5dLHI9dFtpKzIqbisxXSxvPXMtcixhPXMrcjtvPGVbbl0mJihlW25dPW8pLGE+ZVtuKzNdJiYoZVtuKzNdPWEpfX1mdW5jdGlvbiBFaShpKXtjb25zdCB0PWlbM10taVswXSxlPWlbNF0taVsxXSxuPWlbNV0taVsyXTtyZXR1cm4gMioodCplK2UqbituKnQpfWNvbnN0IEJlPTMyLEtmPShpLHQpPT5pLmNhbmRpZGF0ZS10LmNhbmRpZGF0ZSxRZT1uZXcgQXJyYXkoQmUpLmZpbGwoKS5tYXAoKCk9Pih7Y291bnQ6MCxib3VuZHM6bmV3IEZsb2F0MzJBcnJheSg2KSxyaWdodENhY2hlQm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNiksbGVmdENhY2hlQm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNiksY2FuZGlkYXRlOjB9KSksRXM9bmV3IEZsb2F0MzJBcnJheSg2KTtmdW5jdGlvbiB0ZChpLHQsZSxuLHMscil7bGV0IG89LTEsYT0wO2lmKHI9PT1YYylvPUtjKHQpLG8hPT0tMSYmKGE9KHRbb10rdFtvKzNdKS8yKTtlbHNlIGlmKHI9PT1XZilvPUtjKGkpLG8hPT0tMSYmKGE9ZWQoZSxuLHMsbykpO2Vsc2UgaWYocj09PUdmKXtjb25zdCBjPUVpKGkpO2xldCBsPUlvKnM7Y29uc3QgaD1uKjYsdT0obitzKSo2O2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9dFtmXSxtPSh0W2YrM10tZCkvQmU7aWYoczxCZS80KXtjb25zdCBnPVsuLi5RZV07Zy5sZW5ndGg9cztsZXQgYj0wO2ZvcihsZXQgeD1oO3g8dTt4Kz02LGIrKyl7Y29uc3QgTT1nW2JdO00uY2FuZGlkYXRlPWVbeCsyKmZdLE0uY291bnQ9MDtjb25zdHtib3VuZHM6QSxsZWZ0Q2FjaGVCb3VuZHM6XyxyaWdodENhY2hlQm91bmRzOlN9PU07Zm9yKGxldCBFPTA7RTwzO0UrKylTW0VdPTEvMCxTW0UrM109LTEvMCxfW0VdPTEvMCxfW0UrM109LTEvMCxBW0VdPTEvMCxBW0UrM109LTEvMDtUcyh4LGUsQSl9Zy5zb3J0KEtmKTtsZXQgdz1zO2ZvcihsZXQgeD0wO3g8dzt4Kyspe2NvbnN0IE09Z1t4XTtmb3IoO3grMTx3JiZnW3grMV0uY2FuZGlkYXRlPT09TS5jYW5kaWRhdGU7KWcuc3BsaWNlKHgrMSwxKSx3LS19Zm9yKGxldCB4PWg7eDx1O3grPTYpe2NvbnN0IE09ZVt4KzIqZl07Zm9yKGxldCBBPTA7QTx3O0ErKyl7Y29uc3QgXz1nW0FdO00+PV8uY2FuZGlkYXRlP1RzKHgsZSxfLnJpZ2h0Q2FjaGVCb3VuZHMpOihUcyh4LGUsXy5sZWZ0Q2FjaGVCb3VuZHMpLF8uY291bnQrKyl9fWZvcihsZXQgeD0wO3g8dzt4Kyspe2NvbnN0IE09Z1t4XSxBPU0uY291bnQsXz1zLU0uY291bnQsUz1NLmxlZnRDYWNoZUJvdW5kcyxFPU0ucmlnaHRDYWNoZUJvdW5kcztsZXQgej0wO0EhPT0wJiYoej1FaShTKS9jKTtsZXQgdj0wO18hPT0wJiYodj1FaShFKS9jKTtjb25zdCBDPVljK0lvKih6KkErdipfKTtDPGwmJihvPWYsbD1DLGE9TS5jYW5kaWRhdGUpfX1lbHNle2ZvcihsZXQgdz0wO3c8QmU7dysrKXtjb25zdCB4PVFlW3ddO3guY291bnQ9MCx4LmNhbmRpZGF0ZT1kK20rdyptO2NvbnN0IE09eC5ib3VuZHM7Zm9yKGxldCBBPTA7QTwzO0ErKylNW0FdPTEvMCxNW0ErM109LTEvMH1mb3IobGV0IHc9aDt3PHU7dys9Nil7bGV0IEE9fn4oKGVbdysyKmZdLWQpL20pO0E+PUJlJiYoQT1CZS0xKTtjb25zdCBfPVFlW0FdO18uY291bnQrKyxUcyh3LGUsXy5ib3VuZHMpfWNvbnN0IGc9UWVbQmUtMV07dGwoZy5ib3VuZHMsZy5yaWdodENhY2hlQm91bmRzKTtmb3IobGV0IHc9QmUtMjt3Pj0wO3ctLSl7Y29uc3QgeD1RZVt3XSxNPVFlW3crMV07ZWwoeC5ib3VuZHMsTS5yaWdodENhY2hlQm91bmRzLHgucmlnaHRDYWNoZUJvdW5kcyl9bGV0IGI9MDtmb3IobGV0IHc9MDt3PEJlLTE7dysrKXtjb25zdCB4PVFlW3ddLE09eC5jb3VudCxBPXguYm91bmRzLFM9UWVbdysxXS5yaWdodENhY2hlQm91bmRzO00hPT0wJiYoYj09PTA/dGwoQSxFcyk6ZWwoQSxFcyxFcykpLGIrPU07bGV0IEU9MCx6PTA7YiE9PTAmJihFPUVpKEVzKS9jKTtjb25zdCB2PXMtYjt2IT09MCYmKHo9RWkoUykvYyk7Y29uc3QgQz1ZYytJbyooRSpiK3oqdik7QzxsJiYobz1mLGw9QyxhPXguY2FuZGlkYXRlKX19fX1lbHNlIGNvbnNvbGUud2FybihgTWVzaEJWSDogSW52YWxpZCBidWlsZCBzdHJhdGVneSB2YWx1ZSAke3J9IHVzZWQuYCk7cmV0dXJue2F4aXM6byxwb3M6YX19ZnVuY3Rpb24gZWQoaSx0LGUsbil7bGV0IHM9MDtmb3IobGV0IHI9dCxvPXQrZTtyPG87cisrKXMrPWlbcio2K24qMl07cmV0dXJuIHMvZX1jbGFzcyBSb3tjb25zdHJ1Y3Rvcigpe3RoaXMuYm91bmRpbmdEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNil9fWZ1bmN0aW9uIG5kKGksdCxlLG4scyxyKXtsZXQgbz1uLGE9bitzLTE7Y29uc3QgYz1yLnBvcyxsPXIuYXhpcyoyO2Zvcig7Oyl7Zm9yKDtvPD1hJiZlW28qNitsXTxjOylvKys7Zm9yKDtvPD1hJiZlW2EqNitsXT49YzspYS0tO2lmKG88YSl7Zm9yKGxldCBoPTA7aDwzO2grKyl7bGV0IHU9dFtvKjMraF07dFtvKjMraF09dFthKjMraF0sdFthKjMraF09dX1mb3IobGV0IGg9MDtoPDY7aCsrKXtsZXQgdT1lW28qNitoXTtlW28qNitoXT1lW2EqNitoXSxlW2EqNitoXT11fW8rKyxhLS19ZWxzZSByZXR1cm4gb319ZnVuY3Rpb24gaWQoaSx0LGUsbixzLHIpe2xldCBvPW4sYT1uK3MtMTtjb25zdCBjPXIucG9zLGw9ci5heGlzKjI7Zm9yKDs7KXtmb3IoO288PWEmJmVbbyo2K2xdPGM7KW8rKztmb3IoO288PWEmJmVbYSo2K2xdPj1jOylhLS07aWYobzxhKXtsZXQgaD1pW29dO2lbb109aVthXSxpW2FdPWg7Zm9yKGxldCB1PTA7dTw2O3UrKyl7bGV0IGY9ZVtvKjYrdV07ZVtvKjYrdV09ZVthKjYrdV0sZVthKjYrdV09Zn1vKyssYS0tfWVsc2UgcmV0dXJuIG99fWZ1bmN0aW9uIGt0KGksdCl7cmV0dXJuIHRbaSsxNV09PT02NTUzNX1mdW5jdGlvbiBWdChpLHQpe3JldHVybiB0W2krNl19ZnVuY3Rpb24gS3QoaSx0KXtyZXR1cm4gdFtpKzE0XX1mdW5jdGlvbiB0ZShpKXtyZXR1cm4gaSs4fWZ1bmN0aW9uIGVlKGksdCl7cmV0dXJuIHRbaSs2XX1mdW5jdGlvbiBubChpLHQpe3JldHVybiB0W2krN119ZnVuY3Rpb24gSGcoaSl7cmV0dXJuIGl9bGV0IGlsLFBpLFBzLHNsO2NvbnN0IHNkPU1hdGgucG93KDIsMzIpO2Z1bmN0aW9uIExvKGkpe3JldHVybiJjb3VudCJpbiBpPzE6MStMbyhpLmxlZnQpK0xvKGkucmlnaHQpfWZ1bmN0aW9uIHJkKGksdCxlKXtyZXR1cm4gaWw9bmV3IEZsb2F0MzJBcnJheShlKSxQaT1uZXcgVWludDMyQXJyYXkoZSksUHM9bmV3IFVpbnQxNkFycmF5KGUpLHNsPW5ldyBVaW50OEFycmF5KGUpLE9vKGksdCl9ZnVuY3Rpb24gT28oaSx0KXtjb25zdCBlPWkvNCxuPWkvMixzPSJjb3VudCJpbiB0LHI9dC5ib3VuZGluZ0RhdGE7Zm9yKGxldCBvPTA7bzw2O28rKylpbFtlK29dPXJbb107aWYocylpZih0LmJ1ZmZlcil7Y29uc3Qgbz10LmJ1ZmZlcjtzbC5zZXQobmV3IFVpbnQ4QXJyYXkobyksaSk7Zm9yKGxldCBhPWksYz1pK28uYnl0ZUxlbmd0aDthPGM7YSs9VGkpe2NvbnN0IGw9YS8yO2t0KGwsUHMpfHwoUGlbYS80KzZdKz1lKX1yZXR1cm4gaStvLmJ5dGVMZW5ndGh9ZWxzZXtjb25zdCBvPXQub2Zmc2V0LGE9dC5jb3VudDtyZXR1cm4gUGlbZSs2XT1vLFBzW24rMTRdPWEsUHNbbisxNV09enMsaStUaX1lbHNle2NvbnN0IG89dC5sZWZ0LGE9dC5yaWdodCxjPXQuc3BsaXRBeGlzO2xldCBsO2lmKGw9T28oaStUaSxvKSxsLzQ+c2QpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBDYW5ub3Qgc3RvcmUgY2hpbGQgcG9pbnRlciBncmVhdGVyIHRoYW4gMzIgYml0cy4iKTtyZXR1cm4gUGlbZSs2XT1sLzQsbD1PbyhsLGEpLFBpW2UrN109YyxsfX1mdW5jdGlvbiBvZChpLHQpe2NvbnN0IGU9KGkuaW5kZXg/aS5pbmRleC5jb3VudDppLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQpLzMsbj1lPmRpKDIsMTYpLHM9bj80OjIscj10P25ldyBTaGFyZWRBcnJheUJ1ZmZlcihlKnMpOm5ldyBBcnJheUJ1ZmZlcihlKnMpLG89bj9uZXcgVWludDMyQXJyYXkocik6bmV3IFVpbnQxNkFycmF5KHIpO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKylvW2FdPWE7cmV0dXJuIG99ZnVuY3Rpb24gYWQoaSx0LGUsbixzKXtjb25zdHttYXhEZXB0aDpyLHZlcmJvc2U6byxtYXhMZWFmVHJpczphLHN0cmF0ZWd5OmMsb25Qcm9ncmVzczpsLGluZGlyZWN0Omh9PXMsdT1pLl9pbmRpcmVjdEJ1ZmZlcixmPWkuZ2VvbWV0cnksZD1mLmluZGV4P2YuaW5kZXguYXJyYXk6bnVsbCxwPWg/aWQ6bmQseT1HbihmKSxtPW5ldyBGbG9hdDMyQXJyYXkoNik7bGV0IGc9ITE7Y29uc3QgYj1uZXcgUm87cmV0dXJuIE5vKHQsZSxuLGIuYm91bmRpbmdEYXRhLG0pLHgoYixlLG4sbSksYjtmdW5jdGlvbiB3KE0pe2wmJmwoTS95KX1mdW5jdGlvbiB4KE0sQSxfLFM9bnVsbCxFPTApe2lmKCFnJiZFPj1yJiYoZz0hMCxvJiYoY29uc29sZS53YXJuKGBNZXNoQlZIOiBNYXggZGVwdGggb2YgJHtyfSByZWFjaGVkIHdoZW4gZ2VuZXJhdGluZyBCVkguIENvbnNpZGVyIGluY3JlYXNpbmcgbWF4RGVwdGguYCksY29uc29sZS53YXJuKGYpKSksXzw9YXx8RT49cilyZXR1cm4gdyhBK18pLE0ub2Zmc2V0PUEsTS5jb3VudD1fLE07Y29uc3Qgej10ZChNLmJvdW5kaW5nRGF0YSxTLHQsQSxfLGMpO2lmKHouYXhpcz09PS0xKXJldHVybiB3KEErXyksTS5vZmZzZXQ9QSxNLmNvdW50PV8sTTtjb25zdCB2PXAodSxkLHQsQSxfLHopO2lmKHY9PT1BfHx2PT09QStfKXcoQStfKSxNLm9mZnNldD1BLE0uY291bnQ9XztlbHNle00uc3BsaXRBeGlzPXouYXhpcztjb25zdCBDPW5ldyBSbyxQPUEsRj12LUE7TS5sZWZ0PUMsTm8odCxQLEYsQy5ib3VuZGluZ0RhdGEsbSkseChDLFAsRixtLEUrMSk7Y29uc3QgQj1uZXcgUm8sST12LGs9Xy1GO00ucmlnaHQ9QixObyh0LEksayxCLmJvdW5kaW5nRGF0YSxtKSx4KEIsSSxrLG0sRSsxKX1yZXR1cm4gTX19ZnVuY3Rpb24gY2QoaSx0KXtjb25zdCBlPWkuZ2VvbWV0cnk7dC5pbmRpcmVjdCYmKGkuX2luZGlyZWN0QnVmZmVyPW9kKGUsdC51c2VTaGFyZWRBcnJheUJ1ZmZlciksamYoZSx0LnJhbmdlKSYmIXQudmVyYm9zZSYmY29uc29sZS53YXJuKCdNZXNoQlZIOiBQcm92aWRlZCBnZW9tZXRyeSBjb250YWlucyBncm91cHMgb3IgYSByYW5nZSB0aGF0IGRvIG5vdCBmdWxseSBzcGFuIHRoZSB2ZXJ0ZXggY29udGVudHMgd2hpbGUgdXNpbmcgdGhlICJpbmRpcmVjdCIgb3B0aW9uLiBCVkggbWF5IGluY29ycmVjdGx5IHJlcG9ydCBpbnRlcnNlY3Rpb25zIG9uIHVucmVuZGVyZWQgcG9ydGlvbnMgb2YgdGhlIGdlb21ldHJ5LicpKSxpLl9pbmRpcmVjdEJ1ZmZlcnx8WWYoZSx0KTtjb25zdCBuPXQudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscz1RZihlKSxyPXQuaW5kaXJlY3Q/amMoZSx0LnJhbmdlKTpRYyhlLHQucmFuZ2UpO2kuX3Jvb3RzPXIubWFwKG89Pntjb25zdCBhPWFkKGkscyxvLm9mZnNldCxvLmNvdW50LHQpLGM9TG8oYSksbD1uZXcgbihUaSpjKTtyZXR1cm4gcmQoMCxhLGwpLGx9KX1jbGFzcyBGZXtjb25zdHJ1Y3Rvcigpe3RoaXMubWluPTEvMCx0aGlzLm1heD0tMS8wfXNldEZyb21Qb2ludHNGaWVsZCh0LGUpe2xldCBuPTEvMCxzPS0xLzA7Zm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXtjb25zdCBjPXRbcl1bZV07bj1jPG4/YzpuLHM9Yz5zP2M6c310aGlzLm1pbj1uLHRoaXMubWF4PXN9c2V0RnJvbVBvaW50cyh0LGUpe2xldCBuPTEvMCxzPS0xLzA7Zm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPWVbcl0sYz10LmRvdChhKTtuPWM8bj9jOm4scz1jPnM/YzpzfXRoaXMubWluPW4sdGhpcy5tYXg9c31pc1NlcGFyYXRlZCh0KXtyZXR1cm4gdGhpcy5taW4+dC5tYXh8fHQubWluPnRoaXMubWF4fX1GZS5wcm90b3R5cGUuc2V0RnJvbUJveD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKGUsbil7Y29uc3Qgcz1uLm1pbixyPW4ubWF4O2xldCBvPTEvMCxhPS0xLzA7Zm9yKGxldCBjPTA7Yzw9MTtjKyspZm9yKGxldCBsPTA7bDw9MTtsKyspZm9yKGxldCBoPTA7aDw9MTtoKyspe2kueD1zLngqYytyLngqKDEtYyksaS55PXMueSpsK3IueSooMS1sKSxpLno9cy56Kmgrci56KigxLWgpO2NvbnN0IHU9ZS5kb3QoaSk7bz1NYXRoLm1pbih1LG8pLGE9TWF0aC5tYXgodSxhKX10aGlzLm1pbj1vLHRoaXMubWF4PWF9fSgpO2NvbnN0IGxkPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVCx0PW5ldyBULGU9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKHMscixvKXtjb25zdCBhPXMuc3RhcnQsYz1pLGw9ci5zdGFydCxoPXQ7ZS5zdWJWZWN0b3JzKGEsbCksaS5zdWJWZWN0b3JzKHMuZW5kLHMuc3RhcnQpLHQuc3ViVmVjdG9ycyhyLmVuZCxyLnN0YXJ0KTtjb25zdCB1PWUuZG90KGgpLGY9aC5kb3QoYyksZD1oLmRvdChoKSxwPWUuZG90KGMpLG09Yy5kb3QoYykqZC1mKmY7bGV0IGcsYjttIT09MD9nPSh1KmYtcCpkKS9tOmc9MCxiPSh1K2cqZikvZCxvLng9ZyxvLnk9Yn19KCksRG89ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBSLHQ9bmV3IFQsZT1uZXcgVDtyZXR1cm4gZnVuY3Rpb24ocyxyLG8sYSl7bGQocyxyLGkpO2xldCBjPWkueCxsPWkueTtpZihjPj0wJiZjPD0xJiZsPj0wJiZsPD0xKXtzLmF0KGMsbyksci5hdChsLGEpO3JldHVybn1lbHNlIGlmKGM+PTAmJmM8PTEpe2w8MD9yLmF0KDAsYSk6ci5hdCgxLGEpLHMuY2xvc2VzdFBvaW50VG9Qb2ludChhLCEwLG8pO3JldHVybn1lbHNlIGlmKGw+PTAmJmw8PTEpe2M8MD9zLmF0KDAsbyk6cy5hdCgxLG8pLHIuY2xvc2VzdFBvaW50VG9Qb2ludChvLCEwLGEpO3JldHVybn1lbHNle2xldCBoO2M8MD9oPXMuc3RhcnQ6aD1zLmVuZDtsZXQgdTtsPDA/dT1yLnN0YXJ0OnU9ci5lbmQ7Y29uc3QgZj10LGQ9ZTtpZihzLmNsb3Nlc3RQb2ludFRvUG9pbnQodSwhMCx0KSxyLmNsb3Nlc3RQb2ludFRvUG9pbnQoaCwhMCxlKSxmLmRpc3RhbmNlVG9TcXVhcmVkKHUpPD1kLmRpc3RhbmNlVG9TcXVhcmVkKGgpKXtvLmNvcHkoZiksYS5jb3B5KHUpO3JldHVybn1lbHNle28uY29weShoKSxhLmNvcHkoZCk7cmV0dXJufX19fSgpLGhkPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVCx0PW5ldyBULGU9bmV3IE1vLG49bmV3IFF0O3JldHVybiBmdW5jdGlvbihyLG8pe2NvbnN0e3JhZGl1czphLGNlbnRlcjpjfT1yLHthOmwsYjpoLGM6dX09bztpZihuLnN0YXJ0PWwsbi5lbmQ9aCxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYywhMCxpKS5kaXN0YW5jZVRvKGMpPD1hfHwobi5zdGFydD1sLG4uZW5kPXUsbi5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAsaSkuZGlzdGFuY2VUbyhjKTw9YSl8fChuLnN0YXJ0PWgsbi5lbmQ9dSxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYywhMCxpKS5kaXN0YW5jZVRvKGMpPD1hKSlyZXR1cm4hMDtjb25zdCB5PW8uZ2V0UGxhbmUoZSk7aWYoTWF0aC5hYnMoeS5kaXN0YW5jZVRvUG9pbnQoYykpPD1hKXtjb25zdCBnPXkucHJvamVjdFBvaW50KGMsdCk7aWYoby5jb250YWluc1BvaW50KGcpKXJldHVybiEwfXJldHVybiExfX0oKSx1ZD0xZS0xNTtmdW5jdGlvbiAkbyhpKXtyZXR1cm4gTWF0aC5hYnMoaSk8dWR9Y2xhc3MgbmUgZXh0ZW5kcyBldHtjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLmlzRXh0ZW5kZWRUcmlhbmdsZT0hMCx0aGlzLnNhdEF4ZXM9bmV3IEFycmF5KDQpLmZpbGwoKS5tYXAoKCk9Pm5ldyBUKSx0aGlzLnNhdEJvdW5kcz1uZXcgQXJyYXkoNCkuZmlsbCgpLm1hcCgoKT0+bmV3IEZlKSx0aGlzLnBvaW50cz1bdGhpcy5hLHRoaXMuYix0aGlzLmNdLHRoaXMuc3BoZXJlPW5ldyBpbyx0aGlzLnBsYW5lPW5ldyBNbyx0aGlzLm5lZWRzVXBkYXRlPSEwfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIGhkKHQsdGhpcyl9dXBkYXRlKCl7Y29uc3QgdD10aGlzLmEsZT10aGlzLmIsbj10aGlzLmMscz10aGlzLnBvaW50cyxyPXRoaXMuc2F0QXhlcyxvPXRoaXMuc2F0Qm91bmRzLGE9clswXSxjPW9bMF07dGhpcy5nZXROb3JtYWwoYSksYy5zZXRGcm9tUG9pbnRzKGEscyk7Y29uc3QgbD1yWzFdLGg9b1sxXTtsLnN1YlZlY3RvcnModCxlKSxoLnNldEZyb21Qb2ludHMobCxzKTtjb25zdCB1PXJbMl0sZj1vWzJdO3Uuc3ViVmVjdG9ycyhlLG4pLGYuc2V0RnJvbVBvaW50cyh1LHMpO2NvbnN0IGQ9clszXSxwPW9bM107ZC5zdWJWZWN0b3JzKG4sdCkscC5zZXRGcm9tUG9pbnRzKGQscyksdGhpcy5zcGhlcmUuc2V0RnJvbVBvaW50cyh0aGlzLnBvaW50cyksdGhpcy5wbGFuZS5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChhLHQpLHRoaXMubmVlZHNVcGRhdGU9ITF9fW5lLnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1NlZ21lbnQ9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBULHQ9bmV3IFQsZT1uZXcgUXQ7cmV0dXJuIGZ1bmN0aW9uKHMscj1udWxsLG89bnVsbCl7Y29uc3R7c3RhcnQ6YSxlbmQ6Y309cyxsPXRoaXMucG9pbnRzO2xldCBoLHU9MS8wO2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9KGYrMSklMztlLnN0YXJ0LmNvcHkobFtmXSksZS5lbmQuY29weShsW2RdKSxEbyhlLHMsaSx0KSxoPWkuZGlzdGFuY2VUb1NxdWFyZWQodCksaDx1JiYodT1oLHImJnIuY29weShpKSxvJiZvLmNvcHkodCkpfXJldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoYSxpKSxoPWEuZGlzdGFuY2VUb1NxdWFyZWQoaSksaDx1JiYodT1oLHImJnIuY29weShpKSxvJiZvLmNvcHkoYSkpLHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChjLGkpLGg9Yy5kaXN0YW5jZVRvU3F1YXJlZChpKSxoPHUmJih1PWgsciYmci5jb3B5KGkpLG8mJm8uY29weShjKSksTWF0aC5zcXJ0KHUpfX0oKSxuZS5wcm90b3R5cGUuaW50ZXJzZWN0c1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgbmUsdD1uZXcgQXJyYXkoMyksZT1uZXcgQXJyYXkoMyksbj1uZXcgRmUscz1uZXcgRmUscj1uZXcgVCxvPW5ldyBULGE9bmV3IFQsYz1uZXcgVCxsPW5ldyBULGg9bmV3IFF0LHU9bmV3IFF0LGY9bmV3IFF0LGQ9bmV3IFQ7ZnVuY3Rpb24gcCh5LG0sZyl7Y29uc3QgYj15LnBvaW50cztsZXQgdz0wLHg9LTE7Zm9yKGxldCBNPTA7TTwzO00rKyl7Y29uc3R7c3RhcnQ6QSxlbmQ6X309aDtBLmNvcHkoYltNXSksXy5jb3B5KGJbKE0rMSklM10pLGguZGVsdGEobyk7Y29uc3QgUz0kbyhtLmRpc3RhbmNlVG9Qb2ludChBKSk7aWYoJG8obS5ub3JtYWwuZG90KG8pKSYmUyl7Zy5jb3B5KGgpLHc9MjticmVha31jb25zdCBFPW0uaW50ZXJzZWN0TGluZShoLGQpO2lmKCFFJiZTJiZkLmNvcHkoQSksKEV8fFMpJiYhJG8oZC5kaXN0YW5jZVRvKF8pKSl7aWYodzw9MSkodz09PTE/Zy5zdGFydDpnLmVuZCkuY29weShkKSxTJiYoeD13KTtlbHNlIGlmKHc+PTIpeyh4PT09MT9nLnN0YXJ0OmcuZW5kKS5jb3B5KGQpLHc9MjticmVha31pZih3Kyssdz09PTImJng9PT0tMSlicmVha319cmV0dXJuIHd9cmV0dXJuIGZ1bmN0aW9uKG0sZz1udWxsLGI9ITEpe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksbS5pc0V4dGVuZGVkVHJpYW5nbGU/bS5uZWVkc1VwZGF0ZSYmbS51cGRhdGUoKTooaS5jb3B5KG0pLGkudXBkYXRlKCksbT1pKTtjb25zdCB3PXRoaXMucGxhbmUseD1tLnBsYW5lO2lmKE1hdGguYWJzKHcubm9ybWFsLmRvdCh4Lm5vcm1hbCkpPjEtMWUtMTApe2NvbnN0IE09dGhpcy5zYXRCb3VuZHMsQT10aGlzLnNhdEF4ZXM7ZVswXT1tLmEsZVsxXT1tLmIsZVsyXT1tLmM7Zm9yKGxldCBFPTA7RTw0O0UrKyl7Y29uc3Qgej1NW0VdLHY9QVtFXTtpZihuLnNldEZyb21Qb2ludHModixlKSx6LmlzU2VwYXJhdGVkKG4pKXJldHVybiExfWNvbnN0IF89bS5zYXRCb3VuZHMsUz1tLnNhdEF4ZXM7dFswXT10aGlzLmEsdFsxXT10aGlzLmIsdFsyXT10aGlzLmM7Zm9yKGxldCBFPTA7RTw0O0UrKyl7Y29uc3Qgej1fW0VdLHY9U1tFXTtpZihuLnNldEZyb21Qb2ludHModix0KSx6LmlzU2VwYXJhdGVkKG4pKXJldHVybiExfWZvcihsZXQgRT0wO0U8NDtFKyspe2NvbnN0IHo9QVtFXTtmb3IobGV0IHY9MDt2PDQ7disrKXtjb25zdCBDPVNbdl07aWYoci5jcm9zc1ZlY3RvcnMoeixDKSxuLnNldEZyb21Qb2ludHMocix0KSxzLnNldEZyb21Qb2ludHMocixlKSxuLmlzU2VwYXJhdGVkKHMpKXJldHVybiExfX1yZXR1cm4gZyYmKGJ8fGNvbnNvbGUud2FybigiRXh0ZW5kZWRUcmlhbmdsZS5pbnRlcnNlY3RzVHJpYW5nbGU6IFRyaWFuZ2xlcyBhcmUgY29wbGFuYXIgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBhbiBvdXRwdXQgZWRnZS4gU2V0dGluZyBlZGdlIHRvIDAsIDAsIDAuIiksZy5zdGFydC5zZXQoMCwwLDApLGcuZW5kLnNldCgwLDAsMCkpLCEwfWVsc2V7Y29uc3QgTT1wKHRoaXMseCx1KTtpZihNPT09MSYmbS5jb250YWluc1BvaW50KHUuZW5kKSlyZXR1cm4gZyYmKGcuc3RhcnQuY29weSh1LmVuZCksZy5lbmQuY29weSh1LmVuZCkpLCEwO2lmKE0hPT0yKXJldHVybiExO2NvbnN0IEE9cChtLHcsZik7aWYoQT09PTEmJnRoaXMuY29udGFpbnNQb2ludChmLmVuZCkpcmV0dXJuIGcmJihnLnN0YXJ0LmNvcHkoZi5lbmQpLGcuZW5kLmNvcHkoZi5lbmQpKSwhMDtpZihBIT09MilyZXR1cm4hMTtpZih1LmRlbHRhKGEpLGYuZGVsdGEoYyksYS5kb3QoYyk8MCl7bGV0IFA9Zi5zdGFydDtmLnN0YXJ0PWYuZW5kLGYuZW5kPVB9Y29uc3QgXz11LnN0YXJ0LmRvdChhKSxTPXUuZW5kLmRvdChhKSxFPWYuc3RhcnQuZG90KGEpLHo9Zi5lbmQuZG90KGEpLHY9UzxFLEM9Xzx6O3JldHVybiBfIT09eiYmRSE9PVMmJnY9PT1DPyExOihnJiYobC5zdWJWZWN0b3JzKHUuc3RhcnQsZi5zdGFydCksbC5kb3QoYSk+MD9nLnN0YXJ0LmNvcHkodS5zdGFydCk6Zy5zdGFydC5jb3B5KGYuc3RhcnQpLGwuc3ViVmVjdG9ycyh1LmVuZCxmLmVuZCksbC5kb3QoYSk8MD9nLmVuZC5jb3B5KHUuZW5kKTpnLmVuZC5jb3B5KGYuZW5kKSksITApfX19KCksbmUucHJvdG90eXBlLmRpc3RhbmNlVG9Qb2ludD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoZSxpKSxlLmRpc3RhbmNlVG8oaSl9fSgpLG5lLnByb3RvdHlwZS5kaXN0YW5jZVRvVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBULHQ9bmV3IFQsZT1bImEiLCJiIiwiYyJdLG49bmV3IFF0LHM9bmV3IFF0O3JldHVybiBmdW5jdGlvbihvLGE9bnVsbCxjPW51bGwpe2NvbnN0IGw9YXx8Yz9uOm51bGw7aWYodGhpcy5pbnRlcnNlY3RzVHJpYW5nbGUobyxsKSlyZXR1cm4oYXx8YykmJihhJiZsLmdldENlbnRlcihhKSxjJiZsLmdldENlbnRlcihjKSksMDtsZXQgaD0xLzA7Zm9yKGxldCB1PTA7dTwzO3UrKyl7bGV0IGY7Y29uc3QgZD1lW3VdLHA9b1tkXTt0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocCxpKSxmPXAuZGlzdGFuY2VUb1NxdWFyZWQoaSksZjxoJiYoaD1mLGEmJmEuY29weShpKSxjJiZjLmNvcHkocCkpO2NvbnN0IHk9dGhpc1tkXTtvLmNsb3Nlc3RQb2ludFRvUG9pbnQoeSxpKSxmPXkuZGlzdGFuY2VUb1NxdWFyZWQoaSksZjxoJiYoaD1mLGEmJmEuY29weSh5KSxjJiZjLmNvcHkoaSkpfWZvcihsZXQgdT0wO3U8Mzt1Kyspe2NvbnN0IGY9ZVt1XSxkPWVbKHUrMSklM107bi5zZXQodGhpc1tmXSx0aGlzW2RdKTtmb3IobGV0IHA9MDtwPDM7cCsrKXtjb25zdCB5PWVbcF0sbT1lWyhwKzEpJTNdO3Muc2V0KG9beV0sb1ttXSksRG8obixzLGksdCk7Y29uc3QgZz1pLmRpc3RhbmNlVG9TcXVhcmVkKHQpO2c8aCYmKGg9ZyxhJiZhLmNvcHkoaSksYyYmYy5jb3B5KHQpKX19cmV0dXJuIE1hdGguc3FydChoKX19KCk7Y2xhc3MgenR7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuaXNPcmllbnRlZEJveD0hMCx0aGlzLm1pbj1uZXcgVCx0aGlzLm1heD1uZXcgVCx0aGlzLm1hdHJpeD1uZXcgc3QsdGhpcy5pbnZNYXRyaXg9bmV3IHN0LHRoaXMucG9pbnRzPW5ldyBBcnJheSg4KS5maWxsKCkubWFwKCgpPT5uZXcgVCksdGhpcy5zYXRBeGVzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgVCksdGhpcy5zYXRCb3VuZHM9bmV3IEFycmF5KDMpLmZpbGwoKS5tYXAoKCk9Pm5ldyBGZSksdGhpcy5hbGlnbmVkU2F0Qm91bmRzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgRmUpLHRoaXMubmVlZHNVcGRhdGU9ITEsdCYmdGhpcy5taW4uY29weSh0KSxlJiZ0aGlzLm1heC5jb3B5KGUpLG4mJnRoaXMubWF0cml4LmNvcHkobil9c2V0KHQsZSxuKXt0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpcy5tYXRyaXguY29weShuKSx0aGlzLm5lZWRzVXBkYXRlPSEwfWNvcHkodCl7dGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5uZWVkc1VwZGF0ZT0hMH19enQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe2NvbnN0IHQ9dGhpcy5tYXRyaXgsZT10aGlzLm1pbixuPXRoaXMubWF4LHM9dGhpcy5wb2ludHM7Zm9yKGxldCBsPTA7bDw9MTtsKyspZm9yKGxldCBoPTA7aDw9MTtoKyspZm9yKGxldCB1PTA7dTw9MTt1Kyspe2NvbnN0IGY9MSpsfDIqaHw0KnUsZD1zW2ZdO2QueD1sP24ueDplLngsZC55PWg/bi55OmUueSxkLno9dT9uLno6ZS56LGQuYXBwbHlNYXRyaXg0KHQpfWNvbnN0IHI9dGhpcy5zYXRCb3VuZHMsbz10aGlzLnNhdEF4ZXMsYT1zWzBdO2ZvcihsZXQgbD0wO2w8MztsKyspe2NvbnN0IGg9b1tsXSx1PXJbbF0sZj0xPDxsLGQ9c1tmXTtoLnN1YlZlY3RvcnMoYSxkKSx1LnNldEZyb21Qb2ludHMoaCxzKX1jb25zdCBjPXRoaXMuYWxpZ25lZFNhdEJvdW5kcztjWzBdLnNldEZyb21Qb2ludHNGaWVsZChzLCJ4IiksY1sxXS5zZXRGcm9tUG9pbnRzRmllbGQocywieSIpLGNbMl0uc2V0RnJvbVBvaW50c0ZpZWxkKHMsInoiKSx0aGlzLmludk1hdHJpeC5jb3B5KHRoaXMubWF0cml4KS5pbnZlcnQoKSx0aGlzLm5lZWRzVXBkYXRlPSExfX0oKSx6dC5wcm90b3R5cGUuaW50ZXJzZWN0c0JveD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IEZlO3JldHVybiBmdW5jdGlvbihlKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpO2NvbnN0IG49ZS5taW4scz1lLm1heCxyPXRoaXMuc2F0Qm91bmRzLG89dGhpcy5zYXRBeGVzLGE9dGhpcy5hbGlnbmVkU2F0Qm91bmRzO2lmKGkubWluPW4ueCxpLm1heD1zLngsYVswXS5pc1NlcGFyYXRlZChpKXx8KGkubWluPW4ueSxpLm1heD1zLnksYVsxXS5pc1NlcGFyYXRlZChpKSl8fChpLm1pbj1uLnosaS5tYXg9cy56LGFbMl0uaXNTZXBhcmF0ZWQoaSkpKXJldHVybiExO2ZvcihsZXQgYz0wO2M8MztjKyspe2NvbnN0IGw9b1tjXSxoPXJbY107aWYoaS5zZXRGcm9tQm94KGwsZSksaC5pc1NlcGFyYXRlZChpKSlyZXR1cm4hMX1yZXR1cm4hMH19KCksenQucHJvdG90eXBlLmludGVyc2VjdHNUcmlhbmdsZT1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IG5lLHQ9bmV3IEFycmF5KDMpLGU9bmV3IEZlLG49bmV3IEZlLHM9bmV3IFQ7cmV0dXJuIGZ1bmN0aW9uKG8pe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksby5pc0V4dGVuZGVkVHJpYW5nbGU/by5uZWVkc1VwZGF0ZSYmby51cGRhdGUoKTooaS5jb3B5KG8pLGkudXBkYXRlKCksbz1pKTtjb25zdCBhPXRoaXMuc2F0Qm91bmRzLGM9dGhpcy5zYXRBeGVzO3RbMF09by5hLHRbMV09by5iLHRbMl09by5jO2ZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9YVtmXSxwPWNbZl07aWYoZS5zZXRGcm9tUG9pbnRzKHAsdCksZC5pc1NlcGFyYXRlZChlKSlyZXR1cm4hMX1jb25zdCBsPW8uc2F0Qm91bmRzLGg9by5zYXRBeGVzLHU9dGhpcy5wb2ludHM7Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD1sW2ZdLHA9aFtmXTtpZihlLnNldEZyb21Qb2ludHMocCx1KSxkLmlzU2VwYXJhdGVkKGUpKXJldHVybiExfWZvcihsZXQgZj0wO2Y8MztmKyspe2NvbnN0IGQ9Y1tmXTtmb3IobGV0IHA9MDtwPDQ7cCsrKXtjb25zdCB5PWhbcF07aWYocy5jcm9zc1ZlY3RvcnMoZCx5KSxlLnNldEZyb21Qb2ludHMocyx0KSxuLnNldEZyb21Qb2ludHMocyx1KSxlLmlzU2VwYXJhdGVkKG4pKXJldHVybiExfX1yZXR1cm4hMH19KCksenQucHJvdG90eXBlLmNsb3Nlc3RQb2ludFRvUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSxlLmNvcHkodCkuYXBwbHlNYXRyaXg0KHRoaXMuaW52TWF0cml4KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4KSxlfX0oKSx6dC5wcm90b3R5cGUuZGlzdGFuY2VUb1BvaW50PWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgVDtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChlLGkpLGUuZGlzdGFuY2VUbyhpKX19KCksenQucHJvdG90eXBlLmRpc3RhbmNlVG9Cb3g9ZnVuY3Rpb24oKXtjb25zdCBpPVsieCIsInkiLCJ6Il0sdD1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCk9Pm5ldyBRdCksZT1uZXcgQXJyYXkoMTIpLmZpbGwoKS5tYXAoKCk9Pm5ldyBRdCksbj1uZXcgVCxzPW5ldyBUO3JldHVybiBmdW5jdGlvbihvLGE9MCxjPW51bGwsbD1udWxsKXtpZih0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLHRoaXMuaW50ZXJzZWN0c0JveChvKSlyZXR1cm4oY3x8bCkmJihvLmdldENlbnRlcihzKSx0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQocyxuKSxvLmNsb3Nlc3RQb2ludFRvUG9pbnQobixzKSxjJiZjLmNvcHkobiksbCYmbC5jb3B5KHMpKSwwO2NvbnN0IGg9YSphLHU9by5taW4sZj1vLm1heCxkPXRoaXMucG9pbnRzO2xldCBwPTEvMDtmb3IobGV0IG09MDttPDg7bSsrKXtjb25zdCBnPWRbbV07cy5jb3B5KGcpLmNsYW1wKHUsZik7Y29uc3QgYj1nLmRpc3RhbmNlVG9TcXVhcmVkKHMpO2lmKGI8cCYmKHA9YixjJiZjLmNvcHkoZyksbCYmbC5jb3B5KHMpLGI8aCkpcmV0dXJuIE1hdGguc3FydChiKX1sZXQgeT0wO2ZvcihsZXQgbT0wO208MzttKyspZm9yKGxldCBnPTA7Zzw9MTtnKyspZm9yKGxldCBiPTA7Yjw9MTtiKyspe2NvbnN0IHc9KG0rMSklMyx4PShtKzIpJTMsTT1nPDx3fGI8PHgsQT0xPDxtfGc8PHd8Yjw8eCxfPWRbTV0sUz1kW0FdO3RbeV0uc2V0KF8sUyk7Y29uc3Qgej1pW21dLHY9aVt3XSxDPWlbeF0sUD1lW3ldLEY9UC5zdGFydCxCPVAuZW5kO0Zbel09dVt6XSxGW3ZdPWc/dVt2XTpmW3ZdLEZbQ109Yj91W0NdOmZbdl0sQlt6XT1mW3pdLEJbdl09Zz91W3ZdOmZbdl0sQltDXT1iP3VbQ106Zlt2XSx5Kyt9Zm9yKGxldCBtPTA7bTw9MTttKyspZm9yKGxldCBnPTA7Zzw9MTtnKyspZm9yKGxldCBiPTA7Yjw9MTtiKyspe3MueD1tP2YueDp1Lngscy55PWc/Zi55OnUueSxzLno9Yj9mLno6dS56LHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChzLG4pO2NvbnN0IHc9cy5kaXN0YW5jZVRvU3F1YXJlZChuKTtpZih3PHAmJihwPXcsYyYmYy5jb3B5KG4pLGwmJmwuY29weShzKSx3PGgpKXJldHVybiBNYXRoLnNxcnQodyl9Zm9yKGxldCBtPTA7bTwxMjttKyspe2NvbnN0IGc9dFttXTtmb3IobGV0IGI9MDtiPDEyO2IrKyl7Y29uc3Qgdz1lW2JdO0RvKGcsdyxuLHMpO2NvbnN0IHg9bi5kaXN0YW5jZVRvU3F1YXJlZChzKTtpZih4PHAmJihwPXgsYyYmYy5jb3B5KG4pLGwmJmwuY29weShzKSx4PGgpKXJldHVybiBNYXRoLnNxcnQoeCl9fXJldHVybiBNYXRoLnNxcnQocCl9fSgpO2NsYXNzIFVve2NvbnN0cnVjdG9yKHQpe3RoaXMuX2dldE5ld1ByaW1pdGl2ZT10LHRoaXMuX3ByaW1pdGl2ZXM9W119Z2V0UHJpbWl0aXZlKCl7Y29uc3QgdD10aGlzLl9wcmltaXRpdmVzO3JldHVybiB0Lmxlbmd0aD09PTA/dGhpcy5fZ2V0TmV3UHJpbWl0aXZlKCk6dC5wb3AoKX1yZWxlYXNlUHJpbWl0aXZlKHQpe3RoaXMuX3ByaW1pdGl2ZXMucHVzaCh0KX19Y2xhc3MgZmQgZXh0ZW5kcyBVb3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCgpPT5uZXcgbmUpfX1jb25zdCBpZT1uZXcgZmQ7Y2xhc3MgZGR7Y29uc3RydWN0b3IoKXt0aGlzLmZsb2F0MzJBcnJheT1udWxsLHRoaXMudWludDE2QXJyYXk9bnVsbCx0aGlzLnVpbnQzMkFycmF5PW51bGw7Y29uc3QgdD1bXTtsZXQgZT1udWxsO3RoaXMuc2V0QnVmZmVyPW49PntlJiZ0LnB1c2goZSksZT1uLHRoaXMuZmxvYXQzMkFycmF5PW5ldyBGbG9hdDMyQXJyYXkobiksdGhpcy51aW50MTZBcnJheT1uZXcgVWludDE2QXJyYXkobiksdGhpcy51aW50MzJBcnJheT1uZXcgVWludDMyQXJyYXkobil9LHRoaXMuY2xlYXJCdWZmZXI9KCk9PntlPW51bGwsdGhpcy5mbG9hdDMyQXJyYXk9bnVsbCx0aGlzLnVpbnQxNkFycmF5PW51bGwsdGhpcy51aW50MzJBcnJheT1udWxsLHQubGVuZ3RoIT09MCYmdGhpcy5zZXRCdWZmZXIodC5wb3AoKSl9fX1jb25zdCBudD1uZXcgZGQ7bGV0IEtlLFpuO2NvbnN0IFhuPVtdLENzPW5ldyBVbygoKT0+bmV3IGd0KTtmdW5jdGlvbiBwZChpLHQsZSxuLHMscil7S2U9Q3MuZ2V0UHJpbWl0aXZlKCksWm49Q3MuZ2V0UHJpbWl0aXZlKCksWG4ucHVzaChLZSxabiksbnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBvPVZvKDAsaS5nZW9tZXRyeSxlLG4scyxyKTtudC5jbGVhckJ1ZmZlcigpLENzLnJlbGVhc2VQcmltaXRpdmUoS2UpLENzLnJlbGVhc2VQcmltaXRpdmUoWm4pLFhuLnBvcCgpLFhuLnBvcCgpO2NvbnN0IGE9WG4ubGVuZ3RoO3JldHVybiBhPjAmJihabj1YblthLTFdLEtlPVhuW2EtMl0pLG99ZnVuY3Rpb24gVm8oaSx0LGUsbixzPW51bGwscj0wLG89MCl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTpsfT1udDtsZXQgaD1pKjI7aWYoa3QoaCxjKSl7Y29uc3QgZj1WdChpLGwpLGQ9S3QoaCxjKTtyZXR1cm4gbHQoaSxhLEtlKSxuKGYsZCwhMSxvLHIraSxLZSl9ZWxzZXtsZXQgej1mdW5jdGlvbihDKXtjb25zdHt1aW50MTZBcnJheTpQLHVpbnQzMkFycmF5OkZ9PW50O2xldCBCPUMqMjtmb3IoOyFrdChCLFApOylDPXRlKEMpLEI9QyoyO3JldHVybiBWdChDLEYpfSx2PWZ1bmN0aW9uKEMpe2NvbnN0e3VpbnQxNkFycmF5OlAsdWludDMyQXJyYXk6Rn09bnQ7bGV0IEI9QyoyO2Zvcig7IWt0KEIsUCk7KUM9ZWUoQyxGKSxCPUMqMjtyZXR1cm4gVnQoQyxGKStLdChCLFApfTtjb25zdCBmPXRlKGkpLGQ9ZWUoaSxsKTtsZXQgcD1mLHk9ZCxtLGcsYix3O2lmKHMmJihiPUtlLHc9Wm4sbHQocCxhLGIpLGx0KHksYSx3KSxtPXMoYiksZz1zKHcpLGc8bSkpe3A9ZCx5PWY7Y29uc3QgQz1tO209ZyxnPUMsYj13fWJ8fChiPUtlLGx0KHAsYSxiKSk7Y29uc3QgeD1rdChwKjIsYyksTT1lKGIseCxtLG8rMSxyK3ApO2xldCBBO2lmKE09PT1KYyl7Y29uc3QgQz16KHApLEY9dihwKS1DO0E9bihDLEYsITAsbysxLHIrcCxiKX1lbHNlIEE9TSYmVm8ocCx0LGUsbixzLHIsbysxKTtpZihBKXJldHVybiEwO3c9Wm4sbHQoeSxhLHcpO2NvbnN0IF89a3QoeSoyLGMpLFM9ZSh3LF8sZyxvKzEscit5KTtsZXQgRTtpZihTPT09SmMpe2NvbnN0IEM9eih5KSxGPXYoeSktQztFPW4oQyxGLCEwLG8rMSxyK3ksdyl9ZWxzZSBFPVMmJlZvKHksdCxlLG4scyxyLG8rMSk7cmV0dXJuISFFfX1jb25zdCBDaT1uZXcgVCxxbz1uZXcgVDtmdW5jdGlvbiB5ZChpLHQsZT17fSxuPTAscz0xLzApe2NvbnN0IHI9bipuLG89cypzO2xldCBhPTEvMCxjPW51bGw7aWYoaS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6aD0+KENpLmNvcHkodCkuY2xhbXAoaC5taW4saC5tYXgpLENpLmRpc3RhbmNlVG9TcXVhcmVkKHQpKSxpbnRlcnNlY3RzQm91bmRzOihoLHUsZik9PmY8YSYmZjxvLGludGVyc2VjdHNUcmlhbmdsZTooaCx1KT0+e2guY2xvc2VzdFBvaW50VG9Qb2ludCh0LENpKTtjb25zdCBmPXQuZGlzdGFuY2VUb1NxdWFyZWQoQ2kpO3JldHVybiBmPGEmJihxby5jb3B5KENpKSxhPWYsYz11KSxmPHJ9fSksYT09PTEvMClyZXR1cm4gbnVsbDtjb25zdCBsPU1hdGguc3FydChhKTtyZXR1cm4gZS5wb2ludD9lLnBvaW50LmNvcHkocW8pOmUucG9pbnQ9cW8uY2xvbmUoKSxlLmRpc3RhbmNlPWwsZS5mYWNlSW5kZXg9YyxlfWNvbnN0IG1kPXBhcnNlSW50KEopPj0xNjkscG49bmV3IFQseW49bmV3IFQsbW49bmV3IFQsQnM9bmV3IFIsRnM9bmV3IFIsSXM9bmV3IFIscmw9bmV3IFQsb2w9bmV3IFQsYWw9bmV3IFQsQmk9bmV3IFQ7ZnVuY3Rpb24gZ2QoaSx0LGUsbixzLHIsbyxhKXtsZXQgYztpZihyPT09MT9jPWkuaW50ZXJzZWN0VHJpYW5nbGUobixlLHQsITAscyk6Yz1pLmludGVyc2VjdFRyaWFuZ2xlKHQsZSxuLHIhPT0yLHMpLGM9PT1udWxsKXJldHVybiBudWxsO2NvbnN0IGw9aS5vcmlnaW4uZGlzdGFuY2VUbyhzKTtyZXR1cm4gbDxvfHxsPmE/bnVsbDp7ZGlzdGFuY2U6bCxwb2ludDpzLmNsb25lKCl9fWZ1bmN0aW9uIHhkKGksdCxlLG4scyxyLG8sYSxjLGwsaCl7cG4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LHIpLHluLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxvKSxtbi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsYSk7Y29uc3QgdT1nZChpLHBuLHluLG1uLEJpLGMsbCxoKTtpZih1KXtjb25zdCBmPW5ldyBUO2V0LmdldEJhcnljb29yZChCaSxwbix5bixtbixmKSxuJiYoQnMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHIpLEZzLmZyb21CdWZmZXJBdHRyaWJ1dGUobixvKSxJcy5mcm9tQnVmZmVyQXR0cmlidXRlKG4sYSksdS51dj1ldC5nZXRJbnRlcnBvbGF0aW9uKEJpLHBuLHluLG1uLEJzLEZzLElzLG5ldyBSKSkscyYmKEJzLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxyKSxGcy5mcm9tQnVmZmVyQXR0cmlidXRlKHMsbyksSXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGEpLHUudXYxPWV0LmdldEludGVycG9sYXRpb24oQmkscG4seW4sbW4sQnMsRnMsSXMsbmV3IFIpKSxlJiYocmwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHIpLG9sLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxvKSxhbC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsYSksdS5ub3JtYWw9ZXQuZ2V0SW50ZXJwb2xhdGlvbihCaSxwbix5bixtbixybCxvbCxhbCxuZXcgVCksdS5ub3JtYWwuZG90KGkuZGlyZWN0aW9uKT4wJiZ1Lm5vcm1hbC5tdWx0aXBseVNjYWxhcigtMSkpO2NvbnN0IGQ9e2E6cixiOm8sYzphLG5vcm1hbDpuZXcgVCxtYXRlcmlhbEluZGV4OjB9O2V0LmdldE5vcm1hbChwbix5bixtbixkLm5vcm1hbCksdS5mYWNlPWQsdS5mYWNlSW5kZXg9cixtZCYmKHUuYmFyeWNvb3JkPWYpfXJldHVybiB1fWZ1bmN0aW9uIGtzKGksdCxlLG4scyxyLG8pe2NvbnN0IGE9biozO2xldCBjPWErMCxsPWErMSxoPWErMjtjb25zdCB1PWkuaW5kZXg7aS5pbmRleCYmKGM9dS5nZXRYKGMpLGw9dS5nZXRYKGwpLGg9dS5nZXRYKGgpKTtjb25zdHtwb3NpdGlvbjpmLG5vcm1hbDpkLHV2OnAsdXYxOnl9PWkuYXR0cmlidXRlcyxtPXhkKGUsZixkLHAseSxjLGwsaCx0LHIsbyk7cmV0dXJuIG0/KG0uZmFjZUluZGV4PW4scyYmcy5wdXNoKG0pLG0pOm51bGx9ZnVuY3Rpb24geXQoaSx0LGUsbil7Y29uc3Qgcz1pLmEscj1pLmIsbz1pLmM7bGV0IGE9dCxjPXQrMSxsPXQrMjtlJiYoYT1lLmdldFgoYSksYz1lLmdldFgoYyksbD1lLmdldFgobCkpLHMueD1uLmdldFgoYSkscy55PW4uZ2V0WShhKSxzLno9bi5nZXRaKGEpLHIueD1uLmdldFgoYyksci55PW4uZ2V0WShjKSxyLno9bi5nZXRaKGMpLG8ueD1uLmdldFgobCksby55PW4uZ2V0WShsKSxvLno9bi5nZXRaKGwpfWZ1bmN0aW9uIHdkKGksdCxlLG4scyxyLG8sYSl7Y29uc3R7Z2VvbWV0cnk6YyxfaW5kaXJlY3RCdWZmZXI6bH09aTtmb3IobGV0IGg9bix1PW4rcztoPHU7aCsrKWtzKGMsdCxlLGgscixvLGEpfWZ1bmN0aW9uIGJkKGksdCxlLG4scyxyLG8pe2NvbnN0e2dlb21ldHJ5OmEsX2luZGlyZWN0QnVmZmVyOmN9PWk7bGV0IGw9MS8wLGg9bnVsbDtmb3IobGV0IHU9bixmPW4rczt1PGY7dSsrKXtsZXQgZDtkPWtzKGEsdCxlLHUsbnVsbCxyLG8pLGQmJmQuZGlzdGFuY2U8bCYmKGg9ZCxsPWQuZGlzdGFuY2UpfXJldHVybiBofWZ1bmN0aW9uIE1kKGksdCxlLG4scyxyLG8pe2NvbnN0e2dlb21ldHJ5OmF9PWUse2luZGV4OmN9PWEsbD1hLmF0dHJpYnV0ZXMucG9zaXRpb247Zm9yKGxldCBoPWksdT10K2k7aDx1O2grKyl7bGV0IGY7aWYoZj1oLHl0KG8sZiozLGMsbCksby5uZWVkc1VwZGF0ZT0hMCxuKG8sZixzLHIpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIEFkKGksdD1udWxsKXt0JiZBcnJheS5pc0FycmF5KHQpJiYodD1uZXcgU2V0KHQpKTtjb25zdCBlPWkuZ2VvbWV0cnksbj1lLmluZGV4P2UuaW5kZXguYXJyYXk6bnVsbCxzPWUuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgcixvLGEsYyxsPTA7Y29uc3QgaD1pLl9yb290cztmb3IobGV0IGY9MCxkPWgubGVuZ3RoO2Y8ZDtmKyspcj1oW2ZdLG89bmV3IFVpbnQzMkFycmF5KHIpLGE9bmV3IFVpbnQxNkFycmF5KHIpLGM9bmV3IEZsb2F0MzJBcnJheShyKSx1KDAsbCksbCs9ci5ieXRlTGVuZ3RoO2Z1bmN0aW9uIHUoZixkLHA9ITEpe2NvbnN0IHk9ZioyO2lmKGFbeSsxNV09PT16cyl7Y29uc3QgZz1vW2YrNl0sYj1hW3krMTRdO2xldCB3PTEvMCx4PTEvMCxNPTEvMCxBPS0xLzAsXz0tMS8wLFM9LTEvMDtmb3IobGV0IEU9MypnLHo9MyooZytiKTtFPHo7RSsrKXtsZXQgdj1uW0VdO2NvbnN0IEM9cy5nZXRYKHYpLFA9cy5nZXRZKHYpLEY9cy5nZXRaKHYpO0M8dyYmKHc9QyksQz5BJiYoQT1DKSxQPHgmJih4PVApLFA+XyYmKF89UCksRjxNJiYoTT1GKSxGPlMmJihTPUYpfXJldHVybiBjW2YrMF0hPT13fHxjW2YrMV0hPT14fHxjW2YrMl0hPT1NfHxjW2YrM10hPT1BfHxjW2YrNF0hPT1ffHxjW2YrNV0hPT1TPyhjW2YrMF09dyxjW2YrMV09eCxjW2YrMl09TSxjW2YrM109QSxjW2YrNF09XyxjW2YrNV09UywhMCk6ITF9ZWxzZXtjb25zdCBnPWYrOCxiPW9bZis2XSx3PWcrZCx4PWIrZDtsZXQgTT1wLEE9ITEsXz0hMTt0P018fChBPXQuaGFzKHcpLF89dC5oYXMoeCksTT0hQSYmIV8pOihBPSEwLF89ITApO2NvbnN0IFM9TXx8QSxFPU18fF87bGV0IHo9ITE7UyYmKHo9dShnLGQsTSkpO2xldCB2PSExO0UmJih2PXUoYixkLE0pKTtjb25zdCBDPXp8fHY7aWYoQylmb3IobGV0IFA9MDtQPDM7UCsrKXtjb25zdCBGPWcrUCxCPWIrUCxJPWNbRl0saz1jW0YrM10sRD1jW0JdLFY9Y1tCKzNdO2NbZitQXT1JPEQ/STpELGNbZitQKzNdPWs+Vj9rOlZ9cmV0dXJuIEN9fX1mdW5jdGlvbiB0bihpLHQsZSxuLHMpe2xldCByLG8sYSxjLGwsaDtjb25zdCB1PTEvZS5kaXJlY3Rpb24ueCxmPTEvZS5kaXJlY3Rpb24ueSxkPTEvZS5kaXJlY3Rpb24ueixwPWUub3JpZ2luLngseT1lLm9yaWdpbi55LG09ZS5vcmlnaW4uejtsZXQgZz10W2ldLGI9dFtpKzNdLHc9dFtpKzFdLHg9dFtpKzMrMV0sTT10W2krMl0sQT10W2krMysyXTtyZXR1cm4gdT49MD8ocj0oZy1wKSp1LG89KGItcCkqdSk6KHI9KGItcCkqdSxvPShnLXApKnUpLGY+PTA/KGE9KHcteSkqZixjPSh4LXkpKmYpOihhPSh4LXkpKmYsYz0ody15KSpmKSxyPmN8fGE+b3x8KChhPnJ8fGlzTmFOKHIpKSYmKHI9YSksKGM8b3x8aXNOYU4obykpJiYobz1jKSxkPj0wPyhsPShNLW0pKmQsaD0oQS1tKSpkKToobD0oQS1tKSpkLGg9KE0tbSkqZCkscj5ofHxsPm8pPyExOigobD5yfHxyIT09cikmJihyPWwpLChoPG98fG8hPT1vKSYmKG89aCkscjw9cyYmbz49bil9ZnVuY3Rpb24gX2QoaSx0LGUsbixzLHIsbyxhKXtjb25zdHtnZW9tZXRyeTpjLF9pbmRpcmVjdEJ1ZmZlcjpsfT1pO2ZvcihsZXQgaD1uLHU9bitzO2g8dTtoKyspe2xldCBmPWw/bFtoXTpoO2tzKGMsdCxlLGYscixvLGEpfX1mdW5jdGlvbiBTZChpLHQsZSxuLHMscixvKXtjb25zdHtnZW9tZXRyeTphLF9pbmRpcmVjdEJ1ZmZlcjpjfT1pO2xldCBsPTEvMCxoPW51bGw7Zm9yKGxldCB1PW4sZj1uK3M7dTxmO3UrKyl7bGV0IGQ7ZD1rcyhhLHQsZSxjP2NbdV06dSxudWxsLHIsbyksZCYmZC5kaXN0YW5jZTxsJiYoaD1kLGw9ZC5kaXN0YW5jZSl9cmV0dXJuIGh9ZnVuY3Rpb24gdmQoaSx0LGUsbixzLHIsbyl7Y29uc3R7Z2VvbWV0cnk6YX09ZSx7aW5kZXg6Y309YSxsPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IGg9aSx1PXQraTtoPHU7aCsrKXtsZXQgZjtpZihmPWUucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoaCkseXQobyxmKjMsYyxsKSxvLm5lZWRzVXBkYXRlPSEwLG4obyxmLHMscikpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gemQoaSx0LGUsbixzLHIsbyl7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKSxIbygwLGksZSxuLHMscixvKSxudC5jbGVhckJ1ZmZlcigpfWZ1bmN0aW9uIEhvKGksdCxlLG4scyxyLG8pe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6bH09bnQsaD1pKjI7aWYoa3QoaCxjKSl7Y29uc3QgZj1WdChpLGwpLGQ9S3QoaCxjKTt3ZCh0LGUsbixmLGQscyxyLG8pfWVsc2V7Y29uc3QgZj10ZShpKTt0bihmLGEsbixyLG8pJiZIbyhmLHQsZSxuLHMscixvKTtjb25zdCBkPWVlKGksbCk7dG4oZCxhLG4scixvKSYmSG8oZCx0LGUsbixzLHIsbyl9fWNvbnN0IFRkPVsieCIsInkiLCJ6Il07ZnVuY3Rpb24gRWQoaSx0LGUsbixzLHIpe250LnNldEJ1ZmZlcihpLl9yb290c1t0XSk7Y29uc3Qgbz1XbygwLGksZSxuLHMscik7cmV0dXJuIG50LmNsZWFyQnVmZmVyKCksb31mdW5jdGlvbiBXbyhpLHQsZSxuLHMscil7Y29uc3R7ZmxvYXQzMkFycmF5Om8sdWludDE2QXJyYXk6YSx1aW50MzJBcnJheTpjfT1udDtsZXQgbD1pKjI7aWYoa3QobCxhKSl7Y29uc3QgdT1WdChpLGMpLGY9S3QobCxhKTtyZXR1cm4gYmQodCxlLG4sdSxmLHMscil9ZWxzZXtjb25zdCB1PW5sKGksYyksZj1UZFt1XSxwPW4uZGlyZWN0aW9uW2ZdPj0wO2xldCB5LG07cD8oeT10ZShpKSxtPWVlKGksYykpOih5PWVlKGksYyksbT10ZShpKSk7Y29uc3QgYj10bih5LG8sbixzLHIpP1dvKHksdCxlLG4scyxyKTpudWxsO2lmKGIpe2NvbnN0IE09Yi5wb2ludFtmXTtpZihwP008PW9bbSt1XTpNPj1vW20rdSszXSlyZXR1cm4gYn1jb25zdCB4PXRuKG0sbyxuLHMscik/V28obSx0LGUsbixzLHIpOm51bGw7cmV0dXJuIGImJng/Yi5kaXN0YW5jZTw9eC5kaXN0YW5jZT9iOng6Ynx8eHx8bnVsbH19Y29uc3QgTnM9bmV3IGd0LEpuPW5ldyBuZSxZbj1uZXcgbmUsRmk9bmV3IHN0LGNsPW5ldyB6dCxScz1uZXcgenQ7ZnVuY3Rpb24gUGQoaSx0LGUsbil7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBzPUdvKDAsaSxlLG4pO3JldHVybiBudC5jbGVhckJ1ZmZlcigpLHN9ZnVuY3Rpb24gR28oaSx0LGUsbixzPW51bGwpe2NvbnN0e2Zsb2F0MzJBcnJheTpyLHVpbnQxNkFycmF5Om8sdWludDMyQXJyYXk6YX09bnQ7bGV0IGM9aSoyO2lmKHM9PT1udWxsJiYoZS5ib3VuZGluZ0JveHx8ZS5jb21wdXRlQm91bmRpbmdCb3goKSxjbC5zZXQoZS5ib3VuZGluZ0JveC5taW4sZS5ib3VuZGluZ0JveC5tYXgsbikscz1jbCksa3QoYyxvKSl7Y29uc3QgaD10Lmdlb21ldHJ5LHU9aC5pbmRleCxmPWguYXR0cmlidXRlcy5wb3NpdGlvbixkPWUuaW5kZXgscD1lLmF0dHJpYnV0ZXMucG9zaXRpb24seT1WdChpLGEpLG09S3QoYyxvKTtpZihGaS5jb3B5KG4pLmludmVydCgpLGUuYm91bmRzVHJlZSlyZXR1cm4gbHQoaSxyLFJzKSxScy5tYXRyaXguY29weShGaSksUnMubmVlZHNVcGRhdGU9ITAsZS5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpiPT5Scy5pbnRlcnNlY3RzQm94KGIpLGludGVyc2VjdHNUcmlhbmdsZTpiPT57Yi5hLmFwcGx5TWF0cml4NChuKSxiLmIuYXBwbHlNYXRyaXg0KG4pLGIuYy5hcHBseU1hdHJpeDQobiksYi5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHc9eSozLHg9KG0reSkqMzt3PHg7dys9MylpZih5dChZbix3LHUsZiksWW4ubmVlZHNVcGRhdGU9ITAsYi5pbnRlcnNlY3RzVHJpYW5nbGUoWW4pKXJldHVybiEwO3JldHVybiExfX0pO2ZvcihsZXQgZz15KjMsYj0obSt5KSozO2c8YjtnKz0zKXt5dChKbixnLHUsZiksSm4uYS5hcHBseU1hdHJpeDQoRmkpLEpuLmIuYXBwbHlNYXRyaXg0KEZpKSxKbi5jLmFwcGx5TWF0cml4NChGaSksSm4ubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB3PTAseD1kLmNvdW50O3c8eDt3Kz0zKWlmKHl0KFluLHcsZCxwKSxZbi5uZWVkc1VwZGF0ZT0hMCxKbi5pbnRlcnNlY3RzVHJpYW5nbGUoWW4pKXJldHVybiEwfX1lbHNle2NvbnN0IGg9aSs4LHU9YVtpKzZdO3JldHVybiBsdChoLHIsTnMpLCEhKHMuaW50ZXJzZWN0c0JveChOcykmJkdvKGgsdCxlLG4scyl8fChsdCh1LHIsTnMpLHMuaW50ZXJzZWN0c0JveChOcykmJkdvKHUsdCxlLG4scykpKX19Y29uc3QgTHM9bmV3IHN0LFpvPW5ldyB6dCxJaT1uZXcgenQsQ2Q9bmV3IFQsQmQ9bmV3IFQsRmQ9bmV3IFQsSWQ9bmV3IFQ7ZnVuY3Rpb24ga2QoaSx0LGUsbj17fSxzPXt9LHI9MCxvPTEvMCl7dC5ib3VuZGluZ0JveHx8dC5jb21wdXRlQm91bmRpbmdCb3goKSxaby5zZXQodC5ib3VuZGluZ0JveC5taW4sdC5ib3VuZGluZ0JveC5tYXgsZSksWm8ubmVlZHNVcGRhdGU9ITA7Y29uc3QgYT1pLmdlb21ldHJ5LGM9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9YS5pbmRleCxoPXQuYXR0cmlidXRlcy5wb3NpdGlvbix1PXQuaW5kZXgsZj1pZS5nZXRQcmltaXRpdmUoKSxkPWllLmdldFByaW1pdGl2ZSgpO2xldCBwPUNkLHk9QmQsbT1udWxsLGc9bnVsbDtzJiYobT1GZCxnPUlkKTtsZXQgYj0xLzAsdz1udWxsLHg9bnVsbDtyZXR1cm4gTHMuY29weShlKS5pbnZlcnQoKSxJaS5tYXRyaXguY29weShMcyksaS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6TT0+Wm8uZGlzdGFuY2VUb0JveChNKSxpbnRlcnNlY3RzQm91bmRzOihNLEEsXyk9Pl88YiYmXzxvPyhBJiYoSWkubWluLmNvcHkoTS5taW4pLElpLm1heC5jb3B5KE0ubWF4KSxJaS5uZWVkc1VwZGF0ZT0hMCksITApOiExLGludGVyc2VjdHNSYW5nZTooTSxBKT0+e2lmKHQuYm91bmRzVHJlZSlyZXR1cm4gdC5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpTPT5JaS5kaXN0YW5jZVRvQm94KFMpLGludGVyc2VjdHNCb3VuZHM6KFMsRSx6KT0+ejxiJiZ6PG8saW50ZXJzZWN0c1JhbmdlOihTLEUpPT57Zm9yKGxldCB6PVMsdj1TK0U7ejx2O3orKyl7eXQoZCwzKnosdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgQz1NLFA9TStBO0M8UDtDKyspe3l0KGYsMypDLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBGPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihGPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9Rix3PUMseD16KSxGPHIpcmV0dXJuITB9fX19KTt7Y29uc3QgXz1Hbih0KTtmb3IobGV0IFM9MCxFPV87UzxFO1MrKyl7eXQoZCwzKlMsdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgej1NLHY9TStBO3o8djt6Kyspe3l0KGYsMyp6LGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBDPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihDPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9Qyx3PXoseD1TKSxDPHIpcmV0dXJuITB9fX19fSksaWUucmVsZWFzZVByaW1pdGl2ZShmKSxpZS5yZWxlYXNlUHJpbWl0aXZlKGQpLGI9PT0xLzA/bnVsbDoobi5wb2ludD9uLnBvaW50LmNvcHkoeSk6bi5wb2ludD15LmNsb25lKCksbi5kaXN0YW5jZT1iLG4uZmFjZUluZGV4PXcscyYmKHMucG9pbnQ/cy5wb2ludC5jb3B5KGcpOnMucG9pbnQ9Zy5jbG9uZSgpLHMucG9pbnQuYXBwbHlNYXRyaXg0KExzKSx5LmFwcGx5TWF0cml4NChMcykscy5kaXN0YW5jZT15LnN1YihzLnBvaW50KS5sZW5ndGgoKSxzLmZhY2VJbmRleD14KSxuKX1mdW5jdGlvbiBOZChpLHQ9bnVsbCl7dCYmQXJyYXkuaXNBcnJheSh0KSYmKHQ9bmV3IFNldCh0KSk7Y29uc3QgZT1pLmdlb21ldHJ5LG49ZS5pbmRleD9lLmluZGV4LmFycmF5Om51bGwscz1lLmF0dHJpYnV0ZXMucG9zaXRpb247bGV0IHIsbyxhLGMsbD0wO2NvbnN0IGg9aS5fcm9vdHM7Zm9yKGxldCBmPTAsZD1oLmxlbmd0aDtmPGQ7ZisrKXI9aFtmXSxvPW5ldyBVaW50MzJBcnJheShyKSxhPW5ldyBVaW50MTZBcnJheShyKSxjPW5ldyBGbG9hdDMyQXJyYXkociksdSgwLGwpLGwrPXIuYnl0ZUxlbmd0aDtmdW5jdGlvbiB1KGYsZCxwPSExKXtjb25zdCB5PWYqMjtpZihhW3krMTVdPT09enMpe2NvbnN0IGc9b1tmKzZdLGI9YVt5KzE0XTtsZXQgdz0xLzAseD0xLzAsTT0xLzAsQT0tMS8wLF89LTEvMCxTPS0xLzA7Zm9yKGxldCBFPWcsej1nK2I7RTx6O0UrKyl7Y29uc3Qgdj0zKmkucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoRSk7Zm9yKGxldCBDPTA7QzwzO0MrKyl7bGV0IFA9ditDO1A9bj9uW1BdOlA7Y29uc3QgRj1zLmdldFgoUCksQj1zLmdldFkoUCksST1zLmdldFooUCk7Rjx3JiYodz1GKSxGPkEmJihBPUYpLEI8eCYmKHg9QiksQj5fJiYoXz1CKSxJPE0mJihNPUkpLEk+UyYmKFM9SSl9fXJldHVybiBjW2YrMF0hPT13fHxjW2YrMV0hPT14fHxjW2YrMl0hPT1NfHxjW2YrM10hPT1BfHxjW2YrNF0hPT1ffHxjW2YrNV0hPT1TPyhjW2YrMF09dyxjW2YrMV09eCxjW2YrMl09TSxjW2YrM109QSxjW2YrNF09XyxjW2YrNV09UywhMCk6ITF9ZWxzZXtjb25zdCBnPWYrOCxiPW9bZis2XSx3PWcrZCx4PWIrZDtsZXQgTT1wLEE9ITEsXz0hMTt0P018fChBPXQuaGFzKHcpLF89dC5oYXMoeCksTT0hQSYmIV8pOihBPSEwLF89ITApO2NvbnN0IFM9TXx8QSxFPU18fF87bGV0IHo9ITE7UyYmKHo9dShnLGQsTSkpO2xldCB2PSExO0UmJih2PXUoYixkLE0pKTtjb25zdCBDPXp8fHY7aWYoQylmb3IobGV0IFA9MDtQPDM7UCsrKXtjb25zdCBGPWcrUCxCPWIrUCxJPWNbRl0saz1jW0YrM10sRD1jW0JdLFY9Y1tCKzNdO2NbZitQXT1JPEQ/STpELGNbZitQKzNdPWs+Vj9rOlZ9cmV0dXJuIEN9fX1mdW5jdGlvbiBSZChpLHQsZSxuLHMscixvKXtudC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pLFhvKDAsaSxlLG4scyxyLG8pLG50LmNsZWFyQnVmZmVyKCl9ZnVuY3Rpb24gWG8oaSx0LGUsbixzLHIsbyl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTpsfT1udCxoPWkqMjtpZihrdChoLGMpKXtjb25zdCBmPVZ0KGksbCksZD1LdChoLGMpO19kKHQsZSxuLGYsZCxzLHIsbyl9ZWxzZXtjb25zdCBmPXRlKGkpO3RuKGYsYSxuLHIsbykmJlhvKGYsdCxlLG4scyxyLG8pO2NvbnN0IGQ9ZWUoaSxsKTt0bihkLGEsbixyLG8pJiZYbyhkLHQsZSxuLHMscixvKX19Y29uc3QgTGQ9WyJ4IiwieSIsInoiXTtmdW5jdGlvbiBPZChpLHQsZSxuLHMscil7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBvPUpvKDAsaSxlLG4scyxyKTtyZXR1cm4gbnQuY2xlYXJCdWZmZXIoKSxvfWZ1bmN0aW9uIEpvKGksdCxlLG4scyxyKXtjb25zdHtmbG9hdDMyQXJyYXk6byx1aW50MTZBcnJheTphLHVpbnQzMkFycmF5OmN9PW50O2xldCBsPWkqMjtpZihrdChsLGEpKXtjb25zdCB1PVZ0KGksYyksZj1LdChsLGEpO3JldHVybiBTZCh0LGUsbix1LGYscyxyKX1lbHNle2NvbnN0IHU9bmwoaSxjKSxmPUxkW3VdLHA9bi5kaXJlY3Rpb25bZl0+PTA7bGV0IHksbTtwPyh5PXRlKGkpLG09ZWUoaSxjKSk6KHk9ZWUoaSxjKSxtPXRlKGkpKTtjb25zdCBiPXRuKHksbyxuLHMscik/Sm8oeSx0LGUsbixzLHIpOm51bGw7aWYoYil7Y29uc3QgTT1iLnBvaW50W2ZdO2lmKHA/TTw9b1ttK3VdOk0+PW9bbSt1KzNdKXJldHVybiBifWNvbnN0IHg9dG4obSxvLG4scyxyKT9KbyhtLHQsZSxuLHMscik6bnVsbDtyZXR1cm4gYiYmeD9iLmRpc3RhbmNlPD14LmRpc3RhbmNlP2I6eDpifHx4fHxudWxsfX1jb25zdCBPcz1uZXcgZ3Qsam49bmV3IG5lLFFuPW5ldyBuZSxraT1uZXcgc3QsbGw9bmV3IHp0LERzPW5ldyB6dDtmdW5jdGlvbiBEZChpLHQsZSxuKXtudC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pO2NvbnN0IHM9WW8oMCxpLGUsbik7cmV0dXJuIG50LmNsZWFyQnVmZmVyKCksc31mdW5jdGlvbiBZbyhpLHQsZSxuLHM9bnVsbCl7Y29uc3R7ZmxvYXQzMkFycmF5OnIsdWludDE2QXJyYXk6byx1aW50MzJBcnJheTphfT1udDtsZXQgYz1pKjI7aWYocz09PW51bGwmJihlLmJvdW5kaW5nQm94fHxlLmNvbXB1dGVCb3VuZGluZ0JveCgpLGxsLnNldChlLmJvdW5kaW5nQm94Lm1pbixlLmJvdW5kaW5nQm94Lm1heCxuKSxzPWxsKSxrdChjLG8pKXtjb25zdCBoPXQuZ2VvbWV0cnksdT1oLmluZGV4LGY9aC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGQ9ZS5pbmRleCxwPWUuYXR0cmlidXRlcy5wb3NpdGlvbix5PVZ0KGksYSksbT1LdChjLG8pO2lmKGtpLmNvcHkobikuaW52ZXJ0KCksZS5ib3VuZHNUcmVlKXJldHVybiBsdChpLHIsRHMpLERzLm1hdHJpeC5jb3B5KGtpKSxEcy5uZWVkc1VwZGF0ZT0hMCxlLmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtpbnRlcnNlY3RzQm91bmRzOmI9PkRzLmludGVyc2VjdHNCb3goYiksaW50ZXJzZWN0c1RyaWFuZ2xlOmI9PntiLmEuYXBwbHlNYXRyaXg0KG4pLGIuYi5hcHBseU1hdHJpeDQobiksYi5jLmFwcGx5TWF0cml4NChuKSxiLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgdz15LHg9bSt5O3c8eDt3KyspaWYoeXQoUW4sMyp0LnJlc29sdmVUcmlhbmdsZUluZGV4KHcpLHUsZiksUW4ubmVlZHNVcGRhdGU9ITAsYi5pbnRlcnNlY3RzVHJpYW5nbGUoUW4pKXJldHVybiEwO3JldHVybiExfX0pO2ZvcihsZXQgZz15LGI9bSt5O2c8YjtnKyspe2NvbnN0IHc9dC5yZXNvbHZlVHJpYW5nbGVJbmRleChnKTt5dChqbiwzKncsdSxmKSxqbi5hLmFwcGx5TWF0cml4NChraSksam4uYi5hcHBseU1hdHJpeDQoa2kpLGpuLmMuYXBwbHlNYXRyaXg0KGtpKSxqbi5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHg9MCxNPWQuY291bnQ7eDxNO3grPTMpaWYoeXQoUW4seCxkLHApLFFuLm5lZWRzVXBkYXRlPSEwLGpuLmludGVyc2VjdHNUcmlhbmdsZShRbikpcmV0dXJuITB9fWVsc2V7Y29uc3QgaD1pKzgsdT1hW2krNl07cmV0dXJuIGx0KGgscixPcyksISEocy5pbnRlcnNlY3RzQm94KE9zKSYmWW8oaCx0LGUsbixzKXx8KGx0KHUscixPcykscy5pbnRlcnNlY3RzQm94KE9zKSYmWW8odSx0LGUsbixzKSkpfX1jb25zdCAkcz1uZXcgc3Qsam89bmV3IHp0LE5pPW5ldyB6dCwkZD1uZXcgVCxVZD1uZXcgVCxWZD1uZXcgVCxxZD1uZXcgVDtmdW5jdGlvbiBIZChpLHQsZSxuPXt9LHM9e30scj0wLG89MS8wKXt0LmJvdW5kaW5nQm94fHx0LmNvbXB1dGVCb3VuZGluZ0JveCgpLGpvLnNldCh0LmJvdW5kaW5nQm94Lm1pbix0LmJvdW5kaW5nQm94Lm1heCxlKSxqby5uZWVkc1VwZGF0ZT0hMDtjb25zdCBhPWkuZ2VvbWV0cnksYz1hLmF0dHJpYnV0ZXMucG9zaXRpb24sbD1hLmluZGV4LGg9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLHU9dC5pbmRleCxmPWllLmdldFByaW1pdGl2ZSgpLGQ9aWUuZ2V0UHJpbWl0aXZlKCk7bGV0IHA9JGQseT1VZCxtPW51bGwsZz1udWxsO3MmJihtPVZkLGc9cWQpO2xldCBiPTEvMCx3PW51bGwseD1udWxsO3JldHVybiAkcy5jb3B5KGUpLmludmVydCgpLE5pLm1hdHJpeC5jb3B5KCRzKSxpLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpNPT5qby5kaXN0YW5jZVRvQm94KE0pLGludGVyc2VjdHNCb3VuZHM6KE0sQSxfKT0+XzxiJiZfPG8/KEEmJihOaS5taW4uY29weShNLm1pbiksTmkubWF4LmNvcHkoTS5tYXgpLE5pLm5lZWRzVXBkYXRlPSEwKSwhMCk6ITEsaW50ZXJzZWN0c1JhbmdlOihNLEEpPT57aWYodC5ib3VuZHNUcmVlKXtjb25zdCBfPXQuYm91bmRzVHJlZTtyZXR1cm4gXy5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6Uz0+TmkuZGlzdGFuY2VUb0JveChTKSxpbnRlcnNlY3RzQm91bmRzOihTLEUseik9Pno8YiYmejxvLGludGVyc2VjdHNSYW5nZTooUyxFKT0+e2ZvcihsZXQgej1TLHY9UytFO3o8djt6Kyspe2NvbnN0IEM9Xy5yZXNvbHZlVHJpYW5nbGVJbmRleCh6KTt5dChkLDMqQyx1LGgpLGQuYS5hcHBseU1hdHJpeDQoZSksZC5iLmFwcGx5TWF0cml4NChlKSxkLmMuYXBwbHlNYXRyaXg0KGUpLGQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBQPU0sRj1NK0E7UDxGO1ArKyl7Y29uc3QgQj1pLnJlc29sdmVUcmlhbmdsZUluZGV4KFApO3l0KGYsMypCLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBJPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxtKTtpZihJPGImJih5LmNvcHkocCksZyYmZy5jb3B5KG0pLGI9SSx3PVAseD16KSxJPHIpcmV0dXJuITB9fX19KX1lbHNle2NvbnN0IF89R24odCk7Zm9yKGxldCBTPTAsRT1fO1M8RTtTKyspe3l0KGQsMypTLHUsaCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHo9TSx2PU0rQTt6PHY7eisrKXtjb25zdCBDPWkucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoeik7eXQoZiwzKkMsbCxjKSxmLm5lZWRzVXBkYXRlPSEwO2NvbnN0IFA9Zi5kaXN0YW5jZVRvVHJpYW5nbGUoZCxwLG0pO2lmKFA8YiYmKHkuY29weShwKSxnJiZnLmNvcHkobSksYj1QLHc9eix4PVMpLFA8cilyZXR1cm4hMH19fX19KSxpZS5yZWxlYXNlUHJpbWl0aXZlKGYpLGllLnJlbGVhc2VQcmltaXRpdmUoZCksYj09PTEvMD9udWxsOihuLnBvaW50P24ucG9pbnQuY29weSh5KTpuLnBvaW50PXkuY2xvbmUoKSxuLmRpc3RhbmNlPWIsbi5mYWNlSW5kZXg9dyxzJiYocy5wb2ludD9zLnBvaW50LmNvcHkoZyk6cy5wb2ludD1nLmNsb25lKCkscy5wb2ludC5hcHBseU1hdHJpeDQoJHMpLHkuYXBwbHlNYXRyaXg0KCRzKSxzLmRpc3RhbmNlPXkuc3ViKHMucG9pbnQpLmxlbmd0aCgpLHMuZmFjZUluZGV4PXgpLG4pfWZ1bmN0aW9uIFdkKCl7cmV0dXJuIHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciE9InVuZGVmaW5lZCJ9Y29uc3QgUmk9bmV3IG50LmNvbnN0cnVjdG9yLFVzPW5ldyBudC5jb25zdHJ1Y3Rvcixlbj1uZXcgVW8oKCk9Pm5ldyBndCksS249bmV3IGd0LHRpPW5ldyBndCxRbz1uZXcgZ3QsS289bmV3IGd0O2xldCB0YT0hMTtmdW5jdGlvbiBHZChpLHQsZSxuKXtpZih0YSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFJlY3Vyc2l2ZSBjYWxscyB0byBidmhjYXN0IG5vdCBzdXBwb3J0ZWQuIik7dGE9ITA7Y29uc3Qgcz1pLl9yb290cyxyPXQuX3Jvb3RzO2xldCBvLGE9MCxjPTA7Y29uc3QgbD1uZXcgc3QoKS5jb3B5KGUpLmludmVydCgpO2ZvcihsZXQgaD0wLHU9cy5sZW5ndGg7aDx1O2grKyl7Umkuc2V0QnVmZmVyKHNbaF0pLGM9MDtjb25zdCBmPWVuLmdldFByaW1pdGl2ZSgpO2x0KDAsUmkuZmxvYXQzMkFycmF5LGYpLGYuYXBwbHlNYXRyaXg0KGwpO2ZvcihsZXQgZD0wLHA9ci5sZW5ndGg7ZDxwJiYoVXMuc2V0QnVmZmVyKHJbZF0pLG89ZmUoMCwwLGUsbCxuLGEsYywwLDAsZiksVXMuY2xlYXJCdWZmZXIoKSxjKz1yW2RdLmxlbmd0aCwhbyk7ZCsrKTtpZihlbi5yZWxlYXNlUHJpbWl0aXZlKGYpLFJpLmNsZWFyQnVmZmVyKCksYSs9c1toXS5sZW5ndGgsbylicmVha31yZXR1cm4gdGE9ITEsb31mdW5jdGlvbiBmZShpLHQsZSxuLHMscj0wLG89MCxhPTAsYz0wLGw9bnVsbCxoPSExKXtsZXQgdSxmO2g/KHU9VXMsZj1SaSk6KHU9UmksZj1Vcyk7Y29uc3QgZD11LmZsb2F0MzJBcnJheSxwPXUudWludDMyQXJyYXkseT11LnVpbnQxNkFycmF5LG09Zi5mbG9hdDMyQXJyYXksZz1mLnVpbnQzMkFycmF5LGI9Zi51aW50MTZBcnJheSx3PWkqMix4PXQqMixNPWt0KHcseSksQT1rdCh4LGIpO2xldCBfPSExO2lmKEEmJk0paD9fPXMoVnQodCxnKSxLdCh0KjIsYiksVnQoaSxwKSxLdChpKjIseSksYyxvK3QsYSxyK2kpOl89cyhWdChpLHApLEt0KGkqMix5KSxWdCh0LGcpLEt0KHQqMixiKSxhLHIraSxjLG8rdCk7ZWxzZSBpZihBKXtjb25zdCBTPWVuLmdldFByaW1pdGl2ZSgpO2x0KHQsbSxTKSxTLmFwcGx5TWF0cml4NChlKTtjb25zdCBFPXRlKGkpLHo9ZWUoaSxwKTtsdChFLGQsS24pLGx0KHosZCx0aSk7Y29uc3Qgdj1TLmludGVyc2VjdHNCb3goS24pLEM9Uy5pbnRlcnNlY3RzQm94KHRpKTtfPXYmJmZlKHQsRSxuLGUscyxvLHIsYyxhKzEsUywhaCl8fEMmJmZlKHQseixuLGUscyxvLHIsYyxhKzEsUywhaCksZW4ucmVsZWFzZVByaW1pdGl2ZShTKX1lbHNle2NvbnN0IFM9dGUodCksRT1lZSh0LGcpO2x0KFMsbSxRbyksbHQoRSxtLEtvKTtjb25zdCB6PWwuaW50ZXJzZWN0c0JveChRbyksdj1sLmludGVyc2VjdHNCb3goS28pO2lmKHomJnYpXz1mZShpLFMsZSxuLHMscixvLGEsYysxLGwsaCl8fGZlKGksRSxlLG4scyxyLG8sYSxjKzEsbCxoKTtlbHNlIGlmKHopaWYoTSlfPWZlKGksUyxlLG4scyxyLG8sYSxjKzEsbCxoKTtlbHNle2NvbnN0IEM9ZW4uZ2V0UHJpbWl0aXZlKCk7Qy5jb3B5KFFvKS5hcHBseU1hdHJpeDQoZSk7Y29uc3QgUD10ZShpKSxGPWVlKGkscCk7bHQoUCxkLEtuKSxsdChGLGQsdGkpO2NvbnN0IEI9Qy5pbnRlcnNlY3RzQm94KEtuKSxJPUMuaW50ZXJzZWN0c0JveCh0aSk7Xz1CJiZmZShTLFAsbixlLHMsbyxyLGMsYSsxLEMsIWgpfHxJJiZmZShTLEYsbixlLHMsbyxyLGMsYSsxLEMsIWgpLGVuLnJlbGVhc2VQcmltaXRpdmUoQyl9ZWxzZSBpZih2KWlmKE0pXz1mZShpLEUsZSxuLHMscixvLGEsYysxLGwsaCk7ZWxzZXtjb25zdCBDPWVuLmdldFByaW1pdGl2ZSgpO0MuY29weShLbykuYXBwbHlNYXRyaXg0KGUpO2NvbnN0IFA9dGUoaSksRj1lZShpLHApO2x0KFAsZCxLbiksbHQoRixkLHRpKTtjb25zdCBCPUMuaW50ZXJzZWN0c0JveChLbiksST1DLmludGVyc2VjdHNCb3godGkpO189QiYmZmUoRSxQLG4sZSxzLG8scixjLGErMSxDLCFoKXx8SSYmZmUoRSxGLG4sZSxzLG8scixjLGErMSxDLCFoKSxlbi5yZWxlYXNlUHJpbWl0aXZlKEMpfX1yZXR1cm4gX31jb25zdCBWcz1uZXcgenQsaGw9bmV3IGd0LFpkPXtzdHJhdGVneTpYYyxtYXhEZXB0aDo0MCxtYXhMZWFmVHJpczoxMCx1c2VTaGFyZWRBcnJheUJ1ZmZlcjohMSxzZXRCb3VuZGluZ0JveDohMCxvblByb2dyZXNzOm51bGwsaW5kaXJlY3Q6ITEsdmVyYm9zZTohMCxyYW5nZTpudWxsfTtjbGFzcyBlYXtzdGF0aWMgc2VyaWFsaXplKHQsZT17fSl7ZT1GdCh7Y2xvbmVCdWZmZXJzOiEwfSxlKTtjb25zdCBuPXQuZ2VvbWV0cnkscz10Ll9yb290cyxyPXQuX2luZGlyZWN0QnVmZmVyLG89bi5nZXRJbmRleCgpO2xldCBhO3JldHVybiBlLmNsb25lQnVmZmVycz9hPXtyb290czpzLm1hcChjPT5jLnNsaWNlKCkpLGluZGV4Om8/by5hcnJheS5zbGljZSgpOm51bGwsaW5kaXJlY3RCdWZmZXI6cj9yLnNsaWNlKCk6bnVsbH06YT17cm9vdHM6cyxpbmRleDpvP28uYXJyYXk6bnVsbCxpbmRpcmVjdEJ1ZmZlcjpyfSxhfXN0YXRpYyBkZXNlcmlhbGl6ZSh0LGUsbj17fSl7bj1GdCh7c2V0SW5kZXg6ITAsaW5kaXJlY3Q6ISF0LmluZGlyZWN0QnVmZmVyfSxuKTtjb25zdHtpbmRleDpzLHJvb3RzOnIsaW5kaXJlY3RCdWZmZXI6b309dCxhPW5ldyBlYShlLEdlKEZ0KHt9LG4pLHtba29dOiEwfSkpO2lmKGEuX3Jvb3RzPXIsYS5faW5kaXJlY3RCdWZmZXI9b3x8bnVsbCxuLnNldEluZGV4KXtjb25zdCBjPWUuZ2V0SW5kZXgoKTtpZihjPT09bnVsbCl7Y29uc3QgbD1uZXcgeHQodC5pbmRleCwxLCExKTtlLnNldEluZGV4KGwpfWVsc2UgYy5hcnJheSE9PXMmJihjLmFycmF5LnNldChzKSxjLm5lZWRzVXBkYXRlPSEwKX1yZXR1cm4gYX1nZXQgaW5kaXJlY3QoKXtyZXR1cm4hIXRoaXMuX2luZGlyZWN0QnVmZmVyfWNvbnN0cnVjdG9yKHQsZT17fSl7aWYodC5pc0J1ZmZlckdlb21ldHJ5KXtpZih0LmluZGV4JiZ0LmluZGV4LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgaW5kZXggYXR0cmlidXRlLiIpfWVsc2UgdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBPbmx5IEJ1ZmZlckdlb21ldHJpZXMgYXJlIHN1cHBvcnRlZC4iKTtpZihlPU9iamVjdC5hc3NpZ24oR2UoRnQoe30sWmQpLHtba29dOiExfSksZSksZS51c2VTaGFyZWRBcnJheUJ1ZmZlciYmIVdkKCkpdGhyb3cgbmV3IEVycm9yKCJNZXNoQlZIOiBTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYXZhaWxhYmxlLiIpO3RoaXMuZ2VvbWV0cnk9dCx0aGlzLl9yb290cz1udWxsLHRoaXMuX2luZGlyZWN0QnVmZmVyPW51bGwsZVtrb118fChjZCh0aGlzLGUpLCF0LmJvdW5kaW5nQm94JiZlLnNldEJvdW5kaW5nQm94JiYodC5ib3VuZGluZ0JveD10aGlzLmdldEJvdW5kaW5nQm94KG5ldyBndCkpKSx0aGlzLnJlc29sdmVUcmlhbmdsZUluZGV4PWUuaW5kaXJlY3Q/bj0+dGhpcy5faW5kaXJlY3RCdWZmZXJbbl06bj0+bn1yZWZpdCh0PW51bGwpe3JldHVybih0aGlzLmluZGlyZWN0P05kOkFkKSh0aGlzLHQpfXRyYXZlcnNlKHQsZT0wKXtjb25zdCBuPXRoaXMuX3Jvb3RzW2VdLHM9bmV3IFVpbnQzMkFycmF5KG4pLHI9bmV3IFVpbnQxNkFycmF5KG4pO28oMCk7ZnVuY3Rpb24gbyhhLGM9MCl7Y29uc3QgbD1hKjIsaD1yW2wrMTVdPT09enM7aWYoaCl7Y29uc3QgdT1zW2ErNl0sZj1yW2wrMTRdO3QoYyxoLG5ldyBGbG9hdDMyQXJyYXkobixhKjQsNiksdSxmKX1lbHNle2NvbnN0IHU9YStUaS80LGY9c1thKzZdLGQ9c1thKzddO3QoYyxoLG5ldyBGbG9hdDMyQXJyYXkobixhKjQsNiksZCl8fChvKHUsYysxKSxvKGYsYysxKSl9fX1yYXljYXN0KHQsZT0wLG49MCxzPTEvMCl7Y29uc3Qgcj10aGlzLl9yb290cyxvPXRoaXMuZ2VvbWV0cnksYT1bXSxjPWUuaXNNYXRlcmlhbCxsPUFycmF5LmlzQXJyYXkoZSksaD1vLmdyb3Vwcyx1PWM/ZS5zaWRlOmUsZj10aGlzLmluZGlyZWN0P1JkOnpkO2ZvcihsZXQgZD0wLHA9ci5sZW5ndGg7ZDxwO2QrKyl7Y29uc3QgeT1sP2VbaFtkXS5tYXRlcmlhbEluZGV4XS5zaWRlOnUsbT1hLmxlbmd0aDtpZihmKHRoaXMsZCx5LHQsYSxuLHMpLGwpe2NvbnN0IGc9aFtkXS5tYXRlcmlhbEluZGV4O2ZvcihsZXQgYj1tLHc9YS5sZW5ndGg7Yjx3O2IrKylhW2JdLmZhY2UubWF0ZXJpYWxJbmRleD1nfX1yZXR1cm4gYX1yYXljYXN0Rmlyc3QodCxlPTAsbj0wLHM9MS8wKXtjb25zdCByPXRoaXMuX3Jvb3RzLG89dGhpcy5nZW9tZXRyeSxhPWUuaXNNYXRlcmlhbCxjPUFycmF5LmlzQXJyYXkoZSk7bGV0IGw9bnVsbDtjb25zdCBoPW8uZ3JvdXBzLHU9YT9lLnNpZGU6ZSxmPXRoaXMuaW5kaXJlY3Q/T2Q6RWQ7Zm9yKGxldCBkPTAscD1yLmxlbmd0aDtkPHA7ZCsrKXtjb25zdCB5PWM/ZVtoW2RdLm1hdGVyaWFsSW5kZXhdLnNpZGU6dSxtPWYodGhpcyxkLHksdCxuLHMpO20hPW51bGwmJihsPT1udWxsfHxtLmRpc3RhbmNlPGwuZGlzdGFuY2UpJiYobD1tLGMmJihtLmZhY2UubWF0ZXJpYWxJbmRleD1oW2RdLm1hdGVyaWFsSW5kZXgpKX1yZXR1cm4gbH1pbnRlcnNlY3RzR2VvbWV0cnkodCxlKXtsZXQgbj0hMTtjb25zdCBzPXRoaXMuX3Jvb3RzLHI9dGhpcy5pbmRpcmVjdD9EZDpQZDtmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YSYmKG49cih0aGlzLG8sdCxlKSwhbik7bysrKTtyZXR1cm4gbn1zaGFwZWNhc3QodCl7Y29uc3QgZT1pZS5nZXRQcmltaXRpdmUoKSxuPXRoaXMuaW5kaXJlY3Q/dmQ6TWQ7bGV0e2JvdW5kc1RyYXZlcnNlT3JkZXI6cyxpbnRlcnNlY3RzQm91bmRzOnIsaW50ZXJzZWN0c1JhbmdlOm8saW50ZXJzZWN0c1RyaWFuZ2xlOmF9PXQ7aWYobyYmYSl7Y29uc3QgdT1vO289KGYsZCxwLHksbSk9PnUoZixkLHAseSxtKT8hMDpuKGYsZCx0aGlzLGEscCx5LGUpfWVsc2Ugb3x8KGE/bz0odSxmLGQscCk9Pm4odSxmLHRoaXMsYSxkLHAsZSk6bz0odSxmLGQpPT5kKTtsZXQgYz0hMSxsPTA7Y29uc3QgaD10aGlzLl9yb290cztmb3IobGV0IHU9MCxmPWgubGVuZ3RoO3U8Zjt1Kyspe2NvbnN0IGQ9aFt1XTtpZihjPXBkKHRoaXMsdSxyLG8scyxsKSxjKWJyZWFrO2wrPWQuYnl0ZUxlbmd0aH1yZXR1cm4gaWUucmVsZWFzZVByaW1pdGl2ZShlKSxjfWJ2aGNhc3QodCxlLG4pe2xldHtpbnRlcnNlY3RzUmFuZ2VzOnMsaW50ZXJzZWN0c1RyaWFuZ2xlczpyfT1uO2NvbnN0IG89aWUuZ2V0UHJpbWl0aXZlKCksYT10aGlzLmdlb21ldHJ5LmluZGV4LGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9dGhpcy5pbmRpcmVjdD9wPT57Y29uc3QgeT10aGlzLnJlc29sdmVUcmlhbmdsZUluZGV4KHApO3l0KG8seSozLGEsYyl9OnA9Pnt5dChvLHAqMyxhLGMpfSxoPWllLmdldFByaW1pdGl2ZSgpLHU9dC5nZW9tZXRyeS5pbmRleCxmPXQuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixkPXQuaW5kaXJlY3Q/cD0+e2NvbnN0IHk9dC5yZXNvbHZlVHJpYW5nbGVJbmRleChwKTt5dChoLHkqMyx1LGYpfTpwPT57eXQoaCxwKjMsdSxmKX07aWYocil7Y29uc3QgcD0oeSxtLGcsYix3LHgsTSxBKT0+e2ZvcihsZXQgXz1nLFM9ZytiO188UztfKyspe2QoXyksaC5hLmFwcGx5TWF0cml4NChlKSxoLmIuYXBwbHlNYXRyaXg0KGUpLGguYy5hcHBseU1hdHJpeDQoZSksaC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IEU9eSx6PXkrbTtFPHo7RSsrKWlmKGwoRSksby5uZWVkc1VwZGF0ZT0hMCxyKG8saCxFLF8sdyx4LE0sQSkpcmV0dXJuITB9cmV0dXJuITF9O2lmKHMpe2NvbnN0IHk9cztzPWZ1bmN0aW9uKG0sZyxiLHcseCxNLEEsXyl7cmV0dXJuIHkobSxnLGIsdyx4LE0sQSxfKT8hMDpwKG0sZyxiLHcseCxNLEEsXyl9fWVsc2Ugcz1wfXJldHVybiBHZCh0aGlzLHQsZSxzKX1pbnRlcnNlY3RzQm94KHQsZSl7cmV0dXJuIFZzLnNldCh0Lm1pbix0Lm1heCxlKSxWcy5uZWVkc1VwZGF0ZT0hMCx0aGlzLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpuPT5Wcy5pbnRlcnNlY3RzQm94KG4pLGludGVyc2VjdHNUcmlhbmdsZTpuPT5Wcy5pbnRlcnNlY3RzVHJpYW5nbGUobil9KX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczplPT50LmludGVyc2VjdHNCb3goZSksaW50ZXJzZWN0c1RyaWFuZ2xlOmU9PmUuaW50ZXJzZWN0c1NwaGVyZSh0KX0pfWNsb3Nlc3RQb2ludFRvR2VvbWV0cnkodCxlLG49e30scz17fSxyPTAsbz0xLzApe3JldHVybih0aGlzLmluZGlyZWN0P0hkOmtkKSh0aGlzLHQsZSxuLHMscixvKX1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZT17fSxuPTAscz0xLzApe3JldHVybiB5ZCh0aGlzLHQsZSxuLHMpfWdldEJvdW5kaW5nQm94KHQpe3JldHVybiB0Lm1ha2VFbXB0eSgpLHRoaXMuX3Jvb3RzLmZvckVhY2gobj0+e2x0KDAsbmV3IEZsb2F0MzJBcnJheShuKSxobCksdC51bmlvbihobCl9KSx0fX1jb25zdCB1bD0xZS02LFhkPXVsKi41LGZsPU1hdGgucG93KDEwLC1NYXRoLmxvZzEwKHVsKSksSmQ9WGQqZmw7ZnVuY3Rpb24gd2UoaSl7cmV0dXJufn4oaSpmbCtKZCl9ZnVuY3Rpb24gWWQoaSl7cmV0dXJuYCR7d2UoaS54KX0sJHt3ZShpLnkpfWB9ZnVuY3Rpb24gZGwoaSl7cmV0dXJuYCR7d2UoaS54KX0sJHt3ZShpLnkpfSwke3dlKGkueil9YH1mdW5jdGlvbiBqZChpKXtyZXR1cm5gJHt3ZShpLngpfSwke3dlKGkueSl9LCR7d2UoaS56KX0sJHt3ZShpLncpfWB9ZnVuY3Rpb24gUWQoaSx0LGUpe2UuZGlyZWN0aW9uLnN1YlZlY3RvcnModCxpKS5ub3JtYWxpemUoKTtjb25zdCBuPWkuZG90KGUuZGlyZWN0aW9uKTtyZXR1cm4gZS5vcmlnaW4uY29weShpKS5hZGRTY2FsZWRWZWN0b3IoZS5kaXJlY3Rpb24sLW4pLGV9ZnVuY3Rpb24gcGwoKXtyZXR1cm4gdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIn1mdW5jdGlvbiBLZChpKXtpZihpLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKXJldHVybiBpO2NvbnN0IHQ9aS5jb25zdHJ1Y3RvcixlPWkuYnVmZmVyLG49bmV3IFNoYXJlZEFycmF5QnVmZmVyKGUuYnl0ZUxlbmd0aCkscz1uZXcgVWludDhBcnJheShlKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkobikuc2V0KHMsMCksbmV3IHQobil9ZnVuY3Rpb24gdDAoaSx0PUFycmF5QnVmZmVyKXtyZXR1cm4gaT42NTUzNT9uZXcgVWludDMyQXJyYXkobmV3IHQoNCppKSk6bmV3IFVpbnQxNkFycmF5KG5ldyB0KDIqaSkpfWZ1bmN0aW9uIGUwKGksdCl7aWYoIWkuaW5kZXgpe2NvbnN0IGU9aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50LG49dC51c2VTaGFyZWRBcnJheUJ1ZmZlcj9TaGFyZWRBcnJheUJ1ZmZlcjpBcnJheUJ1ZmZlcixzPXQwKGUsbik7aS5zZXRJbmRleChuZXcgeHQocywxKSk7Zm9yKGxldCByPTA7cjxlO3IrKylzW3JdPXJ9fWZ1bmN0aW9uIG4wKGkpe3JldHVybiBpLmluZGV4P2kuaW5kZXguY291bnQ6aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWZ1bmN0aW9uIG5hKGkpe3JldHVybiBuMChpKS8zfWNvbnN0IGkwPTFlLTgsczA9bmV3IFQ7ZnVuY3Rpb24gcjAoaSl7cmV0dXJufn4oaS8zKX1mdW5jdGlvbiBvMChpKXtyZXR1cm4gaSUzfWZ1bmN0aW9uIHlsKGksdCl7cmV0dXJuIGkuc3RhcnQtdC5zdGFydH1mdW5jdGlvbiBtbChpLHQpe3JldHVybiBzMC5zdWJWZWN0b3JzKHQsaS5vcmlnaW4pLmRvdChpLmRpcmVjdGlvbil9ZnVuY3Rpb24gYTAoaSx0LGUsbj1pMCl7aS5zb3J0KHlsKSx0LnNvcnQoeWwpO2ZvcihsZXQgYT0wO2E8aS5sZW5ndGg7YSsrKXtjb25zdCBjPWlbYV07Zm9yKGxldCBsPTA7bDx0Lmxlbmd0aDtsKyspe2NvbnN0IGg9dFtsXTtpZighKGguc3RhcnQ+Yy5lbmQpKXtpZihjLmVuZDxoLnN0YXJ0fHxoLmVuZDxjLnN0YXJ0KWNvbnRpbnVlO2lmKGMuc3RhcnQ8PWguc3RhcnQmJmMuZW5kPj1oLmVuZClyKGguZW5kLGMuZW5kKXx8aS5zcGxpY2UoYSsxLDAse3N0YXJ0OmguZW5kLGVuZDpjLmVuZCxpbmRleDpjLmluZGV4fSksYy5lbmQ9aC5zdGFydCxoLnN0YXJ0PTAsaC5lbmQ9MDtlbHNlIGlmKGMuc3RhcnQ+PWguc3RhcnQmJmMuZW5kPD1oLmVuZClyKGMuZW5kLGguZW5kKXx8dC5zcGxpY2UobCsxLDAse3N0YXJ0OmMuZW5kLGVuZDpoLmVuZCxpbmRleDpoLmluZGV4fSksaC5lbmQ9Yy5zdGFydCxjLnN0YXJ0PTAsYy5lbmQ9MDtlbHNlIGlmKGMuc3RhcnQ8PWguc3RhcnQmJmMuZW5kPD1oLmVuZCl7Y29uc3QgdT1jLmVuZDtjLmVuZD1oLnN0YXJ0LGguc3RhcnQ9dX1lbHNlIGlmKGMuc3RhcnQ+PWguc3RhcnQmJmMuZW5kPj1oLmVuZCl7Y29uc3QgdT1oLmVuZDtoLmVuZD1jLnN0YXJ0LGMuc3RhcnQ9dX1lbHNlIHRocm93IG5ldyBFcnJvcn1pZihlLmhhcyhjLmluZGV4KXx8ZS5zZXQoYy5pbmRleCxbXSksZS5oYXMoaC5pbmRleCl8fGUuc2V0KGguaW5kZXgsW10pLGUuZ2V0KGMuaW5kZXgpLnB1c2goaC5pbmRleCksZS5nZXQoaC5pbmRleCkucHVzaChjLmluZGV4KSxvKGgpJiYodC5zcGxpY2UobCwxKSxsLS0pLG8oYykpe2kuc3BsaWNlKGEsMSksYS0tO2JyZWFrfX19cyhpKSxzKHQpO2Z1bmN0aW9uIHMoYSl7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspbyhhW2NdKSYmKGEuc3BsaWNlKGMsMSksYy0tKX1mdW5jdGlvbiByKGEsYyl7cmV0dXJuIE1hdGguYWJzKGMtYSk8bn1mdW5jdGlvbiBvKGEpe3JldHVybiBNYXRoLmFicyhhLmVuZC1hLnN0YXJ0KTxufX1jb25zdCBnbD0xZS01LHhsPTFlLTQ7Y2xhc3MgYzB7Y29uc3RydWN0b3IoKXt0aGlzLl9yYXlzPVtdfWFkZFJheSh0KXt0aGlzLl9yYXlzLnB1c2godCl9ZmluZENsb3Nlc3RSYXkodCl7Y29uc3QgZT10aGlzLl9yYXlzLG49dC5jbG9uZSgpO24uZGlyZWN0aW9uLm11bHRpcGx5U2NhbGFyKC0xKTtsZXQgcz0xLzAscj1udWxsO2ZvcihsZXQgYz0wLGw9ZS5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1lW2NdO2lmKG8oaCx0KSYmbyhoLG4pKWNvbnRpbnVlO2NvbnN0IHU9YShoLHQpLGY9YShoLG4pLGQ9TWF0aC5taW4odSxmKTtkPHMmJihzPWQscj1oKX1yZXR1cm4gcjtmdW5jdGlvbiBvKGMsbCl7Y29uc3QgaD1jLm9yaWdpbi5kaXN0YW5jZVRvKGwub3JpZ2luKT5nbDtyZXR1cm4gYy5kaXJlY3Rpb24uYW5nbGVUbyhsLmRpcmVjdGlvbik+eGx8fGh9ZnVuY3Rpb24gYShjLGwpe2NvbnN0IGg9Yy5vcmlnaW4uZGlzdGFuY2VUbyhsLm9yaWdpbiksdT1jLmRpcmVjdGlvbi5hbmdsZVRvKGwuZGlyZWN0aW9uKTtyZXR1cm4gaC9nbCt1L3hsfX19Y29uc3QgaWE9bmV3IFQsc2E9bmV3IFQscXM9bmV3IGFvO2Z1bmN0aW9uIGwwKGksdCxlKXtjb25zdCBuPWkuYXR0cmlidXRlcyxzPWkuaW5kZXgscj1uLnBvc2l0aW9uLG89bmV3IE1hcCxhPW5ldyBNYXAsYz1BcnJheS5mcm9tKHQpLGw9bmV3IGMwO2ZvcihsZXQgaD0wLHU9Yy5sZW5ndGg7aDx1O2grKyl7Y29uc3QgZj1jW2hdLGQ9cjAoZikscD1vMChmKTtsZXQgeT0zKmQrcCxtPTMqZCsocCsxKSUzO3MmJih5PXMuZ2V0WCh5KSxtPXMuZ2V0WChtKSksaWEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLHkpLHNhLmZyb21CdWZmZXJBdHRyaWJ1dGUocixtKSxRZChpYSxzYSxxcyk7bGV0IGcsYj1sLmZpbmRDbG9zZXN0UmF5KHFzKTtiPT09bnVsbCYmKGI9cXMuY2xvbmUoKSxsLmFkZFJheShiKSksYS5oYXMoYil8fGEuc2V0KGIse2ZvcndhcmQ6W10scmV2ZXJzZTpbXSxyYXk6Yn0pLGc9YS5nZXQoYik7bGV0IHc9bWwoYixpYSkseD1tbChiLHNhKTt3PngmJihbdyx4XT1beCx3XSkscXMuZGlyZWN0aW9uLmRvdChiLmRpcmVjdGlvbik8MD9nLnJldmVyc2UucHVzaCh7c3RhcnQ6dyxlbmQ6eCxpbmRleDpmfSk6Zy5mb3J3YXJkLnB1c2goe3N0YXJ0OncsZW5kOngsaW5kZXg6Zn0pfXJldHVybiBhLmZvckVhY2goKHtmb3J3YXJkOmgscmV2ZXJzZTp1fSxmKT0+e2EwKGgsdSxvLGUpLGgubGVuZ3RoPT09MCYmdS5sZW5ndGg9PT0wJiZhLmRlbGV0ZShmKX0pLHtkaXNqb2ludENvbm5lY3Rpdml0eU1hcDpvLGZyYWdtZW50TWFwOmF9fWNvbnN0IGgwPW5ldyBSLHJhPW5ldyBULHUwPW5ldyBZdCxvYT1bIiIsIiIsIiJdO2NsYXNzIGYwe2NvbnN0cnVjdG9yKHQ9bnVsbCl7dGhpcy5kYXRhPW51bGwsdGhpcy5kaXNqb2ludENvbm5lY3Rpb25zPW51bGwsdGhpcy51bm1hdGNoZWREaXNqb2ludEVkZ2VzPW51bGwsdGhpcy51bm1hdGNoZWRFZGdlcz0tMSx0aGlzLm1hdGNoZWRFZGdlcz0tMSx0aGlzLnVzZURyYXdSYW5nZT0hMCx0aGlzLnVzZUFsbEF0dHJpYnV0ZXM9ITEsdGhpcy5tYXRjaERpc2pvaW50RWRnZXM9ITEsdGhpcy5kZWdlbmVyYXRlRXBzaWxvbj0xZS04LHQmJnRoaXMudXBkYXRlRnJvbSh0KX1nZXRTaWJsaW5nVHJpYW5nbGVJbmRleCh0LGUpe2NvbnN0IG49dGhpcy5kYXRhW3QqMytlXTtyZXR1cm4gbj09PS0xPy0xOn5+KG4vMyl9Z2V0U2libGluZ0VkZ2VJbmRleCh0LGUpe2NvbnN0IG49dGhpcy5kYXRhW3QqMytlXTtyZXR1cm4gbj09PS0xPy0xOm4lM31nZXREaXNqb2ludFNpYmxpbmdUcmlhbmdsZUluZGljZXModCxlKXtjb25zdCBuPXQqMytlLHM9dGhpcy5kaXNqb2ludENvbm5lY3Rpb25zLmdldChuKTtyZXR1cm4gcz9zLm1hcChyPT5+fihyLzMpKTpbXX1nZXREaXNqb2ludFNpYmxpbmdFZGdlSW5kaWNlcyh0LGUpe2NvbnN0IG49dCozK2Uscz10aGlzLmRpc2pvaW50Q29ubmVjdGlvbnMuZ2V0KG4pO3JldHVybiBzP3MubWFwKHI9PnIlMyk6W119aXNGdWxseUNvbm5lY3RlZCgpe3JldHVybiB0aGlzLnVubWF0Y2hlZEVkZ2VzPT09MH11cGRhdGVGcm9tKHQpe2NvbnN0e3VzZUFsbEF0dHJpYnV0ZXM6ZSx1c2VEcmF3UmFuZ2U6bixtYXRjaERpc2pvaW50RWRnZXM6cyxkZWdlbmVyYXRlRXBzaWxvbjpyfT10aGlzLG89ZT93OmIsYT1uZXcgTWFwLHthdHRyaWJ1dGVzOmN9PXQsbD1lP09iamVjdC5rZXlzKGMpOm51bGwsaD10LmluZGV4LHU9Yy5wb3NpdGlvbjtsZXQgZj1uYSh0KTtjb25zdCBkPWY7bGV0IHA9MDtuJiYocD10LmRyYXdSYW5nZS5zdGFydCx0LmRyYXdSYW5nZS5jb3VudCE9PTEvMCYmKGY9fn4odC5kcmF3UmFuZ2UuY291bnQvMykpKTtsZXQgeT10aGlzLmRhdGE7KCF5fHx5Lmxlbmd0aDwzKmQpJiYoeT1uZXcgSW50MzJBcnJheSgzKmQpKSx5LmZpbGwoLTEpO2xldCBtPTAsZz1uZXcgU2V0O2ZvcihsZXQgeD1wLE09ZiozK3A7eDxNO3grPTMpe2NvbnN0IEE9eDtmb3IobGV0IF89MDtfPDM7XysrKXtsZXQgUz1BK187aCYmKFM9aC5nZXRYKFMpKSxvYVtfXT1vKFMpfWZvcihsZXQgXz0wO188MztfKyspe2NvbnN0IFM9KF8rMSklMyxFPW9hW19dLHo9b2FbU10sdj1gJHt6fV8ke0V9YDtpZihhLmhhcyh2KSl7Y29uc3QgQz1BK18sUD1hLmdldCh2KTt5W0NdPVAseVtQXT1DLGEuZGVsZXRlKHYpLG0rPTIsZy5kZWxldGUoUCl9ZWxzZXtjb25zdCBDPWAke0V9XyR7en1gLFA9QStfO2Euc2V0KEMsUCksZy5hZGQoUCl9fX1pZihzKXtjb25zdHtmcmFnbWVudE1hcDp4LGRpc2pvaW50Q29ubmVjdGl2aXR5TWFwOk19PWwwKHQsZyxyKTtnLmNsZWFyKCkseC5mb3JFYWNoKCh7Zm9yd2FyZDpBLHJldmVyc2U6X30pPT57QS5mb3JFYWNoKCh7aW5kZXg6U30pPT5nLmFkZChTKSksXy5mb3JFYWNoKCh7aW5kZXg6U30pPT5nLmFkZChTKSl9KSx0aGlzLnVubWF0Y2hlZERpc2pvaW50RWRnZXM9eCx0aGlzLmRpc2pvaW50Q29ubmVjdGlvbnM9TSxtPWYqMy1nLnNpemV9dGhpcy5tYXRjaGVkRWRnZXM9bSx0aGlzLnVubWF0Y2hlZEVkZ2VzPWcuc2l6ZSx0aGlzLmRhdGE9eTtmdW5jdGlvbiBiKHgpe3JldHVybiByYS5mcm9tQnVmZmVyQXR0cmlidXRlKHUseCksZGwocmEpfWZ1bmN0aW9uIHcoeCl7bGV0IE09IiI7Zm9yKGxldCBBPTAsXz1sLmxlbmd0aDtBPF87QSsrKXtjb25zdCBTPWNbbFtBXV07bGV0IEU7c3dpdGNoKFMuaXRlbVNpemUpe2Nhc2UgMTpFPXdlKFMuZ2V0WCh4KSk7YnJlYWs7Y2FzZSAyOkU9WWQoaDAuZnJvbUJ1ZmZlckF0dHJpYnV0ZShTLHgpKTticmVhaztjYXNlIDM6RT1kbChyYS5mcm9tQnVmZmVyQXR0cmlidXRlKFMseCkpO2JyZWFrO2Nhc2UgNDpFPWpkKHUwLmZyb21CdWZmZXJBdHRyaWJ1dGUoUyx4KSk7YnJlYWt9TSE9PSIiJiYoTSs9InwiKSxNKz1FfXJldHVybiBNfX19Y2xhc3MgSHMgZXh0ZW5kcyBoZntjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLmlzQnJ1c2g9ITAsdGhpcy5fcHJldmlvdXNNYXRyaXg9bmV3IHN0LHRoaXMuX3ByZXZpb3VzTWF0cml4LmVsZW1lbnRzLmZpbGwoMCl9bWFya1VwZGF0ZWQoKXt0aGlzLl9wcmV2aW91c01hdHJpeC5jb3B5KHRoaXMubWF0cml4KX1pc0RpcnR5KCl7Y29uc3R7bWF0cml4OnQsX3ByZXZpb3VzTWF0cml4OmV9PXRoaXMsbj10LmVsZW1lbnRzLHM9ZS5lbGVtZW50cztmb3IobGV0IHI9MDtyPDE2O3IrKylpZihuW3JdIT09c1tyXSlyZXR1cm4hMDtyZXR1cm4hMX1wcmVwYXJlR2VvbWV0cnkoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnksZT10LmF0dHJpYnV0ZXMsbj1wbCgpO2lmKG4pZm9yKGNvbnN0IHMgaW4gZSl7Y29uc3Qgcj1lW3NdO2lmKHIuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl0aHJvdyBuZXcgRXJyb3IoIkJydXNoOiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7ci5hcnJheT1LZChyLmFycmF5KX1pZih0LmJvdW5kc1RyZWV8fChlMCh0LHt1c2VTaGFyZWRBcnJheUJ1ZmZlcjpufSksdC5ib3VuZHNUcmVlPW5ldyBlYSh0LHttYXhMZWFmVHJpczozLGluZGlyZWN0OiEwLHVzZVNoYXJlZEFycmF5QnVmZmVyOm59KSksdC5oYWxmRWRnZXN8fCh0LmhhbGZFZGdlcz1uZXcgZjAodCkpLCF0Lmdyb3VwSW5kaWNlcyl7Y29uc3Qgcz1uYSh0KSxyPW5ldyBVaW50MTZBcnJheShzKSxvPXQuZ3JvdXBzO2ZvcihsZXQgYT0wLGM9by5sZW5ndGg7YTxjO2ErKyl7Y29uc3R7c3RhcnQ6bCxjb3VudDpofT1vW2FdO2ZvcihsZXQgdT1sLzMsZj0obCtoKS8zO3U8Zjt1Kyspclt1XT1hfXQuZ3JvdXBJbmRpY2VzPXJ9fWRpc3Bvc2VDYWNoZURhdGEoKXtjb25zdHtnZW9tZXRyeTp0fT10aGlzO3QuaGFsZkVkZ2VzPW51bGwsdC5ib3VuZHNUcmVlPW51bGwsdC5ncm91cEluZGljZXM9bnVsbH19Y29uc3QgZDA9MWUtMTQsYWE9bmV3IFQsd2w9bmV3IFQsYmw9bmV3IFQ7ZnVuY3Rpb24gbm4oaSx0PWQwKXthYS5zdWJWZWN0b3JzKGkuYixpLmEpLHdsLnN1YlZlY3RvcnMoaS5jLGkuYSksYmwuc3ViVmVjdG9ycyhpLmIsaS5jKTtjb25zdCBlPWFhLmFuZ2xlVG8od2wpLG49YWEuYW5nbGVUbyhibCkscz1NYXRoLlBJLWUtbjtyZXR1cm4gTWF0aC5hYnMoZSk8dHx8TWF0aC5hYnMobik8dHx8TWF0aC5hYnMocyk8dHx8aS5hLmRpc3RhbmNlVG9TcXVhcmVkKGkuYik8dHx8aS5hLmRpc3RhbmNlVG9TcXVhcmVkKGkuYyk8dHx8aS5iLmRpc3RhbmNlVG9TcXVhcmVkKGkuYyk8dH1jb25zdCBjYT0xZS0xMCxMaT0xZS0xMCxwMD0xZS0xMCxJZT1uZXcgUXQsZnQ9bmV3IFF0LGtlPW5ldyBULGxhPW5ldyBULE1sPW5ldyBULFdzPW5ldyBNbyxoYT1uZXcgbmU7Y2xhc3MgeTB7Y29uc3RydWN0b3IoKXt0aGlzLl9wb29sPVtdLHRoaXMuX2luZGV4PTB9Z2V0VHJpYW5nbGUoKXtyZXR1cm4gdGhpcy5faW5kZXg+PXRoaXMuX3Bvb2wubGVuZ3RoJiZ0aGlzLl9wb29sLnB1c2gobmV3IGV0KSx0aGlzLl9wb29sW3RoaXMuX2luZGV4KytdfWNsZWFyKCl7dGhpcy5faW5kZXg9MH1yZXNldCgpe3RoaXMuX3Bvb2wubGVuZ3RoPTAsdGhpcy5faW5kZXg9MH19Y2xhc3MgbTB7Y29uc3RydWN0b3IoKXt0aGlzLnRyaWFuZ2xlUG9vbD1uZXcgeTAsdGhpcy50cmlhbmdsZXM9W10sdGhpcy5ub3JtYWw9bmV3IFQsdGhpcy5jb3BsYW5hclRyaWFuZ2xlVXNlZD0hMX1pbml0aWFsaXplKHQpe3RoaXMucmVzZXQoKTtjb25zdHt0cmlhbmdsZXM6ZSx0cmlhbmdsZVBvb2w6bixub3JtYWw6c309dGhpcztpZihBcnJheS5pc0FycmF5KHQpKWZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT10W3JdO2lmKHI9PT0wKWEuZ2V0Tm9ybWFsKHMpO2Vsc2UgaWYoTWF0aC5hYnMoMS1hLmdldE5vcm1hbChrZSkuZG90KHMpKT5jYSl0aHJvdyBuZXcgRXJyb3IoIlRyaWFuZ2xlIFNwbGl0dGVyOiBDYW5ub3QgaW5pdGlhbGl6ZSB3aXRoIHRyaWFuZ2xlcyB0aGF0IGhhdmUgZGlmZmVyZW50IG5vcm1hbHMuIik7Y29uc3QgYz1uLmdldFRyaWFuZ2xlKCk7Yy5jb3B5KGEpLGUucHVzaChjKX1lbHNle3QuZ2V0Tm9ybWFsKHMpO2NvbnN0IHI9bi5nZXRUcmlhbmdsZSgpO3IuY29weSh0KSxlLnB1c2gocil9fXNwbGl0QnlUcmlhbmdsZSh0KXtjb25zdHtub3JtYWw6ZSx0cmlhbmdsZXM6bn09dGhpcztpZih0LmdldE5vcm1hbChsYSkubm9ybWFsaXplKCksTWF0aC5hYnMoMS1NYXRoLmFicyhsYS5kb3QoZSkpKTxwMCl7dGhpcy5jb3BsYW5hclRyaWFuZ2xlVXNlZD0hMDtmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9bltyXTthLmNvcGxhbmFyQ291bnQ9MH1jb25zdCBzPVt0LmEsdC5iLHQuY107Zm9yKGxldCByPTA7cjwzO3IrKyl7Y29uc3Qgbz0ocisxKSUzLGE9c1tyXSxjPXNbb107a2Uuc3ViVmVjdG9ycyhjLGEpLm5vcm1hbGl6ZSgpLE1sLmNyb3NzVmVjdG9ycyhsYSxrZSksV3Muc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoTWwsYSksdGhpcy5zcGxpdEJ5UGxhbmUoV3MsdCl9fWVsc2UgdC5nZXRQbGFuZShXcyksdGhpcy5zcGxpdEJ5UGxhbmUoV3MsdCl9c3BsaXRCeVBsYW5lKHQsZSl7Y29uc3R7dHJpYW5nbGVzOm4sdHJpYW5nbGVQb29sOnN9PXRoaXM7aGEuY29weShlKSxoYS5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9bltyXTtpZighaGEuaW50ZXJzZWN0c1RyaWFuZ2xlKGEsSWUsITApKWNvbnRpbnVlO2NvbnN0e2E6YyxiOmwsYzpofT1hO2xldCB1PTAsZj0tMSxkPSExLHA9W10seT1bXTtjb25zdCBtPVtjLGwsaF07Zm9yKGxldCBnPTA7ZzwzO2crKyl7Y29uc3QgYj0oZysxKSUzO0llLnN0YXJ0LmNvcHkobVtnXSksSWUuZW5kLmNvcHkobVtiXSk7Y29uc3Qgdz10LmRpc3RhbmNlVG9Qb2ludChJZS5zdGFydCkseD10LmRpc3RhbmNlVG9Qb2ludChJZS5lbmQpO2lmKE1hdGguYWJzKHcpPExpJiZNYXRoLmFicyh4KTxMaSl7ZD0hMDticmVha31pZih3PjA/cC5wdXNoKGcpOnkucHVzaChnKSxNYXRoLmFicyh3KTxMaSljb250aW51ZTtsZXQgTT0hIXQuaW50ZXJzZWN0TGluZShJZSxrZSk7IU0mJk1hdGguYWJzKHgpPExpJiYoa2UuY29weShJZS5lbmQpLE09ITApLE0mJiEoa2UuZGlzdGFuY2VUbyhJZS5zdGFydCk8Y2EpJiYoa2UuZGlzdGFuY2VUbyhJZS5lbmQpPGNhJiYoZj1nKSx1PT09MD9mdC5zdGFydC5jb3B5KGtlKTpmdC5lbmQuY29weShrZSksdSsrKX1pZighZCYmdT09PTImJmZ0LmRpc3RhbmNlKCk+TGkpaWYoZiE9PS0xKXtmPShmKzEpJTM7bGV0IGc9MDtnPT09ZiYmKGc9KGcrMSklMyk7bGV0IGI9ZysxO2I9PT1mJiYoYj0oYisxKSUzKTtjb25zdCB3PXMuZ2V0VHJpYW5nbGUoKTt3LmEuY29weShtW2JdKSx3LmIuY29weShmdC5lbmQpLHcuYy5jb3B5KGZ0LnN0YXJ0KSxubih3KXx8bi5wdXNoKHcpLGEuYS5jb3B5KG1bZ10pLGEuYi5jb3B5KGZ0LnN0YXJ0KSxhLmMuY29weShmdC5lbmQpLG5uKGEpJiYobi5zcGxpY2UociwxKSxyLS0sby0tKX1lbHNle2NvbnN0IGc9cC5sZW5ndGg+PTI/eVswXTpwWzBdO2lmKGc9PT0wKXtsZXQgQT1mdC5zdGFydDtmdC5zdGFydD1mdC5lbmQsZnQuZW5kPUF9Y29uc3QgYj0oZysxKSUzLHc9KGcrMiklMyx4PXMuZ2V0VHJpYW5nbGUoKSxNPXMuZ2V0VHJpYW5nbGUoKTttW2JdLmRpc3RhbmNlVG9TcXVhcmVkKGZ0LnN0YXJ0KTxtW3ddLmRpc3RhbmNlVG9TcXVhcmVkKGZ0LmVuZCk/KHguYS5jb3B5KG1bYl0pLHguYi5jb3B5KGZ0LnN0YXJ0KSx4LmMuY29weShmdC5lbmQpLE0uYS5jb3B5KG1bYl0pLE0uYi5jb3B5KG1bd10pLE0uYy5jb3B5KGZ0LnN0YXJ0KSk6KHguYS5jb3B5KG1bd10pLHguYi5jb3B5KGZ0LnN0YXJ0KSx4LmMuY29weShmdC5lbmQpLE0uYS5jb3B5KG1bYl0pLE0uYi5jb3B5KG1bd10pLE0uYy5jb3B5KGZ0LmVuZCkpLGEuYS5jb3B5KG1bZ10pLGEuYi5jb3B5KGZ0LmVuZCksYS5jLmNvcHkoZnQuc3RhcnQpLG5uKHgpfHxuLnB1c2goeCksbm4oTSl8fG4ucHVzaChNKSxubihhKSYmKG4uc3BsaWNlKHIsMSksci0tLG8tLSl9ZWxzZSB1PT09MyYmY29uc29sZS53YXJuKCJUcmlhbmdsZUNsaXBwZXI6IENvcGxhbmFyIGNsaXAgbm90IGhhbmRsZWQiKX19cmVzZXQoKXt0aGlzLnRyaWFuZ2xlcy5sZW5ndGg9MCx0aGlzLnRyaWFuZ2xlUG9vbC5jbGVhcigpLHRoaXMuY29wbGFuYXJUcmlhbmdsZVVzZWQ9ITF9fWZ1bmN0aW9uIGcwKGkpe3JldHVybiBpPX5+aSxpKzQtaSU0fWNsYXNzIEFse2NvbnN0cnVjdG9yKHQsZT01MDApe3RoaXMuZXhwYW5zaW9uRmFjdG9yPTEuNSx0aGlzLnR5cGU9dCx0aGlzLmxlbmd0aD0wLHRoaXMuYXJyYXk9bnVsbCx0aGlzLnNldFNpemUoZSl9c2V0VHlwZSh0KXtpZih0aGlzLmxlbmd0aCE9PTApdGhyb3cgbmV3IEVycm9yKCJUeXBlQmFja2VkQXJyYXk6IENhbm5vdCBjaGFuZ2UgdGhlIHR5cGUgd2hpbGUgdGhlcmUgaXMgdXNlZCBkYXRhIGluIHRoZSBidWZmZXIuIik7Y29uc3QgZT10aGlzLmFycmF5LmJ1ZmZlcjt0aGlzLmFycmF5PW5ldyB0KGUpLHRoaXMudHlwZT10fXNldFNpemUodCl7aWYodGhpcy5hcnJheSYmdD09PXRoaXMuYXJyYXkubGVuZ3RoKXJldHVybjtjb25zdCBlPXRoaXMudHlwZSxuPXBsKCk/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscz1uZXcgZShuZXcgbihnMCh0KmUuQllURVNfUEVSX0VMRU1FTlQpKSk7dGhpcy5hcnJheSYmcy5zZXQodGhpcy5hcnJheSwwKSx0aGlzLmFycmF5PXN9ZXhwYW5kKCl7Y29uc3R7YXJyYXk6dCxleHBhbnNpb25GYWN0b3I6ZX09dGhpczt0aGlzLnNldFNpemUodC5sZW5ndGgqZSl9cHVzaCguLi50KXtsZXR7YXJyYXk6ZSxsZW5ndGg6bn09dGhpcztuK3QubGVuZ3RoPmUubGVuZ3RoJiYodGhpcy5leHBhbmQoKSxlPXRoaXMuYXJyYXkpO2ZvcihsZXQgcz0wLHI9dC5sZW5ndGg7czxyO3MrKyllW24rc109dFtzXTt0aGlzLmxlbmd0aCs9dC5sZW5ndGh9Y2xlYXIoKXt0aGlzLmxlbmd0aD0wfX1jbGFzcyB4MHtjb25zdHJ1Y3Rvcigpe3RoaXMuZ3JvdXBBdHRyaWJ1dGVzPVt7fV0sdGhpcy5ncm91cENvdW50PTB9Z2V0VHlwZSh0KXtyZXR1cm4gdGhpcy5ncm91cEF0dHJpYnV0ZXNbMF1bdF0udHlwZX1nZXRJdGVtU2l6ZSh0KXtyZXR1cm4gdGhpcy5ncm91cEF0dHJpYnV0ZXNbMF1bdF0uaXRlbVNpemV9Z2V0Tm9ybWFsaXplZCh0KXtyZXR1cm4gdGhpcy5ncm91cEF0dHJpYnV0ZXNbMF1bdF0ubm9ybWFsaXplZH1nZXRDb3VudCh0KXtpZih0aGlzLmdyb3VwQ291bnQ8PXQpcmV0dXJuIDA7Y29uc3QgZT10aGlzLmdldEdyb3VwQXR0ckFycmF5KCJwb3NpdGlvbiIsdCk7cmV0dXJuIGUubGVuZ3RoL2UuaXRlbVNpemV9Z2V0VG90YWxMZW5ndGgodCl7Y29uc3R7Z3JvdXBDb3VudDplLGdyb3VwQXR0cmlidXRlczpufT10aGlzO2xldCBzPTA7Zm9yKGxldCByPTA7cjxlO3IrKyl7Y29uc3Qgbz1uW3JdO3MrPW9bdF0ubGVuZ3RofXJldHVybiBzfWdldEdyb3VwQXR0clNldCh0PTApe2NvbnN0e2dyb3VwQXR0cmlidXRlczplfT10aGlzO2lmKGVbdF0pcmV0dXJuIHRoaXMuZ3JvdXBDb3VudD1NYXRoLm1heCh0aGlzLmdyb3VwQ291bnQsdCsxKSxlW3RdO2NvbnN0IG49ZVswXTtmb3IodGhpcy5ncm91cENvdW50PU1hdGgubWF4KHRoaXMuZ3JvdXBDb3VudCx0KzEpO3Q+PWUubGVuZ3RoOyl7Y29uc3Qgcz17fTtlLnB1c2gocyk7Zm9yKGNvbnN0IHIgaW4gbil7Y29uc3Qgbz1uW3JdLGE9bmV3IEFsKG8udHlwZSk7YS5pdGVtU2l6ZT1vLml0ZW1TaXplLGEubm9ybWFsaXplZD1vLm5vcm1hbGl6ZWQsc1tyXT1hfX1yZXR1cm4gZVt0XX1nZXRHcm91cEF0dHJBcnJheSh0LGU9MCl7Y29uc3R7Z3JvdXBBdHRyaWJ1dGVzOm59PXRoaXM7aWYoIW5bMF1bdF0pdGhyb3cgbmV3IEVycm9yKGBUeXBlZEF0dHJpYnV0ZURhdGE6IEF0dHJpYnV0ZSB3aXRoICIke3R9IiBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRgKTtyZXR1cm4gdGhpcy5nZXRHcm91cEF0dHJTZXQoZSlbdF19aW5pdGlhbGl6ZUFycmF5KHQsZSxuLHMpe2NvbnN0e2dyb3VwQXR0cmlidXRlczpyfT10aGlzLGE9clswXVt0XTtpZihhKXtpZihhLnR5cGUhPT1lKWZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1yW2NdW3RdO2guc2V0VHlwZShlKSxoLml0ZW1TaXplPW4saC5ub3JtYWxpemVkPXN9fWVsc2UgZm9yKGxldCBjPTAsbD1yLmxlbmd0aDtjPGw7YysrKXtjb25zdCBoPW5ldyBBbChlKTtoLml0ZW1TaXplPW4saC5ub3JtYWxpemVkPXMscltjXVt0XT1ofX1jbGVhcigpe3RoaXMuZ3JvdXBDb3VudD0wO2NvbnN0e2dyb3VwQXR0cmlidXRlczp0fT10aGlzO3QuZm9yRWFjaChlPT57Zm9yKGNvbnN0IG4gaW4gZSllW25dLmNsZWFyKCl9KX1kZWxldGUodCl7dGhpcy5ncm91cEF0dHJpYnV0ZXMuZm9yRWFjaChlPT57ZGVsZXRlIGVbdF19KX1yZXNldCgpe3RoaXMuZ3JvdXBBdHRyaWJ1dGVzPVtdLHRoaXMuZ3JvdXBDb3VudD0wfX1jbGFzcyBfbHtjb25zdHJ1Y3Rvcigpe3RoaXMuaW50ZXJzZWN0aW9uU2V0PXt9LHRoaXMuaWRzPVtdfWFkZCh0LGUpe2NvbnN0e2ludGVyc2VjdGlvblNldDpuLGlkczpzfT10aGlzO25bdF18fChuW3RdPVtdLHMucHVzaCh0KSksblt0XS5wdXNoKGUpfX1jb25zdCB3MD0wLGIwPTEsTTA9MixTbD0zLEEwPTQsdmw9NSx6bD02LHNlPW5ldyBhbyxUbD1uZXcgc3QsVHQ9bmV3IGV0LE5lPW5ldyBULEVsPW5ldyBZdCxQbD1uZXcgWXQsQ2w9bmV3IFl0LHVhPW5ldyBZdCxHcz1uZXcgWXQsWnM9bmV3IFl0LEJsPW5ldyBRdCxmYT1uZXcgVCxkYT0xZS04LF8wPTFlLTE1LGduPS0xLHhuPTEsWHM9LTIsSnM9MixPaT0wLHduPTEscGE9MixTMD0xZS0xNDtsZXQgWXM9bnVsbDtmdW5jdGlvbiBGbChpKXtZcz1pfWZ1bmN0aW9uIElsKGksdCl7aS5nZXRNaWRwb2ludChzZS5vcmlnaW4pLGkuZ2V0Tm9ybWFsKHNlLmRpcmVjdGlvbik7Y29uc3QgZT10LnJheWNhc3RGaXJzdChzZSwyKTtyZXR1cm4hIShlJiZzZS5kaXJlY3Rpb24uZG90KGUuZmFjZS5ub3JtYWwpPjApP2duOnhufWZ1bmN0aW9uIHYwKGksdCl7ZnVuY3Rpb24gZSgpe3JldHVybiBNYXRoLnJhbmRvbSgpLS41fWkuZ2V0Tm9ybWFsKGZhKSxzZS5kaXJlY3Rpb24uY29weShmYSksaS5nZXRNaWRwb2ludChzZS5vcmlnaW4pO2NvbnN0IG49MztsZXQgcz0wLHI9MS8wO2ZvcihsZXQgbz0wO288bjtvKyspe3NlLmRpcmVjdGlvbi54Kz1lKCkqZGEsc2UuZGlyZWN0aW9uLnkrPWUoKSpkYSxzZS5kaXJlY3Rpb24ueis9ZSgpKmRhLHNlLmRpcmVjdGlvbi5tdWx0aXBseVNjYWxhcigtMSk7Y29uc3QgYT10LnJheWNhc3RGaXJzdChzZSwyKTtpZighIShhJiZzZS5kaXJlY3Rpb24uZG90KGEuZmFjZS5ub3JtYWwpPjApJiZzKyssYSE9PW51bGwmJihyPU1hdGgubWluKHIsYS5kaXN0YW5jZSkpLHI8PV8wKXJldHVybiBhLmZhY2Uubm9ybWFsLmRvdChmYSk+MD9KczpYcztpZihzL24+LjV8fChvLXMrMSkvbj4uNSlicmVha31yZXR1cm4gcy9uPi41P2duOnhufWZ1bmN0aW9uIHowKGksdCl7Y29uc3QgZT1uZXcgX2wsbj1uZXcgX2w7cmV0dXJuIFRsLmNvcHkoaS5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkodC5tYXRyaXhXb3JsZCksaS5nZW9tZXRyeS5ib3VuZHNUcmVlLmJ2aGNhc3QodC5nZW9tZXRyeS5ib3VuZHNUcmVlLFRsLHtpbnRlcnNlY3RzVHJpYW5nbGVzKHMscixvLGEpe2lmKCFubihzKSYmIW5uKHIpKXtsZXQgYz1zLmludGVyc2VjdHNUcmlhbmdsZShyLEJsLCEwKTtpZighYyl7Y29uc3QgbD1zLnBsYW5lLGg9ci5wbGFuZSx1PWwubm9ybWFsLGY9aC5ub3JtYWw7dS5kb3QoZik9PT0xJiZNYXRoLmFicyhsLmNvbnN0YW50LWguY29uc3RhbnQpPFMwJiYoYz0hMCl9aWYoYyl7bGV0IGw9aS5nZW9tZXRyeS5ib3VuZHNUcmVlLnJlc29sdmVUcmlhbmdsZUluZGV4KG8pLGg9dC5nZW9tZXRyeS5ib3VuZHNUcmVlLnJlc29sdmVUcmlhbmdsZUluZGV4KGEpO2UuYWRkKGwsaCksbi5hZGQoaCxsKSxZcyYmKFlzLmFkZEVkZ2UoQmwpLFlzLmFkZEludGVyc2VjdGluZ1RyaWFuZ2xlcyhvLHMsYSxyKSl9fXJldHVybiExfX0pLHthSW50ZXJzZWN0aW9uczplLGJJbnRlcnNlY3Rpb25zOm59fWZ1bmN0aW9uIFQwKGksdCxlLG4scyxyLG89ITEpe2NvbnN0IGE9ZS5hdHRyaWJ1dGVzLGM9ZS5pbmRleCxsPWkqMyxoPWMuZ2V0WChsKzApLHU9Yy5nZXRYKGwrMSksZj1jLmdldFgobCsyKTtmb3IoY29uc3QgZCBpbiByKXtjb25zdCBwPWFbZF0seT1yW2RdO2lmKCEoZCBpbiBhKSl0aHJvdyBuZXcgRXJyb3IoYENTRyBPcGVyYXRpb25zOiBBdHRyaWJ1dGUgJHtkfSBub3QgYXZhaWxhYmxlIG9uIGdlb21ldHJ5LmApO2NvbnN0IG09cC5pdGVtU2l6ZTtkPT09InBvc2l0aW9uIj8oVHQuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHAsaCkuYXBwbHlNYXRyaXg0KG4pLFR0LmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLHUpLmFwcGx5TWF0cml4NChuKSxUdC5jLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxmKS5hcHBseU1hdHJpeDQobikseWEoVHQuYSxUdC5iLFR0LmMsdCwzLHksbykpOmQ9PT0ibm9ybWFsIj8oVHQuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHAsaCkuYXBwbHlOb3JtYWxNYXRyaXgocyksVHQuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHAsdSkuYXBwbHlOb3JtYWxNYXRyaXgocyksVHQuYy5mcm9tQnVmZmVyQXR0cmlidXRlKHAsZikuYXBwbHlOb3JtYWxNYXRyaXgocyksbyYmKFR0LmEubXVsdGlwbHlTY2FsYXIoLTEpLFR0LmIubXVsdGlwbHlTY2FsYXIoLTEpLFR0LmMubXVsdGlwbHlTY2FsYXIoLTEpKSx5YShUdC5hLFR0LmIsVHQuYyx0LDMseSxvLCEwKSk6KEVsLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxoKSxQbC5mcm9tQnVmZmVyQXR0cmlidXRlKHAsdSksQ2wuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGYpLHlhKEVsLFBsLENsLHQsbSx5LG8pKX19ZnVuY3Rpb24gRTAoaSx0LGUsbixzLHIsbyxhPSExKXttYShpLG4scyxyLG8sYSksbWEoYT9lOnQsbixzLHIsbyxhKSxtYShhP3Q6ZSxuLHMscixvLGEpfWZ1bmN0aW9uIGtsKGksdCxlPSExKXtzd2l0Y2goaSl7Y2FzZSB3MDppZih0PT09eG58fHQ9PT1KcyYmIWUpcmV0dXJuIHduO2JyZWFrO2Nhc2UgYjA6aWYoZSl7aWYodD09PWduKXJldHVybiBPaX1lbHNlIGlmKHQ9PT14bnx8dD09PVhzKXJldHVybiB3bjticmVhaztjYXNlIE0wOmlmKGUpe2lmKHQ9PT14bnx8dD09PVhzKXJldHVybiB3bn1lbHNlIGlmKHQ9PT1nbilyZXR1cm4gT2k7YnJlYWs7Y2FzZSBBMDppZih0PT09Z24pcmV0dXJuIE9pO2lmKHQ9PT14bilyZXR1cm4gd247YnJlYWs7Y2FzZSBTbDppZih0PT09Z258fHQ9PT1KcyYmIWUpcmV0dXJuIHduO2JyZWFrO2Nhc2Ugdmw6aWYoIWUmJih0PT09eG58fHQ9PT1YcykpcmV0dXJuIHduO2JyZWFrO2Nhc2Ugemw6aWYoIWUmJih0PT09Z258fHQ9PT1KcykpcmV0dXJuIHduO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgQ1NHIG9wZXJhdGlvbiBlbnVtICIke2l9Ii5gKX1yZXR1cm4gcGF9ZnVuY3Rpb24geWEoaSx0LGUsbixzLHIsbz0hMSxhPSExKXtjb25zdCBjPWw9PntyLnB1c2gobC54KSxzPjEmJnIucHVzaChsLnkpLHM+MiYmci5wdXNoKGwueikscz4zJiZyLnB1c2gobC53KX07dWEuc2V0KDAsMCwwLDApLmFkZFNjYWxlZFZlY3RvcihpLG4uYS54KS5hZGRTY2FsZWRWZWN0b3IodCxuLmEueSkuYWRkU2NhbGVkVmVjdG9yKGUsbi5hLnopLEdzLnNldCgwLDAsMCwwKS5hZGRTY2FsZWRWZWN0b3IoaSxuLmIueCkuYWRkU2NhbGVkVmVjdG9yKHQsbi5iLnkpLmFkZFNjYWxlZFZlY3RvcihlLG4uYi56KSxacy5zZXQoMCwwLDAsMCkuYWRkU2NhbGVkVmVjdG9yKGksbi5jLngpLmFkZFNjYWxlZFZlY3Rvcih0LG4uYy55KS5hZGRTY2FsZWRWZWN0b3IoZSxuLmMueiksYSYmKHVhLm5vcm1hbGl6ZSgpLEdzLm5vcm1hbGl6ZSgpLFpzLm5vcm1hbGl6ZSgpKSxjKHVhKSxvPyhjKFpzKSxjKEdzKSk6KGMoR3MpLGMoWnMpKX1mdW5jdGlvbiBtYShpLHQsZSxuLHMscj0hMSl7Zm9yKGNvbnN0IG8gaW4gcyl7Y29uc3QgYT10W29dLGM9c1tvXTtpZighKG8gaW4gdCkpdGhyb3cgbmV3IEVycm9yKGBDU0cgT3BlcmF0aW9uczogQXR0cmlidXRlICR7b30gbm8gYXZhaWxhYmxlIG9uIGdlb21ldHJ5LmApO2NvbnN0IGw9YS5pdGVtU2l6ZTtvPT09InBvc2l0aW9uIj8oTmUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGkpLmFwcGx5TWF0cml4NChlKSxjLnB1c2goTmUueCxOZS55LE5lLnopKTpvPT09Im5vcm1hbCI/KE5lLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxpKS5hcHBseU5vcm1hbE1hdHJpeChuKSxyJiZOZS5tdWx0aXBseVNjYWxhcigtMSksYy5wdXNoKE5lLngsTmUueSxOZS56KSk6KGMucHVzaChhLmdldFgoaSkpLGw+MSYmYy5wdXNoKGEuZ2V0WShpKSksbD4yJiZjLnB1c2goYS5nZXRaKGkpKSxsPjMmJmMucHVzaChhLmdldFcoaSkpKX19Y2xhc3MgUDB7Y29uc3RydWN0b3IodCl7dGhpcy50cmlhbmdsZT1uZXcgZXQoKS5jb3B5KHQpLHRoaXMuaW50ZXJzZWN0cz17fX1hZGRUcmlhbmdsZSh0LGUpe3RoaXMuaW50ZXJzZWN0c1t0XT1uZXcgZXQoKS5jb3B5KGUpfWdldEludGVyc2VjdEFycmF5KCl7Y29uc3QgdD1bXSx7aW50ZXJzZWN0czplfT10aGlzO2Zvcihjb25zdCBuIGluIGUpdC5wdXNoKGVbbl0pO3JldHVybiB0fX1jbGFzcyBObHtjb25zdHJ1Y3Rvcigpe3RoaXMuZGF0YT17fX1hZGRUcmlhbmdsZUludGVyc2VjdGlvbih0LGUsbixzKXtjb25zdHtkYXRhOnJ9PXRoaXM7clt0XXx8KHJbdF09bmV3IFAwKGUpKSxyW3RdLmFkZFRyaWFuZ2xlKG4scyl9Z2V0VHJpYW5nbGVzQXNBcnJheSh0PW51bGwpe2NvbnN0e2RhdGE6ZX09dGhpcyxuPVtdO2lmKHQhPT1udWxsKXQgaW4gZSYmbi5wdXNoKGVbdF0udHJpYW5nbGUpO2Vsc2UgZm9yKGNvbnN0IHMgaW4gZSluLnB1c2goZVtzXS50cmlhbmdsZSk7cmV0dXJuIG59Z2V0VHJpYW5nbGVJbmRpY2VzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubWFwKHQ9PnBhcnNlSW50KHQpKX1nZXRJbnRlcnNlY3Rpb25JbmRpY2VzKHQpe2NvbnN0e2RhdGE6ZX09dGhpcztyZXR1cm4gZVt0XT9PYmplY3Qua2V5cyhlW3RdLmludGVyc2VjdHMpLm1hcChuPT5wYXJzZUludChuKSk6W119Z2V0SW50ZXJzZWN0aW9uc0FzQXJyYXkodD1udWxsLGU9bnVsbCl7Y29uc3R7ZGF0YTpufT10aGlzLHM9bmV3IFNldCxyPVtdLG89YT0+e2lmKG5bYV0paWYoZSE9PW51bGwpblthXS5pbnRlcnNlY3RzW2VdJiZyLnB1c2goblthXS5pbnRlcnNlY3RzW2VdKTtlbHNle2NvbnN0IGM9blthXS5pbnRlcnNlY3RzO2Zvcihjb25zdCBsIGluIGMpcy5oYXMobCl8fChzLmFkZChsKSxyLnB1c2goY1tsXSkpfX07aWYodCE9PW51bGwpbyh0KTtlbHNlIGZvcihjb25zdCBhIGluIG4pbyhhKTtyZXR1cm4gcn1yZXNldCgpe3RoaXMuZGF0YT17fX19Y2xhc3MgQzB7Y29uc3RydWN0b3IoKXt0aGlzLmVuYWJsZWQ9ITEsdGhpcy50cmlhbmdsZUludGVyc2VjdHNBPW5ldyBObCx0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0I9bmV3IE5sLHRoaXMuaW50ZXJzZWN0aW9uRWRnZXM9W119YWRkSW50ZXJzZWN0aW5nVHJpYW5nbGVzKHQsZSxuLHMpe2NvbnN0e3RyaWFuZ2xlSW50ZXJzZWN0c0E6cix0cmlhbmdsZUludGVyc2VjdHNCOm99PXRoaXM7ci5hZGRUcmlhbmdsZUludGVyc2VjdGlvbih0LGUsbixzKSxvLmFkZFRyaWFuZ2xlSW50ZXJzZWN0aW9uKG4scyx0LGUpfWFkZEVkZ2UodCl7dGhpcy5pbnRlcnNlY3Rpb25FZGdlcy5wdXNoKHQuY2xvbmUoKSl9cmVzZXQoKXt0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0EucmVzZXQoKSx0aGlzLnRyaWFuZ2xlSW50ZXJzZWN0c0IucmVzZXQoKSx0aGlzLmludGVyc2VjdGlvbkVkZ2VzPVtdfWluaXQoKXt0aGlzLmVuYWJsZWQmJih0aGlzLnJlc2V0KCksRmwodGhpcykpfWNvbXBsZXRlKCl7dGhpcy5lbmFibGVkJiZGbChudWxsKX19Y29uc3Qgc249bmV3IHN0LGpzPW5ldyBnZSxibj1uZXcgZXQsUXM9bmV3IGV0LHJuPW5ldyBldCxLcz1uZXcgZXQsZGU9W10sTW49W107ZnVuY3Rpb24gQjAoaSl7Zm9yKGNvbnN0IHQgb2YgaSlyZXR1cm4gdH1mdW5jdGlvbiBGMChpLHQsZSxuLHMscj17fSl7Y29uc3R7dXNlR3JvdXBzOm89ITB9PXIse2FJbnRlcnNlY3Rpb25zOmEsYkludGVyc2VjdGlvbnM6Y309ejAoaSx0KSxsPVtdO2xldCBoPW51bGwsdTtyZXR1cm4gdT1vPzA6LTEsUmwoaSx0LGEsZSwhMSxuLHMsdSksTGwoaSx0LGEsZSwhMSxzLHUpLGUuZmluZEluZGV4KGQ9PmQhPT16bCYmZCE9PXZsKSE9PS0xJiYodT1vP2kuZ2VvbWV0cnkuZ3JvdXBzLmxlbmd0aHx8MTotMSxSbCh0LGksYyxlLCEwLG4scyx1KSxMbCh0LGksYyxlLCEwLHMsdSkpLGRlLmxlbmd0aD0wLE1uLmxlbmd0aD0wLHtncm91cHM6bCxtYXRlcmlhbHM6aH19ZnVuY3Rpb24gUmwoaSx0LGUsbixzLHIsbyxhPTApe2NvbnN0IGM9aS5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpPDA7c24uY29weSh0Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKS5tdWx0aXBseShpLm1hdHJpeFdvcmxkKSxqcy5nZXROb3JtYWxNYXRyaXgoaS5tYXRyaXhXb3JsZCkubXVsdGlwbHlTY2FsYXIoYz8tMToxKTtjb25zdCBsPWkuZ2VvbWV0cnkuZ3JvdXBJbmRpY2VzLGg9aS5nZW9tZXRyeS5pbmRleCx1PWkuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixmPXQuZ2VvbWV0cnkuYm91bmRzVHJlZSxkPXQuZ2VvbWV0cnkuaW5kZXgscD10Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24seT1lLmlkcyxtPWUuaW50ZXJzZWN0aW9uU2V0O2ZvcihsZXQgZz0wLGI9eS5sZW5ndGg7ZzxiO2crKyl7Y29uc3Qgdz15W2ddLHg9YT09PS0xPzA6bFt3XSthLE09Myp3LEE9aC5nZXRYKE0rMCksXz1oLmdldFgoTSsxKSxTPWguZ2V0WChNKzIpO2JuLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LEEpLmFwcGx5TWF0cml4NChzbiksYm4uYi5mcm9tQnVmZmVyQXR0cmlidXRlKHUsXykuYXBwbHlNYXRyaXg0KHNuKSxibi5jLmZyb21CdWZmZXJBdHRyaWJ1dGUodSxTKS5hcHBseU1hdHJpeDQoc24pLHIucmVzZXQoKSxyLmluaXRpYWxpemUoYm4pO2NvbnN0IEU9bVt3XTtmb3IobGV0IHY9MCxDPUUubGVuZ3RoO3Y8Qzt2Kyspe2NvbnN0IFA9MypFW3ZdLEY9ZC5nZXRYKFArMCksQj1kLmdldFgoUCsxKSxJPWQuZ2V0WChQKzIpO1FzLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEYpLFFzLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEIpLFFzLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLEkpLHIuc3BsaXRCeVRyaWFuZ2xlKFFzKX1jb25zdCB6PXIudHJpYW5nbGVzO2ZvcihsZXQgdj0wLEM9ei5sZW5ndGg7djxDO3YrKyl7Y29uc3QgUD16W3ZdLEY9ci5jb3BsYW5hclRyaWFuZ2xlVXNlZD92MChQLGYpOklsKFAsZik7ZGUubGVuZ3RoPTAsTW4ubGVuZ3RoPTA7Zm9yKGxldCBCPTAsST1uLmxlbmd0aDtCPEk7QisrKXtjb25zdCBrPWtsKG5bQl0sRixzKTtrIT09cGEmJihNbi5wdXNoKGspLGRlLnB1c2gob1tCXS5nZXRHcm91cEF0dHJTZXQoeCkpKX1pZihkZS5sZW5ndGghPT0wKXtibi5nZXRCYXJ5Y29vcmQoUC5hLEtzLmEpLGJuLmdldEJhcnljb29yZChQLmIsS3MuYiksYm4uZ2V0QmFyeWNvb3JkKFAuYyxLcy5jKTtmb3IobGV0IEI9MCxJPWRlLmxlbmd0aDtCPEk7QisrKXtjb25zdCBrPWRlW0JdLFY9TW5bQl09PT1PaTtUMCh3LEtzLGkuZ2VvbWV0cnksaS5tYXRyaXhXb3JsZCxqcyxrLGMhPT1WKX19fX1yZXR1cm4geS5sZW5ndGh9ZnVuY3Rpb24gTGwoaSx0LGUsbixzLHIsbz0wKXtjb25zdCBhPWkubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKTwwO3NuLmNvcHkodC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkoaS5tYXRyaXhXb3JsZCksanMuZ2V0Tm9ybWFsTWF0cml4KGkubWF0cml4V29ybGQpLm11bHRpcGx5U2NhbGFyKGE/LTE6MSk7Y29uc3QgYz10Lmdlb21ldHJ5LmJvdW5kc1RyZWUsbD1pLmdlb21ldHJ5Lmdyb3VwSW5kaWNlcyxoPWkuZ2VvbWV0cnkuaW5kZXgsdT1pLmdlb21ldHJ5LmF0dHJpYnV0ZXMsZj11LnBvc2l0aW9uLGQ9W10scD1pLmdlb21ldHJ5LmhhbGZFZGdlcyx5PW5ldyBTZXQsbT1uYShpLmdlb21ldHJ5KTtmb3IobGV0IGc9MCxiPW07ZzxiO2crKylnIGluIGUuaW50ZXJzZWN0aW9uU2V0fHx5LmFkZChnKTtmb3IoO3kuc2l6ZT4wOyl7Y29uc3QgZz1CMCh5KTt5LmRlbGV0ZShnKSxkLnB1c2goZyk7Y29uc3QgYj0zKmcsdz1oLmdldFgoYiswKSx4PWguZ2V0WChiKzEpLE09aC5nZXRYKGIrMik7cm4uYS5mcm9tQnVmZmVyQXR0cmlidXRlKGYsdykuYXBwbHlNYXRyaXg0KHNuKSxybi5iLmZyb21CdWZmZXJBdHRyaWJ1dGUoZix4KS5hcHBseU1hdHJpeDQoc24pLHJuLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLE0pLmFwcGx5TWF0cml4NChzbik7Y29uc3QgQT1JbChybixjKTtNbi5sZW5ndGg9MCxkZS5sZW5ndGg9MDtmb3IobGV0IF89MCxTPW4ubGVuZ3RoO188UztfKyspe2NvbnN0IEU9a2wobltfXSxBLHMpO0UhPT1wYSYmKE1uLnB1c2goRSksZGUucHVzaChyW19dKSl9Zm9yKDtkLmxlbmd0aD4wOyl7Y29uc3QgXz1kLnBvcCgpO2ZvcihsZXQgUz0wO1M8MztTKyspe2NvbnN0IEU9cC5nZXRTaWJsaW5nVHJpYW5nbGVJbmRleChfLFMpO0UhPT0tMSYmeS5oYXMoRSkmJihkLnB1c2goRSkseS5kZWxldGUoRSkpfWlmKGRlLmxlbmd0aCE9PTApe2NvbnN0IFM9MypfLEU9aC5nZXRYKFMrMCksej1oLmdldFgoUysxKSx2PWguZ2V0WChTKzIpLEM9bz09PS0xPzA6bFtfXStvO2lmKHJuLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLEUpLHJuLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLHopLHJuLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLHYpLCFubihybikpZm9yKGxldCBQPTAsRj1kZS5sZW5ndGg7UDxGO1ArKyl7Y29uc3QgQj1NbltQXSxJPWRlW1BdLmdldEdyb3VwQXR0clNldChDKSxrPUI9PT1PaTtFMChFLHosdix1LGkubWF0cml4V29ybGQsanMsSSxrIT09YSl9fX19fWZ1bmN0aW9uIEkwKGkpe2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGgtMTt0Kyspe2NvbnN0IGU9aVt0XSxuPWlbdCsxXTtpZihlLm1hdGVyaWFsSW5kZXg9PT1uLm1hdGVyaWFsSW5kZXgpe2NvbnN0IHM9ZS5zdGFydCxyPW4uc3RhcnQrbi5jb3VudDtuLnN0YXJ0PXMsbi5jb3VudD1yLXMsaS5zcGxpY2UodCwxKSx0LS19fX1mdW5jdGlvbiBrMChpLHQsZSxuKXtlLmNsZWFyKCk7Y29uc3Qgcz1pLmF0dHJpYnV0ZXM7Zm9yKGxldCByPTAsbz1uLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPW5bcl0sYz1zW2FdO2UuaW5pdGlhbGl6ZUFycmF5KGEsYy5hcnJheS5jb25zdHJ1Y3RvcixjLml0ZW1TaXplLGMubm9ybWFsaXplZCl9Zm9yKGNvbnN0IHIgaW4gZS5hdHRyaWJ1dGVzKW4uaW5jbHVkZXMocil8fGUuZGVsZXRlKHIpO2Zvcihjb25zdCByIGluIHQuYXR0cmlidXRlcyluLmluY2x1ZGVzKHIpfHwodC5kZWxldGVBdHRyaWJ1dGUociksdC5kaXNwb3NlKCkpfWZ1bmN0aW9uIE4wKGksdCxlKXtsZXQgbj0hMSxzPS0xO2NvbnN0IHI9aS5hdHRyaWJ1dGVzLG89dC5ncm91cEF0dHJpYnV0ZXNbMF07Zm9yKGNvbnN0IGMgaW4gbyl7Y29uc3QgbD10LmdldFRvdGFsTGVuZ3RoKGMpLGg9dC5nZXRUeXBlKGMpLHU9dC5nZXRJdGVtU2l6ZShjKSxmPXQuZ2V0Tm9ybWFsaXplZChjKTtsZXQgZD1yW2NdOyghZHx8ZC5hcnJheS5sZW5ndGg8bCkmJihkPW5ldyB4dChuZXcgaChsKSx1LGYpLGkuc2V0QXR0cmlidXRlKGMsZCksbj0hMCk7bGV0IHA9MDtmb3IobGV0IHk9MCxtPU1hdGgubWluKGUubGVuZ3RoLHQuZ3JvdXBDb3VudCk7eTxtO3krKyl7Y29uc3QgZz1lW3ldLmluZGV4LHthcnJheTpiLHR5cGU6dyxsZW5ndGg6eH09dC5ncm91cEF0dHJpYnV0ZXNbZ11bY10sTT1uZXcgdyhiLmJ1ZmZlciwwLHgpO2QuYXJyYXkuc2V0KE0scCkscCs9TS5sZW5ndGh9ZC5uZWVkc1VwZGF0ZT0hMCxzPWwvZC5pdGVtU2l6ZX1pZihpLmluZGV4KXtjb25zdCBjPWkuaW5kZXguYXJyYXk7aWYoYy5sZW5ndGg8cylpLmluZGV4PW51bGwsbj0hMDtlbHNlIGZvcihsZXQgbD0wLGg9Yy5sZW5ndGg7bDxoO2wrKyljW2xdPWx9bGV0IGE9MDtpLmNsZWFyR3JvdXBzKCk7Zm9yKGxldCBjPTAsbD1NYXRoLm1pbihlLmxlbmd0aCx0Lmdyb3VwQ291bnQpO2M8bDtjKyspe2NvbnN0e2luZGV4OmgsbWF0ZXJpYWxJbmRleDp1fT1lW2NdLGY9dC5nZXRDb3VudChoKTtmIT09MCYmKGkuYWRkR3JvdXAoYSxmLHUpLGErPWYpfWkuc2V0RHJhd1JhbmdlKDAscyksaS5ib3VuZHNUcmVlPW51bGwsbiYmaS5kaXNwb3NlKCl9ZnVuY3Rpb24gT2woaSx0KXtsZXQgZT10O3JldHVybiBBcnJheS5pc0FycmF5KHQpfHwoZT1bXSxpLmZvckVhY2gobj0+e2Vbbi5tYXRlcmlhbEluZGV4XT10fSkpLGV9Y2xhc3MgUjB7Y29uc3RydWN0b3IoKXt0aGlzLnRyaWFuZ2xlU3BsaXR0ZXI9bmV3IG0wLHRoaXMuYXR0cmlidXRlRGF0YT1bXSx0aGlzLmF0dHJpYnV0ZXM9WyJwb3NpdGlvbiIsInV2Iiwibm9ybWFsIl0sdGhpcy51c2VHcm91cHM9ITAsdGhpcy5jb25zb2xpZGF0ZUdyb3Vwcz0hMCx0aGlzLmRlYnVnPW5ldyBDMH1nZXRHcm91cFJhbmdlcyh0KXtyZXR1cm4hdGhpcy51c2VHcm91cHN8fHQuZ3JvdXBzLmxlbmd0aD09PTA/W3tzdGFydDowLGNvdW50OjEvMCxtYXRlcmlhbEluZGV4OjB9XTp0Lmdyb3Vwcy5tYXAoZT0+RnQoe30sZSkpfWV2YWx1YXRlKHQsZSxuLHM9bmV3IEhzKXtsZXQgcj0hMDtpZihBcnJheS5pc0FycmF5KG4pfHwobj1bbl0pLEFycmF5LmlzQXJyYXkocyl8fChzPVtzXSxyPSExKSxzLmxlbmd0aCE9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiRXZhbHVhdG9yOiBvcGVyYXRpb25zIGFuZCB0YXJnZXQgYXJyYXkgcGFzc2VkIGFzIGRpZmZlcmVudCBzaXplcy4iKTt0LnByZXBhcmVHZW9tZXRyeSgpLGUucHJlcGFyZUdlb21ldHJ5KCk7Y29uc3R7dHJpYW5nbGVTcGxpdHRlcjpvLGF0dHJpYnV0ZURhdGE6YSxhdHRyaWJ1dGVzOmMsdXNlR3JvdXBzOmwsY29uc29saWRhdGVHcm91cHM6aCxkZWJ1Zzp1fT10aGlzO2Zvcig7YS5sZW5ndGg8cy5sZW5ndGg7KWEucHVzaChuZXcgeDApO3MuZm9yRWFjaCgoZyxiKT0+e2swKHQuZ2VvbWV0cnksZy5nZW9tZXRyeSxhW2JdLGMpfSksdS5pbml0KCksRjAodCxlLG4sbyxhLHt1c2VHcm91cHM6bH0pLHUuY29tcGxldGUoKTtjb25zdCBmPXRoaXMuZ2V0R3JvdXBSYW5nZXModC5nZW9tZXRyeSksZD1PbChmLHQubWF0ZXJpYWwpLHA9dGhpcy5nZXRHcm91cFJhbmdlcyhlLmdlb21ldHJ5KSx5PU9sKHAsZS5tYXRlcmlhbCk7cC5mb3JFYWNoKGc9PmcubWF0ZXJpYWxJbmRleCs9ZC5sZW5ndGgpO2xldCBtPVsuLi5mLC4uLnBdLm1hcCgoZyxiKT0+R2UoRnQoe30sZykse2luZGV4OmJ9KSk7aWYobCl7Y29uc3QgZz1bLi4uZCwuLi55XTtoJiYobT1tLm1hcCh3PT57Y29uc3QgeD1nW3cubWF0ZXJpYWxJbmRleF07cmV0dXJuIHcubWF0ZXJpYWxJbmRleD1nLmluZGV4T2YoeCksd30pLnNvcnQoKHcseCk9PncubWF0ZXJpYWxJbmRleC14Lm1hdGVyaWFsSW5kZXgpKTtjb25zdCBiPVtdO2ZvcihsZXQgdz0wLHg9Zy5sZW5ndGg7dzx4O3crKyl7bGV0IE09ITE7Zm9yKGxldCBBPTAsXz1tLmxlbmd0aDtBPF87QSsrKXtjb25zdCBTPW1bQV07Uy5tYXRlcmlhbEluZGV4PT09dyYmKE09ITAsUy5tYXRlcmlhbEluZGV4PWIubGVuZ3RoKX1NJiZiLnB1c2goZ1t3XSl9cy5mb3JFYWNoKHc9Pnt3Lm1hdGVyaWFsPWJ9KX1lbHNlIG09W3tzdGFydDowLGNvdW50OjEvMCxpbmRleDowLG1hdGVyaWFsSW5kZXg6MH1dLHMuZm9yRWFjaChnPT57Zy5tYXRlcmlhbD1kWzBdfSk7cmV0dXJuIHMuZm9yRWFjaCgoZyxiKT0+e2NvbnN0IHc9Zy5nZW9tZXRyeTtOMCh3LGFbYl0sbSksaCYmSTAody5ncm91cHMpfSkscj9zOnNbMF19ZXZhbHVhdGVIaWVyYXJjaHkodCxlPW5ldyBIcyl7dC51cGRhdGVNYXRyaXhXb3JsZCghMCk7Y29uc3Qgbj0ocixvKT0+e2NvbnN0IGE9ci5jaGlsZHJlbjtmb3IobGV0IGM9MCxsPWEubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9YVtjXTtoLmlzT3BlcmF0aW9uR3JvdXA/bihoLG8pOm8oaCl9fSxzPXI9Pntjb25zdCBvPXIuY2hpbGRyZW47bGV0IGE9ITE7Zm9yKGxldCBsPTAsaD1vLmxlbmd0aDtsPGg7bCsrKXtjb25zdCB1PW9bbF07YT1zKHUpfHxhfWNvbnN0IGM9ci5pc0RpcnR5KCk7aWYoYyYmci5tYXJrVXBkYXRlZCgpLGEmJiFyLmlzT3BlcmF0aW9uR3JvdXApe2xldCBsO3JldHVybiBuKHIsaD0+e2w/bD10aGlzLmV2YWx1YXRlKGwsaCxoLm9wZXJhdGlvbik6bD10aGlzLmV2YWx1YXRlKHIsaCxoLm9wZXJhdGlvbil9KSxyLl9jYWNoZWRHZW9tZXRyeT1sLmdlb21ldHJ5LHIuX2NhY2hlZE1hdGVyaWFscz1sLm1hdGVyaWFsLCEwfWVsc2UgcmV0dXJuIGF8fGN9O3JldHVybiBzKHQpLGUuZ2VvbWV0cnk9dC5fY2FjaGVkR2VvbWV0cnksZS5tYXRlcmlhbD10Ll9jYWNoZWRNYXRlcmlhbHMsZX1yZXNldCgpe3RoaXMudHJpYW5nbGVTcGxpdHRlci5yZXNldCgpfX1mdW5jdGlvbiBEbChpKXtsZXQgdCxlLG4scz0tMSxyPTA7Zm9yKGxldCBsPTA7bDxpLmxlbmd0aDsrK2wpe2NvbnN0IGg9aVtsXTtpZih0PT09dm9pZCAwJiYodD1oLmFycmF5LmNvbnN0cnVjdG9yKSx0IT09aC5hcnJheS5jb25zdHJ1Y3RvcilyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLmFycmF5IG11c3QgYmUgb2YgY29uc2lzdGVudCBhcnJheSB0eXBlcyBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO2lmKGU9PT12b2lkIDAmJihlPWguaXRlbVNpemUpLGUhPT1oLml0ZW1TaXplKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUuaXRlbVNpemUgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7aWYobj09PXZvaWQgMCYmKG49aC5ub3JtYWxpemVkKSxuIT09aC5ub3JtYWxpemVkKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUubm9ybWFsaXplZCBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihzPT09LTEmJihzPWguZ3B1VHlwZSkscyE9PWguZ3B1VHlwZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLmdwdVR5cGUgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7cis9aC5jb3VudCplfWNvbnN0IG89bmV3IHQociksYT1uZXcgeHQobyxlLG4pO2xldCBjPTA7Zm9yKGxldCBsPTA7bDxpLmxlbmd0aDsrK2wpe2NvbnN0IGg9aVtsXTtpZihoLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IHU9Yy9lO2ZvcihsZXQgZj0wLGQ9aC5jb3VudDtmPGQ7ZisrKWZvcihsZXQgcD0wO3A8ZTtwKyspe2NvbnN0IHk9aC5nZXRDb21wb25lbnQoZixwKTthLnNldENvbXBvbmVudChmK3UscCx5KX19ZWxzZSBvLnNldChoLmFycmF5LGMpO2MrPWguY291bnQqZX1yZXR1cm4gcyE9PXZvaWQgMCYmKGEuZ3B1VHlwZT1zKSxhfWZ1bmN0aW9uIEwwKGkpe2lmKGkuZ3JvdXBzLmxlbmd0aD09PTApcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUdyb3VwcygpOiBObyBncm91cHMgYXJlIGRlZmluZWQuIE5vdGhpbmcgdG8gbWVyZ2UuIiksaTtsZXQgdD1pLmdyb3VwcztpZih0PXQuc29ydCgobyxhKT0+by5tYXRlcmlhbEluZGV4IT09YS5tYXRlcmlhbEluZGV4P28ubWF0ZXJpYWxJbmRleC1hLm1hdGVyaWFsSW5kZXg6by5zdGFydC1hLnN0YXJ0KSxpLmdldEluZGV4KCk9PT1udWxsKXtjb25zdCBvPWkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLGE9W107Zm9yKGxldCBjPTA7YzxvLmNvdW50O2MrPTMpYS5wdXNoKGMsYysxLGMrMik7aS5zZXRJbmRleChhKX1jb25zdCBlPWkuZ2V0SW5kZXgoKSxuPVtdO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBhPXRbb10sYz1hLnN0YXJ0LGw9YythLmNvdW50O2ZvcihsZXQgaD1jO2g8bDtoKyspbi5wdXNoKGUuZ2V0WChoKSl9aS5kaXNwb3NlKCksaS5zZXRJbmRleChuKTtsZXQgcz0wO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBhPXRbb107YS5zdGFydD1zLHMrPWEuY291bnR9bGV0IHI9dFswXTtpLmdyb3Vwcz1bcl07Zm9yKGxldCBvPTE7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGE9dFtvXTtyLm1hdGVyaWFsSW5kZXg9PT1hLm1hdGVyaWFsSW5kZXg/ci5jb3VudCs9YS5jb3VudDoocj1hLGkuZ3JvdXBzLnB1c2gocikpfXJldHVybiBpfWZ1bmN0aW9uICRsKGksdD0wKXtjb25zdCBlPWlbMF0uaW5kZXghPT1udWxsLG49bmV3IFNldChPYmplY3Qua2V5cyhpWzBdLmF0dHJpYnV0ZXMpKSxzPW5ldyBTZXQoT2JqZWN0LmtleXMoaVswXS5tb3JwaEF0dHJpYnV0ZXMpKSxyPXt9LG89e30sYT1pWzBdLm1vcnBoVGFyZ2V0c1JlbGF0aXZlLGM9bmV3IHVlO2xldCBsPTA7Zm9yKGxldCBoPTA7aDxpLmxlbmd0aDsrK2gpe2NvbnN0IHU9aVtoXTtsZXQgZj0wO2lmKGUhPT0odS5pbmRleCE9PW51bGwpKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuIEFsbCBnZW9tZXRyaWVzIG11c3QgaGF2ZSBjb21wYXRpYmxlIGF0dHJpYnV0ZXM7IG1ha2Ugc3VyZSBpbmRleCBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uIiksbnVsbDtmb3IoY29uc3QgZCBpbiB1LmF0dHJpYnV0ZXMpe2lmKCFuLmhhcyhkKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsnLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29tcGF0aWJsZSBhdHRyaWJ1dGVzOyBtYWtlIHN1cmUgIicrZCsnIiBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uJyksbnVsbDtyW2RdPT09dm9pZCAwJiYocltkXT1bXSkscltkXS5wdXNoKHUuYXR0cmlidXRlc1tkXSksZisrfWlmKGYhPT1uLnNpemUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grIi4gTWFrZSBzdXJlIGFsbCBnZW9tZXRyaWVzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihhIT09dS5tb3JwaFRhcmdldHNSZWxhdGl2ZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiAubW9ycGhUYXJnZXRzUmVsYXRpdmUgbXVzdCBiZSBjb25zaXN0ZW50IHRocm91Z2hvdXQgYWxsIGdlb21ldHJpZXMuIiksbnVsbDtmb3IoY29uc3QgZCBpbiB1Lm1vcnBoQXR0cmlidXRlcyl7aWYoIXMuaGFzKGQpKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuICAubW9ycGhBdHRyaWJ1dGVzIG11c3QgYmUgY29uc2lzdGVudCB0aHJvdWdob3V0IGFsbCBnZW9tZXRyaWVzLiIpLG51bGw7b1tkXT09PXZvaWQgMCYmKG9bZF09W10pLG9bZF0ucHVzaCh1Lm1vcnBoQXR0cmlidXRlc1tkXSl9aWYodCl7bGV0IGQ7aWYoZSlkPXUuaW5kZXguY291bnQ7ZWxzZSBpZih1LmF0dHJpYnV0ZXMucG9zaXRpb24hPT12b2lkIDApZD11LmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQ7ZWxzZSByZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiBUaGUgZ2VvbWV0cnkgbXVzdCBoYXZlIGVpdGhlciBhbiBpbmRleCBvciBhIHBvc2l0aW9uIGF0dHJpYnV0ZSIpLG51bGw7aWYodD09PTEpYy5hZGRHcm91cChsLGQsaCk7ZWxzZSBpZih0PT09MiYmdS5ncm91cHMubGVuZ3RoPjApZm9yKGxldCBwIG9mIHUuZ3JvdXBzKXtsZXQgeT1wLm1hdGVyaWFsSW5kZXg7Yy5hZGRHcm91cChsK3Auc3RhcnQsTWF0aC5taW4ocC5jb3VudCxkKSx5KX1sKz1kfX1pZihlKXtsZXQgaD0wO2NvbnN0IHU9W107Zm9yKGxldCBmPTA7ZjxpLmxlbmd0aDsrK2Ype2NvbnN0IGQ9aVtmXS5pbmRleDtmb3IobGV0IHA9MDtwPGQuY291bnQ7KytwKXUucHVzaChkLmdldFgocCkraCk7aCs9aVtmXS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWMuc2V0SW5kZXgodSl9Zm9yKGNvbnN0IGggaW4gcil7Y29uc3QgdT1EbChyW2hdKTtpZighdSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aGlsZSB0cnlpbmcgdG8gbWVyZ2UgdGhlICIraCsiIGF0dHJpYnV0ZS4iKSxudWxsO2Muc2V0QXR0cmlidXRlKGgsdSl9Zm9yKGNvbnN0IGggaW4gbyl7Y29uc3QgdT1vW2hdWzBdLmxlbmd0aDtpZih1PT09MClicmVhaztjLm1vcnBoQXR0cmlidXRlcz1jLm1vcnBoQXR0cmlidXRlc3x8e30sYy5tb3JwaEF0dHJpYnV0ZXNbaF09W107Zm9yKGxldCBmPTA7Zjx1OysrZil7Y29uc3QgZD1bXTtmb3IobGV0IHk9MDt5PG9baF0ubGVuZ3RoOysreSlkLnB1c2gob1toXVt5XVtmXSk7Y29uc3QgcD1EbChkKTtpZighcClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aGlsZSB0cnlpbmcgdG8gbWVyZ2UgdGhlICIraCsiIG1vcnBoQXR0cmlidXRlLiIpLG51bGw7Yy5tb3JwaEF0dHJpYnV0ZXNbaF0ucHVzaChwKX19cmV0dXJuIHQ9PT0yP0wwKGMpOmN9Y2xhc3MgTzAgZXh0ZW5kcyBXbntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSk7Y29uc3Qgbj1uZXcgSHMobmV3IFduKHQsR2UoRnQoe30sZSkse2hhc1RvcDohMCxoYXNTaWRlOiEwLGhhc0JvdHRvbTohMX0pKSk7bi51cGRhdGVNYXRyaXhXb3JsZCgpO2NvbnN0IHM9bmV3IGd0KCkuc2V0RnJvbU9iamVjdChuKSxyPW5ldyBUO3MuZ2V0U2l6ZShyKTtjb25zdCBvPW5ldyBUKHMubWluLngrci54LzIscy5taW4ueStyLnkvMiwwKTtsZXQgYT1lLnRvcFNlZ21lbnRzLGM9ZS5ib3gzO2lmKGMpe2M9Yy51bmlvbihzKTtjb25zdCBnPW5ldyBUO2MuZ2V0U2l6ZShnKTtjb25zdCBiPU1hdGgubWF4KHIueC9nLngsci55L2cueSk7YT1NYXRoLmNlaWwoZS50b3BTZWdtZW50cypiKX1pZihhPDQpcmV0dXJuIHRoaXM7Y29uc3QgbD1uZXcgRm8oci54LHIueSxhLGEpLGg9bmV3IEhzKGwpO2gucG9zaXRpb24uc2V0KG8ueCxvLnksby56KSxoLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Y29uc3QgZj1uZXcgUjAoKS5ldmFsdWF0ZShoLG4sU2wpLGQ9Zi5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikscD1uZXcgQ2UoZC5jb3VudCoyLDIpO2ZvcihsZXQgZz0wO2c8ZC5jb3VudDtnKyspe2NvbnN0IGI9ZC5nZXRaKGcpO2Quc2V0WihnLGUuZGVwdGgrYil9aWYoYyl7Y29uc3QgZz1jLm1pbixiPWMubWF4LHc9bmV3IFQoKS5zdWJWZWN0b3JzKGIsZyk7Zm9yKGxldCB4PTA7eDxkLmNvdW50O3grKyl7Y29uc3QgTT1kLmdldFgoeCksQT1kLmdldFkoeCksXz0oTS1nLngpL3cueCxTPShBLWcueSkvdy55O3Auc2V0WFkoeCxfLFMpfWYuZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCJ1diIscCl9ZC5uZWVkc1VwZGF0ZT0hMDtjb25zdCB5PW5ldyBXbih0LEdlKEZ0KHt9LGUpLHtoYXNUb3A6ITF9KSksbT0kbChbZi5nZW9tZXRyeSx5XSwyKTt0aGlzLmNvcHkobS50b05vbkluZGV4ZWQoKSl9fXZhciBEMD1pPT57Y29uc3R7c3BsaXQ6dCxkZXB0aDplLHBvaW50czpuLGJveDM6cyxoYXNUb3A6cixoYXNCb3R0b206byxoYXNTaWRlOmEsc2lkZVJlcGVhdDpjLHRvcFNlZ21lbnRzOmx9PWksaD1sP08wOlduLHU9bmV3IGgobmV3IERjKG4pLHtkZXB0aDplLGJldmVsRW5hYmxlZDohMSxib3gzOnMsVVZHZW5lcmF0b3I6JGYoe3NwbGl0OnQsYm94MzpzLHNpZGVSZXBlYXQ6Y30pLGhhc1RvcDpyLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSx0b3BTZWdtZW50czpsfSk7cmV0dXJuIFVmKCksdX07ZnVuY3Rpb24gJDAoaSx0LGU9MCl7Y29uc3Qgbj0oOTAtdCkqTWF0aC5QSS8xODAscz0oOTAtaSkqTWF0aC5QSS8xODA7cmV0dXJuW2UqTWF0aC5zaW4obikqTWF0aC5jb3MocyksZSpNYXRoLmNvcyhuKSxlKk1hdGguc2luKG4pKk1hdGguc2luKHMpXX1mdW5jdGlvbiB0cihpLHQpe3JldHVybiBpPT1udWxsfHx0PT1udWxsP05hTjppPHQ/LTE6aT50PzE6aT49dD8wOk5hTn1mdW5jdGlvbiBVMChpLHQpe3JldHVybiBpPT1udWxsfHx0PT1udWxsP05hTjp0PGk/LTE6dD5pPzE6dD49aT8wOk5hTn1mdW5jdGlvbiBVbChpKXtsZXQgdCxlLG47aS5sZW5ndGghPT0yPyh0PXRyLGU9KGEsYyk9PnRyKGkoYSksYyksbj0oYSxjKT0+aShhKS1jKToodD1pPT09dHJ8fGk9PT1VMD9pOlYwLGU9aSxuPWkpO2Z1bmN0aW9uIHMoYSxjLGw9MCxoPWEubGVuZ3RoKXtpZihsPGgpe2lmKHQoYyxjKSE9PTApcmV0dXJuIGg7ZG97Y29uc3QgdT1sK2g+Pj4xO2UoYVt1XSxjKTwwP2w9dSsxOmg9dX13aGlsZShsPGgpfXJldHVybiBsfWZ1bmN0aW9uIHIoYSxjLGw9MCxoPWEubGVuZ3RoKXtpZihsPGgpe2lmKHQoYyxjKSE9PTApcmV0dXJuIGg7ZG97Y29uc3QgdT1sK2g+Pj4xO2UoYVt1XSxjKTw9MD9sPXUrMTpoPXV9d2hpbGUobDxoKX1yZXR1cm4gbH1mdW5jdGlvbiBvKGEsYyxsPTAsaD1hLmxlbmd0aCl7Y29uc3QgdT1zKGEsYyxsLGgtMSk7cmV0dXJuIHU+bCYmbihhW3UtMV0sYyk+LW4oYVt1XSxjKT91LTE6dX1yZXR1cm57bGVmdDpzLGNlbnRlcjpvLHJpZ2h0OnJ9fWZ1bmN0aW9uIFYwKCl7cmV0dXJuIDB9ZnVuY3Rpb24gcTAoaSl7cmV0dXJuIGk9PT1udWxsP05hTjoraX1jb25zdCBIMD1VbCh0cikucmlnaHQ7VWwocTApLmNlbnRlcjtmdW5jdGlvbiBlcihpLHQpe2xldCBlLG47aWYodD09PXZvaWQgMClmb3IoY29uc3QgcyBvZiBpKXMhPW51bGwmJihlPT09dm9pZCAwP3M+PXMmJihlPW49cyk6KGU+cyYmKGU9cyksbjxzJiYobj1zKSkpO2Vsc2V7bGV0IHM9LTE7Zm9yKGxldCByIG9mIGkpKHI9dChyLCsrcyxpKSkhPW51bGwmJihlPT09dm9pZCAwP3I+PXImJihlPW49cik6KGU+ciYmKGU9ciksbjxyJiYobj1yKSkpfXJldHVybltlLG5dfWNsYXNzIFJle2NvbnN0cnVjdG9yKCl7dGhpcy5fcGFydGlhbHM9bmV3IEZsb2F0NjRBcnJheSgzMiksdGhpcy5fbj0wfWFkZCh0KXtjb25zdCBlPXRoaXMuX3BhcnRpYWxzO2xldCBuPTA7Zm9yKGxldCBzPTA7czx0aGlzLl9uJiZzPDMyO3MrKyl7Y29uc3Qgcj1lW3NdLG89dCtyLGE9TWF0aC5hYnModCk8TWF0aC5hYnMocik/dC0oby1yKTpyLShvLXQpO2EmJihlW24rK109YSksdD1vfXJldHVybiBlW25dPXQsdGhpcy5fbj1uKzEsdGhpc312YWx1ZU9mKCl7Y29uc3QgdD10aGlzLl9wYXJ0aWFscztsZXQgZT10aGlzLl9uLG4scyxyLG89MDtpZihlPjApe2ZvcihvPXRbLS1lXTtlPjAmJihuPW8scz10Wy0tZV0sbz1uK3Mscj1zLShvLW4pLCFyKTspO2U+MCYmKHI8MCYmdFtlLTFdPDB8fHI+MCYmdFtlLTFdPjApJiYocz1yKjIsbj1vK3Mscz09bi1vJiYobz1uKSl9cmV0dXJuIG99fWNvbnN0IFcwPU1hdGguc3FydCg1MCksRzA9TWF0aC5zcXJ0KDEwKSxaMD1NYXRoLnNxcnQoMik7ZnVuY3Rpb24gbnIoaSx0LGUpe2NvbnN0IG49KHQtaSkvTWF0aC5tYXgoMCxlKSxzPU1hdGguZmxvb3IoTWF0aC5sb2cxMChuKSkscj1uL01hdGgucG93KDEwLHMpLG89cj49VzA/MTA6cj49RzA/NTpyPj1aMD8yOjE7bGV0IGEsYyxsO3JldHVybiBzPDA/KGw9TWF0aC5wb3coMTAsLXMpL28sYT1NYXRoLnJvdW5kKGkqbCksYz1NYXRoLnJvdW5kKHQqbCksYS9sPGkmJisrYSxjL2w+dCYmLS1jLGw9LWwpOihsPU1hdGgucG93KDEwLHMpKm8sYT1NYXRoLnJvdW5kKGkvbCksYz1NYXRoLnJvdW5kKHQvbCksYSpsPGkmJisrYSxjKmw+dCYmLS1jKSxjPGEmJi41PD1lJiZlPDI/bnIoaSx0LGUqMik6W2EsYyxsXX1mdW5jdGlvbiBYMChpLHQsZSl7aWYodD0rdCxpPStpLGU9K2UsIShlPjApKXJldHVybltdO2lmKGk9PT10KXJldHVybltpXTtjb25zdCBuPXQ8aSxbcyxyLG9dPW4/bnIodCxpLGUpOm5yKGksdCxlKTtpZighKHI+PXMpKXJldHVybltdO2NvbnN0IGE9ci1zKzEsYz1uZXcgQXJyYXkoYSk7aWYobilpZihvPDApZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShyLWwpLy1vO2Vsc2UgZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShyLWwpKm87ZWxzZSBpZihvPDApZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShzK2wpLy1vO2Vsc2UgZm9yKGxldCBsPTA7bDxhOysrbCljW2xdPShzK2wpKm87cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoaSx0LGUpe3JldHVybiB0PSt0LGk9K2ksZT0rZSxucihpLHQsZSlbMl19ZnVuY3Rpb24gSjAoaSx0LGUpe3Q9K3QsaT0raSxlPStlO2NvbnN0IG49dDxpLHM9bj9nYSh0LGksZSk6Z2EoaSx0LGUpO3JldHVybihuPy0xOjEpKihzPDA/MS8tczpzKX1mdW5jdGlvbiBZMChpLHQpe2xldCBlPTAsbj0wO2lmKHQ9PT12b2lkIDApZm9yKGxldCBzIG9mIGkpcyE9bnVsbCYmKHM9K3MpPj1zJiYoKytlLG4rPXMpO2Vsc2V7bGV0IHM9LTE7Zm9yKGxldCByIG9mIGkpKHI9dChyLCsrcyxpKSkhPW51bGwmJihyPStyKT49ciYmKCsrZSxuKz1yKX1pZihlKXJldHVybiBuL2V9ZnVuY3Rpb24qajAoaSl7Zm9yKGNvbnN0IHQgb2YgaSl5aWVsZCokdSh0KX1mdW5jdGlvbiBEaShpKXtyZXR1cm4gQXJyYXkuZnJvbShqMChpKSl9dmFyIEs9MWUtNixpcj0xZS0xMixYPU1hdGguUEksTnQ9WC8yLHNyPVgvNCxSdD1YKjIsaHQ9MTgwL1gsSD1YLzE4MCx0dD1NYXRoLmFicyx4YT1NYXRoLmF0YW4scmU9TWF0aC5hdGFuMixXPU1hdGguY29zLFEwPU1hdGguZXhwLHdhPU1hdGguaHlwb3QsSzA9TWF0aC5sb2cscT1NYXRoLnNpbix0cD1NYXRoLnNpZ258fGZ1bmN0aW9uKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH0sTGU9TWF0aC5zcXJ0LGVwPU1hdGgudGFuO2Z1bmN0aW9uIG5wKGkpe3JldHVybiBpPjE/MDppPC0xP1g6TWF0aC5hY29zKGkpfWZ1bmN0aW9uIE9lKGkpe3JldHVybiBpPjE/TnQ6aTwtMT8tTnQ6TWF0aC5hc2luKGkpfWZ1bmN0aW9uIFZsKGkpe3JldHVybihpPXEoaS8yKSkqaX1mdW5jdGlvbiBTdCgpe31mdW5jdGlvbiBycihpLHQpe2kmJkhsLmhhc093blByb3BlcnR5KGkudHlwZSkmJkhsW2kudHlwZV0oaSx0KX12YXIgcWw9e0ZlYXR1cmU6ZnVuY3Rpb24oaSx0KXtycihpLmdlb21ldHJ5LHQpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmZlYXR1cmVzLG49LTEscz1lLmxlbmd0aDsrK248czspcnIoZVtuXS5nZW9tZXRyeSx0KX19LEhsPXtTcGhlcmU6ZnVuY3Rpb24oaSx0KXt0LnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbihpLHQpe2k9aS5jb29yZGluYXRlcyx0LnBvaW50KGlbMF0saVsxXSxpWzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspaT1lW25dLHQucG9pbnQoaVswXSxpWzFdLGlbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKGksdCl7YmEoaS5jb29yZGluYXRlcyx0LDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWJhKGVbbl0sdCwwKX0sUG9seWdvbjpmdW5jdGlvbihpLHQpe1dsKGkuY29vcmRpbmF0ZXMsdCl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspV2woZVtuXSx0KX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuZ2VvbWV0cmllcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KXJyKGVbbl0sdCl9fTtmdW5jdGlvbiBiYShpLHQsZSl7dmFyIG49LTEscz1pLmxlbmd0aC1lLHI7Zm9yKHQubGluZVN0YXJ0KCk7KytuPHM7KXI9aVtuXSx0LnBvaW50KHJbMF0sclsxXSxyWzJdKTt0LmxpbmVFbmQoKX1mdW5jdGlvbiBXbChpLHQpe3ZhciBlPS0xLG49aS5sZW5ndGg7Zm9yKHQucG9seWdvblN0YXJ0KCk7KytlPG47KWJhKGlbZV0sdCwxKTt0LnBvbHlnb25FbmQoKX1mdW5jdGlvbiBvcihpLHQpe2kmJnFsLmhhc093blByb3BlcnR5KGkudHlwZSk/cWxbaS50eXBlXShpLHQpOnJyKGksdCl9dmFyIGFyPW5ldyBSZSxHbD1uZXcgUmUsWmwsWGwsTWEsQWEsX2EsRGU9e3BvaW50OlN0LGxpbmVTdGFydDpTdCxsaW5lRW5kOlN0LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2FyPW5ldyBSZSxEZS5saW5lU3RhcnQ9aXAsRGUubGluZUVuZD1zcH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBpPSthcjtHbC5hZGQoaTwwP1J0K2k6aSksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9U3R9LHNwaGVyZTpmdW5jdGlvbigpe0dsLmFkZChSdCl9fTtmdW5jdGlvbiBpcCgpe0RlLnBvaW50PXJwfWZ1bmN0aW9uIHNwKCl7SmwoWmwsWGwpfWZ1bmN0aW9uIHJwKGksdCl7RGUucG9pbnQ9SmwsWmw9aSxYbD10LGkqPUgsdCo9SCxNYT1pLEFhPVcodD10LzIrc3IpLF9hPXEodCl9ZnVuY3Rpb24gSmwoaSx0KXtpKj1ILHQqPUgsdD10LzIrc3I7dmFyIGU9aS1NYSxuPWU+PTA/MTotMSxzPW4qZSxyPVcodCksbz1xKHQpLGE9X2EqbyxjPUFhKnIrYSpXKHMpLGw9YSpuKnEocyk7YXIuYWRkKHJlKGwsYykpLE1hPWksQWE9cixfYT1vfWZ1bmN0aW9uIGNyKGkpe3JldHVybltyZShpWzFdLGlbMF0pLE9lKGlbMl0pXX1mdW5jdGlvbiBBbihpKXt2YXIgdD1pWzBdLGU9aVsxXSxuPVcoZSk7cmV0dXJuW24qVyh0KSxuKnEodCkscShlKV19ZnVuY3Rpb24gbHIoaSx0KXtyZXR1cm4gaVswXSp0WzBdK2lbMV0qdFsxXStpWzJdKnRbMl19ZnVuY3Rpb24gZWkoaSx0KXtyZXR1cm5baVsxXSp0WzJdLWlbMl0qdFsxXSxpWzJdKnRbMF0taVswXSp0WzJdLGlbMF0qdFsxXS1pWzFdKnRbMF1dfWZ1bmN0aW9uIFNhKGksdCl7aVswXSs9dFswXSxpWzFdKz10WzFdLGlbMl0rPXRbMl19ZnVuY3Rpb24gaHIoaSx0KXtyZXR1cm5baVswXSp0LGlbMV0qdCxpWzJdKnRdfWZ1bmN0aW9uIHVyKGkpe3ZhciB0PUxlKGlbMF0qaVswXStpWzFdKmlbMV0raVsyXSppWzJdKTtpWzBdLz10LGlbMV0vPXQsaVsyXS89dH12YXIgb3QsTHQsdXQscXQsX24sWWwsamwsbmksJGksb24sJGUsVWU9e3BvaW50OnZhLGxpbmVTdGFydDpLbCxsaW5lRW5kOnRoLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1VlLnBvaW50PWVoLFVlLmxpbmVTdGFydD1vcCxVZS5saW5lRW5kPWFwLCRpPW5ldyBSZSxEZS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe0RlLnBvbHlnb25FbmQoKSxVZS5wb2ludD12YSxVZS5saW5lU3RhcnQ9S2wsVWUubGluZUVuZD10aCxhcjwwPyhvdD0tKHV0PTE4MCksTHQ9LShxdD05MCkpOiRpPks/cXQ9OTA6JGk8LUsmJihMdD0tOTApLCRlWzBdPW90LCRlWzFdPXV0fSxzcGhlcmU6ZnVuY3Rpb24oKXtvdD0tKHV0PTE4MCksTHQ9LShxdD05MCl9fTtmdW5jdGlvbiB2YShpLHQpe29uLnB1c2goJGU9W290PWksdXQ9aV0pLHQ8THQmJihMdD10KSx0PnF0JiYocXQ9dCl9ZnVuY3Rpb24gUWwoaSx0KXt2YXIgZT1BbihbaSpILHQqSF0pO2lmKG5pKXt2YXIgbj1laShuaSxlKSxzPVtuWzFdLC1uWzBdLDBdLHI9ZWkocyxuKTt1cihyKSxyPWNyKHIpO3ZhciBvPWktX24sYT1vPjA/MTotMSxjPXJbMF0qaHQqYSxsLGg9dHQobyk+MTgwO2heKGEqX248YyYmYzxhKmkpPyhsPXJbMV0qaHQsbD5xdCYmKHF0PWwpKTooYz0oYyszNjApJTM2MC0xODAsaF4oYSpfbjxjJiZjPGEqaSk/KGw9LXJbMV0qaHQsbDxMdCYmKEx0PWwpKToodDxMdCYmKEx0PXQpLHQ+cXQmJihxdD10KSkpLGg/aTxfbj9IdChvdCxpKT5IdChvdCx1dCkmJih1dD1pKTpIdChpLHV0KT5IdChvdCx1dCkmJihvdD1pKTp1dD49b3Q/KGk8b3QmJihvdD1pKSxpPnV0JiYodXQ9aSkpOmk+X24/SHQob3QsaSk+SHQob3QsdXQpJiYodXQ9aSk6SHQoaSx1dCk+SHQob3QsdXQpJiYob3Q9aSl9ZWxzZSBvbi5wdXNoKCRlPVtvdD1pLHV0PWldKTt0PEx0JiYoTHQ9dCksdD5xdCYmKHF0PXQpLG5pPWUsX249aX1mdW5jdGlvbiBLbCgpe1VlLnBvaW50PVFsfWZ1bmN0aW9uIHRoKCl7JGVbMF09b3QsJGVbMV09dXQsVWUucG9pbnQ9dmEsbmk9bnVsbH1mdW5jdGlvbiBlaChpLHQpe2lmKG5pKXt2YXIgZT1pLV9uOyRpLmFkZCh0dChlKT4xODA/ZSsoZT4wPzM2MDotMzYwKTplKX1lbHNlIFlsPWksamw9dDtEZS5wb2ludChpLHQpLFFsKGksdCl9ZnVuY3Rpb24gb3AoKXtEZS5saW5lU3RhcnQoKX1mdW5jdGlvbiBhcCgpe2VoKFlsLGpsKSxEZS5saW5lRW5kKCksdHQoJGkpPksmJihvdD0tKHV0PTE4MCkpLCRlWzBdPW90LCRlWzFdPXV0LG5pPW51bGx9ZnVuY3Rpb24gSHQoaSx0KXtyZXR1cm4odC09aSk8MD90KzM2MDp0fWZ1bmN0aW9uIGNwKGksdCl7cmV0dXJuIGlbMF0tdFswXX1mdW5jdGlvbiBuaChpLHQpe3JldHVybiBpWzBdPD1pWzFdP2lbMF08PXQmJnQ8PWlbMV06dDxpWzBdfHxpWzFdPHR9ZnVuY3Rpb24gaWgoaSl7dmFyIHQsZSxuLHMscixvLGE7aWYocXQ9dXQ9LShvdD1MdD0xLzApLG9uPVtdLG9yKGksVWUpLGU9b24ubGVuZ3RoKXtmb3Iob24uc29ydChjcCksdD0xLG49b25bMF0scj1bbl07dDxlOysrdClzPW9uW3RdLG5oKG4sc1swXSl8fG5oKG4sc1sxXSk/KEh0KG5bMF0sc1sxXSk+SHQoblswXSxuWzFdKSYmKG5bMV09c1sxXSksSHQoc1swXSxuWzFdKT5IdChuWzBdLG5bMV0pJiYoblswXT1zWzBdKSk6ci5wdXNoKG49cyk7Zm9yKG89LTEvMCxlPXIubGVuZ3RoLTEsdD0wLG49cltlXTt0PD1lO249cywrK3Qpcz1yW3RdLChhPUh0KG5bMV0sc1swXSkpPm8mJihvPWEsb3Q9c1swXSx1dD1uWzFdKX1yZXR1cm4gb249JGU9bnVsbCxvdD09PTEvMHx8THQ9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbb3QsTHRdLFt1dCxxdF1dfXZhciBVaSxmcixkcixwcix5cixtcixncix4cix6YSxUYSxFYSxzaCxyaCxFdCxQdCxDdCxwZT17c3BoZXJlOlN0LHBvaW50OlBhLGxpbmVTdGFydDpvaCxsaW5lRW5kOmFoLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3BlLmxpbmVTdGFydD11cCxwZS5saW5lRW5kPWZwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7cGUubGluZVN0YXJ0PW9oLHBlLmxpbmVFbmQ9YWh9fTtmdW5jdGlvbiBQYShpLHQpe2kqPUgsdCo9SDt2YXIgZT1XKHQpO1ZpKGUqVyhpKSxlKnEoaSkscSh0KSl9ZnVuY3Rpb24gVmkoaSx0LGUpeysrVWksZHIrPShpLWRyKS9VaSxwcis9KHQtcHIpL1VpLHlyKz0oZS15cikvVWl9ZnVuY3Rpb24gb2goKXtwZS5wb2ludD1scH1mdW5jdGlvbiBscChpLHQpe2kqPUgsdCo9SDt2YXIgZT1XKHQpO0V0PWUqVyhpKSxQdD1lKnEoaSksQ3Q9cSh0KSxwZS5wb2ludD1ocCxWaShFdCxQdCxDdCl9ZnVuY3Rpb24gaHAoaSx0KXtpKj1ILHQqPUg7dmFyIGU9Vyh0KSxuPWUqVyhpKSxzPWUqcShpKSxyPXEodCksbz1yZShMZSgobz1QdCpyLUN0KnMpKm8rKG89Q3Qqbi1FdCpyKSpvKyhvPUV0KnMtUHQqbikqbyksRXQqbitQdCpzK0N0KnIpO2ZyKz1vLG1yKz1vKihFdCsoRXQ9bikpLGdyKz1vKihQdCsoUHQ9cykpLHhyKz1vKihDdCsoQ3Q9cikpLFZpKEV0LFB0LEN0KX1mdW5jdGlvbiBhaCgpe3BlLnBvaW50PVBhfWZ1bmN0aW9uIHVwKCl7cGUucG9pbnQ9ZHB9ZnVuY3Rpb24gZnAoKXtjaChzaCxyaCkscGUucG9pbnQ9UGF9ZnVuY3Rpb24gZHAoaSx0KXtzaD1pLHJoPXQsaSo9SCx0Kj1ILHBlLnBvaW50PWNoO3ZhciBlPVcodCk7RXQ9ZSpXKGkpLFB0PWUqcShpKSxDdD1xKHQpLFZpKEV0LFB0LEN0KX1mdW5jdGlvbiBjaChpLHQpe2kqPUgsdCo9SDt2YXIgZT1XKHQpLG49ZSpXKGkpLHM9ZSpxKGkpLHI9cSh0KSxvPVB0KnItQ3QqcyxhPUN0Km4tRXQqcixjPUV0KnMtUHQqbixsPXdhKG8sYSxjKSxoPU9lKGwpLHU9bCYmLWgvbDt6YS5hZGQodSpvKSxUYS5hZGQodSphKSxFYS5hZGQodSpjKSxmcis9aCxtcis9aCooRXQrKEV0PW4pKSxncis9aCooUHQrKFB0PXMpKSx4cis9aCooQ3QrKEN0PXIpKSxWaShFdCxQdCxDdCl9ZnVuY3Rpb24gbGgoaSl7VWk9ZnI9ZHI9cHI9eXI9bXI9Z3I9eHI9MCx6YT1uZXcgUmUsVGE9bmV3IFJlLEVhPW5ldyBSZSxvcihpLHBlKTt2YXIgdD0remEsZT0rVGEsbj0rRWEscz13YSh0LGUsbik7cmV0dXJuIHM8aXImJih0PW1yLGU9Z3Isbj14cixmcjxLJiYodD1kcixlPXByLG49eXIpLHM9d2EodCxlLG4pLHM8aXIpP1tOYU4sTmFOXTpbcmUoZSx0KSpodCxPZShuL3MpKmh0XX1mdW5jdGlvbiBDYShpLHQpe2Z1bmN0aW9uIGUobixzKXtyZXR1cm4gbj1pKG4scyksdChuWzBdLG5bMV0pfXJldHVybiBpLmludmVydCYmdC5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihuLHMpe3JldHVybiBuPXQuaW52ZXJ0KG4scyksbiYmaS5pbnZlcnQoblswXSxuWzFdKX0pLGV9ZnVuY3Rpb24gQmEoaSx0KXtyZXR1cm4gdHQoaSk+WCYmKGktPU1hdGgucm91bmQoaS9SdCkqUnQpLFtpLHRdfUJhLmludmVydD1CYTtmdW5jdGlvbiBoaChpLHQsZSl7cmV0dXJuKGklPVJ0KT90fHxlP0NhKGZoKGkpLGRoKHQsZSkpOmZoKGkpOnR8fGU/ZGgodCxlKTpCYX1mdW5jdGlvbiB1aChpKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdCs9aSx0dCh0KT5YJiYodC09TWF0aC5yb3VuZCh0L1J0KSpSdCksW3QsZV19fWZ1bmN0aW9uIGZoKGkpe3ZhciB0PXVoKGkpO3JldHVybiB0LmludmVydD11aCgtaSksdH1mdW5jdGlvbiBkaChpLHQpe3ZhciBlPVcoaSksbj1xKGkpLHM9Vyh0KSxyPXEodCk7ZnVuY3Rpb24gbyhhLGMpe3ZhciBsPVcoYyksaD1XKGEpKmwsdT1xKGEpKmwsZj1xKGMpLGQ9ZiplK2gqbjtyZXR1cm5bcmUodSpzLWQqcixoKmUtZipuKSxPZShkKnMrdSpyKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKGEsYyl7dmFyIGw9VyhjKSxoPVcoYSkqbCx1PXEoYSkqbCxmPXEoYyksZD1mKnMtdSpyO3JldHVybltyZSh1KnMrZipyLGgqZStkKm4pLE9lKGQqZS1oKm4pXX0sb31mdW5jdGlvbiBwaChpKXtpPWhoKGlbMF0qSCxpWzFdKkgsaS5sZW5ndGg+Mj9pWzJdKkg6MCk7ZnVuY3Rpb24gdChlKXtyZXR1cm4gZT1pKGVbMF0qSCxlWzFdKkgpLGVbMF0qPWh0LGVbMV0qPWh0LGV9cmV0dXJuIHQuaW52ZXJ0PWZ1bmN0aW9uKGUpe3JldHVybiBlPWkuaW52ZXJ0KGVbMF0qSCxlWzFdKkgpLGVbMF0qPWh0LGVbMV0qPWh0LGV9LHR9ZnVuY3Rpb24gcHAoaSx0LGUsbixzLHIpe2lmKGUpe3ZhciBvPVcodCksYT1xKHQpLGM9biplO3M9PW51bGw/KHM9dCtuKlJ0LHI9dC1jLzIpOihzPXloKG8scykscj15aChvLHIpLChuPjA/czxyOnM+cikmJihzKz1uKlJ0KSk7Zm9yKHZhciBsLGg9cztuPjA/aD5yOmg8cjtoLT1jKWw9Y3IoW28sLWEqVyhoKSwtYSpxKGgpXSksaS5wb2ludChsWzBdLGxbMV0pfX1mdW5jdGlvbiB5aChpLHQpe3Q9QW4odCksdFswXS09aSx1cih0KTt2YXIgZT1ucCgtdFsxXSk7cmV0dXJuKCgtdFsyXTwwPy1lOmUpK1J0LUspJVJ0fWZ1bmN0aW9uIG1oKCl7dmFyIGk9W10sdDtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24oZSxuLHMpe3QucHVzaChbZSxuLHNdKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7aS5wdXNoKHQ9W10pfSxsaW5lRW5kOlN0LHJlam9pbjpmdW5jdGlvbigpe2kubGVuZ3RoPjEmJmkucHVzaChpLnBvcCgpLmNvbmNhdChpLnNoaWZ0KCkpKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIGU9aTtyZXR1cm4gaT1bXSx0PW51bGwsZX19fWZ1bmN0aW9uIHdyKGksdCl7cmV0dXJuIHR0KGlbMF0tdFswXSk8SyYmdHQoaVsxXS10WzFdKTxLfWZ1bmN0aW9uIGJyKGksdCxlLG4pe3RoaXMueD1pLHRoaXMuej10LHRoaXMubz1lLHRoaXMuZT1uLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gZ2goaSx0LGUsbixzKXt2YXIgcj1bXSxvPVtdLGEsYztpZihpLmZvckVhY2goZnVuY3Rpb24ocCl7aWYoISgoeT1wLmxlbmd0aC0xKTw9MCkpe3ZhciB5LG09cFswXSxnPXBbeV0sYjtpZih3cihtLGcpKXtpZighbVsyXSYmIWdbMl0pe2ZvcihzLmxpbmVTdGFydCgpLGE9MDthPHk7KythKXMucG9pbnQoKG09cFthXSlbMF0sbVsxXSk7cy5saW5lRW5kKCk7cmV0dXJufWdbMF0rPTIqS31yLnB1c2goYj1uZXcgYnIobSxwLG51bGwsITApKSxvLnB1c2goYi5vPW5ldyBicihtLG51bGwsYiwhMSkpLHIucHVzaChiPW5ldyBicihnLHAsbnVsbCwhMSkpLG8ucHVzaChiLm89bmV3IGJyKGcsbnVsbCxiLCEwKSl9fSksISFyLmxlbmd0aCl7Zm9yKG8uc29ydCh0KSx4aChyKSx4aChvKSxhPTAsYz1vLmxlbmd0aDthPGM7KythKW9bYV0uZT1lPSFlO2Zvcih2YXIgbD1yWzBdLGgsdTs7KXtmb3IodmFyIGY9bCxkPSEwO2YudjspaWYoKGY9Zi5uKT09PWwpcmV0dXJuO2g9Zi56LHMubGluZVN0YXJ0KCk7ZG97aWYoZi52PWYuby52PSEwLGYuZSl7aWYoZClmb3IoYT0wLGM9aC5sZW5ndGg7YTxjOysrYSlzLnBvaW50KCh1PWhbYV0pWzBdLHVbMV0pO2Vsc2UgbihmLngsZi5uLngsMSxzKTtmPWYubn1lbHNle2lmKGQpZm9yKGg9Zi5wLnosYT1oLmxlbmd0aC0xO2E+PTA7LS1hKXMucG9pbnQoKHU9aFthXSlbMF0sdVsxXSk7ZWxzZSBuKGYueCxmLnAueCwtMSxzKTtmPWYucH1mPWYubyxoPWYueixkPSFkfXdoaWxlKCFmLnYpO3MubGluZUVuZCgpfX19ZnVuY3Rpb24geGgoaSl7aWYodD1pLmxlbmd0aCl7Zm9yKHZhciB0LGU9MCxuPWlbMF0sczsrK2U8dDspbi5uPXM9aVtlXSxzLnA9bixuPXM7bi5uPXM9aVswXSxzLnA9bn19ZnVuY3Rpb24gRmEoaSl7cmV0dXJuIHR0KGlbMF0pPD1YP2lbMF06dHAoaVswXSkqKCh0dChpWzBdKStYKSVSdC1YKX1mdW5jdGlvbiB3aChpLHQpe3ZhciBlPUZhKHQpLG49dFsxXSxzPXEobikscj1bcShlKSwtVyhlKSwwXSxvPTAsYT0wLGM9bmV3IFJlO3M9PT0xP249TnQrSzpzPT09LTEmJihuPS1OdC1LKTtmb3IodmFyIGw9MCxoPWkubGVuZ3RoO2w8aDsrK2wpaWYoZj0odT1pW2xdKS5sZW5ndGgpZm9yKHZhciB1LGYsZD11W2YtMV0scD1GYShkKSx5PWRbMV0vMitzcixtPXEoeSksZz1XKHkpLGI9MDtiPGY7KytiLHA9eCxtPUEsZz1fLGQ9dyl7dmFyIHc9dVtiXSx4PUZhKHcpLE09d1sxXS8yK3NyLEE9cShNKSxfPVcoTSksUz14LXAsRT1TPj0wPzE6LTEsej1FKlMsdj16PlgsQz1tKkE7aWYoYy5hZGQocmUoQypFKnEoeiksZypfK0MqVyh6KSkpLG8rPXY/UytFKlJ0OlMsdl5wPj1lXng+PWUpe3ZhciBQPWVpKEFuKGQpLEFuKHcpKTt1cihQKTt2YXIgRj1laShyLFApO3VyKEYpO3ZhciBCPSh2XlM+PTA/LTE6MSkqT2UoRlsyXSk7KG4+Qnx8bj09PUImJihQWzBdfHxQWzFdKSkmJihhKz12XlM+PTA/MTotMSl9fXJldHVybihvPC1LfHxvPEsmJmM8LWlyKV5hJjF9ZnVuY3Rpb24gYmgoaSx0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHMpe3ZhciByPXQocyksbz1taCgpLGE9dChvKSxjPSExLGwsaCx1LGY9e3BvaW50OmQsbGluZVN0YXJ0OnksbGluZUVuZDptLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2YucG9pbnQ9ZyxmLmxpbmVTdGFydD1iLGYubGluZUVuZD13LGg9W10sbD1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2YucG9pbnQ9ZCxmLmxpbmVTdGFydD15LGYubGluZUVuZD1tLGg9RGkoaCk7dmFyIHg9d2gobCxuKTtoLmxlbmd0aD8oY3x8KHMucG9seWdvblN0YXJ0KCksYz0hMCksZ2goaCxtcCx4LGUscykpOngmJihjfHwocy5wb2x5Z29uU3RhcnQoKSxjPSEwKSxzLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEscykscy5saW5lRW5kKCkpLGMmJihzLnBvbHlnb25FbmQoKSxjPSExKSxoPWw9bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7cy5wb2x5Z29uU3RhcnQoKSxzLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEscykscy5saW5lRW5kKCkscy5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKHgsTSl7aSh4LE0pJiZzLnBvaW50KHgsTSl9ZnVuY3Rpb24gcCh4LE0pe3IucG9pbnQoeCxNKX1mdW5jdGlvbiB5KCl7Zi5wb2ludD1wLHIubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbSgpe2YucG9pbnQ9ZCxyLmxpbmVFbmQoKX1mdW5jdGlvbiBnKHgsTSl7dS5wdXNoKFt4LE1dKSxhLnBvaW50KHgsTSl9ZnVuY3Rpb24gYigpe2EubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiB3KCl7Zyh1WzBdWzBdLHVbMF1bMV0pLGEubGluZUVuZCgpO3ZhciB4PWEuY2xlYW4oKSxNPW8ucmVzdWx0KCksQSxfPU0ubGVuZ3RoLFMsRSx6O2lmKHUucG9wKCksbC5wdXNoKHUpLHU9bnVsbCwhIV8pe2lmKHgmMSl7aWYoRT1NWzBdLChTPUUubGVuZ3RoLTEpPjApe2ZvcihjfHwocy5wb2x5Z29uU3RhcnQoKSxjPSEwKSxzLmxpbmVTdGFydCgpLEE9MDtBPFM7KytBKXMucG9pbnQoKHo9RVtBXSlbMF0selsxXSk7cy5saW5lRW5kKCl9cmV0dXJufV8+MSYmeCYyJiZNLnB1c2goTS5wb3AoKS5jb25jYXQoTS5zaGlmdCgpKSksaC5wdXNoKE0uZmlsdGVyKHlwKSl9fXJldHVybiBmfX1mdW5jdGlvbiB5cChpKXtyZXR1cm4gaS5sZW5ndGg+MX1mdW5jdGlvbiBtcChpLHQpe3JldHVybigoaT1pLngpWzBdPDA/aVsxXS1OdC1LOk50LWlbMV0pLSgodD10LngpWzBdPDA/dFsxXS1OdC1LOk50LXRbMV0pfXZhciBNaD1iaChmdW5jdGlvbigpe3JldHVybiEwfSxncCx3cCxbLVgsLU50XSk7ZnVuY3Rpb24gZ3AoaSl7dmFyIHQ9TmFOLGU9TmFOLG49TmFOLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2kubGluZVN0YXJ0KCkscz0xfSxwb2ludDpmdW5jdGlvbihyLG8pe3ZhciBhPXI+MD9YOi1YLGM9dHQoci10KTt0dChjLVgpPEs/KGkucG9pbnQodCxlPShlK28pLzI+MD9OdDotTnQpLGkucG9pbnQobixlKSxpLmxpbmVFbmQoKSxpLmxpbmVTdGFydCgpLGkucG9pbnQoYSxlKSxpLnBvaW50KHIsZSkscz0wKTpuIT09YSYmYz49WCYmKHR0KHQtbik8SyYmKHQtPW4qSyksdHQoci1hKTxLJiYoci09YSpLKSxlPXhwKHQsZSxyLG8pLGkucG9pbnQobixlKSxpLmxpbmVFbmQoKSxpLmxpbmVTdGFydCgpLGkucG9pbnQoYSxlKSxzPTApLGkucG9pbnQodD1yLGU9byksbj1hfSxsaW5lRW5kOmZ1bmN0aW9uKCl7aS5saW5lRW5kKCksdD1lPU5hTn0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi1zfX19ZnVuY3Rpb24geHAoaSx0LGUsbil7dmFyIHMscixvPXEoaS1lKTtyZXR1cm4gdHQobyk+Sz94YSgocSh0KSoocj1XKG4pKSpxKGUpLXEobikqKHM9Vyh0KSkqcShpKSkvKHMqcipvKSk6KHQrbikvMn1mdW5jdGlvbiB3cChpLHQsZSxuKXt2YXIgcztpZihpPT1udWxsKXM9ZSpOdCxuLnBvaW50KC1YLHMpLG4ucG9pbnQoMCxzKSxuLnBvaW50KFgscyksbi5wb2ludChYLDApLG4ucG9pbnQoWCwtcyksbi5wb2ludCgwLC1zKSxuLnBvaW50KC1YLC1zKSxuLnBvaW50KC1YLDApLG4ucG9pbnQoLVgscyk7ZWxzZSBpZih0dChpWzBdLXRbMF0pPkspe3ZhciByPWlbMF08dFswXT9YOi1YO3M9ZSpyLzIsbi5wb2ludCgtcixzKSxuLnBvaW50KDAscyksbi5wb2ludChyLHMpfWVsc2Ugbi5wb2ludCh0WzBdLHRbMV0pfWZ1bmN0aW9uIGJwKGkpe3ZhciB0PVcoaSksZT0yKkgsbj10PjAscz10dCh0KT5LO2Z1bmN0aW9uIHIoaCx1LGYsZCl7cHAoZCxpLGUsZixoLHUpfWZ1bmN0aW9uIG8oaCx1KXtyZXR1cm4gVyhoKSpXKHUpPnR9ZnVuY3Rpb24gYShoKXt2YXIgdSxmLGQscCx5O3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtwPWQ9ITEseT0xfSxwb2ludDpmdW5jdGlvbihtLGcpe3ZhciBiPVttLGddLHcseD1vKG0sZyksTT1uP3g/MDpsKG0sZyk6eD9sKG0rKG08MD9YOi1YKSxnKTowO2lmKCF1JiYocD1kPXgpJiZoLmxpbmVTdGFydCgpLHghPT1kJiYodz1jKHUsYiksKCF3fHx3cih1LHcpfHx3cihiLHcpKSYmKGJbMl09MSkpLHghPT1kKXk9MCx4PyhoLmxpbmVTdGFydCgpLHc9YyhiLHUpLGgucG9pbnQod1swXSx3WzFdKSk6KHc9Yyh1LGIpLGgucG9pbnQod1swXSx3WzFdLDIpLGgubGluZUVuZCgpKSx1PXc7ZWxzZSBpZihzJiZ1JiZuXngpe3ZhciBBOyEoTSZmKSYmKEE9YyhiLHUsITApKSYmKHk9MCxuPyhoLmxpbmVTdGFydCgpLGgucG9pbnQoQVswXVswXSxBWzBdWzFdKSxoLnBvaW50KEFbMV1bMF0sQVsxXVsxXSksaC5saW5lRW5kKCkpOihoLnBvaW50KEFbMV1bMF0sQVsxXVsxXSksaC5saW5lRW5kKCksaC5saW5lU3RhcnQoKSxoLnBvaW50KEFbMF1bMF0sQVswXVsxXSwzKSkpfXgmJighdXx8IXdyKHUsYikpJiZoLnBvaW50KGJbMF0sYlsxXSksdT1iLGQ9eCxmPU19LGxpbmVFbmQ6ZnVuY3Rpb24oKXtkJiZoLmxpbmVFbmQoKSx1PW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIHl8KHAmJmQpPDwxfX19ZnVuY3Rpb24gYyhoLHUsZil7dmFyIGQ9QW4oaCkscD1Bbih1KSx5PVsxLDAsMF0sbT1laShkLHApLGc9bHIobSxtKSxiPW1bMF0sdz1nLWIqYjtpZighdylyZXR1cm4hZiYmaDt2YXIgeD10KmcvdyxNPS10KmIvdyxBPWVpKHksbSksXz1ocih5LHgpLFM9aHIobSxNKTtTYShfLFMpO3ZhciBFPUEsej1scihfLEUpLHY9bHIoRSxFKSxDPXoqei12KihscihfLF8pLTEpO2lmKCEoQzwwKSl7dmFyIFA9TGUoQyksRj1ocihFLCgtei1QKS92KTtpZihTYShGLF8pLEY9Y3IoRiksIWYpcmV0dXJuIEY7dmFyIEI9aFswXSxJPXVbMF0saz1oWzFdLEQ9dVsxXSxWO0k8QiYmKFY9QixCPUksST1WKTt2YXIgaj1JLUIsZHQ9dHQoai1YKTxLLER0PWR0fHxqPEs7aWYoIWR0JiZEPGsmJihWPWssaz1ELEQ9ViksRHQ/ZHQ/aytEPjBeRlsxXTwodHQoRlswXS1CKTxLP2s6RCk6azw9RlsxXSYmRlsxXTw9RDpqPlheKEI8PUZbMF0mJkZbMF08PUkpKXt2YXIgR3Q9aHIoRSwoLXorUCkvdik7cmV0dXJuIFNhKEd0LF8pLFtGLGNyKEd0KV19fX1mdW5jdGlvbiBsKGgsdSl7dmFyIGY9bj9pOlgtaSxkPTA7cmV0dXJuIGg8LWY/ZHw9MTpoPmYmJihkfD0yKSx1PC1mP2R8PTQ6dT5mJiYoZHw9OCksZH1yZXR1cm4gYmgobyxhLHIsbj9bMCwtaV06Wy1YLGktWF0pfWZ1bmN0aW9uIE1wKGksdCxlLG4scyxyKXt2YXIgbz1pWzBdLGE9aVsxXSxjPXRbMF0sbD10WzFdLGg9MCx1PTEsZj1jLW8sZD1sLWEscDtpZihwPWUtbywhKCFmJiZwPjApKXtpZihwLz1mLGY8MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfWVsc2UgaWYoZj4wKXtpZihwPnUpcmV0dXJuO3A+aCYmKGg9cCl9aWYocD1zLW8sISghZiYmcDwwKSl7aWYocC89ZixmPDApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1lbHNlIGlmKGY+MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfWlmKHA9bi1hLCEoIWQmJnA+MCkpe2lmKHAvPWQsZDwwKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9ZWxzZSBpZihkPjApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1pZihwPXItYSwhKCFkJiZwPDApKXtpZihwLz1kLGQ8MCl7aWYocD51KXJldHVybjtwPmgmJihoPXApfWVsc2UgaWYoZD4wKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9cmV0dXJuIGg+MCYmKGlbMF09bytoKmYsaVsxXT1hK2gqZCksdTwxJiYodFswXT1vK3UqZix0WzFdPWErdSpkKSwhMH19fX19dmFyIHFpPTFlOSxNcj0tcWk7ZnVuY3Rpb24gQXAoaSx0LGUsbil7ZnVuY3Rpb24gcyhsLGgpe3JldHVybiBpPD1sJiZsPD1lJiZ0PD1oJiZoPD1ufWZ1bmN0aW9uIHIobCxoLHUsZil7dmFyIGQ9MCxwPTA7aWYobD09bnVsbHx8KGQ9byhsLHUpKSE9PShwPW8oaCx1KSl8fGMobCxoKTwwXnU+MClkbyBmLnBvaW50KGQ9PT0wfHxkPT09Mz9pOmUsZD4xP246dCk7d2hpbGUoKGQ9KGQrdSs0KSU0KSE9PXApO2Vsc2UgZi5wb2ludChoWzBdLGhbMV0pfWZ1bmN0aW9uIG8obCxoKXtyZXR1cm4gdHQobFswXS1pKTxLP2g+MD8wOjM6dHQobFswXS1lKTxLP2g+MD8yOjE6dHQobFsxXS10KTxLP2g+MD8xOjA6aD4wPzM6Mn1mdW5jdGlvbiBhKGwsaCl7cmV0dXJuIGMobC54LGgueCl9ZnVuY3Rpb24gYyhsLGgpe3ZhciB1PW8obCwxKSxmPW8oaCwxKTtyZXR1cm4gdSE9PWY/dS1mOnU9PT0wP2hbMV0tbFsxXTp1PT09MT9sWzBdLWhbMF06dT09PTI/bFsxXS1oWzFdOmhbMF0tbFswXX1yZXR1cm4gZnVuY3Rpb24obCl7dmFyIGg9bCx1PW1oKCksZixkLHAseSxtLGcsYix3LHgsTSxBLF89e3BvaW50OlMsbGluZVN0YXJ0OkMsbGluZUVuZDpQLHBvbHlnb25TdGFydDp6LHBvbHlnb25FbmQ6dn07ZnVuY3Rpb24gUyhCLEkpe3MoQixJKSYmaC5wb2ludChCLEkpfWZ1bmN0aW9uIEUoKXtmb3IodmFyIEI9MCxJPTAsaz1kLmxlbmd0aDtJPGs7KytJKWZvcih2YXIgRD1kW0ldLFY9MSxqPUQubGVuZ3RoLGR0PURbMF0sRHQsR3QsWnQ9ZHRbMF0sbWU9ZHRbMV07VjxqOysrVilEdD1adCxHdD1tZSxkdD1EW1ZdLFp0PWR0WzBdLG1lPWR0WzFdLEd0PD1uP21lPm4mJihadC1EdCkqKG4tR3QpPihtZS1HdCkqKGktRHQpJiYrK0I6bWU8PW4mJihadC1EdCkqKG4tR3QpPChtZS1HdCkqKGktRHQpJiYtLUI7cmV0dXJuIEJ9ZnVuY3Rpb24geigpe2g9dSxmPVtdLGQ9W10sQT0hMH1mdW5jdGlvbiB2KCl7dmFyIEI9RSgpLEk9QSYmQixrPShmPURpKGYpKS5sZW5ndGg7KEl8fGspJiYobC5wb2x5Z29uU3RhcnQoKSxJJiYobC5saW5lU3RhcnQoKSxyKG51bGwsbnVsbCwxLGwpLGwubGluZUVuZCgpKSxrJiZnaChmLGEsQixyLGwpLGwucG9seWdvbkVuZCgpKSxoPWwsZj1kPXA9bnVsbH1mdW5jdGlvbiBDKCl7Xy5wb2ludD1GLGQmJmQucHVzaChwPVtdKSxNPSEwLHg9ITEsYj13PU5hTn1mdW5jdGlvbiBQKCl7ZiYmKEYoeSxtKSxnJiZ4JiZ1LnJlam9pbigpLGYucHVzaCh1LnJlc3VsdCgpKSksXy5wb2ludD1TLHgmJmgubGluZUVuZCgpfWZ1bmN0aW9uIEYoQixJKXt2YXIgaz1zKEIsSSk7aWYoZCYmcC5wdXNoKFtCLEldKSxNKXk9QixtPUksZz1rLE09ITEsayYmKGgubGluZVN0YXJ0KCksaC5wb2ludChCLEkpKTtlbHNlIGlmKGsmJngpaC5wb2ludChCLEkpO2Vsc2V7dmFyIEQ9W2I9TWF0aC5tYXgoTXIsTWF0aC5taW4ocWksYikpLHc9TWF0aC5tYXgoTXIsTWF0aC5taW4ocWksdykpXSxWPVtCPU1hdGgubWF4KE1yLE1hdGgubWluKHFpLEIpKSxJPU1hdGgubWF4KE1yLE1hdGgubWluKHFpLEkpKV07TXAoRCxWLGksdCxlLG4pPyh4fHwoaC5saW5lU3RhcnQoKSxoLnBvaW50KERbMF0sRFsxXSkpLGgucG9pbnQoVlswXSxWWzFdKSxrfHxoLmxpbmVFbmQoKSxBPSExKTprJiYoaC5saW5lU3RhcnQoKSxoLnBvaW50KEIsSSksQT0hMSl9Yj1CLHc9SSx4PWt9cmV0dXJuIF99fXZhciBJYSxrYSxBcixfcixpaT17c3BoZXJlOlN0LHBvaW50OlN0LGxpbmVTdGFydDpfcCxsaW5lRW5kOlN0LHBvbHlnb25TdGFydDpTdCxwb2x5Z29uRW5kOlN0fTtmdW5jdGlvbiBfcCgpe2lpLnBvaW50PXZwLGlpLmxpbmVFbmQ9U3B9ZnVuY3Rpb24gU3AoKXtpaS5wb2ludD1paS5saW5lRW5kPVN0fWZ1bmN0aW9uIHZwKGksdCl7aSo9SCx0Kj1ILGthPWksQXI9cSh0KSxfcj1XKHQpLGlpLnBvaW50PXpwfWZ1bmN0aW9uIHpwKGksdCl7aSo9SCx0Kj1IO3ZhciBlPXEodCksbj1XKHQpLHM9dHQoaS1rYSkscj1XKHMpLG89cShzKSxhPW4qbyxjPV9yKmUtQXIqbipyLGw9QXIqZStfcipuKnI7SWEuYWRkKHJlKExlKGEqYStjKmMpLGwpKSxrYT1pLEFyPWUsX3I9bn1mdW5jdGlvbiBUcChpKXtyZXR1cm4gSWE9bmV3IFJlLG9yKGksaWkpLCtJYX12YXIgTmE9W251bGwsbnVsbF0sRXA9e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOk5hfTtmdW5jdGlvbiBzaShpLHQpe3JldHVybiBOYVswXT1pLE5hWzFdPXQsVHAoRXApfXZhciBBaD17RmVhdHVyZTpmdW5jdGlvbihpLHQpe3JldHVybiBTcihpLmdlb21ldHJ5LHQpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmZlYXR1cmVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoU3IoZVtuXS5nZW9tZXRyeSx0KSlyZXR1cm4hMDtyZXR1cm4hMX19LF9oPXtTcGhlcmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUG9pbnQ6ZnVuY3Rpb24oaSx0KXtyZXR1cm4gU2goaS5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2ludDpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoU2goZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX0sTGluZVN0cmluZzpmdW5jdGlvbihpLHQpe3JldHVybiB2aChpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWlmKHZoKGVbbl0sdCkpcmV0dXJuITA7cmV0dXJuITF9LFBvbHlnb246ZnVuY3Rpb24oaSx0KXtyZXR1cm4gemgoaS5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpZih6aChlW25dLHQpKXJldHVybiEwO3JldHVybiExfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5nZW9tZXRyaWVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYoU3IoZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX19O2Z1bmN0aW9uIFNyKGksdCl7cmV0dXJuIGkmJl9oLmhhc093blByb3BlcnR5KGkudHlwZSk/X2hbaS50eXBlXShpLHQpOiExfWZ1bmN0aW9uIFNoKGksdCl7cmV0dXJuIHNpKGksdCk9PT0wfWZ1bmN0aW9uIHZoKGksdCl7Zm9yKHZhciBlLG4scyxyPTAsbz1pLmxlbmd0aDtyPG87cisrKXtpZihuPXNpKGlbcl0sdCksbj09PTB8fHI+MCYmKHM9c2koaVtyXSxpW3ItMV0pLHM+MCYmZTw9cyYmbjw9cyYmKGUrbi1zKSooMS1NYXRoLnBvdygoZS1uKS9zLDIpKTxpcipzKSlyZXR1cm4hMDtlPW59cmV0dXJuITF9ZnVuY3Rpb24gemgoaSx0KXtyZXR1cm4hIXdoKGkubWFwKFBwKSxUaCh0KSl9ZnVuY3Rpb24gUHAoaSl7cmV0dXJuIGk9aS5tYXAoVGgpLGkucG9wKCksaX1mdW5jdGlvbiBUaChpKXtyZXR1cm5baVswXSpILGlbMV0qSF19ZnVuY3Rpb24gQ3AoaSx0KXtyZXR1cm4oaSYmQWguaGFzT3duUHJvcGVydHkoaS50eXBlKT9BaFtpLnR5cGVdOlNyKShpLHQpfWZ1bmN0aW9uIEJwKGksdCl7dmFyIGU9aVswXSpILG49aVsxXSpILHM9dFswXSpILHI9dFsxXSpILG89VyhuKSxhPXEobiksYz1XKHIpLGw9cShyKSxoPW8qVyhlKSx1PW8qcShlKSxmPWMqVyhzKSxkPWMqcShzKSxwPTIqT2UoTGUoVmwoci1uKStvKmMqVmwocy1lKSkpLHk9cShwKSxtPXA/ZnVuY3Rpb24oZyl7dmFyIGI9cShnKj1wKS95LHc9cShwLWcpL3kseD13KmgrYipmLE09dyp1K2IqZCxBPXcqYStiKmw7cmV0dXJuW3JlKE0seCkqaHQscmUoQSxMZSh4KngrTSpNKSkqaHRdfTpmdW5jdGlvbigpe3JldHVybltlKmh0LG4qaHRdfTtyZXR1cm4gbS5kaXN0YW5jZT1wLG19dmFyIEVoPWk9Pmkscmk9MS8wLHZyPXJpLEhpPS1yaSx6cj1IaSxQaD17cG9pbnQ6RnAsbGluZVN0YXJ0OlN0LGxpbmVFbmQ6U3QscG9seWdvblN0YXJ0OlN0LHBvbHlnb25FbmQ6U3QscmVzdWx0OmZ1bmN0aW9uKCl7dmFyIGk9W1tyaSx2cl0sW0hpLHpyXV07cmV0dXJuIEhpPXpyPS0odnI9cmk9MS8wKSxpfX07ZnVuY3Rpb24gRnAoaSx0KXtpPHJpJiYocmk9aSksaT5IaSYmKEhpPWkpLHQ8dnImJih2cj10KSx0PnpyJiYoenI9dCl9ZnVuY3Rpb24gUmEoaSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBMYTtmb3IodmFyIG4gaW4gaSllW25dPWlbbl07cmV0dXJuIGUuc3RyZWFtPXQsZX19ZnVuY3Rpb24gTGEoKXt9TGEucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpMYSxwb2ludDpmdW5jdGlvbihpLHQpe3RoaXMuc3RyZWFtLnBvaW50KGksdCl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBPYShpLHQsZSl7dmFyIG49aS5jbGlwRXh0ZW50JiZpLmNsaXBFeHRlbnQoKTtyZXR1cm4gaS5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbiE9bnVsbCYmaS5jbGlwRXh0ZW50KG51bGwpLG9yKGUsaS5zdHJlYW0oUGgpKSx0KFBoLnJlc3VsdCgpKSxuIT1udWxsJiZpLmNsaXBFeHRlbnQobiksaX1mdW5jdGlvbiBDaChpLHQsZSl7cmV0dXJuIE9hKGksZnVuY3Rpb24obil7dmFyIHM9dFsxXVswXS10WzBdWzBdLHI9dFsxXVsxXS10WzBdWzFdLG89TWF0aC5taW4ocy8oblsxXVswXS1uWzBdWzBdKSxyLyhuWzFdWzFdLW5bMF1bMV0pKSxhPSt0WzBdWzBdKyhzLW8qKG5bMV1bMF0rblswXVswXSkpLzIsYz0rdFswXVsxXSsoci1vKihuWzFdWzFdK25bMF1bMV0pKS8yO2kuc2NhbGUoMTUwKm8pLnRyYW5zbGF0ZShbYSxjXSl9LGUpfWZ1bmN0aW9uIElwKGksdCxlKXtyZXR1cm4gQ2goaSxbWzAsMF0sdF0sZSl9ZnVuY3Rpb24ga3AoaSx0LGUpe3JldHVybiBPYShpLGZ1bmN0aW9uKG4pe3ZhciBzPSt0LHI9cy8oblsxXVswXS1uWzBdWzBdKSxvPShzLXIqKG5bMV1bMF0rblswXVswXSkpLzIsYT0tcipuWzBdWzFdO2kuc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfWZ1bmN0aW9uIE5wKGksdCxlKXtyZXR1cm4gT2EoaSxmdW5jdGlvbihuKXt2YXIgcz0rdCxyPXMvKG5bMV1bMV0tblswXVsxXSksbz0tcipuWzBdWzBdLGE9KHMtciooblsxXVsxXStuWzBdWzFdKSkvMjtpLnNjYWxlKDE1MCpyKS50cmFuc2xhdGUoW28sYV0pfSxlKX12YXIgQmg9MTYsUnA9VygzMCpIKTtmdW5jdGlvbiBGaChpLHQpe3JldHVybit0P09wKGksdCk6THAoaSl9ZnVuY3Rpb24gTHAoaSl7cmV0dXJuIFJhKHtwb2ludDpmdW5jdGlvbih0LGUpe3Q9aSh0LGUpLHRoaXMuc3RyZWFtLnBvaW50KHRbMF0sdFsxXSl9fSl9ZnVuY3Rpb24gT3AoaSx0KXtmdW5jdGlvbiBlKG4scyxyLG8sYSxjLGwsaCx1LGYsZCxwLHksbSl7dmFyIGc9bC1uLGI9aC1zLHc9ZypnK2IqYjtpZih3PjQqdCYmeS0tKXt2YXIgeD1vK2YsTT1hK2QsQT1jK3AsXz1MZSh4KngrTSpNK0EqQSksUz1PZShBLz1fKSxFPXR0KHR0KEEpLTEpPEt8fHR0KHItdSk8Sz8ocit1KS8yOnJlKE0seCksej1pKEUsUyksdj16WzBdLEM9elsxXSxQPXYtbixGPUMtcyxCPWIqUC1nKkY7KEIqQi93PnR8fHR0KChnKlArYipGKS93LS41KT4uM3x8bypmK2EqZCtjKnA8UnApJiYoZShuLHMscixvLGEsYyx2LEMsRSx4Lz1fLE0vPV8sQSx5LG0pLG0ucG9pbnQodixDKSxlKHYsQyxFLHgsTSxBLGwsaCx1LGYsZCxwLHksbSkpfX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIHMscixvLGEsYyxsLGgsdSxmLGQscCx5LG09e3BvaW50OmcsbGluZVN0YXJ0OmIsbGluZUVuZDp4LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksbS5saW5lU3RhcnQ9TX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLG0ubGluZVN0YXJ0PWJ9fTtmdW5jdGlvbiBnKFMsRSl7Uz1pKFMsRSksbi5wb2ludChTWzBdLFNbMV0pfWZ1bmN0aW9uIGIoKXt1PU5hTixtLnBvaW50PXcsbi5saW5lU3RhcnQoKX1mdW5jdGlvbiB3KFMsRSl7dmFyIHo9QW4oW1MsRV0pLHY9aShTLEUpO2UodSxmLGgsZCxwLHksdT12WzBdLGY9dlsxXSxoPVMsZD16WzBdLHA9elsxXSx5PXpbMl0sQmgsbiksbi5wb2ludCh1LGYpfWZ1bmN0aW9uIHgoKXttLnBvaW50PWcsbi5saW5lRW5kKCl9ZnVuY3Rpb24gTSgpe2IoKSxtLnBvaW50PUEsbS5saW5lRW5kPV99ZnVuY3Rpb24gQShTLEUpe3cocz1TLEUpLHI9dSxvPWYsYT1kLGM9cCxsPXksbS5wb2ludD13fWZ1bmN0aW9uIF8oKXtlKHUsZixoLGQscCx5LHIsbyxzLGEsYyxsLEJoLG4pLG0ubGluZUVuZD14LHgoKX1yZXR1cm4gbX19dmFyIERwPVJhKHtwb2ludDpmdW5jdGlvbihpLHQpe3RoaXMuc3RyZWFtLnBvaW50KGkqSCx0KkgpfX0pO2Z1bmN0aW9uICRwKGkpe3JldHVybiBSYSh7cG9pbnQ6ZnVuY3Rpb24odCxlKXt2YXIgbj1pKHQsZSk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9ZnVuY3Rpb24gVXAoaSx0LGUsbixzKXtmdW5jdGlvbiByKG8sYSl7cmV0dXJuIG8qPW4sYSo9cyxbdCtpKm8sZS1pKmFdfXJldHVybiByLmludmVydD1mdW5jdGlvbihvLGEpe3JldHVyblsoby10KS9pKm4sKGUtYSkvaSpzXX0scn1mdW5jdGlvbiBJaChpLHQsZSxuLHMscil7aWYoIXIpcmV0dXJuIFVwKGksdCxlLG4scyk7dmFyIG89VyhyKSxhPXEociksYz1vKmksbD1hKmksaD1vL2ksdT1hL2ksZj0oYSplLW8qdCkvaSxkPShhKnQrbyplKS9pO2Z1bmN0aW9uIHAoeSxtKXtyZXR1cm4geSo9bixtKj1zLFtjKnktbCptK3QsZS1sKnktYyptXX1yZXR1cm4gcC5pbnZlcnQ9ZnVuY3Rpb24oeSxtKXtyZXR1cm5bbiooaCp5LXUqbStmKSxzKihkLXUqeS1oKm0pXX0scH1mdW5jdGlvbiBUcihpKXtyZXR1cm4gVnAoZnVuY3Rpb24oKXtyZXR1cm4gaX0pKCl9ZnVuY3Rpb24gVnAoaSl7dmFyIHQsZT0xNTAsbj00ODAscz0yNTAscj0wLG89MCxhPTAsYz0wLGw9MCxoLHU9MCxmPTEsZD0xLHA9bnVsbCx5PU1oLG09bnVsbCxnLGIsdyx4PUVoLE09LjUsQSxfLFMsRSx6O2Z1bmN0aW9uIHYoQil7cmV0dXJuIFMoQlswXSpILEJbMV0qSCl9ZnVuY3Rpb24gQyhCKXtyZXR1cm4gQj1TLmludmVydChCWzBdLEJbMV0pLEImJltCWzBdKmh0LEJbMV0qaHRdfXYuc3RyZWFtPWZ1bmN0aW9uKEIpe3JldHVybiBFJiZ6PT09Qj9FOkU9RHAoJHAoaCkoeShBKHgoej1CKSkpKSl9LHYucHJlY2xpcD1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT1CLHA9dm9pZCAwLEYoKSk6eX0sdi5wb3N0Y2xpcD1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD1CLG09Zz1iPXc9bnVsbCxGKCkpOnh9LHYuY2xpcEFuZ2xlPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PStCP2JwKHA9QipIKToocD1udWxsLE1oKSxGKCkpOnAqaHR9LHYuY2xpcEV4dGVudD1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD1CPT1udWxsPyhtPWc9Yj13PW51bGwsRWgpOkFwKG09K0JbMF1bMF0sZz0rQlswXVsxXSxiPStCWzFdWzBdLHc9K0JbMV1bMV0pLEYoKSk6bT09bnVsbD9udWxsOltbbSxnXSxbYix3XV19LHYuc2NhbGU9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K0IsUCgpKTplfSx2LnRyYW5zbGF0ZT1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rQlswXSxzPStCWzFdLFAoKSk6W24sc119LHYuY2VudGVyPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUJbMF0lMzYwKkgsbz1CWzFdJTM2MCpILFAoKSk6W3IqaHQsbypodF19LHYucm90YXRlPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUJbMF0lMzYwKkgsYz1CWzFdJTM2MCpILGw9Qi5sZW5ndGg+Mj9CWzJdJTM2MCpIOjAsUCgpKTpbYSpodCxjKmh0LGwqaHRdfSx2LmFuZ2xlPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PUIlMzYwKkgsUCgpKTp1Kmh0fSx2LnJlZmxlY3RYPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPUI/LTE6MSxQKCkpOmY8MH0sdi5yZWZsZWN0WT1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1CPy0xOjEsUCgpKTpkPDB9LHYucHJlY2lzaW9uPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhBPUZoKF8sTT1CKkIpLEYoKSk6TGUoTSl9LHYuZml0RXh0ZW50PWZ1bmN0aW9uKEIsSSl7cmV0dXJuIENoKHYsQixJKX0sdi5maXRTaXplPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIElwKHYsQixJKX0sdi5maXRXaWR0aD1mdW5jdGlvbihCLEkpe3JldHVybiBrcCh2LEIsSSl9LHYuZml0SGVpZ2h0PWZ1bmN0aW9uKEIsSSl7cmV0dXJuIE5wKHYsQixJKX07ZnVuY3Rpb24gUCgpe3ZhciBCPUloKGUsMCwwLGYsZCx1KS5hcHBseShudWxsLHQocixvKSksST1JaChlLG4tQlswXSxzLUJbMV0sZixkLHUpO3JldHVybiBoPWhoKGEsYyxsKSxfPUNhKHQsSSksUz1DYShoLF8pLEE9RmgoXyxNKSxGKCl9ZnVuY3Rpb24gRigpe3JldHVybiBFPXo9bnVsbCx2fXJldHVybiBmdW5jdGlvbigpe3JldHVybiB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLHYuaW52ZXJ0PXQuaW52ZXJ0JiZDLFAoKX19ZnVuY3Rpb24gcXAoaSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG49TGUodCp0K2UqZSkscz1pKG4pLHI9cShzKSxvPVcocyk7cmV0dXJuW3JlKHQqcixuKm8pLE9lKG4mJmUqci9uKV19fWZ1bmN0aW9uIERhKGksdCl7cmV0dXJuW2ksSzAoZXAoKE50K3QpLzIpKV19RGEuaW52ZXJ0PWZ1bmN0aW9uKGksdCl7cmV0dXJuW2ksMip4YShRMCh0KSktTnRdfTtmdW5jdGlvbiBIcCgpe3JldHVybiBXcChEYSkuc2NhbGUoOTYxL1J0KX1mdW5jdGlvbiBXcChpKXt2YXIgdD1UcihpKSxlPXQuY2VudGVyLG49dC5zY2FsZSxzPXQudHJhbnNsYXRlLHI9dC5jbGlwRXh0ZW50LG89bnVsbCxhLGMsbDt0LnNjYWxlPWZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuKHUpLGgoKSk6bigpfSx0LnRyYW5zbGF0ZT1mdW5jdGlvbih1KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocyh1KSxoKCkpOnMoKX0sdC5jZW50ZXI9ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGUodSksaCgpKTplKCl9LHQuY2xpcEV4dGVudD1mdW5jdGlvbih1KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT09bnVsbD9vPWE9Yz1sPW51bGw6KG89K3VbMF1bMF0sYT0rdVswXVsxXSxjPSt1WzFdWzBdLGw9K3VbMV1bMV0pLGgoKSk6bz09bnVsbD9udWxsOltbbyxhXSxbYyxsXV19O2Z1bmN0aW9uIGgoKXt2YXIgdT1YKm4oKSxmPXQocGgodC5yb3RhdGUoKSkuaW52ZXJ0KFswLDBdKSk7cmV0dXJuIHIobz09bnVsbD9bW2ZbMF0tdSxmWzFdLXVdLFtmWzBdK3UsZlsxXSt1XV06aT09PURhP1tbTWF0aC5tYXgoZlswXS11LG8pLGFdLFtNYXRoLm1pbihmWzBdK3UsYyksbF1dOltbbyxNYXRoLm1heChmWzFdLXUsYSldLFtjLE1hdGgubWluKGZbMV0rdSxsKV1dKX1yZXR1cm4gaCgpfWZ1bmN0aW9uICRhKGksdCl7cmV0dXJuW2ksdF19JGEuaW52ZXJ0PSRhO2Z1bmN0aW9uIEdwKCl7cmV0dXJuIFRyKCRhKS5zY2FsZSgxNTIuNjMpfWZ1bmN0aW9uIGtoKGksdCl7dmFyIGU9Vyh0KSxuPTErVyhpKSplO3JldHVybltlKnEoaSkvbixxKHQpL25dfWtoLmludmVydD1xcChmdW5jdGlvbihpKXtyZXR1cm4gMip4YShpKX0pO2Z1bmN0aW9uIFpwKCl7cmV0dXJuIFRyKGtoKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfXZhciBYcD1NYXRoLmF0YW4sSnA9TWF0aC5jb3MsWXA9TWF0aC50YW4sanA9TWF0aC5QSSxRcD1qcC8xODA7ZnVuY3Rpb24gTmgoaSl7cmV0dXJuIGk+MD9NYXRoLnNxcnQoaSk6MH12YXIgRXI9SnAoMzUqUXApO2Z1bmN0aW9uIFJoKGksdCl7dmFyIGU9WXAodC8yKTtyZXR1cm5baSpFcipOaCgxLWUqZSksKDErRXIpKmVdfVJoLmludmVydD1mdW5jdGlvbihpLHQpe3ZhciBlPXQvKDErRXIpO3JldHVybltpJiZpLyhFcipOaCgxLWUqZSkpLDIqWHAoZSldfTtmdW5jdGlvbiBLcCgpe3JldHVybiBUcihSaCkuc2NhbGUoMTM3LjE1Mil9Y29uc3QgdHk9e21lcmNhdG9yOkhwLGVxdWlyZWN0YW5ndWxhcjpHcCxmYWhleTpLcH0sVWE9e30sV2k9aT0+e3ZhciBuLHMscjtjb25zdCB0PUpTT04uc3RyaW5naWZ5KGkpO2lmKFVhW3RdKXJldHVybiBVYVt0XTtjb25zdCBlPXR5WyhuPWkucHJvamVjdGlvblR5cGUpIT1udWxsP246Im1lcmNhdG9yIl0oKS5jZW50ZXIoaS5jZW50ZXIpLnNjYWxlKGkuc2NhbGUpLnRyYW5zbGF0ZSgocz1pLnRyYW5zbGF0ZSkhPW51bGw/czpbMCwwXSkucHJlY2lzaW9uKChyPWkucHJlY2lzaW9uKSE9bnVsbD9yOi4xKTtyZXR1cm4gaS5yb3RhdGUmJmUucm90YXRlKGkucm90YXRlKSxVYVt0XT1lLGV9LFByPShpLHQpPT5pLm1hcCgoW2Usbl0pPT57bGV0IHM7aWYodCl7Y29uc3RbcixvXT10KFtlLG5dKTtzPW5ldyBSKHIsLW8pfWVsc2Ugcz1uZXcgUihlLG4pO3JldHVybiBzfSk7dmFyIEdpPShpLHQpPT57Y29uc3QgZT0kbChpLHQhPW51bGw/dDowKSxuPXt9LHM9W10scj1PYmplY3Qua2V5cyhlLmF0dHJpYnV0ZXMpO3JldHVybiBlLmluZGV4JiZyLnB1c2goImluZGV4Iiksci5mb3JFYWNoKG89Pntjb25zdCBhPW89PT0iaW5kZXgiP2UuaW5kZXg6ZS5hdHRyaWJ1dGVzW29dO25bb109e2FycmF5OmEuYXJyYXksaXRlbVNpemU6YS5pdGVtU2l6ZX0scy5wdXNoKGEuYXJyYXkuYnVmZmVyKX0pLHQmJihuLmdyb3Vwcz1lLmdyb3VwcyksZS5kaXNwb3NlKCksaS5mb3JFYWNoKG89PntvLmRpc3Bvc2UoKX0pLHttZXNzYWdlOm4sdHJhbnNmZXI6c319LFZhPShpLHQ9MzAwKT0+e2NvbnN0IGU9W107cmV0dXJuIGkuZm9yRWFjaChuPT57bGV0IHM9ITE7Zm9yKGxldCByPTE7cjxuLmxlbmd0aDtyKyspaWYoTWF0aC5hYnMobltyXS54LW5bci0xXS54KT50KXtzPSEwO2JyZWFrfWlmKHMpe2NvbnN0IHI9W10sbz1bXTtuLmZvckVhY2goYT0+e2EueDwwP3IucHVzaChhKTpvLnB1c2goYSl9KSxlLnB1c2gocixvKX1lbHNlIGUucHVzaChuKX0pLGV9O2NvbnN0IGV5PSh7Y29vcmRpbmF0ZXNBcnI6aSxzcGxpdDp0LHNpZGVSZXBlYXQ6ZSxiYm94Om4sYmJveE9mZnNldDpzLGRlcHRoOnIscHJvamVjdGlvbjpvLHVzZUdyb3VwczphLGhhc1RvcDpjLGhhc0JvdHRvbTpsLGhhc1NpZGU6aCxzcGxpdFBvbHlnb25zOnUsdG9wU2VnbWVudHM6Zn0pPT57Y29uc3QgZD1vJiZXaShvKTtsZXQgcD1pLm1hcChnPT5QcihnLGQpKTt1JiYocD1WYShwLHUpKTtsZXQgeTtpZihuKXtjb25zdFtnLGJdPVByKFtbblswXSxuWzFdXSxbblsyXSxuWzNdXV0sbyE9bnVsbCYmby5yb3RhdGU/V2koR2UoRnQoe30sbykse3JvdGF0ZTp2b2lkIDB9KSk6ZCk7cyYmKGcueCs9c1swXSxnLnkrPXNbMV0sYi54Kz1zWzJdLGIueSs9c1szXSkseT1uZXcgZ3QobmV3IFQoZy54LGcueSwwKSxuZXcgVChiLngsYi55LDApKX1jb25zdCBtPXAubWFwKChnLGIpPT57dmFyIHc7cmV0dXJuIEQwKHtwb2ludHM6ZyxzcGxpdDp0LHNpZGVSZXBlYXQ6ZSxkZXB0aDoodz1yW2JdKSE9bnVsbD93OnJbMF0saGFzVG9wOmMsaGFzQm90dG9tOmwsaGFzU2lkZTpoLGJveDM6eSx0b3BTZWdtZW50czpmfSl9KTtyZXR1cm4gR2kobSxhKX07ZnVuY3Rpb24gcWEoaSx0LGUsbixzKXtsZXQgcjtpZihpPWkuc3ViYXJyYXl8fGkuc2xpY2U/aTppLmJ1ZmZlcixlPWUuc3ViYXJyYXl8fGUuc2xpY2U/ZTplLmJ1ZmZlcixpPXQ/aS5zdWJhcnJheT9pLnN1YmFycmF5KHQscyYmdCtzKTppLnNsaWNlKHQscyYmdCtzKTppLGUuc2V0KWUuc2V0KGksbik7ZWxzZSBmb3Iocj0wO3I8aS5sZW5ndGg7cisrKWVbcituXT1pW3JdO3JldHVybiBlfWZ1bmN0aW9uIG55KGkpe3JldHVybiBpIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P2k6aSBpbnN0YW5jZW9mIHVlP2kuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLmFycmF5OmkubWFwKHQ9Pntjb25zdCBlPUFycmF5LmlzQXJyYXkodCk7cmV0dXJuIHQgaW5zdGFuY2VvZiBUP1t0LngsdC55LHQuel06dCBpbnN0YW5jZW9mIFI/W3QueCx0LnksMF06ZSYmdC5sZW5ndGg9PT0zP1t0WzBdLHRbMV0sdFsyXV06ZSYmdC5sZW5ndGg9PT0yP1t0WzBdLHRbMV0sMF06dH0pLmZsYXQoKX1jbGFzcyBpeSBleHRlbmRzIHVle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9Ik1lc2hMaW5lIix0aGlzLmlzTWVzaExpbmU9ITAsdGhpcy5wb3NpdGlvbnM9W10sdGhpcy5wcmV2aW91cz1bXSx0aGlzLm5leHQ9W10sdGhpcy5zaWRlPVtdLHRoaXMud2lkdGg9W10sdGhpcy5pbmRpY2VzX2FycmF5PVtdLHRoaXMudXZzPVtdLHRoaXMuY291bnRlcnM9W10sdGhpcy53aWR0aENhbGxiYWNrPW51bGwsdGhpcy5fcG9pbnRzPVtdLHRoaXMubWF0cml4V29ybGQ9bmV3IHN0LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3BvaW50czp7ZW51bWVyYWJsZTohMCxnZXQoKXtyZXR1cm4gdGhpcy5fcG9pbnRzfSxzZXQodCl7dGhpcy5zZXRQb2ludHModCx0aGlzLndpZHRoQ2FsbGJhY2spfX19KX1zZXRNYXRyaXhXb3JsZCh0KXt0aGlzLm1hdHJpeFdvcmxkPXR9c2V0UG9pbnRzKHQsZSl7aWYodD1ueSh0KSx0aGlzLl9wb2ludHM9dCx0aGlzLndpZHRoQ2FsbGJhY2s9ZSE9bnVsbD9lOm51bGwsdGhpcy5wb3NpdGlvbnM9W10sdGhpcy5jb3VudGVycz1bXSx0Lmxlbmd0aCYmdFswXWluc3RhbmNlb2YgVClmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgcz10W25dLHI9bi8odC5sZW5ndGgtMSk7dGhpcy5wb3NpdGlvbnMucHVzaChzLngscy55LHMueiksdGhpcy5wb3NpdGlvbnMucHVzaChzLngscy55LHMueiksdGhpcy5jb3VudGVycy5wdXNoKHIpLHRoaXMuY291bnRlcnMucHVzaChyKX1lbHNlIGZvcihsZXQgbj0wO248dC5sZW5ndGg7bis9Myl7Y29uc3Qgcz1uLyh0Lmxlbmd0aC0xKTt0aGlzLnBvc2l0aW9ucy5wdXNoKHRbbl0sdFtuKzFdLHRbbisyXSksdGhpcy5wb3NpdGlvbnMucHVzaCh0W25dLHRbbisxXSx0W24rMl0pLHRoaXMuY291bnRlcnMucHVzaChzKSx0aGlzLmNvdW50ZXJzLnB1c2gocyl9dGhpcy5wcm9jZXNzKCl9Y29tcGFyZVYzKHQsZSl7Y29uc3Qgbj10KjYscz1lKjY7cmV0dXJuIHRoaXMucG9zaXRpb25zW25dPT09dGhpcy5wb3NpdGlvbnNbc10mJnRoaXMucG9zaXRpb25zW24rMV09PT10aGlzLnBvc2l0aW9uc1tzKzFdJiZ0aGlzLnBvc2l0aW9uc1tuKzJdPT09dGhpcy5wb3NpdGlvbnNbcysyXX1jb3B5VjModCl7Y29uc3QgZT10KjY7cmV0dXJuW3RoaXMucG9zaXRpb25zW2VdLHRoaXMucG9zaXRpb25zW2UrMV0sdGhpcy5wb3NpdGlvbnNbZSsyXV19cHJvY2Vzcygpe2NvbnN0IHQ9dGhpcy5wb3NpdGlvbnMubGVuZ3RoLzY7dGhpcy5wcmV2aW91cz1bXSx0aGlzLm5leHQ9W10sdGhpcy5zaWRlPVtdLHRoaXMud2lkdGg9W10sdGhpcy5pbmRpY2VzX2FycmF5PVtdLHRoaXMudXZzPVtdO2xldCBlLG47dGhpcy5jb21wYXJlVjMoMCx0LTEpP249dGhpcy5jb3B5VjModC0yKTpuPXRoaXMuY29weVYzKDApLHRoaXMucHJldmlvdXMucHVzaChuWzBdLG5bMV0sblsyXSksdGhpcy5wcmV2aW91cy5wdXNoKG5bMF0sblsxXSxuWzJdKTtmb3IobGV0IHM9MDtzPHQ7cysrKXtpZih0aGlzLnNpZGUucHVzaCgxKSx0aGlzLnNpZGUucHVzaCgtMSksdGhpcy53aWR0aENhbGxiYWNrP2U9dGhpcy53aWR0aENhbGxiYWNrKHMvKHQtMSkpOmU9MSx0aGlzLndpZHRoLnB1c2goZSksdGhpcy53aWR0aC5wdXNoKGUpLHRoaXMudXZzLnB1c2gocy8odC0xKSwwKSx0aGlzLnV2cy5wdXNoKHMvKHQtMSksMSksczx0LTEpe249dGhpcy5jb3B5VjMocyksdGhpcy5wcmV2aW91cy5wdXNoKG5bMF0sblsxXSxuWzJdKSx0aGlzLnByZXZpb3VzLnB1c2goblswXSxuWzFdLG5bMl0pO2NvbnN0IHI9cyoyO3RoaXMuaW5kaWNlc19hcnJheS5wdXNoKHIscisxLHIrMiksdGhpcy5pbmRpY2VzX2FycmF5LnB1c2gocisyLHIrMSxyKzMpfXM+MCYmKG49dGhpcy5jb3B5VjMocyksdGhpcy5uZXh0LnB1c2goblswXSxuWzFdLG5bMl0pLHRoaXMubmV4dC5wdXNoKG5bMF0sblsxXSxuWzJdKSl9dGhpcy5jb21wYXJlVjModC0xLDApP249dGhpcy5jb3B5VjMoMSk6bj10aGlzLmNvcHlWMyh0LTEpLHRoaXMubmV4dC5wdXNoKG5bMF0sblsxXSxuWzJdKSx0aGlzLm5leHQucHVzaChuWzBdLG5bMV0sblsyXSksIXRoaXMuX2F0dHJpYnV0ZXN8fHRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24uY291bnQhPT10aGlzLmNvdW50ZXJzLmxlbmd0aD90aGlzLl9hdHRyaWJ1dGVzPXtwb3NpdGlvbjpuZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvc2l0aW9ucyksMykscHJldmlvdXM6bmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wcmV2aW91cyksMyksbmV4dDpuZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLm5leHQpLDMpLHNpZGU6bmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5zaWRlKSwxKSx3aWR0aDpuZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLndpZHRoKSwxKSx1djpuZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnV2cyksMiksaW5kZXg6bmV3IHh0KG5ldyBVaW50MTZBcnJheSh0aGlzLmluZGljZXNfYXJyYXkpLDEpLGNvdW50ZXJzOm5ldyB4dChuZXcgRmxvYXQzMkFycmF5KHRoaXMuY291bnRlcnMpLDEpfToodGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbi5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvc2l0aW9ucykpLHRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24ubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cy5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLnByZXZpb3VzKSksdGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cy5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLm5leHQuY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5uZXh0KSksdGhpcy5fYXR0cmlidXRlcy5uZXh0Lm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMuc2lkZS5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLnNpZGUpKSx0aGlzLl9hdHRyaWJ1dGVzLnNpZGUubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy53aWR0aC5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLndpZHRoKSksdGhpcy5fYXR0cmlidXRlcy53aWR0aC5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLnV2LmNvcHlBcnJheShuZXcgRmxvYXQzMkFycmF5KHRoaXMudXZzKSksdGhpcy5fYXR0cmlidXRlcy51di5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLmluZGV4LmNvcHlBcnJheShuZXcgVWludDE2QXJyYXkodGhpcy5pbmRpY2VzX2FycmF5KSksdGhpcy5fYXR0cmlidXRlcy5pbmRleC5uZWVkc1VwZGF0ZT0hMCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIix0aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uKSx0aGlzLnNldEF0dHJpYnV0ZSgicHJldmlvdXMiLHRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMpLHRoaXMuc2V0QXR0cmlidXRlKCJuZXh0Iix0aGlzLl9hdHRyaWJ1dGVzLm5leHQpLHRoaXMuc2V0QXR0cmlidXRlKCJzaWRlIix0aGlzLl9hdHRyaWJ1dGVzLnNpZGUpLHRoaXMuc2V0QXR0cmlidXRlKCJ3aWR0aCIsdGhpcy5fYXR0cmlidXRlcy53aWR0aCksdGhpcy5zZXRBdHRyaWJ1dGUoInV2Iix0aGlzLl9hdHRyaWJ1dGVzLnV2KSx0aGlzLnNldEF0dHJpYnV0ZSgiY291bnRlcnMiLHRoaXMuX2F0dHJpYnV0ZXMuY291bnRlcnMpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsdGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbiksdGhpcy5zZXRBdHRyaWJ1dGUoInByZXZpb3VzIix0aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzKSx0aGlzLnNldEF0dHJpYnV0ZSgibmV4dCIsdGhpcy5fYXR0cmlidXRlcy5uZXh0KSx0aGlzLnNldEF0dHJpYnV0ZSgic2lkZSIsdGhpcy5fYXR0cmlidXRlcy5zaWRlKSx0aGlzLnNldEF0dHJpYnV0ZSgid2lkdGgiLHRoaXMuX2F0dHJpYnV0ZXMud2lkdGgpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsdGhpcy5fYXR0cmlidXRlcy51diksdGhpcy5zZXRBdHRyaWJ1dGUoImNvdW50ZXJzIix0aGlzLl9hdHRyaWJ1dGVzLmNvdW50ZXJzKSx0aGlzLnNldEluZGV4KHRoaXMuX2F0dHJpYnV0ZXMuaW5kZXgpLHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKX1hZHZhbmNlKHt4OnQseTplLHo6bn0pe2NvbnN0IHM9dGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheSxyPXRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMuYXJyYXksbz10aGlzLl9hdHRyaWJ1dGVzLm5leHQuYXJyYXksYT1zLmxlbmd0aDtxYShzLDAsciwwLGEpLHFhKHMsNixzLDAsYS02KSxzW2EtNl09dCxzW2EtNV09ZSxzW2EtNF09bixzW2EtM109dCxzW2EtMl09ZSxzW2EtMV09bixxYShzLDYsbywwLGEtNiksb1thLTZdPXQsb1thLTVdPWUsb1thLTRdPW4sb1thLTNdPXQsb1thLTJdPWUsb1thLTFdPW4sdGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbi5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzLm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMubmV4dC5uZWVkc1VwZGF0ZT0hMH19dmFyIExoPWk9Pntjb25zdHtzZXRQb2ludFdpZHRoOnQsbm9kZXM6ZX09aSxuPW5ldyBpeTtyZXR1cm4gbi5zZXRQb2ludHMoZSx0KSxufTtjb25zdCBzeT0oe2Nvb3JkaW5hdGVzQXJyOmkscHJvamVjdGlvbjp0LGxpbmVXaWR0aDplLHVzZUdyb3VwczpuLHNwbGl0UG9seWdvbnM6c30pPT57Y29uc3Qgcj10JiZXaSh0KTtsZXQgbz1pLm1hcChjPT5QcihjLHIpKTtzJiYobz1WYShvLHMpKTtjb25zdCBhPW8ubWFwKChjLGwpPT57dmFyIHU7Y29uc3QgaD0odT1lW2xdKSE9bnVsbD91OmVbMF07cmV0dXJuIExoKHtub2RlczpjLHNldFBvaW50V2lkdGg6KCk9Pmh9KX0pO3JldHVybiBHaShhLG4pfTt2YXIgcnk9aT0+e2NvbnN0e3BvaW50czp0fT1pLGU9dC5yZWR1Y2UoKHMscixvKT0+KG88dC5sZW5ndGgtMSYmcy5wdXNoKHIsdFtvKzFdKSxzKSxbXSk7cmV0dXJuIG5ldyB1ZSgpLnNldEZyb21Qb2ludHMoZSl9O2NvbnN0IG95PSh7Y29vcmRpbmF0ZXNBcnI6aSxwcm9qZWN0aW9uOnQsbGluZVdpZHRoOmUsdXNlR3JvdXBzOm4sc3BsaXRQb2x5Z29uczpzfSk9Pntjb25zdCByPXQmJldpKHQpO2xldCBvPWkubWFwKGM9PlByKGMscikpO3MmJihvPVZhKG8scykpO2NvbnN0IGE9by5tYXAoKGMsbCk9PnJ5KHtwb2ludHM6Yy5tYXAoaD0+bmV3IFQoaC54LGgueSwwKSl9KSk7cmV0dXJuIEdpKGEsbil9O2Z1bmN0aW9uIGF5KGksdCxlPTIpe2NvbnN0IG49dCYmdC5sZW5ndGgscz1uP3RbMF0qZTppLmxlbmd0aDtsZXQgcj1PaChpLDAscyxlLCEwKTtjb25zdCBvPVtdO2lmKCFyfHxyLm5leHQ9PT1yLnByZXYpcmV0dXJuIG87bGV0IGEsYyxsO2lmKG4mJihyPWZ5KGksdCxyLGUpKSxpLmxlbmd0aD44MCplKXthPTEvMCxjPTEvMDtsZXQgaD0tMS8wLHU9LTEvMDtmb3IobGV0IGY9ZTtmPHM7Zis9ZSl7Y29uc3QgZD1pW2ZdLHA9aVtmKzFdO2Q8YSYmKGE9ZCkscDxjJiYoYz1wKSxkPmgmJihoPWQpLHA+dSYmKHU9cCl9bD1NYXRoLm1heChoLWEsdS1jKSxsPWwhPT0wPzMyNzY3L2w6MH1yZXR1cm4gWmkocixvLGUsYSxjLGwsMCksb31mdW5jdGlvbiBPaChpLHQsZSxuLHMpe2xldCByO2lmKHM9PT1feShpLHQsZSxuKT4wKWZvcihsZXQgbz10O288ZTtvKz1uKXI9VWgoby9ufDAsaVtvXSxpW28rMV0scik7ZWxzZSBmb3IobGV0IG89ZS1uO28+PXQ7by09bilyPVVoKG8vbnwwLGlbb10saVtvKzFdLHIpO3JldHVybiByJiZDcihyLHIubmV4dCkmJihKaShyKSxyPXIubmV4dCkscn1mdW5jdGlvbiBTbihpLHQpe2lmKCFpKXJldHVybiBpO3R8fCh0PWkpO2xldCBlPWksbjtkbyBpZihuPSExLCFlLnN0ZWluZXImJihDcihlLGUubmV4dCl8fGF0KGUucHJldixlLGUubmV4dCk9PT0wKSl7aWYoSmkoZSksZT10PWUucHJldixlPT09ZS5uZXh0KWJyZWFrO249ITB9ZWxzZSBlPWUubmV4dDt3aGlsZShufHxlIT09dCk7cmV0dXJuIHR9ZnVuY3Rpb24gWmkoaSx0LGUsbixzLHIsbyl7aWYoIWkpcmV0dXJuOyFvJiZyJiZneShpLG4scyxyKTtsZXQgYT1pO2Zvcig7aS5wcmV2IT09aS5uZXh0Oyl7Y29uc3QgYz1pLnByZXYsbD1pLm5leHQ7aWYocj9seShpLG4scyxyKTpjeShpKSl7dC5wdXNoKGMuaSxpLmksbC5pKSxKaShpKSxpPWwubmV4dCxhPWwubmV4dDtjb250aW51ZX1pZihpPWwsaT09PWEpe28/bz09PTE/KGk9aHkoU24oaSksdCksWmkoaSx0LGUsbixzLHIsMikpOm89PT0yJiZ1eShpLHQsZSxuLHMscik6WmkoU24oaSksdCxlLG4scyxyLDEpO2JyZWFrfX19ZnVuY3Rpb24gY3koaSl7Y29uc3QgdD1pLnByZXYsZT1pLG49aS5uZXh0O2lmKGF0KHQsZSxuKT49MClyZXR1cm4hMTtjb25zdCBzPXQueCxyPWUueCxvPW4ueCxhPXQueSxjPWUueSxsPW4ueSxoPXM8cj9zPG8/czpvOnI8bz9yOm8sdT1hPGM/YTxsP2E6bDpjPGw/YzpsLGY9cz5yP3M+bz9zOm86cj5vP3I6byxkPWE+Yz9hPmw/YTpsOmM+bD9jOmw7bGV0IHA9bi5uZXh0O2Zvcig7cCE9PXQ7KXtpZihwLng+PWgmJnAueDw9ZiYmcC55Pj11JiZwLnk8PWQmJm9pKHMsYSxyLGMsbyxsLHAueCxwLnkpJiZhdChwLnByZXYscCxwLm5leHQpPj0wKXJldHVybiExO3A9cC5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIGx5KGksdCxlLG4pe2NvbnN0IHM9aS5wcmV2LHI9aSxvPWkubmV4dDtpZihhdChzLHIsbyk+PTApcmV0dXJuITE7Y29uc3QgYT1zLngsYz1yLngsbD1vLngsaD1zLnksdT1yLnksZj1vLnksZD1hPGM/YTxsP2E6bDpjPGw/YzpsLHA9aDx1P2g8Zj9oOmY6dTxmP3U6Zix5PWE+Yz9hPmw/YTpsOmM+bD9jOmwsbT1oPnU/aD5mP2g6Zjp1PmY/dTpmLGc9SGEoZCxwLHQsZSxuKSxiPUhhKHksbSx0LGUsbik7bGV0IHc9aS5wcmV2Wix4PWkubmV4dFo7Zm9yKDt3JiZ3Lno+PWcmJngmJnguejw9Yjspe2lmKHcueD49ZCYmdy54PD15JiZ3Lnk+PXAmJncueTw9bSYmdyE9PXMmJnchPT1vJiZvaShhLGgsYyx1LGwsZix3Lngsdy55KSYmYXQody5wcmV2LHcsdy5uZXh0KT49MHx8KHc9dy5wcmV2Wix4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PW0mJnghPT1zJiZ4IT09byYmb2koYSxoLGMsdSxsLGYseC54LHgueSkmJmF0KHgucHJldix4LHgubmV4dCk+PTApKXJldHVybiExO3g9eC5uZXh0Wn1mb3IoO3cmJncuej49Zzspe2lmKHcueD49ZCYmdy54PD15JiZ3Lnk+PXAmJncueTw9bSYmdyE9PXMmJnchPT1vJiZvaShhLGgsYyx1LGwsZix3Lngsdy55KSYmYXQody5wcmV2LHcsdy5uZXh0KT49MClyZXR1cm4hMTt3PXcucHJldlp9Zm9yKDt4JiZ4Lno8PWI7KXtpZih4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PW0mJnghPT1zJiZ4IT09byYmb2koYSxoLGMsdSxsLGYseC54LHgueSkmJmF0KHgucHJldix4LHgubmV4dCk+PTApcmV0dXJuITE7eD14Lm5leHRafXJldHVybiEwfWZ1bmN0aW9uIGh5KGksdCl7bGV0IGU9aTtkb3tjb25zdCBuPWUucHJldixzPWUubmV4dC5uZXh0OyFDcihuLHMpJiZEaChuLGUsZS5uZXh0LHMpJiZYaShuLHMpJiZYaShzLG4pJiYodC5wdXNoKG4uaSxlLmkscy5pKSxKaShlKSxKaShlLm5leHQpLGU9aT1zKSxlPWUubmV4dH13aGlsZShlIT09aSk7cmV0dXJuIFNuKGUpfWZ1bmN0aW9uIHV5KGksdCxlLG4scyxyKXtsZXQgbz1pO2Rve2xldCBhPW8ubmV4dC5uZXh0O2Zvcig7YSE9PW8ucHJldjspe2lmKG8uaSE9PWEuaSYmYnkobyxhKSl7bGV0IGM9JGgobyxhKTtvPVNuKG8sby5uZXh0KSxjPVNuKGMsYy5uZXh0KSxaaShvLHQsZSxuLHMsciwwKSxaaShjLHQsZSxuLHMsciwwKTtyZXR1cm59YT1hLm5leHR9bz1vLm5leHR9d2hpbGUobyE9PWkpfWZ1bmN0aW9uIGZ5KGksdCxlLG4pe2NvbnN0IHM9W107Zm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXtjb25zdCBhPXRbcl0qbixjPXI8by0xP3RbcisxXSpuOmkubGVuZ3RoLGw9T2goaSxhLGMsbiwhMSk7bD09PWwubmV4dCYmKGwuc3RlaW5lcj0hMCkscy5wdXNoKHd5KGwpKX1zLnNvcnQoZHkpO2ZvcihsZXQgcj0wO3I8cy5sZW5ndGg7cisrKWU9cHkoc1tyXSxlKTtyZXR1cm4gZX1mdW5jdGlvbiBkeShpLHQpe3JldHVybiBpLngtdC54fWZ1bmN0aW9uIHB5KGksdCl7Y29uc3QgZT15eShpLHQpO2lmKCFlKXJldHVybiB0O2NvbnN0IG49JGgoZSxpKTtyZXR1cm4gU24obixuLm5leHQpLFNuKGUsZS5uZXh0KX1mdW5jdGlvbiB5eShpLHQpe2xldCBlPXQ7Y29uc3Qgbj1pLngscz1pLnk7bGV0IHI9LTEvMCxvO2Rve2lmKHM8PWUueSYmcz49ZS5uZXh0LnkmJmUubmV4dC55IT09ZS55KXtjb25zdCB1PWUueCsocy1lLnkpKihlLm5leHQueC1lLngpLyhlLm5leHQueS1lLnkpO2lmKHU8PW4mJnU+ciYmKHI9dSxvPWUueDxlLm5leHQueD9lOmUubmV4dCx1PT09bikpcmV0dXJuIG99ZT1lLm5leHR9d2hpbGUoZSE9PXQpO2lmKCFvKXJldHVybiBudWxsO2NvbnN0IGE9byxjPW8ueCxsPW8ueTtsZXQgaD0xLzA7ZT1vO2Rve2lmKG4+PWUueCYmZS54Pj1jJiZuIT09ZS54JiZvaShzPGw/bjpyLHMsYyxsLHM8bD9yOm4scyxlLngsZS55KSl7Y29uc3QgdT1NYXRoLmFicyhzLWUueSkvKG4tZS54KTtYaShlLGkpJiYodTxofHx1PT09aCYmKGUueD5vLnh8fGUueD09PW8ueCYmbXkobyxlKSkpJiYobz1lLGg9dSl9ZT1lLm5leHR9d2hpbGUoZSE9PWEpO3JldHVybiBvfWZ1bmN0aW9uIG15KGksdCl7cmV0dXJuIGF0KGkucHJldixpLHQucHJldik8MCYmYXQodC5uZXh0LGksaS5uZXh0KTwwfWZ1bmN0aW9uIGd5KGksdCxlLG4pe2xldCBzPWk7ZG8gcy56PT09MCYmKHMuej1IYShzLngscy55LHQsZSxuKSkscy5wcmV2Wj1zLnByZXYscy5uZXh0Wj1zLm5leHQscz1zLm5leHQ7d2hpbGUocyE9PWkpO3MucHJldloubmV4dFo9bnVsbCxzLnByZXZaPW51bGwseHkocyl9ZnVuY3Rpb24geHkoaSl7bGV0IHQsZT0xO2Rve2xldCBuPWkscztpPW51bGw7bGV0IHI9bnVsbDtmb3IodD0wO247KXt0Kys7bGV0IG89bixhPTA7Zm9yKGxldCBsPTA7bDxlJiYoYSsrLG89by5uZXh0WiwhIW8pO2wrKyk7bGV0IGM9ZTtmb3IoO2E+MHx8Yz4wJiZvOylhIT09MCYmKGM9PT0wfHwhb3x8bi56PD1vLnopPyhzPW4sbj1uLm5leHRaLGEtLSk6KHM9byxvPW8ubmV4dFosYy0tKSxyP3IubmV4dFo9czppPXMscy5wcmV2Wj1yLHI9cztuPW99ci5uZXh0Wj1udWxsLGUqPTJ9d2hpbGUodD4xKTtyZXR1cm4gaX1mdW5jdGlvbiBIYShpLHQsZSxuLHMpe3JldHVybiBpPShpLWUpKnN8MCx0PSh0LW4pKnN8MCxpPShpfGk8PDgpJjE2NzExOTM1LGk9KGl8aTw8NCkmMjUyNjQ1MTM1LGk9KGl8aTw8MikmODU4OTkzNDU5LGk9KGl8aTw8MSkmMTQzMTY1NTc2NSx0PSh0fHQ8PDgpJjE2NzExOTM1LHQ9KHR8dDw8NCkmMjUyNjQ1MTM1LHQ9KHR8dDw8MikmODU4OTkzNDU5LHQ9KHR8dDw8MSkmMTQzMTY1NTc2NSxpfHQ8PDF9ZnVuY3Rpb24gd3koaSl7bGV0IHQ9aSxlPWk7ZG8odC54PGUueHx8dC54PT09ZS54JiZ0Lnk8ZS55KSYmKGU9dCksdD10Lm5leHQ7d2hpbGUodCE9PWkpO3JldHVybiBlfWZ1bmN0aW9uIG9pKGksdCxlLG4scyxyLG8sYSl7cmV0dXJuKHMtbykqKHQtYSk+PShpLW8pKihyLWEpJiYoaS1vKSoobi1hKT49KGUtbykqKHQtYSkmJihlLW8pKihyLWEpPj0ocy1vKSoobi1hKX1mdW5jdGlvbiBieShpLHQpe3JldHVybiBpLm5leHQuaSE9PXQuaSYmaS5wcmV2LmkhPT10LmkmJiFNeShpLHQpJiYoWGkoaSx0KSYmWGkodCxpKSYmQXkoaSx0KSYmKGF0KGkucHJldixpLHQucHJldil8fGF0KGksdC5wcmV2LHQpKXx8Q3IoaSx0KSYmYXQoaS5wcmV2LGksaS5uZXh0KT4wJiZhdCh0LnByZXYsdCx0Lm5leHQpPjApfWZ1bmN0aW9uIGF0KGksdCxlKXtyZXR1cm4odC55LWkueSkqKGUueC10LngpLSh0LngtaS54KSooZS55LXQueSl9ZnVuY3Rpb24gQ3IoaSx0KXtyZXR1cm4gaS54PT09dC54JiZpLnk9PT10Lnl9ZnVuY3Rpb24gRGgoaSx0LGUsbil7Y29uc3Qgcz1GcihhdChpLHQsZSkpLHI9RnIoYXQoaSx0LG4pKSxvPUZyKGF0KGUsbixpKSksYT1GcihhdChlLG4sdCkpO3JldHVybiEhKHMhPT1yJiZvIT09YXx8cz09PTAmJkJyKGksZSx0KXx8cj09PTAmJkJyKGksbix0KXx8bz09PTAmJkJyKGUsaSxuKXx8YT09PTAmJkJyKGUsdCxuKSl9ZnVuY3Rpb24gQnIoaSx0LGUpe3JldHVybiB0Lng8PU1hdGgubWF4KGkueCxlLngpJiZ0Lng+PU1hdGgubWluKGkueCxlLngpJiZ0Lnk8PU1hdGgubWF4KGkueSxlLnkpJiZ0Lnk+PU1hdGgubWluKGkueSxlLnkpfWZ1bmN0aW9uIEZyKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH1mdW5jdGlvbiBNeShpLHQpe2xldCBlPWk7ZG97aWYoZS5pIT09aS5pJiZlLm5leHQuaSE9PWkuaSYmZS5pIT09dC5pJiZlLm5leHQuaSE9PXQuaSYmRGgoZSxlLm5leHQsaSx0KSlyZXR1cm4hMDtlPWUubmV4dH13aGlsZShlIT09aSk7cmV0dXJuITF9ZnVuY3Rpb24gWGkoaSx0KXtyZXR1cm4gYXQoaS5wcmV2LGksaS5uZXh0KTwwP2F0KGksdCxpLm5leHQpPj0wJiZhdChpLGkucHJldix0KT49MDphdChpLHQsaS5wcmV2KTwwfHxhdChpLGkubmV4dCx0KTwwfWZ1bmN0aW9uIEF5KGksdCl7bGV0IGU9aSxuPSExO2NvbnN0IHM9KGkueCt0LngpLzIscj0oaS55K3QueSkvMjtkbyBlLnk+ciE9ZS5uZXh0Lnk+ciYmZS5uZXh0LnkhPT1lLnkmJnM8KGUubmV4dC54LWUueCkqKHItZS55KS8oZS5uZXh0LnktZS55KStlLngmJihuPSFuKSxlPWUubmV4dDt3aGlsZShlIT09aSk7cmV0dXJuIG59ZnVuY3Rpb24gJGgoaSx0KXtjb25zdCBlPVdhKGkuaSxpLngsaS55KSxuPVdhKHQuaSx0LngsdC55KSxzPWkubmV4dCxyPXQucHJldjtyZXR1cm4gaS5uZXh0PXQsdC5wcmV2PWksZS5uZXh0PXMscy5wcmV2PWUsbi5uZXh0PWUsZS5wcmV2PW4sci5uZXh0PW4sbi5wcmV2PXIsbn1mdW5jdGlvbiBVaChpLHQsZSxuKXtjb25zdCBzPVdhKGksdCxlKTtyZXR1cm4gbj8ocy5uZXh0PW4ubmV4dCxzLnByZXY9bixuLm5leHQucHJldj1zLG4ubmV4dD1zKToocy5wcmV2PXMscy5uZXh0PXMpLHN9ZnVuY3Rpb24gSmkoaSl7aS5uZXh0LnByZXY9aS5wcmV2LGkucHJldi5uZXh0PWkubmV4dCxpLnByZXZaJiYoaS5wcmV2Wi5uZXh0Wj1pLm5leHRaKSxpLm5leHRaJiYoaS5uZXh0Wi5wcmV2Wj1pLnByZXZaKX1mdW5jdGlvbiBXYShpLHQsZSl7cmV0dXJue2kseDp0LHk6ZSxwcmV2Om51bGwsbmV4dDpudWxsLHo6MCxwcmV2WjpudWxsLG5leHRaOm51bGwsc3RlaW5lcjohMX19ZnVuY3Rpb24gX3koaSx0LGUsbil7bGV0IHM9MDtmb3IobGV0IHI9dCxvPWUtbjtyPGU7cis9bilzKz0oaVtvXS1pW3JdKSooaVtyKzFdK2lbbysxXSksbz1yO3JldHVybiBzfWZ1bmN0aW9uIFZoKGkpe2NvbnN0IHQ9W10sZT1bXSxuPWlbMF1bMF0ubGVuZ3RoO2xldCBzPTAscj0wO2Zvcihjb25zdCBvIG9mIGkpe2Zvcihjb25zdCBhIG9mIG8pZm9yKGxldCBjPTA7YzxuO2MrKyl0LnB1c2goYVtjXSk7ciYmKHMrPXIsZS5wdXNoKHMpKSxyPW8ubGVuZ3RofXJldHVybnt2ZXJ0aWNlczp0LGhvbGVzOmUsZGltZW5zaW9uczpufX1mdW5jdGlvbiBTeShpKXtpZighaSl0aHJvdyBuZXcgRXJyb3IoImNvb3JkIGlzIHJlcXVpcmVkIik7aWYoIUFycmF5LmlzQXJyYXkoaSkpe2lmKGkudHlwZT09PSJGZWF0dXJlIiYmaS5nZW9tZXRyeSE9PW51bGwmJmkuZ2VvbWV0cnkudHlwZT09PSJQb2ludCIpcmV0dXJuWy4uLmkuZ2VvbWV0cnkuY29vcmRpbmF0ZXNdO2lmKGkudHlwZT09PSJQb2ludCIpcmV0dXJuWy4uLmkuY29vcmRpbmF0ZXNdfWlmKEFycmF5LmlzQXJyYXkoaSkmJmkubGVuZ3RoPj0yJiYhQXJyYXkuaXNBcnJheShpWzBdKSYmIUFycmF5LmlzQXJyYXkoaVsxXSkpcmV0dXJuWy4uLmldO3Rocm93IG5ldyBFcnJvcigiY29vcmQgbXVzdCBiZSBHZW9KU09OIFBvaW50IG9yIGFuIEFycmF5IG9mIG51bWJlcnMiKX1mdW5jdGlvbiB2eShpKXtpZihBcnJheS5pc0FycmF5KGkpKXJldHVybiBpO2lmKGkudHlwZT09PSJGZWF0dXJlIil7aWYoaS5nZW9tZXRyeSE9PW51bGwpcmV0dXJuIGkuZ2VvbWV0cnkuY29vcmRpbmF0ZXN9ZWxzZSBpZihpLmNvb3JkaW5hdGVzKXJldHVybiBpLmNvb3JkaW5hdGVzO3Rocm93IG5ldyBFcnJvcigiY29vcmRzIG11c3QgYmUgR2VvSlNPTiBGZWF0dXJlLCBHZW9tZXRyeSBPYmplY3Qgb3IgYW4gQXJyYXkiKX1mdW5jdGlvbiB6eShpKXtyZXR1cm4gaS50eXBlPT09IkZlYXR1cmUiP2kuZ2VvbWV0cnk6aX1mdW5jdGlvbiBUeShpKXtjb25zdCB0PXZ5KGkpO2xldCBlPTAsbj0xLHMscjtmb3IoO248dC5sZW5ndGg7KXM9cnx8dFswXSxyPXRbbl0sZSs9KHJbMF0tc1swXSkqKHJbMV0rc1sxXSksbisrO3JldHVybiBlPjB9dmFyIEV5PVR5O2NvbnN0IFZlPTExMTAyMjMwMjQ2MjUxNTY1ZS0zMix2dD0xMzQyMTc3MjksUHk9KDMrOCpWZSkqVmU7ZnVuY3Rpb24gR2EoaSx0LGUsbixzKXtsZXQgcixvLGEsYyxsPXRbMF0saD1uWzBdLHU9MCxmPTA7aD5sPT1oPi1sPyhyPWwsbD10WysrdV0pOihyPWgsaD1uWysrZl0pO2xldCBkPTA7aWYodTxpJiZmPGUpZm9yKGg+bD09aD4tbD8obz1sK3IsYT1yLShvLWwpLGw9dFsrK3VdKToobz1oK3IsYT1yLShvLWgpLGg9blsrK2ZdKSxyPW8sYSE9PTAmJihzW2QrK109YSk7dTxpJiZmPGU7KWg+bD09aD4tbD8obz1yK2wsYz1vLXIsYT1yLShvLWMpKyhsLWMpLGw9dFsrK3VdKToobz1yK2gsYz1vLXIsYT1yLShvLWMpKyhoLWMpLGg9blsrK2ZdKSxyPW8sYSE9PTAmJihzW2QrK109YSk7Zm9yKDt1PGk7KW89citsLGM9by1yLGE9ci0oby1jKSsobC1jKSxsPXRbKyt1XSxyPW8sYSE9PTAmJihzW2QrK109YSk7Zm9yKDtmPGU7KW89citoLGM9by1yLGE9ci0oby1jKSsoaC1jKSxoPW5bKytmXSxyPW8sYSE9PTAmJihzW2QrK109YSk7cmV0dXJuKHIhPT0wfHxkPT09MCkmJihzW2QrK109ciksZH1mdW5jdGlvbiBDeShpLHQpe2xldCBlPXRbMF07Zm9yKGxldCBuPTE7bjxpO24rKyllKz10W25dO3JldHVybiBlfWZ1bmN0aW9uIFlpKGkpe3JldHVybiBuZXcgRmxvYXQ2NEFycmF5KGkpfWNvbnN0IEJ5PSgzKzE2KlZlKSpWZSxGeT0oMisxMipWZSkqVmUsSXk9KDkrNjQqVmUpKlZlKlZlLGFpPVlpKDQpLHFoPVlpKDgpLEhoPVlpKDEyKSxXaD1ZaSgxNiksQnQ9WWkoNCk7ZnVuY3Rpb24ga3koaSx0LGUsbixzLHIsbyl7bGV0IGEsYyxsLGgsdSxmLGQscCx5LG0sZyxiLHcseCxNLEEsXyxTO2NvbnN0IEU9aS1zLHo9ZS1zLHY9dC1yLEM9bi1yO3g9RSpDLGY9dnQqRSxkPWYtKGYtRSkscD1FLWQsZj12dCpDLHk9Zi0oZi1DKSxtPUMteSxNPXAqbS0oeC1kKnktcCp5LWQqbSksQT12KnosZj12dCp2LGQ9Zi0oZi12KSxwPXYtZCxmPXZ0KnoseT1mLShmLXopLG09ei15LF89cCptLShBLWQqeS1wKnktZCptKSxnPU0tXyx1PU0tZyxhaVswXT1NLShnK3UpKyh1LV8pLGI9eCtnLHU9Yi14LHc9eC0oYi11KSsoZy11KSxnPXctQSx1PXctZyxhaVsxXT13LShnK3UpKyh1LUEpLFM9YitnLHU9Uy1iLGFpWzJdPWItKFMtdSkrKGctdSksYWlbM109UztsZXQgUD1DeSg0LGFpKSxGPUZ5Km87aWYoUD49Rnx8LVA+PUZ8fCh1PWktRSxhPWktKEUrdSkrKHUtcyksdT1lLXosbD1lLSh6K3UpKyh1LXMpLHU9dC12LGM9dC0odit1KSsodS1yKSx1PW4tQyxoPW4tKEMrdSkrKHUtciksYT09PTAmJmM9PT0wJiZsPT09MCYmaD09PTApfHwoRj1JeSpvK1B5Kk1hdGguYWJzKFApLFArPUUqaCtDKmEtKHYqbCt6KmMpLFA+PUZ8fC1QPj1GKSlyZXR1cm4gUDt4PWEqQyxmPXZ0KmEsZD1mLShmLWEpLHA9YS1kLGY9dnQqQyx5PWYtKGYtQyksbT1DLXksTT1wKm0tKHgtZCp5LXAqeS1kKm0pLEE9Yyp6LGY9dnQqYyxkPWYtKGYtYykscD1jLWQsZj12dCp6LHk9Zi0oZi16KSxtPXoteSxfPXAqbS0oQS1kKnktcCp5LWQqbSksZz1NLV8sdT1NLWcsQnRbMF09TS0oZyt1KSsodS1fKSxiPXgrZyx1PWIteCx3PXgtKGItdSkrKGctdSksZz13LUEsdT13LWcsQnRbMV09dy0oZyt1KSsodS1BKSxTPWIrZyx1PVMtYixCdFsyXT1iLShTLXUpKyhnLXUpLEJ0WzNdPVM7Y29uc3QgQj1HYSg0LGFpLDQsQnQscWgpO3g9RSpoLGY9dnQqRSxkPWYtKGYtRSkscD1FLWQsZj12dCpoLHk9Zi0oZi1oKSxtPWgteSxNPXAqbS0oeC1kKnktcCp5LWQqbSksQT12KmwsZj12dCp2LGQ9Zi0oZi12KSxwPXYtZCxmPXZ0KmwseT1mLShmLWwpLG09bC15LF89cCptLShBLWQqeS1wKnktZCptKSxnPU0tXyx1PU0tZyxCdFswXT1NLShnK3UpKyh1LV8pLGI9eCtnLHU9Yi14LHc9eC0oYi11KSsoZy11KSxnPXctQSx1PXctZyxCdFsxXT13LShnK3UpKyh1LUEpLFM9YitnLHU9Uy1iLEJ0WzJdPWItKFMtdSkrKGctdSksQnRbM109Uztjb25zdCBJPUdhKEIscWgsNCxCdCxIaCk7eD1hKmgsZj12dCphLGQ9Zi0oZi1hKSxwPWEtZCxmPXZ0KmgseT1mLShmLWgpLG09aC15LE09cCptLSh4LWQqeS1wKnktZCptKSxBPWMqbCxmPXZ0KmMsZD1mLShmLWMpLHA9Yy1kLGY9dnQqbCx5PWYtKGYtbCksbT1sLXksXz1wKm0tKEEtZCp5LXAqeS1kKm0pLGc9TS1fLHU9TS1nLEJ0WzBdPU0tKGcrdSkrKHUtXyksYj14K2csdT1iLXgsdz14LShiLXUpKyhnLXUpLGc9dy1BLHU9dy1nLEJ0WzFdPXctKGcrdSkrKHUtQSksUz1iK2csdT1TLWIsQnRbMl09Yi0oUy11KSsoZy11KSxCdFszXT1TO2NvbnN0IGs9R2EoSSxIaCw0LEJ0LFdoKTtyZXR1cm4gV2hbay0xXX1mdW5jdGlvbiBJcihpLHQsZSxuLHMscil7Y29uc3Qgbz0odC1yKSooZS1zKSxhPShpLXMpKihuLXIpLGM9by1hO2lmKG89PT0wfHxhPT09MHx8bz4wIT1hPjApcmV0dXJuIGM7Y29uc3QgbD1NYXRoLmFicyhvK2EpO3JldHVybiBNYXRoLmFicyhjKT49QnkqbD9jOi1reShpLHQsZSxuLHMscixsKX1jb25zdCBHaD1NYXRoLnBvdygyLC01Miksa3I9bmV3IFVpbnQzMkFycmF5KDUxMik7Y2xhc3Mgaml7c3RhdGljIGZyb20odCxlPUR5LG49JHkpe2NvbnN0IHM9dC5sZW5ndGgscj1uZXcgRmxvYXQ2NEFycmF5KHMqMik7Zm9yKGxldCBvPTA7bzxzO28rKyl7Y29uc3QgYT10W29dO3JbMipvXT1lKGEpLHJbMipvKzFdPW4oYSl9cmV0dXJuIG5ldyBqaShyKX1jb25zdHJ1Y3Rvcih0KXtjb25zdCBlPXQubGVuZ3RoPj4xO2lmKGU+MCYmdHlwZW9mIHRbMF0hPSJudW1iZXIiKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgY29vcmRzIHRvIGNvbnRhaW4gbnVtYmVycy4iKTt0aGlzLmNvb3Jkcz10O2NvbnN0IG49TWF0aC5tYXgoMiplLTUsMCk7dGhpcy5fdHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheShuKjMpLHRoaXMuX2hhbGZlZGdlcz1uZXcgSW50MzJBcnJheShuKjMpLHRoaXMuX2hhc2hTaXplPU1hdGguY2VpbChNYXRoLnNxcnQoZSkpLHRoaXMuX2h1bGxQcmV2PW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9odWxsTmV4dD1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbFRyaT1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbEhhc2g9bmV3IEludDMyQXJyYXkodGhpcy5faGFzaFNpemUpLmZpbGwoLTEpLHRoaXMuX2lkcz1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5fZGlzdHM9bmV3IEZsb2F0NjRBcnJheShlKSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSgpe2NvbnN0e2Nvb3Jkczp0LF9odWxsUHJldjplLF9odWxsTmV4dDpuLF9odWxsVHJpOnMsX2h1bGxIYXNoOnJ9PXRoaXMsbz10Lmxlbmd0aD4+MTtsZXQgYT0xLzAsYz0xLzAsbD0tMS8wLGg9LTEvMDtmb3IobGV0IHo9MDt6PG87eisrKXtjb25zdCB2PXRbMip6XSxDPXRbMip6KzFdO3Y8YSYmKGE9diksQzxjJiYoYz1DKSx2PmwmJihsPXYpLEM+aCYmKGg9QyksdGhpcy5faWRzW3pdPXp9Y29uc3QgdT0oYStsKS8yLGY9KGMraCkvMjtsZXQgZD0xLzAscCx5LG07Zm9yKGxldCB6PTA7ejxvO3orKyl7Y29uc3Qgdj1aYSh1LGYsdFsyKnpdLHRbMip6KzFdKTt2PGQmJihwPXosZD12KX1jb25zdCBnPXRbMipwXSxiPXRbMipwKzFdO2Q9MS8wO2ZvcihsZXQgej0wO3o8bzt6Kyspe2lmKHo9PT1wKWNvbnRpbnVlO2NvbnN0IHY9WmEoZyxiLHRbMip6XSx0WzIqeisxXSk7djxkJiZ2PjAmJih5PXosZD12KX1sZXQgdz10WzIqeV0seD10WzIqeSsxXSxNPTEvMDtmb3IobGV0IHo9MDt6PG87eisrKXtpZih6PT09cHx8ej09PXkpY29udGludWU7Y29uc3Qgdj1MeShnLGIsdyx4LHRbMip6XSx0WzIqeisxXSk7djxNJiYobT16LE09dil9bGV0IEE9dFsyKm1dLF89dFsyKm0rMV07aWYoTT09PTEvMCl7Zm9yKGxldCBDPTA7QzxvO0MrKyl0aGlzLl9kaXN0c1tDXT10WzIqQ10tdFswXXx8dFsyKkMrMV0tdFsxXTtjaSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpO2NvbnN0IHo9bmV3IFVpbnQzMkFycmF5KG8pO2xldCB2PTA7Zm9yKGxldCBDPTAsUD0tMS8wO0M8bztDKyspe2NvbnN0IEY9dGhpcy5faWRzW0NdO3RoaXMuX2Rpc3RzW0ZdPlAmJih6W3YrK109RixQPXRoaXMuX2Rpc3RzW0ZdKX10aGlzLmh1bGw9ei5zdWJhcnJheSgwLHYpLHRoaXMudHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheSgwKSx0aGlzLmhhbGZlZGdlcz1uZXcgVWludDMyQXJyYXkoMCk7cmV0dXJufWlmKElyKGcsYix3LHgsQSxfKTwwKXtjb25zdCB6PXksdj13LEM9eDt5PW0sdz1BLHg9XyxtPXosQT12LF89Q31jb25zdCBTPU95KGcsYix3LHgsQSxfKTt0aGlzLl9jeD1TLngsdGhpcy5fY3k9Uy55O2ZvcihsZXQgej0wO3o8bzt6KyspdGhpcy5fZGlzdHNbel09WmEodFsyKnpdLHRbMip6KzFdLFMueCxTLnkpO2NpKHRoaXMuX2lkcyx0aGlzLl9kaXN0cywwLG8tMSksdGhpcy5faHVsbFN0YXJ0PXA7bGV0IEU9MztuW3BdPWVbbV09eSxuW3ldPWVbcF09bSxuW21dPWVbeV09cCxzW3BdPTAsc1t5XT0xLHNbbV09MixyLmZpbGwoLTEpLHJbdGhpcy5faGFzaEtleShnLGIpXT1wLHJbdGhpcy5faGFzaEtleSh3LHgpXT15LHJbdGhpcy5faGFzaEtleShBLF8pXT1tLHRoaXMudHJpYW5nbGVzTGVuPTAsdGhpcy5fYWRkVHJpYW5nbGUocCx5LG0sLTEsLTEsLTEpO2ZvcihsZXQgej0wLHYsQzt6PHRoaXMuX2lkcy5sZW5ndGg7eisrKXtjb25zdCBQPXRoaXMuX2lkc1t6XSxGPXRbMipQXSxCPXRbMipQKzFdO2lmKHo+MCYmTWF0aC5hYnMoRi12KTw9R2gmJk1hdGguYWJzKEItQyk8PUdofHwodj1GLEM9QixQPT09cHx8UD09PXl8fFA9PT1tKSljb250aW51ZTtsZXQgST0wO2ZvcihsZXQgZHQ9MCxEdD10aGlzLl9oYXNoS2V5KEYsQik7ZHQ8dGhpcy5faGFzaFNpemUmJihJPXJbKER0K2R0KSV0aGlzLl9oYXNoU2l6ZV0sIShJIT09LTEmJkkhPT1uW0ldKSk7ZHQrKyk7ST1lW0ldO2xldCBrPUksRDtmb3IoO0Q9bltrXSxJcihGLEIsdFsyKmtdLHRbMiprKzFdLHRbMipEXSx0WzIqRCsxXSk+PTA7KWlmKGs9RCxrPT09SSl7az0tMTticmVha31pZihrPT09LTEpY29udGludWU7bGV0IFY9dGhpcy5fYWRkVHJpYW5nbGUoayxQLG5ba10sLTEsLTEsc1trXSk7c1tQXT10aGlzLl9sZWdhbGl6ZShWKzIpLHNba109VixFKys7bGV0IGo9bltrXTtmb3IoO0Q9bltqXSxJcihGLEIsdFsyKmpdLHRbMipqKzFdLHRbMipEXSx0WzIqRCsxXSk8MDspVj10aGlzLl9hZGRUcmlhbmdsZShqLFAsRCxzW1BdLC0xLHNbal0pLHNbUF09dGhpcy5fbGVnYWxpemUoVisyKSxuW2pdPWosRS0tLGo9RDtpZihrPT09SSlmb3IoO0Q9ZVtrXSxJcihGLEIsdFsyKkRdLHRbMipEKzFdLHRbMiprXSx0WzIqaysxXSk8MDspVj10aGlzLl9hZGRUcmlhbmdsZShELFAsaywtMSxzW2tdLHNbRF0pLHRoaXMuX2xlZ2FsaXplKFYrMiksc1tEXT1WLG5ba109ayxFLS0saz1EO3RoaXMuX2h1bGxTdGFydD1lW1BdPWssbltrXT1lW2pdPVAsbltQXT1qLHJbdGhpcy5faGFzaEtleShGLEIpXT1QLHJbdGhpcy5faGFzaEtleSh0WzIqa10sdFsyKmsrMV0pXT1rfXRoaXMuaHVsbD1uZXcgVWludDMyQXJyYXkoRSk7Zm9yKGxldCB6PTAsdj10aGlzLl9odWxsU3RhcnQ7ejxFO3orKyl0aGlzLmh1bGxbel09dix2PW5bdl07dGhpcy50cmlhbmdsZXM9dGhpcy5fdHJpYW5nbGVzLnN1YmFycmF5KDAsdGhpcy50cmlhbmdsZXNMZW4pLHRoaXMuaGFsZmVkZ2VzPXRoaXMuX2hhbGZlZGdlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKX1faGFzaEtleSh0LGUpe3JldHVybiBNYXRoLmZsb29yKE55KHQtdGhpcy5fY3gsZS10aGlzLl9jeSkqdGhpcy5faGFzaFNpemUpJXRoaXMuX2hhc2hTaXplfV9sZWdhbGl6ZSh0KXtjb25zdHtfdHJpYW5nbGVzOmUsX2hhbGZlZGdlczpuLGNvb3JkczpzfT10aGlzO2xldCByPTAsbz0wO2Zvcig7Oyl7Y29uc3QgYT1uW3RdLGM9dC10JTM7aWYobz1jKyh0KzIpJTMsYT09PS0xKXtpZihyPT09MClicmVhazt0PWtyWy0tcl07Y29udGludWV9Y29uc3QgbD1hLWElMyxoPWMrKHQrMSklMyx1PWwrKGErMiklMyxmPWVbb10sZD1lW3RdLHA9ZVtoXSx5PWVbdV07aWYoUnkoc1syKmZdLHNbMipmKzFdLHNbMipkXSxzWzIqZCsxXSxzWzIqcF0sc1syKnArMV0sc1syKnldLHNbMip5KzFdKSl7ZVt0XT15LGVbYV09Zjtjb25zdCBnPW5bdV07aWYoZz09PS0xKXtsZXQgdz10aGlzLl9odWxsU3RhcnQ7ZG97aWYodGhpcy5faHVsbFRyaVt3XT09PXUpe3RoaXMuX2h1bGxUcmlbd109dDticmVha313PXRoaXMuX2h1bGxQcmV2W3ddfXdoaWxlKHchPT10aGlzLl9odWxsU3RhcnQpfXRoaXMuX2xpbmsodCxnKSx0aGlzLl9saW5rKGEsbltvXSksdGhpcy5fbGluayhvLHUpO2NvbnN0IGI9bCsoYSsxKSUzO3I8a3IubGVuZ3RoJiYoa3JbcisrXT1iKX1lbHNle2lmKHI9PT0wKWJyZWFrO3Q9a3JbLS1yXX19cmV0dXJuIG99X2xpbmsodCxlKXt0aGlzLl9oYWxmZWRnZXNbdF09ZSxlIT09LTEmJih0aGlzLl9oYWxmZWRnZXNbZV09dCl9X2FkZFRyaWFuZ2xlKHQsZSxuLHMscixvKXtjb25zdCBhPXRoaXMudHJpYW5nbGVzTGVuO3JldHVybiB0aGlzLl90cmlhbmdsZXNbYV09dCx0aGlzLl90cmlhbmdsZXNbYSsxXT1lLHRoaXMuX3RyaWFuZ2xlc1thKzJdPW4sdGhpcy5fbGluayhhLHMpLHRoaXMuX2xpbmsoYSsxLHIpLHRoaXMuX2xpbmsoYSsyLG8pLHRoaXMudHJpYW5nbGVzTGVuKz0zLGF9fWZ1bmN0aW9uIE55KGksdCl7Y29uc3QgZT1pLyhNYXRoLmFicyhpKStNYXRoLmFicyh0KSk7cmV0dXJuKHQ+MD8zLWU6MStlKS80fWZ1bmN0aW9uIFphKGksdCxlLG4pe2NvbnN0IHM9aS1lLHI9dC1uO3JldHVybiBzKnMrcipyfWZ1bmN0aW9uIFJ5KGksdCxlLG4scyxyLG8sYSl7Y29uc3QgYz1pLW8sbD10LWEsaD1lLW8sdT1uLWEsZj1zLW8sZD1yLWEscD1jKmMrbCpsLHk9aCpoK3UqdSxtPWYqZitkKmQ7cmV0dXJuIGMqKHUqbS15KmQpLWwqKGgqbS15KmYpK3AqKGgqZC11KmYpPDB9ZnVuY3Rpb24gTHkoaSx0LGUsbixzLHIpe2NvbnN0IG89ZS1pLGE9bi10LGM9cy1pLGw9ci10LGg9bypvK2EqYSx1PWMqYytsKmwsZj0uNS8obypsLWEqYyksZD0obCpoLWEqdSkqZixwPShvKnUtYypoKSpmO3JldHVybiBkKmQrcCpwfWZ1bmN0aW9uIE95KGksdCxlLG4scyxyKXtjb25zdCBvPWUtaSxhPW4tdCxjPXMtaSxsPXItdCxoPW8qbythKmEsdT1jKmMrbCpsLGY9LjUvKG8qbC1hKmMpLGQ9aSsobCpoLWEqdSkqZixwPXQrKG8qdS1jKmgpKmY7cmV0dXJue3g6ZCx5OnB9fWZ1bmN0aW9uIGNpKGksdCxlLG4pe2lmKG4tZTw9MjApZm9yKGxldCBzPWUrMTtzPD1uO3MrKyl7Y29uc3Qgcj1pW3NdLG89dFtyXTtsZXQgYT1zLTE7Zm9yKDthPj1lJiZ0W2lbYV1dPm87KWlbYSsxXT1pW2EtLV07aVthKzFdPXJ9ZWxzZXtjb25zdCBzPWUrbj4+MTtsZXQgcj1lKzEsbz1uO1FpKGkscyxyKSx0W2lbZV1dPnRbaVtuXV0mJlFpKGksZSxuKSx0W2lbcl1dPnRbaVtuXV0mJlFpKGkscixuKSx0W2lbZV1dPnRbaVtyXV0mJlFpKGksZSxyKTtjb25zdCBhPWlbcl0sYz10W2FdO2Zvcig7Oyl7ZG8gcisrO3doaWxlKHRbaVtyXV08Yyk7ZG8gby0tO3doaWxlKHRbaVtvXV0+Yyk7aWYobzxyKWJyZWFrO1FpKGkscixvKX1pW2UrMV09aVtvXSxpW29dPWEsbi1yKzE+PW8tZT8oY2koaSx0LHIsbiksY2koaSx0LGUsby0xKSk6KGNpKGksdCxlLG8tMSksY2koaSx0LHIsbikpfX1mdW5jdGlvbiBRaShpLHQsZSl7Y29uc3Qgbj1pW3RdO2lbdF09aVtlXSxpW2VdPW59ZnVuY3Rpb24gRHkoaSl7cmV0dXJuIGlbMF19ZnVuY3Rpb24gJHkoaSl7cmV0dXJuIGlbMV19ZnVuY3Rpb24gVXkoaSx0KXt2YXIgZT0wLG49MCxzPTAscj0wLG89MCxhPTAsYz0wLGw9MCxoPW51bGwsdT1udWxsLGY9aVswXSxkPWlbMV0scD10Lmxlbmd0aDtmb3IoZTtlPHA7ZSsrKXtuPTA7dmFyIHk9dFtlXS5sZW5ndGgtMSxtPXRbZV07aWYoaD1tWzBdLGhbMF0hPT1tW3ldWzBdJiZoWzFdIT09bVt5XVsxXSl0aHJvdyBuZXcgRXJyb3IoIkZpcnN0IGFuZCBsYXN0IGNvb3JkaW5hdGVzIGluIGEgcmluZyBtdXN0IGJlIHRoZSBzYW1lIik7Zm9yKG89aFswXS1mLGE9aFsxXS1kLG47bjx5O24rKyl7aWYodT1tW24rMV0sbD11WzFdLWQsYTwwJiZsPDB8fGE+MCYmbD4wKXtoPXUsYT1sLG89aFswXS1mO2NvbnRpbnVlfWlmKGM9dVswXS1pWzBdLGw+MCYmYTw9MCl7aWYocj1vKmwtYyphLHI+MClzPXMrMTtlbHNlIGlmKHI9PT0wKXJldHVybiAwfWVsc2UgaWYoYT4wJiZsPD0wKXtpZihyPW8qbC1jKmEscjwwKXM9cysxO2Vsc2UgaWYocj09PTApcmV0dXJuIDB9ZWxzZSBpZihsPT09MCYmYTwwKXtpZihyPW8qbC1jKmEscj09PTApcmV0dXJuIDB9ZWxzZSBpZihhPT09MCYmbDwwKXtpZihyPW8qbC1jKmEscj09PTApcmV0dXJuIDB9ZWxzZSBpZihhPT09MCYmbD09PTApe2lmKGM8PTAmJm8+PTApcmV0dXJuIDA7aWYobzw9MCYmYz49MClyZXR1cm4gMH1oPXUsYT1sLG89Y319cmV0dXJuIHMlMiE9PTB9ZnVuY3Rpb24gVnkoaSx0LGU9e30pe2lmKCFpKXRocm93IG5ldyBFcnJvcigicG9pbnQgaXMgcmVxdWlyZWQiKTtpZighdCl0aHJvdyBuZXcgRXJyb3IoInBvbHlnb24gaXMgcmVxdWlyZWQiKTtjb25zdCBuPVN5KGkpLHM9enkodCkscj1zLnR5cGUsbz10LmJib3g7bGV0IGE9cy5jb29yZGluYXRlcztpZihvJiZxeShuLG8pPT09ITEpcmV0dXJuITE7cj09PSJQb2x5Z29uIiYmKGE9W2FdKTtsZXQgYz0hMTtmb3IodmFyIGw9MDtsPGEubGVuZ3RoOysrbCl7Y29uc3QgaD1VeShuLGFbbF0pO2lmKGg9PT0wKXJldHVybiFlLmlnbm9yZUJvdW5kYXJ5O2gmJihjPSEwKX1yZXR1cm4gY31mdW5jdGlvbiBxeShpLHQpe3JldHVybiB0WzBdPD1pWzBdJiZ0WzFdPD1pWzFdJiZ0WzJdPj1pWzBdJiZ0WzNdPj1pWzFdfXZhciBIeT1WeTtjb25zdCBaaD0xZS02O2NsYXNzIHZue2NvbnN0cnVjdG9yKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9bW92ZVRvKHQsZSl7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K2V9YH1jbG9zZVBhdGgoKXt0aGlzLl94MSE9PW51bGwmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9bGluZVRvKHQsZSl7dGhpcy5fKz1gTCR7dGhpcy5feDE9K3R9LCR7dGhpcy5feTE9K2V9YH1hcmModCxlLG4pe3Q9K3QsZT0rZSxuPStuO2NvbnN0IHM9dCtuLHI9ZTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXMiKTt0aGlzLl94MT09PW51bGw/dGhpcy5fKz1gTSR7c30sJHtyfWA6KE1hdGguYWJzKHRoaXMuX3gxLXMpPlpofHxNYXRoLmFicyh0aGlzLl95MS1yKT5aaCkmJih0aGlzLl8rPSJMIitzKyIsIityKSxuJiYodGhpcy5fKz1gQSR7bn0sJHtufSwwLDEsMSwke3Qtbn0sJHtlfUEke259LCR7bn0sMCwxLDEsJHt0aGlzLl94MT1zfSwke3RoaXMuX3kxPXJ9YCl9cmVjdCh0LGUsbixzKXt0aGlzLl8rPWBNJHt0aGlzLl94MD10aGlzLl94MT0rdH0sJHt0aGlzLl95MD10aGlzLl95MT0rZX1oJHsrbn12JHsrc31oJHstbn1aYH12YWx1ZSgpe3JldHVybiB0aGlzLl98fG51bGx9fWNsYXNzIFhhe2NvbnN0cnVjdG9yKCl7dGhpcy5fPVtdfW1vdmVUbyh0LGUpe3RoaXMuXy5wdXNoKFt0LGVdKX1jbG9zZVBhdGgoKXt0aGlzLl8ucHVzaCh0aGlzLl9bMF0uc2xpY2UoKSl9bGluZVRvKHQsZSl7dGhpcy5fLnB1c2goW3QsZV0pfXZhbHVlKCl7cmV0dXJuIHRoaXMuXy5sZW5ndGg/dGhpcy5fOm51bGx9fWNsYXNzIFd5e2NvbnN0cnVjdG9yKHQsW2UsbixzLHJdPVswLDAsOTYwLDUwMF0pe2lmKCEoKHM9K3MpPj0oZT0rZSkpfHwhKChyPStyKT49KG49K24pKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYm91bmRzIik7dGhpcy5kZWxhdW5heT10LHRoaXMuX2NpcmN1bWNlbnRlcnM9bmV3IEZsb2F0NjRBcnJheSh0LnBvaW50cy5sZW5ndGgqMiksdGhpcy52ZWN0b3JzPW5ldyBGbG9hdDY0QXJyYXkodC5wb2ludHMubGVuZ3RoKjIpLHRoaXMueG1heD1zLHRoaXMueG1pbj1lLHRoaXMueW1heD1yLHRoaXMueW1pbj1uLHRoaXMuX2luaXQoKX11cGRhdGUoKXtyZXR1cm4gdGhpcy5kZWxhdW5heS51cGRhdGUoKSx0aGlzLl9pbml0KCksdGhpc31faW5pdCgpe2NvbnN0e2RlbGF1bmF5Ontwb2ludHM6dCxodWxsOmUsdHJpYW5nbGVzOm59LHZlY3RvcnM6c309dGhpcyxyPXRoaXMuY2lyY3VtY2VudGVycz10aGlzLl9jaXJjdW1jZW50ZXJzLnN1YmFycmF5KDAsbi5sZW5ndGgvMyoyKTtmb3IobGV0IGQ9MCxwPTAseT1uLmxlbmd0aCxtLGc7ZDx5O2QrPTMscCs9Mil7Y29uc3QgYj1uW2RdKjIsdz1uW2QrMV0qMix4PW5bZCsyXSoyLE09dFtiXSxBPXRbYisxXSxfPXRbd10sUz10W3crMV0sRT10W3hdLHo9dFt4KzFdLHY9Xy1NLEM9Uy1BLFA9RS1NLEY9ei1BLEI9KHYqRi1DKlApKjI7aWYoTWF0aC5hYnMoQik8MWUtOSl7bGV0IEk9MWU5O2NvbnN0IGs9blswXSoyO0kqPU1hdGguc2lnbigodFtrXS1NKSpGLSh0W2srMV0tQSkqUCksbT0oTStFKS8yLUkqRixnPShBK3opLzIrSSpQfWVsc2V7Y29uc3QgST0xL0Isaz12KnYrQypDLEQ9UCpQK0YqRjttPU0rKEYqay1DKkQpKkksZz1BKyh2KkQtUCprKSpJfXJbcF09bSxyW3ArMV09Z31sZXQgbz1lW2UubGVuZ3RoLTFdLGEsYz1vKjQsbCxoPXRbMipvXSx1LGY9dFsyKm8rMV07cy5maWxsKDApO2ZvcihsZXQgZD0wO2Q8ZS5sZW5ndGg7KytkKW89ZVtkXSxhPWMsbD1oLHU9ZixjPW8qNCxoPXRbMipvXSxmPXRbMipvKzFdLHNbYSsyXT1zW2NdPXUtZixzW2ErM109c1tjKzFdPWgtbH1yZW5kZXIodCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IHZuOnZvaWQgMCx7ZGVsYXVuYXk6e2hhbGZlZGdlczpuLGluZWRnZXM6cyxodWxsOnJ9LGNpcmN1bWNlbnRlcnM6byx2ZWN0b3JzOmF9PXRoaXM7aWYoci5sZW5ndGg8PTEpcmV0dXJuIG51bGw7Zm9yKGxldCBoPTAsdT1uLmxlbmd0aDtoPHU7KytoKXtjb25zdCBmPW5baF07aWYoZjxoKWNvbnRpbnVlO2NvbnN0IGQ9TWF0aC5mbG9vcihoLzMpKjIscD1NYXRoLmZsb29yKGYvMykqMix5PW9bZF0sbT1vW2QrMV0sZz1vW3BdLGI9b1twKzFdO3RoaXMuX3JlbmRlclNlZ21lbnQoeSxtLGcsYix0KX1sZXQgYyxsPXJbci5sZW5ndGgtMV07Zm9yKGxldCBoPTA7aDxyLmxlbmd0aDsrK2gpe2M9bCxsPXJbaF07Y29uc3QgdT1NYXRoLmZsb29yKHNbbF0vMykqMixmPW9bdV0sZD1vW3UrMV0scD1jKjQseT10aGlzLl9wcm9qZWN0KGYsZCxhW3ArMl0sYVtwKzNdKTt5JiZ0aGlzLl9yZW5kZXJTZWdtZW50KGYsZCx5WzBdLHlbMV0sdCl9cmV0dXJuIGUmJmUudmFsdWUoKX1yZW5kZXJCb3VuZHModCl7Y29uc3QgZT10PT1udWxsP3Q9bmV3IHZuOnZvaWQgMDtyZXR1cm4gdC5yZWN0KHRoaXMueG1pbix0aGlzLnltaW4sdGhpcy54bWF4LXRoaXMueG1pbix0aGlzLnltYXgtdGhpcy55bWluKSxlJiZlLnZhbHVlKCl9cmVuZGVyQ2VsbCh0LGUpe2NvbnN0IG49ZT09bnVsbD9lPW5ldyB2bjp2b2lkIDAscz10aGlzLl9jbGlwKHQpO2lmKHM9PT1udWxsfHwhcy5sZW5ndGgpcmV0dXJuO2UubW92ZVRvKHNbMF0sc1sxXSk7bGV0IHI9cy5sZW5ndGg7Zm9yKDtzWzBdPT09c1tyLTJdJiZzWzFdPT09c1tyLTFdJiZyPjE7KXItPTI7Zm9yKGxldCBvPTI7bzxyO28rPTIpKHNbb10hPT1zW28tMl18fHNbbysxXSE9PXNbby0xXSkmJmUubGluZVRvKHNbb10sc1tvKzFdKTtyZXR1cm4gZS5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9KmNlbGxQb2x5Z29ucygpe2NvbnN0e2RlbGF1bmF5Ontwb2ludHM6dH19PXRoaXM7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aC8yO2U8bjsrK2Upe2NvbnN0IHM9dGhpcy5jZWxsUG9seWdvbihlKTtzJiYocy5pbmRleD1lLHlpZWxkIHMpfX1jZWxsUG9seWdvbih0KXtjb25zdCBlPW5ldyBYYTtyZXR1cm4gdGhpcy5yZW5kZXJDZWxsKHQsZSksZS52YWx1ZSgpfV9yZW5kZXJTZWdtZW50KHQsZSxuLHMscil7bGV0IG87Y29uc3QgYT10aGlzLl9yZWdpb25jb2RlKHQsZSksYz10aGlzLl9yZWdpb25jb2RlKG4scyk7YT09PTAmJmM9PT0wPyhyLm1vdmVUbyh0LGUpLHIubGluZVRvKG4scykpOihvPXRoaXMuX2NsaXBTZWdtZW50KHQsZSxuLHMsYSxjKSkmJihyLm1vdmVUbyhvWzBdLG9bMV0pLHIubGluZVRvKG9bMl0sb1szXSkpfWNvbnRhaW5zKHQsZSxuKXtyZXR1cm4gZT0rZSxlIT09ZXx8KG49K24sbiE9PW4pPyExOnRoaXMuZGVsYXVuYXkuX3N0ZXAodCxlLG4pPT09dH0qbmVpZ2hib3JzKHQpe2NvbnN0IGU9dGhpcy5fY2xpcCh0KTtpZihlKWZvcihjb25zdCBuIG9mIHRoaXMuZGVsYXVuYXkubmVpZ2hib3JzKHQpKXtjb25zdCBzPXRoaXMuX2NsaXAobik7aWYocyl7dDpmb3IobGV0IHI9MCxvPWUubGVuZ3RoO3I8bztyKz0yKWZvcihsZXQgYT0wLGM9cy5sZW5ndGg7YTxjO2ErPTIpaWYoZVtyXT09c1thXSYmZVtyKzFdPT1zW2ErMV0mJmVbKHIrMiklb109PXNbKGErYy0yKSVjXSYmZVsociszKSVvXT09c1soYStjLTEpJWNdKXt5aWVsZCBuO2JyZWFrIHR9fX19X2NlbGwodCl7Y29uc3R7Y2lyY3VtY2VudGVyczplLGRlbGF1bmF5OntpbmVkZ2VzOm4saGFsZmVkZ2VzOnMsdHJpYW5nbGVzOnJ9fT10aGlzLG89blt0XTtpZihvPT09LTEpcmV0dXJuIG51bGw7Y29uc3QgYT1bXTtsZXQgYz1vO2Rve2NvbnN0IGw9TWF0aC5mbG9vcihjLzMpO2lmKGEucHVzaChlW2wqMl0sZVtsKjIrMV0pLGM9YyUzPT09Mj9jLTI6YysxLHJbY10hPT10KWJyZWFrO2M9c1tjXX13aGlsZShjIT09byYmYyE9PS0xKTtyZXR1cm4gYX1fY2xpcCh0KXtpZih0PT09MCYmdGhpcy5kZWxhdW5heS5odWxsLmxlbmd0aD09PTEpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO2NvbnN0IGU9dGhpcy5fY2VsbCh0KTtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtjb25zdHt2ZWN0b3JzOm59PXRoaXMscz10KjQ7cmV0dXJuIG5bc118fG5bcysxXT90aGlzLl9jbGlwSW5maW5pdGUodCxlLG5bc10sbltzKzFdLG5bcysyXSxuW3MrM10pOnRoaXMuX2NsaXBGaW5pdGUodCxlKX1fY2xpcEZpbml0ZSh0LGUpe2NvbnN0IG49ZS5sZW5ndGg7bGV0IHM9bnVsbCxyLG8sYT1lW24tMl0sYz1lW24tMV0sbCxoPXRoaXMuX3JlZ2lvbmNvZGUoYSxjKSx1LGY9MDtmb3IobGV0IGQ9MDtkPG47ZCs9MilpZihyPWEsbz1jLGE9ZVtkXSxjPWVbZCsxXSxsPWgsaD10aGlzLl9yZWdpb25jb2RlKGEsYyksbD09PTAmJmg9PT0wKXU9ZixmPTAscz9zLnB1c2goYSxjKTpzPVthLGNdO2Vsc2V7bGV0IHAseSxtLGcsYjtpZihsPT09MCl7aWYoKHA9dGhpcy5fY2xpcFNlZ21lbnQocixvLGEsYyxsLGgpKT09PW51bGwpY29udGludWU7W3ksbSxnLGJdPXB9ZWxzZXtpZigocD10aGlzLl9jbGlwU2VnbWVudChhLGMscixvLGgsbCkpPT09bnVsbCljb250aW51ZTtbZyxiLHksbV09cCx1PWYsZj10aGlzLl9lZGdlY29kZSh5LG0pLHUmJmYmJnRoaXMuX2VkZ2UodCx1LGYscyxzLmxlbmd0aCkscz9zLnB1c2goeSxtKTpzPVt5LG1dfXU9ZixmPXRoaXMuX2VkZ2Vjb2RlKGcsYiksdSYmZiYmdGhpcy5fZWRnZSh0LHUsZixzLHMubGVuZ3RoKSxzP3MucHVzaChnLGIpOnM9W2csYl19aWYocyl1PWYsZj10aGlzLl9lZGdlY29kZShzWzBdLHNbMV0pLHUmJmYmJnRoaXMuX2VkZ2UodCx1LGYscyxzLmxlbmd0aCk7ZWxzZSBpZih0aGlzLmNvbnRhaW5zKHQsKHRoaXMueG1pbit0aGlzLnhtYXgpLzIsKHRoaXMueW1pbit0aGlzLnltYXgpLzIpKXJldHVyblt0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWluXTtyZXR1cm4gc31fY2xpcFNlZ21lbnQodCxlLG4scyxyLG8pe2Zvcig7Oyl7aWYocj09PTAmJm89PT0wKXJldHVyblt0LGUsbixzXTtpZihyJm8pcmV0dXJuIG51bGw7bGV0IGEsYyxsPXJ8fG87bCY4PyhhPXQrKG4tdCkqKHRoaXMueW1heC1lKS8ocy1lKSxjPXRoaXMueW1heCk6bCY0PyhhPXQrKG4tdCkqKHRoaXMueW1pbi1lKS8ocy1lKSxjPXRoaXMueW1pbik6bCYyPyhjPWUrKHMtZSkqKHRoaXMueG1heC10KS8obi10KSxhPXRoaXMueG1heCk6KGM9ZSsocy1lKSoodGhpcy54bWluLXQpLyhuLXQpLGE9dGhpcy54bWluKSxyPyh0PWEsZT1jLHI9dGhpcy5fcmVnaW9uY29kZSh0LGUpKToobj1hLHM9YyxvPXRoaXMuX3JlZ2lvbmNvZGUobixzKSl9fV9jbGlwSW5maW5pdGUodCxlLG4scyxyLG8pe2xldCBhPUFycmF5LmZyb20oZSksYztpZigoYz10aGlzLl9wcm9qZWN0KGFbMF0sYVsxXSxuLHMpKSYmYS51bnNoaWZ0KGNbMF0sY1sxXSksKGM9dGhpcy5fcHJvamVjdChhW2EubGVuZ3RoLTJdLGFbYS5sZW5ndGgtMV0scixvKSkmJmEucHVzaChjWzBdLGNbMV0pLGE9dGhpcy5fY2xpcEZpbml0ZSh0LGEpKWZvcihsZXQgbD0wLGg9YS5sZW5ndGgsdSxmPXRoaXMuX2VkZ2Vjb2RlKGFbaC0yXSxhW2gtMV0pO2w8aDtsKz0yKXU9ZixmPXRoaXMuX2VkZ2Vjb2RlKGFbbF0sYVtsKzFdKSx1JiZmJiYobD10aGlzLl9lZGdlKHQsdSxmLGEsbCksaD1hLmxlbmd0aCk7ZWxzZSB0aGlzLmNvbnRhaW5zKHQsKHRoaXMueG1pbit0aGlzLnhtYXgpLzIsKHRoaXMueW1pbit0aGlzLnltYXgpLzIpJiYoYT1bdGhpcy54bWluLHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heF0pO3JldHVybiBhfV9lZGdlKHQsZSxuLHMscil7Zm9yKDtlIT09bjspe2xldCBvLGE7c3dpdGNoKGUpe2Nhc2UgNTplPTQ7Y29udGludWU7Y2FzZSA0OmU9NixvPXRoaXMueG1heCxhPXRoaXMueW1pbjticmVhaztjYXNlIDY6ZT0yO2NvbnRpbnVlO2Nhc2UgMjplPTEwLG89dGhpcy54bWF4LGE9dGhpcy55bWF4O2JyZWFrO2Nhc2UgMTA6ZT04O2NvbnRpbnVlO2Nhc2UgODplPTksbz10aGlzLnhtaW4sYT10aGlzLnltYXg7YnJlYWs7Y2FzZSA5OmU9MTtjb250aW51ZTtjYXNlIDE6ZT01LG89dGhpcy54bWluLGE9dGhpcy55bWluO2JyZWFrfShzW3JdIT09b3x8c1tyKzFdIT09YSkmJnRoaXMuY29udGFpbnModCxvLGEpJiYocy5zcGxpY2UociwwLG8sYSkscis9Mil9aWYocy5sZW5ndGg+NClmb3IobGV0IG89MDtvPHMubGVuZ3RoO28rPTIpe2NvbnN0IGE9KG8rMiklcy5sZW5ndGgsYz0obys0KSVzLmxlbmd0aDsoc1tvXT09PXNbYV0mJnNbYV09PT1zW2NdfHxzW28rMV09PT1zW2ErMV0mJnNbYSsxXT09PXNbYysxXSkmJihzLnNwbGljZShhLDIpLG8tPTIpfXJldHVybiByfV9wcm9qZWN0KHQsZSxuLHMpe2xldCByPTEvMCxvLGEsYztpZihzPDApe2lmKGU8PXRoaXMueW1pbilyZXR1cm4gbnVsbDsobz0odGhpcy55bWluLWUpL3MpPHImJihjPXRoaXMueW1pbixhPXQrKHI9bykqbil9ZWxzZSBpZihzPjApe2lmKGU+PXRoaXMueW1heClyZXR1cm4gbnVsbDsobz0odGhpcy55bWF4LWUpL3MpPHImJihjPXRoaXMueW1heCxhPXQrKHI9bykqbil9aWYobj4wKXtpZih0Pj10aGlzLnhtYXgpcmV0dXJuIG51bGw7KG89KHRoaXMueG1heC10KS9uKTxyJiYoYT10aGlzLnhtYXgsYz1lKyhyPW8pKnMpfWVsc2UgaWYobjwwKXtpZih0PD10aGlzLnhtaW4pcmV0dXJuIG51bGw7KG89KHRoaXMueG1pbi10KS9uKTxyJiYoYT10aGlzLnhtaW4sYz1lKyhyPW8pKnMpfXJldHVyblthLGNdfV9lZGdlY29kZSh0LGUpe3JldHVybih0PT09dGhpcy54bWluPzE6dD09PXRoaXMueG1heD8yOjApfChlPT09dGhpcy55bWluPzQ6ZT09PXRoaXMueW1heD84OjApfV9yZWdpb25jb2RlKHQsZSl7cmV0dXJuKHQ8dGhpcy54bWluPzE6dD50aGlzLnhtYXg/MjowKXwoZTx0aGlzLnltaW4/NDplPnRoaXMueW1heD84OjApfX1jb25zdCBHeT0yKk1hdGguUEksbGk9TWF0aC5wb3c7ZnVuY3Rpb24gWnkoaSl7cmV0dXJuIGlbMF19ZnVuY3Rpb24gWHkoaSl7cmV0dXJuIGlbMV19ZnVuY3Rpb24gSnkoaSl7Y29uc3R7dHJpYW5nbGVzOnQsY29vcmRzOmV9PWk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKz0zKXtjb25zdCBzPTIqdFtuXSxyPTIqdFtuKzFdLG89Mip0W24rMl07aWYoKGVbb10tZVtzXSkqKGVbcisxXS1lW3MrMV0pLShlW3JdLWVbc10pKihlW28rMV0tZVtzKzFdKT4xZS0xMClyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBZeShpLHQsZSl7cmV0dXJuW2krTWF0aC5zaW4oaSt0KSplLHQrTWF0aC5jb3MoaS10KSplXX1jbGFzcyBKYXtzdGF0aWMgZnJvbSh0LGU9Wnksbj1YeSxzKXtyZXR1cm4gbmV3IEphKCJsZW5ndGgiaW4gdD9qeSh0LGUsbixzKTpGbG9hdDY0QXJyYXkuZnJvbShReSh0LGUsbixzKSkpfWNvbnN0cnVjdG9yKHQpe3RoaXMuX2RlbGF1bmF0b3I9bmV3IGppKHQpLHRoaXMuaW5lZGdlcz1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aC8yKSx0aGlzLl9odWxsSW5kZXg9bmV3IEludDMyQXJyYXkodC5sZW5ndGgvMiksdGhpcy5wb2ludHM9dGhpcy5fZGVsYXVuYXRvci5jb29yZHMsdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLl9kZWxhdW5hdG9yLnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3QgdD10aGlzLl9kZWxhdW5hdG9yLGU9dGhpcy5wb2ludHM7aWYodC5odWxsJiZ0Lmh1bGwubGVuZ3RoPjImJkp5KHQpKXt0aGlzLmNvbGxpbmVhcj1JbnQzMkFycmF5LmZyb20oe2xlbmd0aDplLmxlbmd0aC8yfSwoZixkKT0+ZCkuc29ydCgoZixkKT0+ZVsyKmZdLWVbMipkXXx8ZVsyKmYrMV0tZVsyKmQrMV0pO2NvbnN0IGM9dGhpcy5jb2xsaW5lYXJbMF0sbD10aGlzLmNvbGxpbmVhclt0aGlzLmNvbGxpbmVhci5sZW5ndGgtMV0saD1bZVsyKmNdLGVbMipjKzFdLGVbMipsXSxlWzIqbCsxXV0sdT0xZS04Kk1hdGguaHlwb3QoaFszXS1oWzFdLGhbMl0taFswXSk7Zm9yKGxldCBmPTAsZD1lLmxlbmd0aC8yO2Y8ZDsrK2Ype2NvbnN0IHA9WXkoZVsyKmZdLGVbMipmKzFdLHUpO2VbMipmXT1wWzBdLGVbMipmKzFdPXBbMV19dGhpcy5fZGVsYXVuYXRvcj1uZXcgamkoZSl9ZWxzZSBkZWxldGUgdGhpcy5jb2xsaW5lYXI7Y29uc3Qgbj10aGlzLmhhbGZlZGdlcz10aGlzLl9kZWxhdW5hdG9yLmhhbGZlZGdlcyxzPXRoaXMuaHVsbD10aGlzLl9kZWxhdW5hdG9yLmh1bGwscj10aGlzLnRyaWFuZ2xlcz10aGlzLl9kZWxhdW5hdG9yLnRyaWFuZ2xlcyxvPXRoaXMuaW5lZGdlcy5maWxsKC0xKSxhPXRoaXMuX2h1bGxJbmRleC5maWxsKC0xKTtmb3IobGV0IGM9MCxsPW4ubGVuZ3RoO2M8bDsrK2Mpe2NvbnN0IGg9cltjJTM9PT0yP2MtMjpjKzFdOyhuW2NdPT09LTF8fG9baF09PT0tMSkmJihvW2hdPWMpfWZvcihsZXQgYz0wLGw9cy5sZW5ndGg7YzxsOysrYylhW3NbY11dPWM7cy5sZW5ndGg8PTImJnMubGVuZ3RoPjAmJih0aGlzLnRyaWFuZ2xlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLmhhbGZlZGdlcz1uZXcgSW50MzJBcnJheSgzKS5maWxsKC0xKSx0aGlzLnRyaWFuZ2xlc1swXT1zWzBdLG9bc1swXV09MSxzLmxlbmd0aD09PTImJihvW3NbMV1dPTAsdGhpcy50cmlhbmdsZXNbMV09c1sxXSx0aGlzLnRyaWFuZ2xlc1syXT1zWzFdKSl9dm9yb25vaSh0KXtyZXR1cm4gbmV3IFd5KHRoaXMsdCl9Km5laWdoYm9ycyh0KXtjb25zdHtpbmVkZ2VzOmUsaHVsbDpuLF9odWxsSW5kZXg6cyxoYWxmZWRnZXM6cix0cmlhbmdsZXM6byxjb2xsaW5lYXI6YX09dGhpcztpZihhKXtjb25zdCB1PWEuaW5kZXhPZih0KTt1PjAmJih5aWVsZCBhW3UtMV0pLHU8YS5sZW5ndGgtMSYmKHlpZWxkIGFbdSsxXSk7cmV0dXJufWNvbnN0IGM9ZVt0XTtpZihjPT09LTEpcmV0dXJuO2xldCBsPWMsaD0tMTtkb3tpZih5aWVsZCBoPW9bbF0sbD1sJTM9PT0yP2wtMjpsKzEsb1tsXSE9PXQpcmV0dXJuO2lmKGw9cltsXSxsPT09LTEpe2NvbnN0IHU9blsoc1t0XSsxKSVuLmxlbmd0aF07dSE9PWgmJih5aWVsZCB1KTtyZXR1cm59fXdoaWxlKGwhPT1jKX1maW5kKHQsZSxuPTApe2lmKHQ9K3QsdCE9PXR8fChlPStlLGUhPT1lKSlyZXR1cm4tMTtjb25zdCBzPW47bGV0IHI7Zm9yKDsocj10aGlzLl9zdGVwKG4sdCxlKSk+PTAmJnIhPT1uJiZyIT09czspbj1yO3JldHVybiByfV9zdGVwKHQsZSxuKXtjb25zdHtpbmVkZ2VzOnMsaHVsbDpyLF9odWxsSW5kZXg6byxoYWxmZWRnZXM6YSx0cmlhbmdsZXM6Yyxwb2ludHM6bH09dGhpcztpZihzW3RdPT09LTF8fCFsLmxlbmd0aClyZXR1cm4odCsxKSUobC5sZW5ndGg+PjEpO2xldCBoPXQsdT1saShlLWxbdCoyXSwyKStsaShuLWxbdCoyKzFdLDIpO2NvbnN0IGY9c1t0XTtsZXQgZD1mO2Rve2xldCBwPWNbZF07Y29uc3QgeT1saShlLWxbcCoyXSwyKStsaShuLWxbcCoyKzFdLDIpO2lmKHk8dSYmKHU9eSxoPXApLGQ9ZCUzPT09Mj9kLTI6ZCsxLGNbZF0hPT10KWJyZWFrO2lmKGQ9YVtkXSxkPT09LTEpe2lmKGQ9clsob1t0XSsxKSVyLmxlbmd0aF0sZCE9PXAmJmxpKGUtbFtkKjJdLDIpK2xpKG4tbFtkKjIrMV0sMik8dSlyZXR1cm4gZDticmVha319d2hpbGUoZCE9PWYpO3JldHVybiBofXJlbmRlcih0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgdm46dm9pZCAwLHtwb2ludHM6bixoYWxmZWRnZXM6cyx0cmlhbmdsZXM6cn09dGhpcztmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YTsrK28pe2NvbnN0IGM9c1tvXTtpZihjPG8pY29udGludWU7Y29uc3QgbD1yW29dKjIsaD1yW2NdKjI7dC5tb3ZlVG8obltsXSxuW2wrMV0pLHQubGluZVRvKG5baF0sbltoKzFdKX1yZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLGUmJmUudmFsdWUoKX1yZW5kZXJQb2ludHModCxlKXtlPT09dm9pZCAwJiYoIXR8fHR5cGVvZiB0Lm1vdmVUbyE9ImZ1bmN0aW9uIikmJihlPXQsdD1udWxsKSxlPWU9PW51bGw/MjorZTtjb25zdCBuPXQ9PW51bGw/dD1uZXcgdm46dm9pZCAwLHtwb2ludHM6c309dGhpcztmb3IobGV0IHI9MCxvPXMubGVuZ3RoO3I8bztyKz0yKXtjb25zdCBhPXNbcl0sYz1zW3IrMV07dC5tb3ZlVG8oYStlLGMpLHQuYXJjKGEsYyxlLDAsR3kpfXJldHVybiBuJiZuLnZhbHVlKCl9cmVuZGVySHVsbCh0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgdm46dm9pZCAwLHtodWxsOm4scG9pbnRzOnN9PXRoaXMscj1uWzBdKjIsbz1uLmxlbmd0aDt0Lm1vdmVUbyhzW3JdLHNbcisxXSk7Zm9yKGxldCBhPTE7YTxvOysrYSl7Y29uc3QgYz0yKm5bYV07dC5saW5lVG8oc1tjXSxzW2MrMV0pfXJldHVybiB0LmNsb3NlUGF0aCgpLGUmJmUudmFsdWUoKX1odWxsUG9seWdvbigpe2NvbnN0IHQ9bmV3IFhhO3JldHVybiB0aGlzLnJlbmRlckh1bGwodCksdC52YWx1ZSgpfXJlbmRlclRyaWFuZ2xlKHQsZSl7Y29uc3Qgbj1lPT1udWxsP2U9bmV3IHZuOnZvaWQgMCx7cG9pbnRzOnMsdHJpYW5nbGVzOnJ9PXRoaXMsbz1yW3QqPTNdKjIsYT1yW3QrMV0qMixjPXJbdCsyXSoyO3JldHVybiBlLm1vdmVUbyhzW29dLHNbbysxXSksZS5saW5lVG8oc1thXSxzW2ErMV0pLGUubGluZVRvKHNbY10sc1tjKzFdKSxlLmNsb3NlUGF0aCgpLG4mJm4udmFsdWUoKX0qdHJpYW5nbGVQb2x5Z29ucygpe2NvbnN0e3RyaWFuZ2xlczp0fT10aGlzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGgvMztlPG47KytlKXlpZWxkIHRoaXMudHJpYW5nbGVQb2x5Z29uKGUpfXRyaWFuZ2xlUG9seWdvbih0KXtjb25zdCBlPW5ldyBYYTtyZXR1cm4gdGhpcy5yZW5kZXJUcmlhbmdsZSh0LGUpLGUudmFsdWUoKX19ZnVuY3Rpb24gankoaSx0LGUsbil7Y29uc3Qgcz1pLmxlbmd0aCxyPW5ldyBGbG9hdDY0QXJyYXkocyoyKTtmb3IobGV0IG89MDtvPHM7KytvKXtjb25zdCBhPWlbb107cltvKjJdPXQuY2FsbChuLGEsbyxpKSxyW28qMisxXT1lLmNhbGwobixhLG8saSl9cmV0dXJuIHJ9ZnVuY3Rpb24qUXkoaSx0LGUsbil7bGV0IHM9MDtmb3IoY29uc3QgciBvZiBpKXlpZWxkIHQuY2FsbChuLHIscyxpKSx5aWVsZCBlLmNhbGwobixyLHMsaSksKytzfWNvbnN0IFlhPU1hdGguUEksWGg9WWEvMixKaD0xODAvWWEsWWg9WWEvMTgwLEt5PU1hdGguYXRhbjIsamg9TWF0aC5jb3MsdG09TWF0aC5tYXgsZW09TWF0aC5taW4sUWg9TWF0aC5zaW4sbm09TWF0aC5zaWdufHxmdW5jdGlvbihpKXtyZXR1cm4gaT4wPzE6aTwwPy0xOjB9LEtoPU1hdGguc3FydDtmdW5jdGlvbiBpbShpKXtyZXR1cm4gaT4xP1hoOmk8LTE/LVhoOk1hdGguYXNpbihpKX1mdW5jdGlvbiB0dShpLHQpe3JldHVybiBpWzBdKnRbMF0raVsxXSp0WzFdK2lbMl0qdFsyXX1mdW5jdGlvbiBXdChpLHQpe3JldHVybltpWzFdKnRbMl0taVsyXSp0WzFdLGlbMl0qdFswXS1pWzBdKnRbMl0saVswXSp0WzFdLWlbMV0qdFswXV19ZnVuY3Rpb24gTnIoaSx0KXtyZXR1cm5baVswXSt0WzBdLGlbMV0rdFsxXSxpWzJdK3RbMl1dfWZ1bmN0aW9uIFJyKGkpe3ZhciB0PUtoKGlbMF0qaVswXStpWzFdKmlbMV0raVsyXSppWzJdKTtyZXR1cm5baVswXS90LGlbMV0vdCxpWzJdL3RdfWZ1bmN0aW9uIGphKGkpe3JldHVybltLeShpWzFdLGlbMF0pKkpoLGltKHRtKC0xLGVtKDEsaVsyXSkpKSpKaF19ZnVuY3Rpb24gYmUoaSl7Y29uc3QgdD1pWzBdKlloLGU9aVsxXSpZaCxuPWpoKGUpO3JldHVybltuKmpoKHQpLG4qUWgodCksUWgoZSldfWZ1bmN0aW9uIFFhKGkpe3JldHVybiBpPWkubWFwKHQ9PmJlKHQpKSx0dShpWzBdLFd0KGlbMl0saVsxXSkpfWZ1bmN0aW9uIHNtKGkpe2NvbnN0IHQ9b20oaSksZT1jbSh0KSxuPWFtKGUsaSkscz1obShlLGkubGVuZ3RoKSxyPXJtKHMsaSksbz1sbShlLGkpLHtwb2x5Z29uczphLGNlbnRlcnM6Y309dW0obyxlLGkpLGw9Zm0oYSksaD1wbShlLGkpLHU9ZG0obixlKTtyZXR1cm57ZGVsYXVuYXk6dCxlZGdlczpuLHRyaWFuZ2xlczplLGNlbnRlcnM6YyxuZWlnaGJvcnM6cyxwb2x5Z29uczphLG1lc2g6bCxodWxsOmgsdXJxdWhhcnQ6dSxmaW5kOnJ9fWZ1bmN0aW9uIHJtKGksdCl7ZnVuY3Rpb24gZShuLHMpe2xldCByPW5bMF0tc1swXSxvPW5bMV0tc1sxXSxhPW5bMl0tc1syXTtyZXR1cm4gcipyK28qbythKmF9cmV0dXJuIGZ1bmN0aW9uKHMscixvKXtvPT09dm9pZCAwJiYobz0wKTtsZXQgYSxjLGw9bztjb25zdCBoPWJlKFtzLHJdKTtkbyBhPW8sbz1udWxsLGM9ZShoLGJlKHRbYV0pKSxpW2FdLmZvckVhY2godT0+e2xldCBmPWUoaCxiZSh0W3VdKSk7aWYoZjxjKXtjPWYsbz11LGw9dTtyZXR1cm59fSk7d2hpbGUobyE9PW51bGwpO3JldHVybiBsfX1mdW5jdGlvbiBvbShpKXtpZihpLmxlbmd0aDwyKXJldHVybnt9O2xldCB0PTA7Zm9yKDtpc05hTihpW3RdWzBdK2lbdF1bMV0pJiZ0Kys8aS5sZW5ndGg7KTtjb25zdCBlPXBoKGlbdF0pLG49WnAoKS50cmFuc2xhdGUoWzAsMF0pLnNjYWxlKDEpLnJvdGF0ZShlLmludmVydChbMTgwLDBdKSk7aT1pLm1hcChuKTtjb25zdCBzPVtdO2xldCByPTE7Zm9yKGxldCB1PTAsZj1pLmxlbmd0aDt1PGY7dSsrKXtsZXQgZD1kaShpW3VdWzBdLDIpK2RpKGlbdV1bMV0sMik7IWlzRmluaXRlKGQpfHxkPjFlMzI/cy5wdXNoKHUpOmQ+ciYmKHI9ZCl9Y29uc3Qgbz0xZTYqS2gocik7cy5mb3JFYWNoKHU9PmlbdV09W28sMF0pLGkucHVzaChbMCxvXSksaS5wdXNoKFstbywwXSksaS5wdXNoKFswLC1vXSk7Y29uc3QgYT1KYS5mcm9tKGkpO2EucHJvamVjdGlvbj1uO2NvbnN0e3RyaWFuZ2xlczpjLGhhbGZlZGdlczpsLGluZWRnZXM6aH09YTtmb3IobGV0IHU9MCxmPWwubGVuZ3RoO3U8Zjt1KyspaWYobFt1XTwwKXtjb25zdCBkPXUlMz09Mj91LTI6dSsxLHA9dSUzPT0wP3UrMjp1LTEseT1sW2RdLG09bFtwXTtsW3ldPW0sbFttXT15LGxbZF09bFtwXT0tMSxjW3VdPWNbZF09Y1twXT10LGhbY1t5XV09eSUzPT0wP3krMjp5LTEsaFtjW21dXT1tJTM9PTA/bSsyOm0tMSx1Kz0yLXUlM31lbHNlIGNbdV0+aS5sZW5ndGgtMy0xJiYoY1t1XT10KTtyZXR1cm4gYX1mdW5jdGlvbiBhbShpLHQpe2NvbnN0IGU9bmV3IFNldDtyZXR1cm4gdC5sZW5ndGg9PT0yP1tbMCwxXV06KGkuZm9yRWFjaChuPT57aWYoblswXSE9PW5bMV0mJiEoUWEobi5tYXAocz0+dFtzXSkpPDApKWZvcihsZXQgcz0wLHI7czwzO3MrKylyPShzKzEpJTMsZS5hZGQoZXIoW25bc10sbltyXV0pLmpvaW4oIi0iKSl9KSxBcnJheS5mcm9tKGUsbj0+bi5zcGxpdCgiLSIpLm1hcChOdW1iZXIpKSl9ZnVuY3Rpb24gY20oaSl7Y29uc3R7dHJpYW5nbGVzOnR9PWk7aWYoIXQpcmV0dXJuW107Y29uc3QgZT1bXTtmb3IobGV0IG49MCxzPXQubGVuZ3RoLzM7bjxzO24rKyl7Y29uc3Qgcj10WzMqbl0sbz10WzMqbisxXSxhPXRbMypuKzJdO3IhPT1vJiZvIT09YSYmZS5wdXNoKFtyLGEsb10pfXJldHVybiBlfWZ1bmN0aW9uIGxtKGksdCl7cmV0dXJuIGkubWFwKGU9Pntjb25zdCBuPWUubWFwKHI9PnRbcl0pLm1hcChiZSkscz1OcihOcihXdChuWzFdLG5bMF0pLFd0KG5bMl0sblsxXSkpLFd0KG5bMF0sblsyXSkpO3JldHVybiBqYShScihzKSl9KX1mdW5jdGlvbiBobShpLHQpe2NvbnN0IGU9W107cmV0dXJuIGkuZm9yRWFjaChuPT57Zm9yKGxldCBzPTA7czwzO3MrKyl7Y29uc3Qgcj1uW3NdLG89blsocysxKSUzXTtlW3JdPWVbcl18fFtdLGVbcl0ucHVzaChvKX19KSxpLmxlbmd0aD09PTAmJih0PT09Mj8oZVswXT1bMV0sZVsxXT1bMF0pOnQ9PT0xJiYoZVswXT1bXSkpLGV9ZnVuY3Rpb24gdW0oaSx0LGUpe2NvbnN0IG49W10scz1pLnNsaWNlKCk7aWYodC5sZW5ndGg9PT0wKXtpZihlLmxlbmd0aDwyKXJldHVybntwb2x5Z29uczpuLGNlbnRlcnM6c307aWYoZS5sZW5ndGg9PT0yKXtjb25zdCBhPWJlKGVbMF0pLGM9YmUoZVsxXSksbD1ScihOcihhLGMpKSxoPVJyKFd0KGEsYykpLHU9V3QobCxoKSxmPVtsLFd0KGwsdSksV3QoV3QobCx1KSx1KSxXdChXdChXdChsLHUpLHUpLHUpXS5tYXAoamEpLm1hcChvKTtyZXR1cm4gbi5wdXNoKGYpLG4ucHVzaChmLnNsaWNlKCkucmV2ZXJzZSgpKSx7cG9seWdvbnM6bixjZW50ZXJzOnN9fX10LmZvckVhY2goKGEsYyk9Pntmb3IobGV0IGw9MDtsPDM7bCsrKXtjb25zdCBoPWFbbF0sdT1hWyhsKzEpJTNdLGY9YVsobCsyKSUzXTtuW2hdPW5baF18fFtdLG5baF0ucHVzaChbdSxmLGMsW2gsdSxmXV0pfX0pO2NvbnN0IHI9bi5tYXAoYT0+e2NvbnN0IGM9W2FbMF1bMl1dO2xldCBsPWFbMF1bMV07Zm9yKGxldCBoPTE7aDxhLmxlbmd0aDtoKyspZm9yKGxldCB1PTA7dTxhLmxlbmd0aDt1KyspaWYoYVt1XVswXT09bCl7bD1hW3VdWzFdLGMucHVzaChhW3VdWzJdKTticmVha31pZihjLmxlbmd0aD4yKXJldHVybiBjO2lmKGMubGVuZ3RoPT0yKXtjb25zdCBoPWV1KGVbYVswXVszXVswXV0sZVthWzBdWzNdWzFdXSxzW2NbMF1dKSx1PWV1KGVbYVswXVszXVsyXV0sZVthWzBdWzNdWzBdXSxzW2NbMF1dKSxmPW8oaCksZD1vKHUpO3JldHVybltjWzBdLGQsY1sxXSxmXX19KTtmdW5jdGlvbiBvKGEpe2xldCBjPS0xO3JldHVybiBzLnNsaWNlKHQubGVuZ3RoLDEvMCkuZm9yRWFjaCgobCxoKT0+e2xbMF09PT1hWzBdJiZsWzFdPT09YVsxXSYmKGM9aCt0Lmxlbmd0aCl9KSxjPDAmJihjPXMubGVuZ3RoLHMucHVzaChhKSksY31yZXR1cm57cG9seWdvbnM6cixjZW50ZXJzOnN9fWZ1bmN0aW9uIGV1KGksdCxlKXtpPWJlKGkpLHQ9YmUodCksZT1iZShlKTtjb25zdCBuPW5tKHR1KFd0KHQsaSksZSkpO3JldHVybiBqYShScihOcihpLHQpKS5tYXAocz0+bipzKSl9ZnVuY3Rpb24gZm0oaSl7Y29uc3QgdD1bXTtyZXR1cm4gaS5mb3JFYWNoKGU9PntpZighZSlyZXR1cm47bGV0IG49ZVtlLmxlbmd0aC0xXTtmb3IobGV0IHMgb2YgZSlzPm4mJnQucHVzaChbbixzXSksbj1zfSksdH1mdW5jdGlvbiBkbShpLHQpe3JldHVybiBmdW5jdGlvbihlKXtjb25zdCBuPW5ldyBNYXAscz1uZXcgTWFwO3JldHVybiBpLmZvckVhY2goKHIsbyk9Pntjb25zdCBhPXIuam9pbigiLSIpO24uc2V0KGEsZVtvXSkscy5zZXQoYSwhMCl9KSx0LmZvckVhY2gocj0+e2xldCBvPTAsYT0tMTtmb3IobGV0IGM9MDtjPDM7YysrKXtsZXQgbD1lcihbcltjXSxyWyhjKzEpJTNdXSkuam9pbigiLSIpO24uZ2V0KGwpPm8mJihvPW4uZ2V0KGwpLGE9bCl9cy5zZXQoYSwhMSl9KSxpLm1hcChyPT5zLmdldChyLmpvaW4oIi0iKSkpfX1mdW5jdGlvbiBwbShpLHQpe2NvbnN0IGU9bmV3IFNldCxuPVtdO2kubWFwKGE9PntpZighKFFhKGEubWFwKGM9PnRbYz50Lmxlbmd0aD8wOmNdKSk+MWUtMTIpKWZvcihsZXQgYz0wO2M8MztjKyspe2xldCBsPVthW2NdLGFbKGMrMSklM11dLGg9YCR7bFswXX0tJHtsWzFdfWA7ZS5oYXMoaCk/ZS5kZWxldGUoaCk6ZS5hZGQoYCR7bFsxXX0tJHtsWzBdfWApfX0pO2NvbnN0IHM9bmV3IE1hcDtsZXQgcjtpZihlLmZvckVhY2goYT0+e2E9YS5zcGxpdCgiLSIpLm1hcChOdW1iZXIpLHMuc2V0KGFbMF0sYVsxXSkscj1hWzBdfSkscj09PXZvaWQgMClyZXR1cm4gbjtsZXQgbz1yO2Rve24ucHVzaChvKTtsZXQgYT1zLmdldChvKTtzLnNldChvLC0xKSxvPWF9d2hpbGUobz4tMSYmbyE9PXIpO3JldHVybiBufWZ1bmN0aW9uIHltKGkpe2NvbnN0IHQ9ZnVuY3Rpb24oZSl7aWYodC5kZWxhdW5heT1udWxsLHQuX2RhdGE9ZSx0eXBlb2YgdC5fZGF0YT09Im9iamVjdCImJnQuX2RhdGEudHlwZT09PSJGZWF0dXJlQ29sbGVjdGlvbiImJih0Ll9kYXRhPXQuX2RhdGEuZmVhdHVyZXMpLHR5cGVvZiB0Ll9kYXRhPT0ib2JqZWN0Iil7Y29uc3Qgbj10Ll9kYXRhLm1hcChzPT5bdC5fdngocyksdC5fdnkocyksc10pLmZpbHRlcihzPT5pc0Zpbml0ZShzWzBdK3NbMV0pKTt0LnBvaW50cz1uLm1hcChzPT5bc1swXSxzWzFdXSksdC52YWxpZD1uLm1hcChzPT5zWzJdKSx0LmRlbGF1bmF5PXNtKHQucG9pbnRzKX1yZXR1cm4gdH07cmV0dXJuIHQuX3Z4PWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlPT0ib2JqZWN0IiYmInR5cGUiaW4gZSlyZXR1cm4gbGgoZSlbMF07aWYoMCBpbiBlKXJldHVybiBlWzBdfSx0Ll92eT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09Im9iamVjdCImJiJ0eXBlImluIGUpcmV0dXJuIGxoKGUpWzFdO2lmKDEgaW4gZSlyZXR1cm4gZVsxXX0sdC54PWZ1bmN0aW9uKGUpe3JldHVybiBlPyh0Ll92eD1lLHQpOnQuX3Z4fSx0Lnk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/KHQuX3Z5PWUsdCk6dC5fdnl9LHQucG9seWdvbnM9ZnVuY3Rpb24oZSl7aWYoZSE9PXZvaWQgMCYmdChlKSwhdC5kZWxhdW5heSlyZXR1cm4hMTtjb25zdCBuPXt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6W119O3JldHVybiB0LnZhbGlkLmxlbmd0aD09PTB8fCh0LmRlbGF1bmF5LnBvbHlnb25zLmZvckVhY2goKHMscik9Pm4uZmVhdHVyZXMucHVzaCh7dHlwZToiRmVhdHVyZSIsZ2VvbWV0cnk6cz97dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1suLi5zLHNbMF1dLm1hcChvPT50LmRlbGF1bmF5LmNlbnRlcnNbb10pXX06bnVsbCxwcm9wZXJ0aWVzOntzaXRlOnQudmFsaWRbcl0sc2l0ZWNvb3JkaW5hdGVzOnQucG9pbnRzW3JdLG5laWdoYm91cnM6dC5kZWxhdW5heS5uZWlnaGJvcnNbcl19fSkpLHQudmFsaWQubGVuZ3RoPT09MSYmbi5mZWF0dXJlcy5wdXNoKHt0eXBlOiJGZWF0dXJlIixnZW9tZXRyeTp7dHlwZToiU3BoZXJlIn0scHJvcGVydGllczp7c2l0ZTp0LnZhbGlkWzBdLHNpdGVjb29yZGluYXRlczp0LnBvaW50c1swXSxuZWlnaGJvdXJzOltdfX0pKSxufSx0LnRyaWFuZ2xlcz1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXZvaWQgMCYmdChlKSx0LmRlbGF1bmF5P3t0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6dC5kZWxhdW5heS50cmlhbmdsZXMubWFwKChuLHMpPT4obj1uLm1hcChyPT50LnBvaW50c1tyXSksbi5jZW50ZXI9dC5kZWxhdW5heS5jZW50ZXJzW3NdLG4pKS5maWx0ZXIobj0+UWEobik+MCkubWFwKG49Pih7dHlwZToiRmVhdHVyZSIscHJvcGVydGllczp7Y2lyY3VtY2VudGVyOm4uY2VudGVyfSxnZW9tZXRyeTp7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1suLi5uLG5bMF1dXX19KSl9OiExfSx0LmxpbmtzPWZ1bmN0aW9uKGUpe2lmKGUhPT12b2lkIDAmJnQoZSksIXQuZGVsYXVuYXkpcmV0dXJuITE7Y29uc3Qgbj10LmRlbGF1bmF5LmVkZ2VzLm1hcChyPT5zaSh0LnBvaW50c1tyWzBdXSx0LnBvaW50c1tyWzFdXSkpLHM9dC5kZWxhdW5heS51cnF1aGFydChuKTtyZXR1cm57dHlwZToiRmVhdHVyZUNvbGxlY3Rpb24iLGZlYXR1cmVzOnQuZGVsYXVuYXkuZWRnZXMubWFwKChyLG8pPT4oe3R5cGU6IkZlYXR1cmUiLHByb3BlcnRpZXM6e3NvdXJjZTp0LnZhbGlkW3JbMF1dLHRhcmdldDp0LnZhbGlkW3JbMV1dLGxlbmd0aDpuW29dLHVycXVoYXJ0OiEhc1tvXX0sZ2VvbWV0cnk6e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOlt0LnBvaW50c1tyWzBdXSx0LnBvaW50c1tyWzFdXV19fSkpfX0sdC5tZXNoPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dm9pZCAwJiZ0KGUpLHQuZGVsYXVuYXk/e3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dC5kZWxhdW5heS5lZGdlcy5tYXAobj0+W3QucG9pbnRzW25bMF1dLHQucG9pbnRzW25bMV1dXSl9OiExfSx0LmNlbGxNZXNoPWZ1bmN0aW9uKGUpe2lmKGUhPT12b2lkIDAmJnQoZSksIXQuZGVsYXVuYXkpcmV0dXJuITE7Y29uc3R7Y2VudGVyczpuLHBvbHlnb25zOnN9PXQuZGVsYXVuYXkscj1bXTtmb3IoY29uc3QgbyBvZiBzKWlmKG8pZm9yKGxldCBhPW8ubGVuZ3RoLGM9b1thLTFdLGw9b1swXSxoPTA7aDxhO2M9bCxsPW9bKytoXSlsPmMmJnIucHVzaChbbltjXSxuW2xdXSk7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6cn19LHQuX2ZvdW5kPXZvaWQgMCx0LmZpbmQ9ZnVuY3Rpb24oZSxuLHMpe2lmKHQuX2ZvdW5kPXQuZGVsYXVuYXkuZmluZChlLG4sdC5fZm91bmQpLCFzfHxzaShbZSxuXSx0LnBvaW50c1t0Ll9mb3VuZF0pPHMpcmV0dXJuIHQuX2ZvdW5kfSx0Lmh1bGw9ZnVuY3Rpb24oZSl7ZSE9PXZvaWQgMCYmdChlKTtjb25zdCBuPXQuZGVsYXVuYXkuaHVsbCxzPXQucG9pbnRzO3JldHVybiBuLmxlbmd0aD09PTA/bnVsbDp7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1suLi5uLm1hcChyPT5zW3JdKSxzW25bMF1dXV19fSxpP3QoaSk6dH1mdW5jdGlvbiBtbShpLHQpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOnRoaXMucmFuZ2UoaSk7YnJlYWs7ZGVmYXVsdDp0aGlzLnJhbmdlKHQpLmRvbWFpbihpKTticmVha31yZXR1cm4gdGhpc31mdW5jdGlvbiBLYShpLHQsZSl7aS5wcm90b3R5cGU9dC5wcm90b3R5cGU9ZSxlLmNvbnN0cnVjdG9yPWl9ZnVuY3Rpb24gbnUoaSx0KXt2YXIgZT1PYmplY3QuY3JlYXRlKGkucHJvdG90eXBlKTtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gS2koKXt9dmFyIHRzPS43LExyPTEvdHMsaGk9IlxccyooWystXT9cXGQrKVxccyoiLGVzPSJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixNZT0iXFxzKihbKy1dPyg/OlxcZCpcXC4pP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLGdtPS9eIyhbMC05YS1mXXszLDh9KSQvLHhtPW5ldyBSZWdFeHAoYF5yZ2JcXCgke2hpfSwke2hpfSwke2hpfVxcKSRgKSx3bT1uZXcgUmVnRXhwKGBecmdiXFwoJHtNZX0sJHtNZX0sJHtNZX1cXCkkYCksYm09bmV3IFJlZ0V4cChgXnJnYmFcXCgke2hpfSwke2hpfSwke2hpfSwke2VzfVxcKSRgKSxNbT1uZXcgUmVnRXhwKGBecmdiYVxcKCR7TWV9LCR7TWV9LCR7TWV9LCR7ZXN9XFwpJGApLEFtPW5ldyBSZWdFeHAoYF5oc2xcXCgke2VzfSwke01lfSwke01lfVxcKSRgKSxfbT1uZXcgUmVnRXhwKGBeaHNsYVxcKCR7ZXN9LCR7TWV9LCR7TWV9LCR7ZXN9XFwpJGApLGl1PXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O0thKEtpLG5zLHtjb3B5KGkpe3JldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLHRoaXMsaSl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4OnN1LGZvcm1hdEhleDpzdSxmb3JtYXRIZXg4OlNtLGZvcm1hdEhzbDp2bSxmb3JtYXRSZ2I6cnUsdG9TdHJpbmc6cnV9KTtmdW5jdGlvbiBzdSgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIFNtKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpfWZ1bmN0aW9uIHZtKCl7cmV0dXJuIGh1KHRoaXMpLmZvcm1hdEhzbCgpfWZ1bmN0aW9uIHJ1KCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gbnMoaSl7dmFyIHQsZTtyZXR1cm4gaT0oaSsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKHQ9Z20uZXhlYyhpKSk/KGU9dFsxXS5sZW5ndGgsdD1wYXJzZUludCh0WzFdLDE2KSxlPT09Nj9vdSh0KTplPT09Mz9uZXcgT3QodD4+OCYxNXx0Pj40JjI0MCx0Pj40JjE1fHQmMjQwLCh0JjE1KTw8NHx0JjE1LDEpOmU9PT04P09yKHQ+PjI0JjI1NSx0Pj4xNiYyNTUsdD4+OCYyNTUsKHQmMjU1KS8yNTUpOmU9PT00P09yKHQ+PjEyJjE1fHQ+PjgmMjQwLHQ+PjgmMTV8dD4+NCYyNDAsdD4+NCYxNXx0JjI0MCwoKHQmMTUpPDw0fHQmMTUpLzI1NSk6bnVsbCk6KHQ9eG0uZXhlYyhpKSk/bmV3IE90KHRbMV0sdFsyXSx0WzNdLDEpOih0PXdtLmV4ZWMoaSkpP25ldyBPdCh0WzFdKjI1NS8xMDAsdFsyXSoyNTUvMTAwLHRbM10qMjU1LzEwMCwxKToodD1ibS5leGVjKGkpKT9Pcih0WzFdLHRbMl0sdFszXSx0WzRdKToodD1NbS5leGVjKGkpKT9Pcih0WzFdKjI1NS8xMDAsdFsyXSoyNTUvMTAwLHRbM10qMjU1LzEwMCx0WzRdKToodD1BbS5leGVjKGkpKT9sdSh0WzFdLHRbMl0vMTAwLHRbM10vMTAwLDEpOih0PV9tLmV4ZWMoaSkpP2x1KHRbMV0sdFsyXS8xMDAsdFszXS8xMDAsdFs0XSk6aXUuaGFzT3duUHJvcGVydHkoaSk/b3UoaXVbaV0pOmk9PT0idHJhbnNwYXJlbnQiP25ldyBPdChOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIG91KGkpe3JldHVybiBuZXcgT3QoaT4+MTYmMjU1LGk+PjgmMjU1LGkmMjU1LDEpfWZ1bmN0aW9uIE9yKGksdCxlLG4pe3JldHVybiBuPD0wJiYoaT10PWU9TmFOKSxuZXcgT3QoaSx0LGUsbil9ZnVuY3Rpb24gem0oaSl7cmV0dXJuIGkgaW5zdGFuY2VvZiBLaXx8KGk9bnMoaSkpLGk/KGk9aS5yZ2IoKSxuZXcgT3QoaS5yLGkuZyxpLmIsaS5vcGFjaXR5KSk6bmV3IE90fWZ1bmN0aW9uIHRjKGksdCxlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MT96bShpKTpuZXcgT3QoaSx0LGUsbj09bnVsbD8xOm4pfWZ1bmN0aW9uIE90KGksdCxlLG4pe3RoaXMucj0raSx0aGlzLmc9K3QsdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rbn1LYShPdCx0YyxudShLaSx7YnJpZ2h0ZXIoaSl7cmV0dXJuIGk9aT09bnVsbD9McjpNYXRoLnBvdyhMcixpKSxuZXcgT3QodGhpcy5yKmksdGhpcy5nKmksdGhpcy5iKmksdGhpcy5vcGFjaXR5KX0sZGFya2VyKGkpe3JldHVybiBpPWk9PW51bGw/dHM6TWF0aC5wb3codHMsaSksbmV3IE90KHRoaXMucippLHRoaXMuZyppLHRoaXMuYippLHRoaXMub3BhY2l0eSl9LHJnYigpe3JldHVybiB0aGlzfSxjbGFtcCgpe3JldHVybiBuZXcgT3Qoem4odGhpcy5yKSx6bih0aGlzLmcpLHpuKHRoaXMuYiksRHIodGhpcy5vcGFjaXR5KSl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuLS41PD10aGlzLnImJnRoaXMucjwyNTUuNSYmLS41PD10aGlzLmcmJnRoaXMuZzwyNTUuNSYmLS41PD10aGlzLmImJnRoaXMuYjwyNTUuNSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDphdSxmb3JtYXRIZXg6YXUsZm9ybWF0SGV4ODpUbSxmb3JtYXRSZ2I6Y3UsdG9TdHJpbmc6Y3V9KSk7ZnVuY3Rpb24gYXUoKXtyZXR1cm5gIyR7VG4odGhpcy5yKX0ke1RuKHRoaXMuZyl9JHtUbih0aGlzLmIpfWB9ZnVuY3Rpb24gVG0oKXtyZXR1cm5gIyR7VG4odGhpcy5yKX0ke1RuKHRoaXMuZyl9JHtUbih0aGlzLmIpfSR7VG4oKGlzTmFOKHRoaXMub3BhY2l0eSk/MTp0aGlzLm9wYWNpdHkpKjI1NSl9YH1mdW5jdGlvbiBjdSgpe2NvbnN0IGk9RHIodGhpcy5vcGFjaXR5KTtyZXR1cm5gJHtpPT09MT8icmdiKCI6InJnYmEoIn0ke3puKHRoaXMucil9LCAke3puKHRoaXMuZyl9LCAke3puKHRoaXMuYil9JHtpPT09MT8iKSI6YCwgJHtpfSlgfWB9ZnVuY3Rpb24gRHIoaSl7cmV0dXJuIGlzTmFOKGkpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLGkpKX1mdW5jdGlvbiB6bihpKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZChpKXx8MCkpfWZ1bmN0aW9uIFRuKGkpe3JldHVybiBpPXpuKGkpLChpPDE2PyIwIjoiIikraS50b1N0cmluZygxNil9ZnVuY3Rpb24gbHUoaSx0LGUsbil7cmV0dXJuIG48PTA/aT10PWU9TmFOOmU8PTB8fGU+PTE/aT10PU5hTjp0PD0wJiYoaT1OYU4pLG5ldyB5ZShpLHQsZSxuKX1mdW5jdGlvbiBodShpKXtpZihpIGluc3RhbmNlb2YgeWUpcmV0dXJuIG5ldyB5ZShpLmgsaS5zLGkubCxpLm9wYWNpdHkpO2lmKGkgaW5zdGFuY2VvZiBLaXx8KGk9bnMoaSkpLCFpKXJldHVybiBuZXcgeWU7aWYoaSBpbnN0YW5jZW9mIHllKXJldHVybiBpO2k9aS5yZ2IoKTt2YXIgdD1pLnIvMjU1LGU9aS5nLzI1NSxuPWkuYi8yNTUscz1NYXRoLm1pbih0LGUsbikscj1NYXRoLm1heCh0LGUsbiksbz1OYU4sYT1yLXMsYz0ocitzKS8yO3JldHVybiBhPyh0PT09cj9vPShlLW4pL2ErKGU8bikqNjplPT09cj9vPShuLXQpL2ErMjpvPSh0LWUpL2ErNCxhLz1jPC41P3IrczoyLXItcyxvKj02MCk6YT1jPjAmJmM8MT8wOm8sbmV3IHllKG8sYSxjLGkub3BhY2l0eSl9ZnVuY3Rpb24gRW0oaSx0LGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0xP2h1KGkpOm5ldyB5ZShpLHQsZSxuPT1udWxsPzE6bil9ZnVuY3Rpb24geWUoaSx0LGUsbil7dGhpcy5oPStpLHRoaXMucz0rdCx0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStufUthKHllLEVtLG51KEtpLHticmlnaHRlcihpKXtyZXR1cm4gaT1pPT1udWxsP0xyOk1hdGgucG93KExyLGkpLG5ldyB5ZSh0aGlzLmgsdGhpcy5zLHRoaXMubCppLHRoaXMub3BhY2l0eSl9LGRhcmtlcihpKXtyZXR1cm4gaT1pPT1udWxsP3RzOk1hdGgucG93KHRzLGkpLG5ldyB5ZSh0aGlzLmgsdGhpcy5zLHRoaXMubCppLHRoaXMub3BhY2l0eSl9LHJnYigpe3ZhciBpPXRoaXMuaCUzNjArKHRoaXMuaDwwKSozNjAsdD1pc05hTihpKXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxuPWUrKGU8LjU/ZToxLWUpKnQscz0yKmUtbjtyZXR1cm4gbmV3IE90KGVjKGk+PTI0MD9pLTI0MDppKzEyMCxzLG4pLGVjKGkscyxuKSxlYyhpPDEyMD9pKzI0MDppLTEyMCxzLG4pLHRoaXMub3BhY2l0eSl9LGNsYW1wKCl7cmV0dXJuIG5ldyB5ZSh1dSh0aGlzLmgpLCRyKHRoaXMucyksJHIodGhpcy5sKSxEcih0aGlzLm9wYWNpdHkpKX0sZGlzcGxheWFibGUoKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGZvcm1hdEhzbCgpe2NvbnN0IGk9RHIodGhpcy5vcGFjaXR5KTtyZXR1cm5gJHtpPT09MT8iaHNsKCI6ImhzbGEoIn0ke3V1KHRoaXMuaCl9LCAkeyRyKHRoaXMucykqMTAwfSUsICR7JHIodGhpcy5sKSoxMDB9JSR7aT09PTE/IikiOmAsICR7aX0pYH1gfX0pKTtmdW5jdGlvbiB1dShpKXtyZXR1cm4gaT0oaXx8MCklMzYwLGk8MD9pKzM2MDppfWZ1bmN0aW9uICRyKGkpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDEsaXx8MCkpfWZ1bmN0aW9uIGVjKGksdCxlKXtyZXR1cm4oaTw2MD90KyhlLXQpKmkvNjA6aTwxODA/ZTppPDI0MD90KyhlLXQpKigyNDAtaSkvNjA6dCkqMjU1fXZhciBuYz1pPT4oKT0+aTtmdW5jdGlvbiBQbShpLHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gaStlKnR9fWZ1bmN0aW9uIENtKGksdCxlKXtyZXR1cm4gaT1NYXRoLnBvdyhpLGUpLHQ9TWF0aC5wb3codCxlKS1pLGU9MS9lLGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnBvdyhpK24qdCxlKX19ZnVuY3Rpb24gQm0oaSl7cmV0dXJuKGk9K2kpPT0xP2Z1OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdD9DbSh0LGUsaSk6bmMoaXNOYU4odCk/ZTp0KX19ZnVuY3Rpb24gZnUoaSx0KXt2YXIgZT10LWk7cmV0dXJuIGU/UG0oaSxlKTpuYyhpc05hTihpKT90OmkpfXZhciBkdT1mdW5jdGlvbiBpKHQpe3ZhciBlPUJtKHQpO2Z1bmN0aW9uIG4ocyxyKXt2YXIgbz1lKChzPXRjKHMpKS5yLChyPXRjKHIpKS5yKSxhPWUocy5nLHIuZyksYz1lKHMuYixyLmIpLGw9ZnUocy5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKGgpe3JldHVybiBzLnI9byhoKSxzLmc9YShoKSxzLmI9YyhoKSxzLm9wYWNpdHk9bChoKSxzKyIifX1yZXR1cm4gbi5nYW1tYT1pLG59KDEpO2Z1bmN0aW9uIEZtKGksdCl7dHx8KHQ9W10pO3ZhciBlPWk/TWF0aC5taW4odC5sZW5ndGgsaS5sZW5ndGgpOjAsbj10LnNsaWNlKCkscztyZXR1cm4gZnVuY3Rpb24ocil7Zm9yKHM9MDtzPGU7KytzKW5bc109aVtzXSooMS1yKSt0W3NdKnI7cmV0dXJuIG59fWZ1bmN0aW9uIEltKGkpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoaSkmJiEoaSBpbnN0YW5jZW9mIERhdGFWaWV3KX1mdW5jdGlvbiBrbShpLHQpe3ZhciBlPXQ/dC5sZW5ndGg6MCxuPWk/TWF0aC5taW4oZSxpLmxlbmd0aCk6MCxzPW5ldyBBcnJheShuKSxyPW5ldyBBcnJheShlKSxvO2ZvcihvPTA7bzxuOysrbylzW29dPXJjKGlbb10sdFtvXSk7Zm9yKDtvPGU7KytvKXJbb109dFtvXTtyZXR1cm4gZnVuY3Rpb24oYSl7Zm9yKG89MDtvPG47KytvKXJbb109c1tvXShhKTtyZXR1cm4gcn19ZnVuY3Rpb24gTm0oaSx0KXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gaT0raSx0PSt0LGZ1bmN0aW9uKG4pe3JldHVybiBlLnNldFRpbWUoaSooMS1uKSt0Km4pLGV9fWZ1bmN0aW9uIFVyKGksdCl7cmV0dXJuIGk9K2ksdD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gaSooMS1lKSt0KmV9fWZ1bmN0aW9uIFJtKGksdCl7dmFyIGU9e30sbj17fSxzOyhpPT09bnVsbHx8dHlwZW9mIGkhPSJvYmplY3QiKSYmKGk9e30pLCh0PT09bnVsbHx8dHlwZW9mIHQhPSJvYmplY3QiKSYmKHQ9e30pO2ZvcihzIGluIHQpcyBpbiBpP2Vbc109cmMoaVtzXSx0W3NdKTpuW3NdPXRbc107cmV0dXJuIGZ1bmN0aW9uKHIpe2ZvcihzIGluIGUpbltzXT1lW3NdKHIpO3JldHVybiBufX12YXIgaWM9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLHNjPW5ldyBSZWdFeHAoaWMuc291cmNlLCJnIik7ZnVuY3Rpb24gTG0oaSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGl9fWZ1bmN0aW9uIE9tKGkpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaSh0KSsiIn19ZnVuY3Rpb24gRG0oaSx0KXt2YXIgZT1pYy5sYXN0SW5kZXg9c2MubGFzdEluZGV4PTAsbixzLHIsbz0tMSxhPVtdLGM9W107Zm9yKGk9aSsiIix0PXQrIiI7KG49aWMuZXhlYyhpKSkmJihzPXNjLmV4ZWModCkpOykocj1zLmluZGV4KT5lJiYocj10LnNsaWNlKGUsciksYVtvXT9hW29dKz1yOmFbKytvXT1yKSwobj1uWzBdKT09PShzPXNbMF0pP2Fbb10/YVtvXSs9czphWysrb109czooYVsrK29dPW51bGwsYy5wdXNoKHtpOm8seDpVcihuLHMpfSkpLGU9c2MubGFzdEluZGV4O3JldHVybiBlPHQubGVuZ3RoJiYocj10LnNsaWNlKGUpLGFbb10/YVtvXSs9cjphWysrb109ciksYS5sZW5ndGg8Mj9jWzBdP09tKGNbMF0ueCk6TG0odCk6KHQ9Yy5sZW5ndGgsZnVuY3Rpb24obCl7Zm9yKHZhciBoPTAsdTtoPHQ7KytoKWFbKHU9Y1toXSkuaV09dS54KGwpO3JldHVybiBhLmpvaW4oIiIpfSl9ZnVuY3Rpb24gcmMoaSx0KXt2YXIgZT10eXBlb2YgdCxuO3JldHVybiB0PT1udWxsfHxlPT09ImJvb2xlYW4iP25jKHQpOihlPT09Im51bWJlciI/VXI6ZT09PSJzdHJpbmciPyhuPW5zKHQpKT8odD1uLGR1KTpEbTp0IGluc3RhbmNlb2YgbnM/ZHU6dCBpbnN0YW5jZW9mIERhdGU/Tm06SW0odCk/Rm06QXJyYXkuaXNBcnJheSh0KT9rbTp0eXBlb2YgdC52YWx1ZU9mIT0iZnVuY3Rpb24iJiZ0eXBlb2YgdC50b1N0cmluZyE9ImZ1bmN0aW9uInx8aXNOYU4odCk/Um06VXIpKGksdCl9ZnVuY3Rpb24gJG0oaSx0KXtyZXR1cm4gaT0raSx0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKGkqKDEtZSkrdCplKX19ZnVuY3Rpb24gVW0oaSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGl9fWZ1bmN0aW9uIFZtKGkpe3JldHVybitpfXZhciBwdT1bMCwxXTtmdW5jdGlvbiB1aShpKXtyZXR1cm4gaX1mdW5jdGlvbiBvYyhpLHQpe3JldHVybih0LT1pPStpKT9mdW5jdGlvbihlKXtyZXR1cm4oZS1pKS90fTpVbShpc05hTih0KT9OYU46LjUpfWZ1bmN0aW9uIHFtKGksdCl7dmFyIGU7cmV0dXJuIGk+dCYmKGU9aSxpPXQsdD1lKSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5tYXgoaSxNYXRoLm1pbih0LG4pKX19ZnVuY3Rpb24gSG0oaSx0LGUpe3ZhciBuPWlbMF0scz1pWzFdLHI9dFswXSxvPXRbMV07cmV0dXJuIHM8bj8obj1vYyhzLG4pLHI9ZShvLHIpKToobj1vYyhuLHMpLHI9ZShyLG8pKSxmdW5jdGlvbihhKXtyZXR1cm4gcihuKGEpKX19ZnVuY3Rpb24gV20oaSx0LGUpe3ZhciBuPU1hdGgubWluKGkubGVuZ3RoLHQubGVuZ3RoKS0xLHM9bmV3IEFycmF5KG4pLHI9bmV3IEFycmF5KG4pLG89LTE7Zm9yKGlbbl08aVswXSYmKGk9aS5zbGljZSgpLnJldmVyc2UoKSx0PXQuc2xpY2UoKS5yZXZlcnNlKCkpOysrbzxuOylzW29dPW9jKGlbb10saVtvKzFdKSxyW29dPWUodFtvXSx0W28rMV0pO3JldHVybiBmdW5jdGlvbihhKXt2YXIgYz1IMChpLGEsMSxuKS0xO3JldHVybiByW2NdKHNbY10oYSkpfX1mdW5jdGlvbiBHbShpLHQpe3JldHVybiB0LmRvbWFpbihpLmRvbWFpbigpKS5yYW5nZShpLnJhbmdlKCkpLmludGVycG9sYXRlKGkuaW50ZXJwb2xhdGUoKSkuY2xhbXAoaS5jbGFtcCgpKS51bmtub3duKGkudW5rbm93bigpKX1mdW5jdGlvbiBabSgpe3ZhciBpPXB1LHQ9cHUsZT1yYyxuLHMscixvPXVpLGEsYyxsO2Z1bmN0aW9uIGgoKXt2YXIgZj1NYXRoLm1pbihpLmxlbmd0aCx0Lmxlbmd0aCk7cmV0dXJuIG8hPT11aSYmKG89cW0oaVswXSxpW2YtMV0pKSxhPWY+Mj9XbTpIbSxjPWw9bnVsbCx1fWZ1bmN0aW9uIHUoZil7cmV0dXJuIGY9PW51bGx8fGlzTmFOKGY9K2YpP3I6KGN8fChjPWEoaS5tYXAobiksdCxlKSkpKG4obyhmKSkpfXJldHVybiB1LmludmVydD1mdW5jdGlvbihmKXtyZXR1cm4gbyhzKChsfHwobD1hKHQsaS5tYXAobiksVXIpKSkoZikpKX0sdS5kb21haW49ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9QXJyYXkuZnJvbShmLFZtKSxoKCkpOmkuc2xpY2UoKX0sdS5yYW5nZT1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1BcnJheS5mcm9tKGYpLGgoKSk6dC5zbGljZSgpfSx1LnJhbmdlUm91bmQ9ZnVuY3Rpb24oZil7cmV0dXJuIHQ9QXJyYXkuZnJvbShmKSxlPSRtLGgoKX0sdS5jbGFtcD1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1mPyEwOnVpLGgoKSk6byE9PXVpfSx1LmludGVycG9sYXRlPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWYsaCgpKTplfSx1LnVua25vd249ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9Zix1KTpyfSxmdW5jdGlvbihmLGQpe3JldHVybiBuPWYscz1kLGgoKX19ZnVuY3Rpb24gWG0oKXtyZXR1cm4gWm0oKSh1aSx1aSl9ZnVuY3Rpb24gSm0oaSl7cmV0dXJuIE1hdGguYWJzKGk9TWF0aC5yb3VuZChpKSk+PTFlMjE/aS50b0xvY2FsZVN0cmluZygiZW4iKS5yZXBsYWNlKC8sL2csIiIpOmkudG9TdHJpbmcoMTApfWZ1bmN0aW9uIFZyKGksdCl7aWYoKGU9KGk9dD9pLnRvRXhwb25lbnRpYWwodC0xKTppLnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLG49aS5zbGljZSgwLGUpO3JldHVybltuLmxlbmd0aD4xP25bMF0rbi5zbGljZSgyKTpuLCtpLnNsaWNlKGUrMSldfWZ1bmN0aW9uIGZpKGkpe3JldHVybiBpPVZyKE1hdGguYWJzKGkpKSxpP2lbMV06TmFOfWZ1bmN0aW9uIFltKGksdCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7Zm9yKHZhciBzPWUubGVuZ3RoLHI9W10sbz0wLGE9aVswXSxjPTA7cz4wJiZhPjAmJihjK2ErMT5uJiYoYT1NYXRoLm1heCgxLG4tYykpLHIucHVzaChlLnN1YnN0cmluZyhzLT1hLHMrYSkpLCEoKGMrPWErMSk+bikpOylhPWlbbz0obysxKSVpLmxlbmd0aF07cmV0dXJuIHIucmV2ZXJzZSgpLmpvaW4odCl9fWZ1bmN0aW9uIGptKGkpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKGUpe3JldHVybiBpWytlXX0pfX12YXIgUW09L14oPzooLik/KFs8Pj1eXSkpPyhbK1wtKCBdKT8oWyQjXSk/KDApPyhcZCspPygsKT8oXC5cZCspPyh+KT8oW2EteiVdKT8kL2k7ZnVuY3Rpb24gcXIoaSl7aWYoISh0PVFtLmV4ZWMoaSkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIraSk7dmFyIHQ7cmV0dXJuIG5ldyBhYyh7ZmlsbDp0WzFdLGFsaWduOnRbMl0sc2lnbjp0WzNdLHN5bWJvbDp0WzRdLHplcm86dFs1XSx3aWR0aDp0WzZdLGNvbW1hOnRbN10scHJlY2lzaW9uOnRbOF0mJnRbOF0uc2xpY2UoMSksdHJpbTp0WzldLHR5cGU6dFsxMF19KX1xci5wcm90b3R5cGU9YWMucHJvdG90eXBlO2Z1bmN0aW9uIGFjKGkpe3RoaXMuZmlsbD1pLmZpbGw9PT12b2lkIDA/IiAiOmkuZmlsbCsiIix0aGlzLmFsaWduPWkuYWxpZ249PT12b2lkIDA/Ij4iOmkuYWxpZ24rIiIsdGhpcy5zaWduPWkuc2lnbj09PXZvaWQgMD8iLSI6aS5zaWduKyIiLHRoaXMuc3ltYm9sPWkuc3ltYm9sPT09dm9pZCAwPyIiOmkuc3ltYm9sKyIiLHRoaXMuemVybz0hIWkuemVybyx0aGlzLndpZHRoPWkud2lkdGg9PT12b2lkIDA/dm9pZCAwOitpLndpZHRoLHRoaXMuY29tbWE9ISFpLmNvbW1hLHRoaXMucHJlY2lzaW9uPWkucHJlY2lzaW9uPT09dm9pZCAwP3ZvaWQgMDoraS5wcmVjaXNpb24sdGhpcy50cmltPSEhaS50cmltLHRoaXMudHlwZT1pLnR5cGU9PT12b2lkIDA/IiI6aS50eXBlKyIifWFjLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyh0aGlzLndpZHRoPT09dm9pZCAwPyIiOk1hdGgubWF4KDEsdGhpcy53aWR0aHwwKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsodGhpcy5wcmVjaXNpb249PT12b2lkIDA/IiI6Ii4iK01hdGgubWF4KDAsdGhpcy5wcmVjaXNpb258MCkpKyh0aGlzLnRyaW0/In4iOiIiKSt0aGlzLnR5cGV9O2Z1bmN0aW9uIEttKGkpe3Q6Zm9yKHZhciB0PWkubGVuZ3RoLGU9MSxuPS0xLHM7ZTx0OysrZSlzd2l0Y2goaVtlXSl7Y2FzZSIuIjpuPXM9ZTticmVhaztjYXNlIjAiOm49PT0wJiYobj1lKSxzPWU7YnJlYWs7ZGVmYXVsdDppZighK2lbZV0pYnJlYWsgdDtuPjAmJihuPTApO2JyZWFrfXJldHVybiBuPjA/aS5zbGljZSgwLG4pK2kuc2xpY2UocysxKTppfXZhciB5dTtmdW5jdGlvbiB0ZyhpLHQpe3ZhciBlPVZyKGksdCk7aWYoIWUpcmV0dXJuIGkrIiI7dmFyIG49ZVswXSxzPWVbMV0scj1zLSh5dT1NYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3Iocy8zKSkpKjMpKzEsbz1uLmxlbmd0aDtyZXR1cm4gcj09PW8/bjpyPm8/bituZXcgQXJyYXkoci1vKzEpLmpvaW4oIjAiKTpyPjA/bi5zbGljZSgwLHIpKyIuIituLnNsaWNlKHIpOiIwLiIrbmV3IEFycmF5KDEtcikuam9pbigiMCIpK1ZyKGksTWF0aC5tYXgoMCx0K3ItMSkpWzBdfWZ1bmN0aW9uIG11KGksdCl7dmFyIGU9VnIoaSx0KTtpZighZSlyZXR1cm4gaSsiIjt2YXIgbj1lWzBdLHM9ZVsxXTtyZXR1cm4gczwwPyIwLiIrbmV3IEFycmF5KC1zKS5qb2luKCIwIikrbjpuLmxlbmd0aD5zKzE/bi5zbGljZSgwLHMrMSkrIi4iK24uc2xpY2UocysxKTpuK25ldyBBcnJheShzLW4ubGVuZ3RoKzIpLmpvaW4oIjAiKX12YXIgZ3U9eyIlIjooaSx0KT0+KGkqMTAwKS50b0ZpeGVkKHQpLGI6aT0+TWF0aC5yb3VuZChpKS50b1N0cmluZygyKSxjOmk9PmkrIiIsZDpKbSxlOihpLHQpPT5pLnRvRXhwb25lbnRpYWwodCksZjooaSx0KT0+aS50b0ZpeGVkKHQpLGc6KGksdCk9PmkudG9QcmVjaXNpb24odCksbzppPT5NYXRoLnJvdW5kKGkpLnRvU3RyaW5nKDgpLHA6KGksdCk9Pm11KGkqMTAwLHQpLHI6bXUsczp0ZyxYOmk9Pk1hdGgucm91bmQoaSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkseDppPT5NYXRoLnJvdW5kKGkpLnRvU3RyaW5nKDE2KX07ZnVuY3Rpb24geHUoaSl7cmV0dXJuIGl9dmFyIHd1PUFycmF5LnByb3RvdHlwZS5tYXAsYnU9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdO2Z1bmN0aW9uIGVnKGkpe3ZhciB0PWkuZ3JvdXBpbmc9PT12b2lkIDB8fGkudGhvdXNhbmRzPT09dm9pZCAwP3h1OlltKHd1LmNhbGwoaS5ncm91cGluZyxOdW1iZXIpLGkudGhvdXNhbmRzKyIiKSxlPWkuY3VycmVuY3k9PT12b2lkIDA/IiI6aS5jdXJyZW5jeVswXSsiIixuPWkuY3VycmVuY3k9PT12b2lkIDA/IiI6aS5jdXJyZW5jeVsxXSsiIixzPWkuZGVjaW1hbD09PXZvaWQgMD8iLiI6aS5kZWNpbWFsKyIiLHI9aS5udW1lcmFscz09PXZvaWQgMD94dTpqbSh3dS5jYWxsKGkubnVtZXJhbHMsU3RyaW5nKSksbz1pLnBlcmNlbnQ9PT12b2lkIDA/IiUiOmkucGVyY2VudCsiIixhPWkubWludXM9PT12b2lkIDA/IuKIkiI6aS5taW51cysiIixjPWkubmFuPT09dm9pZCAwPyJOYU4iOmkubmFuKyIiO2Z1bmN0aW9uIGwodSl7dT1xcih1KTt2YXIgZj11LmZpbGwsZD11LmFsaWduLHA9dS5zaWduLHk9dS5zeW1ib2wsbT11Lnplcm8sZz11LndpZHRoLGI9dS5jb21tYSx3PXUucHJlY2lzaW9uLHg9dS50cmltLE09dS50eXBlO009PT0ibiI/KGI9ITAsTT0iZyIpOmd1W01dfHwodz09PXZvaWQgMCYmKHc9MTIpLHg9ITAsTT0iZyIpLChtfHxmPT09IjAiJiZkPT09Ij0iKSYmKG09ITAsZj0iMCIsZD0iPSIpO3ZhciBBPXk9PT0iJCI/ZTp5PT09IiMiJiYvW2JveFhdLy50ZXN0KE0pPyIwIitNLnRvTG93ZXJDYXNlKCk6IiIsXz15PT09IiQiP246L1slcF0vLnRlc3QoTSk/bzoiIixTPWd1W01dLEU9L1tkZWZncHJzJV0vLnRlc3QoTSk7dz13PT09dm9pZCAwPzY6L1tncHJzXS8udGVzdChNKT9NYXRoLm1heCgxLE1hdGgubWluKDIxLHcpKTpNYXRoLm1heCgwLE1hdGgubWluKDIwLHcpKTtmdW5jdGlvbiB6KHYpe3ZhciBDPUEsUD1fLEYsQixJO2lmKE09PT0iYyIpUD1TKHYpK1Asdj0iIjtlbHNle3Y9K3Y7dmFyIGs9djwwfHwxL3Y8MDtpZih2PWlzTmFOKHYpP2M6UyhNYXRoLmFicyh2KSx3KSx4JiYodj1LbSh2KSksayYmK3Y9PTAmJnAhPT0iKyImJihrPSExKSxDPShrP3A9PT0iKCI/cDphOnA9PT0iLSJ8fHA9PT0iKCI/IiI6cCkrQyxQPShNPT09InMiP2J1WzgreXUvM106IiIpK1ArKGsmJnA9PT0iKCI/IikiOiIiKSxFKXtmb3IoRj0tMSxCPXYubGVuZ3RoOysrRjxCOylpZihJPXYuY2hhckNvZGVBdChGKSw0OD5JfHxJPjU3KXtQPShJPT09NDY/cyt2LnNsaWNlKEYrMSk6di5zbGljZShGKSkrUCx2PXYuc2xpY2UoMCxGKTticmVha319fWImJiFtJiYodj10KHYsMS8wKSk7dmFyIEQ9Qy5sZW5ndGgrdi5sZW5ndGgrUC5sZW5ndGgsVj1EPGc/bmV3IEFycmF5KGctRCsxKS5qb2luKGYpOiIiO3N3aXRjaChiJiZtJiYodj10KFYrdixWLmxlbmd0aD9nLVAubGVuZ3RoOjEvMCksVj0iIiksZCl7Y2FzZSI8Ijp2PUMrditQK1Y7YnJlYWs7Y2FzZSI9Ijp2PUMrVit2K1A7YnJlYWs7Y2FzZSJeIjp2PVYuc2xpY2UoMCxEPVYubGVuZ3RoPj4xKStDK3YrUCtWLnNsaWNlKEQpO2JyZWFrO2RlZmF1bHQ6dj1WK0MrditQO2JyZWFrfXJldHVybiByKHYpfXJldHVybiB6LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHUrIiJ9LHp9ZnVuY3Rpb24gaCh1LGYpe3ZhciBkPWwoKHU9cXIodSksdS50eXBlPSJmIix1KSkscD1NYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZmkoZikvMykpKSozLHk9TWF0aC5wb3coMTAsLXApLG09YnVbOCtwLzNdO3JldHVybiBmdW5jdGlvbihnKXtyZXR1cm4gZCh5KmcpK219fXJldHVybntmb3JtYXQ6bCxmb3JtYXRQcmVmaXg6aH19dmFyIEhyLE11LEF1O25nKHt0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pO2Z1bmN0aW9uIG5nKGkpe3JldHVybiBIcj1lZyhpKSxNdT1Ici5mb3JtYXQsQXU9SHIuZm9ybWF0UHJlZml4LEhyfWZ1bmN0aW9uIGlnKGkpe3JldHVybiBNYXRoLm1heCgwLC1maShNYXRoLmFicyhpKSkpfWZ1bmN0aW9uIHNnKGksdCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGZpKHQpLzMpKSkqMy1maShNYXRoLmFicyhpKSkpfWZ1bmN0aW9uIHJnKGksdCl7cmV0dXJuIGk9TWF0aC5hYnMoaSksdD1NYXRoLmFicyh0KS1pLE1hdGgubWF4KDAsZmkodCktZmkoaSkpKzF9ZnVuY3Rpb24gb2coaSx0LGUsbil7dmFyIHM9SjAoaSx0LGUpLHI7c3dpdGNoKG49cXIobj09bnVsbD8iLGYiOm4pLG4udHlwZSl7Y2FzZSJzIjp7dmFyIG89TWF0aC5tYXgoTWF0aC5hYnMoaSksTWF0aC5hYnModCkpO3JldHVybiBuLnByZWNpc2lvbj09bnVsbCYmIWlzTmFOKHI9c2cocyxvKSkmJihuLnByZWNpc2lvbj1yKSxBdShuLG8pfWNhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOntuLnByZWNpc2lvbj09bnVsbCYmIWlzTmFOKHI9cmcocyxNYXRoLm1heChNYXRoLmFicyhpKSxNYXRoLmFicyh0KSkpKSYmKG4ucHJlY2lzaW9uPXItKG4udHlwZT09PSJlIikpO2JyZWFrfWNhc2UiZiI6Y2FzZSIlIjp7bi5wcmVjaXNpb249PW51bGwmJiFpc05hTihyPWlnKHMpKSYmKG4ucHJlY2lzaW9uPXItKG4udHlwZT09PSIlIikqMik7YnJlYWt9fXJldHVybiBNdShuKX1mdW5jdGlvbiBhZyhpKXt2YXIgdD1pLmRvbWFpbjtyZXR1cm4gaS50aWNrcz1mdW5jdGlvbihlKXt2YXIgbj10KCk7cmV0dXJuIFgwKG5bMF0sbltuLmxlbmd0aC0xXSxlPT1udWxsPzEwOmUpfSxpLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSxuKXt2YXIgcz10KCk7cmV0dXJuIG9nKHNbMF0sc1tzLmxlbmd0aC0xXSxlPT1udWxsPzEwOmUsbil9LGkubmljZT1mdW5jdGlvbihlKXtlPT1udWxsJiYoZT0xMCk7dmFyIG49dCgpLHM9MCxyPW4ubGVuZ3RoLTEsbz1uW3NdLGE9bltyXSxjLGwsaD0xMDtmb3IoYTxvJiYobD1vLG89YSxhPWwsbD1zLHM9cixyPWwpO2gtLSA+MDspe2lmKGw9Z2EobyxhLGUpLGw9PT1jKXJldHVybiBuW3NdPW8sbltyXT1hLHQobik7aWYobD4wKW89TWF0aC5mbG9vcihvL2wpKmwsYT1NYXRoLmNlaWwoYS9sKSpsO2Vsc2UgaWYobDwwKW89TWF0aC5jZWlsKG8qbCkvbCxhPU1hdGguZmxvb3IoYSpsKS9sO2Vsc2UgYnJlYWs7Yz1sfXJldHVybiBpfSxpfWZ1bmN0aW9uIGNjKCl7dmFyIGk9WG0oKTtyZXR1cm4gaS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEdtKGksY2MoKSl9LG1tLmFwcGx5KGksYXJndW1lbnRzKSxhZyhpKX1mdW5jdGlvbiBjZyhpLHQpe3JldHVybiBpLm1hcChlPT57Y29uc3Qgbj1bXTtsZXQgcztyZXR1cm4gZS5mb3JFYWNoKHI9PntpZihzKXtjb25zdCBvPXNpKHIscykqMTgwL01hdGguUEk7aWYobz50KXtjb25zdCBhPUJwKHMsciksYz0xL01hdGguY2VpbChvL3QpO2xldCBsPWM7Zm9yKDtsPDE7KW4ucHVzaChhKGwpKSxsKz1jfX1uLnB1c2gocz1yKX0pLG59KX1mdW5jdGlvbiBsZyhpLHttaW5Mbmc6dCxtYXhMbmc6ZSxtaW5MYXQ6bixtYXhMYXQ6c309e30pe2NvbnN0IHI9TWF0aC5yb3VuZChkaSgzNjAvaSwyKS9NYXRoLlBJKSxvPSgxK01hdGguc3FydCg1KSkvMixhPWQ9PmQvbyozNjAlMzYwLTE4MCxjPWQ9Pk1hdGguYWNvcygyKmQvci0xKS9NYXRoLlBJKjE4MC05MCxsPWQ9PnIqKE1hdGguY29zKChkKzkwKSpNYXRoLlBJLzE4MCkrMSkvMixoPVtzIT09dm9pZCAwP01hdGguY2VpbChsKHMpKTowLG4hPT12b2lkIDA/TWF0aC5mbG9vcihsKG4pKTpyLTFdLHU9dD09PXZvaWQgMCYmZT09PXZvaWQgMD8oKT0+ITA6dD09PXZvaWQgMD9kPT5kPD1lOmU9PT12b2lkIDA/ZD0+ZD49dDplPj10P2Q9PmQ+PXQmJmQ8PWU6ZD0+ZD49dHx8ZDw9ZSxmPVtdO2ZvcihsZXQgZD1oWzBdO2Q8PWhbMV07ZCsrKXtjb25zdCBwPWEoZCk7dShwKSYmZi5wdXNoKFtwLGMoZCldKX1yZXR1cm4gZn1mdW5jdGlvbiBsYyhpLHQsZT0hMSl7cmV0dXJuIGU/Q3AodCxpKTpIeShpLHQpfWZ1bmN0aW9uIGhnKGksdCl7Y29uc3QgZT17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6aX0sW1tuLHNdLFtyLG9dXT1paChlKTtpZihNYXRoLm1pbihNYXRoLmFicyhyLW4pLE1hdGguYWJzKG8tcykpPHQpcmV0dXJuW107Y29uc3QgYT1uPnJ8fG8+PTg5fHxzPD0tODk7cmV0dXJuIGxnKHQse21pbkxuZzpuLG1heExuZzpyLG1pbkxhdDpzLG1heExhdDpvfSkuZmlsdGVyKGM9PmxjKGMsZSxhKSl9ZnVuY3Rpb24gdWcoaSx7cmVzb2x1dGlvbjp0PTEvMCxiYm94OmUscHJvamVjdGlvbjpufT17fSl7Y29uc3Qgcz1jZyhpLHQpLHI9RGkocyksbz1oZyhpLHQpLGE9Wy4uLnIsLi4ub10sYz17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6aX0sW1tsLGhdLFt1LGZdXT1paChjKSxkPWw+dXx8Zj49ODl8fGg8PS04OTtsZXQgcD1bXTtpZihkKXtjb25zdCBNPXltKGEpLnRyaWFuZ2xlcygpLEE9bmV3IE1hcChhLm1hcCgoW18sU10sRSk9PltgJHtffS0ke1N9YCxFXSkpO00uZmVhdHVyZXMuZm9yRWFjaChfPT57Y29uc3QgUz1fLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLnNsaWNlKDAsMykucmV2ZXJzZSgpLEU9W107aWYoUy5mb3JFYWNoKChbeix2XSk9Pntjb25zdCBDPWAke3p9LSR7dn1gO0EuaGFzKEMpJiZFLnB1c2goQS5nZXQoQykpfSksRS5sZW5ndGg9PT0zKXtpZihFLnNvbWUoej0+ejxyLmxlbmd0aCkpe2NvbnN0IHo9Xy5wcm9wZXJ0aWVzLmNpcmN1bWNlbnRlcjtpZighbGMoeixjLGQpKXJldHVybn1wLnB1c2goLi4uRSl9fSl9ZWxzZSBpZihvLmxlbmd0aCl7Y29uc3QgTT1qaS5mcm9tKGEpO2ZvcihsZXQgQT0wLF89TS50cmlhbmdsZXMubGVuZ3RoO0E8XztBKz0zKXtjb25zdCBTPVsyLDEsMF0ubWFwKHo9Pk0udHJpYW5nbGVzW0Erel0pLEU9Uy5tYXAoej0+YVt6XSk7aWYoUy5zb21lKHo9Pno8ci5sZW5ndGgpKXtjb25zdCB6PVswLDFdLm1hcCh2PT5ZMChFLEM9PkNbdl0pKTtpZighbGMoeixjLGQpKWNvbnRpbnVlfXAucHVzaCguLi5TKX19ZWxzZXtjb25zdHt2ZXJ0aWNlczpNLGhvbGVzOkE9W119PVZoKHMpO3A9YXkoTSxBLDIpfWxldCB5PWU/W2VbMF0sZVsyXV06ZXIoYSxNPT5NWzBdKSxtPWU/W2VbMV0sZVszXV06ZXIoYSxNPT5NWzFdKTtpZihuKXtjb25zdFtNLEFdPW4oW3lbMF0sbVswXV0pLFtfLFNdPW4oW3lbMV0sbVsxXV0pO3k9W00sX10sbT1bLUEsLVNdfWNvbnN0IGc9Y2MoeSxbMCwxXSksYj1jYyhtLFswLDFdKSx3PWEubWFwKChbTSxBXSk9PntpZihuKXtjb25zdFtfLFNdPW4oW00sQV0pO3JldHVybltnKF8pLGIoLVMpXX1lbHNlIHJldHVybltnKE0pLGIoQSldfSk7cmV0dXJue2NvbnRvdXI6cyx0cmlhbmdsZXM6e3BvaW50czphLGluZGljZXM6cCx1dnM6d319fWNvbnN0IF91PW5ldyB1ZSgpLnNldEF0dHJpYnV0ZT8ic2V0QXR0cmlidXRlIjoiYWRkQXR0cmlidXRlIjtmdW5jdGlvbiBXcihpLHQsZSxuKXtjb25zdCBzPWkubWFwKHI9PnIubWFwKChbbyxhXSk9PntpZihuKXtjb25zdFtjLGxdPW4oW28sYV0pO3JldHVybltjLC1sLHRdfXJldHVybiBlPyQwKG8sYSx0KTpbbyxhLHRdfSkpO3JldHVybiBWaChzKX1mdW5jdGlvbiBmZyhpLHQsZSxuLHMpe2NvbnN0e3ZlcnRpY2VzOnIsaG9sZXM6b309V3IoaSx0LG4scykse3ZlcnRpY2VzOmF9PVdyKGksZSxuLHMpLGM9RGkoW2Escl0pLGw9TWF0aC5yb3VuZChhLmxlbmd0aC8zKSxoPW5ldyBTZXQobyk7bGV0IHU9MDtjb25zdCBmPVtdO2ZvcihsZXQgcD0wO3A8bDtwKyspe2xldCB5PXArMTtpZih5PT09bCl5PXU7ZWxzZSBpZihoLmhhcyh5KSl7Y29uc3QgbT15O3k9dSx1PW19Zi5wdXNoKHAscCtsLHkrbCksZi5wdXNoKHkrbCx5LHApfWNvbnN0IGQ9W107Zm9yKGxldCBwPTE7cD49MDtwLS0pZm9yKGxldCB5PTA7eTxsO3krPTEpZC5wdXNoKHkvKGwtMSkscCk7cmV0dXJue2luZGljZXM6Zix2ZXJ0aWNlczpjLHV2czpkLHRvcFZlcnRzOmF9fWZ1bmN0aW9uIFN1KGksdCxlLG4scyxyKXtyZXR1cm57aW5kaWNlczpuP2kuaW5kaWNlczppLmluZGljZXMuc2xpY2UoKS5yZXZlcnNlKCksdmVydGljZXM6V3IoW2kucG9pbnRzXSx0LHMscikudmVydGljZXMsdXZzOmV9fWNvbnN0IHZ1PSh7cG9seWdvbkdlb0pzb246aSxzdGFydEhlaWdodDp0LGVuZEhlaWdodDplLGN1cnZhdHVyZVJlc29sdXRpb246bj0xLGNhcnRlc2lhbjpzPSEwLGhhc1NpZGU6cj0hMCxoYXNCb3R0b206bz0hMSxoYXNUb3A6YT0hMSxwcm9qZWN0aW9uOmMsYmJveDpsfSk9PntpLmZvckVhY2goZz0+e0V5KGcpfHxnLnJldmVyc2UoKX0pO2NvbnN0e2NvbnRvdXI6aCx0cmlhbmdsZXM6dX09dWcoaSx7cmVzb2x1dGlvbjpuLGJib3g6bCxwcm9qZWN0aW9uOmN9KTtsZXQgZj17fSxkO3ImJihmPWZnKGgsdCE9bnVsbD90OmUsZSE9bnVsbD9lOnQscyxjKSxkPWYudG9wVmVydHMpO2xldCBwPVtdOyhvfHxhKSYmKHA9RGkodS51dnMpKTtsZXQgeT17fTtvJiYoeT1TdSh1LHQscCwhMSxzLGMpKTtsZXQgbT17fTtyZXR1cm4gYSYmKG09U3UodSxlLHAsITAscyxjKSkse2NvbnRvdXI6aCx0cmlhbmdsZXM6dSxzaWRlVG9yc286Zixib3R0b21DYXA6eSx0b3BDYXA6bSx0b3BWZXJ0czpkfX07Y2xhc3MgZGcgZXh0ZW5kcyB1ZXtjb25zdHJ1Y3Rvcih0LGU9e30pe3N1cGVyKCksdGhpcy50eXBlPSJQb2x5Z29uQnVmZmVyR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz1GdCh7cG9seWdvbkdlb0pzb246dCxzdGFydEhlaWdodDowLGVuZEhlaWdodDoxLGhhc1RvcDohMCx0b3BGaXJzdDohMSxoYXNCb3R0b206ITAsaGFzU2lkZTohMCxjdXJ2YXR1cmVSZXNvbHV0aW9uOjEsY2FydGVzaWFuOiEwLHVzZXJEYXRhUnNvT2Zmc2V0OjB9LGUpO2NvbnN0e2VuZEhlaWdodDpuLGhhc1RvcDpzLHRvcEZpcnN0OnIsaGFzQm90dG9tOm8saGFzU2lkZTphLGNhcnRlc2lhbjpjLHVzZXJEYXRhUnNvT2Zmc2V0OmwscHJvamVjdGlvbjpofT10aGlzLnBhcmFtZXRlcnMse2NvbnRvdXI6dSxzaWRlVG9yc286Zix0b3BWZXJ0czpkLGJvdHRvbUNhcDpwLHRvcENhcDp5fT12dShGdCh7fSx0aGlzLnBhcmFtZXRlcnMpKTtsZXQgbT1bXSxnPVtdLGI9W10sdz0wO2NvbnN0IHg9TT0+e2NvbnN0IEE9TWF0aC5yb3VuZChtLmxlbmd0aC8zKSxfPWIubGVuZ3RoO209bS5jb25jYXQoTS52ZXJ0aWNlcyksZz1nLmNvbmNhdChNLnV2cyksYj1iLmNvbmNhdChBP00uaW5kaWNlcy5tYXAoUz0+UytBKTpNLmluZGljZXMpLHRoaXMuYWRkR3JvdXAoXyxiLmxlbmd0aC1fLHcrKyl9O3MmJnImJngoeSksYSYmKHgoZiksdGhpcy51c2VyRGF0YS50b3BWZXJ0cz1sP1dyKHUsbitsLGMsaCkudmVydGljZXM6ZCksbyYmeChwKSxzJiYhciYmeCh5KSx0aGlzLnNldEluZGV4KGIpLHRoaXNbX3VdKCJwb3NpdGlvbiIsbmV3IENlKG0sMykpLHRoaXNbX3VdKCJ1diIsbmV3IENlKGcsMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX19dmFyIHBnPWk9Pntjb25zdCBhPWkse2Nvb3JkaW5hdGU6dCxzdGFydEhlaWdodDplLGhlaWdodDpufT1hLHM9RHUoYSxbImNvb3JkaW5hdGUiLCJzdGFydEhlaWdodCIsImhlaWdodCJdKTtsZXQgcj1lfHwwO3JldHVybiB0eXBlb2YgZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuIT0idW5kZWZpbmVkIiYmKHI9ZStuKSxuZXcgZGcoW3RdLEdlKEZ0KHt9LHMpLHtzdGFydEhlaWdodDplLGVuZEhlaWdodDpyfSkpfTtjb25zdCB5Zz0oe2Nvb3JkaW5hdGVzQXJyOmksc3RhcnQ6dCxkZXB0aDplLHVzZUdyb3VwczpuLGhhc1RvcDpzLHRvcEZpcnN0OnIsaGFzQm90dG9tOm8saGFzU2lkZTphLGNhcnRlc2lhbjpjLHByb2plY3Rpb246bCxjdXJ2YXR1cmVSZXNvbHV0aW9uOmgsYmJveDp1LGJib3hPZmZzZXQ6Zn0pPT57Y29uc3QgZD1sJiZXaShsKTtpZihkJiYoYz0hMSx1JiZmKSl7bGV0IHk9ZChbdVswXSx1WzFdXSksbT1kKFt1WzJdLHVbM11dKTt5WzFdPS15WzFdLG1bMV09LW1bMV0seVswXSs9ZlswXSx5WzFdKz1mWzFdLG1bMF0rPWZbMl0sbVsxXSs9ZlszXSx5PWQuaW52ZXJ0KFt5WzBdLC15WzFdXSl8fHksbT1kLmludmVydChbbVswXSwtbVsxXV0pfHxtLHU9W3lbMF0seVsxXSxtWzBdLG1bMV1dfXR8fCh0PVswXSk7Y29uc3QgcD1pLm1hcCgoeSxtKT0+e3ZhciBnLGI7cmV0dXJuIHBnKHtjb29yZGluYXRlOnkscHJvamVjdGlvbjpkLHN0YXJ0SGVpZ2h0OihnPXRbbV0pIT1udWxsP2c6dFswXSxoZWlnaHQ6KGI9ZVttXSkhPW51bGw/YjplWzBdLGhhc1RvcDpzIT1udWxsP3M6ITAsdG9wRmlyc3Q6ciE9bnVsbD9yOiExLGhhc0JvdHRvbTpvIT1udWxsP286ITAsaGFzU2lkZTphIT1udWxsP2E6ITAsY2FydGVzaWFuOmMhPW51bGw/YzohMCxjdXJ2YXR1cmVSZXNvbHV0aW9uOmghPW51bGw/aDoxLGJib3g6dX0pfSk7cmV0dXJuIEdpKHAsbil9LG1nPSh7Y29vcmRpbmF0ZXNBcnI6aSxsaW5lV2lkdGg6dCxzdGFydDplLHVzZUdyb3VwczpufSk9Pntjb25zdCByPWkubWFwKChvLGEpPT57dmFyIGM7cmV0dXJuIHZ1KHtwb2x5Z29uR2VvSnNvbjpbb10sc3RhcnRIZWlnaHQ6KGM9ZVthXSkhPW51bGw/YzplWzBdfSkudG9wVmVydHN9KS5tYXAoKG8sYSk9Pnt2YXIgbDtjb25zdCBjPShsPXRbYV0pIT1udWxsP2w6dFswXTtyZXR1cm4gTGgoe25vZGVzOm8sc2V0UG9pbnRXaWR0aDooKT0+Y30pfSk7cmV0dXJuIEdpKHIsbil9O3ZhciBnZz0oaSx0LGUpPT5uZXcgUHJvbWlzZSgobixzKT0+e3ZhciByPWM9Pnt0cnl7YShlLm5leHQoYykpfWNhdGNoKGwpe3MobCl9fSxvPWM9Pnt0cnl7YShlLnRocm93KGMpKX1jYXRjaChsKXtzKGwpfX0sYT1jPT5jLmRvbmU/bihjLnZhbHVlKTpQcm9taXNlLnJlc29sdmUoYy52YWx1ZSkudGhlbihyLG8pO2EoKGU9ZS5hcHBseShpLHQpKS5uZXh0KCkpfSk7ZnVuY3Rpb24geGcoaSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGkpLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTppW2VdLGVudW1lcmFibGU6ITB9KX0se30pfShpPT57Y29uc3QgdD17cnVuKGUsbil7Y29uc3Qgcz1uZXcgRnVuY3Rpb24oInJldHVybiAoIitlKyIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Iik7cmV0dXJuIHMuYXBwbHkocyxuKX0sbWV0aG9kcygpe3JldHVybiBPYmplY3Qua2V5cyh0KX19O2FkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGU9PmdnKHZvaWQgMCxbZV0sZnVuY3Rpb24qKHtkYXRhOm59KXt0cnl7Y29uc3Qgcz10W24ubWV0aG9kXTtpZihzKXtjb25zdCByPXlpZWxkIHMuYXBwbHkocyxuLnBhcmFtcyk7ci50cmFuc2ZlciYmci5tZXNzYWdlP3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpyLm1lc3NhZ2UsZXJyb3I6bnVsbH0sci50cmFuc2Zlcik6cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0OnIsZXJyb3I6bnVsbH0pfWVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1ldGhvZCAiJytuLm1ldGhvZCsnIicpfWNhdGNoKHMpe3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpudWxsLGVycm9yOnhnKHMpfSl9fSkpLE9iamVjdC5rZXlzKGkpLmZvckVhY2goZT0+e3RbZV09aVtlXX0pLHBvc3RNZXNzYWdlKCJyZWFkeSIpfSkoe2V4dHJ1ZGVQb2x5Z29uOmV5LGxpbmU6c3ksbGluZTI6b3ksY29uaWNQb2x5Z29uOnlnLGNvbmljTGluZTptZ30pfSkoKTsK", N = (l) => Uint8Array.from(atob(l), (b) => b.charCodeAt(0)), z = typeof window != "undefined" && window.Blob && new Blob([N(o)], { type: "text/javascript;charset=utf-8" });
|
|
41
|
+
function T(l) {
|
|
42
|
+
let b;
|
|
43
43
|
try {
|
|
44
|
-
if (
|
|
45
|
-
const
|
|
46
|
-
name:
|
|
44
|
+
if (b = z && (window.URL || window.webkitURL).createObjectURL(z), !b) throw "";
|
|
45
|
+
const d = new Worker(b, {
|
|
46
|
+
name: l == null ? void 0 : l.name
|
|
47
47
|
});
|
|
48
|
-
return
|
|
49
|
-
(window.URL || window.webkitURL).revokeObjectURL(
|
|
50
|
-
}),
|
|
51
|
-
} catch (
|
|
48
|
+
return d.addEventListener("error", () => {
|
|
49
|
+
(window.URL || window.webkitURL).revokeObjectURL(b);
|
|
50
|
+
}), d;
|
|
51
|
+
} catch (d) {
|
|
52
52
|
return new Worker(
|
|
53
|
-
"data:text/javascript;base64," +
|
|
53
|
+
"data:text/javascript;base64," + o,
|
|
54
54
|
{
|
|
55
|
-
name:
|
|
55
|
+
name: l == null ? void 0 : l.name
|
|
56
56
|
}
|
|
57
57
|
);
|
|
58
58
|
} finally {
|
|
59
|
-
|
|
59
|
+
b && (window.URL || window.webkitURL).revokeObjectURL(b);
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
|
-
const
|
|
63
|
-
const
|
|
64
|
-
return Object.keys(
|
|
65
|
-
|
|
66
|
-
(
|
|
67
|
-
|
|
62
|
+
const R = (l) => {
|
|
63
|
+
const b = new k();
|
|
64
|
+
return Object.keys(l).forEach((d) => {
|
|
65
|
+
d === "groups" ? l[d].forEach(
|
|
66
|
+
(G) => {
|
|
67
|
+
b.addGroup(G.start, G.count, G.materialIndex);
|
|
68
68
|
}
|
|
69
|
-
) :
|
|
70
|
-
new
|
|
71
|
-
) :
|
|
72
|
-
|
|
73
|
-
new
|
|
69
|
+
) : d === "index" ? b.setIndex(
|
|
70
|
+
new S(l[d].array, l[d].itemSize)
|
|
71
|
+
) : b.setAttribute(
|
|
72
|
+
d,
|
|
73
|
+
new S(l[d].array, l[d].itemSize)
|
|
74
74
|
);
|
|
75
|
-
}),
|
|
75
|
+
}), b;
|
|
76
76
|
};
|
|
77
|
-
class
|
|
78
|
-
constructor(
|
|
79
|
-
this.pluginName = "worker", this.bufferGeometryLoader = new
|
|
77
|
+
class Q {
|
|
78
|
+
constructor(b) {
|
|
79
|
+
this.pluginName = "worker", this.bufferGeometryLoader = new i(), this.cacheObj = {}, this._dispose = !1, this.options = W({
|
|
80
80
|
dbName: "base",
|
|
81
81
|
cacheVersion: "1"
|
|
82
|
-
},
|
|
82
|
+
}, b), this.store = C(this.options.dbName, "attributes");
|
|
83
83
|
}
|
|
84
|
-
install(
|
|
85
|
-
this.pencil =
|
|
86
|
-
const
|
|
84
|
+
install(b) {
|
|
85
|
+
this.pencil = b;
|
|
86
|
+
const d = new J(T, {
|
|
87
87
|
maxWorkers: this.options.maxWorkers
|
|
88
88
|
});
|
|
89
|
-
this.pool =
|
|
89
|
+
this.pool = d;
|
|
90
90
|
}
|
|
91
|
-
geoGeometry(
|
|
92
|
-
return
|
|
93
|
-
const { mesaage:
|
|
94
|
-
|
|
91
|
+
geoGeometry(b, d) {
|
|
92
|
+
return V(this, null, function* () {
|
|
93
|
+
const { mesaage: G, cacheKey: X, userData: p, cacheVersion: L, cb: m } = W(W({}, this.options), d), Z = this.pool, { err: c, res: y } = yield Z.exec(
|
|
94
|
+
b,
|
|
95
95
|
[
|
|
96
|
-
W({},
|
|
96
|
+
W({}, G)
|
|
97
97
|
],
|
|
98
98
|
void 0,
|
|
99
99
|
!0
|
|
100
100
|
);
|
|
101
|
-
if (
|
|
102
|
-
throw
|
|
103
|
-
const
|
|
104
|
-
if (Object.assign(
|
|
105
|
-
const { cacheObj:
|
|
106
|
-
|
|
107
|
-
[
|
|
108
|
-
}),
|
|
109
|
-
attributes:
|
|
110
|
-
},
|
|
101
|
+
if (c)
|
|
102
|
+
throw c;
|
|
103
|
+
const K = R(y);
|
|
104
|
+
if (Object.assign(K.userData, W({}, p)), m && (yield m(K)), X) {
|
|
105
|
+
const { cacheObj: h } = this;
|
|
106
|
+
h[X] || (h[X] = {
|
|
107
|
+
[L]: []
|
|
108
|
+
}), h[X][L].push(W({
|
|
109
|
+
attributes: y
|
|
110
|
+
}, p));
|
|
111
111
|
}
|
|
112
|
-
return
|
|
112
|
+
return K;
|
|
113
113
|
});
|
|
114
114
|
}
|
|
115
|
-
getCachedGeometry(
|
|
116
|
-
return
|
|
117
|
-
const { cacheKey:
|
|
118
|
-
if (
|
|
119
|
-
const
|
|
120
|
-
return
|
|
121
|
-
const
|
|
122
|
-
return Object.assign(
|
|
115
|
+
getCachedGeometry(b) {
|
|
116
|
+
return V(this, null, function* () {
|
|
117
|
+
const { cacheKey: d, cacheVersion: G } = b;
|
|
118
|
+
if (d) {
|
|
119
|
+
const X = yield M(d, this.store), p = G || this.options.cacheVersion;
|
|
120
|
+
return X != null && X[p] ? X[p].map((L) => {
|
|
121
|
+
const y = L, { attributes: m } = y, Z = x(y, ["attributes"]), c = R(m);
|
|
122
|
+
return Object.assign(c.userData, W({}, Z)), c;
|
|
123
123
|
}) : [];
|
|
124
124
|
} else
|
|
125
125
|
return [];
|
|
126
126
|
});
|
|
127
127
|
}
|
|
128
128
|
saveCache() {
|
|
129
|
-
|
|
129
|
+
n(Object.entries(this.cacheObj), this.store);
|
|
130
130
|
}
|
|
131
131
|
dispose() {
|
|
132
132
|
this.cacheObj = {}, this.pool.dispose(), this._dispose = !0;
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
135
|
export {
|
|
136
|
-
|
|
136
|
+
Q as Wk
|
|
137
137
|
};
|