@surfside/ads-core 2.0.1 → 2.0.3

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.
Files changed (274) hide show
  1. package/README.md +15 -15
  2. package/lib/cjs/Api.js +195 -0
  3. package/lib/cjs/Api.js.map +1 -0
  4. package/lib/cjs/helpers/Generator.js +50 -0
  5. package/lib/cjs/helpers/Generator.js.map +1 -0
  6. package/lib/cjs/helpers/Handlebars.js +313 -0
  7. package/lib/cjs/helpers/Handlebars.js.map +1 -0
  8. package/lib/cjs/helpers/NativeRequestBuilder.js +174 -0
  9. package/lib/cjs/helpers/NativeRequestBuilder.js.map +1 -0
  10. package/lib/cjs/helpers/RequestBuilder.js +160 -0
  11. package/lib/cjs/helpers/RequestBuilder.js.map +1 -0
  12. package/lib/cjs/helpers/TryGet.js +14 -0
  13. package/lib/cjs/helpers/TryGet.js.map +1 -0
  14. package/lib/cjs/helpers/Window.js +24 -0
  15. package/lib/cjs/helpers/Window.js.map +1 -0
  16. package/lib/cjs/helpers/index.js +24 -0
  17. package/lib/cjs/helpers/index.js.map +1 -0
  18. package/lib/cjs/helpers/response/Banner.js +4 -0
  19. package/lib/cjs/helpers/response/Banner.js.map +1 -0
  20. package/lib/cjs/helpers/response/BuiltResponse.js +27 -0
  21. package/lib/cjs/helpers/response/BuiltResponse.js.map +1 -0
  22. package/lib/cjs/helpers/response/Carousel.js +282 -0
  23. package/lib/cjs/helpers/response/Carousel.js.map +1 -0
  24. package/lib/cjs/helpers/response/Clickthrough.js +24 -0
  25. package/lib/cjs/helpers/response/Clickthrough.js.map +1 -0
  26. package/lib/cjs/helpers/response/ProductCard.js +198 -0
  27. package/lib/cjs/helpers/response/ProductCard.js.map +1 -0
  28. package/lib/cjs/helpers/response/Video.js +4 -0
  29. package/lib/cjs/helpers/response/Video.js.map +1 -0
  30. package/lib/cjs/helpers/response/index.js +23 -0
  31. package/lib/cjs/helpers/response/index.js.map +1 -0
  32. package/lib/cjs/index.js +21 -3488
  33. package/lib/cjs/index.js.map +1 -54
  34. package/lib/cjs/models/dynamic/DynamicZone.js +12 -0
  35. package/lib/cjs/models/dynamic/DynamicZone.js.map +1 -0
  36. package/lib/cjs/models/dynamic/index.js +18 -0
  37. package/lib/cjs/models/dynamic/index.js.map +1 -0
  38. package/lib/cjs/models/index.js +22 -0
  39. package/lib/cjs/models/index.js.map +1 -0
  40. package/lib/cjs/models/retail/Configuration.js +10 -0
  41. package/lib/cjs/models/retail/Configuration.js.map +1 -0
  42. package/lib/cjs/models/retail/Product.js +4 -0
  43. package/lib/cjs/models/retail/Product.js.map +1 -0
  44. package/lib/cjs/models/retail/Recommended.js +3 -0
  45. package/lib/cjs/models/retail/Recommended.js.map +1 -0
  46. package/lib/cjs/models/retail/index.js +20 -0
  47. package/lib/cjs/models/retail/index.js.map +1 -0
  48. package/lib/cjs/models/rtb/BidRequest.js +20 -0
  49. package/lib/cjs/models/rtb/BidRequest.js.map +1 -0
  50. package/lib/cjs/models/rtb/BidResponse.js +3 -0
  51. package/lib/cjs/models/rtb/BidResponse.js.map +1 -0
  52. package/lib/cjs/models/rtb/NativeRequest.js +122 -0
  53. package/lib/cjs/models/rtb/NativeRequest.js.map +1 -0
  54. package/lib/cjs/models/rtb/NativeResponse.js +26 -0
  55. package/lib/cjs/models/rtb/NativeResponse.js.map +1 -0
  56. package/lib/cjs/models/rtb/index.js +21 -0
  57. package/lib/cjs/models/rtb/index.js.map +1 -0
  58. package/lib/cjs/models/tracking/Geo.js +3 -0
  59. package/lib/cjs/models/tracking/Geo.js.map +1 -0
  60. package/lib/cjs/models/tracking/index.js +18 -0
  61. package/lib/cjs/models/tracking/index.js.map +1 -0
  62. package/lib/cjs/models/vast/Vast.js +4 -0
  63. package/lib/cjs/models/vast/Vast.js.map +1 -0
  64. package/lib/cjs/models/vast/index.js +18 -0
  65. package/lib/cjs/models/vast/index.js.map +1 -0
  66. package/lib/cjs/services/Bidder.js +128 -0
  67. package/lib/cjs/services/Bidder.js.map +1 -0
  68. package/lib/cjs/services/Configuration.js +93 -0
  69. package/lib/cjs/services/Configuration.js.map +1 -0
  70. package/lib/cjs/services/Device.js +236 -0
  71. package/lib/cjs/services/Device.js.map +1 -0
  72. package/lib/cjs/services/Dynamic.js +129 -0
  73. package/lib/cjs/services/Dynamic.js.map +1 -0
  74. package/lib/cjs/services/Geo.js +35 -0
  75. package/lib/cjs/services/Geo.js.map +1 -0
  76. package/lib/cjs/services/Logger.js +57 -0
  77. package/lib/cjs/services/Logger.js.map +1 -0
  78. package/lib/cjs/services/Memoization.js +17 -0
  79. package/lib/cjs/services/Memoization.js.map +1 -0
  80. package/lib/cjs/services/Product.js +127 -0
  81. package/lib/cjs/services/Product.js.map +1 -0
  82. package/lib/cjs/services/Recommender.js +83 -0
  83. package/lib/cjs/services/Recommender.js.map +1 -0
  84. package/lib/cjs/services/Result.js +220 -0
  85. package/lib/cjs/services/Result.js.map +1 -0
  86. package/lib/cjs/services/Template.js +43 -0
  87. package/lib/cjs/services/Template.js.map +1 -0
  88. package/lib/cjs/services/index.js +28 -0
  89. package/lib/cjs/services/index.js.map +1 -0
  90. package/lib/cjs/services/mock/Bidder.js +3 -0
  91. package/lib/cjs/services/mock/Bidder.js.map +1 -0
  92. package/lib/cjs/services/mock/index.js +18 -0
  93. package/lib/cjs/services/mock/index.js.map +1 -0
  94. package/lib/esm/Api.js +183 -0
  95. package/lib/esm/Api.js.map +1 -0
  96. package/lib/esm/helpers/Generator.js +42 -0
  97. package/lib/esm/helpers/Generator.js.map +1 -0
  98. package/lib/esm/helpers/Handlebars.js +294 -0
  99. package/lib/esm/helpers/Handlebars.js.map +1 -0
  100. package/lib/esm/helpers/NativeRequestBuilder.js +169 -0
  101. package/lib/esm/helpers/NativeRequestBuilder.js.map +1 -0
  102. package/lib/esm/helpers/RequestBuilder.js +157 -0
  103. package/lib/esm/helpers/RequestBuilder.js.map +1 -0
  104. package/lib/esm/helpers/TryGet.js +10 -0
  105. package/lib/esm/helpers/TryGet.js.map +1 -0
  106. package/lib/esm/helpers/Window.js +20 -0
  107. package/lib/esm/helpers/Window.js.map +1 -0
  108. package/lib/esm/helpers/index.js +8 -0
  109. package/lib/esm/helpers/index.js.map +1 -0
  110. package/lib/esm/helpers/response/Banner.js +3 -0
  111. package/lib/esm/helpers/response/Banner.js.map +1 -0
  112. package/lib/esm/helpers/response/BuiltResponse.js +22 -0
  113. package/lib/esm/helpers/response/BuiltResponse.js.map +1 -0
  114. package/lib/esm/helpers/response/Carousel.js +273 -0
  115. package/lib/esm/helpers/response/Carousel.js.map +1 -0
  116. package/lib/esm/helpers/response/Clickthrough.js +20 -0
  117. package/lib/esm/helpers/response/Clickthrough.js.map +1 -0
  118. package/lib/esm/helpers/response/ProductCard.js +189 -0
  119. package/lib/esm/helpers/response/ProductCard.js.map +1 -0
  120. package/lib/esm/helpers/response/Video.js +3 -0
  121. package/lib/esm/helpers/response/Video.js.map +1 -0
  122. package/lib/esm/helpers/response/index.js +7 -0
  123. package/lib/esm/helpers/response/index.js.map +1 -0
  124. package/lib/esm/index.js +5 -3460
  125. package/lib/esm/index.js.map +1 -54
  126. package/lib/esm/models/dynamic/DynamicZone.js +11 -0
  127. package/lib/esm/models/dynamic/DynamicZone.js.map +1 -0
  128. package/lib/esm/models/dynamic/index.js +2 -0
  129. package/lib/esm/models/dynamic/index.js.map +1 -0
  130. package/lib/esm/models/index.js +6 -0
  131. package/lib/esm/models/index.js.map +1 -0
  132. package/lib/esm/models/retail/Configuration.js +9 -0
  133. package/lib/esm/models/retail/Configuration.js.map +1 -0
  134. package/lib/esm/models/retail/Product.js +3 -0
  135. package/lib/esm/models/retail/Product.js.map +1 -0
  136. package/lib/esm/models/retail/Recommended.js +2 -0
  137. package/lib/esm/models/retail/Recommended.js.map +1 -0
  138. package/lib/esm/models/retail/index.js +4 -0
  139. package/lib/esm/models/retail/index.js.map +1 -0
  140. package/lib/esm/models/rtb/BidRequest.js +17 -0
  141. package/lib/esm/models/rtb/BidRequest.js.map +1 -0
  142. package/lib/esm/models/rtb/BidResponse.js +2 -0
  143. package/lib/esm/models/rtb/BidResponse.js.map +1 -0
  144. package/lib/esm/models/rtb/NativeRequest.js +119 -0
  145. package/lib/esm/models/rtb/NativeRequest.js.map +1 -0
  146. package/lib/esm/models/rtb/NativeResponse.js +23 -0
  147. package/lib/esm/models/rtb/NativeResponse.js.map +1 -0
  148. package/lib/esm/models/rtb/index.js +5 -0
  149. package/lib/esm/models/rtb/index.js.map +1 -0
  150. package/lib/esm/models/tracking/Geo.js +2 -0
  151. package/lib/esm/models/tracking/Geo.js.map +1 -0
  152. package/lib/esm/models/tracking/index.js +2 -0
  153. package/lib/esm/models/tracking/index.js.map +1 -0
  154. package/lib/esm/models/vast/Vast.js +3 -0
  155. package/lib/esm/models/vast/Vast.js.map +1 -0
  156. package/lib/esm/models/vast/index.js +2 -0
  157. package/lib/esm/models/vast/index.js.map +1 -0
  158. package/lib/esm/services/Bidder.js +119 -0
  159. package/lib/esm/services/Bidder.js.map +1 -0
  160. package/lib/esm/services/Configuration.js +56 -0
  161. package/lib/esm/services/Configuration.js.map +1 -0
  162. package/lib/esm/services/Device.js +232 -0
  163. package/lib/esm/services/Device.js.map +1 -0
  164. package/lib/esm/services/Dynamic.js +120 -0
  165. package/lib/esm/services/Dynamic.js.map +1 -0
  166. package/lib/esm/services/Geo.js +30 -0
  167. package/lib/esm/services/Geo.js.map +1 -0
  168. package/lib/esm/services/Logger.js +52 -0
  169. package/lib/esm/services/Logger.js.map +1 -0
  170. package/lib/esm/services/Memoization.js +13 -0
  171. package/lib/esm/services/Memoization.js.map +1 -0
  172. package/lib/esm/services/Product.js +120 -0
  173. package/lib/esm/services/Product.js.map +1 -0
  174. package/lib/esm/services/Recommender.js +78 -0
  175. package/lib/esm/services/Recommender.js.map +1 -0
  176. package/lib/esm/services/Result.js +199 -0
  177. package/lib/esm/services/Result.js.map +1 -0
  178. package/lib/esm/services/Template.js +38 -0
  179. package/lib/esm/services/Template.js.map +1 -0
  180. package/lib/esm/services/index.js +12 -0
  181. package/lib/esm/services/index.js.map +1 -0
  182. package/lib/esm/services/mock/Bidder.js +2 -0
  183. package/lib/esm/services/mock/Bidder.js.map +1 -0
  184. package/lib/esm/services/mock/index.js +2 -0
  185. package/lib/esm/services/mock/index.js.map +1 -0
  186. package/lib/types/Api.d.ts +5 -5
  187. package/lib/types/helpers/Handlebars.d.ts +58 -15
  188. package/lib/types/helpers/NativeRequestBuilder.d.ts +1 -1
  189. package/lib/types/helpers/RequestBuilder.d.ts +1 -1
  190. package/lib/types/helpers/TryGet.d.ts +1 -1
  191. package/lib/types/helpers/Window.d.ts +2 -2
  192. package/lib/types/helpers/response/Banner.d.ts +1 -1
  193. package/lib/types/helpers/response/BuiltResponse.d.ts +1 -1
  194. package/lib/types/helpers/response/Carousel.d.ts +1 -1
  195. package/lib/types/helpers/response/Clickthrough.d.ts +1 -1
  196. package/lib/types/helpers/response/ProductCard.d.ts +3 -3
  197. package/lib/types/helpers/response/Video.d.ts +2 -2
  198. package/lib/types/services/Bidder.d.ts +3 -3
  199. package/lib/types/services/Configuration.d.ts +1 -1
  200. package/lib/types/services/Dynamic.d.ts +6 -6
  201. package/lib/types/services/Geo.d.ts +1 -1
  202. package/lib/types/services/Product.d.ts +1 -1
  203. package/lib/types/services/Template.d.ts +3 -3
  204. package/package.json +41 -33
  205. package/lib/index.js +0 -1
  206. package/lib/index.js.map +0 -1
  207. package/lib/types/constant-values/index.d.ts +0 -46
  208. package/lib/types/errors/index.d.ts +0 -3
  209. package/lib/types/helpers/generators/CollectN.d.ts +0 -2
  210. package/lib/types/helpers/generators/index.d.ts +0 -1
  211. package/lib/types/helpers/handlebars/index.d.ts +0 -119
  212. package/lib/types/helpers/requests/RequestBuilder.d.ts +0 -124
  213. package/lib/types/helpers/requests/SimpleBannerRequest.d.ts +0 -26
  214. package/lib/types/helpers/requests/index.d.ts +0 -2
  215. package/lib/types/helpers/responses/BuildBannerResponse.d.ts +0 -10
  216. package/lib/types/helpers/responses/BuildNativeResponse.d.ts +0 -21
  217. package/lib/types/helpers/responses/BuildVideoResponse.d.ts +0 -0
  218. package/lib/types/helpers/responses/ClickthroughHelpers.d.ts +0 -2
  219. package/lib/types/helpers/responses/VastHelpers.d.ts +0 -4
  220. package/lib/types/helpers/responses/index.d.ts +0 -4
  221. package/lib/types/middleware/DeviceMiddleware.d.ts +0 -3
  222. package/lib/types/middleware/GeoMiddleware.d.ts +0 -3
  223. package/lib/types/middleware/IdentityMiddleware.d.ts +0 -4
  224. package/lib/types/middleware/index.d.ts +0 -3
  225. package/lib/types/models/retail/IProductInformation.d.ts +0 -37
  226. package/lib/types/models/retail/IPublisherConfiguration.d.ts +0 -64
  227. package/lib/types/models/retail/IRecommenderResponse.d.ts +0 -10
  228. package/lib/types/models/rtb/IBidRequest.d.ts +0 -399
  229. package/lib/types/models/rtb/IBidResponse.d.ts +0 -47
  230. package/lib/types/models/rtb/native/Constants.d.ts +0 -60
  231. package/lib/types/models/rtb/native/INativeRequest.d.ts +0 -54
  232. package/lib/types/models/rtb/native/INativeResponse.d.ts +0 -60
  233. package/lib/types/models/rtb/native/NativeConstants.d.ts +0 -120
  234. package/lib/types/models/rtb/native/NativeRequestBuilder.d.ts +0 -158
  235. package/lib/types/models/rtb/native/index.d.ts +0 -4
  236. package/lib/types/models/tracking/IEvents.d.ts +0 -82
  237. package/lib/types/models/tracking/IGeoContext.d.ts +0 -14
  238. package/lib/types/models/tracking/IUserID.d.ts +0 -1
  239. package/lib/types/services/OverrideService.d.ts +0 -10
  240. package/lib/types/services/logger/ILoggerService.d.ts +0 -39
  241. package/lib/types/services/logger/LocalLoggerService.d.ts +0 -19
  242. package/lib/types/services/logger/index.d.ts +0 -2
  243. package/lib/types/services/product-feed/IProductFeedService.d.ts +0 -5
  244. package/lib/types/services/product-feed/SurfsideProductFeedService.d.ts +0 -11
  245. package/lib/types/services/product-feed/index.d.ts +0 -2
  246. package/lib/types/services/recommender/IRecommenderService.d.ts +0 -47
  247. package/lib/types/services/recommender/SurfsideRecommenderService.d.ts +0 -31
  248. package/lib/types/services/recommender/index.d.ts +0 -2
  249. package/lib/types/services/rtb/bidder/IBidderService.d.ts +0 -12
  250. package/lib/types/services/rtb/bidder/SurfsideBidderService.d.ts +0 -28
  251. package/lib/types/services/rtb/bidder/index.d.ts +0 -2
  252. package/lib/types/services/rtb/configuration/IConfigurationService.d.ts +0 -14
  253. package/lib/types/services/rtb/configuration/SurfsideConfigurationService.d.ts +0 -29
  254. package/lib/types/services/rtb/configuration/index.d.ts +0 -2
  255. package/lib/types/services/rtb/index.d.ts +0 -2
  256. package/lib/types/services/tracking/device/DeviceOverrideService.d.ts +0 -8
  257. package/lib/types/services/tracking/device/IDeviceService.d.ts +0 -4
  258. package/lib/types/services/tracking/device/SurfsideDeviceService.d.ts +0 -16
  259. package/lib/types/services/tracking/device/index.d.ts +0 -3
  260. package/lib/types/services/tracking/events/IEventService.d.ts +0 -5
  261. package/lib/types/services/tracking/events/SurfsideEventService.d.ts +0 -42
  262. package/lib/types/services/tracking/events/index.d.ts +0 -2
  263. package/lib/types/services/tracking/geo/GeoOverrideService.d.ts +0 -8
  264. package/lib/types/services/tracking/geo/IGeoService.d.ts +0 -12
  265. package/lib/types/services/tracking/geo/SurfsideGeoService.d.ts +0 -7
  266. package/lib/types/services/tracking/geo/index.d.ts +0 -3
  267. package/lib/types/services/tracking/index.d.ts +0 -4
  268. package/lib/types/services/tracking/user/IUserIDService.d.ts +0 -4
  269. package/lib/types/services/tracking/user/SurfsideUserIDService.d.ts +0 -7
  270. package/lib/types/services/tracking/user/UserOverrideService.d.ts +0 -8
  271. package/lib/types/services/tracking/user/index.d.ts +0 -3
  272. package/lib/types/utils/Protocol.d.ts +0 -1
  273. package/lib/types/utils/Rendering.d.ts +0 -44
  274. package/lib/types/utils/index.d.ts +0 -2
package/lib/cjs/index.js CHANGED
@@ -1,3488 +1,21 @@
1
- var __create = Object.create;
2
- var __getProtoOf = Object.getPrototypeOf;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __toESM = (mod, isNodeMode, target) => {
8
- target = mod != null ? __create(__getProtoOf(mod)) : {};
9
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
- for (let key of __getOwnPropNames(mod))
11
- if (!__hasOwnProp.call(to, key))
12
- __defProp(to, key, {
13
- get: () => mod[key],
14
- enumerable: true
15
- });
16
- return to;
17
- };
18
- var __moduleCache = /* @__PURE__ */ new WeakMap;
19
- var __toCommonJS = (from) => {
20
- var entry = __moduleCache.get(from), desc;
21
- if (entry)
22
- return entry;
23
- entry = __defProp({}, "__esModule", { value: true });
24
- if (from && typeof from === "object" || typeof from === "function")
25
- __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
26
- get: () => from[key],
27
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
28
- }));
29
- __moduleCache.set(from, entry);
30
- return entry;
31
- };
32
- var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
33
- var __export = (target, all) => {
34
- for (var name in all)
35
- __defProp(target, name, {
36
- get: all[name],
37
- enumerable: true,
38
- configurable: true,
39
- set: (newValue) => all[name] = () => newValue
40
- });
41
- };
42
-
43
- // node_modules/handlebars/dist/cjs/handlebars/utils.js
44
- var require_utils = __commonJS((exports2) => {
45
- exports2.__esModule = true;
46
- exports2.extend = extend;
47
- exports2.indexOf = indexOf;
48
- exports2.escapeExpression = escapeExpression;
49
- exports2.isEmpty = isEmpty;
50
- exports2.createFrame = createFrame;
51
- exports2.blockParams = blockParams;
52
- exports2.appendContextPath = appendContextPath;
53
- var escape = {
54
- "&": "&",
55
- "<": "&lt;",
56
- ">": "&gt;",
57
- '"': "&quot;",
58
- "'": "&#x27;",
59
- "`": "&#x60;",
60
- "=": "&#x3D;"
61
- };
62
- var badChars = /[&<>"'`=]/g;
63
- var possible = /[&<>"'`=]/;
64
- function escapeChar(chr) {
65
- return escape[chr];
66
- }
67
- function extend(obj) {
68
- for (var i = 1;i < arguments.length; i++) {
69
- for (var key in arguments[i]) {
70
- if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {
71
- obj[key] = arguments[i][key];
72
- }
73
- }
74
- }
75
- return obj;
76
- }
77
- var toString = Object.prototype.toString;
78
- exports2.toString = toString;
79
- var isFunction = function isFunction(value) {
80
- return typeof value === "function";
81
- };
82
- if (isFunction(/x/)) {
83
- exports2.isFunction = isFunction = function(value) {
84
- return typeof value === "function" && toString.call(value) === "[object Function]";
85
- };
86
- }
87
- exports2.isFunction = isFunction;
88
- var isArray = Array.isArray || function(value) {
89
- return value && typeof value === "object" ? toString.call(value) === "[object Array]" : false;
90
- };
91
- exports2.isArray = isArray;
92
- function indexOf(array2, value) {
93
- for (var i = 0, len = array2.length;i < len; i++) {
94
- if (array2[i] === value) {
95
- return i;
96
- }
97
- }
98
- return -1;
99
- }
100
- function escapeExpression(string) {
101
- if (typeof string !== "string") {
102
- if (string && string.toHTML) {
103
- return string.toHTML();
104
- } else if (string == null) {
105
- return "";
106
- } else if (!string) {
107
- return string + "";
108
- }
109
- string = "" + string;
110
- }
111
- if (!possible.test(string)) {
112
- return string;
113
- }
114
- return string.replace(badChars, escapeChar);
115
- }
116
- function isEmpty(value) {
117
- if (!value && value !== 0) {
118
- return true;
119
- } else if (isArray(value) && value.length === 0) {
120
- return true;
121
- } else {
122
- return false;
123
- }
124
- }
125
- function createFrame(object) {
126
- var frame = extend({}, object);
127
- frame._parent = object;
128
- return frame;
129
- }
130
- function blockParams(params, ids) {
131
- params.path = ids;
132
- return params;
133
- }
134
- function appendContextPath(contextPath, id) {
135
- return (contextPath ? contextPath + "." : "") + id;
136
- }
137
- });
138
-
139
- // node_modules/handlebars/dist/cjs/handlebars/exception.js
140
- var require_exception = __commonJS((exports2, module2) => {
141
- exports2.__esModule = true;
142
- var errorProps = ["description", "fileName", "lineNumber", "endLineNumber", "message", "name", "number", "stack"];
143
- function Exception(message, node) {
144
- var loc = node && node.loc, line = undefined, endLineNumber = undefined, column = undefined, endColumn = undefined;
145
- if (loc) {
146
- line = loc.start.line;
147
- endLineNumber = loc.end.line;
148
- column = loc.start.column;
149
- endColumn = loc.end.column;
150
- message += " - " + line + ":" + column;
151
- }
152
- var tmp = Error.prototype.constructor.call(this, message);
153
- for (var idx = 0;idx < errorProps.length; idx++) {
154
- this[errorProps[idx]] = tmp[errorProps[idx]];
155
- }
156
- if (Error.captureStackTrace) {
157
- Error.captureStackTrace(this, Exception);
158
- }
159
- try {
160
- if (loc) {
161
- this.lineNumber = line;
162
- this.endLineNumber = endLineNumber;
163
- if (Object.defineProperty) {
164
- Object.defineProperty(this, "column", {
165
- value: column,
166
- enumerable: true
167
- });
168
- Object.defineProperty(this, "endColumn", {
169
- value: endColumn,
170
- enumerable: true
171
- });
172
- } else {
173
- this.column = column;
174
- this.endColumn = endColumn;
175
- }
176
- }
177
- } catch (nop) {}
178
- }
179
- Exception.prototype = new Error;
180
- exports2["default"] = Exception;
181
- module2.exports = exports2["default"];
182
- });
183
-
184
- // node_modules/handlebars/dist/cjs/handlebars/helpers/block-helper-missing.js
185
- var require_block_helper_missing = __commonJS((exports2, module2) => {
186
- exports2.__esModule = true;
187
- var _utils = require_utils();
188
- exports2["default"] = function(instance) {
189
- instance.registerHelper("blockHelperMissing", function(context2, options) {
190
- var { inverse, fn } = options;
191
- if (context2 === true) {
192
- return fn(this);
193
- } else if (context2 === false || context2 == null) {
194
- return inverse(this);
195
- } else if (_utils.isArray(context2)) {
196
- if (context2.length > 0) {
197
- if (options.ids) {
198
- options.ids = [options.name];
199
- }
200
- return instance.helpers.each(context2, options);
201
- } else {
202
- return inverse(this);
203
- }
204
- } else {
205
- if (options.data && options.ids) {
206
- var data = _utils.createFrame(options.data);
207
- data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name);
208
- options = { data };
209
- }
210
- return fn(context2, options);
211
- }
212
- });
213
- };
214
- module2.exports = exports2["default"];
215
- });
216
-
217
- // node_modules/handlebars/dist/cjs/handlebars/helpers/each.js
218
- var require_each = __commonJS((exports2, module2) => {
219
- exports2.__esModule = true;
220
- function _interopRequireDefault(obj) {
221
- return obj && obj.__esModule ? obj : { default: obj };
222
- }
223
- var _utils = require_utils();
224
- var _exception = require_exception();
225
- var _exception2 = _interopRequireDefault(_exception);
226
- exports2["default"] = function(instance) {
227
- instance.registerHelper("each", function(context2, options) {
228
- if (!options) {
229
- throw new _exception2["default"]("Must pass iterator to #each");
230
- }
231
- var { fn, inverse } = options, i = 0, ret = "", data = undefined, contextPath = undefined;
232
- if (options.data && options.ids) {
233
- contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + ".";
234
- }
235
- if (_utils.isFunction(context2)) {
236
- context2 = context2.call(this);
237
- }
238
- if (options.data) {
239
- data = _utils.createFrame(options.data);
240
- }
241
- function execIteration(field, index, last) {
242
- if (data) {
243
- data.key = field;
244
- data.index = index;
245
- data.first = index === 0;
246
- data.last = !!last;
247
- if (contextPath) {
248
- data.contextPath = contextPath + field;
249
- }
250
- }
251
- ret = ret + fn(context2[field], {
252
- data,
253
- blockParams: _utils.blockParams([context2[field], field], [contextPath + field, null])
254
- });
255
- }
256
- if (context2 && typeof context2 === "object") {
257
- if (_utils.isArray(context2)) {
258
- for (var j = context2.length;i < j; i++) {
259
- if (i in context2) {
260
- execIteration(i, i, i === context2.length - 1);
261
- }
262
- }
263
- } else if (typeof Symbol === "function" && context2[Symbol.iterator]) {
264
- var newContext = [];
265
- var iterator = context2[Symbol.iterator]();
266
- for (var it = iterator.next();!it.done; it = iterator.next()) {
267
- newContext.push(it.value);
268
- }
269
- context2 = newContext;
270
- for (var j = context2.length;i < j; i++) {
271
- execIteration(i, i, i === context2.length - 1);
272
- }
273
- } else {
274
- (function() {
275
- var priorKey = undefined;
276
- Object.keys(context2).forEach(function(key) {
277
- if (priorKey !== undefined) {
278
- execIteration(priorKey, i - 1);
279
- }
280
- priorKey = key;
281
- i++;
282
- });
283
- if (priorKey !== undefined) {
284
- execIteration(priorKey, i - 1, true);
285
- }
286
- })();
287
- }
288
- }
289
- if (i === 0) {
290
- ret = inverse(this);
291
- }
292
- return ret;
293
- });
294
- };
295
- module2.exports = exports2["default"];
296
- });
297
-
298
- // node_modules/handlebars/dist/cjs/handlebars/helpers/helper-missing.js
299
- var require_helper_missing = __commonJS((exports2, module2) => {
300
- exports2.__esModule = true;
301
- function _interopRequireDefault(obj) {
302
- return obj && obj.__esModule ? obj : { default: obj };
303
- }
304
- var _exception = require_exception();
305
- var _exception2 = _interopRequireDefault(_exception);
306
- exports2["default"] = function(instance) {
307
- instance.registerHelper("helperMissing", function() {
308
- if (arguments.length === 1) {
309
- return;
310
- } else {
311
- throw new _exception2["default"]('Missing helper: "' + arguments[arguments.length - 1].name + '"');
312
- }
313
- });
314
- };
315
- module2.exports = exports2["default"];
316
- });
317
-
318
- // node_modules/handlebars/dist/cjs/handlebars/helpers/if.js
319
- var require_if = __commonJS((exports2, module2) => {
320
- exports2.__esModule = true;
321
- function _interopRequireDefault(obj) {
322
- return obj && obj.__esModule ? obj : { default: obj };
323
- }
324
- var _utils = require_utils();
325
- var _exception = require_exception();
326
- var _exception2 = _interopRequireDefault(_exception);
327
- exports2["default"] = function(instance) {
328
- instance.registerHelper("if", function(conditional, options) {
329
- if (arguments.length != 2) {
330
- throw new _exception2["default"]("#if requires exactly one argument");
331
- }
332
- if (_utils.isFunction(conditional)) {
333
- conditional = conditional.call(this);
334
- }
335
- if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) {
336
- return options.inverse(this);
337
- } else {
338
- return options.fn(this);
339
- }
340
- });
341
- instance.registerHelper("unless", function(conditional, options) {
342
- if (arguments.length != 2) {
343
- throw new _exception2["default"]("#unless requires exactly one argument");
344
- }
345
- return instance.helpers["if"].call(this, conditional, {
346
- fn: options.inverse,
347
- inverse: options.fn,
348
- hash: options.hash
349
- });
350
- });
351
- };
352
- module2.exports = exports2["default"];
353
- });
354
-
355
- // node_modules/handlebars/dist/cjs/handlebars/helpers/log.js
356
- var require_log = __commonJS((exports2, module2) => {
357
- exports2.__esModule = true;
358
- exports2["default"] = function(instance) {
359
- instance.registerHelper("log", function() {
360
- var args = [undefined], options = arguments[arguments.length - 1];
361
- for (var i = 0;i < arguments.length - 1; i++) {
362
- args.push(arguments[i]);
363
- }
364
- var level = 1;
365
- if (options.hash.level != null) {
366
- level = options.hash.level;
367
- } else if (options.data && options.data.level != null) {
368
- level = options.data.level;
369
- }
370
- args[0] = level;
371
- instance.log.apply(instance, args);
372
- });
373
- };
374
- module2.exports = exports2["default"];
375
- });
376
-
377
- // node_modules/handlebars/dist/cjs/handlebars/helpers/lookup.js
378
- var require_lookup = __commonJS((exports2, module2) => {
379
- exports2.__esModule = true;
380
- exports2["default"] = function(instance) {
381
- instance.registerHelper("lookup", function(obj, field, options) {
382
- if (!obj) {
383
- return obj;
384
- }
385
- return options.lookupProperty(obj, field);
386
- });
387
- };
388
- module2.exports = exports2["default"];
389
- });
390
-
391
- // node_modules/handlebars/dist/cjs/handlebars/helpers/with.js
392
- var require_with = __commonJS((exports2, module2) => {
393
- exports2.__esModule = true;
394
- function _interopRequireDefault(obj) {
395
- return obj && obj.__esModule ? obj : { default: obj };
396
- }
397
- var _utils = require_utils();
398
- var _exception = require_exception();
399
- var _exception2 = _interopRequireDefault(_exception);
400
- exports2["default"] = function(instance) {
401
- instance.registerHelper("with", function(context2, options) {
402
- if (arguments.length != 2) {
403
- throw new _exception2["default"]("#with requires exactly one argument");
404
- }
405
- if (_utils.isFunction(context2)) {
406
- context2 = context2.call(this);
407
- }
408
- var fn = options.fn;
409
- if (!_utils.isEmpty(context2)) {
410
- var data = options.data;
411
- if (options.data && options.ids) {
412
- data = _utils.createFrame(options.data);
413
- data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]);
414
- }
415
- return fn(context2, {
416
- data,
417
- blockParams: _utils.blockParams([context2], [data && data.contextPath])
418
- });
419
- } else {
420
- return options.inverse(this);
421
- }
422
- });
423
- };
424
- module2.exports = exports2["default"];
425
- });
426
-
427
- // node_modules/handlebars/dist/cjs/handlebars/helpers.js
428
- var require_helpers = __commonJS((exports2) => {
429
- exports2.__esModule = true;
430
- exports2.registerDefaultHelpers = registerDefaultHelpers;
431
- exports2.moveHelperToHooks = moveHelperToHooks;
432
- function _interopRequireDefault(obj) {
433
- return obj && obj.__esModule ? obj : { default: obj };
434
- }
435
- var _helpersBlockHelperMissing = require_block_helper_missing();
436
- var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing);
437
- var _helpersEach = require_each();
438
- var _helpersEach2 = _interopRequireDefault(_helpersEach);
439
- var _helpersHelperMissing = require_helper_missing();
440
- var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing);
441
- var _helpersIf = require_if();
442
- var _helpersIf2 = _interopRequireDefault(_helpersIf);
443
- var _helpersLog = require_log();
444
- var _helpersLog2 = _interopRequireDefault(_helpersLog);
445
- var _helpersLookup = require_lookup();
446
- var _helpersLookup2 = _interopRequireDefault(_helpersLookup);
447
- var _helpersWith = require_with();
448
- var _helpersWith2 = _interopRequireDefault(_helpersWith);
449
- function registerDefaultHelpers(instance) {
450
- _helpersBlockHelperMissing2["default"](instance);
451
- _helpersEach2["default"](instance);
452
- _helpersHelperMissing2["default"](instance);
453
- _helpersIf2["default"](instance);
454
- _helpersLog2["default"](instance);
455
- _helpersLookup2["default"](instance);
456
- _helpersWith2["default"](instance);
457
- }
458
- function moveHelperToHooks(instance, helperName, keepHelper) {
459
- if (instance.helpers[helperName]) {
460
- instance.hooks[helperName] = instance.helpers[helperName];
461
- if (!keepHelper) {
462
- delete instance.helpers[helperName];
463
- }
464
- }
465
- }
466
- });
467
-
468
- // node_modules/handlebars/dist/cjs/handlebars/decorators/inline.js
469
- var require_inline = __commonJS((exports2, module2) => {
470
- exports2.__esModule = true;
471
- var _utils = require_utils();
472
- exports2["default"] = function(instance) {
473
- instance.registerDecorator("inline", function(fn, props, container, options) {
474
- var ret = fn;
475
- if (!props.partials) {
476
- props.partials = {};
477
- ret = function(context2, options2) {
478
- var original = container.partials;
479
- container.partials = _utils.extend({}, original, props.partials);
480
- var ret2 = fn(context2, options2);
481
- container.partials = original;
482
- return ret2;
483
- };
484
- }
485
- props.partials[options.args[0]] = options.fn;
486
- return ret;
487
- });
488
- };
489
- module2.exports = exports2["default"];
490
- });
491
-
492
- // node_modules/handlebars/dist/cjs/handlebars/decorators.js
493
- var require_decorators = __commonJS((exports2) => {
494
- exports2.__esModule = true;
495
- exports2.registerDefaultDecorators = registerDefaultDecorators;
496
- function _interopRequireDefault(obj) {
497
- return obj && obj.__esModule ? obj : { default: obj };
498
- }
499
- var _decoratorsInline = require_inline();
500
- var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline);
501
- function registerDefaultDecorators(instance) {
502
- _decoratorsInline2["default"](instance);
503
- }
504
- });
505
-
506
- // node_modules/handlebars/dist/cjs/handlebars/logger.js
507
- var require_logger = __commonJS((exports2, module2) => {
508
- exports2.__esModule = true;
509
- var _utils = require_utils();
510
- var logger = {
511
- methodMap: ["debug", "info", "warn", "error"],
512
- level: "info",
513
- lookupLevel: function lookupLevel(level) {
514
- if (typeof level === "string") {
515
- var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase());
516
- if (levelMap >= 0) {
517
- level = levelMap;
518
- } else {
519
- level = parseInt(level, 10);
520
- }
521
- }
522
- return level;
523
- },
524
- log: function log(level) {
525
- level = logger.lookupLevel(level);
526
- if (typeof console !== "undefined" && logger.lookupLevel(logger.level) <= level) {
527
- var method = logger.methodMap[level];
528
- if (!console[method]) {
529
- method = "log";
530
- }
531
- for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1;_key < _len; _key++) {
532
- message[_key - 1] = arguments[_key];
533
- }
534
- console[method].apply(console, message);
535
- }
536
- }
537
- };
538
- exports2["default"] = logger;
539
- module2.exports = exports2["default"];
540
- });
541
-
542
- // node_modules/handlebars/dist/cjs/handlebars/internal/create-new-lookup-object.js
543
- var require_create_new_lookup_object = __commonJS((exports2) => {
544
- exports2.__esModule = true;
545
- exports2.createNewLookupObject = createNewLookupObject;
546
- var _utils = require_utils();
547
- function createNewLookupObject() {
548
- for (var _len = arguments.length, sources = Array(_len), _key = 0;_key < _len; _key++) {
549
- sources[_key] = arguments[_key];
550
- }
551
- return _utils.extend.apply(undefined, [Object.create(null)].concat(sources));
552
- }
553
- });
554
-
555
- // node_modules/handlebars/dist/cjs/handlebars/internal/proto-access.js
556
- var require_proto_access = __commonJS((exports2) => {
557
- exports2.__esModule = true;
558
- exports2.createProtoAccessControl = createProtoAccessControl;
559
- exports2.resultIsAllowed = resultIsAllowed;
560
- exports2.resetLoggedProperties = resetLoggedProperties;
561
- function _interopRequireDefault(obj) {
562
- return obj && obj.__esModule ? obj : { default: obj };
563
- }
564
- var _createNewLookupObject = require_create_new_lookup_object();
565
- var _logger = require_logger();
566
- var _logger2 = _interopRequireDefault(_logger);
567
- var loggedProperties = Object.create(null);
568
- function createProtoAccessControl(runtimeOptions) {
569
- var defaultMethodWhiteList = Object.create(null);
570
- defaultMethodWhiteList["constructor"] = false;
571
- defaultMethodWhiteList["__defineGetter__"] = false;
572
- defaultMethodWhiteList["__defineSetter__"] = false;
573
- defaultMethodWhiteList["__lookupGetter__"] = false;
574
- var defaultPropertyWhiteList = Object.create(null);
575
- defaultPropertyWhiteList["__proto__"] = false;
576
- return {
577
- properties: {
578
- whitelist: _createNewLookupObject.createNewLookupObject(defaultPropertyWhiteList, runtimeOptions.allowedProtoProperties),
579
- defaultValue: runtimeOptions.allowProtoPropertiesByDefault
580
- },
581
- methods: {
582
- whitelist: _createNewLookupObject.createNewLookupObject(defaultMethodWhiteList, runtimeOptions.allowedProtoMethods),
583
- defaultValue: runtimeOptions.allowProtoMethodsByDefault
584
- }
585
- };
586
- }
587
- function resultIsAllowed(result, protoAccessControl, propertyName) {
588
- if (typeof result === "function") {
589
- return checkWhiteList(protoAccessControl.methods, propertyName);
590
- } else {
591
- return checkWhiteList(protoAccessControl.properties, propertyName);
592
- }
593
- }
594
- function checkWhiteList(protoAccessControlForType, propertyName) {
595
- if (protoAccessControlForType.whitelist[propertyName] !== undefined) {
596
- return protoAccessControlForType.whitelist[propertyName] === true;
597
- }
598
- if (protoAccessControlForType.defaultValue !== undefined) {
599
- return protoAccessControlForType.defaultValue;
600
- }
601
- logUnexpecedPropertyAccessOnce(propertyName);
602
- return false;
603
- }
604
- function logUnexpecedPropertyAccessOnce(propertyName) {
605
- if (loggedProperties[propertyName] !== true) {
606
- loggedProperties[propertyName] = true;
607
- _logger2["default"].log("error", 'Handlebars: Access has been denied to resolve the property "' + propertyName + `" because it is not an "own property" of its parent.
608
- ` + `You can add a runtime option to disable the check or this warning:
609
- ` + "See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details");
610
- }
611
- }
612
- function resetLoggedProperties() {
613
- Object.keys(loggedProperties).forEach(function(propertyName) {
614
- delete loggedProperties[propertyName];
615
- });
616
- }
617
- });
618
-
619
- // node_modules/handlebars/dist/cjs/handlebars/base.js
620
- var require_base = __commonJS((exports2) => {
621
- exports2.__esModule = true;
622
- exports2.HandlebarsEnvironment = HandlebarsEnvironment;
623
- function _interopRequireDefault(obj) {
624
- return obj && obj.__esModule ? obj : { default: obj };
625
- }
626
- var _utils = require_utils();
627
- var _exception = require_exception();
628
- var _exception2 = _interopRequireDefault(_exception);
629
- var _helpers = require_helpers();
630
- var _decorators = require_decorators();
631
- var _logger = require_logger();
632
- var _logger2 = _interopRequireDefault(_logger);
633
- var _internalProtoAccess = require_proto_access();
634
- var VERSION = "4.7.8";
635
- exports2.VERSION = VERSION;
636
- var COMPILER_REVISION = 8;
637
- exports2.COMPILER_REVISION = COMPILER_REVISION;
638
- var LAST_COMPATIBLE_COMPILER_REVISION = 7;
639
- exports2.LAST_COMPATIBLE_COMPILER_REVISION = LAST_COMPATIBLE_COMPILER_REVISION;
640
- var REVISION_CHANGES = {
641
- 1: "<= 1.0.rc.2",
642
- 2: "== 1.0.0-rc.3",
643
- 3: "== 1.0.0-rc.4",
644
- 4: "== 1.x.x",
645
- 5: "== 2.0.0-alpha.x",
646
- 6: ">= 2.0.0-beta.1",
647
- 7: ">= 4.0.0 <4.3.0",
648
- 8: ">= 4.3.0"
649
- };
650
- exports2.REVISION_CHANGES = REVISION_CHANGES;
651
- var objectType = "[object Object]";
652
- function HandlebarsEnvironment(helpers, partials, decorators) {
653
- this.helpers = helpers || {};
654
- this.partials = partials || {};
655
- this.decorators = decorators || {};
656
- _helpers.registerDefaultHelpers(this);
657
- _decorators.registerDefaultDecorators(this);
658
- }
659
- HandlebarsEnvironment.prototype = {
660
- constructor: HandlebarsEnvironment,
661
- logger: _logger2["default"],
662
- log: _logger2["default"].log,
663
- registerHelper: function registerHelper(name, fn) {
664
- if (_utils.toString.call(name) === objectType) {
665
- if (fn) {
666
- throw new _exception2["default"]("Arg not supported with multiple helpers");
667
- }
668
- _utils.extend(this.helpers, name);
669
- } else {
670
- this.helpers[name] = fn;
671
- }
672
- },
673
- unregisterHelper: function unregisterHelper(name) {
674
- delete this.helpers[name];
675
- },
676
- registerPartial: function registerPartial(name, partial) {
677
- if (_utils.toString.call(name) === objectType) {
678
- _utils.extend(this.partials, name);
679
- } else {
680
- if (typeof partial === "undefined") {
681
- throw new _exception2["default"]('Attempting to register a partial called "' + name + '" as undefined');
682
- }
683
- this.partials[name] = partial;
684
- }
685
- },
686
- unregisterPartial: function unregisterPartial(name) {
687
- delete this.partials[name];
688
- },
689
- registerDecorator: function registerDecorator(name, fn) {
690
- if (_utils.toString.call(name) === objectType) {
691
- if (fn) {
692
- throw new _exception2["default"]("Arg not supported with multiple decorators");
693
- }
694
- _utils.extend(this.decorators, name);
695
- } else {
696
- this.decorators[name] = fn;
697
- }
698
- },
699
- unregisterDecorator: function unregisterDecorator(name) {
700
- delete this.decorators[name];
701
- },
702
- resetLoggedPropertyAccesses: function resetLoggedPropertyAccesses() {
703
- _internalProtoAccess.resetLoggedProperties();
704
- }
705
- };
706
- var log2 = _logger2["default"].log;
707
- exports2.log = log2;
708
- exports2.createFrame = _utils.createFrame;
709
- exports2.logger = _logger2["default"];
710
- });
711
-
712
- // node_modules/handlebars/dist/cjs/handlebars/safe-string.js
713
- var require_safe_string = __commonJS((exports2, module2) => {
714
- exports2.__esModule = true;
715
- function SafeString(string) {
716
- this.string = string;
717
- }
718
- SafeString.prototype.toString = SafeString.prototype.toHTML = function() {
719
- return "" + this.string;
720
- };
721
- exports2["default"] = SafeString;
722
- module2.exports = exports2["default"];
723
- });
724
-
725
- // node_modules/handlebars/dist/cjs/handlebars/internal/wrapHelper.js
726
- var require_wrapHelper = __commonJS((exports2) => {
727
- exports2.__esModule = true;
728
- exports2.wrapHelper = wrapHelper;
729
- function wrapHelper(helper, transformOptionsFn) {
730
- if (typeof helper !== "function") {
731
- return helper;
732
- }
733
- var wrapper = function wrapper() {
734
- var options = arguments[arguments.length - 1];
735
- arguments[arguments.length - 1] = transformOptionsFn(options);
736
- return helper.apply(this, arguments);
737
- };
738
- return wrapper;
739
- }
740
- });
741
-
742
- // node_modules/handlebars/dist/cjs/handlebars/runtime.js
743
- var require_runtime = __commonJS((exports2) => {
744
- exports2.__esModule = true;
745
- exports2.checkRevision = checkRevision;
746
- exports2.template = template;
747
- exports2.wrapProgram = wrapProgram;
748
- exports2.resolvePartial = resolvePartial;
749
- exports2.invokePartial = invokePartial;
750
- exports2.noop = noop;
751
- function _interopRequireDefault(obj) {
752
- return obj && obj.__esModule ? obj : { default: obj };
753
- }
754
- function _interopRequireWildcard(obj) {
755
- if (obj && obj.__esModule) {
756
- return obj;
757
- } else {
758
- var newObj = {};
759
- if (obj != null) {
760
- for (var key in obj) {
761
- if (Object.prototype.hasOwnProperty.call(obj, key))
762
- newObj[key] = obj[key];
763
- }
764
- }
765
- newObj["default"] = obj;
766
- return newObj;
767
- }
768
- }
769
- var _utils = require_utils();
770
- var Utils = _interopRequireWildcard(_utils);
771
- var _exception = require_exception();
772
- var _exception2 = _interopRequireDefault(_exception);
773
- var _base = require_base();
774
- var _helpers = require_helpers();
775
- var _internalWrapHelper = require_wrapHelper();
776
- var _internalProtoAccess = require_proto_access();
777
- function checkRevision(compilerInfo) {
778
- var compilerRevision = compilerInfo && compilerInfo[0] || 1, currentRevision = _base.COMPILER_REVISION;
779
- if (compilerRevision >= _base.LAST_COMPATIBLE_COMPILER_REVISION && compilerRevision <= _base.COMPILER_REVISION) {
780
- return;
781
- }
782
- if (compilerRevision < _base.LAST_COMPATIBLE_COMPILER_REVISION) {
783
- var runtimeVersions = _base.REVISION_CHANGES[currentRevision], compilerVersions = _base.REVISION_CHANGES[compilerRevision];
784
- throw new _exception2["default"]("Template was precompiled with an older version of Handlebars than the current runtime. " + "Please update your precompiler to a newer version (" + runtimeVersions + ") or downgrade your runtime to an older version (" + compilerVersions + ").");
785
- } else {
786
- throw new _exception2["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. " + "Please update your runtime to a newer version (" + compilerInfo[1] + ").");
787
- }
788
- }
789
- function template(templateSpec, env) {
790
- if (!env) {
791
- throw new _exception2["default"]("No environment passed to template");
792
- }
793
- if (!templateSpec || !templateSpec.main) {
794
- throw new _exception2["default"]("Unknown template object: " + typeof templateSpec);
795
- }
796
- templateSpec.main.decorator = templateSpec.main_d;
797
- env.VM.checkRevision(templateSpec.compiler);
798
- var templateWasPrecompiledWithCompilerV7 = templateSpec.compiler && templateSpec.compiler[0] === 7;
799
- function invokePartialWrapper(partial, context2, options) {
800
- if (options.hash) {
801
- context2 = Utils.extend({}, context2, options.hash);
802
- if (options.ids) {
803
- options.ids[0] = true;
804
- }
805
- }
806
- partial = env.VM.resolvePartial.call(this, partial, context2, options);
807
- var extendedOptions = Utils.extend({}, options, {
808
- hooks: this.hooks,
809
- protoAccessControl: this.protoAccessControl
810
- });
811
- var result = env.VM.invokePartial.call(this, partial, context2, extendedOptions);
812
- if (result == null && env.compile) {
813
- options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);
814
- result = options.partials[options.name](context2, extendedOptions);
815
- }
816
- if (result != null) {
817
- if (options.indent) {
818
- var lines = result.split(`
819
- `);
820
- for (var i = 0, l = lines.length;i < l; i++) {
821
- if (!lines[i] && i + 1 === l) {
822
- break;
823
- }
824
- lines[i] = options.indent + lines[i];
825
- }
826
- result = lines.join(`
827
- `);
828
- }
829
- return result;
830
- } else {
831
- throw new _exception2["default"]("The partial " + options.name + " could not be compiled when running in runtime-only mode");
832
- }
833
- }
834
- var container = {
835
- strict: function strict(obj, name, loc) {
836
- if (!obj || !(name in obj)) {
837
- throw new _exception2["default"]('"' + name + '" not defined in ' + obj, {
838
- loc
839
- });
840
- }
841
- return container.lookupProperty(obj, name);
842
- },
843
- lookupProperty: function lookupProperty(parent, propertyName) {
844
- var result = parent[propertyName];
845
- if (result == null) {
846
- return result;
847
- }
848
- if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
849
- return result;
850
- }
851
- if (_internalProtoAccess.resultIsAllowed(result, container.protoAccessControl, propertyName)) {
852
- return result;
853
- }
854
- return;
855
- },
856
- lookup: function lookup(depths, name) {
857
- var len = depths.length;
858
- for (var i = 0;i < len; i++) {
859
- var result = depths[i] && container.lookupProperty(depths[i], name);
860
- if (result != null) {
861
- return depths[i][name];
862
- }
863
- }
864
- },
865
- lambda: function lambda(current, context2) {
866
- return typeof current === "function" ? current.call(context2) : current;
867
- },
868
- escapeExpression: Utils.escapeExpression,
869
- invokePartial: invokePartialWrapper,
870
- fn: function fn(i) {
871
- var ret2 = templateSpec[i];
872
- ret2.decorator = templateSpec[i + "_d"];
873
- return ret2;
874
- },
875
- programs: [],
876
- program: function program(i, data, declaredBlockParams, blockParams, depths) {
877
- var programWrapper = this.programs[i], fn = this.fn(i);
878
- if (data || depths || blockParams || declaredBlockParams) {
879
- programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);
880
- } else if (!programWrapper) {
881
- programWrapper = this.programs[i] = wrapProgram(this, i, fn);
882
- }
883
- return programWrapper;
884
- },
885
- data: function data(value, depth) {
886
- while (value && depth--) {
887
- value = value._parent;
888
- }
889
- return value;
890
- },
891
- mergeIfNeeded: function mergeIfNeeded(param, common) {
892
- var obj = param || common;
893
- if (param && common && param !== common) {
894
- obj = Utils.extend({}, common, param);
895
- }
896
- return obj;
897
- },
898
- nullContext: Object.seal({}),
899
- noop: env.VM.noop,
900
- compilerInfo: templateSpec.compiler
901
- };
902
- function ret(context2) {
903
- var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
904
- var data = options.data;
905
- ret._setup(options);
906
- if (!options.partial && templateSpec.useData) {
907
- data = initData(context2, data);
908
- }
909
- var depths = undefined, blockParams = templateSpec.useBlockParams ? [] : undefined;
910
- if (templateSpec.useDepths) {
911
- if (options.depths) {
912
- depths = context2 != options.depths[0] ? [context2].concat(options.depths) : options.depths;
913
- } else {
914
- depths = [context2];
915
- }
916
- }
917
- function main(context3) {
918
- return "" + templateSpec.main(container, context3, container.helpers, container.partials, data, blockParams, depths);
919
- }
920
- main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);
921
- return main(context2, options);
922
- }
923
- ret.isTop = true;
924
- ret._setup = function(options) {
925
- if (!options.partial) {
926
- var mergedHelpers = Utils.extend({}, env.helpers, options.helpers);
927
- wrapHelpersToPassLookupProperty(mergedHelpers, container);
928
- container.helpers = mergedHelpers;
929
- if (templateSpec.usePartial) {
930
- container.partials = container.mergeIfNeeded(options.partials, env.partials);
931
- }
932
- if (templateSpec.usePartial || templateSpec.useDecorators) {
933
- container.decorators = Utils.extend({}, env.decorators, options.decorators);
934
- }
935
- container.hooks = {};
936
- container.protoAccessControl = _internalProtoAccess.createProtoAccessControl(options);
937
- var keepHelperInHelpers = options.allowCallsToHelperMissing || templateWasPrecompiledWithCompilerV7;
938
- _helpers.moveHelperToHooks(container, "helperMissing", keepHelperInHelpers);
939
- _helpers.moveHelperToHooks(container, "blockHelperMissing", keepHelperInHelpers);
940
- } else {
941
- container.protoAccessControl = options.protoAccessControl;
942
- container.helpers = options.helpers;
943
- container.partials = options.partials;
944
- container.decorators = options.decorators;
945
- container.hooks = options.hooks;
946
- }
947
- };
948
- ret._child = function(i, data, blockParams, depths) {
949
- if (templateSpec.useBlockParams && !blockParams) {
950
- throw new _exception2["default"]("must pass block params");
951
- }
952
- if (templateSpec.useDepths && !depths) {
953
- throw new _exception2["default"]("must pass parent depths");
954
- }
955
- return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);
956
- };
957
- return ret;
958
- }
959
- function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {
960
- function prog(context2) {
961
- var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
962
- var currentDepths = depths;
963
- if (depths && context2 != depths[0] && !(context2 === container.nullContext && depths[0] === null)) {
964
- currentDepths = [context2].concat(depths);
965
- }
966
- return fn(container, context2, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths);
967
- }
968
- prog = executeDecorators(fn, prog, container, depths, data, blockParams);
969
- prog.program = i;
970
- prog.depth = depths ? depths.length : 0;
971
- prog.blockParams = declaredBlockParams || 0;
972
- return prog;
973
- }
974
- function resolvePartial(partial, context2, options) {
975
- if (!partial) {
976
- if (options.name === "@partial-block") {
977
- partial = options.data["partial-block"];
978
- } else {
979
- partial = options.partials[options.name];
980
- }
981
- } else if (!partial.call && !options.name) {
982
- options.name = partial;
983
- partial = options.partials[partial];
984
- }
985
- return partial;
986
- }
987
- function invokePartial(partial, context2, options) {
988
- var currentPartialBlock = options.data && options.data["partial-block"];
989
- options.partial = true;
990
- if (options.ids) {
991
- options.data.contextPath = options.ids[0] || options.data.contextPath;
992
- }
993
- var partialBlock = undefined;
994
- if (options.fn && options.fn !== noop) {
995
- (function() {
996
- options.data = _base.createFrame(options.data);
997
- var fn = options.fn;
998
- partialBlock = options.data["partial-block"] = function partialBlockWrapper(context3) {
999
- var options2 = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
1000
- options2.data = _base.createFrame(options2.data);
1001
- options2.data["partial-block"] = currentPartialBlock;
1002
- return fn(context3, options2);
1003
- };
1004
- if (fn.partials) {
1005
- options.partials = Utils.extend({}, options.partials, fn.partials);
1006
- }
1007
- })();
1008
- }
1009
- if (partial === undefined && partialBlock) {
1010
- partial = partialBlock;
1011
- }
1012
- if (partial === undefined) {
1013
- throw new _exception2["default"]("The partial " + options.name + " could not be found");
1014
- } else if (partial instanceof Function) {
1015
- return partial(context2, options);
1016
- }
1017
- }
1018
- function noop() {
1019
- return "";
1020
- }
1021
- function initData(context2, data) {
1022
- if (!data || !("root" in data)) {
1023
- data = data ? _base.createFrame(data) : {};
1024
- data.root = context2;
1025
- }
1026
- return data;
1027
- }
1028
- function executeDecorators(fn, prog, container, depths, data, blockParams) {
1029
- if (fn.decorator) {
1030
- var props = {};
1031
- prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);
1032
- Utils.extend(prog, props);
1033
- }
1034
- return prog;
1035
- }
1036
- function wrapHelpersToPassLookupProperty(mergedHelpers, container) {
1037
- Object.keys(mergedHelpers).forEach(function(helperName) {
1038
- var helper = mergedHelpers[helperName];
1039
- mergedHelpers[helperName] = passLookupPropertyOption(helper, container);
1040
- });
1041
- }
1042
- function passLookupPropertyOption(helper, container) {
1043
- var lookupProperty = container.lookupProperty;
1044
- return _internalWrapHelper.wrapHelper(helper, function(options) {
1045
- return Utils.extend({ lookupProperty }, options);
1046
- });
1047
- }
1048
- });
1049
-
1050
- // node_modules/handlebars/dist/cjs/handlebars/no-conflict.js
1051
- var require_no_conflict = __commonJS((exports2, module2) => {
1052
- exports2.__esModule = true;
1053
- exports2["default"] = function(Handlebars) {
1054
- (function() {
1055
- if (typeof globalThis === "object")
1056
- return;
1057
- Object.prototype.__defineGetter__("__magic__", function() {
1058
- return this;
1059
- });
1060
- __magic__.globalThis = __magic__;
1061
- delete Object.prototype.__magic__;
1062
- })();
1063
- var $Handlebars = globalThis.Handlebars;
1064
- Handlebars.noConflict = function() {
1065
- if (globalThis.Handlebars === Handlebars) {
1066
- globalThis.Handlebars = $Handlebars;
1067
- }
1068
- return Handlebars;
1069
- };
1070
- };
1071
- module2.exports = exports2["default"];
1072
- });
1073
-
1074
- // node_modules/handlebars/dist/cjs/handlebars.runtime.js
1075
- var require_handlebars_runtime = __commonJS((exports2, module2) => {
1076
- exports2.__esModule = true;
1077
- function _interopRequireDefault(obj) {
1078
- return obj && obj.__esModule ? obj : { default: obj };
1079
- }
1080
- function _interopRequireWildcard(obj) {
1081
- if (obj && obj.__esModule) {
1082
- return obj;
1083
- } else {
1084
- var newObj = {};
1085
- if (obj != null) {
1086
- for (var key in obj) {
1087
- if (Object.prototype.hasOwnProperty.call(obj, key))
1088
- newObj[key] = obj[key];
1089
- }
1090
- }
1091
- newObj["default"] = obj;
1092
- return newObj;
1093
- }
1094
- }
1095
- var _handlebarsBase = require_base();
1096
- var base = _interopRequireWildcard(_handlebarsBase);
1097
- var _handlebarsSafeString = require_safe_string();
1098
- var _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString);
1099
- var _handlebarsException = require_exception();
1100
- var _handlebarsException2 = _interopRequireDefault(_handlebarsException);
1101
- var _handlebarsUtils = require_utils();
1102
- var Utils = _interopRequireWildcard(_handlebarsUtils);
1103
- var _handlebarsRuntime = require_runtime();
1104
- var runtime = _interopRequireWildcard(_handlebarsRuntime);
1105
- var _handlebarsNoConflict = require_no_conflict();
1106
- var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);
1107
- function create() {
1108
- var hb = new base.HandlebarsEnvironment;
1109
- Utils.extend(hb, base);
1110
- hb.SafeString = _handlebarsSafeString2["default"];
1111
- hb.Exception = _handlebarsException2["default"];
1112
- hb.Utils = Utils;
1113
- hb.escapeExpression = Utils.escapeExpression;
1114
- hb.VM = runtime;
1115
- hb.template = function(spec) {
1116
- return runtime.template(spec, hb);
1117
- };
1118
- return hb;
1119
- }
1120
- var inst = create();
1121
- inst.create = create;
1122
- _handlebarsNoConflict2["default"](inst);
1123
- inst["default"] = inst;
1124
- exports2["default"] = inst;
1125
- module2.exports = exports2["default"];
1126
- });
1127
-
1128
- // node_modules/handlebars/runtime.js
1129
- var require_runtime2 = __commonJS((exports2, module2) => {
1130
- module2.exports = require_handlebars_runtime()["default"];
1131
- });
1132
-
1133
- // src/index.ts
1134
- var exports_src = {};
1135
- __export(exports_src, {
1136
- uri: () => uri,
1137
- upper: () => upper,
1138
- slug: () => slug,
1139
- sed: () => sed,
1140
- search: () => search,
1141
- replace: () => replace,
1142
- path: () => path,
1143
- or: () => or,
1144
- lower: () => lower,
1145
- join: () => join,
1146
- isIn: () => isIn,
1147
- eq: () => eq,
1148
- coalesce: () => coalesce,
1149
- buildDynamicBidRequestRecursive: () => buildDynamicBidRequestRecursive,
1150
- buildDynamicBidRequestFromSelectedScreenSize: () => buildDynamicBidRequestFromSelectedScreenSize,
1151
- array: () => array,
1152
- and: () => and,
1153
- WrapValue: () => WrapValue,
1154
- VideoMimes: () => VideoMimes,
1155
- ValueOr: () => ValueOr,
1156
- UnknownBidderError: () => UnknownBidderError,
1157
- TryGet: () => TryGet,
1158
- TryDoFlat: () => TryDoFlat,
1159
- TryDoAsync: () => TryDoAsync,
1160
- TryDo: () => TryDo,
1161
- StartRequest: () => StartRequest,
1162
- StartNative: () => StartNative,
1163
- Some: () => Some,
1164
- ResultStream: () => ResultStream,
1165
- RequestBids: () => RequestBids,
1166
- PlacementTypes: () => PlacementTypes,
1167
- Pipe: () => Pipe,
1168
- PROD_SPONSORED_PRODUCT_FEED: () => PROD_SPONSORED_PRODUCT_FEED,
1169
- PROD_RECOMMENDER_SERVICE: () => PROD_RECOMMENDER_SERVICE,
1170
- PROD_RECOMMENDED_PRODUCT_FEED: () => PROD_RECOMMENDED_PRODUCT_FEED,
1171
- PROD_DYNAMIC_ZONE_SERVICE: () => PROD_DYNAMIC_ZONE_SERVICE,
1172
- PROD_CONFIGURATION_SERVICE: () => PROD_CONFIGURATION_SERVICE,
1173
- PROD_BIDDER: () => PROD_BIDDER,
1174
- Ok: () => Ok,
1175
- NotABrowserError: () => NotABrowserError,
1176
- NoValueError: () => NoValueError,
1177
- NoNativeError: () => NoNativeError,
1178
- NoDynamicScreenSizeMatchError: () => NoDynamicScreenSizeMatchError,
1179
- NoBidsError: () => NoBidsError,
1180
- NativeResponseToProductInformation: () => NativeResponseToProductInformation,
1181
- NativePosition: () => NativePosition,
1182
- NativeImageTypes: () => NativeImageTypes,
1183
- NativeDataTypes: () => NativeDataTypes,
1184
- NativeAssetId: () => NativeAssetId,
1185
- MultipleErrorsError: () => MultipleErrorsError,
1186
- MissingWinUrlError: () => MissingWinUrlError,
1187
- MissingProductIdError: () => MissingProductIdError,
1188
- MissingProductError: () => MissingProductError,
1189
- MissingDynamicZoneError: () => MissingDynamicZoneError,
1190
- MissingConfigurationError: () => MissingConfigurationError,
1191
- MissingBidsError: () => MissingBidsError,
1192
- MissingAdmError: () => MissingAdmError,
1193
- MalformedNativeResponseError: () => MalformedNativeResponseError,
1194
- MalformedBidResponseError: () => MalformedBidResponseError,
1195
- InvalidRecommenderTypeError: () => InvalidRecommenderTypeError,
1196
- InternalServerError: () => InternalServerError,
1197
- InitSurfAdsCoreServices: () => InitSurfAdsCoreServices,
1198
- InitSurfAdsCoreSSR: () => InitSurfAdsCoreSSR,
1199
- InitSurfAdsCoreInternal: () => InitSurfAdsCoreInternal,
1200
- InitSurfAdsCore: () => InitSurfAdsCore,
1201
- InitLogger: () => InitLogger,
1202
- GetWindowInfo: () => GetWindowInfo,
1203
- GetValueOrThrow: () => GetValueOrThrow,
1204
- GetValue: () => GetValue,
1205
- GetSponsoredProduct: () => GetSponsoredProduct,
1206
- GetRecommendedProduct: () => GetRecommendedProduct,
1207
- GetHelpers: () => GetHelpers,
1208
- GetGeo: () => GetGeo,
1209
- GetDynamicZone: () => GetDynamicZone,
1210
- GetDevice: () => GetDevice,
1211
- GetConfiguration: () => GetConfiguration,
1212
- GetAllSponsoredProducts: () => GetAllSponsoredProducts,
1213
- GeoContextToORTB: () => GeoContextToORTB,
1214
- GenerateTopProducts: () => GenerateTopProducts,
1215
- GenerateSponsoredProductCardResponse: () => GenerateSponsoredProductCardResponse,
1216
- GeneratePreviousPurchases: () => GeneratePreviousPurchases,
1217
- GenerateForYou: () => GenerateForYou,
1218
- GenerateArray: () => GenerateArray,
1219
- Filter: () => Filter,
1220
- EventTypes: () => EventTypes,
1221
- EventTrackingMethods: () => EventTrackingMethods,
1222
- EvaluateHandlebarsProductCardTemplate: () => EvaluateHandlebarsProductCardTemplate,
1223
- EvaluateHandlebarsClickthroughTemplate: () => EvaluateHandlebarsClickthroughTemplate,
1224
- Err: () => Err,
1225
- DefaultNative: () => DefaultNative,
1226
- Ctx: () => Ctx,
1227
- CreativeType: () => CreativeType,
1228
- ContextTypes: () => ContextTypes,
1229
- ContextSubTypes: () => ContextSubTypes,
1230
- ConsumeNAsync: () => ConsumeNAsync,
1231
- ConsumeN: () => ConsumeN,
1232
- ConsumeAllAsync: () => ConsumeAllAsync,
1233
- ConsumeAll: () => ConsumeAll,
1234
- BuildSponsoredCarouselFromInitialBid: () => BuildSponsoredCarouselFromInitialBid,
1235
- BuildSponsoredCarousel: () => BuildSponsoredCarousel,
1236
- BuildRecommendedCarousel: () => BuildRecommendedCarousel,
1237
- BuildHybridCarouselFromInitialBid: () => BuildHybridCarouselFromInitialBid,
1238
- BuildHybridCarousel: () => BuildHybridCarousel,
1239
- BuildDynamicZoneRequest: () => BuildDynamicZoneRequest,
1240
- BuildClickthroughUrl: () => BuildClickthroughUrl,
1241
- BuildAllSponsoredProductCardResponses: () => BuildAllSponsoredProductCardResponses,
1242
- BidderStartingUpError: () => BidderStartingUpError,
1243
- AsyncPipe: () => AsyncPipe,
1244
- AssertValue: () => AssertValue,
1245
- AnyFailed: () => AnyFailed,
1246
- AllOrNone: () => AllOrNone,
1247
- AgentTypes: () => AgentTypes,
1248
- AdCom10DeviceTypes: () => AdCom10DeviceTypes
1249
- });
1250
- module.exports = __toCommonJS(exports_src);
1251
- // src/models/rtb/BidRequest.ts
1252
- var AgentTypes = {
1253
- Session: 1,
1254
- Device: 2,
1255
- User: 3
1256
- };
1257
- var AdCom10DeviceTypes = {
1258
- Mobile: 1,
1259
- PC: 2,
1260
- CTV: 3,
1261
- Phone: 4,
1262
- Tablet: 5,
1263
- Connected: 6,
1264
- SetTop: 7,
1265
- OOH: 8
1266
- };
1267
- // src/models/rtb/NativeRequest.ts
1268
- var NativePosition = {
1269
- Unknown: 0,
1270
- AboveTheFold: 1,
1271
- BelowTheFold: 3,
1272
- Header: 4,
1273
- Footer: 5,
1274
- Sidebar: 6,
1275
- FullScreen: 7
1276
- };
1277
- var NativeImageTypes = {
1278
- Icon: 1,
1279
- Main: 3
1280
- };
1281
- var NativeDataTypes = {
1282
- Sponsored: 1,
1283
- Desc: 2,
1284
- Rating: 3,
1285
- Likes: 4,
1286
- Downloads: 5,
1287
- Price: 6,
1288
- SalePrice: 7,
1289
- Phone: 8,
1290
- Address: 9,
1291
- Desc2: 10,
1292
- DisplayURL: 11,
1293
- CTAText: 12,
1294
- SurfStrain: 500,
1295
- SurfTHC: 501,
1296
- SurfCBD: 502,
1297
- SurfCategory: 503,
1298
- SurfMetaProduct: 599
1299
- };
1300
- var NativeAssetId = {
1301
- Title: 0,
1302
- Image: 1,
1303
- Sponsored: 2,
1304
- Desc: 3,
1305
- Rating: 4,
1306
- Price: 5,
1307
- SalePrice: 6,
1308
- DisplayURL: 7,
1309
- CTAText: 8,
1310
- Video: 9,
1311
- SurfStrain: 500,
1312
- SurfTHC: 501,
1313
- SurfCBD: 502,
1314
- SurfCategory: 503,
1315
- SurfMetaBrand: 598,
1316
- SurfMetaProduct: 599
1317
- };
1318
- var EventTypes = {
1319
- Imp: 1,
1320
- ViewableMRC50: 2,
1321
- ViewableMRC100: 3,
1322
- ViewableVIDEO50: 4
1323
- };
1324
- var ContextTypes = {
1325
- Content: 1,
1326
- Social: 2,
1327
- Product: 3
1328
- };
1329
- var ContextSubTypes = {
1330
- General: 10,
1331
- Article: 11,
1332
- Video: 12,
1333
- Audio: 13,
1334
- Image: 14,
1335
- UserGenerated: 15,
1336
- GeneralSocial: 20,
1337
- Email: 21,
1338
- Chat: 22,
1339
- Product: 30,
1340
- Application: 31,
1341
- ProductReviews: 32
1342
- };
1343
- var PlacementTypes = {
1344
- InFeed: 1,
1345
- Atomic: 2,
1346
- OutsideCore: 3,
1347
- Recommendation: 4
1348
- };
1349
- var VideoMimes = {
1350
- MP4: "video/mp4",
1351
- WEBM: "video/webm"
1352
- };
1353
- var EventTrackingMethods = {
1354
- Img: 1,
1355
- JS: 2
1356
- };
1357
- // src/models/rtb/NativeResponse.ts
1358
- var findDataAssetByType = (assets, id) => assets?.find((asset) => asset.id === id)?.data?.value;
1359
- function NativeResponseToProductInformation(native) {
1360
- const brand = findDataAssetByType(native.native.assets, NativeAssetId.Sponsored);
1361
- return {
1362
- image: native.native.assets?.find((asset) => asset.img?.type === NativeImageTypes.Main)?.img?.url,
1363
- name: native.native.assets?.find((asset) => asset.title !== undefined)?.title?.text,
1364
- price: findDataAssetByType(native.native.assets, NativeAssetId.Price),
1365
- salePrice: findDataAssetByType(native.native.assets, NativeAssetId.SalePrice),
1366
- thc: findDataAssetByType(native.native.assets, NativeAssetId.SurfTHC),
1367
- cbd: findDataAssetByType(native.native.assets, NativeAssetId.SurfCBD),
1368
- strain: findDataAssetByType(native.native.assets, NativeAssetId.SurfStrain),
1369
- brand_name: brand,
1370
- brandName: brand,
1371
- productType: findDataAssetByType(native.native.assets, NativeAssetId.SurfCategory),
1372
- details: findDataAssetByType(native.native.assets, NativeAssetId.Desc),
1373
- cta: findDataAssetByType(native.native.assets, NativeAssetId.CTAText),
1374
- clickthroughUrl: native.native.link?.url ?? null,
1375
- pixelUrl: native.native.eventtrackers?.find((event) => event.event === EventTypes.Imp)?.url
1376
- };
1377
- }
1378
- // src/services/Logger.ts
1379
- var SURF_PREFIX = "%c[SURF]";
1380
- var SEPARATOR = " ›";
1381
- var UNDEF = "[ undefined ]";
1382
- var LogColors = {
1383
- Lavender: "#c0abff",
1384
- UltraRed: "#f97585",
1385
- SoftGold: "#f4bd5d",
1386
- MagicMint: "#baf7db"
1387
- };
1388
- var log = (log2, args, color) => {
1389
- args.unshift(`border-radius: 3px; margin-left: 10px; background: ${color}; font-size: 12px; font-weight: bold;`);
1390
- args.unshift(SURF_PREFIX);
1391
- log2.apply(console, args);
1392
- };
1393
- var info = (...args) => log(console.log, ["(Info)", ...args], LogColors.Lavender);
1394
- var warn = (...args) => log(console.warn, ["(Warning)", ...args], LogColors.SoftGold);
1395
- var debug = (...args) => log(console.debug, ["(Debug)", ...args], LogColors.MagicMint);
1396
- var error = (...args) => log(console.error, ["(Error)", ...args], LogColors.UltraRed);
1397
- var context = (logger, ...prefix) => {
1398
- const newPrefix = joinCtx(prefix) + SEPARATOR;
1399
- const newLogger = {
1400
- info: logger.info.bind(undefined, newPrefix),
1401
- warn: logger.warn.bind(undefined, newPrefix),
1402
- debug: logger.debug.bind(undefined, newPrefix),
1403
- error: logger.error.bind(undefined, newPrefix),
1404
- table: console.table,
1405
- with: logger.with
1406
- };
1407
- newLogger.with = context.bind(undefined, newLogger);
1408
- return newLogger;
1409
- };
1410
- var InitLogger = () => {
1411
- const logger = {
1412
- info,
1413
- warn,
1414
- debug,
1415
- error,
1416
- table: console.table
1417
- };
1418
- logger.with = context.bind(undefined, logger);
1419
- return logger;
1420
- };
1421
- var joinCtx = (ctx) => ctx.map((e) => e === undefined ? UNDEF : e).join(SEPARATOR);
1422
- var Ctx = (logger) => logger === undefined ? undefined : logger?.with === undefined ? { ...logger, with: () => Ctx(logger) } : logger;
1423
-
1424
- // src/services/Result.ts
1425
- var Ok = (t) => ({
1426
- ok: true,
1427
- value: t
1428
- });
1429
- var Err = (e) => ({
1430
- ok: false,
1431
- error: e
1432
- });
1433
- var TryDo = (fn) => {
1434
- try {
1435
- return Ok(fn());
1436
- } catch (err) {
1437
- return Err(err);
1438
- }
1439
- };
1440
- var TryDoFlat = (fn) => {
1441
- try {
1442
- return fn();
1443
- } catch (err) {
1444
- return Err(err);
1445
- }
1446
- };
1447
- var TryDoAsync = async (fn) => {
1448
- try {
1449
- return Ok(await fn());
1450
- } catch (err) {
1451
- return Err(err);
1452
- }
1453
- };
1454
- var GetValue = (result) => result?.ok ? result.value : undefined;
1455
- var ValueOr = (result, or) => result?.ok ? result.value : or;
1456
- var GetValueOrThrow = (result) => {
1457
- if (result.ok) {
1458
- return result.value;
1459
- }
1460
- throw result.error;
1461
- };
1462
- var WrapValue = (value) => {
1463
- if (value === undefined || value === null) {
1464
- return Err(new NoValueError(value));
1465
- }
1466
- return Ok(value);
1467
- };
1468
- var AssertValue = GetValueOrThrow;
1469
- var AllOrNone = (results) => {
1470
- const failed = results.filter((res) => !res.ok).map((res) => res.error);
1471
- if (failed.length > 0) {
1472
- return Err(new MultipleErrorsError(failed));
1473
- }
1474
- const success = results.filter((res) => res.ok).map((res) => res.value);
1475
- return Ok(success);
1476
- };
1477
- var Some = (results) => {
1478
- const success = results.filter((res) => res.ok).map((res) => res.value);
1479
- return Ok(success);
1480
- };
1481
- var Filter = (...results) => {
1482
- const success = Some(results).value.map((val) => Ok(val));
1483
- const failed = results.filter((res) => !res.ok);
1484
- return [success, failed];
1485
- };
1486
- var AnyFailed = (...results) => {
1487
- const errors = results.filter((res) => !res.ok).map((res) => res.error);
1488
- if (errors.length) {
1489
- return [true, errors];
1490
- }
1491
- return [false];
1492
- };
1493
-
1494
- class MultipleErrorsError extends Error {
1495
- errors;
1496
- constructor(errors) {
1497
- super(`Got multiple errors:
1498
- ` + errors.map((err) => "\t" + err.message.substring(0, 32).padEnd(35, ".")).join(`
1499
- `));
1500
- this.errors = errors;
1501
- }
1502
- }
1503
- var Pipe = (result) => ({
1504
- then: pipeThen(result),
1505
- result: pipeResult(result),
1506
- value: pipeValue(result),
1507
- valueOr: pipeValueOr(result),
1508
- valueOrThrow: pipeValueOrThrow(result)
1509
- });
1510
- var pipeThen = (result) => (fn) => {
1511
- if (!result.ok) {
1512
- return Pipe(result);
1513
- }
1514
- return Pipe(Ok(fn(result.value)));
1515
- };
1516
- var pipeResult = (result) => () => result;
1517
- var pipeValue = (result) => () => GetValue(result);
1518
- var pipeValueOr = (result) => (or) => GetValue(result) ?? or;
1519
- var pipeValueOrThrow = (result) => () => {
1520
- if (result.ok) {
1521
- return result.value;
1522
- }
1523
- throw result.error;
1524
- };
1525
- var AsyncPipe = (result) => ({
1526
- then: asyncPipeThen(result),
1527
- result: asyncPipeResult(result),
1528
- value: asyncPipeValue(result),
1529
- valueOr: asyncPipeValueOr(result),
1530
- valueOrThrow: asyncPipeValueOrThrow(result)
1531
- });
1532
- var asyncPipeThen = (result) => (fn) => {
1533
- const asyncResult = result;
1534
- const wrappedPromiseResult = asyncResult.then((unwrappedResult) => {
1535
- if (unwrappedResult.ok) {
1536
- try {
1537
- const fnRes = fn(unwrappedResult.value);
1538
- return Promise.resolve(fnRes).catch(Err);
1539
- } catch (err) {
1540
- return Err(err);
1541
- }
1542
- } else {
1543
- return unwrappedResult;
1544
- }
1545
- });
1546
- return AsyncPipe(wrappedPromiseResult);
1547
- };
1548
- var asyncPipeResult = (result) => () => result;
1549
- var asyncPipeValue = (result) => async () => {
1550
- try {
1551
- const res = await result;
1552
- if (res.ok) {
1553
- return res.value;
1554
- }
1555
- return;
1556
- } catch {
1557
- return;
1558
- }
1559
- };
1560
- var asyncPipeValueOr = (result) => async (or) => {
1561
- try {
1562
- const res = await result;
1563
- if (res.ok) {
1564
- return res.value;
1565
- }
1566
- return or;
1567
- } catch {
1568
- return or;
1569
- }
1570
- };
1571
- var asyncPipeValueOrThrow = (result) => async () => {
1572
- const res = await result;
1573
- if (res.ok) {
1574
- return res.value;
1575
- }
1576
- throw res.error;
1577
- };
1578
- var ResultStream = (results) => ({
1579
- map: streamMap(results),
1580
- filter: streamFilter(results),
1581
- results: streamResults(results),
1582
- value: streamValue(results),
1583
- valueOr: streamValueOr(results),
1584
- valueOrThrow: streamValueOrThrow(results)
1585
- });
1586
- var streamMap = (results) => (fn) => {
1587
- if (!results.ok) {
1588
- return ResultStream(results);
1589
- }
1590
- return ResultStream(Ok(results.value.map(fn)));
1591
- };
1592
- var streamFilter = (results) => (fn) => {
1593
- if (!results.ok) {
1594
- return ResultStream(results);
1595
- }
1596
- return ResultStream(Ok(results.value.filter(fn)));
1597
- };
1598
- var streamResults = (results) => () => results;
1599
- var streamValue = (results) => () => results.ok ? results.value : undefined;
1600
- var streamValueOr = (results) => (or) => results.ok ? results.value : or;
1601
- var streamValueOrThrow = (results) => () => {
1602
- if (results.ok) {
1603
- return results.value;
1604
- } else {
1605
- throw results.error;
1606
- }
1607
- };
1608
-
1609
- class NoValueError extends Error {
1610
- value;
1611
- constructor(value) {
1612
- super("Value was undefined or null");
1613
- this.value = value;
1614
- }
1615
- }
1616
-
1617
- // src/services/Geo.ts
1618
- var SURF_GEO_SERVICE_URL = "https://g.surfside.io/enrich";
1619
- var LOCATION_TYPE_IP = 2;
1620
- var IP_SERVICES_MAXMIND = 3;
1621
- var GetGeo = async (logger, apiToken, ip) => {
1622
- const log2 = Ctx(logger)?.with("GeoService");
1623
- log2?.info("Getting Geo info");
1624
- try {
1625
- const response = await fetch(SURF_GEO_SERVICE_URL);
1626
- log2?.debug("Geo Response", response);
1627
- return Ok(await response.json());
1628
- } catch (err) {
1629
- return Err(err);
1630
- }
1631
- };
1632
- var GeoContextToORTB = (logger, geoContext) => ({
1633
- lat: geoContext.coords.latitude,
1634
- lon: geoContext.coords.longitude,
1635
- city: geoContext.city,
1636
- region: geoContext.region,
1637
- country: geoContext.country,
1638
- zip: geoContext.zip,
1639
- type: LOCATION_TYPE_IP,
1640
- accuracy: geoContext.coords.accuracy,
1641
- utcoffset: geoContext.utcoffset,
1642
- ipservice: IP_SERVICES_MAXMIND
1643
- });
1644
- // src/services/Device.ts
1645
- var GetDevice = (logger, screen, navigator2, mobile) => {
1646
- const log2 = Ctx(logger)?.with("DeviceService");
1647
- log2?.info("Getting device info");
1648
- const deviceInfo = getDeviceInfo(log2, navigator2.userAgent);
1649
- const sua = {
1650
- model: deviceInfo?.model,
1651
- mobile: mobile ? 1 : 0,
1652
- browsers: deviceInfo?.browser !== undefined ? [deviceInfo.browser] : undefined,
1653
- platform: deviceInfo?.os !== undefined ? {
1654
- brand: deviceInfo?.os,
1655
- version: deviceInfo?.osv?.split(".")
1656
- } : undefined,
1657
- architecture: getCPUArchitecture(log2, navigator2.userAgent, mobile),
1658
- source: 3
1659
- };
1660
- return Ok({
1661
- make: deviceInfo?.make,
1662
- model: deviceInfo?.model,
1663
- w: screen.width,
1664
- h: screen.height,
1665
- language: navigator2.language,
1666
- ua: navigator2.userAgent,
1667
- devicetype: getDeviceType(log2, screen, mobile),
1668
- os: deviceInfo?.os,
1669
- osv: deviceInfo?.osv,
1670
- sua
1671
- });
1672
- };
1673
- var getDeviceInfo = (logger, userAgent) => {
1674
- const log2 = Ctx(logger)?.with("tryGetDeviceInfo");
1675
- log2?.debug("getting device info");
1676
- const userAgentLower = userAgent.toLowerCase();
1677
- const browser = getBrowserInfo(log2, navigator.userAgent);
1678
- if (userAgentLower.includes("android")) {
1679
- return {
1680
- ...getAndroidDeviceInfo(log2, userAgent),
1681
- browser
1682
- };
1683
- } else if (userAgentLower.includes("iphone") || userAgentLower.includes("ipad")) {
1684
- return {
1685
- ...getiPhoneDeviceInfo(log2, userAgent),
1686
- browser
1687
- };
1688
- } else if (userAgentLower.includes("windows nt")) {
1689
- return {
1690
- make: "Microsoft",
1691
- model: "Windows",
1692
- os: "Windows",
1693
- osv: /Windows NT (?<osv>[0-9.]+)/ig.exec(userAgent)?.groups?.osv,
1694
- browser
1695
- };
1696
- } else if (userAgentLower.includes("macintosh")) {
1697
- return {
1698
- make: "Apple",
1699
- model: "Macintosh",
1700
- os: "MacOS",
1701
- osv: /Mac OS X (?<osv>[0-9_]+)/ig.exec(userAgent)?.groups?.osv?.replaceAll("_", "."),
1702
- browser
1703
- };
1704
- }
1705
- return { browser };
1706
- };
1707
- var getAndroidDeviceInfo = (logger, userAgent) => {
1708
- const log2 = Ctx(logger)?.with("getAndroidDeviceInfo");
1709
- log2?.debug("getting android info");
1710
- const match = /^[^\s]+\s\((?<Linux>.*);\s*(?<osv>[^)]+);\s*(?<Model>[^)]+)\)/ig.exec(userAgent);
1711
- const osv = match?.groups?.osv;
1712
- const model = match?.groups?.Model;
1713
- const partialDevice = {
1714
- os: "Android",
1715
- osv,
1716
- model
1717
- };
1718
- if (model !== undefined) {
1719
- if (model.includes("Pixel")) {
1720
- return {
1721
- ...partialDevice,
1722
- make: "Google"
1723
- };
1724
- } else if (model.includes("SM-")) {
1725
- return {
1726
- ...partialDevice,
1727
- make: "Samsung"
1728
- };
1729
- } else if (model.startsWith("LG-")) {
1730
- return {
1731
- ...partialDevice,
1732
- make: "LG"
1733
- };
1734
- } else if (model.startsWith("moto")) {
1735
- return {
1736
- ...partialDevice,
1737
- make: "Motorola"
1738
- };
1739
- } else if (model.startsWith("Redmi")) {
1740
- return {
1741
- ...partialDevice,
1742
- make: "Xiaomi"
1743
- };
1744
- } else {
1745
- return {
1746
- ...partialDevice,
1747
- make: "Android"
1748
- };
1749
- }
1750
- }
1751
- return {
1752
- os: "Android",
1753
- osv
1754
- };
1755
- };
1756
- var getiPhoneDeviceInfo = (logger, userAgent) => {
1757
- const log2 = Ctx(logger)?.with("getIphoneDeviceInfo");
1758
- log2?.debug("getting iPhone info");
1759
- const match = /^[^\s]+\s*\((?<Device>[^;]+);\s(?<Model>[^;)]+[;)])\s(?<ModelExt>[^;)]+[;)])?/ig.exec(userAgent);
1760
- const make = "Apple";
1761
- const device = match?.groups?.Device;
1762
- const model = device?.toLowerCase().includes("ipad") ? "iPad" : "iPhone";
1763
- const modelGroup = match?.groups?.Model;
1764
- const os = "iOS";
1765
- const osvSearch = modelGroup === "U" ? match?.groups?.ModelExt : modelGroup;
1766
- const osv = osvSearch !== undefined ? /OS (?<ver>[0-9_]+)/ig.exec(osvSearch)?.groups?.ModelExt : undefined;
1767
- return {
1768
- make,
1769
- model,
1770
- os,
1771
- osv
1772
- };
1773
- };
1774
- var getBrowserInfo = (logger, userAgent) => {
1775
- const log2 = Ctx(logger)?.with("getBrowserInfo");
1776
- log2?.debug("getting browser info");
1777
- try {
1778
- if (userAgent.includes("Firefox/")) {
1779
- return {
1780
- version: userAgent.split("Firefox/")[1]?.split("."),
1781
- brand: "Firefox"
1782
- };
1783
- } else if (userAgent.includes("Chrome/")) {
1784
- return {
1785
- version: userAgent.split("Chrome/")[1]?.split(" ")[0]?.split("."),
1786
- brand: "Chrome"
1787
- };
1788
- } else if (userAgent.includes("CriOS")) {
1789
- return {
1790
- version: userAgent.split("CriOS/")[1]?.split(" ")[0]?.split("."),
1791
- brand: "Chrome"
1792
- };
1793
- } else if (userAgent.includes("Safari/") && !userAgent.includes("Chrome")) {
1794
- return {
1795
- version: userAgent.split("Version/")[1]?.split(" ")[0]?.split("."),
1796
- brand: "Safari"
1797
- };
1798
- } else if (userAgent.includes("Edg/")) {
1799
- return {
1800
- version: userAgent.split("Edg/")[1]?.split("."),
1801
- brand: "Edge"
1802
- };
1803
- }
1804
- } catch (error2) {
1805
- log2?.error(error2);
1806
- }
1807
- };
1808
- var getCPUArchitecture = (logger, userAgent, mobile) => {
1809
- const log2 = Ctx(logger)?.with("getCPUArchitecture");
1810
- log2?.debug("Getting CPU arch");
1811
- if (/Win64|x64|x86_64|WOW64/.test(userAgent)) {
1812
- return "x64";
1813
- }
1814
- if (/Win32|x86/.test(userAgent)) {
1815
- return "x86";
1816
- }
1817
- if (/aarch64|arm64/.test(userAgent)) {
1818
- return "ARM64";
1819
- }
1820
- if (/armv\d+/.test(userAgent)) {
1821
- return "ARM";
1822
- }
1823
- if (mobile) {
1824
- return "ARM";
1825
- }
1826
- log2?.warn("Failed to get cpu architecture");
1827
- return;
1828
- };
1829
- var getDeviceType = (logger, screen, mobile) => {
1830
- const log2 = Ctx(logger)?.with("getDeviceType");
1831
- log2?.debug("getting device type");
1832
- const MINIMUM_SHORT_TABLET = 600;
1833
- const MAXIMUM_LONG_TABLET = 960;
1834
- const hasTouch = mobile;
1835
- if (!hasTouch) {
1836
- return AdCom10DeviceTypes.PC;
1837
- }
1838
- const width = screen.width;
1839
- const height = screen.height;
1840
- const [shorterSide, longerSide] = [width, height].sort((a, b) => a - b);
1841
- if (hasTouch && shorterSide >= MINIMUM_SHORT_TABLET && longerSide >= MAXIMUM_LONG_TABLET) {
1842
- return AdCom10DeviceTypes.Tablet;
1843
- }
1844
- return AdCom10DeviceTypes.Mobile;
1845
- };
1846
- // src/services/Configuration.ts
1847
- var GetConfiguration = async (logger, url, handlebars, helpers, accountId, siteId) => {
1848
- const log2 = Ctx(logger)?.with("ConfigurationService").with(url).with(accountId).with(siteId);
1849
- log2?.info("Getting configuration");
1850
- try {
1851
- const response = await fetch(`${url}/${accountId}/${siteId}/config.json`);
1852
- if (!response.ok) {
1853
- log2?.error("Failed to get configuration", url, accountId, siteId);
1854
- return Err(new Error("Failed to get configuration"));
1855
- }
1856
- const config = await response.json();
1857
- if (config.settings === undefined || config.templates === undefined) {
1858
- log2?.error("configuration was an invalid format");
1859
- return Err(new Error("configuration was an invalid format"));
1860
- }
1861
- log2?.debug("configuration: ", config);
1862
- return await mapConfig(log2, handlebars, helpers, config);
1863
- } catch (err) {
1864
- return Err(err);
1865
- }
1866
- };
1867
- var mapConfig = async (logger, handlebars, helpers, config) => {
1868
- const log2 = Ctx(logger)?.with("mapConfig");
1869
- log2?.debug("mapping configuration");
1870
- const productCardTemplate = handlebars.template((await importModule(log2, `export default ${config.templates?.productCardTemplate ?? ""}`)).default);
1871
- const clickthroughTemplate = handlebars.template((await importModule(log2, `export default ${config.templates?.clickThroughUrlTemplate ?? ""}`)).default);
1872
- return Ok({
1873
- settings: config.settings,
1874
- templates: {
1875
- clickThroughUrlTemplate: (context2) => clickthroughTemplate(context2, { helpers }),
1876
- productCardTemplate: (context2) => productCardTemplate(context2, { helpers }),
1877
- javascriptCallbacks: await importModule(log2, config.templates?.javascriptCallbacks ?? ""),
1878
- productCardStylesheet: config.templates?.productCardStylesheet,
1879
- carouselStylesheet: config.templates?.carouselStylesheet
1880
- },
1881
- dynamicZones: config.dynamicZones
1882
- });
1883
- };
1884
- var importModule = async (logger, script) => {
1885
- const log2 = Ctx(logger)?.with("importModule");
1886
- log2?.debug("importing", script);
1887
- const blob = new Blob([script], { type: "text/javascript" });
1888
- const moduleUrl = URL.createObjectURL(blob);
1889
- log2?.debug("moduleUrl", moduleUrl);
1890
- const module2 = await import(moduleUrl);
1891
- log2?.debug("module:", module2);
1892
- return module2;
1893
- };
1894
- // src/services/Bidder.ts
1895
- var AUCTION_PRICE_MACRO = /(?:\$|%24)?(?:\{|%7b)auction_price(?:\}|%7d)/ig;
1896
- var RequestBids = async (logger, url, accountId, siteId, locationId, channelId, bidRequest) => {
1897
- const log2 = Ctx(logger)?.with("RequestBids").with(accountId).with(siteId).with(locationId).with(channelId);
1898
- log2?.info("Requesting bids");
1899
- log2?.debug(bidRequest);
1900
- try {
1901
- const response = await fetch(url, {
1902
- method: "POST",
1903
- body: JSON.stringify(bidRequest)
1904
- });
1905
- log2?.debug("Got response", response);
1906
- if (response.status !== 200) {
1907
- switch (response.status) {
1908
- case 204:
1909
- log2?.warn("No bids", bidRequest, response);
1910
- return Err(new NoBidsError(bidRequest, response));
1911
- case 500:
1912
- log2?.error("Bidder failed serverside. Report this error.", bidRequest, response);
1913
- return Err(new InternalServerError(bidRequest, response));
1914
- case 503:
1915
- log2?.error("Bidder starting up. Try again in a few minutes", bidRequest, response);
1916
- return Err(new BidderStartingUpError(bidRequest, response));
1917
- default:
1918
- log2?.error("Unknown bidder error", bidRequest, response);
1919
- return Err(new UnknownBidderError(bidRequest, response));
1920
- }
1921
- }
1922
- log2?.debug("Successfully got bids", bidRequest);
1923
- const bidResponse = await response.json();
1924
- if (bidResponse.seatbid === undefined || bidResponse.seatbid.length === 0) {
1925
- log2?.error("Bidder didn't return any seatbids");
1926
- return Err(new MalformedBidResponseError(bidRequest, response, bidResponse));
1927
- }
1928
- for (let i = 0;i < bidResponse.seatbid.length; i++) {
1929
- const seatbid = bidResponse.seatbid[i];
1930
- if (seatbid === undefined) {
1931
- log2?.warn(`Seatbid #${i} was undefined`, bidRequest, response, bidResponse);
1932
- continue;
1933
- }
1934
- for (let j = 0;j < seatbid.bid.length; j++) {
1935
- const bid = seatbid.bid[j];
1936
- if (bid === undefined) {
1937
- log2?.warn(`Bid #${j} in seatbid #${i} was undefined`);
1938
- continue;
1939
- }
1940
- try {
1941
- bid.adm = decodeURIComponent(bid?.adm ?? "").replaceAll(/\\"/ig, '"');
1942
- } catch {
1943
- log2?.debug("Adm is not encoded. This is not an issue. Moving on.");
1944
- }
1945
- bid.nurl = bid.nurl?.replace(AUCTION_PRICE_MACRO, bid.price.toString());
1946
- bid.adm = bid.adm?.replaceAll(AUCTION_PRICE_MACRO, bid.price.toString());
1947
- }
1948
- }
1949
- log2?.debug("Returning bid responses");
1950
- return Ok(bidResponse);
1951
- } catch (err) {
1952
- return Err(err);
1953
- }
1954
- };
1955
-
1956
- class NoBidsError extends Error {
1957
- request;
1958
- response;
1959
- constructor(request, response) {
1960
- super("204 - No bids available for request");
1961
- this.request = request;
1962
- this.response = response;
1963
- }
1964
- }
1965
-
1966
- class InternalServerError extends Error {
1967
- request;
1968
- response;
1969
- constructor(request, response) {
1970
- super("500 - Bidder had an unknown serverside error");
1971
- this.request = request;
1972
- this.response = response;
1973
- }
1974
- }
1975
-
1976
- class BidderStartingUpError extends Error {
1977
- request;
1978
- response;
1979
- constructor(request, response) {
1980
- super("503 - Bidder is starting up");
1981
- this.request = request;
1982
- this.response = response;
1983
- }
1984
- }
1985
-
1986
- class UnknownBidderError extends Error {
1987
- request;
1988
- response;
1989
- constructor(request, response) {
1990
- super("Unknown bidder error");
1991
- this.request = request;
1992
- this.response = response;
1993
- }
1994
- }
1995
-
1996
- class MalformedBidResponseError extends Error {
1997
- request;
1998
- response;
1999
- bidResponse;
2000
- constructor(request, response, bidResponse) {
2001
- super("Malformed bid response error");
2002
- this.request = request;
2003
- this.response = response;
2004
- this.bidResponse = bidResponse;
2005
- }
2006
- }
2007
- // src/services/Product.ts
2008
- async function* GetSponsoredProduct(logger, url, accountId, locationId, nativeId) {
2009
- const log2 = Ctx(logger)?.with("GetSponsoredProduct").with(accountId).with(locationId).with(nativeId);
2010
- log2?.info("Getting sponsored product");
2011
- try {
2012
- const rawResponse = await fetch(`${url}/native/${accountId}/${locationId}/${nativeId}.json`);
2013
- if (rawResponse.status !== 200) {
2014
- log2?.error("product feed service returned with non-200 response", rawResponse.status);
2015
- return;
2016
- }
2017
- const products = rawResponse;
2018
- log2?.debug("response", products);
2019
- if (Array.isArray(products)) {
2020
- log2?.debug("Brand level creative");
2021
- const productArr = products;
2022
- for (const product of productArr) {
2023
- yield mapResponseToProductInfo(log2, product);
2024
- }
2025
- } else {
2026
- log2?.debug("Individual product creative");
2027
- const product = products;
2028
- return mapResponseToProductInfo(log2, product);
2029
- }
2030
- } catch (err) {
2031
- log2?.error(err);
2032
- }
2033
- }
2034
- var GetAllSponsoredProducts = async (logger, url, accountId, locationId, nativeId) => {
2035
- const log2 = Ctx(logger)?.with("GetSponsoredProduct").with(accountId).with(locationId).with(nativeId);
2036
- log2?.info("Getting sponsored product");
2037
- try {
2038
- const rawResponse = await fetch(`${url}/native/${accountId}/${locationId}/${nativeId}.json`);
2039
- if (rawResponse.status !== 200) {
2040
- log2?.error("product feed service returned with non-200 response", rawResponse.status);
2041
- return Err(new NoNativeError(nativeId));
2042
- }
2043
- const products = await rawResponse.json();
2044
- log2?.debug("response", products);
2045
- if (Array.isArray(products)) {
2046
- log2?.debug("Brand level creative");
2047
- const productArr = products;
2048
- const mapResponseToProductInfoLogged = mapResponseToProductInfo.bind(undefined, log2);
2049
- return Ok(productArr.map(mapResponseToProductInfoLogged));
2050
- } else {
2051
- log2?.debug("Individual product creative");
2052
- const product = products;
2053
- return Ok([mapResponseToProductInfo(log2, product)]);
2054
- }
2055
- } catch (err) {
2056
- log2?.error(err);
2057
- return Err(err);
2058
- }
2059
- };
2060
- var GetRecommendedProduct = async (logger, url, accountId, locationId, productId) => {
2061
- const log2 = Ctx(logger)?.with("GetRecommendedProduct").with(accountId).with(locationId).with(productId);
2062
- log2?.info("Getting recommended product");
2063
- try {
2064
- const rawResponse = await fetch(`${url}/product/${accountId}/${locationId}/${productId}.json`);
2065
- if (rawResponse.status !== 200) {
2066
- log2?.error("product feed service returned with non-200 response", rawResponse.status);
2067
- return Err(new Error("product feed service returned with non-200 response"));
2068
- }
2069
- const rawProduct = await rawResponse.json();
2070
- log2?.debug("response", rawProduct);
2071
- const productInfo = mapResponseToProductInfo(log2, rawProduct);
2072
- log2?.debug("mapped", productInfo);
2073
- return Ok(productInfo);
2074
- } catch (err) {
2075
- log2?.error(err);
2076
- return Err(err);
2077
- }
2078
- };
2079
- var mapResponseToProductInfo = (logger, data) => {
2080
- const log2 = Ctx(logger)?.with("mapResponseToProductInfo");
2081
- log2?.debug("Mapping product");
2082
- const getField = fieldOrUndef.bind(undefined, data);
2083
- return {
2084
- image: getField("image_link"),
2085
- price: getField("price"),
2086
- salePrice: getField("sale_price"),
2087
- thc: getField("thc"),
2088
- cbd: getField("cbd"),
2089
- strain: getField("strain"),
2090
- name: getField("name"),
2091
- brand_name: getField("brand"),
2092
- brandName: getField("brand"),
2093
- productType: getField("productType"),
2094
- details: getField("details"),
2095
- cta: getField("cta"),
2096
- clickthroughUrl: getField("clickthroughUrl"),
2097
- winUrl: getField("winUrl"),
2098
- pixelUrl: getField("pixelUrl"),
2099
- ext: data
2100
- };
2101
- };
2102
- var fieldOrUndef = (data, field) => {
2103
- if (field in data) {
2104
- return String(data[field]);
2105
- }
2106
- return;
2107
- };
2108
-
2109
- class NoNativeError extends Error {
2110
- nativeId;
2111
- constructor(nativeId) {
2112
- super("Native ID did not exist in product feed: " + nativeId);
2113
- this.nativeId = nativeId;
2114
- }
2115
- }
2116
- // src/services/Recommender.ts
2117
- async function* GenerateTopProducts(logger, productFeed, url, accountId, siteId, locationId) {
2118
- const log2 = Ctx(logger)?.with("GenerateTopProducts").with(accountId).with(siteId).with(locationId);
2119
- log2?.info("Generating top products");
2120
- yield* generateProductRecommendation(logger, productFeed, url, accountId, siteId, locationId, undefined, "top-products");
2121
- }
2122
- async function* GenerateForYou(logger, productFeed, url, accountId, siteId, locationId, userId) {
2123
- const log2 = Ctx(logger)?.with("GenerateForYou").with(accountId).with(siteId).with(locationId).with(userId);
2124
- log2?.info("Generating for you");
2125
- yield* generateProductRecommendation(logger, productFeed, url, accountId, siteId, locationId, userId, "for-you");
2126
- }
2127
- async function* GeneratePreviousPurchases(logger, productFeed, url, accountId, siteId, locationId, userId) {
2128
- const log2 = Ctx(logger)?.with("GeneratePreviousPurchases").with(accountId).with(siteId).with(locationId).with(userId);
2129
- log2?.info("Generating previous purchases");
2130
- yield* generateProductRecommendation(log2, productFeed, url, accountId, siteId, locationId, userId, "buy-again");
2131
- }
2132
- async function* generateProductRecommendation(logger, productFeed, url, accountId, siteId, locationId, userId, type) {
2133
- const log2 = Ctx(logger)?.with("generatreProductRecommendation");
2134
- log2?.debug("Generating product recommendation");
2135
- const recommendations = await fetchRecommendations(log2, url, accountId, siteId, locationId, userId, type);
2136
- if (!recommendations.ok) {
2137
- log2?.error(recommendations.error);
2138
- return;
2139
- }
2140
- yield* generateProduct(log2, productFeed, accountId, locationId, recommendations.value);
2141
- log2?.debug("out of recommendations");
2142
- }
2143
- var fetchRecommendations = async (logger, url, accountId, siteId, locationId, userId, type) => {
2144
- const log2 = Ctx(logger)?.with("fetchRecommendations");
2145
- log2?.debug("Fetching recommendations");
2146
- const key = `accountId=${accountId}&siteId=${siteId}&locationId=${locationId}&userId=${userId ?? "null"}`;
2147
- try {
2148
- const results = await fetch(`${url}/r/${type}?${key}&limit=100`);
2149
- if (!results.ok) {
2150
- return Err(new Error("Failed to load recommendations. Service returned " + results.status));
2151
- }
2152
- const recommendations = await results.json();
2153
- const error2 = recommendations.error;
2154
- if (error2 !== undefined) {
2155
- return Err(new Error(error2));
2156
- }
2157
- return Ok(recommendations);
2158
- } catch (err) {
2159
- return Err(err);
2160
- }
2161
- };
2162
- async function* generateProduct(logger, productFeed, accountId, locationId, results) {
2163
- const log2 = Ctx(logger)?.with("generateProduct");
2164
- log2?.debug("generating product info");
2165
- for (const item of results) {
2166
- const itemId = item.item_id;
2167
- try {
2168
- log2?.debug("itemId", itemId);
2169
- const product = await productFeed(itemId);
2170
- log2?.debug("product", itemId, product);
2171
- if (product.ok) {
2172
- yield product.value;
2173
- } else {
2174
- log2?.warn("item was missing from product feed", itemId);
2175
- }
2176
- } catch (err) {
2177
- log2?.warn("couldn't get product", err);
2178
- }
2179
- }
2180
- log2?.info("no more products. Exiting");
2181
- }
2182
- // src/services/Template.ts
2183
- var EvaluateHandlebarsProductCardTemplate = (logger, windowInfo, publisher, product, clickthrough) => {
2184
- const log2 = Ctx(logger)?.with("EvaluateHandlebarsProductCardTemplate");
2185
- log2?.info("Evaluating handlebars product card template", product);
2186
- try {
2187
- const renderedClickthrough = clickthrough ?? GetValueOrThrow(EvaluateHandlebarsClickthroughTemplate(log2, windowInfo, publisher, product));
2188
- log2?.debug("Got clickthrough URL", renderedClickthrough);
2189
- return Ok(publisher.templates.productCardTemplate({
2190
- ...product,
2191
- product,
2192
- window: windowInfo,
2193
- publisher,
2194
- catalog: product,
2195
- clickthrough: renderedClickthrough
2196
- }));
2197
- } catch (error2) {
2198
- return Err(error2);
2199
- }
2200
- };
2201
- var EvaluateHandlebarsClickthroughTemplate = (logger, windowInfo, publisher, product) => {
2202
- const log2 = Ctx(logger)?.with("EvaluateHandlebarsClickthroughTemplate");
2203
- log2?.info("Evaluating handlebars clickthrough URL template", product);
2204
- try {
2205
- return Ok(publisher.templates.clickThroughUrlTemplate({
2206
- product,
2207
- catalog: product,
2208
- window: windowInfo,
2209
- publisher,
2210
- ...product
2211
- }));
2212
- } catch (error2) {
2213
- return Err(error2);
2214
- }
2215
- };
2216
- // src/services/Dynamic.ts
2217
- var GetDynamicZone = async (logger, config, zoneId) => {
2218
- const log2 = Ctx(logger)?.with("GetDynamicZone");
2219
- log2?.info("Getting dynamic zone", zoneId);
2220
- const dynamicZone = config?.dynamicZones?.[zoneId];
2221
- if (dynamicZone === undefined) {
2222
- return Err(new MissingDynamicZoneError(zoneId));
2223
- }
2224
- log2?.debug("Dynamic zone", dynamicZone);
2225
- return Ok(dynamicZone);
2226
- };
2227
- var BuildDynamicZoneRequest = (logger, startRequest, nativeRequest, screenInfo, zoneId, dynamicZone) => {
2228
- const log2 = Ctx(logger)?.with("BuildDynamicZoneRequest");
2229
- log2?.info("Building dynamic zone request", dynamicZone);
2230
- const screenSizeRes = selectDynamicScreenSize(log2, screenInfo, dynamicZone);
2231
- if (!screenSizeRes.ok) {
2232
- return screenSizeRes;
2233
- }
2234
- return buildDynamicBidRequestFromSelectedScreenSize(log2, startRequest, nativeRequest, zoneId, screenSizeRes.value);
2235
- };
2236
- var selectDynamicScreenSize = (logger, screenInfo, dynamicZone) => {
2237
- const log2 = Ctx(logger)?.with("selectDynamicScreenSize");
2238
- log2?.info("Getting screen size for dynamic zone", screenInfo);
2239
- const screenSize = GetValue(TryDo(() => {
2240
- if (screenInfo.width < 768) {
2241
- return "mobile";
2242
- } else if (screenInfo.width < 1024) {
2243
- return "tablet";
2244
- } else {
2245
- return "desktop";
2246
- }
2247
- })) ?? "default";
2248
- const selectedDynamic = dynamicZone.value.filter((screen) => screen.size === screenSize)?.[0] ?? dynamicZone.value.filter((screen) => screen.size === "default")?.[0];
2249
- if (selectedDynamic === undefined) {
2250
- return Err(new NoDynamicScreenSizeMatchError(dynamicZone, screenInfo, screenSize));
2251
- }
2252
- log2?.debug("selectedDynamic", selectedDynamic);
2253
- return Ok(selectedDynamic);
2254
- };
2255
-
2256
- class NoDynamicScreenSizeMatchError extends Error {
2257
- dynamicZone;
2258
- screenInfo;
2259
- selectedStringSize;
2260
- constructor(dynamicZone, screenInfo, selectedStringSize) {
2261
- super("No dynamic screen size matched the window width");
2262
- this.dynamicZone = dynamicZone;
2263
- this.screenInfo = screenInfo;
2264
- this.selectedStringSize = selectedStringSize;
2265
- }
2266
- }
2267
- var buildDynamicBidRequestFromSelectedScreenSize = (logger, startRequest, nativeRequest, zoneId, screenSize) => {
2268
- const log2 = Ctx(logger)?.with("buildDynamicBidRequestFromSelectedScreenSize");
2269
- log2?.info("Building dynamic bid request", zoneId, screenSize);
2270
- const requestPayload = buildDynamicBidRequestRecursive(log2, nativeRequest, startRequest(zoneId), {}, screenSize.values);
2271
- if (!requestPayload.ok) {
2272
- return requestPayload;
2273
- }
2274
- log2?.debug("requestPayload", requestPayload);
2275
- const [builder, requestIds] = requestPayload.value;
2276
- return Ok({
2277
- request: builder.build(),
2278
- requestIds
2279
- });
2280
- };
2281
- var buildDynamicBidRequestRecursive = (logger, nativeRequest, builder, requestIds, [head, ...tail]) => {
2282
- const log2 = Ctx(logger);
2283
- log2?.info("descending...");
2284
- if (head === undefined) {
2285
- log2?.info("Finished");
2286
- return Ok([builder, requestIds]);
2287
- }
2288
- if (head.type === "Banner") {
2289
- log2?.info("Adding banner to request");
2290
- const banner = head;
2291
- const id = crypto.randomUUID();
2292
- return buildDynamicBidRequestRecursive(log2, nativeRequest, builder.withBanner(banner.width, banner.height, undefined, { id }), {
2293
- ...requestIds,
2294
- [id]: head
2295
- }, tail);
2296
- } else if (head.type === "Video") {
2297
- log2?.info("Adding video to request");
2298
- const video = head;
2299
- const id = crypto.randomUUID();
2300
- return buildDynamicBidRequestRecursive(log2, nativeRequest, builder.withVideo(video.width, video.height, video.minDuration ?? 0, video.maxDuration, ["video/mp4", "video/webm"], undefined, { id }), {
2301
- ...requestIds,
2302
- [id]: head
2303
- }, tail);
2304
- } else if (head.type === "Carousel" || head.type === "ProductCard") {
2305
- log2?.info("Adding carousel to request");
2306
- const id = crypto.randomUUID();
2307
- return buildDynamicBidRequestRecursive(log2, nativeRequest, builder.withNative(nativeRequest().withMetaProduct().build(), undefined, { id }), {
2308
- ...requestIds,
2309
- [id]: head
2310
- }, tail);
2311
- } else {
2312
- log2?.warn("Invalid creative type. Skipping.", head);
2313
- return buildDynamicBidRequestRecursive(log2, nativeRequest, builder, requestIds, tail);
2314
- }
2315
- };
2316
-
2317
- class MissingDynamicZoneError extends Error {
2318
- zoneId;
2319
- constructor(zoneId) {
2320
- super("Missing dynamic zone " + zoneId);
2321
- this.zoneId = zoneId;
2322
- }
2323
- }
2324
- // src/helpers/NativeRequestBuilder.ts
2325
- var DEFAULT_LENGTH = 80;
2326
- var VAST_3_0 = 3;
2327
- var builderWithVer = (logger, state, ver) => {
2328
- logger?.debug("Adding version to native request", ver);
2329
- return botsBuildBots(logger, { ...state, ver });
2330
- };
2331
- var builderWithContext = (logger, state, context2) => {
2332
- logger?.debug("Adding context to native request", context2);
2333
- return botsBuildBots(logger, { ...state, context: context2 });
2334
- };
2335
- var builderWithContextSubType = (logger, state, contextSubType) => {
2336
- logger?.debug("Adding context subtype to native request", contextSubType);
2337
- return botsBuildBots(logger, { ...state, contextSubType });
2338
- };
2339
- var builderWithPlacementType = (logger, state, placementType) => {
2340
- logger?.debug("Adding placement type to native request", placementType);
2341
- return botsBuildBots(logger, { ...state, placementType });
2342
- };
2343
- var builderWithTitle = (logger, state, length = DEFAULT_LENGTH, required = true) => {
2344
- logger?.debug("Adding title to native request", length, required);
2345
- return botsBuildBots(logger, {
2346
- ...state,
2347
- assets: [
2348
- ...state.assets,
2349
- {
2350
- id: NativeAssetId.Title,
2351
- required: required ? 1 : 0,
2352
- title: {
2353
- len: length
2354
- }
2355
- }
2356
- ]
2357
- });
2358
- };
2359
- var builderWithImage = (logger, state, width, height, minWidth, minHeight, required = true) => {
2360
- logger?.debug("Adding image to native request", width, height, minWidth, minHeight, required);
2361
- return botsBuildBots(logger, {
2362
- ...state,
2363
- assets: [
2364
- ...state.assets,
2365
- {
2366
- id: NativeAssetId.Image,
2367
- required: required ? 1 : 0,
2368
- img: {
2369
- w: width,
2370
- h: height,
2371
- wmin: minWidth,
2372
- hmin: minHeight
2373
- }
2374
- }
2375
- ]
2376
- });
2377
- };
2378
- var builderWithVideo = (logger, state, mimes, minDuration, maxDuration, required = true) => {
2379
- logger?.debug("Adding video to native request", mimes, minDuration, maxDuration, required);
2380
- return botsBuildBots(logger, {
2381
- ...state,
2382
- assets: [
2383
- ...state.assets,
2384
- {
2385
- id: NativeAssetId.Video,
2386
- required: required ? 1 : 0,
2387
- video: {
2388
- mimes,
2389
- minduration: minDuration,
2390
- maxduration: maxDuration,
2391
- protocols: [VAST_3_0]
2392
- }
2393
- }
2394
- ]
2395
- });
2396
- };
2397
- var builderWithData = (logger, state, type, id, length = DEFAULT_LENGTH, required = true) => {
2398
- logger?.debug("Adding data to request", type, id, length, required);
2399
- return botsBuildBots(logger, {
2400
- ...state,
2401
- assets: [
2402
- ...state.assets,
2403
- {
2404
- id,
2405
- required: required ? 1 : 0,
2406
- data: {
2407
- type,
2408
- len: length
2409
- }
2410
- }
2411
- ]
2412
- });
2413
- };
2414
- var passToData = (type, id) => (logger, state, length = DEFAULT_LENGTH, required = true) => builderWithData(logger, state, type, id, length, required);
2415
- var builderWithSponsored = passToData(NativeDataTypes.Sponsored, NativeAssetId.Sponsored);
2416
- var builderWithDescription = passToData(NativeDataTypes.Desc, NativeAssetId.Desc);
2417
- var builderWithRating = passToData(NativeDataTypes.Rating, NativeAssetId.Rating);
2418
- var builderWithPrice = passToData(NativeDataTypes.Price, NativeAssetId.Price);
2419
- var builderWithSalePrice = passToData(NativeDataTypes.SalePrice, NativeAssetId.SalePrice);
2420
- var builderWithDisplayURL = passToData(NativeDataTypes.DisplayURL, NativeAssetId.DisplayURL);
2421
- var builderWithCTAText = passToData(NativeDataTypes.CTAText, NativeAssetId.CTAText);
2422
- var builderWithCategory = passToData(NativeDataTypes.SurfCategory, NativeAssetId.SurfCategory);
2423
- var builderWithTHC = passToData(NativeDataTypes.SurfTHC, NativeAssetId.SurfTHC);
2424
- var builderWithCBD = passToData(NativeDataTypes.SurfCBD, NativeAssetId.SurfCBD);
2425
- var builderWithStrain = passToData(NativeDataTypes.SurfStrain, NativeAssetId.SurfStrain);
2426
- var builderWithMetaProduct = passToData(NativeDataTypes.SurfMetaProduct, NativeAssetId.SurfMetaBrand);
2427
- var builderWithEventTracker = (logger, state, event, methods) => {
2428
- logger?.debug("Adding event tracker to big request");
2429
- return botsBuildBots(logger, {
2430
- ...state,
2431
- eventTrackers: [
2432
- ...state.eventTrackers,
2433
- {
2434
- event,
2435
- methods
2436
- }
2437
- ]
2438
- });
2439
- };
2440
- var builderBuild = (logger, state) => {
2441
- logger?.debug("Building bid request", state);
2442
- return {
2443
- ver: state.ver,
2444
- context: state.context,
2445
- contextsubtype: state.contextSubType,
2446
- assets: state.assets,
2447
- eventtrackers: state.eventTrackers
2448
- };
2449
- };
2450
- var botsBuildBots = (logger, state) => ({
2451
- withVer: builderWithVer.bind(undefined, logger, state),
2452
- withContext: builderWithContext.bind(undefined, logger, state),
2453
- withContextSubType: builderWithContextSubType.bind(undefined, logger, state),
2454
- withPlacementType: builderWithPlacementType.bind(undefined, logger, state),
2455
- withTitle: builderWithTitle.bind(undefined, logger, state),
2456
- withImage: builderWithImage.bind(undefined, logger, state),
2457
- withVideo: builderWithVideo.bind(undefined, logger, state),
2458
- withData: builderWithData.bind(undefined, logger, state),
2459
- withSponsored: builderWithSponsored.bind(undefined, logger, state),
2460
- withDescription: builderWithDescription.bind(undefined, logger, state),
2461
- withRating: builderWithRating.bind(undefined, logger, state),
2462
- withPrice: builderWithPrice.bind(undefined, logger, state),
2463
- withSalePrice: builderWithSalePrice.bind(undefined, logger, state),
2464
- withDisplayURL: builderWithDisplayURL.bind(undefined, logger, state),
2465
- withCTAText: builderWithCTAText.bind(undefined, logger, state),
2466
- withCategory: builderWithCategory.bind(undefined, logger, state),
2467
- withTHC: builderWithTHC.bind(undefined, logger, state),
2468
- withCBD: builderWithCBD.bind(undefined, logger, state),
2469
- withStrain: builderWithStrain.bind(undefined, logger, state),
2470
- withMetaProduct: builderWithMetaProduct.bind(undefined, logger, state),
2471
- withEventTracker: builderWithEventTracker.bind(undefined, logger, state),
2472
- build: builderBuild.bind(undefined, logger, state)
2473
- });
2474
- var StartNative = (logger) => {
2475
- const log2 = Ctx(logger)?.with("StartNative");
2476
- return botsBuildBots(log2, {
2477
- assets: [],
2478
- eventTrackers: []
2479
- });
2480
- };
2481
- var DefaultNative = (logger) => {
2482
- const log2 = Ctx(logger)?.with("DefaultNative");
2483
- return StartNative(log2).withVer("1.2").withContext(ContextTypes.Product).withContextSubType(ContextSubTypes.Product).withPlacementType(PlacementTypes.InFeed).withEventTracker(EventTypes.Imp, [EventTrackingMethods.Img, EventTrackingMethods.Img]);
2484
- };
2485
- // src/helpers/RequestBuilder.ts
2486
- var SURF_EID_SOURCE = "surf-domain-id";
2487
- function StartRequest(logger, accountId, siteId, channelId, locationId, device, geo, userId, zoneId, id) {
2488
- const log2 = Ctx(logger)?.with("StartRequest").with(accountId).with(siteId).with(channelId).with(locationId).with(id);
2489
- log2?.info("Starting request");
2490
- return botsBuildBots2(logger, {
2491
- context: {
2492
- accountId,
2493
- siteId,
2494
- channelId,
2495
- locationId,
2496
- zoneId,
2497
- storeId: locationId,
2498
- placementId: zoneId
2499
- },
2500
- geo,
2501
- device,
2502
- id,
2503
- user: userId !== undefined ? {
2504
- eids: [{
2505
- source: SURF_EID_SOURCE,
2506
- uids: [{
2507
- id: userId,
2508
- atype: AgentTypes.Session
2509
- }]
2510
- }]
2511
- } : undefined,
2512
- imp: []
2513
- });
2514
- }
2515
- var builderWithUser = (logger, state, user) => {
2516
- logger?.debug("Adding user to request", user);
2517
- return botsBuildBots2(logger, {
2518
- ...state,
2519
- user: {
2520
- ...user,
2521
- eids: [
2522
- ...state.user?.eids !== undefined ? state.user.eids : [],
2523
- ...user.eids !== undefined ? user.eids : []
2524
- ]
2525
- }
2526
- });
2527
- };
2528
- var builderWithRegulations = (logger, state, regs) => {
2529
- logger?.debug("Added regulations to request", regs);
2530
- return botsBuildBots2(logger, { ...state, regs });
2531
- };
2532
- var builderWithApp = (logger, state, app) => {
2533
- logger?.debug("Adding app to request");
2534
- return botsBuildBots2(logger, { ...state, app });
2535
- };
2536
- var builderWithSite = (logger, state, site) => {
2537
- logger?.debug("Adding site to request");
2538
- return botsBuildBots2(logger, { ...state, site });
2539
- };
2540
- var builderWithBanner = (logger, state, w, h, options, impOptions) => {
2541
- logger?.debug("Adding banner to request", w, h, options, impOptions);
2542
- const id = generateId();
2543
- return botsBuildImp(logger, state, {
2544
- id,
2545
- tagid: id,
2546
- banner: {
2547
- w,
2548
- h,
2549
- ...options
2550
- },
2551
- ...impOptions
2552
- });
2553
- };
2554
- var builderWithVideo2 = (logger, state, w, h, minduration, maxduration, mimes, options, impOptions) => {
2555
- logger?.debug("Adding video to request", w, h, minduration, maxduration, mimes, options, impOptions);
2556
- return botsBuildImp(logger, state, {
2557
- id: generateId(),
2558
- video: {
2559
- w,
2560
- h,
2561
- mimes: mimes ?? ["video/mp4", "video/webm"],
2562
- minduration,
2563
- maxduration,
2564
- ...options
2565
- },
2566
- ...impOptions
2567
- });
2568
- };
2569
- var builderWithKeywords = (logger, state, keywords) => {
2570
- logger?.debug("Adding keyword to request", keywords);
2571
- return botsBuildBots2(logger, {
2572
- ...state,
2573
- context: {
2574
- ...state.context,
2575
- keywords
2576
- }
2577
- });
2578
- };
2579
- var builderWithNative = (logger, state, request, options, impOptions) => {
2580
- logger?.debug("Adding native to request", request, options, impOptions);
2581
- return typeof request === "string" ? builderWithNativeStr(logger, state, request, options, impOptions) : builderWithNativeStr(logger, state, JSON.stringify(request), options, impOptions);
2582
- };
2583
- var builderWithNativeStr = (logger, state, request, options, impOptions) => botsBuildImp(logger, state, {
2584
- id: generateId(),
2585
- native: {
2586
- ver: "1.2",
2587
- request,
2588
- ...options
2589
- },
2590
- ...impOptions
2591
- });
2592
- var builderBuild2 = (logger, state) => {
2593
- logger?.debug("Building request", state);
2594
- return {
2595
- id: state.id ?? generateId(),
2596
- imp: state.imp.map((imp) => ({
2597
- ...imp,
2598
- ext: { ...imp.ext, ...state.context }
2599
- })),
2600
- device: {
2601
- ...state.device,
2602
- geo: state.geo === undefined ? undefined : GeoContextToORTB(undefined, state.geo),
2603
- ip: state.geo?.ip
2604
- },
2605
- user: state.user,
2606
- app: state.app,
2607
- site: state.site,
2608
- ext: state.context
2609
- };
2610
- };
2611
- var botsBuildBots2 = (logger, state) => ({
2612
- withUser: builderWithUser.bind(undefined, logger, state),
2613
- withRegulations: builderWithRegulations.bind(undefined, logger, state),
2614
- withBanner: builderWithBanner.bind(undefined, logger, state),
2615
- withVideo: builderWithVideo2.bind(undefined, logger, state),
2616
- withNative: builderWithNative.bind(undefined, logger, state),
2617
- withApp: builderWithApp.bind(undefined, logger, state),
2618
- withSite: builderWithSite.bind(undefined, logger, state),
2619
- withKeywords: builderWithKeywords.bind(undefined, logger, state),
2620
- build: builderBuild2.bind(undefined, logger, state)
2621
- });
2622
- var botsBuildImp = (logger, state, imp) => botsBuildBots2(logger, { ...state, imp: [...state.imp, imp] });
2623
- var generateId = () => crypto.randomUUID();
2624
- // src/helpers/response/BuiltResponse.ts
2625
- var CreativeType = {
2626
- Banner: 0,
2627
- Video: 1,
2628
- ProductCard: 2,
2629
- Carousel: 3
2630
- };
2631
-
2632
- class MissingAdmError extends Error {
2633
- bid;
2634
- constructor(bid) {
2635
- super("Cannot build creative; missing adm field");
2636
- this.bid = bid;
2637
- }
2638
- }
2639
-
2640
- class MissingProductError extends Error {
2641
- bid;
2642
- constructor(bid) {
2643
- super("Could not find product data for creative while building clickthrough URL. Some data fields are missing");
2644
- this.bid = bid;
2645
- }
2646
- }
2647
- // src/helpers/response/Clickthrough.ts
2648
- var BuildClickthroughUrl = (logger, windowInfo, configuration, product) => {
2649
- const log2 = Ctx(logger)?.with("BuildClickthroughUrl");
2650
- log2?.info("Building clickthrough URL");
2651
- log2?.debug(windowInfo, product, configuration);
2652
- try {
2653
- return Ok(configuration.templates.clickThroughUrlTemplate({
2654
- product,
2655
- catalog: product,
2656
- window: windowInfo,
2657
- publisher: configuration,
2658
- ...product
2659
- }));
2660
- } catch (e) {
2661
- log2?.error("Failed to execute clickthrough URL template", product, configuration, windowInfo);
2662
- return Err(e);
2663
- }
2664
- };
2665
- // src/helpers/Generator.ts
2666
- var ConsumeN = (generator, n) => {
2667
- const consumed = [];
2668
- for (let i = 0;i < n; i++) {
2669
- const value = generator.next();
2670
- if (value.done) {
2671
- break;
2672
- }
2673
- consumed.push(value.value);
2674
- }
2675
- return consumed;
2676
- };
2677
- var ConsumeAll = (generator) => {
2678
- const consumed = [];
2679
- for (const value of generator) {
2680
- consumed.push(value);
2681
- }
2682
- return consumed;
2683
- };
2684
- var ConsumeNAsync = async (generator, n) => {
2685
- const consumed = [];
2686
- while (consumed.length < n) {
2687
- const result = await generator.next();
2688
- if (result.done) {
2689
- return [consumed, true];
2690
- }
2691
- consumed.push(result.value);
2692
- }
2693
- return [consumed, false];
2694
- };
2695
- var ConsumeAllAsync = async (generator) => {
2696
- const consumed = [];
2697
- for await (const value of generator) {
2698
- consumed.push(value);
2699
- }
2700
- return consumed;
2701
- };
2702
- function* GenerateArray(data) {
2703
- for (const t of data) {
2704
- yield t;
2705
- }
2706
- }
2707
-
2708
- // src/helpers/TryGet.ts
2709
- var TryGet = (get) => {
2710
- try {
2711
- return Ok(get());
2712
- } catch (error2) {
2713
- return Err(error2);
2714
- }
2715
- };
2716
-
2717
- // src/helpers/response/ProductCard.ts
2718
- var BuildAllSponsoredProductCardResponses = async (logger, getAllSponsoredProducts, windowInfo, configuration, bids) => {
2719
- const log2 = Ctx(logger)?.with("BuildProductCardResponse");
2720
- log2?.info("Building product card responses");
2721
- if (bids === undefined || bids === null) {
2722
- return Err(new MissingBidsError);
2723
- }
2724
- const bidPromises = bids.map(buildAllProductCardResponsesFromBid.bind(undefined, log2, getAllSponsoredProducts, windowInfo, configuration));
2725
- const productCardResponseResults = await Promise.allSettled(bidPromises);
2726
- productCardResponseResults.filter((res) => res.status === "rejected").map((res) => res.reason).forEach((err) => log2?.warn(err));
2727
- const fulfilled = productCardResponseResults.filter((res) => res.status === "fulfilled");
2728
- fulfilled.filter((res) => !res.value.ok).map((res) => res.value).map((res) => res.error).forEach((err) => log2?.warn(err));
2729
- return Ok(productCardResponseResults.filter((res) => res.status === "fulfilled").filter((res) => res.value.ok).map((res) => res.value).flatMap((res) => res.value));
2730
- };
2731
- async function* GenerateSponsoredProductCardResponse(logger, getAllSponsoredProducts, windowInfo, configuration, bids) {
2732
- const log2 = Ctx(logger)?.with("GenerateProductCardResponse");
2733
- log2?.info("Entering product card response generator", bids);
2734
- for (const bid of bids) {
2735
- log2?.info("Generating product card response", bid);
2736
- const result = await buildAllProductCardResponsesFromBid(log2, getAllSponsoredProducts, windowInfo, configuration, bid);
2737
- if (!result.ok) {
2738
- log2?.warn(result.error);
2739
- continue;
2740
- }
2741
- yield* GenerateArray(result.value);
2742
- }
2743
- }
2744
- var getField = (native) => (id) => native.native.assets?.find((asset) => asset.id === id)?.data?.value;
2745
- var getTrackers = (logger, bid, native) => {
2746
- const log2 = Ctx(logger)?.with("getTrackers");
2747
- log2?.info("Getting trackers");
2748
- const win = bid.nurl;
2749
- if (win === undefined) {
2750
- return Err(new MissingWinUrlError(bid));
2751
- }
2752
- const imp = native.native.eventtrackers?.filter((tracker) => tracker.event === EventTypes.Imp && tracker.method === EventTrackingMethods.Img).map((tracker) => tracker.url).filter((url) => url !== undefined) ?? [];
2753
- const others = native.native.eventtrackers?.filter((tracker) => tracker.url !== undefined).map((tracker) => ({
2754
- type: tracker.method,
2755
- url: tracker.url
2756
- })) ?? [];
2757
- return Ok({ win, imp, others });
2758
- };
2759
- var fetchProductsFromBid = async (logger, getAllSponsoredProducts, bid) => {
2760
- try {
2761
- const log2 = Ctx(logger)?.with("fetchProductsFromBid");
2762
- log2?.info("Fetching products from IBid");
2763
- const productCardResponses = [];
2764
- if (bid.adm === undefined) {
2765
- log2?.warn("Bid is missing ADM", bid);
2766
- return Err(new MissingAdmError(bid));
2767
- }
2768
- const adm = bid.adm;
2769
- const nativeRes = TryGet(() => JSON.parse(adm));
2770
- if (!nativeRes.ok) {
2771
- log2?.error("Bid adm failed to deserialize", bid, adm);
2772
- return Err(new MalformedNativeResponseError(bid));
2773
- }
2774
- const native = nativeRes.value;
2775
- const metaProductId = getField(native)(NativeAssetId.SurfMetaBrand);
2776
- if (metaProductId === undefined) {
2777
- return Err(new MissingProductIdError(bid, native));
2778
- }
2779
- const productRes = await getAllSponsoredProducts(metaProductId);
2780
- if (!productRes.ok) {
2781
- return productRes;
2782
- }
2783
- return Ok({
2784
- products: productRes.value,
2785
- native
2786
- });
2787
- } catch (err) {
2788
- return Err(err);
2789
- }
2790
- };
2791
- function* buildProductCardResponseFromProductInfo(logger, windowInfo, configuration, bid, native, products) {
2792
- const log2 = Ctx(logger)?.with("buildProductCardResponseFromProductInfo");
2793
- for (const product of products) {
2794
- const clickthrough = BuildClickthroughUrl(log2, windowInfo, configuration, product);
2795
- if (!clickthrough.ok) {
2796
- return clickthrough;
2797
- }
2798
- const trackers = getTrackers(log2, bid, native);
2799
- if (!trackers.ok) {
2800
- return trackers;
2801
- }
2802
- const finalClickthrough = TryDo(() => {
2803
- const bidderClickthrough = new URL(native.native.link.url);
2804
- bidderClickthrough.searchParams.set("url", clickthrough.value);
2805
- return bidderClickthrough.toString();
2806
- });
2807
- if (!finalClickthrough.ok) {
2808
- return finalClickthrough;
2809
- }
2810
- yield {
2811
- type: "product-card",
2812
- native,
2813
- product,
2814
- bid,
2815
- clickthrough: finalClickthrough.value,
2816
- trackers: trackers.value,
2817
- sponsored: true
2818
- };
2819
- }
2820
- }
2821
- var buildAllProductCardResponsesFromBid = async (logger, getAllSponsoredProducts, windowInfo, configuration, bid) => {
2822
- const log2 = Ctx(logger)?.with("buildAllProductCardResponseBids");
2823
- log2?.info("Building all product card responses");
2824
- try {
2825
- return Ok(await ConsumeAllAsync(generateProductCardResponseFromBid(log2, getAllSponsoredProducts, windowInfo, configuration, bid)));
2826
- } catch (err) {
2827
- return Err(err);
2828
- }
2829
- };
2830
- async function* generateProductCardResponseFromBid(logger, getAllSponsoredProducts, windowInfo, configuration, bid) {
2831
- const log2 = Ctx(logger)?.with("generateProductCardResponseFromBid");
2832
- log2?.info("generating product card response from bid");
2833
- try {
2834
- const productResult = await fetchProductsFromBid(log2, getAllSponsoredProducts, bid);
2835
- if (!productResult.ok) {
2836
- log2?.info("No products!");
2837
- return productResult;
2838
- }
2839
- const { products, native } = productResult.value;
2840
- const builtProductCardResponses = [];
2841
- yield* buildProductCardResponseFromProductInfo(log2, windowInfo, configuration, bid, native, products);
2842
- } catch (err) {
2843
- return;
2844
- }
2845
- }
2846
-
2847
- class MissingBidsError extends Error {
2848
- constructor() {
2849
- super("Unable to build product cards - no bids were provided");
2850
- }
2851
- }
2852
-
2853
- class MalformedNativeResponseError extends Error {
2854
- bid;
2855
- constructor(bid) {
2856
- super("Unable to build product card - missing native response");
2857
- this.bid = bid;
2858
- }
2859
- }
2860
-
2861
- class MissingWinUrlError extends Error {
2862
- bid;
2863
- constructor(bid) {
2864
- super("Unable to build product card - no win URL was provided");
2865
- this.bid = bid;
2866
- }
2867
- }
2868
-
2869
- class MissingProductIdError extends Error {
2870
- bid;
2871
- native;
2872
- constructor(bid, native) {
2873
- super("Unable to build product card - no product ID was provided");
2874
- this.bid = bid;
2875
- this.native = native;
2876
- }
2877
- }
2878
- // src/helpers/response/Carousel.ts
2879
- var BuildSponsoredCarousel = (logger, requestBids, generateProductCardResponse, request) => {
2880
- const log2 = Ctx(logger)?.with("BuildSponsoredCarousel");
2881
- log2?.info("Building sponsored carousel");
2882
- return Ok({
2883
- type: "carousel",
2884
- getProduct: getNextSponsoredCarouselProduct.bind(undefined, log2, requestBids, generateProductCardResponse, request)
2885
- });
2886
- };
2887
- var BuildSponsoredCarouselFromInitialBid = (logger, requestBids, generateProductCardResponse, request, initialBid) => {
2888
- const log2 = Ctx(logger)?.with("BuildSponsoredCarouselFromInitialBid");
2889
- log2?.info("Building sponsored carousel from initial bid");
2890
- return Ok({
2891
- type: "carousel",
2892
- getProduct: getNextSponsoredCarouselProductFromInitialBid.bind(undefined, log2, requestBids, request, initialBid, generateProductCardResponse)
2893
- });
2894
- };
2895
- var BuildRecommendedCarousel = (logger, evaluateClickthroughTemplate, topProductGenerator, forYouProductGenerator, pastPurchasesProductGenerator, userId, recommenderType) => {
2896
- switch (recommenderType.type) {
2897
- case "top-products": {
2898
- return buildRecommendedCarouselInternal(logger, evaluateClickthroughTemplate, {
2899
- recommenderType: "top-products",
2900
- topProductGenerator
2901
- });
2902
- }
2903
- case "for-you": {
2904
- return buildRecommendedCarouselInternal(logger, evaluateClickthroughTemplate, {
2905
- recommenderType: "for-you",
2906
- forYouProductGenerator,
2907
- topProductGenerator,
2908
- userId
2909
- });
2910
- }
2911
- case "past-purchases": {
2912
- return buildRecommendedCarouselInternal(logger, evaluateClickthroughTemplate, {
2913
- recommenderType: "past-purchases",
2914
- pastPurchasesProductGenerator,
2915
- topProductGenerator,
2916
- userId
2917
- });
2918
- }
2919
- }
2920
- };
2921
- var buildRecommendedCarouselInternal = (logger, evaluateClickthroughTemplate, recommenderType) => {
2922
- const log2 = Ctx(logger)?.with("buildRecommendedCarouselInternal");
2923
- log2?.info("Building Recommended Carousel");
2924
- return Ok({
2925
- type: "carousel",
2926
- getProduct: getNextRecommendedCarouselProduct.bind(undefined, log2, evaluateClickthroughTemplate, recommenderType)
2927
- });
2928
- };
2929
- var BuildHybridCarousel = (logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, topProductGenerator, forYouProductGenerator, pastPurchasesProductGenerator, userId, recommenderType, request) => {
2930
- switch (recommenderType.type) {
2931
- case "top-products": {
2932
- return buildHybridCarouselInternal(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, {
2933
- recommenderType: "top-products",
2934
- topProductGenerator
2935
- });
2936
- }
2937
- case "for-you": {
2938
- return buildHybridCarouselInternal(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, {
2939
- recommenderType: "for-you",
2940
- forYouProductGenerator,
2941
- topProductGenerator,
2942
- userId
2943
- });
2944
- }
2945
- case "past-purchases": {
2946
- return buildHybridCarouselInternal(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, {
2947
- recommenderType: "past-purchases",
2948
- pastPurchasesProductGenerator,
2949
- topProductGenerator,
2950
- userId
2951
- });
2952
- }
2953
- }
2954
- };
2955
- var BuildHybridCarouselFromInitialBid = (logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, topProductGenerator, forYouProductGenerator, pastPurchasesProductGenerator, userId, recommenderType, request, initialBid) => {
2956
- switch (recommenderType.type) {
2957
- case "top-products": {
2958
- return buildHybridCarouselFromInitialBidInternal(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, initialBid, {
2959
- recommenderType: "top-products",
2960
- topProductGenerator
2961
- });
2962
- }
2963
- case "for-you": {
2964
- return buildHybridCarouselFromInitialBidInternal(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, initialBid, {
2965
- recommenderType: "for-you",
2966
- forYouProductGenerator,
2967
- topProductGenerator,
2968
- userId
2969
- });
2970
- }
2971
- case "past-purchases": {
2972
- return buildHybridCarouselFromInitialBidInternal(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, initialBid, {
2973
- recommenderType: "past-purchases",
2974
- pastPurchasesProductGenerator,
2975
- topProductGenerator,
2976
- userId
2977
- });
2978
- }
2979
- }
2980
- };
2981
- var buildHybridCarouselInternal = (logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, recommenderType) => {
2982
- const log2 = Ctx(logger)?.with("BuildHybridCarousel");
2983
- log2?.info("Building hybrid carousel", request, recommenderType);
2984
- return Ok({
2985
- type: "carousel",
2986
- getProduct: getNextHybridCarouselProduct.bind(undefined, log2, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, recommenderType)
2987
- });
2988
- };
2989
- var buildHybridCarouselFromInitialBidInternal = (logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, initialBid, recommenderType) => {
2990
- const log2 = Ctx(logger)?.with("BuildHybridCarouselFromInitialBid");
2991
- log2?.info("Building hybrid carousel from bid", request, recommenderType, initialBid);
2992
- return Ok({
2993
- type: "carousel",
2994
- getProduct: getNextHybridCarouselProductFromInitialBid.bind(undefined, log2, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, initialBid, recommenderType)
2995
- });
2996
- };
2997
- async function* getNextHybridCarouselProduct(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, recommenderType) {
2998
- const log2 = Ctx(logger)?.with("getNextHybridCarouselProduct");
2999
- log2?.info("Entering hybrid carousel product generator");
3000
- yield* getNextSponsoredCarouselProduct(log2, requestBids, generateProductCardResponse, request);
3001
- log2?.info("Done getting next sponsoredCarouselProduct");
3002
- yield* getNextRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, recommenderType);
3003
- }
3004
- async function* getNextHybridCarouselProductFromInitialBid(logger, evaluateClickthroughTemplate, requestBids, generateProductCardResponse, request, initialBid, recommenderType) {
3005
- const log2 = Ctx(logger)?.with("getNextHybridCarouselProduct");
3006
- log2?.info("Entering hybrid carousel product generator");
3007
- yield* getNextSponsoredCarouselProductFromInitialBid(log2, requestBids, request, initialBid, generateProductCardResponse);
3008
- log2?.info("Done getting next sponsoredCarouselProduct");
3009
- yield* getNextRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, recommenderType);
3010
- }
3011
- async function* getNextSponsoredCarouselProduct(logger, requestBids, generateProductCardResponse, request) {
3012
- const log2 = Ctx(logger)?.with("getNextSponsoredCarouselProduct");
3013
- try {
3014
- log2?.info("Entering sponsored carousel product generator");
3015
- while (true) {
3016
- log2?.info("Getting next sponsored carousel products", request);
3017
- const response = await requestBids(request);
3018
- if (!response.ok) {
3019
- log2?.info("No response from bidder", response.error);
3020
- return;
3021
- }
3022
- const bids = response.value.seatbid?.[0]?.bid;
3023
- if (bids === undefined) {
3024
- log2?.info("Got no bids in response!");
3025
- return;
3026
- }
3027
- const generator = generateProductCardResponse(bids);
3028
- for await (const product of generator) {
3029
- log2?.debug("Getting next product from existing bidder response", product);
3030
- yield product;
3031
- }
3032
- log2?.debug("Out of bids from previous response. Requesting new bid response");
3033
- return;
3034
- }
3035
- } catch (err) {
3036
- log2?.error("product carousel generator failed! Got", err);
3037
- } finally {
3038
- log2?.warn("Exiting carousel product generator");
3039
- }
3040
- }
3041
- async function* getNextSponsoredCarouselProductFromInitialBid(logger, requestBids, request, initialBid, generateProductCardResponse) {
3042
- const log2 = Ctx(logger)?.with("getNextSponsoredCarouselProductFromResponse");
3043
- log2?.info("Generating sponsored product cards from initial bid response");
3044
- log2?.debug(initialBid);
3045
- yield* generateProductCardResponse([initialBid]);
3046
- yield* getNextSponsoredCarouselProduct(logger, requestBids, generateProductCardResponse, request);
3047
- }
3048
- async function* getNextRecommendedCarouselProduct(logger, evaluateClickthroughTemplate, recommenderType) {
3049
- const log2 = Ctx(logger)?.with("getNextRecommendedCarouselProduct");
3050
- log2?.info("Entering recommended carousel product generator");
3051
- log2?.info("Getting next recommended carousel product");
3052
- switch (recommenderType.recommenderType) {
3053
- case "top-products": {
3054
- yield* getNextTopAllRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, recommenderType);
3055
- return;
3056
- }
3057
- case "for-you": {
3058
- if (recommenderType.userId !== undefined) {
3059
- yield* getNextForYouRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, recommenderType, recommenderType.userId);
3060
- }
3061
- break;
3062
- }
3063
- case "past-purchases": {
3064
- if (recommenderType.userId !== undefined) {
3065
- yield* getNextPastPurchasesRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, recommenderType, recommenderType.userId);
3066
- }
3067
- break;
3068
- }
3069
- }
3070
- yield* getNextTopAllRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, {
3071
- recommenderType: "top-products",
3072
- topProductGenerator: recommenderType.topProductGenerator
3073
- });
3074
- }
3075
- async function* getNextTopAllRecommendedCarouselProduct(logger, evaluateClickthroughTemplate, recommenderType) {
3076
- const log2 = Ctx(logger)?.with("getNextTopAllRecommendedCarouselProduct");
3077
- log2?.info("Getting next top all product");
3078
- for await (const product of recommenderType.topProductGenerator()) {
3079
- const built = recommendedProductToBuiltProduct(log2, evaluateClickthroughTemplate, product);
3080
- if (!built.ok) {
3081
- log2?.warn("Failed to build product response from recommended product. Skipping this one", product);
3082
- continue;
3083
- }
3084
- yield built.value;
3085
- }
3086
- }
3087
- async function* getNextForYouRecommendedCarouselProduct(logger, evaluateClickthroughTemplate, recommenderType, userId) {
3088
- const log2 = Ctx(logger)?.with("getNextForYouRecommendedCarouselProduct");
3089
- log2?.info('Getting next "for-you" recommended product');
3090
- for await (const product of recommenderType.forYouProductGenerator(userId)) {
3091
- const built = recommendedProductToBuiltProduct(log2, evaluateClickthroughTemplate, product);
3092
- if (!built.ok) {
3093
- log2?.warn("Failed to build product response from recommended product. Skipping this one", product);
3094
- continue;
3095
- }
3096
- yield built.value;
3097
- }
3098
- yield* getNextTopAllRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, {
3099
- recommenderType: "top-products",
3100
- topProductGenerator: recommenderType.topProductGenerator
3101
- });
3102
- }
3103
- async function* getNextPastPurchasesRecommendedCarouselProduct(logger, evaluateClickthroughTemplate, recommenderType, userId) {
3104
- const log2 = Ctx(logger)?.with("getNextPastPurchasesRecommendedCarouselProduct");
3105
- log2?.info('Getting next "buy-again" recommended product');
3106
- for await (const product of recommenderType.pastPurchasesProductGenerator(userId)) {
3107
- const built = recommendedProductToBuiltProduct(log2, evaluateClickthroughTemplate, product);
3108
- if (!built.ok) {
3109
- log2?.warn("Failed to build product response from recommended product. Skipping this one", product);
3110
- continue;
3111
- }
3112
- yield built.value;
3113
- }
3114
- yield* getNextTopAllRecommendedCarouselProduct(log2, evaluateClickthroughTemplate, {
3115
- recommenderType: "top-products",
3116
- topProductGenerator: recommenderType.topProductGenerator
3117
- });
3118
- }
3119
- var recommendedProductToBuiltProduct = (logger, evaluateClickthroughTemplate, product) => {
3120
- const log2 = Ctx(logger)?.with("recommendedProductToBuiltProduct");
3121
- log2?.info("Converting recommended product to built product card response");
3122
- const clickthrough = evaluateClickthroughTemplate(product);
3123
- if (!clickthrough.ok) {
3124
- return clickthrough;
3125
- }
3126
- return Ok({
3127
- type: "product-card",
3128
- clickthrough: clickthrough.value + "_recommended",
3129
- product,
3130
- sponsored: false
3131
- });
3132
- };
3133
-
3134
- class InvalidRecommenderTypeError extends Error {
3135
- type;
3136
- constructor(type) {
3137
- super('Could not generate carousel; invalid recommender type "' + type + '"');
3138
- this.type = type;
3139
- }
3140
- }
3141
- // src/helpers/Handlebars.ts
3142
- var DEFAULT_MAX_SLUG = 5;
3143
- function slug(name, options) {
3144
- if (name === undefined || name === null || typeof name !== "string") {
3145
- return "";
3146
- }
3147
- const hyphenate = options.hash.hyphenate !== undefined ? new RegExp(options.hash.hyphenate, "ig") : /[\s_\-,]/ig;
3148
- const drop = options.hash.drop !== undefined ? new RegExp(options.hash.drop, "ig") : /[^A-Za-z0-9-]/ig;
3149
- const dropBefore = options.hash.dropBefore !== undefined ? new RegExp(options.hash.dropBefore) : undefined;
3150
- const maxSlug = options.hash.length ?? DEFAULT_MAX_SLUG;
3151
- const separator = options.hash.separator ?? "-";
3152
- if (dropBefore !== undefined) {
3153
- name = name.replace(dropBefore, "");
3154
- }
3155
- return name.replace(hyphenate, separator).replace(drop, "").toLowerCase().split(separator).slice(0, maxSlug).join(separator);
3156
- }
3157
- function lower(name) {
3158
- if (name === undefined || name === null || typeof name !== "string") {
3159
- return "";
3160
- }
3161
- return name.toLowerCase();
3162
- }
3163
- function upper(name) {
3164
- if (name === undefined || name === null || typeof name !== "string") {
3165
- return "";
3166
- }
3167
- return name.toUpperCase();
3168
- }
3169
- function path(position) {
3170
- if (position === 0 || position === undefined || position === null) {
3171
- return "";
3172
- }
3173
- const paths = window.location.pathname.split("/");
3174
- if (paths.length <= position) {
3175
- return "";
3176
- }
3177
- return paths[position];
3178
- }
3179
- function sed(input, searchRegex, replacement) {
3180
- return input.replace(new RegExp(searchRegex), (...args) => {
3181
- const END = -2;
3182
- const groups = args.slice(1, END);
3183
- let result = replacement;
3184
- result = result.replace(/\\(\d+)/g, (_, groupIndex) => groups[groupIndex - 1] ?? "");
3185
- result = result.replace(/\\U(\d+)/g, (_, groupIndex) => (groups[groupIndex - 1] ?? "").toUpperCase());
3186
- result = sedCommand(result, "U", groups, (str) => str?.toUpperCase());
3187
- result = sedCommand(result, "L", groups, (str) => str?.toLowerCase());
3188
- result = sedCommand(result, "I", groups, (str) => str?.[0]);
3189
- return result ?? "";
3190
- });
3191
- }
3192
- function replace(input, search, replacement, all = true) {
3193
- if (input === null || input === undefined) {
3194
- return "";
3195
- }
3196
- if (search === null || search === undefined || replacement === null || replacement === undefined) {
3197
- return input;
3198
- }
3199
- if (all) {
3200
- return input.replaceAll(search, replacement);
3201
- }
3202
- return input.replace(search, replacement);
3203
- }
3204
- function sedCommand(input, char, groups, transform) {
3205
- if (input === undefined) {
3206
- return;
3207
- }
3208
- return input.replace(new RegExp(`\\\\${char}(\\d+)`, "g"), (_, groupIndex) => transform(groups[groupIndex - 1] ?? "") ?? "");
3209
- }
3210
- function search(name) {
3211
- if (name?.length === undefined || name.length === 0) {
3212
- return "";
3213
- }
3214
- const search2 = window.location.search;
3215
- if (search2.length === 0) {
3216
- return "";
3217
- }
3218
- const params = new URLSearchParams(search2);
3219
- return params.get(name) ?? "";
3220
- }
3221
- function coalesce() {
3222
- for (let i = 0;i < arguments.length - 1; i++) {
3223
- const arg = arguments[i];
3224
- if (arg !== null && arg !== undefined && arg !== "" && arg !== false) {
3225
- return arg;
3226
- }
3227
- }
3228
- return "";
3229
- }
3230
- function join() {
3231
- const args = [...arguments].slice(0, arguments.length - 1);
3232
- const options = arguments[arguments.length - 1];
3233
- const separator = options.hash.separator ?? "/";
3234
- return args.filter((arg) => arg !== undefined && arg !== null && arg !== "").join(separator);
3235
- }
3236
- function uri(component) {
3237
- if (component?.length === undefined || component.length === 0) {
3238
- return "";
3239
- }
3240
- const encoded = encodeURIComponent(component);
3241
- return encoded.replaceAll("'", "%27");
3242
- }
3243
- function eq(a, b) {
3244
- return a === b;
3245
- }
3246
- function or(a, b) {
3247
- return Boolean(a) || Boolean(b);
3248
- }
3249
- function and(a, b) {
3250
- return Boolean(a) && Boolean(b);
3251
- }
3252
- function isIn(a, b) {
3253
- if (b?.length === undefined || b.length === 0) {
3254
- return false;
3255
- }
3256
- return b.includes(a);
3257
- }
3258
- function array() {
3259
- return Array.from(arguments).slice(0, -1);
3260
- }
3261
- var GetHelpers = () => ({
3262
- slug,
3263
- lower,
3264
- path,
3265
- sed,
3266
- replace,
3267
- search,
3268
- coalesce,
3269
- join,
3270
- get_first: coalesce,
3271
- uri,
3272
- or,
3273
- and,
3274
- isIn,
3275
- array
3276
- });
3277
- // src/Api.ts
3278
- var import_runtime = __toESM(require_runtime2());
3279
- var PROD_BIDDER = "//rtb.surfside.io/rtb/bids/surfside";
3280
- var PROD_CONFIGURATION_SERVICE = "//r.surfside.io";
3281
- var PROD_SPONSORED_PRODUCT_FEED = "//creative.surfside.io";
3282
- var PROD_RECOMMENDED_PRODUCT_FEED = "//creative.surfside.io";
3283
- var PROD_RECOMMENDER_SERVICE = "//t.surfside.io";
3284
- var PROD_DYNAMIC_ZONE_SERVICE = "//r.surfside.io/";
3285
- var TLS = (url) => "http:" + url;
3286
- async function InitSurfAdsCoreInternal(internalApiDto) {
3287
- const {
3288
- getDevice,
3289
- mobile,
3290
- navigator: navigator2,
3291
- ip,
3292
- getGeo,
3293
- geoProviderToken,
3294
- getConfiguration,
3295
- accountId,
3296
- siteId,
3297
- logger,
3298
- channelId,
3299
- locationId,
3300
- userId,
3301
- handlebars,
3302
- windowInfo,
3303
- screenInfo,
3304
- requestBids,
3305
- getSponsoredProduct,
3306
- getAllSponsoredProducts,
3307
- getRecommendedProduct,
3308
- generateTopProducts,
3309
- generateForYou,
3310
- generatePreviousPurchases,
3311
- getDynamicZone,
3312
- buildAllSponsoredProductCardResponses,
3313
- generateSponsoredProductCardResponse,
3314
- evaluateProductCardTemplate,
3315
- evaluateClickthroughTemplate
3316
- } = internalApiDto;
3317
- const device = getDevice(screenInfo, navigator2, mobile);
3318
- const geo = await getGeo(geoProviderToken, ip);
3319
- const configuration = await getConfiguration();
3320
- if (!configuration.ok) {
3321
- return Err(new MissingConfigurationError(accountId, siteId));
3322
- }
3323
- const startRequestBound = StartRequest.bind(undefined, logger, accountId, siteId, channelId, locationId, GetValue(device), GetValue(geo), userId);
3324
- const startRequest = (zoneId, id) => startRequestBound(zoneId, id).withApp({
3325
- bundle: windowInfo.host,
3326
- name: windowInfo.host,
3327
- id: siteId,
3328
- domain: windowInfo.host,
3329
- publisher: {
3330
- domain: windowInfo.host
3331
- }
3332
- }).withSite({
3333
- name: windowInfo.host,
3334
- id: siteId,
3335
- kwarray: [],
3336
- mobile: isMobile() ? 1 : 0,
3337
- page: windowInfo.href,
3338
- domain: windowInfo.host,
3339
- publisher: {
3340
- id: siteId,
3341
- name: windowInfo.host,
3342
- domain: windowInfo.host
3343
- },
3344
- ref: "",
3345
- search: windowInfo.search
3346
- });
3347
- const startNative = StartNative.bind(undefined, logger);
3348
- const defaultNative = DefaultNative.bind(undefined, logger);
3349
- return Ok({
3350
- logger,
3351
- getDevice,
3352
- device: GetValue(device),
3353
- getGeo,
3354
- geo: GetValue(geo),
3355
- configuration: configuration.value,
3356
- getConfiguration,
3357
- handlebars,
3358
- requestBids,
3359
- startRequest,
3360
- startNative,
3361
- defaultNative,
3362
- getSponsoredProduct,
3363
- getAllSponsoredProducts,
3364
- getRecommendedProduct,
3365
- generateTopProducts,
3366
- generateForYou,
3367
- generatePreviousPurchases,
3368
- buildAllSponsoredProductCardResponses,
3369
- generateSponsoredProductCardResponse,
3370
- evaluateProductCardTemplate,
3371
- evaluateClickthroughTemplate,
3372
- buildSponsoredCarousel: BuildSponsoredCarousel.bind(undefined, logger, requestBids, generateSponsoredProductCardResponse),
3373
- buildSponsoredCarouselFromInitialBid: BuildSponsoredCarouselFromInitialBid.bind(undefined, logger, requestBids, generateSponsoredProductCardResponse),
3374
- buildHybridCarouselFromInitialBid: BuildHybridCarouselFromInitialBid.bind(undefined, logger, evaluateClickthroughTemplate, requestBids, generateSponsoredProductCardResponse, generateTopProducts, generatePreviousPurchases, generateForYou, userId),
3375
- buildRecommendedCarousel: BuildRecommendedCarousel.bind(undefined, logger, evaluateClickthroughTemplate, generateTopProducts, generatePreviousPurchases, generateForYou, userId),
3376
- buildHybridCarousel: BuildHybridCarousel.bind(undefined, logger, evaluateClickthroughTemplate, requestBids, generateSponsoredProductCardResponse, generateTopProducts, generatePreviousPurchases, generateForYou, userId),
3377
- getDynamicZone,
3378
- buildDynamicZoneRequest: BuildDynamicZoneRequest.bind(undefined, logger, startRequest, defaultNative, screenInfo)
3379
- });
3380
- }
3381
- var InitSurfAdsCoreServices = async (logger, bidderServiceUrl, configurationServiceUrl, productFeedUrl, recommendedProductFeedUrl, recommenderServiceUrl, dynamicZoneServiceUrl, windowInfo, screenInfo, navigator2, mobile, ip, geoProviderToken, accountId, siteId, channelId, locationId, userId) => {
3382
- const handlebars = import_runtime.default.create();
3383
- const helpers = GetHelpers();
3384
- const recommendedProductFeed = GetRecommendedProduct.bind(undefined, logger, recommendedProductFeedUrl, accountId, locationId);
3385
- const configurationService = GetConfiguration.bind(undefined, logger, configurationServiceUrl, handlebars, helpers, accountId, siteId);
3386
- const configuration = await configurationService();
3387
- if (!configuration.ok) {
3388
- return configuration;
3389
- }
3390
- const getAllSponsoredProducts = GetAllSponsoredProducts.bind(undefined, logger, productFeedUrl, accountId, locationId);
3391
- const generateProductCardResponse = GenerateSponsoredProductCardResponse.bind(undefined, logger, getAllSponsoredProducts, windowInfo, configuration.value);
3392
- const evaluateClickthroughTemplate = EvaluateHandlebarsClickthroughTemplate.bind(undefined, logger, windowInfo, configuration.value);
3393
- const evaluateProductCardTemplate = EvaluateHandlebarsProductCardTemplate.bind(undefined, logger, windowInfo, configuration.value);
3394
- return await InitSurfAdsCoreInternal({
3395
- logger,
3396
- requestBids: RequestBids.bind(undefined, logger, bidderServiceUrl, accountId, siteId, locationId, channelId),
3397
- getConfiguration: configurationService,
3398
- getGeo: GetGeo.bind(undefined, logger),
3399
- getDevice: GetDevice.bind(undefined, logger),
3400
- getSponsoredProduct: GetSponsoredProduct.bind(undefined, logger, productFeedUrl, accountId, locationId),
3401
- getAllSponsoredProducts,
3402
- getRecommendedProduct: GetRecommendedProduct.bind(undefined, logger, recommendedProductFeedUrl, accountId, locationId),
3403
- generateTopProducts: GenerateTopProducts.bind(undefined, logger, recommendedProductFeed, recommenderServiceUrl, accountId, siteId, locationId),
3404
- generateForYou: GenerateForYou.bind(undefined, logger, recommendedProductFeed, recommenderServiceUrl, accountId, siteId, locationId, userId ?? "undefined"),
3405
- generatePreviousPurchases: GeneratePreviousPurchases.bind(undefined, logger, recommendedProductFeed, recommenderServiceUrl, accountId, siteId, locationId, userId ?? "undefined"),
3406
- buildAllSponsoredProductCardResponses: BuildAllSponsoredProductCardResponses.bind(undefined, logger, getAllSponsoredProducts, windowInfo, configuration.value),
3407
- generateSponsoredProductCardResponse: generateProductCardResponse,
3408
- evaluateProductCardTemplate,
3409
- evaluateClickthroughTemplate,
3410
- handlebars,
3411
- windowInfo,
3412
- screenInfo,
3413
- navigator: navigator2,
3414
- mobile,
3415
- ip,
3416
- geoProviderToken,
3417
- accountId,
3418
- siteId,
3419
- channelId,
3420
- locationId,
3421
- userId,
3422
- getDynamicZone: GetDynamicZone.bind(undefined, logger, configuration.value)
3423
- });
3424
- };
3425
- var InitSurfAdsCoreSSR = async (windowInfo, screen, navigator2, mobile, ip, geoProviderToken, accountId, siteId, channelId, locationId, userId, logger) => InitSurfAdsCoreServices(logger, TLS(PROD_BIDDER), TLS(PROD_CONFIGURATION_SERVICE), TLS(PROD_SPONSORED_PRODUCT_FEED), TLS(PROD_RECOMMENDED_PRODUCT_FEED), TLS(PROD_RECOMMENDER_SERVICE), TLS(PROD_DYNAMIC_ZONE_SERVICE), windowInfo, screen, navigator2, mobile, ip, geoProviderToken, accountId, siteId, channelId, locationId, userId);
3426
- var InitSurfAdsCore = async (channelId, accountId, siteId, locationId, userId, logger) => {
3427
- const windowInfo = GetWindowInfo();
3428
- if (!windowInfo.ok) {
3429
- return windowInfo;
3430
- }
3431
- return InitSurfAdsCoreServices(logger, TLS(PROD_BIDDER), TLS(PROD_CONFIGURATION_SERVICE), TLS(PROD_SPONSORED_PRODUCT_FEED), TLS(PROD_RECOMMENDED_PRODUCT_FEED), TLS(PROD_RECOMMENDER_SERVICE), TLS(PROD_DYNAMIC_ZONE_SERVICE), windowInfo.value, window.screen, window.navigator, isMobile(), undefined, undefined, accountId, siteId, channelId, locationId, userId);
3432
- };
3433
-
3434
- class MissingConfigurationError extends Error {
3435
- constructor(accountId, siteId) {
3436
- super(`Missing configuration for
3437
- ` + ` accountId: ${accountId}
3438
- ` + ` siteId: ${siteId}
3439
- ` + "1. Check to make sure that these are the correct values for each field" + "2. Check your publisher configuration at " + `https://app.surfside.io/inventory/sites/publisher/${accountId}/${siteId}`);
3440
- }
3441
- }
3442
-
3443
- class NotABrowserError extends Error {
3444
- constructor() {
3445
- super('You are not running Surfside Ads Core in a Web browser, so you cannot use "InitSurfAdsCore". ' + "Instead, use InitSurfAdsCoreSSR, and pass the user's screen, navigator, and IP address explicitly " + `so that Surfside Ads Core can initialize geo and device information services. e.g:
3446
- ` + ` InitSurfAdsCoreSSR(
3447
- ` + ` /* width and height of the user's screen: */
3448
- ` + ` { width: screenWidth, height: screenHeight },
3449
- ` + ` /* userAgent string and language of the user: */
3450
- ` + ` { userAgent: userAgent, language: userLanguage },
3451
- ` + ` /* whether the user is on mobile or not: */
3452
- ` + ` true,
3453
- ` + ` /* the requesting User's IP */
3454
- ` + ` request.ipAddress,
3455
- ` + ` /* Your API Token for the Surfside Geo Service: */
3456
- ` + ` geoProviderToken,
3457
- ` + ` accountId,
3458
- ` + ` siteId,
3459
- ` + ` channelId,
3460
- ` + ` locationId,
3461
- ` + ` userId,
3462
- ` + ` /* Optional logger: */
3463
- ` + ` logger
3464
- ` + " )");
3465
- }
3466
- }
3467
- var isMobile = () => typeof window !== "undefined" ? window.ontouchstart !== undefined : false;
3468
-
3469
- // src/helpers/Window.ts
3470
- var GetWindowInfo = () => {
3471
- if (typeof window === "undefined") {
3472
- return Err(new NotABrowserError);
3473
- }
3474
- return Ok({
3475
- href: window.location.href,
3476
- origin: window.location.origin,
3477
- port: window.location.port,
3478
- path: "/" + window.location.pathname.split("/").filter((part) => part.length > 0).join("/"),
3479
- host: window.location.host,
3480
- host_name: window.location.hostname,
3481
- search: window.location.search,
3482
- hash: window.location.hash,
3483
- protocol: window.location.protocol
3484
- });
3485
- };
3486
-
3487
- //# debugId=49180BF7D0C3D78D64756E2164756E21
3488
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy91dGlscy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL2V4Y2VwdGlvbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9oZWxwZXJzL2VhY2guanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9oZWxwZXJzL2hlbHBlci1taXNzaW5nLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvaGVscGVycy9pZi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL2hlbHBlcnMvbG9nLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvaGVscGVycy9sb29rdXAuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9oZWxwZXJzL3dpdGguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9oZWxwZXJzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvZGVjb3JhdG9ycy9pbmxpbmUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9kZWNvcmF0b3JzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvbG9nZ2VyLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvaW50ZXJuYWwvY3JlYXRlLW5ldy1sb29rdXAtb2JqZWN0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvaW50ZXJuYWwvcHJvdG8tYWNjZXNzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvYmFzZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL3NhZmUtc3RyaW5nLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9oYW5kbGViYXJzL2Rpc3QvY2pzL2hhbmRsZWJhcnMvaW50ZXJuYWwvd3JhcEhlbHBlci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzL3J1bnRpbWUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvZGlzdC9janMvaGFuZGxlYmFycy9uby1jb25mbGljdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvaGFuZGxlYmFycy9kaXN0L2Nqcy9oYW5kbGViYXJzLnJ1bnRpbWUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2hhbmRsZWJhcnMvcnVudGltZS5qcyIsICIuLi8uLi9zcmMvbW9kZWxzL3J0Yi9CaWRSZXF1ZXN0LnRzIiwgIi4uLy4uL3NyYy9tb2RlbHMvcnRiL05hdGl2ZVJlcXVlc3QudHMiLCAiLi4vLi4vc3JjL21vZGVscy9ydGIvTmF0aXZlUmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL3NlcnZpY2VzL0xvZ2dlci50cyIsICIuLi8uLi9zcmMvc2VydmljZXMvUmVzdWx0LnRzIiwgIi4uLy4uL3NyYy9zZXJ2aWNlcy9HZW8udHMiLCAiLi4vLi4vc3JjL3NlcnZpY2VzL0RldmljZS50cyIsICIuLi8uLi9zcmMvc2VydmljZXMvQ29uZmlndXJhdGlvbi50cyIsICIuLi8uLi9zcmMvc2VydmljZXMvQmlkZGVyLnRzIiwgIi4uLy4uL3NyYy9zZXJ2aWNlcy9Qcm9kdWN0LnRzIiwgIi4uLy4uL3NyYy9zZXJ2aWNlcy9SZWNvbW1lbmRlci50cyIsICIuLi8uLi9zcmMvc2VydmljZXMvVGVtcGxhdGUudHMiLCAiLi4vLi4vc3JjL3NlcnZpY2VzL0R5bmFtaWMudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvTmF0aXZlUmVxdWVzdEJ1aWxkZXIudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvUmVxdWVzdEJ1aWxkZXIudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvcmVzcG9uc2UvQnVpbHRSZXNwb25zZS50cyIsICIuLi8uLi9zcmMvaGVscGVycy9yZXNwb25zZS9DbGlja3Rocm91Z2gudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvR2VuZXJhdG9yLnRzIiwgIi4uLy4uL3NyYy9oZWxwZXJzL1RyeUdldC50cyIsICIuLi8uLi9zcmMvaGVscGVycy9yZXNwb25zZS9Qcm9kdWN0Q2FyZC50cyIsICIuLi8uLi9zcmMvaGVscGVycy9yZXNwb25zZS9DYXJvdXNlbC50cyIsICIuLi8uLi9zcmMvaGVscGVycy9IYW5kbGViYXJzLnRzIiwgIi4uLy4uL3NyYy9BcGkudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvV2luZG93LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZXh0ZW5kID0gZXh0ZW5kO1xuZXhwb3J0cy5pbmRleE9mID0gaW5kZXhPZjtcbmV4cG9ydHMuZXNjYXBlRXhwcmVzc2lvbiA9IGVzY2FwZUV4cHJlc3Npb247XG5leHBvcnRzLmlzRW1wdHkgPSBpc0VtcHR5O1xuZXhwb3J0cy5jcmVhdGVGcmFtZSA9IGNyZWF0ZUZyYW1lO1xuZXhwb3J0cy5ibG9ja1BhcmFtcyA9IGJsb2NrUGFyYW1zO1xuZXhwb3J0cy5hcHBlbmRDb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoO1xudmFyIGVzY2FwZSA9IHtcbiAgJyYnOiAnJmFtcDsnLFxuICAnPCc6ICcmbHQ7JyxcbiAgJz4nOiAnJmd0OycsXG4gICdcIic6ICcmcXVvdDsnLFxuICBcIidcIjogJyYjeDI3OycsXG4gICdgJzogJyYjeDYwOycsXG4gICc9JzogJyYjeDNEOydcbn07XG5cbnZhciBiYWRDaGFycyA9IC9bJjw+XCInYD1dL2csXG4gICAgcG9zc2libGUgPSAvWyY8PlwiJ2A9XS87XG5cbmZ1bmN0aW9uIGVzY2FwZUNoYXIoY2hyKSB7XG4gIHJldHVybiBlc2NhcGVbY2hyXTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKG9iaiAvKiAsIC4uLnNvdXJjZSAqLykge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAodmFyIGtleSBpbiBhcmd1bWVudHNbaV0pIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJndW1lbnRzW2ldLCBrZXkpKSB7XG4gICAgICAgIG9ialtrZXldID0gYXJndW1lbnRzW2ldW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuZXhwb3J0cy50b1N0cmluZyA9IHRvU3RyaW5nO1xuLy8gU291cmNlZCBmcm9tIGxvZGFzaFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL2xvZGFzaC9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dFxuLyogZXNsaW50LWRpc2FibGUgZnVuYy1zdHlsZSAqL1xudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59O1xuLy8gZmFsbGJhY2sgZm9yIG9sZGVyIHZlcnNpb25zIG9mIENocm9tZSBhbmQgU2FmYXJpXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuaWYgKGlzRnVuY3Rpb24oL3gvKSkge1xuICBleHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgfTtcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbi8qIGVzbGludC1lbmFibGUgZnVuYy1zdHlsZSAqL1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nIDogZmFsc2U7XG59O1xuXG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuLy8gT2xkZXIgSUUgdmVyc2lvbnMgZG8gbm90IGRpcmVjdGx5IHN1cHBvcnQgaW5kZXhPZiBzbyB3ZSBtdXN0IGltcGxlbWVudCBvdXIgb3duLCBzYWRseS5cblxuZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGFycmF5W2ldID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZVxuICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkge1xuICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nICsgJyc7XG4gICAgfVxuXG4gICAgLy8gRm9yY2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5kXG4gICAgLy8gdGhlIHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5zcGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMsIGNhdXNpbmcgaXNzdWVzIGlmXG4gICAgLy8gYW4gb2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gaXQuXG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmc7XG4gIH1cblxuICBpZiAoIXBvc3NpYmxlLnRlc3Qoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmc7XG4gIH1cbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKGJhZENoYXJzLCBlc2NhcGVDaGFyKTtcbn1cblxuZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYW1lKG9iamVjdCkge1xuICB2YXIgZnJhbWUgPSBleHRlbmQoe30sIG9iamVjdCk7XG4gIGZyYW1lLl9wYXJlbnQgPSBvYmplY3Q7XG4gIHJldHVybiBmcmFtZTtcbn1cblxuZnVuY3Rpb24gYmxvY2tQYXJhbXMocGFyYW1zLCBpZHMpIHtcbiAgcGFyYW1zLnBhdGggPSBpZHM7XG4gIHJldHVybiBwYXJhbXM7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZENvbnRleHRQYXRoKGNvbnRleHRQYXRoLCBpZCkge1xuICByZXR1cm4gKGNvbnRleHRQYXRoID8gY29udGV4dFBhdGggKyAnLicgOiAnJykgKyBpZDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDNWMGFXeHpMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUk3T3pzN096czdPenM3UVVGQlFTeEpRVUZOTEUxQlFVMHNSMEZCUnp0QlFVTmlMRXRCUVVjc1JVRkJSU3hQUVVGUE8wRkJRMW9zUzBGQlJ5eEZRVUZGTEUxQlFVMDdRVUZEV0N4TFFVRkhMRVZCUVVVc1RVRkJUVHRCUVVOWUxFdEJRVWNzUlVGQlJTeFJRVUZSTzBGQlEySXNTMEZCUnl4RlFVRkZMRkZCUVZFN1FVRkRZaXhMUVVGSExFVkJRVVVzVVVGQlVUdEJRVU5pTEV0QlFVY3NSVUZCUlN4UlFVRlJPME5CUTJRc1EwRkJRenM3UVVGRlJpeEpRVUZOTEZGQlFWRXNSMEZCUnl4WlFVRlpPMGxCUXpOQ0xGRkJRVkVzUjBGQlJ5eFhRVUZYTEVOQlFVTTdPMEZCUlhwQ0xGTkJRVk1zVlVGQlZTeERRVUZETEVkQlFVY3NSVUZCUlR0QlFVTjJRaXhUUVVGUExFMUJRVTBzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0RFFVTndRanM3UVVGRlRTeFRRVUZUTEUxQlFVMHNRMEZCUXl4SFFVRkhMRzlDUVVGdlFqdEJRVU0xUXl4UFFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NVMEZCVXl4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJUdEJRVU42UXl4VFFVRkxMRWxCUVVrc1IwRkJSeXhKUVVGSkxGTkJRVk1zUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlR0QlFVTTFRaXhWUVVGSkxFMUJRVTBzUTBGQlF5eFRRVUZUTEVOQlFVTXNZMEZCWXl4RFFVRkRMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNSMEZCUnl4RFFVRkRMRVZCUVVVN1FVRkRNMFFzVjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRk5CUVZNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0UFFVTTVRanRMUVVOR08wZEJRMFk3TzBGQlJVUXNVMEZCVHl4SFFVRkhMRU5CUVVNN1EwRkRXanM3UVVGRlRTeEpRVUZKTEZGQlFWRXNSMEZCUnl4TlFVRk5MRU5CUVVNc1UwRkJVeXhEUVVGRExGRkJRVkVzUTBGQlF6czdPenM3TzBGQlMyaEVMRWxCUVVrc1ZVRkJWU3hIUVVGSExHOUNRVUZUTEV0QlFVc3NSVUZCUlR0QlFVTXZRaXhUUVVGUExFOUJRVThzUzBGQlN5eExRVUZMTEZWQlFWVXNRMEZCUXp0RFFVTndReXhEUVVGRE96czdRVUZIUml4SlFVRkpMRlZCUVZVc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJUdEJRVU51UWl4VlFVOVBMRlZCUVZVc1IwRlFha0lzVlVGQlZTeEhRVUZITEZWQlFWTXNTMEZCU3l4RlFVRkZPMEZCUXpOQ0xGZEJRMFVzVDBGQlR5eExRVUZMTEV0QlFVc3NWVUZCVlN4SlFVTXpRaXhSUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRzFDUVVGdFFpeERRVU0xUXp0SFFVTklMRU5CUVVNN1EwRkRTRHRSUVVOUkxGVkJRVlVzUjBGQlZpeFZRVUZWT3pzN096dEJRVWxhTEVsQlFVMHNUMEZCVHl4SFFVTnNRaXhMUVVGTExFTkJRVU1zVDBGQlR5eEpRVU5pTEZWQlFWTXNTMEZCU3l4RlFVRkZPMEZCUTJRc1UwRkJUeXhMUVVGTExFbEJRVWtzVDBGQlR5eExRVUZMTEV0QlFVc3NVVUZCVVN4SFFVTnlReXhSUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMR2RDUVVGblFpeEhRVU42UXl4TFFVRkxMRU5CUVVNN1EwRkRXQ3hEUVVGRE96czdPenRCUVVkSExGTkJRVk1zVDBGQlR5eERRVUZETEV0QlFVc3NSVUZCUlN4TFFVRkxMRVZCUVVVN1FVRkRjRU1zVDBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1IwRkJSeXhIUVVGSExFdEJRVXNzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4SFFVRkhMRWRCUVVjc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJUdEJRVU5vUkN4UlFVRkpMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eExRVUZMTEVWQlFVVTdRVUZEZEVJc1lVRkJUeXhEUVVGRExFTkJRVU03UzBGRFZqdEhRVU5HTzBGQlEwUXNVMEZCVHl4RFFVRkRMRU5CUVVNc1EwRkJRenREUVVOWU96dEJRVVZOTEZOQlFWTXNaMEpCUVdkQ0xFTkJRVU1zVFVGQlRTeEZRVUZGTzBGQlEzWkRMRTFCUVVrc1QwRkJUeXhOUVVGTkxFdEJRVXNzVVVGQlVTeEZRVUZGT3p0QlFVVTVRaXhSUVVGSkxFMUJRVTBzU1VGQlNTeE5RVUZOTEVOQlFVTXNUVUZCVFN4RlFVRkZPMEZCUXpOQ0xHRkJRVThzVFVGQlRTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRPMHRCUTNoQ0xFMUJRVTBzU1VGQlNTeE5RVUZOTEVsQlFVa3NTVUZCU1N4RlFVRkZPMEZCUTNwQ0xHRkJRVThzUlVGQlJTeERRVUZETzB0QlExZ3NUVUZCVFN4SlFVRkpMRU5CUVVNc1RVRkJUU3hGUVVGRk8wRkJRMnhDTEdGQlFVOHNUVUZCVFN4SFFVRkhMRVZCUVVVc1EwRkJRenRMUVVOd1FqczdPenM3UVVGTFJDeFZRVUZOTEVkQlFVY3NSVUZCUlN4SFFVRkhMRTFCUVUwc1EwRkJRenRIUVVOMFFqczdRVUZGUkN4TlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlR0QlFVTXhRaXhYUVVGUExFMUJRVTBzUTBGQlF6dEhRVU5tTzBGQlEwUXNVMEZCVHl4TlFVRk5MRU5CUVVNc1QwRkJUeXhEUVVGRExGRkJRVkVzUlVGQlJTeFZRVUZWTEVOQlFVTXNRMEZCUXp0RFFVTTNRenM3UVVGRlRTeFRRVUZUTEU5QlFVOHNRMEZCUXl4TFFVRkxMRVZCUVVVN1FVRkROMElzVFVGQlNTeERRVUZETEV0QlFVc3NTVUZCU1N4TFFVRkxMRXRCUVVzc1EwRkJReXhGUVVGRk8wRkJRM3BDTEZkQlFVOHNTVUZCU1N4RFFVRkRPMGRCUTJJc1RVRkJUU3hKUVVGSkxFOUJRVThzUTBGQlF5eExRVUZMTEVOQlFVTXNTVUZCU1N4TFFVRkxMRU5CUVVNc1RVRkJUU3hMUVVGTExFTkJRVU1zUlVGQlJUdEJRVU12UXl4WFFVRlBMRWxCUVVrc1EwRkJRenRIUVVOaUxFMUJRVTA3UVVGRFRDeFhRVUZQTEV0QlFVc3NRMEZCUXp0SFFVTmtPME5CUTBZN08wRkJSVTBzVTBGQlV5eFhRVUZYTEVOQlFVTXNUVUZCVFN4RlFVRkZPMEZCUTJ4RExFMUJRVWtzUzBGQlN5eEhRVUZITEUxQlFVMHNRMEZCUXl4RlFVRkZMRVZCUVVVc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGREwwSXNUMEZCU3l4RFFVRkRMRTlCUVU4c1IwRkJSeXhOUVVGTkxFTkJRVU03UVVGRGRrSXNVMEZCVHl4TFFVRkxMRU5CUVVNN1EwRkRaRHM3UVVGRlRTeFRRVUZUTEZkQlFWY3NRMEZCUXl4TlFVRk5MRVZCUVVVc1IwRkJSeXhGUVVGRk8wRkJRM1pETEZGQlFVMHNRMEZCUXl4SlFVRkpMRWRCUVVjc1IwRkJSeXhEUVVGRE8wRkJRMnhDTEZOQlFVOHNUVUZCVFN4RFFVRkRPME5CUTJZN08wRkJSVTBzVTBGQlV5eHBRa0ZCYVVJc1EwRkJReXhYUVVGWExFVkJRVVVzUlVGQlJTeEZRVUZGTzBGQlEycEVMRk5CUVU4c1EwRkJReXhYUVVGWExFZEJRVWNzVjBGQlZ5eEhRVUZITEVkQlFVY3NSMEZCUnl4RlFVRkZMRU5CUVVFc1IwRkJTU3hGUVVGRkxFTkJRVU03UTBGRGNFUWlMQ0ptYVd4bElqb2lkWFJwYkhNdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpqYjI1emRDQmxjMk5oY0dVZ1BTQjdYRzRnSUNjbUp6b2dKeVpoYlhBN0p5eGNiaUFnSnp3bk9pQW5KbXgwT3ljc1hHNGdJQ2MrSnpvZ0p5Wm5kRHNuTEZ4dUlDQW5YQ0luT2lBbkpuRjFiM1E3Snl4Y2JpQWdYQ0luWENJNklDY21JM2d5TnpzbkxGeHVJQ0FuWUNjNklDY21JM2cyTURzbkxGeHVJQ0FuUFNjNklDY21JM2d6UkRzblhHNTlPMXh1WEc1amIyNXpkQ0JpWVdSRGFHRnljeUE5SUM5YkpqdytYQ0luWUQxZEwyY3NYRzRnSUhCdmMzTnBZbXhsSUQwZ0wxc21QRDVjSWlkZ1BWMHZPMXh1WEc1bWRXNWpkR2x2YmlCbGMyTmhjR1ZEYUdGeUtHTm9jaWtnZTF4dUlDQnlaWFIxY200Z1pYTmpZWEJsVzJOb2NsMDdYRzU5WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCbGVIUmxibVFvYjJKcUlDOHFJQ3dnTGk0dWMyOTFjbU5sSUNvdktTQjdYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXhPeUJwSUR3Z1lYSm5kVzFsYm5SekxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdabTl5SUNoc1pYUWdhMlY1SUdsdUlHRnlaM1Z0Wlc1MGMxdHBYU2tnZTF4dUlDQWdJQ0FnYVdZZ0tFOWlhbVZqZEM1d2NtOTBiM1I1Y0dVdWFHRnpUM2R1VUhKdmNHVnlkSGt1WTJGc2JDaGhjbWQxYldWdWRITmJhVjBzSUd0bGVTa3BJSHRjYmlBZ0lDQWdJQ0FnYjJKcVcydGxlVjBnUFNCaGNtZDFiV1Z1ZEhOYmFWMWJhMlY1WFR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCeVpYUjFjbTRnYjJKcU8xeHVmVnh1WEc1bGVIQnZjblFnYkdWMElIUnZVM1J5YVc1bklEMGdUMkpxWldOMExuQnliM1J2ZEhsd1pTNTBiMU4wY21sdVp6dGNibHh1THk4Z1UyOTFjbU5sWkNCbWNtOXRJR3h2WkdGemFGeHVMeThnYUhSMGNITTZMeTluYVhSb2RXSXVZMjl0TDJKbGMzUnBaV3B6TDJ4dlpHRnphQzlpYkc5aUwyMWhjM1JsY2k5TVNVTkZUbE5GTG5SNGRGeHVMeW9nWlhOc2FXNTBMV1JwYzJGaWJHVWdablZ1WXkxemRIbHNaU0FxTDF4dWJHVjBJR2x6Um5WdVkzUnBiMjRnUFNCbWRXNWpkR2x2YmloMllXeDFaU2tnZTF4dUlDQnlaWFIxY200Z2RIbHdaVzltSUhaaGJIVmxJRDA5UFNBblpuVnVZM1JwYjI0bk8xeHVmVHRjYmk4dklHWmhiR3hpWVdOcklHWnZjaUJ2YkdSbGNpQjJaWEp6YVc5dWN5QnZaaUJEYUhKdmJXVWdZVzVrSUZOaFptRnlhVnh1THlvZ2FYTjBZVzVpZFd3Z2FXZHViM0psSUc1bGVIUWdLaTljYm1sbUlDaHBjMFoxYm1OMGFXOXVLQzk0THlrcElIdGNiaUFnYVhOR2RXNWpkR2x2YmlBOUlHWjFibU4wYVc5dUtIWmhiSFZsS1NCN1hHNGdJQ0FnY21WMGRYSnVJQ2hjYmlBZ0lDQWdJSFI1Y0dWdlppQjJZV3gxWlNBOVBUMGdKMloxYm1OMGFXOXVKeUFtSmx4dUlDQWdJQ0FnZEc5VGRISnBibWN1WTJGc2JDaDJZV3gxWlNrZ1BUMDlJQ2RiYjJKcVpXTjBJRVoxYm1OMGFXOXVYU2RjYmlBZ0lDQXBPMXh1SUNCOU8xeHVmVnh1Wlhod2IzSjBJSHNnYVhOR2RXNWpkR2x2YmlCOU8xeHVMeW9nWlhOc2FXNTBMV1Z1WVdKc1pTQm1kVzVqTFhOMGVXeGxJQ292WEc1Y2JpOHFJR2x6ZEdGdVluVnNJR2xuYm05eVpTQnVaWGgwSUNvdlhHNWxlSEJ2Y25RZ1kyOXVjM1FnYVhOQmNuSmhlU0E5WEc0Z0lFRnljbUY1TG1selFYSnlZWGtnZkh4Y2JpQWdablZ1WTNScGIyNG9kbUZzZFdVcElIdGNiaUFnSUNCeVpYUjFjbTRnZG1Gc2RXVWdKaVlnZEhsd1pXOW1JSFpoYkhWbElEMDlQU0FuYjJKcVpXTjBKMXh1SUNBZ0lDQWdQeUIwYjFOMGNtbHVaeTVqWVd4c0tIWmhiSFZsS1NBOVBUMGdKMXR2WW1wbFkzUWdRWEp5WVhsZEoxeHVJQ0FnSUNBZ09pQm1ZV3h6WlR0Y2JpQWdmVHRjYmx4dUx5OGdUMnhrWlhJZ1NVVWdkbVZ5YzJsdmJuTWdaRzhnYm05MElHUnBjbVZqZEd4NUlITjFjSEJ2Y25RZ2FXNWtaWGhQWmlCemJ5QjNaU0J0ZFhOMElHbHRjR3hsYldWdWRDQnZkWElnYjNkdUxDQnpZV1JzZVM1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCcGJtUmxlRTltS0dGeWNtRjVMQ0IyWVd4MVpTa2dlMXh1SUNCbWIzSWdLR3hsZENCcElEMGdNQ3dnYkdWdUlEMGdZWEp5WVhrdWJHVnVaM1JvT3lCcElEd2diR1Z1T3lCcEt5c3BJSHRjYmlBZ0lDQnBaaUFvWVhKeVlYbGJhVjBnUFQwOUlIWmhiSFZsS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnYVR0Y2JpQWdJQ0I5WEc0Z0lIMWNiaUFnY21WMGRYSnVJQzB4TzF4dWZWeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdaWE5qWVhCbFJYaHdjbVZ6YzJsdmJpaHpkSEpwYm1jcElIdGNiaUFnYVdZZ0tIUjVjR1Z2WmlCemRISnBibWNnSVQwOUlDZHpkSEpwYm1jbktTQjdYRzRnSUNBZ0x5OGdaRzl1SjNRZ1pYTmpZWEJsSUZOaFptVlRkSEpwYm1kekxDQnphVzVqWlNCMGFHVjVKM0psSUdGc2NtVmhaSGtnYzJGbVpWeHVJQ0FnSUdsbUlDaHpkSEpwYm1jZ0ppWWdjM1J5YVc1bkxuUnZTRlJOVENrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUhOMGNtbHVaeTUwYjBoVVRVd29LVHRjYmlBZ0lDQjlJR1ZzYzJVZ2FXWWdLSE4wY21sdVp5QTlQU0J1ZFd4c0tTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z0p5YzdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDZ2hjM1J5YVc1bktTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2MzUnlhVzVuSUNzZ0p5YzdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ0x5OGdSbTl5WTJVZ1lTQnpkSEpwYm1jZ1kyOXVkbVZ5YzJsdmJpQmhjeUIwYUdseklIZHBiR3dnWW1VZ1pHOXVaU0JpZVNCMGFHVWdZWEJ3Wlc1a0lISmxaMkZ5Wkd4bGMzTWdZVzVrWEc0Z0lDQWdMeThnZEdobElISmxaMlY0SUhSbGMzUWdkMmxzYkNCa2J5QjBhR2x6SUhSeVlXNXpjR0Z5Wlc1MGJIa2dZbVZvYVc1a0lIUm9aU0J6WTJWdVpYTXNJR05oZFhOcGJtY2dhWE56ZFdWeklHbG1YRzRnSUNBZ0x5OGdZVzRnYjJKcVpXTjBKM01nZEc4Z2MzUnlhVzVuSUdoaGN5QmxjMk5oY0dWa0lHTm9ZWEpoWTNSbGNuTWdhVzRnYVhRdVhHNGdJQ0FnYzNSeWFXNW5JRDBnSnljZ0t5QnpkSEpwYm1jN1hHNGdJSDFjYmx4dUlDQnBaaUFvSVhCdmMzTnBZbXhsTG5SbGMzUW9jM1J5YVc1bktTa2dlMXh1SUNBZ0lISmxkSFZ5YmlCemRISnBibWM3WEc0Z0lIMWNiaUFnY21WMGRYSnVJSE4wY21sdVp5NXlaWEJzWVdObEtHSmhaRU5vWVhKekxDQmxjMk5oY0dWRGFHRnlLVHRjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHbHpSVzF3ZEhrb2RtRnNkV1VwSUh0Y2JpQWdhV1lnS0NGMllXeDFaU0FtSmlCMllXeDFaU0FoUFQwZ01Da2dlMXh1SUNBZ0lISmxkSFZ5YmlCMGNuVmxPMXh1SUNCOUlHVnNjMlVnYVdZZ0tHbHpRWEp5WVhrb2RtRnNkV1VwSUNZbUlIWmhiSFZsTG14bGJtZDBhQ0E5UFQwZ01Da2dlMXh1SUNBZ0lISmxkSFZ5YmlCMGNuVmxPMXh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJSEpsZEhWeWJpQm1ZV3h6WlR0Y2JpQWdmVnh1ZlZ4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1kzSmxZWFJsUm5KaGJXVW9iMkpxWldOMEtTQjdYRzRnSUd4bGRDQm1jbUZ0WlNBOUlHVjRkR1Z1WkNoN2ZTd2diMkpxWldOMEtUdGNiaUFnWm5KaGJXVXVYM0JoY21WdWRDQTlJRzlpYW1WamREdGNiaUFnY21WMGRYSnVJR1p5WVcxbE8xeHVmVnh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnWW14dlkydFFZWEpoYlhNb2NHRnlZVzF6TENCcFpITXBJSHRjYmlBZ2NHRnlZVzF6TG5CaGRHZ2dQU0JwWkhNN1hHNGdJSEpsZEhWeWJpQndZWEpoYlhNN1hHNTlYRzVjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJoY0hCbGJtUkRiMjUwWlhoMFVHRjBhQ2hqYjI1MFpYaDBVR0YwYUN3Z2FXUXBJSHRjYmlBZ2NtVjBkWEp1SUNoamIyNTBaWGgwVUdGMGFDQS9JR052Ym5SbGVIUlFZWFJvSUNzZ0p5NG5JRG9nSnljcElDc2dhV1E3WEc1OVhHNGlYWDA9XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBlcnJvclByb3BzID0gWydkZXNjcmlwdGlvbicsICdmaWxlTmFtZScsICdsaW5lTnVtYmVyJywgJ2VuZExpbmVOdW1iZXInLCAnbWVzc2FnZScsICduYW1lJywgJ251bWJlcicsICdzdGFjayddO1xuXG5mdW5jdGlvbiBFeGNlcHRpb24obWVzc2FnZSwgbm9kZSkge1xuICB2YXIgbG9jID0gbm9kZSAmJiBub2RlLmxvYyxcbiAgICAgIGxpbmUgPSB1bmRlZmluZWQsXG4gICAgICBlbmRMaW5lTnVtYmVyID0gdW5kZWZpbmVkLFxuICAgICAgY29sdW1uID0gdW5kZWZpbmVkLFxuICAgICAgZW5kQ29sdW1uID0gdW5kZWZpbmVkO1xuXG4gIGlmIChsb2MpIHtcbiAgICBsaW5lID0gbG9jLnN0YXJ0LmxpbmU7XG4gICAgZW5kTGluZU51bWJlciA9IGxvYy5lbmQubGluZTtcbiAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uO1xuICAgIGVuZENvbHVtbiA9IGxvYy5lbmQuY29sdW1uO1xuXG4gICAgbWVzc2FnZSArPSAnIC0gJyArIGxpbmUgKyAnOicgKyBjb2x1bW47XG4gIH1cblxuICB2YXIgdG1wID0gRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG5cbiAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuXG4gIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykge1xuICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRXhjZXB0aW9uKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGxvYykge1xuICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTtcbiAgICAgIHRoaXMuZW5kTGluZU51bWJlciA9IGVuZExpbmVOdW1iZXI7XG5cbiAgICAgIC8vIFdvcmsgYXJvdW5kIGlzc3VlIHVuZGVyIHNhZmFyaSB3aGVyZSB3ZSBjYW4ndCBkaXJlY3RseSBzZXQgdGhlIGNvbHVtbiB2YWx1ZVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb2x1bW4nLCB7XG4gICAgICAgICAgdmFsdWU6IGNvbHVtbixcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2VuZENvbHVtbicsIHtcbiAgICAgICAgICB2YWx1ZTogZW5kQ29sdW1uLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICAgICAgdGhpcy5lbmRDb2x1bW4gPSBlbmRDb2x1bW47XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChub3ApIHtcbiAgICAvKiBJZ25vcmUgaWYgdGhlIGJyb3dzZXIgaXMgdmVyeSBwYXJ0aWN1bGFyICovXG4gIH1cbn1cblxuRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBFeGNlcHRpb247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDJWNFkyVndkR2x2Ymk1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU96czdRVUZCUVN4SlFVRk5MRlZCUVZVc1IwRkJSeXhEUVVOcVFpeGhRVUZoTEVWQlEySXNWVUZCVlN4RlFVTldMRmxCUVZrc1JVRkRXaXhsUVVGbExFVkJRMllzVTBGQlV5eEZRVU5VTEUxQlFVMHNSVUZEVGl4UlFVRlJMRVZCUTFJc1QwRkJUeXhEUVVOU0xFTkJRVU03TzBGQlJVWXNVMEZCVXl4VFFVRlRMRU5CUVVNc1QwRkJUeXhGUVVGRkxFbEJRVWtzUlVGQlJUdEJRVU5vUXl4TlFVRkpMRWRCUVVjc1IwRkJSeXhKUVVGSkxFbEJRVWtzU1VGQlNTeERRVUZETEVkQlFVYzdUVUZEZUVJc1NVRkJTU3haUVVGQk8wMUJRMG9zWVVGQllTeFpRVUZCTzAxQlEySXNUVUZCVFN4WlFVRkJPMDFCUTA0c1UwRkJVeXhaUVVGQkxFTkJRVU03TzBGQlJWb3NUVUZCU1N4SFFVRkhMRVZCUVVVN1FVRkRVQ3hSUVVGSkxFZEJRVWNzUjBGQlJ5eERRVUZETEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVNN1FVRkRkRUlzYVVKQlFXRXNSMEZCUnl4SFFVRkhMRU5CUVVNc1IwRkJSeXhEUVVGRExFbEJRVWtzUTBGQlF6dEJRVU0zUWl4VlFVRk5MRWRCUVVjc1IwRkJSeXhEUVVGRExFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTTdRVUZETVVJc1lVRkJVeXhIUVVGSExFZEJRVWNzUTBGQlF5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRPenRCUVVVelFpeFhRVUZQTEVsQlFVa3NTMEZCU3l4SFFVRkhMRWxCUVVrc1IwRkJSeXhIUVVGSExFZEJRVWNzVFVGQlRTeERRVUZETzBkQlEzaERPenRCUVVWRUxFMUJRVWtzUjBGQlJ5eEhRVUZITEV0QlFVc3NRMEZCUXl4VFFVRlRMRU5CUVVNc1YwRkJWeXhEUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVWQlFVVXNUMEZCVHl4RFFVRkRMRU5CUVVNN096dEJRVWN4UkN4UFFVRkxMRWxCUVVrc1IwRkJSeXhIUVVGSExFTkJRVU1zUlVGQlJTeEhRVUZITEVkQlFVY3NWVUZCVlN4RFFVRkRMRTFCUVUwc1JVRkJSU3hIUVVGSExFVkJRVVVzUlVGQlJUdEJRVU5vUkN4UlFVRkpMRU5CUVVNc1ZVRkJWU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRMRlZCUVZVc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETzBkQlF6bERPenM3UVVGSFJDeE5RVUZKTEV0QlFVc3NRMEZCUXl4cFFrRkJhVUlzUlVGQlJUdEJRVU16UWl4VFFVRkxMRU5CUVVNc2FVSkJRV2xDTEVOQlFVTXNTVUZCU1N4RlFVRkZMRk5CUVZNc1EwRkJReXhEUVVGRE8wZEJRekZET3p0QlFVVkVMRTFCUVVrN1FVRkRSaXhSUVVGSkxFZEJRVWNzUlVGQlJUdEJRVU5RTEZWQlFVa3NRMEZCUXl4VlFVRlZMRWRCUVVjc1NVRkJTU3hEUVVGRE8wRkJRM1pDTEZWQlFVa3NRMEZCUXl4aFFVRmhMRWRCUVVjc1lVRkJZU3hEUVVGRE96czdPMEZCU1c1RExGVkJRVWtzVFVGQlRTeERRVUZETEdOQlFXTXNSVUZCUlR0QlFVTjZRaXhqUVVGTkxFTkJRVU1zWTBGQll5eERRVUZETEVsQlFVa3NSVUZCUlN4UlFVRlJMRVZCUVVVN1FVRkRjRU1zWlVGQlN5eEZRVUZGTEUxQlFVMDdRVUZEWWl4dlFrRkJWU3hGUVVGRkxFbEJRVWs3VTBGRGFrSXNRMEZCUXl4RFFVRkRPMEZCUTBnc1kwRkJUU3hEUVVGRExHTkJRV01zUTBGQlF5eEpRVUZKTEVWQlFVVXNWMEZCVnl4RlFVRkZPMEZCUTNaRExHVkJRVXNzUlVGQlJTeFRRVUZUTzBGQlEyaENMRzlDUVVGVkxFVkJRVVVzU1VGQlNUdFRRVU5xUWl4RFFVRkRMRU5CUVVNN1QwRkRTaXhOUVVGTk8wRkJRMHdzV1VGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4TlFVRk5MRU5CUVVNN1FVRkRja0lzV1VGQlNTeERRVUZETEZOQlFWTXNSMEZCUnl4VFFVRlRMRU5CUVVNN1QwRkROVUk3UzBGRFJqdEhRVU5HTEVOQlFVTXNUMEZCVHl4SFFVRkhMRVZCUVVVN08wZEJSV0k3UTBGRFJqczdRVUZGUkN4VFFVRlRMRU5CUVVNc1UwRkJVeXhIUVVGSExFbEJRVWtzUzBGQlN5eEZRVUZGTEVOQlFVTTdPM0ZDUVVWdVFpeFRRVUZUSWl3aVptbHNaU0k2SW1WNFkyVndkR2x2Ymk1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbU52Ym5OMElHVnljbTl5VUhKdmNITWdQU0JiWEc0Z0lDZGtaWE5qY21sd2RHbHZiaWNzWEc0Z0lDZG1hV3hsVG1GdFpTY3NYRzRnSUNkc2FXNWxUblZ0WW1WeUp5eGNiaUFnSjJWdVpFeHBibVZPZFcxaVpYSW5MRnh1SUNBbmJXVnpjMkZuWlNjc1hHNGdJQ2R1WVcxbEp5eGNiaUFnSjI1MWJXSmxjaWNzWEc0Z0lDZHpkR0ZqYXlkY2JsMDdYRzVjYm1aMWJtTjBhVzl1SUVWNFkyVndkR2x2YmlodFpYTnpZV2RsTENCdWIyUmxLU0I3WEc0Z0lHeGxkQ0JzYjJNZ1BTQnViMlJsSUNZbUlHNXZaR1V1Ykc5akxGeHVJQ0FnSUd4cGJtVXNYRzRnSUNBZ1pXNWtUR2x1WlU1MWJXSmxjaXhjYmlBZ0lDQmpiMngxYlc0c1hHNGdJQ0FnWlc1a1EyOXNkVzF1TzF4dVhHNGdJR2xtSUNoc2IyTXBJSHRjYmlBZ0lDQnNhVzVsSUQwZ2JHOWpMbk4wWVhKMExteHBibVU3WEc0Z0lDQWdaVzVrVEdsdVpVNTFiV0psY2lBOUlHeHZZeTVsYm1RdWJHbHVaVHRjYmlBZ0lDQmpiMngxYlc0Z1BTQnNiMk11YzNSaGNuUXVZMjlzZFcxdU8xeHVJQ0FnSUdWdVpFTnZiSFZ0YmlBOUlHeHZZeTVsYm1RdVkyOXNkVzF1TzF4dVhHNGdJQ0FnYldWemMyRm5aU0FyUFNBbklDMGdKeUFySUd4cGJtVWdLeUFuT2ljZ0t5QmpiMngxYlc0N1hHNGdJSDFjYmx4dUlDQnNaWFFnZEcxd0lEMGdSWEp5YjNJdWNISnZkRzkwZVhCbExtTnZibk4wY25WamRHOXlMbU5oYkd3b2RHaHBjeXdnYldWemMyRm5aU2s3WEc1Y2JpQWdMeThnVlc1bWIzSjBkVzVoZEdWc2VTQmxjbkp2Y25NZ1lYSmxJRzV2ZENCbGJuVnRaWEpoWW14bElHbHVJRU5vY205dFpTQW9ZWFFnYkdWaGMzUXBMQ0J6YnlCZ1ptOXlJSEJ5YjNBZ2FXNGdkRzF3WUNCa2IyVnpiaWQwSUhkdmNtc3VYRzRnSUdadmNpQW9iR1YwSUdsa2VDQTlJREE3SUdsa2VDQThJR1Z5Y205eVVISnZjSE11YkdWdVozUm9PeUJwWkhnckt5a2dlMXh1SUNBZ0lIUm9hWE5iWlhKeWIzSlFjbTl3YzF0cFpIaGRYU0E5SUhSdGNGdGxjbkp2Y2xCeWIzQnpXMmxrZUYxZE8xeHVJQ0I5WEc1Y2JpQWdMeW9nYVhOMFlXNWlkV3dnYVdkdWIzSmxJR1ZzYzJVZ0tpOWNiaUFnYVdZZ0tFVnljbTl5TG1OaGNIUjFjbVZUZEdGamExUnlZV05sS1NCN1hHNGdJQ0FnUlhKeWIzSXVZMkZ3ZEhWeVpWTjBZV05yVkhKaFkyVW9kR2hwY3l3Z1JYaGpaWEIwYVc5dUtUdGNiaUFnZlZ4dVhHNGdJSFJ5ZVNCN1hHNGdJQ0FnYVdZZ0tHeHZZeWtnZTF4dUlDQWdJQ0FnZEdocGN5NXNhVzVsVG5WdFltVnlJRDBnYkdsdVpUdGNiaUFnSUNBZ0lIUm9hWE11Wlc1a1RHbHVaVTUxYldKbGNpQTlJR1Z1WkV4cGJtVk9kVzFpWlhJN1hHNWNiaUFnSUNBZ0lDOHZJRmR2Y21zZ1lYSnZkVzVrSUdsemMzVmxJSFZ1WkdWeUlITmhabUZ5YVNCM2FHVnlaU0IzWlNCallXNG5kQ0JrYVhKbFkzUnNlU0J6WlhRZ2RHaGxJR052YkhWdGJpQjJZV3gxWlZ4dUlDQWdJQ0FnTHlvZ2FYTjBZVzVpZFd3Z2FXZHViM0psSUc1bGVIUWdLaTljYmlBZ0lDQWdJR2xtSUNoUFltcGxZM1F1WkdWbWFXNWxVSEp2Y0dWeWRIa3BJSHRjYmlBZ0lDQWdJQ0FnVDJKcVpXTjBMbVJsWm1sdVpWQnliM0JsY25SNUtIUm9hWE1zSUNkamIyeDFiVzRuTENCN1hHNGdJQ0FnSUNBZ0lDQWdkbUZzZFdVNklHTnZiSFZ0Yml4Y2JpQWdJQ0FnSUNBZ0lDQmxiblZ0WlhKaFlteGxPaUIwY25WbFhHNGdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdJQ0JQWW1wbFkzUXVaR1ZtYVc1bFVISnZjR1Z5ZEhrb2RHaHBjeXdnSjJWdVpFTnZiSFZ0Ymljc0lIdGNiaUFnSUNBZ0lDQWdJQ0IyWVd4MVpUb2daVzVrUTI5c2RXMXVMRnh1SUNBZ0lDQWdJQ0FnSUdWdWRXMWxjbUZpYkdVNklIUnlkV1ZjYmlBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbU52YkhWdGJpQTlJR052YkhWdGJqdGNiaUFnSUNBZ0lDQWdkR2hwY3k1bGJtUkRiMngxYlc0Z1BTQmxibVJEYjJ4MWJXNDdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0I5SUdOaGRHTm9JQ2h1YjNBcElIdGNiaUFnSUNBdktpQkpaMjV2Y21VZ2FXWWdkR2hsSUdKeWIzZHpaWElnYVhNZ2RtVnllU0J3WVhKMGFXTjFiR0Z5SUNvdlhHNGdJSDFjYm4xY2JseHVSWGhqWlhCMGFXOXVMbkJ5YjNSdmRIbHdaU0E5SUc1bGR5QkZjbkp2Y2lncE8xeHVYRzVsZUhCdmNuUWdaR1ZtWVhWc2RDQkZlR05sY0hScGIyNDdYRzRpWFgwPVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2Jsb2NrSGVscGVyTWlzc2luZycsIGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgdmFyIGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gZm4odGhpcyk7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHtcbiAgICAgIGlmIChjb250ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgICAgICAgb3B0aW9ucy5pZHMgPSBbb3B0aW9ucy5uYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5oZWxwZXJzLmVhY2goY29udGV4dCwgb3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaW52ZXJzZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmlkcykge1xuICAgICAgICB2YXIgZGF0YSA9IF91dGlscy5jcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gX3V0aWxzLmFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5uYW1lKTtcbiAgICAgICAgb3B0aW9ucyA9IHsgZGF0YTogZGF0YSB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDJobGJIQmxjbk12WW14dlkyc3RhR1ZzY0dWeUxXMXBjM05wYm1jdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqczdPenR4UWtGQmQwUXNWVUZCVlRzN2NVSkJSVzVFTEZWQlFWTXNVVUZCVVN4RlFVRkZPMEZCUTJoRExGVkJRVkVzUTBGQlF5eGpRVUZqTEVOQlFVTXNiMEpCUVc5Q0xFVkJRVVVzVlVGQlV5eFBRVUZQTEVWQlFVVXNUMEZCVHl4RlFVRkZPMEZCUTNaRkxGRkJRVWtzVDBGQlR5eEhRVUZITEU5QlFVOHNRMEZCUXl4UFFVRlBPMUZCUXpOQ0xFVkJRVVVzUjBGQlJ5eFBRVUZQTEVOQlFVTXNSVUZCUlN4RFFVRkRPenRCUVVWc1FpeFJRVUZKTEU5QlFVOHNTMEZCU3l4SlFVRkpMRVZCUVVVN1FVRkRjRUlzWVVGQlR5eEZRVUZGTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNN1MwRkRha0lzVFVGQlRTeEpRVUZKTEU5QlFVOHNTMEZCU3l4TFFVRkxMRWxCUVVrc1QwRkJUeXhKUVVGSkxFbEJRVWtzUlVGQlJUdEJRVU12UXl4aFFVRlBMRTlCUVU4c1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF6dExRVU4wUWl4TlFVRk5MRWxCUVVrc1pVRkJVU3hQUVVGUExFTkJRVU1zUlVGQlJUdEJRVU16UWl4VlFVRkpMRTlCUVU4c1EwRkJReXhOUVVGTkxFZEJRVWNzUTBGQlF5eEZRVUZGTzBGQlEzUkNMRmxCUVVrc1QwRkJUeXhEUVVGRExFZEJRVWNzUlVGQlJUdEJRVU5tTEdsQ1FVRlBMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU1zVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMU5CUXpsQ096dEJRVVZFTEdWQlFVOHNVVUZCVVN4RFFVRkRMRTlCUVU4c1EwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eEZRVUZGTEU5QlFVOHNRMEZCUXl4RFFVRkRPMDlCUTJoRUxFMUJRVTA3UVVGRFRDeGxRVUZQTEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRQUVVOMFFqdExRVU5HTEUxQlFVMDdRVUZEVEN4VlFVRkpMRTlCUVU4c1EwRkJReXhKUVVGSkxFbEJRVWtzVDBGQlR5eERRVUZETEVkQlFVY3NSVUZCUlR0QlFVTXZRaXhaUVVGSkxFbEJRVWtzUjBGQlJ5eHRRa0ZCV1N4UFFVRlBMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU03UVVGRGNrTXNXVUZCU1N4RFFVRkRMRmRCUVZjc1IwRkJSeXg1UWtGRGFrSXNUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXhYUVVGWExFVkJRM2hDTEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUTJJc1EwRkJRenRCUVVOR0xHVkJRVThzUjBGQlJ5eEZRVUZGTEVsQlFVa3NSVUZCUlN4SlFVRkpMRVZCUVVVc1EwRkJRenRQUVVNeFFqczdRVUZGUkN4aFFVRlBMRVZCUVVVc1EwRkJReXhQUVVGUExFVkJRVVVzVDBGQlR5eERRVUZETEVOQlFVTTdTMEZETjBJN1IwRkRSaXhEUVVGRExFTkJRVU03UTBGRFNpSXNJbVpwYkdVaU9pSmliRzlqYXkxb1pXeHdaWEl0YldsemMybHVaeTVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCN0lHRndjR1Z1WkVOdmJuUmxlSFJRWVhSb0xDQmpjbVZoZEdWR2NtRnRaU3dnYVhOQmNuSmhlU0I5SUdaeWIyMGdKeTR1TDNWMGFXeHpKenRjYmx4dVpYaHdiM0owSUdSbFptRjFiSFFnWm5WdVkzUnBiMjRvYVc1emRHRnVZMlVwSUh0Y2JpQWdhVzV6ZEdGdVkyVXVjbVZuYVhOMFpYSklaV3h3WlhJb0oySnNiMk5yU0dWc2NHVnlUV2x6YzJsdVp5Y3NJR1oxYm1OMGFXOXVLR052Ym5SbGVIUXNJRzl3ZEdsdmJuTXBJSHRjYmlBZ0lDQnNaWFFnYVc1MlpYSnpaU0E5SUc5d2RHbHZibk11YVc1MlpYSnpaU3hjYmlBZ0lDQWdJR1p1SUQwZ2IzQjBhVzl1Y3k1bWJqdGNibHh1SUNBZ0lHbG1JQ2hqYjI1MFpYaDBJRDA5UFNCMGNuVmxLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdabTRvZEdocGN5azdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaGpiMjUwWlhoMElEMDlQU0JtWVd4elpTQjhmQ0JqYjI1MFpYaDBJRDA5SUc1MWJHd3BJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnBiblpsY25ObEtIUm9hWE1wTzF4dUlDQWdJSDBnWld4elpTQnBaaUFvYVhOQmNuSmhlU2hqYjI1MFpYaDBLU2tnZTF4dUlDQWdJQ0FnYVdZZ0tHTnZiblJsZUhRdWJHVnVaM1JvSUQ0Z01Da2dlMXh1SUNBZ0lDQWdJQ0JwWmlBb2IzQjBhVzl1Y3k1cFpITXBJSHRjYmlBZ0lDQWdJQ0FnSUNCdmNIUnBiMjV6TG1sa2N5QTlJRnR2Y0hScGIyNXpMbTVoYldWZE8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR2x1YzNSaGJtTmxMbWhsYkhCbGNuTXVaV0ZqYUNoamIyNTBaWGgwTENCdmNIUnBiMjV6S1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUJwYm5abGNuTmxLSFJvYVhNcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0JwWmlBb2IzQjBhVzl1Y3k1a1lYUmhJQ1ltSUc5d2RHbHZibk11YVdSektTQjdYRzRnSUNBZ0lDQWdJR3hsZENCa1lYUmhJRDBnWTNKbFlYUmxSbkpoYldVb2IzQjBhVzl1Y3k1a1lYUmhLVHRjYmlBZ0lDQWdJQ0FnWkdGMFlTNWpiMjUwWlhoMFVHRjBhQ0E5SUdGd2NHVnVaRU52Ym5SbGVIUlFZWFJvS0Z4dUlDQWdJQ0FnSUNBZ0lHOXdkR2x2Ym5NdVpHRjBZUzVqYjI1MFpYaDBVR0YwYUN4Y2JpQWdJQ0FnSUNBZ0lDQnZjSFJwYjI1ekxtNWhiV1ZjYmlBZ0lDQWdJQ0FnS1R0Y2JpQWdJQ0FnSUNBZ2IzQjBhVzl1Y3lBOUlIc2daR0YwWVRvZ1pHRjBZU0I5TzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCeVpYUjFjbTRnWm00b1kyOXVkR1Y0ZEN3Z2IzQjBhVzl1Y3lrN1hHNGdJQ0FnZlZ4dUlDQjlLVHRjYm4xY2JpSmRmUT09XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbi8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF91dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBfZXhjZXB0aW9uID0gcmVxdWlyZSgnLi4vZXhjZXB0aW9uJyk7XG5cbnZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTXVzdCBwYXNzIGl0ZXJhdG9yIHRvICNlYWNoJyk7XG4gICAgfVxuXG4gICAgdmFyIGZuID0gb3B0aW9ucy5mbixcbiAgICAgICAgaW52ZXJzZSA9IG9wdGlvbnMuaW52ZXJzZSxcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIHJldCA9ICcnLFxuICAgICAgICBkYXRhID0gdW5kZWZpbmVkLFxuICAgICAgICBjb250ZXh0UGF0aCA9IHVuZGVmaW5lZDtcblxuICAgIGlmIChvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy5pZHMpIHtcbiAgICAgIGNvbnRleHRQYXRoID0gX3V0aWxzLmFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5pZHNbMF0pICsgJy4nO1xuICAgIH1cblxuICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkge1xuICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5kYXRhKSB7XG4gICAgICBkYXRhID0gX3V0aWxzLmNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXhlY0l0ZXJhdGlvbihmaWVsZCwgaW5kZXgsIGxhc3QpIHtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGRhdGEua2V5ID0gZmllbGQ7XG4gICAgICAgIGRhdGEuaW5kZXggPSBpbmRleDtcbiAgICAgICAgZGF0YS5maXJzdCA9IGluZGV4ID09PSAwO1xuICAgICAgICBkYXRhLmxhc3QgPSAhIWxhc3Q7XG5cbiAgICAgICAgaWYgKGNvbnRleHRQYXRoKSB7XG4gICAgICAgICAgZGF0YS5jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoICsgZmllbGQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0ID0gcmV0ICsgZm4oY29udGV4dFtmaWVsZF0sIHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoX3V0aWxzLmlzQXJyYXkoY29udGV4dCkpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IGNvbnRleHQubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgaWYgKGkgaW4gY29udGV4dCkge1xuICAgICAgICAgICAgZXhlY0l0ZXJhdGlvbihpLCBpLCBpID09PSBjb250ZXh0Lmxlbmd0aCAtIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIGNvbnRleHRbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgICAgICB2YXIgbmV3Q29udGV4dCA9IFtdO1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBjb250ZXh0W1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgICAgZm9yICh2YXIgaXQgPSBpdGVyYXRvci5uZXh0KCk7ICFpdC5kb25lOyBpdCA9IGl0ZXJhdG9yLm5leHQoKSkge1xuICAgICAgICAgIG5ld0NvbnRleHQucHVzaChpdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dCA9IG5ld0NvbnRleHQ7XG4gICAgICAgIGZvciAodmFyIGogPSBjb250ZXh0Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgIGV4ZWNJdGVyYXRpb24oaSwgaSwgaSA9PT0gY29udGV4dC5sZW5ndGggLSAxKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgcHJpb3JLZXkgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBPYmplY3Qua2V5cyhjb250ZXh0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgdGhlIGl0ZXJhdGlvbnMgb25lIHN0ZXAgb3V0IG9mIHN5bmMgc28gd2UgY2FuIGRldGVjdFxuICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIHdpdGhvdXQgaGF2ZSB0byBzY2FuIHRoZSBvYmplY3QgdHdpY2UgYW5kIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYW4gaXRlcm1lZGlhdGUga2V5cyBhcnJheS5cbiAgICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGV4ZWNJdGVyYXRpb24ocHJpb3JLZXksIGkgLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByaW9yS2V5ID0ga2V5O1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChwcmlvcktleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpID09PSAwKSB7XG4gICAgICByZXQgPSBpbnZlcnNlKHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMeTR1TDJ4cFlpOW9ZVzVrYkdWaVlYSnpMMmhsYkhCbGNuTXZaV0ZqYUM1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU96czdPenM3TzNGQ1FVMVBMRlZCUVZVN08zbENRVU5MTEdOQlFXTTdPenM3Y1VKQlJYSkNMRlZCUVZNc1VVRkJVU3hGUVVGRk8wRkJRMmhETEZWQlFWRXNRMEZCUXl4alFVRmpMRU5CUVVNc1RVRkJUU3hGUVVGRkxGVkJRVk1zVDBGQlR5eEZRVUZGTEU5QlFVOHNSVUZCUlR0QlFVTjZSQ3hSUVVGSkxFTkJRVU1zVDBGQlR5eEZRVUZGTzBGQlExb3NXVUZCVFN3eVFrRkJZeXcyUWtGQk5rSXNRMEZCUXl4RFFVRkRPMHRCUTNCRU96dEJRVVZFTEZGQlFVa3NSVUZCUlN4SFFVRkhMRTlCUVU4c1EwRkJReXhGUVVGRk8xRkJRMnBDTEU5QlFVOHNSMEZCUnl4UFFVRlBMRU5CUVVNc1QwRkJUenRSUVVONlFpeERRVUZETEVkQlFVY3NRMEZCUXp0UlFVTk1MRWRCUVVjc1IwRkJSeXhGUVVGRk8xRkJRMUlzU1VGQlNTeFpRVUZCTzFGQlEwb3NWMEZCVnl4WlFVRkJMRU5CUVVNN08wRkJSV1FzVVVGQlNTeFBRVUZQTEVOQlFVTXNTVUZCU1N4SlFVRkpMRTlCUVU4c1EwRkJReXhIUVVGSExFVkJRVVU3UVVGREwwSXNhVUpCUVZjc1IwRkRWQ3g1UWtGQmEwSXNUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXhYUVVGWExFVkJRVVVzVDBGQlR5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFZEJRVWNzUTBGQlF6dExRVU55UlRzN1FVRkZSQ3hSUVVGSkxHdENRVUZYTEU5QlFVOHNRMEZCUXl4RlFVRkZPMEZCUTNaQ0xHRkJRVThzUjBGQlJ5eFBRVUZQTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8wdEJRemxDT3p0QlFVVkVMRkZCUVVrc1QwRkJUeXhEUVVGRExFbEJRVWtzUlVGQlJUdEJRVU5vUWl4VlFVRkpMRWRCUVVjc2JVSkJRVmtzVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMHRCUTJ4RE96dEJRVVZFTEdGQlFWTXNZVUZCWVN4RFFVRkRMRXRCUVVzc1JVRkJSU3hMUVVGTExFVkJRVVVzU1VGQlNTeEZRVUZGTzBGQlEzcERMRlZCUVVrc1NVRkJTU3hGUVVGRk8wRkJRMUlzV1VGQlNTeERRVUZETEVkQlFVY3NSMEZCUnl4TFFVRkxMRU5CUVVNN1FVRkRha0lzV1VGQlNTeERRVUZETEV0QlFVc3NSMEZCUnl4TFFVRkxMRU5CUVVNN1FVRkRia0lzV1VGQlNTeERRVUZETEV0QlFVc3NSMEZCUnl4TFFVRkxMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJRM3BDTEZsQlFVa3NRMEZCUXl4SlFVRkpMRWRCUVVjc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF6czdRVUZGYmtJc1dVRkJTU3hYUVVGWExFVkJRVVU3UVVGRFppeGpRVUZKTEVOQlFVTXNWMEZCVnl4SFFVRkhMRmRCUVZjc1IwRkJSeXhMUVVGTExFTkJRVU03VTBGRGVFTTdUMEZEUmpzN1FVRkZSQ3hUUVVGSExFZEJRMFFzUjBGQlJ5eEhRVU5JTEVWQlFVVXNRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExFVkJRVVU3UVVGRGFrSXNXVUZCU1N4RlFVRkZMRWxCUVVrN1FVRkRWaXh0UWtGQlZ5eEZRVUZGTEcxQ1FVTllMRU5CUVVNc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5eEZRVUZGTEV0QlFVc3NRMEZCUXl4RlFVTjJRaXhEUVVGRExGZEJRVmNzUjBGQlJ5eExRVUZMTEVWQlFVVXNTVUZCU1N4RFFVRkRMRU5CUXpWQ08wOUJRMFlzUTBGQlF5eERRVUZETzB0QlEwNDdPMEZCUlVRc1VVRkJTU3hQUVVGUExFbEJRVWtzVDBGQlR5eFBRVUZQTEV0QlFVc3NVVUZCVVN4RlFVRkZPMEZCUXpGRExGVkJRVWtzWlVGQlVTeFBRVUZQTEVOQlFVTXNSVUZCUlR0QlFVTndRaXhoUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEU5QlFVOHNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVWQlFVVXNSVUZCUlR0QlFVTjJReXhqUVVGSkxFTkJRVU1zU1VGQlNTeFBRVUZQTEVWQlFVVTdRVUZEYUVJc2VVSkJRV0VzUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXl4RlFVRkZMRU5CUVVNc1MwRkJTeXhQUVVGUExFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRPMWRCUXk5RE8xTkJRMFk3VDBGRFJpeE5RVUZOTEVsQlFVa3NUMEZCVHl4TlFVRk5MRXRCUVVzc1ZVRkJWU3hKUVVGSkxFOUJRVThzUTBGQlF5eE5RVUZOTEVOQlFVTXNVVUZCVVN4RFFVRkRMRVZCUVVVN1FVRkRia1VzV1VGQlRTeFZRVUZWTEVkQlFVY3NSVUZCUlN4RFFVRkRPMEZCUTNSQ0xGbEJRVTBzVVVGQlVTeEhRVUZITEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNc1VVRkJVU3hEUVVGRExFVkJRVVVzUTBGQlF6dEJRVU0xUXl4aFFVRkxMRWxCUVVrc1JVRkJSU3hIUVVGSExGRkJRVkVzUTBGQlF5eEpRVUZKTEVWQlFVVXNSVUZCUlN4RFFVRkRMRVZCUVVVc1EwRkJReXhKUVVGSkxFVkJRVVVzUlVGQlJTeEhRVUZITEZGQlFWRXNRMEZCUXl4SlFVRkpMRVZCUVVVc1JVRkJSVHRCUVVNM1JDeHZRa0ZCVlN4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdVMEZETTBJN1FVRkRSQ3hsUVVGUExFZEJRVWNzVlVGQlZTeERRVUZETzBGQlEzSkNMR0ZCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzVDBGQlR5eERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzBGQlEzWkRMSFZDUVVGaExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RFFVRkRMRXRCUVVzc1QwRkJUeXhEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0VFFVTXZRenRQUVVOR0xFMUJRVTA3TzBGQlEwd3NZMEZCU1N4UlFVRlJMRmxCUVVFc1EwRkJRenM3UVVGRllpeG5Ra0ZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eFBRVUZQTEVOQlFVTXNWVUZCUVN4SFFVRkhMRVZCUVVrN096czdRVUZKYkVNc1owSkJRVWtzVVVGQlVTeExRVUZMTEZOQlFWTXNSVUZCUlR0QlFVTXhRaXd5UWtGQllTeERRVUZETEZGQlFWRXNSVUZCUlN4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFTkJRVU03WVVGRGFFTTdRVUZEUkN4dlFrRkJVU3hIUVVGSExFZEJRVWNzUTBGQlF6dEJRVU5tTEdGQlFVTXNSVUZCUlN4RFFVRkRPMWRCUTB3c1EwRkJReXhEUVVGRE8wRkJRMGdzWTBGQlNTeFJRVUZSTEV0QlFVc3NVMEZCVXl4RlFVRkZPMEZCUXpGQ0xIbENRVUZoTEVOQlFVTXNVVUZCVVN4RlFVRkZMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzU1VGQlNTeERRVUZETEVOQlFVTTdWMEZEZEVNN08wOUJRMFk3UzBGRFJqczdRVUZGUkN4UlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFVkJRVVU3UVVGRFdDeFRRVUZITEVkQlFVY3NUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8wdEJRM0pDT3p0QlFVVkVMRmRCUVU4c1IwRkJSeXhEUVVGRE8wZEJRMW9zUTBGQlF5eERRVUZETzBOQlEwb2lMQ0ptYVd4bElqb2laV0ZqYUM1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQjdYRzRnSUdGd2NHVnVaRU52Ym5SbGVIUlFZWFJvTEZ4dUlDQmliRzlqYTFCaGNtRnRjeXhjYmlBZ1kzSmxZWFJsUm5KaGJXVXNYRzRnSUdselFYSnlZWGtzWEc0Z0lHbHpSblZ1WTNScGIyNWNibjBnWm5KdmJTQW5MaTR2ZFhScGJITW5PMXh1YVcxd2IzSjBJRVY0WTJWd2RHbHZiaUJtY205dElDY3VMaTlsZUdObGNIUnBiMjRuTzF4dVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCbWRXNWpkR2x2YmlocGJuTjBZVzVqWlNrZ2UxeHVJQ0JwYm5OMFlXNWpaUzV5WldkcGMzUmxja2hsYkhCbGNpZ25aV0ZqYUNjc0lHWjFibU4wYVc5dUtHTnZiblJsZUhRc0lHOXdkR2x2Ym5NcElIdGNiaUFnSUNCcFppQW9JVzl3ZEdsdmJuTXBJSHRjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJGZUdObGNIUnBiMjRvSjAxMWMzUWdjR0Z6Y3lCcGRHVnlZWFJ2Y2lCMGJ5QWpaV0ZqYUNjcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUd4bGRDQm1iaUE5SUc5d2RHbHZibk11Wm00c1hHNGdJQ0FnSUNCcGJuWmxjbk5sSUQwZ2IzQjBhVzl1Y3k1cGJuWmxjbk5sTEZ4dUlDQWdJQ0FnYVNBOUlEQXNYRzRnSUNBZ0lDQnlaWFFnUFNBbkp5eGNiaUFnSUNBZ0lHUmhkR0VzWEc0Z0lDQWdJQ0JqYjI1MFpYaDBVR0YwYUR0Y2JseHVJQ0FnSUdsbUlDaHZjSFJwYjI1ekxtUmhkR0VnSmlZZ2IzQjBhVzl1Y3k1cFpITXBJSHRjYmlBZ0lDQWdJR052Ym5SbGVIUlFZWFJvSUQxY2JpQWdJQ0FnSUNBZ1lYQndaVzVrUTI5dWRHVjRkRkJoZEdnb2IzQjBhVzl1Y3k1a1lYUmhMbU52Ym5SbGVIUlFZWFJvTENCdmNIUnBiMjV6TG1sa2Mxc3dYU2tnS3lBbkxpYzdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2FXWWdLR2x6Um5WdVkzUnBiMjRvWTI5dWRHVjRkQ2twSUh0Y2JpQWdJQ0FnSUdOdmJuUmxlSFFnUFNCamIyNTBaWGgwTG1OaGJHd29kR2hwY3lrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnYVdZZ0tHOXdkR2x2Ym5NdVpHRjBZU2tnZTF4dUlDQWdJQ0FnWkdGMFlTQTlJR055WldGMFpVWnlZVzFsS0c5d2RHbHZibk11WkdGMFlTazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1puVnVZM1JwYjI0Z1pYaGxZMGwwWlhKaGRHbHZiaWhtYVdWc1pDd2dhVzVrWlhnc0lHeGhjM1FwSUh0Y2JpQWdJQ0FnSUdsbUlDaGtZWFJoS1NCN1hHNGdJQ0FnSUNBZ0lHUmhkR0V1YTJWNUlEMGdabWxsYkdRN1hHNGdJQ0FnSUNBZ0lHUmhkR0V1YVc1a1pYZ2dQU0JwYm1SbGVEdGNiaUFnSUNBZ0lDQWdaR0YwWVM1bWFYSnpkQ0E5SUdsdVpHVjRJRDA5UFNBd08xeHVJQ0FnSUNBZ0lDQmtZWFJoTG14aGMzUWdQU0FoSVd4aGMzUTdYRzVjYmlBZ0lDQWdJQ0FnYVdZZ0tHTnZiblJsZUhSUVlYUm9LU0I3WEc0Z0lDQWdJQ0FnSUNBZ1pHRjBZUzVqYjI1MFpYaDBVR0YwYUNBOUlHTnZiblJsZUhSUVlYUm9JQ3NnWm1sbGJHUTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnY21WMElEMWNiaUFnSUNBZ0lDQWdjbVYwSUN0Y2JpQWdJQ0FnSUNBZ1ptNG9ZMjl1ZEdWNGRGdG1hV1ZzWkYwc0lIdGNiaUFnSUNBZ0lDQWdJQ0JrWVhSaE9pQmtZWFJoTEZ4dUlDQWdJQ0FnSUNBZ0lHSnNiMk5yVUdGeVlXMXpPaUJpYkc5amExQmhjbUZ0Y3loY2JpQWdJQ0FnSUNBZ0lDQWdJRnRqYjI1MFpYaDBXMlpwWld4a1hTd2dabWxsYkdSZExGeHVJQ0FnSUNBZ0lDQWdJQ0FnVzJOdmJuUmxlSFJRWVhSb0lDc2dabWxsYkdRc0lHNTFiR3hkWEc0Z0lDQWdJQ0FnSUNBZ0tWeHVJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnBaaUFvWTI5dWRHVjRkQ0FtSmlCMGVYQmxiMllnWTI5dWRHVjRkQ0E5UFQwZ0oyOWlhbVZqZENjcElIdGNiaUFnSUNBZ0lHbG1JQ2hwYzBGeWNtRjVLR052Ym5SbGVIUXBLU0I3WEc0Z0lDQWdJQ0FnSUdadmNpQW9iR1YwSUdvZ1BTQmpiMjUwWlhoMExteGxibWQwYURzZ2FTQThJR283SUdrckt5a2dlMXh1SUNBZ0lDQWdJQ0FnSUdsbUlDaHBJR2x1SUdOdmJuUmxlSFFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR1Y0WldOSmRHVnlZWFJwYjI0b2FTd2dhU3dnYVNBOVBUMGdZMjl1ZEdWNGRDNXNaVzVuZEdnZ0xTQXhLVHRjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMGdaV3h6WlNCcFppQW9kSGx3Wlc5bUlGTjViV0p2YkNBOVBUMGdKMloxYm1OMGFXOXVKeUFtSmlCamIyNTBaWGgwVzFONWJXSnZiQzVwZEdWeVlYUnZjbDBwSUh0Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnYm1WM1EyOXVkR1Y0ZENBOUlGdGRPMXh1SUNBZ0lDQWdJQ0JqYjI1emRDQnBkR1Z5WVhSdmNpQTlJR052Ym5SbGVIUmJVM2x0WW05c0xtbDBaWEpoZEc5eVhTZ3BPMXh1SUNBZ0lDQWdJQ0JtYjNJZ0tHeGxkQ0JwZENBOUlHbDBaWEpoZEc5eUxtNWxlSFFvS1RzZ0lXbDBMbVJ2Ym1VN0lHbDBJRDBnYVhSbGNtRjBiM0l1Ym1WNGRDZ3BLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2JtVjNRMjl1ZEdWNGRDNXdkWE5vS0dsMExuWmhiSFZsS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQmpiMjUwWlhoMElEMGdibVYzUTI5dWRHVjRkRHRjYmlBZ0lDQWdJQ0FnWm05eUlDaHNaWFFnYWlBOUlHTnZiblJsZUhRdWJHVnVaM1JvT3lCcElEd2dhanNnYVNzcktTQjdYRzRnSUNBZ0lDQWdJQ0FnWlhobFkwbDBaWEpoZEdsdmJpaHBMQ0JwTENCcElEMDlQU0JqYjI1MFpYaDBMbXhsYm1kMGFDQXRJREVwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCc1pYUWdjSEpwYjNKTFpYazdYRzVjYmlBZ0lDQWdJQ0FnVDJKcVpXTjBMbXRsZVhNb1kyOXVkR1Y0ZENrdVptOXlSV0ZqYUNoclpYa2dQVDRnZTF4dUlDQWdJQ0FnSUNBZ0lDOHZJRmRsSjNKbElISjFibTVwYm1jZ2RHaGxJR2wwWlhKaGRHbHZibk1nYjI1bElITjBaWEFnYjNWMElHOW1JSE41Ym1NZ2MyOGdkMlVnWTJGdUlHUmxkR1ZqZEZ4dUlDQWdJQ0FnSUNBZ0lDOHZJSFJvWlNCc1lYTjBJR2wwWlhKaGRHbHZiaUIzYVhSb2IzVjBJR2hoZG1VZ2RHOGdjMk5oYmlCMGFHVWdiMkpxWldOMElIUjNhV05sSUdGdVpDQmpjbVZoZEdWY2JpQWdJQ0FnSUNBZ0lDQXZMeUJoYmlCcGRHVnliV1ZrYVdGMFpTQnJaWGx6SUdGeWNtRjVMbHh1SUNBZ0lDQWdJQ0FnSUdsbUlDaHdjbWx2Y2t0bGVTQWhQVDBnZFc1a1pXWnBibVZrS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JsZUdWalNYUmxjbUYwYVc5dUtIQnlhVzl5UzJWNUxDQnBJQzBnTVNrN1hHNGdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUhCeWFXOXlTMlY1SUQwZ2EyVjVPMXh1SUNBZ0lDQWdJQ0FnSUdrckt6dGNiaUFnSUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0FnSUdsbUlDaHdjbWx2Y2t0bGVTQWhQVDBnZFc1a1pXWnBibVZrS1NCN1hHNGdJQ0FnSUNBZ0lDQWdaWGhsWTBsMFpYSmhkR2x2Ymlod2NtbHZja3RsZVN3Z2FTQXRJREVzSUhSeWRXVXBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1WEc0Z0lDQWdhV1lnS0drZ1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUhKbGRDQTlJR2x1ZG1WeWMyVW9kR2hwY3lrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnY21WMGRYSnVJSEpsZER0Y2JpQWdmU2s3WEc1OVhHNGlYWDA9XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbi8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF9leGNlcHRpb24gPSByZXF1aXJlKCcuLi9leGNlcHRpb24nKTtcblxudmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdoZWxwZXJNaXNzaW5nJywgZnVuY3Rpb24gKCkgLyogW2FyZ3MsIF1vcHRpb25zICove1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyBBIG1pc3NpbmcgZmllbGQgaW4gYSB7e2Zvb319IGNvbnN0cnVjdC5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNvbWVvbmUgaXMgYWN0dWFsbHkgdHJ5aW5nIHRvIGNhbGwgc29tZXRoaW5nLCBibG93IHVwLlxuICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ01pc3NpbmcgaGVscGVyOiBcIicgKyBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLm5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMeTR1TDJ4cFlpOW9ZVzVrYkdWaVlYSnpMMmhsYkhCbGNuTXZhR1ZzY0dWeUxXMXBjM05wYm1jdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3p0NVFrRkJjMElzWTBGQll6czdPenR4UWtGRmNrSXNWVUZCVXl4UlFVRlJMRVZCUVVVN1FVRkRhRU1zVlVGQlVTeERRVUZETEdOQlFXTXNRMEZCUXl4bFFVRmxMRVZCUVVVc2FVTkJRV2RETzBGQlEzWkZMRkZCUVVrc1UwRkJVeXhEUVVGRExFMUJRVTBzUzBGQlN5eERRVUZETEVWQlFVVTdPMEZCUlRGQ0xHRkJRVThzVTBGQlV5eERRVUZETzB0QlEyeENMRTFCUVUwN08wRkJSVXdzV1VGQlRTd3lRa0ZEU2l4dFFrRkJiVUlzUjBGQlJ5eFRRVUZUTEVOQlFVTXNVMEZCVXl4RFFVRkRMRTFCUVUwc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF5eEpRVUZKTEVkQlFVY3NSMEZCUnl4RFFVTnFSU3hEUVVGRE8wdEJRMGc3UjBGRFJpeERRVUZETEVOQlFVTTdRMEZEU2lJc0ltWnBiR1VpT2lKb1pXeHdaWEl0YldsemMybHVaeTVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCRmVHTmxjSFJwYjI0Z1puSnZiU0FuTGk0dlpYaGpaWEIwYVc5dUp6dGNibHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdablZ1WTNScGIyNG9hVzV6ZEdGdVkyVXBJSHRjYmlBZ2FXNXpkR0Z1WTJVdWNtVm5hWE4wWlhKSVpXeHdaWElvSjJobGJIQmxjazFwYzNOcGJtY25MQ0JtZFc1amRHbHZiaWd2S2lCYllYSm5jeXdnWFc5d2RHbHZibk1nS2k4cElIdGNiaUFnSUNCcFppQW9ZWEpuZFcxbGJuUnpMbXhsYm1kMGFDQTlQVDBnTVNrZ2UxeHVJQ0FnSUNBZ0x5OGdRU0J0YVhOemFXNW5JR1pwWld4a0lHbHVJR0VnZTN0bWIyOTlmU0JqYjI1emRISjFZM1F1WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkVzVrWldacGJtVmtPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBdkx5QlRiMjFsYjI1bElHbHpJR0ZqZEhWaGJHeDVJSFJ5ZVdsdVp5QjBieUJqWVd4c0lITnZiV1YwYUdsdVp5d2dZbXh2ZHlCMWNDNWNiaUFnSUNBZ0lIUm9jbTkzSUc1bGR5QkZlR05sY0hScGIyNG9YRzRnSUNBZ0lDQWdJQ2ROYVhOemFXNW5JR2hsYkhCbGNqb2dYQ0luSUNzZ1lYSm5kVzFsYm5SelcyRnlaM1Z0Wlc1MGN5NXNaVzVuZEdnZ0xTQXhYUzV1WVcxbElDc2dKMXdpSjF4dUlDQWdJQ0FnS1R0Y2JpQWdJQ0I5WEc0Z0lIMHBPMXh1ZlZ4dUlsMTlcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuLy8gaXN0YW5idWwgaWdub3JlIG5leHRcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX3V0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxudmFyIF9leGNlcHRpb24gPSByZXF1aXJlKCcuLi9leGNlcHRpb24nKTtcblxudmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdpZicsIGZ1bmN0aW9uIChjb25kaXRpb25hbCwgb3B0aW9ucykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9IDIpIHtcbiAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCcjaWYgcmVxdWlyZXMgZXhhY3RseSBvbmUgYXJndW1lbnQnKTtcbiAgICB9XG4gICAgaWYgKF91dGlscy5pc0Z1bmN0aW9uKGNvbmRpdGlvbmFsKSkge1xuICAgICAgY29uZGl0aW9uYWwgPSBjb25kaXRpb25hbC5jYWxsKHRoaXMpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVuZGVyIHRoZSBwb3NpdGl2ZSBwYXRoIGlmIHRoZSB2YWx1ZSBpcyB0cnV0aHkgYW5kIG5vdCBlbXB0eS5cbiAgICAvLyBUaGUgYGluY2x1ZGVaZXJvYCBvcHRpb24gbWF5IGJlIHNldCB0byB0cmVhdCB0aGUgY29uZHRpb25hbCBhcyBwdXJlbHkgbm90IGVtcHR5IGJhc2VkIG9uIHRoZVxuICAgIC8vIGJlaGF2aW9yIG9mIGlzRW1wdHkuIEVmZmVjdGl2ZWx5IHRoaXMgZGV0ZXJtaW5lcyBpZiAwIGlzIGhhbmRsZWQgYnkgdGhlIHBvc2l0aXZlIHBhdGggb3IgbmVnYXRpdmUuXG4gICAgaWYgKCFvcHRpb25zLmhhc2guaW5jbHVkZVplcm8gJiYgIWNvbmRpdGlvbmFsIHx8IF91dGlscy5pc0VtcHR5KGNvbmRpdGlvbmFsKSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuZm4odGhpcyk7XG4gICAgfVxuICB9KTtcblxuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcigndW5sZXNzJywgZnVuY3Rpb24gKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggIT0gMikge1xuICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyN1bmxlc3MgcmVxdWlyZXMgZXhhY3RseSBvbmUgYXJndW1lbnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwge1xuICAgICAgZm46IG9wdGlvbnMuaW52ZXJzZSxcbiAgICAgIGludmVyc2U6IG9wdGlvbnMuZm4sXG4gICAgICBoYXNoOiBvcHRpb25zLmhhc2hcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1THk0dUx5NHVMMnhwWWk5b1lXNWtiR1ZpWVhKekwyaGxiSEJsY25NdmFXWXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanM3T3pzN096dHhRa0ZCYjBNc1ZVRkJWVHM3ZVVKQlEzaENMR05CUVdNN096czdjVUpCUlhKQ0xGVkJRVk1zVVVGQlVTeEZRVUZGTzBGQlEyaERMRlZCUVZFc1EwRkJReXhqUVVGakxFTkJRVU1zU1VGQlNTeEZRVUZGTEZWQlFWTXNWMEZCVnl4RlFVRkZMRTlCUVU4c1JVRkJSVHRCUVVNelJDeFJRVUZKTEZOQlFWTXNRMEZCUXl4TlFVRk5MRWxCUVVrc1EwRkJReXhGUVVGRk8wRkJRM3BDTEZsQlFVMHNNa0pCUVdNc2JVTkJRVzFETEVOQlFVTXNRMEZCUXp0TFFVTXhSRHRCUVVORUxGRkJRVWtzYTBKQlFWY3NWMEZCVnl4RFFVRkRMRVZCUVVVN1FVRkRNMElzYVVKQlFWY3NSMEZCUnl4WFFVRlhMRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzB0QlEzUkRPenM3T3p0QlFVdEVMRkZCUVVrc1FVRkJReXhEUVVGRExFOUJRVThzUTBGQlF5eEpRVUZKTEVOQlFVTXNWMEZCVnl4SlFVRkpMRU5CUVVNc1YwRkJWeXhKUVVGTExHVkJRVkVzVjBGQlZ5eERRVUZETEVWQlFVVTdRVUZEZGtVc1lVRkJUeXhQUVVGUExFTkJRVU1zVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMHRCUXpsQ0xFMUJRVTA3UVVGRFRDeGhRVUZQTEU5QlFVOHNRMEZCUXl4RlFVRkZMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU03UzBGRGVrSTdSMEZEUml4RFFVRkRMRU5CUVVNN08wRkJSVWdzVlVGQlVTeERRVUZETEdOQlFXTXNRMEZCUXl4UlFVRlJMRVZCUVVVc1ZVRkJVeXhYUVVGWExFVkJRVVVzVDBGQlR5eEZRVUZGTzBGQlF5OUVMRkZCUVVrc1UwRkJVeXhEUVVGRExFMUJRVTBzU1VGQlNTeERRVUZETEVWQlFVVTdRVUZEZWtJc1dVRkJUU3d5UWtGQll5eDFRMEZCZFVNc1EwRkJReXhEUVVGRE8wdEJRemxFTzBGQlEwUXNWMEZCVHl4UlFVRlJMRU5CUVVNc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVVc1YwRkJWeXhGUVVGRk8wRkJRM0JFTEZGQlFVVXNSVUZCUlN4UFFVRlBMRU5CUVVNc1QwRkJUenRCUVVOdVFpeGhRVUZQTEVWQlFVVXNUMEZCVHl4RFFVRkRMRVZCUVVVN1FVRkRia0lzVlVGQlNTeEZRVUZGTEU5QlFVOHNRMEZCUXl4SlFVRkpPMHRCUTI1Q0xFTkJRVU1zUTBGQlF6dEhRVU5LTEVOQlFVTXNRMEZCUXp0RFFVTktJaXdpWm1sc1pTSTZJbWxtTG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElIc2dhWE5GYlhCMGVTd2dhWE5HZFc1amRHbHZiaUI5SUdaeWIyMGdKeTR1TDNWMGFXeHpKenRjYm1sdGNHOXlkQ0JGZUdObGNIUnBiMjRnWm5KdmJTQW5MaTR2WlhoalpYQjBhVzl1Snp0Y2JseHVaWGh3YjNKMElHUmxabUYxYkhRZ1puVnVZM1JwYjI0b2FXNXpkR0Z1WTJVcElIdGNiaUFnYVc1emRHRnVZMlV1Y21WbmFYTjBaWEpJWld4d1pYSW9KMmxtSnl3Z1puVnVZM1JwYjI0b1kyOXVaR2wwYVc5dVlXd3NJRzl3ZEdsdmJuTXBJSHRjYmlBZ0lDQnBaaUFvWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0FoUFNBeUtTQjdYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWGhqWlhCMGFXOXVLQ2NqYVdZZ2NtVnhkV2x5WlhNZ1pYaGhZM1JzZVNCdmJtVWdZWEpuZFcxbGJuUW5LVHRjYmlBZ0lDQjlYRzRnSUNBZ2FXWWdLR2x6Um5WdVkzUnBiMjRvWTI5dVpHbDBhVzl1WVd3cEtTQjdYRzRnSUNBZ0lDQmpiMjVrYVhScGIyNWhiQ0E5SUdOdmJtUnBkR2x2Ym1Gc0xtTmhiR3dvZEdocGN5azdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ0x5OGdSR1ZtWVhWc2RDQmlaV2hoZG1sdmNpQnBjeUIwYnlCeVpXNWtaWElnZEdobElIQnZjMmwwYVhabElIQmhkR2dnYVdZZ2RHaGxJSFpoYkhWbElHbHpJSFJ5ZFhSb2VTQmhibVFnYm05MElHVnRjSFI1TGx4dUlDQWdJQzh2SUZSb1pTQmdhVzVqYkhWa1pWcGxjbTlnSUc5d2RHbHZiaUJ0WVhrZ1ltVWdjMlYwSUhSdklIUnlaV0YwSUhSb1pTQmpiMjVrZEdsdmJtRnNJR0Z6SUhCMWNtVnNlU0J1YjNRZ1pXMXdkSGtnWW1GelpXUWdiMjRnZEdobFhHNGdJQ0FnTHk4Z1ltVm9ZWFpwYjNJZ2IyWWdhWE5GYlhCMGVTNGdSV1ptWldOMGFYWmxiSGtnZEdocGN5QmtaWFJsY20xcGJtVnpJR2xtSURBZ2FYTWdhR0Z1Wkd4bFpDQmllU0IwYUdVZ2NHOXphWFJwZG1VZ2NHRjBhQ0J2Y2lCdVpXZGhkR2wyWlM1Y2JpQWdJQ0JwWmlBb0tDRnZjSFJwYjI1ekxtaGhjMmd1YVc1amJIVmtaVnBsY204Z0ppWWdJV052Ym1ScGRHbHZibUZzS1NCOGZDQnBjMFZ0Y0hSNUtHTnZibVJwZEdsdmJtRnNLU2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJRzl3ZEdsdmJuTXVhVzUyWlhKelpTaDBhR2x6S1R0Y2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdjbVYwZFhKdUlHOXdkR2x2Ym5NdVptNG9kR2hwY3lrN1hHNGdJQ0FnZlZ4dUlDQjlLVHRjYmx4dUlDQnBibk4wWVc1alpTNXlaV2RwYzNSbGNraGxiSEJsY2lnbmRXNXNaWE56Snl3Z1puVnVZM1JwYjI0b1kyOXVaR2wwYVc5dVlXd3NJRzl3ZEdsdmJuTXBJSHRjYmlBZ0lDQnBaaUFvWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0FoUFNBeUtTQjdYRzRnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWGhqWlhCMGFXOXVLQ2NqZFc1c1pYTnpJSEpsY1hWcGNtVnpJR1Y0WVdOMGJIa2diMjVsSUdGeVozVnRaVzUwSnlrN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQnBibk4wWVc1alpTNW9aV3h3WlhKeld5ZHBaaWRkTG1OaGJHd29kR2hwY3l3Z1kyOXVaR2wwYVc5dVlXd3NJSHRjYmlBZ0lDQWdJR1p1T2lCdmNIUnBiMjV6TG1sdWRtVnljMlVzWEc0Z0lDQWdJQ0JwYm5abGNuTmxPaUJ2Y0hScGIyNXpMbVp1TEZ4dUlDQWdJQ0FnYUdGemFEb2diM0IwYVc5dWN5NW9ZWE5vWEc0Z0lDQWdmU2s3WEc0Z0lIMHBPMXh1ZlZ4dUlsMTlcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvZycsIGZ1bmN0aW9uICgpIC8qIG1lc3NhZ2UsIG9wdGlvbnMgKi97XG4gICAgdmFyIGFyZ3MgPSBbdW5kZWZpbmVkXSxcbiAgICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgICB9XG5cbiAgICB2YXIgbGV2ZWwgPSAxO1xuICAgIGlmIChvcHRpb25zLmhhc2gubGV2ZWwgIT0gbnVsbCkge1xuICAgICAgbGV2ZWwgPSBvcHRpb25zLmhhc2gubGV2ZWw7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmRhdGEgJiYgb3B0aW9ucy5kYXRhLmxldmVsICE9IG51bGwpIHtcbiAgICAgIGxldmVsID0gb3B0aW9ucy5kYXRhLmxldmVsO1xuICAgIH1cbiAgICBhcmdzWzBdID0gbGV2ZWw7XG5cbiAgICBpbnN0YW5jZS5sb2cuYXBwbHkoaW5zdGFuY2UsIGFyZ3MpO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDJobGJIQmxjbk12Ykc5bkxtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3Y1VKQlFXVXNWVUZCVXl4UlFVRlJMRVZCUVVVN1FVRkRhRU1zVlVGQlVTeERRVUZETEdOQlFXTXNRMEZCUXl4TFFVRkxMRVZCUVVVc2EwTkJRV2xETzBGQlF6bEVMRkZCUVVrc1NVRkJTU3hIUVVGSExFTkJRVU1zVTBGQlV5eERRVUZETzFGQlEzQkNMRTlCUVU4c1IwRkJSeXhUUVVGVExFTkJRVU1zVTBGQlV5eERRVUZETEUxQlFVMHNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVNMVF5eFRRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzVTBGQlV5eERRVUZETEUxQlFVMHNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3UVVGRE4wTXNWVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0TFFVTjZRanM3UVVGRlJDeFJRVUZKTEV0QlFVc3NSMEZCUnl4RFFVRkRMRU5CUVVNN1FVRkRaQ3hSUVVGSkxFOUJRVThzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4SlFVRkpMRWxCUVVrc1JVRkJSVHRCUVVNNVFpeFhRVUZMTEVkQlFVY3NUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU03UzBGRE5VSXNUVUZCVFN4SlFVRkpMRTlCUVU4c1EwRkJReXhKUVVGSkxFbEJRVWtzVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRWxCUVVrc1NVRkJTU3hGUVVGRk8wRkJRM0pFTEZkQlFVc3NSMEZCUnl4UFFVRlBMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF6dExRVU0xUWp0QlFVTkVMRkZCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eExRVUZMTEVOQlFVTTdPMEZCUldoQ0xGbEJRVkVzUTBGQlF5eEhRVUZITEUxQlFVRXNRMEZCV2l4UlFVRlJMRVZCUVZFc1NVRkJTU3hEUVVGRExFTkJRVU03UjBGRGRrSXNRMEZCUXl4RFFVRkRPME5CUTBvaUxDSm1hV3hsSWpvaWJHOW5MbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaVpYaHdiM0owSUdSbFptRjFiSFFnWm5WdVkzUnBiMjRvYVc1emRHRnVZMlVwSUh0Y2JpQWdhVzV6ZEdGdVkyVXVjbVZuYVhOMFpYSklaV3h3WlhJb0oyeHZaeWNzSUdaMWJtTjBhVzl1S0M4cUlHMWxjM05oWjJVc0lHOXdkR2x2Ym5NZ0tpOHBJSHRjYmlBZ0lDQnNaWFFnWVhKbmN5QTlJRnQxYm1SbFptbHVaV1JkTEZ4dUlDQWdJQ0FnYjNCMGFXOXVjeUE5SUdGeVozVnRaVzUwYzF0aGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUMwZ01WMDdYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQmhjbWQxYldWdWRITXViR1Z1WjNSb0lDMGdNVHNnYVNzcktTQjdYRzRnSUNBZ0lDQmhjbWR6TG5CMWMyZ29ZWEpuZFcxbGJuUnpXMmxkS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JzWlhRZ2JHVjJaV3dnUFNBeE8xeHVJQ0FnSUdsbUlDaHZjSFJwYjI1ekxtaGhjMmd1YkdWMlpXd2dJVDBnYm5Wc2JDa2dlMXh1SUNBZ0lDQWdiR1YyWld3Z1BTQnZjSFJwYjI1ekxtaGhjMmd1YkdWMlpXdzdYRzRnSUNBZ2ZTQmxiSE5sSUdsbUlDaHZjSFJwYjI1ekxtUmhkR0VnSmlZZ2IzQjBhVzl1Y3k1a1lYUmhMbXhsZG1Wc0lDRTlJRzUxYkd3cElIdGNiaUFnSUNBZ0lHeGxkbVZzSUQwZ2IzQjBhVzl1Y3k1a1lYUmhMbXhsZG1Wc08xeHVJQ0FnSUgxY2JpQWdJQ0JoY21keld6QmRJRDBnYkdWMlpXdzdYRzVjYmlBZ0lDQnBibk4wWVc1alpTNXNiMmNvTGk0dVlYSm5jeWs3WEc0Z0lIMHBPMXh1ZlZ4dUlsMTlcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvb2t1cCcsIGZ1bmN0aW9uIChvYmosIGZpZWxkLCBvcHRpb25zKSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgIC8vIE5vdGUgZm9yIDUuMDogQ2hhbmdlIHRvIFwib2JqID09IG51bGxcIiBpbiA1LjBcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLmxvb2t1cFByb3BlcnR5KG9iaiwgZmllbGQpO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDJobGJIQmxjbk12Ykc5dmEzVndMbXB6SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUk3T3pzN2NVSkJRV1VzVlVGQlV5eFJRVUZSTEVWQlFVVTdRVUZEYUVNc1ZVRkJVU3hEUVVGRExHTkJRV01zUTBGQlF5eFJRVUZSTEVWQlFVVXNWVUZCVXl4SFFVRkhMRVZCUVVVc1MwRkJTeXhGUVVGRkxFOUJRVThzUlVGQlJUdEJRVU01UkN4UlFVRkpMRU5CUVVNc1IwRkJSeXhGUVVGRk96dEJRVVZTTEdGQlFVOHNSMEZCUnl4RFFVRkRPMHRCUTFvN1FVRkRSQ3hYUVVGUExFOUJRVThzUTBGQlF5eGpRVUZqTEVOQlFVTXNSMEZCUnl4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8wZEJRek5ETEVOQlFVTXNRMEZCUXp0RFFVTktJaXdpWm1sc1pTSTZJbXh2YjJ0MWNDNXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1WNGNHOXlkQ0JrWldaaGRXeDBJR1oxYm1OMGFXOXVLR2x1YzNSaGJtTmxLU0I3WEc0Z0lHbHVjM1JoYm1ObExuSmxaMmx6ZEdWeVNHVnNjR1Z5S0Nkc2IyOXJkWEFuTENCbWRXNWpkR2x2Ymlodlltb3NJR1pwWld4a0xDQnZjSFJwYjI1ektTQjdYRzRnSUNBZ2FXWWdLQ0Z2WW1vcElIdGNiaUFnSUNBZ0lDOHZJRTV2ZEdVZ1ptOXlJRFV1TURvZ1EyaGhibWRsSUhSdklGd2liMkpxSUQwOUlHNTFiR3hjSWlCcGJpQTFMakJjYmlBZ0lDQWdJSEpsZEhWeWJpQnZZbW83WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCdmNIUnBiMjV6TG14dmIydDFjRkJ5YjNCbGNuUjVLRzlpYWl3Z1ptbGxiR1FwTzF4dUlDQjlLVHRjYm4xY2JpSmRmUT09XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbi8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF91dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBfZXhjZXB0aW9uID0gcmVxdWlyZSgnLi4vZXhjZXB0aW9uJyk7XG5cbnZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignd2l0aCcsIGZ1bmN0aW9uIChjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggIT0gMikge1xuICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJyN3aXRoIHJlcXVpcmVzIGV4YWN0bHkgb25lIGFyZ3VtZW50Jyk7XG4gICAgfVxuICAgIGlmIChfdXRpbHMuaXNGdW5jdGlvbihjb250ZXh0KSkge1xuICAgICAgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICB2YXIgZm4gPSBvcHRpb25zLmZuO1xuXG4gICAgaWYgKCFfdXRpbHMuaXNFbXB0eShjb250ZXh0KSkge1xuICAgICAgdmFyIGRhdGEgPSBvcHRpb25zLmRhdGE7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGRhdGEgPSBfdXRpbHMuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgZGF0YS5jb250ZXh0UGF0aCA9IF91dGlscy5hcHBlbmRDb250ZXh0UGF0aChvcHRpb25zLmRhdGEuY29udGV4dFBhdGgsIG9wdGlvbnMuaWRzWzBdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgYmxvY2tQYXJhbXM6IF91dGlscy5ibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfVxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDJobGJIQmxjbk12ZDJsMGFDNXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lPenM3T3pzN08zRkNRVTFQTEZWQlFWVTdPM2xDUVVOTExHTkJRV003T3pzN2NVSkJSWEpDTEZWQlFWTXNVVUZCVVN4RlFVRkZPMEZCUTJoRExGVkJRVkVzUTBGQlF5eGpRVUZqTEVOQlFVTXNUVUZCVFN4RlFVRkZMRlZCUVZNc1QwRkJUeXhGUVVGRkxFOUJRVThzUlVGQlJUdEJRVU42UkN4UlFVRkpMRk5CUVZNc1EwRkJReXhOUVVGTkxFbEJRVWtzUTBGQlF5eEZRVUZGTzBGQlEzcENMRmxCUVUwc01rSkJRV01zY1VOQlFYRkRMRU5CUVVNc1EwRkJRenRMUVVNMVJEdEJRVU5FTEZGQlFVa3NhMEpCUVZjc1QwRkJUeXhEUVVGRExFVkJRVVU3UVVGRGRrSXNZVUZCVHl4SFFVRkhMRTlCUVU4c1EwRkJReXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdTMEZET1VJN08wRkJSVVFzVVVGQlNTeEZRVUZGTEVkQlFVY3NUMEZCVHl4RFFVRkRMRVZCUVVVc1EwRkJRenM3UVVGRmNFSXNVVUZCU1N4RFFVRkRMR1ZCUVZFc1QwRkJUeXhEUVVGRExFVkJRVVU3UVVGRGNrSXNWVUZCU1N4SlFVRkpMRWRCUVVjc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF6dEJRVU40UWl4VlFVRkpMRTlCUVU4c1EwRkJReXhKUVVGSkxFbEJRVWtzVDBGQlR5eERRVUZETEVkQlFVY3NSVUZCUlR0QlFVTXZRaXhaUVVGSkxFZEJRVWNzYlVKQlFWa3NUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8wRkJRMnBETEZsQlFVa3NRMEZCUXl4WFFVRlhMRWRCUVVjc2VVSkJRMnBDTEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1YwRkJWeXhGUVVONFFpeFBRVUZQTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVObUxFTkJRVU03VDBGRFNEczdRVUZGUkN4aFFVRlBMRVZCUVVVc1EwRkJReXhQUVVGUExFVkJRVVU3UVVGRGFrSXNXVUZCU1N4RlFVRkZMRWxCUVVrN1FVRkRWaXh0UWtGQlZ5eEZRVUZGTEcxQ1FVRlpMRU5CUVVNc1QwRkJUeXhEUVVGRExFVkJRVVVzUTBGQlF5eEpRVUZKTEVsQlFVa3NTVUZCU1N4RFFVRkRMRmRCUVZjc1EwRkJReXhEUVVGRE8wOUJRMmhGTEVOQlFVTXNRMEZCUXp0TFFVTktMRTFCUVUwN1FVRkRUQ3hoUVVGUExFOUJRVThzUTBGQlF5eFBRVUZQTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNN1MwRkRPVUk3UjBGRFJpeERRVUZETEVOQlFVTTdRMEZEU2lJc0ltWnBiR1VpT2lKM2FYUm9MbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUh0Y2JpQWdZWEJ3Wlc1a1EyOXVkR1Y0ZEZCaGRHZ3NYRzRnSUdKc2IyTnJVR0Z5WVcxekxGeHVJQ0JqY21WaGRHVkdjbUZ0WlN4Y2JpQWdhWE5GYlhCMGVTeGNiaUFnYVhOR2RXNWpkR2x2Ymx4dWZTQm1jbTl0SUNjdUxpOTFkR2xzY3ljN1hHNXBiWEJ2Y25RZ1JYaGpaWEIwYVc5dUlHWnliMjBnSnk0dUwyVjRZMlZ3ZEdsdmJpYzdYRzVjYm1WNGNHOXlkQ0JrWldaaGRXeDBJR1oxYm1OMGFXOXVLR2x1YzNSaGJtTmxLU0I3WEc0Z0lHbHVjM1JoYm1ObExuSmxaMmx6ZEdWeVNHVnNjR1Z5S0NkM2FYUm9KeXdnWm5WdVkzUnBiMjRvWTI5dWRHVjRkQ3dnYjNCMGFXOXVjeWtnZTF4dUlDQWdJR2xtSUNoaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUNFOUlESXBJSHRjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJGZUdObGNIUnBiMjRvSnlOM2FYUm9JSEpsY1hWcGNtVnpJR1Y0WVdOMGJIa2diMjVsSUdGeVozVnRaVzUwSnlrN1hHNGdJQ0FnZlZ4dUlDQWdJR2xtSUNocGMwWjFibU4wYVc5dUtHTnZiblJsZUhRcEtTQjdYRzRnSUNBZ0lDQmpiMjUwWlhoMElEMGdZMjl1ZEdWNGRDNWpZV3hzS0hSb2FYTXBPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHeGxkQ0JtYmlBOUlHOXdkR2x2Ym5NdVptNDdYRzVjYmlBZ0lDQnBaaUFvSVdselJXMXdkSGtvWTI5dWRHVjRkQ2twSUh0Y2JpQWdJQ0FnSUd4bGRDQmtZWFJoSUQwZ2IzQjBhVzl1Y3k1a1lYUmhPMXh1SUNBZ0lDQWdhV1lnS0c5d2RHbHZibk11WkdGMFlTQW1KaUJ2Y0hScGIyNXpMbWxrY3lrZ2UxeHVJQ0FnSUNBZ0lDQmtZWFJoSUQwZ1kzSmxZWFJsUm5KaGJXVW9iM0IwYVc5dWN5NWtZWFJoS1R0Y2JpQWdJQ0FnSUNBZ1pHRjBZUzVqYjI1MFpYaDBVR0YwYUNBOUlHRndjR1Z1WkVOdmJuUmxlSFJRWVhSb0tGeHVJQ0FnSUNBZ0lDQWdJRzl3ZEdsdmJuTXVaR0YwWVM1amIyNTBaWGgwVUdGMGFDeGNiaUFnSUNBZ0lDQWdJQ0J2Y0hScGIyNXpMbWxrYzFzd1hWeHVJQ0FnSUNBZ0lDQXBPMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0J5WlhSMWNtNGdabTRvWTI5dWRHVjRkQ3dnZTF4dUlDQWdJQ0FnSUNCa1lYUmhPaUJrWVhSaExGeHVJQ0FnSUNBZ0lDQmliRzlqYTFCaGNtRnRjem9nWW14dlkydFFZWEpoYlhNb1cyTnZiblJsZUhSZExDQmJaR0YwWVNBbUppQmtZWFJoTG1OdmJuUmxlSFJRWVhSb1hTbGNiaUFnSUNBZ0lIMHBPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnYjNCMGFXOXVjeTVwYm5abGNuTmxLSFJvYVhNcE8xeHVJQ0FnSUgxY2JpQWdmU2s3WEc1OVhHNGlYWDA9XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMucmVnaXN0ZXJEZWZhdWx0SGVscGVycyA9IHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnM7XG5leHBvcnRzLm1vdmVIZWxwZXJUb0hvb2tzID0gbW92ZUhlbHBlclRvSG9va3M7XG4vLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyA9IHJlcXVpcmUoJy4vaGVscGVycy9ibG9jay1oZWxwZXItbWlzc2luZycpO1xuXG52YXIgX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0Jsb2NrSGVscGVyTWlzc2luZyk7XG5cbnZhciBfaGVscGVyc0VhY2ggPSByZXF1aXJlKCcuL2hlbHBlcnMvZWFjaCcpO1xuXG52YXIgX2hlbHBlcnNFYWNoMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNFYWNoKTtcblxudmFyIF9oZWxwZXJzSGVscGVyTWlzc2luZyA9IHJlcXVpcmUoJy4vaGVscGVycy9oZWxwZXItbWlzc2luZycpO1xuXG52YXIgX2hlbHBlcnNIZWxwZXJNaXNzaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNIZWxwZXJNaXNzaW5nKTtcblxudmFyIF9oZWxwZXJzSWYgPSByZXF1aXJlKCcuL2hlbHBlcnMvaWYnKTtcblxudmFyIF9oZWxwZXJzSWYyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0lmKTtcblxudmFyIF9oZWxwZXJzTG9nID0gcmVxdWlyZSgnLi9oZWxwZXJzL2xvZycpO1xuXG52YXIgX2hlbHBlcnNMb2cyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGVscGVyc0xvZyk7XG5cbnZhciBfaGVscGVyc0xvb2t1cCA9IHJlcXVpcmUoJy4vaGVscGVycy9sb29rdXAnKTtcblxudmFyIF9oZWxwZXJzTG9va3VwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlbHBlcnNMb29rdXApO1xuXG52YXIgX2hlbHBlcnNXaXRoID0gcmVxdWlyZSgnLi9oZWxwZXJzL3dpdGgnKTtcblxudmFyIF9oZWxwZXJzV2l0aDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oZWxwZXJzV2l0aCk7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnMoaW5zdGFuY2UpIHtcbiAgX2hlbHBlcnNCbG9ja0hlbHBlck1pc3NpbmcyWydkZWZhdWx0J10oaW5zdGFuY2UpO1xuICBfaGVscGVyc0VhY2gyWydkZWZhdWx0J10oaW5zdGFuY2UpO1xuICBfaGVscGVyc0hlbHBlck1pc3NpbmcyWydkZWZhdWx0J10oaW5zdGFuY2UpO1xuICBfaGVscGVyc0lmMlsnZGVmYXVsdCddKGluc3RhbmNlKTtcbiAgX2hlbHBlcnNMb2cyWydkZWZhdWx0J10oaW5zdGFuY2UpO1xuICBfaGVscGVyc0xvb2t1cDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7XG4gIF9oZWxwZXJzV2l0aDJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIG1vdmVIZWxwZXJUb0hvb2tzKGluc3RhbmNlLCBoZWxwZXJOYW1lLCBrZWVwSGVscGVyKSB7XG4gIGlmIChpbnN0YW5jZS5oZWxwZXJzW2hlbHBlck5hbWVdKSB7XG4gICAgaW5zdGFuY2UuaG9va3NbaGVscGVyTmFtZV0gPSBpbnN0YW5jZS5oZWxwZXJzW2hlbHBlck5hbWVdO1xuICAgIGlmICgha2VlcEhlbHBlcikge1xuICAgICAgZGVsZXRlIGluc3RhbmNlLmhlbHBlcnNbaGVscGVyTmFtZV07XG4gICAgfVxuICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMMnhwWWk5b1lXNWtiR1ZpWVhKekwyaGxiSEJsY25NdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN08zbERRVUYxUXl4blEwRkJaME03T3pzN01rSkJRemxETEdkQ1FVRm5RanM3T3p0dlEwRkRVQ3d3UWtGQk1FSTdPenM3ZVVKQlEzSkRMR05CUVdNN096czdNRUpCUTJJc1pVRkJaVHM3T3pzMlFrRkRXaXhyUWtGQmEwSTdPenM3TWtKQlEzQkNMR2RDUVVGblFqczdPenRCUVVWc1F5eFRRVUZUTEhOQ1FVRnpRaXhEUVVGRExGRkJRVkVzUlVGQlJUdEJRVU12UXl4NVEwRkJNa0lzVVVGQlVTeERRVUZETEVOQlFVTTdRVUZEY2tNc01rSkJRV0VzVVVGQlVTeERRVUZETEVOQlFVTTdRVUZEZGtJc2IwTkJRWE5DTEZGQlFWRXNRMEZCUXl4RFFVRkRPMEZCUTJoRExIbENRVUZYTEZGQlFWRXNRMEZCUXl4RFFVRkRPMEZCUTNKQ0xEQkNRVUZaTEZGQlFWRXNRMEZCUXl4RFFVRkRPMEZCUTNSQ0xEWkNRVUZsTEZGQlFWRXNRMEZCUXl4RFFVRkRPMEZCUTNwQ0xESkNRVUZoTEZGQlFWRXNRMEZCUXl4RFFVRkRPME5CUTNoQ096dEJRVVZOTEZOQlFWTXNhVUpCUVdsQ0xFTkJRVU1zVVVGQlVTeEZRVUZGTEZWQlFWVXNSVUZCUlN4VlFVRlZMRVZCUVVVN1FVRkRiRVVzVFVGQlNTeFJRVUZSTEVOQlFVTXNUMEZCVHl4RFFVRkRMRlZCUVZVc1EwRkJReXhGUVVGRk8wRkJRMmhETEZsQlFWRXNRMEZCUXl4TFFVRkxMRU5CUVVNc1ZVRkJWU3hEUVVGRExFZEJRVWNzVVVGQlVTeERRVUZETEU5QlFVOHNRMEZCUXl4VlFVRlZMRU5CUVVNc1EwRkJRenRCUVVNeFJDeFJRVUZKTEVOQlFVTXNWVUZCVlN4RlFVRkZPMEZCUTJZc1lVRkJUeXhSUVVGUkxFTkJRVU1zVDBGQlR5eERRVUZETEZWQlFWVXNRMEZCUXl4RFFVRkRPMHRCUTNKRE8wZEJRMFk3UTBGRFJpSXNJbVpwYkdVaU9pSm9aV3h3WlhKekxtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSEpsWjJsemRHVnlRbXh2WTJ0SVpXeHdaWEpOYVhOemFXNW5JR1p5YjIwZ0p5NHZhR1ZzY0dWeWN5OWliRzlqYXkxb1pXeHdaWEl0YldsemMybHVaeWM3WEc1cGJYQnZjblFnY21WbmFYTjBaWEpGWVdOb0lHWnliMjBnSnk0dmFHVnNjR1Z5Y3k5bFlXTm9KenRjYm1sdGNHOXlkQ0J5WldkcGMzUmxja2hsYkhCbGNrMXBjM05wYm1jZ1puSnZiU0FuTGk5b1pXeHdaWEp6TDJobGJIQmxjaTF0YVhOemFXNW5KenRjYm1sdGNHOXlkQ0J5WldkcGMzUmxja2xtSUdaeWIyMGdKeTR2YUdWc2NHVnljeTlwWmljN1hHNXBiWEJ2Y25RZ2NtVm5hWE4wWlhKTWIyY2dabkp2YlNBbkxpOW9aV3h3WlhKekwyeHZaeWM3WEc1cGJYQnZjblFnY21WbmFYTjBaWEpNYjI5cmRYQWdabkp2YlNBbkxpOW9aV3h3WlhKekwyeHZiMnQxY0NjN1hHNXBiWEJ2Y25RZ2NtVm5hWE4wWlhKWGFYUm9JR1p5YjIwZ0p5NHZhR1ZzY0dWeWN5OTNhWFJvSnp0Y2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlISmxaMmx6ZEdWeVJHVm1ZWFZzZEVobGJIQmxjbk1vYVc1emRHRnVZMlVwSUh0Y2JpQWdjbVZuYVhOMFpYSkNiRzlqYTBobGJIQmxjazFwYzNOcGJtY29hVzV6ZEdGdVkyVXBPMXh1SUNCeVpXZHBjM1JsY2tWaFkyZ29hVzV6ZEdGdVkyVXBPMXh1SUNCeVpXZHBjM1JsY2tobGJIQmxjazFwYzNOcGJtY29hVzV6ZEdGdVkyVXBPMXh1SUNCeVpXZHBjM1JsY2tsbUtHbHVjM1JoYm1ObEtUdGNiaUFnY21WbmFYTjBaWEpNYjJjb2FXNXpkR0Z1WTJVcE8xeHVJQ0J5WldkcGMzUmxja3h2YjJ0MWNDaHBibk4wWVc1alpTazdYRzRnSUhKbFoybHpkR1Z5VjJsMGFDaHBibk4wWVc1alpTazdYRzU5WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCdGIzWmxTR1ZzY0dWeVZHOUliMjlyY3locGJuTjBZVzVqWlN3Z2FHVnNjR1Z5VG1GdFpTd2dhMlZsY0VobGJIQmxjaWtnZTF4dUlDQnBaaUFvYVc1emRHRnVZMlV1YUdWc2NHVnljMXRvWld4d1pYSk9ZVzFsWFNrZ2UxeHVJQ0FnSUdsdWMzUmhibU5sTG1odmIydHpXMmhsYkhCbGNrNWhiV1ZkSUQwZ2FXNXpkR0Z1WTJVdWFHVnNjR1Z5YzF0b1pXeHdaWEpPWVcxbFhUdGNiaUFnSUNCcFppQW9JV3RsWlhCSVpXeHdaWElwSUh0Y2JpQWdJQ0FnSUdSbGJHVjBaU0JwYm5OMFlXNWpaUzVvWld4d1pYSnpXMmhsYkhCbGNrNWhiV1ZkTzF4dUlDQWdJSDFjYmlBZ2ZWeHVmVnh1SWwxOVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJEZWNvcmF0b3IoJ2lubGluZScsIGZ1bmN0aW9uIChmbiwgcHJvcHMsIGNvbnRhaW5lciwgb3B0aW9ucykge1xuICAgIHZhciByZXQgPSBmbjtcbiAgICBpZiAoIXByb3BzLnBhcnRpYWxzKSB7XG4gICAgICBwcm9wcy5wYXJ0aWFscyA9IHt9O1xuICAgICAgcmV0ID0gZnVuY3Rpb24gKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHBhcnRpYWxzIHN0YWNrIGZyYW1lIHByaW9yIHRvIGV4ZWMuXG4gICAgICAgIHZhciBvcmlnaW5hbCA9IGNvbnRhaW5lci5wYXJ0aWFscztcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gX3V0aWxzLmV4dGVuZCh7fSwgb3JpZ2luYWwsIHByb3BzLnBhcnRpYWxzKTtcbiAgICAgICAgdmFyIHJldCA9IGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBvcmlnaW5hbDtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvcHMucGFydGlhbHNbb3B0aW9ucy5hcmdzWzBdXSA9IG9wdGlvbnMuZm47XG5cbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDJSbFkyOXlZWFJ2Y25NdmFXNXNhVzVsTG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJN096czdjVUpCUVhWQ0xGVkJRVlU3TzNGQ1FVVnNRaXhWUVVGVExGRkJRVkVzUlVGQlJUdEJRVU5vUXl4VlFVRlJMRU5CUVVNc2FVSkJRV2xDTEVOQlFVTXNVVUZCVVN4RlFVRkZMRlZCUVZNc1JVRkJSU3hGUVVGRkxFdEJRVXNzUlVGQlJTeFRRVUZUTEVWQlFVVXNUMEZCVHl4RlFVRkZPMEZCUXpORkxGRkJRVWtzUjBGQlJ5eEhRVUZITEVWQlFVVXNRMEZCUXp0QlFVTmlMRkZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zVVVGQlVTeEZRVUZGTzBGQlEyNUNMRmRCUVVzc1EwRkJReXhSUVVGUkxFZEJRVWNzUlVGQlJTeERRVUZETzBGQlEzQkNMRk5CUVVjc1IwRkJSeXhWUVVGVExFOUJRVThzUlVGQlJTeFBRVUZQTEVWQlFVVTdPMEZCUlM5Q0xGbEJRVWtzVVVGQlVTeEhRVUZITEZOQlFWTXNRMEZCUXl4UlFVRlJMRU5CUVVNN1FVRkRiRU1zYVVKQlFWTXNRMEZCUXl4UlFVRlJMRWRCUVVjc1kwRkJUeXhGUVVGRkxFVkJRVVVzVVVGQlVTeEZRVUZGTEV0QlFVc3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenRCUVVNeFJDeFpRVUZKTEVkQlFVY3NSMEZCUnl4RlFVRkZMRU5CUVVNc1QwRkJUeXhGUVVGRkxFOUJRVThzUTBGQlF5eERRVUZETzBGQlF5OUNMR2xDUVVGVExFTkJRVU1zVVVGQlVTeEhRVUZITEZGQlFWRXNRMEZCUXp0QlFVTTVRaXhsUVVGUExFZEJRVWNzUTBGQlF6dFBRVU5hTEVOQlFVTTdTMEZEU0RzN1FVRkZSQ3hUUVVGTExFTkJRVU1zVVVGQlVTeERRVUZETEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eFBRVUZQTEVOQlFVTXNSVUZCUlN4RFFVRkRPenRCUVVVM1F5eFhRVUZQTEVkQlFVY3NRMEZCUXp0SFFVTmFMRU5CUVVNc1EwRkJRenREUVVOS0lpd2labWxzWlNJNkltbHViR2x1WlM1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQjdJR1Y0ZEdWdVpDQjlJR1p5YjIwZ0p5NHVMM1YwYVd4ekp6dGNibHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdablZ1WTNScGIyNG9hVzV6ZEdGdVkyVXBJSHRjYmlBZ2FXNXpkR0Z1WTJVdWNtVm5hWE4wWlhKRVpXTnZjbUYwYjNJb0oybHViR2x1WlNjc0lHWjFibU4wYVc5dUtHWnVMQ0J3Y205d2N5d2dZMjl1ZEdGcGJtVnlMQ0J2Y0hScGIyNXpLU0I3WEc0Z0lDQWdiR1YwSUhKbGRDQTlJR1p1TzF4dUlDQWdJR2xtSUNnaGNISnZjSE11Y0dGeWRHbGhiSE1wSUh0Y2JpQWdJQ0FnSUhCeWIzQnpMbkJoY25ScFlXeHpJRDBnZTMwN1hHNGdJQ0FnSUNCeVpYUWdQU0JtZFc1amRHbHZiaWhqYjI1MFpYaDBMQ0J2Y0hScGIyNXpLU0I3WEc0Z0lDQWdJQ0FnSUM4dklFTnlaV0YwWlNCaElHNWxkeUJ3WVhKMGFXRnNjeUJ6ZEdGamF5Qm1jbUZ0WlNCd2NtbHZjaUIwYnlCbGVHVmpMbHh1SUNBZ0lDQWdJQ0JzWlhRZ2IzSnBaMmx1WVd3Z1BTQmpiMjUwWVdsdVpYSXVjR0Z5ZEdsaGJITTdYRzRnSUNBZ0lDQWdJR052Ym5SaGFXNWxjaTV3WVhKMGFXRnNjeUE5SUdWNGRHVnVaQ2g3ZlN3Z2IzSnBaMmx1WVd3c0lIQnliM0J6TG5CaGNuUnBZV3h6S1R0Y2JpQWdJQ0FnSUNBZ2JHVjBJSEpsZENBOUlHWnVLR052Ym5SbGVIUXNJRzl3ZEdsdmJuTXBPMXh1SUNBZ0lDQWdJQ0JqYjI1MFlXbHVaWEl1Y0dGeWRHbGhiSE1nUFNCdmNtbG5hVzVoYkR0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhKbGREdGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2NISnZjSE11Y0dGeWRHbGhiSE5iYjNCMGFXOXVjeTVoY21keld6QmRYU0E5SUc5d2RHbHZibk11Wm00N1hHNWNiaUFnSUNCeVpYUjFjbTRnY21WME8xeHVJQ0I5S1R0Y2JuMWNiaUpkZlE9PVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnMgPSByZWdpc3RlckRlZmF1bHREZWNvcmF0b3JzO1xuLy8gaXN0YW5idWwgaWdub3JlIG5leHRcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX2RlY29yYXRvcnNJbmxpbmUgPSByZXF1aXJlKCcuL2RlY29yYXRvcnMvaW5saW5lJyk7XG5cbnZhciBfZGVjb3JhdG9yc0lubGluZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWNvcmF0b3JzSW5saW5lKTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyhpbnN0YW5jZSkge1xuICBfZGVjb3JhdG9yc0lubGluZTJbJ2RlZmF1bHQnXShpbnN0YW5jZSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMMnhwWWk5b1lXNWtiR1ZpWVhKekwyUmxZMjl5WVhSdmNuTXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanM3T3pzN096czdaME5CUVRKQ0xIRkNRVUZ4UWpzN096dEJRVVY2UXl4VFFVRlRMSGxDUVVGNVFpeERRVUZETEZGQlFWRXNSVUZCUlR0QlFVTnNSQ3huUTBGQlpTeFJRVUZSTEVOQlFVTXNRMEZCUXp0RFFVTXhRaUlzSW1acGJHVWlPaUprWldOdmNtRjBiM0p6TG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElISmxaMmx6ZEdWeVNXNXNhVzVsSUdaeWIyMGdKeTR2WkdWamIzSmhkRzl5Y3k5cGJteHBibVVuTzF4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z2NtVm5hWE4wWlhKRVpXWmhkV3gwUkdWamIzSmhkRzl5Y3locGJuTjBZVzVqWlNrZ2UxeHVJQ0J5WldkcGMzUmxja2x1YkdsdVpTaHBibk4wWVc1alpTazdYRzU5WEc0aVhYMD1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgbG9nZ2VyID0ge1xuICBtZXRob2RNYXA6IFsnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJ10sXG4gIGxldmVsOiAnaW5mbycsXG5cbiAgLy8gTWFwcyBhIGdpdmVuIGxldmVsIHZhbHVlIHRvIHRoZSBgbWV0aG9kTWFwYCBpbmRleGVzIGFib3ZlLlxuICBsb29rdXBMZXZlbDogZnVuY3Rpb24gbG9va3VwTGV2ZWwobGV2ZWwpIHtcbiAgICBpZiAodHlwZW9mIGxldmVsID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIGxldmVsTWFwID0gX3V0aWxzLmluZGV4T2YobG9nZ2VyLm1ldGhvZE1hcCwgbGV2ZWwudG9Mb3dlckNhc2UoKSk7XG4gICAgICBpZiAobGV2ZWxNYXAgPj0gMCkge1xuICAgICAgICBsZXZlbCA9IGxldmVsTWFwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV2ZWwgPSBwYXJzZUludChsZXZlbCwgMTApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsZXZlbDtcbiAgfSxcblxuICAvLyBDYW4gYmUgb3ZlcnJpZGRlbiBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudFxuICBsb2c6IGZ1bmN0aW9uIGxvZyhsZXZlbCkge1xuICAgIGxldmVsID0gbG9nZ2VyLmxvb2t1cExldmVsKGxldmVsKTtcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbG9nZ2VyLmxvb2t1cExldmVsKGxvZ2dlci5sZXZlbCkgPD0gbGV2ZWwpIHtcbiAgICAgIHZhciBtZXRob2QgPSBsb2dnZXIubWV0aG9kTWFwW2xldmVsXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkge1xuICAgICAgICBtZXRob2QgPSAnbG9nJztcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1lc3NhZ2UgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIG1lc3NhZ2VbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlW21ldGhvZF0uYXBwbHkoY29uc29sZSwgbWVzc2FnZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gbG9nZ2VyO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMMnhwWWk5b1lXNWtiR1ZpWVhKekwyeHZaMmRsY2k1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU96czdPM0ZDUVVGM1FpeFRRVUZUT3p0QlFVVnFReXhKUVVGSkxFMUJRVTBzUjBGQlJ6dEJRVU5ZTEZkQlFWTXNSVUZCUlN4RFFVRkRMRTlCUVU4c1JVRkJSU3hOUVVGTkxFVkJRVVVzVFVGQlRTeEZRVUZGTEU5QlFVOHNRMEZCUXp0QlFVTTNReXhQUVVGTExFVkJRVVVzVFVGQlRUczdPMEZCUjJJc1lVRkJWeXhGUVVGRkxIRkNRVUZUTEV0QlFVc3NSVUZCUlR0QlFVTXpRaXhSUVVGSkxFOUJRVThzUzBGQlN5eExRVUZMTEZGQlFWRXNSVUZCUlR0QlFVTTNRaXhWUVVGSkxGRkJRVkVzUjBGQlJ5eGxRVUZSTEUxQlFVMHNRMEZCUXl4VFFVRlRMRVZCUVVVc1MwRkJTeXhEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETEVOQlFVTTdRVUZET1VRc1ZVRkJTU3hSUVVGUkxFbEJRVWtzUTBGQlF5eEZRVUZGTzBGQlEycENMR0ZCUVVzc1IwRkJSeXhSUVVGUkxFTkJRVU03VDBGRGJFSXNUVUZCVFR0QlFVTk1MR0ZCUVVzc1IwRkJSeXhSUVVGUkxFTkJRVU1zUzBGQlN5eEZRVUZGTEVWQlFVVXNRMEZCUXl4RFFVRkRPMDlCUXpkQ08wdEJRMFk3TzBGQlJVUXNWMEZCVHl4TFFVRkxMRU5CUVVNN1IwRkRaRHM3TzBGQlIwUXNTMEZCUnl4RlFVRkZMR0ZCUVZNc1MwRkJTeXhGUVVGak8wRkJReTlDTEZOQlFVc3NSMEZCUnl4TlFVRk5MRU5CUVVNc1YwRkJWeXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZET3p0QlFVVnNReXhSUVVORkxFOUJRVThzVDBGQlR5eExRVUZMTEZkQlFWY3NTVUZET1VJc1RVRkJUU3hEUVVGRExGZEJRVmNzUTBGQlF5eE5RVUZOTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1MwRkJTeXhGUVVONlF6dEJRVU5CTEZWQlFVa3NUVUZCVFN4SFFVRkhMRTFCUVUwc1EwRkJReXhUUVVGVExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdPMEZCUlhKRExGVkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RFFVRkRMRVZCUVVVN1FVRkRjRUlzWTBGQlRTeEhRVUZITEV0QlFVc3NRMEZCUXp0UFFVTm9RanM3ZDBOQldHMUNMRTlCUVU4N1FVRkJVQ3hsUVVGUE96czdRVUZaTTBJc1lVRkJUeXhEUVVGRExFMUJRVTBzVDBGQlF5eERRVUZtTEU5QlFVOHNSVUZCV1N4UFFVRlBMRU5CUVVNc1EwRkJRenRMUVVNM1FqdEhRVU5HTzBOQlEwWXNRMEZCUXpzN2NVSkJSV0VzVFVGQlRTSXNJbVpwYkdVaU9pSnNiMmRuWlhJdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpwYlhCdmNuUWdleUJwYm1SbGVFOW1JSDBnWm5KdmJTQW5MaTkxZEdsc2N5YzdYRzVjYm14bGRDQnNiMmRuWlhJZ1BTQjdYRzRnSUcxbGRHaHZaRTFoY0RvZ1d5ZGtaV0oxWnljc0lDZHBibVp2Snl3Z0ozZGhjbTRuTENBblpYSnliM0luWFN4Y2JpQWdiR1YyWld3NklDZHBibVp2Snl4Y2JseHVJQ0F2THlCTllYQnpJR0VnWjJsMlpXNGdiR1YyWld3Z2RtRnNkV1VnZEc4Z2RHaGxJR0J0WlhSb2IyUk5ZWEJnSUdsdVpHVjRaWE1nWVdKdmRtVXVYRzRnSUd4dmIydDFjRXhsZG1Wc09pQm1kVzVqZEdsdmJpaHNaWFpsYkNrZ2UxeHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ2JHVjJaV3dnUFQwOUlDZHpkSEpwYm1jbktTQjdYRzRnSUNBZ0lDQnNaWFFnYkdWMlpXeE5ZWEFnUFNCcGJtUmxlRTltS0d4dloyZGxjaTV0WlhSb2IyUk5ZWEFzSUd4bGRtVnNMblJ2VEc5M1pYSkRZWE5sS0NrcE8xeHVJQ0FnSUNBZ2FXWWdLR3hsZG1Wc1RXRndJRDQ5SURBcElIdGNiaUFnSUNBZ0lDQWdiR1YyWld3Z1BTQnNaWFpsYkUxaGNEdGNiaUFnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lHeGxkbVZzSUQwZ2NHRnljMlZKYm5Rb2JHVjJaV3dzSURFd0tUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUjFjbTRnYkdWMlpXdzdYRzRnSUgwc1hHNWNiaUFnTHk4Z1EyRnVJR0psSUc5MlpYSnlhV1JrWlc0Z2FXNGdkR2hsSUdodmMzUWdaVzUyYVhKdmJtMWxiblJjYmlBZ2JHOW5PaUJtZFc1amRHbHZiaWhzWlhabGJDd2dMaTR1YldWemMyRm5aU2tnZTF4dUlDQWdJR3hsZG1Wc0lEMGdiRzluWjJWeUxteHZiMnQxY0V4bGRtVnNLR3hsZG1Wc0tUdGNibHh1SUNBZ0lHbG1JQ2hjYmlBZ0lDQWdJSFI1Y0dWdlppQmpiMjV6YjJ4bElDRTlQU0FuZFc1a1pXWnBibVZrSnlBbUpseHVJQ0FnSUNBZ2JHOW5aMlZ5TG14dmIydDFjRXhsZG1Wc0tHeHZaMmRsY2k1c1pYWmxiQ2tnUEQwZ2JHVjJaV3hjYmlBZ0lDQXBJSHRjYmlBZ0lDQWdJR3hsZENCdFpYUm9iMlFnUFNCc2IyZG5aWEl1YldWMGFHOWtUV0Z3VzJ4bGRtVnNYVHRjYmlBZ0lDQWdJQzh2SUdWemJHbHVkQzFrYVhOaFlteGxMVzVsZUhRdGJHbHVaU0J1YnkxamIyNXpiMnhsWEc0Z0lDQWdJQ0JwWmlBb0lXTnZibk52YkdWYmJXVjBhRzlrWFNrZ2UxeHVJQ0FnSUNBZ0lDQnRaWFJvYjJRZ1BTQW5iRzluSnp0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUdOdmJuTnZiR1ZiYldWMGFHOWtYU2d1TGk1dFpYTnpZV2RsS1RzZ0x5OGdaWE5zYVc1MExXUnBjMkZpYkdVdGJHbHVaU0J1YnkxamIyNXpiMnhsWEc0Z0lDQWdmVnh1SUNCOVhHNTlPMXh1WEc1bGVIQnZjblFnWkdWbVlYVnNkQ0JzYjJkblpYSTdYRzRpWFgwPVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmNyZWF0ZU5ld0xvb2t1cE9iamVjdCA9IGNyZWF0ZU5ld0xvb2t1cE9iamVjdDtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IG9iamVjdCB3aXRoIFwibnVsbFwiLXByb3RvdHlwZSB0byBhdm9pZCB0cnV0aHkgcmVzdWx0cyBvbiBwcm90b3R5cGUgcHJvcGVydGllcy5cbiAqIFRoZSByZXN1bHRpbmcgb2JqZWN0IGNhbiBiZSB1c2VkIHdpdGggXCJvYmplY3RbcHJvcGVydHldXCIgdG8gY2hlY2sgaWYgYSBwcm9wZXJ0eSBleGlzdHNcbiAqIEBwYXJhbSB7Li4ub2JqZWN0fSBzb3VyY2VzIGEgdmFyYXJncyBwYXJhbWV0ZXIgb2Ygc291cmNlIG9iamVjdHMgdGhhdCB3aWxsIGJlIG1lcmdlZFxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVOZXdMb29rdXBPYmplY3QoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzb3VyY2VzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgc291cmNlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBfdXRpbHMuZXh0ZW5kLmFwcGx5KHVuZGVmaW5lZCwgW09iamVjdC5jcmVhdGUobnVsbCldLmNvbmNhdChzb3VyY2VzKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMeTR1TDJ4cFlpOW9ZVzVrYkdWaVlYSnpMMmx1ZEdWeWJtRnNMMk55WldGMFpTMXVaWGN0Ykc5dmEzVndMVzlpYW1WamRDNXFjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lPenM3T3p0eFFrRkJkVUlzVlVGQlZUczdPenM3T3pzN08wRkJVVEZDTEZOQlFWTXNjVUpCUVhGQ0xFZEJRV0U3YjBOQlFWUXNUMEZCVHp0QlFVRlFMRmRCUVU4N096dEJRVU01UXl4VFFVRlBMR2REUVVGUExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRk5CUVVzc1QwRkJUeXhGUVVGRExFTkJRVU03UTBGRGFFUWlMQ0ptYVd4bElqb2lZM0psWVhSbExXNWxkeTFzYjI5cmRYQXRiMkpxWldOMExtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSHNnWlhoMFpXNWtJSDBnWm5KdmJTQW5MaTR2ZFhScGJITW5PMXh1WEc0dktpcGNiaUFxSUVOeVpXRjBaU0JoSUc1bGR5QnZZbXBsWTNRZ2QybDBhQ0JjSW01MWJHeGNJaTF3Y205MGIzUjVjR1VnZEc4Z1lYWnZhV1FnZEhKMWRHaDVJSEpsYzNWc2RITWdiMjRnY0hKdmRHOTBlWEJsSUhCeWIzQmxjblJwWlhNdVhHNGdLaUJVYUdVZ2NtVnpkV3gwYVc1bklHOWlhbVZqZENCallXNGdZbVVnZFhObFpDQjNhWFJvSUZ3aWIySnFaV04wVzNCeWIzQmxjblI1WFZ3aUlIUnZJR05vWldOcklHbG1JR0VnY0hKdmNHVnlkSGtnWlhocGMzUnpYRzRnS2lCQWNHRnlZVzBnZXk0dUxtOWlhbVZqZEgwZ2MyOTFjbU5sY3lCaElIWmhjbUZ5WjNNZ2NHRnlZVzFsZEdWeUlHOW1JSE52ZFhKalpTQnZZbXBsWTNSeklIUm9ZWFFnZDJsc2JDQmlaU0J0WlhKblpXUmNiaUFxSUVCeVpYUjFjbTV6SUh0dlltcGxZM1I5WEc0Z0tpOWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmpjbVZoZEdWT1pYZE1iMjlyZFhCUFltcGxZM1FvTGk0dWMyOTFjbU5sY3lrZ2UxeHVJQ0J5WlhSMWNtNGdaWGgwWlc1a0tFOWlhbVZqZEM1amNtVmhkR1VvYm5Wc2JDa3NJQzR1TG5OdmRYSmpaWE1wTzF4dWZWeHVJbDE5XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuY3JlYXRlUHJvdG9BY2Nlc3NDb250cm9sID0gY3JlYXRlUHJvdG9BY2Nlc3NDb250cm9sO1xuZXhwb3J0cy5yZXN1bHRJc0FsbG93ZWQgPSByZXN1bHRJc0FsbG93ZWQ7XG5leHBvcnRzLnJlc2V0TG9nZ2VkUHJvcGVydGllcyA9IHJlc2V0TG9nZ2VkUHJvcGVydGllcztcbi8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIF9jcmVhdGVOZXdMb29rdXBPYmplY3QgPSByZXF1aXJlKCcuL2NyZWF0ZS1uZXctbG9va3VwLW9iamVjdCcpO1xuXG52YXIgX2xvZ2dlciA9IHJlcXVpcmUoJy4uL2xvZ2dlcicpO1xuXG52YXIgX2xvZ2dlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9sb2dnZXIpO1xuXG52YXIgbG9nZ2VkUHJvcGVydGllcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVByb3RvQWNjZXNzQ29udHJvbChydW50aW1lT3B0aW9ucykge1xuICB2YXIgZGVmYXVsdE1ldGhvZFdoaXRlTGlzdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGRlZmF1bHRNZXRob2RXaGl0ZUxpc3RbJ2NvbnN0cnVjdG9yJ10gPSBmYWxzZTtcbiAgZGVmYXVsdE1ldGhvZFdoaXRlTGlzdFsnX19kZWZpbmVHZXR0ZXJfXyddID0gZmFsc2U7XG4gIGRlZmF1bHRNZXRob2RXaGl0ZUxpc3RbJ19fZGVmaW5lU2V0dGVyX18nXSA9IGZhbHNlO1xuICBkZWZhdWx0TWV0aG9kV2hpdGVMaXN0WydfX2xvb2t1cEdldHRlcl9fJ10gPSBmYWxzZTtcblxuICB2YXIgZGVmYXVsdFByb3BlcnR5V2hpdGVMaXN0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvXG4gIGRlZmF1bHRQcm9wZXJ0eVdoaXRlTGlzdFsnX19wcm90b19fJ10gPSBmYWxzZTtcblxuICByZXR1cm4ge1xuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHdoaXRlbGlzdDogX2NyZWF0ZU5ld0xvb2t1cE9iamVjdC5jcmVhdGVOZXdMb29rdXBPYmplY3QoZGVmYXVsdFByb3BlcnR5V2hpdGVMaXN0LCBydW50aW1lT3B0aW9ucy5hbGxvd2VkUHJvdG9Qcm9wZXJ0aWVzKSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogcnVudGltZU9wdGlvbnMuYWxsb3dQcm90b1Byb3BlcnRpZXNCeURlZmF1bHRcbiAgICB9LFxuICAgIG1ldGhvZHM6IHtcbiAgICAgIHdoaXRlbGlzdDogX2NyZWF0ZU5ld0xvb2t1cE9iamVjdC5jcmVhdGVOZXdMb29rdXBPYmplY3QoZGVmYXVsdE1ldGhvZFdoaXRlTGlzdCwgcnVudGltZU9wdGlvbnMuYWxsb3dlZFByb3RvTWV0aG9kcyksXG4gICAgICBkZWZhdWx0VmFsdWU6IHJ1bnRpbWVPcHRpb25zLmFsbG93UHJvdG9NZXRob2RzQnlEZWZhdWx0XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiByZXN1bHRJc0FsbG93ZWQocmVzdWx0LCBwcm90b0FjY2Vzc0NvbnRyb2wsIHByb3BlcnR5TmFtZSkge1xuICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBjaGVja1doaXRlTGlzdChwcm90b0FjY2Vzc0NvbnRyb2wubWV0aG9kcywgcHJvcGVydHlOYW1lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2hlY2tXaGl0ZUxpc3QocHJvdG9BY2Nlc3NDb250cm9sLnByb3BlcnRpZXMsIHByb3BlcnR5TmFtZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tXaGl0ZUxpc3QocHJvdG9BY2Nlc3NDb250cm9sRm9yVHlwZSwgcHJvcGVydHlOYW1lKSB7XG4gIGlmIChwcm90b0FjY2Vzc0NvbnRyb2xGb3JUeXBlLndoaXRlbGlzdFtwcm9wZXJ0eU5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcHJvdG9BY2Nlc3NDb250cm9sRm9yVHlwZS53aGl0ZWxpc3RbcHJvcGVydHlOYW1lXSA9PT0gdHJ1ZTtcbiAgfVxuICBpZiAocHJvdG9BY2Nlc3NDb250cm9sRm9yVHlwZS5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBwcm90b0FjY2Vzc0NvbnRyb2xGb3JUeXBlLmRlZmF1bHRWYWx1ZTtcbiAgfVxuICBsb2dVbmV4cGVjZWRQcm9wZXJ0eUFjY2Vzc09uY2UocHJvcGVydHlOYW1lKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBsb2dVbmV4cGVjZWRQcm9wZXJ0eUFjY2Vzc09uY2UocHJvcGVydHlOYW1lKSB7XG4gIGlmIChsb2dnZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gIT09IHRydWUpIHtcbiAgICBsb2dnZWRQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB0cnVlO1xuICAgIF9sb2dnZXIyWydkZWZhdWx0J10ubG9nKCdlcnJvcicsICdIYW5kbGViYXJzOiBBY2Nlc3MgaGFzIGJlZW4gZGVuaWVkIHRvIHJlc29sdmUgdGhlIHByb3BlcnR5IFwiJyArIHByb3BlcnR5TmFtZSArICdcIiBiZWNhdXNlIGl0IGlzIG5vdCBhbiBcIm93biBwcm9wZXJ0eVwiIG9mIGl0cyBwYXJlbnQuXFxuJyArICdZb3UgY2FuIGFkZCBhIHJ1bnRpbWUgb3B0aW9uIHRvIGRpc2FibGUgdGhlIGNoZWNrIG9yIHRoaXMgd2FybmluZzpcXG4nICsgJ1NlZSBodHRwczovL2hhbmRsZWJhcnNqcy5jb20vYXBpLXJlZmVyZW5jZS9ydW50aW1lLW9wdGlvbnMuaHRtbCNvcHRpb25zLXRvLWNvbnRyb2wtcHJvdG90eXBlLWFjY2VzcyBmb3IgZGV0YWlscycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0TG9nZ2VkUHJvcGVydGllcygpIHtcbiAgT2JqZWN0LmtleXMobG9nZ2VkUHJvcGVydGllcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG4gICAgZGVsZXRlIGxvZ2dlZFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMeTR1TDJ4cFlpOW9ZVzVrYkdWaVlYSnpMMmx1ZEdWeWJtRnNMM0J5YjNSdkxXRmpZMlZ6Y3k1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU96czdPenM3T3pzN08zRkRRVUZ6UXl3MFFrRkJORUk3TzNOQ1FVTXZReXhYUVVGWE96czdPMEZCUlRsQ0xFbEJRVTBzWjBKQlFXZENMRWRCUVVjc1RVRkJUU3hEUVVGRExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXpzN1FVRkZkRU1zVTBGQlV5eDNRa0ZCZDBJc1EwRkJReXhqUVVGakxFVkJRVVU3UVVGRGRrUXNUVUZCU1N4elFrRkJjMElzUjBGQlJ5eE5RVUZOTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8wRkJRMnBFTEhkQ1FVRnpRaXhEUVVGRExHRkJRV0VzUTBGQlF5eEhRVUZITEV0QlFVc3NRMEZCUXp0QlFVTTVReXgzUWtGQmMwSXNRMEZCUXl4clFrRkJhMElzUTBGQlF5eEhRVUZITEV0QlFVc3NRMEZCUXp0QlFVTnVSQ3gzUWtGQmMwSXNRMEZCUXl4clFrRkJhMElzUTBGQlF5eEhRVUZITEV0QlFVc3NRMEZCUXp0QlFVTnVSQ3gzUWtGQmMwSXNRMEZCUXl4clFrRkJhMElzUTBGQlF5eEhRVUZITEV0QlFVc3NRMEZCUXpzN1FVRkZia1FzVFVGQlNTeDNRa0ZCZDBJc1IwRkJSeXhOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPenRCUVVWdVJDd3dRa0ZCZDBJc1EwRkJReXhYUVVGWExFTkJRVU1zUjBGQlJ5eExRVUZMTEVOQlFVTTdPMEZCUlRsRExGTkJRVTg3UVVGRFRDeGpRVUZWTEVWQlFVVTdRVUZEVml4bFFVRlRMRVZCUVVVc05rTkJRMVFzZDBKQlFYZENMRVZCUTNoQ0xHTkJRV01zUTBGQlF5eHpRa0ZCYzBJc1EwRkRkRU03UVVGRFJDeHJRa0ZCV1N4RlFVRkZMR05CUVdNc1EwRkJReXcyUWtGQk5rSTdTMEZETTBRN1FVRkRSQ3hYUVVGUExFVkJRVVU3UVVGRFVDeGxRVUZUTEVWQlFVVXNOa05CUTFRc2MwSkJRWE5DTEVWQlEzUkNMR05CUVdNc1EwRkJReXh0UWtGQmJVSXNRMEZEYmtNN1FVRkRSQ3hyUWtGQldTeEZRVUZGTEdOQlFXTXNRMEZCUXl3d1FrRkJNRUk3UzBGRGVFUTdSMEZEUml4RFFVRkRPME5CUTBnN08wRkJSVTBzVTBGQlV5eGxRVUZsTEVOQlFVTXNUVUZCVFN4RlFVRkZMR3RDUVVGclFpeEZRVUZGTEZsQlFWa3NSVUZCUlR0QlFVTjRSU3hOUVVGSkxFOUJRVThzVFVGQlRTeExRVUZMTEZWQlFWVXNSVUZCUlR0QlFVTm9ReXhYUVVGUExHTkJRV01zUTBGQlF5eHJRa0ZCYTBJc1EwRkJReXhQUVVGUExFVkJRVVVzV1VGQldTeERRVUZETEVOQlFVTTdSMEZEYWtVc1RVRkJUVHRCUVVOTUxGZEJRVThzWTBGQll5eERRVUZETEd0Q1FVRnJRaXhEUVVGRExGVkJRVlVzUlVGQlJTeFpRVUZaTEVOQlFVTXNRMEZCUXp0SFFVTndSVHREUVVOR096dEJRVVZFTEZOQlFWTXNZMEZCWXl4RFFVRkRMSGxDUVVGNVFpeEZRVUZGTEZsQlFWa3NSVUZCUlR0QlFVTXZSQ3hOUVVGSkxIbENRVUY1UWl4RFFVRkRMRk5CUVZNc1EwRkJReXhaUVVGWkxFTkJRVU1zUzBGQlN5eFRRVUZUTEVWQlFVVTdRVUZEYmtVc1YwRkJUeXg1UWtGQmVVSXNRMEZCUXl4VFFVRlRMRU5CUVVNc1dVRkJXU3hEUVVGRExFdEJRVXNzU1VGQlNTeERRVUZETzBkQlEyNUZPMEZCUTBRc1RVRkJTU3g1UWtGQmVVSXNRMEZCUXl4WlFVRlpMRXRCUVVzc1UwRkJVeXhGUVVGRk8wRkJRM2hFTEZkQlFVOHNlVUpCUVhsQ0xFTkJRVU1zV1VGQldTeERRVUZETzBkQlF5OURPMEZCUTBRc1owTkJRVGhDTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN1FVRkROME1zVTBGQlR5eExRVUZMTEVOQlFVTTdRMEZEWkRzN1FVRkZSQ3hUUVVGVExEaENRVUU0UWl4RFFVRkRMRmxCUVZrc1JVRkJSVHRCUVVOd1JDeE5RVUZKTEdkQ1FVRm5RaXhEUVVGRExGbEJRVmtzUTBGQlF5eExRVUZMTEVsQlFVa3NSVUZCUlR0QlFVTXpReXh2UWtGQlowSXNRMEZCUXl4WlFVRlpMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU03UVVGRGRFTXNkMEpCUVU4c1IwRkJSeXhEUVVOU0xFOUJRVThzUlVGRFVDeHBSVUZCSzBRc1dVRkJXU3h2U1VGRFNDeHZTRUZETWtNc1EwRkRjRWdzUTBGQlF6dEhRVU5JTzBOQlEwWTdPMEZCUlUwc1UwRkJVeXh4UWtGQmNVSXNSMEZCUnp0QlFVTjBReXhSUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEdkQ1FVRm5RaXhEUVVGRExFTkJRVU1zVDBGQlR5eERRVUZETEZWQlFVRXNXVUZCV1N4RlFVRkpPMEZCUTNCRUxGZEJRVThzWjBKQlFXZENMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU03UjBGRGRrTXNRMEZCUXl4RFFVRkRPME5CUTBvaUxDSm1hV3hsSWpvaWNISnZkRzh0WVdOalpYTnpMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUhzZ1kzSmxZWFJsVG1WM1RHOXZhM1Z3VDJKcVpXTjBJSDBnWm5KdmJTQW5MaTlqY21WaGRHVXRibVYzTFd4dmIydDFjQzF2WW1wbFkzUW5PMXh1YVcxd2IzSjBJR3h2WjJkbGNpQm1jbTl0SUNjdUxpOXNiMmRuWlhJbk8xeHVYRzVqYjI1emRDQnNiMmRuWldSUWNtOXdaWEowYVdWeklEMGdUMkpxWldOMExtTnlaV0YwWlNodWRXeHNLVHRjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdOeVpXRjBaVkJ5YjNSdlFXTmpaWE56UTI5dWRISnZiQ2h5ZFc1MGFXMWxUM0IwYVc5dWN5a2dlMXh1SUNCc1pYUWdaR1ZtWVhWc2RFMWxkR2h2WkZkb2FYUmxUR2x6ZENBOUlFOWlhbVZqZEM1amNtVmhkR1VvYm5Wc2JDazdYRzRnSUdSbFptRjFiSFJOWlhSb2IyUlhhR2wwWlV4cGMzUmJKMk52Ym5OMGNuVmpkRzl5SjEwZ1BTQm1ZV3h6WlR0Y2JpQWdaR1ZtWVhWc2RFMWxkR2h2WkZkb2FYUmxUR2x6ZEZzblgxOWtaV1pwYm1WSFpYUjBaWEpmWHlkZElEMGdabUZzYzJVN1hHNGdJR1JsWm1GMWJIUk5aWFJvYjJSWGFHbDBaVXhwYzNSYkoxOWZaR1ZtYVc1bFUyVjBkR1Z5WDE4blhTQTlJR1poYkhObE8xeHVJQ0JrWldaaGRXeDBUV1YwYUc5a1YyaHBkR1ZNYVhOMFd5ZGZYMnh2YjJ0MWNFZGxkSFJsY2w5ZkoxMGdQU0JtWVd4elpUdGNibHh1SUNCc1pYUWdaR1ZtWVhWc2RGQnliM0JsY25SNVYyaHBkR1ZNYVhOMElEMGdUMkpxWldOMExtTnlaV0YwWlNodWRXeHNLVHRjYmlBZ0x5OGdaWE5zYVc1MExXUnBjMkZpYkdVdGJtVjRkQzFzYVc1bElHNXZMWEJ5YjNSdlhHNGdJR1JsWm1GMWJIUlFjbTl3WlhKMGVWZG9hWFJsVEdsemRGc25YMTl3Y205MGIxOWZKMTBnUFNCbVlXeHpaVHRjYmx4dUlDQnlaWFIxY200Z2UxeHVJQ0FnSUhCeWIzQmxjblJwWlhNNklIdGNiaUFnSUNBZ0lIZG9hWFJsYkdsemREb2dZM0psWVhSbFRtVjNURzl2YTNWd1QySnFaV04wS0Z4dUlDQWdJQ0FnSUNCa1pXWmhkV3gwVUhKdmNHVnlkSGxYYUdsMFpVeHBjM1FzWEc0Z0lDQWdJQ0FnSUhKMWJuUnBiV1ZQY0hScGIyNXpMbUZzYkc5M1pXUlFjbTkwYjFCeWIzQmxjblJwWlhOY2JpQWdJQ0FnSUNrc1hHNGdJQ0FnSUNCa1pXWmhkV3gwVm1Gc2RXVTZJSEoxYm5ScGJXVlBjSFJwYjI1ekxtRnNiRzkzVUhKdmRHOVFjbTl3WlhKMGFXVnpRbmxFWldaaGRXeDBYRzRnSUNBZ2ZTeGNiaUFnSUNCdFpYUm9iMlJ6T2lCN1hHNGdJQ0FnSUNCM2FHbDBaV3hwYzNRNklHTnlaV0YwWlU1bGQweHZiMnQxY0U5aWFtVmpkQ2hjYmlBZ0lDQWdJQ0FnWkdWbVlYVnNkRTFsZEdodlpGZG9hWFJsVEdsemRDeGNiaUFnSUNBZ0lDQWdjblZ1ZEdsdFpVOXdkR2x2Ym5NdVlXeHNiM2RsWkZCeWIzUnZUV1YwYUc5a2MxeHVJQ0FnSUNBZ0tTeGNiaUFnSUNBZ0lHUmxabUYxYkhSV1lXeDFaVG9nY25WdWRHbHRaVTl3ZEdsdmJuTXVZV3hzYjNkUWNtOTBiMDFsZEdodlpITkNlVVJsWm1GMWJIUmNiaUFnSUNCOVhHNGdJSDA3WEc1OVhHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQnlaWE4xYkhSSmMwRnNiRzkzWldRb2NtVnpkV3gwTENCd2NtOTBiMEZqWTJWemMwTnZiblJ5YjJ3c0lIQnliM0JsY25SNVRtRnRaU2tnZTF4dUlDQnBaaUFvZEhsd1pXOW1JSEpsYzNWc2RDQTlQVDBnSjJaMWJtTjBhVzl1SnlrZ2UxeHVJQ0FnSUhKbGRIVnliaUJqYUdWamExZG9hWFJsVEdsemRDaHdjbTkwYjBGalkyVnpjME52Ym5SeWIyd3ViV1YwYUc5a2N5d2djSEp2Y0dWeWRIbE9ZVzFsS1R0Y2JpQWdmU0JsYkhObElIdGNiaUFnSUNCeVpYUjFjbTRnWTJobFkydFhhR2wwWlV4cGMzUW9jSEp2ZEc5QlkyTmxjM05EYjI1MGNtOXNMbkJ5YjNCbGNuUnBaWE1zSUhCeWIzQmxjblI1VG1GdFpTazdYRzRnSUgxY2JuMWNibHh1Wm5WdVkzUnBiMjRnWTJobFkydFhhR2wwWlV4cGMzUW9jSEp2ZEc5QlkyTmxjM05EYjI1MGNtOXNSbTl5Vkhsd1pTd2djSEp2Y0dWeWRIbE9ZVzFsS1NCN1hHNGdJR2xtSUNod2NtOTBiMEZqWTJWemMwTnZiblJ5YjJ4R2IzSlVlWEJsTG5kb2FYUmxiR2x6ZEZ0d2NtOXdaWEowZVU1aGJXVmRJQ0U5UFNCMWJtUmxabWx1WldRcElIdGNiaUFnSUNCeVpYUjFjbTRnY0hKdmRHOUJZMk5sYzNORGIyNTBjbTlzUm05eVZIbHdaUzUzYUdsMFpXeHBjM1JiY0hKdmNHVnlkSGxPWVcxbFhTQTlQVDBnZEhKMVpUdGNiaUFnZlZ4dUlDQnBaaUFvY0hKdmRHOUJZMk5sYzNORGIyNTBjbTlzUm05eVZIbHdaUzVrWldaaGRXeDBWbUZzZFdVZ0lUMDlJSFZ1WkdWbWFXNWxaQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQndjbTkwYjBGalkyVnpjME52Ym5SeWIyeEdiM0pVZVhCbExtUmxabUYxYkhSV1lXeDFaVHRjYmlBZ2ZWeHVJQ0JzYjJkVmJtVjRjR1ZqWldSUWNtOXdaWEowZVVGalkyVnpjMDl1WTJVb2NISnZjR1Z5ZEhsT1lXMWxLVHRjYmlBZ2NtVjBkWEp1SUdaaGJITmxPMXh1ZlZ4dVhHNW1kVzVqZEdsdmJpQnNiMmRWYm1WNGNHVmpaV1JRY205d1pYSjBlVUZqWTJWemMwOXVZMlVvY0hKdmNHVnlkSGxPWVcxbEtTQjdYRzRnSUdsbUlDaHNiMmRuWldSUWNtOXdaWEowYVdWelczQnliM0JsY25SNVRtRnRaVjBnSVQwOUlIUnlkV1VwSUh0Y2JpQWdJQ0JzYjJkblpXUlFjbTl3WlhKMGFXVnpXM0J5YjNCbGNuUjVUbUZ0WlYwZ1BTQjBjblZsTzF4dUlDQWdJR3h2WjJkbGNpNXNiMmNvWEc0Z0lDQWdJQ0FuWlhKeWIzSW5MRnh1SUNBZ0lDQWdZRWhoYm1Sc1pXSmhjbk02SUVGalkyVnpjeUJvWVhNZ1ltVmxiaUJrWlc1cFpXUWdkRzhnY21WemIyeDJaU0IwYUdVZ2NISnZjR1Z5ZEhrZ1hDSWtlM0J5YjNCbGNuUjVUbUZ0WlgxY0lpQmlaV05oZFhObElHbDBJR2x6SUc1dmRDQmhiaUJjSW05M2JpQndjbTl3WlhKMGVWd2lJRzltSUdsMGN5QndZWEpsYm5RdVhGeHVZQ0FyWEc0Z0lDQWdJQ0FnSUdCWmIzVWdZMkZ1SUdGa1pDQmhJSEoxYm5ScGJXVWdiM0IwYVc5dUlIUnZJR1JwYzJGaWJHVWdkR2hsSUdOb1pXTnJJRzl5SUhSb2FYTWdkMkZ5Ym1sdVp6cGNYRzVnSUN0Y2JpQWdJQ0FnSUNBZ1lGTmxaU0JvZEhSd2N6b3ZMMmhoYm1Sc1pXSmhjbk5xY3k1amIyMHZZWEJwTFhKbFptVnlaVzVqWlM5eWRXNTBhVzFsTFc5d2RHbHZibk11YUhSdGJDTnZjSFJwYjI1ekxYUnZMV052Ym5SeWIyd3RjSEp2ZEc5MGVYQmxMV0ZqWTJWemN5Qm1iM0lnWkdWMFlXbHNjMkJjYmlBZ0lDQXBPMXh1SUNCOVhHNTlYRzVjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJ5WlhObGRFeHZaMmRsWkZCeWIzQmxjblJwWlhNb0tTQjdYRzRnSUU5aWFtVmpkQzVyWlhsektHeHZaMmRsWkZCeWIzQmxjblJwWlhNcExtWnZja1ZoWTJnb2NISnZjR1Z5ZEhsT1lXMWxJRDArSUh0Y2JpQWdJQ0JrWld4bGRHVWdiRzluWjJWa1VISnZjR1Z5ZEdsbGMxdHdjbTl3WlhKMGVVNWhiV1ZkTzF4dUlDQjlLVHRjYm4xY2JpSmRmUT09XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuSGFuZGxlYmFyc0Vudmlyb25tZW50ID0gSGFuZGxlYmFyc0Vudmlyb25tZW50O1xuLy8gaXN0YW5idWwgaWdub3JlIG5leHRcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX3V0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgX2V4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG5cbnZhciBfZXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4Y2VwdGlvbik7XG5cbnZhciBfaGVscGVycyA9IHJlcXVpcmUoJy4vaGVscGVycycpO1xuXG52YXIgX2RlY29yYXRvcnMgPSByZXF1aXJlKCcuL2RlY29yYXRvcnMnKTtcblxudmFyIF9sb2dnZXIgPSByZXF1aXJlKCcuL2xvZ2dlcicpO1xuXG52YXIgX2xvZ2dlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9sb2dnZXIpO1xuXG52YXIgX2ludGVybmFsUHJvdG9BY2Nlc3MgPSByZXF1aXJlKCcuL2ludGVybmFsL3Byb3RvLWFjY2VzcycpO1xuXG52YXIgVkVSU0lPTiA9ICc0LjcuOCc7XG5leHBvcnRzLlZFUlNJT04gPSBWRVJTSU9OO1xudmFyIENPTVBJTEVSX1JFVklTSU9OID0gODtcbmV4cG9ydHMuQ09NUElMRVJfUkVWSVNJT04gPSBDT01QSUxFUl9SRVZJU0lPTjtcbnZhciBMQVNUX0NPTVBBVElCTEVfQ09NUElMRVJfUkVWSVNJT04gPSA3O1xuXG5leHBvcnRzLkxBU1RfQ09NUEFUSUJMRV9DT01QSUxFUl9SRVZJU0lPTiA9IExBU1RfQ09NUEFUSUJMRV9DT01QSUxFUl9SRVZJU0lPTjtcbnZhciBSRVZJU0lPTl9DSEFOR0VTID0ge1xuICAxOiAnPD0gMS4wLnJjLjInLCAvLyAxLjAucmMuMiBpcyBhY3R1YWxseSByZXYyIGJ1dCBkb2Vzbid0IHJlcG9ydCBpdFxuICAyOiAnPT0gMS4wLjAtcmMuMycsXG4gIDM6ICc9PSAxLjAuMC1yYy40JyxcbiAgNDogJz09IDEueC54JyxcbiAgNTogJz09IDIuMC4wLWFscGhhLngnLFxuICA2OiAnPj0gMi4wLjAtYmV0YS4xJyxcbiAgNzogJz49IDQuMC4wIDw0LjMuMCcsXG4gIDg6ICc+PSA0LjMuMCdcbn07XG5cbmV4cG9ydHMuUkVWSVNJT05fQ0hBTkdFUyA9IFJFVklTSU9OX0NIQU5HRVM7XG52YXIgb2JqZWN0VHlwZSA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG5mdW5jdGlvbiBIYW5kbGViYXJzRW52aXJvbm1lbnQoaGVscGVycywgcGFydGlhbHMsIGRlY29yYXRvcnMpIHtcbiAgdGhpcy5oZWxwZXJzID0gaGVscGVycyB8fCB7fTtcbiAgdGhpcy5wYXJ0aWFscyA9IHBhcnRpYWxzIHx8IHt9O1xuICB0aGlzLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzIHx8IHt9O1xuXG4gIF9oZWxwZXJzLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7XG4gIF9kZWNvcmF0b3JzLnJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7XG59XG5cbkhhbmRsZWJhcnNFbnZpcm9ubWVudC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBIYW5kbGViYXJzRW52aXJvbm1lbnQsXG5cbiAgbG9nZ2VyOiBfbG9nZ2VyMlsnZGVmYXVsdCddLFxuICBsb2c6IF9sb2dnZXIyWydkZWZhdWx0J10ubG9nLFxuXG4gIHJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiByZWdpc3RlckhlbHBlcihuYW1lLCBmbikge1xuICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTtcbiAgICAgIH1cbiAgICAgIF91dGlscy5leHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbiB1bnJlZ2lzdGVySGVscGVyKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5oZWxwZXJzW25hbWVdO1xuICB9LFxuXG4gIHJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gcmVnaXN0ZXJQYXJ0aWFsKG5hbWUsIHBhcnRpYWwpIHtcbiAgICBpZiAoX3V0aWxzLnRvU3RyaW5nLmNhbGwobmFtZSkgPT09IG9iamVjdFR5cGUpIHtcbiAgICAgIF91dGlscy5leHRlbmQodGhpcy5wYXJ0aWFscywgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgcGFydGlhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ0F0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgYSBwYXJ0aWFsIGNhbGxlZCBcIicgKyBuYW1lICsgJ1wiIGFzIHVuZGVmaW5lZCcpO1xuICAgICAgfVxuICAgICAgdGhpcy5wYXJ0aWFsc1tuYW1lXSA9IHBhcnRpYWw7XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVyUGFydGlhbDogZnVuY3Rpb24gdW5yZWdpc3RlclBhcnRpYWwobmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLnBhcnRpYWxzW25hbWVdO1xuICB9LFxuXG4gIHJlZ2lzdGVyRGVjb3JhdG9yOiBmdW5jdGlvbiByZWdpc3RlckRlY29yYXRvcihuYW1lLCBmbikge1xuICAgIGlmIChfdXRpbHMudG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGRlY29yYXRvcnMnKTtcbiAgICAgIH1cbiAgICAgIF91dGlscy5leHRlbmQodGhpcy5kZWNvcmF0b3JzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWNvcmF0b3JzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVyRGVjb3JhdG9yOiBmdW5jdGlvbiB1bnJlZ2lzdGVyRGVjb3JhdG9yKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5kZWNvcmF0b3JzW25hbWVdO1xuICB9LFxuICAvKipcbiAgICogUmVzZXQgdGhlIG1lbW9yeSBvZiBpbGxlZ2FsIHByb3BlcnR5IGFjY2Vzc2VzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gbG9nZ2VkLlxuICAgKiBAZGVwcmVjYXRlZCBzaG91bGQgb25seSBiZSB1c2VkIGluIGhhbmRsZWJhcnMgdGVzdC1jYXNlc1xuICAgKi9cbiAgcmVzZXRMb2dnZWRQcm9wZXJ0eUFjY2Vzc2VzOiBmdW5jdGlvbiByZXNldExvZ2dlZFByb3BlcnR5QWNjZXNzZXMoKSB7XG4gICAgX2ludGVybmFsUHJvdG9BY2Nlc3MucmVzZXRMb2dnZWRQcm9wZXJ0aWVzKCk7XG4gIH1cbn07XG5cbnZhciBsb2cgPSBfbG9nZ2VyMlsnZGVmYXVsdCddLmxvZztcblxuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmNyZWF0ZUZyYW1lID0gX3V0aWxzLmNyZWF0ZUZyYW1lO1xuZXhwb3J0cy5sb2dnZXIgPSBfbG9nZ2VyMlsnZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1TDJ4cFlpOW9ZVzVrYkdWaVlYSnpMMkpoYzJVdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN2NVSkJRVGhETEZOQlFWTTdPM2xDUVVOcVF5eGhRVUZoT3pzN08zVkNRVU5KTEZkQlFWYzdPekJDUVVOU0xHTkJRV003TzNOQ1FVTnlReXhWUVVGVk96czdPMjFEUVVOVExIbENRVUY1UWpzN1FVRkZlRVFzU1VGQlRTeFBRVUZQTEVkQlFVY3NUMEZCVHl4RFFVRkRPenRCUVVONFFpeEpRVUZOTEdsQ1FVRnBRaXhIUVVGSExFTkJRVU1zUTBGQlF6czdRVUZETlVJc1NVRkJUU3hwUTBGQmFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN096dEJRVVUxUXl4SlFVRk5MR2RDUVVGblFpeEhRVUZITzBGQlF6bENMRWRCUVVNc1JVRkJSU3hoUVVGaE8wRkJRMmhDTEVkQlFVTXNSVUZCUlN4bFFVRmxPMEZCUTJ4Q0xFZEJRVU1zUlVGQlJTeGxRVUZsTzBGQlEyeENMRWRCUVVNc1JVRkJSU3hWUVVGVk8wRkJRMklzUjBGQlF5eEZRVUZGTEd0Q1FVRnJRanRCUVVOeVFpeEhRVUZETEVWQlFVVXNhVUpCUVdsQ08wRkJRM0JDTEVkQlFVTXNSVUZCUlN4cFFrRkJhVUk3UVVGRGNFSXNSMEZCUXl4RlFVRkZMRlZCUVZVN1EwRkRaQ3hEUVVGRE96czdRVUZGUml4SlFVRk5MRlZCUVZVc1IwRkJSeXhwUWtGQmFVSXNRMEZCUXpzN1FVRkZPVUlzVTBGQlV5eHhRa0ZCY1VJc1EwRkJReXhQUVVGUExFVkJRVVVzVVVGQlVTeEZRVUZGTEZWQlFWVXNSVUZCUlR0QlFVTnVSU3hOUVVGSkxFTkJRVU1zVDBGQlR5eEhRVUZITEU5QlFVOHNTVUZCU1N4RlFVRkZMRU5CUVVNN1FVRkROMElzVFVGQlNTeERRVUZETEZGQlFWRXNSMEZCUnl4UlFVRlJMRWxCUVVrc1JVRkJSU3hEUVVGRE8wRkJReTlDTEUxQlFVa3NRMEZCUXl4VlFVRlZMRWRCUVVjc1ZVRkJWU3hKUVVGSkxFVkJRVVVzUTBGQlF6czdRVUZGYmtNc2EwTkJRWFZDTEVsQlFVa3NRMEZCUXl4RFFVRkRPMEZCUXpkQ0xIZERRVUV3UWl4SlFVRkpMRU5CUVVNc1EwRkJRenREUVVOcVF6czdRVUZGUkN4eFFrRkJjVUlzUTBGQlF5eFRRVUZUTEVkQlFVYzdRVUZEYUVNc1lVRkJWeXhGUVVGRkxIRkNRVUZ4UWpzN1FVRkZiRU1zVVVGQlRTeHhRa0ZCVVR0QlFVTmtMRXRCUVVjc1JVRkJSU3h2UWtGQlR5eEhRVUZIT3p0QlFVVm1MR2RDUVVGakxFVkJRVVVzZDBKQlFWTXNTVUZCU1N4RlFVRkZMRVZCUVVVc1JVRkJSVHRCUVVOcVF5eFJRVUZKTEdkQ1FVRlRMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eFZRVUZWTEVWQlFVVTdRVUZEZEVNc1ZVRkJTU3hGUVVGRkxFVkJRVVU3UVVGRFRpeGpRVUZOTERKQ1FVRmpMSGxEUVVGNVF5eERRVUZETEVOQlFVTTdUMEZEYUVVN1FVRkRSQ3h2UWtGQlR5eEpRVUZKTEVOQlFVTXNUMEZCVHl4RlFVRkZMRWxCUVVrc1EwRkJReXhEUVVGRE8wdEJRelZDTEUxQlFVMDdRVUZEVEN4VlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXp0TFFVTjZRanRIUVVOR08wRkJRMFFzYTBKQlFXZENMRVZCUVVVc01FSkJRVk1zU1VGQlNTeEZRVUZGTzBGQlF5OUNMRmRCUVU4c1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXp0SFFVTXpRanM3UVVGRlJDeHBRa0ZCWlN4RlFVRkZMSGxDUVVGVExFbEJRVWtzUlVGQlJTeFBRVUZQTEVWQlFVVTdRVUZEZGtNc1VVRkJTU3huUWtGQlV5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1ZVRkJWU3hGUVVGRk8wRkJRM1JETEc5Q1FVRlBMRWxCUVVrc1EwRkJReXhSUVVGUkxFVkJRVVVzU1VGQlNTeERRVUZETEVOQlFVTTdTMEZETjBJc1RVRkJUVHRCUVVOTUxGVkJRVWtzVDBGQlR5eFBRVUZQTEV0QlFVc3NWMEZCVnl4RlFVRkZPMEZCUTJ4RExHTkJRVTBzZVVWQlEzZERMRWxCUVVrc2IwSkJRMnBFTEVOQlFVTTdUMEZEU0R0QlFVTkVMRlZCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NUMEZCVHl4RFFVRkRPMHRCUXk5Q08wZEJRMFk3UVVGRFJDeHRRa0ZCYVVJc1JVRkJSU3d5UWtGQlV5eEpRVUZKTEVWQlFVVTdRVUZEYUVNc1YwRkJUeXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMGRCUXpWQ096dEJRVVZFTEcxQ1FVRnBRaXhGUVVGRkxESkNRVUZUTEVsQlFVa3NSVUZCUlN4RlFVRkZMRVZCUVVVN1FVRkRjRU1zVVVGQlNTeG5Ra0ZCVXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzVlVGQlZTeEZRVUZGTzBGQlEzUkRMRlZCUVVrc1JVRkJSU3hGUVVGRk8wRkJRMDRzWTBGQlRTd3lRa0ZCWXl3MFEwRkJORU1zUTBGQlF5eERRVUZETzA5QlEyNUZPMEZCUTBRc2IwSkJRVThzU1VGQlNTeERRVUZETEZWQlFWVXNSVUZCUlN4SlFVRkpMRU5CUVVNc1EwRkJRenRMUVVNdlFpeE5RVUZOTzBGQlEwd3NWVUZCU1N4RFFVRkRMRlZCUVZVc1EwRkJReXhKUVVGSkxFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTTdTMEZETlVJN1IwRkRSanRCUVVORUxIRkNRVUZ0UWl4RlFVRkZMRFpDUVVGVExFbEJRVWtzUlVGQlJUdEJRVU5zUXl4WFFVRlBMRWxCUVVrc1EwRkJReXhWUVVGVkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdSMEZET1VJN096czdPMEZCUzBRc05rSkJRVEpDTEVWQlFVRXNkVU5CUVVjN1FVRkROVUlzWjBSQlFYVkNMRU5CUVVNN1IwRkRla0k3UTBGRFJpeERRVUZET3p0QlFVVkxMRWxCUVVrc1IwRkJSeXhIUVVGSExHOUNRVUZQTEVkQlFVY3NRMEZCUXpzN08xRkJSVzVDTEZkQlFWYzdVVUZCUlN4TlFVRk5JaXdpWm1sc1pTSTZJbUpoYzJVdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpwYlhCdmNuUWdleUJqY21WaGRHVkdjbUZ0WlN3Z1pYaDBaVzVrTENCMGIxTjBjbWx1WnlCOUlHWnliMjBnSnk0dmRYUnBiSE1uTzF4dWFXMXdiM0owSUVWNFkyVndkR2x2YmlCbWNtOXRJQ2N1TDJWNFkyVndkR2x2YmljN1hHNXBiWEJ2Y25RZ2V5QnlaV2RwYzNSbGNrUmxabUYxYkhSSVpXeHdaWEp6SUgwZ1puSnZiU0FuTGk5b1pXeHdaWEp6Snp0Y2JtbHRjRzl5ZENCN0lISmxaMmx6ZEdWeVJHVm1ZWFZzZEVSbFkyOXlZWFJ2Y25NZ2ZTQm1jbTl0SUNjdUwyUmxZMjl5WVhSdmNuTW5PMXh1YVcxd2IzSjBJR3h2WjJkbGNpQm1jbTl0SUNjdUwyeHZaMmRsY2ljN1hHNXBiWEJ2Y25RZ2V5QnlaWE5sZEV4dloyZGxaRkJ5YjNCbGNuUnBaWE1nZlNCbWNtOXRJQ2N1TDJsdWRHVnlibUZzTDNCeWIzUnZMV0ZqWTJWemN5YzdYRzVjYm1WNGNHOXlkQ0JqYjI1emRDQldSVkpUU1U5T0lEMGdKelF1Tnk0NEp6dGNibVY0Y0c5eWRDQmpiMjV6ZENCRFQwMVFTVXhGVWw5U1JWWkpVMGxQVGlBOUlEZzdYRzVsZUhCdmNuUWdZMjl1YzNRZ1RFRlRWRjlEVDAxUVFWUkpRa3hGWDBOUFRWQkpURVZTWDFKRlZrbFRTVTlPSUQwZ056dGNibHh1Wlhod2IzSjBJR052Ym5OMElGSkZWa2xUU1U5T1gwTklRVTVIUlZNZ1BTQjdYRzRnSURFNklDYzhQU0F4TGpBdWNtTXVNaWNzSUM4dklERXVNQzV5WXk0eUlHbHpJR0ZqZEhWaGJHeDVJSEpsZGpJZ1luVjBJR1J2WlhOdUozUWdjbVZ3YjNKMElHbDBYRzRnSURJNklDYzlQU0F4TGpBdU1DMXlZeTR6Snl4Y2JpQWdNem9nSnowOUlERXVNQzR3TFhKakxqUW5MRnh1SUNBME9pQW5QVDBnTVM1NExuZ25MRnh1SUNBMU9pQW5QVDBnTWk0d0xqQXRZV3h3YUdFdWVDY3NYRzRnSURZNklDYytQU0F5TGpBdU1DMWlaWFJoTGpFbkxGeHVJQ0EzT2lBblBqMGdOQzR3TGpBZ1BEUXVNeTR3Snl4Y2JpQWdPRG9nSno0OUlEUXVNeTR3SjF4dWZUdGNibHh1WTI5dWMzUWdiMkpxWldOMFZIbHdaU0E5SUNkYmIySnFaV04wSUU5aWFtVmpkRjBuTzF4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z1NHRnVaR3hsWW1GeWMwVnVkbWx5YjI1dFpXNTBLR2hsYkhCbGNuTXNJSEJoY25ScFlXeHpMQ0JrWldOdmNtRjBiM0p6S1NCN1hHNGdJSFJvYVhNdWFHVnNjR1Z5Y3lBOUlHaGxiSEJsY25NZ2ZId2dlMzA3WEc0Z0lIUm9hWE11Y0dGeWRHbGhiSE1nUFNCd1lYSjBhV0ZzY3lCOGZDQjdmVHRjYmlBZ2RHaHBjeTVrWldOdmNtRjBiM0p6SUQwZ1pHVmpiM0poZEc5eWN5QjhmQ0I3ZlR0Y2JseHVJQ0J5WldkcGMzUmxja1JsWm1GMWJIUklaV3h3WlhKektIUm9hWE1wTzF4dUlDQnlaV2RwYzNSbGNrUmxabUYxYkhSRVpXTnZjbUYwYjNKektIUm9hWE1wTzF4dWZWeHVYRzVJWVc1a2JHVmlZWEp6Ulc1MmFYSnZibTFsYm5RdWNISnZkRzkwZVhCbElEMGdlMXh1SUNCamIyNXpkSEoxWTNSdmNqb2dTR0Z1Wkd4bFltRnljMFZ1ZG1seWIyNXRaVzUwTEZ4dVhHNGdJR3h2WjJkbGNqb2diRzluWjJWeUxGeHVJQ0JzYjJjNklHeHZaMmRsY2k1c2IyY3NYRzVjYmlBZ2NtVm5hWE4wWlhKSVpXeHdaWEk2SUdaMWJtTjBhVzl1S0c1aGJXVXNJR1p1S1NCN1hHNGdJQ0FnYVdZZ0tIUnZVM1J5YVc1bkxtTmhiR3dvYm1GdFpTa2dQVDA5SUc5aWFtVmpkRlI1Y0dVcElIdGNiaUFnSUNBZ0lHbG1JQ2htYmlrZ2UxeHVJQ0FnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWGhqWlhCMGFXOXVLQ2RCY21jZ2JtOTBJSE4xY0hCdmNuUmxaQ0IzYVhSb0lHMTFiSFJwY0d4bElHaGxiSEJsY25NbktUdGNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lHVjRkR1Z1WkNoMGFHbHpMbWhsYkhCbGNuTXNJRzVoYldVcE8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0IwYUdsekxtaGxiSEJsY25OYmJtRnRaVjBnUFNCbWJqdGNiaUFnSUNCOVhHNGdJSDBzWEc0Z0lIVnVjbVZuYVhOMFpYSklaV3h3WlhJNklHWjFibU4wYVc5dUtHNWhiV1VwSUh0Y2JpQWdJQ0JrWld4bGRHVWdkR2hwY3k1b1pXeHdaWEp6VzI1aGJXVmRPMXh1SUNCOUxGeHVYRzRnSUhKbFoybHpkR1Z5VUdGeWRHbGhiRG9nWm5WdVkzUnBiMjRvYm1GdFpTd2djR0Z5ZEdsaGJDa2dlMXh1SUNBZ0lHbG1JQ2gwYjFOMGNtbHVaeTVqWVd4c0tHNWhiV1VwSUQwOVBTQnZZbXBsWTNSVWVYQmxLU0I3WEc0Z0lDQWdJQ0JsZUhSbGJtUW9kR2hwY3k1d1lYSjBhV0ZzY3l3Z2JtRnRaU2s3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lHbG1JQ2gwZVhCbGIyWWdjR0Z5ZEdsaGJDQTlQVDBnSjNWdVpHVm1hVzVsWkNjcElIdGNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVY0WTJWd2RHbHZiaWhjYmlBZ0lDQWdJQ0FnSUNCZ1FYUjBaVzF3ZEdsdVp5QjBieUJ5WldkcGMzUmxjaUJoSUhCaGNuUnBZV3dnWTJGc2JHVmtJRndpSkh0dVlXMWxmVndpSUdGeklIVnVaR1ZtYVc1bFpHQmNiaUFnSUNBZ0lDQWdLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJSFJvYVhNdWNHRnlkR2xoYkhOYmJtRnRaVjBnUFNCd1lYSjBhV0ZzTzF4dUlDQWdJSDFjYmlBZ2ZTeGNiaUFnZFc1eVpXZHBjM1JsY2xCaGNuUnBZV3c2SUdaMWJtTjBhVzl1S0c1aGJXVXBJSHRjYmlBZ0lDQmtaV3hsZEdVZ2RHaHBjeTV3WVhKMGFXRnNjMXR1WVcxbFhUdGNiaUFnZlN4Y2JseHVJQ0J5WldkcGMzUmxja1JsWTI5eVlYUnZjam9nWm5WdVkzUnBiMjRvYm1GdFpTd2dabTRwSUh0Y2JpQWdJQ0JwWmlBb2RHOVRkSEpwYm1jdVkyRnNiQ2h1WVcxbEtTQTlQVDBnYjJKcVpXTjBWSGx3WlNrZ2UxeHVJQ0FnSUNBZ2FXWWdLR1p1S1NCN1hHNGdJQ0FnSUNBZ0lIUm9jbTkzSUc1bGR5QkZlR05sY0hScGIyNG9KMEZ5WnlCdWIzUWdjM1Z3Y0c5eWRHVmtJSGRwZEdnZ2JYVnNkR2x3YkdVZ1pHVmpiM0poZEc5eWN5Y3BPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdaWGgwWlc1a0tIUm9hWE11WkdWamIzSmhkRzl5Y3l3Z2JtRnRaU2s3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lIUm9hWE11WkdWamIzSmhkRzl5YzF0dVlXMWxYU0E5SUdadU8xeHVJQ0FnSUgxY2JpQWdmU3hjYmlBZ2RXNXlaV2RwYzNSbGNrUmxZMjl5WVhSdmNqb2dablZ1WTNScGIyNG9ibUZ0WlNrZ2UxeHVJQ0FnSUdSbGJHVjBaU0IwYUdsekxtUmxZMjl5WVhSdmNuTmJibUZ0WlYwN1hHNGdJSDBzWEc0Z0lDOHFLbHh1SUNBZ0tpQlNaWE5sZENCMGFHVWdiV1Z0YjNKNUlHOW1JR2xzYkdWbllXd2djSEp2Y0dWeWRIa2dZV05qWlhOelpYTWdkR2hoZENCb1lYWmxJR0ZzY21WaFpIa2dZbVZsYmlCc2IyZG5aV1F1WEc0Z0lDQXFJRUJrWlhCeVpXTmhkR1ZrSUhOb2IzVnNaQ0J2Ym14NUlHSmxJSFZ6WldRZ2FXNGdhR0Z1Wkd4bFltRnljeUIwWlhOMExXTmhjMlZ6WEc0Z0lDQXFMMXh1SUNCeVpYTmxkRXh2WjJkbFpGQnliM0JsY25SNVFXTmpaWE56WlhNb0tTQjdYRzRnSUNBZ2NtVnpaWFJNYjJkblpXUlFjbTl3WlhKMGFXVnpLQ2s3WEc0Z0lIMWNibjA3WEc1Y2JtVjRjRzl5ZENCc1pYUWdiRzluSUQwZ2JHOW5aMlZ5TG14dlp6dGNibHh1Wlhod2IzSjBJSHNnWTNKbFlYUmxSbkpoYldVc0lHeHZaMmRsY2lCOU8xeHVJbDE5XG4iLAogICAgIi8vIEJ1aWxkIG91dCBvdXIgYmFzaWMgU2FmZVN0cmluZyB0eXBlXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5mdW5jdGlvbiBTYWZlU3RyaW5nKHN0cmluZykge1xuICB0aGlzLnN0cmluZyA9IHN0cmluZztcbn1cblxuU2FmZVN0cmluZy5wcm90b3R5cGUudG9TdHJpbmcgPSBTYWZlU3RyaW5nLnByb3RvdHlwZS50b0hUTUwgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAnJyArIHRoaXMuc3RyaW5nO1xufTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gU2FmZVN0cmluZztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMeTR1TDJ4cFlpOW9ZVzVrYkdWaVlYSnpMM05oWm1VdGMzUnlhVzVuTG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lJN096czdRVUZEUVN4VFFVRlRMRlZCUVZVc1EwRkJReXhOUVVGTkxFVkJRVVU3UVVGRE1VSXNUVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhOUVVGTkxFTkJRVU03UTBGRGRFSTdPMEZCUlVRc1ZVRkJWU3hEUVVGRExGTkJRVk1zUTBGQlF5eFJRVUZSTEVkQlFVY3NWVUZCVlN4RFFVRkRMRk5CUVZNc1EwRkJReXhOUVVGTkxFZEJRVWNzV1VGQlZ6dEJRVU4yUlN4VFFVRlBMRVZCUVVVc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETzBOQlEzcENMRU5CUVVNN08zRkNRVVZoTEZWQlFWVWlMQ0ptYVd4bElqb2ljMkZtWlMxemRISnBibWN1YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SXZMeUJDZFdsc1pDQnZkWFFnYjNWeUlHSmhjMmxqSUZOaFptVlRkSEpwYm1jZ2RIbHdaVnh1Wm5WdVkzUnBiMjRnVTJGbVpWTjBjbWx1WnloemRISnBibWNwSUh0Y2JpQWdkR2hwY3k1emRISnBibWNnUFNCemRISnBibWM3WEc1OVhHNWNibE5oWm1WVGRISnBibWN1Y0hKdmRHOTBlWEJsTG5SdlUzUnlhVzVuSUQwZ1UyRm1aVk4wY21sdVp5NXdjbTkwYjNSNWNHVXVkRzlJVkUxTUlEMGdablZ1WTNScGIyNG9LU0I3WEc0Z0lISmxkSFZ5YmlBbkp5QXJJSFJvYVhNdWMzUnlhVzVuTzF4dWZUdGNibHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdVMkZtWlZOMGNtbHVaenRjYmlKZGZRPT1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy53cmFwSGVscGVyID0gd3JhcEhlbHBlcjtcblxuZnVuY3Rpb24gd3JhcEhlbHBlcihoZWxwZXIsIHRyYW5zZm9ybU9wdGlvbnNGbikge1xuICBpZiAodHlwZW9mIGhlbHBlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBhcHBhcmVudGx5IGl0IGRvZXMgaW4gaHR0cHM6Ly9naXRodWIuY29tL3d5Y2F0cy9oYW5kbGViYXJzLmpzL2lzc3Vlcy8xNjM5XG4gICAgLy8gV2UgdHJ5IHRvIG1ha2UgdGhlIHdyYXBwZXIgbGVhc3QtaW52YXNpdmUgYnkgbm90IHdyYXBwaW5nIGl0LCBpZiB0aGUgaGVscGVyIGlzIG5vdCBhIGZ1bmN0aW9uLlxuICAgIHJldHVybiBoZWxwZXI7XG4gIH1cbiAgdmFyIHdyYXBwZXIgPSBmdW5jdGlvbiB3cmFwcGVyKCkgLyogZHluYW1pYyBhcmd1bWVudHMgKi97XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdO1xuICAgIGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0gPSB0cmFuc2Zvcm1PcHRpb25zRm4ob3B0aW9ucyk7XG4gICAgcmV0dXJuIGhlbHBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xuICByZXR1cm4gd3JhcHBlcjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1THk0dUx5NHVMMnhwWWk5b1lXNWtiR1ZpWVhKekwybHVkR1Z5Ym1Gc0wzZHlZWEJJWld4d1pYSXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanM3T3pzN1FVRkJUeXhUUVVGVExGVkJRVlVzUTBGQlF5eE5RVUZOTEVWQlFVVXNhMEpCUVd0Q0xFVkJRVVU3UVVGRGNrUXNUVUZCU1N4UFFVRlBMRTFCUVUwc1MwRkJTeXhWUVVGVkxFVkJRVVU3T3p0QlFVZG9ReXhYUVVGUExFMUJRVTBzUTBGQlF6dEhRVU5tTzBGQlEwUXNUVUZCU1N4UFFVRlBMRWRCUVVjc1UwRkJWaXhQUVVGUExEQkNRVUZ4UXp0QlFVTTVReXhSUVVGTkxFOUJRVThzUjBGQlJ5eFRRVUZUTEVOQlFVTXNVMEZCVXl4RFFVRkRMRTFCUVUwc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU5vUkN4aFFVRlRMRU5CUVVNc1UwRkJVeXhEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEVOQlFVTXNSMEZCUnl4clFrRkJhMElzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0QlFVTTVSQ3hYUVVGUExFMUJRVTBzUTBGQlF5eExRVUZMTEVOQlFVTXNTVUZCU1N4RlFVRkZMRk5CUVZNc1EwRkJReXhEUVVGRE8wZEJRM1JETEVOQlFVTTdRVUZEUml4VFFVRlBMRTlCUVU4c1EwRkJRenREUVVOb1FpSXNJbVpwYkdVaU9pSjNjbUZ3U0dWc2NHVnlMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaVpYaHdiM0owSUdaMWJtTjBhVzl1SUhkeVlYQklaV3h3WlhJb2FHVnNjR1Z5TENCMGNtRnVjMlp2Y20xUGNIUnBiMjV6Um00cElIdGNiaUFnYVdZZ0tIUjVjR1Z2WmlCb1pXeHdaWElnSVQwOUlDZG1kVzVqZEdsdmJpY3BJSHRjYmlBZ0lDQXZMeUJVYUdseklITm9iM1ZzWkNCdWIzUWdhR0Z3Y0dWdUxDQmlkWFFnWVhCd1lYSmxiblJzZVNCcGRDQmtiMlZ6SUdsdUlHaDBkSEJ6T2k4dloybDBhSFZpTG1OdmJTOTNlV05oZEhNdmFHRnVaR3hsWW1GeWN5NXFjeTlwYzNOMVpYTXZNVFl6T1Z4dUlDQWdJQzh2SUZkbElIUnllU0IwYnlCdFlXdGxJSFJvWlNCM2NtRndjR1Z5SUd4bFlYTjBMV2x1ZG1GemFYWmxJR0o1SUc1dmRDQjNjbUZ3Y0dsdVp5QnBkQ3dnYVdZZ2RHaGxJR2hsYkhCbGNpQnBjeUJ1YjNRZ1lTQm1kVzVqZEdsdmJpNWNiaUFnSUNCeVpYUjFjbTRnYUdWc2NHVnlPMXh1SUNCOVhHNGdJR3hsZENCM2NtRndjR1Z5SUQwZ1puVnVZM1JwYjI0b0x5b2daSGx1WVcxcFl5QmhjbWQxYldWdWRITWdLaThwSUh0Y2JpQWdJQ0JqYjI1emRDQnZjSFJwYjI1eklEMGdZWEpuZFcxbGJuUnpXMkZ5WjNWdFpXNTBjeTVzWlc1bmRHZ2dMU0F4WFR0Y2JpQWdJQ0JoY21kMWJXVnVkSE5iWVhKbmRXMWxiblJ6TG14bGJtZDBhQ0F0SURGZElEMGdkSEpoYm5ObWIzSnRUM0IwYVc5dWMwWnVLRzl3ZEdsdmJuTXBPMXh1SUNBZ0lISmxkSFZ5YmlCb1pXeHdaWEl1WVhCd2JIa29kR2hwY3l3Z1lYSm5kVzFsYm5SektUdGNiaUFnZlR0Y2JpQWdjbVYwZFhKdUlIZHlZWEJ3WlhJN1hHNTlYRzRpWFgwPVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmNoZWNrUmV2aXNpb24gPSBjaGVja1JldmlzaW9uO1xuZXhwb3J0cy50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuZXhwb3J0cy53cmFwUHJvZ3JhbSA9IHdyYXBQcm9ncmFtO1xuZXhwb3J0cy5yZXNvbHZlUGFydGlhbCA9IHJlc29sdmVQYXJ0aWFsO1xuZXhwb3J0cy5pbnZva2VQYXJ0aWFsID0gaW52b2tlUGFydGlhbDtcbmV4cG9ydHMubm9vcCA9IG5vb3A7XG4vLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbi8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gZWxzZSB7IHZhciBuZXdPYmogPSB7fTsgaWYgKG9iaiAhPSBudWxsKSB7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSBuZXdPYmpbJ2RlZmF1bHQnXSA9IG9iajsgcmV0dXJuIG5ld09iajsgfSB9XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF91dGlscyk7XG5cbnZhciBfZXhjZXB0aW9uID0gcmVxdWlyZSgnLi9leGNlcHRpb24nKTtcblxudmFyIF9leGNlcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXhjZXB0aW9uKTtcblxudmFyIF9iYXNlID0gcmVxdWlyZSgnLi9iYXNlJyk7XG5cbnZhciBfaGVscGVycyA9IHJlcXVpcmUoJy4vaGVscGVycycpO1xuXG52YXIgX2ludGVybmFsV3JhcEhlbHBlciA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvd3JhcEhlbHBlcicpO1xuXG52YXIgX2ludGVybmFsUHJvdG9BY2Nlc3MgPSByZXF1aXJlKCcuL2ludGVybmFsL3Byb3RvLWFjY2VzcycpO1xuXG5mdW5jdGlvbiBjaGVja1JldmlzaW9uKGNvbXBpbGVySW5mbykge1xuICB2YXIgY29tcGlsZXJSZXZpc2lvbiA9IGNvbXBpbGVySW5mbyAmJiBjb21waWxlckluZm9bMF0gfHwgMSxcbiAgICAgIGN1cnJlbnRSZXZpc2lvbiA9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OO1xuXG4gIGlmIChjb21waWxlclJldmlzaW9uID49IF9iYXNlLkxBU1RfQ09NUEFUSUJMRV9DT01QSUxFUl9SRVZJU0lPTiAmJiBjb21waWxlclJldmlzaW9uIDw9IF9iYXNlLkNPTVBJTEVSX1JFVklTSU9OKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBfYmFzZS5MQVNUX0NPTVBBVElCTEVfQ09NUElMRVJfUkVWSVNJT04pIHtcbiAgICB2YXIgcnVudGltZVZlcnNpb25zID0gX2Jhc2UuUkVWSVNJT05fQ0hBTkdFU1tjdXJyZW50UmV2aXNpb25dLFxuICAgICAgICBjb21waWxlclZlcnNpb25zID0gX2Jhc2UuUkVWSVNJT05fQ0hBTkdFU1tjb21waWxlclJldmlzaW9uXTtcbiAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpO1xuICB9IGVsc2Uge1xuICAgIC8vIFVzZSB0aGUgZW1iZWRkZWQgdmVyc2lvbiBpbmZvIHNpbmNlIHRoZSBydW50aW1lIGRvZXNuJ3Qga25vdyBhYm91dCB0aGlzIHJldmlzaW9uIHlldFxuICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgKyAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKCFlbnYpIHtcbiAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnTm8gZW52aXJvbm1lbnQgcGFzc2VkIHRvIHRlbXBsYXRlJyk7XG4gIH1cbiAgaWYgKCF0ZW1wbGF0ZVNwZWMgfHwgIXRlbXBsYXRlU3BlYy5tYWluKSB7XG4gICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7XG4gIH1cblxuICB0ZW1wbGF0ZVNwZWMubWFpbi5kZWNvcmF0b3IgPSB0ZW1wbGF0ZVNwZWMubWFpbl9kO1xuXG4gIC8vIE5vdGU6IFVzaW5nIGVudi5WTSByZWZlcmVuY2VzIHJhdGhlciB0aGFuIGxvY2FsIHZhciByZWZlcmVuY2VzIHRocm91Z2hvdXQgdGhpcyBzZWN0aW9uIHRvIGFsbG93XG4gIC8vIGZvciBleHRlcm5hbCB1c2VycyB0byBvdmVycmlkZSB0aGVzZSBhcyBwc2V1ZG8tc3VwcG9ydGVkIEFQSXMuXG4gIGVudi5WTS5jaGVja1JldmlzaW9uKHRlbXBsYXRlU3BlYy5jb21waWxlcik7XG5cbiAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHByZWNvbXBpbGVkIHRlbXBsYXRlcyB3aXRoIGNvbXBpbGVyLXZlcnNpb24gNyAoPDQuMy4wKVxuICB2YXIgdGVtcGxhdGVXYXNQcmVjb21waWxlZFdpdGhDb21waWxlclY3ID0gdGVtcGxhdGVTcGVjLmNvbXBpbGVyICYmIHRlbXBsYXRlU3BlYy5jb21waWxlclswXSA9PT0gNztcblxuICBmdW5jdGlvbiBpbnZva2VQYXJ0aWFsV3JhcHBlcihwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuaGFzaCkge1xuICAgICAgY29udGV4dCA9IFV0aWxzLmV4dGVuZCh7fSwgY29udGV4dCwgb3B0aW9ucy5oYXNoKTtcbiAgICAgIGlmIChvcHRpb25zLmlkcykge1xuICAgICAgICBvcHRpb25zLmlkc1swXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHBhcnRpYWwgPSBlbnYuVk0ucmVzb2x2ZVBhcnRpYWwuY2FsbCh0aGlzLCBwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKTtcblxuICAgIHZhciBleHRlbmRlZE9wdGlvbnMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICAgIGhvb2tzOiB0aGlzLmhvb2tzLFxuICAgICAgcHJvdG9BY2Nlc3NDb250cm9sOiB0aGlzLnByb3RvQWNjZXNzQ29udHJvbFxuICAgIH0pO1xuXG4gICAgdmFyIHJlc3VsdCA9IGVudi5WTS5pbnZva2VQYXJ0aWFsLmNhbGwodGhpcywgcGFydGlhbCwgY29udGV4dCwgZXh0ZW5kZWRPcHRpb25zKTtcblxuICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiBlbnYuY29tcGlsZSkge1xuICAgICAgb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdID0gZW52LmNvbXBpbGUocGFydGlhbCwgdGVtcGxhdGVTcGVjLmNvbXBpbGVyT3B0aW9ucywgZW52KTtcbiAgICAgIHJlc3VsdCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXShjb250ZXh0LCBleHRlbmRlZE9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgIGlmIChvcHRpb25zLmluZGVudCkge1xuICAgICAgICB2YXIgbGluZXMgPSByZXN1bHQuc3BsaXQoJ1xcbicpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGxpbmVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGlmICghbGluZXNbaV0gJiYgaSArIDEgPT09IGwpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxpbmVzW2ldID0gb3B0aW9ucy5pbmRlbnQgKyBsaW5lc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSBsaW5lcy5qb2luKCdcXG4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgY29tcGlsZWQgd2hlbiBydW5uaW5nIGluIHJ1bnRpbWUtb25seSBtb2RlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gSnVzdCBhZGQgd2F0ZXJcbiAgdmFyIGNvbnRhaW5lciA9IHtcbiAgICBzdHJpY3Q6IGZ1bmN0aW9uIHN0cmljdChvYmosIG5hbWUsIGxvYykge1xuICAgICAgaWYgKCFvYmogfHwgIShuYW1lIGluIG9iaikpIHtcbiAgICAgICAgdGhyb3cgbmV3IF9leGNlcHRpb24yWydkZWZhdWx0J10oJ1wiJyArIG5hbWUgKyAnXCIgbm90IGRlZmluZWQgaW4gJyArIG9iaiwge1xuICAgICAgICAgIGxvYzogbG9jXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRhaW5lci5sb29rdXBQcm9wZXJ0eShvYmosIG5hbWUpO1xuICAgIH0sXG4gICAgbG9va3VwUHJvcGVydHk6IGZ1bmN0aW9uIGxvb2t1cFByb3BlcnR5KHBhcmVudCwgcHJvcGVydHlOYW1lKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gcGFyZW50W3Byb3BlcnR5TmFtZV07XG4gICAgICBpZiAocmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGFyZW50LCBwcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChfaW50ZXJuYWxQcm90b0FjY2Vzcy5yZXN1bHRJc0FsbG93ZWQocmVzdWx0LCBjb250YWluZXIucHJvdG9BY2Nlc3NDb250cm9sLCBwcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgbG9va3VwOiBmdW5jdGlvbiBsb29rdXAoZGVwdGhzLCBuYW1lKSB7XG4gICAgICB2YXIgbGVuID0gZGVwdGhzLmxlbmd0aDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGRlcHRoc1tpXSAmJiBjb250YWluZXIubG9va3VwUHJvcGVydHkoZGVwdGhzW2ldLCBuYW1lKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGRlcHRoc1tpXVtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbGFtYmRhOiBmdW5jdGlvbiBsYW1iZGEoY3VycmVudCwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBjdXJyZW50ID09PSAnZnVuY3Rpb24nID8gY3VycmVudC5jYWxsKGNvbnRleHQpIDogY3VycmVudDtcbiAgICB9LFxuXG4gICAgZXNjYXBlRXhwcmVzc2lvbjogVXRpbHMuZXNjYXBlRXhwcmVzc2lvbixcbiAgICBpbnZva2VQYXJ0aWFsOiBpbnZva2VQYXJ0aWFsV3JhcHBlcixcblxuICAgIGZuOiBmdW5jdGlvbiBmbihpKSB7XG4gICAgICB2YXIgcmV0ID0gdGVtcGxhdGVTcGVjW2ldO1xuICAgICAgcmV0LmRlY29yYXRvciA9IHRlbXBsYXRlU3BlY1tpICsgJ19kJ107XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0sXG5cbiAgICBwcm9ncmFtczogW10sXG4gICAgcHJvZ3JhbTogZnVuY3Rpb24gcHJvZ3JhbShpLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gICAgICB2YXIgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldLFxuICAgICAgICAgIGZuID0gdGhpcy5mbihpKTtcbiAgICAgIGlmIChkYXRhIHx8IGRlcHRocyB8fCBibG9ja1BhcmFtcyB8fCBkZWNsYXJlZEJsb2NrUGFyYW1zKSB7XG4gICAgICAgIHByb2dyYW1XcmFwcGVyID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4sIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgICAgfSBlbHNlIGlmICghcHJvZ3JhbVdyYXBwZXIpIHtcbiAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2dyYW1XcmFwcGVyO1xuICAgIH0sXG5cbiAgICBkYXRhOiBmdW5jdGlvbiBkYXRhKHZhbHVlLCBkZXB0aCkge1xuICAgICAgd2hpbGUgKHZhbHVlICYmIGRlcHRoLS0pIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5fcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgbWVyZ2VJZk5lZWRlZDogZnVuY3Rpb24gbWVyZ2VJZk5lZWRlZChwYXJhbSwgY29tbW9uKSB7XG4gICAgICB2YXIgb2JqID0gcGFyYW0gfHwgY29tbW9uO1xuXG4gICAgICBpZiAocGFyYW0gJiYgY29tbW9uICYmIHBhcmFtICE9PSBjb21tb24pIHtcbiAgICAgICAgb2JqID0gVXRpbHMuZXh0ZW5kKHt9LCBjb21tb24sIHBhcmFtKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuICAgIC8vIEFuIGVtcHR5IG9iamVjdCB0byB1c2UgYXMgcmVwbGFjZW1lbnQgZm9yIG51bGwtY29udGV4dHNcbiAgICBudWxsQ29udGV4dDogT2JqZWN0LnNlYWwoe30pLFxuXG4gICAgbm9vcDogZW52LlZNLm5vb3AsXG4gICAgY29tcGlsZXJJbmZvOiB0ZW1wbGF0ZVNwZWMuY29tcGlsZXJcbiAgfTtcblxuICBmdW5jdGlvbiByZXQoY29udGV4dCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07XG5cbiAgICB2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YTtcblxuICAgIHJldC5fc2V0dXAob3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHtcbiAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTtcbiAgICB9XG4gICAgdmFyIGRlcHRocyA9IHVuZGVmaW5lZCxcbiAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykge1xuICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7XG4gICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT0gb3B0aW9ucy5kZXB0aHNbMF0gPyBbY29udGV4dF0uY29uY2F0KG9wdGlvbnMuZGVwdGhzKSA6IG9wdGlvbnMuZGVwdGhzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVwdGhzID0gW2NvbnRleHRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1haW4oY29udGV4dCAvKiwgb3B0aW9ucyovKSB7XG4gICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgIH1cblxuICAgIG1haW4gPSBleGVjdXRlRGVjb3JhdG9ycyh0ZW1wbGF0ZVNwZWMubWFpbiwgbWFpbiwgY29udGFpbmVyLCBvcHRpb25zLmRlcHRocyB8fCBbXSwgZGF0YSwgYmxvY2tQYXJhbXMpO1xuICAgIHJldHVybiBtYWluKGNvbnRleHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcmV0LmlzVG9wID0gdHJ1ZTtcblxuICByZXQuX3NldHVwID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMucGFydGlhbCkge1xuICAgICAgdmFyIG1lcmdlZEhlbHBlcnMgPSBVdGlscy5leHRlbmQoe30sIGVudi5oZWxwZXJzLCBvcHRpb25zLmhlbHBlcnMpO1xuICAgICAgd3JhcEhlbHBlcnNUb1Bhc3NMb29rdXBQcm9wZXJ0eShtZXJnZWRIZWxwZXJzLCBjb250YWluZXIpO1xuICAgICAgY29udGFpbmVyLmhlbHBlcnMgPSBtZXJnZWRIZWxwZXJzO1xuXG4gICAgICBpZiAodGVtcGxhdGVTcGVjLnVzZVBhcnRpYWwpIHtcbiAgICAgICAgLy8gVXNlIG1lcmdlSWZOZWVkZWQgaGVyZSB0byBwcmV2ZW50IGNvbXBpbGluZyBnbG9iYWwgcGFydGlhbHMgbXVsdGlwbGUgdGltZXNcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gY29udGFpbmVyLm1lcmdlSWZOZWVkZWQob3B0aW9ucy5wYXJ0aWFscywgZW52LnBhcnRpYWxzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlUGFydGlhbCB8fCB0ZW1wbGF0ZVNwZWMudXNlRGVjb3JhdG9ycykge1xuICAgICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IFV0aWxzLmV4dGVuZCh7fSwgZW52LmRlY29yYXRvcnMsIG9wdGlvbnMuZGVjb3JhdG9ycyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRhaW5lci5ob29rcyA9IHt9O1xuICAgICAgY29udGFpbmVyLnByb3RvQWNjZXNzQ29udHJvbCA9IF9pbnRlcm5hbFByb3RvQWNjZXNzLmNyZWF0ZVByb3RvQWNjZXNzQ29udHJvbChvcHRpb25zKTtcblxuICAgICAgdmFyIGtlZXBIZWxwZXJJbkhlbHBlcnMgPSBvcHRpb25zLmFsbG93Q2FsbHNUb0hlbHBlck1pc3NpbmcgfHwgdGVtcGxhdGVXYXNQcmVjb21waWxlZFdpdGhDb21waWxlclY3O1xuICAgICAgX2hlbHBlcnMubW92ZUhlbHBlclRvSG9va3MoY29udGFpbmVyLCAnaGVscGVyTWlzc2luZycsIGtlZXBIZWxwZXJJbkhlbHBlcnMpO1xuICAgICAgX2hlbHBlcnMubW92ZUhlbHBlclRvSG9va3MoY29udGFpbmVyLCAnYmxvY2tIZWxwZXJNaXNzaW5nJywga2VlcEhlbHBlckluSGVscGVycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5wcm90b0FjY2Vzc0NvbnRyb2wgPSBvcHRpb25zLnByb3RvQWNjZXNzQ29udHJvbDsgLy8gaW50ZXJuYWwgb3B0aW9uXG4gICAgICBjb250YWluZXIuaGVscGVycyA9IG9wdGlvbnMuaGVscGVycztcbiAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IG9wdGlvbnMucGFydGlhbHM7XG4gICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IG9wdGlvbnMuZGVjb3JhdG9ycztcbiAgICAgIGNvbnRhaW5lci5ob29rcyA9IG9wdGlvbnMuaG9va3M7XG4gICAgfVxuICB9O1xuXG4gIHJldC5fY2hpbGQgPSBmdW5jdGlvbiAoaSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocykge1xuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgJiYgIWJsb2NrUGFyYW1zKSB7XG4gICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnbXVzdCBwYXNzIGJsb2NrIHBhcmFtcycpO1xuICAgIH1cbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocyAmJiAhZGVwdGhzKSB7XG4gICAgICB0aHJvdyBuZXcgX2V4Y2VwdGlvbjJbJ2RlZmF1bHQnXSgnbXVzdCBwYXNzIHBhcmVudCBkZXB0aHMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcFByb2dyYW0oY29udGFpbmVyLCBpLCB0ZW1wbGF0ZVNwZWNbaV0sIGRhdGEsIDAsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICB9O1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gIGZ1bmN0aW9uIHByb2coY29udGV4dCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07XG5cbiAgICB2YXIgY3VycmVudERlcHRocyA9IGRlcHRocztcbiAgICBpZiAoZGVwdGhzICYmIGNvbnRleHQgIT0gZGVwdGhzWzBdICYmICEoY29udGV4dCA9PT0gY29udGFpbmVyLm51bGxDb250ZXh0ICYmIGRlcHRoc1swXSA9PT0gbnVsbCkpIHtcbiAgICAgIGN1cnJlbnREZXB0aHMgPSBbY29udGV4dF0uY29uY2F0KGRlcHRocyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZuKGNvbnRhaW5lciwgY29udGV4dCwgY29udGFpbmVyLmhlbHBlcnMsIGNvbnRhaW5lci5wYXJ0aWFscywgb3B0aW9ucy5kYXRhIHx8IGRhdGEsIGJsb2NrUGFyYW1zICYmIFtvcHRpb25zLmJsb2NrUGFyYW1zXS5jb25jYXQoYmxvY2tQYXJhbXMpLCBjdXJyZW50RGVwdGhzKTtcbiAgfVxuXG4gIHByb2cgPSBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKTtcblxuICBwcm9nLnByb2dyYW0gPSBpO1xuICBwcm9nLmRlcHRoID0gZGVwdGhzID8gZGVwdGhzLmxlbmd0aCA6IDA7XG4gIHByb2cuYmxvY2tQYXJhbXMgPSBkZWNsYXJlZEJsb2NrUGFyYW1zIHx8IDA7XG4gIHJldHVybiBwcm9nO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgY3VycmVudGx5IHBhcnQgb2YgdGhlIG9mZmljaWFsIEFQSSwgdGhlcmVmb3JlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkLlxuICovXG5cbmZ1bmN0aW9uIHJlc29sdmVQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgaWYgKCFwYXJ0aWFsKSB7XG4gICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gJ0BwYXJ0aWFsLWJsb2NrJykge1xuICAgICAgcGFydGlhbCA9IG9wdGlvbnMuZGF0YVsncGFydGlhbC1ibG9jayddO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdO1xuICAgIH1cbiAgfSBlbHNlIGlmICghcGFydGlhbC5jYWxsICYmICFvcHRpb25zLm5hbWUpIHtcbiAgICAvLyBUaGlzIGlzIGEgZHluYW1pYyBwYXJ0aWFsIHRoYXQgcmV0dXJuZWQgYSBzdHJpbmdcbiAgICBvcHRpb25zLm5hbWUgPSBwYXJ0aWFsO1xuICAgIHBhcnRpYWwgPSBvcHRpb25zLnBhcnRpYWxzW3BhcnRpYWxdO1xuICB9XG4gIHJldHVybiBwYXJ0aWFsO1xufVxuXG5mdW5jdGlvbiBpbnZva2VQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgLy8gVXNlIHRoZSBjdXJyZW50IGNsb3N1cmUgY29udGV4dCB0byBzYXZlIHRoZSBwYXJ0aWFsLWJsb2NrIGlmIHRoaXMgcGFydGlhbFxuICB2YXIgY3VycmVudFBhcnRpYWxCbG9jayA9IG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTtcbiAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoO1xuICB9XG5cbiAgdmFyIHBhcnRpYWxCbG9jayA9IHVuZGVmaW5lZDtcbiAgaWYgKG9wdGlvbnMuZm4gJiYgb3B0aW9ucy5mbiAhPT0gbm9vcCkge1xuICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICBvcHRpb25zLmRhdGEgPSBfYmFzZS5jcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgLy8gV3JhcHBlciBmdW5jdGlvbiB0byBnZXQgYWNjZXNzIHRvIGN1cnJlbnRQYXJ0aWFsQmxvY2sgZnJvbSB0aGUgY2xvc3VyZVxuICAgICAgdmFyIGZuID0gb3B0aW9ucy5mbjtcbiAgICAgIHBhcnRpYWxCbG9jayA9IG9wdGlvbnMuZGF0YVsncGFydGlhbC1ibG9jayddID0gZnVuY3Rpb24gcGFydGlhbEJsb2NrV3JhcHBlcihjb250ZXh0KSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxIHx8IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMV07XG5cbiAgICAgICAgLy8gUmVzdG9yZSB0aGUgcGFydGlhbC1ibG9jayBmcm9tIHRoZSBjbG9zdXJlIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9ja1xuICAgICAgICAvLyBpLmUuIHRoZSBwYXJ0IGluc2lkZSB0aGUgYmxvY2sgb2YgdGhlIHBhcnRpYWwgY2FsbC5cbiAgICAgICAgb3B0aW9ucy5kYXRhID0gX2Jhc2UuY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgb3B0aW9ucy5kYXRhWydwYXJ0aWFsLWJsb2NrJ10gPSBjdXJyZW50UGFydGlhbEJsb2NrO1xuICAgICAgICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgICB9O1xuICAgICAgaWYgKGZuLnBhcnRpYWxzKSB7XG4gICAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIGZuLnBhcnRpYWxzKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgaWYgKHBhcnRpYWwgPT09IHVuZGVmaW5lZCAmJiBwYXJ0aWFsQmxvY2spIHtcbiAgICBwYXJ0aWFsID0gcGFydGlhbEJsb2NrO1xuICB9XG5cbiAgaWYgKHBhcnRpYWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBfZXhjZXB0aW9uMlsnZGVmYXVsdCddKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgZm91bmQnKTtcbiAgfSBlbHNlIGlmIChwYXJ0aWFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gcGFydGlhbChjb250ZXh0LCBvcHRpb25zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub29wKCkge1xuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGluaXREYXRhKGNvbnRleHQsIGRhdGEpIHtcbiAgaWYgKCFkYXRhIHx8ICEoJ3Jvb3QnIGluIGRhdGEpKSB7XG4gICAgZGF0YSA9IGRhdGEgPyBfYmFzZS5jcmVhdGVGcmFtZShkYXRhKSA6IHt9O1xuICAgIGRhdGEucm9vdCA9IGNvbnRleHQ7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpIHtcbiAgaWYgKGZuLmRlY29yYXRvcikge1xuICAgIHZhciBwcm9wcyA9IHt9O1xuICAgIHByb2cgPSBmbi5kZWNvcmF0b3IocHJvZywgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGhzICYmIGRlcHRoc1swXSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gICAgVXRpbHMuZXh0ZW5kKHByb2csIHByb3BzKTtcbiAgfVxuICByZXR1cm4gcHJvZztcbn1cblxuZnVuY3Rpb24gd3JhcEhlbHBlcnNUb1Bhc3NMb29rdXBQcm9wZXJ0eShtZXJnZWRIZWxwZXJzLCBjb250YWluZXIpIHtcbiAgT2JqZWN0LmtleXMobWVyZ2VkSGVscGVycykuZm9yRWFjaChmdW5jdGlvbiAoaGVscGVyTmFtZSkge1xuICAgIHZhciBoZWxwZXIgPSBtZXJnZWRIZWxwZXJzW2hlbHBlck5hbWVdO1xuICAgIG1lcmdlZEhlbHBlcnNbaGVscGVyTmFtZV0gPSBwYXNzTG9va3VwUHJvcGVydHlPcHRpb24oaGVscGVyLCBjb250YWluZXIpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFzc0xvb2t1cFByb3BlcnR5T3B0aW9uKGhlbHBlciwgY29udGFpbmVyKSB7XG4gIHZhciBsb29rdXBQcm9wZXJ0eSA9IGNvbnRhaW5lci5sb29rdXBQcm9wZXJ0eTtcbiAgcmV0dXJuIF9pbnRlcm5hbFdyYXBIZWxwZXIud3JhcEhlbHBlcihoZWxwZXIsIGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgcmV0dXJuIFV0aWxzLmV4dGVuZCh7IGxvb2t1cFByb3BlcnR5OiBsb29rdXBQcm9wZXJ0eSB9LCBvcHRpb25zKTtcbiAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx5NHVMMnhwWWk5b1lXNWtiR1ZpWVhKekwzSjFiblJwYldVdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN096czdPenM3T3pzN2NVSkJRWFZDTEZOQlFWTTdPMGxCUVhCQ0xFdEJRVXM3TzNsQ1FVTkxMR0ZCUVdFN096czdiMEpCVFRWQ0xGRkJRVkU3TzNWQ1FVTnRRaXhYUVVGWE96dHJRMEZEYkVJc2RVSkJRWFZDT3p0dFEwRkpNME1zZVVKQlFYbENPenRCUVVWNlFpeFRRVUZUTEdGQlFXRXNRMEZCUXl4WlFVRlpMRVZCUVVVN1FVRkRNVU1zVFVGQlRTeG5Ra0ZCWjBJc1IwRkJSeXhCUVVGRExGbEJRVmtzU1VGQlNTeFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWxCUVVzc1EwRkJRenROUVVNM1JDeGxRVUZsTERCQ1FVRnZRaXhEUVVGRE96dEJRVVYwUXl4TlFVTkZMR2RDUVVGblFpd3lRMEZCY1VNc1NVRkRja1FzWjBKQlFXZENMREpDUVVGeFFpeEZRVU55UXp0QlFVTkJMRmRCUVU4N1IwRkRVanM3UVVGRlJDeE5RVUZKTEdkQ1FVRm5RaXd3UTBGQmIwTXNSVUZCUlR0QlFVTjRSQ3hSUVVGTkxHVkJRV1VzUjBGQlJ5eDFRa0ZCYVVJc1pVRkJaU3hEUVVGRE8xRkJRM1pFTEdkQ1FVRm5RaXhIUVVGSExIVkNRVUZwUWl4blFrRkJaMElzUTBGQlF5eERRVUZETzBGQlEzaEVMRlZCUVUwc01rSkJRMG9zZVVaQlFYbEdMRWRCUTNaR0xIRkVRVUZ4UkN4SFFVTnlSQ3hsUVVGbExFZEJRMllzYlVSQlFXMUVMRWRCUTI1RUxHZENRVUZuUWl4SFFVTm9RaXhKUVVGSkxFTkJRMUFzUTBGQlF6dEhRVU5JTEUxQlFVMDdPMEZCUlV3c1ZVRkJUU3d5UWtGRFNpeDNSa0ZCZDBZc1IwRkRkRVlzYVVSQlFXbEVMRWRCUTJwRUxGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZEWml4SlFVRkpMRU5CUTFBc1EwRkJRenRIUVVOSU8wTkJRMFk3TzBGQlJVMHNVMEZCVXl4UlFVRlJMRU5CUVVNc1dVRkJXU3hGUVVGRkxFZEJRVWNzUlVGQlJUczdRVUZGTVVNc1RVRkJTU3hEUVVGRExFZEJRVWNzUlVGQlJUdEJRVU5TTEZWQlFVMHNNa0pCUVdNc2JVTkJRVzFETEVOQlFVTXNRMEZCUXp0SFFVTXhSRHRCUVVORUxFMUJRVWtzUTBGQlF5eFpRVUZaTEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1NVRkJTU3hGUVVGRk8wRkJRM1pETEZWQlFVMHNNa0pCUVdNc01rSkJRVEpDTEVkQlFVY3NUMEZCVHl4WlFVRlpMRU5CUVVNc1EwRkJRenRIUVVONFJUczdRVUZGUkN4alFVRlpMRU5CUVVNc1NVRkJTU3hEUVVGRExGTkJRVk1zUjBGQlJ5eFpRVUZaTEVOQlFVTXNUVUZCVFN4RFFVRkRPenM3TzBGQlNXeEVMRXRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zWVVGQllTeERRVUZETEZsQlFWa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenM3TzBGQlJ6VkRMRTFCUVUwc2IwTkJRVzlETEVkQlEzaERMRmxCUVZrc1EwRkJReXhSUVVGUkxFbEJRVWtzV1VGQldTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03TzBGQlJURkVMRmRCUVZNc2IwSkJRVzlDTEVOQlFVTXNUMEZCVHl4RlFVRkZMRTlCUVU4c1JVRkJSU3hQUVVGUExFVkJRVVU3UVVGRGRrUXNVVUZCU1N4UFFVRlBMRU5CUVVNc1NVRkJTU3hGUVVGRk8wRkJRMmhDTEdGQlFVOHNSMEZCUnl4TFFVRkxMRU5CUVVNc1RVRkJUU3hEUVVGRExFVkJRVVVzUlVGQlJTeFBRVUZQTEVWQlFVVXNUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8wRkJRMnhFTEZWQlFVa3NUMEZCVHl4RFFVRkRMRWRCUVVjc1JVRkJSVHRCUVVObUxHVkJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRE8wOUJRM1pDTzB0QlEwWTdRVUZEUkN4WFFVRlBMRWRCUVVjc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eGpRVUZqTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1JVRkJSU3hQUVVGUExFVkJRVVVzVDBGQlR5eEZRVUZGTEU5QlFVOHNRMEZCUXl4RFFVRkRPenRCUVVWMFJTeFJRVUZKTEdWQlFXVXNSMEZCUnl4TFFVRkxMRU5CUVVNc1RVRkJUU3hEUVVGRExFVkJRVVVzUlVGQlJTeFBRVUZQTEVWQlFVVTdRVUZET1VNc1YwRkJTeXhGUVVGRkxFbEJRVWtzUTBGQlF5eExRVUZMTzBGQlEycENMSGRDUVVGclFpeEZRVUZGTEVsQlFVa3NRMEZCUXl4clFrRkJhMEk3UzBGRE5VTXNRMEZCUXl4RFFVRkRPenRCUVVWSUxGRkJRVWtzVFVGQlRTeEhRVUZITEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1lVRkJZU3hEUVVGRExFbEJRVWtzUTBGRGNFTXNTVUZCU1N4RlFVTktMRTlCUVU4c1JVRkRVQ3hQUVVGUExFVkJRMUFzWlVGQlpTeERRVU5vUWl4RFFVRkRPenRCUVVWR0xGRkJRVWtzVFVGQlRTeEpRVUZKTEVsQlFVa3NTVUZCU1N4SFFVRkhMRU5CUVVNc1QwRkJUeXhGUVVGRk8wRkJRMnBETEdGQlFVOHNRMEZCUXl4UlFVRlJMRU5CUVVNc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVkQlFVY3NRMEZCUXl4UFFVRlBMRU5CUXpGRExFOUJRVThzUlVGRFVDeFpRVUZaTEVOQlFVTXNaVUZCWlN4RlFVTTFRaXhIUVVGSExFTkJRMG9zUTBGQlF6dEJRVU5HTEZsQlFVMHNSMEZCUnl4UFFVRlBMRU5CUVVNc1VVRkJVU3hEUVVGRExFOUJRVThzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4UFFVRlBMRVZCUVVVc1pVRkJaU3hEUVVGRExFTkJRVU03UzBGRGJrVTdRVUZEUkN4UlFVRkpMRTFCUVUwc1NVRkJTU3hKUVVGSkxFVkJRVVU3UVVGRGJFSXNWVUZCU1N4UFFVRlBMRU5CUVVNc1RVRkJUU3hGUVVGRk8wRkJRMnhDTEZsQlFVa3NTMEZCU3l4SFFVRkhMRTFCUVUwc1EwRkJReXhMUVVGTExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdRVUZETDBJc1lVRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRXRCUVVzc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSVHRCUVVNMVF5eGpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEV0QlFVc3NRMEZCUXl4RlFVRkZPMEZCUXpWQ0xHdENRVUZOTzFkQlExQTdPMEZCUlVRc1pVRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEU5QlFVOHNRMEZCUXl4TlFVRk5MRWRCUVVjc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFOQlEzUkRPMEZCUTBRc1kwRkJUU3hIUVVGSExFdEJRVXNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNN1QwRkRNMEk3UVVGRFJDeGhRVUZQTEUxQlFVMHNRMEZCUXp0TFFVTm1MRTFCUVUwN1FVRkRUQ3haUVVGTkxESkNRVU5LTEdOQlFXTXNSMEZEV2l4UFFVRlBMRU5CUVVNc1NVRkJTU3hIUVVOYUxEQkVRVUV3UkN4RFFVTTNSQ3hEUVVGRE8wdEJRMGc3UjBGRFJqczdPMEZCUjBRc1RVRkJTU3hUUVVGVExFZEJRVWM3UVVGRFpDeFZRVUZOTEVWQlFVVXNaMEpCUVZNc1IwRkJSeXhGUVVGRkxFbEJRVWtzUlVGQlJTeEhRVUZITEVWQlFVVTdRVUZETDBJc1ZVRkJTU3hEUVVGRExFZEJRVWNzU1VGQlNTeEZRVUZGTEVsQlFVa3NTVUZCU1N4SFFVRkhMRU5CUVVFc1FVRkJReXhGUVVGRk8wRkJRekZDTEdOQlFVMHNNa0pCUVdNc1IwRkJSeXhIUVVGSExFbEJRVWtzUjBGQlJ5eHRRa0ZCYlVJc1IwRkJSeXhIUVVGSExFVkJRVVU3UVVGRE1VUXNZVUZCUnl4RlFVRkZMRWRCUVVjN1UwRkRWQ3hEUVVGRExFTkJRVU03VDBGRFNqdEJRVU5FTEdGQlFVOHNVMEZCVXl4RFFVRkRMR05CUVdNc1EwRkJReXhIUVVGSExFVkJRVVVzU1VGQlNTeERRVUZETEVOQlFVTTdTMEZETlVNN1FVRkRSQ3hyUWtGQll5eEZRVUZGTEhkQ1FVRlRMRTFCUVUwc1JVRkJSU3haUVVGWkxFVkJRVVU3UVVGRE4wTXNWVUZCU1N4TlFVRk5MRWRCUVVjc1RVRkJUU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETzBGQlEyeERMRlZCUVVrc1RVRkJUU3hKUVVGSkxFbEJRVWtzUlVGQlJUdEJRVU5zUWl4bFFVRlBMRTFCUVUwc1EwRkJRenRQUVVObU8wRkJRMFFzVlVGQlNTeE5RVUZOTEVOQlFVTXNVMEZCVXl4RFFVRkRMR05CUVdNc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEZsQlFWa3NRMEZCUXl4RlFVRkZPMEZCUXpsRUxHVkJRVThzVFVGQlRTeERRVUZETzA5QlEyWTdPMEZCUlVRc1ZVRkJTU3h4UTBGQlowSXNUVUZCVFN4RlFVRkZMRk5CUVZNc1EwRkJReXhyUWtGQmEwSXNSVUZCUlN4WlFVRlpMRU5CUVVNc1JVRkJSVHRCUVVOMlJTeGxRVUZQTEUxQlFVMHNRMEZCUXp0UFFVTm1PMEZCUTBRc1lVRkJUeXhUUVVGVExFTkJRVU03UzBGRGJFSTdRVUZEUkN4VlFVRk5MRVZCUVVVc1owSkJRVk1zVFVGQlRTeEZRVUZGTEVsQlFVa3NSVUZCUlR0QlFVTTNRaXhWUVVGTkxFZEJRVWNzUjBGQlJ5eE5RVUZOTEVOQlFVTXNUVUZCVFN4RFFVRkRPMEZCUXpGQ0xGZEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhIUVVGSExFVkJRVVVzUTBGQlF5eEZRVUZGTEVWQlFVVTdRVUZETlVJc1dVRkJTU3hOUVVGTkxFZEJRVWNzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4SlFVRkpMRk5CUVZNc1EwRkJReXhqUVVGakxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRWxCUVVrc1EwRkJReXhEUVVGRE8wRkJRM0JGTEZsQlFVa3NUVUZCVFN4SlFVRkpMRWxCUVVrc1JVRkJSVHRCUVVOc1FpeHBRa0ZCVHl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdVMEZEZUVJN1QwRkRSanRMUVVOR08wRkJRMFFzVlVGQlRTeEZRVUZGTEdkQ1FVRlRMRTlCUVU4c1JVRkJSU3hQUVVGUExFVkJRVVU3UVVGRGFrTXNZVUZCVHl4UFFVRlBMRTlCUVU4c1MwRkJTeXhWUVVGVkxFZEJRVWNzVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1IwRkJSeXhQUVVGUExFTkJRVU03UzBGRGVFVTdPMEZCUlVRc2IwSkJRV2RDTEVWQlFVVXNTMEZCU3l4RFFVRkRMR2RDUVVGblFqdEJRVU40UXl4cFFrRkJZU3hGUVVGRkxHOUNRVUZ2UWpzN1FVRkZia01zVFVGQlJTeEZRVUZGTEZsQlFWTXNRMEZCUXl4RlFVRkZPMEZCUTJRc1ZVRkJTU3hIUVVGSExFZEJRVWNzV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUXpGQ0xGTkJRVWNzUTBGQlF5eFRRVUZUTEVkQlFVY3NXVUZCV1N4RFFVRkRMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zUTBGQlF6dEJRVU4yUXl4aFFVRlBMRWRCUVVjc1EwRkJRenRMUVVOYU96dEJRVVZFTEZsQlFWRXNSVUZCUlN4RlFVRkZPMEZCUTFvc1YwRkJUeXhGUVVGRkxHbENRVUZUTEVOQlFVTXNSVUZCUlN4SlFVRkpMRVZCUVVVc2JVSkJRVzFDTEVWQlFVVXNWMEZCVnl4RlFVRkZMRTFCUVUwc1JVRkJSVHRCUVVOdVJTeFZRVUZKTEdOQlFXTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF6dFZRVU51UXl4RlFVRkZMRWRCUVVjc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTnNRaXhWUVVGSkxFbEJRVWtzU1VGQlNTeE5RVUZOTEVsQlFVa3NWMEZCVnl4SlFVRkpMRzFDUVVGdFFpeEZRVUZGTzBGQlEzaEVMSE5DUVVGakxFZEJRVWNzVjBGQlZ5eERRVU14UWl4SlFVRkpMRVZCUTBvc1EwRkJReXhGUVVORUxFVkJRVVVzUlVGRFJpeEpRVUZKTEVWQlEwb3NiVUpCUVcxQ0xFVkJRMjVDTEZkQlFWY3NSVUZEV0N4TlFVRk5MRU5CUTFBc1EwRkJRenRQUVVOSUxFMUJRVTBzU1VGQlNTeERRVUZETEdOQlFXTXNSVUZCUlR0QlFVTXhRaXh6UWtGQll5eEhRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVjBGQlZ5eERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU03VDBGRE9VUTdRVUZEUkN4aFFVRlBMR05CUVdNc1EwRkJRenRMUVVOMlFqczdRVUZGUkN4UlFVRkpMRVZCUVVVc1kwRkJVeXhMUVVGTExFVkJRVVVzUzBGQlN5eEZRVUZGTzBGQlF6TkNMR0ZCUVU4c1MwRkJTeXhKUVVGSkxFdEJRVXNzUlVGQlJTeEZRVUZGTzBGQlEzWkNMR0ZCUVVzc1IwRkJSeXhMUVVGTExFTkJRVU1zVDBGQlR5eERRVUZETzA5QlEzWkNPMEZCUTBRc1lVRkJUeXhMUVVGTExFTkJRVU03UzBGRFpEdEJRVU5FTEdsQ1FVRmhMRVZCUVVVc2RVSkJRVk1zUzBGQlN5eEZRVUZGTEUxQlFVMHNSVUZCUlR0QlFVTnlReXhWUVVGSkxFZEJRVWNzUjBGQlJ5eExRVUZMTEVsQlFVa3NUVUZCVFN4RFFVRkRPenRCUVVVeFFpeFZRVUZKTEV0QlFVc3NTVUZCU1N4TlFVRk5MRWxCUVVrc1MwRkJTeXhMUVVGTExFMUJRVTBzUlVGQlJUdEJRVU4yUXl4WFFVRkhMRWRCUVVjc1MwRkJTeXhEUVVGRExFMUJRVTBzUTBGQlF5eEZRVUZGTEVWQlFVVXNUVUZCVFN4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8wOUJRM1pET3p0QlFVVkVMR0ZCUVU4c1IwRkJSeXhEUVVGRE8wdEJRMW83TzBGQlJVUXNaVUZCVnl4RlFVRkZMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zUlVGQlJTeERRVUZET3p0QlFVVTFRaXhSUVVGSkxFVkJRVVVzUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SlFVRkpPMEZCUTJwQ0xHZENRVUZaTEVWQlFVVXNXVUZCV1N4RFFVRkRMRkZCUVZFN1IwRkRjRU1zUTBGQlF6czdRVUZGUml4WFFVRlRMRWRCUVVjc1EwRkJReXhQUVVGUExFVkJRV2RDTzFGQlFXUXNUMEZCVHl4NVJFRkJSeXhGUVVGRk96dEJRVU5vUXl4UlFVRkpMRWxCUVVrc1IwRkJSeXhQUVVGUExFTkJRVU1zU1VGQlNTeERRVUZET3p0QlFVVjRRaXhQUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMEZCUTNCQ0xGRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNUMEZCVHl4SlFVRkpMRmxCUVZrc1EwRkJReXhQUVVGUExFVkJRVVU3UVVGRE5VTXNWVUZCU1N4SFFVRkhMRkZCUVZFc1EwRkJReXhQUVVGUExFVkJRVVVzU1VGQlNTeERRVUZETEVOQlFVTTdTMEZEYUVNN1FVRkRSQ3hSUVVGSkxFMUJRVTBzV1VGQlFUdFJRVU5TTEZkQlFWY3NSMEZCUnl4WlFVRlpMRU5CUVVNc1kwRkJZeXhIUVVGSExFVkJRVVVzUjBGQlJ5eFRRVUZUTEVOQlFVTTdRVUZETjBRc1VVRkJTU3haUVVGWkxFTkJRVU1zVTBGQlV5eEZRVUZGTzBGQlF6RkNMRlZCUVVrc1QwRkJUeXhEUVVGRExFMUJRVTBzUlVGQlJUdEJRVU5zUWl4alFVRk5MRWRCUTBvc1QwRkJUeXhKUVVGSkxFOUJRVThzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUTNoQ0xFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTXNUVUZCVFN4RFFVRkRMRTlCUVU4c1EwRkJReXhOUVVGTkxFTkJRVU1zUjBGRGFFTXNUMEZCVHl4RFFVRkRMRTFCUVUwc1EwRkJRenRQUVVOMFFpeE5RVUZOTzBGQlEwd3NZMEZCVFN4SFFVRkhMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU03VDBGRGNFSTdTMEZEUmpzN1FVRkZSQ3hoUVVGVExFbEJRVWtzUTBGQlF5eFBRVUZQTEdkQ1FVRm5RanRCUVVOdVF5eGhRVU5GTEVWQlFVVXNSMEZEUml4WlFVRlpMRU5CUVVNc1NVRkJTU3hEUVVObUxGTkJRVk1zUlVGRFZDeFBRVUZQTEVWQlExQXNVMEZCVXl4RFFVRkRMRTlCUVU4c1JVRkRha0lzVTBGQlV5eERRVUZETEZGQlFWRXNSVUZEYkVJc1NVRkJTU3hGUVVOS0xGZEJRVmNzUlVGRFdDeE5RVUZOTEVOQlExQXNRMEZEUkR0TFFVTklPenRCUVVWRUxGRkJRVWtzUjBGQlJ5eHBRa0ZCYVVJc1EwRkRkRUlzV1VGQldTeERRVUZETEVsQlFVa3NSVUZEYWtJc1NVRkJTU3hGUVVOS0xGTkJRVk1zUlVGRFZDeFBRVUZQTEVOQlFVTXNUVUZCVFN4SlFVRkpMRVZCUVVVc1JVRkRjRUlzU1VGQlNTeEZRVU5LTEZkQlFWY3NRMEZEV2l4RFFVRkRPMEZCUTBZc1YwRkJUeXhKUVVGSkxFTkJRVU1zVDBGQlR5eEZRVUZGTEU5QlFVOHNRMEZCUXl4RFFVRkRPMGRCUXk5Q096dEJRVVZFTEV0QlFVY3NRMEZCUXl4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRE96dEJRVVZxUWl4TFFVRkhMRU5CUVVNc1RVRkJUU3hIUVVGSExGVkJRVk1zVDBGQlR5eEZRVUZGTzBGQlF6ZENMRkZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zVDBGQlR5eEZRVUZGTzBGQlEzQkNMRlZCUVVrc1lVRkJZU3hIUVVGSExFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlN4RlFVRkZMRWRCUVVjc1EwRkJReXhQUVVGUExFVkJRVVVzVDBGQlR5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMEZCUTI1RkxIRkRRVUVyUWl4RFFVRkRMR0ZCUVdFc1JVRkJSU3hUUVVGVExFTkJRVU1zUTBGQlF6dEJRVU14UkN4bFFVRlRMRU5CUVVNc1QwRkJUeXhIUVVGSExHRkJRV0VzUTBGQlF6czdRVUZGYkVNc1ZVRkJTU3haUVVGWkxFTkJRVU1zVlVGQlZTeEZRVUZGT3p0QlFVVXpRaXhwUWtGQlV5eERRVUZETEZGQlFWRXNSMEZCUnl4VFFVRlRMRU5CUVVNc1lVRkJZU3hEUVVNeFF5eFBRVUZQTEVOQlFVTXNVVUZCVVN4RlFVTm9RaXhIUVVGSExFTkJRVU1zVVVGQlVTeERRVU5pTEVOQlFVTTdUMEZEU0R0QlFVTkVMRlZCUVVrc1dVRkJXU3hEUVVGRExGVkJRVlVzU1VGQlNTeFpRVUZaTEVOQlFVTXNZVUZCWVN4RlFVRkZPMEZCUTNwRUxHbENRVUZUTEVOQlFVTXNWVUZCVlN4SFFVRkhMRXRCUVVzc1EwRkJReXhOUVVGTkxFTkJRMnBETEVWQlFVVXNSVUZEUml4SFFVRkhMRU5CUVVNc1ZVRkJWU3hGUVVOa0xFOUJRVThzUTBGQlF5eFZRVUZWTEVOQlEyNUNMRU5CUVVNN1QwRkRTRHM3UVVGRlJDeGxRVUZUTEVOQlFVTXNTMEZCU3l4SFFVRkhMRVZCUVVVc1EwRkJRenRCUVVOeVFpeGxRVUZUTEVOQlFVTXNhMEpCUVd0Q0xFZEJRVWNzT0VOQlFYbENMRTlCUVU4c1EwRkJReXhEUVVGRE96dEJRVVZxUlN4VlFVRkpMRzFDUVVGdFFpeEhRVU55UWl4UFFVRlBMRU5CUVVNc2VVSkJRWGxDTEVsQlEycERMRzlEUVVGdlF5eERRVUZETzBGQlEzWkRMR2xEUVVGclFpeFRRVUZUTEVWQlFVVXNaVUZCWlN4RlFVRkZMRzFDUVVGdFFpeERRVUZETEVOQlFVTTdRVUZEYmtVc2FVTkJRV3RDTEZOQlFWTXNSVUZCUlN4dlFrRkJiMElzUlVGQlJTeHRRa0ZCYlVJc1EwRkJReXhEUVVGRE8wdEJRM3BGTEUxQlFVMDdRVUZEVEN4bFFVRlRMRU5CUVVNc2EwSkJRV3RDTEVkQlFVY3NUMEZCVHl4RFFVRkRMR3RDUVVGclFpeERRVUZETzBGQlF6RkVMR1ZCUVZNc1EwRkJReXhQUVVGUExFZEJRVWNzVDBGQlR5eERRVUZETEU5QlFVOHNRMEZCUXp0QlFVTndReXhsUVVGVExFTkJRVU1zVVVGQlVTeEhRVUZITEU5QlFVOHNRMEZCUXl4UlFVRlJMRU5CUVVNN1FVRkRkRU1zWlVGQlV5eERRVUZETEZWQlFWVXNSMEZCUnl4UFFVRlBMRU5CUVVNc1ZVRkJWU3hEUVVGRE8wRkJRekZETEdWQlFWTXNRMEZCUXl4TFFVRkxMRWRCUVVjc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF6dExRVU5xUXp0SFFVTkdMRU5CUVVNN08wRkJSVVlzUzBGQlJ5eERRVUZETEUxQlFVMHNSMEZCUnl4VlFVRlRMRU5CUVVNc1JVRkJSU3hKUVVGSkxFVkJRVVVzVjBGQlZ5eEZRVUZGTEUxQlFVMHNSVUZCUlR0QlFVTnNSQ3hSUVVGSkxGbEJRVmtzUTBGQlF5eGpRVUZqTEVsQlFVa3NRMEZCUXl4WFFVRlhMRVZCUVVVN1FVRkRMME1zV1VGQlRTd3lRa0ZCWXl4M1FrRkJkMElzUTBGQlF5eERRVUZETzB0QlF5OURPMEZCUTBRc1VVRkJTU3haUVVGWkxFTkJRVU1zVTBGQlV5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZPMEZCUTNKRExGbEJRVTBzTWtKQlFXTXNlVUpCUVhsQ0xFTkJRVU1zUTBGQlF6dExRVU5vUkRzN1FVRkZSQ3hYUVVGUExGZEJRVmNzUTBGRGFFSXNVMEZCVXl4RlFVTlVMRU5CUVVNc1JVRkRSQ3haUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlEyWXNTVUZCU1N4RlFVTktMRU5CUVVNc1JVRkRSQ3hYUVVGWExFVkJRMWdzVFVGQlRTeERRVU5RTEVOQlFVTTdSMEZEU0N4RFFVRkRPMEZCUTBZc1UwRkJUeXhIUVVGSExFTkJRVU03UTBGRFdqczdRVUZGVFN4VFFVRlRMRmRCUVZjc1EwRkRla0lzVTBGQlV5eEZRVU5VTEVOQlFVTXNSVUZEUkN4RlFVRkZMRVZCUTBZc1NVRkJTU3hGUVVOS0xHMUNRVUZ0UWl4RlFVTnVRaXhYUVVGWExFVkJRMWdzVFVGQlRTeEZRVU5PTzBGQlEwRXNWMEZCVXl4SlFVRkpMRU5CUVVNc1QwRkJUeXhGUVVGblFqdFJRVUZrTEU5QlFVOHNlVVJCUVVjc1JVRkJSVHM3UVVGRGFrTXNVVUZCU1N4aFFVRmhMRWRCUVVjc1RVRkJUU3hEUVVGRE8wRkJRek5DTEZGQlEwVXNUVUZCVFN4SlFVTk9MRTlCUVU4c1NVRkJTU3hOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVsQlEzQkNMRVZCUVVVc1QwRkJUeXhMUVVGTExGTkJRVk1zUTBGQlF5eFhRVUZYTEVsQlFVa3NUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExFbEJRVWtzUTBGQlFTeEJRVUZETEVWQlF6RkVPMEZCUTBFc2JVSkJRV0VzUjBGQlJ5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dExRVU14UXpzN1FVRkZSQ3hYUVVGUExFVkJRVVVzUTBGRFVDeFRRVUZUTEVWQlExUXNUMEZCVHl4RlFVTlFMRk5CUVZNc1EwRkJReXhQUVVGUExFVkJRMnBDTEZOQlFWTXNRMEZCUXl4UlFVRlJMRVZCUTJ4Q0xFOUJRVThzUTBGQlF5eEpRVUZKTEVsQlFVa3NTVUZCU1N4RlFVTndRaXhYUVVGWExFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNWMEZCVnl4RFFVRkRMRU5CUVVNc1RVRkJUU3hEUVVGRExGZEJRVmNzUTBGQlF5eEZRVU40UkN4aFFVRmhMRU5CUTJRc1EwRkJRenRIUVVOSU96dEJRVVZFTEUxQlFVa3NSMEZCUnl4cFFrRkJhVUlzUTBGQlF5eEZRVUZGTEVWQlFVVXNTVUZCU1N4RlFVRkZMRk5CUVZNc1JVRkJSU3hOUVVGTkxFVkJRVVVzU1VGQlNTeEZRVUZGTEZkQlFWY3NRMEZCUXl4RFFVRkRPenRCUVVWNlJTeE5RVUZKTEVOQlFVTXNUMEZCVHl4SFFVRkhMRU5CUVVNc1EwRkJRenRCUVVOcVFpeE5RVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRTFCUVUwc1IwRkJSeXhOUVVGTkxFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTXNRMEZCUXp0QlFVTjRReXhOUVVGSkxFTkJRVU1zVjBGQlZ5eEhRVUZITEcxQ1FVRnRRaXhKUVVGSkxFTkJRVU1zUTBGQlF6dEJRVU0xUXl4VFFVRlBMRWxCUVVrc1EwRkJRenREUVVOaU96czdPenM3UVVGTFRTeFRRVUZUTEdOQlFXTXNRMEZCUXl4UFFVRlBMRVZCUVVVc1QwRkJUeXhGUVVGRkxFOUJRVThzUlVGQlJUdEJRVU40UkN4TlFVRkpMRU5CUVVNc1QwRkJUeXhGUVVGRk8wRkJRMW9zVVVGQlNTeFBRVUZQTEVOQlFVTXNTVUZCU1N4TFFVRkxMR2RDUVVGblFpeEZRVUZGTzBGQlEzSkRMR0ZCUVU4c1IwRkJSeXhQUVVGUExFTkJRVU1zU1VGQlNTeERRVUZETEdWQlFXVXNRMEZCUXl4RFFVRkRPMHRCUTNwRExFMUJRVTA3UVVGRFRDeGhRVUZQTEVkQlFVY3NUMEZCVHl4RFFVRkRMRkZCUVZFc1EwRkJReXhQUVVGUExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdTMEZETVVNN1IwRkRSaXhOUVVGTkxFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNTVUZCU1N4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFbEJRVWtzUlVGQlJUczdRVUZGZWtNc1YwRkJUeXhEUVVGRExFbEJRVWtzUjBGQlJ5eFBRVUZQTEVOQlFVTTdRVUZEZGtJc1YwRkJUeXhIUVVGSExFOUJRVThzUTBGQlF5eFJRVUZSTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNN1IwRkRja003UVVGRFJDeFRRVUZQTEU5QlFVOHNRMEZCUXp0RFFVTm9RanM3UVVGRlRTeFRRVUZUTEdGQlFXRXNRMEZCUXl4UFFVRlBMRVZCUVVVc1QwRkJUeXhGUVVGRkxFOUJRVThzUlVGQlJUczdRVUZGZGtRc1RVRkJUU3h0UWtGQmJVSXNSMEZCUnl4UFFVRlBMRU5CUVVNc1NVRkJTU3hKUVVGSkxFOUJRVThzUTBGQlF5eEpRVUZKTEVOQlFVTXNaVUZCWlN4RFFVRkRMRU5CUVVNN1FVRkRNVVVzVTBGQlR5eERRVUZETEU5QlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNN1FVRkRka0lzVFVGQlNTeFBRVUZQTEVOQlFVTXNSMEZCUnl4RlFVRkZPMEZCUTJZc1YwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eFhRVUZYTEVkQlFVY3NUMEZCVHl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeFBRVUZQTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmRCUVZjc1EwRkJRenRIUVVOMlJUczdRVUZGUkN4TlFVRkpMRmxCUVZrc1dVRkJRU3hEUVVGRE8wRkJRMnBDTEUxQlFVa3NUMEZCVHl4RFFVRkRMRVZCUVVVc1NVRkJTU3hQUVVGUExFTkJRVU1zUlVGQlJTeExRVUZMTEVsQlFVa3NSVUZCUlRzN1FVRkRja01zWVVGQlR5eERRVUZETEVsQlFVa3NSMEZCUnl4clFrRkJXU3hQUVVGUExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdPMEZCUlhwRExGVkJRVWtzUlVGQlJTeEhRVUZITEU5QlFVOHNRMEZCUXl4RlFVRkZMRU5CUVVNN1FVRkRjRUlzYTBKQlFWa3NSMEZCUnl4UFFVRlBMRU5CUVVNc1NVRkJTU3hEUVVGRExHVkJRV1VzUTBGQlF5eEhRVUZITEZOQlFWTXNiVUpCUVcxQ0xFTkJRM3BGTEU5QlFVOHNSVUZGVUR0WlFVUkJMRTlCUVU4c2VVUkJRVWNzUlVGQlJUczdPenRCUVVsYUxHVkJRVThzUTBGQlF5eEpRVUZKTEVkQlFVY3NhMEpCUVZrc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzBGQlEzcERMR1ZCUVU4c1EwRkJReXhKUVVGSkxFTkJRVU1zWlVGQlpTeERRVUZETEVkQlFVY3NiVUpCUVcxQ0xFTkJRVU03UVVGRGNFUXNaVUZCVHl4RlFVRkZMRU5CUVVNc1QwRkJUeXhGUVVGRkxFOUJRVThzUTBGQlF5eERRVUZETzA5QlF6ZENMRU5CUVVNN1FVRkRSaXhWUVVGSkxFVkJRVVVzUTBGQlF5eFJRVUZSTEVWQlFVVTdRVUZEWml4bFFVRlBMRU5CUVVNc1VVRkJVU3hIUVVGSExFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlN4RlFVRkZMRTlCUVU4c1EwRkJReXhSUVVGUkxFVkJRVVVzUlVGQlJTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRPMDlCUTNCRk96dEhRVU5HT3p0QlFVVkVMRTFCUVVrc1QwRkJUeXhMUVVGTExGTkJRVk1zU1VGQlNTeFpRVUZaTEVWQlFVVTdRVUZEZWtNc1YwRkJUeXhIUVVGSExGbEJRVmtzUTBGQlF6dEhRVU40UWpzN1FVRkZSQ3hOUVVGSkxFOUJRVThzUzBGQlN5eFRRVUZUTEVWQlFVVTdRVUZEZWtJc1ZVRkJUU3d5UWtGQll5eGpRVUZqTEVkQlFVY3NUMEZCVHl4RFFVRkRMRWxCUVVrc1IwRkJSeXh4UWtGQmNVSXNRMEZCUXl4RFFVRkRPMGRCUXpWRkxFMUJRVTBzU1VGQlNTeFBRVUZQTEZsQlFWa3NVVUZCVVN4RlFVRkZPMEZCUTNSRExGZEJRVThzVDBGQlR5eERRVUZETEU5QlFVOHNSVUZCUlN4UFFVRlBMRU5CUVVNc1EwRkJRenRIUVVOc1F6dERRVU5HT3p0QlFVVk5MRk5CUVZNc1NVRkJTU3hIUVVGSE8wRkJRM0pDTEZOQlFVOHNSVUZCUlN4RFFVRkRPME5CUTFnN08wRkJSVVFzVTBGQlV5eFJRVUZSTEVOQlFVTXNUMEZCVHl4RlFVRkZMRWxCUVVrc1JVRkJSVHRCUVVNdlFpeE5RVUZKTEVOQlFVTXNTVUZCU1N4SlFVRkpMRVZCUVVVc1RVRkJUU3hKUVVGSkxFbEJRVWtzUTBGQlFTeEJRVUZETEVWQlFVVTdRVUZET1VJc1VVRkJTU3hIUVVGSExFbEJRVWtzUjBGQlJ5eHJRa0ZCV1N4SlFVRkpMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03UVVGRGNrTXNVVUZCU1N4RFFVRkRMRWxCUVVrc1IwRkJSeXhQUVVGUExFTkJRVU03UjBGRGNrSTdRVUZEUkN4VFFVRlBMRWxCUVVrc1EwRkJRenREUVVOaU96dEJRVVZFTEZOQlFWTXNhVUpCUVdsQ0xFTkJRVU1zUlVGQlJTeEZRVUZGTEVsQlFVa3NSVUZCUlN4VFFVRlRMRVZCUVVVc1RVRkJUU3hGUVVGRkxFbEJRVWtzUlVGQlJTeFhRVUZYTEVWQlFVVTdRVUZEZWtVc1RVRkJTU3hGUVVGRkxFTkJRVU1zVTBGQlV5eEZRVUZGTzBGQlEyaENMRkZCUVVrc1MwRkJTeXhIUVVGSExFVkJRVVVzUTBGQlF6dEJRVU5tTEZGQlFVa3NSMEZCUnl4RlFVRkZMRU5CUVVNc1UwRkJVeXhEUVVOcVFpeEpRVUZKTEVWQlEwb3NTMEZCU3l4RlFVTk1MRk5CUVZNc1JVRkRWQ3hOUVVGTkxFbEJRVWtzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVTnVRaXhKUVVGSkxFVkJRMG9zVjBGQlZ5eEZRVU5ZTEUxQlFVMHNRMEZEVUN4RFFVRkRPMEZCUTBZc1UwRkJTeXhEUVVGRExFMUJRVTBzUTBGQlF5eEpRVUZKTEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNN1IwRkRNMEk3UVVGRFJDeFRRVUZQTEVsQlFVa3NRMEZCUXp0RFFVTmlPenRCUVVWRUxGTkJRVk1zSzBKQlFTdENMRU5CUVVNc1lVRkJZU3hGUVVGRkxGTkJRVk1zUlVGQlJUdEJRVU5xUlN4UlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExHRkJRV0VzUTBGQlF5eERRVUZETEU5QlFVOHNRMEZCUXl4VlFVRkJMRlZCUVZVc1JVRkJTVHRCUVVNdlF5eFJRVUZKTEUxQlFVMHNSMEZCUnl4aFFVRmhMRU5CUVVNc1ZVRkJWU3hEUVVGRExFTkJRVU03UVVGRGRrTXNhVUpCUVdFc1EwRkJReXhWUVVGVkxFTkJRVU1zUjBGQlJ5eDNRa0ZCZDBJc1EwRkJReXhOUVVGTkxFVkJRVVVzVTBGQlV5eERRVUZETEVOQlFVTTdSMEZEZWtVc1EwRkJReXhEUVVGRE8wTkJRMG83TzBGQlJVUXNVMEZCVXl4M1FrRkJkMElzUTBGQlF5eE5RVUZOTEVWQlFVVXNVMEZCVXl4RlFVRkZPMEZCUTI1RUxFMUJRVTBzWTBGQll5eEhRVUZITEZOQlFWTXNRMEZCUXl4alFVRmpMRU5CUVVNN1FVRkRhRVFzVTBGQlR5d3JRa0ZCVnl4TlFVRk5MRVZCUVVVc1ZVRkJRU3hQUVVGUExFVkJRVWs3UVVGRGJrTXNWMEZCVHl4TFFVRkxMRU5CUVVNc1RVRkJUU3hEUVVGRExFVkJRVVVzWTBGQll5eEZRVUZrTEdOQlFXTXNSVUZCUlN4RlFVRkZMRTlCUVU4c1EwRkJReXhEUVVGRE8wZEJRMnhFTEVOQlFVTXNRMEZCUXp0RFFVTktJaXdpWm1sc1pTSTZJbkoxYm5ScGJXVXVhbk1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKcGJYQnZjblFnS2lCaGN5QlZkR2xzY3lCbWNtOXRJQ2N1TDNWMGFXeHpKenRjYm1sdGNHOXlkQ0JGZUdObGNIUnBiMjRnWm5KdmJTQW5MaTlsZUdObGNIUnBiMjRuTzF4dWFXMXdiM0owSUh0Y2JpQWdRMDlOVUVsTVJWSmZVa1ZXU1ZOSlQwNHNYRzRnSUdOeVpXRjBaVVp5WVcxbExGeHVJQ0JNUVZOVVgwTlBUVkJCVkVsQ1RFVmZRMDlOVUVsTVJWSmZVa1ZXU1ZOSlQwNHNYRzRnSUZKRlZrbFRTVTlPWDBOSVFVNUhSVk5jYm4wZ1puSnZiU0FuTGk5aVlYTmxKenRjYm1sdGNHOXlkQ0I3SUcxdmRtVklaV3h3WlhKVWIwaHZiMnR6SUgwZ1puSnZiU0FuTGk5b1pXeHdaWEp6Snp0Y2JtbHRjRzl5ZENCN0lIZHlZWEJJWld4d1pYSWdmU0JtY205dElDY3VMMmx1ZEdWeWJtRnNMM2R5WVhCSVpXeHdaWEluTzF4dWFXMXdiM0owSUh0Y2JpQWdZM0psWVhSbFVISnZkRzlCWTJObGMzTkRiMjUwY205c0xGeHVJQ0J5WlhOMWJIUkpjMEZzYkc5M1pXUmNibjBnWm5KdmJTQW5MaTlwYm5SbGNtNWhiQzl3Y205MGJ5MWhZMk5sYzNNbk8xeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdZMmhsWTJ0U1pYWnBjMmx2YmloamIyMXdhV3hsY2tsdVptOHBJSHRjYmlBZ1kyOXVjM1FnWTI5dGNHbHNaWEpTWlhacGMybHZiaUE5SUNoamIyMXdhV3hsY2tsdVptOGdKaVlnWTI5dGNHbHNaWEpKYm1adld6QmRLU0I4ZkNBeExGeHVJQ0FnSUdOMWNuSmxiblJTWlhacGMybHZiaUE5SUVOUFRWQkpURVZTWDFKRlZrbFRTVTlPTzF4dVhHNGdJR2xtSUNoY2JpQWdJQ0JqYjIxd2FXeGxjbEpsZG1semFXOXVJRDQ5SUV4QlUxUmZRMDlOVUVGVVNVSk1SVjlEVDAxUVNVeEZVbDlTUlZaSlUwbFBUaUFtSmx4dUlDQWdJR052YlhCcGJHVnlVbVYyYVhOcGIyNGdQRDBnUTA5TlVFbE1SVkpmVWtWV1NWTkpUMDVjYmlBZ0tTQjdYRzRnSUNBZ2NtVjBkWEp1TzF4dUlDQjlYRzVjYmlBZ2FXWWdLR052YlhCcGJHVnlVbVYyYVhOcGIyNGdQQ0JNUVZOVVgwTlBUVkJCVkVsQ1RFVmZRMDlOVUVsTVJWSmZVa1ZXU1ZOSlQwNHBJSHRjYmlBZ0lDQmpiMjV6ZENCeWRXNTBhVzFsVm1WeWMybHZibk1nUFNCU1JWWkpVMGxQVGw5RFNFRk9SMFZUVzJOMWNuSmxiblJTWlhacGMybHZibDBzWEc0Z0lDQWdJQ0JqYjIxd2FXeGxjbFpsY25OcGIyNXpJRDBnVWtWV1NWTkpUMDVmUTBoQlRrZEZVMXRqYjIxd2FXeGxjbEpsZG1semFXOXVYVHRjYmlBZ0lDQjBhSEp2ZHlCdVpYY2dSWGhqWlhCMGFXOXVLRnh1SUNBZ0lDQWdKMVJsYlhCc1lYUmxJSGRoY3lCd2NtVmpiMjF3YVd4bFpDQjNhWFJvSUdGdUlHOXNaR1Z5SUhabGNuTnBiMjRnYjJZZ1NHRnVaR3hsWW1GeWN5QjBhR0Z1SUhSb1pTQmpkWEp5Wlc1MElISjFiblJwYldVdUlDY2dLMXh1SUNBZ0lDQWdJQ0FuVUd4bFlYTmxJSFZ3WkdGMFpTQjViM1Z5SUhCeVpXTnZiWEJwYkdWeUlIUnZJR0VnYm1WM1pYSWdkbVZ5YzJsdmJpQW9KeUFyWEc0Z0lDQWdJQ0FnSUhKMWJuUnBiV1ZXWlhKemFXOXVjeUFyWEc0Z0lDQWdJQ0FnSUNjcElHOXlJR1J2ZDI1bmNtRmtaU0I1YjNWeUlISjFiblJwYldVZ2RHOGdZVzRnYjJ4a1pYSWdkbVZ5YzJsdmJpQW9KeUFyWEc0Z0lDQWdJQ0FnSUdOdmJYQnBiR1Z5Vm1WeWMybHZibk1nSzF4dUlDQWdJQ0FnSUNBbktTNG5YRzRnSUNBZ0tUdGNiaUFnZlNCbGJITmxJSHRjYmlBZ0lDQXZMeUJWYzJVZ2RHaGxJR1Z0WW1Wa1pHVmtJSFpsY25OcGIyNGdhVzVtYnlCemFXNWpaU0IwYUdVZ2NuVnVkR2x0WlNCa2IyVnpiaWQwSUd0dWIzY2dZV0p2ZFhRZ2RHaHBjeUJ5WlhacGMybHZiaUI1WlhSY2JpQWdJQ0IwYUhKdmR5QnVaWGNnUlhoalpYQjBhVzl1S0Z4dUlDQWdJQ0FnSjFSbGJYQnNZWFJsSUhkaGN5QndjbVZqYjIxd2FXeGxaQ0IzYVhSb0lHRWdibVYzWlhJZ2RtVnljMmx2YmlCdlppQklZVzVrYkdWaVlYSnpJSFJvWVc0Z2RHaGxJR04xY25KbGJuUWdjblZ1ZEdsdFpTNGdKeUFyWEc0Z0lDQWdJQ0FnSUNkUWJHVmhjMlVnZFhCa1lYUmxJSGx2ZFhJZ2NuVnVkR2x0WlNCMGJ5QmhJRzVsZDJWeUlIWmxjbk5wYjI0Z0tDY2dLMXh1SUNBZ0lDQWdJQ0JqYjIxd2FXeGxja2x1Wm05Yk1WMGdLMXh1SUNBZ0lDQWdJQ0FuS1M0blhHNGdJQ0FnS1R0Y2JpQWdmVnh1ZlZ4dVhHNWxlSEJ2Y25RZ1puVnVZM1JwYjI0Z2RHVnRjR3hoZEdVb2RHVnRjR3hoZEdWVGNHVmpMQ0JsYm5ZcElIdGNiaUFnTHlvZ2FYTjBZVzVpZFd3Z2FXZHViM0psSUc1bGVIUWdLaTljYmlBZ2FXWWdLQ0ZsYm5ZcElIdGNiaUFnSUNCMGFISnZkeUJ1WlhjZ1JYaGpaWEIwYVc5dUtDZE9ieUJsYm5acGNtOXViV1Z1ZENCd1lYTnpaV1FnZEc4Z2RHVnRjR3hoZEdVbktUdGNiaUFnZlZ4dUlDQnBaaUFvSVhSbGJYQnNZWFJsVTNCbFl5QjhmQ0FoZEdWdGNHeGhkR1ZUY0dWakxtMWhhVzRwSUh0Y2JpQWdJQ0IwYUhKdmR5QnVaWGNnUlhoalpYQjBhVzl1S0NkVmJtdHViM2R1SUhSbGJYQnNZWFJsSUc5aWFtVmpkRG9nSnlBcklIUjVjR1Z2WmlCMFpXMXdiR0YwWlZOd1pXTXBPMXh1SUNCOVhHNWNiaUFnZEdWdGNHeGhkR1ZUY0dWakxtMWhhVzR1WkdWamIzSmhkRzl5SUQwZ2RHVnRjR3hoZEdWVGNHVmpMbTFoYVc1ZlpEdGNibHh1SUNBdkx5Qk9iM1JsT2lCVmMybHVaeUJsYm5ZdVZrMGdjbVZtWlhKbGJtTmxjeUJ5WVhSb1pYSWdkR2hoYmlCc2IyTmhiQ0IyWVhJZ2NtVm1aWEpsYm1ObGN5QjBhSEp2ZFdkb2IzVjBJSFJvYVhNZ2MyVmpkR2x2YmlCMGJ5QmhiR3h2ZDF4dUlDQXZMeUJtYjNJZ1pYaDBaWEp1WVd3Z2RYTmxjbk1nZEc4Z2IzWmxjbkpwWkdVZ2RHaGxjMlVnWVhNZ2NITmxkV1J2TFhOMWNIQnZjblJsWkNCQlVFbHpMbHh1SUNCbGJuWXVWazB1WTJobFkydFNaWFpwYzJsdmJpaDBaVzF3YkdGMFpWTndaV011WTI5dGNHbHNaWElwTzF4dVhHNGdJQzh2SUdKaFkydDNZWEprY3lCamIyMXdZWFJwWW1sc2FYUjVJR1p2Y2lCd2NtVmpiMjF3YVd4bFpDQjBaVzF3YkdGMFpYTWdkMmwwYUNCamIyMXdhV3hsY2kxMlpYSnphVzl1SURjZ0tEdzBMak11TUNsY2JpQWdZMjl1YzNRZ2RHVnRjR3hoZEdWWFlYTlFjbVZqYjIxd2FXeGxaRmRwZEdoRGIyMXdhV3hsY2xZM0lEMWNiaUFnSUNCMFpXMXdiR0YwWlZOd1pXTXVZMjl0Y0dsc1pYSWdKaVlnZEdWdGNHeGhkR1ZUY0dWakxtTnZiWEJwYkdWeVd6QmRJRDA5UFNBM08xeHVYRzRnSUdaMWJtTjBhVzl1SUdsdWRtOXJaVkJoY25ScFlXeFhjbUZ3Y0dWeUtIQmhjblJwWVd3c0lHTnZiblJsZUhRc0lHOXdkR2x2Ym5NcElIdGNiaUFnSUNCcFppQW9iM0IwYVc5dWN5NW9ZWE5vS1NCN1hHNGdJQ0FnSUNCamIyNTBaWGgwSUQwZ1ZYUnBiSE11WlhoMFpXNWtLSHQ5TENCamIyNTBaWGgwTENCdmNIUnBiMjV6TG1oaGMyZ3BPMXh1SUNBZ0lDQWdhV1lnS0c5d2RHbHZibk11YVdSektTQjdYRzRnSUNBZ0lDQWdJRzl3ZEdsdmJuTXVhV1J6V3pCZElEMGdkSEoxWlR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdjR0Z5ZEdsaGJDQTlJR1Z1ZGk1V1RTNXlaWE52YkhabFVHRnlkR2xoYkM1allXeHNLSFJvYVhNc0lIQmhjblJwWVd3c0lHTnZiblJsZUhRc0lHOXdkR2x2Ym5NcE8xeHVYRzRnSUNBZ2JHVjBJR1Y0ZEdWdVpHVmtUM0IwYVc5dWN5QTlJRlYwYVd4ekxtVjRkR1Z1WkNoN2ZTd2diM0IwYVc5dWN5d2dlMXh1SUNBZ0lDQWdhRzl2YTNNNklIUm9hWE11YUc5dmEzTXNYRzRnSUNBZ0lDQndjbTkwYjBGalkyVnpjME52Ym5SeWIydzZJSFJvYVhNdWNISnZkRzlCWTJObGMzTkRiMjUwY205c1hHNGdJQ0FnZlNrN1hHNWNiaUFnSUNCc1pYUWdjbVZ6ZFd4MElEMGdaVzUyTGxaTkxtbHVkbTlyWlZCaGNuUnBZV3d1WTJGc2JDaGNiaUFnSUNBZ0lIUm9hWE1zWEc0Z0lDQWdJQ0J3WVhKMGFXRnNMRnh1SUNBZ0lDQWdZMjl1ZEdWNGRDeGNiaUFnSUNBZ0lHVjRkR1Z1WkdWa1QzQjBhVzl1YzF4dUlDQWdJQ2s3WEc1Y2JpQWdJQ0JwWmlBb2NtVnpkV3gwSUQwOUlHNTFiR3dnSmlZZ1pXNTJMbU52YlhCcGJHVXBJSHRjYmlBZ0lDQWdJRzl3ZEdsdmJuTXVjR0Z5ZEdsaGJITmJiM0IwYVc5dWN5NXVZVzFsWFNBOUlHVnVkaTVqYjIxd2FXeGxLRnh1SUNBZ0lDQWdJQ0J3WVhKMGFXRnNMRnh1SUNBZ0lDQWdJQ0IwWlcxd2JHRjBaVk53WldNdVkyOXRjR2xzWlhKUGNIUnBiMjV6TEZ4dUlDQWdJQ0FnSUNCbGJuWmNiaUFnSUNBZ0lDazdYRzRnSUNBZ0lDQnlaWE4xYkhRZ1BTQnZjSFJwYjI1ekxuQmhjblJwWVd4elcyOXdkR2x2Ym5NdWJtRnRaVjBvWTI5dWRHVjRkQ3dnWlhoMFpXNWtaV1JQY0hScGIyNXpLVHRjYmlBZ0lDQjlYRzRnSUNBZ2FXWWdLSEpsYzNWc2RDQWhQU0J1ZFd4c0tTQjdYRzRnSUNBZ0lDQnBaaUFvYjNCMGFXOXVjeTVwYm1SbGJuUXBJSHRjYmlBZ0lDQWdJQ0FnYkdWMElHeHBibVZ6SUQwZ2NtVnpkV3gwTG5Od2JHbDBLQ2RjWEc0bktUdGNiaUFnSUNBZ0lDQWdabTl5SUNoc1pYUWdhU0E5SURBc0lHd2dQU0JzYVc1bGN5NXNaVzVuZEdnN0lHa2dQQ0JzT3lCcEt5c3BJSHRjYmlBZ0lDQWdJQ0FnSUNCcFppQW9JV3hwYm1WelcybGRJQ1ltSUdrZ0t5QXhJRDA5UFNCc0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0JzYVc1bGMxdHBYU0E5SUc5d2RHbHZibk11YVc1a1pXNTBJQ3NnYkdsdVpYTmJhVjA3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2NtVnpkV3gwSUQwZ2JHbHVaWE11YW05cGJpZ25YRnh1SnlrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCeVpYUjFjbTRnY21WemRXeDBPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYaGpaWEIwYVc5dUtGeHVJQ0FnSUNBZ0lDQW5WR2hsSUhCaGNuUnBZV3dnSnlBclhHNGdJQ0FnSUNBZ0lDQWdiM0IwYVc5dWN5NXVZVzFsSUN0Y2JpQWdJQ0FnSUNBZ0lDQW5JR052ZFd4a0lHNXZkQ0JpWlNCamIyMXdhV3hsWkNCM2FHVnVJSEoxYm01cGJtY2dhVzRnY25WdWRHbHRaUzF2Ym14NUlHMXZaR1VuWEc0Z0lDQWdJQ0FwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUM4dklFcDFjM1FnWVdSa0lIZGhkR1Z5WEc0Z0lHeGxkQ0JqYjI1MFlXbHVaWElnUFNCN1hHNGdJQ0FnYzNSeWFXTjBPaUJtZFc1amRHbHZiaWh2WW1vc0lHNWhiV1VzSUd4dll5a2dlMXh1SUNBZ0lDQWdhV1lnS0NGdlltb2dmSHdnSVNodVlXMWxJR2x1SUc5aWFpa3BJSHRjYmlBZ0lDQWdJQ0FnZEdoeWIzY2dibVYzSUVWNFkyVndkR2x2YmlnblhDSW5JQ3NnYm1GdFpTQXJJQ2RjSWlCdWIzUWdaR1ZtYVc1bFpDQnBiaUFuSUNzZ2IySnFMQ0I3WEc0Z0lDQWdJQ0FnSUNBZ2JHOWpPaUJzYjJOY2JpQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnlaWFIxY200Z1kyOXVkR0ZwYm1WeUxteHZiMnQxY0ZCeWIzQmxjblI1S0c5aWFpd2dibUZ0WlNrN1hHNGdJQ0FnZlN4Y2JpQWdJQ0JzYjI5cmRYQlFjbTl3WlhKMGVUb2dablZ1WTNScGIyNG9jR0Z5Wlc1MExDQndjbTl3WlhKMGVVNWhiV1VwSUh0Y2JpQWdJQ0FnSUd4bGRDQnlaWE4xYkhRZ1BTQndZWEpsYm5SYmNISnZjR1Z5ZEhsT1lXMWxYVHRjYmlBZ0lDQWdJR2xtSUNoeVpYTjFiSFFnUFQwZ2JuVnNiQ2tnZTF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnY21WemRXeDBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdhV1lnS0U5aWFtVmpkQzV3Y205MGIzUjVjR1V1YUdGelQzZHVVSEp2Y0dWeWRIa3VZMkZzYkNod1lYSmxiblFzSUhCeWIzQmxjblI1VG1GdFpTa3BJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsYzNWc2REdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdhV1lnS0hKbGMzVnNkRWx6UVd4c2IzZGxaQ2h5WlhOMWJIUXNJR052Ym5SaGFXNWxjaTV3Y205MGIwRmpZMlZ6YzBOdmJuUnliMndzSUhCeWIzQmxjblI1VG1GdFpTa3BJSHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJSEpsYzNWc2REdGNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lISmxkSFZ5YmlCMWJtUmxabWx1WldRN1hHNGdJQ0FnZlN4Y2JpQWdJQ0JzYjI5cmRYQTZJR1oxYm1OMGFXOXVLR1JsY0hSb2N5d2dibUZ0WlNrZ2UxeHVJQ0FnSUNBZ1kyOXVjM1FnYkdWdUlEMGdaR1Z3ZEdoekxteGxibWQwYUR0Y2JpQWdJQ0FnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2JHVnVPeUJwS3lzcElIdGNiaUFnSUNBZ0lDQWdiR1YwSUhKbGMzVnNkQ0E5SUdSbGNIUm9jMXRwWFNBbUppQmpiMjUwWVdsdVpYSXViRzl2YTNWd1VISnZjR1Z5ZEhrb1pHVndkR2h6VzJsZExDQnVZVzFsS1R0Y2JpQWdJQ0FnSUNBZ2FXWWdLSEpsYzNWc2RDQWhQU0J1ZFd4c0tTQjdYRzRnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJR1JsY0hSb2MxdHBYVnR1WVcxbFhUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1SUNBZ0lIMHNYRzRnSUNBZ2JHRnRZbVJoT2lCbWRXNWpkR2x2YmloamRYSnlaVzUwTENCamIyNTBaWGgwS1NCN1hHNGdJQ0FnSUNCeVpYUjFjbTRnZEhsd1pXOW1JR04xY25KbGJuUWdQVDA5SUNkbWRXNWpkR2x2YmljZ1B5QmpkWEp5Wlc1MExtTmhiR3dvWTI5dWRHVjRkQ2tnT2lCamRYSnlaVzUwTzF4dUlDQWdJSDBzWEc1Y2JpQWdJQ0JsYzJOaGNHVkZlSEJ5WlhOemFXOXVPaUJWZEdsc2N5NWxjMk5oY0dWRmVIQnlaWE56YVc5dUxGeHVJQ0FnSUdsdWRtOXJaVkJoY25ScFlXdzZJR2x1ZG05clpWQmhjblJwWVd4WGNtRndjR1Z5TEZ4dVhHNGdJQ0FnWm00NklHWjFibU4wYVc5dUtHa3BJSHRjYmlBZ0lDQWdJR3hsZENCeVpYUWdQU0IwWlcxd2JHRjBaVk53WldOYmFWMDdYRzRnSUNBZ0lDQnlaWFF1WkdWamIzSmhkRzl5SUQwZ2RHVnRjR3hoZEdWVGNHVmpXMmtnS3lBblgyUW5YVHRjYmlBZ0lDQWdJSEpsZEhWeWJpQnlaWFE3WEc0Z0lDQWdmU3hjYmx4dUlDQWdJSEJ5YjJkeVlXMXpPaUJiWFN4Y2JpQWdJQ0J3Y205bmNtRnRPaUJtZFc1amRHbHZiaWhwTENCa1lYUmhMQ0JrWldOc1lYSmxaRUpzYjJOclVHRnlZVzF6TENCaWJHOWphMUJoY21GdGN5d2daR1Z3ZEdoektTQjdYRzRnSUNBZ0lDQnNaWFFnY0hKdlozSmhiVmR5WVhCd1pYSWdQU0IwYUdsekxuQnliMmR5WVcxelcybGRMRnh1SUNBZ0lDQWdJQ0JtYmlBOUlIUm9hWE11Wm00b2FTazdYRzRnSUNBZ0lDQnBaaUFvWkdGMFlTQjhmQ0JrWlhCMGFITWdmSHdnWW14dlkydFFZWEpoYlhNZ2ZId2daR1ZqYkdGeVpXUkNiRzlqYTFCaGNtRnRjeWtnZTF4dUlDQWdJQ0FnSUNCd2NtOW5jbUZ0VjNKaGNIQmxjaUE5SUhkeVlYQlFjbTluY21GdEtGeHVJQ0FnSUNBZ0lDQWdJSFJvYVhNc1hHNGdJQ0FnSUNBZ0lDQWdhU3hjYmlBZ0lDQWdJQ0FnSUNCbWJpeGNiaUFnSUNBZ0lDQWdJQ0JrWVhSaExGeHVJQ0FnSUNBZ0lDQWdJR1JsWTJ4aGNtVmtRbXh2WTJ0UVlYSmhiWE1zWEc0Z0lDQWdJQ0FnSUNBZ1lteHZZMnRRWVhKaGJYTXNYRzRnSUNBZ0lDQWdJQ0FnWkdWd2RHaHpYRzRnSUNBZ0lDQWdJQ2s3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0NGd2NtOW5jbUZ0VjNKaGNIQmxjaWtnZTF4dUlDQWdJQ0FnSUNCd2NtOW5jbUZ0VjNKaGNIQmxjaUE5SUhSb2FYTXVjSEp2WjNKaGJYTmJhVjBnUFNCM2NtRndVSEp2WjNKaGJTaDBhR2x6TENCcExDQm1iaWs3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdjSEp2WjNKaGJWZHlZWEJ3WlhJN1hHNGdJQ0FnZlN4Y2JseHVJQ0FnSUdSaGRHRTZJR1oxYm1OMGFXOXVLSFpoYkhWbExDQmtaWEIwYUNrZ2UxeHVJQ0FnSUNBZ2QyaHBiR1VnS0haaGJIVmxJQ1ltSUdSbGNIUm9MUzBwSUh0Y2JpQWdJQ0FnSUNBZ2RtRnNkV1VnUFNCMllXeDFaUzVmY0dGeVpXNTBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdjbVYwZFhKdUlIWmhiSFZsTzF4dUlDQWdJSDBzWEc0Z0lDQWdiV1Z5WjJWSlprNWxaV1JsWkRvZ1puVnVZM1JwYjI0b2NHRnlZVzBzSUdOdmJXMXZiaWtnZTF4dUlDQWdJQ0FnYkdWMElHOWlhaUE5SUhCaGNtRnRJSHg4SUdOdmJXMXZianRjYmx4dUlDQWdJQ0FnYVdZZ0tIQmhjbUZ0SUNZbUlHTnZiVzF2YmlBbUppQndZWEpoYlNBaFBUMGdZMjl0Ylc5dUtTQjdYRzRnSUNBZ0lDQWdJRzlpYWlBOUlGVjBhV3h6TG1WNGRHVnVaQ2g3ZlN3Z1kyOXRiVzl1TENCd1lYSmhiU2s3WEc0Z0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUhKbGRIVnliaUJ2WW1vN1hHNGdJQ0FnZlN4Y2JpQWdJQ0F2THlCQmJpQmxiWEIwZVNCdlltcGxZM1FnZEc4Z2RYTmxJR0Z6SUhKbGNHeGhZMlZ0Wlc1MElHWnZjaUJ1ZFd4c0xXTnZiblJsZUhSelhHNGdJQ0FnYm5Wc2JFTnZiblJsZUhRNklFOWlhbVZqZEM1elpXRnNLSHQ5S1N4Y2JseHVJQ0FnSUc1dmIzQTZJR1Z1ZGk1V1RTNXViMjl3TEZ4dUlDQWdJR052YlhCcGJHVnlTVzVtYnpvZ2RHVnRjR3hoZEdWVGNHVmpMbU52YlhCcGJHVnlYRzRnSUgwN1hHNWNiaUFnWm5WdVkzUnBiMjRnY21WMEtHTnZiblJsZUhRc0lHOXdkR2x2Ym5NZ1BTQjdmU2tnZTF4dUlDQWdJR3hsZENCa1lYUmhJRDBnYjNCMGFXOXVjeTVrWVhSaE8xeHVYRzRnSUNBZ2NtVjBMbDl6WlhSMWNDaHZjSFJwYjI1ektUdGNiaUFnSUNCcFppQW9JVzl3ZEdsdmJuTXVjR0Z5ZEdsaGJDQW1KaUIwWlcxd2JHRjBaVk53WldNdWRYTmxSR0YwWVNrZ2UxeHVJQ0FnSUNBZ1pHRjBZU0E5SUdsdWFYUkVZWFJoS0dOdmJuUmxlSFFzSUdSaGRHRXBPMXh1SUNBZ0lIMWNiaUFnSUNCc1pYUWdaR1Z3ZEdoekxGeHVJQ0FnSUNBZ1lteHZZMnRRWVhKaGJYTWdQU0IwWlcxd2JHRjBaVk53WldNdWRYTmxRbXh2WTJ0UVlYSmhiWE1nUHlCYlhTQTZJSFZ1WkdWbWFXNWxaRHRjYmlBZ0lDQnBaaUFvZEdWdGNHeGhkR1ZUY0dWakxuVnpaVVJsY0hSb2N5a2dlMXh1SUNBZ0lDQWdhV1lnS0c5d2RHbHZibk11WkdWd2RHaHpLU0I3WEc0Z0lDQWdJQ0FnSUdSbGNIUm9jeUE5WEc0Z0lDQWdJQ0FnSUNBZ1kyOXVkR1Y0ZENBaFBTQnZjSFJwYjI1ekxtUmxjSFJvYzFzd1hWeHVJQ0FnSUNBZ0lDQWdJQ0FnUHlCYlkyOXVkR1Y0ZEYwdVkyOXVZMkYwS0c5d2RHbHZibk11WkdWd2RHaHpLVnh1SUNBZ0lDQWdJQ0FnSUNBZ09pQnZjSFJwYjI1ekxtUmxjSFJvY3p0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUdSbGNIUm9jeUE5SUZ0amIyNTBaWGgwWFR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0JtZFc1amRHbHZiaUJ0WVdsdUtHTnZiblJsZUhRZ0x5b3NJRzl3ZEdsdmJuTXFMeWtnZTF4dUlDQWdJQ0FnY21WMGRYSnVJQ2hjYmlBZ0lDQWdJQ0FnSnljZ0sxeHVJQ0FnSUNBZ0lDQjBaVzF3YkdGMFpWTndaV011YldGcGJpaGNiaUFnSUNBZ0lDQWdJQ0JqYjI1MFlXbHVaWElzWEc0Z0lDQWdJQ0FnSUNBZ1kyOXVkR1Y0ZEN4Y2JpQWdJQ0FnSUNBZ0lDQmpiMjUwWVdsdVpYSXVhR1ZzY0dWeWN5eGNiaUFnSUNBZ0lDQWdJQ0JqYjI1MFlXbHVaWEl1Y0dGeWRHbGhiSE1zWEc0Z0lDQWdJQ0FnSUNBZ1pHRjBZU3hjYmlBZ0lDQWdJQ0FnSUNCaWJHOWphMUJoY21GdGN5eGNiaUFnSUNBZ0lDQWdJQ0JrWlhCMGFITmNiaUFnSUNBZ0lDQWdLVnh1SUNBZ0lDQWdLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnRZV2x1SUQwZ1pYaGxZM1YwWlVSbFkyOXlZWFJ2Y25Nb1hHNGdJQ0FnSUNCMFpXMXdiR0YwWlZOd1pXTXViV0ZwYml4Y2JpQWdJQ0FnSUcxaGFXNHNYRzRnSUNBZ0lDQmpiMjUwWVdsdVpYSXNYRzRnSUNBZ0lDQnZjSFJwYjI1ekxtUmxjSFJvY3lCOGZDQmJYU3hjYmlBZ0lDQWdJR1JoZEdFc1hHNGdJQ0FnSUNCaWJHOWphMUJoY21GdGMxeHVJQ0FnSUNrN1hHNGdJQ0FnY21WMGRYSnVJRzFoYVc0b1kyOXVkR1Y0ZEN3Z2IzQjBhVzl1Y3lrN1hHNGdJSDFjYmx4dUlDQnlaWFF1YVhOVWIzQWdQU0IwY25WbE8xeHVYRzRnSUhKbGRDNWZjMlYwZFhBZ1BTQm1kVzVqZEdsdmJpaHZjSFJwYjI1ektTQjdYRzRnSUNBZ2FXWWdLQ0Z2Y0hScGIyNXpMbkJoY25ScFlXd3BJSHRjYmlBZ0lDQWdJR3hsZENCdFpYSm5aV1JJWld4d1pYSnpJRDBnVlhScGJITXVaWGgwWlc1a0tIdDlMQ0JsYm5ZdWFHVnNjR1Z5Y3l3Z2IzQjBhVzl1Y3k1b1pXeHdaWEp6S1R0Y2JpQWdJQ0FnSUhkeVlYQklaV3h3WlhKelZHOVFZWE56VEc5dmEzVndVSEp2Y0dWeWRIa29iV1Z5WjJWa1NHVnNjR1Z5Y3l3Z1kyOXVkR0ZwYm1WeUtUdGNiaUFnSUNBZ0lHTnZiblJoYVc1bGNpNW9aV3h3WlhKeklEMGdiV1Z5WjJWa1NHVnNjR1Z5Y3p0Y2JseHVJQ0FnSUNBZ2FXWWdLSFJsYlhCc1lYUmxVM0JsWXk1MWMyVlFZWEowYVdGc0tTQjdYRzRnSUNBZ0lDQWdJQzh2SUZWelpTQnRaWEpuWlVsbVRtVmxaR1ZrSUdobGNtVWdkRzhnY0hKbGRtVnVkQ0JqYjIxd2FXeHBibWNnWjJ4dlltRnNJSEJoY25ScFlXeHpJRzExYkhScGNHeGxJSFJwYldWelhHNGdJQ0FnSUNBZ0lHTnZiblJoYVc1bGNpNXdZWEowYVdGc2N5QTlJR052Ym5SaGFXNWxjaTV0WlhKblpVbG1UbVZsWkdWa0tGeHVJQ0FnSUNBZ0lDQWdJRzl3ZEdsdmJuTXVjR0Z5ZEdsaGJITXNYRzRnSUNBZ0lDQWdJQ0FnWlc1MkxuQmhjblJwWVd4elhHNGdJQ0FnSUNBZ0lDazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnBaaUFvZEdWdGNHeGhkR1ZUY0dWakxuVnpaVkJoY25ScFlXd2dmSHdnZEdWdGNHeGhkR1ZUY0dWakxuVnpaVVJsWTI5eVlYUnZjbk1wSUh0Y2JpQWdJQ0FnSUNBZ1kyOXVkR0ZwYm1WeUxtUmxZMjl5WVhSdmNuTWdQU0JWZEdsc2N5NWxlSFJsYm1Rb1hHNGdJQ0FnSUNBZ0lDQWdlMzBzWEc0Z0lDQWdJQ0FnSUNBZ1pXNTJMbVJsWTI5eVlYUnZjbk1zWEc0Z0lDQWdJQ0FnSUNBZ2IzQjBhVzl1Y3k1a1pXTnZjbUYwYjNKelhHNGdJQ0FnSUNBZ0lDazdYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJR052Ym5SaGFXNWxjaTVvYjI5cmN5QTlJSHQ5TzF4dUlDQWdJQ0FnWTI5dWRHRnBibVZ5TG5CeWIzUnZRV05qWlhOelEyOXVkSEp2YkNBOUlHTnlaV0YwWlZCeWIzUnZRV05qWlhOelEyOXVkSEp2YkNodmNIUnBiMjV6S1R0Y2JseHVJQ0FnSUNBZ2JHVjBJR3RsWlhCSVpXeHdaWEpKYmtobGJIQmxjbk1nUFZ4dUlDQWdJQ0FnSUNCdmNIUnBiMjV6TG1Gc2JHOTNRMkZzYkhOVWIwaGxiSEJsY2sxcGMzTnBibWNnZkh4Y2JpQWdJQ0FnSUNBZ2RHVnRjR3hoZEdWWFlYTlFjbVZqYjIxd2FXeGxaRmRwZEdoRGIyMXdhV3hsY2xZM08xeHVJQ0FnSUNBZ2JXOTJaVWhsYkhCbGNsUnZTRzl2YTNNb1kyOXVkR0ZwYm1WeUxDQW5hR1ZzY0dWeVRXbHpjMmx1Wnljc0lHdGxaWEJJWld4d1pYSkpia2hsYkhCbGNuTXBPMXh1SUNBZ0lDQWdiVzkyWlVobGJIQmxjbFJ2U0c5dmEzTW9ZMjl1ZEdGcGJtVnlMQ0FuWW14dlkydElaV3h3WlhKTmFYTnphVzVuSnl3Z2EyVmxjRWhsYkhCbGNrbHVTR1ZzY0dWeWN5azdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUdOdmJuUmhhVzVsY2k1d2NtOTBiMEZqWTJWemMwTnZiblJ5YjJ3Z1BTQnZjSFJwYjI1ekxuQnliM1J2UVdOalpYTnpRMjl1ZEhKdmJEc2dMeThnYVc1MFpYSnVZV3dnYjNCMGFXOXVYRzRnSUNBZ0lDQmpiMjUwWVdsdVpYSXVhR1ZzY0dWeWN5QTlJRzl3ZEdsdmJuTXVhR1ZzY0dWeWN6dGNiaUFnSUNBZ0lHTnZiblJoYVc1bGNpNXdZWEowYVdGc2N5QTlJRzl3ZEdsdmJuTXVjR0Z5ZEdsaGJITTdYRzRnSUNBZ0lDQmpiMjUwWVdsdVpYSXVaR1ZqYjNKaGRHOXljeUE5SUc5d2RHbHZibk11WkdWamIzSmhkRzl5Y3p0Y2JpQWdJQ0FnSUdOdmJuUmhhVzVsY2k1b2IyOXJjeUE5SUc5d2RHbHZibk11YUc5dmEzTTdYRzRnSUNBZ2ZWeHVJQ0I5TzF4dVhHNGdJSEpsZEM1ZlkyaHBiR1FnUFNCbWRXNWpkR2x2YmlocExDQmtZWFJoTENCaWJHOWphMUJoY21GdGN5d2daR1Z3ZEdoektTQjdYRzRnSUNBZ2FXWWdLSFJsYlhCc1lYUmxVM0JsWXk1MWMyVkNiRzlqYTFCaGNtRnRjeUFtSmlBaFlteHZZMnRRWVhKaGJYTXBJSHRjYmlBZ0lDQWdJSFJvY205M0lHNWxkeUJGZUdObGNIUnBiMjRvSjIxMWMzUWdjR0Z6Y3lCaWJHOWpheUJ3WVhKaGJYTW5LVHRjYmlBZ0lDQjlYRzRnSUNBZ2FXWWdLSFJsYlhCc1lYUmxVM0JsWXk1MWMyVkVaWEIwYUhNZ0ppWWdJV1JsY0hSb2N5a2dlMXh1SUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVY0WTJWd2RHbHZiaWduYlhWemRDQndZWE56SUhCaGNtVnVkQ0JrWlhCMGFITW5LVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnlaWFIxY200Z2QzSmhjRkJ5YjJkeVlXMG9YRzRnSUNBZ0lDQmpiMjUwWVdsdVpYSXNYRzRnSUNBZ0lDQnBMRnh1SUNBZ0lDQWdkR1Z0Y0d4aGRHVlRjR1ZqVzJsZExGeHVJQ0FnSUNBZ1pHRjBZU3hjYmlBZ0lDQWdJREFzWEc0Z0lDQWdJQ0JpYkc5amExQmhjbUZ0Y3l4Y2JpQWdJQ0FnSUdSbGNIUm9jMXh1SUNBZ0lDazdYRzRnSUgwN1hHNGdJSEpsZEhWeWJpQnlaWFE3WEc1OVhHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQjNjbUZ3VUhKdlozSmhiU2hjYmlBZ1kyOXVkR0ZwYm1WeUxGeHVJQ0JwTEZ4dUlDQm1iaXhjYmlBZ1pHRjBZU3hjYmlBZ1pHVmpiR0Z5WldSQ2JHOWphMUJoY21GdGN5eGNiaUFnWW14dlkydFFZWEpoYlhNc1hHNGdJR1JsY0hSb2MxeHVLU0I3WEc0Z0lHWjFibU4wYVc5dUlIQnliMmNvWTI5dWRHVjRkQ3dnYjNCMGFXOXVjeUE5SUh0OUtTQjdYRzRnSUNBZ2JHVjBJR04xY25KbGJuUkVaWEIwYUhNZ1BTQmtaWEIwYUhNN1hHNGdJQ0FnYVdZZ0tGeHVJQ0FnSUNBZ1pHVndkR2h6SUNZbVhHNGdJQ0FnSUNCamIyNTBaWGgwSUNFOUlHUmxjSFJvYzFzd1hTQW1KbHh1SUNBZ0lDQWdJU2hqYjI1MFpYaDBJRDA5UFNCamIyNTBZV2x1WlhJdWJuVnNiRU52Ym5SbGVIUWdKaVlnWkdWd2RHaHpXekJkSUQwOVBTQnVkV3hzS1Z4dUlDQWdJQ2tnZTF4dUlDQWdJQ0FnWTNWeWNtVnVkRVJsY0hSb2N5QTlJRnRqYjI1MFpYaDBYUzVqYjI1allYUW9aR1Z3ZEdoektUdGNiaUFnSUNCOVhHNWNiaUFnSUNCeVpYUjFjbTRnWm00b1hHNGdJQ0FnSUNCamIyNTBZV2x1WlhJc1hHNGdJQ0FnSUNCamIyNTBaWGgwTEZ4dUlDQWdJQ0FnWTI5dWRHRnBibVZ5TG1obGJIQmxjbk1zWEc0Z0lDQWdJQ0JqYjI1MFlXbHVaWEl1Y0dGeWRHbGhiSE1zWEc0Z0lDQWdJQ0J2Y0hScGIyNXpMbVJoZEdFZ2ZId2daR0YwWVN4Y2JpQWdJQ0FnSUdKc2IyTnJVR0Z5WVcxeklDWW1JRnR2Y0hScGIyNXpMbUpzYjJOclVHRnlZVzF6WFM1amIyNWpZWFFvWW14dlkydFFZWEpoYlhNcExGeHVJQ0FnSUNBZ1kzVnljbVZ1ZEVSbGNIUm9jMXh1SUNBZ0lDazdYRzRnSUgxY2JseHVJQ0J3Y205bklEMGdaWGhsWTNWMFpVUmxZMjl5WVhSdmNuTW9abTRzSUhCeWIyY3NJR052Ym5SaGFXNWxjaXdnWkdWd2RHaHpMQ0JrWVhSaExDQmliRzlqYTFCaGNtRnRjeWs3WEc1Y2JpQWdjSEp2Wnk1d2NtOW5jbUZ0SUQwZ2FUdGNiaUFnY0hKdlp5NWtaWEIwYUNBOUlHUmxjSFJvY3lBL0lHUmxjSFJvY3k1c1pXNW5kR2dnT2lBd08xeHVJQ0J3Y205bkxtSnNiMk5yVUdGeVlXMXpJRDBnWkdWamJHRnlaV1JDYkc5amExQmhjbUZ0Y3lCOGZDQXdPMXh1SUNCeVpYUjFjbTRnY0hKdlp6dGNibjFjYmx4dUx5b3FYRzRnS2lCVWFHbHpJR2x6SUdOMWNuSmxiblJzZVNCd1lYSjBJRzltSUhSb1pTQnZabVpwWTJsaGJDQkJVRWtzSUhSb1pYSmxabTl5WlNCcGJYQnNaVzFsYm5SaGRHbHZiaUJrWlhSaGFXeHpJSE5vYjNWc1pDQnViM1FnWW1VZ1kyaGhibWRsWkM1Y2JpQXFMMXh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJSEpsYzI5c2RtVlFZWEowYVdGc0tIQmhjblJwWVd3c0lHTnZiblJsZUhRc0lHOXdkR2x2Ym5NcElIdGNiaUFnYVdZZ0tDRndZWEowYVdGc0tTQjdYRzRnSUNBZ2FXWWdLRzl3ZEdsdmJuTXVibUZ0WlNBOVBUMGdKMEJ3WVhKMGFXRnNMV0pzYjJOckp5a2dlMXh1SUNBZ0lDQWdjR0Z5ZEdsaGJDQTlJRzl3ZEdsdmJuTXVaR0YwWVZzbmNHRnlkR2xoYkMxaWJHOWpheWRkTzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQndZWEowYVdGc0lEMGdiM0IwYVc5dWN5NXdZWEowYVdGc2MxdHZjSFJwYjI1ekxtNWhiV1ZkTzF4dUlDQWdJSDFjYmlBZ2ZTQmxiSE5sSUdsbUlDZ2hjR0Z5ZEdsaGJDNWpZV3hzSUNZbUlDRnZjSFJwYjI1ekxtNWhiV1VwSUh0Y2JpQWdJQ0F2THlCVWFHbHpJR2x6SUdFZ1pIbHVZVzFwWXlCd1lYSjBhV0ZzSUhSb1lYUWdjbVYwZFhKdVpXUWdZU0J6ZEhKcGJtZGNiaUFnSUNCdmNIUnBiMjV6TG01aGJXVWdQU0J3WVhKMGFXRnNPMXh1SUNBZ0lIQmhjblJwWVd3Z1BTQnZjSFJwYjI1ekxuQmhjblJwWVd4elczQmhjblJwWVd4ZE8xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCd1lYSjBhV0ZzTzF4dWZWeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdhVzUyYjJ0bFVHRnlkR2xoYkNod1lYSjBhV0ZzTENCamIyNTBaWGgwTENCdmNIUnBiMjV6S1NCN1hHNGdJQzh2SUZWelpTQjBhR1VnWTNWeWNtVnVkQ0JqYkc5emRYSmxJR052Ym5SbGVIUWdkRzhnYzJGMlpTQjBhR1VnY0dGeWRHbGhiQzFpYkc5amF5QnBaaUIwYUdseklIQmhjblJwWVd4Y2JpQWdZMjl1YzNRZ1kzVnljbVZ1ZEZCaGNuUnBZV3hDYkc5amF5QTlJRzl3ZEdsdmJuTXVaR0YwWVNBbUppQnZjSFJwYjI1ekxtUmhkR0ZiSjNCaGNuUnBZV3d0WW14dlkyc25YVHRjYmlBZ2IzQjBhVzl1Y3k1d1lYSjBhV0ZzSUQwZ2RISjFaVHRjYmlBZ2FXWWdLRzl3ZEdsdmJuTXVhV1J6S1NCN1hHNGdJQ0FnYjNCMGFXOXVjeTVrWVhSaExtTnZiblJsZUhSUVlYUm9JRDBnYjNCMGFXOXVjeTVwWkhOYk1GMGdmSHdnYjNCMGFXOXVjeTVrWVhSaExtTnZiblJsZUhSUVlYUm9PMXh1SUNCOVhHNWNiaUFnYkdWMElIQmhjblJwWVd4Q2JHOWphenRjYmlBZ2FXWWdLRzl3ZEdsdmJuTXVabTRnSmlZZ2IzQjBhVzl1Y3k1bWJpQWhQVDBnYm05dmNDa2dlMXh1SUNBZ0lHOXdkR2x2Ym5NdVpHRjBZU0E5SUdOeVpXRjBaVVp5WVcxbEtHOXdkR2x2Ym5NdVpHRjBZU2s3WEc0Z0lDQWdMeThnVjNKaGNIQmxjaUJtZFc1amRHbHZiaUIwYnlCblpYUWdZV05qWlhOeklIUnZJR04xY25KbGJuUlFZWEowYVdGc1FteHZZMnNnWm5KdmJTQjBhR1VnWTJ4dmMzVnlaVnh1SUNBZ0lHeGxkQ0JtYmlBOUlHOXdkR2x2Ym5NdVptNDdYRzRnSUNBZ2NHRnlkR2xoYkVKc2IyTnJJRDBnYjNCMGFXOXVjeTVrWVhSaFd5ZHdZWEowYVdGc0xXSnNiMk5ySjEwZ1BTQm1kVzVqZEdsdmJpQndZWEowYVdGc1FteHZZMnRYY21Gd2NHVnlLRnh1SUNBZ0lDQWdZMjl1ZEdWNGRDeGNiaUFnSUNBZ0lHOXdkR2x2Ym5NZ1BTQjdmVnh1SUNBZ0lDa2dlMXh1SUNBZ0lDQWdMeThnVW1WemRHOXlaU0IwYUdVZ2NHRnlkR2xoYkMxaWJHOWpheUJtY205dElIUm9aU0JqYkc5emRYSmxJR1p2Y2lCMGFHVWdaWGhsWTNWMGFXOXVJRzltSUhSb1pTQmliRzlqYTF4dUlDQWdJQ0FnTHk4Z2FTNWxMaUIwYUdVZ2NHRnlkQ0JwYm5OcFpHVWdkR2hsSUdKc2IyTnJJRzltSUhSb1pTQndZWEowYVdGc0lHTmhiR3d1WEc0Z0lDQWdJQ0J2Y0hScGIyNXpMbVJoZEdFZ1BTQmpjbVZoZEdWR2NtRnRaU2h2Y0hScGIyNXpMbVJoZEdFcE8xeHVJQ0FnSUNBZ2IzQjBhVzl1Y3k1a1lYUmhXeWR3WVhKMGFXRnNMV0pzYjJOckoxMGdQU0JqZFhKeVpXNTBVR0Z5ZEdsaGJFSnNiMk5yTzF4dUlDQWdJQ0FnY21WMGRYSnVJR1p1S0dOdmJuUmxlSFFzSUc5d2RHbHZibk1wTzF4dUlDQWdJSDA3WEc0Z0lDQWdhV1lnS0dadUxuQmhjblJwWVd4ektTQjdYRzRnSUNBZ0lDQnZjSFJwYjI1ekxuQmhjblJwWVd4eklEMGdWWFJwYkhNdVpYaDBaVzVrS0h0OUxDQnZjSFJwYjI1ekxuQmhjblJwWVd4ekxDQm1iaTV3WVhKMGFXRnNjeWs3WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnYVdZZ0tIQmhjblJwWVd3Z1BUMDlJSFZ1WkdWbWFXNWxaQ0FtSmlCd1lYSjBhV0ZzUW14dlkyc3BJSHRjYmlBZ0lDQndZWEowYVdGc0lEMGdjR0Z5ZEdsaGJFSnNiMk5yTzF4dUlDQjlYRzVjYmlBZ2FXWWdLSEJoY25ScFlXd2dQVDA5SUhWdVpHVm1hVzVsWkNrZ2UxeHVJQ0FnSUhSb2NtOTNJRzVsZHlCRmVHTmxjSFJwYjI0b0oxUm9aU0J3WVhKMGFXRnNJQ2NnS3lCdmNIUnBiMjV6TG01aGJXVWdLeUFuSUdOdmRXeGtJRzV2ZENCaVpTQm1iM1Z1WkNjcE8xeHVJQ0I5SUdWc2MyVWdhV1lnS0hCaGNuUnBZV3dnYVc1emRHRnVZMlZ2WmlCR2RXNWpkR2x2YmlrZ2UxeHVJQ0FnSUhKbGRIVnliaUJ3WVhKMGFXRnNLR052Ym5SbGVIUXNJRzl3ZEdsdmJuTXBPMXh1SUNCOVhHNTlYRzVjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJ1YjI5d0tDa2dlMXh1SUNCeVpYUjFjbTRnSnljN1hHNTlYRzVjYm1aMWJtTjBhVzl1SUdsdWFYUkVZWFJoS0dOdmJuUmxlSFFzSUdSaGRHRXBJSHRjYmlBZ2FXWWdLQ0ZrWVhSaElIeDhJQ0VvSjNKdmIzUW5JR2x1SUdSaGRHRXBLU0I3WEc0Z0lDQWdaR0YwWVNBOUlHUmhkR0VnUHlCamNtVmhkR1ZHY21GdFpTaGtZWFJoS1NBNklIdDlPMXh1SUNBZ0lHUmhkR0V1Y205dmRDQTlJR052Ym5SbGVIUTdYRzRnSUgxY2JpQWdjbVYwZFhKdUlHUmhkR0U3WEc1OVhHNWNibVoxYm1OMGFXOXVJR1Y0WldOMWRHVkVaV052Y21GMGIzSnpLR1p1TENCd2NtOW5MQ0JqYjI1MFlXbHVaWElzSUdSbGNIUm9jeXdnWkdGMFlTd2dZbXh2WTJ0UVlYSmhiWE1wSUh0Y2JpQWdhV1lnS0dadUxtUmxZMjl5WVhSdmNpa2dlMXh1SUNBZ0lHeGxkQ0J3Y205d2N5QTlJSHQ5TzF4dUlDQWdJSEJ5YjJjZ1BTQm1iaTVrWldOdmNtRjBiM0lvWEc0Z0lDQWdJQ0J3Y205bkxGeHVJQ0FnSUNBZ2NISnZjSE1zWEc0Z0lDQWdJQ0JqYjI1MFlXbHVaWElzWEc0Z0lDQWdJQ0JrWlhCMGFITWdKaVlnWkdWd2RHaHpXekJkTEZ4dUlDQWdJQ0FnWkdGMFlTeGNiaUFnSUNBZ0lHSnNiMk5yVUdGeVlXMXpMRnh1SUNBZ0lDQWdaR1Z3ZEdoelhHNGdJQ0FnS1R0Y2JpQWdJQ0JWZEdsc2N5NWxlSFJsYm1Rb2NISnZaeXdnY0hKdmNITXBPMXh1SUNCOVhHNGdJSEpsZEhWeWJpQndjbTluTzF4dWZWeHVYRzVtZFc1amRHbHZiaUIzY21Gd1NHVnNjR1Z5YzFSdlVHRnpjMHh2YjJ0MWNGQnliM0JsY25SNUtHMWxjbWRsWkVobGJIQmxjbk1zSUdOdmJuUmhhVzVsY2lrZ2UxeHVJQ0JQWW1wbFkzUXVhMlY1Y3lodFpYSm5aV1JJWld4d1pYSnpLUzVtYjNKRllXTm9LR2hsYkhCbGNrNWhiV1VnUFQ0Z2UxeHVJQ0FnSUd4bGRDQm9aV3h3WlhJZ1BTQnRaWEpuWldSSVpXeHdaWEp6VzJobGJIQmxjazVoYldWZE8xeHVJQ0FnSUcxbGNtZGxaRWhsYkhCbGNuTmJhR1ZzY0dWeVRtRnRaVjBnUFNCd1lYTnpURzl2YTNWd1VISnZjR1Z5ZEhsUGNIUnBiMjRvYUdWc2NHVnlMQ0JqYjI1MFlXbHVaWElwTzF4dUlDQjlLVHRjYm4xY2JseHVablZ1WTNScGIyNGdjR0Z6YzB4dmIydDFjRkJ5YjNCbGNuUjVUM0IwYVc5dUtHaGxiSEJsY2l3Z1kyOXVkR0ZwYm1WeUtTQjdYRzRnSUdOdmJuTjBJR3h2YjJ0MWNGQnliM0JsY25SNUlEMGdZMjl1ZEdGcGJtVnlMbXh2YjJ0MWNGQnliM0JsY25SNU8xeHVJQ0J5WlhSMWNtNGdkM0poY0VobGJIQmxjaWhvWld4d1pYSXNJRzl3ZEdsdmJuTWdQVDRnZTF4dUlDQWdJSEpsZEhWeWJpQlZkR2xzY3k1bGVIUmxibVFvZXlCc2IyOXJkWEJRY205d1pYSjBlU0I5TENCdmNIUnBiMjV6S1R0Y2JpQWdmU2s3WEc1OVhHNGlYWDA9XG4iLAogICAgIi8qIGdsb2JhbCBnbG9iYWxUaGlzICovXG4ndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZ1bmN0aW9uIChIYW5kbGViYXJzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIC8vIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9nbG9iYWx0aGlzXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuO1xuICAgIE9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygnX19tYWdpY19fJywgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSk7XG4gICAgX19tYWdpY19fLmdsb2JhbFRoaXMgPSBfX21hZ2ljX187IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgICBkZWxldGUgT2JqZWN0LnByb3RvdHlwZS5fX21hZ2ljX187XG4gIH0pKCk7XG5cbiAgdmFyICRIYW5kbGViYXJzID0gZ2xvYmFsVGhpcy5IYW5kbGViYXJzO1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIEhhbmRsZWJhcnMubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZ2xvYmFsVGhpcy5IYW5kbGViYXJzID09PSBIYW5kbGViYXJzKSB7XG4gICAgICBnbG9iYWxUaGlzLkhhbmRsZWJhcnMgPSAkSGFuZGxlYmFycztcbiAgICB9XG4gICAgcmV0dXJuIEhhbmRsZWJhcnM7XG4gIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1THk0dUwyeHBZaTlvWVc1a2JHVmlZWEp6TDI1dkxXTnZibVpzYVdOMExtcHpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSTdPenM3TzNGQ1FVTmxMRlZCUVZNc1ZVRkJWU3hGUVVGRk96czdRVUZIYkVNc1IwRkJReXhaUVVGWE8wRkJRMVlzVVVGQlNTeFBRVUZQTEZWQlFWVXNTMEZCU3l4UlFVRlJMRVZCUVVVc1QwRkJUenRCUVVNelF5eFZRVUZOTEVOQlFVTXNVMEZCVXl4RFFVRkRMR2RDUVVGblFpeERRVUZETEZkQlFWY3NSVUZCUlN4WlFVRlhPMEZCUTNoRUxHRkJRVThzU1VGQlNTeERRVUZETzB0QlEySXNRMEZCUXl4RFFVRkRPMEZCUTBnc1lVRkJVeXhEUVVGRExGVkJRVlVzUjBGQlJ5eFRRVUZUTEVOQlFVTTdRVUZEYWtNc1YwRkJUeXhOUVVGTkxFTkJRVU1zVTBGQlV5eERRVUZETEZOQlFWTXNRMEZCUXp0SFFVTnVReXhEUVVGQkxFVkJRVWNzUTBGQlF6czdRVUZGVEN4TlFVRk5MRmRCUVZjc1IwRkJSeXhWUVVGVkxFTkJRVU1zVlVGQlZTeERRVUZET3pzN1FVRkhNVU1zV1VGQlZTeERRVUZETEZWQlFWVXNSMEZCUnl4WlFVRlhPMEZCUTJwRExGRkJRVWtzVlVGQlZTeERRVUZETEZWQlFWVXNTMEZCU3l4VlFVRlZMRVZCUVVVN1FVRkRlRU1zWjBKQlFWVXNRMEZCUXl4VlFVRlZMRWRCUVVjc1YwRkJWeXhEUVVGRE8wdEJRM0pETzBGQlEwUXNWMEZCVHl4VlFVRlZMRU5CUVVNN1IwRkRia0lzUTBGQlF6dERRVU5JSWl3aVptbHNaU0k2SW01dkxXTnZibVpzYVdOMExtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHlvZ1oyeHZZbUZzSUdkc2IySmhiRlJvYVhNZ0tpOWNibVY0Y0c5eWRDQmtaV1poZFd4MElHWjFibU4wYVc5dUtFaGhibVJzWldKaGNuTXBJSHRjYmlBZ0x5b2dhWE4wWVc1aWRXd2dhV2R1YjNKbElHNWxlSFFnS2k5Y2JpQWdMeThnYUhSMGNITTZMeTl0WVhSb2FXRnpZbmx1Wlc1ekxtSmxMMjV2ZEdWekwyZHNiMkpoYkhSb2FYTmNiaUFnS0daMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUdsbUlDaDBlWEJsYjJZZ1oyeHZZbUZzVkdocGN5QTlQVDBnSjI5aWFtVmpkQ2NwSUhKbGRIVnlianRjYmlBZ0lDQlBZbXBsWTNRdWNISnZkRzkwZVhCbExsOWZaR1ZtYVc1bFIyVjBkR1Z5WDE4b0oxOWZiV0ZuYVdOZlh5Y3NJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNN1hHNGdJQ0FnZlNrN1hHNGdJQ0FnWDE5dFlXZHBZMTlmTG1kc2IySmhiRlJvYVhNZ1BTQmZYMjFoWjJsalgxODdJQzh2SUdWemJHbHVkQzFrYVhOaFlteGxMV3hwYm1VZ2JtOHRkVzVrWldaY2JpQWdJQ0JrWld4bGRHVWdUMkpxWldOMExuQnliM1J2ZEhsd1pTNWZYMjFoWjJsalgxODdYRzRnSUgwcEtDazdYRzVjYmlBZ1kyOXVjM1FnSkVoaGJtUnNaV0poY25NZ1BTQm5iRzlpWVd4VWFHbHpMa2hoYm1Sc1pXSmhjbk03WEc1Y2JpQWdMeW9nYVhOMFlXNWlkV3dnYVdkdWIzSmxJRzVsZUhRZ0tpOWNiaUFnU0dGdVpHeGxZbUZ5Y3k1dWIwTnZibVpzYVdOMElEMGdablZ1WTNScGIyNG9LU0I3WEc0Z0lDQWdhV1lnS0dkc2IySmhiRlJvYVhNdVNHRnVaR3hsWW1GeWN5QTlQVDBnU0dGdVpHeGxZbUZ5Y3lrZ2UxeHVJQ0FnSUNBZ1oyeHZZbUZzVkdocGN5NUlZVzVrYkdWaVlYSnpJRDBnSkVoaGJtUnNaV0poY25NN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQklZVzVrYkdWaVlYSnpPMXh1SUNCOU8xeHVmVnh1SWwxOVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG4vLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbi8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gZWxzZSB7IHZhciBuZXdPYmogPSB7fTsgaWYgKG9iaiAhPSBudWxsKSB7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSBuZXdPYmpbJ2RlZmF1bHQnXSA9IG9iajsgcmV0dXJuIG5ld09iajsgfSB9XG5cbnZhciBfaGFuZGxlYmFyc0Jhc2UgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvYmFzZScpO1xuXG52YXIgYmFzZSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9oYW5kbGViYXJzQmFzZSk7XG5cbi8vIEVhY2ggb2YgdGhlc2UgYXVnbWVudCB0aGUgSGFuZGxlYmFycyBvYmplY3QuIE5vIG5lZWQgdG8gc2V0dXAgaGVyZS5cbi8vIChUaGlzIGlzIGRvbmUgdG8gZWFzaWx5IHNoYXJlIGNvZGUgYmV0d2VlbiBjb21tb25qcyBhbmQgYnJvd3NlIGVudnMpXG5cbnZhciBfaGFuZGxlYmFyc1NhZmVTdHJpbmcgPSByZXF1aXJlKCcuL2hhbmRsZWJhcnMvc2FmZS1zdHJpbmcnKTtcblxudmFyIF9oYW5kbGViYXJzU2FmZVN0cmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYW5kbGViYXJzU2FmZVN0cmluZyk7XG5cbnZhciBfaGFuZGxlYmFyc0V4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy9leGNlcHRpb24nKTtcblxudmFyIF9oYW5kbGViYXJzRXhjZXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNFeGNlcHRpb24pO1xuXG52YXIgX2hhbmRsZWJhcnNVdGlscyA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy91dGlscycpO1xuXG52YXIgVXRpbHMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfaGFuZGxlYmFyc1V0aWxzKTtcblxudmFyIF9oYW5kbGViYXJzUnVudGltZSA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy9ydW50aW1lJyk7XG5cbnZhciBydW50aW1lID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2hhbmRsZWJhcnNSdW50aW1lKTtcblxudmFyIF9oYW5kbGViYXJzTm9Db25mbGljdCA9IHJlcXVpcmUoJy4vaGFuZGxlYmFycy9uby1jb25mbGljdCcpO1xuXG52YXIgX2hhbmRsZWJhcnNOb0NvbmZsaWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhbmRsZWJhcnNOb0NvbmZsaWN0KTtcblxuLy8gRm9yIGNvbXBhdGliaWxpdHkgYW5kIHVzYWdlIG91dHNpZGUgb2YgbW9kdWxlIHN5c3RlbXMsIG1ha2UgdGhlIEhhbmRsZWJhcnMgb2JqZWN0IGEgbmFtZXNwYWNlXG5mdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBoYiA9IG5ldyBiYXNlLkhhbmRsZWJhcnNFbnZpcm9ubWVudCgpO1xuXG4gIFV0aWxzLmV4dGVuZChoYiwgYmFzZSk7XG4gIGhiLlNhZmVTdHJpbmcgPSBfaGFuZGxlYmFyc1NhZmVTdHJpbmcyWydkZWZhdWx0J107XG4gIGhiLkV4Y2VwdGlvbiA9IF9oYW5kbGViYXJzRXhjZXB0aW9uMlsnZGVmYXVsdCddO1xuICBoYi5VdGlscyA9IFV0aWxzO1xuICBoYi5lc2NhcGVFeHByZXNzaW9uID0gVXRpbHMuZXNjYXBlRXhwcmVzc2lvbjtcblxuICBoYi5WTSA9IHJ1bnRpbWU7XG4gIGhiLnRlbXBsYXRlID0gZnVuY3Rpb24gKHNwZWMpIHtcbiAgICByZXR1cm4gcnVudGltZS50ZW1wbGF0ZShzcGVjLCBoYik7XG4gIH07XG5cbiAgcmV0dXJuIGhiO1xufVxuXG52YXIgaW5zdCA9IGNyZWF0ZSgpO1xuaW5zdC5jcmVhdGUgPSBjcmVhdGU7XG5cbl9oYW5kbGViYXJzTm9Db25mbGljdDJbJ2RlZmF1bHQnXShpbnN0KTtcblxuaW5zdFsnZGVmYXVsdCddID0gaW5zdDtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gaW5zdDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMMnhwWWk5b1lXNWtiR1ZpWVhKekxuSjFiblJwYldVdWFuTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN096czdPRUpCUVhOQ0xHMUNRVUZ0UWpzN1NVRkJOMElzU1VGQlNUczdPenM3YjBOQlNVOHNNRUpCUVRCQ096czdPMjFEUVVNelFpeDNRa0ZCZDBJN096czdLMEpCUTNaQ0xHOUNRVUZ2UWpzN1NVRkJMMElzUzBGQlN6czdhVU5CUTFFc2MwSkJRWE5DT3p0SlFVRnVReXhQUVVGUE96dHZRMEZGU1N3d1FrRkJNRUk3T3pzN08wRkJSMnBFTEZOQlFWTXNUVUZCVFN4SFFVRkhPMEZCUTJoQ0xFMUJRVWtzUlVGQlJTeEhRVUZITEVsQlFVa3NTVUZCU1N4RFFVRkRMSEZDUVVGeFFpeEZRVUZGTEVOQlFVTTdPMEZCUlRGRExFOUJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTXNSVUZCUlN4RlFVRkZMRWxCUVVrc1EwRkJReXhEUVVGRE8wRkJRM1pDTEVsQlFVVXNRMEZCUXl4VlFVRlZMRzlEUVVGaExFTkJRVU03UVVGRE0wSXNTVUZCUlN4RFFVRkRMRk5CUVZNc2JVTkJRVmtzUTBGQlF6dEJRVU42UWl4SlFVRkZMRU5CUVVNc1MwRkJTeXhIUVVGSExFdEJRVXNzUTBGQlF6dEJRVU5xUWl4SlFVRkZMRU5CUVVNc1owSkJRV2RDTEVkQlFVY3NTMEZCU3l4RFFVRkRMR2RDUVVGblFpeERRVUZET3p0QlFVVTNReXhKUVVGRkxFTkJRVU1zUlVGQlJTeEhRVUZITEU5QlFVOHNRMEZCUXp0QlFVTm9RaXhKUVVGRkxFTkJRVU1zVVVGQlVTeEhRVUZITEZWQlFWTXNTVUZCU1N4RlFVRkZPMEZCUXpOQ0xGZEJRVThzVDBGQlR5eERRVUZETEZGQlFWRXNRMEZCUXl4SlFVRkpMRVZCUVVVc1JVRkJSU3hEUVVGRExFTkJRVU03UjBGRGJrTXNRMEZCUXpzN1FVRkZSaXhUUVVGUExFVkJRVVVzUTBGQlF6dERRVU5ZT3p0QlFVVkVMRWxCUVVrc1NVRkJTU3hIUVVGSExFMUJRVTBzUlVGQlJTeERRVUZETzBGQlEzQkNMRWxCUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzVFVGQlRTeERRVUZET3p0QlFVVnlRaXhyUTBGQlZ5eEpRVUZKTEVOQlFVTXNRMEZCUXpzN1FVRkZha0lzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJRenM3Y1VKQlJWSXNTVUZCU1NJc0ltWnBiR1VpT2lKb1lXNWtiR1ZpWVhKekxuSjFiblJwYldVdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpwYlhCdmNuUWdLaUJoY3lCaVlYTmxJR1p5YjIwZ0p5NHZhR0Z1Wkd4bFltRnljeTlpWVhObEp6dGNibHh1THk4Z1JXRmphQ0J2WmlCMGFHVnpaU0JoZFdkdFpXNTBJSFJvWlNCSVlXNWtiR1ZpWVhKeklHOWlhbVZqZEM0Z1RtOGdibVZsWkNCMGJ5QnpaWFIxY0NCb1pYSmxMbHh1THk4Z0tGUm9hWE1nYVhNZ1pHOXVaU0IwYnlCbFlYTnBiSGtnYzJoaGNtVWdZMjlrWlNCaVpYUjNaV1Z1SUdOdmJXMXZibXB6SUdGdVpDQmljbTkzYzJVZ1pXNTJjeWxjYm1sdGNHOXlkQ0JUWVdabFUzUnlhVzVuSUdaeWIyMGdKeTR2YUdGdVpHeGxZbUZ5Y3k5ellXWmxMWE4wY21sdVp5YzdYRzVwYlhCdmNuUWdSWGhqWlhCMGFXOXVJR1p5YjIwZ0p5NHZhR0Z1Wkd4bFltRnljeTlsZUdObGNIUnBiMjRuTzF4dWFXMXdiM0owSUNvZ1lYTWdWWFJwYkhNZ1puSnZiU0FuTGk5b1lXNWtiR1ZpWVhKekwzVjBhV3h6Snp0Y2JtbHRjRzl5ZENBcUlHRnpJSEoxYm5ScGJXVWdabkp2YlNBbkxpOW9ZVzVrYkdWaVlYSnpMM0oxYm5ScGJXVW5PMXh1WEc1cGJYQnZjblFnYm05RGIyNW1iR2xqZENCbWNtOXRJQ2N1TDJoaGJtUnNaV0poY25NdmJtOHRZMjl1Wm14cFkzUW5PMXh1WEc0dkx5QkdiM0lnWTI5dGNHRjBhV0pwYkdsMGVTQmhibVFnZFhOaFoyVWdiM1YwYzJsa1pTQnZaaUJ0YjJSMWJHVWdjM2x6ZEdWdGN5d2diV0ZyWlNCMGFHVWdTR0Z1Wkd4bFltRnljeUJ2WW1wbFkzUWdZU0J1WVcxbGMzQmhZMlZjYm1aMWJtTjBhVzl1SUdOeVpXRjBaU2dwSUh0Y2JpQWdiR1YwSUdoaUlEMGdibVYzSUdKaGMyVXVTR0Z1Wkd4bFltRnljMFZ1ZG1seWIyNXRaVzUwS0NrN1hHNWNiaUFnVlhScGJITXVaWGgwWlc1a0tHaGlMQ0JpWVhObEtUdGNiaUFnYUdJdVUyRm1aVk4wY21sdVp5QTlJRk5oWm1WVGRISnBibWM3WEc0Z0lHaGlMa1Y0WTJWd2RHbHZiaUE5SUVWNFkyVndkR2x2Ymp0Y2JpQWdhR0l1VlhScGJITWdQU0JWZEdsc2N6dGNiaUFnYUdJdVpYTmpZWEJsUlhod2NtVnpjMmx2YmlBOUlGVjBhV3h6TG1WelkyRndaVVY0Y0hKbGMzTnBiMjQ3WEc1Y2JpQWdhR0l1VmswZ1BTQnlkVzUwYVcxbE8xeHVJQ0JvWWk1MFpXMXdiR0YwWlNBOUlHWjFibU4wYVc5dUtITndaV01wSUh0Y2JpQWdJQ0J5WlhSMWNtNGdjblZ1ZEdsdFpTNTBaVzF3YkdGMFpTaHpjR1ZqTENCb1lpazdYRzRnSUgwN1hHNWNiaUFnY21WMGRYSnVJR2hpTzF4dWZWeHVYRzVzWlhRZ2FXNXpkQ0E5SUdOeVpXRjBaU2dwTzF4dWFXNXpkQzVqY21WaGRHVWdQU0JqY21WaGRHVTdYRzVjYm01dlEyOXVabXhwWTNRb2FXNXpkQ2s3WEc1Y2JtbHVjM1JiSjJSbFptRjFiSFFuWFNBOUlHbHVjM1E3WEc1Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUdsdWMzUTdYRzRpWFgwPVxuIiwKICAgICIvLyBDcmVhdGUgYSBzaW1wbGUgcGF0aCBhbGlhcyB0byBhbGxvdyBicm93c2VyaWZ5IHRvIHJlc29sdmVcbi8vIHRoZSBydW50aW1lIG9uIGEgc3VwcG9ydGVkIHBhdGguXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGlzdC9janMvaGFuZGxlYmFycy5ydW50aW1lJylbJ2RlZmF1bHQnXTtcbiIsCiAgICAiZXhwb3J0IGludGVyZmFjZSBJQnJhbmRWZXJzaW9uIHtcbiAgICBicmFuZDogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBzdHJpbmdbXTtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJBZ2VudCB7XG4gICAgYnJvd3NlcnM/OiBJQnJhbmRWZXJzaW9uW107XG4gICAgcGxhdGZvcm0/OiBJQnJhbmRWZXJzaW9uO1xuICAgIG1vYmlsZT86IG51bWJlcjtcbiAgICBhcmNoaXRlY3R1cmU/OiBzdHJpbmc7XG4gICAgYml0bmVzcz86IHN0cmluZztcbiAgICBtb2RlbD86IHN0cmluZztcbiAgICBzb3VyY2U/OiBudW1iZXI7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgY29uc3QgQWdlbnRUeXBlcyA9IHtcbiAgICBTZXNzaW9uOiAxLFxuICAgIERldmljZTogMixcbiAgICBVc2VyOiAzXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElVaWQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgYXR5cGU/OiBudW1iZXI7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFaWQge1xuICAgIHNvdXJjZTogc3RyaW5nO1xuICAgIHVpZHM6IElVaWRbXTtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cHBseUNoYWluTm9kZSB7XG4gICAgYXNpPzogc3RyaW5nO1xuICAgIHNpZD86IHN0cmluZztcbiAgICBocD86IG51bWJlcjtcbiAgICByaWQ/OiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBkb21haW4/OiBzdHJpbmc7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTdXBwbHlDaGFpbiB7XG4gICAgY29tcGxldGU6IG51bWJlcjtcbiAgICBub2RlczogSVN1cHBseUNoYWluTm9kZVtdO1xuICAgIHZlcjogc3RyaW5nO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2hhbm5lbCB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBkb21haW4/OiBzdHJpbmc7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOZXR3b3JrIHtcbiAgICBpZD86IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIGRvbWFpbj86IHN0cmluZztcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnQge1xuICAgIGlkPzogc3RyaW5nO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgdmFsdWU/OiBzdHJpbmc7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRhIHtcbiAgICBpZD86IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIHNlZ21lbnQ/OiBJU2VnbWVudFtdO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlciB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgYnV5ZXJ1aWQ/OiBzdHJpbmc7XG4gICAgeW9iPzogbnVtYmVyO1xuICAgIGdlbmRlcj86IHN0cmluZztcbiAgICBrZXl3b3Jkcz86IHN0cmluZztcbiAgICBrd2FycmF5Pzogc3RyaW5nW107XG4gICAgY3VzdG9tZGF0YT86IHN0cmluZztcbiAgICBnZW8/OiBJR2VvO1xuICAgIGRhdGE/OiBJRGF0YVtdO1xuICAgIGNjb25zZW50Pzogc3RyaW5nO1xuICAgIGVpZHM/OiBJRWlkW107XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElHZW8ge1xuICAgIGxhdD86IG51bWJlcjtcbiAgICBsb24/OiBudW1iZXI7XG4gICAgdHlwZT86IG51bWJlcjtcbiAgICBhY2N1cmFjeT86IG51bWJlcjtcbiAgICBsYXN0Zml4PzogbnVtYmVyO1xuICAgIGlwc2VydmljZT86IG51bWJlcjtcbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICByZWdpb25maXBzMTA0Pzogc3RyaW5nO1xuICAgIG1ldHJvPzogc3RyaW5nO1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgemlwPzogc3RyaW5nO1xuICAgIHV0Y29mZnNldD86IG51bWJlcjtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBjb25zdCBBZENvbTEwRGV2aWNlVHlwZXMgPSB7XG4gICAgTW9iaWxlOiAxLFxuICAgIFBDOiAyLFxuICAgIENUVjogMyxcbiAgICBQaG9uZTogNCxcbiAgICBUYWJsZXQ6IDUsXG4gICAgQ29ubmVjdGVkOiA2LFxuICAgIFNldFRvcDogNyxcbiAgICBPT0g6IDhcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURldmljZSB7XG4gICAgdWE/OiBzdHJpbmc7XG4gICAgZ2VvPzogSUdlbztcbiAgICBkbnQ/OiBudW1iZXI7XG4gICAgbG10PzogbnVtYmVyO1xuICAgIGlwPzogc3RyaW5nO1xuICAgIGlwdjY/OiBzdHJpbmc7XG4gICAgZGV2aWNldHlwZT86IG51bWJlcjtcbiAgICBtYWtlPzogc3RyaW5nO1xuICAgIG1vZGVsPzogc3RyaW5nO1xuICAgIG9zPzogc3RyaW5nO1xuICAgIG9zdj86IHN0cmluZztcbiAgICBod3Y/OiBzdHJpbmc7XG4gICAgaD86IG51bWJlcjtcbiAgICB3PzogbnVtYmVyO1xuICAgIHBwaT86IG51bWJlcjtcbiAgICBweHJhdGlvPzogbnVtYmVyO1xuICAgIGpzPzogbnVtYmVyO1xuICAgIGdlb2ZldGNoPzogbnVtYmVyO1xuICAgIGZsYXNodmVyPzogc3RyaW5nO1xuICAgIGxhbmd1YWdlPzogc3RyaW5nO1xuICAgIGxhbmJnPzogc3RyaW5nO1xuICAgIGNhcnJpZXI/OiBzdHJpbmc7XG4gICAgbWNjbW5jPzogc3RyaW5nO1xuICAgIGNvbm5lY3Rpb250eXBlPzogbnVtYmVyO1xuICAgIGlmYT86IHN0cmluZztcbiAgICBkaWRzaGExPzogc3RyaW5nO1xuICAgIGRpZG1kNT86IHN0cmluZztcbiAgICBkcGlkc2hhMT86IHN0cmluZztcbiAgICBkcGlkbWQ1Pzogc3RyaW5nO1xuICAgIG1hY3NoYTE/OiBzdHJpbmc7XG4gICAgbWFjbWQ1Pzogc3RyaW5nO1xuICAgIGV4dD86IGFueTtcbiAgICBzdWE/OiBJVXNlckFnZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9kdWNlciB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBjYXR0YXg/OiBudW1iZXJbXTtcbiAgICBjYXQ/OiBzdHJpbmdbXTtcbiAgICBkb21haW4/OiBzdHJpbmc7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb250ZW50IHtcbiAgICBpZD86IHN0cmluZztcbiAgICBlcGlzb2RlPzogbnVtYmVyO1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHNlcmllcz86IHN0cmluZztcbiAgICBzZWFzb24/OiBzdHJpbmc7XG4gICAgYXJ0aXN0Pzogc3RyaW5nO1xuICAgIGdlbnJlPzogc3RyaW5nO1xuICAgIGFsYnVtPzogc3RyaW5nO1xuICAgIGlzcmM/OiBzdHJpbmc7XG4gICAgcHJvZHVjZXI/OiBJUHJvZHVjZXI7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIGNhdHRheD86IG51bWJlcltdO1xuICAgIGNhdD86IHN0cmluZ1tdO1xuICAgIHByb2RxPzogbnVtYmVyO1xuICAgIHZpZGVvcXVhbGl0eT86IG51bWJlcjtcbiAgICBjb250ZXh0PzogbnVtYmVyO1xuICAgIGNvbnRlbnRyYXRpbmc/OiBzdHJpbmc7XG4gICAgdXNlcnJhdGluZz86IHN0cmluZztcbiAgICBxYWdtZWRpYXJhdGluZz86IG51bWJlcjtcbiAgICBrZXl3b3Jkcz86IHN0cmluZztcbiAgICBrd2FycmF5Pzogc3RyaW5nW107XG4gICAgbGl2ZXN0cmVhbT86IG51bWJlcjtcbiAgICBzb3VyY2VyZWxhdGlvbnNoaXA/OiBudW1iZXI7XG4gICAgbGVuPzogbnVtYmVyO1xuICAgIGxhbmd1YWdlPzogc3RyaW5nO1xuICAgIGxhbmdiPzogc3RyaW5nO1xuICAgIGVtYmVkZGFibGU/OiBudW1iZXI7XG4gICAgZGF0YT86IElEYXRhW107XG4gICAgbmV0d29yaz86IElOZXR3b3JrO1xuICAgIGNoYW5uZWw/OiBJQ2hhbm5lbDtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVB1Ymxpc2hlciB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBjYXR0YXg/OiBudW1iZXJbXTtcbiAgICBjYXQ/OiBzdHJpbmdbXTtcbiAgICBkb21haW4/OiBzdHJpbmc7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBcHAge1xuICAgIGlkPzogc3RyaW5nO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgYnVuZGxlPzogc3RyaW5nO1xuICAgIGRvbWFpbj86IHN0cmluZztcbiAgICBzdG9yZXVybD86IHN0cmluZztcbiAgICBjYXQ/OiBzdHJpbmdbXTtcbiAgICBzZWN0aW9uY2F0Pzogc3RyaW5nW107XG4gICAgcGFnZWNhdD86IHN0cmluZ1tdO1xuICAgIHZlcj86IHN0cmluZztcbiAgICBwcml2YWN5cG9saWN5PzogbnVtYmVyO1xuICAgIHBhaWQ/OiBudW1iZXI7XG4gICAgcHVibGlzaGVyPzogSVB1Ymxpc2hlcjtcbiAgICBjb250ZW50PzogSUNvbnRlbnQ7XG4gICAga2V5d29yZHM/OiBzdHJpbmc7XG4gICAga3dhcnJheT86IHN0cmluZ1tdO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2l0ZSB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBkb21haW4/OiBzdHJpbmc7XG4gICAgY2F0Pzogc3RyaW5nW107XG4gICAgc2VjdGlvbmNhdD86IHN0cmluZ1tdO1xuICAgIHBhZ2VjYXQ/OiBzdHJpbmdbXTtcbiAgICBwYWdlPzogc3RyaW5nO1xuICAgIHJlZj86IHN0cmluZztcbiAgICBzZWFyY2g/OiBzdHJpbmc7XG4gICAgbW9iaWxlPzogbnVtYmVyO1xuICAgIHByaXZhY3lwb2xpY3k/OiBudW1iZXI7XG4gICAgcHVibGlzaGVyPzogSVB1Ymxpc2hlcjtcbiAgICBjb250ZW50PzogSUNvbnRlbnQ7XG4gICAga2V5d29yZHM/OiBzdHJpbmc7XG4gICAga3dhcnJheT86IHN0cmluZ1tdO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVhbCB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBiaWRmbG9vcjogbnVtYmVyO1xuICAgIGJpZGZsb29yY3VyPzogc3RyaW5nO1xuICAgIGF0PzogbnVtYmVyO1xuICAgIHdzZWF0Pzogc3RyaW5nW107XG4gICAgd2Fkb21haW4/OiBzdHJpbmdbXTtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBtcCB7XG4gICAgcHJpdmF0ZV9hdWN0aW9uPzogbnVtYmVyO1xuICAgIGRlYWxzPzogSURlYWxbXTtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm1hdCB7XG4gICAgdz86IG51bWJlcjtcbiAgICBoPzogbnVtYmVyO1xuICAgIHdyYXRpbz86IG51bWJlcjtcbiAgICBocmF0aW8/OiBudW1iZXI7XG4gICAgd21pbj86IG51bWJlcjtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU5hdGl2ZSB7XG4gICAgcmVxdWVzdDogc3RyaW5nO1xuICAgIHZlcj86IHN0cmluZztcbiAgICBhcGk/OiBudW1iZXJbXTtcbiAgICBiYXR0cj86IG51bWJlcltdO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQXVkaW8ge1xuICAgIG1pbWVzOiBzdHJpbmdbXTtcbiAgICBtaW5kdXJhdGlvbj86IG51bWJlcjtcbiAgICBtYXhkdXJhdGlvbj86IG51bWJlcjtcbiAgICBwb2RkdXI/OiBudW1iZXI7XG4gICAgcHJvdG9jb2xzPzogbnVtYmVyW107XG4gICAgc3RhcnRkZWxheT86IG51bWJlcjtcbiAgICBycWRkdXJzPzogbnVtYmVyW107XG4gICAgcG9kaWQ/OiBzdHJpbmc7XG4gICAgcG9kc2VxPzogbnVtYmVyO1xuICAgIHNlcXVlbmNlPzogbnVtYmVyO1xuICAgIHNsb3RpbnBvZD86IG51bWJlcjtcbiAgICBtaW5jcG1wZXJzZWM/OiBudW1iZXI7XG4gICAgYmF0dHI/OiBudW1iZXJbXTtcbiAgICBtYXhleHRlbmRlZD86IG51bWJlcjtcbiAgICBtaW5iaXRyYXRlPzogbnVtYmVyO1xuICAgIG1heGJpdHJhdGU/OiBudW1iZXI7XG4gICAgZGVsaXZlcnk/OiBudW1iZXJbXTtcbiAgICBjb21wYW5pb25hZD86IElCYW5uZXJbXTtcbiAgICBhcGk/OiBudW1iZXJbXTtcbiAgICBjb21wYW5pb250eXBlPzogbnVtYmVyW107XG4gICAgbWF4c2VxPzogbnVtYmVyO1xuICAgIGZlZWQ/OiBudW1iZXI7XG4gICAgc3RpdGNoZWQ/OiBudW1iZXI7XG4gICAgbnZvbD86IG51bWJlcjtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVZpZGVvIHtcbiAgICBtaW1lczogc3RyaW5nW107XG4gICAgbWluZHVyYXRpb24/OiBudW1iZXI7XG4gICAgbWF4ZHVyYXRpb24/OiBudW1iZXI7XG4gICAgc3RhcnRkZWxheT86IG51bWJlcjtcbiAgICBtYXhzZXE/OiBudW1iZXI7XG4gICAgcG9kZHVyPzogbnVtYmVyO1xuICAgIHByb3RvY29scz86IG51bWJlcltdO1xuICAgIHc/OiBudW1iZXI7XG4gICAgaD86IG51bWJlcjtcbiAgICBwb2RpZD86IHN0cmluZztcbiAgICBwb2RzZXE/OiBudW1iZXI7XG4gICAgcnFkZHVycz86IG51bWJlcltdO1xuICAgIHBsYWNlbWVudD86IG51bWJlcjtcbiAgICBsaW5lYXJpdHk/OiBudW1iZXI7XG4gICAgc2tpcD86IG51bWJlcjtcbiAgICBza2lwbWluPzogbnVtYmVyO1xuICAgIHNraXBhZnRlcj86IG51bWJlcjtcbiAgICBzZXF1ZW5jZT86IG51bWJlcjtcbiAgICBzbG90aW5wb2Q/OiBudW1iZXI7XG4gICAgbWluY3BtcGVyc2VjPzogbnVtYmVyO1xuICAgIGJhdHRyPzogbnVtYmVyW107XG4gICAgbWF4ZXh0ZW5kZWQ/OiBudW1iZXI7XG4gICAgbWluYml0cmF0ZT86IG51bWJlcjtcbiAgICBtYXhiaXRyYXRlPzogbnVtYmVyO1xuICAgIGJveGluZ2FsbG93ZWQ/OiBudW1iZXI7XG4gICAgcGxheWJhY2ttZXRob2Q/OiBudW1iZXJbXTtcbiAgICBwbGF5YmFja2VuZD86IG51bWJlcjtcbiAgICBkZWxpdmVyeT86IG51bWJlcltdO1xuICAgIHBvcz86IG51bWJlcjtcbiAgICBjb21wYW5pb25hZD86IElCYW5uZXJbXTtcbiAgICBhcGk/OiBudW1iZXJbXTtcbiAgICBjb21wYW5pb250eXBlPzogbnVtYmVyW107XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCYW5uZXIge1xuICAgIGZvcm1hdD86IElGb3JtYXRbXTtcbiAgICB3PzogbnVtYmVyO1xuICAgIGg/OiBudW1iZXI7XG4gICAgYnR5cGU/OiBudW1iZXJbXTtcbiAgICBiYXR0cj86IG51bWJlcltdO1xuICAgIHBvcz86IG51bWJlcjtcbiAgICBtaW1lcz86IHN0cmluZ1tdO1xuICAgIHRvcGZyYW1lPzogbnVtYmVyO1xuICAgIGV4cGRpcj86IG51bWJlcltdO1xuICAgIGFwaT86IG51bWJlcltdO1xuICAgIGlkPzogc3RyaW5nO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTWV0cmljIHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICB2ZW5kb3I/OiBzdHJpbmc7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJbXAge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWV0cmljPzogSU1ldHJpY1tdO1xuICAgIGJhbm5lcj86IElCYW5uZXI7XG4gICAgdmlkZW8/OiBJVmlkZW87XG4gICAgYXVkaW8/OiBJQXVkaW87XG4gICAgbmF0aXZlPzogSU5hdGl2ZTtcbiAgICBwbXA/OiBJUG1wO1xuICAgIGRpc3BsYXltYW5hZ2VyPzogc3RyaW5nO1xuICAgIGRpc3BsYXltYW5hZ2VydmVyPzogc3RyaW5nO1xuICAgIGluc3RsPzogbnVtYmVyO1xuICAgIHRhZ2lkPzogc3RyaW5nO1xuICAgIGJpZGZsb29yPzogbnVtYmVyO1xuICAgIGJpZGZsb29yY3VyPzogc3RyaW5nO1xuICAgIGNsaWNrYnJvd3Nlcj86IG51bWJlcjtcbiAgICBzZWN1cmU/OiBudW1iZXI7XG4gICAgaWZyYW1lYnVzdGVyPzogc3RyaW5nW107XG4gICAgcndkZD86IG51bWJlcjtcbiAgICBzc2FpPzogbnVtYmVyO1xuICAgIGV4cD86IG51bWJlcjtcbiAgICBleHQ/OiBJU3VyZkV4dGVuc2lvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUmVncyB7XG4gICAgY29wcGE/OiBudW1iZXI7XG4gICAgZXh0PzogYW55O1xuICAgIGdkcHI/OiBudW1iZXI7XG4gICAgdXNfcHJpdmFjeT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU291cmNlIHtcbiAgICBmZD86IG51bWJlcjtcbiAgICB0aWQ/OiBzdHJpbmc7XG4gICAgcGNoYWluPzogc3RyaW5nO1xuICAgIHNjaGFpbj86IElTdXBwbHlDaGFpbjtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJpZFJlcXVlc3Qge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgaW1wOiBJSW1wW107XG4gICAgc2l0ZT86IElTaXRlO1xuICAgIGFwcD86IElBcHA7XG4gICAgZGV2aWNlPzogSURldmljZTtcbiAgICB1c2VyPzogSVVzZXI7XG4gICAgdGVzdD86IG51bWJlcjtcbiAgICBhdD86IG51bWJlcjtcbiAgICB0bWF4PzogbnVtYmVyO1xuICAgIHdzZWF0Pzogc3RyaW5nW107XG4gICAgYnNlYXQ/OiBzdHJpbmdbXTtcbiAgICBhbGxpbXBzPzogbnVtYmVyO1xuICAgIGN1cj86IHN0cmluZ1tdO1xuICAgIHdsYW5nPzogc3RyaW5nW107XG4gICAgd2xhbmdiPzogc3RyaW5nW107XG4gICAgYmNhdD86IHN0cmluZ1tdO1xuICAgIGNhdHRheD86IG51bWJlcltdO1xuICAgIGJhZHY/OiBzdHJpbmdbXTtcbiAgICBiYXBwPzogc3RyaW5nW107XG4gICAgc291cmNlPzogSVNvdXJjZTtcbiAgICByZWdzPzogSVJlZ3M7XG4gICAgZXh0PzogSVN1cmZFeHRlbnNpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cmZFeHRlbnNpb24ge1xuICAgIGFjY291bnRJZDogc3RyaW5nO1xuICAgIHNpdGVJZDogc3RyaW5nO1xuICAgIGNoYW5uZWxJZDogc3RyaW5nO1xuICAgIGxvY2F0aW9uSWQ6IHN0cmluZztcbiAgICB6b25lSWQ6IHN0cmluZztcbiAgICBzdG9yZUlkOiBzdHJpbmc7XG4gICAgcGxhY2VtZW50SWQ6IHN0cmluZztcbiAgICBrZXl3b3Jkcz86IHN0cmluZ1tdXG59O1xuIiwKICAgICJleHBvcnQgY29uc3QgTmF0aXZlUG9zaXRpb24gPSB7XG4gICAgVW5rbm93bjogMCxcbiAgICBBYm92ZVRoZUZvbGQ6IDEsXG4gICAgQmVsb3dUaGVGb2xkOiAzLFxuICAgIEhlYWRlcjogNCxcbiAgICBGb290ZXI6IDUsXG4gICAgU2lkZWJhcjogNixcbiAgICBGdWxsU2NyZWVuOiA3XG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBpbWFnZSB3aXRoaW4gbmF0aXZlIGFkIChpY29uIHZzIG1haW4gaW1hZ2UpXG4gKi9cbmV4cG9ydCBjb25zdCBOYXRpdmVJbWFnZVR5cGVzID0ge1xuICAgIEljb246IDEsXG4gICAgTWFpbjogM1xufSBhcyBjb25zdDtcblxuLyoqXG4gKiBUaGUgdHlwZSBJRCBmb3IgZWFjaCBuYXRpdmUgYXNzZXQgdHlwZS4gSURzIGFib3ZlIDUwMCBhcmUgc3VyZnNpZGUtc3BlY2lmaWMgZmllbGRzLCBhbGxcbiAqIG90aGVycyBhcmUgT3BlblJUQiBOYXRpdmUgQWQgU3BlYyAxLjIgZmllbGRzLlxuICovXG5leHBvcnQgY29uc3QgTmF0aXZlRGF0YVR5cGVzID0ge1xuICAgIFNwb25zb3JlZDogMSxcbiAgICBEZXNjOiAyLFxuICAgIFJhdGluZzogMyxcbiAgICBMaWtlczogNCxcbiAgICBEb3dubG9hZHM6IDUsXG4gICAgUHJpY2U6IDYsXG4gICAgU2FsZVByaWNlOiA3LFxuICAgIFBob25lOiA4LFxuICAgIEFkZHJlc3M6IDksXG4gICAgRGVzYzI6IDEwLFxuICAgIERpc3BsYXlVUkw6IDExLFxuICAgIENUQVRleHQ6IDEyLFxuXG4gICAgLyogU3VyZnNpZGUgU3BlY2lmaWMgY29kZXMgKi9cbiAgICBTdXJmU3RyYWluOiA1MDAsXG4gICAgU3VyZlRIQzogNTAxLFxuICAgIFN1cmZDQkQ6IDUwMixcbiAgICBTdXJmQ2F0ZWdvcnk6IDUwMyxcbiAgICBTdXJmTWV0YVByb2R1Y3Q6IDU5OVxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBUaGUgSUQgZm9yIGVhY2ggZmllbGQgd2l0aGluIGEgc3VyZnNpZGUgbmF0aXZlIGFkIHJlcXVlc3QuIFRoZSBBc3NldCBJRCBtYXRjaGVzIHRoZSBhc3NldCB0eXBlLCBmb3Igc2ltcGxpY2l0eS5cbiAqL1xuZXhwb3J0IGNvbnN0IE5hdGl2ZUFzc2V0SWQgPSB7XG4gICAgVGl0bGU6IDAsXG4gICAgSW1hZ2U6IDEsXG4gICAgU3BvbnNvcmVkOiAyLFxuICAgIERlc2M6IDMsXG4gICAgUmF0aW5nOiA0LFxuICAgIFByaWNlOiA1LFxuICAgIFNhbGVQcmljZTogNixcbiAgICBEaXNwbGF5VVJMOiA3LFxuICAgIENUQVRleHQ6IDgsXG4gICAgVmlkZW86IDksXG5cbiAgICBTdXJmU3RyYWluOiA1MDAsXG4gICAgU3VyZlRIQzogNTAxLFxuICAgIFN1cmZDQkQ6IDUwMixcbiAgICBTdXJmQ2F0ZWdvcnk6IDUwMyxcbiAgICBTdXJmTWV0YUJyYW5kOiA1OTgsXG4gICAgU3VyZk1ldGFQcm9kdWN0OiA1OTlcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRXZlbnQgdHlwZXMgd2hpY2ggY2FuIGJlIHRyYWNrZWQgYnkgdGhlIG5hdGl2ZSBhZCB1bml0XG4gKi9cbmV4cG9ydCBjb25zdCBFdmVudFR5cGVzID0ge1xuICAgIEltcDogMSxcbiAgICBWaWV3YWJsZU1SQzUwOiAyLFxuICAgIFZpZXdhYmxlTVJDMTAwOiAzLFxuICAgIFZpZXdhYmxlVklERU81MDogNFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBUaGUgY29udGV4dCBvZiB0aGUgcGFnZSBmb3IgdGhlIG5hdGl2ZSBhZCB1bml0LCBpLmUgd2hhdCB0eXBlIG9mIGNvbnRlbnQgaXMgYmVpbmcgZGlzcGxheWVkXG4gKi9cbmV4cG9ydCBjb25zdCBDb250ZXh0VHlwZXMgPSB7XG4gICAgQ29udGVudDogMSxcbiAgICBTb2NpYWw6IDIsXG4gICAgUHJvZHVjdDogM1xufSBhcyBjb25zdDtcblxuLyoqXG4gKiBUaGUgc3ViLXR5cGUgb2YgdGhlIGNvbnRleHRcbiAqL1xuZXhwb3J0IGNvbnN0IENvbnRleHRTdWJUeXBlcyA9IHtcbiAgICBHZW5lcmFsOiAxMCxcbiAgICBBcnRpY2xlOiAxMSxcbiAgICBWaWRlbzogMTIsXG4gICAgQXVkaW86IDEzLFxuICAgIEltYWdlOiAxNCxcbiAgICBVc2VyR2VuZXJhdGVkOiAxNSxcbiAgICBHZW5lcmFsU29jaWFsOiAyMCxcbiAgICBFbWFpbDogMjEsXG4gICAgQ2hhdDogMjIsXG4gICAgUHJvZHVjdDogMzAsXG4gICAgQXBwbGljYXRpb246IDMxLFxuICAgIFByb2R1Y3RSZXZpZXdzOiAzMlxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBUaGUgZm9ybWF0IG9mIHRoZSBhZCB1bml0LCBpLmU6IHdoYXQgdHlwZSBvZiBhZCBpcyBiZWluZyBkaXNwbGF5ZWQgYW5kIHdoZXJlXG4gKi9cbmV4cG9ydCBjb25zdCBQbGFjZW1lbnRUeXBlcyA9IHtcbiAgICBJbkZlZWQ6IDEsXG4gICAgQXRvbWljOiAyLFxuICAgIE91dHNpZGVDb3JlOiAzLFxuICAgIFJlY29tbWVuZGF0aW9uOiA0XG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIFByZXNldHMgZm9yIGRlZmF1bHQgdmlkZW8gTUlNRSB0eXBlc1xuICovXG5leHBvcnQgY29uc3QgVmlkZW9NaW1lcyA9IHtcbiAgICBNUDQ6ICd2aWRlby9tcDQnLFxuICAgIFdFQk06ICd2aWRlby93ZWJtJ1xufSBhcyBjb25zdDtcblxuLyoqXG4gKiBUaGUgbWV0aG9kIHVzZWQgdG8gdHJhY2sgZXZlbnRzLCAxeDEgcGl4ZWwgb2YgSmF2YXNjcmlwdCB0YWdcbiAqL1xuZXhwb3J0IGNvbnN0IEV2ZW50VHJhY2tpbmdNZXRob2RzID0ge1xuICAgIEltZzogMSxcbiAgICBKUzogMlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJTmF0aXZlUmVxdWVzdCB7XG4gICAgdmVyPzogc3RyaW5nO1xuICAgIGNvbnRleHQ/OiBudW1iZXI7XG4gICAgY29udGV4dHN1YnR5cGU/OiBudW1iZXI7XG4gICAgcGxjbXR0eXBlPzogbnVtYmVyO1xuICAgIHBsY210Y250PzogbnVtYmVyO1xuICAgIHNlcT86IG51bWJlcjtcbiAgICBhc3NldHM6IElBc3NldE9iamVjdFtdO1xuICAgIGF1cmxzdXBwb3J0PzogbnVtYmVyO1xuICAgIGR1cmxzdXBwb3J0PzogbnVtYmVyO1xuICAgIGV2ZW50dHJhY2tlcnM/OiBJRXZlbnRUcmFja2VyUmVxdWVzdE9iamVjdFtdO1xuICAgIHByaXZhY3k/OiBudW1iZXI7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBc3NldE9iamVjdCB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICByZXF1aXJlZD86IG51bWJlcjtcbiAgICB0aXRsZT86IElUaXRsZVJlcXVlc3RPYmplY3Q7XG4gICAgaW1nPzogSUltYWdlUmVxdWVzdE9iamVjdDtcbiAgICB2aWRlbz86IElWaWRlb1JlcXVlc3RPYmplY3Q7XG4gICAgZGF0YT86IElEYXRhUmVxdWVzdE9iamVjdDtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRpdGxlUmVxdWVzdE9iamVjdCB7XG4gICAgbGVuOiBudW1iZXI7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJbWFnZVJlcXVlc3RPYmplY3Qge1xuICAgIHR5cGU/OiBudW1iZXI7XG4gICAgdz86IG51bWJlcjtcbiAgICB3bWluPzogbnVtYmVyO1xuICAgIGg/OiBudW1iZXI7XG4gICAgaG1pbj86IG51bWJlcjtcbiAgICBtaW1lcz86IHN0cmluZ1tdO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmlkZW9SZXF1ZXN0T2JqZWN0IHtcbiAgICBtaW1lczogbnVtYmVyW10gfCBzdHJpbmdbXTtcbiAgICBtaW5kdXJhdGlvbjogbnVtYmVyO1xuICAgIG1heGR1cmF0aW9uOiBudW1iZXI7XG4gICAgcHJvdG9jb2xzOiBudW1iZXJbXTtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGFSZXF1ZXN0T2JqZWN0IHtcbiAgICB0eXBlOiBudW1iZXI7XG4gICAgbGVuPzogbnVtYmVyO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRXZlbnRUcmFja2VyUmVxdWVzdE9iamVjdCB7XG4gICAgZXZlbnQ6IG51bWJlcjtcbiAgICBtZXRob2RzOiBudW1iZXJbXTtcbiAgICBleHQ/OiBhbnk7XG59XG4iLAogICAgImltcG9ydCB7XG4gICAgdHlwZSBJUHJvZHVjdEluZm9ybWF0aW9uLFxuICAgIE5hdGl2ZUFzc2V0SWQsXG4gICAgTmF0aXZlSW1hZ2VUeXBlcyxcbiAgICBFdmVudFR5cGVzXG59IGZyb20gJy4uLy4uL21vZGVscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU5hdGl2ZVJlc3BvbnNlIHtcbiAgICBuYXRpdmU6IElOYXRpdmVSZXNwb25zZURldGFpbHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU5hdGl2ZVJlc3BvbnNlRGV0YWlscyB7XG4gICAgdmVyPzogc3RyaW5nO1xuICAgIGFzc2V0cz86IElBc3NldFJlc3BvbnNlT2JqZWN0W107XG4gICAgYXNzZXRzdXJsPzogc3RyaW5nO1xuICAgIGRjb3VybD86IHN0cmluZztcbiAgICBsaW5rOiBJTGlua1Jlc3BvbnNlT2JqZWN0O1xuICAgIGltcHRyYWNrZXJzPzogc3RyaW5nW107XG4gICAganN0cmFja2VyPzogc3RyaW5nO1xuICAgIGV2ZW50dHJhY2tlcnM/OiBJRXZlbnRUcmFja2VyUmVzcG9uc2VPYmplY3RbXTtcbiAgICBwcml2YWN5Pzogc3RyaW5nO1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQXNzZXRSZXNwb25zZU9iamVjdCB7XG4gICAgaWQ/OiBudW1iZXI7XG4gICAgcmVxdWlyZWQ/OiBudW1iZXI7XG4gICAgdGl0bGU/OiBJVGl0bGVSZXNwb25zZU9iamVjdDtcbiAgICBpbWc/OiBJSW1hZ2VSZXNwb25zZU9iamVjdDtcbiAgICBkYXRhPzogSURhdGFSZXNwb25zZU9iamVjdDtcbiAgICB2aWRlbz86IElWaWRlb1Jlc3BvbnNlT2JqZWN0O1xuICAgIGxpbms/OiBJTGlua1Jlc3BvbnNlT2JqZWN0O1xuICAgIGV4dD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGl0bGVSZXNwb25zZU9iamVjdCB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIGxlbj86IG51bWJlcjtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUltYWdlUmVzcG9uc2VPYmplY3Qge1xuICAgIHR5cGU6IG51bWJlcjtcbiAgICB1cmw6IHN0cmluZztcbiAgICB3PzogbnVtYmVyO1xuICAgIGg/OiBudW1iZXI7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRhUmVzcG9uc2VPYmplY3Qge1xuICAgIHR5cGU/OiBudW1iZXI7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgICBleHQ/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVZpZGVvUmVzcG9uc2VPYmplY3Qge1xuICAgIHZhc3R0YWc6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTGlua1Jlc3BvbnNlT2JqZWN0IHtcbiAgICB1cmw6IHN0cmluZztcbiAgICBjbGlja3RyYWNrZXJzPzogc3RyaW5nW107XG4gICAgZmFsbGJhY2s/OiBzdHJpbmc7XG4gICAgZXh0PzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudFRyYWNrZXJSZXNwb25zZU9iamVjdCB7XG4gICAgZXZlbnQ6IG51bWJlcjtcbiAgICBtZXRob2Q6IG51bWJlcjtcbiAgICB1cmw/OiBzdHJpbmc7XG4gICAgY3VzdG9tZGF0YT86IGFueTtcbiAgICBleHQ/OiBhbnk7XG59XG5cbmNvbnN0IGZpbmREYXRhQXNzZXRCeVR5cGUgPSAoYXNzZXRzOiBJQXNzZXRSZXNwb25zZU9iamVjdFtdIHwgdW5kZWZpbmVkLCBpZDogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+XG4gICAgYXNzZXRzPy5maW5kKChhc3NldCkgPT4gYXNzZXQuaWQgPT09IGlkKT8uZGF0YT8udmFsdWU7XG5cbmV4cG9ydCBmdW5jdGlvbiBOYXRpdmVSZXNwb25zZVRvUHJvZHVjdEluZm9ybWF0aW9uKFxuICAgIG5hdGl2ZTogSU5hdGl2ZVJlc3BvbnNlXG4pOiBJUHJvZHVjdEluZm9ybWF0aW9uIHtcbiAgICBjb25zdCBicmFuZCA9IGZpbmREYXRhQXNzZXRCeVR5cGUobmF0aXZlLm5hdGl2ZS5hc3NldHMsIE5hdGl2ZUFzc2V0SWQuU3BvbnNvcmVkKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbWFnZTogbmF0aXZlLm5hdGl2ZS5hc3NldHM/LmZpbmQoKGFzc2V0KSA9PiBhc3NldC5pbWc/LnR5cGUgPT09IE5hdGl2ZUltYWdlVHlwZXMuTWFpbik/LmltZz8udXJsLFxuICAgICAgICBuYW1lOiBuYXRpdmUubmF0aXZlLmFzc2V0cz8uZmluZCgoYXNzZXQpID0+IGFzc2V0LnRpdGxlICE9PSB1bmRlZmluZWQpPy50aXRsZT8udGV4dCxcblxuICAgICAgICBwcmljZTogZmluZERhdGFBc3NldEJ5VHlwZShuYXRpdmUubmF0aXZlLmFzc2V0cywgTmF0aXZlQXNzZXRJZC5QcmljZSksXG4gICAgICAgIHNhbGVQcmljZTogZmluZERhdGFBc3NldEJ5VHlwZShuYXRpdmUubmF0aXZlLmFzc2V0cywgTmF0aXZlQXNzZXRJZC5TYWxlUHJpY2UpLFxuICAgICAgICB0aGM6IGZpbmREYXRhQXNzZXRCeVR5cGUobmF0aXZlLm5hdGl2ZS5hc3NldHMsIE5hdGl2ZUFzc2V0SWQuU3VyZlRIQyksXG4gICAgICAgIGNiZDogZmluZERhdGFBc3NldEJ5VHlwZShuYXRpdmUubmF0aXZlLmFzc2V0cywgTmF0aXZlQXNzZXRJZC5TdXJmQ0JEKSxcbiAgICAgICAgc3RyYWluOiBmaW5kRGF0YUFzc2V0QnlUeXBlKG5hdGl2ZS5uYXRpdmUuYXNzZXRzLCBOYXRpdmVBc3NldElkLlN1cmZTdHJhaW4pLFxuICAgICAgICBicmFuZF9uYW1lOiBicmFuZCxcbiAgICAgICAgYnJhbmROYW1lOiBicmFuZCxcbiAgICAgICAgcHJvZHVjdFR5cGU6IGZpbmREYXRhQXNzZXRCeVR5cGUobmF0aXZlLm5hdGl2ZS5hc3NldHMsIE5hdGl2ZUFzc2V0SWQuU3VyZkNhdGVnb3J5KSxcbiAgICAgICAgZGV0YWlsczogZmluZERhdGFBc3NldEJ5VHlwZShuYXRpdmUubmF0aXZlLmFzc2V0cywgTmF0aXZlQXNzZXRJZC5EZXNjKSxcbiAgICAgICAgY3RhOiBmaW5kRGF0YUFzc2V0QnlUeXBlKG5hdGl2ZS5uYXRpdmUuYXNzZXRzLCBOYXRpdmVBc3NldElkLkNUQVRleHQpLFxuXG4gICAgICAgIGNsaWNrdGhyb3VnaFVybDogbmF0aXZlLm5hdGl2ZS5saW5rPy51cmwgPz8gbnVsbCxcbiAgICAgICAgcGl4ZWxVcmw6IG5hdGl2ZS5uYXRpdmUuZXZlbnR0cmFja2Vycz8uZmluZCgoZXZlbnQpID0+IGV2ZW50LmV2ZW50ID09PSBFdmVudFR5cGVzLkltcCk/LnVybFxuICAgIH07XG59O1xuIiwKICAgICJleHBvcnQgdHlwZSBMb2dnZXJGbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIENvbnRleHRGbiA9ICguLi5wcmVmaXg6IChzdHJpbmd8IHVuZGVmaW5lZClbXSkgPT4gSUNvbnRleHRMb2dnZXI7XG5cbmNvbnN0IFNVUkZfUFJFRklYOiBzdHJpbmcgPSAnJWNbU1VSRl0nO1xuY29uc3QgU0VQQVJBVE9SID0gJyDigLonO1xuY29uc3QgVU5ERUYgPSAnWyB1bmRlZmluZWQgXSc7XG5cbmNvbnN0IExvZ0NvbG9ycyA9IHtcbiAgICAvKiBBY2NlbnRzICovXG4gICAgTGF2ZW5kZXI6ICcjYzBhYmZmJyxcbiAgICBVbHRyYVJlZDogJyNmOTc1ODUnLFxuICAgIFNvZnRHb2xkOiAnI2Y0YmQ1ZCcsXG4gICAgTWFnaWNNaW50OiAnI2JhZjdkYidcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ2dlciB7XG4gICAgaW5mbzogTG9nZ2VyRm4sXG4gICAgZGVidWc6IExvZ2dlckZuLFxuICAgIHdhcm46IExvZ2dlckZuLFxuICAgIGVycm9yOiBMb2dnZXJGbixcbiAgICB0YWJsZTogKGRhdGE6IGFueSwgcHJvcGVydGllcz86IHN0cmluZ1tdKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBJQ29udGV4dExvZ2dlciBleHRlbmRzIElMb2dnZXIge1xuICAgIHdpdGg6IENvbnRleHRGbixcbn07XG5cbmNvbnN0IGxvZyA9IChsb2c6IExvZ2dlckZuLCBhcmdzOiBhbnlbXSwgY29sb3I6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGFyZ3MudW5zaGlmdChcbiAgICAgICAgYGJvcmRlci1yYWRpdXM6IDNweDsgbWFyZ2luLWxlZnQ6IDEwcHg7IGJhY2tncm91bmQ6ICR7Y29sb3J9OyBmb250LXNpemU6IDEycHg7IGZvbnQtd2VpZ2h0OiBib2xkO2BcbiAgICApO1xuICAgIGFyZ3MudW5zaGlmdChTVVJGX1BSRUZJWCk7XG4gICAgbG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3MpO1xuXG59O1xuXG5jb25zdCBpbmZvID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBsb2coY29uc29sZS5sb2csIFsnKEluZm8pJywgLi4uYXJnc10sIExvZ0NvbG9ycy5MYXZlbmRlcik7XG5jb25zdCB3YXJuID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBsb2coY29uc29sZS53YXJuLCBbJyhXYXJuaW5nKScsIC4uLmFyZ3NdLCBMb2dDb2xvcnMuU29mdEdvbGQpO1xuY29uc3QgZGVidWcgPSAoLi4uYXJnczogYW55W10pID0+IGxvZyhjb25zb2xlLmRlYnVnLCBbJyhEZWJ1ZyknLCAuLi5hcmdzXSwgTG9nQ29sb3JzLk1hZ2ljTWludCk7XG5jb25zdCBlcnJvciA9ICguLi5hcmdzOiBhbnlbXSkgPT4gbG9nKGNvbnNvbGUuZXJyb3IsIFsnKEVycm9yKScsIC4uLmFyZ3NdLCBMb2dDb2xvcnMuVWx0cmFSZWQpO1xuXG5jb25zdCBjb250ZXh0ID0gKGxvZ2dlcjogSUNvbnRleHRMb2dnZXIsIC4uLnByZWZpeDogKHN0cmluZ3wgdW5kZWZpbmVkKVtdKTogSUNvbnRleHRMb2dnZXIgPT4ge1xuICAgIGNvbnN0IG5ld1ByZWZpeCA9IGpvaW5DdHgocHJlZml4KSArIFNFUEFSQVRPUjtcbiAgICBjb25zdCBuZXdMb2dnZXI6IElDb250ZXh0TG9nZ2VyID0ge1xuICAgICAgICBpbmZvOiBsb2dnZXIuaW5mby5iaW5kKHVuZGVmaW5lZCwgbmV3UHJlZml4KSxcbiAgICAgICAgd2FybjogbG9nZ2VyLndhcm4uYmluZCh1bmRlZmluZWQsIG5ld1ByZWZpeCksXG4gICAgICAgIGRlYnVnOiBsb2dnZXIuZGVidWcuYmluZCh1bmRlZmluZWQsIG5ld1ByZWZpeCksXG4gICAgICAgIGVycm9yOiBsb2dnZXIuZXJyb3IuYmluZCh1bmRlZmluZWQsIG5ld1ByZWZpeCksXG4gICAgICAgIHRhYmxlOiBjb25zb2xlLnRhYmxlLFxuICAgICAgICB3aXRoOiBsb2dnZXIud2l0aFxuICAgIH07XG4gICAgbmV3TG9nZ2VyLndpdGggPSBjb250ZXh0LmJpbmQodW5kZWZpbmVkLCBuZXdMb2dnZXIpO1xuICAgIHJldHVybiBuZXdMb2dnZXI7XG59O1xuXG5leHBvcnQgY29uc3QgSW5pdExvZ2dlciA9ICgpOiBJQ29udGV4dExvZ2dlciA9PiB7XG4gICAgY29uc3QgbG9nZ2VyOiBQYXJ0aWFsPElDb250ZXh0TG9nZ2VyPiA9IHtcbiAgICAgICAgaW5mbyxcbiAgICAgICAgd2FybixcbiAgICAgICAgZGVidWcsXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0YWJsZTogY29uc29sZS50YWJsZVxuICAgIH07XG4gICAgbG9nZ2VyLndpdGggPSBjb250ZXh0LmJpbmQodW5kZWZpbmVkLCBsb2dnZXIgYXMgSUNvbnRleHRMb2dnZXIpO1xuICAgIHJldHVybiBsb2dnZXIgYXMgSUNvbnRleHRMb2dnZXI7XG59O1xuXG5jb25zdCBqb2luQ3R4ID0gKGN0eDogKHN0cmluZyB8IHVuZGVmaW5lZClbXSkgPT4gY3R4Lm1hcChlID0+IGUgPT09IHVuZGVmaW5lZCA/IFVOREVGIDogZSkuam9pbihTRVBBUkFUT1IpO1xuXG5leHBvcnQgY29uc3QgQ3R4ID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCk6IElDb250ZXh0TG9nZ2VyIHwgdW5kZWZpbmVkID0+XG4gICAgbG9nZ2VyID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiAobG9nZ2VyIGFzIGFueSk/LndpdGggPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IC4uLmxvZ2dlciwgd2l0aDogKCkgPT4gQ3R4KGxvZ2dlcikhIH1cbiAgICAgICAgICAgIDogbG9nZ2VyIGFzIElDb250ZXh0TG9nZ2VyO1xuIiwKICAgICJleHBvcnQgdHlwZSBPa1Jlc3VsdDxUPiA9IHsgb2s6IHRydWUsIHZhbHVlOiBUIH07XG5leHBvcnQgdHlwZSBFcnJSZXN1bHQ8RSA9IEVycm9yPiA9IHsgb2s6IGZhbHNlLCBlcnJvcjogRSB9O1xuXG5leHBvcnQgdHlwZSBSZXN1bHQ8VCwgRSA9IEVycm9yPiA9XG4gICAgfCBPa1Jlc3VsdDxUPlxuICAgIHwgRXJyUmVzdWx0PEU+XG5cbmV4cG9ydCB0eXBlIEFzeW5jUmVzdWx0PFQsIEUgPSBFcnJvcj4gPSBQcm9taXNlPFJlc3VsdDxULCBFPj47XG5cbmV4cG9ydCBjb25zdCBPayA9IDxUPih0OiBUKTogT2tSZXN1bHQ8VD4gPT4gKHtcbiAgICBvazogdHJ1ZSxcbiAgICB2YWx1ZTogdFxufSk7XG5cbmV4cG9ydCBjb25zdCBFcnIgPSA8RSA9IEVycm9yPihlOiBFKTogRXJyUmVzdWx0PEU+ID0+ICh7XG4gICAgb2s6IGZhbHNlLFxuICAgIGVycm9yOiBlXG59KTtcblxuZXhwb3J0IGNvbnN0IFRyeURvID0gPFQsIEUgPSBFcnJvcj4oZm46ICgpID0+IFQpOiBSZXN1bHQ8VCwgRT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBPayhmbigpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIEVycihlcnIgYXMgRSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IFRyeURvRmxhdCA9IDxULCBFID0gRXJyb3I+KGZuOiAoKSA9PiBSZXN1bHQ8VCwgRT4pOiBSZXN1bHQ8VCwgRT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgIH0gY2F0Y2goZXJyKSB7XG4gICAgICAgIHJldHVybiBFcnIoZXJyIGFzIEUpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBUcnlEb0FzeW5jID0gYXN5bmMgPFQsIEUgPSBFcnJvcj4oZm46ICgpID0+IFByb21pc2U8VD4pOiBBc3luY1Jlc3VsdDxULCBFPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIE9rKGF3YWl0IGZuKCkpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBFcnIoZXJyIGFzIEUpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBHZXRWYWx1ZSA9IDxULCBFID0gRXJyb3I+KHJlc3VsdDogUmVzdWx0PFQsIEU+IHwgdW5kZWZpbmVkKTogVCB8IHVuZGVmaW5lZCA9PlxuICAgIHJlc3VsdD8ub2sgPyByZXN1bHQudmFsdWUgOiB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCBWYWx1ZU9yID0gPFQsIEUgPSBFcnJvciwgVSA9IFQ+KHJlc3VsdDogUmVzdWx0PFQsIEU+IHwgdW5kZWZpbmVkLCBvcjogVSk6IFQgfCBVID0+XG4gICAgcmVzdWx0Py5vayA/IHJlc3VsdC52YWx1ZSA6IG9yO1xuXG5leHBvcnQgY29uc3QgR2V0VmFsdWVPclRocm93ID0gPFQ+KHJlc3VsdDogUmVzdWx0PFQsIEVycm9yPik6IFQgPT4ge1xuICAgIGlmKHJlc3VsdC5vaykge1xuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgIH1cbiAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG59O1xuXG5leHBvcnQgY29uc3QgV3JhcFZhbHVlID0gPFQ+KHZhbHVlOiBUIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFJlc3VsdDxUPiA9PiB7XG4gICAgaWYodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyKG5ldyBOb1ZhbHVlRXJyb3IodmFsdWUgYXMgKHVuZGVmaW5lZCB8IG51bGwpKSk7XG4gICAgfVxuICAgIHJldHVybiBPayh2YWx1ZSk7XG59XG5cbmV4cG9ydCBjb25zdCBBc3NlcnRWYWx1ZSA9IEdldFZhbHVlT3JUaHJvdztcblxuZXhwb3J0IGNvbnN0IEFsbE9yTm9uZSA9IDxUPihyZXN1bHRzOiBSZXN1bHQ8VCwgRXJyb3I+W10pOiBSZXN1bHQ8VFtdPiA9PiB7XG4gICAgY29uc3QgZmFpbGVkID0gcmVzdWx0cy5maWx0ZXIocmVzID0+ICFyZXMub2spLm1hcChyZXMgPT4gcmVzLmVycm9yKTtcbiAgICBpZihmYWlsZWQubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gRXJyKG5ldyBNdWx0aXBsZUVycm9yc0Vycm9yKGZhaWxlZCkpO1xuICAgIH1cbiAgICBjb25zdCBzdWNjZXNzID0gcmVzdWx0cy5maWx0ZXIocmVzID0+IHJlcy5vaykubWFwKHJlcyA9PiByZXMudmFsdWUpO1xuICAgIHJldHVybiBPayhzdWNjZXNzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTb21lID0gPFQ+KHJlc3VsdHM6IFJlc3VsdDxULCBFcnJvcj5bXSk6IE9rUmVzdWx0PFRbXT4gPT4ge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSByZXN1bHRzLmZpbHRlcihyZXMgPT4gcmVzLm9rKS5tYXAocmVzID0+IHJlcy52YWx1ZSk7XG4gICAgcmV0dXJuIE9rKHN1Y2Nlc3MpO1xufTtcblxuZXhwb3J0IGNvbnN0IEZpbHRlciA9IDxUPiguLi5yZXN1bHRzOiBSZXN1bHQ8VCwgRXJyb3I+W10pOiBbT2tSZXN1bHQ8VD5bXSwgRXJyUmVzdWx0W11dID0+IHtcbiAgICBjb25zdCBzdWNjZXNzID0gU29tZShyZXN1bHRzKS52YWx1ZS5tYXAodmFsID0+IE9rKHZhbCkpO1xuICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdHMuZmlsdGVyKHJlcyA9PiAhcmVzLm9rKTtcbiAgICByZXR1cm4gW3N1Y2Nlc3MsIGZhaWxlZF07XG59O1xuXG5leHBvcnQgY29uc3QgQW55RmFpbGVkID0gKC4uLnJlc3VsdHM6IFJlc3VsdDxhbnksIEVycm9yPltdKTogW3RydWUsIEVycm9yW11dIHwgW2ZhbHNlXSA9PiB7XG4gICAgY29uc3QgZXJyb3JzID0gcmVzdWx0cy5maWx0ZXIocmVzID0+ICFyZXMub2spLm1hcChyZXMgPT4gcmVzLmVycm9yKTtcbiAgICBpZihlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbdHJ1ZSwgZXJyb3JzXTtcbiAgICB9XG4gICAgcmV0dXJuIFtmYWxzZV07XG59XG5cbmV4cG9ydCBjbGFzcyBNdWx0aXBsZUVycm9yc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBlcnJvcnM6IEVycm9yW10pIHtcbiAgICAgICAgc3VwZXIoJ0dvdCBtdWx0aXBsZSBlcnJvcnM6XFxuJyArXG4gICAgICAgICAgICBlcnJvcnMubWFwKGVyciA9PiAnXFx0JyArIGVyci5tZXNzYWdlLnN1YnN0cmluZygwLCAzMikucGFkRW5kKDM1LCAnLicpKS5qb2luKCdcXG4nKVxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIElSZXN1bHRQaXBlPFQsIEUgPSBFcnJvcj4ge1xuICAgIHRoZW46IDxVPihmbjogKHQ6IFQpID0+IFUpID0+IElSZXN1bHRQaXBlPFUsIEU+O1xuICAgIHJlc3VsdDogKCkgPT4gUmVzdWx0PFQsIEU+O1xuICAgIHZhbHVlOiAoKSA9PiBUIHwgdW5kZWZpbmVkO1xuICAgIHZhbHVlT3I6IDxVPihvcjogVSkgPT4gVCB8IFU7XG4gICAgdmFsdWVPclRocm93OiAoKSA9PiBUO1xufVxuXG5leHBvcnQgY29uc3QgUGlwZSA9IDxULCBFID0gRXJyb3I+KHJlc3VsdDogUmVzdWx0PFQsIEU+KTogSVJlc3VsdFBpcGU8VCwgRT4gPT4gKHtcbiAgICB0aGVuOiBwaXBlVGhlbihyZXN1bHQpLFxuICAgIHJlc3VsdDogcGlwZVJlc3VsdChyZXN1bHQpLFxuICAgIHZhbHVlOiBwaXBlVmFsdWUocmVzdWx0KSxcbiAgICB2YWx1ZU9yOiBwaXBlVmFsdWVPcihyZXN1bHQpLFxuICAgIHZhbHVlT3JUaHJvdzogcGlwZVZhbHVlT3JUaHJvdyhyZXN1bHQpXG59KTtcblxuY29uc3QgcGlwZVRoZW4gPSA8VCwgRT4ocmVzdWx0OiBSZXN1bHQ8VCwgRT4pID0+IDxVPihmbjogKHQ6IFQpID0+IFUpOiBJUmVzdWx0UGlwZTxVLCBFPiA9PiB7XG4gICAgaWYoIXJlc3VsdC5vaykge1xuICAgICAgICByZXR1cm4gUGlwZShyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gUGlwZShPayhmbihyZXN1bHQudmFsdWUpKSk7XG59XG5cbmNvbnN0IHBpcGVSZXN1bHQgPSA8VCwgRT4ocmVzdWx0OiBSZXN1bHQ8VCwgRT4pID0+ICgpOiBSZXN1bHQ8VCwgRT4gPT4gcmVzdWx0O1xuY29uc3QgcGlwZVZhbHVlID0gPFQsIEU+KHJlc3VsdDogUmVzdWx0PFQsIEU+KSA9PiAoKTogVCB8IHVuZGVmaW5lZCA9PiBHZXRWYWx1ZShyZXN1bHQpO1xuY29uc3QgcGlwZVZhbHVlT3IgPSA8VCwgRT4ocmVzdWx0OiBSZXN1bHQ8VCwgRT4pID0+IDxVPihvcjogVSkgPT4gR2V0VmFsdWUocmVzdWx0KSA/PyBvcjtcbmNvbnN0IHBpcGVWYWx1ZU9yVGhyb3cgPSA8VCwgRT4ocmVzdWx0OiBSZXN1bHQ8VCwgRT4pID0+ICgpID0+IHtcbiAgICBpZihyZXN1bHQub2spIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICB9XG4gICAgdGhyb3cgcmVzdWx0LmVycm9yO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBc3luY1Jlc3VsdFBpcGU8VCwgRSA9IEVycm9yPiB7XG4gICAgdGhlbjogPFU+KGZuOiAodDogVCkgPT4gQXN5bmNSZXN1bHQ8VT4gfCBSZXN1bHQ8VT4pID0+IElBc3luY1Jlc3VsdFBpcGU8VSwgRT47XG4gICAgcmVzdWx0OiAoKSA9PiBBc3luY1Jlc3VsdDxULCBFPjtcbiAgICB2YWx1ZTogKCkgPT4gUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgICB2YWx1ZU9yOiA8VT4ob3I6IFUpID0+IFByb21pc2U8VCB8IFU+O1xuICAgIHZhbHVlT3JUaHJvdzogKCkgPT4gUHJvbWlzZTxUPjtcbn1cblxuZXhwb3J0IGNvbnN0IEFzeW5jUGlwZSA9IDxULCBFPihyZXN1bHQ6IEFzeW5jUmVzdWx0PFQsIEU+KTogSUFzeW5jUmVzdWx0UGlwZTxULCBFPiA9PiAoe1xuICAgIHRoZW46IGFzeW5jUGlwZVRoZW4ocmVzdWx0KSxcbiAgICByZXN1bHQ6IGFzeW5jUGlwZVJlc3VsdChyZXN1bHQpLFxuICAgIHZhbHVlOiBhc3luY1BpcGVWYWx1ZShyZXN1bHQpLFxuICAgIHZhbHVlT3I6IGFzeW5jUGlwZVZhbHVlT3IocmVzdWx0KSxcbiAgICB2YWx1ZU9yVGhyb3c6IGFzeW5jUGlwZVZhbHVlT3JUaHJvdyhyZXN1bHQpXG59KVxuXG5jb25zdCBhc3luY1BpcGVUaGVuID0gPFQsIEU+KHJlc3VsdDogQXN5bmNSZXN1bHQ8VCwgRT4pID0+XG4gICAgPFU+KGZuOiAodDogVCkgPT4gQXN5bmNSZXN1bHQ8VT4gfCBSZXN1bHQ8VT4pOiBJQXN5bmNSZXN1bHRQaXBlPFUsIEU+ID0+IHtcbiAgICAgICAgY29uc3QgYXN5bmNSZXN1bHQgPSByZXN1bHQgYXMgQXN5bmNSZXN1bHQ8VCwgRT47XG4gICAgICAgIGNvbnN0IHdyYXBwZWRQcm9taXNlUmVzdWx0ID0gYXN5bmNSZXN1bHQudGhlbih1bndyYXBwZWRSZXN1bHQgPT4ge1xuICAgICAgICAgICAgaWYodW53cmFwcGVkUmVzdWx0Lm9rKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm5SZXMgPSBmbih1bndyYXBwZWRSZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZuUmVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKEVycilcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycihlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVud3JhcHBlZFJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBBc3luY1BpcGUod3JhcHBlZFByb21pc2VSZXN1bHQpO1xuICAgIH07XG5cbmNvbnN0IGFzeW5jUGlwZVJlc3VsdCA9IDxULCBFID0gRXJyb3I+KHJlc3VsdDogQXN5bmNSZXN1bHQ8VCwgRT4pID0+ICgpID0+IHJlc3VsdDtcbmNvbnN0IGFzeW5jUGlwZVZhbHVlID0gPFQsIEU+KHJlc3VsdDogQXN5bmNSZXN1bHQ8VCwgRT4pID0+IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCByZXN1bHQ7XG4gICAgICAgIGlmKHJlcy5vaykge1xuICAgICAgICAgICAgcmV0dXJuIHJlcy52YWx1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG5jb25zdCBhc3luY1BpcGVWYWx1ZU9yID0gPFQsIEU+KHJlc3VsdDogQXN5bmNSZXN1bHQ8VCwgRT4pID0+IGFzeW5jIDxVPihvcjogVSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgaWYocmVzLm9rKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcjtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG9yO1xuICAgIH1cbn1cblxuY29uc3QgYXN5bmNQaXBlVmFsdWVPclRocm93ID0gPFQsIEU+KHJlc3VsdDogQXN5bmNSZXN1bHQ8VCwgRT4pID0+IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCByZXN1bHQ7XG4gICAgaWYocmVzLm9rKSB7XG4gICAgICAgIHJldHVybiByZXMudmFsdWU7XG4gICAgfVxuICAgIHRocm93IHJlcy5lcnJvcjtcbn1cbiAgICBcblxuZXhwb3J0IHR5cGUgSVJlc3VsdFN0cmVhbTxULCBFID0gRXJyb3I+ID0ge1xuICAgIG1hcDogPFU+KGZuOiAodDogVCkgPT4gVSkgPT4gSVJlc3VsdFN0cmVhbTxVLCBFPixcbiAgICBmaWx0ZXI6IChmbjogKHQ6IFQpID0+IGJvb2xlYW4pID0+IElSZXN1bHRTdHJlYW08VCwgRT5cbiAgICByZXN1bHRzOiAoKSA9PiBSZXN1bHQ8VFtdLCBFPjtcbiAgICB2YWx1ZTogKCkgPT4gVFtdIHwgdW5kZWZpbmVkLFxuICAgIHZhbHVlT3I6IDxVPih1OiBVKSA9PiBUW10gfCBVLFxuICAgIHZhbHVlT3JUaHJvdzogKCkgPT4gVFtdLFxufVxuXG5leHBvcnQgY29uc3QgUmVzdWx0U3RyZWFtID0gPFQsIEUgPSBFcnJvcj4ocmVzdWx0czogUmVzdWx0PFRbXSwgRT4pOiBJUmVzdWx0U3RyZWFtPFQsIEU+ID0+ICh7XG4gICAgbWFwOiBzdHJlYW1NYXAocmVzdWx0cyksXG4gICAgZmlsdGVyOiBzdHJlYW1GaWx0ZXIocmVzdWx0cyksXG4gICAgcmVzdWx0czogc3RyZWFtUmVzdWx0cyhyZXN1bHRzKSxcbiAgICB2YWx1ZTogc3RyZWFtVmFsdWUocmVzdWx0cyksXG4gICAgdmFsdWVPcjogc3RyZWFtVmFsdWVPcihyZXN1bHRzKSxcbiAgICB2YWx1ZU9yVGhyb3c6IHN0cmVhbVZhbHVlT3JUaHJvdyhyZXN1bHRzKVxufSlcblxuY29uc3Qgc3RyZWFtTWFwID0gPFQsIEU+KHJlc3VsdHM6IFJlc3VsdDxUW10sIEU+KSA9PiA8VT4oZm46ICh0OiBUKSA9PiBVKTogSVJlc3VsdFN0cmVhbTxVLCBFPiA9PiB7XG4gICAgaWYoIXJlc3VsdHMub2spIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdFN0cmVhbShyZXN1bHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIFJlc3VsdFN0cmVhbShPayhyZXN1bHRzLnZhbHVlLm1hcChmbikpKTtcbn1cblxuY29uc3Qgc3RyZWFtRmlsdGVyID0gPFQsIEU+KHJlc3VsdHM6IFJlc3VsdDxUW10sIEU+KSA9PiAoZm46ICh0OiBUKSA9PiBib29sZWFuKTogSVJlc3VsdFN0cmVhbTxULCBFPiA9PiB7XG4gICAgaWYoIXJlc3VsdHMub2spIHtcbiAgICAgICAgcmV0dXJuIFJlc3VsdFN0cmVhbShyZXN1bHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIFJlc3VsdFN0cmVhbShPayhyZXN1bHRzLnZhbHVlLmZpbHRlcihmbikpKTtcbn1cblxuY29uc3Qgc3RyZWFtUmVzdWx0cyA9IDxULCBFPihyZXN1bHRzOiBSZXN1bHQ8VFtdLCBFPikgPT4gKCk6IFJlc3VsdDxUW10sIEU+ID0+IHJlc3VsdHM7XG5cbmNvbnN0IHN0cmVhbVZhbHVlID0gPFQsIEU+KHJlc3VsdHM6IFJlc3VsdDxUW10sIEU+KSA9PiAoKTogVFtdIHwgdW5kZWZpbmVkID0+IHJlc3VsdHMub2sgPyByZXN1bHRzLnZhbHVlIDogdW5kZWZpbmVkO1xuXG5jb25zdCBzdHJlYW1WYWx1ZU9yID0gPFQsIEU+KHJlc3VsdHM6IFJlc3VsdDxUW10sIEU+LCkgPT4gPFU+KG9yOiBVKTogVFtdIHwgVSA9PiByZXN1bHRzLm9rID8gcmVzdWx0cy52YWx1ZSA6IG9yO1xuXG5jb25zdCBzdHJlYW1WYWx1ZU9yVGhyb3cgPSA8VCwgRT4ocmVzdWx0czogUmVzdWx0PFRbXSwgRT4pID0+ICgpOiBUW10gPT4ge1xuICAgIGlmKHJlc3VsdHMub2spe1xuICAgICAgICByZXR1cm4gcmVzdWx0cy52YWx1ZVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHJlc3VsdHMuZXJyb3I7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIE5vVmFsdWVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHVuZGVmaW5lZCB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoJ1ZhbHVlIHdhcyB1bmRlZmluZWQgb3IgbnVsbCcpXG4gICAgfVxufTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBJR2VvLCBJR2VvQ29udGV4dCB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDdHgsIHR5cGUgSUxvZ2dlciB9IGZyb20gJy4vTG9nZ2VyJztcbmltcG9ydCB7IEVyciwgT2ssIHR5cGUgQXN5bmNSZXN1bHQgfSBmcm9tICcuL1Jlc3VsdCc7XG5cbmNvbnN0IFNVUkZfR0VPX1NFUlZJQ0VfVVJMID0gJ2h0dHBzOi8vZy5zdXJmc2lkZS5pby9lbnJpY2gnO1xuXG5leHBvcnQgdHlwZSBHZXRHZW9GbiA9IChpcD86IHN0cmluZywgZ2VvUHJvdmlkZXJUb2tlbj86IHN0cmluZykgPT4gQXN5bmNSZXN1bHQ8SUdlb0NvbnRleHQ+O1xuXG5jb25zdCBMT0NBVElPTl9UWVBFX0lQID0gMjtcbmNvbnN0IElQX1NFUlZJQ0VTX01BWE1JTkQgPSAzO1xuXG5leHBvcnQgY29uc3QgR2V0R2VvID0gYXN5bmMgKGxvZ2dlcj86IElMb2dnZXIsIGFwaVRva2VuPzogc3RyaW5nLCBpcD86IHN0cmluZyk6IEFzeW5jUmVzdWx0PElHZW9Db250ZXh0PiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0dlb1NlcnZpY2UnKTtcbiAgICBsb2c/LmluZm8oJ0dldHRpbmcgR2VvIGluZm8nKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFNVUkZfR0VPX1NFUlZJQ0VfVVJMKTtcbiAgICAgICAgLy8gY29uc3QgcmVzcG9uc2UgPSBpcCA9PT0gdW5kZWZpbmVkXG4gICAgICAgIC8vICAgICA/IGF3YWl0IGZldGNoKFNVUkZfR0VPX1NFUlZJQ0VfVVJMKVxuICAgICAgICAvLyAgICAgOiBhd2FpdCBmZXRjaChTVVJGX0dFT19TRVJWSUNFX1VSTCwge1xuICAgICAgICAvLyAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAvLyAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLy8gICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7YXBpVG9rZW59YFxuICAgICAgICAvLyAgICAgICAgIH0sXG4gICAgICAgIC8vICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpcCB9KVxuICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgIGxvZz8uZGVidWcoJ0dlbyBSZXNwb25zZScsIHJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuIE9rKGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBJR2VvQ29udGV4dCk7XG4gICAgfSBjYXRjaChlcnIpIHtcbiAgICAgICAgcmV0dXJuIEVycihlcnIgYXMgRXJyb3IpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBHZW9Db250ZXh0VG9PUlRCID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCwgZ2VvQ29udGV4dDogSUdlb0NvbnRleHQpOiBJR2VvID0+ICh7XG4gICAgbGF0OiBnZW9Db250ZXh0LmNvb3Jkcy5sYXRpdHVkZSxcbiAgICBsb246IGdlb0NvbnRleHQuY29vcmRzLmxvbmdpdHVkZSxcbiAgICBjaXR5OiBnZW9Db250ZXh0LmNpdHksXG4gICAgcmVnaW9uOiBnZW9Db250ZXh0LnJlZ2lvbixcbiAgICBjb3VudHJ5OiBnZW9Db250ZXh0LmNvdW50cnksXG4gICAgemlwOiBnZW9Db250ZXh0LnppcCxcbiAgICB0eXBlOiBMT0NBVElPTl9UWVBFX0lQLFxuICAgIGFjY3VyYWN5OiBnZW9Db250ZXh0LmNvb3Jkcy5hY2N1cmFjeSxcbiAgICB1dGNvZmZzZXQ6IGdlb0NvbnRleHQudXRjb2Zmc2V0LFxuICAgIGlwc2VydmljZTogSVBfU0VSVklDRVNfTUFYTUlORFxufSk7XG4iLAogICAgImltcG9ydCB7IEFkQ29tMTBEZXZpY2VUeXBlcywgdHlwZSBJQnJhbmRWZXJzaW9uLCB0eXBlIElEZXZpY2UsIHR5cGUgSVVzZXJBZ2VudCB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDdHgsIE9rLCB0eXBlIElMb2dnZXIsIHR5cGUgUmVzdWx0IH0gZnJvbSAnLic7XG5cbmludGVyZmFjZSBJRGV2aWNlQ29udGV4dCB7XG4gICAgbWFrZT86IHN0cmluZztcbiAgICBtb2RlbD86IHN0cmluZztcbiAgICBvcz86IHN0cmluZztcbiAgICBvc3Y/OiBzdHJpbmc7XG4gICAgYnJvd3Nlcj86IElCcmFuZFZlcnNpb247XG59XG5cbmV4cG9ydCB0eXBlIEdldERldmljZUZuID0gKHNjcmVlbjogSVNjcmVlbiwgbmF2aWdhdG9yOiBJTmF2aWdhdG9yLCBtb2JpbGU6IGJvb2xlYW4pID0+IFJlc3VsdDxJRGV2aWNlPjtcblxuZXhwb3J0IGludGVyZmFjZSBJU2NyZWVuIHtcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOYXZpZ2F0b3Ige1xuICAgIHVzZXJBZ2VudDogc3RyaW5nLFxuICAgIGxhbmd1YWdlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IEdldERldmljZSA9IChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgc2NyZWVuOiBJU2NyZWVuLFxuICAgIG5hdmlnYXRvcjogSU5hdmlnYXRvcixcbiAgICBtb2JpbGU6IGJvb2xlYW5cbik6IFJlc3VsdDxJRGV2aWNlPiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0RldmljZVNlcnZpY2UnKTtcbiAgICBsb2c/LmluZm8oJ0dldHRpbmcgZGV2aWNlIGluZm8nKTtcblxuICAgIGNvbnN0IGRldmljZUluZm8gPSBnZXREZXZpY2VJbmZvKGxvZywgbmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbiAgICBjb25zdCBzdWE6IElVc2VyQWdlbnQgPSB7XG4gICAgICAgIG1vZGVsOiBkZXZpY2VJbmZvPy5tb2RlbCxcbiAgICAgICAgbW9iaWxlOiBtb2JpbGUgPyAxIDogMCwgLy8gb3BlbiBSVEIgdXNlcyAxIGZvciB0cnVlIGFuZCAwIGZvciBmYWxzZVxuICAgICAgICBicm93c2VyczogZGV2aWNlSW5mbz8uYnJvd3NlciAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IFtkZXZpY2VJbmZvLmJyb3dzZXJdXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgcGxhdGZvcm06IChkZXZpY2VJbmZvPy5vcyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgYnJhbmQ6IGRldmljZUluZm8/Lm9zLFxuICAgICAgICAgICAgICAgIHZlcnNpb246IGRldmljZUluZm8/Lm9zdj8uc3BsaXQoJy4nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGFyY2hpdGVjdHVyZTogZ2V0Q1BVQXJjaGl0ZWN0dXJlKGxvZywgbmF2aWdhdG9yLnVzZXJBZ2VudCwgbW9iaWxlKSxcbiAgICAgICAgc291cmNlOiAzXG4gICAgfTtcblxuICAgIHJldHVybiBPayh7XG4gICAgICAgIG1ha2U6IGRldmljZUluZm8/Lm1ha2UsXG4gICAgICAgIG1vZGVsOiBkZXZpY2VJbmZvPy5tb2RlbCxcbiAgICAgICAgdzogc2NyZWVuLndpZHRoLFxuICAgICAgICBoOiBzY3JlZW4uaGVpZ2h0LFxuICAgICAgICBsYW5ndWFnZTogbmF2aWdhdG9yLmxhbmd1YWdlLFxuICAgICAgICB1YTogbmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgICAgZGV2aWNldHlwZTogZ2V0RGV2aWNlVHlwZShsb2csIHNjcmVlbiwgbW9iaWxlKSxcbiAgICAgICAgb3M6IGRldmljZUluZm8/Lm9zLFxuICAgICAgICBvc3Y6IGRldmljZUluZm8/Lm9zdixcbiAgICAgICAgc3VhXG4gICAgfSk7XG59O1xuXG5jb25zdCBnZXREZXZpY2VJbmZvID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCwgdXNlckFnZW50OiBzdHJpbmcpOiBJRGV2aWNlQ29udGV4dCA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ3RyeUdldERldmljZUluZm8nKTtcbiAgICBsb2c/LmRlYnVnKCdnZXR0aW5nIGRldmljZSBpbmZvJyk7XG4gICAgY29uc3QgdXNlckFnZW50TG93ZXIgPSB1c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcblxuICAgIGNvbnN0IGJyb3dzZXIgPSBnZXRCcm93c2VySW5mbyhsb2csIG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIGlmICh1c2VyQWdlbnRMb3dlci5pbmNsdWRlcygnYW5kcm9pZCcpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5nZXRBbmRyb2lkRGV2aWNlSW5mbyhsb2csIHVzZXJBZ2VudCksXG4gICAgICAgICAgICBicm93c2VyXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh1c2VyQWdlbnRMb3dlci5pbmNsdWRlcygnaXBob25lJykgfHwgdXNlckFnZW50TG93ZXIuaW5jbHVkZXMoJ2lwYWQnKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uZ2V0aVBob25lRGV2aWNlSW5mbyhsb2csIHVzZXJBZ2VudCksXG4gICAgICAgICAgICBicm93c2VyXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh1c2VyQWdlbnRMb3dlci5pbmNsdWRlcygnd2luZG93cyBudCcpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtYWtlOiAnTWljcm9zb2Z0JyxcbiAgICAgICAgICAgIG1vZGVsOiAnV2luZG93cycsXG4gICAgICAgICAgICBvczogJ1dpbmRvd3MnLFxuICAgICAgICAgICAgb3N2OiAvV2luZG93cyBOVCAoPzxvc3Y+WzAtOS5dKykvaWcuZXhlYyh1c2VyQWdlbnQpPy5ncm91cHM/Lm9zdixcbiAgICAgICAgICAgIGJyb3dzZXJcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHVzZXJBZ2VudExvd2VyLmluY2x1ZGVzKCdtYWNpbnRvc2gnKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWFrZTogJ0FwcGxlJyxcbiAgICAgICAgICAgIG1vZGVsOiAnTWFjaW50b3NoJyxcbiAgICAgICAgICAgIG9zOiAnTWFjT1MnLFxuICAgICAgICAgICAgb3N2OiAvTWFjIE9TIFggKD88b3N2PlswLTlfXSspL2lnLmV4ZWModXNlckFnZW50KT8uZ3JvdXBzPy5vc3Y/LnJlcGxhY2VBbGwoJ18nLCAnLicpLFxuICAgICAgICAgICAgYnJvd3NlclxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBicm93c2VyIH07XG59O1xuXG5jb25zdCBnZXRBbmRyb2lkRGV2aWNlSW5mbyA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsIHVzZXJBZ2VudDogc3RyaW5nKTogSURldmljZSA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ2dldEFuZHJvaWREZXZpY2VJbmZvJyk7XG4gICAgbG9nPy5kZWJ1ZygnZ2V0dGluZyBhbmRyb2lkIGluZm8nKTtcbiAgICBjb25zdCBtYXRjaCA9IC9eW15cXHNdK1xcc1xcKCg/PExpbnV4Pi4qKTtcXHMqKD88b3N2PlteKV0rKTtcXHMqKD88TW9kZWw+W14pXSspXFwpL2lnLmV4ZWModXNlckFnZW50KTtcbiAgICBjb25zdCBvc3YgPSBtYXRjaD8uZ3JvdXBzPy5vc3Y7XG4gICAgY29uc3QgbW9kZWwgPSBtYXRjaD8uZ3JvdXBzPy5Nb2RlbDtcbiAgICBjb25zdCBwYXJ0aWFsRGV2aWNlID0ge1xuICAgICAgICBvczogJ0FuZHJvaWQnLFxuICAgICAgICBvc3YsXG4gICAgICAgIG1vZGVsLFxuICAgIH07XG4gICAgaWYgKG1vZGVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG1vZGVsLmluY2x1ZGVzKCdQaXhlbCcpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnBhcnRpYWxEZXZpY2UsXG4gICAgICAgICAgICAgICAgbWFrZTogJ0dvb2dsZSdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZWwuaW5jbHVkZXMoJ1NNLScpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnBhcnRpYWxEZXZpY2UsXG4gICAgICAgICAgICAgICAgbWFrZTogJ1NhbXN1bmcnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLnN0YXJ0c1dpdGgoJ0xHLScpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnBhcnRpYWxEZXZpY2UsXG4gICAgICAgICAgICAgICAgbWFrZTogJ0xHJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlbC5zdGFydHNXaXRoKCdtb3RvJykpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucGFydGlhbERldmljZSxcbiAgICAgICAgICAgICAgICBtYWtlOiAnTW90b3JvbGEnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLnN0YXJ0c1dpdGgoJ1JlZG1pJykpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucGFydGlhbERldmljZSxcbiAgICAgICAgICAgICAgICBtYWtlOiAnWGlhb21pJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucGFydGlhbERldmljZSxcbiAgICAgICAgICAgICAgICBtYWtlOiAnQW5kcm9pZCdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBvczogJ0FuZHJvaWQnLFxuICAgICAgICBvc3ZcbiAgICB9O1xufTtcblxuY29uc3QgZ2V0aVBob25lRGV2aWNlSW5mbyA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsIHVzZXJBZ2VudDogc3RyaW5nKTogSURldmljZSA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ2dldElwaG9uZURldmljZUluZm8nKTtcbiAgICBsb2c/LmRlYnVnKCdnZXR0aW5nIGlQaG9uZSBpbmZvJyk7XG4gICAgY29uc3QgbWF0Y2ggPSAvXlteXFxzXStcXHMqXFwoKD88RGV2aWNlPlteO10rKTtcXHMoPzxNb2RlbD5bXjspXStbOyldKVxccyg/PE1vZGVsRXh0PlteOyldK1s7KV0pPy9pZy5leGVjKHVzZXJBZ2VudCk7XG4gICAgY29uc3QgbWFrZSA9ICdBcHBsZSc7XG4gICAgY29uc3QgZGV2aWNlID0gbWF0Y2g/Lmdyb3Vwcz8uRGV2aWNlO1xuICAgIGNvbnN0IG1vZGVsID0gZGV2aWNlPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdpcGFkJylcbiAgICAgICAgPyAnaVBhZCdcbiAgICAgICAgOiAnaVBob25lJztcblxuICAgIGNvbnN0IG1vZGVsR3JvdXAgPSBtYXRjaD8uZ3JvdXBzPy5Nb2RlbDtcbiAgICAvKiBOZXdlciBEZXZpY2UgKi9cbiAgICBjb25zdCBvczogc3RyaW5nID0gJ2lPUyc7XG5cbiAgICBjb25zdCBvc3ZTZWFyY2ggPSBtb2RlbEdyb3VwID09PSAnVSdcbiAgICAgICAgPyBtYXRjaD8uZ3JvdXBzPy5Nb2RlbEV4dFxuICAgICAgICA6IG1vZGVsR3JvdXA7XG5cbiAgICBjb25zdCBvc3YgPSBvc3ZTZWFyY2ggIT09IHVuZGVmaW5lZFxuICAgICAgICA/IC9PUyAoPzx2ZXI+WzAtOV9dKykvaWcuZXhlYyhvc3ZTZWFyY2gpPy5ncm91cHM/Lk1vZGVsRXh0XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWFrZSxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIG9zLFxuICAgICAgICBvc3ZcbiAgICB9O1xufTtcblxuY29uc3QgZ2V0QnJvd3NlckluZm8gPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLCB1c2VyQWdlbnQ6IHN0cmluZyk6IElCcmFuZFZlcnNpb24gfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdnZXRCcm93c2VySW5mbycpO1xuICAgIGxvZz8uZGVidWcoJ2dldHRpbmcgYnJvd3NlciBpbmZvJyk7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHVzZXJBZ2VudC5pbmNsdWRlcygnRmlyZWZveC8nKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiB1c2VyQWdlbnQuc3BsaXQoJ0ZpcmVmb3gvJylbMV0/LnNwbGl0KCcuJyksXG4gICAgICAgICAgICAgICAgYnJhbmQ6ICdGaXJlZm94J1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyQWdlbnQuaW5jbHVkZXMoJ0Nocm9tZS8nKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiB1c2VyQWdlbnQuc3BsaXQoJ0Nocm9tZS8nKVsxXT8uc3BsaXQoJyAnKVswXT8uc3BsaXQoJy4nKSxcbiAgICAgICAgICAgICAgICBicmFuZDogJ0Nocm9tZSdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodXNlckFnZW50LmluY2x1ZGVzKCdDcmlPUycpKSB7XG4gICAgICAgICAgICAvLyBDaHJvbWUgb24gaU9TIHVzZXMgXCJDcmlPUy9cIiBpbnN0ZWFkIG9mIFwiQ2hyb21lL1wiLCB3aGljaCB3YXMgY2F1c2luZyBpc3N1ZXNcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmVyc2lvbjogdXNlckFnZW50LnNwbGl0KCdDcmlPUy8nKVsxXT8uc3BsaXQoJyAnKVswXT8uc3BsaXQoJy4nKSxcbiAgICAgICAgICAgICAgICBicmFuZDogJ0Nocm9tZSdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodXNlckFnZW50LmluY2x1ZGVzKCdTYWZhcmkvJykgJiYgIXVzZXJBZ2VudC5pbmNsdWRlcygnQ2hyb21lJykpIHtcbiAgICAgICAgICAgIC8vIFNhZmFyaSB2ZXJzaW9uIGlzIGEgYml0IHRyaWNraWVyIGR1ZSB0byBpdHMgVUEgc3RyaW5nIGZvcm1hdFxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiB1c2VyQWdlbnQuc3BsaXQoJ1ZlcnNpb24vJylbMV0/LnNwbGl0KCcgJylbMF0/LnNwbGl0KCcuJyksXG4gICAgICAgICAgICAgICAgYnJhbmQ6ICdTYWZhcmknXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHVzZXJBZ2VudC5pbmNsdWRlcygnRWRnLycpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZlcnNpb246IHVzZXJBZ2VudC5zcGxpdCgnRWRnLycpWzFdPy5zcGxpdCgnLicpLFxuICAgICAgICAgICAgICAgIGJyYW5kOiAnRWRnZSdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2c/LmVycm9yKGVycm9yKTtcbiAgICB9XG59O1xuXG5jb25zdCBnZXRDUFVBcmNoaXRlY3R1cmUgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLCB1c2VyQWdlbnQ6IHN0cmluZywgbW9iaWxlOiBib29sZWFuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZ2V0Q1BVQXJjaGl0ZWN0dXJlJyk7XG4gICAgbG9nPy5kZWJ1ZygnR2V0dGluZyBDUFUgYXJjaCcpO1xuICAgIC8vIENvbW1vbiBhcmNoaXRlY3R1cmUgcGF0dGVybnNcbiAgICBpZiAoL1dpbjY0fHg2NHx4ODZfNjR8V09XNjQvLnRlc3QodXNlckFnZW50KSkge1xuICAgICAgICByZXR1cm4gJ3g2NCc7XG4gICAgfVxuICAgIGlmICgvV2luMzJ8eDg2Ly50ZXN0KHVzZXJBZ2VudCkpIHtcbiAgICAgICAgcmV0dXJuICd4ODYnO1xuICAgIH1cbiAgICBpZiAoL2FhcmNoNjR8YXJtNjQvLnRlc3QodXNlckFnZW50KSkge1xuICAgICAgICByZXR1cm4gJ0FSTTY0JztcbiAgICB9XG4gICAgaWYgKC9hcm12XFxkKy8udGVzdCh1c2VyQWdlbnQpKSB7XG4gICAgICAgIHJldHVybiAnQVJNJztcbiAgICB9XG5cbiAgICAvKiBKdXN0IG5haXZlbHkgYXNzdW1lIGFsbCBwaG9uZXMgYXJlIGFybSAqL1xuICAgIGlmIChtb2JpbGUpIHtcbiAgICAgICAgcmV0dXJuICdBUk0nO1xuICAgIH1cblxuICAgIGxvZz8ud2FybignRmFpbGVkIHRvIGdldCBjcHUgYXJjaGl0ZWN0dXJlJyk7XG4gICAgcmV0dXJuO1xufTtcblxuY29uc3QgZ2V0RGV2aWNlVHlwZSA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsIHNjcmVlbjogSVNjcmVlbiwgbW9iaWxlOiBib29sZWFuKTogbnVtYmVyID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZ2V0RGV2aWNlVHlwZScpO1xuICAgIGxvZz8uZGVidWcoJ2dldHRpbmcgZGV2aWNlIHR5cGUnKTtcbiAgICBjb25zdCBNSU5JTVVNX1NIT1JUX1RBQkxFVCA9IDYwMDtcbiAgICBjb25zdCBNQVhJTVVNX0xPTkdfVEFCTEVUID0gOTYwO1xuXG4gICAgY29uc3QgaGFzVG91Y2ggPSBtb2JpbGU7XG4gICAgaWYgKCFoYXNUb3VjaCkge1xuICAgICAgICByZXR1cm4gQWRDb20xMERldmljZVR5cGVzLlBDO1xuICAgIH1cblxuICAgIGNvbnN0IHdpZHRoID0gc2NyZWVuLndpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IHNjcmVlbi5oZWlnaHQ7XG4gICAgY29uc3QgW3Nob3J0ZXJTaWRlLCBsb25nZXJTaWRlXSA9IFt3aWR0aCwgaGVpZ2h0XS5zb3J0KChhLCBiKSA9PiBhIC0gYikgYXMgW251bWJlciwgbnVtYmVyXTtcblxuICAgIGlmIChoYXNUb3VjaCAmJiBzaG9ydGVyU2lkZSA+PSBNSU5JTVVNX1NIT1JUX1RBQkxFVCAmJiBsb25nZXJTaWRlID49IE1BWElNVU1fTE9OR19UQUJMRVQpIHtcbiAgICAgICAgcmV0dXJuIEFkQ29tMTBEZXZpY2VUeXBlcy5UYWJsZXQ7XG4gICAgfVxuICAgIHJldHVybiBBZENvbTEwRGV2aWNlVHlwZXMuTW9iaWxlO1xufTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgSGFuZGxlYmFycyBmcm9tICdoYW5kbGViYXJzL3J1bnRpbWUnO1xuaW1wb3J0IHR5cGUgeyBJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uLCBJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uRFRPLCBJUHJvZHVjdENvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0ICB7IHR5cGUgQXN5bmNSZXN1bHQsIHR5cGUgSUxvZ2dlciwgQ3R4LCBFcnIsIE9rIH0gZnJvbSAnLic7XG5pbXBvcnQgeyBIYW5kbGViYXJzSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgdHlwZSBHZXRDb25maWd1cmF0aW9uRm4gPSAoKSA9PiBBc3luY1Jlc3VsdDxJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uPjtcblxuZXhwb3J0IGNvbnN0IEdldENvbmZpZ3VyYXRpb24gPSBhc3luYyAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGhhbmRsZWJhcnM6IHR5cGVvZiBIYW5kbGViYXJzLFxuICAgIGhlbHBlcnM6IEhhbmRsZWJhcnNIZWxwZXJzLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nXG4pOiBBc3luY1Jlc3VsdDxJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uPiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0NvbmZpZ3VyYXRpb25TZXJ2aWNlJykud2l0aCh1cmwpLndpdGgoYWNjb3VudElkKS53aXRoKHNpdGVJZCk7XG4gICAgbG9nPy5pbmZvKCdHZXR0aW5nIGNvbmZpZ3VyYXRpb24nKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dXJsfS8ke2FjY291bnRJZH0vJHtzaXRlSWR9L2NvbmZpZy5qc29uYCk7XG4gICAgICAgIGlmKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgbG9nPy5lcnJvcignRmFpbGVkIHRvIGdldCBjb25maWd1cmF0aW9uJywgdXJsLCBhY2NvdW50SWQsIHNpdGVJZCk7XG4gICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBjb25maWd1cmF0aW9uJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb25EVE87XG4gICAgICAgIGlmKGNvbmZpZy5zZXR0aW5ncyA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy50ZW1wbGF0ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9nPy5lcnJvcignY29uZmlndXJhdGlvbiB3YXMgYW4gaW52YWxpZCBmb3JtYXQnKTtcbiAgICAgICAgICAgIHJldHVybiBFcnIobmV3IEVycm9yKCdjb25maWd1cmF0aW9uIHdhcyBhbiBpbnZhbGlkIGZvcm1hdCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZz8uZGVidWcoJ2NvbmZpZ3VyYXRpb246ICcsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiBhd2FpdCBtYXBDb25maWcobG9nLCBoYW5kbGViYXJzLCBoZWxwZXJzLCBjb25maWcpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gRXJyKGVyciBhcyBFcnJvcik7XG4gICAgfVxufTtcblxuY29uc3QgbWFwQ29uZmlnID0gYXN5bmMgKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBoYW5kbGViYXJzOiB0eXBlb2YgSGFuZGxlYmFycyxcbiAgICBoZWxwZXJzOiBIYW5kbGViYXJzSGVscGVycyxcbiAgICBjb25maWc6IElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb25EVE9cbik6IEFzeW5jUmVzdWx0PElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnbWFwQ29uZmlnJyk7XG4gICAgbG9nPy5kZWJ1ZygnbWFwcGluZyBjb25maWd1cmF0aW9uJyk7XG5cbiAgICBjb25zdCBwcm9kdWN0Q2FyZFRlbXBsYXRlID0gaGFuZGxlYmFycy50ZW1wbGF0ZTxJUHJvZHVjdENvbnRleHQ+KChhd2FpdCBpbXBvcnRNb2R1bGU8YW55PihcbiAgICAgICAgbG9nLFxuICAgICAgICBgZXhwb3J0IGRlZmF1bHQgJHtjb25maWcudGVtcGxhdGVzPy5wcm9kdWN0Q2FyZFRlbXBsYXRlID8/ICcnfWBcbiAgICApKS5kZWZhdWx0IGFzIFRlbXBsYXRlU3BlY2lmaWNhdGlvbik7XG5cbiAgICBjb25zdCBjbGlja3Rocm91Z2hUZW1wbGF0ZSA9IGhhbmRsZWJhcnMudGVtcGxhdGU8SVByb2R1Y3RDb250ZXh0PigoYXdhaXQgaW1wb3J0TW9kdWxlPGFueT4oXG4gICAgICAgIGxvZyxcbiAgICAgICAgYGV4cG9ydCBkZWZhdWx0ICR7Y29uZmlnLnRlbXBsYXRlcz8uY2xpY2tUaHJvdWdoVXJsVGVtcGxhdGUgPz8gJyd9YFxuICAgICkpLmRlZmF1bHQgYXMgVGVtcGxhdGVTcGVjaWZpY2F0aW9uKTtcblxuICAgIHJldHVybiBPayh7XG4gICAgICAgIHNldHRpbmdzOiBjb25maWcuc2V0dGluZ3MsXG4gICAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICAgICAgY2xpY2tUaHJvdWdoVXJsVGVtcGxhdGU6IChjb250ZXh0OiBJUHJvZHVjdENvbnRleHQpID0+IGNsaWNrdGhyb3VnaFRlbXBsYXRlKGNvbnRleHQsIHsgaGVscGVycyB9KSxcbiAgICAgICAgICAgIHByb2R1Y3RDYXJkVGVtcGxhdGU6IChjb250ZXh0OiBJUHJvZHVjdENvbnRleHQpID0+IHByb2R1Y3RDYXJkVGVtcGxhdGUoY29udGV4dCwgeyBoZWxwZXJzIH0pLFxuICAgICAgICAgICAgamF2YXNjcmlwdENhbGxiYWNrczogYXdhaXQgaW1wb3J0TW9kdWxlKGxvZywgY29uZmlnLnRlbXBsYXRlcz8uamF2YXNjcmlwdENhbGxiYWNrcyA/PyAnJyksXG4gICAgICAgICAgICBwcm9kdWN0Q2FyZFN0eWxlc2hlZXQ6IGNvbmZpZy50ZW1wbGF0ZXM/LnByb2R1Y3RDYXJkU3R5bGVzaGVldCxcbiAgICAgICAgICAgIGNhcm91c2VsU3R5bGVzaGVldDogY29uZmlnLnRlbXBsYXRlcz8uY2Fyb3VzZWxTdHlsZXNoZWV0XG4gICAgICAgIH0sXG4gICAgICAgIGR5bmFtaWNab25lczogY29uZmlnLmR5bmFtaWNab25lc1xuICAgIH0pO1xufTtcblxuY29uc3QgaW1wb3J0TW9kdWxlID0gYXN5bmMgPFQ+KGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCwgc2NyaXB0OiBzdHJpbmcpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnaW1wb3J0TW9kdWxlJyk7XG4gICAgbG9nPy5kZWJ1ZygnaW1wb3J0aW5nJywgc2NyaXB0KTtcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3NjcmlwdF0sIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSk7XG4gICAgY29uc3QgbW9kdWxlVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBsb2c/LmRlYnVnKCdtb2R1bGVVcmwnLCBtb2R1bGVVcmwpO1xuICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IGltcG9ydCgvKiBAdml0ZS1pZ25vcmUgKi8gbW9kdWxlVXJsKSBhcyBUO1xuICAgIGxvZz8uZGVidWcoJ21vZHVsZTonLCBtb2R1bGUpO1xuICAgIHJldHVybiBtb2R1bGU7XG59O1xuIiwKICAgICJpbXBvcnQgeyBJQmlkUmVxdWVzdCwgSUJpZFJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEN0eCwgSUxvZ2dlciB9IGZyb20gJy4vTG9nZ2VyJztcbmltcG9ydCB7IEFzeW5jUmVzdWx0LCBFcnIsIE9rIH0gZnJvbSAnLi9SZXN1bHQnO1xuXG5jb25zdCBBVUNUSU9OX1BSSUNFX01BQ1JPID0gLyg/OlxcJHwlMjQpPyg/Olxce3wlN2IpYXVjdGlvbl9wcmljZSg/OlxcfXwlN2QpL2lnO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0Qmlkc0ZuID0gKHJlcXVlc3Q6IElCaWRSZXF1ZXN0KSA9PiBBc3luY1Jlc3VsdDxJQmlkUmVzcG9uc2U+O1xuXG5leHBvcnQgY29uc3QgUmVxdWVzdEJpZHMgPSBhc3luYyAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICBjaGFubmVsSWQ6IHN0cmluZyxcbiAgICBiaWRSZXF1ZXN0OiBJQmlkUmVxdWVzdFxuKTogQXN5bmNSZXN1bHQ8SUJpZFJlc3BvbnNlPiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcilcbiAgICAgICAgPy53aXRoKCdSZXF1ZXN0QmlkcycpXG4gICAgICAgIC53aXRoKGFjY291bnRJZClcbiAgICAgICAgLndpdGgoc2l0ZUlkKVxuICAgICAgICAud2l0aChsb2NhdGlvbklkKVxuICAgICAgICAud2l0aChjaGFubmVsSWQpO1xuICAgIGxvZz8uaW5mbygnUmVxdWVzdGluZyBiaWRzJyk7XG4gICAgbG9nPy5kZWJ1ZyhiaWRSZXF1ZXN0KTtcblxuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJpZFJlcXVlc3QpXG4gICAgICAgIH0pO1xuICAgICAgICBsb2c/LmRlYnVnKCdHb3QgcmVzcG9uc2UnLCByZXNwb25zZSk7XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgICAgc3dpdGNoIChyZXNwb25zZS5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICAgICAgICAgICAgbG9nPy53YXJuKCdObyBiaWRzJywgYmlkUmVxdWVzdCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBOb0JpZHNFcnJvcihiaWRSZXF1ZXN0LCByZXNwb25zZSkpO1xuICAgICAgICAgICAgICAgIGNhc2UgNTAwOlxuICAgICAgICAgICAgICAgICAgICBsb2c/LmVycm9yKCdCaWRkZXIgZmFpbGVkIHNlcnZlcnNpZGUuIFJlcG9ydCB0aGlzIGVycm9yLicsIGJpZFJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycihuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvcihiaWRSZXF1ZXN0LCByZXNwb25zZSkpO1xuICAgICAgICAgICAgICAgIGNhc2UgNTAzOlxuICAgICAgICAgICAgICAgICAgICBsb2c/LmVycm9yKCdCaWRkZXIgc3RhcnRpbmcgdXAuIFRyeSBhZ2FpbiBpbiBhIGZldyBtaW51dGVzJywgYmlkUmVxdWVzdCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBCaWRkZXJTdGFydGluZ1VwRXJyb3IoYmlkUmVxdWVzdCwgcmVzcG9uc2UpKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsb2c/LmVycm9yKCdVbmtub3duIGJpZGRlciBlcnJvcicsIGJpZFJlcXVlc3QsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycihuZXcgVW5rbm93bkJpZGRlckVycm9yKGJpZFJlcXVlc3QsIHJlc3BvbnNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsb2c/LmRlYnVnKCdTdWNjZXNzZnVsbHkgZ290IGJpZHMnLCBiaWRSZXF1ZXN0KTtcbiAgICAgICAgY29uc3QgYmlkUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgSUJpZFJlc3BvbnNlO1xuICAgICAgICBpZiAoYmlkUmVzcG9uc2Uuc2VhdGJpZCA9PT0gdW5kZWZpbmVkIHx8IGJpZFJlc3BvbnNlLnNlYXRiaWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBsb2c/LmVycm9yKCdCaWRkZXIgZGlkblxcJ3QgcmV0dXJuIGFueSBzZWF0YmlkcycpO1xuICAgICAgICAgICAgcmV0dXJuIEVycihuZXcgTWFsZm9ybWVkQmlkUmVzcG9uc2VFcnJvcihiaWRSZXF1ZXN0LCByZXNwb25zZSwgYmlkUmVzcG9uc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpZFJlc3BvbnNlLnNlYXRiaWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNlYXRiaWQgPSBiaWRSZXNwb25zZS5zZWF0YmlkW2ldO1xuICAgICAgICAgICAgaWYgKHNlYXRiaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGxvZz8ud2FybihgU2VhdGJpZCAjJHtpfSB3YXMgdW5kZWZpbmVkYCwgYmlkUmVxdWVzdCwgcmVzcG9uc2UsIGJpZFJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2VhdGJpZC5iaWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiaWQgPSBzZWF0YmlkLmJpZFtqXTtcbiAgICAgICAgICAgICAgICBpZiAoYmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nPy53YXJuKGBCaWQgIyR7an0gaW4gc2VhdGJpZCAjJHtpfSB3YXMgdW5kZWZpbmVkYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBEZWNvZGUgYW55IHBvdGVudGlhbCBVUkkgZW5jb2RpbmcgKi9cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBiaWQuYWRtID0gZGVjb2RlVVJJQ29tcG9uZW50KGJpZD8uYWRtID8/ICcnKS5yZXBsYWNlQWxsKC9cXFxcXCIvaWcsICdcIicpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICBsb2c/LmRlYnVnKCdBZG0gaXMgbm90IGVuY29kZWQuIFRoaXMgaXMgbm90IGFuIGlzc3VlLiBNb3Zpbmcgb24uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIE1hY3JvIHJlcGxhY2VtZW50IGlzIHBhcnQgb2YgT1JUQiBzcGVjLCBzbyBpdCBiZWxvbmdzIGhlcmUgKi9cbiAgICAgICAgICAgICAgICBiaWQubnVybCA9IGJpZC5udXJsPy5yZXBsYWNlKEFVQ1RJT05fUFJJQ0VfTUFDUk8sIGJpZC5wcmljZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBiaWQuYWRtID0gYmlkLmFkbT8ucmVwbGFjZUFsbChBVUNUSU9OX1BSSUNFX01BQ1JPLCBiaWQucHJpY2UudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsb2c/LmRlYnVnKCdSZXR1cm5pbmcgYmlkIHJlc3BvbnNlcycpO1xuICAgICAgICByZXR1cm4gT2soYmlkUmVzcG9uc2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gRXJyKGVyciBhcyBFcnJvcik7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIE5vQmlkc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVxdWVzdDogSUJpZFJlcXVlc3QsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZXNwb25zZT86IFJlc3BvbnNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCcyMDQgLSBObyBiaWRzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCcpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludGVybmFsU2VydmVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZXF1ZXN0OiBJQmlkUmVxdWVzdCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlc3BvbnNlOiBSZXNwb25zZVxuICAgICkge1xuICAgICAgICBzdXBlcignNTAwIC0gQmlkZGVyIGhhZCBhbiB1bmtub3duIHNlcnZlcnNpZGUgZXJyb3InKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaWRkZXJTdGFydGluZ1VwRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZXF1ZXN0OiBJQmlkUmVxdWVzdCxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlc3BvbnNlOiBSZXNwb25zZVxuICAgICkge1xuICAgICAgICBzdXBlcignNTAzIC0gQmlkZGVyIGlzIHN0YXJ0aW5nIHVwJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5rbm93bkJpZGRlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVxdWVzdDogSUJpZFJlcXVlc3QsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByZXNwb25zZTogUmVzcG9uc2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoJ1Vua25vd24gYmlkZGVyIGVycm9yJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFsZm9ybWVkQmlkUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJlcXVlc3Q6IElCaWRSZXF1ZXN0LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2U6IFJlc3BvbnNlLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYmlkUmVzcG9uc2U6IHVua25vd25cbiAgICApIHtcbiAgICAgICAgc3VwZXIoJ01hbGZvcm1lZCBiaWQgcmVzcG9uc2UgZXJyb3InKTtcbiAgICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgSVByb2R1Y3RJbmZvcm1hdGlvbiB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDdHgsIHR5cGUgSUxvZ2dlciB9IGZyb20gJy4vTG9nZ2VyJztcbmltcG9ydCB7IEVyciwgT2ssIFJlc3VsdCwgdHlwZSBBc3luY1Jlc3VsdCB9IGZyb20gJy4vUmVzdWx0JztcblxuZXhwb3J0IHR5cGUgR2V0U3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuID0gKG5hdGl2ZUlkOiBzdHJpbmcpID0+IEFzeW5jR2VuZXJhdG9yPElQcm9kdWN0SW5mb3JtYXRpb24+O1xuZXhwb3J0IHR5cGUgR2V0QWxsU3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuID0gKG5hdGl2ZUlkOiBzdHJpbmcpID0+IFByb21pc2U8UmVzdWx0PElQcm9kdWN0SW5mb3JtYXRpb25bXT4+O1xuZXhwb3J0IHR5cGUgR2V0UmVjb21tZW5kZWRQcm9kdWN0RnJvbVByb2R1Y3RJZEZuID0gKHByb2R1Y3RJZDogc3RyaW5nKSA9PiBBc3luY1Jlc3VsdDxJUHJvZHVjdEluZm9ybWF0aW9uPlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gKkdldFNwb25zb3JlZFByb2R1Y3QoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICBuYXRpdmVJZDogc3RyaW5nXG4pOiBBc3luY0dlbmVyYXRvcjxJUHJvZHVjdEluZm9ybWF0aW9uPiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0dldFNwb25zb3JlZFByb2R1Y3QnKS53aXRoKGFjY291bnRJZCkud2l0aChsb2NhdGlvbklkKS53aXRoKG5hdGl2ZUlkKTtcbiAgICBsb2c/LmluZm8oJ0dldHRpbmcgc3BvbnNvcmVkIHByb2R1Y3QnLCApO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhd1Jlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dXJsfS9uYXRpdmUvJHthY2NvdW50SWR9LyR7bG9jYXRpb25JZH0vJHtuYXRpdmVJZH0uanNvbmApO1xuICAgICAgICBpZihyYXdSZXNwb25zZS5zdGF0dXMgIT09IDIwMClcbiAgICAgICAge1xuICAgICAgICAgICAgbG9nPy5lcnJvcigncHJvZHVjdCBmZWVkIHNlcnZpY2UgcmV0dXJuZWQgd2l0aCBub24tMjAwIHJlc3BvbnNlJywgcmF3UmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9kdWN0cyA9IHJhd1Jlc3BvbnNlIGFzIChSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PltdKTtcbiAgICAgICAgbG9nPy5kZWJ1ZygncmVzcG9uc2UnLCBwcm9kdWN0cyk7XG4gICAgICAgIGlmKEFycmF5LmlzQXJyYXkocHJvZHVjdHMpKSB7XG4gICAgICAgICAgICBsb2c/LmRlYnVnKCdCcmFuZCBsZXZlbCBjcmVhdGl2ZScpO1xuICAgICAgICAgICAgY29uc3QgcHJvZHVjdEFyciA9IHByb2R1Y3RzIGFzIFJlY29yZDxzdHJpbmcsIGFueT5bXTtcbiAgICAgICAgICAgIGZvcihjb25zdCBwcm9kdWN0IG9mIHByb2R1Y3RBcnIpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBtYXBSZXNwb25zZVRvUHJvZHVjdEluZm8obG9nLCBwcm9kdWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZz8uZGVidWcoJ0luZGl2aWR1YWwgcHJvZHVjdCBjcmVhdGl2ZScpO1xuICAgICAgICAgICAgY29uc3QgcHJvZHVjdCA9IHByb2R1Y3RzIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgICByZXR1cm4gbWFwUmVzcG9uc2VUb1Byb2R1Y3RJbmZvKGxvZywgcHJvZHVjdCk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoKGVycikge1xuICAgICAgICBsb2c/LmVycm9yKGVycik7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgR2V0QWxsU3BvbnNvcmVkUHJvZHVjdHMgPSBhc3luYyAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICBuYXRpdmVJZDogc3RyaW5nXG4pOiBQcm9taXNlPFJlc3VsdDxJUHJvZHVjdEluZm9ybWF0aW9uW10+PiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0dldFNwb25zb3JlZFByb2R1Y3QnKS53aXRoKGFjY291bnRJZCkud2l0aChsb2NhdGlvbklkKS53aXRoKG5hdGl2ZUlkKTtcbiAgICBsb2c/LmluZm8oJ0dldHRpbmcgc3BvbnNvcmVkIHByb2R1Y3QnLCk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmF3UmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt1cmx9L25hdGl2ZS8ke2FjY291bnRJZH0vJHtsb2NhdGlvbklkfS8ke25hdGl2ZUlkfS5qc29uYCk7XG4gICAgICAgIGlmIChyYXdSZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgICAgbG9nPy5lcnJvcigncHJvZHVjdCBmZWVkIHNlcnZpY2UgcmV0dXJuZWQgd2l0aCBub24tMjAwIHJlc3BvbnNlJywgcmF3UmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgIHJldHVybiBFcnIobmV3IE5vTmF0aXZlRXJyb3IobmF0aXZlSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9kdWN0cyA9IChhd2FpdCByYXdSZXNwb25zZS5qc29uKCkpIGFzIChSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PltdKTtcbiAgICAgICAgbG9nPy5kZWJ1ZygncmVzcG9uc2UnLCBwcm9kdWN0cyk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb2R1Y3RzKSkge1xuICAgICAgICAgICAgbG9nPy5kZWJ1ZygnQnJhbmQgbGV2ZWwgY3JlYXRpdmUnKTtcbiAgICAgICAgICAgIGNvbnN0IHByb2R1Y3RBcnIgPSBwcm9kdWN0cyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+W107XG4gICAgICAgICAgICBjb25zdCBtYXBSZXNwb25zZVRvUHJvZHVjdEluZm9Mb2dnZWQgPSBtYXBSZXNwb25zZVRvUHJvZHVjdEluZm8uYmluZCh1bmRlZmluZWQsIGxvZyk7XG4gICAgICAgICAgICByZXR1cm4gT2socHJvZHVjdEFyci5tYXAobWFwUmVzcG9uc2VUb1Byb2R1Y3RJbmZvTG9nZ2VkKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2c/LmRlYnVnKCdJbmRpdmlkdWFsIHByb2R1Y3QgY3JlYXRpdmUnKTtcbiAgICAgICAgICAgIGNvbnN0IHByb2R1Y3QgPSBwcm9kdWN0cyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgICAgcmV0dXJuIE9rKFttYXBSZXNwb25zZVRvUHJvZHVjdEluZm8obG9nLCBwcm9kdWN0KV0pO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZz8uZXJyb3IoZXJyKTtcbiAgICAgICAgcmV0dXJuIEVycihlcnIgYXMgRXJyb3IpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBHZXRSZWNvbW1lbmRlZFByb2R1Y3QgPSBhc3luYyAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICBwcm9kdWN0SWQ6IHN0cmluZ1xuKTogQXN5bmNSZXN1bHQ8SVByb2R1Y3RJbmZvcm1hdGlvbj4gPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdHZXRSZWNvbW1lbmRlZFByb2R1Y3QnKS53aXRoKGFjY291bnRJZCkud2l0aChsb2NhdGlvbklkKS53aXRoKHByb2R1Y3RJZCk7XG4gICAgbG9nPy5pbmZvKCdHZXR0aW5nIHJlY29tbWVuZGVkIHByb2R1Y3QnKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByYXdSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgYCR7dXJsfS9wcm9kdWN0LyR7YWNjb3VudElkfS8ke2xvY2F0aW9uSWR9LyR7cHJvZHVjdElkfS5qc29uYFxuICAgICAgICApO1xuICAgICAgICBpZiAocmF3UmVzcG9uc2Uuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgICAgIGxvZz8uZXJyb3IoJ3Byb2R1Y3QgZmVlZCBzZXJ2aWNlIHJldHVybmVkIHdpdGggbm9uLTIwMCByZXNwb25zZScsIHJhd1Jlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBFcnJvcigncHJvZHVjdCBmZWVkIHNlcnZpY2UgcmV0dXJuZWQgd2l0aCBub24tMjAwIHJlc3BvbnNlJykpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJhd1Byb2R1Y3QgPSBhd2FpdCByYXdSZXNwb25zZS5qc29uKCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgbG9nPy5kZWJ1ZygncmVzcG9uc2UnLCByYXdQcm9kdWN0KTtcbiAgICAgICAgY29uc3QgcHJvZHVjdEluZm8gPSBtYXBSZXNwb25zZVRvUHJvZHVjdEluZm8obG9nLCByYXdQcm9kdWN0KTtcbiAgICAgICAgbG9nPy5kZWJ1ZygnbWFwcGVkJywgcHJvZHVjdEluZm8pO1xuICAgICAgICByZXR1cm4gT2socHJvZHVjdEluZm8pO1xuICAgIH0gY2F0Y2goZXJyKSB7XG4gICAgICAgIGxvZz8uZXJyb3IoZXJyKTtcbiAgICAgICAgcmV0dXJuIEVycihlcnIgYXMgRXJyb3IpO1xuICAgIH1cbn07XG5cbmNvbnN0IG1hcFJlc3BvbnNlVG9Qcm9kdWN0SW5mbyA9IChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PlxuKTogSVByb2R1Y3RJbmZvcm1hdGlvbiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ21hcFJlc3BvbnNlVG9Qcm9kdWN0SW5mbycpO1xuICAgIGxvZz8uZGVidWcoJ01hcHBpbmcgcHJvZHVjdCcpO1xuICAgIGNvbnN0IGdldEZpZWxkID0gZmllbGRPclVuZGVmLmJpbmQodW5kZWZpbmVkLCBkYXRhKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbWFnZTogZ2V0RmllbGQoJ2ltYWdlX2xpbmsnKSxcbiAgICAgICAgcHJpY2U6IGdldEZpZWxkKCdwcmljZScpLFxuICAgICAgICBzYWxlUHJpY2U6IGdldEZpZWxkKCdzYWxlX3ByaWNlJyksXG4gICAgICAgIHRoYzogZ2V0RmllbGQoJ3RoYycpLFxuICAgICAgICBjYmQ6IGdldEZpZWxkKCdjYmQnKSxcbiAgICAgICAgc3RyYWluOiBnZXRGaWVsZCgnc3RyYWluJyksXG4gICAgICAgIG5hbWU6IGdldEZpZWxkKCduYW1lJyksXG4gICAgICAgIGJyYW5kX25hbWU6IGdldEZpZWxkKCdicmFuZCcpLFxuICAgICAgICBicmFuZE5hbWU6IGdldEZpZWxkKCdicmFuZCcpLFxuICAgICAgICBwcm9kdWN0VHlwZTogZ2V0RmllbGQoJ3Byb2R1Y3RUeXBlJyksXG4gICAgICAgIGRldGFpbHM6IGdldEZpZWxkKCdkZXRhaWxzJyksXG4gICAgICAgIGN0YTogZ2V0RmllbGQoJ2N0YScpLFxuICAgICAgICBjbGlja3Rocm91Z2hVcmw6IGdldEZpZWxkKCdjbGlja3Rocm91Z2hVcmwnKSxcbiAgICAgICAgd2luVXJsOiBnZXRGaWVsZCgnd2luVXJsJyksXG4gICAgICAgIHBpeGVsVXJsOiBnZXRGaWVsZCgncGl4ZWxVcmwnKSxcbiAgICAgICAgZXh0OiBkYXRhXG4gICAgfTtcbn07XG5cbmNvbnN0IGZpZWxkT3JVbmRlZiA9IChkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZihmaWVsZCBpbiBkYXRhKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoZGF0YVtmaWVsZF0pO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IGNsYXNzIE5vTmF0aXZlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG5hdGl2ZUlkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoJ05hdGl2ZSBJRCBkaWQgbm90IGV4aXN0IGluIHByb2R1Y3QgZmVlZDogJyArIG5hdGl2ZUlkKTtcbiAgICB9XG59XG5cblxuLy9ibGlzc2FuZGxleC11ZXNcbi8vIGJsaXNzYW5kbGV4LXVlc1xuLy8gYmxpc3NhbmRsZXgtdWVzXG4vLyBibGlzc2FuZGxleC11ZXNcbi8vIGJsaXNzYW5kbGV4LXVlcyIsCiAgICAiaW1wb3J0IHR5cGUgeyBJUHJvZHVjdEluZm9ybWF0aW9uLCBJUmVjb21tZW5kZWRQcm9kdWN0LCBJUmVjb21tZW5kZXJSZXNwb25zZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDdHgsIHR5cGUgSUxvZ2dlciB9IGZyb20gJy4vTG9nZ2VyJztcbmltcG9ydCB0eXBlIHsgR2V0UmVjb21tZW5kZWRQcm9kdWN0RnJvbVByb2R1Y3RJZEZuIH0gZnJvbSAnLi9Qcm9kdWN0JztcbmltcG9ydCB7IEVyciwgT2ssIHR5cGUgQXN5bmNSZXN1bHQgfSBmcm9tICcuL1Jlc3VsdCc7XG5cbmV4cG9ydCB0eXBlIE5vblBlcnNvbmFsUmVjb21tZW5kZXJGbiA9ICgpID0+IEFzeW5jR2VuZXJhdG9yPElQcm9kdWN0SW5mb3JtYXRpb24+O1xuZXhwb3J0IHR5cGUgUGVyc29uYWxSZWNvbW1lbmRlckZuID0gKHVzZXJJZDogc3RyaW5nKSA9PiBBc3luY0dlbmVyYXRvcjxJUHJvZHVjdEluZm9ybWF0aW9uPjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICpHZW5lcmF0ZVRvcFByb2R1Y3RzKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBwcm9kdWN0RmVlZDogR2V0UmVjb21tZW5kZWRQcm9kdWN0RnJvbVByb2R1Y3RJZEZuLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZ1xuKTogQXN5bmNHZW5lcmF0b3I8SVByb2R1Y3RJbmZvcm1hdGlvbj4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdHZW5lcmF0ZVRvcFByb2R1Y3RzJykud2l0aChhY2NvdW50SWQpLndpdGgoc2l0ZUlkKS53aXRoKGxvY2F0aW9uSWQpO1xuICAgIGxvZz8uaW5mbygnR2VuZXJhdGluZyB0b3AgcHJvZHVjdHMnKTtcblxuICAgIHlpZWxkKiBnZW5lcmF0ZVByb2R1Y3RSZWNvbW1lbmRhdGlvbihcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICBwcm9kdWN0RmVlZCxcbiAgICAgICAgdXJsLFxuICAgICAgICBhY2NvdW50SWQsXG4gICAgICAgIHNpdGVJZCxcbiAgICAgICAgbG9jYXRpb25JZCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAndG9wLXByb2R1Y3RzJ1xuICAgICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiAqR2VuZXJhdGVGb3JZb3UoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHByb2R1Y3RGZWVkOiBHZXRSZWNvbW1lbmRlZFByb2R1Y3RGcm9tUHJvZHVjdElkRm4sXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYWNjb3VudElkOiBzdHJpbmcsXG4gICAgc2l0ZUlkOiBzdHJpbmcsXG4gICAgbG9jYXRpb25JZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nXG4pOiBBc3luY0dlbmVyYXRvcjxJUHJvZHVjdEluZm9ybWF0aW9uPiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0dlbmVyYXRlRm9yWW91Jykud2l0aChhY2NvdW50SWQpLndpdGgoc2l0ZUlkKS53aXRoKGxvY2F0aW9uSWQpLndpdGgodXNlcklkKTtcbiAgICBsb2c/LmluZm8oJ0dlbmVyYXRpbmcgZm9yIHlvdScpO1xuXG4gICAgeWllbGQqIGdlbmVyYXRlUHJvZHVjdFJlY29tbWVuZGF0aW9uKFxuICAgICAgICBsb2dnZXIsXG4gICAgICAgIHByb2R1Y3RGZWVkLFxuICAgICAgICB1cmwsXG4gICAgICAgIGFjY291bnRJZCxcbiAgICAgICAgc2l0ZUlkLFxuICAgICAgICBsb2NhdGlvbklkLFxuICAgICAgICB1c2VySWQsXG4gICAgICAgICdmb3IteW91J1xuICAgICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiAqR2VuZXJhdGVQcmV2aW91c1B1cmNoYXNlcyhcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgcHJvZHVjdEZlZWQ6IEdldFJlY29tbWVuZGVkUHJvZHVjdEZyb21Qcm9kdWN0SWRGbixcbiAgICB1cmw6IHN0cmluZyxcbiAgICBhY2NvdW50SWQ6IHN0cmluZyxcbiAgICBzaXRlSWQ6IHN0cmluZyxcbiAgICBsb2NhdGlvbklkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmdcbik6IEFzeW5jR2VuZXJhdG9yPElQcm9kdWN0SW5mb3JtYXRpb24+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKVxuICAgICAgICA/LndpdGgoJ0dlbmVyYXRlUHJldmlvdXNQdXJjaGFzZXMnKVxuICAgICAgICAud2l0aChhY2NvdW50SWQpXG4gICAgICAgIC53aXRoKHNpdGVJZClcbiAgICAgICAgLndpdGgobG9jYXRpb25JZClcbiAgICAgICAgLndpdGgodXNlcklkKTtcbiAgICBsb2c/LmluZm8oJ0dlbmVyYXRpbmcgcHJldmlvdXMgcHVyY2hhc2VzJyk7XG5cbiAgICB5aWVsZCogZ2VuZXJhdGVQcm9kdWN0UmVjb21tZW5kYXRpb24oXG4gICAgICAgIGxvZyxcbiAgICAgICAgcHJvZHVjdEZlZWQsXG4gICAgICAgIHVybCwgYWNjb3VudElkLFxuICAgICAgICBzaXRlSWQsXG4gICAgICAgIGxvY2F0aW9uSWQsXG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgJ2J1eS1hZ2FpbidcbiAgICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiAqZ2VuZXJhdGVQcm9kdWN0UmVjb21tZW5kYXRpb24gKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBwcm9kdWN0RmVlZDogR2V0UmVjb21tZW5kZWRQcm9kdWN0RnJvbVByb2R1Y3RJZEZuLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0eXBlOiBzdHJpbmdcbik6IEFzeW5jR2VuZXJhdG9yPElQcm9kdWN0SW5mb3JtYXRpb24+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZ2VuZXJhdHJlUHJvZHVjdFJlY29tbWVuZGF0aW9uJyk7XG4gICAgbG9nPy5kZWJ1ZygnR2VuZXJhdGluZyBwcm9kdWN0IHJlY29tbWVuZGF0aW9uJyk7XG4gICAgY29uc3QgcmVjb21tZW5kYXRpb25zID0gYXdhaXQgZmV0Y2hSZWNvbW1lbmRhdGlvbnMoXG4gICAgICAgIGxvZyxcbiAgICAgICAgdXJsLFxuICAgICAgICBhY2NvdW50SWQsXG4gICAgICAgIHNpdGVJZCxcbiAgICAgICAgbG9jYXRpb25JZCxcbiAgICAgICAgdXNlcklkLFxuICAgICAgICB0eXBlXG4gICAgKTtcbiAgICBpZighcmVjb21tZW5kYXRpb25zLm9rKSB7XG4gICAgICAgIGxvZz8uZXJyb3IocmVjb21tZW5kYXRpb25zLmVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkKiBnZW5lcmF0ZVByb2R1Y3QobG9nLCBwcm9kdWN0RmVlZCwgYWNjb3VudElkLCBsb2NhdGlvbklkLCByZWNvbW1lbmRhdGlvbnMudmFsdWUpO1xuICAgIGxvZz8uZGVidWcoJ291dCBvZiByZWNvbW1lbmRhdGlvbnMnKTtcbn1cblxuY29uc3QgZmV0Y2hSZWNvbW1lbmRhdGlvbnMgPSBhc3luYyAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0eXBlOiBzdHJpbmdcbik6IEFzeW5jUmVzdWx0PElSZWNvbW1lbmRlZFByb2R1Y3RbXT4gPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdmZXRjaFJlY29tbWVuZGF0aW9ucycpO1xuICAgIGxvZz8uZGVidWcoJ0ZldGNoaW5nIHJlY29tbWVuZGF0aW9ucycpO1xuXG4gICAgY29uc3Qga2V5ID0gYGFjY291bnRJZD0ke2FjY291bnRJZH0mc2l0ZUlkPSR7c2l0ZUlkfSZsb2NhdGlvbklkPSR7bG9jYXRpb25JZH0mdXNlcklkPSR7dXNlcklkID8/ICdudWxsJ31gO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBmZXRjaChgJHt1cmx9L3IvJHt0eXBlfT8ke2tleX0mbGltaXQ9MTAwYCk7XG4gICAgICAgIGlmKCFyZXN1bHRzLm9rKSB7XG4gICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgcmVjb21tZW5kYXRpb25zLiBTZXJ2aWNlIHJldHVybmVkICcgKyByZXN1bHRzLnN0YXR1cykpO1xuICAgICAgICB9XG4gICAgICAgIC8qIE9uIGVycm9yLCB0aGUgcmVzdWx0IHdpbGwgYmUgSVJlY29tbWVuZGVyUmVzcG9uc2UuXG4gICAgICAgICAqIE9uIHN1Y2Nlc3MsIGl0IHdpbGwganVzdCBiZSBhIHNldCBvZiByZWNvbW1lbmRlZCBwcm9kdWN0cyAqL1xuICAgICAgICBjb25zdCByZWNvbW1lbmRhdGlvbnMgPSBhd2FpdCByZXN1bHRzLmpzb24oKSBhcyAoSVJlY29tbWVuZGVyUmVzcG9uc2UgfCBJUmVjb21tZW5kZWRQcm9kdWN0W10pO1xuICAgICAgICBjb25zdCBlcnJvciA9IChyZWNvbW1lbmRhdGlvbnMgYXMgSVJlY29tbWVuZGVyUmVzcG9uc2UpLmVycm9yO1xuICAgICAgICBpZihlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBFcnJvcihlcnJvcikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE9rKHJlY29tbWVuZGF0aW9ucyBhcyBJUmVjb21tZW5kZWRQcm9kdWN0W10pO1xuICAgIH0gY2F0Y2goZXJyKSB7XG4gICAgICAgIHJldHVybiBFcnIoZXJyIGFzIEVycm9yKTtcbiAgICB9XG59O1xuXG5hc3luYyBmdW5jdGlvbiogZ2VuZXJhdGVQcm9kdWN0KFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBwcm9kdWN0RmVlZDogR2V0UmVjb21tZW5kZWRQcm9kdWN0RnJvbVByb2R1Y3RJZEZuLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICByZXN1bHRzOiBJUmVjb21tZW5kZWRQcm9kdWN0W11cbik6IEFzeW5jR2VuZXJhdG9yPElQcm9kdWN0SW5mb3JtYXRpb24+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZ2VuZXJhdGVQcm9kdWN0Jyk7XG4gICAgbG9nPy5kZWJ1ZygnZ2VuZXJhdGluZyBwcm9kdWN0IGluZm8nKTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiByZXN1bHRzKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1JZCA9IGl0ZW0uaXRlbV9pZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvZz8uZGVidWcoJ2l0ZW1JZCcsIGl0ZW1JZCk7XG4gICAgICAgICAgICBjb25zdCBwcm9kdWN0ID0gYXdhaXQgcHJvZHVjdEZlZWQoaXRlbUlkKTtcbiAgICAgICAgICAgIGxvZz8uZGVidWcoJ3Byb2R1Y3QnLCBpdGVtSWQsIHByb2R1Y3QpO1xuICAgICAgICAgICAgaWYgKHByb2R1Y3Qub2spIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBwcm9kdWN0LnZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2c/Lndhcm4oJ2l0ZW0gd2FzIG1pc3NpbmcgZnJvbSBwcm9kdWN0IGZlZWQnLCBpdGVtSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZz8ud2FybignY291bGRuXFwndCBnZXQgcHJvZHVjdCcsIGVycik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2c/LmluZm8oJ25vIG1vcmUgcHJvZHVjdHMuIEV4aXRpbmcnKTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgSUNvbXBpbGVkUHVibGlzaGVyQ29uZmlndXJhdGlvbiwgSU5hdGl2ZVRlbXBsYXRlRGVsZWdhdGVXaW5kb3csIElQcm9kdWN0SW5mb3JtYXRpb24gfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ3R4LCBJTG9nZ2VyIH0gZnJvbSAnLi9Mb2dnZXInO1xuaW1wb3J0IHsgRXJyLCBHZXRWYWx1ZU9yVGhyb3csIE9rLCBSZXN1bHQgfSBmcm9tICcuL1Jlc3VsdCc7XG5cbmV4cG9ydCB0eXBlIEV2YWx1YXRlUHJvZHVjdENhcmRUZW1wbGF0ZUZuID0gKFxuICAgIHByb2R1Y3Q6IElQcm9kdWN0SW5mb3JtYXRpb24sXG4gICAgY2xpY2t0aHJvdWdoPzogc3RyaW5nXG4pID0+IFJlc3VsdDxzdHJpbmc+O1xuXG5leHBvcnQgdHlwZSBFdmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlRm4gPSAoXG4gICAgcHJvZHVjdDogSVByb2R1Y3RJbmZvcm1hdGlvblxuKSA9PiBSZXN1bHQ8c3RyaW5nPjtcblxuZXhwb3J0IGNvbnN0IEV2YWx1YXRlSGFuZGxlYmFyc1Byb2R1Y3RDYXJkVGVtcGxhdGUgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHdpbmRvd0luZm86IElOYXRpdmVUZW1wbGF0ZURlbGVnYXRlV2luZG93LFxuICAgIHB1Ymxpc2hlcjogSUNvbXBpbGVkUHVibGlzaGVyQ29uZmlndXJhdGlvbixcbiAgICBwcm9kdWN0OiBJUHJvZHVjdEluZm9ybWF0aW9uLFxuICAgIGNsaWNrdGhyb3VnaD86IHN0cmluZ1xuKTogUmVzdWx0PHN0cmluZz4gPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdFdmFsdWF0ZUhhbmRsZWJhcnNQcm9kdWN0Q2FyZFRlbXBsYXRlJyk7XG4gICAgbG9nPy5pbmZvKCdFdmFsdWF0aW5nIGhhbmRsZWJhcnMgcHJvZHVjdCBjYXJkIHRlbXBsYXRlJywgcHJvZHVjdCk7XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZW5kZXJlZENsaWNrdGhyb3VnaCA9IGNsaWNrdGhyb3VnaCA/PyBHZXRWYWx1ZU9yVGhyb3coXG4gICAgICAgICAgICBFdmFsdWF0ZUhhbmRsZWJhcnNDbGlja3Rocm91Z2hUZW1wbGF0ZShsb2csXG4gICAgICAgICAgICAgICAgd2luZG93SW5mbyxcbiAgICAgICAgICAgICAgICBwdWJsaXNoZXIsXG4gICAgICAgICAgICAgICAgcHJvZHVjdFxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBsb2c/LmRlYnVnKCdHb3QgY2xpY2t0aHJvdWdoIFVSTCcsIHJlbmRlcmVkQ2xpY2t0aHJvdWdoKTtcblxuICAgICAgICByZXR1cm4gT2socHVibGlzaGVyLnRlbXBsYXRlcy5wcm9kdWN0Q2FyZFRlbXBsYXRlKHtcbiAgICAgICAgICAgIC4uLnByb2R1Y3QsXG4gICAgICAgICAgICBwcm9kdWN0LFxuICAgICAgICAgICAgd2luZG93OiB3aW5kb3dJbmZvLFxuICAgICAgICAgICAgcHVibGlzaGVyLFxuICAgICAgICAgICAgY2F0YWxvZzogcHJvZHVjdCxcbiAgICAgICAgICAgIGNsaWNrdGhyb3VnaDogcmVuZGVyZWRDbGlja3Rocm91Z2hcbiAgICAgICAgfSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBFcnIoZXJyb3IgYXMgRXJyb3IpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBFdmFsdWF0ZUhhbmRsZWJhcnNDbGlja3Rocm91Z2hUZW1wbGF0ZSA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgd2luZG93SW5mbzogSU5hdGl2ZVRlbXBsYXRlRGVsZWdhdGVXaW5kb3csXG4gICAgcHVibGlzaGVyOiBJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uLFxuICAgIHByb2R1Y3Q6IElQcm9kdWN0SW5mb3JtYXRpb25cbik6IFJlc3VsdDxzdHJpbmc+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnRXZhbHVhdGVIYW5kbGViYXJzQ2xpY2t0aHJvdWdoVGVtcGxhdGUnKTtcbiAgICBsb2c/LmluZm8oJ0V2YWx1YXRpbmcgaGFuZGxlYmFycyBjbGlja3Rocm91Z2ggVVJMIHRlbXBsYXRlJywgcHJvZHVjdCk7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIE9rKHB1Ymxpc2hlci50ZW1wbGF0ZXMuY2xpY2tUaHJvdWdoVXJsVGVtcGxhdGUoe1xuICAgICAgICAgICAgcHJvZHVjdCxcbiAgICAgICAgICAgIGNhdGFsb2c6IHByb2R1Y3QsXG4gICAgICAgICAgICB3aW5kb3c6IHdpbmRvd0luZm8sXG4gICAgICAgICAgICBwdWJsaXNoZXIsXG4gICAgICAgICAgICAuLi5wcm9kdWN0XG4gICAgICAgIH0pKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBFcnIoZXJyb3IgYXMgRXJyb3IpO1xuICAgIH1cbn07XG4iLAogICAgImltcG9ydCB7IElCdWlsdFJlc3BvbnNlLCBOYXRpdmVSZXF1ZXN0QnVpbGRlckZuLCBSZXF1ZXN0QnVpbGRlciwgUmVxdWVzdEJ1aWxkZXJGbiB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgSUJpZFJlcXVlc3QsIElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24sIElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb25EVE8sIElQdWJsaXNoZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG4gICAgRHluYW1pY0NyZWF0aXZlLFxuICAgIElEeW5hbWljQmFubmVyLFxuICAgIElEeW5hbWljVmlkZW8sXG4gICAgSUR5bmFtaWNab25lLFxuICAgIElTY3JlZW5TaXplXG59IGZyb20gJy4uL21vZGVscy9keW5hbWljL0R5bmFtaWNab25lJztcbmltcG9ydCB7IElTY3JlZW4gfSBmcm9tICcuL0RldmljZSc7XG5pbXBvcnQgeyBDdHgsIElMb2dnZXIgfSBmcm9tICcuL0xvZ2dlcic7XG5pbXBvcnQgeyBBc3luY1Jlc3VsdCwgRXJyLCBHZXRWYWx1ZSwgT2ssIFJlc3VsdCwgVHJ5RG8gfSBmcm9tICcuL1Jlc3VsdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUR5bmFtaWNab25lUmVxdWVzdCB7XG4gICAgcmVxdWVzdDogSUJpZFJlcXVlc3Q7XG4gICAgcmVxdWVzdElkczogUmVjb3JkPHN0cmluZywgRHluYW1pY0NyZWF0aXZlPjtcbn1cblxuZXhwb3J0IHR5cGUgQnVpbGREeW5hbWljWm9uZVJlcXVlc3RGbiA9ICh6b25lSWQ6IHN0cmluZywgZHluYW1pY1pvbmU6IElEeW5hbWljWm9uZSkgPT4gUmVzdWx0PElEeW5hbWljWm9uZVJlcXVlc3Q+O1xuZXhwb3J0IHR5cGUgR2V0RHluYW1pY1pvbmVGbiA9ICh6b25lSWQ6IHN0cmluZykgPT4gQXN5bmNSZXN1bHQ8SUR5bmFtaWNab25lPjtcblxuZXhwb3J0IGNvbnN0IEdldER5bmFtaWNab25lID0gYXN5bmMgKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBjb25maWc6IElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24sXG4gICAgem9uZUlkOiBzdHJpbmdcbikgPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdHZXREeW5hbWljWm9uZScpO1xuICAgIGxvZz8uaW5mbygnR2V0dGluZyBkeW5hbWljIHpvbmUnLCB6b25lSWQpO1xuXG4gICAgY29uc3QgZHluYW1pY1pvbmUgPSBjb25maWc/LmR5bmFtaWNab25lcz8uW3pvbmVJZF07XG4gICAgaWYoZHluYW1pY1pvbmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gRXJyKG5ldyBNaXNzaW5nRHluYW1pY1pvbmVFcnJvcih6b25lSWQpKTtcbiAgICB9XG4gICAgbG9nPy5kZWJ1ZygnRHluYW1pYyB6b25lJywgZHluYW1pY1pvbmUpO1xuICAgIHJldHVybiBPayhkeW5hbWljWm9uZSk7XG59O1xuXG5leHBvcnQgY29uc3QgQnVpbGREeW5hbWljWm9uZVJlcXVlc3QgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHN0YXJ0UmVxdWVzdDogUmVxdWVzdEJ1aWxkZXJGbixcbiAgICBuYXRpdmVSZXF1ZXN0OiBOYXRpdmVSZXF1ZXN0QnVpbGRlckZuLFxuICAgIHNjcmVlbkluZm86IElTY3JlZW4sXG4gICAgem9uZUlkOiBzdHJpbmcsXG4gICAgZHluYW1pY1pvbmU6IElEeW5hbWljWm9uZVxuKTogUmVzdWx0PElEeW5hbWljWm9uZVJlcXVlc3Q+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnQnVpbGREeW5hbWljWm9uZVJlcXVlc3QnKTtcbiAgICBsb2c/LmluZm8oJ0J1aWxkaW5nIGR5bmFtaWMgem9uZSByZXF1ZXN0JywgZHluYW1pY1pvbmUpO1xuXG4gICAgY29uc3Qgc2NyZWVuU2l6ZVJlcyA9IHNlbGVjdER5bmFtaWNTY3JlZW5TaXplKGxvZywgc2NyZWVuSW5mbywgZHluYW1pY1pvbmUpO1xuICAgIGlmKCFzY3JlZW5TaXplUmVzLm9rKSB7XG4gICAgICAgIHJldHVybiBzY3JlZW5TaXplUmVzO1xuICAgIH1cblxuICAgIHJldHVybiBidWlsZER5bmFtaWNCaWRSZXF1ZXN0RnJvbVNlbGVjdGVkU2NyZWVuU2l6ZShsb2csXG4gICAgICAgIHN0YXJ0UmVxdWVzdCxcbiAgICAgICAgbmF0aXZlUmVxdWVzdCxcbiAgICAgICAgem9uZUlkLFxuICAgICAgICBzY3JlZW5TaXplUmVzLnZhbHVlXG4gICAgKTtcbn07XG5cbmNvbnN0IHNlbGVjdER5bmFtaWNTY3JlZW5TaXplID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBzY3JlZW5JbmZvOiBJU2NyZWVuLFxuICAgIGR5bmFtaWNab25lOiBJRHluYW1pY1pvbmVcbik6IFJlc3VsdDxJU2NyZWVuU2l6ZT4gPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdzZWxlY3REeW5hbWljU2NyZWVuU2l6ZScpO1xuICAgIGxvZz8uaW5mbygnR2V0dGluZyBzY3JlZW4gc2l6ZSBmb3IgZHluYW1pYyB6b25lJywgc2NyZWVuSW5mbyk7XG4gICAgY29uc3Qgc2NyZWVuU2l6ZSA9IEdldFZhbHVlKFRyeURvKCgpID0+IHtcbiAgICAgICAgaWYoc2NyZWVuSW5mby53aWR0aCA8IDc2OCkge1xuICAgICAgICAgICAgcmV0dXJuICdtb2JpbGUnO1xuICAgICAgICB9IGVsc2UgaWYoc2NyZWVuSW5mby53aWR0aCA8IDEwMjQpIHtcbiAgICAgICAgICAgIHJldHVybiAndGFibGV0JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnZGVza3RvcCc7XG4gICAgICAgIH1cbiAgICB9KSkgPz8gJ2RlZmF1bHQnO1xuICAgIGNvbnN0IHNlbGVjdGVkRHluYW1pYyA9IGR5bmFtaWNab25lLnZhbHVlXG4gICAgICAgIC5maWx0ZXIoc2NyZWVuID0+IHNjcmVlbi5zaXplID09PSBzY3JlZW5TaXplKVxuICAgICAgICA/LlswXVxuICAgID8/IGR5bmFtaWNab25lLnZhbHVlXG4gICAgICAgIC5maWx0ZXIoc2NyZWVuID0+IHNjcmVlbi5zaXplID09PSAnZGVmYXVsdCcpXG4gICAgICAgID8uWzBdO1xuXG4gICAgaWYoc2VsZWN0ZWREeW5hbWljID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIEVycihuZXcgTm9EeW5hbWljU2NyZWVuU2l6ZU1hdGNoRXJyb3IoXG4gICAgICAgICAgICBkeW5hbWljWm9uZSxcbiAgICAgICAgICAgIHNjcmVlbkluZm8sXG4gICAgICAgICAgICBzY3JlZW5TaXplXG4gICAgICAgICkpO1xuICAgIH1cblxuICAgIGxvZz8uZGVidWcoJ3NlbGVjdGVkRHluYW1pYycsIHNlbGVjdGVkRHluYW1pYylcbiAgICByZXR1cm4gT2soc2VsZWN0ZWREeW5hbWljKTtcbn07XG5cbmV4cG9ydCBjbGFzcyBOb0R5bmFtaWNTY3JlZW5TaXplTWF0Y2hFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGR5bmFtaWNab25lOiBJRHluYW1pY1pvbmUsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBzY3JlZW5JbmZvOiBJU2NyZWVuLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0ZWRTdHJpbmdTaXplOiBzdHJpbmdcbiAgICApIHtcbiAgICAgICAgc3VwZXIoJ05vIGR5bmFtaWMgc2NyZWVuIHNpemUgbWF0Y2hlZCB0aGUgd2luZG93IHdpZHRoJyk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkRHluYW1pY0JpZFJlcXVlc3RGcm9tU2VsZWN0ZWRTY3JlZW5TaXplID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBzdGFydFJlcXVlc3Q6IFJlcXVlc3RCdWlsZGVyRm4sXG4gICAgbmF0aXZlUmVxdWVzdDogTmF0aXZlUmVxdWVzdEJ1aWxkZXJGbixcbiAgICB6b25lSWQ6IHN0cmluZyxcbiAgICBzY3JlZW5TaXplOiBJU2NyZWVuU2l6ZVxuKTogUmVzdWx0PElEeW5hbWljWm9uZVJlcXVlc3Q+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnYnVpbGREeW5hbWljQmlkUmVxdWVzdEZyb21TZWxlY3RlZFNjcmVlblNpemUnKTtcbiAgICBsb2c/LmluZm8oJ0J1aWxkaW5nIGR5bmFtaWMgYmlkIHJlcXVlc3QnLCB6b25lSWQsIHNjcmVlblNpemUpO1xuICAgIGNvbnN0IHJlcXVlc3RQYXlsb2FkID0gYnVpbGREeW5hbWljQmlkUmVxdWVzdFJlY3Vyc2l2ZShsb2csXG4gICAgICAgIG5hdGl2ZVJlcXVlc3QsXG4gICAgICAgIHN0YXJ0UmVxdWVzdCh6b25lSWQpLFxuICAgICAgICB7fSxcbiAgICAgICAgc2NyZWVuU2l6ZS52YWx1ZXNcbiAgICApO1xuXG4gICAgaWYoIXJlcXVlc3RQYXlsb2FkLm9rKSB7XG4gICAgICAgIHJldHVybiByZXF1ZXN0UGF5bG9hZDtcbiAgICB9XG4gICAgbG9nPy5kZWJ1ZygncmVxdWVzdFBheWxvYWQnLCByZXF1ZXN0UGF5bG9hZCk7XG5cbiAgICBjb25zdCBbYnVpbGRlciwgcmVxdWVzdElkc10gPSByZXF1ZXN0UGF5bG9hZC52YWx1ZTtcbiAgICByZXR1cm4gT2soe1xuICAgICAgICByZXF1ZXN0OiBidWlsZGVyLmJ1aWxkKCksXG4gICAgICAgIHJlcXVlc3RJZHNcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBidWlsZER5bmFtaWNCaWRSZXF1ZXN0UmVjdXJzaXZlID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBuYXRpdmVSZXF1ZXN0OiBOYXRpdmVSZXF1ZXN0QnVpbGRlckZuLFxuICAgIGJ1aWxkZXI6IFJlcXVlc3RCdWlsZGVyLFxuICAgIHJlcXVlc3RJZHM6IFJlY29yZDxzdHJpbmcsIER5bmFtaWNDcmVhdGl2ZT4sXG4gICAgW2hlYWQsIC4uLnRhaWxdOiBEeW5hbWljQ3JlYXRpdmVbXVxuKTogUmVzdWx0PFtidWlsZGVyOiBSZXF1ZXN0QnVpbGRlciwgcmVxdWVzdElkczogUmVjb3JkPHN0cmluZywgRHluYW1pY0NyZWF0aXZlPl0+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKTtcbiAgICBsb2c/LmluZm8oJ2Rlc2NlbmRpbmcuLi4nKTtcbiAgICBpZihoZWFkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTm90IGFuIGVycm9yIC0gd2UgYXJlIGRvbmVcbiAgICAgICAgbG9nPy5pbmZvKCdGaW5pc2hlZCcpO1xuICAgICAgICByZXR1cm4gT2soW2J1aWxkZXIsIHJlcXVlc3RJZHNdKTtcbiAgICB9XG4gICAgaWYoaGVhZC50eXBlID09PSAnQmFubmVyJykge1xuICAgICAgICBsb2c/LmluZm8oJ0FkZGluZyBiYW5uZXIgdG8gcmVxdWVzdCcpO1xuICAgICAgICBjb25zdCBiYW5uZXIgPSBoZWFkIGFzIElEeW5hbWljQmFubmVyO1xuICAgICAgICBjb25zdCBpZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgICAgIHJldHVybiBidWlsZER5bmFtaWNCaWRSZXF1ZXN0UmVjdXJzaXZlKGxvZyxcbiAgICAgICAgICAgIG5hdGl2ZVJlcXVlc3QsXG4gICAgICAgICAgICBidWlsZGVyLndpdGhCYW5uZXIoYmFubmVyLndpZHRoLCBiYW5uZXIuaGVpZ2h0LCB1bmRlZmluZWQsIHsgaWQgfSksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ucmVxdWVzdElkcyxcbiAgICAgICAgICAgICAgICBbaWRdOiBoZWFkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGFpbFxuICAgICAgICApO1xuICAgIH0gZWxzZSBpZihoZWFkLnR5cGUgPT09ICdWaWRlbycpIHtcbiAgICAgICAgbG9nPy5pbmZvKCdBZGRpbmcgdmlkZW8gdG8gcmVxdWVzdCcpO1xuICAgICAgICBjb25zdCB2aWRlbyA9IGhlYWQgYXMgSUR5bmFtaWNWaWRlbztcbiAgICAgICAgY29uc3QgaWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgICByZXR1cm4gYnVpbGREeW5hbWljQmlkUmVxdWVzdFJlY3Vyc2l2ZShsb2csXG4gICAgICAgICAgICBuYXRpdmVSZXF1ZXN0LFxuICAgICAgICAgICAgYnVpbGRlci53aXRoVmlkZW8oXG4gICAgICAgICAgICAgICAgdmlkZW8ud2lkdGgsXG4gICAgICAgICAgICAgICAgdmlkZW8uaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHZpZGVvLm1pbkR1cmF0aW9uID8/IDAsXG4gICAgICAgICAgICAgICAgdmlkZW8ubWF4RHVyYXRpb24sXG4gICAgICAgICAgICAgICAgWyd2aWRlby9tcDQnLCAndmlkZW8vd2VibSddLFxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB7IGlkIH1cbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ucmVxdWVzdElkcyxcbiAgICAgICAgICAgICAgICBbaWRdOiBoZWFkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGFpbFxuICAgICAgICApO1xuICAgIH0gZWxzZSBpZihoZWFkLnR5cGUgPT09ICdDYXJvdXNlbCcgfHwgaGVhZC50eXBlID09PSAnUHJvZHVjdENhcmQnKSB7XG4gICAgICAgIGxvZz8uaW5mbygnQWRkaW5nIGNhcm91c2VsIHRvIHJlcXVlc3QnKTtcbiAgICAgICAgY29uc3QgaWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICAgICAgICByZXR1cm4gYnVpbGREeW5hbWljQmlkUmVxdWVzdFJlY3Vyc2l2ZShsb2csXG4gICAgICAgICAgICBuYXRpdmVSZXF1ZXN0LFxuICAgICAgICAgICAgYnVpbGRlci53aXRoTmF0aXZlKFxuICAgICAgICAgICAgICAgIG5hdGl2ZVJlcXVlc3QoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aE1ldGFQcm9kdWN0KClcbiAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCksXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHsgaWQgfVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5yZXF1ZXN0SWRzLFxuICAgICAgICAgICAgICAgIFtpZF06IGhlYWRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWlsXG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9nPy53YXJuKCdJbnZhbGlkIGNyZWF0aXZlIHR5cGUuIFNraXBwaW5nLicsIGhlYWQpO1xuICAgICAgICByZXR1cm4gYnVpbGREeW5hbWljQmlkUmVxdWVzdFJlY3Vyc2l2ZShsb2csXG4gICAgICAgICAgICBuYXRpdmVSZXF1ZXN0LFxuICAgICAgICAgICAgYnVpbGRlcixcbiAgICAgICAgICAgIHJlcXVlc3RJZHMsXG4gICAgICAgICAgICB0YWlsXG4gICAgICAgICk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdEeW5hbWljWm9uZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB6b25lSWQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcignTWlzc2luZyBkeW5hbWljIHpvbmUgJyArIHpvbmVJZCk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQge1xuICAgIENvbnRleHRTdWJUeXBlcyxcbiAgICBDb250ZXh0VHlwZXMsXG4gICAgRXZlbnRUcmFja2luZ01ldGhvZHMsXG4gICAgRXZlbnRUeXBlcyxcbiAgICB0eXBlIElBc3NldE9iamVjdCxcbiAgICB0eXBlIElFdmVudFRyYWNrZXJSZXF1ZXN0T2JqZWN0LFxuICAgIHR5cGUgSU5hdGl2ZVJlcXVlc3QsXG4gICAgTmF0aXZlQXNzZXRJZCxcbiAgICBOYXRpdmVEYXRhVHlwZXMsXG4gICAgUGxhY2VtZW50VHlwZXMsXG59IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDdHgsIElMb2dnZXIgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5cbmNvbnN0IERFRkFVTFRfTEVOR1RIID0gODA7XG5jb25zdCBWQVNUXzNfMCA9IDM7XG5cbmV4cG9ydCB0eXBlIE5hdGl2ZVJlcXVlc3RCdWlsZGVyRm4gPSAoKSA9PiBOYXRpdmVSZXF1ZXN0QnVpbGRlcjtcblxuZXhwb3J0IHR5cGUgTmF0aXZlUmVxdWVzdEJ1aWxkZXIgPSB7XG4gICAgd2l0aFZlcjogKHZlcjogc3RyaW5nKSA9PiBOYXRpdmVSZXF1ZXN0QnVpbGRlcixcbiAgICB3aXRoQ29udGV4dDogKGNvbnRleHQ6IG51bWJlcikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aENvbnRleHRTdWJUeXBlOiAoY29udGV4dFN1YlR5cGU6IG51bWJlcikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aFBsYWNlbWVudFR5cGU6IChwbGFjZW1lbnRUeXBlOiBudW1iZXIpID0+IE5hdGl2ZVJlcXVlc3RCdWlsZGVyLFxuICAgIHdpdGhUaXRsZTogKGxlbmd0aD86IG51bWJlciwgcmVxdWlyZWQ/OiBib29sZWFuKSA9PiBOYXRpdmVSZXF1ZXN0QnVpbGRlcixcbiAgICB3aXRoSW1hZ2U6ICh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgbWluV2lkdGg/OiBudW1iZXIsIG1pbkhlaWdodD86IG51bWJlciwgcmVxdWlyZWQ/OiBib29sZWFuKVxuICAgICAgICA9PiBOYXRpdmVSZXF1ZXN0QnVpbGRlcixcbiAgICB3aXRoVmlkZW86IChtaW1lczogbnVtYmVyW10gfCBzdHJpbmdbXSwgbWluRHVyYXRpb246IG51bWJlciwgbWF4RHVyYXRpb246IG51bWJlciwgcmVxdWlyZWQ/OiBib29sZWFuKVxuICAgICAgICA9PiBOYXRpdmVSZXF1ZXN0QnVpbGRlcixcbiAgICB3aXRoRGF0YTogKHR5cGU6IG51bWJlciwgaWQ6IG51bWJlciwgbGVuZ3RoPzogbnVtYmVyLCByZXF1aXJlZD86IGJvb2xlYW4pID0+IE5hdGl2ZVJlcXVlc3RCdWlsZGVyLFxuICAgIHdpdGhTcG9uc29yZWQ6IChsZW5ndGg/OiBudW1iZXIsIHJlcXVpcmVkPzogYm9vbGVhbikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aERlc2NyaXB0aW9uOiAobGVuZ3RoPzogbnVtYmVyLCByZXF1aXJlZD86IGJvb2xlYW4pID0+IE5hdGl2ZVJlcXVlc3RCdWlsZGVyLFxuICAgIHdpdGhSYXRpbmc6IChsZW5ndGg/OiBudW1iZXIsIHJlcXVpcmVkPzogYm9vbGVhbikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aFByaWNlOiAobGVuZ3RoPzogbnVtYmVyLCByZXF1aXJlZD86IGJvb2xlYW4pID0+IE5hdGl2ZVJlcXVlc3RCdWlsZGVyLFxuICAgIHdpdGhTYWxlUHJpY2U6IChsZW5ndGg/OiBudW1iZXIsIHJlcXVpcmVkPzogYm9vbGVhbikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aERpc3BsYXlVUkw6IChsZW5ndGg/OiBudW1iZXIsIHJlcXVpcmVkPzogYm9vbGVhbikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aENUQVRleHQ6IChsZW5ndGg/OiBudW1iZXIsIHJlcXVpcmVkPzogYm9vbGVhbikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aENhdGVnb3J5OiAobGVuZ3RoPzogbnVtYmVyLCByZXF1aXJlZD86IGJvb2xlYW4pID0+IE5hdGl2ZVJlcXVlc3RCdWlsZGVyLFxuICAgIHdpdGhUSEM6IChsZW5ndGg/OiBudW1iZXIsIHJlcXVpcmVkPzogYm9vbGVhbikgPT4gTmF0aXZlUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aENCRDogKGxlbmd0aD86IG51bWJlciwgcmVxdWlyZWQ/OiBib29sZWFuKSA9PiBOYXRpdmVSZXF1ZXN0QnVpbGRlcixcbiAgICB3aXRoU3RyYWluOiAobGVuZ3RoPzogbnVtYmVyLCByZXF1aXJlZD86IGJvb2xlYW4pID0+IE5hdGl2ZVJlcXVlc3RCdWlsZGVyLFxuICAgIHdpdGhNZXRhUHJvZHVjdDogKGxlbmd0aD86IG51bWJlciwgcmVxdWlyZWQ/OiBib29sZWFuKSA9PiBOYXRpdmVSZXF1ZXN0QnVpbGRlcixcbiAgICB3aXRoRXZlbnRUcmFja2VyOiAoZXZlbnQ6IG51bWJlciwgbWV0aG9kczogbnVtYmVyW10pID0+IE5hdGl2ZVJlcXVlc3RCdWlsZGVyLFxuICAgIGJ1aWxkOiAoKSA9PiBJTmF0aXZlUmVxdWVzdFxufTtcblxuaW50ZXJmYWNlIElOYXRpdmVSZXF1ZXN0QnVpbGRlclN0YXRlIHtcbiAgICByZWFkb25seSB2ZXI/OiBzdHJpbmcsXG4gICAgcmVhZG9ubHkgY29udGV4dD86IG51bWJlcixcbiAgICByZWFkb25seSBwbGFjZW1lbnRUeXBlPzogbnVtYmVyLFxuICAgIHJlYWRvbmx5IGNvbnRleHRTdWJUeXBlPzogbnVtYmVyLFxuICAgIHJlYWRvbmx5IGFzc2V0czogSUFzc2V0T2JqZWN0W10sXG4gICAgcmVhZG9ubHkgZXZlbnRUcmFja2VyczogSUV2ZW50VHJhY2tlclJlcXVlc3RPYmplY3RbXVxufTtcblxuY29uc3QgYnVpbGRlcldpdGhWZXIgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHN0YXRlOiBJTmF0aXZlUmVxdWVzdEJ1aWxkZXJTdGF0ZSxcbiAgICB2ZXI6IHN0cmluZ1xuKSA9PiB7XG4gICAgbG9nZ2VyPy5kZWJ1ZygnQWRkaW5nIHZlcnNpb24gdG8gbmF0aXZlIHJlcXVlc3QnLCB2ZXIpO1xuICAgIHJldHVybiBib3RzQnVpbGRCb3RzKGxvZ2dlciwgey4uLnN0YXRlLCB2ZXIgfSk7XG59O1xuXG5jb25zdCBidWlsZGVyV2l0aENvbnRleHQgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHN0YXRlOiBJTmF0aXZlUmVxdWVzdEJ1aWxkZXJTdGF0ZSxcbiAgICBjb250ZXh0OiBudW1iZXJcbikgPT4ge1xuICAgIGxvZ2dlcj8uZGVidWcoJ0FkZGluZyBjb250ZXh0IHRvIG5hdGl2ZSByZXF1ZXN0JywgY29udGV4dCk7XG4gICAgcmV0dXJuIGJvdHNCdWlsZEJvdHMobG9nZ2VyLCB7IC4uLnN0YXRlLCBjb250ZXh0IH0pO1xufTtcblxuY29uc3QgYnVpbGRlcldpdGhDb250ZXh0U3ViVHlwZSA9IChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IElOYXRpdmVSZXF1ZXN0QnVpbGRlclN0YXRlLFxuICAgIGNvbnRleHRTdWJUeXBlOiBudW1iZXJcbikgPT4ge1xuICAgIGxvZ2dlcj8uZGVidWcoJ0FkZGluZyBjb250ZXh0IHN1YnR5cGUgdG8gbmF0aXZlIHJlcXVlc3QnLCBjb250ZXh0U3ViVHlwZSk7XG4gICAgcmV0dXJuIGJvdHNCdWlsZEJvdHMobG9nZ2VyLCB7IC4uLnN0YXRlLCBjb250ZXh0U3ViVHlwZSB9KTtcbn07XG5cbmNvbnN0IGJ1aWxkZXJXaXRoUGxhY2VtZW50VHlwZSA9IChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IElOYXRpdmVSZXF1ZXN0QnVpbGRlclN0YXRlLFxuICAgIHBsYWNlbWVudFR5cGU6IG51bWJlclxuKSA9PiB7XG4gICAgbG9nZ2VyPy5kZWJ1ZygnQWRkaW5nIHBsYWNlbWVudCB0eXBlIHRvIG5hdGl2ZSByZXF1ZXN0JywgcGxhY2VtZW50VHlwZSk7XG4gICAgcmV0dXJuIGJvdHNCdWlsZEJvdHMobG9nZ2VyLCB7IC4uLnN0YXRlLCBwbGFjZW1lbnRUeXBlIH0pO1xufTtcblxuY29uc3QgYnVpbGRlcldpdGhUaXRsZSA9IChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IElOYXRpdmVSZXF1ZXN0QnVpbGRlclN0YXRlLFxuICAgIGxlbmd0aDogbnVtYmVyID0gREVGQVVMVF9MRU5HVEgsXG4gICAgcmVxdWlyZWQ6IGJvb2xlYW4gPSB0cnVlXG4pID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdBZGRpbmcgdGl0bGUgdG8gbmF0aXZlIHJlcXVlc3QnLCBsZW5ndGgsIHJlcXVpcmVkKTtcbiAgICByZXR1cm4gYm90c0J1aWxkQm90cyhsb2dnZXIsXG4gICAgICAgIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgYXNzZXRzOiBbXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuYXNzZXRzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IE5hdGl2ZUFzc2V0SWQuVGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiByZXF1aXJlZCA/IDEgOiAwLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuOiBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSk7XG59O1xuXG5jb25zdCBidWlsZGVyV2l0aEltYWdlID0gKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBzdGF0ZTogSU5hdGl2ZVJlcXVlc3RCdWlsZGVyU3RhdGUsXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBtaW5XaWR0aD86IG51bWJlcixcbiAgICBtaW5IZWlnaHQ/OiBudW1iZXIsXG4gICAgcmVxdWlyZWQ6IGJvb2xlYW4gPSB0cnVlXG4pID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdBZGRpbmcgaW1hZ2UgdG8gbmF0aXZlIHJlcXVlc3QnLCB3aWR0aCwgaGVpZ2h0LCBtaW5XaWR0aCwgbWluSGVpZ2h0LCByZXF1aXJlZCk7XG4gICAgcmV0dXJuIGJvdHNCdWlsZEJvdHMobG9nZ2VyLFxuICAgICAgICB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGFzc2V0czogW1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLmFzc2V0cyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBOYXRpdmVBc3NldElkLkltYWdlLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogcmVxdWlyZWQgPyAxIDogMCxcbiAgICAgICAgICAgICAgICAgICAgaW1nOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3OiB3aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGg6IGhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdtaW46IG1pbldpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaG1pbjogbWluSGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xufTtcblxuY29uc3QgYnVpbGRlcldpdGhWaWRlbyA9IChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IElOYXRpdmVSZXF1ZXN0QnVpbGRlclN0YXRlLFxuICAgIG1pbWVzOiBudW1iZXJbXSB8IHN0cmluZ1tdLFxuICAgIG1pbkR1cmF0aW9uOiBudW1iZXIsXG4gICAgbWF4RHVyYXRpb246IG51bWJlcixcbiAgICByZXF1aXJlZDogYm9vbGVhbiA9IHRydWVcbikgPT4ge1xuICAgIGxvZ2dlcj8uZGVidWcoJ0FkZGluZyB2aWRlbyB0byBuYXRpdmUgcmVxdWVzdCcsIG1pbWVzLCBtaW5EdXJhdGlvbiwgbWF4RHVyYXRpb24sIHJlcXVpcmVkKTtcbiAgICByZXR1cm4gYm90c0J1aWxkQm90cyhcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGFzc2V0czogW1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLmFzc2V0cyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBOYXRpdmVBc3NldElkLlZpZGVvLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogcmVxdWlyZWQgPyAxIDogMCxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluZHVyYXRpb246IG1pbkR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb246IG1heER1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xzOiBbVkFTVF8zXzBdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xufTtcblxuY29uc3QgYnVpbGRlcldpdGhEYXRhID0gKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBzdGF0ZTogSU5hdGl2ZVJlcXVlc3RCdWlsZGVyU3RhdGUsXG4gICAgdHlwZTogbnVtYmVyLFxuICAgIGlkOiBudW1iZXIsXG4gICAgbGVuZ3RoOiBudW1iZXIgPSBERUZBVUxUX0xFTkdUSCxcbiAgICByZXF1aXJlZDogYm9vbGVhbiA9IHRydWVcbikgPT4ge1xuICAgIGxvZ2dlcj8uZGVidWcoJ0FkZGluZyBkYXRhIHRvIHJlcXVlc3QnLCB0eXBlLCBpZCwgbGVuZ3RoLCByZXF1aXJlZCk7XG4gICAgcmV0dXJuIGJvdHNCdWlsZEJvdHMoXG4gICAgICAgIGxvZ2dlcixcbiAgICAgICAge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBhc3NldHM6IFtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5hc3NldHMsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHJlcXVpcmVkID8gMSA6IDAsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZW46IGxlbmd0aFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcbn07XG5cbmNvbnN0IHBhc3NUb0RhdGEgPSAodHlwZTogbnVtYmVyLCBpZDogbnVtYmVyKSA9PlxuICAgIChcbiAgICAgICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgICAgICBzdGF0ZTogSU5hdGl2ZVJlcXVlc3RCdWlsZGVyU3RhdGUsXG4gICAgICAgIGxlbmd0aDogbnVtYmVyID0gREVGQVVMVF9MRU5HVEgsXG4gICAgICAgIHJlcXVpcmVkOiBib29sZWFuID0gdHJ1ZVxuICAgICkgPT5cbiAgICAgICAgYnVpbGRlcldpdGhEYXRhKGxvZ2dlciwgc3RhdGUsIHR5cGUsIGlkLCBsZW5ndGgsIHJlcXVpcmVkKTtcblxuY29uc3QgYnVpbGRlcldpdGhTcG9uc29yZWQgPSBwYXNzVG9EYXRhKE5hdGl2ZURhdGFUeXBlcy5TcG9uc29yZWQsIE5hdGl2ZUFzc2V0SWQuU3BvbnNvcmVkKTtcblxuY29uc3QgYnVpbGRlcldpdGhEZXNjcmlwdGlvbiA9IHBhc3NUb0RhdGEoTmF0aXZlRGF0YVR5cGVzLkRlc2MsIE5hdGl2ZUFzc2V0SWQuRGVzYyk7XG5cbmNvbnN0IGJ1aWxkZXJXaXRoUmF0aW5nID0gcGFzc1RvRGF0YShOYXRpdmVEYXRhVHlwZXMuUmF0aW5nLCBOYXRpdmVBc3NldElkLlJhdGluZyk7XG5cbmNvbnN0IGJ1aWxkZXJXaXRoUHJpY2UgPSBwYXNzVG9EYXRhKE5hdGl2ZURhdGFUeXBlcy5QcmljZSwgTmF0aXZlQXNzZXRJZC5QcmljZSk7XG5cbmNvbnN0IGJ1aWxkZXJXaXRoU2FsZVByaWNlID0gcGFzc1RvRGF0YShOYXRpdmVEYXRhVHlwZXMuU2FsZVByaWNlLCBOYXRpdmVBc3NldElkLlNhbGVQcmljZSk7XG5cbmNvbnN0IGJ1aWxkZXJXaXRoRGlzcGxheVVSTCA9IHBhc3NUb0RhdGEoTmF0aXZlRGF0YVR5cGVzLkRpc3BsYXlVUkwsIE5hdGl2ZUFzc2V0SWQuRGlzcGxheVVSTCk7XG5cbmNvbnN0IGJ1aWxkZXJXaXRoQ1RBVGV4dCA9IHBhc3NUb0RhdGEoTmF0aXZlRGF0YVR5cGVzLkNUQVRleHQsIE5hdGl2ZUFzc2V0SWQuQ1RBVGV4dCk7XG5cbmNvbnN0IGJ1aWxkZXJXaXRoQ2F0ZWdvcnkgPSBwYXNzVG9EYXRhKE5hdGl2ZURhdGFUeXBlcy5TdXJmQ2F0ZWdvcnksIE5hdGl2ZUFzc2V0SWQuU3VyZkNhdGVnb3J5KTtcblxuY29uc3QgYnVpbGRlcldpdGhUSEMgPSBwYXNzVG9EYXRhKE5hdGl2ZURhdGFUeXBlcy5TdXJmVEhDLCBOYXRpdmVBc3NldElkLlN1cmZUSEMpO1xuXG5jb25zdCBidWlsZGVyV2l0aENCRCA9IHBhc3NUb0RhdGEoTmF0aXZlRGF0YVR5cGVzLlN1cmZDQkQsIE5hdGl2ZUFzc2V0SWQuU3VyZkNCRCk7XG5cbmNvbnN0IGJ1aWxkZXJXaXRoU3RyYWluID0gcGFzc1RvRGF0YShOYXRpdmVEYXRhVHlwZXMuU3VyZlN0cmFpbiwgTmF0aXZlQXNzZXRJZC5TdXJmU3RyYWluKTtcblxuY29uc3QgYnVpbGRlcldpdGhNZXRhUHJvZHVjdCA9IHBhc3NUb0RhdGEoTmF0aXZlRGF0YVR5cGVzLlN1cmZNZXRhUHJvZHVjdCwgTmF0aXZlQXNzZXRJZC5TdXJmTWV0YUJyYW5kKTtcblxuY29uc3QgYnVpbGRlcldpdGhFdmVudFRyYWNrZXIgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHN0YXRlOiBJTmF0aXZlUmVxdWVzdEJ1aWxkZXJTdGF0ZSxcbiAgICBldmVudDogbnVtYmVyLFxuICAgIG1ldGhvZHM6IG51bWJlcltdXG4pID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdBZGRpbmcgZXZlbnQgdHJhY2tlciB0byBiaWcgcmVxdWVzdCcpO1xuICAgIHJldHVybiBib3RzQnVpbGRCb3RzKGxvZ2dlcixcbiAgICAgICAge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBldmVudFRyYWNrZXJzOiBbXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuZXZlbnRUcmFja2VycyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICBtZXRob2RzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcbn07XG5cbmNvbnN0IGJ1aWxkZXJCdWlsZCA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsIHN0YXRlOiBJTmF0aXZlUmVxdWVzdEJ1aWxkZXJTdGF0ZSk6IElOYXRpdmVSZXF1ZXN0ID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdCdWlsZGluZyBiaWQgcmVxdWVzdCcsIHN0YXRlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2ZXI6IHN0YXRlLnZlcixcbiAgICAgICAgY29udGV4dDogc3RhdGUuY29udGV4dCxcbiAgICAgICAgY29udGV4dHN1YnR5cGU6IHN0YXRlLmNvbnRleHRTdWJUeXBlLFxuICAgICAgICBhc3NldHM6IHN0YXRlLmFzc2V0cyxcbiAgICAgICAgZXZlbnR0cmFja2Vyczogc3RhdGUuZXZlbnRUcmFja2Vyc1xuICAgIH07XG59O1xuXG5jb25zdCBib3RzQnVpbGRCb3RzID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCwgc3RhdGU6IElOYXRpdmVSZXF1ZXN0QnVpbGRlclN0YXRlKTogTmF0aXZlUmVxdWVzdEJ1aWxkZXIgPT4gKHtcbiAgICB3aXRoVmVyOiBidWlsZGVyV2l0aFZlci5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aENvbnRleHQ6IGJ1aWxkZXJXaXRoQ29udGV4dC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aENvbnRleHRTdWJUeXBlOiBidWlsZGVyV2l0aENvbnRleHRTdWJUeXBlLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoUGxhY2VtZW50VHlwZTogYnVpbGRlcldpdGhQbGFjZW1lbnRUeXBlLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoVGl0bGU6IGJ1aWxkZXJXaXRoVGl0bGUuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpLFxuICAgIHdpdGhJbWFnZTogYnVpbGRlcldpdGhJbWFnZS5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aFZpZGVvOiBidWlsZGVyV2l0aFZpZGVvLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoRGF0YTogYnVpbGRlcldpdGhEYXRhLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoU3BvbnNvcmVkOiBidWlsZGVyV2l0aFNwb25zb3JlZC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aERlc2NyaXB0aW9uOiBidWlsZGVyV2l0aERlc2NyaXB0aW9uLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoUmF0aW5nOiBidWlsZGVyV2l0aFJhdGluZy5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aFByaWNlOiBidWlsZGVyV2l0aFByaWNlLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoU2FsZVByaWNlOiBidWlsZGVyV2l0aFNhbGVQcmljZS5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aERpc3BsYXlVUkw6IGJ1aWxkZXJXaXRoRGlzcGxheVVSTC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aENUQVRleHQ6IGJ1aWxkZXJXaXRoQ1RBVGV4dC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aENhdGVnb3J5OiBidWlsZGVyV2l0aENhdGVnb3J5LmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoVEhDOiBidWlsZGVyV2l0aFRIQy5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aENCRDogYnVpbGRlcldpdGhDQkQuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpLFxuICAgIHdpdGhTdHJhaW46IGJ1aWxkZXJXaXRoU3RyYWluLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoTWV0YVByb2R1Y3Q6IGJ1aWxkZXJXaXRoTWV0YVByb2R1Y3QuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpLFxuICAgIHdpdGhFdmVudFRyYWNrZXI6IGJ1aWxkZXJXaXRoRXZlbnRUcmFja2VyLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICBidWlsZDogYnVpbGRlckJ1aWxkLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKVxufSk7XG5cbmV4cG9ydCBjb25zdCBTdGFydE5hdGl2ZSA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnU3RhcnROYXRpdmUnKTtcbiAgICByZXR1cm4gYm90c0J1aWxkQm90cyhsb2csIHtcbiAgICAgICAgYXNzZXRzOiBbXSxcbiAgICAgICAgZXZlbnRUcmFja2VyczogW11cbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0TmF0aXZlID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdEZWZhdWx0TmF0aXZlJyk7XG4gICAgcmV0dXJuIFN0YXJ0TmF0aXZlKGxvZylcbiAgICAgICAgLndpdGhWZXIoJzEuMicpXG4gICAgICAgIC53aXRoQ29udGV4dChDb250ZXh0VHlwZXMuUHJvZHVjdClcbiAgICAgICAgLndpdGhDb250ZXh0U3ViVHlwZShDb250ZXh0U3ViVHlwZXMuUHJvZHVjdClcbiAgICAgICAgLndpdGhQbGFjZW1lbnRUeXBlKFBsYWNlbWVudFR5cGVzLkluRmVlZClcbiAgICAgICAgLndpdGhFdmVudFRyYWNrZXIoRXZlbnRUeXBlcy5JbXAsIFtFdmVudFRyYWNraW5nTWV0aG9kcy5JbWcsIEV2ZW50VHJhY2tpbmdNZXRob2RzLkltZ10pO1xufTtcbiIsCiAgICAiaW1wb3J0IHtcbiAgICBBZ2VudFR5cGVzLFxuICAgIHR5cGUgSUFwcCxcbiAgICB0eXBlIElCYW5uZXIsXG4gICAgdHlwZSBJQmlkUmVxdWVzdCxcbiAgICB0eXBlIElEZXZpY2UsXG4gICAgdHlwZSBJR2VvQ29udGV4dCxcbiAgICB0eXBlIElJbXAsXG4gICAgdHlwZSBJTmF0aXZlLFxuICAgIHR5cGUgSU5hdGl2ZVJlcXVlc3QsXG4gICAgdHlwZSBJUmVncyxcbiAgICB0eXBlIElTaXRlLFxuICAgIHR5cGUgSVN1cmZFeHRlbnNpb24sXG4gICAgdHlwZSBJVXNlcixcbiAgICB0eXBlIElWaWRlb1xufSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ3R4LCBHZW9Db250ZXh0VG9PUlRCLCBJTG9nZ2VyIH0gZnJvbSAnLi4vc2VydmljZXMnO1xuXG5jb25zdCBTVVJGX0VJRF9TT1VSQ0UgPSAnc3VyZi1kb21haW4taWQnO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0QnVpbGRlckZuID0gKHpvbmVJZDogc3RyaW5nLCBpZD86IHN0cmluZykgPT4gUmVxdWVzdEJ1aWxkZXI7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RXaXRoPFQ+ID0gKHQ6IFQpID0+IFJlcXVlc3RCdWlsZGVyO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0QnVpbGRlciA9IHtcbiAgICB3aXRoVXNlcjogUmVxdWVzdFdpdGg8SVVzZXI+LFxuICAgIHdpdGhSZWd1bGF0aW9uczogUmVxdWVzdFdpdGg8SVJlZ3M+LFxuICAgIHdpdGhBcHA6IFJlcXVlc3RXaXRoPElBcHA+LFxuICAgIHdpdGhTaXRlOiBSZXF1ZXN0V2l0aDxJU2l0ZT4sXG4gICAgd2l0aEtleXdvcmRzOiBSZXF1ZXN0V2l0aDxzdHJpbmdbXT4sXG4gICAgd2l0aEJhbm5lcjogKHc6IG51bWJlciwgaDogbnVtYmVyLCBvcHRpb25zPzogUGFydGlhbDxJQmFubmVyPiwgaW1wT3B0aW9ucz86IFBhcnRpYWw8SUltcD4pID0+IFJlcXVlc3RCdWlsZGVyLFxuICAgIHdpdGhWaWRlbzogKHc6IG51bWJlcixcbiAgICAgICAgaDogbnVtYmVyLFxuICAgICAgICBtaW5kdXJhdGlvbjogbnVtYmVyLFxuICAgICAgICBtYXhkdXJhdGlvbjogbnVtYmVyLFxuICAgICAgICBtaW1lcz86IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogUGFydGlhbDxJVmlkZW8+LFxuICAgICAgICBpbXBPcHRpb25zPzogUGFydGlhbDxJSW1wPlxuICAgICkgPT4gUmVxdWVzdEJ1aWxkZXIsXG4gICAgd2l0aE5hdGl2ZTogKFxuICAgICAgICByZXF1ZXN0OiBzdHJpbmcgfCBJTmF0aXZlUmVxdWVzdCxcbiAgICAgICAgb3B0aW9ucz86IFBhcnRpYWw8SU5hdGl2ZT4sXG4gICAgICAgIGltcE9wdGlvbnM/OiBQYXJ0aWFsPElJbXA+XG4gICAgKSA9PiBSZXF1ZXN0QnVpbGRlcixcbiAgICBidWlsZDogKCkgPT4gSUJpZFJlcXVlc3Rcbn1cblxuaW50ZXJmYWNlIElSZXF1ZXN0QnVpbGRlclN0YXRlIHtcbiAgICByZWFkb25seSBpZD86IHN0cmluZyxcbiAgICByZWFkb25seSBjb250ZXh0OiBJU3VyZkV4dGVuc2lvbixcbiAgICByZWFkb25seSB1c2VyPzogSVVzZXIsXG4gICAgcmVhZG9ubHkgc2l0ZT86IElTaXRlLFxuICAgIHJlYWRvbmx5IGFwcD86IElBcHAsXG4gICAgcmVhZG9ubHkgaW1wOiBJSW1wW10sXG4gICAgcmVhZG9ubHkgcmVncz86IElSZWdzLFxuXG4gICAgLy8gVGhlc2UgZmllbGRzIGFyZSBwYXJ0aWFsbHkgYXBwbGllZCBhdCB0aGUgU3RhcnRSZXF1ZXN0IGxldmVsLlxuICAgIHJlYWRvbmx5IGRldmljZT86IElEZXZpY2UsXG4gICAgcmVhZG9ubHkgZ2VvPzogSUdlb0NvbnRleHQsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTdGFydFJlcXVlc3QoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nLFxuICAgIGNoYW5uZWxJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICBkZXZpY2U6IElEZXZpY2UgfCB1bmRlZmluZWQsXG4gICAgZ2VvOiBJR2VvQ29udGV4dCB8IHVuZGVmaW5lZCxcbiAgICB1c2VySWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB6b25lSWQ6IHN0cmluZyxcbiAgICBpZD86IHN0cmluZ1xuKSB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcilcbiAgICAgICAgPy53aXRoKCdTdGFydFJlcXVlc3QnKVxuICAgICAgICAud2l0aChhY2NvdW50SWQpXG4gICAgICAgIC53aXRoKHNpdGVJZClcbiAgICAgICAgLndpdGgoY2hhbm5lbElkKVxuICAgICAgICAud2l0aChsb2NhdGlvbklkKVxuICAgICAgICAud2l0aChpZCk7XG4gICAgbG9nPy5pbmZvKCdTdGFydGluZyByZXF1ZXN0Jyk7XG4gICAgcmV0dXJuIGJvdHNCdWlsZEJvdHMobG9nZ2VyLFxuICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgYWNjb3VudElkLFxuICAgICAgICAgICAgICAgIHNpdGVJZCxcbiAgICAgICAgICAgICAgICBjaGFubmVsSWQsXG4gICAgICAgICAgICAgICAgbG9jYXRpb25JZCxcbiAgICAgICAgICAgICAgICB6b25lSWQsXG4gICAgICAgICAgICAgICAgc3RvcmVJZDogbG9jYXRpb25JZCxcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnRJZDogem9uZUlkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2VvLFxuICAgICAgICAgICAgZGV2aWNlLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICB1c2VyOiB1c2VySWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBlaWRzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBTVVJGX0VJRF9TT1VSQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICB1aWRzOiBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGU6IEFnZW50VHlwZXMuU2Vzc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBpbXA6IFtdXG4gICAgICAgIH0pO1xufVxuXG5jb25zdCBidWlsZGVyV2l0aFVzZXIgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLCBzdGF0ZTogSVJlcXVlc3RCdWlsZGVyU3RhdGUsIHVzZXI6IElVc2VyKSA9PiB7XG4gICAgbG9nZ2VyPy5kZWJ1ZygnQWRkaW5nIHVzZXIgdG8gcmVxdWVzdCcsIHVzZXIpO1xuICAgIHJldHVybiBib3RzQnVpbGRCb3RzKGxvZ2dlcixcbiAgICAgICAge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgICAgLi4udXNlcixcbiAgICAgICAgICAgICAgICBlaWRzOiBbIC8vIHdlIGNhbiB0b3NzIHRoZSByZXN0IG9mIHRoZSB1c2VyIG9iamVjdCwgYnV0IHdlIG5lZWQgdG8ga2VlcCB0aGUgZWlkc1xuICAgICAgICAgICAgICAgICAgICAuLi4oc3RhdGUudXNlcj8uZWlkcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHN0YXRlLnVzZXIuZWlkc1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICAgICAgICAgIC4uLih1c2VyLmVpZHMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyB1c2VyLmVpZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIDogW10pXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbn07XG5cbmNvbnN0IGJ1aWxkZXJXaXRoUmVndWxhdGlvbnMgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLCBzdGF0ZTogSVJlcXVlc3RCdWlsZGVyU3RhdGUsIHJlZ3M6IElSZWdzKSA9PiB7XG4gICAgbG9nZ2VyPy5kZWJ1ZygnQWRkZWQgcmVndWxhdGlvbnMgdG8gcmVxdWVzdCcsIHJlZ3MpO1xuICAgIHJldHVybiBib3RzQnVpbGRCb3RzKGxvZ2dlciwgeyAuLi5zdGF0ZSwgcmVncyB9KTtcbn07XG5cbmNvbnN0IGJ1aWxkZXJXaXRoQXBwID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCwgc3RhdGU6IElSZXF1ZXN0QnVpbGRlclN0YXRlLCBhcHA6IElBcHApID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdBZGRpbmcgYXBwIHRvIHJlcXVlc3QnKTtcbiAgICByZXR1cm4gYm90c0J1aWxkQm90cyhsb2dnZXIsIHsgLi4uIHN0YXRlLCBhcHAgfSk7XG59O1xuXG5jb25zdCBidWlsZGVyV2l0aFNpdGUgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLCBzdGF0ZTogSVJlcXVlc3RCdWlsZGVyU3RhdGUsIHNpdGU6IElTaXRlKSA9PiB7XG4gICAgbG9nZ2VyPy5kZWJ1ZygnQWRkaW5nIHNpdGUgdG8gcmVxdWVzdCcpO1xuICAgIHJldHVybiBib3RzQnVpbGRCb3RzKGxvZ2dlciwgeyAuLi5zdGF0ZSwgc2l0ZSB9KTtcbn1cblxuY29uc3QgYnVpbGRlcldpdGhCYW5uZXIgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHN0YXRlOiBJUmVxdWVzdEJ1aWxkZXJTdGF0ZSxcbiAgICB3OiBudW1iZXIsXG4gICAgaDogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPElCYW5uZXI+LFxuICAgIGltcE9wdGlvbnM/OiBQYXJ0aWFsPElJbXA+XG4pID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdBZGRpbmcgYmFubmVyIHRvIHJlcXVlc3QnLCB3LCBoLCBvcHRpb25zLCBpbXBPcHRpb25zKTtcbiAgICBjb25zdCBpZCA9IGdlbmVyYXRlSWQoKTtcbiAgICByZXR1cm4gYm90c0J1aWxkSW1wKGxvZ2dlcixcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgdGFnaWQ6IGlkLFxuICAgICAgICAgICAgYmFubmVyOiB7XG4gICAgICAgICAgICAgICAgdyxcbiAgICAgICAgICAgICAgICBoLFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5pbXBPcHRpb25zXG4gICAgICAgIH1cbiAgICApO1xufTtcblxuY29uc3QgYnVpbGRlcldpdGhWaWRlbyA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IElSZXF1ZXN0QnVpbGRlclN0YXRlLFxuICAgIHc6IG51bWJlcixcbiAgICBoOiBudW1iZXIsXG4gICAgbWluZHVyYXRpb246IG51bWJlcixcbiAgICBtYXhkdXJhdGlvbjogbnVtYmVyLFxuICAgIG1pbWVzPzogc3RyaW5nW10sXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8SVZpZGVvPixcbiAgICBpbXBPcHRpb25zPzogUGFydGlhbDxJSW1wPlxuKSA9PiB7XG4gICAgbG9nZ2VyPy5kZWJ1ZygnQWRkaW5nIHZpZGVvIHRvIHJlcXVlc3QnLCB3LCBoLCBtaW5kdXJhdGlvbiwgbWF4ZHVyYXRpb24sIG1pbWVzLCBvcHRpb25zLCBpbXBPcHRpb25zKTtcbiAgICByZXR1cm4gYm90c0J1aWxkSW1wKGxvZ2dlcixcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBnZW5lcmF0ZUlkKCksXG4gICAgICAgICAgICB2aWRlbzoge1xuICAgICAgICAgICAgICAgIHcsXG4gICAgICAgICAgICAgICAgaCxcbiAgICAgICAgICAgICAgICBtaW1lczogKG1pbWVzID8/IFsndmlkZW8vbXA0JywgJ3ZpZGVvL3dlYm0nXSksXG4gICAgICAgICAgICAgICAgbWluZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLmltcE9wdGlvbnNcbiAgICAgICAgfVxuICAgICk7XG59O1xuXG5jb25zdCBidWlsZGVyV2l0aEtleXdvcmRzID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBzdGF0ZTogSVJlcXVlc3RCdWlsZGVyU3RhdGUsXG4gICAga2V5d29yZHM6IHN0cmluZ1tdXG4pID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdBZGRpbmcga2V5d29yZCB0byByZXF1ZXN0Jywga2V5d29yZHMpO1xuICAgIHJldHVybiBib3RzQnVpbGRCb3RzKGxvZ2dlcixcbiAgICAgICAge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUuY29udGV4dCxcbiAgICAgICAgICAgICAgICBrZXl3b3Jkc1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbn07XG5cbmNvbnN0IGJ1aWxkZXJXaXRoTmF0aXZlID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBzdGF0ZTogSVJlcXVlc3RCdWlsZGVyU3RhdGUsXG4gICAgcmVxdWVzdDogc3RyaW5nIHwgSU5hdGl2ZVJlcXVlc3QsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8SU5hdGl2ZT4sXG4gICAgaW1wT3B0aW9ucz86IFBhcnRpYWw8SUltcD5cbikgPT4ge1xuICAgIGxvZ2dlcj8uZGVidWcoJ0FkZGluZyBuYXRpdmUgdG8gcmVxdWVzdCcsIHJlcXVlc3QsIG9wdGlvbnMsIGltcE9wdGlvbnMpO1xuICAgIHJldHVybiB0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBidWlsZGVyV2l0aE5hdGl2ZVN0cihsb2dnZXIsXG4gICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgaW1wT3B0aW9uc1xuICAgICAgICApXG4gICAgICAgIDogYnVpbGRlcldpdGhOYXRpdmVTdHIobG9nZ2VyLFxuICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBpbXBPcHRpb25zXG4gICAgICAgICk7XG59O1xuXG5jb25zdCBidWlsZGVyV2l0aE5hdGl2ZVN0ciA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IElSZXF1ZXN0QnVpbGRlclN0YXRlLFxuICAgIHJlcXVlc3Q6IHN0cmluZyxcbiAgICBvcHRpb25zPzogUGFydGlhbDxJTmF0aXZlPixcbiAgICBpbXBPcHRpb25zPzogUGFydGlhbDxJSW1wPlxuKSA9PiBib3RzQnVpbGRJbXAobG9nZ2VyLFxuICAgIHN0YXRlLFxuICAgIHtcbiAgICAgICAgaWQ6IGdlbmVyYXRlSWQoKSxcbiAgICAgICAgbmF0aXZlOiB7XG4gICAgICAgICAgICB2ZXI6ICcxLjInLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfSxcbiAgICAgICAgLi4uaW1wT3B0aW9uc1xuICAgIH1cbik7XG5cbmNvbnN0IGJ1aWxkZXJCdWlsZCA9IChsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsIHN0YXRlOiBJUmVxdWVzdEJ1aWxkZXJTdGF0ZSk6IElCaWRSZXF1ZXN0ID0+IHtcbiAgICBsb2dnZXI/LmRlYnVnKCdCdWlsZGluZyByZXF1ZXN0Jywgc3RhdGUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBzdGF0ZS5pZCA/PyBnZW5lcmF0ZUlkKCksXG4gICAgICAgIGltcDogc3RhdGUuaW1wLm1hcChpbXAgPT4gKHtcbiAgICAgICAgICAgIC4uLmltcCxcbiAgICAgICAgICAgIGV4dDogeyAuLi5pbXAuZXh0LCAuLi5zdGF0ZS5jb250ZXh0IH1cbiAgICAgICAgfSkpLFxuICAgICAgICBkZXZpY2U6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmRldmljZSxcbiAgICAgICAgICAgIGdlbzogc3RhdGUuZ2VvID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIDogR2VvQ29udGV4dFRvT1JUQih1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmdlb1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBpcDogc3RhdGUuZ2VvPy5pcFxuICAgICAgICB9LFxuICAgICAgICB1c2VyOiBzdGF0ZS51c2VyLFxuICAgICAgICBhcHA6IHN0YXRlLmFwcCxcbiAgICAgICAgc2l0ZTogc3RhdGUuc2l0ZSxcbiAgICAgICAgZXh0OiBzdGF0ZS5jb250ZXh0XG4gICAgfTtcbn07XG5cbmNvbnN0IGJvdHNCdWlsZEJvdHMgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLCBzdGF0ZTogSVJlcXVlc3RCdWlsZGVyU3RhdGUpOiBSZXF1ZXN0QnVpbGRlciA9PiAoe1xuICAgIHdpdGhVc2VyOiBidWlsZGVyV2l0aFVzZXIuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpLFxuICAgIHdpdGhSZWd1bGF0aW9uczogYnVpbGRlcldpdGhSZWd1bGF0aW9ucy5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aEJhbm5lcjogYnVpbGRlcldpdGhCYW5uZXIuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpLFxuICAgIHdpdGhWaWRlbzogYnVpbGRlcldpdGhWaWRlby5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBzdGF0ZSksXG4gICAgd2l0aE5hdGl2ZTogYnVpbGRlcldpdGhOYXRpdmUuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpLFxuICAgIHdpdGhBcHA6IGJ1aWxkZXJXaXRoQXBwLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoU2l0ZTogYnVpbGRlcldpdGhTaXRlLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsIHN0YXRlKSxcbiAgICB3aXRoS2V5d29yZHM6IGJ1aWxkZXJXaXRoS2V5d29yZHMuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpLFxuICAgIGJ1aWxkOiBidWlsZGVyQnVpbGQuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgc3RhdGUpXG59KTtcblxuY29uc3QgYm90c0J1aWxkSW1wID0gKGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCwgc3RhdGU6IElSZXF1ZXN0QnVpbGRlclN0YXRlLCBpbXA6IElJbXApOiBSZXF1ZXN0QnVpbGRlciA9PlxuICAgIGJvdHNCdWlsZEJvdHMobG9nZ2VyLCB7IC4uLnN0YXRlLCBpbXA6IFsuLi5zdGF0ZS5pbXAsIGltcF19KTtcblxuY29uc3QgZ2VuZXJhdGVJZCA9ICgpID0+IGNyeXB0by5yYW5kb21VVUlEKCk7XG4iLAogICAgImltcG9ydCB7IElCaWQgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuXG5leHBvcnQgY29uc3QgQ3JlYXRpdmVUeXBlID0ge1xuICAgIEJhbm5lcjogMCxcbiAgICBWaWRlbzogMSxcbiAgICBQcm9kdWN0Q2FyZDogMixcbiAgICBDYXJvdXNlbDogM1xufSBhcyBjb25zdDtcblxuLyoqXG4gKiBBIGJ1aWx0IGNyZWF0aXZlIHJlc3BvbnNlLiBJbmNsdWRlcyB0aGUgYmlkIHJlc3BvbnNlIHdoaWNoIGZlZCB0aGUgY3JlYXRpdmUgYXMgd2VsbCBhcyBhIGB0eXBlYCBmaWVsZCBpbmRpY2F0aW5nIHdoYXRcbiAqIGtpbmQgb2YgY3JlYXRpdmUgaXQgaXMgKGkuZSwge0BsaW5rIElCdWlsdEJhbm5lclJlc3BvbnNlIH0sIHtAbGluayBJQnVpbHRWaWRlb30sIHtAbGluayBJQnVpbHRQcm9kdWN0Q2FyZFJlc3BvbnNlfSxcbiAqIHtAbGluayBJQnVpbHRDYXJvdXNlbH0pLlxuICogXG4gKiBAc2VlIElCdWlsdEJhbm5lclJlc3BvbnNlXG4gKiBAc2VlIElCdWlsdFZpZGVvXG4gKiBAc2VlIElCdWlsdFByb2R1Y3RDYXJkUmVzcG9uc2VcbiAqIEBzZWUgSUJ1aWx0Q2Fyb3VzZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQnVpbHRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIE9wZW5SVEIgQmlkIG9iamVjdCB3aGljaCBjcmVhdGVkIHRoaXMgY3JlYXRpdmVcbiAgICAgKi9cbiAgICBiaWQ6IElCaWQ7XG59O1xuXG5leHBvcnQgY2xhc3MgTWlzc2luZ0FkbUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBiaWQ6IElCaWQgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKCdDYW5ub3QgYnVpbGQgY3JlYXRpdmU7IG1pc3NpbmcgYWRtIGZpZWxkJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWlzc2luZ1Byb2R1Y3RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgYmlkPzogSUJpZCkge1xuICAgICAgICBzdXBlcignQ291bGQgbm90IGZpbmQgcHJvZHVjdCBkYXRhIGZvciBjcmVhdGl2ZSB3aGlsZSBidWlsZGluZyBjbGlja3Rocm91Z2ggVVJMLiBTb21lIGRhdGEgZmllbGRzIGFyZSBtaXNzaW5nJyk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7XG4gICAgSUNvbXBpbGVkUHVibGlzaGVyQ29uZmlndXJhdGlvbixcbiAgICBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBJUHJvZHVjdEluZm9ybWF0aW9uXG59IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBDdHgsIEVyciwgSUxvZ2dlciwgT2ssIFJlc3VsdCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcblxuZXhwb3J0IGNvbnN0IEJ1aWxkQ2xpY2t0aHJvdWdoVXJsID0gKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICB3aW5kb3dJbmZvOiBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBjb25maWd1cmF0aW9uOiBJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uLFxuICAgIHByb2R1Y3Q6IElQcm9kdWN0SW5mb3JtYXRpb24sXG4pOiBSZXN1bHQ8c3RyaW5nPiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0J1aWxkQ2xpY2t0aHJvdWdoVXJsJyk7XG4gICAgbG9nPy5pbmZvKCdCdWlsZGluZyBjbGlja3Rocm91Z2ggVVJMJyk7XG4gICAgbG9nPy5kZWJ1ZyhcbiAgICAgICAgd2luZG93SW5mbyxcbiAgICAgICAgcHJvZHVjdCxcbiAgICAgICAgY29uZmlndXJhdGlvblxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIE9rKGNvbmZpZ3VyYXRpb24udGVtcGxhdGVzLmNsaWNrVGhyb3VnaFVybFRlbXBsYXRlKHtcbiAgICAgICAgICAgIHByb2R1Y3QsXG4gICAgICAgICAgICBjYXRhbG9nOiBwcm9kdWN0LFxuICAgICAgICAgICAgd2luZG93OiB3aW5kb3dJbmZvLFxuICAgICAgICAgICAgcHVibGlzaGVyOiBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgLi4ucHJvZHVjdFxuICAgICAgICB9KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2c/LmVycm9yKCdGYWlsZWQgdG8gZXhlY3V0ZSBjbGlja3Rocm91Z2ggVVJMIHRlbXBsYXRlJywgcHJvZHVjdCwgY29uZmlndXJhdGlvbiwgd2luZG93SW5mbyk7XG4gICAgICAgIHJldHVybiBFcnIoZSBhcyBFcnJvcik7XG4gICAgfVxufTtcbiIsCiAgICAiZXhwb3J0IGNvbnN0IENvbnN1bWVOID0gPFQ+KGdlbmVyYXRvcjogR2VuZXJhdG9yPFQ+LCBuOiBudW1iZXIpOiBUW10gPT4ge1xuICAgIGNvbnN0IGNvbnN1bWVkOiBUW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGdlbmVyYXRvci5uZXh0KCk7XG4gICAgICAgIGlmKHZhbHVlLmRvbmUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN1bWVkLnB1c2godmFsdWUudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gY29uc3VtZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBDb25zdW1lQWxsID0gPFQ+KGdlbmVyYXRvcjogR2VuZXJhdG9yPFQ+KTogVFtdID0+IHtcbiAgICBjb25zdCBjb25zdW1lZDogVFtdID0gW107XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBnZW5lcmF0b3IpIHtcbiAgICAgICAgY29uc3VtZWQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBjb25zdW1lZDtcbn1cblxuZXhwb3J0IGNvbnN0IENvbnN1bWVOQXN5bmMgPSBhc3luYyA8VD4oZ2VuZXJhdG9yOiBBc3luY0dlbmVyYXRvcjxUPiwgbjogbnVtYmVyKTogUHJvbWlzZTxbZGF0YTogVFtdLCBmaW5pc2hlZDogYm9vbGVhbl0+ID0+IHtcbiAgICBjb25zdCBjb25zdW1lZDogVFtdID0gW107XG4gICAgd2hpbGUoY29uc3VtZWQubGVuZ3RoIDwgbikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0b3IubmV4dCgpO1xuICAgICAgICBpZihyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIFtjb25zdW1lZCwgdHJ1ZV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3VtZWQucHVzaChyZXN1bHQudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gW2NvbnN1bWVkLCBmYWxzZV07XG59XG5cbmV4cG9ydCBjb25zdCBDb25zdW1lQWxsQXN5bmMgPSBhc3luYyA8VD4oZ2VuZXJhdG9yOiBBc3luY0dlbmVyYXRvcjxUPik6IFByb21pc2U8VFtdPiA9PiB7XG4gICAgY29uc3QgY29uc3VtZWQ6IFRbXSA9IFtdO1xuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgZ2VuZXJhdG9yKSB7XG4gICAgICAgIGNvbnN1bWVkLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gY29uc3VtZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogR2VuZXJhdGVBcnJheTxUPihkYXRhOiBUW10pOiBHZW5lcmF0b3I8VD4ge1xuICAgIGZvcihjb25zdCB0IG9mIGRhdGEpIHtcbiAgICAgICAgeWllbGQgdDtcbiAgICB9XG59IiwKICAgICJpbXBvcnQgeyBFcnIsIE9rLCBSZXN1bHQgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5cbmV4cG9ydCBjb25zdCBUcnlHZXQgPSA8VD4oZ2V0OiAoKSA9PiBUKTogUmVzdWx0PFQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gT2soZ2V0KCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBFcnIoZXJyb3IgYXMgRXJyb3IpO1xuICAgIH1cbn07IiwKICAgICJpbXBvcnQge1xuICAgIEV2ZW50VHJhY2tpbmdNZXRob2RzLFxuICAgIEV2ZW50VHlwZXMsXG4gICAgSUJpZCxcbiAgICBJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uLFxuICAgIElOYXRpdmVSZXNwb25zZSxcbiAgICBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBJUHJvZHVjdEluZm9ybWF0aW9uLFxuICAgIE5hdGl2ZUFzc2V0SWRcbn0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG4gICAgQXN5bmNSZXN1bHQsXG4gICAgQ3R4LFxuICAgIEVycixcbiAgICBFcnJSZXN1bHQsXG4gICAgR2V0QWxsU3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuLFxuICAgIElMb2dnZXIsXG4gICAgT2ssXG4gICAgT2tSZXN1bHQsXG4gICAgUmVzdWx0LFxuICAgIFRyeURvXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IENvbnN1bWVBbGxBc3luYywgR2VuZXJhdGVBcnJheSB9IGZyb20gJy4uL0dlbmVyYXRvcic7XG5pbXBvcnQgeyBUcnlHZXQgfSBmcm9tICcuLi9UcnlHZXQnO1xuaW1wb3J0IHsgSUJ1aWx0UmVzcG9uc2UsIE1pc3NpbmdBZG1FcnJvciB9IGZyb20gJy4vQnVpbHRSZXNwb25zZSc7XG5pbXBvcnQgeyBCdWlsZENsaWNrdGhyb3VnaFVybCB9IGZyb20gJy4vQ2xpY2t0aHJvdWdoJztcblxuZXhwb3J0IHR5cGUgQnVpbGRBbGxTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlc0ZuID0gKGJpZHM6IElCaWRbXSkgPT4gQXN5bmNSZXN1bHQ8SUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZVtdPjtcbmV4cG9ydCB0eXBlIEdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZUZuID0gKGJpZHM6IElCaWRbXSkgPT4gQXN5bmNHZW5lcmF0b3I8SUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRyYWNrZXIge1xuICAgIHR5cGU6IG51bWJlcjtcbiAgICB1cmw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUGl4ZWxUcmFja2VyIGV4dGVuZHMgSVRyYWNrZXIge1xuICAgIHR5cGU6IDE7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTY3JpcHRUcmFja2VyIGV4dGVuZHMgSVRyYWNrZXIge1xuICAgIHR5cGU6IDI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElUcmFja2VyT2JqZWN0IHtcbiAgICB3aW46IHN0cmluZyxcbiAgICBpbXA6IHN0cmluZ1tdLFxuICAgIG90aGVyczogSVRyYWNrZXJbXVxufTtcblxuZXhwb3J0IHR5cGUgSUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZSA9IElCdWlsdFJlc3BvbnNlXG4gICAgJiBJQnVpbHRQcm9kdWN0Q2FyZFJlc3BvbnNlXG4gICAgJiB7XG4gICAgICAgIG5hdGl2ZTogSU5hdGl2ZVJlc3BvbnNlLFxuICAgICAgICBzcG9uc29yZWQ6IHRydWVcbiAgICB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIElCdWlsdFByb2R1Y3RDYXJkUmVzcG9uc2Uge1xuICAgIHR5cGU6ICdwcm9kdWN0LWNhcmQnLFxuICAgIHByb2R1Y3Q6IElQcm9kdWN0SW5mb3JtYXRpb24sXG4gICAgdHJhY2tlcnM/OiBJVHJhY2tlck9iamVjdCxcbiAgICBjbGlja3Rocm91Z2g6IHN0cmluZyxcbiAgICBzcG9uc29yZWQ6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY29uc3QgQnVpbGRBbGxTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlcyA9IGFzeW5jIChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgZ2V0QWxsU3BvbnNvcmVkUHJvZHVjdHM6IEdldEFsbFNwb25zb3JlZFByb2R1Y3RGcm9tTmF0aXZlSWRGbixcbiAgICB3aW5kb3dJbmZvOiBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBjb25maWd1cmF0aW9uOiBJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uLFxuICAgIGJpZHM6IElCaWRbXVxuKTogQXN5bmNSZXN1bHQ8SUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZVtdPiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0J1aWxkUHJvZHVjdENhcmRSZXNwb25zZScpO1xuICAgIGxvZz8uaW5mbygnQnVpbGRpbmcgcHJvZHVjdCBjYXJkIHJlc3BvbnNlcycpO1xuICAgIGlmIChiaWRzID09PSB1bmRlZmluZWQgfHwgYmlkcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gRXJyKG5ldyBNaXNzaW5nQmlkc0Vycm9yKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpZFByb21pc2VzID0gYmlkcy5tYXAoYnVpbGRBbGxQcm9kdWN0Q2FyZFJlc3BvbnNlc0Zyb21CaWQuYmluZCh1bmRlZmluZWQsIGxvZyxcbiAgICAgICAgZ2V0QWxsU3BvbnNvcmVkUHJvZHVjdHMsXG4gICAgICAgIHdpbmRvd0luZm8sXG4gICAgICAgIGNvbmZpZ3VyYXRpb25cbiAgICApKTtcblxuICAgIGNvbnN0IHByb2R1Y3RDYXJkUmVzcG9uc2VSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGJpZFByb21pc2VzKTtcbiAgICBwcm9kdWN0Q2FyZFJlc3BvbnNlUmVzdWx0c1xuICAgICAgICAuZmlsdGVyKHJlcyA9PiByZXMuc3RhdHVzID09PSAncmVqZWN0ZWQnKVxuICAgICAgICAubWFwKHJlcyA9PiByZXMucmVhc29uIGFzIEVyclJlc3VsdDxFcnJvcj4pXG4gICAgICAgIC5mb3JFYWNoKGVyciA9PiBsb2c/Lndhcm4oZXJyKSk7XG4gICAgXG4gICAgY29uc3QgZnVsZmlsbGVkID0gcHJvZHVjdENhcmRSZXNwb25zZVJlc3VsdHNcbiAgICAgICAgLmZpbHRlcihyZXMgPT4gcmVzLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpO1xuXG4gICAgZnVsZmlsbGVkXG4gICAgICAgIC5maWx0ZXIocmVzID0+ICFyZXMudmFsdWUub2spXG4gICAgICAgIC5tYXAocmVzID0+IHJlcy52YWx1ZSBhcyBFcnJSZXN1bHQpXG4gICAgICAgIC5tYXAocmVzID0+IHJlcy5lcnJvcilcbiAgICAgICAgLmZvckVhY2goZXJyID0+IGxvZz8ud2FybihlcnIpKTtcbiAgICBcbiAgICByZXR1cm4gT2socHJvZHVjdENhcmRSZXNwb25zZVJlc3VsdHNcbiAgICAgICAgLmZpbHRlcihyZXMgPT4gcmVzLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpXG4gICAgICAgIC5maWx0ZXIocmVzID0+IHJlcy52YWx1ZS5vaylcbiAgICAgICAgLm1hcChyZXMgPT4gcmVzLnZhbHVlIGFzIE9rUmVzdWx0PElCdWlsdFByb2R1Y3RDYXJkQmlkUmVzcG9uc2VbXT4pXG4gICAgICAgIC5mbGF0TWFwKHJlcyA9PiByZXMudmFsdWUpKTtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiogR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0czogR2V0QWxsU3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuLFxuICAgIHdpbmRvd0luZm86IElOYXRpdmVUZW1wbGF0ZURlbGVnYXRlV2luZG93LFxuICAgIGNvbmZpZ3VyYXRpb246IElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24sXG4gICAgYmlkczogSUJpZFtdXG4pOiBBc3luY0dlbmVyYXRvcjxJQnVpbHRQcm9kdWN0Q2FyZEJpZFJlc3BvbnNlPiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0dlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZScpO1xuICAgIGxvZz8uaW5mbygnRW50ZXJpbmcgcHJvZHVjdCBjYXJkIHJlc3BvbnNlIGdlbmVyYXRvcicsIGJpZHMpO1xuICAgIGZvcihjb25zdCBiaWQgb2YgYmlkcykge1xuICAgICAgICBsb2c/LmluZm8oJ0dlbmVyYXRpbmcgcHJvZHVjdCBjYXJkIHJlc3BvbnNlJywgYmlkKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGRBbGxQcm9kdWN0Q2FyZFJlc3BvbnNlc0Zyb21CaWQoXG4gICAgICAgICAgICBsb2csXG4gICAgICAgICAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0cyxcbiAgICAgICAgICAgIHdpbmRvd0luZm8sXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgYmlkXG4gICAgICAgICk7XG4gICAgICAgIGlmKCFyZXN1bHQub2spIHtcbiAgICAgICAgICAgIGxvZz8ud2FybihyZXN1bHQuZXJyb3IpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQqIEdlbmVyYXRlQXJyYXkocmVzdWx0LnZhbHVlKTtcbiAgICB9XG59XG5cbmNvbnN0IGdldEZpZWxkID0gKG5hdGl2ZTogSU5hdGl2ZVJlc3BvbnNlKSA9PlxuICAgIChpZDogbnVtYmVyKSA9PlxuICAgICAgICBuYXRpdmUubmF0aXZlLmFzc2V0c1xuICAgICAgICAgICAgPy5maW5kKGFzc2V0ID0+IGFzc2V0LmlkID09PSBpZClcbiAgICAgICAgICAgID8uZGF0YVxuICAgICAgICAgICAgPy52YWx1ZTtcblxuY29uc3QgZ2V0VHJhY2tlcnMgPSAobG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLCBiaWQ6IElCaWQsIG5hdGl2ZTogSU5hdGl2ZVJlc3BvbnNlKTogUmVzdWx0PElUcmFja2VyT2JqZWN0PiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ2dldFRyYWNrZXJzJyk7XG4gICAgbG9nPy5pbmZvKCdHZXR0aW5nIHRyYWNrZXJzJyk7XG5cbiAgICBjb25zdCB3aW4gPSBiaWQubnVybDtcbiAgICBpZiAod2luID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIEVycihuZXcgTWlzc2luZ1dpblVybEVycm9yKGJpZCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGltcCA9IG5hdGl2ZS5uYXRpdmUuZXZlbnR0cmFja2Vyc1xuICAgICAgICA/LmZpbHRlcih0cmFja2VyID0+IHRyYWNrZXIuZXZlbnQgPT09IEV2ZW50VHlwZXMuSW1wICYmIHRyYWNrZXIubWV0aG9kID09PSBFdmVudFRyYWNraW5nTWV0aG9kcy5JbWcpXG4gICAgICAgIC5tYXAodHJhY2tlciA9PiB0cmFja2VyLnVybClcbiAgICAgICAgLmZpbHRlcih1cmwgPT4gdXJsICE9PSB1bmRlZmluZWQpID8/IFtdO1xuXG4gICAgY29uc3Qgb3RoZXJzID0gbmF0aXZlLm5hdGl2ZS5ldmVudHRyYWNrZXJzXG4gICAgICAgID8uZmlsdGVyKHRyYWNrZXIgPT4gdHJhY2tlci51cmwgIT09IHVuZGVmaW5lZClcbiAgICAgICAgLm1hcCh0cmFja2VyID0+ICh7XG4gICAgICAgICAgICB0eXBlOiB0cmFja2VyLm1ldGhvZCxcbiAgICAgICAgICAgIHVybDogdHJhY2tlci51cmwhXG4gICAgICAgIH0pKSA/PyBbXTtcblxuICAgIHJldHVybiBPayh7IHdpbiwgaW1wLCBvdGhlcnMgfSk7XG59O1xuXG5jb25zdCBmZXRjaFByb2R1Y3RzRnJvbUJpZCA9IGFzeW5jIChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgZ2V0QWxsU3BvbnNvcmVkUHJvZHVjdHM6IEdldEFsbFNwb25zb3JlZFByb2R1Y3RGcm9tTmF0aXZlSWRGbixcbiAgICBiaWQ6IElCaWRcbik6IEFzeW5jUmVzdWx0PHtcbiAgICBwcm9kdWN0czogSVByb2R1Y3RJbmZvcm1hdGlvbltdXG4gICAgbmF0aXZlOiBJTmF0aXZlUmVzcG9uc2Vcbn0+ID0+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZmV0Y2hQcm9kdWN0c0Zyb21CaWQnKTtcbiAgICAgICAgbG9nPy5pbmZvKCdGZXRjaGluZyBwcm9kdWN0cyBmcm9tIElCaWQnKTtcbiAgICAgICAgY29uc3QgcHJvZHVjdENhcmRSZXNwb25zZXM6IElCdWlsdFByb2R1Y3RDYXJkQmlkUmVzcG9uc2VbXSA9IFtdO1xuICAgICAgICBpZiAoYmlkLmFkbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2c/Lndhcm4oJ0JpZCBpcyBtaXNzaW5nIEFETScsIGJpZCk7XG4gICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBNaXNzaW5nQWRtRXJyb3IoYmlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWRtID0gYmlkLmFkbTsgLy8gc2F2ZSBpdCBoZXJlIHRvIG1ha2UgaXQgZWZmZWN0aXZlbHkgZmluYWw7XG4gICAgICAgIGNvbnN0IG5hdGl2ZVJlcyA9IFRyeUdldCgoKSA9PiBKU09OLnBhcnNlKGFkbSkgYXMgSU5hdGl2ZVJlc3BvbnNlKTtcbiAgICAgICAgaWYgKCFuYXRpdmVSZXMub2spIHtcbiAgICAgICAgICAgIGxvZz8uZXJyb3IoJ0JpZCBhZG0gZmFpbGVkIHRvIGRlc2VyaWFsaXplJywgYmlkLCBhZG0pO1xuICAgICAgICAgICAgcmV0dXJuIEVycihuZXcgTWFsZm9ybWVkTmF0aXZlUmVzcG9uc2VFcnJvcihiaWQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5hdGl2ZSA9IG5hdGl2ZVJlcy52YWx1ZTtcbiAgICAgICAgY29uc3QgbWV0YVByb2R1Y3RJZCA9IGdldEZpZWxkKG5hdGl2ZSkoTmF0aXZlQXNzZXRJZC5TdXJmTWV0YUJyYW5kKTtcblxuICAgICAgICBpZiAobWV0YVByb2R1Y3RJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gRXJyKG5ldyBNaXNzaW5nUHJvZHVjdElkRXJyb3IoYmlkLCBuYXRpdmUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb2R1Y3RSZXMgPSBhd2FpdCBnZXRBbGxTcG9uc29yZWRQcm9kdWN0cyhtZXRhUHJvZHVjdElkKTtcbiAgICAgICAgaWYgKCFwcm9kdWN0UmVzLm9rKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvZHVjdFJlcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBPayh7XG4gICAgICAgICAgICBwcm9kdWN0czogcHJvZHVjdFJlcy52YWx1ZSxcbiAgICAgICAgICAgIG5hdGl2ZVxuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIEVycihlcnIgYXMgRXJyb3IpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gKmJ1aWxkUHJvZHVjdENhcmRSZXNwb25zZUZyb21SZWNvbW1lbmRlZFByb2R1Y3RJbmZvKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICB3aW5kb3dJbmZvOiBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBjb25maWd1cmF0aW9uOiBJQ29tcGlsZWRQdWJsaXNoZXJDb25maWd1cmF0aW9uLFxuICAgIHByb2R1Y3RzOiBJUHJvZHVjdEluZm9ybWF0aW9uW11cbik6IEdlbmVyYXRvcjxJQnVpbHRQcm9kdWN0Q2FyZFJlc3BvbnNlPiB7XG4gICAgXG59XG5cbmZ1bmN0aW9uICpidWlsZFByb2R1Y3RDYXJkUmVzcG9uc2VGcm9tUHJvZHVjdEluZm8oXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHdpbmRvd0luZm86IElOYXRpdmVUZW1wbGF0ZURlbGVnYXRlV2luZG93LFxuICAgIGNvbmZpZ3VyYXRpb246IElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24sXG4gICAgYmlkOiBJQmlkLFxuICAgIG5hdGl2ZTogSU5hdGl2ZVJlc3BvbnNlLFxuICAgIHByb2R1Y3RzOiBJUHJvZHVjdEluZm9ybWF0aW9uW10sXG4pOiBHZW5lcmF0b3I8SUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdidWlsZFByb2R1Y3RDYXJkUmVzcG9uc2VGcm9tUHJvZHVjdEluZm8nKTtcbiAgICBmb3IgKGNvbnN0IHByb2R1Y3Qgb2YgcHJvZHVjdHMpIHtcbiAgICAgICAgY29uc3QgY2xpY2t0aHJvdWdoID0gQnVpbGRDbGlja3Rocm91Z2hVcmwoXG4gICAgICAgICAgICBsb2csXG4gICAgICAgICAgICB3aW5kb3dJbmZvLFxuICAgICAgICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgICAgICAgIHByb2R1Y3RcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWNsaWNrdGhyb3VnaC5vaykge1xuICAgICAgICAgICAgcmV0dXJuIGNsaWNrdGhyb3VnaDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyYWNrZXJzID0gZ2V0VHJhY2tlcnMobG9nLCBiaWQsIG5hdGl2ZSk7XG5cbiAgICAgICAgaWYgKCF0cmFja2Vycy5vaykge1xuICAgICAgICAgICAgcmV0dXJuIHRyYWNrZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmluYWxDbGlja3Rocm91Z2ggPSBUcnlEbygoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiaWRkZXJDbGlja3Rocm91Z2ggPSBuZXcgVVJMKG5hdGl2ZS5uYXRpdmUubGluay51cmwpO1xuICAgICAgICAgICAgYmlkZGVyQ2xpY2t0aHJvdWdoLnNlYXJjaFBhcmFtcy5zZXQoJ3VybCcsIGNsaWNrdGhyb3VnaC52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gYmlkZGVyQ2xpY2t0aHJvdWdoLnRvU3RyaW5nKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZighZmluYWxDbGlja3Rocm91Z2gub2spIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5hbENsaWNrdGhyb3VnaDtcbiAgICAgICAgfVxuXG4gICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgIHR5cGU6ICdwcm9kdWN0LWNhcmQnLFxuICAgICAgICAgICAgbmF0aXZlLFxuICAgICAgICAgICAgcHJvZHVjdCxcbiAgICAgICAgICAgIGJpZCxcbiAgICAgICAgICAgIGNsaWNrdGhyb3VnaDogZmluYWxDbGlja3Rocm91Z2gudmFsdWUsXG4gICAgICAgICAgICB0cmFja2VyczogdHJhY2tlcnMudmFsdWUsXG4gICAgICAgICAgICBzcG9uc29yZWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmNvbnN0IGJ1aWxkQWxsUHJvZHVjdENhcmRSZXNwb25zZXNGcm9tQmlkID0gYXN5bmMgKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0czogR2V0QWxsU3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuLFxuICAgIHdpbmRvd0luZm86IElOYXRpdmVUZW1wbGF0ZURlbGVnYXRlV2luZG93LFxuICAgIGNvbmZpZ3VyYXRpb246IElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24sXG4gICAgYmlkOiBJQmlkXG4pOiBBc3luY1Jlc3VsdDxJQnVpbHRQcm9kdWN0Q2FyZEJpZFJlc3BvbnNlW10+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnYnVpbGRBbGxQcm9kdWN0Q2FyZFJlc3BvbnNlQmlkcycpO1xuICAgIGxvZz8uaW5mbygnQnVpbGRpbmcgYWxsIHByb2R1Y3QgY2FyZCByZXNwb25zZXMnKTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gT2soYXdhaXQgQ29uc3VtZUFsbEFzeW5jKGdlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZUZyb21CaWQoXG4gICAgICAgICAgICBsb2csXG4gICAgICAgICAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0cyxcbiAgICAgICAgICAgIHdpbmRvd0luZm8sXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgYmlkXG4gICAgICAgICkpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIEVycihlcnIgYXMgRXJyb3IpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24qIGdlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZUZyb21CaWQgKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0czogR2V0QWxsU3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuLFxuICAgIHdpbmRvd0luZm86IElOYXRpdmVUZW1wbGF0ZURlbGVnYXRlV2luZG93LFxuICAgIGNvbmZpZ3VyYXRpb246IElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24sXG4gICAgYmlkOiBJQmlkXG4pOiBBc3luY0dlbmVyYXRvcjxJQnVpbHRQcm9kdWN0Q2FyZEJpZFJlc3BvbnNlPiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ2dlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZUZyb21CaWQnKTtcbiAgICBsb2c/LmluZm8oJ2dlbmVyYXRpbmcgcHJvZHVjdCBjYXJkIHJlc3BvbnNlIGZyb20gYmlkJyk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJvZHVjdFJlc3VsdCA9IGF3YWl0IGZldGNoUHJvZHVjdHNGcm9tQmlkKGxvZywgZ2V0QWxsU3BvbnNvcmVkUHJvZHVjdHMsIGJpZCk7XG4gICAgICAgIGlmKCFwcm9kdWN0UmVzdWx0Lm9rKSB7XG4gICAgICAgICAgICBsb2c/LmluZm8oJ05vIHByb2R1Y3RzIScpO1xuICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3RSZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHByb2R1Y3RzLCBuYXRpdmUgfSA9IHByb2R1Y3RSZXN1bHQudmFsdWU7XG5cbiAgICAgICAgY29uc3QgYnVpbHRQcm9kdWN0Q2FyZFJlc3BvbnNlczogSUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZVtdID0gW107XG4gICAgICAgIHlpZWxkKiBidWlsZFByb2R1Y3RDYXJkUmVzcG9uc2VGcm9tUHJvZHVjdEluZm8obG9nLFxuICAgICAgICAgICAgd2luZG93SW5mbyxcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICBiaWQsXG4gICAgICAgICAgICBuYXRpdmUsXG4gICAgICAgICAgICBwcm9kdWN0c1xuICAgICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWlzc2luZ0JpZHNFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ1VuYWJsZSB0byBidWlsZCBwcm9kdWN0IGNhcmRzIC0gbm8gYmlkcyB3ZXJlIHByb3ZpZGVkJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFsZm9ybWVkTmF0aXZlUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgYmlkOiBJQmlkKSB7XG4gICAgICAgIHN1cGVyKCdVbmFibGUgdG8gYnVpbGQgcHJvZHVjdCBjYXJkIC0gbWlzc2luZyBuYXRpdmUgcmVzcG9uc2UnKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNaXNzaW5nV2luVXJsRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGJpZDogSUJpZCkge1xuICAgICAgICBzdXBlcignVW5hYmxlIHRvIGJ1aWxkIHByb2R1Y3QgY2FyZCAtIG5vIHdpbiBVUkwgd2FzIHByb3ZpZGVkJyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWlzc2luZ1Byb2R1Y3RJZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgYmlkOiBJQmlkLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbmF0aXZlOiBJTmF0aXZlUmVzcG9uc2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoJ1VuYWJsZSB0byBidWlsZCBwcm9kdWN0IGNhcmQgLSBubyBwcm9kdWN0IElEIHdhcyBwcm92aWRlZCcpO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICAgIElCaWQsXG4gICAgSUJpZFJlcXVlc3QsXG4gICAgSVByb2R1Y3RJbmZvcm1hdGlvblxufSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcbiAgICBDdHgsXG4gICAgdHlwZSBJTG9nZ2VyLFxuICAgIHR5cGUgTm9uUGVyc29uYWxSZWNvbW1lbmRlckZuLFxuICAgIE9rLFxuICAgIHR5cGUgUGVyc29uYWxSZWNvbW1lbmRlckZuLFxuICAgIHR5cGUgUmVxdWVzdEJpZHNGbixcbiAgICB0eXBlIFJlc3VsdFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBFdmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlRm4gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9UZW1wbGF0ZSc7XG5pbXBvcnQgdHlwZSB7XG4gICAgR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlRm4sXG4gICAgSUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZSxcbiAgICBJQnVpbHRQcm9kdWN0Q2FyZFJlc3BvbnNlXG59IGZyb20gJy4vUHJvZHVjdENhcmQnO1xuXG5leHBvcnQgdHlwZSBCdWlsZFNwb25zb3JlZENhcm91c2VsRm4gPSAocmVxdWVzdDogSUJpZFJlcXVlc3QpID0+IFJlc3VsdDxJQnVpbHRDYXJvdXNlbD47XG5leHBvcnQgdHlwZSBCdWlsZFNwb25zb3JlZENhcm91c2VsRnJvbUluaXRpYWxCaWRGbiA9IChyZXF1ZXN0OiBJQmlkUmVxdWVzdCwgaW5pdGlhbEJpZDogSUJpZCkgPT4gUmVzdWx0PElCdWlsdENhcm91c2VsPjtcbmV4cG9ydCB0eXBlIEJ1aWxkUmVjb21tZW5kZWRDYXJvdXNlbEZuID0gKFJlY29tbWVuZGVyVHlwZTogUHVibGljUmVjb21tZW5kZXJUeXBlKSA9PiBSZXN1bHQ8SUJ1aWx0Q2Fyb3VzZWw+O1xuZXhwb3J0IHR5cGUgQnVpbGRIeWJyaWRDYXJvdXNlbEZuID0gKHJlY29tbWVuZGVyVHlwZTogUHVibGljUmVjb21tZW5kZXJUeXBlLCByZXF1ZXN0OiBJQmlkUmVxdWVzdClcbiAgICA9PiBSZXN1bHQ8SUJ1aWx0Q2Fyb3VzZWw+O1xuZXhwb3J0IHR5cGUgQnVpbGRIeWJyaWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkRm4gPSAoXG4gICAgUmVjb21tZW5kZXJUeXBlOiBQdWJsaWNSZWNvbW1lbmRlclR5cGUsXG4gICAgcmVxdWVzdDogSUJpZFJlcXVlc3QsXG4gICAgaW5pdGlhbEJpZDogSUJpZFxuKSA9PiBSZXN1bHQ8SUJ1aWx0Q2Fyb3VzZWw+O1xuZXhwb3J0IHR5cGUgQ2Fyb3VzZWxOZXh0UHJvZHVjdEZuID0gKCkgPT4gQXN5bmNHZW5lcmF0b3I8SUJ1aWx0UHJvZHVjdENhcmRSZXNwb25zZT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJ1aWx0Q2Fyb3VzZWwge1xuICAgIHR5cGU6ICdjYXJvdXNlbCcsXG4gICAgZ2V0UHJvZHVjdDogQ2Fyb3VzZWxOZXh0UHJvZHVjdEZuXG59XG5cbmV4cG9ydCB0eXBlIFJlY29tbWVuZGVyVHlwZSA9ICd0b3AtcHJvZHVjdHMnIHwgJ2Zvci15b3UnIHwgJ3Bhc3QtcHVyY2hhc2VzJztcblxuZXhwb3J0IGludGVyZmFjZSBJUHVibGljVG9wUHJvZHVjdHNSZWNvbW1lbmRlclR5cGUge1xuICAgIHR5cGU6ICd0b3AtcHJvZHVjdHMnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVB1YmxpY0ZvcllvdVJlY29tbWVuZGVyVHlwZSB7XG4gICAgdHlwZTogJ2Zvci15b3UnLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBJUHVibGljUGFzdFB1cmNoYXNlc1JlY29tbWVuZGVyVHlwZSB7XG4gICAgdHlwZTogJ3Bhc3QtcHVyY2hhc2VzJyxcbn07XG5cbmV4cG9ydCB0eXBlIFB1YmxpY1JlY29tbWVuZGVyVHlwZSA9IElQdWJsaWNUb3BQcm9kdWN0c1JlY29tbWVuZGVyVHlwZVxuICAgIHwgSVB1YmxpY0ZvcllvdVJlY29tbWVuZGVyVHlwZVxuICAgIHwgSVB1YmxpY1Bhc3RQdXJjaGFzZXNSZWNvbW1lbmRlclR5cGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRvcFByb2R1Y3RSZWNvbW1lbmRlciB7XG4gICAgcmVjb21tZW5kZXJUeXBlOiAndG9wLXByb2R1Y3RzJztcbiAgICB0b3BQcm9kdWN0R2VuZXJhdG9yOiBOb25QZXJzb25hbFJlY29tbWVuZGVyRm47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElGb3JZb3VQcm9kdWN0UmVjb21tZW5kZXIge1xuICAgIHJlY29tbWVuZGVyVHlwZTogJ2Zvci15b3UnO1xuICAgIGZvcllvdVByb2R1Y3RHZW5lcmF0b3I6IFBlcnNvbmFsUmVjb21tZW5kZXJGblxuICAgIHRvcFByb2R1Y3RHZW5lcmF0b3I6IE5vblBlcnNvbmFsUmVjb21tZW5kZXJGbjtcbiAgICB1c2VySWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBhc3RQdXJjaGFzZXNQcm9kdWN0UmVjb21tZW5kZXIge1xuICAgIHJlY29tbWVuZGVyVHlwZTogJ3Bhc3QtcHVyY2hhc2VzJztcbiAgICBwYXN0UHVyY2hhc2VzUHJvZHVjdEdlbmVyYXRvcjogUGVyc29uYWxSZWNvbW1lbmRlckZuO1xuICAgIHRvcFByb2R1Y3RHZW5lcmF0b3I6IE5vblBlcnNvbmFsUmVjb21tZW5kZXJGbjtcbiAgICB1c2VySWQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBQcm9kdWN0UmVjb21tZW5kZXIgPSBJVG9wUHJvZHVjdFJlY29tbWVuZGVyIHwgSUZvcllvdVByb2R1Y3RSZWNvbW1lbmRlciB8IElQYXN0UHVyY2hhc2VzUHJvZHVjdFJlY29tbWVuZGVyO1xuXG5leHBvcnQgY29uc3QgQnVpbGRTcG9uc29yZWRDYXJvdXNlbCA9IChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgcmVxdWVzdEJpZHM6IFJlcXVlc3RCaWRzRm4sXG4gICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlOiBHZW5lcmF0ZVNwb25zb3JlZFByb2R1Y3RDYXJkUmVzcG9uc2VGbixcbiAgICByZXF1ZXN0OiBJQmlkUmVxdWVzdFxuKTogUmVzdWx0PElCdWlsdENhcm91c2VsPiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ0J1aWxkU3BvbnNvcmVkQ2Fyb3VzZWwnKTtcbiAgICBsb2c/LmluZm8oJ0J1aWxkaW5nIHNwb25zb3JlZCBjYXJvdXNlbCcpO1xuICAgIHJldHVybiBPayh7XG4gICAgICAgIHR5cGU6ICdjYXJvdXNlbCcsXG4gICAgICAgIGdldFByb2R1Y3Q6IGdldE5leHRTcG9uc29yZWRDYXJvdXNlbFByb2R1Y3QuYmluZCh1bmRlZmluZWQsIGxvZyxcbiAgICAgICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICAgICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICAgICAgcmVxdWVzdFxuICAgICAgICApXG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgQnVpbGRTcG9uc29yZWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkID0gKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0QmlkczogUmVxdWVzdEJpZHNGbixcbiAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2U6IEdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZUZuLFxuICAgIHJlcXVlc3Q6IElCaWRSZXF1ZXN0LFxuICAgIGluaXRpYWxCaWQ6IElCaWRcbik6IFJlc3VsdDxJQnVpbHRDYXJvdXNlbD4gPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdCdWlsZFNwb25zb3JlZENhcm91c2VsRnJvbUluaXRpYWxCaWQnKTtcbiAgICBsb2c/LmluZm8oJ0J1aWxkaW5nIHNwb25zb3JlZCBjYXJvdXNlbCBmcm9tIGluaXRpYWwgYmlkJyk7XG4gICAgcmV0dXJuIE9rKHtcbiAgICAgICAgdHlwZTogJ2Nhcm91c2VsJyxcbiAgICAgICAgZ2V0UHJvZHVjdDogZ2V0TmV4dFNwb25zb3JlZENhcm91c2VsUHJvZHVjdEZyb21Jbml0aWFsQmlkLmJpbmQodW5kZWZpbmVkLCBsb2csXG4gICAgICAgICAgICByZXF1ZXN0QmlkcyxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICBpbml0aWFsQmlkLFxuICAgICAgICAgICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlXG4gICAgICAgIClcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBCdWlsZFJlY29tbWVuZGVkQ2Fyb3VzZWwgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICB0b3BQcm9kdWN0R2VuZXJhdG9yOiBOb25QZXJzb25hbFJlY29tbWVuZGVyRm4sXG4gICAgZm9yWW91UHJvZHVjdEdlbmVyYXRvcjogUGVyc29uYWxSZWNvbW1lbmRlckZuLFxuICAgIHBhc3RQdXJjaGFzZXNQcm9kdWN0R2VuZXJhdG9yOiBQZXJzb25hbFJlY29tbWVuZGVyRm4sXG4gICAgdXNlcklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcmVjb21tZW5kZXJUeXBlOiBQdWJsaWNSZWNvbW1lbmRlclR5cGVcbik6IFJlc3VsdDxJQnVpbHRDYXJvdXNlbD4gPT4ge1xuICAgIHN3aXRjaChyZWNvbW1lbmRlclR5cGUudHlwZSkge1xuICAgICAgICBjYXNlICd0b3AtcHJvZHVjdHMnOiB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRSZWNvbW1lbmRlZENhcm91c2VsSW50ZXJuYWwobG9nZ2VyLFxuICAgICAgICAgICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZWNvbW1lbmRlclR5cGU6ICd0b3AtcHJvZHVjdHMnLFxuICAgICAgICAgICAgICAgICAgICB0b3BQcm9kdWN0R2VuZXJhdG9yXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmb3IteW91Jzoge1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkUmVjb21tZW5kZWRDYXJvdXNlbEludGVybmFsKGxvZ2dlcixcbiAgICAgICAgICAgICAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlOiAnZm9yLXlvdScsXG4gICAgICAgICAgICAgICAgICAgIGZvcllvdVByb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHRvcFByb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncGFzdC1wdXJjaGFzZXMnOiB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRSZWNvbW1lbmRlZENhcm91c2VsSW50ZXJuYWwobG9nZ2VyLFxuICAgICAgICAgICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZWNvbW1lbmRlclR5cGU6ICdwYXN0LXB1cmNoYXNlcycsXG4gICAgICAgICAgICAgICAgICAgIHBhc3RQdXJjaGFzZXNQcm9kdWN0R2VuZXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICB0b3BQcm9kdWN0R2VuZXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICB1c2VySWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuY29uc3QgYnVpbGRSZWNvbW1lbmRlZENhcm91c2VsSW50ZXJuYWwgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICByZWNvbW1lbmRlclR5cGU6IFByb2R1Y3RSZWNvbW1lbmRlclxuKTogUmVzdWx0PElCdWlsdENhcm91c2VsPiA9PiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ2J1aWxkUmVjb21tZW5kZWRDYXJvdXNlbEludGVybmFsJyk7XG4gICAgbG9nPy5pbmZvKCdCdWlsZGluZyBSZWNvbW1lbmRlZCBDYXJvdXNlbCcpO1xuXG4gICAgcmV0dXJuIE9rKHtcbiAgICAgICAgdHlwZTogJ2Nhcm91c2VsJyxcbiAgICAgICAgZ2V0UHJvZHVjdDogZ2V0TmV4dFJlY29tbWVuZGVkQ2Fyb3VzZWxQcm9kdWN0LmJpbmQodW5kZWZpbmVkLCBsb2csXG4gICAgICAgICAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlLFxuICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlXG4gICAgICAgIClcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBCdWlsZEh5YnJpZENhcm91c2VsID0gKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlOiBFdmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlRm4sXG4gICAgcmVxdWVzdEJpZHM6IFJlcXVlc3RCaWRzRm4sXG4gICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlOiBHZW5lcmF0ZVNwb25zb3JlZFByb2R1Y3RDYXJkUmVzcG9uc2VGbixcbiAgICB0b3BQcm9kdWN0R2VuZXJhdG9yOiBOb25QZXJzb25hbFJlY29tbWVuZGVyRm4sXG4gICAgZm9yWW91UHJvZHVjdEdlbmVyYXRvcjogUGVyc29uYWxSZWNvbW1lbmRlckZuLFxuICAgIHBhc3RQdXJjaGFzZXNQcm9kdWN0R2VuZXJhdG9yOiBQZXJzb25hbFJlY29tbWVuZGVyRm4sXG4gICAgdXNlcklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcmVjb21tZW5kZXJUeXBlOiBQdWJsaWNSZWNvbW1lbmRlclR5cGUsXG4gICAgcmVxdWVzdDogSUJpZFJlcXVlc3Rcbik6IFJlc3VsdDxJQnVpbHRDYXJvdXNlbD4gPT4ge1xuICAgIHN3aXRjaCAocmVjb21tZW5kZXJUeXBlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAndG9wLXByb2R1Y3RzJzoge1xuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkSHlicmlkQ2Fyb3VzZWxJbnRlcm5hbChsb2dnZXIsXG4gICAgICAgICAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0QmlkcyxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGVyVHlwZTogJ3RvcC1wcm9kdWN0cycsXG4gICAgICAgICAgICAgICAgICAgIHRvcFByb2R1Y3RHZW5lcmF0b3JcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Zvci15b3UnOiB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRIeWJyaWRDYXJvdXNlbEludGVybmFsKGxvZ2dlcixcbiAgICAgICAgICAgICAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlOiAnZm9yLXlvdScsXG4gICAgICAgICAgICAgICAgICAgIGZvcllvdVByb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHRvcFByb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncGFzdC1wdXJjaGFzZXMnOiB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRIeWJyaWRDYXJvdXNlbEludGVybmFsKGxvZ2dlcixcbiAgICAgICAgICAgICAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlOiAncGFzdC1wdXJjaGFzZXMnLFxuICAgICAgICAgICAgICAgICAgICBwYXN0UHVyY2hhc2VzUHJvZHVjdEdlbmVyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgdG9wUHJvZHVjdEdlbmVyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgdXNlcklkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBCdWlsZEh5YnJpZENhcm91c2VsRnJvbUluaXRpYWxCaWQgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICByZXF1ZXN0QmlkczogUmVxdWVzdEJpZHNGbixcbiAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2U6IEdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZUZuLFxuICAgIHRvcFByb2R1Y3RHZW5lcmF0b3I6IE5vblBlcnNvbmFsUmVjb21tZW5kZXJGbixcbiAgICBmb3JZb3VQcm9kdWN0R2VuZXJhdG9yOiBQZXJzb25hbFJlY29tbWVuZGVyRm4sXG4gICAgcGFzdFB1cmNoYXNlc1Byb2R1Y3RHZW5lcmF0b3I6IFBlcnNvbmFsUmVjb21tZW5kZXJGbixcbiAgICB1c2VySWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICByZWNvbW1lbmRlclR5cGU6IFB1YmxpY1JlY29tbWVuZGVyVHlwZSxcbiAgICByZXF1ZXN0OiBJQmlkUmVxdWVzdCxcbiAgICBpbml0aWFsQmlkOiBJQmlkXG4pOiBSZXN1bHQ8SUJ1aWx0Q2Fyb3VzZWw+ID0+IHtcbiAgICBzd2l0Y2ggKHJlY29tbWVuZGVyVHlwZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3RvcC1wcm9kdWN0cyc6IHtcbiAgICAgICAgICAgIHJldHVybiBidWlsZEh5YnJpZENhcm91c2VsRnJvbUluaXRpYWxCaWRJbnRlcm5hbChsb2dnZXIsXG4gICAgICAgICAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0QmlkcyxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgICAgICBpbml0aWFsQmlkLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlOiAndG9wLXByb2R1Y3RzJyxcbiAgICAgICAgICAgICAgICAgICAgdG9wUHJvZHVjdEdlbmVyYXRvclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZm9yLXlvdSc6IHtcbiAgICAgICAgICAgIHJldHVybiBidWlsZEh5YnJpZENhcm91c2VsRnJvbUluaXRpYWxCaWRJbnRlcm5hbChsb2dnZXIsXG4gICAgICAgICAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0QmlkcyxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgICAgICBpbml0aWFsQmlkLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlOiAnZm9yLXlvdScsXG4gICAgICAgICAgICAgICAgICAgIGZvcllvdVByb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHRvcFByb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncGFzdC1wdXJjaGFzZXMnOiB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRIeWJyaWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkSW50ZXJuYWwobG9nZ2VyLFxuICAgICAgICAgICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdEJpZHMsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICAgICAgaW5pdGlhbEJpZCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGVyVHlwZTogJ3Bhc3QtcHVyY2hhc2VzJyxcbiAgICAgICAgICAgICAgICAgICAgcGFzdFB1cmNoYXNlc1Byb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHRvcFByb2R1Y3RHZW5lcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jb25zdCBidWlsZEh5YnJpZENhcm91c2VsSW50ZXJuYWwgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICByZXF1ZXN0QmlkczogUmVxdWVzdEJpZHNGbixcbiAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2U6IEdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZUZuLFxuICAgIHJlcXVlc3Q6IElCaWRSZXF1ZXN0LFxuICAgIHJlY29tbWVuZGVyVHlwZTogUHJvZHVjdFJlY29tbWVuZGVyXG4pOiBSZXN1bHQ8SUJ1aWx0Q2Fyb3VzZWw+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnQnVpbGRIeWJyaWRDYXJvdXNlbCcpO1xuICAgIGxvZz8uaW5mbygnQnVpbGRpbmcgaHlicmlkIGNhcm91c2VsJywgcmVxdWVzdCwgcmVjb21tZW5kZXJUeXBlKTtcbiAgICByZXR1cm4gT2soe1xuICAgICAgICB0eXBlOiAnY2Fyb3VzZWwnLFxuICAgICAgICBnZXRQcm9kdWN0OiBnZXROZXh0SHlicmlkQ2Fyb3VzZWxQcm9kdWN0LmJpbmQodW5kZWZpbmVkLCBsb2csXG4gICAgICAgICAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlLFxuICAgICAgICAgICAgcmVxdWVzdEJpZHMsXG4gICAgICAgICAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UsXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlXG4gICAgICAgIClcbiAgICB9KTtcbn07XG5cbmNvbnN0IGJ1aWxkSHlicmlkQ2Fyb3VzZWxGcm9tSW5pdGlhbEJpZEludGVybmFsID0gKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlOiBFdmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlRm4sXG4gICAgcmVxdWVzdEJpZHM6IFJlcXVlc3RCaWRzRm4sXG4gICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlOiBHZW5lcmF0ZVNwb25zb3JlZFByb2R1Y3RDYXJkUmVzcG9uc2VGbixcbiAgICByZXF1ZXN0OiBJQmlkUmVxdWVzdCxcbiAgICBpbml0aWFsQmlkOiBJQmlkLFxuICAgIHJlY29tbWVuZGVyVHlwZTogUHJvZHVjdFJlY29tbWVuZGVyXG4pOiBSZXN1bHQ8SUJ1aWx0Q2Fyb3VzZWw+ID0+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnQnVpbGRIeWJyaWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkJyk7XG4gICAgbG9nPy5pbmZvKCdCdWlsZGluZyBoeWJyaWQgY2Fyb3VzZWwgZnJvbSBiaWQnLCByZXF1ZXN0LCByZWNvbW1lbmRlclR5cGUsIGluaXRpYWxCaWQpO1xuICAgIHJldHVybiBPayh7XG4gICAgICAgIHR5cGU6ICdjYXJvdXNlbCcsXG4gICAgICAgIGdldFByb2R1Y3Q6IGdldE5leHRIeWJyaWRDYXJvdXNlbFByb2R1Y3RGcm9tSW5pdGlhbEJpZC5iaW5kKHVuZGVmaW5lZCwgbG9nLFxuICAgICAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICAgICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIGluaXRpYWxCaWQsXG4gICAgICAgICAgICByZWNvbW1lbmRlclR5cGVcbiAgICAgICAgKVxuICAgIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiogZ2V0TmV4dEh5YnJpZENhcm91c2VsUHJvZHVjdChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZTogRXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZUZuLFxuICAgIHJlcXVlc3RCaWRzOiBSZXF1ZXN0Qmlkc0ZuLFxuICAgIGdlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZTogR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlRm4sXG4gICAgcmVxdWVzdDogSUJpZFJlcXVlc3QsXG4gICAgcmVjb21tZW5kZXJUeXBlOiBQcm9kdWN0UmVjb21tZW5kZXJcbik6IEFzeW5jR2VuZXJhdG9yPElCdWlsdFByb2R1Y3RDYXJkUmVzcG9uc2U+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZ2V0TmV4dEh5YnJpZENhcm91c2VsUHJvZHVjdCcpO1xuICAgIGxvZz8uaW5mbygnRW50ZXJpbmcgaHlicmlkIGNhcm91c2VsIHByb2R1Y3QgZ2VuZXJhdG9yJyk7XG5cbiAgICB5aWVsZCogZ2V0TmV4dFNwb25zb3JlZENhcm91c2VsUHJvZHVjdChsb2csXG4gICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UsXG4gICAgICAgIHJlcXVlc3RcbiAgICApO1xuICAgIGxvZz8uaW5mbygnRG9uZSBnZXR0aW5nIG5leHQgc3BvbnNvcmVkQ2Fyb3VzZWxQcm9kdWN0Jyk7XG5cbiAgICB5aWVsZCogZ2V0TmV4dFJlY29tbWVuZGVkQ2Fyb3VzZWxQcm9kdWN0KGxvZyxcbiAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgcmVjb21tZW5kZXJUeXBlXG4gICAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24qIGdldE5leHRIeWJyaWRDYXJvdXNlbFByb2R1Y3RGcm9tSW5pdGlhbEJpZChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZTogRXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZUZuLFxuICAgIHJlcXVlc3RCaWRzOiBSZXF1ZXN0Qmlkc0ZuLFxuICAgIGdlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZTogR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlRm4sXG4gICAgcmVxdWVzdDogSUJpZFJlcXVlc3QsXG4gICAgaW5pdGlhbEJpZDogSUJpZCxcbiAgICByZWNvbW1lbmRlclR5cGU6IFByb2R1Y3RSZWNvbW1lbmRlclxuKTogQXN5bmNHZW5lcmF0b3I8SUJ1aWx0UHJvZHVjdENhcmRSZXNwb25zZT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdnZXROZXh0SHlicmlkQ2Fyb3VzZWxQcm9kdWN0Jyk7XG4gICAgbG9nPy5pbmZvKCdFbnRlcmluZyBoeWJyaWQgY2Fyb3VzZWwgcHJvZHVjdCBnZW5lcmF0b3InKTtcblxuICAgIHlpZWxkKiBnZXROZXh0U3BvbnNvcmVkQ2Fyb3VzZWxQcm9kdWN0RnJvbUluaXRpYWxCaWQobG9nLFxuICAgICAgICByZXF1ZXN0QmlkcyxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgaW5pdGlhbEJpZCxcbiAgICAgICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICk7XG4gICAgbG9nPy5pbmZvKCdEb25lIGdldHRpbmcgbmV4dCBzcG9uc29yZWRDYXJvdXNlbFByb2R1Y3QnKTtcblxuICAgIHlpZWxkKiBnZXROZXh0UmVjb21tZW5kZWRDYXJvdXNlbFByb2R1Y3QobG9nLFxuICAgICAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlLFxuICAgICAgICByZWNvbW1lbmRlclR5cGVcbiAgICApO1xufVxuYXN5bmMgZnVuY3Rpb24gKmdldE5leHRTcG9uc29yZWRDYXJvdXNlbFByb2R1Y3QoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHJlcXVlc3RCaWRzOiBSZXF1ZXN0Qmlkc0ZuLFxuICAgIGdlbmVyYXRlUHJvZHVjdENhcmRSZXNwb25zZTogR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlRm4sXG4gICAgcmVxdWVzdDogSUJpZFJlcXVlc3Rcbik6IEFzeW5jR2VuZXJhdG9yPElCdWlsdFByb2R1Y3RDYXJkQmlkUmVzcG9uc2U+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZ2V0TmV4dFNwb25zb3JlZENhcm91c2VsUHJvZHVjdCcpO1xuICAgIHRyeSB7XG4gICAgICAgIGxvZz8uaW5mbygnRW50ZXJpbmcgc3BvbnNvcmVkIGNhcm91c2VsIHByb2R1Y3QgZ2VuZXJhdG9yJyk7XG4gICAgICAgIHdoaWxlKHRydWUpIHtcbiAgICAgICAgICAgIGxvZz8uaW5mbygnR2V0dGluZyBuZXh0IHNwb25zb3JlZCBjYXJvdXNlbCBwcm9kdWN0cycsIHJlcXVlc3QpO1xuXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RCaWRzKHJlcXVlc3QpO1xuICAgICAgICAgICAgaWYoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgbG9nPy5pbmZvKCdObyByZXNwb25zZSBmcm9tIGJpZGRlcicsIHJlc3BvbnNlLmVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGJpZHMgPSByZXNwb25zZS52YWx1ZS5zZWF0YmlkPy5bMF0/LmJpZDtcbiAgICAgICAgICAgIGlmKGJpZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGxvZz8uaW5mbygnR290IG5vIGJpZHMgaW4gcmVzcG9uc2UhJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBnZW5lcmF0b3IgPSBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UoYmlkcyk7XG4gICAgICAgICAgICBmb3IgYXdhaXQoY29uc3QgcHJvZHVjdCBvZiBnZW5lcmF0b3IpIHtcbiAgICAgICAgICAgICAgICBsb2c/LmRlYnVnKCdHZXR0aW5nIG5leHQgcHJvZHVjdCBmcm9tIGV4aXN0aW5nIGJpZGRlciByZXNwb25zZScsIHByb2R1Y3QpO1xuICAgICAgICAgICAgICAgIHlpZWxkIHByb2R1Y3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2c/LmRlYnVnKCdPdXQgb2YgYmlkcyBmcm9tIHByZXZpb3VzIHJlc3BvbnNlLiBSZXF1ZXN0aW5nIG5ldyBiaWQgcmVzcG9uc2UnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2goZXJyKSB7XG4gICAgICAgIGxvZz8uZXJyb3IoJ3Byb2R1Y3QgY2Fyb3VzZWwgZ2VuZXJhdG9yIGZhaWxlZCEgR290JywgZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBsb2c/Lndhcm4oJ0V4aXRpbmcgY2Fyb3VzZWwgcHJvZHVjdCBnZW5lcmF0b3InKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uICpnZXROZXh0U3BvbnNvcmVkQ2Fyb3VzZWxQcm9kdWN0RnJvbUluaXRpYWxCaWQoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIHJlcXVlc3RCaWRzOiBSZXF1ZXN0Qmlkc0ZuLFxuICAgIHJlcXVlc3Q6IElCaWRSZXF1ZXN0LFxuICAgIGluaXRpYWxCaWQ6IElCaWQsXG4gICAgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlOiBHZW5lcmF0ZVNwb25zb3JlZFByb2R1Y3RDYXJkUmVzcG9uc2VGblxuKTogQXN5bmNHZW5lcmF0b3I8SUJ1aWx0UHJvZHVjdENhcmRCaWRSZXNwb25zZT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdnZXROZXh0U3BvbnNvcmVkQ2Fyb3VzZWxQcm9kdWN0RnJvbVJlc3BvbnNlJyk7XG4gICAgbG9nPy5pbmZvKCdHZW5lcmF0aW5nIHNwb25zb3JlZCBwcm9kdWN0IGNhcmRzIGZyb20gaW5pdGlhbCBiaWQgcmVzcG9uc2UnKTtcbiAgICBsb2c/LmRlYnVnKGluaXRpYWxCaWQpO1xuICAgIHlpZWxkKiBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UoW2luaXRpYWxCaWRdKTtcbiAgICB5aWVsZCogZ2V0TmV4dFNwb25zb3JlZENhcm91c2VsUHJvZHVjdChsb2dnZXIsXG4gICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICBnZW5lcmF0ZVByb2R1Y3RDYXJkUmVzcG9uc2UsXG4gICAgICAgIHJlcXVlc3RcbiAgICApO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gKmdldE5leHRSZWNvbW1lbmRlZENhcm91c2VsUHJvZHVjdChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZTogRXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZUZuLFxuICAgIHJlY29tbWVuZGVyVHlwZTogUHJvZHVjdFJlY29tbWVuZGVyXG4pOiBBc3luY0dlbmVyYXRvcjxJQnVpbHRQcm9kdWN0Q2FyZFJlc3BvbnNlPiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ2dldE5leHRSZWNvbW1lbmRlZENhcm91c2VsUHJvZHVjdCcpO1xuICAgIGxvZz8uaW5mbygnRW50ZXJpbmcgcmVjb21tZW5kZWQgY2Fyb3VzZWwgcHJvZHVjdCBnZW5lcmF0b3InKTtcbiAgICBsb2c/LmluZm8oJ0dldHRpbmcgbmV4dCByZWNvbW1lbmRlZCBjYXJvdXNlbCBwcm9kdWN0Jyk7XG4gICAgc3dpdGNoIChyZWNvbW1lbmRlclR5cGUucmVjb21tZW5kZXJUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3RvcC1wcm9kdWN0cyc6IHtcbiAgICAgICAgICAgIHlpZWxkKiBnZXROZXh0VG9wQWxsUmVjb21tZW5kZWRDYXJvdXNlbFByb2R1Y3QobG9nLFxuICAgICAgICAgICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Zvci15b3UnOiB7XG4gICAgICAgICAgICBpZiAocmVjb21tZW5kZXJUeXBlLnVzZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgeWllbGQqIGdldE5leHRGb3JZb3VSZWNvbW1lbmRlZENhcm91c2VsUHJvZHVjdChsb2csXG4gICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGVyVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlLnVzZXJJZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdwYXN0LXB1cmNoYXNlcyc6IHtcbiAgICAgICAgICAgIGlmIChyZWNvbW1lbmRlclR5cGUudXNlcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogZ2V0TmV4dFBhc3RQdXJjaGFzZXNSZWNvbW1lbmRlZENhcm91c2VsUHJvZHVjdChsb2csXG4gICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGVyVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kZXJUeXBlLnVzZXJJZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiBmYWxsYmFjayBjYXNlIGlmIHRoZSBvdGhlciBvbmVzIHlpZWxkIG5vdGhpbmcsIG9yIGlmIHVzZXIgSUQgaXMgbm90IHNldCAqL1xuICAgIHlpZWxkKiBnZXROZXh0VG9wQWxsUmVjb21tZW5kZWRDYXJvdXNlbFByb2R1Y3QobG9nLFxuICAgICAgICBldmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlLFxuICAgICAgICB7XG4gICAgICAgICAgICByZWNvbW1lbmRlclR5cGU6ICd0b3AtcHJvZHVjdHMnLFxuICAgICAgICAgICAgdG9wUHJvZHVjdEdlbmVyYXRvcjogcmVjb21tZW5kZXJUeXBlLnRvcFByb2R1Y3RHZW5lcmF0b3JcbiAgICAgICAgfVxuICAgICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uKiBnZXROZXh0VG9wQWxsUmVjb21tZW5kZWRDYXJvdXNlbFByb2R1Y3QoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICByZWNvbW1lbmRlclR5cGU6IElUb3BQcm9kdWN0UmVjb21tZW5kZXJcbik6IEFzeW5jR2VuZXJhdG9yPElCdWlsdFByb2R1Y3RDYXJkUmVzcG9uc2U+IHtcbiAgICBjb25zdCBsb2cgPSBDdHgobG9nZ2VyKT8ud2l0aCgnZ2V0TmV4dFRvcEFsbFJlY29tbWVuZGVkQ2Fyb3VzZWxQcm9kdWN0Jyk7XG4gICAgbG9nPy5pbmZvKCdHZXR0aW5nIG5leHQgdG9wIGFsbCBwcm9kdWN0Jyk7XG4gICAgZm9yIGF3YWl0IChjb25zdCBwcm9kdWN0IG9mIHJlY29tbWVuZGVyVHlwZS50b3BQcm9kdWN0R2VuZXJhdG9yKCkpIHtcbiAgICAgICAgY29uc3QgYnVpbHQgPSByZWNvbW1lbmRlZFByb2R1Y3RUb0J1aWx0UHJvZHVjdChsb2csIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsIHByb2R1Y3QpO1xuICAgICAgICBpZiAoIWJ1aWx0Lm9rKSB7XG4gICAgICAgICAgICBsb2c/Lndhcm4oJ0ZhaWxlZCB0byBidWlsZCBwcm9kdWN0IHJlc3BvbnNlIGZyb20gcmVjb21tZW5kZWQgcHJvZHVjdC4gU2tpcHBpbmcgdGhpcyBvbmUnLCBwcm9kdWN0KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkIGJ1aWx0LnZhbHVlO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24qIGdldE5leHRGb3JZb3VSZWNvbW1lbmRlZENhcm91c2VsUHJvZHVjdChcbiAgICBsb2dnZXI6IElMb2dnZXIgfCB1bmRlZmluZWQsXG4gICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZTogRXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZUZuLFxuICAgIHJlY29tbWVuZGVyVHlwZTogSUZvcllvdVByb2R1Y3RSZWNvbW1lbmRlcixcbiAgICB1c2VySWQ6IHN0cmluZ1xuKTogQXN5bmNHZW5lcmF0b3I8SUJ1aWx0UHJvZHVjdENhcmRSZXNwb25zZT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdnZXROZXh0Rm9yWW91UmVjb21tZW5kZWRDYXJvdXNlbFByb2R1Y3QnKTtcbiAgICBsb2c/LmluZm8oJ0dldHRpbmcgbmV4dCBcImZvci15b3VcIiByZWNvbW1lbmRlZCBwcm9kdWN0Jyk7XG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IHByb2R1Y3Qgb2YgcmVjb21tZW5kZXJUeXBlLmZvcllvdVByb2R1Y3RHZW5lcmF0b3IodXNlcklkKSkge1xuICAgICAgICBjb25zdCBidWlsdCA9IHJlY29tbWVuZGVkUHJvZHVjdFRvQnVpbHRQcm9kdWN0KGxvZywgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSwgcHJvZHVjdCk7XG4gICAgICAgIGlmICghYnVpbHQub2spIHtcbiAgICAgICAgICAgIGxvZz8ud2FybignRmFpbGVkIHRvIGJ1aWxkIHByb2R1Y3QgcmVzcG9uc2UgZnJvbSByZWNvbW1lbmRlZCBwcm9kdWN0LiBTa2lwcGluZyB0aGlzIG9uZScsIHByb2R1Y3QpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQgYnVpbHQudmFsdWU7XG4gICAgfVxuICAgIC8qIFVzZSB0b3AtYWxsIGFzIGZhbGxiYWNrICovXG4gICAgeWllbGQqIGdldE5leHRUb3BBbGxSZWNvbW1lbmRlZENhcm91c2VsUHJvZHVjdChsb2csXG4gICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlY29tbWVuZGVyVHlwZTogJ3RvcC1wcm9kdWN0cycsXG4gICAgICAgICAgICB0b3BQcm9kdWN0R2VuZXJhdG9yOiByZWNvbW1lbmRlclR5cGUudG9wUHJvZHVjdEdlbmVyYXRvclxuICAgICAgICB9XG4gICAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24qIGdldE5leHRQYXN0UHVyY2hhc2VzUmVjb21tZW5kZWRDYXJvdXNlbFByb2R1Y3QoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICByZWNvbW1lbmRlclR5cGU6IElQYXN0UHVyY2hhc2VzUHJvZHVjdFJlY29tbWVuZGVyLFxuICAgIHVzZXJJZDogc3RyaW5nXG4pOiBBc3luY0dlbmVyYXRvcjxJQnVpbHRQcm9kdWN0Q2FyZFJlc3BvbnNlPiB7XG4gICAgY29uc3QgbG9nID0gQ3R4KGxvZ2dlcik/LndpdGgoJ2dldE5leHRQYXN0UHVyY2hhc2VzUmVjb21tZW5kZWRDYXJvdXNlbFByb2R1Y3QnKTtcbiAgICBsb2c/LmluZm8oJ0dldHRpbmcgbmV4dCBcImJ1eS1hZ2FpblwiIHJlY29tbWVuZGVkIHByb2R1Y3QnKTtcblxuICAgIGZvciBhd2FpdCAoY29uc3QgcHJvZHVjdCBvZiByZWNvbW1lbmRlclR5cGUucGFzdFB1cmNoYXNlc1Byb2R1Y3RHZW5lcmF0b3IodXNlcklkKSkge1xuICAgICAgICBjb25zdCBidWlsdCA9IHJlY29tbWVuZGVkUHJvZHVjdFRvQnVpbHRQcm9kdWN0KGxvZywgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSwgcHJvZHVjdCk7XG4gICAgICAgIGlmICghYnVpbHQub2spIHtcbiAgICAgICAgICAgIGxvZz8ud2FybignRmFpbGVkIHRvIGJ1aWxkIHByb2R1Y3QgcmVzcG9uc2UgZnJvbSByZWNvbW1lbmRlZCBwcm9kdWN0LiBTa2lwcGluZyB0aGlzIG9uZScsIHByb2R1Y3QpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQgYnVpbHQudmFsdWU7XG4gICAgfVxuXG4gICAgeWllbGQqIGdldE5leHRUb3BBbGxSZWNvbW1lbmRlZENhcm91c2VsUHJvZHVjdChsb2csXG4gICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlY29tbWVuZGVyVHlwZTogJ3RvcC1wcm9kdWN0cycsXG4gICAgICAgICAgICB0b3BQcm9kdWN0R2VuZXJhdG9yOiByZWNvbW1lbmRlclR5cGUudG9wUHJvZHVjdEdlbmVyYXRvclxuICAgICAgICB9XG4gICAgKTtcbn1cblxuY29uc3QgcmVjb21tZW5kZWRQcm9kdWN0VG9CdWlsdFByb2R1Y3QgPSAoXG4gICAgbG9nZ2VyOiBJTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICBwcm9kdWN0OiBJUHJvZHVjdEluZm9ybWF0aW9uXG4pOiBSZXN1bHQ8SUJ1aWx0UHJvZHVjdENhcmRSZXNwb25zZT4gPT4ge1xuICAgIGNvbnN0IGxvZyA9IEN0eChsb2dnZXIpPy53aXRoKCdyZWNvbW1lbmRlZFByb2R1Y3RUb0J1aWx0UHJvZHVjdCcpO1xuICAgIGxvZz8uaW5mbygnQ29udmVydGluZyByZWNvbW1lbmRlZCBwcm9kdWN0IHRvIGJ1aWx0IHByb2R1Y3QgY2FyZCByZXNwb25zZScpO1xuXG4gICAgY29uc3QgY2xpY2t0aHJvdWdoID0gZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZShwcm9kdWN0KTtcbiAgICBpZiAoIWNsaWNrdGhyb3VnaC5vaykge1xuICAgICAgICByZXR1cm4gY2xpY2t0aHJvdWdoO1xuICAgIH1cbiAgICByZXR1cm4gT2soe1xuICAgICAgICB0eXBlOiAncHJvZHVjdC1jYXJkJyxcbiAgICAgICAgY2xpY2t0aHJvdWdoOiBjbGlja3Rocm91Z2gudmFsdWUgKyAnX3JlY29tbWVuZGVkJyxcbiAgICAgICAgcHJvZHVjdCxcbiAgICAgICAgc3BvbnNvcmVkOiBmYWxzZVxuICAgIH0pO1xufTtcblxuZXhwb3J0IGNsYXNzIEludmFsaWRSZWNvbW1lbmRlclR5cGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdHlwZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCdDb3VsZCBub3QgZ2VuZXJhdGUgY2Fyb3VzZWw7IGludmFsaWQgcmVjb21tZW5kZXIgdHlwZSBcIicgKyB0eXBlICsgJ1wiJyk7XG4gICAgfVxufTtcbiIsCiAgICAiY29uc3QgREVGQVVMVF9NQVhfU0xVRzogbnVtYmVyID0gNTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgcGFzc2VkIHN0cmluZyB0byBhIHNsdWcgd2l0aCB0aGUgc3BlY2lmaWVkIG9wdGlvbnMuIEJ5IGRlZmF1bHQsIHRoZSBzbHVnIGlzIGh5cGhlbmF0ZWQgYW5kIG9ubHlcbiAqIGNvbnRhaW5zIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBZb3UgY2FuIHBhc3MgYSBkaWZmZXJlbnQgaHlwaGVuYXRpb24gcmVnZXggYW5kIGEgZGlmZmVyZW50IGRyb3AgcmVnZXggdG9cbiAqIGN1c3RvbWl6ZSB0aGUgc2x1Zy4gRm9yIGV4YW1wbGUsIHt7c2x1ZyBcIk15IFByb2R1Y3QgTmFtZVwifX0gd2lsbCByZXR1cm4gXCJteS1wcm9kdWN0LW5hbWVcIi5cbiAqXG4gKiBUbyBjaGFuZ2Ugd2hpY2ggY2hhcmFjdGVycyBhcmUgY29udmVydGVkIHRvIGh5cGhlbnMsIHlvdSBjYW4gcGFzcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB0aGUgaHlwaGVuYXRlIG9wdGlvbi5cbiAqIEZvciBleGFtcGxlLCB7e3NsdWcgXCJNeSBQcm9kdWN0J3MgTmFtZVwiIGh5cGhlbmF0ZT1cIltcXHMnXVwifX0gd2lsbCByZXR1cm4gXCJteS1wcm9kdWN0LXMtbmFtZVwiLlxuICogVGhlIGRlZmF1bHQgaHlwaGVuYXRlIHJlZ2V4IGlzIC9bXFxzX1xcLSxdL2lnLlxuICpcbiAqIFRvIHJlbW92ZSBjaGFyYWN0ZXJzIGluc3RlYWQgb2YgaHlwaGVuYXRlIHRoZW0sIHlvdSBjYW4gcGFzcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB0aGUgZHJvcCBvcHRpb24uXG4gKiBGb3IgZXhhbXBsZSwge3tzbHVnIFwiTXkgUHJvZHVjdCdzIE5hbWVcIiBkcm9wPVwiW15BLVphLXowLTlcXHMnXVwifX0gd2lsbCByZXR1cm4gXCJteS1wcm9kdWN0J3MtbmFtZVwiLlxuICogVGhlIGRlZmF1bHQgZHJvcCByZWdleCBpcyAvW15BLVphLXowLTlcXC1dL2lnLlxuICpcbiAqIFRvIGxpbWl0IHRoZSBtYXggbnVtYmVyIG9mIGh5cGhlbmF0ZWQgc2x1ZyBjb21wb25lbnRzIHJldHVybmVkLCB5b3UgY2FuIHBhc3MgYSBsZW5ndGggb3B0aW9uLlxuICogRm9yIGV4YW1wbGUsIHt7c2x1ZyBcIk15IFByb2R1Y3QncyBOYW1lXCIgbGVuZ3RoPTJ9fSB3aWxsIHJldHVybiBcIm15LXByb2R1Y3RcIi5cbiAqIFRoZSBkZWZhdWx0IGxlbmd0aCBpcyA1LlxuICpcbiAqIEBwYXJhbSBuYW1lIFRoZSBzdHJpbmcgdG8gYmUgc2x1Z2lmaWVkXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBvYmplY3QuIENhbiB0YWtlIFwiaHlwZW5hdGVcIiwgXCJkcm9wXCIsIGFuZCBcImxlbmd0aFwiIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgc2x1Z2lmaWVkIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2x1ZyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczoge1xuICAgICAgICBoYXNoOiB7XG4gICAgICAgICAgICBoeXBoZW5hdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGRyb3A6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGRyb3BCZWZvcmU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGxlbmd0aDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgc2VwYXJhdG9yOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICB9XG4pOiBzdHJpbmcge1xuICAgIGlmIChuYW1lID09PSB1bmRlZmluZWQgfHwgbmFtZSA9PT0gbnVsbCB8fCB0eXBlb2YgKG5hbWUpICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgaHlwaGVuYXRlOiBSZWdFeHAgPSBvcHRpb25zLmhhc2guaHlwaGVuYXRlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBuZXcgUmVnRXhwKG9wdGlvbnMuaGFzaC5oeXBoZW5hdGUsICdpZycpXG4gICAgICAgIDogL1tcXHNfXFwtLF0vaWc7XG5cbiAgICBjb25zdCBkcm9wOiBSZWdFeHAgPSBvcHRpb25zLmhhc2guZHJvcCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IFJlZ0V4cChvcHRpb25zLmhhc2guZHJvcCwgJ2lnJylcbiAgICAgICAgOiAvW15BLVphLXowLTktXS9pZztcblxuICAgIGNvbnN0IGRyb3BCZWZvcmUgPSBvcHRpb25zLmhhc2guZHJvcEJlZm9yZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IFJlZ0V4cChvcHRpb25zLmhhc2guZHJvcEJlZm9yZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBtYXhTbHVnOiBudW1iZXIgPSBvcHRpb25zLmhhc2gubGVuZ3RoID8/IERFRkFVTFRfTUFYX1NMVUc7XG5cbiAgICBjb25zdCBzZXBhcmF0b3IgPSBvcHRpb25zLmhhc2guc2VwYXJhdG9yID8/ICctJztcbiAgICBpZiAoZHJvcEJlZm9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoZHJvcEJlZm9yZSwgJycpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZVxuICAgICAgICAucmVwbGFjZShoeXBoZW5hdGUsIHNlcGFyYXRvcilcbiAgICAgICAgLnJlcGxhY2UoZHJvcCwgJycpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC5zcGxpdChzZXBhcmF0b3IpXG4gICAgICAgIC5zbGljZSgwLCBtYXhTbHVnKVxuICAgICAgICAuam9pbihzZXBhcmF0b3IpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBwYXNzZWQgc3RyaW5nIHRvIGxvd2VyY2FzZS4gRm9yIGV4YW1wbGUsIHt7bG93ZXIgXCJNeSBQcm9kdWN0IE5hbWVcIn19IHdpbGwgcmV0dXJuIFwibXkgcHJvZHVjdCBuYW1lXCIuXG4gKlxuICogQHBhcmFtIG5hbWUgVGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlXG4gKiBAcmV0dXJucyBBIGxvd2VyY2FzZSB2ZXJzaW9uIG9mIHRoZSBwYXNzZWQgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb3dlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChuYW1lID09PSB1bmRlZmluZWQgfHwgbmFtZSA9PT0gbnVsbCB8fCB0eXBlb2YgKG5hbWUpICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cHBlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChuYW1lID09PSB1bmRlZmluZWQgfHwgbmFtZSA9PT0gbnVsbCB8fCB0eXBlb2YgKG5hbWUpICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBuYW1lLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGF0aCBjb21wb25lbnQgb2YgdGhlIFVSTCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLCAxLWluZGV4ZWRcbiAqIEZvciBleGFtcGxlLCBpZiB0aGUgVVJMIGlzIFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9mb28vYmFyXCIsIHt7cGF0aCAxfX0gd2lsbCByZXR1cm4gXCJmb29cIi5cbiAqXG4gKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIG9mIHRoZSBwYXRoIGNvbXBvbmVudCB0byByZXR1cm4sIDEtaW5kZXhlZFxuICogQHJldHVybnMgVGhlIHBhdGggY29tcG9uZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGgocG9zaXRpb246IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHBvc2l0aW9uID09PSAwIHx8IHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb24gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBwYXRocyA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zcGxpdCgnLycpO1xuICAgIGlmIChwYXRocy5sZW5ndGggPD0gcG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aHNbcG9zaXRpb25dO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VkKGlucHV0OiBzdHJpbmcsIHNlYXJjaFJlZ2V4OiBzdHJpbmcsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKG5ldyBSZWdFeHAoc2VhcmNoUmVnZXgpLCAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCBFTkQgPSAtMjtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gYXJncy5zbGljZSgxLCBFTkQpIGFzIHN0cmluZ1tdOyAvLyBFeHRyYWN0IGNhcHR1cmUgZ3JvdXBzXG4gICAgICAgIGxldCByZXN1bHQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHJlcGxhY2VtZW50O1xuXG4gICAgICAgIC8vIFJlcGxhY2UgYmFja3JlZmVyZW5jZXMgKFxcMSwgXFwyLCBldGMuKVxuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXFxcXChcXGQrKS9nLCAoXywgZ3JvdXBJbmRleCkgPT4gZ3JvdXBzW2dyb3VwSW5kZXggLSAxXSA/PyAnJyk7XG5cbiAgICAgICAgLy8gU3VwcG9ydCBmb3IgXFxVICh1cHBlcmNhc2UgdHJhbnNmb3JtYXRpb24pXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXFxcVShcXGQrKS9nLCAoXywgZ3JvdXBJbmRleCkgPT5cbiAgICAgICAgICAgIChncm91cHNbZ3JvdXBJbmRleCAtIDFdID8/ICcnKS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICk7XG5cbiAgICAgICAgcmVzdWx0ID0gc2VkQ29tbWFuZChyZXN1bHQsICdVJywgZ3JvdXBzLCBzdHIgPT4gc3RyPy50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgcmVzdWx0ID0gc2VkQ29tbWFuZChyZXN1bHQsICdMJywgZ3JvdXBzLCBzdHIgPT4gc3RyPy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgcmVzdWx0ID0gc2VkQ29tbWFuZChyZXN1bHQsICdJJywgZ3JvdXBzLCBzdHIgPT4gc3RyPy5bMF0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQgPz8gJyc7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlKGlucHV0OiBzdHJpbmcsIHNlYXJjaDogc3RyaW5nLCByZXBsYWNlbWVudDogc3RyaW5nLCBhbGw6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICBpZihpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYoc2VhcmNoID09PSBudWxsIHx8IHNlYXJjaCA9PT0gdW5kZWZpbmVkIHx8IHJlcGxhY2VtZW50ID09PSBudWxsIHx8IHJlcGxhY2VtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cblxuICAgIGlmKGFsbCkge1xuICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZUFsbChzZWFyY2gsIHJlcGxhY2VtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2Uoc2VhcmNoLCByZXBsYWNlbWVudCk7XG59XG5cbmZ1bmN0aW9uIHNlZENvbW1hbmQoXG4gICAgaW5wdXQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjaGFyOiBzdHJpbmcsXG4gICAgZ3JvdXBzOiBzdHJpbmdbXSxcbiAgICB0cmFuc2Zvcm06IChpbnB1dDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXFxcXFwke2NoYXJ9KFxcXFxkKylgLCAnZycpLCAoXywgZ3JvdXBJbmRleCkgPT5cbiAgICAgICAgdHJhbnNmb3JtKGdyb3Vwc1tncm91cEluZGV4IC0gMV0gPz8gJycpID8/ICcnXG4gICAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHBhcmFtZXRlciBmcm9tIHRoZSBVUkwsIHNwZWNpZmllZCBieSBrZXkuXG4gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIFVSTCBpcyBcImh0dHBzOi8vZXhhbXBsZS5jb20/Zm9vPWJhclwiLCB7e3NlYXJjaCBcImZvb1wifX0gd2lsbCByZXR1cm4gXCJiYXJcIi5cbiAqXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIHRvIHJldHVyblxuICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VhcmNoKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKG5hbWU/Lmxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaDtcbiAgICBpZiAoc2VhcmNoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoc2VhcmNoKTtcbiAgICByZXR1cm4gcGFyYW1zLmdldChuYW1lKSA/PyAnJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCB0cnV0aHkgYXJndW1lbnQsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBhbGwgYXJndW1lbnRzIGFyZSBmYWxzeS4gUmV0dXJucyBmYWxzZSBmb3IgZW1wdHkgc3RyaW5nc1xuICogRm9yIGV4YW1wbGUsIHt7Y29hbGVzY2UgZmFsc2UgKGVxIFwiYlwiIFwiZFwiKSBjfX0gd2lsbCByZXR1cm4gXCJjXCIsIGJlY2F1c2UgZmFsc2UgaXMgZmFsc3ksIFwiYlwiIGlzIG5vdCBlcXVhbCB0byBcImRcIixcbiAqIGFuZCBjIGlzIHRydXRoeS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZmlyc3QgdHJ1dGh5IGFyZ3VtZW50LCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgYWxsIGFyZ3VtZW50cyBhcmUgZmFsc3lcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvYWxlc2NlKCk6IHN0cmluZyB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgaWYgKGFyZyAhPT0gbnVsbCAmJiBhcmcgIT09IHVuZGVmaW5lZCAmJiBhcmcgIT09ICcnICYmIGFyZyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIEpvaW5zIHRoZSBwYXNzZWQgYXJndW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCBzZXBhcmF0b3IuXG4gKiBGb3IgZXhhbXBsZSwge3tqb2luIFwiZm9vXCIgXCJiYXJcIiBcImJhelwifX0gd2lsbCByZXR1cm4gXCJmb28vYmFyL2JhelwiLi5cbiAqXG4gKiBUaGVyZSBpcyBhbiBvcHRpb25hbCBcInNlcGFyYXRvclwiIGFyZ3VtZW50IHRoYXQgY2FuIGJlIHBhc3NlZCB0byBjaGFuZ2UgdGhlIHNlcGFyYXRvci4gRm9yIGV4YW1wbGUsXG4gKiB7e2pvaW4gXCJmb29cIiBcImJhclwiIFwiYmF6XCIgc2VwYXJhdG9yPVwiLFwifX0gd2lsbCByZXR1cm4gXCJmb28sYmFyLGJhelwiLlxuICpcbiAqIEByZXR1cm5zIFRoZSBqb2luZWQgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2luKCk6IHN0cmluZyB7XG4gICAgY29uc3QgYXJncyA9IFsuLi5hcmd1bWVudHNdLnNsaWNlKDAsIGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBjb25zdCBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsgLyogb3B0aW9ucyBpcyBhbHdheXMgdGhlIGxhc3QgYXJndW1lbnQgKi9cbiAgICBjb25zdCBzZXBhcmF0b3IgPSBvcHRpb25zLmhhc2guc2VwYXJhdG9yIGFzIHN0cmluZyA/PyAnLyc7XG4gICAgcmV0dXJuIGFyZ3NcbiAgICAgICAgLmZpbHRlcihhcmcgPT4gYXJnICE9PSB1bmRlZmluZWQgJiYgYXJnICE9PSBudWxsICYmIGFyZyAhPT0gJycpIC8qIGZpbHRlciBvdXQgbnVsbHMgYW5kIGVtcHRpZXMgKi9cbiAgICAgICAgLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIHRoZSBwYXNzZWQgc3RyaW5nIGZvciB1c2UgaW4gYSBVUkkgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSBjb21wb25lbnQgVGhlIHN0cmluZyB0byBlbmNvZGVcbiAqIEByZXR1cm5zIFRoZSBlbmNvZGVkIHN0cmluZywgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBjb21wb25lbnQgaXMgZmFsc3lcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVyaShjb21wb25lbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGNvbXBvbmVudD8ubGVuZ3RoID09PSB1bmRlZmluZWQgfHwgY29tcG9uZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVVUklDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICByZXR1cm4gZW5jb2RlZC5yZXBsYWNlQWxsKCdcXCcnLCAnJTI3Jyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gcGFzc2VkIGFyZ3VtZW50cyBhcmUgZXF1YWwgKHVzaW5nIGphdmFzY3JpcHQgPT09KSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBhcmd1bWVudFxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBhcmd1bWVudFxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdHdvIGFyZ3VtZW50cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXEoYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYSA9PT0gYjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgZWl0aGVyIG9mIHRoZSBwYXNzZWQgYXJndW1lbnRzIGFyZSB0cnV0aHksIGZhbHNlIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgYXJndW1lbnRcbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgYXJndW1lbnRcbiAqIEByZXR1cm5zIFRydWUgaWYgZWl0aGVyIG9mIHRoZSBhcmd1bWVudHMgYXJlIHRydXRoeSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcihhOiBhbnksIGI6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKGEpIHx8IEJvb2xlYW4oYik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGJvdGggb2YgdGhlIHBhc3NlZCBhcmd1bWVudHMgYXJlIHRydXRoeSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBhcmd1bWVudFxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBhcmd1bWVudFxuICogQHJldHVybnMgVHJ1ZSBpZiBib3RoIG9mIHRoZSBhcmd1bWVudHMgYXJlIHRydXRoeSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmQoYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbihhKSAmJiBCb29sZWFuKGIpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgaW4gdGhlIHNlY29uZCBhcmd1bWVudCAoYW4gYXJyYXkpLiBPdGhlcndpc2UsIHJldHVybnMgZmFsc2UuXG4gKiBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBhbiBhcnJheSwgb3IgdGhlIGFycmF5IGlzIGVtcHR5LCB0aGlzIHdpbGwgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFRoZSBuYW1lIG9mIHRoZSBoZWxwZXIgaXMgXCJpblwiIGJ1dCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gaXMgXCJpc0luXCIgYmVjYXVzZSBcImluXCIgaXMgYSByZXNlcnZlZCB3b3JkIGluIGphdmFzY3JpcHQuXG4gKlxuICogQHBhcmFtIGEgVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcGFyYW0gYiBUaGUgYXJyYXkgdG8gY2hlY2sgYWdhaW5zdFxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgaW4gdGhlIGFycmF5LCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW4oYTogYW55LCBiOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIGlmIChiPy5sZW5ndGggPT09IHVuZGVmaW5lZCB8fCBiLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBiLmluY2x1ZGVzKGEpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHBhc3NlZCBhcmd1bWVudHMuIFVzZWZ1bCB3aXRoIHRoZSBcImluXCIgaGVscGVyXG4gKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgdGhlIHBhc3NlZCBhcmd1bWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5KCk6IGFueVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShhcmd1bWVudHMpLnNsaWNlKDAsIC0xKTtcbn1cblxuLyogTmVlZCB0byBkaXNhYmxlIHRoaXMgcnVsZSBoZXJlIHRvIGJlIGNvbXBhdGJpbGUgd2l0aCBoYW5kbGViYXJzICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbmV4cG9ydCB0eXBlIEhhbmRsZWJhcnNIZWxwZXJzID0gUmVjb3JkPHN0cmluZywgRnVuY3Rpb24+XG5cbmV4cG9ydCBjb25zdCBHZXRIZWxwZXJzID0gKCk6IEhhbmRsZWJhcnNIZWxwZXJzID0+ICh7XG4gICAgc2x1ZyxcbiAgICBsb3dlcixcbiAgICBwYXRoLFxuICAgIHNlZCxcbiAgICByZXBsYWNlLFxuICAgIHNlYXJjaCxcbiAgICBjb2FsZXNjZSxcbiAgICBqb2luLFxuICAgIGdldF9maXJzdDogY29hbGVzY2UsXG4gICAgdXJpLFxuICAgIG9yLFxuICAgIGFuZCxcbiAgICBpc0luLFxuICAgIGFycmF5XG59KTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdywgSUNvbXBpbGVkUHVibGlzaGVyQ29uZmlndXJhdGlvbiwgSURldmljZSwgSUdlb0NvbnRleHQgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQge1xuICAgIEFzeW5jUmVzdWx0LFxuICAgIEVycixcbiAgICBJTmF2aWdhdG9yLFxuICAgIHR5cGUgSVNjcmVlbixcbiAgICBHZXRWYWx1ZSxcbiAgICBPayxcbiAgICBSZXF1ZXN0Qmlkc0ZuLFxuICAgIElMb2dnZXIsXG4gICAgR2V0U3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuLFxuICAgIFBlcnNvbmFsUmVjb21tZW5kZXJGbixcbiAgICBOb25QZXJzb25hbFJlY29tbWVuZGVyRm4sXG4gICAgR2V0Q29uZmlndXJhdGlvbkZuLFxuICAgIEdldEdlb0ZuLFxuICAgIEdldERldmljZUZuLFxuICAgIEdldFJlY29tbWVuZGVkUHJvZHVjdEZyb21Qcm9kdWN0SWRGbixcbiAgICBSZXF1ZXN0QmlkcyxcbiAgICBHZXRDb25maWd1cmF0aW9uLFxuICAgIEdldEdlbyxcbiAgICBHZXREZXZpY2UsXG4gICAgR2V0U3BvbnNvcmVkUHJvZHVjdCxcbiAgICBHZXRSZWNvbW1lbmRlZFByb2R1Y3QsXG4gICAgR2VuZXJhdGVUb3BQcm9kdWN0cyxcbiAgICBHZW5lcmF0ZUZvcllvdSxcbiAgICBHZW5lcmF0ZVByZXZpb3VzUHVyY2hhc2VzLFxuICAgIEdldEFsbFNwb25zb3JlZFByb2R1Y3RGcm9tTmF0aXZlSWRGbixcbiAgICBHZXRBbGxTcG9uc29yZWRQcm9kdWN0cyxcbn0gZnJvbSAnLi9zZXJ2aWNlcyc7XG5pbXBvcnQge1xuICAgIEJ1aWxkQWxsU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZXMsXG4gICAgQnVpbGRBbGxTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlc0ZuLFxuICAgIERlZmF1bHROYXRpdmUsXG4gICAgR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgIEdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZUZuLFxuICAgIEdldEhlbHBlcnMsXG4gICAgTmF0aXZlUmVxdWVzdEJ1aWxkZXJGbixcbiAgICBSZXF1ZXN0QnVpbGRlckZuLFxuICAgIFN0YXJ0TmF0aXZlLFxuICAgIFN0YXJ0UmVxdWVzdFxufSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IEhhbmRsZWJhcnMgZnJvbSAnaGFuZGxlYmFycy9ydW50aW1lJztcbmltcG9ydCB7XG4gICAgQnVpbGRIeWJyaWRDYXJvdXNlbCxcbiAgICBCdWlsZEh5YnJpZENhcm91c2VsRm4sXG4gICAgQnVpbGRIeWJyaWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkLFxuICAgIEJ1aWxkSHlicmlkQ2Fyb3VzZWxGcm9tSW5pdGlhbEJpZEZuLFxuICAgIEJ1aWxkUmVjb21tZW5kZWRDYXJvdXNlbCxcbiAgICBCdWlsZFJlY29tbWVuZGVkQ2Fyb3VzZWxGbixcbiAgICBCdWlsZFNwb25zb3JlZENhcm91c2VsLFxuICAgIEJ1aWxkU3BvbnNvcmVkQ2Fyb3VzZWxGbixcbiAgICBCdWlsZFNwb25zb3JlZENhcm91c2VsRnJvbUluaXRpYWxCaWQsXG4gICAgQnVpbGRTcG9uc29yZWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkRm5cbn0gZnJvbSAnLi9oZWxwZXJzL3Jlc3BvbnNlL0Nhcm91c2VsJztcbmltcG9ydCB7IEdldFdpbmRvd0luZm8gfSBmcm9tICcuL2hlbHBlcnMvV2luZG93JztcbmltcG9ydCB7XG4gICAgdHlwZSBFdmFsdWF0ZUNsaWNrdGhyb3VnaFRlbXBsYXRlRm4sXG4gICAgRXZhbHVhdGVIYW5kbGViYXJzQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgRXZhbHVhdGVIYW5kbGViYXJzUHJvZHVjdENhcmRUZW1wbGF0ZSxcbiAgICB0eXBlIEV2YWx1YXRlUHJvZHVjdENhcmRUZW1wbGF0ZUZuXG59IGZyb20gJy4vc2VydmljZXMvVGVtcGxhdGUnO1xuaW1wb3J0IHtcbiAgICBCdWlsZER5bmFtaWNab25lUmVxdWVzdCxcbiAgICBCdWlsZER5bmFtaWNab25lUmVxdWVzdEZuLFxuICAgIEdldER5bmFtaWNab25lLFxuICAgIEdldER5bmFtaWNab25lRm5cbn0gZnJvbSAnLi9zZXJ2aWNlcy9EeW5hbWljJztcblxuZXhwb3J0IGNvbnN0IFBST0RfQklEREVSID0gJy8vcnRiLnN1cmZzaWRlLmlvL3J0Yi9iaWRzL3N1cmZzaWRlJztcbmV4cG9ydCBjb25zdCBQUk9EX0NPTkZJR1VSQVRJT05fU0VSVklDRSA9ICcvL3Iuc3VyZnNpZGUuaW8nO1xuZXhwb3J0IGNvbnN0IFBST0RfU1BPTlNPUkVEX1BST0RVQ1RfRkVFRCA9ICcvL2NyZWF0aXZlLnN1cmZzaWRlLmlvJztcbmV4cG9ydCBjb25zdCBQUk9EX1JFQ09NTUVOREVEX1BST0RVQ1RfRkVFRCA9ICcvL2NyZWF0aXZlLnN1cmZzaWRlLmlvJztcbmV4cG9ydCBjb25zdCBQUk9EX1JFQ09NTUVOREVSX1NFUlZJQ0UgPSAnLy90LnN1cmZzaWRlLmlvJztcbmV4cG9ydCBjb25zdCBQUk9EX0RZTkFNSUNfWk9ORV9TRVJWSUNFID0gJy8vci5zdXJmc2lkZS5pby8nO1xuXG5jb25zdCBUTFMgPSAodXJsOiBzdHJpbmcpID0+ICdodHRwOicgKyB1cmw7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNlcnZpY2VzIGZvciBxdWVyeWluZyB0aGUgc3VyZnNpZGUgQVBJIGFuZCBidWlsZGluZyByZXNwb25zZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3VyZnNpZGVBcGkge1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGxvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcj86IElMb2dnZXIsXG5cbiAgICAvKiA9PT09PT09PT09IERhdGEgPT09PT09PT09PSAqL1xuICAgIC8qKlxuICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFVzZXIncyBkZXZpY2UgaW4gT3BlblJUQidzIGRldmljZSBmb3JtYXRcbiAgICAgKi9cbiAgICBnZXREZXZpY2U6IEdldERldmljZUZuLFxuXG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIncyBkZXZpY2UgaW5mb1xuICAgICAqL1xuICAgIGRldmljZTogSURldmljZSB8IHVuZGVmaW5lZCxcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHVzZXIncyBjdXJyZW50IGN1cnJlbnQgZ2VvIGFuZCBJUCBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBnZXRHZW86IEdldEdlb0ZuLFxuXG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIncyBjdXJyZW50IGdlbyBhbmQgSVAgaW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBnZW86IElHZW9Db250ZXh0IHwgdW5kZWZpbmVkLFxuXG4gICAgLyogPT09PT09PT09PSBDb25maWcgPT09PT09PT09PSAqL1xuICAgIC8qKlxuICAgICAqIFRoZSBzaXRlJ3MgcHVibGlzaGVyIGNvbmZpZ3VyYXRpb24uIFByb2R1Y3QgY2FyZCB0ZW1wbGF0ZXMsIGNsaWNrdGhyb3VnaCBVUkwgdGVtcGxhdGVzLCBzZXR0aW5ncywgZXRjLlxuICAgICAqL1xuICAgIGNvbmZpZ3VyYXRpb246IElDb21waWxlZFB1Ymxpc2hlckNvbmZpZ3VyYXRpb24sXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXRlJ3MgcHVibGlzaGVyIGNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBnZXRDb25maWd1cmF0aW9uOiBHZXRDb25maWd1cmF0aW9uRm4sXG5cbiAgICAvKipcbiAgICAgKiBBIGhhbmRsZWJhcnMgcnVudGltZSBpbnN0YW5jZSwgZm9yIGV2YWx1YXRpbmcgdGVtcGxhdGVzXG4gICAgICovXG4gICAgaGFuZGxlYmFyczogdHlwZW9mIEhhbmRsZWJhcnNcblxuICAgIC8qID09PT09PT09PT0gQmlkZGVyID09PT09PT09PT0gKi9cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIGJpZCByZXF1ZXN0IHRvIHRoZSBiaWRkZXIgYW5kIHJldHVybnMgaXRzIHJlc3BvbnNlLCBpZiBhdmFpbGFibGVcbiAgICAgKi9cbiAgICByZXF1ZXN0QmlkczogUmVxdWVzdEJpZHNGbixcblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhbiBPcGVuUlRCIDIuNiByZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRSZXF1ZXN0OiBSZXF1ZXN0QnVpbGRlckZuLFxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIGFuIE9wZW5SVEIgTmF0aXZlIDEuMiByZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnROYXRpdmU6IE5hdGl2ZVJlcXVlc3RCdWlsZGVyRm4sXG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYW4gT3BlblJUQiBOYXRpdmUgMS4yIHJlcXVlc3Qgd2l0aCBpbml0aWFsIGZpZWxkcywgc3VjaCBhcyBzaXRlLCBhcHAsIGFuZCB0cmFja2Vyc1xuICAgICAqL1xuICAgIGRlZmF1bHROYXRpdmU6IE5hdGl2ZVJlcXVlc3RCdWlsZGVyRm4sXG5cbiAgICAvKiA9PT09PT09PT09IFByb2R1Y3QgRmVlZCA9PT09PT09PT09ICovXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNwb25zb3JlZCBwcm9kdWN0IGdlbmVyYXRvciBmcm9tIHRoZSBnaXZlbiBOYXRpdmUgQ3JlYXRpdmUgSUQuIE9uZSBuYXRpdmUgY3JlYXRpdmUgSUQgY2FuIGdlbmVyYXRlXG4gICAgICogbXVsdGlwbGUgcHJvZHVjdHNcbiAgICAgKi9cbiAgICBnZXRTcG9uc29yZWRQcm9kdWN0OiBHZXRTcG9uc29yZWRQcm9kdWN0RnJvbU5hdGl2ZUlkRm4sXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBzcG9uc29yZWQgcHJvZHVjdHMgZnJvbSB0aGUgbmF0aXZlIGNyZWF0aXZlIElELiBPbmUgbmF0aXZlIGNyZWF0aXZlIElEIGNhbiBnZW5lcmF0ZSBtdWx0aXBsZSBwcm9kdWN0c1xuICAgICAqL1xuICAgIGdldEFsbFNwb25zb3JlZFByb2R1Y3RzOiBHZXRBbGxTcG9uc29yZWRQcm9kdWN0RnJvbU5hdGl2ZUlkRm4sXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhc3NvY2lhdGVkIHByb2R1Y3QgaW5mbyBmb3IgdGhlIHNpdGUgZnJvbSBhIHByb2R1Y3QgSURcbiAgICAgKi9cbiAgICBnZXRSZWNvbW1lbmRlZFByb2R1Y3Q6IEdldFJlY29tbWVuZGVkUHJvZHVjdEZyb21Qcm9kdWN0SWRGbixcblxuICAgIC8qID09PT09PT09PT0gUmVjb21tZW5kZXIgPT09PT09PT09PSAqL1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZWNvbW1lbmRlZCBwcm9kdWN0IGdlbmVyYXRvciBmb3IgdGhlIHRvcCAobW9zdCBwb3B1bGFyKSBwcm9kdWN0cyBvbiB0aGUgc2l0ZS5cbiAgICAgKi9cbiAgICBnZW5lcmF0ZVRvcFByb2R1Y3RzOiBOb25QZXJzb25hbFJlY29tbWVuZGVyRm4sXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcmVjb21tZW5kZWQgcHJvZHVjdCBnZW5lcmF0b3IgZm9yIHByb2R1Y3RzIHJlY29tbWVuZGVkIGZvciB0aGUgdXNlci4gSWYgdGhlcmUgYXJlIG5vIHJlY29tbWVuZGVkXG4gICAgICogcHJvZHVjdHMgZm9yIHRoZSB1c2VyLCBvciBpZiB0aGUgQVBJIHdhcyBpbml0aWFsaXplZCB3aXRob3V0IGEgdXNlciBJRCwgdGhpcyB3aWxsIHJldHVybiBhIGdlbmVyYXRvciBmb3IgdG9wXG4gICAgICogcHJvZHVjdHMgaW5zdGVhZFxuICAgICAqL1xuICAgIGdlbmVyYXRlRm9yWW91OiBQZXJzb25hbFJlY29tbWVuZGVyRm4sXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJlY29tbWVuZGVkIHByb2R1Y3QgZ2VuZXJhdG9yIGJhc2VkIG9uIHRoZSB1c2VyJ3MgcHJldmlvdXNseSBwdXJjaGFzZWQgcHJvZHVjdHMuIElmIHRoZXJlIGFyZSBub1xuICAgICAqIHJlY29tbWVuZGVkIHByb2R1Y3RzIGZvciB0aGUgdXNlciwgb3IgaWYgdGhlIEFQSSB3YXMgaW5pdGlhbGl6ZWQgd2l0aG91dCBhIHVzZXIgSUQsIHRoaXMgd2lsbCByZXR1cm4gYSBnZW5lcmF0b3JcbiAgICAgKiBmb3IgdG9wIHByb2R1Y3RzIGluc3RlYWRcbiAgICAgKi9cbiAgICBnZW5lcmF0ZVByZXZpb3VzUHVyY2hhc2VzOiBQZXJzb25hbFJlY29tbWVuZGVyRm4sXG5cbiAgICAvKiA9PT09PT09PT09IFByb2R1Y3QgQ2FyZCBSZXNwb25zZSBoYW5kbGVycyA9PT09PT09PT09ICovXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNhcm91c2VsIHN0YXRlIG9iamVjdCB1c2luZyB0aGUgYmlkIHJlcXVlc3QuIFRoZSBzdGF0ZSBvYmplY3QgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBzZW5kcyB0aGVcbiAgICAgKiBiaWQgcmVxdWVzdCB0byB0aGUgYmlkZGVyIGFuZCBnZW5lcmF0ZXMgcHJvZHVjdCBjYXJkcyBmcm9tIGl0LiBXaGVuIHRoZSBiaWQgaXMgb3V0IG9mIHByb2R1Y3QgY2FyZHMsIHRoZVxuICAgICAqIGdlbmVyYXRvciB3aWxsIHJlcXVlc3QgbW9yZSBiaWRzIHdpdGggdGhlIHNhbWUgYmlkIHJlcXVlc3QuIElmIG5vIGJpZHMgYXJlIHJldHVybmVkLCB0aGUgZ2VuZXJhdG9yIGNvbXBsZXRlcy5cbiAgICAgKi9cbiAgICBidWlsZFNwb25zb3JlZENhcm91c2VsOiBCdWlsZFNwb25zb3JlZENhcm91c2VsRm4sXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2Fyb3VzZWwgc3RhdGUgb2JqZWN0IHVzaW5nIHRoZSBiaWQgcmVxdWVzdCBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCBhIHByZS1leGlzdGluZyBiaWQuIFRoaXMgaXMgdXNlZFxuICAgICAqIGZvciBkeW5hbWljIHpvbmVzIGFuZCBwcm9iYWJseSBkb2Vzbid0IG5lZWQgdG8gYmUgdXNlZCBpbiBhbnkgY2xpZW50IGFwcGxpY2F0aW9ucy4gVGhlIHN0YXRlIG9iamVjdCBpcyBhIGNhbGxiYWNrXG4gICAgICogZnVuY3Rpb24gd2hpY2ggc2VuZHMgdGhlIGJpZCByZXF1ZXN0IHRvIHRoZSBiaWRkZXIgYW5kIGdlbmVyYXRlcyBwcm9kdWN0IGNhcmRzIGZyb20gaXQuIFdoZW4gdGhlIGJpZCBpcyBvdXQgb2ZcbiAgICAgKiBwcm9kdWN0IGNhcmRzLCB0aGUgZ2VuZXJhdG9yIHdpbGwgcmVxdWVzdCBtb3JlIGJpZHMgd2l0aCB0aGUgc2FtZSBiaWQgcmVxdWVzdC4gSWYgbm8gYmlkcyBhcmUgcmV0dXJuZWQsIHRoZVxuICAgICAqIGdlbmVyYXRvciBjb21wbGV0ZXMuXG4gICAgICovXG4gICAgYnVpbGRTcG9uc29yZWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkOiBCdWlsZFNwb25zb3JlZENhcm91c2VsRnJvbUluaXRpYWxCaWRGbixcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjYXJvdXNlbCBzdGF0ZSBvYmplY3Qgd2l0aCByZWNvbW1lbmRhdGlvbnMgZnJvbSB0aGUgZ2l2ZW4gcmVjb21tZW5kZXIgdHlwZSAodG9wIHByb2R1Y3QsIGZvciB5b3UsXG4gICAgICogcHJldmlvdXMgcHVyY2hhc2VzKS4gVGhlIHN0YXRlIG9iamVjdCBpcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHNlbmRzIHRoZSBiaWQgcmVxdWVzdCB0byB0aGUgYmlkZGVyIGFuZFxuICAgICAqIGdlbmVyYXRlcyBwcm9kdWN0IGNhcmRzIGZyb20gaXQuIFdoZW4gdGhlIGJpZCBpcyBvdXQgb2YgcHJvZHVjdCBjYXJkcywgdGhlIGdlbmVyYXRvciB3aWxsIHJlcXVlc3QgbW9yZSBiaWRzIHdpdGhcbiAgICAgKiB0aGUgc2FtZSBiaWQgcmVxdWVzdC4gSWYgbm8gYmlkcyBhcmUgcmV0dXJuZWQsIHRoZSBnZW5lcmF0b3IgY29tcGxldGVzLlxuICAgICAqL1xuICAgIGJ1aWxkUmVjb21tZW5kZWRDYXJvdXNlbDogQnVpbGRSZWNvbW1lbmRlZENhcm91c2VsRm4sXG4gICAgYnVpbGRIeWJyaWRDYXJvdXNlbDogQnVpbGRIeWJyaWRDYXJvdXNlbEZuLFxuICAgIGJ1aWxkSHlicmlkQ2Fyb3VzZWxGcm9tSW5pdGlhbEJpZDogQnVpbGRIeWJyaWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkRm4sXG4gICAgYnVpbGRBbGxTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlczogQnVpbGRBbGxTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlc0ZuLFxuICAgIGdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZTogR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlRm5cblxuICAgIC8qIFRlbXBsYXRlcyAqL1xuICAgIGV2YWx1YXRlUHJvZHVjdENhcmRUZW1wbGF0ZTogRXZhbHVhdGVQcm9kdWN0Q2FyZFRlbXBsYXRlRm4sXG4gICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZTogRXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZUZuXG5cbiAgICAvKiBEeW5hbWljIHpvbmVzICovXG4gICAgZ2V0RHluYW1pY1pvbmU6IEdldER5bmFtaWNab25lRm4sXG4gICAgYnVpbGREeW5hbWljWm9uZVJlcXVlc3Q6IEJ1aWxkRHluYW1pY1pvbmVSZXF1ZXN0Rm5cbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgQVBJIHdpdGggdGhlIHNlcnZpY2VzIGV4cGxpY2l0bHkgcGFzc2VkIHRvIGl0LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGZyYW1ld29yayBmb3Igb3ZlcmxvYWRpbmdcbiAqIG1vY2sgc2VydmljZXMuIEl0IHNob3VsZCBub3QgYmUgdXNlZCBpbiBhbiBhcHBsaWNhdGlvblxuICogQHBhcmFtIGludGVybmFsQXBpRHRvIFRoZSBsaXN0IG9mIHNlcnZpY2VzIGFuZCBoZWxwZXJzIHRvIGluamVjdFxuICogQHJldHVybnMgQW4gaW5pdGlhbGl6ZWQgU3VyZnNpZGUgQVBJXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBJbml0U3VyZkFkc0NvcmVJbnRlcm5hbChpbnRlcm5hbEFwaUR0bzoge1xuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0QmlkczogUmVxdWVzdEJpZHNGbixcbiAgICBnZXRDb25maWd1cmF0aW9uOiBHZXRDb25maWd1cmF0aW9uRm4sXG4gICAgZ2V0R2VvOiBHZXRHZW9GbixcbiAgICBnZXREZXZpY2U6IEdldERldmljZUZuLFxuICAgIGdldFNwb25zb3JlZFByb2R1Y3Q6IEdldFNwb25zb3JlZFByb2R1Y3RGcm9tTmF0aXZlSWRGbixcbiAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0czogR2V0QWxsU3BvbnNvcmVkUHJvZHVjdEZyb21OYXRpdmVJZEZuLFxuICAgIGdldFJlY29tbWVuZGVkUHJvZHVjdDogR2V0UmVjb21tZW5kZWRQcm9kdWN0RnJvbVByb2R1Y3RJZEZuLFxuICAgIGdlbmVyYXRlVG9wUHJvZHVjdHM6IE5vblBlcnNvbmFsUmVjb21tZW5kZXJGbixcbiAgICBnZW5lcmF0ZUZvcllvdTogUGVyc29uYWxSZWNvbW1lbmRlckZuLFxuICAgIGdlbmVyYXRlUHJldmlvdXNQdXJjaGFzZXM6IFBlcnNvbmFsUmVjb21tZW5kZXJGbixcbiAgICBnZXREeW5hbWljWm9uZTogR2V0RHluYW1pY1pvbmVGbixcbiAgICBidWlsZEFsbFNwb25zb3JlZFByb2R1Y3RDYXJkUmVzcG9uc2VzOiBCdWlsZEFsbFNwb25zb3JlZFByb2R1Y3RDYXJkUmVzcG9uc2VzRm4sXG4gICAgZ2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlOiBHZW5lcmF0ZVNwb25zb3JlZFByb2R1Y3RDYXJkUmVzcG9uc2VGbixcbiAgICBldmFsdWF0ZVByb2R1Y3RDYXJkVGVtcGxhdGU6IEV2YWx1YXRlUHJvZHVjdENhcmRUZW1wbGF0ZUZuLFxuICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGU6IEV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGVGbixcbiAgICBoYW5kbGViYXJzOiB0eXBlb2YgSGFuZGxlYmFycyxcbiAgICB3aW5kb3dJbmZvOiBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBzY3JlZW5JbmZvOiBJU2NyZWVuLFxuICAgIG5hdmlnYXRvcjogSU5hdmlnYXRvcixcbiAgICBtb2JpbGU6IGJvb2xlYW4sXG4gICAgaXA6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBnZW9Qcm92aWRlclRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgYWNjb3VudElkOiBzdHJpbmcsXG4gICAgc2l0ZUlkOiBzdHJpbmcsXG4gICAgY2hhbm5lbElkOiBzdHJpbmcsXG4gICAgbG9jYXRpb25JZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nIHwgdW5kZWZpbmVkXG59KTogQXN5bmNSZXN1bHQ8SVN1cmZzaWRlQXBpPiB7XG4gICAgY29uc3Qge1xuICAgICAgICBnZXREZXZpY2UsIG1vYmlsZSxcbiAgICAgICAgbmF2aWdhdG9yLFxuICAgICAgICBpcCxcbiAgICAgICAgZ2V0R2VvLFxuICAgICAgICBnZW9Qcm92aWRlclRva2VuLFxuICAgICAgICBnZXRDb25maWd1cmF0aW9uLFxuICAgICAgICBhY2NvdW50SWQsXG4gICAgICAgIHNpdGVJZCxcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICBjaGFubmVsSWQsXG4gICAgICAgIGxvY2F0aW9uSWQsXG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgaGFuZGxlYmFycyxcbiAgICAgICAgd2luZG93SW5mbyxcbiAgICAgICAgc2NyZWVuSW5mbyxcbiAgICAgICAgcmVxdWVzdEJpZHMsXG4gICAgICAgIGdldFNwb25zb3JlZFByb2R1Y3QsXG4gICAgICAgIGdldEFsbFNwb25zb3JlZFByb2R1Y3RzLFxuICAgICAgICBnZXRSZWNvbW1lbmRlZFByb2R1Y3QsXG4gICAgICAgIGdlbmVyYXRlVG9wUHJvZHVjdHMsXG4gICAgICAgIGdlbmVyYXRlRm9yWW91LFxuICAgICAgICBnZW5lcmF0ZVByZXZpb3VzUHVyY2hhc2VzLFxuICAgICAgICBnZXREeW5hbWljWm9uZSxcbiAgICAgICAgYnVpbGRBbGxTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlcyxcbiAgICAgICAgZ2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICBldmFsdWF0ZVByb2R1Y3RDYXJkVGVtcGxhdGUsXG4gICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgfSA9IGludGVybmFsQXBpRHRvO1xuXG4gICAgY29uc3QgZGV2aWNlID0gZ2V0RGV2aWNlKHNjcmVlbkluZm8sIG5hdmlnYXRvciwgbW9iaWxlKTtcbiAgICBjb25zdCBnZW8gPSBhd2FpdCBnZXRHZW8oZ2VvUHJvdmlkZXJUb2tlbiwgaXApO1xuXG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IGF3YWl0IGdldENvbmZpZ3VyYXRpb24oKTtcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24ub2spIHtcbiAgICAgICAgcmV0dXJuIEVycihuZXcgTWlzc2luZ0NvbmZpZ3VyYXRpb25FcnJvcihhY2NvdW50SWQsIHNpdGVJZCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0UmVxdWVzdEJvdW5kID0gU3RhcnRSZXF1ZXN0LmJpbmQodW5kZWZpbmVkLFxuICAgICAgICBsb2dnZXIsXG4gICAgICAgIGFjY291bnRJZCxcbiAgICAgICAgc2l0ZUlkLFxuICAgICAgICBjaGFubmVsSWQsXG4gICAgICAgIGxvY2F0aW9uSWQsXG4gICAgICAgIEdldFZhbHVlKGRldmljZSksXG4gICAgICAgIEdldFZhbHVlKGdlbyksXG4gICAgICAgIHVzZXJJZFxuICAgICk7XG5cbiAgICBjb25zdCBzdGFydFJlcXVlc3QgPSAoem9uZUlkOiBzdHJpbmcsIGlkPzogc3RyaW5nKSA9PiBzdGFydFJlcXVlc3RCb3VuZCh6b25lSWQsIGlkKVxuICAgICAgICAud2l0aEFwcCh7XG4gICAgICAgICAgICBidW5kbGU6IHdpbmRvd0luZm8uaG9zdCxcbiAgICAgICAgICAgIG5hbWU6IHdpbmRvd0luZm8uaG9zdCxcbiAgICAgICAgICAgIGlkOiBzaXRlSWQsXG4gICAgICAgICAgICBkb21haW46IHdpbmRvd0luZm8uaG9zdCxcbiAgICAgICAgICAgIHB1Ymxpc2hlcjoge1xuICAgICAgICAgICAgICAgIGRvbWFpbjogd2luZG93SW5mby5ob3N0LFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAud2l0aFNpdGUoe1xuICAgICAgICAgICAgbmFtZTogd2luZG93SW5mby5ob3N0LFxuICAgICAgICAgICAgaWQ6IHNpdGVJZCxcbiAgICAgICAgICAgIGt3YXJyYXk6IFtdLFxuICAgICAgICAgICAgbW9iaWxlOiBpc01vYmlsZSgpID8gMSA6IDAsXG4gICAgICAgICAgICBwYWdlOiB3aW5kb3dJbmZvLmhyZWYsXG4gICAgICAgICAgICBkb21haW46IHdpbmRvd0luZm8uaG9zdCxcbiAgICAgICAgICAgIHB1Ymxpc2hlcjoge1xuICAgICAgICAgICAgICAgIGlkOiBzaXRlSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogd2luZG93SW5mby5ob3N0LFxuICAgICAgICAgICAgICAgIGRvbWFpbjogd2luZG93SW5mby5ob3N0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlZjogXCJcIixcbiAgICAgICAgICAgIHNlYXJjaDogd2luZG93SW5mby5zZWFyY2hcbiAgICAgICAgfSk7XG5cbiAgICBjb25zdCBzdGFydE5hdGl2ZSA9IFN0YXJ0TmF0aXZlLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIpO1xuICAgIGNvbnN0IGRlZmF1bHROYXRpdmUgPSBEZWZhdWx0TmF0aXZlLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIpO1xuXG4gICAgcmV0dXJuIE9rKHtcbiAgICAgICAgbG9nZ2VyLFxuICAgICAgICBnZXREZXZpY2UsXG4gICAgICAgIGRldmljZTogR2V0VmFsdWUoZGV2aWNlKSxcbiAgICAgICAgZ2V0R2VvLFxuICAgICAgICBnZW86IEdldFZhbHVlKGdlbyksXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IGNvbmZpZ3VyYXRpb24udmFsdWUsXG4gICAgICAgIGdldENvbmZpZ3VyYXRpb24sXG4gICAgICAgIGhhbmRsZWJhcnMsXG4gICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICBzdGFydFJlcXVlc3QsXG4gICAgICAgIHN0YXJ0TmF0aXZlLFxuICAgICAgICBkZWZhdWx0TmF0aXZlLFxuICAgICAgICBnZXRTcG9uc29yZWRQcm9kdWN0LFxuICAgICAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0cyxcbiAgICAgICAgZ2V0UmVjb21tZW5kZWRQcm9kdWN0LFxuICAgICAgICBnZW5lcmF0ZVRvcFByb2R1Y3RzLFxuICAgICAgICBnZW5lcmF0ZUZvcllvdSxcbiAgICAgICAgZ2VuZXJhdGVQcmV2aW91c1B1cmNoYXNlcyxcbiAgICAgICAgYnVpbGRBbGxTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlcyxcbiAgICAgICAgZ2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICBldmFsdWF0ZVByb2R1Y3RDYXJkVGVtcGxhdGUsXG4gICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgIGJ1aWxkU3BvbnNvcmVkQ2Fyb3VzZWw6IEJ1aWxkU3BvbnNvcmVkQ2Fyb3VzZWwuYmluZCh1bmRlZmluZWQsIGxvZ2dlcixcbiAgICAgICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICAgICAgZ2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlXG4gICAgICAgICksXG4gICAgICAgIGJ1aWxkU3BvbnNvcmVkQ2Fyb3VzZWxGcm9tSW5pdGlhbEJpZDogQnVpbGRTcG9uc29yZWRDYXJvdXNlbEZyb21Jbml0aWFsQmlkLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsXG4gICAgICAgICAgICByZXF1ZXN0QmlkcyxcbiAgICAgICAgICAgIGdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZVxuICAgICAgICApLFxuICAgICAgICBidWlsZEh5YnJpZENhcm91c2VsRnJvbUluaXRpYWxCaWQ6IEJ1aWxkSHlicmlkQ2Fyb3VzZWxGcm9tSW5pdGlhbEJpZC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLFxuICAgICAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICAgICAgZ2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICAgICAgZ2VuZXJhdGVUb3BQcm9kdWN0cyxcbiAgICAgICAgICAgIGdlbmVyYXRlUHJldmlvdXNQdXJjaGFzZXMsXG4gICAgICAgICAgICBnZW5lcmF0ZUZvcllvdSxcbiAgICAgICAgICAgIHVzZXJJZFxuICAgICAgICApLFxuICAgICAgICBidWlsZFJlY29tbWVuZGVkQ2Fyb3VzZWw6IEJ1aWxkUmVjb21tZW5kZWRDYXJvdXNlbC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLFxuICAgICAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgICAgIGdlbmVyYXRlVG9wUHJvZHVjdHMsXG4gICAgICAgICAgICBnZW5lcmF0ZVByZXZpb3VzUHVyY2hhc2VzLFxuICAgICAgICAgICAgZ2VuZXJhdGVGb3JZb3UsXG4gICAgICAgICAgICB1c2VySWRcbiAgICAgICAgKSxcbiAgICAgICAgYnVpbGRIeWJyaWRDYXJvdXNlbDogQnVpbGRIeWJyaWRDYXJvdXNlbC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLFxuICAgICAgICAgICAgZXZhbHVhdGVDbGlja3Rocm91Z2hUZW1wbGF0ZSxcbiAgICAgICAgICAgIHJlcXVlc3RCaWRzLFxuICAgICAgICAgICAgZ2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICAgICAgZ2VuZXJhdGVUb3BQcm9kdWN0cyxcbiAgICAgICAgICAgIGdlbmVyYXRlUHJldmlvdXNQdXJjaGFzZXMsXG4gICAgICAgICAgICBnZW5lcmF0ZUZvcllvdSxcbiAgICAgICAgICAgIHVzZXJJZFxuXG4gICAgICAgICksXG4gICAgICAgIGdldER5bmFtaWNab25lLFxuICAgICAgICBidWlsZER5bmFtaWNab25lUmVxdWVzdDogQnVpbGREeW5hbWljWm9uZVJlcXVlc3QuYmluZCh1bmRlZmluZWQsIGxvZ2dlcixcbiAgICAgICAgICAgIHN0YXJ0UmVxdWVzdCxcbiAgICAgICAgICAgIGRlZmF1bHROYXRpdmUsXG4gICAgICAgICAgICBzY3JlZW5JbmZvXG4gICAgICAgIClcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IEluaXRTdXJmQWRzQ29yZVNlcnZpY2VzID0gYXN5bmMgKFxuICAgIGxvZ2dlcjogSUxvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICBiaWRkZXJTZXJ2aWNlVXJsOiBzdHJpbmcsXG4gICAgY29uZmlndXJhdGlvblNlcnZpY2VVcmw6IHN0cmluZyxcbiAgICBwcm9kdWN0RmVlZFVybDogc3RyaW5nLFxuICAgIHJlY29tbWVuZGVkUHJvZHVjdEZlZWRVcmw6IHN0cmluZyxcbiAgICByZWNvbW1lbmRlclNlcnZpY2VVcmw6IHN0cmluZyxcbiAgICBkeW5hbWljWm9uZVNlcnZpY2VVcmw6IHN0cmluZyxcbiAgICB3aW5kb3dJbmZvOiBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBzY3JlZW5JbmZvOiBJU2NyZWVuLFxuICAgIG5hdmlnYXRvcjogSU5hdmlnYXRvcixcbiAgICBtb2JpbGU6IGJvb2xlYW4sXG4gICAgaXA6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBnZW9Qcm92aWRlclRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgYWNjb3VudElkOiBzdHJpbmcsXG4gICAgc2l0ZUlkOiBzdHJpbmcsXG4gICAgY2hhbm5lbElkOiBzdHJpbmcsXG4gICAgbG9jYXRpb25JZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogQXN5bmNSZXN1bHQ8SVN1cmZzaWRlQXBpPiA9PiB7XG4gICAgY29uc3QgaGFuZGxlYmFycyA9IEhhbmRsZWJhcnMuY3JlYXRlKCk7XG4gICAgY29uc3QgaGVscGVycyA9IEdldEhlbHBlcnMoKTtcbiAgICBjb25zdCByZWNvbW1lbmRlZFByb2R1Y3RGZWVkID0gR2V0UmVjb21tZW5kZWRQcm9kdWN0LmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsXG4gICAgICAgIHJlY29tbWVuZGVkUHJvZHVjdEZlZWRVcmwsXG4gICAgICAgIGFjY291bnRJZCxcbiAgICAgICAgbG9jYXRpb25JZFxuICAgICk7XG4gICAgY29uc3QgY29uZmlndXJhdGlvblNlcnZpY2UgPSBHZXRDb25maWd1cmF0aW9uLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsXG4gICAgICAgIGNvbmZpZ3VyYXRpb25TZXJ2aWNlVXJsLFxuICAgICAgICBoYW5kbGViYXJzLFxuICAgICAgICBoZWxwZXJzLFxuICAgICAgICBhY2NvdW50SWQsXG4gICAgICAgIHNpdGVJZFxuICAgICk7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IGF3YWl0IGNvbmZpZ3VyYXRpb25TZXJ2aWNlKCk7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uLm9rKSB7XG4gICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uO1xuICAgIH1cblxuICAgIGNvbnN0IGdldEFsbFNwb25zb3JlZFByb2R1Y3RzID0gR2V0QWxsU3BvbnNvcmVkUHJvZHVjdHMuYmluZCh1bmRlZmluZWQsIGxvZ2dlcixcbiAgICAgICAgcHJvZHVjdEZlZWRVcmwsIGFjY291bnRJZCwgbG9jYXRpb25JZCk7XG4gICAgY29uc3QgZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlID0gR2VuZXJhdGVTcG9uc29yZWRQcm9kdWN0Q2FyZFJlc3BvbnNlLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsXG4gICAgICAgIGdldEFsbFNwb25zb3JlZFByb2R1Y3RzLFxuICAgICAgICB3aW5kb3dJbmZvLFxuICAgICAgICBjb25maWd1cmF0aW9uLnZhbHVlXG4gICAgKTtcblxuICAgIGNvbnN0IGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUgPSBFdmFsdWF0ZUhhbmRsZWJhcnNDbGlja3Rocm91Z2hUZW1wbGF0ZS5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLFxuICAgICAgICB3aW5kb3dJbmZvLFxuICAgICAgICBjb25maWd1cmF0aW9uLnZhbHVlXG4gICAgKTtcblxuICAgIGNvbnN0IGV2YWx1YXRlUHJvZHVjdENhcmRUZW1wbGF0ZSA9IEV2YWx1YXRlSGFuZGxlYmFyc1Byb2R1Y3RDYXJkVGVtcGxhdGUuYmluZCh1bmRlZmluZWQsIGxvZ2dlcixcbiAgICAgICAgd2luZG93SW5mbyxcbiAgICAgICAgY29uZmlndXJhdGlvbi52YWx1ZVxuICAgICk7XG5cbiAgICByZXR1cm4gYXdhaXQgSW5pdFN1cmZBZHNDb3JlSW50ZXJuYWwoe1xuICAgICAgICBsb2dnZXIsXG4gICAgICAgIHJlcXVlc3RCaWRzOiBSZXF1ZXN0Qmlkcy5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLFxuICAgICAgICAgICAgYmlkZGVyU2VydmljZVVybCxcbiAgICAgICAgICAgIGFjY291bnRJZCxcbiAgICAgICAgICAgIHNpdGVJZCxcbiAgICAgICAgICAgIGxvY2F0aW9uSWQsXG4gICAgICAgICAgICBjaGFubmVsSWRcbiAgICAgICAgKSxcbiAgICAgICAgZ2V0Q29uZmlndXJhdGlvbjogY29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgICAgIGdldEdlbzogR2V0R2VvLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIpLFxuICAgICAgICBnZXREZXZpY2U6IEdldERldmljZS5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyKSxcbiAgICAgICAgZ2V0U3BvbnNvcmVkUHJvZHVjdDogR2V0U3BvbnNvcmVkUHJvZHVjdC5iaW5kKHVuZGVmaW5lZCwgbG9nZ2VyLCBwcm9kdWN0RmVlZFVybCwgYWNjb3VudElkLCBsb2NhdGlvbklkKSxcbiAgICAgICAgZ2V0QWxsU3BvbnNvcmVkUHJvZHVjdHMsXG4gICAgICAgIGdldFJlY29tbWVuZGVkUHJvZHVjdDogR2V0UmVjb21tZW5kZWRQcm9kdWN0LmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsXG4gICAgICAgICAgICByZWNvbW1lbmRlZFByb2R1Y3RGZWVkVXJsLFxuICAgICAgICAgICAgYWNjb3VudElkLFxuICAgICAgICAgICAgbG9jYXRpb25JZFxuICAgICAgICApLFxuICAgICAgICBnZW5lcmF0ZVRvcFByb2R1Y3RzOiBHZW5lcmF0ZVRvcFByb2R1Y3RzLmJpbmQodW5kZWZpbmVkLCBsb2dnZXIsXG4gICAgICAgICAgICByZWNvbW1lbmRlZFByb2R1Y3RGZWVkLFxuICAgICAgICAgICAgcmVjb21tZW5kZXJTZXJ2aWNlVXJsLFxuICAgICAgICAgICAgYWNjb3VudElkLFxuICAgICAgICAgICAgc2l0ZUlkLFxuICAgICAgICAgICAgbG9jYXRpb25JZFxuICAgICAgICApLFxuICAgICAgICBnZW5lcmF0ZUZvcllvdTogR2VuZXJhdGVGb3JZb3UuYmluZCh1bmRlZmluZWQsIGxvZ2dlcixcbiAgICAgICAgICAgIHJlY29tbWVuZGVkUHJvZHVjdEZlZWQsXG4gICAgICAgICAgICByZWNvbW1lbmRlclNlcnZpY2VVcmwsXG4gICAgICAgICAgICBhY2NvdW50SWQsXG4gICAgICAgICAgICBzaXRlSWQsXG4gICAgICAgICAgICBsb2NhdGlvbklkLFxuICAgICAgICAgICAgdXNlcklkID8/ICd1bmRlZmluZWQnXG4gICAgICAgICksXG4gICAgICAgIGdlbmVyYXRlUHJldmlvdXNQdXJjaGFzZXM6IEdlbmVyYXRlUHJldmlvdXNQdXJjaGFzZXMuYmluZCh1bmRlZmluZWQsIGxvZ2dlcixcbiAgICAgICAgICAgIHJlY29tbWVuZGVkUHJvZHVjdEZlZWQsXG4gICAgICAgICAgICByZWNvbW1lbmRlclNlcnZpY2VVcmwsXG4gICAgICAgICAgICBhY2NvdW50SWQsXG4gICAgICAgICAgICBzaXRlSWQsXG4gICAgICAgICAgICBsb2NhdGlvbklkLFxuICAgICAgICAgICAgdXNlcklkID8/ICd1bmRlZmluZWQnXG4gICAgICAgICksXG4gICAgICAgIGJ1aWxkQWxsU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZXM6IEJ1aWxkQWxsU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZXMuYmluZCh1bmRlZmluZWQsXG4gICAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgICBnZXRBbGxTcG9uc29yZWRQcm9kdWN0cyxcbiAgICAgICAgICAgIHdpbmRvd0luZm8sXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uLnZhbHVlXG4gICAgICAgICksXG4gICAgICAgIGdlbmVyYXRlU3BvbnNvcmVkUHJvZHVjdENhcmRSZXNwb25zZTogZ2VuZXJhdGVQcm9kdWN0Q2FyZFJlc3BvbnNlLFxuICAgICAgICBldmFsdWF0ZVByb2R1Y3RDYXJkVGVtcGxhdGUsXG4gICAgICAgIGV2YWx1YXRlQ2xpY2t0aHJvdWdoVGVtcGxhdGUsXG4gICAgICAgIGhhbmRsZWJhcnMsXG4gICAgICAgIHdpbmRvd0luZm8sXG4gICAgICAgIHNjcmVlbkluZm8sXG4gICAgICAgIG5hdmlnYXRvcixcbiAgICAgICAgbW9iaWxlLFxuICAgICAgICBpcCxcbiAgICAgICAgZ2VvUHJvdmlkZXJUb2tlbixcbiAgICAgICAgYWNjb3VudElkLFxuICAgICAgICBzaXRlSWQsXG4gICAgICAgIGNoYW5uZWxJZCxcbiAgICAgICAgbG9jYXRpb25JZCxcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBnZXREeW5hbWljWm9uZTogR2V0RHluYW1pY1pvbmUuYmluZCh1bmRlZmluZWQsIGxvZ2dlciwgY29uZmlndXJhdGlvbi52YWx1ZSlcbiAgICB9KTtcbn07XG5cbi8qIEZvciB1c2UgaW4gc2VydmVyc2lkZSByZW5kZXJpbmcgKi9cbi8vIFRPRE86IFJlbmFtZSB0aGlzP1xuZXhwb3J0IGNvbnN0IEluaXRTdXJmQWRzQ29yZVNTUiA9IGFzeW5jIChcbiAgICB3aW5kb3dJbmZvOiBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyxcbiAgICBzY3JlZW46IElTY3JlZW4sXG4gICAgbmF2aWdhdG9yOiBJTmF2aWdhdG9yLFxuICAgIG1vYmlsZTogYm9vbGVhbixcbiAgICBpcDogc3RyaW5nLFxuICAgIGdlb1Byb3ZpZGVyVG9rZW46IHN0cmluZyxcbiAgICBhY2NvdW50SWQ6IHN0cmluZyxcbiAgICBzaXRlSWQ6IHN0cmluZyxcbiAgICBjaGFubmVsSWQ6IHN0cmluZyxcbiAgICBsb2NhdGlvbklkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgbG9nZ2VyPzogSUxvZ2dlcixcbik6IEFzeW5jUmVzdWx0PElTdXJmc2lkZUFwaT4gPT4gSW5pdFN1cmZBZHNDb3JlU2VydmljZXMoXG4gICAgbG9nZ2VyLFxuICAgIFRMUyhQUk9EX0JJRERFUiksXG4gICAgVExTKFBST0RfQ09ORklHVVJBVElPTl9TRVJWSUNFKSxcbiAgICBUTFMoUFJPRF9TUE9OU09SRURfUFJPRFVDVF9GRUVEKSxcbiAgICBUTFMoUFJPRF9SRUNPTU1FTkRFRF9QUk9EVUNUX0ZFRUQpLFxuICAgIFRMUyhQUk9EX1JFQ09NTUVOREVSX1NFUlZJQ0UpLFxuICAgIFRMUyhQUk9EX0RZTkFNSUNfWk9ORV9TRVJWSUNFKSxcbiAgICB3aW5kb3dJbmZvLFxuICAgIHNjcmVlbixcbiAgICBuYXZpZ2F0b3IsXG4gICAgbW9iaWxlLFxuICAgIGlwLFxuICAgIGdlb1Byb3ZpZGVyVG9rZW4sXG4gICAgYWNjb3VudElkLFxuICAgIHNpdGVJZCxcbiAgICBjaGFubmVsSWQsXG4gICAgbG9jYXRpb25JZCxcbiAgICB1c2VySWRcbik7XG5cbi8qIEZvciB1c2UgaW4gd2ViIGJyb3dzZXJzICovXG5leHBvcnQgY29uc3QgSW5pdFN1cmZBZHNDb3JlID0gYXN5bmMgKFxuICAgIGNoYW5uZWxJZDogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nLFxuICAgIGxvY2F0aW9uSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBsb2dnZXI/OiBJTG9nZ2VyXG4pOiBBc3luY1Jlc3VsdDxJU3VyZnNpZGVBcGk+ID0+IHtcbiAgICAvKiBOb3QgaW4gYSBicm93c2VyICovXG4gICAgY29uc3Qgd2luZG93SW5mbyA9IEdldFdpbmRvd0luZm8oKTtcbiAgICBpZighd2luZG93SW5mby5vaykge1xuICAgICAgICByZXR1cm4gd2luZG93SW5mbztcbiAgICB9XG4gICAgcmV0dXJuIEluaXRTdXJmQWRzQ29yZVNlcnZpY2VzKFxuICAgICAgICBsb2dnZXIsXG4gICAgICAgIFRMUyhQUk9EX0JJRERFUiksXG4gICAgICAgIFRMUyhQUk9EX0NPTkZJR1VSQVRJT05fU0VSVklDRSksXG4gICAgICAgIFRMUyhQUk9EX1NQT05TT1JFRF9QUk9EVUNUX0ZFRUQpLFxuICAgICAgICBUTFMoUFJPRF9SRUNPTU1FTkRFRF9QUk9EVUNUX0ZFRUQpLFxuICAgICAgICBUTFMoUFJPRF9SRUNPTU1FTkRFUl9TRVJWSUNFKSxcbiAgICAgICAgVExTKFBST0RfRFlOQU1JQ19aT05FX1NFUlZJQ0UpLFxuICAgICAgICB3aW5kb3dJbmZvLnZhbHVlLFxuICAgICAgICB3aW5kb3cuc2NyZWVuLFxuICAgICAgICB3aW5kb3cubmF2aWdhdG9yLFxuICAgICAgICBpc01vYmlsZSgpLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgYWNjb3VudElkLFxuICAgICAgICBzaXRlSWQsXG4gICAgICAgIGNoYW5uZWxJZCxcbiAgICAgICAgbG9jYXRpb25JZCxcbiAgICAgICAgdXNlcklkXG4gICAgKTtcbn07XG5cbmV4cG9ydCBjbGFzcyBNaXNzaW5nQ29uZmlndXJhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGFjY291bnRJZDogc3RyaW5nLCBzaXRlSWQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgICdNaXNzaW5nIGNvbmZpZ3VyYXRpb24gZm9yXFxuJyArXG4gICAgICAgICAgICBgICAgIGFjY291bnRJZDogJHthY2NvdW50SWR9XFxuYCArXG4gICAgICAgICAgICBgICAgIHNpdGVJZDogJHtzaXRlSWR9XFxuYCArXG4gICAgICAgICAgICAnMS4gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlc2UgYXJlIHRoZSBjb3JyZWN0IHZhbHVlcyBmb3IgZWFjaCBmaWVsZCcgK1xuICAgICAgICAgICAgJzIuIENoZWNrIHlvdXIgcHVibGlzaGVyIGNvbmZpZ3VyYXRpb24gYXQgJyArXG4gICAgICAgICAgICBgaHR0cHM6Ly9hcHAuc3VyZnNpZGUuaW8vaW52ZW50b3J5L3NpdGVzL3B1Ymxpc2hlci8ke2FjY291bnRJZH0vJHtzaXRlSWR9YFxuICAgICAgICApO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBOb3RBQnJvd3NlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcbiAgICAgICAgICAgICdZb3UgYXJlIG5vdCBydW5uaW5nIFN1cmZzaWRlIEFkcyBDb3JlIGluIGEgV2ViIGJyb3dzZXIsIHNvIHlvdSBjYW5ub3QgdXNlIFwiSW5pdFN1cmZBZHNDb3JlXCIuICcgK1xuICAgICAgICAgICAgJ0luc3RlYWQsIHVzZSBJbml0U3VyZkFkc0NvcmVTU1IsIGFuZCBwYXNzIHRoZSB1c2VyXFwncyBzY3JlZW4sIG5hdmlnYXRvciwgYW5kIElQIGFkZHJlc3MgZXhwbGljaXRseSAnICtcbiAgICAgICAgICAgICdzbyB0aGF0IFN1cmZzaWRlIEFkcyBDb3JlIGNhbiBpbml0aWFsaXplIGdlbyBhbmQgZGV2aWNlIGluZm9ybWF0aW9uIHNlcnZpY2VzLiBlLmc6IFxcbicgK1xuICAgICAgICAgICAgJyAgICBJbml0U3VyZkFkc0NvcmVTU1IoXFxuJyArXG4gICAgICAgICAgICAnICAgICAgICAvKiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSB1c2VyXFwncyBzY3JlZW46ICovXFxuJyArXG4gICAgICAgICAgICAnICAgICAgeyB3aWR0aDogc2NyZWVuV2lkdGgsIGhlaWdodDogc2NyZWVuSGVpZ2h0IH0sXFxuJyArXG4gICAgICAgICAgICAnICAgICAgICAvKiB1c2VyQWdlbnQgc3RyaW5nIGFuZCBsYW5ndWFnZSBvZiB0aGUgdXNlcjogKi9cXG4nICtcbiAgICAgICAgICAgICcgICAgICB7IHVzZXJBZ2VudDogdXNlckFnZW50LCBsYW5ndWFnZTogdXNlckxhbmd1YWdlIH0sXFxuJyArXG4gICAgICAgICAgICAnICAgICAgICAvKiB3aGV0aGVyIHRoZSB1c2VyIGlzIG9uIG1vYmlsZSBvciBub3Q6ICovXFxuJyArXG4gICAgICAgICAgICAnICAgICAgdHJ1ZSxcXG4nICtcbiAgICAgICAgICAgICcgICAgICAgIC8qIHRoZSByZXF1ZXN0aW5nIFVzZXJcXCdzIElQICovXFxuJyArXG4gICAgICAgICAgICAnICAgICAgcmVxdWVzdC5pcEFkZHJlc3MsXFxuJyArXG4gICAgICAgICAgICAnICAgICAgICAvKiBZb3VyIEFQSSBUb2tlbiBmb3IgdGhlIFN1cmZzaWRlIEdlbyBTZXJ2aWNlOiAqL1xcbicgK1xuICAgICAgICAgICAgJyAgICAgIGdlb1Byb3ZpZGVyVG9rZW4sXFxuJyArXG4gICAgICAgICAgICAnICAgICAgYWNjb3VudElkLFxcbicgK1xuICAgICAgICAgICAgJyAgICAgIHNpdGVJZCxcXG4nICtcbiAgICAgICAgICAgICcgICAgICBjaGFubmVsSWQsXFxuJyArXG4gICAgICAgICAgICAnICAgICAgbG9jYXRpb25JZCxcXG4nICtcbiAgICAgICAgICAgICcgICAgICB1c2VySWQsXFxuJyArXG4gICAgICAgICAgICAnICAgICAgICAvKiBPcHRpb25hbCBsb2dnZXI6ICovXFxuJyArXG4gICAgICAgICAgICAnICAgICAgbG9nZ2VyXFxuJyArXG4gICAgICAgICAgICAnICAgICknXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5jb25zdCBpc01vYmlsZSA9ICgpID0+IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gKHdpbmRvdy5vbnRvdWNoc3RhcnQgIT09IHVuZGVmaW5lZCkgOiBmYWxzZTtcbiIsCiAgICAiaW1wb3J0IHsgTm90QUJyb3dzZXJFcnJvciB9IGZyb20gJy4uL0FwaSc7XG5pbXBvcnQgeyBJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdyB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBFcnIsIE9rLCBSZXN1bHQgfSBmcm9tICcuLi9zZXJ2aWNlcyc7XG5cbmV4cG9ydCBjb25zdCBHZXRXaW5kb3dJbmZvID0gKCk6IFJlc3VsdDxJTmF0aXZlVGVtcGxhdGVEZWxlZ2F0ZVdpbmRvdz4gPT4ge1xuICAgIGlmKCh0eXBlb2Ygd2luZG93KSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIEVycihuZXcgTm90QUJyb3dzZXJFcnJvcigpKTtcbiAgICB9O1xuICAgIHJldHVybiBPayh7XG4gICAgICAgIGhyZWY6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxuICAgICAgICBvcmlnaW46IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4sXG4gICAgICAgIHBvcnQ6IHdpbmRvdy5sb2NhdGlvbi5wb3J0LFxuICAgICAgICBwYXRoOiAnLycgKyB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3BsaXQoJy8nKS5maWx0ZXIocGFydCA9PiBwYXJ0Lmxlbmd0aCA+IDApLmpvaW4oJy8nKSxcbiAgICAgICAgaG9zdDogd2luZG93LmxvY2F0aW9uLmhvc3QsXG4gICAgICAgIGhvc3RfbmFtZTogd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLFxuICAgICAgICBzZWFyY2g6IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gsXG4gICAgICAgIGhhc2g6IHdpbmRvdy5sb2NhdGlvbi5oYXNoLFxuICAgICAgICBwcm90b2NvbDogd2luZG93LmxvY2F0aW9uLnByb3RvY29sXG4gICAgfSk7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQUVBLFNBQVEsYUFBYTtBQUFBLEVBQ3JCLFNBQVEsU0FBUztBQUFBLEVBQ2pCLFNBQVEsVUFBVTtBQUFBLEVBQ2xCLFNBQVEsbUJBQW1CO0FBQUEsRUFDM0IsU0FBUSxVQUFVO0FBQUEsRUFDbEIsU0FBUSxjQUFjO0FBQUEsRUFDdEIsU0FBUSxjQUFjO0FBQUEsRUFDdEIsU0FBUSxvQkFBb0I7QUFBQSxFQUM1QixJQUFJLFNBQVM7QUFBQSxJQUNYLEtBQUs7QUFBQSxJQUNMLEtBQUs7QUFBQSxJQUNMLEtBQUs7QUFBQSxJQUNMLEtBQUs7QUFBQSxJQUNMLEtBQUs7QUFBQSxJ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RVI7QUFFQSxJQUFNLFdBQVcsTUFBTSxPQUFPLFdBQVcsY0FBZSxPQUFPLGlCQUFpQixZQUFhOzs7QUN4bkJ0RixJQUFNLGdCQUFnQixNQUE2QztBQUFBLEVBQ3RFLElBQUksT0FBTyxXQUFZLGFBQWE7QUFBQSxJQUNoQyxPQUFPLElBQUksSUFBSSxnQkFBa0I7QUFBQSxFQUNyQztBQUFBLEVBQ0EsT0FBTyxHQUFHO0FBQUEsSUFDTixNQUFNLE9BQU8sU0FBUztBQUFBLElBQ3RCLFFBQVEsT0FBTyxTQUFTO0FBQUEsSUFDeEIsTUFBTSxPQUFPLFNBQVM7QUFBQSxJQUN0QixNQUFNLE1BQU0sT0FBTyxTQUFTLFNBQVMsTUFBTSxHQUFHLEVBQUUsT0FBTyxVQUFRLEtBQUssU0FBUyxDQUFDLEVBQUUsS0FBSyxHQUFHO0FBQUEsSUFDeEYsTUFBTSxPQUFPLFNBQVM7QUFBQSxJQUN0QixXQUFXLE9BQU8sU0FBUztBQUFBLElBQzNCLFFBQVEsT0FBTyxTQUFTO0FBQUEsSUFDeEIsTUFBTSxPQUFPLFNBQVM7QUFBQSxJQUN0QixVQUFVLE9BQU8sU0FBUztBQUFBLEVBQzlCLENBQUM7QUFBQTsiLAogICJkZWJ1Z0lkIjogIjQ5MTgwQkY3RDBDM0Q3OEQ2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./helpers"), exports);
18
+ __exportStar(require("./models"), exports);
19
+ __exportStar(require("./services"), exports);
20
+ __exportStar(require("./Api"), exports);
21
+ //# sourceMappingURL=index.js.map