@uvl000/claude-trace 3.0.13-workflowexp.1

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 (258) hide show
  1. package/README.md +477 -0
  2. package/README.zh-CN.md +477 -0
  3. package/dist/adapt/api-format.d.ts +41 -0
  4. package/dist/adapt/api-format.d.ts.map +1 -0
  5. package/dist/adapt/api-format.js +132 -0
  6. package/dist/adapt/api-format.js.map +1 -0
  7. package/dist/adapt/openai-adapter.d.ts +123 -0
  8. package/dist/adapt/openai-adapter.d.ts.map +1 -0
  9. package/dist/adapt/openai-adapter.js +628 -0
  10. package/dist/adapt/openai-adapter.js.map +1 -0
  11. package/dist/cli/cli-common.d.ts +73 -0
  12. package/dist/cli/cli-common.d.ts.map +1 -0
  13. package/dist/cli/cli-common.js +189 -0
  14. package/dist/cli/cli-common.js.map +1 -0
  15. package/dist/cli/cli.d.ts +23 -0
  16. package/dist/cli/cli.d.ts.map +1 -0
  17. package/dist/cli/cli.js +175 -0
  18. package/dist/cli/cli.js.map +1 -0
  19. package/dist/cli/codex-cli.d.ts +24 -0
  20. package/dist/cli/codex-cli.d.ts.map +1 -0
  21. package/dist/cli/codex-cli.js +146 -0
  22. package/dist/cli/codex-cli.js.map +1 -0
  23. package/dist/cli/opencode-cli.d.ts +23 -0
  24. package/dist/cli/opencode-cli.d.ts.map +1 -0
  25. package/dist/cli/opencode-cli.js +156 -0
  26. package/dist/cli/opencode-cli.js.map +1 -0
  27. package/dist/cli/trace-runner.d.ts +21 -0
  28. package/dist/cli/trace-runner.d.ts.map +1 -0
  29. package/dist/cli/trace-runner.js +282 -0
  30. package/dist/cli/trace-runner.js.map +1 -0
  31. package/dist/cli/validate-trace.d.ts +30 -0
  32. package/dist/cli/validate-trace.d.ts.map +1 -0
  33. package/dist/cli/validate-trace.js +230 -0
  34. package/dist/cli/validate-trace.js.map +1 -0
  35. package/dist/cli/verify-offline-bundle.d.ts +13 -0
  36. package/dist/cli/verify-offline-bundle.d.ts.map +1 -0
  37. package/dist/cli/verify-offline-bundle.js +89 -0
  38. package/dist/cli/verify-offline-bundle.js.map +1 -0
  39. package/dist/cli/vibe-coding-proxy-cli.d.ts +12 -0
  40. package/dist/cli/vibe-coding-proxy-cli.d.ts.map +1 -0
  41. package/dist/cli/vibe-coding-proxy-cli.js +218 -0
  42. package/dist/cli/vibe-coding-proxy-cli.js.map +1 -0
  43. package/dist/config/claude-config-overlay.d.ts +69 -0
  44. package/dist/config/claude-config-overlay.d.ts.map +1 -0
  45. package/dist/config/claude-config-overlay.js +229 -0
  46. package/dist/config/claude-config-overlay.js.map +1 -0
  47. package/dist/config/codex-config-overlay.d.ts +122 -0
  48. package/dist/config/codex-config-overlay.d.ts.map +1 -0
  49. package/dist/config/codex-config-overlay.js +352 -0
  50. package/dist/config/codex-config-overlay.js.map +1 -0
  51. package/dist/index.d.ts +15 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +37 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/intercept/forward-proxy.d.ts +77 -0
  56. package/dist/intercept/forward-proxy.d.ts.map +1 -0
  57. package/dist/intercept/forward-proxy.js +368 -0
  58. package/dist/intercept/forward-proxy.js.map +1 -0
  59. package/dist/intercept/header-redaction.d.ts +7 -0
  60. package/dist/intercept/header-redaction.d.ts.map +1 -0
  61. package/dist/intercept/header-redaction.js +28 -0
  62. package/dist/intercept/header-redaction.js.map +1 -0
  63. package/dist/intercept/interceptor-loader.js +26 -0
  64. package/dist/intercept/interceptor.d.ts +164 -0
  65. package/dist/intercept/interceptor.d.ts.map +1 -0
  66. package/dist/intercept/interceptor.js +496 -0
  67. package/dist/intercept/interceptor.js.map +1 -0
  68. package/dist/intercept/mitm-cert.d.ts +53 -0
  69. package/dist/intercept/mitm-cert.d.ts.map +1 -0
  70. package/dist/intercept/mitm-cert.js +259 -0
  71. package/dist/intercept/mitm-cert.js.map +1 -0
  72. package/dist/intercept/proxy-log-writer.d.ts +77 -0
  73. package/dist/intercept/proxy-log-writer.d.ts.map +1 -0
  74. package/dist/intercept/proxy-log-writer.js +323 -0
  75. package/dist/intercept/proxy-log-writer.js.map +1 -0
  76. package/dist/intercept/proxy-targets.d.ts +69 -0
  77. package/dist/intercept/proxy-targets.d.ts.map +1 -0
  78. package/dist/intercept/proxy-targets.js +129 -0
  79. package/dist/intercept/proxy-targets.js.map +1 -0
  80. package/dist/intercept/reverse-proxy.d.ts +191 -0
  81. package/dist/intercept/reverse-proxy.d.ts.map +1 -0
  82. package/dist/intercept/reverse-proxy.js +807 -0
  83. package/dist/intercept/reverse-proxy.js.map +1 -0
  84. package/dist/intercept/token-extractor.js +28 -0
  85. package/dist/report/html-generator.d.ts +96 -0
  86. package/dist/report/html-generator.d.ts.map +1 -0
  87. package/dist/report/html-generator.js +225 -0
  88. package/dist/report/html-generator.js.map +1 -0
  89. package/dist/report/index-generator.d.ts +89 -0
  90. package/dist/report/index-generator.d.ts.map +1 -0
  91. package/dist/report/index-generator.js +319 -0
  92. package/dist/report/index-generator.js.map +1 -0
  93. package/dist/report/shared-conversation-processor.d.ts +200 -0
  94. package/dist/report/shared-conversation-processor.d.ts.map +1 -0
  95. package/dist/report/shared-conversation-processor.js +720 -0
  96. package/dist/report/shared-conversation-processor.js.map +1 -0
  97. package/dist/routing/codex-routing.d.ts +40 -0
  98. package/dist/routing/codex-routing.d.ts.map +1 -0
  99. package/dist/routing/codex-routing.js +96 -0
  100. package/dist/routing/codex-routing.js.map +1 -0
  101. package/dist/routing/proxy-routing.d.ts +48 -0
  102. package/dist/routing/proxy-routing.d.ts.map +1 -0
  103. package/dist/routing/proxy-routing.js +113 -0
  104. package/dist/routing/proxy-routing.js.map +1 -0
  105. package/dist/tools/binary-utils.d.ts +29 -0
  106. package/dist/tools/binary-utils.d.ts.map +1 -0
  107. package/dist/tools/binary-utils.js +134 -0
  108. package/dist/tools/binary-utils.js.map +1 -0
  109. package/dist/tools/claude.d.ts +61 -0
  110. package/dist/tools/claude.d.ts.map +1 -0
  111. package/dist/tools/claude.js +449 -0
  112. package/dist/tools/claude.js.map +1 -0
  113. package/dist/tools/codex.d.ts +70 -0
  114. package/dist/tools/codex.d.ts.map +1 -0
  115. package/dist/tools/codex.js +492 -0
  116. package/dist/tools/codex.js.map +1 -0
  117. package/dist/tools/opencode.d.ts +85 -0
  118. package/dist/tools/opencode.d.ts.map +1 -0
  119. package/dist/tools/opencode.js +401 -0
  120. package/dist/tools/opencode.js.map +1 -0
  121. package/dist/tools/types.d.ts +91 -0
  122. package/dist/tools/types.d.ts.map +1 -0
  123. package/dist/tools/types.js +11 -0
  124. package/dist/tools/types.js.map +1 -0
  125. package/dist/types.d.ts +158 -0
  126. package/dist/types.d.ts.map +1 -0
  127. package/dist/types.js +12 -0
  128. package/dist/types.js.map +1 -0
  129. package/frontend/dist/index.global.js +1551 -0
  130. package/frontend/dist/styles.css +1027 -0
  131. package/frontend/template.html +19 -0
  132. package/node_modules/agent-base/LICENSE +22 -0
  133. package/node_modules/agent-base/README.md +69 -0
  134. package/node_modules/agent-base/dist/helpers.d.ts +15 -0
  135. package/node_modules/agent-base/dist/helpers.d.ts.map +1 -0
  136. package/node_modules/agent-base/dist/helpers.js +66 -0
  137. package/node_modules/agent-base/dist/helpers.js.map +1 -0
  138. package/node_modules/agent-base/dist/index.d.ts +41 -0
  139. package/node_modules/agent-base/dist/index.d.ts.map +1 -0
  140. package/node_modules/agent-base/dist/index.js +178 -0
  141. package/node_modules/agent-base/dist/index.js.map +1 -0
  142. package/node_modules/agent-base/package.json +46 -0
  143. package/node_modules/debug/LICENSE +20 -0
  144. package/node_modules/debug/README.md +481 -0
  145. package/node_modules/debug/package.json +64 -0
  146. package/node_modules/debug/src/browser.js +272 -0
  147. package/node_modules/debug/src/common.js +292 -0
  148. package/node_modules/debug/src/index.js +10 -0
  149. package/node_modules/debug/src/node.js +263 -0
  150. package/node_modules/http-proxy-agent/LICENSE +22 -0
  151. package/node_modules/http-proxy-agent/README.md +44 -0
  152. package/node_modules/http-proxy-agent/dist/index.d.ts +44 -0
  153. package/node_modules/http-proxy-agent/dist/index.d.ts.map +1 -0
  154. package/node_modules/http-proxy-agent/dist/index.js +148 -0
  155. package/node_modules/http-proxy-agent/dist/index.js.map +1 -0
  156. package/node_modules/http-proxy-agent/package.json +47 -0
  157. package/node_modules/https-proxy-agent/LICENSE +22 -0
  158. package/node_modules/https-proxy-agent/README.md +70 -0
  159. package/node_modules/https-proxy-agent/dist/index.d.ts +47 -0
  160. package/node_modules/https-proxy-agent/dist/index.d.ts.map +1 -0
  161. package/node_modules/https-proxy-agent/dist/index.js +180 -0
  162. package/node_modules/https-proxy-agent/dist/index.js.map +1 -0
  163. package/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts +15 -0
  164. package/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts.map +1 -0
  165. package/node_modules/https-proxy-agent/dist/parse-proxy-response.js +101 -0
  166. package/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map +1 -0
  167. package/node_modules/https-proxy-agent/package.json +50 -0
  168. package/node_modules/ms/index.js +162 -0
  169. package/node_modules/ms/license.md +21 -0
  170. package/node_modules/ms/package.json +38 -0
  171. package/node_modules/ms/readme.md +59 -0
  172. package/node_modules/node-forge/LICENSE +331 -0
  173. package/node_modules/node-forge/README.md +2071 -0
  174. package/node_modules/node-forge/dist/forge.all.min.js +2 -0
  175. package/node_modules/node-forge/dist/forge.all.min.js.map +1 -0
  176. package/node_modules/node-forge/dist/forge.min.js +2 -0
  177. package/node_modules/node-forge/dist/forge.min.js.map +1 -0
  178. package/node_modules/node-forge/dist/prime.worker.min.js +2 -0
  179. package/node_modules/node-forge/dist/prime.worker.min.js.map +1 -0
  180. package/node_modules/node-forge/flash/swf/SocketPool.swf +0 -0
  181. package/node_modules/node-forge/lib/aes.js +1091 -0
  182. package/node_modules/node-forge/lib/aesCipherSuites.js +282 -0
  183. package/node_modules/node-forge/lib/asn1-validator.js +91 -0
  184. package/node_modules/node-forge/lib/asn1.js +1503 -0
  185. package/node_modules/node-forge/lib/baseN.js +186 -0
  186. package/node_modules/node-forge/lib/cipher.js +230 -0
  187. package/node_modules/node-forge/lib/cipherModes.js +999 -0
  188. package/node_modules/node-forge/lib/des.js +496 -0
  189. package/node_modules/node-forge/lib/ed25519.js +1091 -0
  190. package/node_modules/node-forge/lib/forge.js +13 -0
  191. package/node_modules/node-forge/lib/form.js +149 -0
  192. package/node_modules/node-forge/lib/hmac.js +146 -0
  193. package/node_modules/node-forge/lib/http.js +1346 -0
  194. package/node_modules/node-forge/lib/index.all.js +16 -0
  195. package/node_modules/node-forge/lib/index.js +33 -0
  196. package/node_modules/node-forge/lib/jsbn.js +1294 -0
  197. package/node_modules/node-forge/lib/kem.js +168 -0
  198. package/node_modules/node-forge/lib/log.js +319 -0
  199. package/node_modules/node-forge/lib/md.all.js +13 -0
  200. package/node_modules/node-forge/lib/md.js +11 -0
  201. package/node_modules/node-forge/lib/md5.js +289 -0
  202. package/node_modules/node-forge/lib/mgf.js +12 -0
  203. package/node_modules/node-forge/lib/mgf1.js +57 -0
  204. package/node_modules/node-forge/lib/oids.js +180 -0
  205. package/node_modules/node-forge/lib/pbe.js +1023 -0
  206. package/node_modules/node-forge/lib/pbkdf2.js +211 -0
  207. package/node_modules/node-forge/lib/pem.js +237 -0
  208. package/node_modules/node-forge/lib/pkcs1.js +276 -0
  209. package/node_modules/node-forge/lib/pkcs12.js +1078 -0
  210. package/node_modules/node-forge/lib/pkcs7.js +1260 -0
  211. package/node_modules/node-forge/lib/pkcs7asn1.js +410 -0
  212. package/node_modules/node-forge/lib/pki.js +102 -0
  213. package/node_modules/node-forge/lib/prime.js +297 -0
  214. package/node_modules/node-forge/lib/prime.worker.js +168 -0
  215. package/node_modules/node-forge/lib/prng.js +419 -0
  216. package/node_modules/node-forge/lib/pss.js +241 -0
  217. package/node_modules/node-forge/lib/random.js +191 -0
  218. package/node_modules/node-forge/lib/rc2.js +410 -0
  219. package/node_modules/node-forge/lib/rsa.js +1968 -0
  220. package/node_modules/node-forge/lib/sha1.js +319 -0
  221. package/node_modules/node-forge/lib/sha256.js +327 -0
  222. package/node_modules/node-forge/lib/sha512.js +561 -0
  223. package/node_modules/node-forge/lib/socket.js +287 -0
  224. package/node_modules/node-forge/lib/ssh.js +236 -0
  225. package/node_modules/node-forge/lib/tls.js +4282 -0
  226. package/node_modules/node-forge/lib/tlssocket.js +249 -0
  227. package/node_modules/node-forge/lib/util.js +2652 -0
  228. package/node_modules/node-forge/lib/x509.js +3251 -0
  229. package/node_modules/node-forge/lib/xhr.js +738 -0
  230. package/node_modules/node-forge/package.json +123 -0
  231. package/node_modules/smol-toml/LICENSE +24 -0
  232. package/node_modules/smol-toml/README.md +239 -0
  233. package/node_modules/smol-toml/dist/date.d.ts +41 -0
  234. package/node_modules/smol-toml/dist/date.js +127 -0
  235. package/node_modules/smol-toml/dist/error.d.ts +38 -0
  236. package/node_modules/smol-toml/dist/error.js +63 -0
  237. package/node_modules/smol-toml/dist/extract.d.ts +30 -0
  238. package/node_modules/smol-toml/dist/extract.js +100 -0
  239. package/node_modules/smol-toml/dist/index.cjs +897 -0
  240. package/node_modules/smol-toml/dist/index.d.ts +43 -0
  241. package/node_modules/smol-toml/dist/index.js +33 -0
  242. package/node_modules/smol-toml/dist/parse.d.ts +37 -0
  243. package/node_modules/smol-toml/dist/parse.js +148 -0
  244. package/node_modules/smol-toml/dist/primitive.d.ts +31 -0
  245. package/node_modules/smol-toml/dist/primitive.js +179 -0
  246. package/node_modules/smol-toml/dist/stringify.d.ts +31 -0
  247. package/node_modules/smol-toml/dist/stringify.js +167 -0
  248. package/node_modules/smol-toml/dist/struct.d.ts +32 -0
  249. package/node_modules/smol-toml/dist/struct.js +184 -0
  250. package/node_modules/smol-toml/dist/util.d.ts +42 -0
  251. package/node_modules/smol-toml/dist/util.js +111 -0
  252. package/node_modules/smol-toml/package.json +54 -0
  253. package/offline/bin/claude-trace +6 -0
  254. package/offline/bin/claude-wrapper +13 -0
  255. package/offline/bin/install-agent +14 -0
  256. package/offline/bin/validate-trace +6 -0
  257. package/offline/bin/verify-bundle +7 -0
  258. package/package.json +103 -0
@@ -0,0 +1,1551 @@
1
+ /* Claude Tools Frontend Bundle */
2
+ "use strict";var ClaudeApp=(()=>{var ws=Object.defineProperty;var $s=Object.getOwnPropertyDescriptor;var S=(o,e,t,s)=>{for(var n=s>1?void 0:s?$s(e,t):e,r=o.length-1,i;r>=0;r--)(i=o[r])&&(n=(s?i(e,t,n):i(n))||n);return s&&n&&ws(e,t,n),n};var bt=class{get shadowRoot(){return this.__host.__shadowRoot}constructor(e){this.ariaAtomic="",this.ariaAutoComplete="",this.ariaBrailleLabel="",this.ariaBrailleRoleDescription="",this.ariaBusy="",this.ariaChecked="",this.ariaColCount="",this.ariaColIndex="",this.ariaColSpan="",this.ariaCurrent="",this.ariaDescription="",this.ariaDisabled="",this.ariaExpanded="",this.ariaHasPopup="",this.ariaHidden="",this.ariaInvalid="",this.ariaKeyShortcuts="",this.ariaLabel="",this.ariaLevel="",this.ariaLive="",this.ariaModal="",this.ariaMultiLine="",this.ariaMultiSelectable="",this.ariaOrientation="",this.ariaPlaceholder="",this.ariaPosInSet="",this.ariaPressed="",this.ariaReadOnly="",this.ariaRequired="",this.ariaRoleDescription="",this.ariaRowCount="",this.ariaRowIndex="",this.ariaRowSpan="",this.ariaSelected="",this.ariaSetSize="",this.ariaSort="",this.ariaValueMax="",this.ariaValueMin="",this.ariaValueNow="",this.ariaValueText="",this.role="",this.form=null,this.labels=[],this.states=new Set,this.validationMessage="",this.validity={},this.willValidate=!0,this.__host=e}checkValidity(){return console.warn("`ElementInternals.checkValidity()` was called on the server.This method always returns true."),!0}reportValidity(){return!0}setFormValue(){}setValidity(){}};var M=function(o,e,t,s,n){if(s==="m")throw new TypeError("Private method is not writable");if(s==="a"&&!n)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?o!==e||!n:!e.has(o))throw new TypeError("Cannot write private member to an object whose class did not declare it");return s==="a"?n.call(o,t):n?n.value=t:e.set(o,t),t},E=function(o,e,t,s){if(t==="a"&&!s)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?o!==e||!s:!e.has(o))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?s:t==="a"?s.call(o):s?s.value:e.get(o)},Q,Se,Ae,ie,Fe,oe,Ce,j,ae,N,Pe,_t,wt=o=>typeof o=="boolean"?o:o?.capture??!1;var Ts=class{constructor(){this.__eventListeners=new Map,this.__captureEventListeners=new Map}addEventListener(e,t,s){if(t==null)return;let n=wt(s)?this.__captureEventListeners:this.__eventListeners,r=n.get(e);if(r===void 0)r=new Map,n.set(e,r);else if(r.has(t))return;let i=typeof s=="object"&&s?s:{};i.signal?.addEventListener("abort",()=>this.removeEventListener(e,t,s)),r.set(t,i??{})}removeEventListener(e,t,s){if(t==null)return;let n=wt(s)?this.__captureEventListeners:this.__eventListeners,r=n.get(e);r!==void 0&&(r.delete(t),r.size||n.delete(e))}dispatchEvent(e){let t=[this],s=this.__eventTargetParent;if(e.composed)for(;s;)t.push(s),s=s.__eventTargetParent;else for(;s&&s!==this.__host;)t.push(s),s=s.__eventTargetParent;let n=!1,r=!1,i=0,l=null,a=null,u=null,c=e.stopPropagation,p=e.stopImmediatePropagation;Object.defineProperties(e,{target:{get(){return l??a},...y},srcElement:{get(){return e.target},...y},currentTarget:{get(){return u},...y},eventPhase:{get(){return i},...y},composedPath:{value:()=>t,...y},stopPropagation:{value:()=>{n=!0,c.call(e)},...y},stopImmediatePropagation:{value:()=>{r=!0,p.call(e)},...y}});let h=(x,f,b)=>{typeof x=="function"?x(e):typeof x?.handleEvent=="function"&&x.handleEvent(e),f.once&&b.delete(x)},m=()=>(u=null,i=0,!e.defaultPrevented),v=t.slice().reverse();l=!this.__host||!e.composed?this:null;let _=x=>{for(a=this;a.__host&&x.includes(a.__host);)a=a.__host};for(let x of v){!l&&(!a||a===x.__host)&&_(v.slice(v.indexOf(x))),u=x,i=x===e.target?2:1;let f=x.__captureEventListeners.get(e.type);if(f){for(let[b,T]of f)if(h(b,T,f),r)return m()}if(n)return m()}let $=e.bubbles?t:[this];a=null;for(let x of $){!l&&(!a||x===a.__host)&&_($.slice(0,$.indexOf(x)+1)),u=x,i=x===e.target?2:3;let f=x.__eventListeners.get(e.type);if(f){for(let[b,T]of f)if(h(b,T,f),r)return m()}if(n)return m()}return m()}},We=Ts;var y={__proto__:null};y.enumerable=!0;Object.freeze(y);var Je=(N=class{constructor(e,t={}){if(Q.set(this,!1),Se.set(this,!1),Ae.set(this,!1),ie.set(this,!1),Fe.set(this,Date.now()),oe.set(this,!1),Ce.set(this,void 0),j.set(this,void 0),ae.set(this,void 0),this.NONE=0,this.CAPTURING_PHASE=1,this.AT_TARGET=2,this.BUBBLING_PHASE=3,arguments.length===0)throw new Error("The type argument must be specified");if(typeof t!="object"||!t)throw new Error('The "options" argument must be an object');let{bubbles:s,cancelable:n,composed:r}=t;M(this,Q,!!n,"f"),M(this,Se,!!s,"f"),M(this,Ae,!!r,"f"),M(this,Ce,`${e}`,"f"),M(this,j,null,"f"),M(this,ae,!1,"f")}initEvent(e,t,s){throw new Error("Method not implemented.")}stopImmediatePropagation(){this.stopPropagation()}preventDefault(){M(this,ie,!0,"f")}get target(){return E(this,j,"f")}get currentTarget(){return E(this,j,"f")}get srcElement(){return E(this,j,"f")}get type(){return E(this,Ce,"f")}get cancelable(){return E(this,Q,"f")}get defaultPrevented(){return E(this,Q,"f")&&E(this,ie,"f")}get timeStamp(){return E(this,Fe,"f")}composedPath(){return E(this,ae,"f")?[E(this,j,"f")]:[]}get returnValue(){return!E(this,Q,"f")||!E(this,ie,"f")}get bubbles(){return E(this,Se,"f")}get composed(){return E(this,Ae,"f")}get eventPhase(){return E(this,ae,"f")?N.AT_TARGET:N.NONE}get cancelBubble(){return E(this,oe,"f")}set cancelBubble(e){e&&M(this,oe,!0,"f")}stopPropagation(){M(this,oe,!0,"f")}get isTrusted(){return!1}},Q=new WeakMap,Se=new WeakMap,Ae=new WeakMap,ie=new WeakMap,Fe=new WeakMap,oe=new WeakMap,Ce=new WeakMap,j=new WeakMap,ae=new WeakMap,N.NONE=0,N.CAPTURING_PHASE=1,N.AT_TARGET=2,N.BUBBLING_PHASE=3,N);Object.defineProperties(Je.prototype,{initEvent:y,stopImmediatePropagation:y,preventDefault:y,target:y,currentTarget:y,srcElement:y,type:y,cancelable:y,defaultPrevented:y,timeStamp:y,composedPath:y,returnValue:y,bubbles:y,composed:y,eventPhase:y,cancelBubble:y,stopPropagation:y,isTrusted:y});var $t=(_t=class extends Je{constructor(e,t={}){super(e,t),Pe.set(this,void 0),M(this,Pe,t?.detail??null,"f")}initCustomEvent(e,t,s,n){throw new Error("Method not implemented.")}get detail(){return E(this,Pe,"f")}},Pe=new WeakMap,_t);Object.defineProperties($t.prototype,{detail:y});var Ge=Je,Ze=$t;globalThis.Event??=Ge;globalThis.CustomEvent??=Ze;var Tt=new WeakMap,le=o=>{let e=Tt.get(o);return e===void 0&&Tt.set(o,e=new Map),e},Es=class extends We{constructor(){super(...arguments),this.__shadowRootMode=null,this.__shadowRoot=null,this.__internals=null}get attributes(){return Array.from(le(this)).map(([e,t])=>({name:e,value:t}))}get shadowRoot(){return this.__shadowRootMode==="closed"?null:this.__shadowRoot}get localName(){return this.constructor.__localName}get tagName(){return this.localName?.toUpperCase()}setAttribute(e,t){le(this).set(e,String(t))}removeAttribute(e){le(this).delete(e)}toggleAttribute(e,t){if(this.hasAttribute(e)){if(t===void 0||!t)return this.removeAttribute(e),!1}else return t===void 0||t?(this.setAttribute(e,""),!0):!1;return!0}hasAttribute(e){return le(this).has(e)}attachShadow(e){let t={host:this};return this.__shadowRootMode=e.mode,e&&e.mode==="open"&&(this.__shadowRoot=t),t}attachInternals(){if(this.__internals!==null)throw new Error("Failed to execute 'attachInternals' on 'HTMLElement': ElementInternals for the specified element was already attached.");let e=new bt(this);return this.__internals=e,e}getAttribute(e){return le(this).get(e)??null}};var Ss=class extends Es{},Ve=Ss;globalThis.litServerRoot??=Object.defineProperty(new Ve,"localName",{get(){return"lit-server-root"}});var As=class{constructor(){this.__definitions=new Map}define(e,t){if(this.__definitions.has(e))if(process.env.NODE_ENV==="development")console.warn(`'CustomElementRegistry' already has "${e}" defined. This may have been caused by live reload or hot module replacement in which case it can be safely ignored.
3
+ Make sure to test your application with a production build as repeat registrations will throw in production.`);else throw new Error(`Failed to execute 'define' on 'CustomElementRegistry': the name "${e}" has already been used with this registry`);t.__localName=e,this.__definitions.set(e,{ctor:t,observedAttributes:t.observedAttributes??[]})}get(e){return this.__definitions.get(e)?.ctor}},Cs=As;var Et=new Cs;var ce=globalThis,Me=ce.ShadowRoot&&(ce.ShadyCSS===void 0||ce.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,At=Symbol(),St=new WeakMap,Re=class{constructor(e,t,s){if(this._$cssResult$=!0,s!==At)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e,this.t=t}get styleSheet(){let e=this.o,t=this.t;if(Me&&e===void 0){let s=t!==void 0&&t.length===1;s&&(e=St.get(t)),e===void 0&&((this.o=e=new CSSStyleSheet).replaceSync(this.cssText),s&&St.set(t,e))}return e}toString(){return this.cssText}},Ct=o=>new Re(typeof o=="string"?o:o+"",void 0,At);var Pt=(o,e)=>{if(Me)o.adoptedStyleSheets=e.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(let t of e){let s=document.createElement("style"),n=ce.litNonce;n!==void 0&&s.setAttribute("nonce",n),s.textContent=t.cssText,o.appendChild(s)}},Qe=Me||ce.CSSStyleSheet===void 0?o=>o:o=>o instanceof CSSStyleSheet?(e=>{let t="";for(let s of e.cssRules)t+=s.cssText;return Ct(t)})(o):o;var{is:Ps,defineProperty:Rs,getOwnPropertyDescriptor:Ms,getOwnPropertyNames:Is,getOwnPropertySymbols:Os,getPrototypeOf:Ls}=Object,de=globalThis;de.customElements??=Et;var Rt=de.trustedTypes,Bs=Rt?Rt.emptyScript:"",Ns=de.reactiveElementPolyfillSupport,ue=(o,e)=>o,pe={toAttribute(o,e){switch(e){case Boolean:o=o?Bs:null;break;case Object:case Array:o=o==null?o:JSON.stringify(o)}return o},fromAttribute(o,e){let t=o;switch(e){case Boolean:t=o!==null;break;case Number:t=o===null?null:Number(o);break;case Object:case Array:try{t=JSON.parse(o)}catch{t=null}}return t}},Ie=(o,e)=>!Ps(o,e),Mt={attribute:!0,type:String,converter:pe,reflect:!1,useDefault:!1,hasChanged:Ie};Symbol.metadata??=Symbol("metadata"),de.litPropertyMetadata??=new WeakMap;var I=class extends(globalThis.HTMLElement??Ve){static addInitializer(e){this._$Ei(),(this.l??=[]).push(e)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(e,t=Mt){if(t.state&&(t.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(e)&&((t=Object.create(t)).wrapped=!0),this.elementProperties.set(e,t),!t.noAccessor){let s=Symbol(),n=this.getPropertyDescriptor(e,s,t);n!==void 0&&Rs(this.prototype,e,n)}}static getPropertyDescriptor(e,t,s){let{get:n,set:r}=Ms(this.prototype,e)??{get(){return this[t]},set(i){this[t]=i}};return{get:n,set(i){let l=n?.call(this);r?.call(this,i),this.requestUpdate(e,l,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??Mt}static _$Ei(){if(this.hasOwnProperty(ue("elementProperties")))return;let e=Ls(this);e.finalize(),e.l!==void 0&&(this.l=[...e.l]),this.elementProperties=new Map(e.elementProperties)}static finalize(){if(this.hasOwnProperty(ue("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(ue("properties"))){let t=this.properties,s=[...Is(t),...Os(t)];for(let n of s)this.createProperty(n,t[n])}let e=this[Symbol.metadata];if(e!==null){let t=litPropertyMetadata.get(e);if(t!==void 0)for(let[s,n]of t)this.elementProperties.set(s,n)}this._$Eh=new Map;for(let[t,s]of this.elementProperties){let n=this._$Eu(t,s);n!==void 0&&this._$Eh.set(n,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(e){let t=[];if(Array.isArray(e)){let s=new Set(e.flat(1/0).reverse());for(let n of s)t.unshift(Qe(n))}else e!==void 0&&t.push(Qe(e));return t}static _$Eu(e,t){let s=t.attribute;return s===!1?void 0:typeof s=="string"?s:typeof e=="string"?e.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(e=>this.enableUpdating=e),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(e=>e(this))}addController(e){(this._$EO??=new Set).add(e),this.renderRoot!==void 0&&this.isConnected&&e.hostConnected?.()}removeController(e){this._$EO?.delete(e)}_$E_(){let e=new Map,t=this.constructor.elementProperties;for(let s of t.keys())this.hasOwnProperty(s)&&(e.set(s,this[s]),delete this[s]);e.size>0&&(this._$Ep=e)}createRenderRoot(){let e=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return Pt(e,this.constructor.elementStyles),e}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(e=>e.hostConnected?.())}enableUpdating(e){}disconnectedCallback(){this._$EO?.forEach(e=>e.hostDisconnected?.())}attributeChangedCallback(e,t,s){this._$AK(e,s)}_$ET(e,t){let s=this.constructor.elementProperties.get(e),n=this.constructor._$Eu(e,s);if(n!==void 0&&s.reflect===!0){let r=(s.converter?.toAttribute!==void 0?s.converter:pe).toAttribute(t,s.type);this._$Em=e,r==null?this.removeAttribute(n):this.setAttribute(n,r),this._$Em=null}}_$AK(e,t){let s=this.constructor,n=s._$Eh.get(e);if(n!==void 0&&this._$Em!==n){let r=s.getPropertyOptions(n),i=typeof r.converter=="function"?{fromAttribute:r.converter}:r.converter?.fromAttribute!==void 0?r.converter:pe;this._$Em=n,this[n]=i.fromAttribute(t,r.type)??this._$Ej?.get(n)??null,this._$Em=null}}requestUpdate(e,t,s){if(e!==void 0){let n=this.constructor,r=this[e];if(s??=n.getPropertyOptions(e),!((s.hasChanged??Ie)(r,t)||s.useDefault&&s.reflect&&r===this._$Ej?.get(e)&&!this.hasAttribute(n._$Eu(e,s))))return;this.C(e,t,s)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(e,t,{useDefault:s,reflect:n,wrapped:r},i){s&&!(this._$Ej??=new Map).has(e)&&(this._$Ej.set(e,i??t??this[e]),r!==!0||i!==void 0)||(this._$AL.has(e)||(this.hasUpdated||s||(t=void 0),this._$AL.set(e,t)),n===!0&&this._$Em!==e&&(this._$Eq??=new Set).add(e))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}let e=this.scheduleUpdate();return e!=null&&await e,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[n,r]of this._$Ep)this[n]=r;this._$Ep=void 0}let s=this.constructor.elementProperties;if(s.size>0)for(let[n,r]of s){let{wrapped:i}=r,l=this[n];i!==!0||this._$AL.has(n)||l===void 0||this.C(n,void 0,r,l)}}let e=!1,t=this._$AL;try{e=this.shouldUpdate(t),e?(this.willUpdate(t),this._$EO?.forEach(s=>s.hostUpdate?.()),this.update(t)):this._$EM()}catch(s){throw e=!1,this._$EM(),s}e&&this._$AE(t)}willUpdate(e){}_$AE(e){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(e){return!0}update(e){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(e){}firstUpdated(e){}};I.elementStyles=[],I.shadowRootOptions={mode:"open"},I[ue("elementProperties")]=new Map,I[ue("finalized")]=new Map,Ns?.({ReactiveElement:I}),(de.reactiveElementVersions??=[]).push("2.1.0");var Le=globalThis,Oe=Le.trustedTypes,It=Oe?Oe.createPolicy("lit-html",{createHTML:o=>o}):void 0,Dt="$lit$",q=`lit$${Math.random().toFixed(9).slice(2)}$`,zt="?"+q,qs=`<${zt}>`,J=Le.document===void 0?{createTreeWalker:()=>({})}:document,me=()=>J.createComment(""),fe=o=>o===null||typeof o!="object"&&typeof o!="function",nt=Array.isArray,Ds=o=>nt(o)||typeof o?.[Symbol.iterator]=="function",Xe=`[
4
+ \f\r]`,he=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Ot=/-->/g,Lt=/>/g,F=RegExp(`>|${Xe}(?:([^\\s"'>=/]+)(${Xe}*=${Xe}*(?:[^
5
+ \f\r"'\`<>=]|("|')|))|$)`,"g"),Bt=/'/g,Nt=/"/g,Ht=/^(?:script|style|textarea|title)$/i,rt=o=>(e,...t)=>({_$litType$:o,strings:e,values:t}),d=rt(1),ar=rt(2),lr=rt(3),O=Symbol.for("lit-noChange"),w=Symbol.for("lit-nothing"),qt=new WeakMap,W=J.createTreeWalker(J,129);function Ut(o,e){if(!nt(o)||!o.hasOwnProperty("raw"))throw Error("invalid template strings array");return It!==void 0?It.createHTML(e):e}var zs=(o,e)=>{let t=o.length-1,s=[],n,r=e===2?"<svg>":e===3?"<math>":"",i=he;for(let l=0;l<t;l++){let a=o[l],u,c,p=-1,h=0;for(;h<a.length&&(i.lastIndex=h,c=i.exec(a),c!==null);)h=i.lastIndex,i===he?c[1]==="!--"?i=Ot:c[1]!==void 0?i=Lt:c[2]!==void 0?(Ht.test(c[2])&&(n=RegExp("</"+c[2],"g")),i=F):c[3]!==void 0&&(i=F):i===F?c[0]===">"?(i=n??he,p=-1):c[1]===void 0?p=-2:(p=i.lastIndex-c[2].length,u=c[1],i=c[3]===void 0?F:c[3]==='"'?Nt:Bt):i===Nt||i===Bt?i=F:i===Ot||i===Lt?i=he:(i=F,n=void 0);let m=i===F&&o[l+1].startsWith("/>")?" ":"";r+=i===he?a+qs:p>=0?(s.push(u),a.slice(0,p)+Dt+a.slice(p)+q+m):a+q+(p===-2?l:m)}return[Ut(o,r+(o[t]||"<?>")+(e===2?"</svg>":e===3?"</math>":"")),s]},ge=class o{constructor({strings:e,_$litType$:t},s){let n;this.parts=[];let r=0,i=0,l=e.length-1,a=this.parts,[u,c]=zs(e,t);if(this.el=o.createElement(u,s),W.currentNode=this.el.content,t===2||t===3){let p=this.el.content.firstChild;p.replaceWith(...p.childNodes)}for(;(n=W.nextNode())!==null&&a.length<l;){if(n.nodeType===1){if(n.hasAttributes())for(let p of n.getAttributeNames())if(p.endsWith(Dt)){let h=c[i++],m=n.getAttribute(p).split(q),v=/([.?@])?(.*)/.exec(h);a.push({type:1,index:r,name:v[2],strings:m,ctor:v[1]==="."?Ke:v[1]==="?"?et:v[1]==="@"?tt:Y}),n.removeAttribute(p)}else p.startsWith(q)&&(a.push({type:6,index:r}),n.removeAttribute(p));if(Ht.test(n.tagName)){let p=n.textContent.split(q),h=p.length-1;if(h>0){n.textContent=Oe?Oe.emptyScript:"";for(let m=0;m<h;m++)n.append(p[m],me()),W.nextNode(),a.push({type:2,index:++r});n.append(p[h],me())}}}else if(n.nodeType===8)if(n.data===zt)a.push({type:2,index:r});else{let p=-1;for(;(p=n.data.indexOf(q,p+1))!==-1;)a.push({type:7,index:r}),p+=q.length-1}r++}}static createElement(e,t){let s=J.createElement("template");return s.innerHTML=e,s}};function X(o,e,t=o,s){if(e===O)return e;let n=s!==void 0?t._$Co?.[s]:t._$Cl,r=fe(e)?void 0:e._$litDirective$;return n?.constructor!==r&&(n?._$AO?.(!1),r===void 0?n=void 0:(n=new r(o),n._$AT(o,t,s)),s!==void 0?(t._$Co??=[])[s]=n:t._$Cl=n),n!==void 0&&(e=X(o,n._$AS(o,e.values),n,s)),e}var Ye=class{constructor(e,t){this._$AV=[],this._$AN=void 0,this._$AD=e,this._$AM=t}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(e){let{el:{content:t},parts:s}=this._$AD,n=(e?.creationScope??J).importNode(t,!0);W.currentNode=n;let r=W.nextNode(),i=0,l=0,a=s[0];for(;a!==void 0;){if(i===a.index){let u;a.type===2?u=new ve(r,r.nextSibling,this,e):a.type===1?u=new a.ctor(r,a.name,a.strings,this,e):a.type===6&&(u=new st(r,this,e)),this._$AV.push(u),a=s[++l]}i!==a?.index&&(r=W.nextNode(),i++)}return W.currentNode=J,n}p(e){let t=0;for(let s of this._$AV)s!==void 0&&(s.strings!==void 0?(s._$AI(e,s,t),t+=s.strings.length-2):s._$AI(e[t])),t++}},ve=class o{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(e,t,s,n){this.type=2,this._$AH=w,this._$AN=void 0,this._$AA=e,this._$AB=t,this._$AM=s,this.options=n,this._$Cv=n?.isConnected??!0}get parentNode(){let e=this._$AA.parentNode,t=this._$AM;return t!==void 0&&e?.nodeType===11&&(e=t.parentNode),e}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(e,t=this){e=X(this,e,t),fe(e)?e===w||e==null||e===""?(this._$AH!==w&&this._$AR(),this._$AH=w):e!==this._$AH&&e!==O&&this._(e):e._$litType$!==void 0?this.$(e):e.nodeType!==void 0?this.T(e):Ds(e)?this.k(e):this._(e)}O(e){return this._$AA.parentNode.insertBefore(e,this._$AB)}T(e){this._$AH!==e&&(this._$AR(),this._$AH=this.O(e))}_(e){this._$AH!==w&&fe(this._$AH)?this._$AA.nextSibling.data=e:this.T(J.createTextNode(e)),this._$AH=e}$(e){let{values:t,_$litType$:s}=e,n=typeof s=="number"?this._$AC(e):(s.el===void 0&&(s.el=ge.createElement(Ut(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===n)this._$AH.p(t);else{let r=new Ye(n,this),i=r.u(this.options);r.p(t),this.T(i),this._$AH=r}}_$AC(e){let t=qt.get(e.strings);return t===void 0&&qt.set(e.strings,t=new ge(e)),t}k(e){nt(this._$AH)||(this._$AH=[],this._$AR());let t=this._$AH,s,n=0;for(let r of e)n===t.length?t.push(s=new o(this.O(me()),this.O(me()),this,this.options)):s=t[n],s._$AI(r),n++;n<t.length&&(this._$AR(s&&s._$AB.nextSibling,n),t.length=n)}_$AR(e=this._$AA.nextSibling,t){for(this._$AP?.(!1,!0,t);e&&e!==this._$AB;){let s=e.nextSibling;e.remove(),e=s}}setConnected(e){this._$AM===void 0&&(this._$Cv=e,this._$AP?.(e))}},Y=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(e,t,s,n,r){this.type=1,this._$AH=w,this._$AN=void 0,this.element=e,this.name=t,this._$AM=n,this.options=r,s.length>2||s[0]!==""||s[1]!==""?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=w}_$AI(e,t=this,s,n){let r=this.strings,i=!1;if(r===void 0)e=X(this,e,t,0),i=!fe(e)||e!==this._$AH&&e!==O,i&&(this._$AH=e);else{let l=e,a,u;for(e=r[0],a=0;a<r.length-1;a++)u=X(this,l[s+a],t,a),u===O&&(u=this._$AH[a]),i||=!fe(u)||u!==this._$AH[a],u===w?e=w:e!==w&&(e+=(u??"")+r[a+1]),this._$AH[a]=u}i&&!n&&this.j(e)}j(e){e===w?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,e??"")}},Ke=class extends Y{constructor(){super(...arguments),this.type=3}j(e){this.element[this.name]=e===w?void 0:e}},et=class extends Y{constructor(){super(...arguments),this.type=4}j(e){this.element.toggleAttribute(this.name,!!e&&e!==w)}},tt=class extends Y{constructor(e,t,s,n,r){super(e,t,s,n,r),this.type=5}_$AI(e,t=this){if((e=X(this,e,t,0)??w)===O)return;let s=this._$AH,n=e===w&&s!==w||e.capture!==s.capture||e.once!==s.once||e.passive!==s.passive,r=e!==w&&(s===w||n);n&&this.element.removeEventListener(this.name,this,s),r&&this.element.addEventListener(this.name,this,e),this._$AH=e}handleEvent(e){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,e):this._$AH.handleEvent(e)}},st=class{constructor(e,t,s){this.element=e,this.type=6,this._$AN=void 0,this._$AM=t,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(e){X(this,e)}};var Hs=Le.litHtmlPolyfillSupport;Hs?.(ge,ve),(Le.litHtmlVersions??=[]).push("3.3.0");var jt=(o,e,t)=>{let s=t?.renderBefore??e,n=s._$litPart$;if(n===void 0){let r=t?.renderBefore??null;s._$litPart$=n=new ve(e.insertBefore(me(),r),r,void 0,t??{})}return n._$AI(o),n};var it=globalThis,A=class extends I{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let e=super.createRenderRoot();return this.renderOptions.renderBefore??=e.firstChild,e}update(e){let t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(e),this._$Do=jt(t,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return O}};A._$litElement$=!0,A.finalized=!0,it.litElementHydrateSupport?.({LitElement:A});var Us=it.litElementPolyfillSupport;Us?.({LitElement:A});(it.litElementVersions??=[]).push("4.2.0");var D=o=>(e,t)=>{t!==void 0?t.addInitializer(()=>{customElements.define(o,e)}):customElements.define(o,e)};var js={attribute:!0,type:String,converter:pe,reflect:!1,hasChanged:Ie},Fs=(o=js,e,t)=>{let{kind:s,metadata:n}=t,r=globalThis.litPropertyMetadata.get(n);if(r===void 0&&globalThis.litPropertyMetadata.set(n,r=new Map),s==="setter"&&((o=Object.create(o)).wrapped=!0),r.set(t.name,o),s==="accessor"){let{name:i}=t;return{set(l){let a=e.get.call(this);e.set.call(this,l),this.requestUpdate(i,a,o)},init(l){return l!==void 0&&this.C(i,void 0,o,l),l}}}if(s==="setter"){let{name:i}=t;return function(l){let a=this[i];e.call(this,l),this.requestUpdate(i,a,o)}}throw Error("Unsupported decorator location: "+s)};function z(o){return(e,t)=>typeof t=="object"?Fs(o,e,t):((s,n,r)=>{let i=n.hasOwnProperty(r);return n.constructor.createProperty(r,s),i?Object.getOwnPropertyDescriptor(n,r):void 0})(o,e,t)}function K(o){return z({...o,state:!0,attribute:!1})}function Jt(o){return o?o.includes("/chat/completions")?"openai":o.includes("/responses")?"openai-responses":o.includes("/messages")?"anthropic":"unknown":"unknown"}function Ft(o){if(!o||typeof o!="object")return"unknown";let e=o;return"choices"in e?"openai":"output"in e&&Array.isArray(e.output)?"openai-responses":"content"in e&&Array.isArray(e.content)&&e.content.some(s=>typeof s=="object"&&s!==null&&"type"in s)?"anthropic":"messages"in e&&Array.isArray(e.messages)&&e.messages.some(s=>typeof s=="object"&&s!==null&&"role"in s&&(s.role==="tool"||"tool_calls"in s))?"openai":"unknown"}var Ws={anthropic:"Anthropic Messages",openai:"OpenAI Chat","openai-responses":"OpenAI Responses",unknown:"Unknown"};function Wt(o){return Ws[o]??o}function ot(o){let e=[...new Set(o.filter(t=>t&&t!=="unknown"))];if(e.length!==0)return e.length===1?Wt(e[0]):`Mixed (${e.map(Wt).join(" + ")})`}function Gt(o){let e=o.response;if(e&&"api_format"in e&&e.api_format)return e.api_format;let t=Jt(o.request?.url);if(t!=="unknown")return t;let s=Ft(o.request?.body);return s!=="unknown"?s:Ft(e?.body)}function Ne(){return{input_tokens:0,output_tokens:0,cache_creation_input_tokens:null,cache_read_input_tokens:null,server_tool_use:null,service_tier:null}}var Js=new Set(["text","input_text","output_text"]);function at(o){return o?typeof o=="string"?[{type:"text",text:o}]:Array.isArray(o)?o.filter(e=>typeof e=="object"&&e!==null&&"type"in e):typeof o=="object"&&"type"in o?[o]:[]:[]}function ee(o){return o==null?[]:typeof o=="string"?o?[{type:"text",text:o}]:[]:o.filter(e=>Js.has(e.type)&&e.text).map(e=>({type:"text",text:e.text}))}function Qt(o){if(!o?.length)return;let e=o.map(t=>{let s=t;if(s.name)return{name:s.name,description:s.description,input_schema:s.parameters||{type:"object",properties:{}}};let n=t;return n.function?.name?{name:n.function.name,description:n.function.description,input_schema:n.function.parameters||{type:"object",properties:{}}}:s.type&&s.type!=="function"?{name:s.type,description:s.description,input_schema:s.parameters||{type:"object",properties:{}}}:null}).filter(t=>t!==null);return e.length>0?e:void 0}function Gs(o){let e=o,t,s=[];for(let n of e.messages||[]){if(n.role==="system"){let l=ee(n.content);l.length===1&&l[0].type==="text"?t=l[0].text:l.length>0&&(t=l);continue}if(n.role==="tool"){let l=typeof n.content=="string"?n.content:ee(n.content).map(a=>a.type==="text"?a.text:"").join("");s.push({role:"user",content:[{type:"tool_result",tool_use_id:n.tool_call_id||n.name||"unknown",content:l}]});continue}let r=[],i=ee(n.content);for(let l of i)r.push(l);if(n.tool_calls?.length)for(let l of n.tool_calls){let a={};try{a=JSON.parse(l.function.arguments||"{}")}catch{a={_raw:l.function.arguments}}r.push({type:"tool_use",id:l.id,name:l.function.name,input:a})}s.push({role:n.role==="assistant"?"assistant":"user",content:r.length>0?r:[{type:"text",text:""}]})}return{model:e.model||"unknown",max_tokens:e.max_tokens||4096,messages:s,system:t,tools:Qt(e.tools)}}function Zs(o){if(o.type==="function_call"){let e={};try{e=JSON.parse(o.arguments||"{}")}catch{e={_raw:o.arguments}}return[{type:"tool_use",id:o.call_id||o.id||"unknown",name:o.name||"unknown",input:e}]}if(o.type==="function_call_output")return[{type:"tool_result",tool_use_id:o.call_id||"unknown",content:o.output||""}];if(o.type==="reasoning"){let e=(o.summary||[]).map(t=>t.type==="summary_text"&&t.text||"").join("");return e?[{type:"thinking",thinking:e,signature:""}]:[]}return o.type==="message"||o.role,ee(o.content)}function Vs(o){let e=o,t=[];if(typeof e.input=="string")t.push({role:"user",content:[{type:"text",text:e.input}]});else if(Array.isArray(e.input))for(let s of e.input){let n=Zs(s);if(!n||Array.isArray(n)&&n.length===0)continue;let r=s.type==="function_call"?"assistant":s.type==="function_call_output"||s.type==="reasoning"?"user":s.role==="assistant"?"assistant":"user";t.push({role:r,content:n})}return{model:e.model||"unknown",max_tokens:4096,messages:t,system:e.instructions,tools:Qt(e.tools)}}function Qs(o,e){let t=[],s=ee(o.content);for(let n of s)t.push({type:"text",text:n.text,citations:null});if(o.tool_calls?.length)for(let n of o.tool_calls){let r={};try{r=JSON.parse(n.function.arguments||"{}")}catch{r={_raw:n.function.arguments}}t.push({type:"tool_use",id:n.id,name:n.function.name,input:r})}return{id:"",type:"message",role:"assistant",model:e,content:t,stop_reason:"end_turn",stop_sequence:null,usage:Ne()}}function Zt(o,e="unknown"){let t=o,s=t.choices?.[0]?.message;if(!s)return{id:t.id||"",type:"message",role:"assistant",model:t.model||e,content:[],stop_reason:null,stop_sequence:null,usage:{...Ne(),input_tokens:t.usage?.prompt_tokens||0,output_tokens:t.usage?.completion_tokens||0}};let n=Qs(s,t.model||e);n.id=t.id||"",n.usage={...Ne(),input_tokens:t.usage?.prompt_tokens||0,output_tokens:t.usage?.completion_tokens||0};let r=t.choices?.[0]?.finish_reason;return n.stop_reason=r==="tool_calls"?"tool_use":r==="stop"?"end_turn":null,n}function Xs(o){let e=[];if(o.type==="message"&&o.content){for(let t of at(o.content))(t.type==="output_text"||t.type==="text")&&e.push({type:"text",text:t.text||"",citations:null});return e}if(o.type==="function_call"){let t={};try{t=JSON.parse(o.arguments||"{}")}catch{t={_raw:o.arguments}}return e.push({type:"tool_use",id:o.call_id||o.id||"unknown",name:o.name||"unknown",input:t}),e}if(o.type==="reasoning"){let t=[...at(o.summary),...at(o.content)].map(s=>s.type==="summary_text"&&s.text||"").join("");t&&e.push({type:"thinking",thinking:t,signature:""})}return e}function Vt(o,e="unknown"){let t=o,s=[],n=!1;for(let r of t.output||[]){let i=Xs(r);r.type==="function_call"&&(n=!0),s.push(...i)}return{id:t.id||"",type:"message",role:"assistant",model:t.model||e,content:s,stop_reason:n?"tool_use":"end_turn",stop_sequence:null,usage:{...Ne(),input_tokens:t.usage?.input_tokens||0,output_tokens:t.usage?.output_tokens||0}}}function Xt(o){let e=[],t=o.split(`
6
+ `);for(let s of t){if(!s.startsWith("data: "))continue;let n=s.substring(6).trim();if(n==="[DONE]")break;try{e.push(JSON.parse(n))}catch{}}return e}function Ys(o,e="unknown"){let t=Xt(o),s={id:"",model:e,choices:[{index:0,message:{role:"assistant",content:""},finish_reason:null}],usage:{}},n=new Map,r="";for(let l of t){l.id&&(s.id=l.id),l.model&&(s.model=l.model),l.usage&&(s.usage={...s.usage,...l.usage});let a=l.choices?.[0];if(!a)continue;a.finish_reason&&(s.choices[0].finish_reason=a.finish_reason);let u=a.delta;if(u&&(typeof u.content=="string"&&(r+=u.content),u.tool_calls))for(let c of u.tool_calls){let p=c.index??0;n.has(p)||n.set(p,{id:c.id||"",type:"function",function:{name:c.function?.name||"",arguments:""}});let h=n.get(p);c.id&&(h.id=c.id),c.function?.name&&(h.function.name=c.function.name),c.function?.arguments&&(h.function.arguments+=c.function.arguments)}}let i={role:"assistant",content:r};return n.size>0&&(i.tool_calls=[...n.entries()].sort(([l],[a])=>l-a).map(([,l])=>l)),s.choices[0].message=i,s}function Ks(o,e="unknown"){let t=Xt(o),s={id:"",model:e,output:[{type:"message",role:"assistant",content:[{type:"output_text",text:""}]}],usage:{}},n="",r=new Map;for(let l of t){let a=l;typeof a.id=="string"&&(s.id=a.id),typeof a.model=="string"&&(s.model=a.model),a.usage&&typeof a.usage=="object"&&(s.usage={...s.usage,...a.usage});let u=a.type;if(u==="response.output_text.delta"&&typeof a.delta=="string")n+=a.delta;else if(u==="response.output_text.done"&&typeof a.text=="string")n=a.text;else if(u==="response.function_call_arguments.delta"){let c=typeof a.item_id=="string"?a.item_id:"default";r.has(c)||r.set(c,{type:"function_call",id:c,call_id:c,name:"",arguments:""});let p=r.get(c);typeof a.delta=="string"&&(p.arguments=(p.arguments||"")+a.delta)}else if(u==="response.output_item.added"&&a.item){let c=a.item;if(c.type==="function_call"){let p=c.call_id||c.id||"default";r.set(p,{...c,arguments:c.arguments||""})}}else if(u==="response.completed"&&a.response){let c=a.response;if(Array.isArray(c.output)&&c.output.length>0)return c;typeof c.id=="string"&&(s.id=c.id),typeof c.model=="string"&&(s.model=c.model),c.usage&&typeof c.usage=="object"&&(s.usage={...s.usage,...c.usage})}}let i=s.output?.[0]?.content;return Array.isArray(i)&&i[0]&&(i[0].text=n),r.size>0&&(s.output=[...n?[{type:"message",role:"assistant",content:[{type:"output_text",text:n}]}]:[],...r.values()]),s}function Yt(o,e,t="unknown"){if(o.body&&typeof o.body=="object"){let s=o.body;if("role"in s&&"content"in s&&Array.isArray(s.content))return s;if(e==="openai-responses"||"output"in s&&Array.isArray(s.output))return Vt(s,t);if("choices"in s)return Zt(s,t)}if(o.body_raw){if(e==="openai-responses"){let n=Ks(o.body_raw,t);return Vt(n,t)}let s=Ys(o.body_raw,t);return Zt(s,t)}throw new Error("No OpenAI response body available")}function Kt(o,e){return e==="openai-responses"?Vs(o):Gs(o)}function es(o){let e=o.response?.api_format;return e&&e!=="unknown"?e:Gt(o)}function ts(o){let e=o.request?.body;return e&&typeof e=="object"&&"model"in e&&typeof e.model=="string"?e.model:"unknown"}function ss(o){if(!o||o.length===0)return{inputTokens:0,outputTokens:0,totalTokens:0,lastTurnInputTokens:0,lastTurnOutputTokens:0,sessionOutputTokens:0,cacheReadTokens:null,cacheCreationTokens:null};let e=[...o].sort((l,a)=>new Date(l.timestamp).getTime()-new Date(a.timestamp).getTime()),s=e[e.length-1].response?.usage,n=s?.input_tokens??0,r=s?.output_tokens??0,i=e.reduce((l,a)=>l+(a.response?.usage?.output_tokens??0),0);return{inputTokens:n,outputTokens:i,totalTokens:i,lastTurnInputTokens:n,lastTurnOutputTokens:r,sessionOutputTokens:i,cacheReadTokens:s?.cache_read_input_tokens??null,cacheCreationTokens:s?.cache_creation_input_tokens??null}}var qe=class{processRawPairs(e){if(!e||e.length===0)return[];let t=[];for(let s=0;s<e.length;s++){let n=e[s];if(!(!n?.request||!n?.response))try{let r=es(n),i=r==="openai"||r==="openai-responses",l=!!n.response.body_raw,a,u=null,c;if(i)c=Kt(n.request.body,r),a=Yt(n.response,r,ts(n));else if(n.response.body_raw)u=this.isBedrockResponse(n.response.body_raw)?"bedrock":"standard",a=this.parseStreamingResponse(n.response.body_raw),c=n.request.body;else if(n.response.body)a=n.response.body,c=n.request.body;else continue;let p=this.extractModel(n);t.push({id:`${n.request.timestamp||Date.now()}_${Math.random()}`,timestamp:new Date((n.request.timestamp||Date.now())*1e3).toISOString(),request:c,response:a,model:p,isStreaming:l,rawStreamData:n.response.body_raw,streamFormat:u,apiFormat:r!=="unknown"?r:void 0})}catch(r){console.warn(`Failed to process raw pair at index ${s}:`,r)}}return t}isBedrockResponse(e){return e.startsWith("\0\0")}parseBedrockStreamingResponse(e){if(!e||e.length===0)throw new Error("Empty bodyRaw provided to parseBedrockStreamingResponse");let t=[],s=null;try{let n=this.extractJsonChunksFromEventStream(e);for(let r of n)try{let i=JSON.parse(r);if(i.bytes){let l=i.bytes,a=this.decodeBase64ToUtf8(l),u=JSON.parse(a);t.push(u)}}catch(i){console.warn("Failed to parse JSON chunk:",r,i)}s=this.extractBedrockMetrics(e)}catch(n){throw console.error("Failed to parse Bedrock streaming response:",n),new Error(`Bedrock streaming response parsing failed: ${n}`)}return this.buildMessageFromEvents(t,s)}decodeBase64ToUtf8(e){if(typeof window<"u"&&typeof atob<"u")return atob(e);if(typeof Buffer<"u")return Buffer.from(e,"base64").toString("utf-8");throw new Error("Base64 decoding not supported in this environment")}extractJsonChunksFromEventStream(e){if(!e||e.length===0)return[];let t=[],s='event{"bytes":',n=0;for(;n<e.length;){let r=e.indexOf(s,n);if(r===-1)break;let i=r+5,l=0,a=-1;for(let u=i;u<e.length;u++){let c=e[u];if(c==="{")l++;else if(c==="}"&&(l--,l===0)){a=u;break}}if(a!==-1){let u=e.substring(i,a+1);t.push(u),n=a+1}else n=r+s.length}return t}extractBedrockMetrics(e){try{let t=e.match(/"amazon-bedrock-invocationMetrics":\s*(\{[^}]+\})/);if(t&&t[1])return JSON.parse(t[1])}catch{}return null}parseStreamingResponse(e){return this.isBedrockResponse(e)?this.parseBedrockStreamingResponse(e):this.parseStandardStreamingResponse(e)}parseStandardStreamingResponse(e){if(!e||e.length===0)throw new Error("Empty bodyRaw provided to parseStandardStreamingResponse");let t=e.split(`
7
+ `),s=[];for(let n of t){if(!n.startsWith("data: "))continue;let r=n.substring(6).trim();if(r==="[DONE]")break;try{let i=JSON.parse(r);s.push(i)}catch(i){console.warn("Failed to parse SSE event:",r,i)}}return this.buildMessageFromEvents(s)}buildMessageFromEvents(e,t){let s={id:"",type:"message",role:"assistant",content:[],model:"",stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0,cache_creation_input_tokens:null,cache_read_input_tokens:null,server_tool_use:null,service_tier:null}},n=[],r=-1;for(let i of e)switch(i.type){case"message_start":s={...s,...i.message};break;case"content_block_start":r=i.index,n[r]={...i.content_block};break;case"content_block_delta":if(r>=0&&n[r]){let l=n[r],a=i.delta;switch(a.type){case"text_delta":l.type==="text"&&(l.text=(l.text||"")+a.text);break;case"input_json_delta":if(l.type==="tool_use"){let u=l;typeof u.input=="string"?u.input=u.input+a.partial_json:u.input=a.partial_json}break;case"thinking_delta":l.type==="thinking"&&(l.thinking=(l.thinking||"")+a.thinking);break;case"signature_delta":l.type==="thinking"&&(l.signature=(l.signature||"")+a.signature);break;case"citations_delta":break}}break;case"content_block_stop":if(r>=0&&n[r]){let l=n[r];if(l.type==="tool_use"){let a=l;if(typeof a.input=="string")try{a.input=JSON.parse(a.input)}catch{console.warn("Failed to parse tool input JSON:",a.input)}}}break;case"message_delta":if(i.delta.stop_reason&&(s.stop_reason=i.delta.stop_reason),i.delta.stop_sequence&&(s.stop_sequence=i.delta.stop_sequence),i.usage){let l=s.usage?.input_tokens??0;s.usage={input_tokens:i.usage.input_tokens??l,output_tokens:i.usage.output_tokens??s.usage?.output_tokens??0,cache_creation_input_tokens:i.usage.cache_creation_input_tokens??s.usage?.cache_creation_input_tokens??null,cache_read_input_tokens:i.usage.cache_read_input_tokens??s.usage?.cache_read_input_tokens??null,server_tool_use:i.usage.server_tool_use??s.usage?.server_tool_use??null,service_tier:null}}break;case"message_stop":break}return s.content=n.filter(i=>i!=null),t&&s.usage&&(s.usage.input_tokens=t.inputTokenCount,s.usage.output_tokens=t.outputTokenCount),s}extractModel(e){if(e.request?.url&&e.request.url.includes("bedrock-runtime")){let t=e.request.url.match(/\/model\/([^\/]+)/);if(t&&t[1])return this.normalizeModelName(t[1])}return e.request?.body&&typeof e.request.body=="object"&&"model"in e.request.body?this.normalizeModelName(e.request.body.model):e.response?.body&&typeof e.response.body=="object"&&"model"in e.response.body?this.normalizeModelName(e.response.body.model):"unknown"}normalizeModelName(e){if(!e)return"unknown";if(e.startsWith("us.anthropic.")){let t=e.match(/us\.anthropic\.([^:]+)/);if(t&&t[1])return t[1]}return e}mergeConversations(e,t={}){if(!e||e.length===0)return[];let s=new Map;for(let l of e){let a=l.request.system,u=l.model,c=JSON.stringify({system:a,model:u});s.has(c)||s.set(c,[]),s.get(c).push(l)}let n=[];for(let[,l]of s){let a=[...l].sort((c,p)=>new Date(c.timestamp).getTime()-new Date(p.timestamp).getTime()),u=new Map;for(let c of a){let p=c.request.messages||[];if(p.length===0)continue;let h=p[0],m=this.normalizeMessageForGrouping(h),v=JSON.stringify({firstMessage:m}),_=this.hashString(v);u.has(_)||u.set(_,[]),u.get(_).push(c)}for(let[c,p]of u){let h=[...p].sort((b,T)=>new Date(b.timestamp).getTime()-new Date(T.timestamp).getTime()),m=h.reduce((b,T)=>{let P=T.request.messages||[],re=b.request.messages||[];return P.length>re.length?T:b}),v=new Set(h.map(b=>b.model)),_=this.processToolResults(m.request.messages||[]),$=ot(h.map(b=>b.apiFormat||"unknown")),x=ss(h),f={id:this.hashString(c),models:v,system:m.request.system,messages:_,response:m.response,allPairs:h,finalPair:m,apiFormatDisplay:$,metadata:{startTime:h[0].timestamp,endTime:m.timestamp,totalPairs:h.length,...x}};n.push(f)}}let r=this.detectAndMergeCompactConversations(n);return(t.includeShortConversations?r:r.filter(l=>l.messages.length>2)).sort((l,a)=>new Date(l.metadata.startTime).getTime()-new Date(a.metadata.startTime).getTime())}processToolResults(e){let t=[],s={};for(let n=0;n<e.length;n++){let r=e[n],i={...r,toolResults:{},hide:!1};if(Array.isArray(r.content)){let l=!0,a=!1;for(let u=0;u<r.content.length;u++){let c=r.content[u];if(c.type==="tool_use"&&"id"in c){let p=c;s[p.id]={messageIndex:n,toolIndex:u},l=!1}else if(c.type==="tool_result"&&"tool_use_id"in c){let p=c,h=p.tool_use_id;if(s[h]){let{messageIndex:m}=s[h];t[m]||(t[m]={...e[m],toolResults:{},hide:!1}),t[m].toolResults[h]=p,delete s[h]}}else c.type==="text"&&(a=!0),l=!1}l&&!a&&(i.hide=!0)}t[n]=i}return t}detectAndMergeCompactConversations(e){if(e.length<=1)return e;let t=[...e].sort((r,i)=>new Date(r.metadata.startTime).getTime()-new Date(i.metadata.startTime).getTime()),s=new Set,n=[];for(let r=0;r<t.length;r++){let i=t[r];if(!s.has(r))if(i.allPairs.length===1&&i.messages.length>2){let l=null,a=-1;for(let u=0;u<t.length;u++){if(u===r||s.has(u))continue;let c=t[u];if(c.messages.length===i.messages.length-2){let p=!0;for(let h=1;h<c.messages.length;h++)if(!this.messagesRoughlyEqual(c.messages[h],i.messages[h])){p=!1;break}if(p){l=c,a=u;break}}}if(l){let u=this.mergeCompactConversation(l,i);n.push(u),s.add(r),s.add(a)}else i.compacted=!0,n.push(i),s.add(r)}else n.push(i),s.add(r)}for(let r=0;r<t.length;r++)s.has(r)||n.push(t[r]);return n.sort((r,i)=>new Date(r.metadata.startTime).getTime()-new Date(i.metadata.startTime).getTime())}mergeCompactConversation(e,t){let s=e.messages||[],r=[...t.messages||[]];s.length>0&&r.length>0&&(r[0]=s[0]);let i=[...e.allPairs,...t.allPairs].sort((h,m)=>new Date(h.timestamp).getTime()-new Date(m.timestamp).getTime()),l=new Set([...e.models,...t.models]),a=i[0].timestamp,u=i[i.length-1].timestamp,c=ot(i.map(h=>h.apiFormat||"unknown")),p=ss(i);return{id:t.id,models:l,system:e.system,messages:r,response:t.response,allPairs:i,finalPair:t.finalPair,compacted:!0,apiFormatDisplay:c,metadata:{startTime:a,endTime:u,totalPairs:i.length,...p}}}messagesRoughlyEqual(e,t){if(e.role!==t.role)return!1;let s=e.content,n=t.content;return!(typeof s!=typeof n||Array.isArray(s)!==Array.isArray(n))}normalizeMessageForGrouping(e){if(!e||!e.content)return e;let t;return Array.isArray(e.content)?t=e.content.map(s=>{if(s.type==="text"&&"text"in s){let n=s.text;return n=n.replace(/Generated \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/g,"Generated [TIMESTAMP]"),n=n.replace(/The user opened the file [^\s]+ in the IDE\./g,"The user opened file in IDE."),n=n.replace(/<system-reminder>.*?<\/system-reminder>/gs,"[SYSTEM-REMINDER]"),n=n.replace(/<EXTREMELY_IMPORTANT>.*?<\/EXTREMELY_IMPORTANT>/gs,"[EXTREMELY-IMPORTANT]"),{type:"text",text:n}}return s}):t=e.content,{role:e.role,content:t}}hashString(e){let t=0;for(let s=0;s<e.length;s++){let n=e.charCodeAt(s);t=(t<<5)-t+n,t=t&t}return Math.abs(t).toString()}};var R=class extends A{constructor(){super(...arguments);this.data={rawPairs:[]};this.conversations=[];this.processedPairs=[];this.currentView="conversations";this.selectedModels=new Set}createRenderRoot(){return console.log("createRenderRoot"),this}connectedCallback(){super.connectedCallback(),this.data=window.claudeData||{rawPairs:[]},this.processData()}processData(){let t=performance.now(),s=new qe;this.processedPairs=s.processRawPairs(this.data.rawPairs);let n=this.data.metadata?.includeAllRequests||!1;this.conversations=s.mergeConversations(this.processedPairs,{includeShortConversations:n});let r=new Set(this.conversations.flatMap(u=>Array.from(u.models))),i=new Set(this.processedPairs.map(u=>u.model)),l=new Set(this.data.rawPairs.map(u=>u.request.body?.model||"unknown")),a=new Set([...r,...i,...l]);this.selectedModels=a,console.log(`Processed data in ${performance.now()-t}ms`)}switchView(t){this.currentView=t}toggleModel(t){let s=new Set(this.selectedModels);s.has(t)?s.delete(t):s.add(t),this.selectedModels=s}get filteredConversations(){return this.conversations.filter(t=>Array.from(t.models).some(s=>this.selectedModels.has(s)))}get filteredProcessedPairs(){return this.processedPairs.filter(t=>this.selectedModels.has(t.model))}get filteredRawPairs(){return this.data.rawPairs.filter(t=>{let s=t.request.body?.model||"unknown";return this.selectedModels.has(s)})}get allRawPairs(){return this.data.rawPairs.filter(t=>t.response!==null)}get modelCounts(){let t=new Map;return this.conversations.forEach(s=>{Array.from(s.models).forEach(n=>{t.set(n,(t.get(n)||0)+1)})}),t}getBrandName(){let t=this.data.metadata?.tool;return t==="claude"?"claude-trace":t==="opencode"?"opencode-trace":t==="codex"?"codex-trace":"trace"}render(){let t=this.modelCounts,s=this.filteredConversations;return d`
8
+ <div class="min-h-screen bg-vs-bg text-vs-text font-mono">
9
+ <div class="max-w-[60em] mx-auto p-4">
10
+ <div class="mb-8">
11
+ <div class="mb-4 text-center">
12
+ <span class="text-vs-function">~ ${this.getBrandName()}</span>
13
+ <span class="text-vs-muted ml-8">${this.data.timestamp||new Date().toISOString()}</span>
14
+ </div>
15
+
16
+ <div class="mb-8 text-center">
17
+ <span
18
+ @click=${()=>this.switchView("conversations")}
19
+ class="cursor-pointer mr-12 ${this.currentView==="conversations"?"text-vs-nav-active":"text-vs-text hover:text-vs-accent"}"
20
+ >
21
+ conversations (${s.length})
22
+ </span>
23
+ <span
24
+ @click=${()=>this.switchView("raw")}
25
+ class="cursor-pointer mr-12 ${this.currentView==="raw"?"text-vs-nav-active":"text-vs-text hover:text-vs-accent"}"
26
+ >
27
+ raw calls (${this.allRawPairs.length})
28
+ </span>
29
+ <span
30
+ @click=${()=>this.switchView("json")}
31
+ class="cursor-pointer mr-12 ${this.currentView==="json"?"text-vs-nav-active":"text-vs-text hover:text-vs-accent"}"
32
+ >
33
+ json debug (${this.filteredProcessedPairs.length})
34
+ </span>
35
+ </div>
36
+
37
+ ${t.size>1&&this.currentView!=="raw"?d`
38
+ <div class="mb-4 text-center">
39
+ ${Array.from(t.entries()).map(([n,r])=>d`
40
+ <span
41
+ @click=${()=>this.toggleModel(n)}
42
+ class="cursor-pointer hover:text-vs-accent mr-8"
43
+ >
44
+ ${this.selectedModels.has(n)?"[x]":"[ ]"} ${n}
45
+ </span>
46
+ `)}
47
+ </div>
48
+ `:""}
49
+ </div>
50
+
51
+ <div>
52
+ ${this.currentView==="conversations"?d`
53
+ <div id="conversations-view">
54
+ ${s.length===0?d`<div>No conversations found for selected models.</div>`:d`<simple-conversation-view
55
+ .conversations=${s}
56
+ ></simple-conversation-view>`}
57
+ </div>
58
+ `:""}
59
+ ${this.currentView==="raw"?d`
60
+ <div id="raw-view">
61
+ ${this.allRawPairs.length===0?d`<div>No raw pairs found.</div>`:d`<raw-pairs-view .rawPairs=${this.allRawPairs}></raw-pairs-view>`}
62
+ </div>
63
+ `:""}
64
+ ${this.currentView==="json"?d`
65
+ <div id="json-view">
66
+ ${this.filteredProcessedPairs.length===0?d`<div>No processed pairs found for selected models.</div>`:d`<json-view .processedPairs=${this.filteredProcessedPairs}></json-view>`}
67
+ </div>
68
+ `:""}
69
+ </div>
70
+ </div>
71
+ </div>
72
+ `}};S([K()],R.prototype,"data",2),S([K()],R.prototype,"conversations",2),S([K()],R.prototype,"processedPairs",2),S([K()],R.prototype,"currentView",2),S([K()],R.prototype,"selectedModels",2),R=S([D("claude-app")],R);var ns={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},rs=o=>(...e)=>({_$litDirective$:o,values:e}),De=class{constructor(e){}get _$AU(){return this._$AM._$AU}_$AT(e,t,s){this._$Ct=e,this._$AM=t,this._$Ci=s}_$AS(e,t){return this.update(e,t)}update(e,t){return this.render(...t)}};var xe=class extends De{constructor(e){if(super(e),this.it=w,e.type!==ns.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(e){if(e===w||e==null)return this._t=void 0,this.it=e;if(e===O)return e;if(typeof e!="string")throw Error(this.constructor.directiveName+"() called with a non-string value");if(e===this.it)return this._t;this.it=e;let t=[e];return t.raw=t,this._t={_$litType$:this.constructor.resultType,strings:t,values:[]}}};xe.directiveName="unsafeHTML",xe.resultType=1;var G=rs(xe);var ye=class{diff(e,t,s={}){let n;typeof s=="function"?(n=s,s={}):"callback"in s&&(n=s.callback);let r=this.castInput(e,s),i=this.castInput(t,s),l=this.removeEmpty(this.tokenize(r,s)),a=this.removeEmpty(this.tokenize(i,s));return this.diffWithOptionsObj(l,a,s,n)}diffWithOptionsObj(e,t,s,n){var r;let i=f=>{if(f=this.postProcess(f,s),n){setTimeout(function(){n(f)},0);return}else return f},l=t.length,a=e.length,u=1,c=l+a;s.maxEditLength!=null&&(c=Math.min(c,s.maxEditLength));let p=(r=s.timeout)!==null&&r!==void 0?r:1/0,h=Date.now()+p,m=[{oldPos:-1,lastComponent:void 0}],v=this.extractCommon(m[0],t,e,0,s);if(m[0].oldPos+1>=a&&v+1>=l)return i(this.buildValues(m[0].lastComponent,t,e));let _=-1/0,$=1/0,x=()=>{for(let f=Math.max(_,-u);f<=Math.min($,u);f+=2){let b,T=m[f-1],P=m[f+1];T&&(m[f-1]=void 0);let re=!1;if(P){let kt=P.oldPos-f;re=P&&0<=kt&&kt<l}let yt=T&&T.oldPos+1<a;if(!re&&!yt){m[f]=void 0;continue}if(!yt||re&&T.oldPos<P.oldPos?b=this.addToPath(P,!0,!1,0,s):b=this.addToPath(T,!1,!0,1,s),v=this.extractCommon(b,t,e,f,s),b.oldPos+1>=a&&v+1>=l)return i(this.buildValues(b.lastComponent,t,e))||!0;m[f]=b,b.oldPos+1>=a&&($=Math.min($,f-1)),v+1>=l&&(_=Math.max(_,f+1))}u++};if(n)(function f(){setTimeout(function(){if(u>c||Date.now()>h)return n(void 0);x()||f()},0)})();else for(;u<=c&&Date.now()<=h;){let f=x();if(f)return f}}addToPath(e,t,s,n,r){let i=e.lastComponent;return i&&!r.oneChangePerToken&&i.added===t&&i.removed===s?{oldPos:e.oldPos+n,lastComponent:{count:i.count+1,added:t,removed:s,previousComponent:i.previousComponent}}:{oldPos:e.oldPos+n,lastComponent:{count:1,added:t,removed:s,previousComponent:i}}}extractCommon(e,t,s,n,r){let i=t.length,l=s.length,a=e.oldPos,u=a-n,c=0;for(;u+1<i&&a+1<l&&this.equals(s[a+1],t[u+1],r);)u++,a++,c++,r.oneChangePerToken&&(e.lastComponent={count:1,previousComponent:e.lastComponent,added:!1,removed:!1});return c&&!r.oneChangePerToken&&(e.lastComponent={count:c,previousComponent:e.lastComponent,added:!1,removed:!1}),e.oldPos=a,u}equals(e,t,s){return s.comparator?s.comparator(e,t):e===t||!!s.ignoreCase&&e.toLowerCase()===t.toLowerCase()}removeEmpty(e){let t=[];for(let s=0;s<e.length;s++)e[s]&&t.push(e[s]);return t}castInput(e,t){return e}tokenize(e,t){return Array.from(e)}join(e){return e.join("")}postProcess(e,t){return e}get useLongestToken(){return!1}buildValues(e,t,s){let n=[],r;for(;e;)n.push(e),r=e.previousComponent,delete e.previousComponent,e=r;n.reverse();let i=n.length,l=0,a=0,u=0;for(;l<i;l++){let c=n[l];if(c.removed)c.value=this.join(s.slice(u,u+c.count)),u+=c.count;else{if(!c.added&&this.useLongestToken){let p=t.slice(a,a+c.count);p=p.map(function(h,m){let v=s[u+m];return v.length>h.length?v:h}),c.value=this.join(p)}else c.value=this.join(t.slice(a,a+c.count));a+=c.count,c.added||(u+=c.count)}}return n}};var lt=class extends ye{constructor(){super(...arguments),this.tokenize=en}equals(e,t,s){return s.ignoreWhitespace?((!s.newlineIsToken||!e.includes(`
73
+ `))&&(e=e.trim()),(!s.newlineIsToken||!t.includes(`
74
+ `))&&(t=t.trim())):s.ignoreNewlineAtEof&&!s.newlineIsToken&&(e.endsWith(`
75
+ `)&&(e=e.slice(0,-1)),t.endsWith(`
76
+ `)&&(t=t.slice(0,-1))),super.equals(e,t,s)}},is=new lt;function ct(o,e,t){return is.diff(o,e,t)}function en(o,e){e.stripTrailingCr&&(o=o.replace(/\r\n/g,`
77
+ `));let t=[],s=o.split(/(\n|\r\n)/);s[s.length-1]||s.pop();for(let n=0;n<s.length;n++){let r=s[n];n%2&&!e.newlineIsToken?t[t.length-1]+=r:t.push(r)}return t}function dt(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var V=dt();function ps(o){V=o}var ds=/[&<>"']/,sn=new RegExp(ds.source,"g"),hs=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,nn=new RegExp(hs.source,"g"),rn={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},os=o=>rn[o];function C(o,e){if(e){if(ds.test(o))return o.replace(sn,os)}else if(hs.test(o))return o.replace(nn,os);return o}var on=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function an(o){return o.replace(on,(e,t)=>(t=t.toLowerCase(),t==="colon"?":":t.charAt(0)==="#"?t.charAt(1)==="x"?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""))}var ln=/(^|[^\[])\^/g;function k(o,e){let t=typeof o=="string"?o:o.source;e=e||"";let s={replace:(n,r)=>{let i=typeof r=="string"?r:r.source;return i=i.replace(ln,"$1"),t=t.replace(n,i),s},getRegex:()=>new RegExp(t,e)};return s}function as(o){try{o=encodeURI(o).replace(/%25/g,"%")}catch{return null}return o}var be={exec:()=>null};function ls(o,e){let t=o.replace(/\|/g,(r,i,l)=>{let a=!1,u=i;for(;--u>=0&&l[u]==="\\";)a=!a;return a?"|":" |"}),s=t.split(/ \|/),n=0;if(s[0].trim()||s.shift(),s.length>0&&!s[s.length-1].trim()&&s.pop(),e)if(s.length>e)s.splice(e);else for(;s.length<e;)s.push("");for(;n<s.length;n++)s[n]=s[n].trim().replace(/\\\|/g,"|");return s}function ze(o,e,t){let s=o.length;if(s===0)return"";let n=0;for(;n<s;){let r=o.charAt(s-n-1);if(r===e&&!t)n++;else if(r!==e&&t)n++;else break}return o.slice(0,s-n)}function cn(o,e){if(o.indexOf(e[1])===-1)return-1;let t=0;for(let s=0;s<o.length;s++)if(o[s]==="\\")s++;else if(o[s]===e[0])t++;else if(o[s]===e[1]&&(t--,t<0))return s;return-1}function cs(o,e,t,s){let n=e.href,r=e.title?C(e.title):null,i=o[1].replace(/\\([\[\]])/g,"$1");if(o[0].charAt(0)!=="!"){s.state.inLink=!0;let l={type:"link",raw:t,href:n,title:r,text:i,tokens:s.inlineTokens(i)};return s.state.inLink=!1,l}return{type:"image",raw:t,href:n,title:r,text:C(i)}}function un(o,e){let t=o.match(/^(\s+)(?:```)/);if(t===null)return e;let s=t[1];return e.split(`
78
+ `).map(n=>{let r=n.match(/^\s+/);if(r===null)return n;let[i]=r;return i.length>=s.length?n.slice(s.length):n}).join(`
79
+ `)}var se=class{options;rules;lexer;constructor(e){this.options=e||V}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let s=t[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?s:ze(s,`
80
+ `)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let s=t[0],n=un(s,t[3]||"");return{type:"code",raw:s,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:n}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let s=t[2].trim();if(/#$/.test(s)){let n=ze(s,"#");(this.options.pedantic||!n||/ $/.test(n))&&(s=n.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:s,tokens:this.lexer.inline(s)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:t[0]}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let s=t[0].replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,`
81
+ $1`);s=ze(s.replace(/^ *>[ \t]?/gm,""),`
82
+ `);let n=this.lexer.state.top;this.lexer.state.top=!0;let r=this.lexer.blockTokens(s);return this.lexer.state.top=n,{type:"blockquote",raw:t[0],tokens:r,text:s}}}list(e){let t=this.rules.block.list.exec(e);if(t){let s=t[1].trim(),n=s.length>1,r={type:"list",raw:"",ordered:n,start:n?+s.slice(0,-1):"",loose:!1,items:[]};s=n?`\\d{1,9}\\${s.slice(-1)}`:`\\${s}`,this.options.pedantic&&(s=n?s:"[*+-]");let i=new RegExp(`^( {0,3}${s})((?:[ ][^\\n]*)?(?:\\n|$))`),l="",a="",u=!1;for(;e;){let c=!1;if(!(t=i.exec(e))||this.rules.block.hr.test(e))break;l=t[0],e=e.substring(l.length);let p=t[2].split(`
83
+ `,1)[0].replace(/^\t+/,x=>" ".repeat(3*x.length)),h=e.split(`
84
+ `,1)[0],m=0;this.options.pedantic?(m=2,a=p.trimStart()):(m=t[2].search(/[^ ]/),m=m>4?1:m,a=p.slice(m),m+=t[1].length);let v=!1;if(!p&&/^ *$/.test(h)&&(l+=h+`
85
+ `,e=e.substring(h.length+1),c=!0),!c){let x=new RegExp(`^ {0,${Math.min(3,m-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),f=new RegExp(`^ {0,${Math.min(3,m-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),b=new RegExp(`^ {0,${Math.min(3,m-1)}}(?:\`\`\`|~~~)`),T=new RegExp(`^ {0,${Math.min(3,m-1)}}#`);for(;e;){let P=e.split(`
86
+ `,1)[0];if(h=P,this.options.pedantic&&(h=h.replace(/^ {1,4}(?=( {4})*[^ ])/g," ")),b.test(h)||T.test(h)||x.test(h)||f.test(e))break;if(h.search(/[^ ]/)>=m||!h.trim())a+=`
87
+ `+h.slice(m);else{if(v||p.search(/[^ ]/)>=4||b.test(p)||T.test(p)||f.test(p))break;a+=`
88
+ `+h}!v&&!h.trim()&&(v=!0),l+=P+`
89
+ `,e=e.substring(P.length+1),p=h.slice(m)}}r.loose||(u?r.loose=!0:/\n *\n *$/.test(l)&&(u=!0));let _=null,$;this.options.gfm&&(_=/^\[[ xX]\] /.exec(a),_&&($=_[0]!=="[ ] ",a=a.replace(/^\[[ xX]\] +/,""))),r.items.push({type:"list_item",raw:l,task:!!_,checked:$,loose:!1,text:a,tokens:[]}),r.raw+=l}r.items[r.items.length-1].raw=l.trimEnd(),r.items[r.items.length-1].text=a.trimEnd(),r.raw=r.raw.trimEnd();for(let c=0;c<r.items.length;c++)if(this.lexer.state.top=!1,r.items[c].tokens=this.lexer.blockTokens(r.items[c].text,[]),!r.loose){let p=r.items[c].tokens.filter(m=>m.type==="space"),h=p.length>0&&p.some(m=>/\n.*\n/.test(m.raw));r.loose=h}if(r.loose)for(let c=0;c<r.items.length;c++)r.items[c].loose=!0;return r}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:"html",block:!0,raw:t[0],pre:t[1]==="pre"||t[1]==="script"||t[1]==="style",text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let s=t[1].toLowerCase().replace(/\s+/g," "),n=t[2]?t[2].replace(/^<(.*)>$/,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",r=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:s,raw:t[0],href:n,title:r}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!/[:|]/.test(t[2]))return;let s=ls(t[1]),n=t[2].replace(/^\||\| *$/g,"").split("|"),r=t[3]&&t[3].trim()?t[3].replace(/\n[ \t]*$/,"").split(`
90
+ `):[],i={type:"table",raw:t[0],header:[],align:[],rows:[]};if(s.length===n.length){for(let l of n)/^ *-+: *$/.test(l)?i.align.push("right"):/^ *:-+: *$/.test(l)?i.align.push("center"):/^ *:-+ *$/.test(l)?i.align.push("left"):i.align.push(null);for(let l of s)i.header.push({text:l,tokens:this.lexer.inline(l)});for(let l of r)i.rows.push(ls(l,i.header.length).map(a=>({text:a,tokens:this.lexer.inline(a)})));return i}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:t[2].charAt(0)==="="?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let s=t[1].charAt(t[1].length-1)===`
91
+ `?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:s,tokens:this.lexer.inline(s)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:C(t[1])}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&/^<a /i.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&/^<\/a>/i.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let s=t[2].trim();if(!this.options.pedantic&&/^</.test(s)){if(!/>$/.test(s))return;let i=ze(s.slice(0,-1),"\\");if((s.length-i.length)%2===0)return}else{let i=cn(t[2],"()");if(i>-1){let a=(t[0].indexOf("!")===0?5:4)+t[1].length+i;t[2]=t[2].substring(0,i),t[0]=t[0].substring(0,a).trim(),t[3]=""}}let n=t[2],r="";if(this.options.pedantic){let i=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(n);i&&(n=i[1],r=i[3])}else r=t[3]?t[3].slice(1,-1):"";return n=n.trim(),/^</.test(n)&&(this.options.pedantic&&!/>$/.test(s)?n=n.slice(1):n=n.slice(1,-1)),cs(t,{href:n&&n.replace(this.rules.inline.anyPunctuation,"$1"),title:r&&r.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer)}}reflink(e,t){let s;if((s=this.rules.inline.reflink.exec(e))||(s=this.rules.inline.nolink.exec(e))){let n=(s[2]||s[1]).replace(/\s+/g," "),r=t[n.toLowerCase()];if(!r){let i=s[0].charAt(0);return{type:"text",raw:i,text:i}}return cs(s,r,s[0],this.lexer)}}emStrong(e,t,s=""){let n=this.rules.inline.emStrongLDelim.exec(e);if(!n||n[3]&&s.match(/[\p{L}\p{N}]/u))return;if(!(n[1]||n[2]||"")||!s||this.rules.inline.punctuation.exec(s)){let i=[...n[0]].length-1,l,a,u=i,c=0,p=n[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(p.lastIndex=0,t=t.slice(-1*e.length+i);(n=p.exec(t))!=null;){if(l=n[1]||n[2]||n[3]||n[4]||n[5]||n[6],!l)continue;if(a=[...l].length,n[3]||n[4]){u+=a;continue}else if((n[5]||n[6])&&i%3&&!((i+a)%3)){c+=a;continue}if(u-=a,u>0)continue;a=Math.min(a,a+u+c);let h=[...n[0]][0].length,m=e.slice(0,i+n.index+h+a);if(Math.min(i,a)%2){let _=m.slice(1,-1);return{type:"em",raw:m,text:_,tokens:this.lexer.inlineTokens(_)}}let v=m.slice(2,-2);return{type:"strong",raw:m,text:v,tokens:this.lexer.inlineTokens(v)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let s=t[2].replace(/\n/g," "),n=/[^ ]/.test(s),r=/^ /.test(s)&&/ $/.test(s);return n&&r&&(s=s.substring(1,s.length-1)),s=C(s,!0),{type:"codespan",raw:t[0],text:s}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){let t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let s,n;return t[2]==="@"?(s=C(t[1]),n="mailto:"+s):(s=C(t[1]),n=s),{type:"link",raw:t[0],text:s,href:n,tokens:[{type:"text",raw:s,text:s}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let s,n;if(t[2]==="@")s=C(t[0]),n="mailto:"+s;else{let r;do r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??"";while(r!==t[0]);s=C(t[0]),t[1]==="www."?n="http://"+t[0]:n=t[0]}return{type:"link",raw:t[0],text:s,href:n,tokens:[{type:"text",raw:s,text:s}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let s;return this.lexer.state.inRawBlock?s=t[0]:s=C(t[0]),{type:"text",raw:t[0],text:s}}}},pn=/^(?: *(?:\n|$))+/,dn=/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,hn=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,we=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,mn=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,ms=/(?:[*+-]|\d{1,9}[.)])/,fs=k(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g,ms).replace(/blockCode/g,/ {4}/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).getRegex(),ht=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,fn=/^[^\n]+/,mt=/(?!\s*\])(?:\\.|[^\[\]\\])+/,gn=k(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/).replace("label",mt).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),vn=k(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,ms).getRegex(),je="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",ft=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,xn=k("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))","i").replace("comment",ft).replace("tag",je).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),gs=k(ht).replace("hr",we).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",je).getRegex(),yn=k(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",gs).getRegex(),gt={blockquote:yn,code:dn,def:gn,fences:hn,heading:mn,hr:we,html:xn,lheading:fs,list:vn,newline:pn,paragraph:gs,table:be,text:fn},us=k("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",we).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",je).getRegex(),kn={...gt,table:us,paragraph:k(ht).replace("hr",we).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",us).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",je).getRegex()},bn={...gt,html:k(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",ft).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:be,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:k(ht).replace("hr",we).replace("heading",` *#{1,6} *[^
92
+ ]`).replace("lheading",fs).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},vs=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,_n=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,xs=/^( {2,}|\\)\n(?!\s*$)/,wn=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,$e="\\p{P}\\p{S}",$n=k(/^((?![*_])[\spunctuation])/,"u").replace(/punctuation/g,$e).getRegex(),Tn=/\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g,En=k(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,"u").replace(/punct/g,$e).getRegex(),Sn=k("^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])","gu").replace(/punct/g,$e).getRegex(),An=k("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])","gu").replace(/punct/g,$e).getRegex(),Cn=k(/\\([punct])/,"gu").replace(/punct/g,$e).getRegex(),Pn=k(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Rn=k(ft).replace("(?:-->|$)","-->").getRegex(),Mn=k("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",Rn).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Ue=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,In=k(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label",Ue).replace("href",/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),ys=k(/^!?\[(label)\]\[(ref)\]/).replace("label",Ue).replace("ref",mt).getRegex(),ks=k(/^!?\[(ref)\](?:\[\])?/).replace("ref",mt).getRegex(),On=k("reflink|nolink(?!\\()","g").replace("reflink",ys).replace("nolink",ks).getRegex(),vt={_backpedal:be,anyPunctuation:Cn,autolink:Pn,blockSkip:Tn,br:xs,code:_n,del:be,emStrongLDelim:En,emStrongRDelimAst:Sn,emStrongRDelimUnd:An,escape:vs,link:In,nolink:ks,punctuation:$n,reflink:ys,reflinkSearch:On,tag:Mn,text:wn,url:be},Ln={...vt,link:k(/^!?\[(label)\]\((.*?)\)/).replace("label",Ue).getRegex(),reflink:k(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Ue).getRegex()},ut={...vt,escape:k(vs).replace("])","~|])").getRegex(),url:k(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/},Bn={...ut,br:k(xs).replace("{2,}","*").getRegex(),text:k(ut.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},He={normal:gt,gfm:kn,pedantic:bn},ke={normal:vt,gfm:ut,breaks:Bn,pedantic:Ln},L=class o{tokens;options;state;tokenizer;inlineQueue;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||V,this.options.tokenizer=this.options.tokenizer||new se,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={block:He.normal,inline:ke.normal};this.options.pedantic?(t.block=He.pedantic,t.inline=ke.pedantic):this.options.gfm&&(t.block=He.gfm,this.options.breaks?t.inline=ke.breaks:t.inline=ke.gfm),this.tokenizer.rules=t}static get rules(){return{block:He,inline:ke}}static lex(e,t){return new o(t).lex(e)}static lexInline(e,t){return new o(t).inlineTokens(e)}lex(e){e=e.replace(/\r\n|\r/g,`
93
+ `),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let s=this.inlineQueue[t];this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[]){this.options.pedantic?e=e.replace(/\t/g," ").replace(/^ +$/gm,""):e=e.replace(/^( *)(\t+)/gm,(l,a,u)=>a+" ".repeat(u.length));let s,n,r,i;for(;e;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some(l=>(s=l.call({lexer:this},e,t))?(e=e.substring(s.raw.length),t.push(s),!0):!1))){if(s=this.tokenizer.space(e)){e=e.substring(s.raw.length),s.raw.length===1&&t.length>0?t[t.length-1].raw+=`
94
+ `:t.push(s);continue}if(s=this.tokenizer.code(e)){e=e.substring(s.raw.length),n=t[t.length-1],n&&(n.type==="paragraph"||n.type==="text")?(n.raw+=`
95
+ `+s.raw,n.text+=`
96
+ `+s.text,this.inlineQueue[this.inlineQueue.length-1].src=n.text):t.push(s);continue}if(s=this.tokenizer.fences(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.heading(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.hr(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.blockquote(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.list(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.html(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.def(e)){e=e.substring(s.raw.length),n=t[t.length-1],n&&(n.type==="paragraph"||n.type==="text")?(n.raw+=`
97
+ `+s.raw,n.text+=`
98
+ `+s.raw,this.inlineQueue[this.inlineQueue.length-1].src=n.text):this.tokens.links[s.tag]||(this.tokens.links[s.tag]={href:s.href,title:s.title});continue}if(s=this.tokenizer.table(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.lheading(e)){e=e.substring(s.raw.length),t.push(s);continue}if(r=e,this.options.extensions&&this.options.extensions.startBlock){let l=1/0,a=e.slice(1),u;this.options.extensions.startBlock.forEach(c=>{u=c.call({lexer:this},a),typeof u=="number"&&u>=0&&(l=Math.min(l,u))}),l<1/0&&l>=0&&(r=e.substring(0,l+1))}if(this.state.top&&(s=this.tokenizer.paragraph(r))){n=t[t.length-1],i&&n.type==="paragraph"?(n.raw+=`
99
+ `+s.raw,n.text+=`
100
+ `+s.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=n.text):t.push(s),i=r.length!==e.length,e=e.substring(s.raw.length);continue}if(s=this.tokenizer.text(e)){e=e.substring(s.raw.length),n=t[t.length-1],n&&n.type==="text"?(n.raw+=`
101
+ `+s.raw,n.text+=`
102
+ `+s.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=n.text):t.push(s);continue}if(e){let l="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(l);break}else throw new Error(l)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let s,n,r,i=e,l,a,u;if(this.tokens.links){let c=Object.keys(this.tokens.links);if(c.length>0)for(;(l=this.tokenizer.rules.inline.reflinkSearch.exec(i))!=null;)c.includes(l[0].slice(l[0].lastIndexOf("[")+1,-1))&&(i=i.slice(0,l.index)+"["+"a".repeat(l[0].length-2)+"]"+i.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(l=this.tokenizer.rules.inline.blockSkip.exec(i))!=null;)i=i.slice(0,l.index)+"["+"a".repeat(l[0].length-2)+"]"+i.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;(l=this.tokenizer.rules.inline.anyPunctuation.exec(i))!=null;)i=i.slice(0,l.index)+"++"+i.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;e;)if(a||(u=""),a=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some(c=>(s=c.call({lexer:this},e,t))?(e=e.substring(s.raw.length),t.push(s),!0):!1))){if(s=this.tokenizer.escape(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.tag(e)){e=e.substring(s.raw.length),n=t[t.length-1],n&&s.type==="text"&&n.type==="text"?(n.raw+=s.raw,n.text+=s.text):t.push(s);continue}if(s=this.tokenizer.link(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(s.raw.length),n=t[t.length-1],n&&s.type==="text"&&n.type==="text"?(n.raw+=s.raw,n.text+=s.text):t.push(s);continue}if(s=this.tokenizer.emStrong(e,i,u)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.codespan(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.br(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.del(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.autolink(e)){e=e.substring(s.raw.length),t.push(s);continue}if(!this.state.inLink&&(s=this.tokenizer.url(e))){e=e.substring(s.raw.length),t.push(s);continue}if(r=e,this.options.extensions&&this.options.extensions.startInline){let c=1/0,p=e.slice(1),h;this.options.extensions.startInline.forEach(m=>{h=m.call({lexer:this},p),typeof h=="number"&&h>=0&&(c=Math.min(c,h))}),c<1/0&&c>=0&&(r=e.substring(0,c+1))}if(s=this.tokenizer.inlineText(r)){e=e.substring(s.raw.length),s.raw.slice(-1)!=="_"&&(u=s.raw.slice(-1)),a=!0,n=t[t.length-1],n&&n.type==="text"?(n.raw+=s.raw,n.text+=s.text):t.push(s);continue}if(e){let c="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(c);break}else throw new Error(c)}}return t}},ne=class{options;constructor(e){this.options=e||V}code(e,t,s){let n=(t||"").match(/^\S*/)?.[0];return e=e.replace(/\n$/,"")+`
103
+ `,n?'<pre><code class="language-'+C(n)+'">'+(s?e:C(e,!0))+`</code></pre>
104
+ `:"<pre><code>"+(s?e:C(e,!0))+`</code></pre>
105
+ `}blockquote(e){return`<blockquote>
106
+ ${e}</blockquote>
107
+ `}html(e,t){return e}heading(e,t,s){return`<h${t}>${e}</h${t}>
108
+ `}hr(){return`<hr>
109
+ `}list(e,t,s){let n=t?"ol":"ul",r=t&&s!==1?' start="'+s+'"':"";return"<"+n+r+`>
110
+ `+e+"</"+n+`>
111
+ `}listitem(e,t,s){return`<li>${e}</li>
112
+ `}checkbox(e){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox">'}paragraph(e){return`<p>${e}</p>
113
+ `}table(e,t){return t&&(t=`<tbody>${t}</tbody>`),`<table>
114
+ <thead>
115
+ `+e+`</thead>
116
+ `+t+`</table>
117
+ `}tablerow(e){return`<tr>
118
+ ${e}</tr>
119
+ `}tablecell(e,t){let s=t.header?"th":"td";return(t.align?`<${s} align="${t.align}">`:`<${s}>`)+e+`</${s}>
120
+ `}strong(e){return`<strong>${e}</strong>`}em(e){return`<em>${e}</em>`}codespan(e){return`<code>${e}</code>`}br(){return"<br>"}del(e){return`<del>${e}</del>`}link(e,t,s){let n=as(e);if(n===null)return s;e=n;let r='<a href="'+e+'"';return t&&(r+=' title="'+t+'"'),r+=">"+s+"</a>",r}image(e,t,s){let n=as(e);if(n===null)return s;e=n;let r=`<img src="${e}" alt="${s}"`;return t&&(r+=` title="${t}"`),r+=">",r}text(e){return e}},_e=class{strong(e){return e}em(e){return e}codespan(e){return e}del(e){return e}html(e){return e}text(e){return e}link(e,t,s){return""+s}image(e,t,s){return""+s}br(){return""}},B=class o{options;renderer;textRenderer;constructor(e){this.options=e||V,this.options.renderer=this.options.renderer||new ne,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new _e}static parse(e,t){return new o(t).parse(e)}static parseInline(e,t){return new o(t).parseInline(e)}parse(e,t=!0){let s="";for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[r.type]){let i=r,l=this.options.extensions.renderers[i.type].call({parser:this},i);if(l!==!1||!["space","hr","heading","code","table","blockquote","list","html","paragraph","text"].includes(i.type)){s+=l||"";continue}}switch(r.type){case"space":continue;case"hr":{s+=this.renderer.hr();continue}case"heading":{let i=r;s+=this.renderer.heading(this.parseInline(i.tokens),i.depth,an(this.parseInline(i.tokens,this.textRenderer)));continue}case"code":{let i=r;s+=this.renderer.code(i.text,i.lang,!!i.escaped);continue}case"table":{let i=r,l="",a="";for(let c=0;c<i.header.length;c++)a+=this.renderer.tablecell(this.parseInline(i.header[c].tokens),{header:!0,align:i.align[c]});l+=this.renderer.tablerow(a);let u="";for(let c=0;c<i.rows.length;c++){let p=i.rows[c];a="";for(let h=0;h<p.length;h++)a+=this.renderer.tablecell(this.parseInline(p[h].tokens),{header:!1,align:i.align[h]});u+=this.renderer.tablerow(a)}s+=this.renderer.table(l,u);continue}case"blockquote":{let i=r,l=this.parse(i.tokens);s+=this.renderer.blockquote(l);continue}case"list":{let i=r,l=i.ordered,a=i.start,u=i.loose,c="";for(let p=0;p<i.items.length;p++){let h=i.items[p],m=h.checked,v=h.task,_="";if(h.task){let $=this.renderer.checkbox(!!m);u?h.tokens.length>0&&h.tokens[0].type==="paragraph"?(h.tokens[0].text=$+" "+h.tokens[0].text,h.tokens[0].tokens&&h.tokens[0].tokens.length>0&&h.tokens[0].tokens[0].type==="text"&&(h.tokens[0].tokens[0].text=$+" "+h.tokens[0].tokens[0].text)):h.tokens.unshift({type:"text",text:$+" "}):_+=$+" "}_+=this.parse(h.tokens,u),c+=this.renderer.listitem(_,v,!!m)}s+=this.renderer.list(c,l,a);continue}case"html":{let i=r;s+=this.renderer.html(i.text,i.block);continue}case"paragraph":{let i=r;s+=this.renderer.paragraph(this.parseInline(i.tokens));continue}case"text":{let i=r,l=i.tokens?this.parseInline(i.tokens):i.text;for(;n+1<e.length&&e[n+1].type==="text";)i=e[++n],l+=`
121
+ `+(i.tokens?this.parseInline(i.tokens):i.text);s+=t?this.renderer.paragraph(l):l;continue}default:{let i='Token with "'+r.type+'" type was not found.';if(this.options.silent)return console.error(i),"";throw new Error(i)}}}return s}parseInline(e,t){t=t||this.renderer;let s="";for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[r.type]){let i=this.options.extensions.renderers[r.type].call({parser:this},r);if(i!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(r.type)){s+=i||"";continue}}switch(r.type){case"escape":{let i=r;s+=t.text(i.text);break}case"html":{let i=r;s+=t.html(i.text);break}case"link":{let i=r;s+=t.link(i.href,i.title,this.parseInline(i.tokens,t));break}case"image":{let i=r;s+=t.image(i.href,i.title,i.text);break}case"strong":{let i=r;s+=t.strong(this.parseInline(i.tokens,t));break}case"em":{let i=r;s+=t.em(this.parseInline(i.tokens,t));break}case"codespan":{let i=r;s+=t.codespan(i.text);break}case"br":{s+=t.br();break}case"del":{let i=r;s+=t.del(this.parseInline(i.tokens,t));break}case"text":{let i=r;s+=t.text(i.text);break}default:{let i='Token with "'+r.type+'" type was not found.';if(this.options.silent)return console.error(i),"";throw new Error(i)}}}return s}},te=class{options;constructor(e){this.options=e||V}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}},pt=class{defaults=dt();options=this.setOptions;parse=this.#e(L.lex,B.parse);parseInline=this.#e(L.lexInline,B.parseInline);Parser=B;Renderer=ne;TextRenderer=_e;Lexer=L;Tokenizer=se;Hooks=te;constructor(...e){this.use(...e)}walkTokens(e,t){let s=[];for(let n of e)switch(s=s.concat(t.call(this,n)),n.type){case"table":{let r=n;for(let i of r.header)s=s.concat(this.walkTokens(i.tokens,t));for(let i of r.rows)for(let l of i)s=s.concat(this.walkTokens(l.tokens,t));break}case"list":{let r=n;s=s.concat(this.walkTokens(r.items,t));break}default:{let r=n;this.defaults.extensions?.childTokens?.[r.type]?this.defaults.extensions.childTokens[r.type].forEach(i=>{let l=r[i].flat(1/0);s=s.concat(this.walkTokens(l,t))}):r.tokens&&(s=s.concat(this.walkTokens(r.tokens,t)))}}return s}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(s=>{let n={...s};if(n.async=this.defaults.async||n.async||!1,s.extensions&&(s.extensions.forEach(r=>{if(!r.name)throw new Error("extension name required");if("renderer"in r){let i=t.renderers[r.name];i?t.renderers[r.name]=function(...l){let a=r.renderer.apply(this,l);return a===!1&&(a=i.apply(this,l)),a}:t.renderers[r.name]=r.renderer}if("tokenizer"in r){if(!r.level||r.level!=="block"&&r.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let i=t[r.level];i?i.unshift(r.tokenizer):t[r.level]=[r.tokenizer],r.start&&(r.level==="block"?t.startBlock?t.startBlock.push(r.start):t.startBlock=[r.start]:r.level==="inline"&&(t.startInline?t.startInline.push(r.start):t.startInline=[r.start]))}"childTokens"in r&&r.childTokens&&(t.childTokens[r.name]=r.childTokens)}),n.extensions=t),s.renderer){let r=this.defaults.renderer||new ne(this.defaults);for(let i in s.renderer){if(!(i in r))throw new Error(`renderer '${i}' does not exist`);if(i==="options")continue;let l=i,a=s.renderer[l],u=r[l];r[l]=(...c)=>{let p=a.apply(r,c);return p===!1&&(p=u.apply(r,c)),p||""}}n.renderer=r}if(s.tokenizer){let r=this.defaults.tokenizer||new se(this.defaults);for(let i in s.tokenizer){if(!(i in r))throw new Error(`tokenizer '${i}' does not exist`);if(["options","rules","lexer"].includes(i))continue;let l=i,a=s.tokenizer[l],u=r[l];r[l]=(...c)=>{let p=a.apply(r,c);return p===!1&&(p=u.apply(r,c)),p}}n.tokenizer=r}if(s.hooks){let r=this.defaults.hooks||new te;for(let i in s.hooks){if(!(i in r))throw new Error(`hook '${i}' does not exist`);if(i==="options")continue;let l=i,a=s.hooks[l],u=r[l];te.passThroughHooks.has(i)?r[l]=c=>{if(this.defaults.async)return Promise.resolve(a.call(r,c)).then(h=>u.call(r,h));let p=a.call(r,c);return u.call(r,p)}:r[l]=(...c)=>{let p=a.apply(r,c);return p===!1&&(p=u.apply(r,c)),p}}n.hooks=r}if(s.walkTokens){let r=this.defaults.walkTokens,i=s.walkTokens;n.walkTokens=function(l){let a=[];return a.push(i.call(this,l)),r&&(a=a.concat(r.call(this,l))),a}}this.defaults={...this.defaults,...n}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return L.lex(e,t??this.defaults)}parser(e,t){return B.parse(e,t??this.defaults)}#e(e,t){return(s,n)=>{let r={...n},i={...this.defaults,...r};this.defaults.async===!0&&r.async===!1&&(i.silent||console.warn("marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored."),i.async=!0);let l=this.#t(!!i.silent,!!i.async);if(typeof s>"u"||s===null)return l(new Error("marked(): input parameter is undefined or null"));if(typeof s!="string")return l(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(s)+", string expected"));if(i.hooks&&(i.hooks.options=i),i.async)return Promise.resolve(i.hooks?i.hooks.preprocess(s):s).then(a=>e(a,i)).then(a=>i.hooks?i.hooks.processAllTokens(a):a).then(a=>i.walkTokens?Promise.all(this.walkTokens(a,i.walkTokens)).then(()=>a):a).then(a=>t(a,i)).then(a=>i.hooks?i.hooks.postprocess(a):a).catch(l);try{i.hooks&&(s=i.hooks.preprocess(s));let a=e(s,i);i.hooks&&(a=i.hooks.processAllTokens(a)),i.walkTokens&&this.walkTokens(a,i.walkTokens);let u=t(a,i);return i.hooks&&(u=i.hooks.postprocess(u)),u}catch(a){return l(a)}}}#t(e,t){return s=>{if(s.message+=`
122
+ Please report this to https://github.com/markedjs/marked.`,e){let n="<p>An error occurred:</p><pre>"+C(s.message+"",!0)+"</pre>";return t?Promise.resolve(n):n}if(t)return Promise.reject(s);throw s}}},Z=new pt;function g(o,e){return Z.parse(o,e)}g.options=g.setOptions=function(o){return Z.setOptions(o),g.defaults=Z.defaults,ps(g.defaults),g};g.getDefaults=dt;g.defaults=V;g.use=function(...o){return Z.use(...o),g.defaults=Z.defaults,ps(g.defaults),g};g.walkTokens=function(o,e){return Z.walkTokens(o,e)};g.parseInline=Z.parseInline;g.Parser=B;g.parser=B.parse;g.Renderer=ne;g.TextRenderer=_e;g.Lexer=L;g.lexer=L.lex;g.Tokenizer=se;g.Hooks=te;g.parse=g;var xi=g.options,yi=g.setOptions,ki=g.use,bi=g.walkTokens,_i=g.parseInline;var wi=B.parse,$i=L.lex;g.setOptions({gfm:!0,breaks:!0});function bs(o){return o.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function H(o){if(!o)return"";try{let e=bs(o);return g(e)}catch(e){return console.warn("Failed to parse markdown:",e),bs(o).replace(/\n/g,"<br>")}}var U=class extends A{constructor(){super(...arguments);this.conversations=[]}createRenderRoot(){return this}handleToggle(t,s={}){let{type:n="content",targetSelector:r,toggleSelector:i,customHandler:l}=s,a=t.currentTarget;if(n==="write"){let p=a.previousElementSibling;p&&(!p.classList.contains("hidden")?(p.classList.add("hidden"),a.classList.remove("hidden")):(p.classList.remove("hidden"),a.classList.add("hidden")));return}let u=r?a.querySelector(r):a.nextElementSibling,c=i?a.querySelector(i):a.querySelector("span:first-child");if(u){let p=u.classList.contains("hidden");l?l(u,p):(u.classList.toggle("hidden",!p),c&&(c.textContent=p?"[-]":"[+]"))}}toggleContent(t){this.handleToggle(t)}toggleWriteContent(t){this.handleToggle(t,{type:"write"})}renderThinkingBlock(t){let s=t.trim();return s?this.renderCollapsibleSection("Thinking",d`<div class="text-gray-400 markdown-content">${G(H(s))}</div>`,{titleClasses:"text-gray-500 italic",containerClasses:"mt-4 mb-4"}):d``}formatContent(t,s){return typeof t=="string"?this.formatStringContent(t):Array.isArray(t)?d`
123
+ ${t.map(n=>{if(n.type==="text")return this.formatStringContent(n.text);if(n.type==="thinking"){let r=n;return this.renderThinkingBlock(r.thinking||"")}else{if(n.type==="tool_result")return d``;if(n.type==="tool_use"){let i=s?.[n.id];if(n.name==="TodoWrite"||n.name==="Edit"||n.name==="MultiEdit")return this.renderToolContainer(n,i);if(n.name==="Write"){let l=d`
124
+ <div class="bg-vs-bg-secondary p-4 text-vs-text hidden">
125
+ ${this.renderToolUseContent(n)}
126
+ </div>
127
+ <div
128
+ class="bg-vs-bg-secondary mx-4 p-4 text-vs-text cursor-pointer hover:bg-vs-border transition-colors"
129
+ @click=${this.toggleWriteContent}
130
+ >
131
+ ${this.renderWritePreview(n)}
132
+ </div>
133
+ `;return d`
134
+ <div class="mt-4 mb-4">
135
+ <div class="text-vs-type px-4 break-all">${this.getToolDisplayName(n)}</div>
136
+ ${l} ${i?this.renderToolResult(i,n):""}
137
+ </div>
138
+ `}return this.renderToolContainer(n,i,{isCollapsible:!0,isCollapsed:!0,isClickToExpand:!0})}}return d`<pre class="mb-4">${JSON.stringify(n,null,2)}</pre>`})}
139
+ `:d`<pre>${JSON.stringify(t,null,2)}</pre>`}extractTaggedBlocks(t,s){let n=new RegExp(`&lt;${s}&gt;([\\s\\S]*?)&lt;/${s}&gt;`,"g"),r=new RegExp(`<${s}>([\\s\\S]*?)<\\/${s}>`,"g"),i=[];for(let a of[n,r]){let u;for(;(u=a.exec(t))!==null;)i.push(u[1].trim())}let l=t.replace(n,"").replace(r,"").trim();return{blocks:i,remaining:l}}extractOutermostTaggedBlock(t,s){let n=[{open:`<${s}>`,close:`</${s}>`},{open:`&lt;${s}&gt;`,close:`&lt;/${s}&gt;`}],r=t.trim();for(let{open:i,close:l}of n){if(!r.startsWith(i))continue;let a=r.lastIndexOf(l);if(a<=i.length)return{block:null,remaining:t};let u=r.slice(i.length,a).trim(),c=r.slice(a+l.length).trim(),h=(t.slice(0,t.indexOf(r))+c).trim();return{block:u,remaining:h}}return{block:null,remaining:t}}renderTaggedCollapsibleSections(t,s){return s.length===0?d``:this.renderCollapsibleSection(t,d`<div class="text-vs-muted">
140
+ ${s.map((n,r)=>d`
141
+ <div class="mb-4">
142
+ ${s.length>1?d`<div class="text-vs-function font-bold mb-2">${t} ${r+1}:</div>`:""}
143
+ <div class="markdown-content">${G(H(n))}</div>
144
+ </div>
145
+ `)}
146
+ </div>`,{titleClasses:"text-vs-muted",containerClasses:"mt-4 mb-4",count:s.length>1?s.length:void 0})}isCodexContextOnlyText(t){let{sections:s,remaining:n}=this.extractCodexContextSections(t);if(s.length===0)return!1;let{remaining:r}=this.extractTaggedBlocks(n,"EXTREMELY_IMPORTANT"),{remaining:i}=this.extractTaggedBlocks(r,"system-reminder");return i.trim().length===0}isCodexContextOnlyMessage(t){return!Array.isArray(t.content)||t.content.length===0?!1:t.content.every(s=>s.type!=="text"||!("text"in s)?!1:this.isCodexContextOnlyText(s.text))}extractCodexContextSections(t){let s=[],n=t;for(let{tag:r,title:i}of U.CODEX_CONTEXT_TAGS){let l=this.extractOutermostTaggedBlock(n,r);l.block&&(s.push({title:i,blocks:[l.block]}),n=l.remaining)}return{sections:s,remaining:n}}formatStringContent(t){let{sections:s,remaining:n}=this.extractCodexContextSections(t),{blocks:r,remaining:i}=this.extractTaggedBlocks(n,"EXTREMELY_IMPORTANT"),{blocks:l,remaining:a}=this.extractTaggedBlocks(i,"system-reminder");return d`
147
+ ${a?d`<div class="mt-4 markdown-content">${G(H(a))}</div>`:""}
148
+ ${s.map(({title:u,blocks:c})=>this.renderTaggedCollapsibleSections(u,c))}
149
+ ${this.renderTaggedCollapsibleSections("Extremely Important",r)}
150
+ ${this.renderTaggedCollapsibleSections("System Reminder",l)}
151
+ `}formatSystem(t){if(!t)return"";if(typeof t=="string")return H(t);if(Array.isArray(t)){let s=t.map(n=>n.type==="text"?n.text:JSON.stringify(n,null,2)).join(`
152
+ `);return H(s)}return JSON.stringify(t,null,2)}formatResponseContent(t){return t?t.content&&Array.isArray(t.content)?d`
153
+ ${t.content.map(s=>{if(s.type==="text")return d`<div class="mt-4 markdown-content">${G(H(s.text))}</div>`;if(s.type==="thinking"){let n=s;return this.renderThinkingBlock(n.thinking||"")}else if(s.type==="tool_use")return s.name==="TodoWrite"?d`
154
+ <div class="mt-4 mb-4">
155
+ <div class="text-vs-type px-4 break-all">${this.getToolDisplayName(s)}</div>
156
+ <div class="bg-vs-bg-secondary mx-4 p-4 text-vs-text">
157
+ ${this.renderToolUseContent(s)}
158
+ </div>
159
+ </div>
160
+ `:d`
161
+ <div class="mt-4 mb-4">
162
+ <div
163
+ class="text-vs-type px-4 py-2 break-all cursor-pointer hover:text-white transition-colors"
164
+ @click=${this.toggleContent}
165
+ >
166
+ <span class="mr-2">[+]</span>
167
+ ${this.getToolDisplayName(s)}
168
+ </div>
169
+ <div class="bg-vs-bg-secondary mx-4 p-4 text-vs-text hidden">
170
+ ${this.renderToolUseContent(s)}
171
+ </div>
172
+ </div>
173
+ `;return d`<pre class="mb-4">${JSON.stringify(s,null,2)}</pre>`})}
174
+ `:d`<pre>${JSON.stringify(t,null,2)}</pre>`:d``}formatSingleParam(t,s,n=""){return s?d`${t}(<span class="text-vs-text">${this.unescapeHtml(s)}</span>)`:d`${t}`}formatMultiParam(t,s){return s.length>0?d`${t}(<span class="text-vs-text">${s.join(", ")}</span>)`:d`${t}`}unescapeHtml(t){let s=document.createElement("div");return s.innerHTML=t,s.textContent||s.innerText||""}wrapInScrollable(t,s=!0){return s&&typeof t=="string"?d`
175
+ <div class="overflow-x-auto">
176
+ <pre class="text-vs-text m-0" style="white-space: pre; font-family: monospace;">${t}</pre>
177
+ </div>
178
+ `:d` <div class="overflow-x-auto">${t}</div> `}renderCollapsibleSection(t,s,n={}){let{isExpanded:r=!1,titleClasses:i="",containerClasses:l="",count:a}=n,u=r?"":"hidden",c=r?"[-]":"[+]",p=a!==void 0?`${t} (${a})`:t;return d`
179
+ <div class="${l}">
180
+ <div class="cursor-pointer hover:text-white transition-colors ${i}" @click=${this.toggleContent}>
181
+ <span class="mr-2">${c}</span>
182
+ <span>${p}</span>
183
+ </div>
184
+ <div class="${u} mt-4">${s}</div>
185
+ </div>
186
+ `}getToolDisplayName(t,s){let n=t.name,r=t.input;switch(n){case"Read":return this.formatSingleParam(n,r?.file_path);case"Bash":return this.formatSingleParam(n,r?.command);case"Write":return this.formatSingleParam(n,r?.file_path);case"Glob":if(r?.pattern){let i=[this.unescapeHtml(r.pattern)];return r?.path&&i.push(this.unescapeHtml(r.path)),this.formatMultiParam(n,i)}return d`${n}`;case"Grep":if(r?.pattern){let i=[this.unescapeHtml(r.pattern)];return r?.include&&i.push(this.unescapeHtml(r.include)),r?.path&&i.push(this.unescapeHtml(r.path)),this.formatMultiParam(n,i)}return d`${n}`;case"LS":if(r?.path){let i=[this.unescapeHtml(r.path)];if(r?.ignore){let l=r.ignore.map(a=>this.unescapeHtml(a)).join(", ");i.push(`ignore: ${l}`)}return this.formatMultiParam(n,i)}return d`${n}`;case"Edit":return r?.file_path?this.formatSingleParam(n,this.unescapeHtml(r.file_path).split("/").pop()):d`${n}`;case"MultiEdit":if(r?.file_path){let i=this.unescapeHtml(r.file_path).split("/").pop()||r.file_path,l=r?.edits?r.edits.length:0;return this.formatMultiParam(n,[i,`${l} edits`])}return d`${n}`;case"NotebookRead":return r?.notebook_path?this.formatSingleParam(n,this.unescapeHtml(r.notebook_path).split("/").pop()):d`${n}`;case"NotebookEdit":if(r?.notebook_path&&r?.cell_number!==void 0){let i=this.unescapeHtml(r.notebook_path).split("/").pop(),l=r.cell_number,a=r?.edit_mode||"replace";return this.formatMultiParam(n,[i,`cell ${l}`,a])}return d`${n}`;case"WebFetch":return r?.url?this.formatSingleParam(n,r.url):d`${n}`;case"WebSearch":return r?.query?this.formatSingleParam(n,r.query):d`${n}`;default:return d`${n}`}}renderToolUseContent(t){let s=t.name,n=t.input;if(s==="TodoWrite"&&n?.todos){let r=n.todos;return this.wrapInScrollable(d`${r.map(i=>{let l=i.status==="completed"?"line-through text-vs-text":i.status==="in_progress"?"text-green-400":"text-vs-muted";return d`
187
+ <div class="overflow-hidden whitespace-nowrap text-ellipsis ${l}">• ${i.content}</div>
188
+ `})}`,!1)}if(s==="NotebookEdit"&&n?.new_source){let r=n.new_source;return this.wrapInScrollable(r)}if(s==="Write"&&n?.content){let r=n.content;return this.wrapInScrollable(r)}if(s==="MultiEdit"&&n?.edits){let r=n.edits;return this.wrapInScrollable(d`${r.map((i,l)=>{let a=i.old_string,u=i.new_string,c=this.renderDiff(a,u);return d`
189
+ <div class="mb-4">
190
+ <div class="text-vs-muted mb-2">Edit ${l+1}:</div>
191
+ <div>${c}</div>
192
+ </div>
193
+ `})}`,!1)}if(s==="Edit"&&n?.old_string&&n?.new_string){let r=n.old_string,i=n.new_string,l=this.renderDiff(r,i);return this.wrapInScrollable(d`${l}`,!1)}if(s==="WebFetch"&&n?.url&&n?.prompt)return this.wrapInScrollable(d`
194
+ <div class="mb-3">
195
+ <div class="text-vs-muted mb-1">URL:</div>
196
+ <div class="text-vs-text">${n.url}</div>
197
+ </div>
198
+ <div>
199
+ <div class="text-vs-muted mb-1">Prompt:</div>
200
+ <div class="text-vs-text">${n.prompt}</div>
201
+ </div>
202
+ `,!1);if(s==="WebSearch"&&n?.query){let r=[];return r.push(d`
203
+ <div class="mb-3">
204
+ <div class="text-vs-muted mb-1">Query:</div>
205
+ <div class="text-vs-text">${n.query}</div>
206
+ </div>
207
+ `),n?.allowed_domains&&r.push(d`
208
+ <div class="mb-3">
209
+ <div class="text-vs-muted mb-1">Allowed Domains:</div>
210
+ <div class="text-vs-text">${n.allowed_domains.join(", ")}</div>
211
+ </div>
212
+ `),n?.blocked_domains&&r.push(d`
213
+ <div class="mb-3">
214
+ <div class="text-vs-muted mb-1">Blocked Domains:</div>
215
+ <div class="text-vs-text">${n.blocked_domains.join(", ")}</div>
216
+ </div>
217
+ `),this.wrapInScrollable(d`${r}`,!1)}return this.wrapInScrollable(JSON.stringify(n,null,2))}renderToolResult(t,s){return d`
218
+ <div class="mb-4">
219
+ <div
220
+ class="text-vs-muted px-4 pb-0 cursor-pointer hover:text-white transition-colors"
221
+ @click=${this.toggleContent}
222
+ >
223
+ <span class="mr-2">[+]</span>
224
+ Tool Result ${t?.is_error?"\u274C":"\u2705"}
225
+ </div>
226
+ <div class="bg-vs-bg-secondary mx-4 p-4 text-vs-text hidden overflow-x-auto">
227
+ <pre class="whitespace-pre overflow-x-auto" style="white-space: pre; font-family: monospace;">
228
+ ${typeof t.content=="string"?t.content:JSON.stringify(t.content,null,2)}</pre
229
+ >
230
+ </div>
231
+ ${s?d`
232
+ <div>
233
+ <div
234
+ class="text-vs-muted px-4 cursor-pointer hover:text-white transition-colors"
235
+ @click=${this.toggleContent}
236
+ >
237
+ <span class="mr-2">[+]</span>
238
+ Raw Tool Call
239
+ </div>
240
+ <div class="bg-vs-bg-secondary mx-4 p-4 text-vs-text hidden">
241
+ ${this.wrapInScrollable(JSON.stringify(s,null,2))}
242
+ </div>
243
+ </div>
244
+ `:""}
245
+ </div>
246
+ `}renderToolContainer(t,s,n={}){let{isCollapsible:r=!1,isCollapsed:i=!1,isClickToExpand:l=!1,customContent:a}=n,u=a||d`${this.renderToolUseContent(t)}`,c=l?"text-vs-type px-4 break-all cursor-pointer hover:text-white transition-colors":"text-vs-type px-4 break-all",p=i?"bg-vs-bg-secondary mx-4 p-4 text-vs-text hidden":"bg-vs-bg-secondary mx-4 p-4 text-vs-text";return d`
247
+ <div class="mt-4 mb-4">
248
+ <div class="${c}" @click=${l?this.toggleContent:void 0}>
249
+ ${r?d`<span class="mr-2">[${i?"+":"-"}]</span>`:""}
250
+ ${this.getToolDisplayName(t)}
251
+ </div>
252
+ <div class="${p}">${u}</div>
253
+ ${s?this.renderToolResult(s,t):""}
254
+ </div>
255
+ `}renderWritePreview(t){let s=t.input;if(!s?.content)return d`<div class="text-vs-muted">No content</div>`;let r=s.content.split(`
256
+ `),i=r.slice(0,10),l=r.length>10;return d`
257
+ ${this.wrapInScrollable(i.join(`
258
+ `))}
259
+ ${l?d`<div class="text-vs-muted">... ${r.length-10} more lines (click to expand)</div>`:""}
260
+ `}renderDiff(t,s){let n=ct(t,s),r=[];for(let i of n){let l=i.value.split(`
261
+ `);l[l.length-1]===""&&l.pop();for(let a of l)i.added?r.push(d`<div class="bg-green-600/20"><pre class="text-vs-text m-0">+ ${a}</pre></div>`):i.removed?r.push(d`<div class="bg-red-600/20"><pre class="text-vs-text m-0">- ${a}</pre></div>`):r.push(d`<div><pre class="text-vs-text m-0"> ${a}</pre></div>`)}return r}formatTokenCount(t){if(t>=1e6){let s=t/1e6;return`${Number.isInteger(s)?s:s.toFixed(1).replace(/\.0$/,"")}M`}if(t>=1e4){let s=t/1e3;return`${Number.isInteger(s)?s:s.toFixed(1).replace(/\.0$/,"")}k`}return t.toLocaleString()}formatTokenUsageLine(t){let s=t.metadata,n=s.lastTurnInputTokens??s.inputTokens??0,r=s.sessionOutputTokens??s.outputTokens??0;if(n===0&&r===0)return null;let i=[`\u2191${this.formatTokenCount(n)} in`,`\u2193${this.formatTokenCount(r)} out`];s.totalPairs>1&&i.push(`${s.totalPairs} calls`);let l=s.cacheReadTokens??0;l>0&&i.push(`cache ${this.formatTokenCount(l)} read`);let a=s.cacheCreationTokens??0;return a>0&&i.push(`cache ${this.formatTokenCount(a)} write`),i.join(" \xB7 ")}formatMetadataLine(t){let s=[`${t.messages.length+1} messages`];t.apiFormatDisplay&&s.push(t.apiFormatDisplay);let n=this.formatTokenUsageLine(t);return n&&s.push(n),s.join(" \xB7 ")}hasTools(t){return!!(t.finalPair.request.tools&&t.finalPair.request.tools.length>0)}renderTools(t){return d`
262
+ ${t.map(s=>{if("name"in s&&s.name){let n="description"in s&&s.description||"No description";return this.renderCollapsibleSection(s.name,d`
263
+ <div class="text-vs-text ml-4 mb-3 markdown-content">
264
+ ${G(H(n))}
265
+ </div>
266
+
267
+ ${"input_schema"in s&&s.input_schema&&typeof s.input_schema=="object"?(()=>{let r=s.input_schema;return r.properties?d`
268
+ <div class="text-vs-muted mb-2">Parameters:</div>
269
+ ${Object.entries(r.properties).map(([i,l])=>{let a=l,u=r.required?.includes(i)?" (required)":"",c=a.type?` [${a.type}]`:"",p=a.description?` - ${a.description}`:"";return d`
270
+ <div class="ml-4 mb-1">
271
+ <span class="text-vs-user">${i}</span>
272
+ <span class="text-vs-muted">${c}${u}${p}</span>
273
+ </div>
274
+ `})}
275
+ `:d``})():d``}
276
+ `,{titleClasses:"text-vs-type font-bold",containerClasses:"mb-4",isExpanded:!0})}return d`<pre class="mb-4">${JSON.stringify(s,null,2)}</pre>`})}
277
+ `}renderConversationContent(t){return d`
278
+ <!-- System Prompt (Expandable) -->
279
+ ${t.system?this.renderCollapsibleSection("System Prompt",d`<div class="text-vs-text markdown-content mb-4">
280
+ ${G(this.formatSystem(t.system))}
281
+ </div>`,{titleClasses:"text-vs-function",containerClasses:"px-4 mt-4"}):""}
282
+
283
+ <!-- Tools (Expandable) -->
284
+ ${this.hasTools(t)?this.renderCollapsibleSection("Tools",d`<div class="ml-4">
285
+ <div class="text-vs-text">${this.renderTools(t.finalPair.request.tools||[])}</div>
286
+ </div>`,{titleClasses:"text-vs-type",containerClasses:"px-4",count:t.finalPair.request.tools?.length||0}):""}
287
+
288
+ <!-- Conversation Messages -->
289
+ <div class="px-4 mt-4">
290
+ ${t.messages.filter(s=>!s.hide).map((s,n)=>d`
291
+ <div class="mb-4">
292
+ ${this.isCodexContextOnlyMessage(s)?"":d`
293
+ <div
294
+ class="font-bold uppercase ${s.role==="user"?"text-vs-user":"text-vs-assistant"}"
295
+ >
296
+ <span>${s.role}</span>
297
+ </div>
298
+ `}
299
+ <div class="text-vs-text">
300
+ ${this.formatContent(s.content,s.toolResults)}
301
+ </div>
302
+ </div>
303
+ `)}
304
+
305
+ <!-- Assistant Response -->
306
+ <div class="mb-4">
307
+ <div class="font-bold uppercase text-vs-assistant">
308
+ <span>assistant</span>
309
+ </div>
310
+ <div class="text-vs-text">${this.formatResponseContent(t.response)}</div>
311
+ </div>
312
+ </div>
313
+ `}render(){return this.conversations.length===0?d`<div>No conversations found.</div>`:d`
314
+ <div class="max-w-[60em] mx-auto">
315
+ ${this.conversations.map(t=>d`
316
+ <div class="mt-8 first:mt-0">
317
+ ${t.compacted?d`
318
+ <!-- Compacted Conversation (Collapsed) -->
319
+ <div
320
+ class="cursor-pointer text-red-400 hover:text-red-300 transition-colors border border-red-700 p-4"
321
+ @click=${this.toggleContent}
322
+ >
323
+ <span class="mr-2">[+]</span>
324
+ <span>Compacted (click to view details)</span>
325
+ </div>
326
+ <div class="hidden mt-8">
327
+ <!-- Conversation Header -->
328
+ <div class="border border-red-700 p-4 mb-0">
329
+ <div class="text-red-400">${Array.from(t.models).join(", ")}</div>
330
+ <div class="text-vs-muted">
331
+ ${new Date(t.metadata.startTime).toLocaleString()}
332
+ <span class="ml-4">${this.formatMetadataLine(t)}</span>
333
+ </div>
334
+ </div>
335
+ ${this.renderConversationContent(t)}
336
+ </div>
337
+ `:d`
338
+ <!-- Regular Conversation -->
339
+ <!-- Conversation Header -->
340
+ <div class="border border-vs-highlight p-4 mb-0">
341
+ <div class="text-vs-assistant">${Array.from(t.models).join(", ")}</div>
342
+ <div class="text-vs-muted">
343
+ ${new Date(t.metadata.startTime).toLocaleString()}
344
+ <span class="ml-4">${this.formatMetadataLine(t)}</span>
345
+ </div>
346
+ </div>
347
+ ${this.renderConversationContent(t)}
348
+ `}
349
+ </div>
350
+ `)}
351
+ </div>
352
+ `}};U.CODEX_CONTEXT_TAGS=[{tag:"permissions instructions",title:"Permissions Instructions"},{tag:"collaboration_mode",title:"Collaboration Mode"},{tag:"skills_instructions",title:"Skills Instructions"},{tag:"environment_context",title:"Environment Context"}],S([z({type:Array})],U.prototype,"conversations",2),U=S([D("simple-conversation-view")],U);var Te=class extends A{constructor(){super(...arguments);this.rawPairs=[]}createRenderRoot(){return this}render(){if(this.rawPairs.length===0)return d`<div class="text-vs-muted">No raw pairs found.</div>`;let t=this.rawPairs.filter(s=>s.response!==null);return d`
353
+ <div>
354
+ ${t.map((s,n)=>d`
355
+ <div class="mt-8 first:mt-0">
356
+ <!-- Pair Header -->
357
+ <div class="border border-vs-highlight p-4 mb-0">
358
+ <div class="text-vs-assistant font-bold">
359
+ ${s.request.method} ${this.getUrlPath(s.request.url)}
360
+ </div>
361
+ <div class="text-vs-muted">
362
+ Raw Pair ${n+1} • ${this.getModelName(s)} • Status ${s.response.status_code} •
363
+ ${new Date(s.logged_at).toLocaleString()}
364
+ </div>
365
+ </div>
366
+
367
+ <!-- Request Section -->
368
+ <div class="px-4 mt-4">
369
+ <div class="mb-4">
370
+ <div
371
+ class="cursor-pointer text-vs-user font-bold hover:text-white transition-colors"
372
+ @click=${r=>this.toggleContent(r)}
373
+ >
374
+ <span class="mr-2">[+]</span>
375
+ <span>Request</span>
376
+ </div>
377
+ <div class="hidden mt-2">
378
+ <div class="bg-vs-bg-secondary p-4 text-vs-text overflow-x-auto">
379
+ <pre class="whitespace-pre text-vs-text m-0">${this.formatJson(s.request)}</pre>
380
+ </div>
381
+ </div>
382
+ </div>
383
+
384
+ <!-- Response Section -->
385
+ <div class="mb-4">
386
+ <div
387
+ class="cursor-pointer text-vs-assistant font-bold hover:text-white transition-colors"
388
+ @click=${r=>this.toggleContent(r)}
389
+ >
390
+ <span class="mr-2">[+]</span>
391
+ <span>Response</span>
392
+ </div>
393
+ <div class="hidden mt-2">
394
+ <div class="bg-vs-bg-secondary p-4 text-vs-text overflow-x-auto">
395
+ <pre class="whitespace-pre text-vs-text m-0">${this.formatJson(s.response)}</pre>
396
+ </div>
397
+ </div>
398
+ </div>
399
+
400
+ <!-- SSE Events Section -->
401
+ ${s.response.events&&s.response.events.length>0?d`
402
+ <div class="mb-4">
403
+ <div
404
+ class="cursor-pointer text-vs-type font-bold hover:text-white transition-colors"
405
+ @click=${r=>this.toggleContent(r)}
406
+ >
407
+ <span class="mr-2">[+]</span>
408
+ <span>SSE Events (${s.response.events.length})</span>
409
+ </div>
410
+ <div class="hidden mt-2">
411
+ <div class="bg-vs-bg-secondary p-4 text-vs-text overflow-x-auto">
412
+ <pre class="whitespace-pre text-vs-text m-0">
413
+ ${this.formatJson(s.response.events)}</pre
414
+ >
415
+ </div>
416
+ </div>
417
+ </div>
418
+ `:""}
419
+ </div>
420
+ </div>
421
+ `)}
422
+ </div>
423
+ `}getUrlPath(t){try{return new URL(t).pathname}catch{return t}}getModelName(t){if(t.request.url&&t.request.url.includes("bedrock-runtime")){let s=t.request.url.match(/\/model\/([^\/]+)/);if(s&&s[1])return this.normalizeModelName(s[1])}return t.request.body&&t.request.body.model?this.normalizeModelName(t.request.body.model):"unknown"}normalizeModelName(t){if(!t)return"unknown";if(t.startsWith("us.anthropic.")){let s=t.match(/us\.anthropic\.([^:]+)/);if(s&&s[1])return s[1]}return t}formatJson(t){try{return JSON.stringify(t,null,2)}catch{return String(t)}}toggleContent(t){let s=t.currentTarget,n=s.nextElementSibling,r=s.querySelector("span:first-child");if(n&&r){let i=n.classList.contains("hidden");n.classList.toggle("hidden",!i),r.textContent=i?"[-]":"[+]"}}};S([z({type:Array})],Te.prototype,"rawPairs",2),Te=S([D("raw-pairs-view")],Te);var Ee=class extends A{constructor(){super(...arguments);this.processedPairs=[]}createRenderRoot(){return this}render(){return this.processedPairs.length===0?d`<div class="text-vs-muted">No processed pairs found.</div>`:d`
424
+ <div>
425
+ ${this.processedPairs.map((t,s)=>d`
426
+ <div class="mt-8 first:mt-0">
427
+ <!-- Pair Header -->
428
+ <div class="border border-vs-highlight p-4 mb-0">
429
+ <div class="text-vs-assistant font-bold">${t.model}</div>
430
+ <div class="text-vs-muted">
431
+ Pair ${s+1} • ${t.isStreaming?"streaming":"non-streaming"} •
432
+ ${new Date(t.timestamp).toLocaleString()}
433
+ </div>
434
+ </div>
435
+
436
+ <!-- Request Section -->
437
+ <div class="px-4 mt-4">
438
+ <div class="mb-4">
439
+ <div
440
+ class="cursor-pointer text-vs-user font-bold hover:text-white transition-colors"
441
+ @click=${n=>this.toggleContent(n)}
442
+ >
443
+ <span class="mr-2">[+]</span>
444
+ <span>Request (MessageCreateParams)</span>
445
+ </div>
446
+ <div class="hidden mt-2">
447
+ <div class="bg-vs-bg-secondary p-4 text-vs-text overflow-x-auto">
448
+ <pre class="whitespace-pre text-vs-text m-0">${this.formatJson(t.request)}</pre>
449
+ </div>
450
+ </div>
451
+ </div>
452
+
453
+ <!-- Response Section -->
454
+ <div class="mb-4">
455
+ <div
456
+ class="cursor-pointer text-vs-assistant font-bold hover:text-white transition-colors"
457
+ @click=${n=>this.toggleContent(n)}
458
+ >
459
+ <span class="mr-2">[+]</span>
460
+ <span>Response (Message)${t.isStreaming?" - Reconstructed from SSE":""}</span>
461
+ </div>
462
+ <div class="hidden mt-2">
463
+ <div class="bg-vs-bg-secondary p-4 text-vs-text overflow-x-auto">
464
+ <pre class="whitespace-pre text-vs-text m-0">${this.formatJson(t.response)}</pre>
465
+ </div>
466
+ </div>
467
+ </div>
468
+ </div>
469
+ </div>
470
+ `)}
471
+ </div>
472
+ `}formatJson(t){try{return JSON.stringify(t,null,2)}catch(s){return`Error formatting JSON: ${s}`}}toggleContent(t){let s=t.currentTarget,n=s.nextElementSibling,r=s.querySelector("span:first-child");if(n&&r){let i=n.classList.contains("hidden");n.classList.toggle("hidden",!i),r.textContent=i?"[-]":"[+]"}}};S([z({type:Array})],Ee.prototype,"processedPairs",2),Ee=S([D("json-view")],Ee);var xt=`*, ::before, ::after {
473
+ --tw-border-spacing-x: 0;
474
+ --tw-border-spacing-y: 0;
475
+ --tw-translate-x: 0;
476
+ --tw-translate-y: 0;
477
+ --tw-rotate: 0;
478
+ --tw-skew-x: 0;
479
+ --tw-skew-y: 0;
480
+ --tw-scale-x: 1;
481
+ --tw-scale-y: 1;
482
+ --tw-pan-x: ;
483
+ --tw-pan-y: ;
484
+ --tw-pinch-zoom: ;
485
+ --tw-scroll-snap-strictness: proximity;
486
+ --tw-gradient-from-position: ;
487
+ --tw-gradient-via-position: ;
488
+ --tw-gradient-to-position: ;
489
+ --tw-ordinal: ;
490
+ --tw-slashed-zero: ;
491
+ --tw-numeric-figure: ;
492
+ --tw-numeric-spacing: ;
493
+ --tw-numeric-fraction: ;
494
+ --tw-ring-inset: ;
495
+ --tw-ring-offset-width: 0px;
496
+ --tw-ring-offset-color: #fff;
497
+ --tw-ring-color: rgb(59 130 246 / 0.5);
498
+ --tw-ring-offset-shadow: 0 0 #0000;
499
+ --tw-ring-shadow: 0 0 #0000;
500
+ --tw-shadow: 0 0 #0000;
501
+ --tw-shadow-colored: 0 0 #0000;
502
+ --tw-blur: ;
503
+ --tw-brightness: ;
504
+ --tw-contrast: ;
505
+ --tw-grayscale: ;
506
+ --tw-hue-rotate: ;
507
+ --tw-invert: ;
508
+ --tw-saturate: ;
509
+ --tw-sepia: ;
510
+ --tw-drop-shadow: ;
511
+ --tw-backdrop-blur: ;
512
+ --tw-backdrop-brightness: ;
513
+ --tw-backdrop-contrast: ;
514
+ --tw-backdrop-grayscale: ;
515
+ --tw-backdrop-hue-rotate: ;
516
+ --tw-backdrop-invert: ;
517
+ --tw-backdrop-opacity: ;
518
+ --tw-backdrop-saturate: ;
519
+ --tw-backdrop-sepia: ;
520
+ --tw-contain-size: ;
521
+ --tw-contain-layout: ;
522
+ --tw-contain-paint: ;
523
+ --tw-contain-style: ;
524
+ }
525
+
526
+ ::backdrop {
527
+ --tw-border-spacing-x: 0;
528
+ --tw-border-spacing-y: 0;
529
+ --tw-translate-x: 0;
530
+ --tw-translate-y: 0;
531
+ --tw-rotate: 0;
532
+ --tw-skew-x: 0;
533
+ --tw-skew-y: 0;
534
+ --tw-scale-x: 1;
535
+ --tw-scale-y: 1;
536
+ --tw-pan-x: ;
537
+ --tw-pan-y: ;
538
+ --tw-pinch-zoom: ;
539
+ --tw-scroll-snap-strictness: proximity;
540
+ --tw-gradient-from-position: ;
541
+ --tw-gradient-via-position: ;
542
+ --tw-gradient-to-position: ;
543
+ --tw-ordinal: ;
544
+ --tw-slashed-zero: ;
545
+ --tw-numeric-figure: ;
546
+ --tw-numeric-spacing: ;
547
+ --tw-numeric-fraction: ;
548
+ --tw-ring-inset: ;
549
+ --tw-ring-offset-width: 0px;
550
+ --tw-ring-offset-color: #fff;
551
+ --tw-ring-color: rgb(59 130 246 / 0.5);
552
+ --tw-ring-offset-shadow: 0 0 #0000;
553
+ --tw-ring-shadow: 0 0 #0000;
554
+ --tw-shadow: 0 0 #0000;
555
+ --tw-shadow-colored: 0 0 #0000;
556
+ --tw-blur: ;
557
+ --tw-brightness: ;
558
+ --tw-contrast: ;
559
+ --tw-grayscale: ;
560
+ --tw-hue-rotate: ;
561
+ --tw-invert: ;
562
+ --tw-saturate: ;
563
+ --tw-sepia: ;
564
+ --tw-drop-shadow: ;
565
+ --tw-backdrop-blur: ;
566
+ --tw-backdrop-brightness: ;
567
+ --tw-backdrop-contrast: ;
568
+ --tw-backdrop-grayscale: ;
569
+ --tw-backdrop-hue-rotate: ;
570
+ --tw-backdrop-invert: ;
571
+ --tw-backdrop-opacity: ;
572
+ --tw-backdrop-saturate: ;
573
+ --tw-backdrop-sepia: ;
574
+ --tw-contain-size: ;
575
+ --tw-contain-layout: ;
576
+ --tw-contain-paint: ;
577
+ --tw-contain-style: ;
578
+ }
579
+
580
+ /*
581
+ ! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com
582
+ */
583
+
584
+ /*
585
+ 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
586
+ 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
587
+ */
588
+
589
+ *,
590
+ ::before,
591
+ ::after {
592
+ box-sizing: border-box;
593
+ /* 1 */
594
+ border-width: 0;
595
+ /* 2 */
596
+ border-style: solid;
597
+ /* 2 */
598
+ border-color: #e5e7eb;
599
+ /* 2 */
600
+ }
601
+
602
+ ::before,
603
+ ::after {
604
+ --tw-content: '';
605
+ }
606
+
607
+ /*
608
+ 1. Use a consistent sensible line-height in all browsers.
609
+ 2. Prevent adjustments of font size after orientation changes in iOS.
610
+ 3. Use a more readable tab size.
611
+ 4. Use the user's configured \`sans\` font-family by default.
612
+ 5. Use the user's configured \`sans\` font-feature-settings by default.
613
+ 6. Use the user's configured \`sans\` font-variation-settings by default.
614
+ 7. Disable tap highlights on iOS
615
+ */
616
+
617
+ html,
618
+ :host {
619
+ line-height: 1.5;
620
+ /* 1 */
621
+ -webkit-text-size-adjust: 100%;
622
+ /* 2 */
623
+ -moz-tab-size: 4;
624
+ /* 3 */
625
+ -o-tab-size: 4;
626
+ tab-size: 4;
627
+ /* 3 */
628
+ font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
629
+ /* 4 */
630
+ font-feature-settings: normal;
631
+ /* 5 */
632
+ font-variation-settings: normal;
633
+ /* 6 */
634
+ -webkit-tap-highlight-color: transparent;
635
+ /* 7 */
636
+ }
637
+
638
+ /*
639
+ 1. Remove the margin in all browsers.
640
+ 2. Inherit line-height from \`html\` so users can set them as a class directly on the \`html\` element.
641
+ */
642
+
643
+ body {
644
+ margin: 0;
645
+ /* 1 */
646
+ line-height: inherit;
647
+ /* 2 */
648
+ }
649
+
650
+ /*
651
+ 1. Add the correct height in Firefox.
652
+ 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
653
+ 3. Ensure horizontal rules are visible by default.
654
+ */
655
+
656
+ hr {
657
+ height: 0;
658
+ /* 1 */
659
+ color: inherit;
660
+ /* 2 */
661
+ border-top-width: 1px;
662
+ /* 3 */
663
+ }
664
+
665
+ /*
666
+ Add the correct text decoration in Chrome, Edge, and Safari.
667
+ */
668
+
669
+ abbr:where([title]) {
670
+ -webkit-text-decoration: underline dotted;
671
+ text-decoration: underline dotted;
672
+ }
673
+
674
+ /*
675
+ Remove the default font size and weight for headings.
676
+ */
677
+
678
+ h1,
679
+ h2,
680
+ h3,
681
+ h4,
682
+ h5,
683
+ h6 {
684
+ font-size: inherit;
685
+ font-weight: inherit;
686
+ }
687
+
688
+ /*
689
+ Reset links to optimize for opt-in styling instead of opt-out.
690
+ */
691
+
692
+ a {
693
+ color: inherit;
694
+ text-decoration: inherit;
695
+ }
696
+
697
+ /*
698
+ Add the correct font weight in Edge and Safari.
699
+ */
700
+
701
+ b,
702
+ strong {
703
+ font-weight: bolder;
704
+ }
705
+
706
+ /*
707
+ 1. Use the user's configured \`mono\` font-family by default.
708
+ 2. Use the user's configured \`mono\` font-feature-settings by default.
709
+ 3. Use the user's configured \`mono\` font-variation-settings by default.
710
+ 4. Correct the odd \`em\` font sizing in all browsers.
711
+ */
712
+
713
+ code,
714
+ kbd,
715
+ samp,
716
+ pre {
717
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
718
+ /* 1 */
719
+ font-feature-settings: normal;
720
+ /* 2 */
721
+ font-variation-settings: normal;
722
+ /* 3 */
723
+ font-size: 1em;
724
+ /* 4 */
725
+ }
726
+
727
+ /*
728
+ Add the correct font size in all browsers.
729
+ */
730
+
731
+ small {
732
+ font-size: 80%;
733
+ }
734
+
735
+ /*
736
+ Prevent \`sub\` and \`sup\` elements from affecting the line height in all browsers.
737
+ */
738
+
739
+ sub,
740
+ sup {
741
+ font-size: 75%;
742
+ line-height: 0;
743
+ position: relative;
744
+ vertical-align: baseline;
745
+ }
746
+
747
+ sub {
748
+ bottom: -0.25em;
749
+ }
750
+
751
+ sup {
752
+ top: -0.5em;
753
+ }
754
+
755
+ /*
756
+ 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
757
+ 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
758
+ 3. Remove gaps between table borders by default.
759
+ */
760
+
761
+ table {
762
+ text-indent: 0;
763
+ /* 1 */
764
+ border-color: inherit;
765
+ /* 2 */
766
+ border-collapse: collapse;
767
+ /* 3 */
768
+ }
769
+
770
+ /*
771
+ 1. Change the font styles in all browsers.
772
+ 2. Remove the margin in Firefox and Safari.
773
+ 3. Remove default padding in all browsers.
774
+ */
775
+
776
+ button,
777
+ input,
778
+ optgroup,
779
+ select,
780
+ textarea {
781
+ font-family: inherit;
782
+ /* 1 */
783
+ font-feature-settings: inherit;
784
+ /* 1 */
785
+ font-variation-settings: inherit;
786
+ /* 1 */
787
+ font-size: 100%;
788
+ /* 1 */
789
+ font-weight: inherit;
790
+ /* 1 */
791
+ line-height: inherit;
792
+ /* 1 */
793
+ letter-spacing: inherit;
794
+ /* 1 */
795
+ color: inherit;
796
+ /* 1 */
797
+ margin: 0;
798
+ /* 2 */
799
+ padding: 0;
800
+ /* 3 */
801
+ }
802
+
803
+ /*
804
+ Remove the inheritance of text transform in Edge and Firefox.
805
+ */
806
+
807
+ button,
808
+ select {
809
+ text-transform: none;
810
+ }
811
+
812
+ /*
813
+ 1. Correct the inability to style clickable types in iOS and Safari.
814
+ 2. Remove default button styles.
815
+ */
816
+
817
+ button,
818
+ input:where([type='button']),
819
+ input:where([type='reset']),
820
+ input:where([type='submit']) {
821
+ -webkit-appearance: button;
822
+ /* 1 */
823
+ background-color: transparent;
824
+ /* 2 */
825
+ background-image: none;
826
+ /* 2 */
827
+ }
828
+
829
+ /*
830
+ Use the modern Firefox focus style for all focusable elements.
831
+ */
832
+
833
+ :-moz-focusring {
834
+ outline: auto;
835
+ }
836
+
837
+ /*
838
+ Remove the additional \`:invalid\` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
839
+ */
840
+
841
+ :-moz-ui-invalid {
842
+ box-shadow: none;
843
+ }
844
+
845
+ /*
846
+ Add the correct vertical alignment in Chrome and Firefox.
847
+ */
848
+
849
+ progress {
850
+ vertical-align: baseline;
851
+ }
852
+
853
+ /*
854
+ Correct the cursor style of increment and decrement buttons in Safari.
855
+ */
856
+
857
+ ::-webkit-inner-spin-button,
858
+ ::-webkit-outer-spin-button {
859
+ height: auto;
860
+ }
861
+
862
+ /*
863
+ 1. Correct the odd appearance in Chrome and Safari.
864
+ 2. Correct the outline style in Safari.
865
+ */
866
+
867
+ [type='search'] {
868
+ -webkit-appearance: textfield;
869
+ /* 1 */
870
+ outline-offset: -2px;
871
+ /* 2 */
872
+ }
873
+
874
+ /*
875
+ Remove the inner padding in Chrome and Safari on macOS.
876
+ */
877
+
878
+ ::-webkit-search-decoration {
879
+ -webkit-appearance: none;
880
+ }
881
+
882
+ /*
883
+ 1. Correct the inability to style clickable types in iOS and Safari.
884
+ 2. Change font properties to \`inherit\` in Safari.
885
+ */
886
+
887
+ ::-webkit-file-upload-button {
888
+ -webkit-appearance: button;
889
+ /* 1 */
890
+ font: inherit;
891
+ /* 2 */
892
+ }
893
+
894
+ /*
895
+ Add the correct display in Chrome and Safari.
896
+ */
897
+
898
+ summary {
899
+ display: list-item;
900
+ }
901
+
902
+ /*
903
+ Removes the default spacing and border for appropriate elements.
904
+ */
905
+
906
+ blockquote,
907
+ dl,
908
+ dd,
909
+ h1,
910
+ h2,
911
+ h3,
912
+ h4,
913
+ h5,
914
+ h6,
915
+ hr,
916
+ figure,
917
+ p,
918
+ pre {
919
+ margin: 0;
920
+ }
921
+
922
+ fieldset {
923
+ margin: 0;
924
+ padding: 0;
925
+ }
926
+
927
+ legend {
928
+ padding: 0;
929
+ }
930
+
931
+ ol,
932
+ ul,
933
+ menu {
934
+ list-style: none;
935
+ margin: 0;
936
+ padding: 0;
937
+ }
938
+
939
+ /*
940
+ Reset default styling for dialogs.
941
+ */
942
+
943
+ dialog {
944
+ padding: 0;
945
+ }
946
+
947
+ /*
948
+ Prevent resizing textareas horizontally by default.
949
+ */
950
+
951
+ textarea {
952
+ resize: vertical;
953
+ }
954
+
955
+ /*
956
+ 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
957
+ 2. Set the default placeholder color to the user's configured gray 400 color.
958
+ */
959
+
960
+ input::-moz-placeholder, textarea::-moz-placeholder {
961
+ opacity: 1;
962
+ /* 1 */
963
+ color: #9ca3af;
964
+ /* 2 */
965
+ }
966
+
967
+ input::placeholder,
968
+ textarea::placeholder {
969
+ opacity: 1;
970
+ /* 1 */
971
+ color: #9ca3af;
972
+ /* 2 */
973
+ }
974
+
975
+ /*
976
+ Set the default cursor for buttons.
977
+ */
978
+
979
+ button,
980
+ [role="button"] {
981
+ cursor: pointer;
982
+ }
983
+
984
+ /*
985
+ Make sure disabled buttons don't get the pointer cursor.
986
+ */
987
+
988
+ :disabled {
989
+ cursor: default;
990
+ }
991
+
992
+ /*
993
+ 1. Make replaced elements \`display: block\` by default. (https://github.com/mozdevs/cssremedy/issues/14)
994
+ 2. Add \`vertical-align: middle\` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
995
+ This can trigger a poorly considered lint error in some tools but is included by design.
996
+ */
997
+
998
+ img,
999
+ svg,
1000
+ video,
1001
+ canvas,
1002
+ audio,
1003
+ iframe,
1004
+ embed,
1005
+ object {
1006
+ display: block;
1007
+ /* 1 */
1008
+ vertical-align: middle;
1009
+ /* 2 */
1010
+ }
1011
+
1012
+ /*
1013
+ Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
1014
+ */
1015
+
1016
+ img,
1017
+ video {
1018
+ max-width: 100%;
1019
+ height: auto;
1020
+ }
1021
+
1022
+ /* Make elements with the HTML hidden attribute stay hidden by default */
1023
+
1024
+ [hidden]:where(:not([hidden="until-found"])) {
1025
+ display: none;
1026
+ }
1027
+
1028
+ .container {
1029
+ width: 100%;
1030
+ }
1031
+
1032
+ @media (min-width: 640px) {
1033
+ .container {
1034
+ max-width: 640px;
1035
+ }
1036
+ }
1037
+
1038
+ @media (min-width: 768px) {
1039
+ .container {
1040
+ max-width: 768px;
1041
+ }
1042
+ }
1043
+
1044
+ @media (min-width: 1024px) {
1045
+ .container {
1046
+ max-width: 1024px;
1047
+ }
1048
+ }
1049
+
1050
+ @media (min-width: 1280px) {
1051
+ .container {
1052
+ max-width: 1280px;
1053
+ }
1054
+ }
1055
+
1056
+ @media (min-width: 1536px) {
1057
+ .container {
1058
+ max-width: 1536px;
1059
+ }
1060
+ }
1061
+
1062
+ .static {
1063
+ position: static;
1064
+ }
1065
+
1066
+ .isolate {
1067
+ isolation: isolate;
1068
+ }
1069
+
1070
+ .m-0 {
1071
+ margin: 0px;
1072
+ }
1073
+
1074
+ .mx-4 {
1075
+ margin-left: 1rem;
1076
+ margin-right: 1rem;
1077
+ }
1078
+
1079
+ .mx-auto {
1080
+ margin-left: auto;
1081
+ margin-right: auto;
1082
+ }
1083
+
1084
+ .mb-0 {
1085
+ margin-bottom: 0px;
1086
+ }
1087
+
1088
+ .mb-1 {
1089
+ margin-bottom: 0.25rem;
1090
+ }
1091
+
1092
+ .mb-2 {
1093
+ margin-bottom: 0.5rem;
1094
+ }
1095
+
1096
+ .mb-3 {
1097
+ margin-bottom: 0.75rem;
1098
+ }
1099
+
1100
+ .mb-4 {
1101
+ margin-bottom: 1rem;
1102
+ }
1103
+
1104
+ .mb-8 {
1105
+ margin-bottom: 2rem;
1106
+ }
1107
+
1108
+ .ml-4 {
1109
+ margin-left: 1rem;
1110
+ }
1111
+
1112
+ .ml-8 {
1113
+ margin-left: 2rem;
1114
+ }
1115
+
1116
+ .mr-12 {
1117
+ margin-right: 3rem;
1118
+ }
1119
+
1120
+ .mr-2 {
1121
+ margin-right: 0.5rem;
1122
+ }
1123
+
1124
+ .mr-8 {
1125
+ margin-right: 2rem;
1126
+ }
1127
+
1128
+ .mt-2 {
1129
+ margin-top: 0.5rem;
1130
+ }
1131
+
1132
+ .mt-4 {
1133
+ margin-top: 1rem;
1134
+ }
1135
+
1136
+ .mt-8 {
1137
+ margin-top: 2rem;
1138
+ }
1139
+
1140
+ .block {
1141
+ display: block;
1142
+ }
1143
+
1144
+ .hidden {
1145
+ display: none;
1146
+ }
1147
+
1148
+ .min-h-screen {
1149
+ min-height: 100vh;
1150
+ }
1151
+
1152
+ .max-w-\\[60em\\] {
1153
+ max-width: 60em;
1154
+ }
1155
+
1156
+ .cursor-pointer {
1157
+ cursor: pointer;
1158
+ }
1159
+
1160
+ .overflow-hidden {
1161
+ overflow: hidden;
1162
+ }
1163
+
1164
+ .overflow-x-auto {
1165
+ overflow-x: auto;
1166
+ }
1167
+
1168
+ .text-ellipsis {
1169
+ text-overflow: ellipsis;
1170
+ }
1171
+
1172
+ .whitespace-nowrap {
1173
+ white-space: nowrap;
1174
+ }
1175
+
1176
+ .whitespace-pre {
1177
+ white-space: pre;
1178
+ }
1179
+
1180
+ .break-all {
1181
+ word-break: break-all;
1182
+ }
1183
+
1184
+ .border {
1185
+ border-width: 1px;
1186
+ }
1187
+
1188
+ .border-red-700 {
1189
+ --tw-border-opacity: 1;
1190
+ border-color: rgb(185 28 28 / var(--tw-border-opacity, 1));
1191
+ }
1192
+
1193
+ .border-vs-highlight {
1194
+ --tw-border-opacity: 1;
1195
+ border-color: rgb(139 105 20 / var(--tw-border-opacity, 1));
1196
+ }
1197
+
1198
+ .bg-green-600\\/20 {
1199
+ background-color: rgb(22 163 74 / 0.2);
1200
+ }
1201
+
1202
+ .bg-red-600\\/20 {
1203
+ background-color: rgb(220 38 38 / 0.2);
1204
+ }
1205
+
1206
+ .bg-vs-bg {
1207
+ --tw-bg-opacity: 1;
1208
+ background-color: rgb(30 30 30 / var(--tw-bg-opacity, 1));
1209
+ }
1210
+
1211
+ .bg-vs-bg-secondary {
1212
+ --tw-bg-opacity: 1;
1213
+ background-color: rgb(45 45 48 / var(--tw-bg-opacity, 1));
1214
+ }
1215
+
1216
+ .p-4 {
1217
+ padding: 1rem;
1218
+ }
1219
+
1220
+ .px-4 {
1221
+ padding-left: 1rem;
1222
+ padding-right: 1rem;
1223
+ }
1224
+
1225
+ .py-2 {
1226
+ padding-top: 0.5rem;
1227
+ padding-bottom: 0.5rem;
1228
+ }
1229
+
1230
+ .pb-0 {
1231
+ padding-bottom: 0px;
1232
+ }
1233
+
1234
+ .text-center {
1235
+ text-align: center;
1236
+ }
1237
+
1238
+ .font-mono {
1239
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1240
+ }
1241
+
1242
+ .font-bold {
1243
+ font-weight: 700;
1244
+ }
1245
+
1246
+ .uppercase {
1247
+ text-transform: uppercase;
1248
+ }
1249
+
1250
+ .italic {
1251
+ font-style: italic;
1252
+ }
1253
+
1254
+ .text-gray-400 {
1255
+ --tw-text-opacity: 1;
1256
+ color: rgb(156 163 175 / var(--tw-text-opacity, 1));
1257
+ }
1258
+
1259
+ .text-gray-500 {
1260
+ --tw-text-opacity: 1;
1261
+ color: rgb(107 114 128 / var(--tw-text-opacity, 1));
1262
+ }
1263
+
1264
+ .text-green-400 {
1265
+ --tw-text-opacity: 1;
1266
+ color: rgb(74 222 128 / var(--tw-text-opacity, 1));
1267
+ }
1268
+
1269
+ .text-red-400 {
1270
+ --tw-text-opacity: 1;
1271
+ color: rgb(248 113 113 / var(--tw-text-opacity, 1));
1272
+ }
1273
+
1274
+ .text-vs-assistant {
1275
+ --tw-text-opacity: 1;
1276
+ color: rgb(206 145 120 / var(--tw-text-opacity, 1));
1277
+ }
1278
+
1279
+ .text-vs-function {
1280
+ --tw-text-opacity: 1;
1281
+ color: rgb(220 220 170 / var(--tw-text-opacity, 1));
1282
+ }
1283
+
1284
+ .text-vs-muted {
1285
+ --tw-text-opacity: 1;
1286
+ color: rgb(140 140 140 / var(--tw-text-opacity, 1));
1287
+ }
1288
+
1289
+ .text-vs-nav-active {
1290
+ --tw-text-opacity: 1;
1291
+ color: rgb(244 135 113 / var(--tw-text-opacity, 1));
1292
+ }
1293
+
1294
+ .text-vs-text {
1295
+ --tw-text-opacity: 1;
1296
+ color: rgb(212 212 212 / var(--tw-text-opacity, 1));
1297
+ }
1298
+
1299
+ .text-vs-type {
1300
+ --tw-text-opacity: 1;
1301
+ color: rgb(78 201 176 / var(--tw-text-opacity, 1));
1302
+ }
1303
+
1304
+ .text-vs-user {
1305
+ --tw-text-opacity: 1;
1306
+ color: rgb(106 153 85 / var(--tw-text-opacity, 1));
1307
+ }
1308
+
1309
+ .line-through {
1310
+ text-decoration-line: line-through;
1311
+ }
1312
+
1313
+ .shadow {
1314
+ --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
1315
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
1316
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1317
+ }
1318
+
1319
+ .filter {
1320
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
1321
+ }
1322
+
1323
+ .transition-colors {
1324
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
1325
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1326
+ transition-duration: 150ms;
1327
+ }
1328
+
1329
+ html, body {
1330
+ font-size: 12px;
1331
+ background-color: #1e1e1e;
1332
+ /* vs-bg color */
1333
+ }
1334
+
1335
+ /* Text wrapping only for markdown content */
1336
+
1337
+ .markdown-content {
1338
+ word-wrap: break-word;
1339
+ overflow-wrap: break-word;
1340
+ word-break: break-word;
1341
+ max-width: 100%;
1342
+ overflow-x: hidden;
1343
+ }
1344
+
1345
+ /* Terminal-style markdown styling - full line spacing only */
1346
+
1347
+ .markdown-content h1,
1348
+ .markdown-content h2,
1349
+ .markdown-content h3,
1350
+ .markdown-content h4,
1351
+ .markdown-content h5,
1352
+ .markdown-content h6 {
1353
+ font-size: inherit;
1354
+ /* Same as body text */
1355
+ font-weight: bold;
1356
+ color: #dcdcaa;
1357
+ /* vs-function color */
1358
+ margin: 1em 0;
1359
+ /* Full line spacing */
1360
+ }
1361
+
1362
+ .markdown-content p {
1363
+ margin: 0 0 1em 0;
1364
+ /* One line after paragraphs */
1365
+ font-size: inherit;
1366
+ }
1367
+
1368
+ .markdown-content strong,
1369
+ .markdown-content b {
1370
+ font-weight: bold;
1371
+ color: #d4d4d4;
1372
+ /* vs-text color */
1373
+ }
1374
+
1375
+ .markdown-content em,
1376
+ .markdown-content i {
1377
+ font-style: italic;
1378
+ color: #ce9178;
1379
+ /* vs-assistant color */
1380
+ }
1381
+
1382
+ .markdown-content code {
1383
+ font-family: monospace;
1384
+ font-size: inherit;
1385
+ color: #4ec9b0;
1386
+ /* vs-type color */
1387
+ }
1388
+
1389
+ .markdown-content pre {
1390
+ font-family: monospace;
1391
+ font-size: inherit;
1392
+ margin: 1em 0;
1393
+ /* Full line spacing */
1394
+ white-space: pre-wrap;
1395
+ /* Wrap long lines */
1396
+ }
1397
+
1398
+ .markdown-content pre code {
1399
+ color: inherit;
1400
+ }
1401
+
1402
+ .markdown-content ul,
1403
+ .markdown-content ol {
1404
+ margin: 1em 0;
1405
+ /* Full line spacing */
1406
+ padding-left: 0;
1407
+ list-style: none;
1408
+ }
1409
+
1410
+ .markdown-content li {
1411
+ margin: 0;
1412
+ /* No spacing between list items */
1413
+ font-size: inherit;
1414
+ padding-left: 1.5em;
1415
+ position: relative;
1416
+ }
1417
+
1418
+ .markdown-content ul li::before {
1419
+ content: "- ";
1420
+ color: #8c8c8c;
1421
+ /* vs-muted */
1422
+ position: absolute;
1423
+ left: 0;
1424
+ }
1425
+
1426
+ .markdown-content ol li::before {
1427
+ content: counter(list-item) ". ";
1428
+ color: #8c8c8c;
1429
+ /* vs-muted */
1430
+ position: absolute;
1431
+ left: 0;
1432
+ }
1433
+
1434
+ .markdown-content blockquote {
1435
+ border-left: 2px solid #8c8c8c;
1436
+ /* vs-muted */
1437
+ padding-left: 0.75em;
1438
+ margin: 1em 0;
1439
+ /* Full line spacing */
1440
+ color: #8c8c8c;
1441
+ /* vs-muted */
1442
+ font-style: italic;
1443
+ }
1444
+
1445
+ .markdown-content a {
1446
+ color: #569cd6;
1447
+ /* vs-accent */
1448
+ text-decoration: underline;
1449
+ }
1450
+
1451
+ .markdown-content a:hover {
1452
+ color: #ffffff;
1453
+ }
1454
+
1455
+ .markdown-content hr {
1456
+ border: none;
1457
+ border-top: 1px solid #3e3e42;
1458
+ /* vs-border */
1459
+ margin: 1em 0;
1460
+ /* Full line spacing */
1461
+ }
1462
+
1463
+ /* Remove top margin from first element to avoid double spacing */
1464
+
1465
+ .markdown-content > *:first-child {
1466
+ margin-top: 0;
1467
+ }
1468
+
1469
+ /* Remove bottom margin from last element to avoid extra spacing */
1470
+
1471
+ .markdown-content > *:last-child {
1472
+ margin-bottom: 0;
1473
+ }
1474
+
1475
+ .first\\:mt-0:first-child {
1476
+ margin-top: 0px;
1477
+ }
1478
+
1479
+ .hover\\:bg-vs-border:hover {
1480
+ --tw-bg-opacity: 1;
1481
+ background-color: rgb(62 62 66 / var(--tw-bg-opacity, 1));
1482
+ }
1483
+
1484
+ .hover\\:text-red-300:hover {
1485
+ --tw-text-opacity: 1;
1486
+ color: rgb(252 165 165 / var(--tw-text-opacity, 1));
1487
+ }
1488
+
1489
+ .hover\\:text-vs-accent:hover {
1490
+ --tw-text-opacity: 1;
1491
+ color: rgb(86 156 214 / var(--tw-text-opacity, 1));
1492
+ }
1493
+
1494
+ .hover\\:text-white:hover {
1495
+ --tw-text-opacity: 1;
1496
+ color: rgb(255 255 255 / var(--tw-text-opacity, 1));
1497
+ }
1498
+
1499
+ `;if(xt&&xt!=="__CSS_CONTENT__"){let o=document.createElement("style");o.textContent=xt,document.head.appendChild(o)}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",_s):_s();function _s(){let o=new R,e=document.getElementById("app");e?e.appendChild(o):console.error("App mount point not found")}})();
1500
+ /*! Bundled license information:
1501
+
1502
+ @lit-labs/ssr-dom-shim/lib/element-internals.js:
1503
+ @lit-labs/ssr-dom-shim/lib/events.js:
1504
+ (**
1505
+ * @license
1506
+ * Copyright 2023 Google LLC
1507
+ * SPDX-License-Identifier: BSD-3-Clause
1508
+ *)
1509
+
1510
+ @lit-labs/ssr-dom-shim/index.js:
1511
+ @lit/reactive-element/node/css-tag.js:
1512
+ (**
1513
+ * @license
1514
+ * Copyright 2019 Google LLC
1515
+ * SPDX-License-Identifier: BSD-3-Clause
1516
+ *)
1517
+
1518
+ lit-html/node/lit-html.js:
1519
+ lit-element/lit-element.js:
1520
+ @lit/reactive-element/node/decorators/custom-element.js:
1521
+ @lit/reactive-element/node/decorators/property.js:
1522
+ @lit/reactive-element/node/decorators/state.js:
1523
+ @lit/reactive-element/node/decorators/event-options.js:
1524
+ @lit/reactive-element/node/decorators/base.js:
1525
+ @lit/reactive-element/node/decorators/query.js:
1526
+ @lit/reactive-element/node/decorators/query-all.js:
1527
+ @lit/reactive-element/node/decorators/query-async.js:
1528
+ @lit/reactive-element/node/decorators/query-assigned-nodes.js:
1529
+ lit-html/node/directive.js:
1530
+ lit-html/node/directives/unsafe-html.js:
1531
+ (**
1532
+ * @license
1533
+ * Copyright 2017 Google LLC
1534
+ * SPDX-License-Identifier: BSD-3-Clause
1535
+ *)
1536
+
1537
+ lit-html/node/is-server.js:
1538
+ (**
1539
+ * @license
1540
+ * Copyright 2022 Google LLC
1541
+ * SPDX-License-Identifier: BSD-3-Clause
1542
+ *)
1543
+
1544
+ @lit/reactive-element/node/decorators/query-assigned-elements.js:
1545
+ (**
1546
+ * @license
1547
+ * Copyright 2021 Google LLC
1548
+ * SPDX-License-Identifier: BSD-3-Clause
1549
+ *)
1550
+ */
1551
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL0BsaXQtbGFicy9zc3ItZG9tLXNoaW0vc3JjL2xpYi9lbGVtZW50LWludGVybmFscy50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC1sYWJzL3Nzci1kb20tc2hpbS9zcmMvbGliL2V2ZW50cy50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC1sYWJzL3Nzci1kb20tc2hpbS9zcmMvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9zcmMvY3NzLXRhZy50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9yZWFjdGl2ZS1lbGVtZW50LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvbGl0LWh0bWwudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1lbGVtZW50L3NyYy9saXQtZWxlbWVudC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9kZWNvcmF0b3JzL2N1c3RvbS1lbGVtZW50LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL2RlY29yYXRvcnMvcHJvcGVydHkudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9zcmMvZGVjb3JhdG9ycy9zdGF0ZS50cyIsICIuLi8uLi9zcmMvYWRhcHQvYXBpLWZvcm1hdC50cyIsICIuLi8uLi9zcmMvYWRhcHQvb3BlbmFpLWFkYXB0ZXIudHMiLCAiLi4vLi4vc3JjL3JlcG9ydC9zaGFyZWQtY29udmVyc2F0aW9uLXByb2Nlc3Nvci50cyIsICIuLi9zcmMvYXBwLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC50cyIsICIuLi9ub2RlX21vZHVsZXMvZGlmZi9saWJlc20vZGlmZi9iYXNlLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9kaWZmL2xpYmVzbS9kaWZmL2xpbmUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvZGVmYXVsdHMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvaGVscGVycy50cyIsICIuLi9ub2RlX21vZHVsZXMvbWFya2VkL3NyYy9Ub2tlbml6ZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvcnVsZXMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvTGV4ZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvUmVuZGVyZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvVGV4dFJlbmRlcmVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL1BhcnNlci50cyIsICIuLi9ub2RlX21vZHVsZXMvbWFya2VkL3NyYy9Ib29rcy50cyIsICIuLi9ub2RlX21vZHVsZXMvbWFya2VkL3NyYy9JbnN0YW5jZS50cyIsICIuLi9ub2RlX21vZHVsZXMvbWFya2VkL3NyYy9tYXJrZWQudHMiLCAiLi4vc3JjL3V0aWxzL21hcmtkb3duLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3NpbXBsZS1jb252ZXJzYXRpb24tdmlldy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9yYXctcGFpcnMtdmlldy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9qc29uLXZpZXcudHMiLCAiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxudHlwZSBBUklBQXR0cmlidXRlTWFwID0ge1xuICBbSyBpbiBrZXlvZiBBUklBTWl4aW5dOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIE1hcCBvZiBBUklBTWl4aW4gcHJvcGVydGllcyB0byBhdHRyaWJ1dGVzXG4gKi9cbmV4cG9ydCBjb25zdCBhcmlhTWl4aW5BdHRyaWJ1dGVzOiBBUklBQXR0cmlidXRlTWFwID0ge1xuICBhcmlhQXRvbWljOiAnYXJpYS1hdG9taWMnLFxuICBhcmlhQXV0b0NvbXBsZXRlOiAnYXJpYS1hdXRvY29tcGxldGUnLFxuICBhcmlhQnJhaWxsZUxhYmVsOiAnYXJpYS1icmFpbGxlbGFiZWwnLFxuICBhcmlhQnJhaWxsZVJvbGVEZXNjcmlwdGlvbjogJ2FyaWEtYnJhaWxsZXJvbGVkZXNjcmlwdGlvbicsXG4gIGFyaWFCdXN5OiAnYXJpYS1idXN5JyxcbiAgYXJpYUNoZWNrZWQ6ICdhcmlhLWNoZWNrZWQnLFxuICBhcmlhQ29sQ291bnQ6ICdhcmlhLWNvbGNvdW50JyxcbiAgYXJpYUNvbEluZGV4OiAnYXJpYS1jb2xpbmRleCcsXG4gIGFyaWFDb2xTcGFuOiAnYXJpYS1jb2xzcGFuJyxcbiAgYXJpYUN1cnJlbnQ6ICdhcmlhLWN1cnJlbnQnLFxuICBhcmlhRGVzY3JpcHRpb246ICdhcmlhLWRlc2NyaXB0aW9uJyxcbiAgYXJpYURpc2FibGVkOiAnYXJpYS1kaXNhYmxlZCcsXG4gIGFyaWFFeHBhbmRlZDogJ2FyaWEtZXhwYW5kZWQnLFxuICBhcmlhSGFzUG9wdXA6ICdhcmlhLWhhc3BvcHVwJyxcbiAgYXJpYUhpZGRlbjogJ2FyaWEtaGlkZGVuJyxcbiAgYXJpYUludmFsaWQ6ICdhcmlhLWludmFsaWQnLFxuICBhcmlhS2V5U2hvcnRjdXRzOiAnYXJpYS1rZXlzaG9ydGN1dHMnLFxuICBhcmlhTGFiZWw6ICdhcmlhLWxhYmVsJyxcbiAgYXJpYUxldmVsOiAnYXJpYS1sZXZlbCcsXG4gIGFyaWFMaXZlOiAnYXJpYS1saXZlJyxcbiAgYXJpYU1vZGFsOiAnYXJpYS1tb2RhbCcsXG4gIGFyaWFNdWx0aUxpbmU6ICdhcmlhLW11bHRpbGluZScsXG4gIGFyaWFNdWx0aVNlbGVjdGFibGU6ICdhcmlhLW11bHRpc2VsZWN0YWJsZScsXG4gIGFyaWFPcmllbnRhdGlvbjogJ2FyaWEtb3JpZW50YXRpb24nLFxuICBhcmlhUGxhY2Vob2xkZXI6ICdhcmlhLXBsYWNlaG9sZGVyJyxcbiAgYXJpYVBvc0luU2V0OiAnYXJpYS1wb3NpbnNldCcsXG4gIGFyaWFQcmVzc2VkOiAnYXJpYS1wcmVzc2VkJyxcbiAgYXJpYVJlYWRPbmx5OiAnYXJpYS1yZWFkb25seScsXG4gIGFyaWFSZXF1aXJlZDogJ2FyaWEtcmVxdWlyZWQnLFxuICBhcmlhUm9sZURlc2NyaXB0aW9uOiAnYXJpYS1yb2xlZGVzY3JpcHRpb24nLFxuICBhcmlhUm93Q291bnQ6ICdhcmlhLXJvd2NvdW50JyxcbiAgYXJpYVJvd0luZGV4OiAnYXJpYS1yb3dpbmRleCcsXG4gIGFyaWFSb3dTcGFuOiAnYXJpYS1yb3dzcGFuJyxcbiAgYXJpYVNlbGVjdGVkOiAnYXJpYS1zZWxlY3RlZCcsXG4gIGFyaWFTZXRTaXplOiAnYXJpYS1zZXRzaXplJyxcbiAgYXJpYVNvcnQ6ICdhcmlhLXNvcnQnLFxuICBhcmlhVmFsdWVNYXg6ICdhcmlhLXZhbHVlbWF4JyxcbiAgYXJpYVZhbHVlTWluOiAnYXJpYS12YWx1ZW1pbicsXG4gIGFyaWFWYWx1ZU5vdzogJ2FyaWEtdmFsdWVub3cnLFxuICBhcmlhVmFsdWVUZXh0OiAnYXJpYS12YWx1ZXRleHQnLFxuICByb2xlOiAncm9sZScsXG59O1xuXG50eXBlIEVsZW1lbnRJbnRlcm5hbHNJbnRlcmZhY2UgPSBFbGVtZW50SW50ZXJuYWxzO1xuXG4vLyBTaGltIHRoZSBnbG9iYWwgZWxlbWVudCBpbnRlcm5hbHMgb2JqZWN0XG4vLyBNZXRob2RzIHNob3VsZCBiZSBmaW5lIGFzIG5vb3BzIGFuZCBwcm9wZXJ0aWVzIGNhbiBnZW5lcmFsbHlcbi8vIGJlIHdoaWxlIG9uIHRoZSBzZXJ2ZXIuXG5leHBvcnQgY29uc3QgRWxlbWVudEludGVybmFsc1NoaW0gPSBjbGFzcyBFbGVtZW50SW50ZXJuYWxzXG4gIGltcGxlbWVudHMgRWxlbWVudEludGVybmFsc0ludGVyZmFjZVxue1xuICBhcmlhQXRvbWljID0gJyc7XG4gIGFyaWFBdXRvQ29tcGxldGUgPSAnJztcbiAgYXJpYUJyYWlsbGVMYWJlbCA9ICcnO1xuICBhcmlhQnJhaWxsZVJvbGVEZXNjcmlwdGlvbiA9ICcnO1xuICBhcmlhQnVzeSA9ICcnO1xuICBhcmlhQ2hlY2tlZCA9ICcnO1xuICBhcmlhQ29sQ291bnQgPSAnJztcbiAgYXJpYUNvbEluZGV4ID0gJyc7XG4gIGFyaWFDb2xTcGFuID0gJyc7XG4gIGFyaWFDdXJyZW50ID0gJyc7XG4gIGFyaWFEZXNjcmlwdGlvbiA9ICcnO1xuICBhcmlhRGlzYWJsZWQgPSAnJztcbiAgYXJpYUV4cGFuZGVkID0gJyc7XG4gIGFyaWFIYXNQb3B1cCA9ICcnO1xuICBhcmlhSGlkZGVuID0gJyc7XG4gIGFyaWFJbnZhbGlkID0gJyc7XG4gIGFyaWFLZXlTaG9ydGN1dHMgPSAnJztcbiAgYXJpYUxhYmVsID0gJyc7XG4gIGFyaWFMZXZlbCA9ICcnO1xuICBhcmlhTGl2ZSA9ICcnO1xuICBhcmlhTW9kYWwgPSAnJztcbiAgYXJpYU11bHRpTGluZSA9ICcnO1xuICBhcmlhTXVsdGlTZWxlY3RhYmxlID0gJyc7XG4gIGFyaWFPcmllbnRhdGlvbiA9ICcnO1xuICBhcmlhUGxhY2Vob2xkZXIgPSAnJztcbiAgYXJpYVBvc0luU2V0ID0gJyc7XG4gIGFyaWFQcmVzc2VkID0gJyc7XG4gIGFyaWFSZWFkT25seSA9ICcnO1xuICBhcmlhUmVxdWlyZWQgPSAnJztcbiAgYXJpYVJvbGVEZXNjcmlwdGlvbiA9ICcnO1xuICBhcmlhUm93Q291bnQgPSAnJztcbiAgYXJpYVJvd0luZGV4ID0gJyc7XG4gIGFyaWFSb3dTcGFuID0gJyc7XG4gIGFyaWFTZWxlY3RlZCA9ICcnO1xuICBhcmlhU2V0U2l6ZSA9ICcnO1xuICBhcmlhU29ydCA9ICcnO1xuICBhcmlhVmFsdWVNYXggPSAnJztcbiAgYXJpYVZhbHVlTWluID0gJyc7XG4gIGFyaWFWYWx1ZU5vdyA9ICcnO1xuICBhcmlhVmFsdWVUZXh0ID0gJyc7XG4gIHJvbGUgPSAnJztcbiAgX19ob3N0OiBIVE1MRWxlbWVudDtcbiAgZ2V0IHNoYWRvd1Jvb3QoKSB7XG4gICAgLy8gR3JhYiB0aGUgc2hhZG93IHJvb3QgaW5zdGFuY2UgZnJvbSB0aGUgRWxlbWVudCBzaGltXG4gICAgLy8gdG8gZW5zdXJlIHRoYXQgdGhlIHNoYWRvdyByb290IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICAvLyB0byB0aGUgaW50ZXJuYWxzIGluc3RhbmNlIGV2ZW4gaWYgdGhlIG1vZGUgaXMgJ2Nsb3NlZCdcbiAgICByZXR1cm4gKHRoaXMuX19ob3N0IGFzIEhUTUxFbGVtZW50ICYge19fc2hhZG93Um9vdDogU2hhZG93Um9vdH0pXG4gICAgICAuX19zaGFkb3dSb290O1xuICB9XG4gIGNvbnN0cnVjdG9yKF9ob3N0OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX19ob3N0ID0gX2hvc3Q7XG4gIH1cbiAgY2hlY2tWYWxpZGl0eSgpIHtcbiAgICAvLyBUT0RPKGF1Z3VzdGprKSBDb25zaWRlciBhY3R1YWxseSBpbXBsZW1lbnRpbmcgbG9naWMuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9saXQvbGl0L2lzc3Vlcy8zNzQwXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ2BFbGVtZW50SW50ZXJuYWxzLmNoZWNrVmFsaWRpdHkoKWAgd2FzIGNhbGxlZCBvbiB0aGUgc2VydmVyLicgK1xuICAgICAgICAnVGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgdHJ1ZS4nXG4gICAgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmb3JtID0gbnVsbDtcbiAgbGFiZWxzID0gW10gYXMgdW5rbm93biBhcyBOb2RlTGlzdE9mPEhUTUxMYWJlbEVsZW1lbnQ+O1xuICByZXBvcnRWYWxpZGl0eSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBzZXRGb3JtVmFsdWUoKTogdm9pZCB7fVxuICBzZXRWYWxpZGl0eSgpOiB2b2lkIHt9XG4gIHN0YXRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICB2YWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICB2YWxpZGl0eSA9IHt9IGFzIFZhbGlkaXR5U3RhdGU7XG4gIHdpbGxWYWxpZGF0ZSA9IHRydWU7XG59O1xuXG5jb25zdCBFbGVtZW50SW50ZXJuYWxzU2hpbVdpdGhSZWFsVHlwZSA9XG4gIEVsZW1lbnRJbnRlcm5hbHNTaGltIGFzIG9iamVjdCBhcyB0eXBlb2YgRWxlbWVudEludGVybmFscztcbmV4cG9ydCB7RWxlbWVudEludGVybmFsc1NoaW1XaXRoUmVhbFR5cGUgYXMgRWxlbWVudEludGVybmFsc307XG5cbmV4cG9ydCBjb25zdCBIWURSQVRFX0lOVEVSTkFMU19BVFRSX1BSRUZJWCA9ICdoeWRyYXRlLWludGVybmFscy0nO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBhbiBFdmVudFRhcmdldCwgRXZlbnQgYW5kIEN1c3RvbUV2ZW50LlxuICpcbiAqIFRoaXMgaXMgbm90IGZ1bGx5IHNwZWMgY29tcGxpYW50IChlLmcuIHZhbGlkYXRpb24pLFxuICogYnV0IHNob3VsZCB3b3JrIHdlbGwgZW5vdWdoIGZvciBvdXIgdXNlIGNhc2VzLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNldmVudHRhcmdldFxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2V2ZW50XG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jY3VzdG9tZXZlbnRcbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50VGFyZ2V0U2hpbU1ldGEge1xuICAvKipcbiAgICogVGhlIGV2ZW50IHRhcmdldCBwYXJlbnQgcmVwcmVzZW50cyB0aGUgcHJldmlvdXMgZXZlbnQgdGFyZ2V0IGZvciBhbiBldmVudFxuICAgKiBpbiBjYXB0dXJlIHBoYXNlIGFuZCB0aGUgbmV4dCBldmVudCB0YXJnZXQgZm9yIGEgYnViYmxpbmcgZXZlbnQuXG4gICAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgZWxlbWVudCBwYXJlbnRcbiAgICovXG4gIF9fZXZlbnRUYXJnZXRQYXJlbnQ6IEV2ZW50VGFyZ2V0IHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogVGhlIGhvc3QgZXZlbnQgdGFyZ2V0L2VsZW1lbnQgb2YgdGhpcyBldmVudCB0YXJnZXQsIGlmIHRoaXMgZXZlbnQgdGFyZ2V0XG4gICAqIGlzIGluc2lkZSBhIFNoYWRvdyBET00uXG4gICAqL1xuICBfX2hvc3Q6IEV2ZW50VGFyZ2V0IHwgdW5kZWZpbmVkO1xufVxuXG50eXBlIEV2ZW50VGFyZ2V0SW50ZXJmYWNlID0gRXZlbnRUYXJnZXQ7XG5cbmNvbnN0IGlzQ2FwdHVyZUV2ZW50TGlzdGVuZXIgPSAoXG4gIG9wdGlvbnM6IHVuZGVmaW5lZCB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHwgYm9vbGVhblxuKSA9PiAodHlwZW9mIG9wdGlvbnMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMgOiBvcHRpb25zPy5jYXB0dXJlID8/IGZhbHNlKTtcblxuLy8gRXZlbnQgcGhhc2VzXG5jb25zdCBOT05FID0gMDtcbmNvbnN0IENBUFRVUklOR19QSEFTRSA9IDE7XG5jb25zdCBBVF9UQVJHRVQgPSAyO1xuY29uc3QgQlVCQkxJTkdfUEhBU0UgPSAzO1xuXG4vLyBTaGltIHRoZSBnbG9iYWwgRXZlbnRUYXJnZXQgb2JqZWN0XG5jb25zdCBFdmVudFRhcmdldFNoaW0gPSBjbGFzcyBFdmVudFRhcmdldFxuICBpbXBsZW1lbnRzIEV2ZW50VGFyZ2V0SW50ZXJmYWNlLCBFdmVudFRhcmdldFNoaW1NZXRhXG57XG4gIHByaXZhdGUgX19ldmVudExpc3RlbmVycyA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIE1hcDxFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0LCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucz5cbiAgPigpO1xuICBwcml2YXRlIF9fY2FwdHVyZUV2ZW50TGlzdGVuZXJzID0gbmV3IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgTWFwPEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsIEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zPlxuICA+KCk7XG4gIF9fZXZlbnRUYXJnZXRQYXJlbnQ6IEV2ZW50VGFyZ2V0IHwgdW5kZWZpbmVkO1xuICBfX2hvc3Q6IEV2ZW50VGFyZ2V0IHwgdW5kZWZpbmVkO1xuXG4gIGFkZEV2ZW50TGlzdGVuZXIoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGNhbGxiYWNrOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0IHwgbnVsbCxcbiAgICBvcHRpb25zPzogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMgfCBib29sZWFuXG4gICk6IHZvaWQge1xuICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkIHx8IGNhbGxiYWNrID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzTWFwID0gaXNDYXB0dXJlRXZlbnRMaXN0ZW5lcihvcHRpb25zKVxuICAgICAgPyB0aGlzLl9fY2FwdHVyZUV2ZW50TGlzdGVuZXJzXG4gICAgICA6IHRoaXMuX19ldmVudExpc3RlbmVycztcbiAgICBsZXQgZXZlbnRMaXN0ZW5lcnMgPSBldmVudExpc3RlbmVyc01hcC5nZXQodHlwZSk7XG4gICAgaWYgKGV2ZW50TGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGV2ZW50TGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuICAgICAgZXZlbnRMaXN0ZW5lcnNNYXAuc2V0KHR5cGUsIGV2ZW50TGlzdGVuZXJzKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50TGlzdGVuZXJzLmhhcyhjYWxsYmFjaykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkT3B0aW9ucyA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyA/IG9wdGlvbnMgOiB7fTtcbiAgICBub3JtYWxpemVkT3B0aW9ucy5zaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT5cbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjaywgb3B0aW9ucylcbiAgICApO1xuICAgIGV2ZW50TGlzdGVuZXJzLnNldChjYWxsYmFjaywgbm9ybWFsaXplZE9wdGlvbnMgPz8ge30pO1xuICB9XG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGNhbGxiYWNrOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0IHwgbnVsbCxcbiAgICBvcHRpb25zPzogRXZlbnRMaXN0ZW5lck9wdGlvbnMgfCBib29sZWFuXG4gICk6IHZvaWQge1xuICAgIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkIHx8IGNhbGxiYWNrID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzTWFwID0gaXNDYXB0dXJlRXZlbnRMaXN0ZW5lcihvcHRpb25zKVxuICAgICAgPyB0aGlzLl9fY2FwdHVyZUV2ZW50TGlzdGVuZXJzXG4gICAgICA6IHRoaXMuX19ldmVudExpc3RlbmVycztcbiAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJzTWFwLmdldCh0eXBlKTtcbiAgICBpZiAoZXZlbnRMaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGNhbGxiYWNrKTtcbiAgICAgIGlmICghZXZlbnRMaXN0ZW5lcnMuc2l6ZSkge1xuICAgICAgICBldmVudExpc3RlbmVyc01hcC5kZWxldGUodHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGRpc3BhdGNoRXZlbnQoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29tcG9zZWRQYXRoOiBFdmVudFRhcmdldFtdID0gW3RoaXNdO1xuICAgIGxldCBwYXJlbnQgPSB0aGlzLl9fZXZlbnRUYXJnZXRQYXJlbnQ7XG4gICAgaWYgKGV2ZW50LmNvbXBvc2VkKSB7XG4gICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgIGNvbXBvc2VkUGF0aC5wdXNoKHBhcmVudCk7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5fX2V2ZW50VGFyZ2V0UGFyZW50O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgZXZlbnQgaXMgbm90IGNvbXBvc2VkIGFuZCB0aGUgZXZlbnQgd2FzIGRpc3BhdGNoZWQgaW5zaWRlXG4gICAgICAvLyBzaGFkb3cgRE9NLCB3ZSBuZWVkIHRvIHN0b3AgYmVmb3JlIHRoZSBob3N0IG9mIHRoZSBzaGFkb3cgRE9NLlxuICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQgIT09IHRoaXMuX19ob3N0KSB7XG4gICAgICAgIGNvbXBvc2VkUGF0aC5wdXNoKHBhcmVudCk7XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5fX2V2ZW50VGFyZ2V0UGFyZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gcGF0Y2ggdmFyaW91cyBwcm9wZXJ0aWVzIHRoYXQgd291bGQgZWl0aGVyIGJlIGVtcHR5IG9yIHdyb25nXG4gICAgLy8gaW4gdGhpcyBzY2VuYXJpby5cbiAgICBsZXQgc3RvcFByb3BhZ2F0aW9uID0gZmFsc2U7XG4gICAgbGV0IHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9IGZhbHNlO1xuICAgIGxldCBldmVudFBoYXNlID0gTk9ORTtcbiAgICBsZXQgdGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwgPSBudWxsO1xuICAgIGxldCB0bXBUYXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGN1cnJlbnRUYXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3Qgb3JpZ2luYWxTdG9wUHJvcGFnYXRpb24gPSBldmVudC5zdG9wUHJvcGFnYXRpb247XG4gICAgY29uc3Qgb3JpZ2luYWxTdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb247XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZXZlbnQsIHtcbiAgICAgIHRhcmdldDoge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldCA/PyB0bXBUYXJnZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIC4uLmVudW1lcmFibGVQcm9wZXJ0eSxcbiAgICAgIH0sXG4gICAgICBzcmNFbGVtZW50OiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gZXZlbnQudGFyZ2V0O1xuICAgICAgICB9LFxuICAgICAgICAuLi5lbnVtZXJhYmxlUHJvcGVydHksXG4gICAgICB9LFxuICAgICAgY3VycmVudFRhcmdldDoge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnRUYXJnZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIC4uLmVudW1lcmFibGVQcm9wZXJ0eSxcbiAgICAgIH0sXG4gICAgICBldmVudFBoYXNlOiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gZXZlbnRQaGFzZTtcbiAgICAgICAgfSxcbiAgICAgICAgLi4uZW51bWVyYWJsZVByb3BlcnR5LFxuICAgICAgfSxcbiAgICAgIGNvbXBvc2VkUGF0aDoge1xuICAgICAgICB2YWx1ZTogKCkgPT4gY29tcG9zZWRQYXRoLFxuICAgICAgICAuLi5lbnVtZXJhYmxlUHJvcGVydHksXG4gICAgICB9LFxuICAgICAgc3RvcFByb3BhZ2F0aW9uOiB7XG4gICAgICAgIHZhbHVlOiAoKSA9PiB7XG4gICAgICAgICAgc3RvcFByb3BhZ2F0aW9uID0gdHJ1ZTtcbiAgICAgICAgICBvcmlnaW5hbFN0b3BQcm9wYWdhdGlvbi5jYWxsKGV2ZW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgLi4uZW51bWVyYWJsZVByb3BlcnR5LFxuICAgICAgfSxcbiAgICAgIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjoge1xuICAgICAgICB2YWx1ZTogKCkgPT4ge1xuICAgICAgICAgIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9IHRydWU7XG4gICAgICAgICAgb3JpZ2luYWxTdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24uY2FsbChldmVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIC4uLmVudW1lcmFibGVQcm9wZXJ0eSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBBbiBldmVudCBoYW5kbGVyIGNhbiBlaXRoZXIgYmUgYSBmdW5jdGlvbiwgYW4gb2JqZWN0IHdpdGggYSBoYW5kbGVFdmVudFxuICAgIC8vIG1ldGhvZCBvciBudWxsLiBUaGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgdG8gY2FsbCB0aGUgZXZlbnQgaGFuZGxlclxuICAgIC8vIGNvcnJlY3RseS5cbiAgICBjb25zdCBpbnZva2VFdmVudExpc3RlbmVyID0gKFxuICAgICAgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsXG4gICAgICBvcHRpb25zOiBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyxcbiAgICAgIGV2ZW50TGlzdGVuZXJNYXA6IE1hcDxcbiAgICAgICAgRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCxcbiAgICAgICAgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnNcbiAgICAgID5cbiAgICApID0+IHtcbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdGVuZXI/LmhhbmRsZUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGxpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50KTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLm9uY2UpIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lck1hcC5kZWxldGUobGlzdGVuZXIpO1xuICAgICAgfVxuICAgIH07XG4gICAgLy8gV2hlbiBhbiBldmVudCBpcyBmaW5pc2hlZCBiZWluZyBkaXNwYXRjaGVkLCB3aGljaCBjYW4gYmUgYWZ0ZXIgdGhlIGV2ZW50XG4gICAgLy8gdHJlZSBoYXMgYmVlbiB0cmF2ZXJzZWQgb3Igc3RvcFByb3BhZ2F0aW9uL3N0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiBoYXNcbiAgICAvLyBiZWVuIGNhbGxlZC4gT25jZSB0aGF0IGlzIHRoZSBjYXNlLCB0aGUgY3VycmVudFRhcmdldCBhbmQgZXZlbnRQaGFzZVxuICAgIC8vIG5lZWQgdG8gYmUgcmVzZXQgYW5kIGEgdmFsdWUsIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSBldmVudCBoYXMgbm90XG4gICAgLy8gYmVlbiBwcmV2ZW50ZWQsIG5lZWRzIHRvIGJlIHJldHVybmVkLlxuICAgIGNvbnN0IGZpbmlzaERpc3BhdGNoID0gKCkgPT4ge1xuICAgICAgY3VycmVudFRhcmdldCA9IG51bGw7XG4gICAgICBldmVudFBoYXNlID0gTk9ORTtcbiAgICAgIHJldHVybiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZDtcbiAgICB9O1xuXG4gICAgLy8gQW4gZXZlbnQgc3RhcnRzIHdpdGggdGhlIGNhcHR1cmUgb3JkZXIsIHdoZXJlIGl0IHN0YXJ0cyBmcm9tIHRoZSB0b3AuXG4gICAgLy8gVGhpcyBpcyBkb25lIGV2ZW4gaWYgYnViYmxlcyBpcyBzZXQgdG8gZmFsc2UsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LlxuICAgIGNvbnN0IGNhcHR1cmVFdmVudFBhdGggPSBjb21wb3NlZFBhdGguc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgLy8gSWYgdGhlIGV2ZW50IHRhcmdldCwgd2hpY2ggZGlzcGF0Y2hlcyB0aGUgZXZlbnQsIGlzIGVpdGhlciBpbiB0aGUgbGlnaHQgRE9NXG4gICAgLy8gb3IgdGhlIGV2ZW50IGlzIG5vdCBjb21wb3NlZCwgdGhlIHRhcmdldCBpcyBhbHdheXMgaXRzZWxmLiBJZiB0aGF0IGlzIG5vdFxuICAgIC8vIHRoZSBjYXNlLCB0aGUgdGFyZ2V0IG5lZWRzIHRvIGJlIHJldGFyZ2V0ZWQ6IGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jcmV0YXJnZXRcbiAgICB0YXJnZXQgPSAhdGhpcy5fX2hvc3QgfHwgIWV2ZW50LmNvbXBvc2VkID8gdGhpcyA6IG51bGw7XG4gICAgY29uc3QgcmV0YXJnZXQgPSAoZXZlbnRUYXJnZXRzOiBFdmVudFRhcmdldFtdKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIHRtcFRhcmdldCA9IHRoaXM7XG4gICAgICB3aGlsZSAodG1wVGFyZ2V0Ll9faG9zdCAmJiBldmVudFRhcmdldHMuaW5jbHVkZXModG1wVGFyZ2V0Ll9faG9zdCkpIHtcbiAgICAgICAgdG1wVGFyZ2V0ID0gdG1wVGFyZ2V0Ll9faG9zdDtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAoY29uc3QgZXZlbnRUYXJnZXQgb2YgY2FwdHVyZUV2ZW50UGF0aCkge1xuICAgICAgaWYgKCF0YXJnZXQgJiYgKCF0bXBUYXJnZXQgfHwgdG1wVGFyZ2V0ID09PSBldmVudFRhcmdldC5fX2hvc3QpKSB7XG4gICAgICAgIHJldGFyZ2V0KGNhcHR1cmVFdmVudFBhdGguc2xpY2UoY2FwdHVyZUV2ZW50UGF0aC5pbmRleE9mKGV2ZW50VGFyZ2V0KSkpO1xuICAgICAgfVxuICAgICAgY3VycmVudFRhcmdldCA9IGV2ZW50VGFyZ2V0O1xuICAgICAgZXZlbnRQaGFzZSA9IGV2ZW50VGFyZ2V0ID09PSBldmVudC50YXJnZXQgPyBBVF9UQVJHRVQgOiBDQVBUVVJJTkdfUEhBU0U7XG4gICAgICBjb25zdCBjYXB0dXJlRXZlbnRMaXN0ZW5lcnMgPSBldmVudFRhcmdldC5fX2NhcHR1cmVFdmVudExpc3RlbmVycy5nZXQoXG4gICAgICAgIGV2ZW50LnR5cGVcbiAgICAgICk7XG4gICAgICBpZiAoY2FwdHVyZUV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2xpc3RlbmVyLCBvcHRpb25zXSBvZiBjYXB0dXJlRXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgICBpbnZva2VFdmVudExpc3RlbmVyKGxpc3RlbmVyLCBvcHRpb25zLCBjYXB0dXJlRXZlbnRMaXN0ZW5lcnMpO1xuICAgICAgICAgIGlmIChzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24pIHtcbiAgICAgICAgICAgIC8vIEV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIHN0b3BzIGFueSBmb2xsb3dpbmcgaW52b2NhdGlvblxuICAgICAgICAgICAgLy8gb2YgYW4gZXZlbnQgaGFuZGxlciBldmVuIG9uIHRoZSBzYW1lIGV2ZW50IHRhcmdldC5cbiAgICAgICAgICAgIHJldHVybiBmaW5pc2hEaXNwYXRjaCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICAvLyBFdmVudC5zdG9wUHJvcGFnYXRpb24oKSBzdG9wcyBhbnkgZm9sbG93aW5nIGludm9jYXRpb25cbiAgICAgICAgLy8gb2YgYW4gZXZlbnQgaGFuZGxlciBmb3IgYW55IGZvbGxvd2luZyBldmVudCB0YXJnZXRzLlxuICAgICAgICByZXR1cm4gZmluaXNoRGlzcGF0Y2goKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBidWJibGVFdmVudFBhdGggPSBldmVudC5idWJibGVzID8gY29tcG9zZWRQYXRoIDogW3RoaXNdO1xuICAgIHRtcFRhcmdldCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBldmVudFRhcmdldCBvZiBidWJibGVFdmVudFBhdGgpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXRhcmdldCAmJlxuICAgICAgICAoIXRtcFRhcmdldCB8fCBldmVudFRhcmdldCA9PT0gKHRtcFRhcmdldCBhcyBFdmVudFRhcmdldCkuX19ob3N0KVxuICAgICAgKSB7XG4gICAgICAgIHJldGFyZ2V0KFxuICAgICAgICAgIGJ1YmJsZUV2ZW50UGF0aC5zbGljZSgwLCBidWJibGVFdmVudFBhdGguaW5kZXhPZihldmVudFRhcmdldCkgKyAxKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY3VycmVudFRhcmdldCA9IGV2ZW50VGFyZ2V0O1xuICAgICAgZXZlbnRQaGFzZSA9IGV2ZW50VGFyZ2V0ID09PSBldmVudC50YXJnZXQgPyBBVF9UQVJHRVQgOiBCVUJCTElOR19QSEFTRTtcbiAgICAgIGNvbnN0IGNhcHR1cmVFdmVudExpc3RlbmVycyA9IGV2ZW50VGFyZ2V0Ll9fZXZlbnRMaXN0ZW5lcnMuZ2V0KFxuICAgICAgICBldmVudC50eXBlXG4gICAgICApO1xuICAgICAgaWYgKGNhcHR1cmVFdmVudExpc3RlbmVycykge1xuICAgICAgICBmb3IgKGNvbnN0IFtsaXN0ZW5lciwgb3B0aW9uc10gb2YgY2FwdHVyZUV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgICAgaW52b2tlRXZlbnRMaXN0ZW5lcihsaXN0ZW5lciwgb3B0aW9ucywgY2FwdHVyZUV2ZW50TGlzdGVuZXJzKTtcbiAgICAgICAgICBpZiAoc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKSB7XG4gICAgICAgICAgICAvLyBFdmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSBzdG9wcyBhbnkgZm9sbG93aW5nIGludm9jYXRpb25cbiAgICAgICAgICAgIC8vIG9mIGFuIGV2ZW50IGhhbmRsZXIgZXZlbiBvbiB0aGUgc2FtZSBldmVudCB0YXJnZXQuXG4gICAgICAgICAgICByZXR1cm4gZmluaXNoRGlzcGF0Y2goKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgICAgLy8gRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkgc3RvcHMgYW55IGZvbGxvd2luZyBpbnZvY2F0aW9uXG4gICAgICAgIC8vIG9mIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGFueSBmb2xsb3dpbmcgZXZlbnQgdGFyZ2V0cy5cbiAgICAgICAgcmV0dXJuIGZpbmlzaERpc3BhdGNoKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaW5pc2hEaXNwYXRjaCgpO1xuICB9XG59O1xuXG5jb25zdCBFdmVudFRhcmdldFNoaW1XaXRoUmVhbFR5cGUgPVxuICBFdmVudFRhcmdldFNoaW0gYXMgb2JqZWN0IGFzIHR5cGVvZiBFdmVudFRhcmdldDtcbmV4cG9ydCB7XG4gIEV2ZW50VGFyZ2V0U2hpbVdpdGhSZWFsVHlwZSBhcyBFdmVudFRhcmdldCxcbiAgRXZlbnRUYXJnZXRTaGltV2l0aFJlYWxUeXBlIGFzIEV2ZW50VGFyZ2V0U2hpbSxcbn07XG5cbi8qIEFkYXB0ZWQgZnJvbSBOb2RlLmpzIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL21haW4vbGliL2ludGVybmFsL2V2ZW50X3RhcmdldC5qcyAqL1xuXG50eXBlIEV2ZW50SW50ZXJmYWNlID0gRXZlbnQ7XG5cbmNvbnN0IGVudW1lcmFibGVQcm9wZXJ0eTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7X19wcm90b19fOiBudWxsfTtcbmVudW1lcmFibGVQcm9wZXJ0eS5lbnVtZXJhYmxlID0gdHJ1ZTtcbk9iamVjdC5mcmVlemUoZW51bWVyYWJsZVByb3BlcnR5KTtcblxuLy8gVE9ETzogUmVtb3ZlIHRoaXMgd2hlbiB3ZSByZW1vdmUgc3VwcG9ydCBmb3Igdm0gbW9kdWxlcyAoLS1leHBlcmltZW50YWwtdm0tbW9kdWxlcykuXG5jb25zdCBFdmVudFNoaW0gPSBjbGFzcyBFdmVudCBpbXBsZW1lbnRzIEV2ZW50SW50ZXJmYWNlIHtcbiAgI2NhbmNlbGFibGUgPSBmYWxzZTtcbiAgI2J1YmJsZXMgPSBmYWxzZTtcbiAgI2NvbXBvc2VkID0gZmFsc2U7XG4gICNkZWZhdWx0UHJldmVudGVkID0gZmFsc2U7XG4gICN0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAjcHJvcGFnYXRpb25TdG9wcGVkID0gZmFsc2U7XG4gICN0eXBlOiBzdHJpbmc7XG4gICN0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbDtcbiAgI2lzQmVpbmdEaXNwYXRjaGVkOiBib29sZWFuO1xuICByZWFkb25seSBOT05FID0gTk9ORTtcbiAgcmVhZG9ubHkgQ0FQVFVSSU5HX1BIQVNFID0gQ0FQVFVSSU5HX1BIQVNFO1xuICByZWFkb25seSBBVF9UQVJHRVQgPSBBVF9UQVJHRVQ7XG4gIHJlYWRvbmx5IEJVQkJMSU5HX1BIQVNFID0gQlVCQkxJTkdfUEhBU0U7XG4gIHN0YXRpYyByZWFkb25seSBOT05FID0gTk9ORTtcbiAgc3RhdGljIHJlYWRvbmx5IENBUFRVUklOR19QSEFTRSA9IENBUFRVUklOR19QSEFTRTtcbiAgc3RhdGljIHJlYWRvbmx5IEFUX1RBUkdFVCA9IEFUX1RBUkdFVDtcbiAgc3RhdGljIHJlYWRvbmx5IEJVQkJMSU5HX1BIQVNFID0gQlVCQkxJTkdfUEhBU0U7XG5cbiAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBvcHRpb25zOiBFdmVudEluaXQgPSB7fSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdHlwZSBhcmd1bWVudCBtdXN0IGJlIHNwZWNpZmllZGApO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcgfHwgIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFwib3B0aW9uc1wiIGFyZ3VtZW50IG11c3QgYmUgYW4gb2JqZWN0YCk7XG4gICAgfVxuICAgIGNvbnN0IHtidWJibGVzLCBjYW5jZWxhYmxlLCBjb21wb3NlZH0gPSBvcHRpb25zO1xuICAgIHRoaXMuI2NhbmNlbGFibGUgPSAhIWNhbmNlbGFibGU7XG4gICAgdGhpcy4jYnViYmxlcyA9ICEhYnViYmxlcztcbiAgICB0aGlzLiNjb21wb3NlZCA9ICEhY29tcG9zZWQ7XG5cbiAgICB0aGlzLiN0eXBlID0gYCR7dHlwZX1gO1xuICAgIHRoaXMuI3RhcmdldCA9IG51bGw7XG4gICAgdGhpcy4jaXNCZWluZ0Rpc3BhdGNoZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGluaXRFdmVudChfdHlwZTogc3RyaW5nLCBfYnViYmxlcz86IGJvb2xlYW4sIF9jYW5jZWxhYmxlPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIHtcbiAgICB0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHJldmVudERlZmF1bHQoKSB7XG4gICAgdGhpcy4jZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gIH1cblxuICBnZXQgdGFyZ2V0KCk6IEV2ZW50VGFyZ2V0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuI3RhcmdldDtcbiAgfVxuXG4gIGdldCBjdXJyZW50VGFyZ2V0KCk6IEV2ZW50VGFyZ2V0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuI3RhcmdldDtcbiAgfVxuXG4gIGdldCBzcmNFbGVtZW50KCk6IEV2ZW50VGFyZ2V0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuI3RhcmdldDtcbiAgfVxuXG4gIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuI3R5cGU7XG4gIH1cblxuICBnZXQgY2FuY2VsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY2FuY2VsYWJsZTtcbiAgfVxuXG4gIGdldCBkZWZhdWx0UHJldmVudGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNjYW5jZWxhYmxlICYmIHRoaXMuI2RlZmF1bHRQcmV2ZW50ZWQ7XG4gIH1cblxuICBnZXQgdGltZVN0YW1wKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuI3RpbWVzdGFtcDtcbiAgfVxuXG4gIGNvbXBvc2VkUGF0aCgpOiBFdmVudFRhcmdldFtdIHtcbiAgICByZXR1cm4gdGhpcy4jaXNCZWluZ0Rpc3BhdGNoZWQgPyBbdGhpcy4jdGFyZ2V0IV0gOiBbXTtcbiAgfVxuXG4gIGdldCByZXR1cm5WYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuI2NhbmNlbGFibGUgfHwgIXRoaXMuI2RlZmF1bHRQcmV2ZW50ZWQ7XG4gIH1cblxuICBnZXQgYnViYmxlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jYnViYmxlcztcbiAgfVxuXG4gIGdldCBjb21wb3NlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY29tcG9zZWQ7XG4gIH1cblxuICBnZXQgZXZlbnRQaGFzZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLiNpc0JlaW5nRGlzcGF0Y2hlZCA/IEV2ZW50LkFUX1RBUkdFVCA6IEV2ZW50Lk5PTkU7XG4gIH1cblxuICBnZXQgY2FuY2VsQnViYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNwcm9wYWdhdGlvblN0b3BwZWQ7XG4gIH1cblxuICBzZXQgY2FuY2VsQnViYmxlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLiNwcm9wYWdhdGlvblN0b3BwZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHN0b3BQcm9wYWdhdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLiNwcm9wYWdhdGlvblN0b3BwZWQgPSB0cnVlO1xuICB9XG5cbiAgZ2V0IGlzVHJ1c3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEV2ZW50U2hpbS5wcm90b3R5cGUsIHtcbiAgaW5pdEV2ZW50OiBlbnVtZXJhYmxlUHJvcGVydHksXG4gIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZW51bWVyYWJsZVByb3BlcnR5LFxuICBwcmV2ZW50RGVmYXVsdDogZW51bWVyYWJsZVByb3BlcnR5LFxuICB0YXJnZXQ6IGVudW1lcmFibGVQcm9wZXJ0eSxcbiAgY3VycmVudFRhcmdldDogZW51bWVyYWJsZVByb3BlcnR5LFxuICBzcmNFbGVtZW50OiBlbnVtZXJhYmxlUHJvcGVydHksXG4gIHR5cGU6IGVudW1lcmFibGVQcm9wZXJ0eSxcbiAgY2FuY2VsYWJsZTogZW51bWVyYWJsZVByb3BlcnR5LFxuICBkZWZhdWx0UHJldmVudGVkOiBlbnVtZXJhYmxlUHJvcGVydHksXG4gIHRpbWVTdGFtcDogZW51bWVyYWJsZVByb3BlcnR5LFxuICBjb21wb3NlZFBhdGg6IGVudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmV0dXJuVmFsdWU6IGVudW1lcmFibGVQcm9wZXJ0eSxcbiAgYnViYmxlczogZW51bWVyYWJsZVByb3BlcnR5LFxuICBjb21wb3NlZDogZW51bWVyYWJsZVByb3BlcnR5LFxuICBldmVudFBoYXNlOiBlbnVtZXJhYmxlUHJvcGVydHksXG4gIGNhbmNlbEJ1YmJsZTogZW51bWVyYWJsZVByb3BlcnR5LFxuICBzdG9wUHJvcGFnYXRpb246IGVudW1lcmFibGVQcm9wZXJ0eSxcbiAgaXNUcnVzdGVkOiBlbnVtZXJhYmxlUHJvcGVydHksXG59KTtcblxudHlwZSBDdXN0b21FdmVudEludGVyZmFjZSA9IEN1c3RvbUV2ZW50O1xuXG4vLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIHdlIHJlbW92ZSBzdXBwb3J0IGZvciB2bSBtb2R1bGVzICgtLWV4cGVyaW1lbnRhbC12bS1tb2R1bGVzKS5cbmNvbnN0IEN1c3RvbUV2ZW50U2hpbSA9IGNsYXNzIEN1c3RvbUV2ZW50PFQ+XG4gIGV4dGVuZHMgRXZlbnRTaGltXG4gIGltcGxlbWVudHMgQ3VzdG9tRXZlbnRJbnRlcmZhY2VcbntcbiAgI2RldGFpbDogVCB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBvcHRpb25zOiBDdXN0b21FdmVudEluaXQ8VD4gPSB7fSkge1xuICAgIHN1cGVyKHR5cGUsIG9wdGlvbnMpO1xuICAgIHRoaXMuI2RldGFpbCA9IG9wdGlvbnM/LmRldGFpbCA/PyBudWxsO1xuICB9XG5cbiAgaW5pdEN1c3RvbUV2ZW50KFxuICAgIF90eXBlOiBzdHJpbmcsXG4gICAgX2J1YmJsZXM/OiBib29sZWFuLFxuICAgIF9jYW5jZWxhYmxlPzogYm9vbGVhbixcbiAgICBfZGV0YWlsPzogVFxuICApOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBnZXQgZGV0YWlsKCk6IFQge1xuICAgIHJldHVybiB0aGlzLiNkZXRhaWwhO1xuICB9XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhDdXN0b21FdmVudFNoaW0ucHJvdG90eXBlLCB7XG4gIGRldGFpbDogZW51bWVyYWJsZVByb3BlcnR5LFxufSk7XG5cbmNvbnN0IEV2ZW50U2hpbVdpdGhSZWFsVHlwZSA9IEV2ZW50U2hpbSBhcyBvYmplY3QgYXMgdHlwZW9mIEV2ZW50O1xuY29uc3QgQ3VzdG9tRXZlbnRTaGltV2l0aFJlYWxUeXBlID1cbiAgQ3VzdG9tRXZlbnRTaGltIGFzIG9iamVjdCBhcyB0eXBlb2YgQ3VzdG9tRXZlbnQ7XG5leHBvcnQge1xuICBFdmVudFNoaW1XaXRoUmVhbFR5cGUgYXMgRXZlbnQsXG4gIEV2ZW50U2hpbVdpdGhSZWFsVHlwZSBhcyBFdmVudFNoaW0sXG4gIEN1c3RvbUV2ZW50U2hpbVdpdGhSZWFsVHlwZSBhcyBDdXN0b21FdmVudCxcbiAgQ3VzdG9tRXZlbnRTaGltV2l0aFJlYWxUeXBlIGFzIEN1c3RvbUV2ZW50U2hpbSxcbn07XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5pbXBvcnQge0VsZW1lbnRJbnRlcm5hbHNTaGltfSBmcm9tICcuL2xpYi9lbGVtZW50LWludGVybmFscy5qcyc7XG5pbXBvcnQge1xuICBFdmVudFRhcmdldFNoaW0sXG4gIEV2ZW50U2hpbSxcbiAgQ3VzdG9tRXZlbnRTaGltLFxuICBFdmVudFRhcmdldFNoaW1NZXRhLFxufSBmcm9tICcuL2xpYi9ldmVudHMuanMnO1xuXG5leHBvcnQge1xuICBhcmlhTWl4aW5BdHRyaWJ1dGVzLFxuICBFbGVtZW50SW50ZXJuYWxzLFxuICBIWURSQVRFX0lOVEVSTkFMU19BVFRSX1BSRUZJWCxcbn0gZnJvbSAnLi9saWIvZWxlbWVudC1pbnRlcm5hbHMuanMnO1xuZXhwb3J0IHtDdXN0b21FdmVudCwgRXZlbnQsIEV2ZW50VGFyZ2V0fSBmcm9tICcuL2xpYi9ldmVudHMuanMnO1xuXG4vLyBJbiBhbiBlbXB0eSBOb2RlLmpzIHZtLCB3ZSBuZWVkIHRvIHBhdGNoIHRoZSBnbG9iYWwgY29udGV4dC5cbi8vIFRPRE86IFJlbW92ZSB0aGVzZSBnbG9iYWxUaGlzIGFzc2lnbm1lbnRzIHdoZW4gd2UgcmVtb3ZlIHN1cHBvcnRcbi8vIGZvciB2bSBtb2R1bGVzICgtLWV4cGVyaW1lbnRhbC12bS1tb2R1bGVzKS5cbmdsb2JhbFRoaXMuRXZlbnQgPz89IEV2ZW50U2hpbTtcbmdsb2JhbFRoaXMuQ3VzdG9tRXZlbnQgPz89IEN1c3RvbUV2ZW50U2hpbTtcblxuLy8gSW50ZXJuYWwgdHlwZSB0byBiZSB1c2VkIGZvciB0aGUgZXZlbnQgcG9seWZpbGwgZnVuY3Rpb25hbGl0eS5cbmV4cG9ydCB0eXBlIEhUTUxFbGVtZW50V2l0aEV2ZW50TWV0YSA9IEhUTUxFbGVtZW50ICYgRXZlbnRUYXJnZXRTaGltTWV0YTtcblxuY29uc3QgYXR0cmlidXRlcyA9IG5ldyBXZWFrTWFwPFxuICBJbnN0YW5jZVR5cGU8dHlwZW9mIEhUTUxFbGVtZW50U2hpbT4sXG4gIE1hcDxzdHJpbmcsIHN0cmluZz5cbj4oKTtcbmNvbnN0IGF0dHJpYnV0ZXNGb3JFbGVtZW50ID0gKFxuICBlbGVtZW50OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEhUTUxFbGVtZW50U2hpbT5cbikgPT4ge1xuICBsZXQgYXR0cnMgPSBhdHRyaWJ1dGVzLmdldChlbGVtZW50KTtcbiAgaWYgKGF0dHJzID09PSB1bmRlZmluZWQpIHtcbiAgICBhdHRyaWJ1dGVzLnNldChlbGVtZW50LCAoYXR0cnMgPSBuZXcgTWFwKCkpKTtcbiAgfVxuICByZXR1cm4gYXR0cnM7XG59O1xuXG4vLyBUaGUgdHlwaW5ncyBhcm91bmQgdGhlIGV4cG9ydHMgYmVsb3cgYXJlIGEgbGl0dGxlIGZ1bmt5OlxuLy9cbi8vIDEuIFdlIHdhbnQgdGhlIGBuYW1lYCBvZiB0aGUgc2hpbSBjbGFzc2VzIHRvIG1hdGNoIHRoZSByZWFsIG9uZXMgYXQgcnVudGltZSxcbi8vICAgIGhlbmNlIGUuZy4gYGNsYXNzIEVsZW1lbnRgLlxuLy8gMi4gV2UgY2FuJ3Qgc2hhZG93IHRoZSBnbG9iYWwgdHlwZXMgd2l0aCBhIHNpbXBsZSBjbGFzcyBkZWNsYXJhdGlvbiwgYmVjYXVzZVxuLy8gICAgdGhlbiB3ZSBjYW4ndCByZWZlcmVuY2UgdGhlIGdsb2JhbCB0eXBlcyBmb3IgY2FzdGluZywgaGVuY2UgZS5nLlxuLy8gICAgYGNvbnN0IEVsZW1lbnRTaGltID0gY2xhc3MgRWxlbWVudGAuXG4vLyAzLiBXZSB3YW50IHRvIGV4cG9ydCB0aGUgY2xhc3NlcyB0eXBlZCBhcyB0aGUgcmVhbCBvbmVzLCBoZW5jZSBlLmcuXG4vLyAgICBgY29uc3QgRWxlbWVudFNoaW1XaXRoUmVhbFR5cGUgPSBFbGVtZW50U2hpbSBhcyBvYmplY3QgYXMgdHlwZW9mIEVsZW1lbnQ7YC5cbi8vIDQuIFdlIHdhbnQgdGhlIGV4cG9ydGVkIG5hbWVzIHRvIG1hdGNoIHRoZSByZWFsIG9uZXMsIGhlbmNlIGUuZy5cbi8vICAgIGBleHBvcnQge0VsZW1lbnRTaGltV2l0aFJlYWxUeXBlIGFzIEVsZW1lbnR9YC5cbmNvbnN0IEVsZW1lbnRTaGltID0gY2xhc3MgRWxlbWVudCBleHRlbmRzIEV2ZW50VGFyZ2V0U2hpbSB7XG4gIGdldCBhdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGF0dHJpYnV0ZXNGb3JFbGVtZW50KHRoaXMpKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgdmFsdWUsXG4gICAgfSkpO1xuICB9XG4gIHByaXZhdGUgX19zaGFkb3dSb290TW9kZTogbnVsbCB8IFNoYWRvd1Jvb3RNb2RlID0gbnVsbDtcbiAgcHJvdGVjdGVkIF9fc2hhZG93Um9vdDogbnVsbCB8IFNoYWRvd1Jvb3QgPSBudWxsO1xuICBwcm90ZWN0ZWQgX19pbnRlcm5hbHM6IG51bGwgfCBFbGVtZW50SW50ZXJuYWxzID0gbnVsbDtcblxuICBnZXQgc2hhZG93Um9vdCgpIHtcbiAgICBpZiAodGhpcy5fX3NoYWRvd1Jvb3RNb2RlID09PSAnY2xvc2VkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9fc2hhZG93Um9vdDtcbiAgfVxuICBnZXQgbG9jYWxOYW1lKCkge1xuICAgIHJldHVybiAodGhpcy5jb25zdHJ1Y3RvciBhcyBOYW1lZEN1c3RvbUhUTUxFbGVtZW50Q29uc3RydWN0b3IpLl9fbG9jYWxOYW1lO1xuICB9XG4gIGdldCB0YWdOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmxvY2FsTmFtZT8udG9VcHBlckNhc2UoKTtcbiAgfVxuICBzZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIC8vIEVtdWxhdGUgYnJvd3NlciBiZWhhdmlvciB0aGF0IHNpbGVudGx5IGNhc3RzIGFsbCB2YWx1ZXMgdG8gc3RyaW5nLiBFLmcuXG4gICAgLy8gYDQyYCBiZWNvbWVzIGBcIjQyXCJgIGFuZCBge31gIGJlY29tZXMgYFwiW29iamVjdCBPYmplY3RdXCJcImAuXG4gICAgYXR0cmlidXRlc0ZvckVsZW1lbnQodGhpcykuc2V0KG5hbWUsIFN0cmluZyh2YWx1ZSkpO1xuICB9XG4gIHJlbW92ZUF0dHJpYnV0ZShuYW1lOiBzdHJpbmcpIHtcbiAgICBhdHRyaWJ1dGVzRm9yRWxlbWVudCh0aGlzKS5kZWxldGUobmFtZSk7XG4gIH1cbiAgdG9nZ2xlQXR0cmlidXRlKG5hbWU6IHN0cmluZywgZm9yY2U/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgLy8gU3RlcHMgcmVmZXJlbmNlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWVsZW1lbnQtdG9nZ2xlYXR0cmlidXRlXG4gICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICAvLyBTdGVwIDVcbiAgICAgIGlmIChmb3JjZSA9PT0gdW5kZWZpbmVkIHx8ICFmb3JjZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdGVwIDRcbiAgICAgIGlmIChmb3JjZSA9PT0gdW5kZWZpbmVkIHx8IGZvcmNlKSB7XG4gICAgICAgIC8vIFN0ZXAgNC4xXG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsICcnKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTdGVwIDQuMlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFN0ZXAgNlxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGhhc0F0dHJpYnV0ZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlc0ZvckVsZW1lbnQodGhpcykuaGFzKG5hbWUpO1xuICB9XG4gIGF0dGFjaFNoYWRvdyhpbml0OiBTaGFkb3dSb290SW5pdCk6IFNoYWRvd1Jvb3Qge1xuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSB7aG9zdDogdGhpc30gYXMgb2JqZWN0IGFzIFNoYWRvd1Jvb3Q7XG4gICAgdGhpcy5fX3NoYWRvd1Jvb3RNb2RlID0gaW5pdC5tb2RlO1xuICAgIGlmIChpbml0ICYmIGluaXQubW9kZSA9PT0gJ29wZW4nKSB7XG4gICAgICB0aGlzLl9fc2hhZG93Um9vdCA9IHNoYWRvd1Jvb3Q7XG4gICAgfVxuICAgIHJldHVybiBzaGFkb3dSb290O1xuICB9XG4gIGF0dGFjaEludGVybmFscygpOiBFbGVtZW50SW50ZXJuYWxzIHtcbiAgICBpZiAodGhpcy5fX2ludGVybmFscyAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGV4ZWN1dGUgJ2F0dGFjaEludGVybmFscycgb24gJ0hUTUxFbGVtZW50JzogYCArXG4gICAgICAgICAgYEVsZW1lbnRJbnRlcm5hbHMgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB3YXMgYWxyZWFkeSBhdHRhY2hlZC5gXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBpbnRlcm5hbHMgPSBuZXcgRWxlbWVudEludGVybmFsc1NoaW0odGhpcyBhcyB1bmtub3duIGFzIEhUTUxFbGVtZW50KTtcbiAgICB0aGlzLl9faW50ZXJuYWxzID0gaW50ZXJuYWxzO1xuICAgIHJldHVybiBpbnRlcm5hbHMgYXMgRWxlbWVudEludGVybmFscztcbiAgfVxuICBnZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdmFsdWUgPSBhdHRyaWJ1dGVzRm9yRWxlbWVudCh0aGlzKS5nZXQobmFtZSk7XG4gICAgcmV0dXJuIHZhbHVlID8/IG51bGw7XG4gIH1cbn07XG5jb25zdCBFbGVtZW50U2hpbVdpdGhSZWFsVHlwZSA9IEVsZW1lbnRTaGltIGFzIG9iamVjdCBhcyB0eXBlb2YgRWxlbWVudDtcbmV4cG9ydCB7RWxlbWVudFNoaW1XaXRoUmVhbFR5cGUgYXMgRWxlbWVudH07XG5cbmNvbnN0IEhUTUxFbGVtZW50U2hpbSA9IGNsYXNzIEhUTUxFbGVtZW50IGV4dGVuZHMgRWxlbWVudFNoaW0ge307XG5jb25zdCBIVE1MRWxlbWVudFNoaW1XaXRoUmVhbFR5cGUgPVxuICBIVE1MRWxlbWVudFNoaW0gYXMgb2JqZWN0IGFzIHR5cGVvZiBIVE1MRWxlbWVudDtcbmV4cG9ydCB7SFRNTEVsZW1lbnRTaGltV2l0aFJlYWxUeXBlIGFzIEhUTUxFbGVtZW50fTtcblxuLy8gRm9yIGNvbnZlbmllbmNlLCB3ZSBwcm92aWRlIGEgZ2xvYmFsIGluc3RhbmNlIG9mIGEgSFRNTEVsZW1lbnQgYXMgYW4gZXZlbnRcbi8vIHRhcmdldC4gVGhpcyBmYWNpbGl0YXRlcyByZWdpc3RlcmluZyBnbG9iYWwgZXZlbnQgaGFuZGxlcnNcbi8vIChlLmcuIGZvciBAbGl0L2NvbnRleHQgQ29udGV4dFByb3ZpZGVyKS5cbi8vIFdlIHVzZSB0aGlzIGluIGluIHRoZSBTU1IgcmVuZGVyIGZ1bmN0aW9uLlxuLy8gTm90ZSwgdGhpcyBpcyBhIGJlc3Bva2UgZWxlbWVudCBhbmQgbm90IHNpbXBseSBgZG9jdW1lbnRgIG9yIGB3aW5kb3dgIHNpbmNlXG4vLyB1c2VyIGNvZGUgcmVsaWVzIG9uIHRoZXNlIGJlaW5nIHVuZGVmaW5lZCBpbiB0aGUgc2VydmVyIGVudmlyb25tZW50LlxuZ2xvYmFsVGhpcy5saXRTZXJ2ZXJSb290ID8/PSBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gIG5ldyBIVE1MRWxlbWVudFNoaW1XaXRoUmVhbFR5cGUoKSxcbiAgJ2xvY2FsTmFtZScsXG4gIHtcbiAgICAvLyBQYXRjaCBsb2NhbE5hbWUgKGFuZCB0YWdOYW1lKSB0byByZXR1cm4gYSB1bmlxdWUgbmFtZS5cbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gJ2xpdC1zZXJ2ZXItcm9vdCc7XG4gICAgfSxcbiAgfVxuKTtcblxuaW50ZXJmYWNlIEN1c3RvbUhUTUxFbGVtZW50Q29uc3RydWN0b3Ige1xuICBuZXcgKCk6IEhUTUxFbGVtZW50O1xuICBvYnNlcnZlZEF0dHJpYnV0ZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIE5hbWVkQ3VzdG9tSFRNTEVsZW1lbnRDb25zdHJ1Y3RvclxuICBleHRlbmRzIEN1c3RvbUhUTUxFbGVtZW50Q29uc3RydWN0b3Ige1xuICBfX2xvY2FsTmFtZTogc3RyaW5nO1xufVxuXG50eXBlIEN1c3RvbUVsZW1lbnRSZWdpc3RyYXRpb24gPSB7XG4gIGN0b3I6IHtuZXcgKCk6IEhUTUxFbGVtZW50fTtcbiAgb2JzZXJ2ZWRBdHRyaWJ1dGVzOiBzdHJpbmdbXTtcbn07XG5cbmNvbnN0IEN1c3RvbUVsZW1lbnRSZWdpc3RyeVNoaW0gPSBjbGFzcyBDdXN0b21FbGVtZW50UmVnaXN0cnkge1xuICBwcml2YXRlIF9fZGVmaW5pdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgQ3VzdG9tRWxlbWVudFJlZ2lzdHJhdGlvbj4oKTtcblxuICBkZWZpbmUobmFtZTogc3RyaW5nLCBjdG9yOiBDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yKSB7XG4gICAgaWYgKHRoaXMuX19kZWZpbml0aW9ucy5oYXMobmFtZSkpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYCdDdXN0b21FbGVtZW50UmVnaXN0cnknIGFscmVhZHkgaGFzIFwiJHtuYW1lfVwiIGRlZmluZWQuIGAgK1xuICAgICAgICAgICAgYFRoaXMgbWF5IGhhdmUgYmVlbiBjYXVzZWQgYnkgbGl2ZSByZWxvYWQgb3IgaG90IG1vZHVsZSBgICtcbiAgICAgICAgICAgIGByZXBsYWNlbWVudCBpbiB3aGljaCBjYXNlIGl0IGNhbiBiZSBzYWZlbHkgaWdub3JlZC5cXG5gICtcbiAgICAgICAgICAgIGBNYWtlIHN1cmUgdG8gdGVzdCB5b3VyIGFwcGxpY2F0aW9uIHdpdGggYSBwcm9kdWN0aW9uIGJ1aWxkIGFzIGAgK1xuICAgICAgICAgICAgYHJlcGVhdCByZWdpc3RyYXRpb25zIHdpbGwgdGhyb3cgaW4gcHJvZHVjdGlvbi5gXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlICdkZWZpbmUnIG9uICdDdXN0b21FbGVtZW50UmVnaXN0cnknOiBgICtcbiAgICAgICAgICAgIGB0aGUgbmFtZSBcIiR7bmFtZX1cIiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgd2l0aCB0aGlzIHJlZ2lzdHJ5YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBQcm92aWRlIHRhZ05hbWUgYW5kIGxvY2FsTmFtZSBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICAoY3RvciBhcyBOYW1lZEN1c3RvbUhUTUxFbGVtZW50Q29uc3RydWN0b3IpLl9fbG9jYWxOYW1lID0gbmFtZTtcbiAgICB0aGlzLl9fZGVmaW5pdGlvbnMuc2V0KG5hbWUsIHtcbiAgICAgIGN0b3IsXG4gICAgICAvLyBOb3RlIGl0J3MgaW1wb3J0YW50IHdlIHJlYWQgYG9ic2VydmVkQXR0cmlidXRlc2AgaW4gY2FzZSBpdCBpcyBhIGdldHRlclxuICAgICAgLy8gd2l0aCBzaWRlLWVmZmVjdHMsIGFzIGlzIHRoZSBjYXNlIGluIExpdCwgd2hlcmUgaXQgdHJpZ2dlcnMgY2xhc3NcbiAgICAgIC8vIGZpbmFsaXphdGlvbi5cbiAgICAgIC8vXG4gICAgICAvLyBUT0RPKGFvbWFya3MpIFRvIGJlIHNwZWMgY29tcGxpYW50LCB3ZSBzaG91bGQgYWxzbyBjYXB0dXJlIHRoZVxuICAgICAgLy8gcmVnaXN0cmF0aW9uLXRpbWUgbGlmZWN5Y2xlIG1ldGhvZHMgbGlrZSBgY29ubmVjdGVkQ2FsbGJhY2tgLiBGb3IgdGhlbVxuICAgICAgLy8gdG8gYmUgYWN0dWFsbHkgYWNjZXNzaWJsZSB0byBlLmcuIHRoZSBMaXQgU1NSIGVsZW1lbnQgcmVuZGVyZXIsIHRob3VnaCxcbiAgICAgIC8vIHdlJ2QgbmVlZCB0byBpbnRyb2R1Y2UgYSBuZXcgQVBJIGZvciBhY2Nlc3NpbmcgdGhlbSAoc2luY2UgYGdldGAgb25seVxuICAgICAgLy8gcmV0dXJucyB0aGUgY29uc3RydWN0b3IpLlxuICAgICAgb2JzZXJ2ZWRBdHRyaWJ1dGVzOiBjdG9yLm9ic2VydmVkQXR0cmlidXRlcyA/PyBbXSxcbiAgICB9KTtcbiAgfVxuXG4gIGdldChuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkZWZpbml0aW9uID0gdGhpcy5fX2RlZmluaXRpb25zLmdldChuYW1lKTtcbiAgICByZXR1cm4gZGVmaW5pdGlvbj8uY3RvcjtcbiAgfVxufTtcbmNvbnN0IEN1c3RvbUVsZW1lbnRSZWdpc3RyeVNoaW1XaXRoUmVhbFR5cGUgPVxuICBDdXN0b21FbGVtZW50UmVnaXN0cnlTaGltIGFzIG9iamVjdCBhcyB0eXBlb2YgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5O1xuZXhwb3J0IHtDdXN0b21FbGVtZW50UmVnaXN0cnlTaGltV2l0aFJlYWxUeXBlIGFzIEN1c3RvbUVsZW1lbnRSZWdpc3RyeX07XG5cbmV4cG9ydCBjb25zdCBjdXN0b21FbGVtZW50cyA9IG5ldyBDdXN0b21FbGVtZW50UmVnaXN0cnlTaGltV2l0aFJlYWxUeXBlKCk7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmNvbnN0IE5PREVfTU9ERSA9IGZhbHNlO1xuXG4vLyBBbGxvd3MgbWluaWZpZXJzIHRvIHJlbmFtZSByZWZlcmVuY2VzIHRvIGdsb2JhbFRoaXNcbmNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXM7XG5cbi8qKlxuICogV2hldGhlciB0aGUgY3VycmVudCBicm93c2VyIHN1cHBvcnRzIGBhZG9wdGVkU3R5bGVTaGVldHNgLlxuICovXG5leHBvcnQgY29uc3Qgc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzOiBib29sZWFuID1cbiAgZ2xvYmFsLlNoYWRvd1Jvb3QgJiZcbiAgKGdsb2JhbC5TaGFkeUNTUyA9PT0gdW5kZWZpbmVkIHx8IGdsb2JhbC5TaGFkeUNTUy5uYXRpdmVTaGFkb3cpICYmXG4gICdhZG9wdGVkU3R5bGVTaGVldHMnIGluIERvY3VtZW50LnByb3RvdHlwZSAmJlxuICAncmVwbGFjZScgaW4gQ1NTU3R5bGVTaGVldC5wcm90b3R5cGU7XG5cbi8qKlxuICogQSBDU1NSZXN1bHQgb3IgbmF0aXZlIENTU1N0eWxlU2hlZXQuXG4gKlxuICogSW4gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGNvbnN0cnVjdGlibGUgQ1NTIHN0eWxlIHNoZWV0cywgQ1NTU3R5bGVTaGVldFxuICogb2JqZWN0IGNhbiBiZSB1c2VkIGZvciBzdHlsaW5nIGFsb25nIHNpZGUgQ1NTUmVzdWx0IGZyb20gdGhlIGBjc3NgXG4gKiB0ZW1wbGF0ZSB0YWcuXG4gKi9cbmV4cG9ydCB0eXBlIENTU1Jlc3VsdE9yTmF0aXZlID0gQ1NTUmVzdWx0IHwgQ1NTU3R5bGVTaGVldDtcblxuZXhwb3J0IHR5cGUgQ1NTUmVzdWx0QXJyYXkgPSBBcnJheTxDU1NSZXN1bHRPck5hdGl2ZSB8IENTU1Jlc3VsdEFycmF5PjtcblxuLyoqXG4gKiBBIHNpbmdsZSBDU1NSZXN1bHQsIENTU1N0eWxlU2hlZXQsIG9yIGFuIGFycmF5IG9yIG5lc3RlZCBhcnJheXMgb2YgdGhvc2UuXG4gKi9cbmV4cG9ydCB0eXBlIENTU1Jlc3VsdEdyb3VwID0gQ1NTUmVzdWx0T3JOYXRpdmUgfCBDU1NSZXN1bHRBcnJheTtcblxuY29uc3QgY29uc3RydWN0aW9uVG9rZW4gPSBTeW1ib2woKTtcblxuY29uc3QgY3NzVGFnQ2FjaGUgPSBuZXcgV2Vha01hcDxUZW1wbGF0ZVN0cmluZ3NBcnJheSwgQ1NTU3R5bGVTaGVldD4oKTtcblxuLyoqXG4gKiBBIGNvbnRhaW5lciBmb3IgYSBzdHJpbmcgb2YgQ1NTIHRleHQsIHRoYXQgbWF5IGJlIHVzZWQgdG8gY3JlYXRlIGEgQ1NTU3R5bGVTaGVldC5cbiAqXG4gKiBDU1NSZXN1bHQgaXMgdGhlIHJldHVybiB2YWx1ZSBvZiBgY3NzYC10YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbHMgYW5kXG4gKiBgdW5zYWZlQ1NTKClgLiBJbiBvcmRlciB0byBlbnN1cmUgdGhhdCBDU1NSZXN1bHRzIGFyZSBvbmx5IGNyZWF0ZWQgdmlhIHRoZVxuICogYGNzc2AgdGFnIGFuZCBgdW5zYWZlQ1NTKClgLCBDU1NSZXN1bHQgY2Fubm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5LlxuICovXG5leHBvcnQgY2xhc3MgQ1NTUmVzdWx0IHtcbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgWydfJGNzc1Jlc3VsdCQnXSA9IHRydWU7XG4gIHJlYWRvbmx5IGNzc1RleHQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfc3R5bGVTaGVldD86IENTU1N0eWxlU2hlZXQ7XG4gIHByaXZhdGUgX3N0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgY3NzVGV4dDogc3RyaW5nLFxuICAgIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5IHwgdW5kZWZpbmVkLFxuICAgIHNhZmVUb2tlbjogc3ltYm9sXG4gICkge1xuICAgIGlmIChzYWZlVG9rZW4gIT09IGNvbnN0cnVjdGlvblRva2VuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDU1NSZXN1bHQgaXMgbm90IGNvbnN0cnVjdGFibGUuIFVzZSBgdW5zYWZlQ1NTYCBvciBgY3NzYCBpbnN0ZWFkLidcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuY3NzVGV4dCA9IGNzc1RleHQ7XG4gICAgdGhpcy5fc3RyaW5ncyA9IHN0cmluZ3M7XG4gIH1cblxuICAvLyBUaGlzIGlzIGEgZ2V0dGVyIHNvIHRoYXQgaXQncyBsYXp5LiBJbiBwcmFjdGljZSwgdGhpcyBtZWFucyBzdHlsZXNoZWV0c1xuICAvLyBhcmUgbm90IGNyZWF0ZWQgdW50aWwgdGhlIGZpcnN0IGVsZW1lbnQgaW5zdGFuY2UgaXMgbWFkZS5cbiAgZ2V0IHN0eWxlU2hlZXQoKTogQ1NTU3R5bGVTaGVldCB8IHVuZGVmaW5lZCB7XG4gICAgLy8gSWYgYHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0c2AgaXMgdHJ1ZSB0aGVuIHdlIGFzc3VtZSBDU1NTdHlsZVNoZWV0IGlzXG4gICAgLy8gY29uc3RydWN0YWJsZS5cbiAgICBsZXQgc3R5bGVTaGVldCA9IHRoaXMuX3N0eWxlU2hlZXQ7XG4gICAgY29uc3Qgc3RyaW5ncyA9IHRoaXMuX3N0cmluZ3M7XG4gICAgaWYgKHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0cyAmJiBzdHlsZVNoZWV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNhY2hlYWJsZSA9IHN0cmluZ3MgIT09IHVuZGVmaW5lZCAmJiBzdHJpbmdzLmxlbmd0aCA9PT0gMTtcbiAgICAgIGlmIChjYWNoZWFibGUpIHtcbiAgICAgICAgc3R5bGVTaGVldCA9IGNzc1RhZ0NhY2hlLmdldChzdHJpbmdzKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHlsZVNoZWV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgKHRoaXMuX3N0eWxlU2hlZXQgPSBzdHlsZVNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKSkucmVwbGFjZVN5bmMoXG4gICAgICAgICAgdGhpcy5jc3NUZXh0XG4gICAgICAgICk7XG4gICAgICAgIGlmIChjYWNoZWFibGUpIHtcbiAgICAgICAgICBjc3NUYWdDYWNoZS5zZXQoc3RyaW5ncywgc3R5bGVTaGVldCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0eWxlU2hlZXQ7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNzc1RleHQ7XG4gIH1cbn1cblxudHlwZSBDb25zdHJ1Y3RhYmxlQ1NTUmVzdWx0ID0gQ1NTUmVzdWx0ICYge1xuICBuZXcgKFxuICAgIGNzc1RleHQ6IHN0cmluZyxcbiAgICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHVuZGVmaW5lZCxcbiAgICBzYWZlVG9rZW46IHN5bWJvbFxuICApOiBDU1NSZXN1bHQ7XG59O1xuXG5jb25zdCB0ZXh0RnJvbUNTU1Jlc3VsdCA9ICh2YWx1ZTogQ1NTUmVzdWx0R3JvdXAgfCBudW1iZXIpID0+IHtcbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgaWYgKCh2YWx1ZSBhcyBDU1NSZXN1bHQpWydfJGNzc1Jlc3VsdCQnXSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiAodmFsdWUgYXMgQ1NTUmVzdWx0KS5jc3NUZXh0O1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFZhbHVlIHBhc3NlZCB0byAnY3NzJyBmdW5jdGlvbiBtdXN0IGJlIGEgJ2NzcycgZnVuY3Rpb24gcmVzdWx0OiBgICtcbiAgICAgICAgYCR7dmFsdWV9LiBVc2UgJ3Vuc2FmZUNTUycgdG8gcGFzcyBub24tbGl0ZXJhbCB2YWx1ZXMsIGJ1dCB0YWtlIGNhcmUgYCArXG4gICAgICAgIGB0byBlbnN1cmUgcGFnZSBzZWN1cml0eS5gXG4gICAgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBXcmFwIGEgdmFsdWUgZm9yIGludGVycG9sYXRpb24gaW4gYSB7QGxpbmtjb2RlIGNzc30gdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwuXG4gKlxuICogVGhpcyBpcyB1bnNhZmUgYmVjYXVzZSB1bnRydXN0ZWQgQ1NTIHRleHQgY2FuIGJlIHVzZWQgdG8gcGhvbmUgaG9tZVxuICogb3IgZXhmaWx0cmF0ZSBkYXRhIHRvIGFuIGF0dGFja2VyIGNvbnRyb2xsZWQgc2l0ZS4gVGFrZSBjYXJlIHRvIG9ubHkgdXNlXG4gKiB0aGlzIHdpdGggdHJ1c3RlZCBpbnB1dC5cbiAqL1xuZXhwb3J0IGNvbnN0IHVuc2FmZUNTUyA9ICh2YWx1ZTogdW5rbm93bikgPT5cbiAgbmV3IChDU1NSZXN1bHQgYXMgQ29uc3RydWN0YWJsZUNTU1Jlc3VsdCkoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogU3RyaW5nKHZhbHVlKSxcbiAgICB1bmRlZmluZWQsXG4gICAgY29uc3RydWN0aW9uVG9rZW5cbiAgKTtcblxuLyoqXG4gKiBBIHRlbXBsYXRlIGxpdGVyYWwgdGFnIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTGl0RWxlbWVudCdzXG4gKiB7QGxpbmtjb2RlIExpdEVsZW1lbnQuc3R5bGVzfSBwcm9wZXJ0eSB0byBzZXQgZWxlbWVudCBzdHlsZXMuXG4gKlxuICogRm9yIHNlY3VyaXR5IHJlYXNvbnMsIG9ubHkgbGl0ZXJhbCBzdHJpbmcgdmFsdWVzIGFuZCBudW1iZXIgbWF5IGJlIHVzZWQgaW5cbiAqIGVtYmVkZGVkIGV4cHJlc3Npb25zLiBUbyBpbmNvcnBvcmF0ZSBub24tbGl0ZXJhbCB2YWx1ZXMge0BsaW5rY29kZSB1bnNhZmVDU1N9XG4gKiBtYXkgYmUgdXNlZCBpbnNpZGUgYW4gZXhwcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGNzcyA9IChcbiAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksXG4gIC4uLnZhbHVlczogKENTU1Jlc3VsdEdyb3VwIHwgbnVtYmVyKVtdXG4pOiBDU1NSZXN1bHQgPT4ge1xuICBjb25zdCBjc3NUZXh0ID1cbiAgICBzdHJpbmdzLmxlbmd0aCA9PT0gMVxuICAgICAgPyBzdHJpbmdzWzBdXG4gICAgICA6IHZhbHVlcy5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgdiwgaWR4KSA9PiBhY2MgKyB0ZXh0RnJvbUNTU1Jlc3VsdCh2KSArIHN0cmluZ3NbaWR4ICsgMV0sXG4gICAgICAgICAgc3RyaW5nc1swXVxuICAgICAgICApO1xuICByZXR1cm4gbmV3IChDU1NSZXN1bHQgYXMgQ29uc3RydWN0YWJsZUNTU1Jlc3VsdCkoXG4gICAgY3NzVGV4dCxcbiAgICBzdHJpbmdzLFxuICAgIGNvbnN0cnVjdGlvblRva2VuXG4gICk7XG59O1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIGdpdmVuIHN0eWxlcyB0byBhIGBzaGFkb3dSb290YC4gV2hlbiBTaGFkb3cgRE9NIGlzXG4gKiBhdmFpbGFibGUgYnV0IGBhZG9wdGVkU3R5bGVTaGVldHNgIGlzIG5vdCwgc3R5bGVzIGFyZSBhcHBlbmRlZCB0byB0aGVcbiAqIGBzaGFkb3dSb290YCB0byBbbWltaWMgdGhlIG5hdGl2ZSBmZWF0dXJlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2hhZG93Um9vdC9hZG9wdGVkU3R5bGVTaGVldHMpLlxuICogTm90ZSwgd2hlbiBzaGltbWluZyBpcyB1c2VkLCBhbnkgc3R5bGVzIHRoYXQgYXJlIHN1YnNlcXVlbnRseSBwbGFjZWQgaW50b1xuICogdGhlIHNoYWRvd1Jvb3Qgc2hvdWxkIGJlIHBsYWNlZCAqYmVmb3JlKiBhbnkgc2hpbW1lZCBhZG9wdGVkIHN0eWxlcy4gVGhpc1xuICogd2lsbCBtYXRjaCBzcGVjIGJlaGF2aW9yIHRoYXQgZ2l2ZXMgYWRvcHRlZCBzaGVldHMgcHJlY2VkZW5jZSBvdmVyIHN0eWxlcyBpblxuICogc2hhZG93Um9vdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFkb3B0U3R5bGVzID0gKFxuICByZW5kZXJSb290OiBTaGFkb3dSb290LFxuICBzdHlsZXM6IEFycmF5PENTU1Jlc3VsdE9yTmF0aXZlPlxuKSA9PiB7XG4gIGlmIChzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMpIHtcbiAgICAocmVuZGVyUm9vdCBhcyBTaGFkb3dSb290KS5hZG9wdGVkU3R5bGVTaGVldHMgPSBzdHlsZXMubWFwKChzKSA9PlxuICAgICAgcyBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXQgPyBzIDogcy5zdHlsZVNoZWV0IVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBzIG9mIHN0eWxlcykge1xuICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IG5vbmNlID0gKGdsb2JhbCBhcyBhbnkpWydsaXROb25jZSddO1xuICAgICAgaWYgKG5vbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKTtcbiAgICAgIH1cbiAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gKHMgYXMgQ1NTUmVzdWx0KS5jc3NUZXh0O1xuICAgICAgcmVuZGVyUm9vdC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBjc3NSZXN1bHRGcm9tU3R5bGVTaGVldCA9IChzaGVldDogQ1NTU3R5bGVTaGVldCkgPT4ge1xuICBsZXQgY3NzVGV4dCA9ICcnO1xuICBmb3IgKGNvbnN0IHJ1bGUgb2Ygc2hlZXQuY3NzUnVsZXMpIHtcbiAgICBjc3NUZXh0ICs9IHJ1bGUuY3NzVGV4dDtcbiAgfVxuICByZXR1cm4gdW5zYWZlQ1NTKGNzc1RleHQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbXBhdGlibGVTdHlsZSA9XG4gIHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0cyB8fFxuICAoTk9ERV9NT0RFICYmIGdsb2JhbC5DU1NTdHlsZVNoZWV0ID09PSB1bmRlZmluZWQpXG4gICAgPyAoczogQ1NTUmVzdWx0T3JOYXRpdmUpID0+IHNcbiAgICA6IChzOiBDU1NSZXN1bHRPck5hdGl2ZSkgPT5cbiAgICAgICAgcyBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXQgPyBjc3NSZXN1bHRGcm9tU3R5bGVTaGVldChzKSA6IHM7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogVXNlIHRoaXMgbW9kdWxlIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSB5b3VyIG93biBiYXNlIGNsYXNzIGV4dGVuZGluZ1xuICoge0BsaW5rIFJlYWN0aXZlRWxlbWVudH0uXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuXG5pbXBvcnQge1xuICBnZXRDb21wYXRpYmxlU3R5bGUsXG4gIGFkb3B0U3R5bGVzLFxuICBDU1NSZXN1bHRHcm91cCxcbiAgQ1NTUmVzdWx0T3JOYXRpdmUsXG59IGZyb20gJy4vY3NzLXRhZy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJlYWN0aXZlQ29udHJvbGxlcixcbiAgUmVhY3RpdmVDb250cm9sbGVySG9zdCxcbn0gZnJvbSAnLi9yZWFjdGl2ZS1jb250cm9sbGVyLmpzJztcblxuLy8gSW4gdGhlIE5vZGUgYnVpbGQsIHRoaXMgaW1wb3J0IHdpbGwgYmUgaW5qZWN0ZWQgYnkgUm9sbHVwOlxuLy8gaW1wb3J0IHtIVE1MRWxlbWVudCwgY3VzdG9tRWxlbWVudHN9IGZyb20gJ0BsaXQtbGFicy9zc3ItZG9tLXNoaW0nO1xuXG5leHBvcnQgKiBmcm9tICcuL2Nzcy10YWcuanMnO1xuZXhwb3J0IHR5cGUge1xuICBSZWFjdGl2ZUNvbnRyb2xsZXIsXG4gIFJlYWN0aXZlQ29udHJvbGxlckhvc3QsXG59IGZyb20gJy4vcmVhY3RpdmUtY29udHJvbGxlci5qcyc7XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgYHJlYWRvbmx5YCBtb2RpZmllciBmcm9tIHByb3BlcnRpZXMgaW4gdGhlIHVuaW9uIEsuXG4gKlxuICogVGhpcyBpcyBhIHNhZmVyIHdheSB0byBjYXN0IGEgdmFsdWUgdG8gYSB0eXBlIHdpdGggYSBtdXRhYmxlIHZlcnNpb24gb2YgYVxuICogcmVhZG9ubHkgZmllbGQsIHRoYW4gY2FzdGluZyB0byBhbiBpbnRlcmZhY2Ugd2l0aCB0aGUgZmllbGQgcmUtZGVjbGFyZWRcbiAqIGJlY2F1c2UgaXQgcHJlc2VydmVzIHRoZSB0eXBlIG9mIGFsbCB0aGUgZmllbGRzIGFuZCB3YXJucyBvbiB0eXBvcy5cbiAqL1xudHlwZSBNdXRhYmxlPFQsIEsgZXh0ZW5kcyBrZXlvZiBUPiA9IE9taXQ8VCwgSz4gJiB7XG4gIC1yZWFkb25seSBbUCBpbiBrZXlvZiBQaWNrPFQsIEs+XTogUCBleHRlbmRzIEsgPyBUW1BdIDogbmV2ZXI7XG59O1xuXG4vLyBUT0RPIChqdXN0aW5mYWduYW5pKTogQWRkIGBoYXNPd25gIGhlcmUgd2hlbiB3ZSBzaGlwIEVTMjAyMlxuY29uc3Qge1xuICBpcyxcbiAgZGVmaW5lUHJvcGVydHksXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzLFxuICBnZXRQcm90b3R5cGVPZixcbn0gPSBPYmplY3Q7XG5cbmNvbnN0IE5PREVfTU9ERSA9IGZhbHNlO1xuXG4vLyBMZXRzIGEgbWluaWZpZXIgcmVwbGFjZSBnbG9iYWxUaGlzIHJlZmVyZW5jZXMgd2l0aCBhIG1pbmlmaWVkIG5hbWVcbmNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXM7XG5cbmlmIChOT0RFX01PREUpIHtcbiAgZ2xvYmFsLmN1c3RvbUVsZW1lbnRzID8/PSBjdXN0b21FbGVtZW50cztcbn1cblxuY29uc3QgREVWX01PREUgPSB0cnVlO1xuXG5sZXQgaXNzdWVXYXJuaW5nOiAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHZvaWQ7XG5cbmNvbnN0IHRydXN0ZWRUeXBlcyA9IChnbG9iYWwgYXMgdW5rbm93biBhcyB7dHJ1c3RlZFR5cGVzPzoge2VtcHR5U2NyaXB0OiAnJ319KVxuICAudHJ1c3RlZFR5cGVzO1xuXG4vLyBUZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9jcmJ1Zy5jb20vOTkzMjY4XG4vLyBDdXJyZW50bHksIGFueSBhdHRyaWJ1dGUgc3RhcnRpbmcgd2l0aCBcIm9uXCIgaXMgY29uc2lkZXJlZCB0byBiZSBhXG4vLyBUcnVzdGVkU2NyaXB0IHNvdXJjZS4gU3VjaCBib29sZWFuIGF0dHJpYnV0ZXMgbXVzdCBiZSBzZXQgdG8gdGhlIGVxdWl2YWxlbnRcbi8vIHRydXN0ZWQgZW1wdHlTY3JpcHQgdmFsdWUuXG5jb25zdCBlbXB0eVN0cmluZ0ZvckJvb2xlYW5BdHRyaWJ1dGUgPSB0cnVzdGVkVHlwZXNcbiAgPyAodHJ1c3RlZFR5cGVzLmVtcHR5U2NyaXB0IGFzIHVua25vd24gYXMgJycpXG4gIDogJyc7XG5cbmNvbnN0IHBvbHlmaWxsU3VwcG9ydCA9IERFVl9NT0RFXG4gID8gZ2xvYmFsLnJlYWN0aXZlRWxlbWVudFBvbHlmaWxsU3VwcG9ydERldk1vZGVcbiAgOiBnbG9iYWwucmVhY3RpdmVFbGVtZW50UG9seWZpbGxTdXBwb3J0O1xuXG5pZiAoREVWX01PREUpIHtcbiAgLy8gRW5zdXJlIHdhcm5pbmdzIGFyZSBpc3N1ZWQgb25seSAxeCwgZXZlbiBpZiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXRcbiAgLy8gYXJlIGxvYWRlZC5cbiAgZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzID8/PSBuZXcgU2V0KCk7XG5cbiAgLyoqXG4gICAqIElzc3VlIGEgd2FybmluZyBpZiB3ZSBoYXZlbid0IGFscmVhZHksIGJhc2VkIGVpdGhlciBvbiBgY29kZWAgb3IgYHdhcm5pbmdgLlxuICAgKiBXYXJuaW5ncyBhcmUgZGlzYWJsZWQgYXV0b21hdGljYWxseSBvbmx5IGJ5IGB3YXJuaW5nYDsgZGlzYWJsaW5nIHZpYSBgY29kZWBcbiAgICogY2FuIGJlIGRvbmUgYnkgdXNlcnMuXG4gICAqL1xuICBpc3N1ZVdhcm5pbmcgPSAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHtcbiAgICB3YXJuaW5nICs9IGAgU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvJHtjb2RlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gO1xuICAgIGlmIChcbiAgICAgICFnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MhLmhhcyh3YXJuaW5nKSAmJlxuICAgICAgIWdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyEuaGFzKGNvZGUpXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MhLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG5cbiAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgIGlzc3VlV2FybmluZyhcbiAgICAgICdkZXYtbW9kZScsXG4gICAgICBgTGl0IGlzIGluIGRldiBtb2RlLiBOb3QgcmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24hYFxuICAgICk7XG5cbiAgICAvLyBJc3N1ZSBwb2x5ZmlsbCBzdXBwb3J0IHdhcm5pbmcuXG4gICAgaWYgKGdsb2JhbC5TaGFkeURPTT8uaW5Vc2UgJiYgcG9seWZpbGxTdXBwb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgJ3BvbHlmaWxsLXN1cHBvcnQtbWlzc2luZycsXG4gICAgICAgIGBTaGFkb3cgRE9NIGlzIGJlaW5nIHBvbHlmaWxsZWQgdmlhIFxcYFNoYWR5RE9NXFxgIGJ1dCBgICtcbiAgICAgICAgICBgdGhlIFxcYHBvbHlmaWxsLXN1cHBvcnRcXGAgbW9kdWxlIGhhcyBub3QgYmVlbiBsb2FkZWQuYFxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbnRhaW5zIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHVuc3RhYmxlIGRlYnVnIEFQSS5cbiAqXG4gKiBFdmVyeXRoaW5nIGluIHRoaXMgQVBJIGlzIG5vdCBzdGFibGUgYW5kIG1heSBjaGFuZ2Ugb3IgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLFxuICogZXZlbiBvbiBwYXRjaCByZWxlYXNlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbmV4cG9ydCBuYW1lc3BhY2UgUmVhY3RpdmVVbnN0YWJsZSB7XG4gIC8qKlxuICAgKiBXaGVuIExpdCBpcyBydW5uaW5nIGluIGRldiBtb2RlIGFuZCBgd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50c2AgaXMgdHJ1ZSxcbiAgICogd2Ugd2lsbCBlbWl0ICdsaXQtZGVidWcnIGV2ZW50cyB0byB3aW5kb3csIHdpdGggbGl2ZSBkZXRhaWxzIGFib3V0IHRoZSB1cGRhdGUgYW5kIHJlbmRlclxuICAgKiBsaWZlY3ljbGUuIFRoZXNlIGNhbiBiZSB1c2VmdWwgZm9yIHdyaXRpbmcgZGVidWcgdG9vbGluZyBhbmQgdmlzdWFsaXphdGlvbnMuXG4gICAqXG4gICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHJ1bm5pbmcgd2l0aCB3aW5kb3cuZW1pdExpdERlYnVnTG9nRXZlbnRzIGhhcyBwZXJmb3JtYW5jZSBvdmVyaGVhZCxcbiAgICogbWFraW5nIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3JtYWxseSB2ZXJ5IGNoZWFwIChsaWtlIGEgbm8tb3AgcmVuZGVyKSBtdWNoIHNsb3dlcixcbiAgICogYmVjYXVzZSB3ZSBtdXN0IGNvcHkgZGF0YSBhbmQgZGlzcGF0Y2ggZXZlbnRzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbiAgZXhwb3J0IG5hbWVzcGFjZSBEZWJ1Z0xvZyB7XG4gICAgZXhwb3J0IHR5cGUgRW50cnkgPSBVcGRhdGU7XG4gICAgZXhwb3J0IGludGVyZmFjZSBVcGRhdGUge1xuICAgICAga2luZDogJ3VwZGF0ZSc7XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBEZWJ1Z0xvZ2dpbmdXaW5kb3cge1xuICAvLyBFdmVuIGluIGRldiBtb2RlLCB3ZSBnZW5lcmFsbHkgZG9uJ3Qgd2FudCB0byBlbWl0IHRoZXNlIGV2ZW50cywgYXMgdGhhdCdzXG4gIC8vIGFub3RoZXIgbGV2ZWwgb2YgY29zdCwgc28gb25seSBlbWl0IHRoZW0gd2hlbiBERVZfTU9ERSBpcyB0cnVlIF9hbmRfIHdoZW5cbiAgLy8gd2luZG93LmVtaXRMaXREZWJ1Z0V2ZW50cyBpcyB0cnVlLlxuICBlbWl0TGl0RGVidWdMb2dFdmVudHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFVzZWZ1bCBmb3IgdmlzdWFsaXppbmcgYW5kIGxvZ2dpbmcgaW5zaWdodHMgaW50byB3aGF0IHRoZSBMaXQgdGVtcGxhdGUgc3lzdGVtIGlzIGRvaW5nLlxuICpcbiAqIENvbXBpbGVkIG91dCBvZiBwcm9kIG1vZGUgYnVpbGRzLlxuICovXG5jb25zdCBkZWJ1Z0xvZ0V2ZW50ID0gREVWX01PREVcbiAgPyAoZXZlbnQ6IFJlYWN0aXZlVW5zdGFibGUuRGVidWdMb2cuRW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMgRGVidWdMb2dnaW5nV2luZG93KVxuICAgICAgICAuZW1pdExpdERlYnVnTG9nRXZlbnRzO1xuICAgICAgaWYgKCFzaG91bGRFbWl0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8UmVhY3RpdmVVbnN0YWJsZS5EZWJ1Z0xvZy5FbnRyeT4oJ2xpdC1kZWJ1ZycsIHtcbiAgICAgICAgICBkZXRhaWw6IGV2ZW50LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIDogdW5kZWZpbmVkO1xuXG4vKlxuICogV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzXG4gKiByZXBsYWNlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIG11bmdlZCBuYW1lIGZvciBvYmplY3RbcHJvcGVydHldLiBXZSBjYW5ub3RcbiAqIGFsaWFzIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG8gdXNlIGEgc21hbGwgc2hpbSB0aGF0IGhhcyB0aGUgc2FtZVxuICogYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLlxuICovXG4vKkBfX0lOTElORV9fKi9cbmNvbnN0IEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSA8UCBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgcHJvcDogUCxcbiAgX29iajogdW5rbm93blxuKTogUCA9PiBwcm9wO1xuXG4vKipcbiAqIENvbnZlcnRzIHByb3BlcnR5IHZhbHVlcyB0byBhbmQgZnJvbSBhdHRyaWJ1dGUgdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXI8VHlwZSA9IHVua25vd24sIFR5cGVIaW50ID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogQ2FsbGVkIHRvIGNvbnZlcnQgYW4gYXR0cmlidXRlIHZhbHVlIHRvIGEgcHJvcGVydHlcbiAgICogdmFsdWUuXG4gICAqL1xuICBmcm9tQXR0cmlidXRlPyh2YWx1ZTogc3RyaW5nIHwgbnVsbCwgdHlwZT86IFR5cGVIaW50KTogVHlwZTtcblxuICAvKipcbiAgICogQ2FsbGVkIHRvIGNvbnZlcnQgYSBwcm9wZXJ0eSB2YWx1ZSB0byBhbiBhdHRyaWJ1dGVcbiAgICogdmFsdWUuXG4gICAqXG4gICAqIEl0IHJldHVybnMgdW5rbm93biBpbnN0ZWFkIG9mIHN0cmluZywgdG8gYmUgY29tcGF0aWJsZSB3aXRoXG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL3RydXN0ZWQtdHlwZXMgKGFuZCBzaW1pbGFyIGVmZm9ydHMpLlxuICAgKi9cbiAgdG9BdHRyaWJ1dGU/KHZhbHVlOiBUeXBlLCB0eXBlPzogVHlwZUhpbnQpOiB1bmtub3duO1xufVxuXG50eXBlIEF0dHJpYnV0ZUNvbnZlcnRlcjxUeXBlID0gdW5rbm93biwgVHlwZUhpbnQgPSB1bmtub3duPiA9XG4gIHwgQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlcjxUeXBlPlxuICB8ICgodmFsdWU6IHN0cmluZyB8IG51bGwsIHR5cGU/OiBUeXBlSGludCkgPT4gVHlwZSk7XG5cbi8qKlxuICogRGVmaW5lcyBvcHRpb25zIGZvciBhIHByb3BlcnR5IGFjY2Vzc29yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5RGVjbGFyYXRpb248VHlwZSA9IHVua25vd24sIFR5cGVIaW50ID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogV2hlbiBzZXQgdG8gYHRydWVgLCBpbmRpY2F0ZXMgdGhlIHByb3BlcnR5IGlzIGludGVybmFsIHByaXZhdGUgc3RhdGUuIFRoZVxuICAgKiBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIHNldCBieSB1c2Vycy4gV2hlbiB1c2luZyBUeXBlU2NyaXB0LCB0aGlzIHByb3BlcnR5XG4gICAqIHNob3VsZCBiZSBtYXJrZWQgYXMgYHByaXZhdGVgIG9yIGBwcm90ZWN0ZWRgLCBhbmQgaXQgaXMgYWxzbyBhIGNvbW1vblxuICAgKiBwcmFjdGljZSB0byB1c2UgYSBsZWFkaW5nIGBfYCBpbiB0aGUgbmFtZS4gVGhlIHByb3BlcnR5IGlzIG5vdCBhZGRlZCB0b1xuICAgKiBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyBhbmQgd2hldGhlciB0aGUgcHJvcGVydHkgYmVjb21lcyBhbiBvYnNlcnZlZCBhdHRyaWJ1dGUuXG4gICAqIElmIHRoZSB2YWx1ZSBpcyBgZmFsc2VgLCB0aGUgcHJvcGVydHkgaXMgbm90IGFkZGVkIHRvIGBvYnNlcnZlZEF0dHJpYnV0ZXNgLlxuICAgKiBJZiB0cnVlIG9yIGFic2VudCwgdGhlIGxvd2VyY2FzZWQgcHJvcGVydHkgbmFtZSBpcyBvYnNlcnZlZCAoZS5nLiBgZm9vQmFyYFxuICAgKiBiZWNvbWVzIGBmb29iYXJgKS4gSWYgYSBzdHJpbmcsIHRoZSBzdHJpbmcgdmFsdWUgaXMgb2JzZXJ2ZWQgKGUuZ1xuICAgKiBgYXR0cmlidXRlOiAnZm9vLWJhcidgKS5cbiAgICovXG4gIHJlYWRvbmx5IGF0dHJpYnV0ZT86IGJvb2xlYW4gfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgcHJvcGVydHkuIFRoaXMgaXMgdXNlZCBvbmx5IGFzIGEgaGludCBmb3IgdGhlXG4gICAqIGBjb252ZXJ0ZXJgIHRvIGRldGVybWluZSBob3cgdG8gY29udmVydCB0aGUgYXR0cmlidXRlXG4gICAqIHRvL2Zyb20gYSBwcm9wZXJ0eS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBUeXBlSGludDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyB0byBjb252ZXJ0IHRoZSBhdHRyaWJ1dGUgdG8vZnJvbSBhIHByb3BlcnR5LiBJZiB0aGlzIHZhbHVlXG4gICAqIGlzIGEgZnVuY3Rpb24sIGl0IGlzIHVzZWQgdG8gY29udmVydCB0aGUgYXR0cmlidXRlIHZhbHVlIGEgdGhlIHByb3BlcnR5XG4gICAqIHZhbHVlLiBJZiBpdCdzIGFuIG9iamVjdCwgaXQgY2FuIGhhdmUga2V5cyBmb3IgYGZyb21BdHRyaWJ1dGVgIGFuZFxuICAgKiBgdG9BdHRyaWJ1dGVgLiBJZiBubyBgdG9BdHRyaWJ1dGVgIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGFuZFxuICAgKiBgcmVmbGVjdGAgaXMgc2V0IHRvIGB0cnVlYCwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHNldCBkaXJlY3RseSB0byB0aGVcbiAgICogYXR0cmlidXRlLiBBIGRlZmF1bHQgYGNvbnZlcnRlcmAgaXMgdXNlZCBpZiBub25lIGlzIHByb3ZpZGVkOyBpdCBzdXBwb3J0c1xuICAgKiBgQm9vbGVhbmAsIGBTdHJpbmdgLCBgTnVtYmVyYCwgYE9iamVjdGAsIGFuZCBgQXJyYXlgLiBOb3RlLFxuICAgKiB3aGVuIGEgcHJvcGVydHkgY2hhbmdlcyBhbmQgdGhlIGNvbnZlcnRlciBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgYXR0cmlidXRlLFxuICAgKiB0aGUgcHJvcGVydHkgaXMgbmV2ZXIgdXBkYXRlZCBhZ2FpbiBhcyBhIHJlc3VsdCBvZiB0aGUgYXR0cmlidXRlIGNoYW5naW5nLFxuICAgKiBhbmQgdmljZSB2ZXJzYS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnZlcnRlcj86IEF0dHJpYnV0ZUNvbnZlcnRlcjxUeXBlLCBUeXBlSGludD47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIHJlZmxlY3QgdG8gYW4gYXR0cmlidXRlLlxuICAgKiBJZiBgdHJ1ZWAsIHdoZW4gdGhlIHByb3BlcnR5IGlzIHNldCwgdGhlIGF0dHJpYnV0ZSBpcyBzZXQgdXNpbmcgdGhlXG4gICAqIGF0dHJpYnV0ZSBuYW1lIGRldGVybWluZWQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBmb3IgdGhlIGBhdHRyaWJ1dGVgXG4gICAqIHByb3BlcnR5IG9wdGlvbiBhbmQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBjb252ZXJ0ZWQgdXNpbmcgdGhlIHJ1bGVzXG4gICAqIGZyb20gdGhlIGBjb252ZXJ0ZXJgIHByb3BlcnR5IG9wdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHJlZmxlY3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgaW5kaWNhdGVzIGlmIGEgcHJvcGVydHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgY2hhbmdlZCB3aGVuXG4gICAqIGl0IGlzIHNldC4gVGhlIGZ1bmN0aW9uIHNob3VsZCB0YWtlIHRoZSBgbmV3VmFsdWVgIGFuZCBgb2xkVmFsdWVgIGFuZFxuICAgKiByZXR1cm4gYHRydWVgIGlmIGFuIHVwZGF0ZSBzaG91bGQgYmUgcmVxdWVzdGVkLlxuICAgKi9cbiAgaGFzQ2hhbmdlZD8odmFsdWU6IFR5cGUsIG9sZFZhbHVlOiBUeXBlKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW4gYWNjZXNzb3Igd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIHByb3BlcnR5LiBCeVxuICAgKiBkZWZhdWx0LCBhbiBhY2Nlc3NvciB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhpcyBwcm9wZXJ0eSB0aGF0IHJlcXVlc3RzIGFuXG4gICAqIHVwZGF0ZSB3aGVuIHNldC4gSWYgdGhpcyBmbGFnIGlzIGB0cnVlYCwgbm8gYWNjZXNzb3Igd2lsbCBiZSBjcmVhdGVkLCBhbmRcbiAgICogaXQgd2lsbCBiZSB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNhbGxcbiAgICogYHRoaXMucmVxdWVzdFVwZGF0ZShwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlKWAgdG8gcmVxdWVzdCBhbiB1cGRhdGUgd2hlblxuICAgKiB0aGUgcHJvcGVydHkgY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IG5vQWNjZXNzb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgd3JhcHBpbmcgYWNjZXNzb3JzLiBUaGlzIGlzIHNldCBieSBgQHByb3BlcnR5YFxuICAgKiB0byBjb250cm9sIHRoZSBpbml0aWFsIHZhbHVlIGNoYW5nZSBhbmQgcmVmbGVjdGlvbiBsb2dpYy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICB3cmFwcGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHVzZXMgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGFzIHRoZSBkZWZhdWx0IHZhbHVlLFxuICAgKiB3aGljaCBjaGFuZ2VzIGhvdyBhdHRyaWJ1dGVzIGFyZSBoYW5kbGVkOlxuICAgKiAgLSBUaGUgaW5pdGlhbCB2YWx1ZSBkb2VzICpub3QqIHJlZmxlY3QsIGV2ZW4gaWYgdGhlIGByZWZsZWN0YCBvcHRpb24gaXMgYHRydWVgLlxuICAgKiAgICBTdWJzZXF1ZW50IGNoYW5nZXMgdG8gdGhlIHByb3BlcnR5IHdpbGwgcmVmbGVjdCwgZXZlbiBpZiB0aGV5IGFyZSBlcXVhbCB0byB0aGVcbiAgICogICAgIGRlZmF1bHQgdmFsdWUuXG4gICAqICAtIFdoZW4gdGhlIGF0dHJpYnV0ZSBpcyByZW1vdmVkLCB0aGUgcHJvcGVydHkgaXMgc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAqICAtIFRoZSBpbml0aWFsIHZhbHVlIHdpbGwgbm90IHRyaWdnZXIgYW4gb2xkIHZhbHVlIGluIHRoZSBgY2hhbmdlZFByb3BlcnRpZXNgIG1hcFxuICAgKiAgICBhcmd1bWVudCB0byB1cGRhdGUgbGlmZWN5Y2xlIG1ldGhvZHMuXG4gICAqXG4gICAqIFdoZW4gc2V0LCBwcm9wZXJ0aWVzIG11c3QgYmUgaW5pdGlhbGl6ZWQsIGVpdGhlciB3aXRoIGEgZmllbGQgaW5pdGlhbGl6ZXIsIG9yIGFuXG4gICAqIGFzc2lnbm1lbnQgaW4gdGhlIGNvbnN0cnVjdG9yLiBOb3QgaW5pdGlhbGl6aW5nIHRoZSBwcm9wZXJ0eSBtYXkgbGVhZCB0b1xuICAgKiBpbXByb3BlciBoYW5kbGluZyBvZiBzdWJzZXF1ZW50IHByb3BlcnR5IGFzc2lnbm1lbnRzLlxuICAgKlxuICAgKiBXaGlsZSB0aGlzIGJlaGF2aW9yIGlzIG9wdC1pbiwgbW9zdCBwcm9wZXJ0aWVzIHRoYXQgcmVmbGVjdCB0byBhdHRyaWJ1dGVzIHNob3VsZFxuICAgKiB1c2UgYHVzZURlZmF1bHQ6IHRydWVgIHNvIHRoYXQgdGhlaXIgaW5pdGlhbCB2YWx1ZXMgZG8gbm90IHJlZmxlY3QuXG4gICAqL1xuICB1c2VEZWZhdWx0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNYXAgb2YgcHJvcGVydGllcyB0byBQcm9wZXJ0eURlY2xhcmF0aW9uIG9wdGlvbnMuIEZvciBlYWNoIHByb3BlcnR5IGFuXG4gKiBhY2Nlc3NvciBpcyBtYWRlLCBhbmQgdGhlIHByb3BlcnR5IGlzIHByb2Nlc3NlZCBhY2NvcmRpbmcgdG8gdGhlXG4gKiBQcm9wZXJ0eURlY2xhcmF0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvcGVydHlEZWNsYXJhdGlvbnMge1xuICByZWFkb25seSBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eURlY2xhcmF0aW9uO1xufVxuXG50eXBlIFByb3BlcnR5RGVjbGFyYXRpb25NYXAgPSBNYXA8UHJvcGVydHlLZXksIFByb3BlcnR5RGVjbGFyYXRpb24+O1xuXG50eXBlIEF0dHJpYnV0ZU1hcCA9IE1hcDxzdHJpbmcsIFByb3BlcnR5S2V5PjtcblxuLyoqXG4gKiBBIE1hcCBvZiBwcm9wZXJ0eSBrZXlzIHRvIHZhbHVlcy5cbiAqXG4gKiBUYWtlcyBhbiBvcHRpb25hbCB0eXBlIHBhcmFtZXRlciBULCB3aGljaCB3aGVuIHNwZWNpZmllZCBhcyBhIG5vbi1hbnksXG4gKiBub24tdW5rbm93biB0eXBlLCB3aWxsIG1ha2UgdGhlIE1hcCBtb3JlIHN0cm9uZ2x5LXR5cGVkLCBhc3NvY2lhdGluZyB0aGUgbWFwXG4gKiBrZXlzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZSB0eXBlIG9uIFQuXG4gKlxuICogVXNlIGBQcm9wZXJ0eVZhbHVlczx0aGlzPmAgd2hlbiBvdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC51cGRhdGUoKSBhbmRcbiAqIG90aGVyIGxpZmVjeWNsZSBtZXRob2RzIGluIG9yZGVyIHRvIGdldCBzdHJvbmdlciB0eXBlLWNoZWNraW5nIG9uIGtleXNcbiAqIGFuZCB2YWx1ZXMuXG4gKi9cbi8vIFRoaXMgdHlwZSBpcyBjb25kaXRpb25hbCBzbyB0aGF0IGlmIHRoZSBwYXJhbWV0ZXIgVCBpcyBub3Qgc3BlY2lmaWVkLCBvclxuLy8gaXMgYGFueWAsIHRoZSB0eXBlIHdpbGwgaW5jbHVkZSBgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPmAuIFNpbmNlIFQgaXMgbm90XG4vLyBnaXZlbiBpbiB0aGUgdXNlcyBvZiBQcm9wZXJ0eVZhbHVlcyBpbiB0aGlzIGZpbGUsIGFsbCB1c2VzIGhlcmUgZmFsbGJhY2sgdG9cbi8vIG1lYW5pbmcgYE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj5gLCBidXQgaWYgYSBkZXZlbG9wZXIgdXNlc1xuLy8gYFByb3BlcnR5VmFsdWVzPHRoaXM+YCAob3IgYW55IG90aGVyIHZhbHVlIGZvciBUKSB0aGV5IHdpbGwgZ2V0IGFcbi8vIHN0cm9uZ2x5LXR5cGVkIE1hcCB0eXBlLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIFByb3BlcnR5VmFsdWVzPFQgPSBhbnk+ID0gVCBleHRlbmRzIG9iamVjdFxuICA/IFByb3BlcnR5VmFsdWVNYXA8VD5cbiAgOiBNYXA8UHJvcGVydHlLZXksIHVua25vd24+O1xuXG4vKipcbiAqIERvIG5vdCB1c2UsIGluc3RlYWQgcHJlZmVyIHtAbGlua2NvZGUgUHJvcGVydHlWYWx1ZXN9LlxuICovXG4vLyBUaGlzIHR5cGUgbXVzdCBiZSBleHBvcnRlZCBzdWNoIHRoYXQgSmF2YVNjcmlwdCBnZW5lcmF0ZWQgYnkgdGhlIEdvb2dsZVxuLy8gQ2xvc3VyZSBDb21waWxlciBjYW4gaW1wb3J0IGEgdHlwZSByZWZlcmVuY2UuXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5VmFsdWVNYXA8VD4gZXh0ZW5kcyBNYXA8UHJvcGVydHlLZXksIHVua25vd24+IHtcbiAgZ2V0PEsgZXh0ZW5kcyBrZXlvZiBUPihrOiBLKTogVFtLXSB8IHVuZGVmaW5lZDtcbiAgc2V0PEsgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IEssIHZhbHVlOiBUW0tdKTogdGhpcztcbiAgaGFzPEsgZXh0ZW5kcyBrZXlvZiBUPihrOiBLKTogYm9vbGVhbjtcbiAgZGVsZXRlPEsgZXh0ZW5kcyBrZXlvZiBUPihrOiBLKTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb252ZXJ0ZXI6IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIgPSB7XG4gIHRvQXR0cmlidXRlKHZhbHVlOiB1bmtub3duLCB0eXBlPzogdW5rbm93bik6IHVua25vd24ge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBCb29sZWFuOlxuICAgICAgICB2YWx1ZSA9IHZhbHVlID8gZW1wdHlTdHJpbmdGb3JCb29sZWFuQXR0cmlidXRlIDogbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9iamVjdDpcbiAgICAgIGNhc2UgQXJyYXk6XG4gICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgcGFzcyB0aGlzIHRocm91Z2hcbiAgICAgICAgLy8gdG8gYWxsb3cgcmVtb3Zpbmcvbm8gY2hhbmdlIGJlaGF2aW9yLlxuICAgICAgICB2YWx1ZSA9IHZhbHVlID09IG51bGwgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcblxuICBmcm9tQXR0cmlidXRlKHZhbHVlOiBzdHJpbmcgfCBudWxsLCB0eXBlPzogdW5rbm93bikge1xuICAgIGxldCBmcm9tVmFsdWU6IHVua25vd24gPSB2YWx1ZTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQm9vbGVhbjpcbiAgICAgICAgZnJvbVZhbHVlID0gdmFsdWUgIT09IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBOdW1iZXI6XG4gICAgICAgIGZyb21WYWx1ZSA9IHZhbHVlID09PSBudWxsID8gbnVsbCA6IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPYmplY3Q6XG4gICAgICBjYXNlIEFycmF5OlxuICAgICAgICAvLyBEbyAqbm90KiBnZW5lcmF0ZSBleGNlcHRpb24gd2hlbiBpbnZhbGlkIEpTT04gaXMgc2V0IGFzIGVsZW1lbnRzXG4gICAgICAgIC8vIGRvbid0IG5vcm1hbGx5IGNvbXBsYWluIG9uIGJlaW5nIG1pcy1jb25maWd1cmVkLlxuICAgICAgICAvLyBUT0RPKHNvcnZlbGwpOiBEbyBnZW5lcmF0ZSBleGNlcHRpb24gaW4gKmRldiBtb2RlKi5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBBc3NlcnQgdG8gYWRoZXJlIHRvIEJhemVsJ3MgXCJtdXN0IHR5cGUgYXNzZXJ0IEpTT04gcGFyc2VcIiBydWxlLlxuICAgICAgICAgIGZyb21WYWx1ZSA9IEpTT04ucGFyc2UodmFsdWUhKSBhcyB1bmtub3duO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZnJvbVZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGZyb21WYWx1ZTtcbiAgfSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFzQ2hhbmdlZCB7XG4gICh2YWx1ZTogdW5rbm93biwgb2xkOiB1bmtub3duKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDaGFuZ2UgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBkaWZmZXJlbnQgZnJvbSBgb2xkVmFsdWVgLlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3IgYSBwcm9wZXJ0eSdzIGBoYXNDaGFuZ2VkYCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vdEVxdWFsOiBIYXNDaGFuZ2VkID0gKHZhbHVlOiB1bmtub3duLCBvbGQ6IHVua25vd24pOiBib29sZWFuID0+XG4gICFpcyh2YWx1ZSwgb2xkKTtcblxuY29uc3QgZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb246IFByb3BlcnR5RGVjbGFyYXRpb24gPSB7XG4gIGF0dHJpYnV0ZTogdHJ1ZSxcbiAgdHlwZTogU3RyaW5nLFxuICBjb252ZXJ0ZXI6IGRlZmF1bHRDb252ZXJ0ZXIsXG4gIHJlZmxlY3Q6IGZhbHNlLFxuICB1c2VEZWZhdWx0OiBmYWxzZSxcbiAgaGFzQ2hhbmdlZDogbm90RXF1YWwsXG59O1xuXG4vKipcbiAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyBvbmUgb2YgdGhlIHN1cHBvcnRlZCBkZXYgbW9kZSB3YXJuaW5nIGNhdGVnb3JpZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFdhcm5pbmdLaW5kID1cbiAgfCAnY2hhbmdlLWluLXVwZGF0ZSdcbiAgfCAnbWlncmF0aW9uJ1xuICB8ICdhc3luYy1wZXJmb3JtLXVwZGF0ZSc7XG5cbmV4cG9ydCB0eXBlIEluaXRpYWxpemVyID0gKGVsZW1lbnQ6IFJlYWN0aXZlRWxlbWVudCkgPT4gdm9pZDtcblxuLy8gVGVtcG9yYXJ5LCB1bnRpbCBnb29nbGUzIGlzIG9uIFR5cGVTY3JpcHQgNS4yXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBTeW1ib2xDb25zdHJ1Y3RvciB7XG4gICAgcmVhZG9ubHkgbWV0YWRhdGE6IHVuaXF1ZSBzeW1ib2w7XG4gIH1cbn1cblxuLy8gRW5zdXJlIG1ldGFkYXRhIGlzIGVuYWJsZWQuIFR5cGVTY3JpcHQgZG9lcyBub3QgcG9seWZpbGxcbi8vIFN5bWJvbC5tZXRhZGF0YSwgc28gd2UgbXVzdCBlbnN1cmUgdGhhdCBpdCBleGlzdHMuXG4oU3ltYm9sIGFzIHttZXRhZGF0YTogc3ltYm9sfSkubWV0YWRhdGEgPz89IFN5bWJvbCgnbWV0YWRhdGEnKTtcblxuZGVjbGFyZSBnbG9iYWwge1xuICAvLyBUaGlzIGlzIHB1YmxpYyBnbG9iYWwgQVBJLCBkbyBub3QgY2hhbmdlIVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdmFyXG4gIHZhciBsaXRQcm9wZXJ0eU1ldGFkYXRhOiBXZWFrTWFwPFxuICAgIG9iamVjdCxcbiAgICBNYXA8UHJvcGVydHlLZXksIFByb3BlcnR5RGVjbGFyYXRpb24+XG4gID47XG59XG5cbi8vIE1hcCBmcm9tIGEgY2xhc3MncyBtZXRhZGF0YSBvYmplY3QgdG8gcHJvcGVydHkgb3B0aW9uc1xuLy8gTm90ZSB0aGF0IHdlIG11c3QgdXNlIG51bGxpc2gtY29hbGVzY2luZyBhc3NpZ25tZW50IHNvIHRoYXQgd2Ugb25seSB1c2Ugb25lXG4vLyBtYXAgZXZlbiBpZiB3ZSBsb2FkIG11bHRpcGxlIHZlcnNpb24gb2YgdGhpcyBtb2R1bGUuXG5nbG9iYWwubGl0UHJvcGVydHlNZXRhZGF0YSA/Pz0gbmV3IFdlYWtNYXA8XG4gIG9iamVjdCxcbiAgTWFwPFByb3BlcnR5S2V5LCBQcm9wZXJ0eURlY2xhcmF0aW9uPlxuPigpO1xuXG4vKipcbiAqIEJhc2UgZWxlbWVudCBjbGFzcyB3aGljaCBtYW5hZ2VzIGVsZW1lbnQgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcy4gV2hlblxuICogcHJvcGVydGllcyBjaGFuZ2UsIHRoZSBgdXBkYXRlYCBtZXRob2QgaXMgYXN5bmNocm9ub3VzbHkgY2FsbGVkLiBUaGlzIG1ldGhvZFxuICogc2hvdWxkIGJlIHN1cHBsaWVkIGJ5IHN1YmNsYXNzZXMgdG8gcmVuZGVyIHVwZGF0ZXMgYXMgZGVzaXJlZC5cbiAqIEBub0luaGVyaXREb2NcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlYWN0aXZlRWxlbWVudFxuICAvLyBJbiB0aGUgTm9kZSBidWlsZCwgdGhpcyBgZXh0ZW5kc2AgY2xhdXNlIHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aFxuICAvLyBgKGdsb2JhbFRoaXMuSFRNTEVsZW1lbnQgPz8gSFRNTEVsZW1lbnQpYC5cbiAgLy9cbiAgLy8gVGhpcyB3YXksIHdlIHdpbGwgZmlyc3QgcHJlZmVyIGFueSBnbG9iYWwgYEhUTUxFbGVtZW50YCBwb2x5ZmlsbCB0aGF0IHRoZVxuICAvLyB1c2VyIGhhcyBhc3NpZ25lZCwgYW5kIHRoZW4gZmFsbCBiYWNrIHRvIHRoZSBgSFRNTEVsZW1lbnRgIHNoaW0gd2hpY2ggaGFzXG4gIC8vIGJlZW4gaW1wb3J0ZWQgKHNlZSBub3RlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlIGFib3V0IGhvdyB0aGlzIGltcG9ydCBpc1xuICAvLyBnZW5lcmF0ZWQgYnkgUm9sbHVwKS4gTm90ZSB0aGF0IHRoZSBgSFRNTEVsZW1lbnRgIHZhcmlhYmxlIGhhcyBiZWVuXG4gIC8vIHNoYWRvd2VkIGJ5IHRoaXMgaW1wb3J0LCBzbyBpdCBubyBsb25nZXIgcmVmZXJzIHRvIHRoZSBnbG9iYWwuXG4gIGV4dGVuZHMgSFRNTEVsZW1lbnRcbiAgaW1wbGVtZW50cyBSZWFjdGl2ZUNvbnRyb2xsZXJIb3N0XG57XG4gIC8vIE5vdGU6IHRoZXNlIGFyZSBwYXRjaGVkIGluIG9ubHkgaW4gREVWX01PREUuXG4gIC8qKlxuICAgKiBSZWFkIG9yIHNldCBhbGwgdGhlIGVuYWJsZWQgd2FybmluZyBjYXRlZ29yaWVzIGZvciB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIG9ubHkgdXNlZCBpbiBkZXZlbG9wbWVudCBidWlsZHMuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBkZXYtbW9kZVxuICAgKi9cbiAgc3RhdGljIGVuYWJsZWRXYXJuaW5ncz86IFdhcm5pbmdLaW5kW107XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0aGUgZ2l2ZW4gd2FybmluZyBjYXRlZ29yeSBmb3IgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgb25seSBleGlzdHMgaW4gZGV2ZWxvcG1lbnQgYnVpbGRzLCBzbyBpdCBzaG91bGQgYmUgYWNjZXNzZWRcbiAgICogd2l0aCBhIGd1YXJkIGxpa2U6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIC8vIEVuYWJsZSBmb3IgYWxsIFJlYWN0aXZlRWxlbWVudCBzdWJjbGFzc2VzXG4gICAqIFJlYWN0aXZlRWxlbWVudC5lbmFibGVXYXJuaW5nPy4oJ21pZ3JhdGlvbicpO1xuICAgKlxuICAgKiAvLyBFbmFibGUgZm9yIG9ubHkgTXlFbGVtZW50IGFuZCBzdWJjbGFzc2VzXG4gICAqIE15RWxlbWVudC5lbmFibGVXYXJuaW5nPy4oJ21pZ3JhdGlvbicpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IGRldi1tb2RlXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlV2FybmluZz86ICh3YXJuaW5nS2luZDogV2FybmluZ0tpbmQpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgdGhlIGdpdmVuIHdhcm5pbmcgY2F0ZWdvcnkgZm9yIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIG9ubHkgZXhpc3RzIGluIGRldmVsb3BtZW50IGJ1aWxkcywgc28gaXQgc2hvdWxkIGJlIGFjY2Vzc2VkXG4gICAqIHdpdGggYSBndWFyZCBsaWtlOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBEaXNhYmxlIGZvciBhbGwgUmVhY3RpdmVFbGVtZW50IHN1YmNsYXNzZXNcbiAgICogUmVhY3RpdmVFbGVtZW50LmRpc2FibGVXYXJuaW5nPy4oJ21pZ3JhdGlvbicpO1xuICAgKlxuICAgKiAvLyBEaXNhYmxlIGZvciBvbmx5IE15RWxlbWVudCBhbmQgc3ViY2xhc3Nlc1xuICAgKiBNeUVsZW1lbnQuZGlzYWJsZVdhcm5pbmc/LignbWlncmF0aW9uJyk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgZGV2LW1vZGVcbiAgICovXG4gIHN0YXRpYyBkaXNhYmxlV2FybmluZz86ICh3YXJuaW5nS2luZDogV2FybmluZ0tpbmQpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gaW5pdGlhbGl6ZXIgZnVuY3Rpb24gdG8gdGhlIGNsYXNzIHRoYXQgaXMgY2FsbGVkIGR1cmluZyBpbnN0YW5jZVxuICAgKiBjb25zdHJ1Y3Rpb24uXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBjb2RlIHRoYXQgcnVucyBhZ2FpbnN0IGEgYFJlYWN0aXZlRWxlbWVudGBcbiAgICogc3ViY2xhc3MsIHN1Y2ggYXMgYSBkZWNvcmF0b3IsIHRoYXQgbmVlZHMgdG8gZG8gd29yayBmb3IgZWFjaFxuICAgKiBpbnN0YW5jZSwgc3VjaCBhcyBzZXR0aW5nIHVwIGEgYFJlYWN0aXZlQ29udHJvbGxlcmAuXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGNvbnN0IG15RGVjb3JhdG9yID0gKHRhcmdldDogdHlwZW9mIFJlYWN0aXZlRWxlbWVudCwga2V5OiBzdHJpbmcpID0+IHtcbiAgICogICB0YXJnZXQuYWRkSW5pdGlhbGl6ZXIoKGluc3RhbmNlOiBSZWFjdGl2ZUVsZW1lbnQpID0+IHtcbiAgICogICAgIC8vIFRoaXMgaXMgcnVuIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgdGhlIGVsZW1lbnRcbiAgICogICAgIG5ldyBNeUNvbnRyb2xsZXIoaW5zdGFuY2UpO1xuICAgKiAgIH0pO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBEZWNvcmF0aW5nIGEgZmllbGQgd2lsbCB0aGVuIGNhdXNlIGVhY2ggaW5zdGFuY2UgdG8gcnVuIGFuIGluaXRpYWxpemVyXG4gICAqIHRoYXQgYWRkcyBhIGNvbnRyb2xsZXI6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICAgKiAgIEBteURlY29yYXRvciBmb287XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEluaXRpYWxpemVycyBhcmUgc3RvcmVkIHBlci1jb25zdHJ1Y3Rvci4gQWRkaW5nIGFuIGluaXRpYWxpemVyIHRvIGFcbiAgICogc3ViY2xhc3MgZG9lcyBub3QgYWRkIGl0IHRvIGEgc3VwZXJjbGFzcy4gU2luY2UgaW5pdGlhbGl6ZXJzIGFyZSBydW4gaW5cbiAgICogY29uc3RydWN0b3JzLCBpbml0aWFsaXplcnMgd2lsbCBydW4gaW4gb3JkZXIgb2YgdGhlIGNsYXNzIGhpZXJhcmNoeSxcbiAgICogc3RhcnRpbmcgd2l0aCBzdXBlcmNsYXNzZXMgYW5kIHByb2dyZXNzaW5nIHRvIHRoZSBpbnN0YW5jZSdzIGNsYXNzLlxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKi9cbiAgc3RhdGljIGFkZEluaXRpYWxpemVyKGluaXRpYWxpemVyOiBJbml0aWFsaXplcikge1xuICAgIHRoaXMuX19wcmVwYXJlKCk7XG4gICAgKHRoaXMuX2luaXRpYWxpemVycyA/Pz0gW10pLnB1c2goaW5pdGlhbGl6ZXIpO1xuICB9XG5cbiAgc3RhdGljIF9pbml0aWFsaXplcnM/OiBJbml0aWFsaXplcltdO1xuXG4gIC8qXG4gICAqIER1ZSB0byBjbG9zdXJlIGNvbXBpbGVyIEVTNiBjb21waWxhdGlvbiBidWdzLCBAbm9jb2xsYXBzZSBpcyByZXF1aXJlZCBvblxuICAgKiBhbGwgc3RhdGljIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgd2l0aCBpbml0aWFsaXplcnMuICBSZWZlcmVuY2U6XG4gICAqIC0gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2lzc3Vlcy8xNzc2XG4gICAqL1xuXG4gIC8qKlxuICAgKiBNYXBzIGF0dHJpYnV0ZSBuYW1lcyB0byBwcm9wZXJ0aWVzOyBmb3IgZXhhbXBsZSBgZm9vYmFyYCBhdHRyaWJ1dGUgdG9cbiAgICogYGZvb0JhcmAgcHJvcGVydHkuIENyZWF0ZWQgbGF6aWx5IG9uIHVzZXIgc3ViY2xhc3NlcyB3aGVuIGZpbmFsaXppbmcgdGhlXG4gICAqIGNsYXNzLlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwOiBBdHRyaWJ1dGVNYXA7XG5cbiAgLyoqXG4gICAqIE1hcmtzIGNsYXNzIGFzIGhhdmluZyBiZWVuIGZpbmFsaXplZCwgd2hpY2ggaW5jbHVkZXMgY3JlYXRpbmcgcHJvcGVydGllc1xuICAgKiBmcm9tIGBzdGF0aWMgcHJvcGVydGllc2AsIGJ1dCBkb2VzICpub3QqIGluY2x1ZGUgYWxsIHByb3BlcnRpZXMgY3JlYXRlZFxuICAgKiBmcm9tIGRlY29yYXRvcnMuXG4gICAqIEBub2NvbGxhcHNlXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsaXplZDogdHJ1ZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogTWVtb2l6ZWQgbGlzdCBvZiBhbGwgZWxlbWVudCBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgYW55IHN1cGVyY2xhc3NcbiAgICogcHJvcGVydGllcy4gQ3JlYXRlZCBsYXppbHkgb24gdXNlciBzdWJjbGFzc2VzIHdoZW4gZmluYWxpemluZyB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBwcm9wZXJ0aWVzXG4gICAqL1xuICBzdGF0aWMgZWxlbWVudFByb3BlcnRpZXM6IFByb3BlcnR5RGVjbGFyYXRpb25NYXA7XG5cbiAgLyoqXG4gICAqIFVzZXItc3VwcGxpZWQgb2JqZWN0IHRoYXQgbWFwcyBwcm9wZXJ0eSBuYW1lcyB0byBgUHJvcGVydHlEZWNsYXJhdGlvbmBcbiAgICogb2JqZWN0cyBjb250YWluaW5nIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHJlYWN0aXZlIHByb3BlcnRpZXMuIFdoZW5cbiAgICogYSByZWFjdGl2ZSBwcm9wZXJ0eSBpcyBzZXQgdGhlIGVsZW1lbnQgd2lsbCB1cGRhdGUgYW5kIHJlbmRlci5cbiAgICpcbiAgICogQnkgZGVmYXVsdCBwcm9wZXJ0aWVzIGFyZSBwdWJsaWMgZmllbGRzLCBhbmQgYXMgc3VjaCwgdGhleSBzaG91bGQgYmVcbiAgICogY29uc2lkZXJlZCBhcyBwcmltYXJpbHkgc2V0dGFibGUgYnkgZWxlbWVudCB1c2VycywgZWl0aGVyIHZpYSBhdHRyaWJ1dGUgb3JcbiAgICogdGhlIHByb3BlcnR5IGl0c2VsZi5cbiAgICpcbiAgICogR2VuZXJhbGx5LCBwcm9wZXJ0aWVzIHRoYXQgYXJlIGNoYW5nZWQgYnkgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIHByaXZhdGUgb3JcbiAgICogcHJvdGVjdGVkIGZpZWxkcyBhbmQgc2hvdWxkIHVzZSB0aGUgYHN0YXRlOiB0cnVlYCBvcHRpb24uIFByb3BlcnRpZXNcbiAgICogbWFya2VkIGFzIGBzdGF0ZWAgZG8gbm90IHJlZmxlY3QgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGVcbiAgICpcbiAgICogSG93ZXZlciwgc29tZXRpbWVzIGVsZW1lbnQgY29kZSBkb2VzIG5lZWQgdG8gc2V0IGEgcHVibGljIHByb3BlcnR5LiBUaGlzXG4gICAqIHNob3VsZCB0eXBpY2FsbHkgb25seSBiZSBkb25lIGluIHJlc3BvbnNlIHRvIHVzZXIgaW50ZXJhY3Rpb24sIGFuZCBhbiBldmVudFxuICAgKiBzaG91bGQgYmUgZmlyZWQgaW5mb3JtaW5nIHRoZSB1c2VyOyBmb3IgZXhhbXBsZSwgYSBjaGVja2JveCBzZXRzIGl0c1xuICAgKiBgY2hlY2tlZGAgcHJvcGVydHkgd2hlbiBjbGlja2VkIGFuZCBmaXJlcyBhIGBjaGFuZ2VkYCBldmVudC4gTXV0YXRpbmdcbiAgICogcHVibGljIHByb3BlcnRpZXMgc2hvdWxkIHR5cGljYWxseSBub3QgYmUgZG9uZSBmb3Igbm9uLXByaW1pdGl2ZSAob2JqZWN0IG9yXG4gICAqIGFycmF5KSBwcm9wZXJ0aWVzLiBJbiBvdGhlciBjYXNlcyB3aGVuIGFuIGVsZW1lbnQgbmVlZHMgdG8gbWFuYWdlIHN0YXRlLCBhXG4gICAqIHByaXZhdGUgcHJvcGVydHkgc2V0IHdpdGggdGhlIGBzdGF0ZTogdHJ1ZWAgb3B0aW9uIHNob3VsZCBiZSB1c2VkLiBXaGVuXG4gICAqIG5lZWRlZCwgc3RhdGUgcHJvcGVydGllcyBjYW4gYmUgaW5pdGlhbGl6ZWQgdmlhIHB1YmxpYyBwcm9wZXJ0aWVzIHRvXG4gICAqIGZhY2lsaXRhdGUgY29tcGxleCBpbnRlcmFjdGlvbnMuXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBwcm9wZXJ0aWVzXG4gICAqL1xuICBzdGF0aWMgcHJvcGVydGllczogUHJvcGVydHlEZWNsYXJhdGlvbnM7XG5cbiAgLyoqXG4gICAqIE1lbW9pemVkIGxpc3Qgb2YgYWxsIGVsZW1lbnQgc3R5bGVzLlxuICAgKiBDcmVhdGVkIGxhemlseSBvbiB1c2VyIHN1YmNsYXNzZXMgd2hlbiBmaW5hbGl6aW5nIHRoZSBjbGFzcy5cbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IHN0eWxlc1xuICAgKi9cbiAgc3RhdGljIGVsZW1lbnRTdHlsZXM6IEFycmF5PENTU1Jlc3VsdE9yTmF0aXZlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBBcnJheSBvZiBzdHlsZXMgdG8gYXBwbHkgdG8gdGhlIGVsZW1lbnQuIFRoZSBzdHlsZXMgc2hvdWxkIGJlIGRlZmluZWRcbiAgICogdXNpbmcgdGhlIHtAbGlua2NvZGUgY3NzfSB0YWcgZnVuY3Rpb24sIHZpYSBjb25zdHJ1Y3RpYmxlIHN0eWxlc2hlZXRzLCBvclxuICAgKiBpbXBvcnRlZCBmcm9tIG5hdGl2ZSBDU1MgbW9kdWxlIHNjcmlwdHMuXG4gICAqXG4gICAqIE5vdGUgb24gQ29udGVudCBTZWN1cml0eSBQb2xpY3k6XG4gICAqXG4gICAqIEVsZW1lbnQgc3R5bGVzIGFyZSBpbXBsZW1lbnRlZCB3aXRoIGA8c3R5bGU+YCB0YWdzIHdoZW4gdGhlIGJyb3dzZXIgZG9lc24ndFxuICAgKiBzdXBwb3J0IGFkb3B0ZWQgU3R5bGVTaGVldHMuIFRvIHVzZSBzdWNoIGA8c3R5bGU+YCB0YWdzIHdpdGggdGhlIHN0eWxlLXNyY1xuICAgKiBDU1AgZGlyZWN0aXZlLCB0aGUgc3R5bGUtc3JjIHZhbHVlIG11c3QgZWl0aGVyIGluY2x1ZGUgJ3Vuc2FmZS1pbmxpbmUnIG9yXG4gICAqIGBub25jZS08YmFzZTY0LXZhbHVlPmAgd2l0aCBgPGJhc2U2NC12YWx1ZT5gIHJlcGxhY2VkIGJlIGEgc2VydmVyLWdlbmVyYXRlZFxuICAgKiBub25jZS5cbiAgICpcbiAgICogVG8gcHJvdmlkZSBhIG5vbmNlIHRvIHVzZSBvbiBnZW5lcmF0ZWQgYDxzdHlsZT5gIGVsZW1lbnRzLCBzZXRcbiAgICogYHdpbmRvdy5saXROb25jZWAgdG8gYSBzZXJ2ZXItZ2VuZXJhdGVkIG5vbmNlIGluIHlvdXIgcGFnZSdzIEhUTUwsIGJlZm9yZVxuICAgKiBsb2FkaW5nIGFwcGxpY2F0aW9uIGNvZGU6XG4gICAqXG4gICAqIGBgYGh0bWxcbiAgICogPHNjcmlwdD5cbiAgICogICAvLyBHZW5lcmF0ZWQgYW5kIHVuaXF1ZSBwZXIgcmVxdWVzdDpcbiAgICogICB3aW5kb3cubGl0Tm9uY2UgPSAnYTFiMmMzZDQnO1xuICAgKiA8L3NjcmlwdD5cbiAgICogYGBgXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBzdHlsZXNcbiAgICovXG4gIHN0YXRpYyBzdHlsZXM/OiBDU1NSZXN1bHRHcm91cDtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgYXR0cmlidXRlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSByZWdpc3RlcmVkIHByb3BlcnRpZXMuXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBhdHRyaWJ1dGVzXG4gICAqL1xuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICAvLyBFbnN1cmUgd2UndmUgY3JlYXRlZCBhbGwgcHJvcGVydGllc1xuICAgIHRoaXMuZmluYWxpemUoKTtcbiAgICAvLyB0aGlzLl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcCBpcyBvbmx5IHVuZGVmaW5lZCBhZnRlciBmaW5hbGl6ZSgpIGluXG4gICAgLy8gUmVhY3RpdmVFbGVtZW50IGl0c2VsZi4gUmVhY3RpdmVFbGVtZW50Lm9ic2VydmVkQXR0cmlidXRlcyBpcyBvbmx5XG4gICAgLy8gYWNjZXNzZWQgd2l0aCBSZWFjdGl2ZUVsZW1lbnQgYXMgdGhlIHJlY2VpdmVyIHdoZW4gYSBzdWJjbGFzcyBvciBtaXhpblxuICAgIC8vIGNhbGxzIHN1cGVyLm9ic2VydmVkQXR0cmlidXRlc1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcCAmJiBbLi4udGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAua2V5cygpXVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9faW5zdGFuY2VQcm9wZXJ0aWVzPzogUHJvcGVydHlWYWx1ZXMgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwcm9wZXJ0eSBhY2Nlc3NvciBvbiB0aGUgZWxlbWVudCBwcm90b3R5cGUgaWYgb25lIGRvZXMgbm90IGV4aXN0XG4gICAqIGFuZCBzdG9yZXMgYSB7QGxpbmtjb2RlIFByb3BlcnR5RGVjbGFyYXRpb259IGZvciB0aGUgcHJvcGVydHkgd2l0aCB0aGVcbiAgICogZ2l2ZW4gb3B0aW9ucy4gVGhlIHByb3BlcnR5IHNldHRlciBjYWxscyB0aGUgcHJvcGVydHkncyBgaGFzQ2hhbmdlZGBcbiAgICogcHJvcGVydHkgb3B0aW9uIG9yIHVzZXMgYSBzdHJpY3QgaWRlbnRpdHkgY2hlY2sgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90XG4gICAqIHRvIHJlcXVlc3QgYW4gdXBkYXRlLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBjdXN0b21pemUgcHJvcGVydGllczsgaG93ZXZlcixcbiAgICogd2hlbiBkb2luZyBzbywgaXQncyBpbXBvcnRhbnQgdG8gY2FsbCBgc3VwZXIuY3JlYXRlUHJvcGVydHlgIHRvIGVuc3VyZVxuICAgKiB0aGUgcHJvcGVydHkgaXMgc2V0dXAgY29ycmVjdGx5LiBUaGlzIG1ldGhvZCBjYWxsc1xuICAgKiBgZ2V0UHJvcGVydHlEZXNjcmlwdG9yYCBpbnRlcm5hbGx5IHRvIGdldCBhIGRlc2NyaXB0b3IgdG8gaW5zdGFsbC5cbiAgICogVG8gY3VzdG9taXplIHdoYXQgcHJvcGVydGllcyBkbyB3aGVuIHRoZXkgYXJlIGdldCBvciBzZXQsIG92ZXJyaWRlXG4gICAqIGBnZXRQcm9wZXJ0eURlc2NyaXB0b3JgLiBUbyBjdXN0b21pemUgdGhlIG9wdGlvbnMgZm9yIGEgcHJvcGVydHksXG4gICAqIGltcGxlbWVudCBgY3JlYXRlUHJvcGVydHlgIGxpa2UgdGhpczpcbiAgICpcbiAgICogYGBgdHNcbiAgICogc3RhdGljIGNyZWF0ZVByb3BlcnR5KG5hbWUsIG9wdGlvbnMpIHtcbiAgICogICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihvcHRpb25zLCB7bXlPcHRpb246IHRydWV9KTtcbiAgICogICBzdXBlci5jcmVhdGVQcm9wZXJ0eShuYW1lLCBvcHRpb25zKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eShcbiAgICBuYW1lOiBQcm9wZXJ0eUtleSxcbiAgICBvcHRpb25zOiBQcm9wZXJ0eURlY2xhcmF0aW9uID0gZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb25cbiAgKSB7XG4gICAgLy8gSWYgdGhpcyBpcyBhIHN0YXRlIHByb3BlcnR5LCBmb3JjZSB0aGUgYXR0cmlidXRlIHRvIGZhbHNlLlxuICAgIGlmIChvcHRpb25zLnN0YXRlKSB7XG4gICAgICAob3B0aW9ucyBhcyBNdXRhYmxlPFByb3BlcnR5RGVjbGFyYXRpb24sICdhdHRyaWJ1dGUnPikuYXR0cmlidXRlID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX19wcmVwYXJlKCk7XG4gICAgLy8gV2hldGhlciB0aGlzIHByb3BlcnR5IGlzIHdyYXBwaW5nIGFjY2Vzc29ycy5cbiAgICAvLyBIZWxwcyBjb250cm9sIHRoZSBpbml0aWFsIHZhbHVlIGNoYW5nZSBhbmQgcmVmbGVjdGlvbiBsb2dpYy5cbiAgICBpZiAodGhpcy5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIG9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKG9wdGlvbnMpO1xuICAgICAgb3B0aW9ucy53cmFwcGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50UHJvcGVydGllcy5zZXQobmFtZSwgb3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLm5vQWNjZXNzb3IpIHtcbiAgICAgIGNvbnN0IGtleSA9IERFVl9NT0RFXG4gICAgICAgID8gLy8gVXNlIFN5bWJvbC5mb3IgaW4gZGV2IG1vZGUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gbWFpbnRhaW4gc3RhdGVcbiAgICAgICAgICAvLyB3aGVuIGRvaW5nIEhNUi5cbiAgICAgICAgICBTeW1ib2wuZm9yKGAke1N0cmluZyhuYW1lKX0gKEBwcm9wZXJ0eSgpIGNhY2hlKWApXG4gICAgICAgIDogU3ltYm9sKCk7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5nZXRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwga2V5LCBvcHRpb25zKTtcbiAgICAgIGlmIChkZXNjcmlwdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydHkodGhpcy5wcm90b3R5cGUsIG5hbWUsIGRlc2NyaXB0b3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcHJvcGVydHkgZGVzY3JpcHRvciB0byBiZSBkZWZpbmVkIG9uIHRoZSBnaXZlbiBuYW1lZCBwcm9wZXJ0eS5cbiAgICogSWYgbm8gZGVzY3JpcHRvciBpcyByZXR1cm5lZCwgdGhlIHByb3BlcnR5IHdpbGwgbm90IGJlY29tZSBhbiBhY2Nlc3Nvci5cbiAgICogRm9yIGV4YW1wbGUsXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICAgKiAgIHN0YXRpYyBnZXRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwga2V5LCBvcHRpb25zKSB7XG4gICAqICAgICBjb25zdCBkZWZhdWx0RGVzY3JpcHRvciA9XG4gICAqICAgICAgICAgc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGtleSwgb3B0aW9ucyk7XG4gICAqICAgICBjb25zdCBzZXR0ZXIgPSBkZWZhdWx0RGVzY3JpcHRvci5zZXQ7XG4gICAqICAgICByZXR1cm4ge1xuICAgKiAgICAgICBnZXQ6IGRlZmF1bHREZXNjcmlwdG9yLmdldCxcbiAgICogICAgICAgc2V0KHZhbHVlKSB7XG4gICAqICAgICAgICAgc2V0dGVyLmNhbGwodGhpcywgdmFsdWUpO1xuICAgKiAgICAgICAgIC8vIGN1c3RvbSBhY3Rpb24uXG4gICAqICAgICAgIH0sXG4gICAqICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFxuICAgIG5hbWU6IFByb3BlcnR5S2V5LFxuICAgIGtleTogc3RyaW5nIHwgc3ltYm9sLFxuICAgIG9wdGlvbnM6IFByb3BlcnR5RGVjbGFyYXRpb25cbiAgKTogUHJvcGVydHlEZXNjcmlwdG9yIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB7Z2V0LCBzZXR9ID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMucHJvdG90eXBlLCBuYW1lKSA/PyB7XG4gICAgICBnZXQodGhpczogUmVhY3RpdmVFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzW2tleSBhcyBrZXlvZiB0eXBlb2YgdGhpc107XG4gICAgICB9LFxuICAgICAgc2V0KHRoaXM6IFJlYWN0aXZlRWxlbWVudCwgdjogdW5rbm93bikge1xuICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+KVtrZXldID0gdjtcbiAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAoREVWX01PREUgJiYgZ2V0ID09IG51bGwpIHtcbiAgICAgIGlmICgndmFsdWUnIGluIChnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcy5wcm90b3R5cGUsIG5hbWUpID8/IHt9KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZpZWxkICR7SlNPTi5zdHJpbmdpZnkoU3RyaW5nKG5hbWUpKX0gb24gYCArXG4gICAgICAgICAgICBgJHt0aGlzLm5hbWV9IHdhcyBkZWNsYXJlZCBhcyBhIHJlYWN0aXZlIHByb3BlcnR5IGAgK1xuICAgICAgICAgICAgYGJ1dCBpdCdzIGFjdHVhbGx5IGRlY2xhcmVkIGFzIGEgdmFsdWUgb24gdGhlIHByb3RvdHlwZS4gYCArXG4gICAgICAgICAgICBgVXN1YWxseSB0aGlzIGlzIGR1ZSB0byB1c2luZyBAcHJvcGVydHkgb3IgQHN0YXRlIG9uIGEgbWV0aG9kLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgJ3JlYWN0aXZlLXByb3BlcnR5LXdpdGhvdXQtZ2V0dGVyJyxcbiAgICAgICAgYEZpZWxkICR7SlNPTi5zdHJpbmdpZnkoU3RyaW5nKG5hbWUpKX0gb24gYCArXG4gICAgICAgICAgYCR7dGhpcy5uYW1lfSB3YXMgZGVjbGFyZWQgYXMgYSByZWFjdGl2ZSBwcm9wZXJ0eSBgICtcbiAgICAgICAgICBgYnV0IGl0IGRvZXMgbm90IGhhdmUgYSBnZXR0ZXIuIFRoaXMgd2lsbCBiZSBhbiBlcnJvciBpbiBhIGAgK1xuICAgICAgICAgIGBmdXR1cmUgdmVyc2lvbiBvZiBMaXQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldCxcbiAgICAgIHNldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gZ2V0Py5jYWxsKHRoaXMpO1xuICAgICAgICBzZXQ/LmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBvcHRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAqIFRoZXNlIG9wdGlvbnMgYXJlIGRlZmluZWQgd2l0aCBhIGBQcm9wZXJ0eURlY2xhcmF0aW9uYCB2aWEgdGhlIGBwcm9wZXJ0aWVzYFxuICAgKiBvYmplY3Qgb3IgdGhlIGBAcHJvcGVydHlgIGRlY29yYXRvciBhbmQgYXJlIHJlZ2lzdGVyZWQgaW5cbiAgICogYGNyZWF0ZVByb3BlcnR5KC4uLilgLlxuICAgKlxuICAgKiBOb3RlLCB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY29uc2lkZXJlZCBcImZpbmFsXCIgYW5kIG5vdCBvdmVycmlkZGVuLiBUb1xuICAgKiBjdXN0b21pemUgdGhlIG9wdGlvbnMgZm9yIGEgZ2l2ZW4gcHJvcGVydHksIG92ZXJyaWRlXG4gICAqIHtAbGlua2NvZGUgY3JlYXRlUHJvcGVydHl9LlxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAZmluYWxcbiAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICovXG4gIHN0YXRpYyBnZXRQcm9wZXJ0eU9wdGlvbnMobmFtZTogUHJvcGVydHlLZXkpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UHJvcGVydGllcy5nZXQobmFtZSkgPz8gZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb247XG4gIH1cblxuICAvLyBUZW1wb3JhcnksIHVudGlsIGdvb2dsZTMgaXMgb24gVHlwZVNjcmlwdCA1LjJcbiAgZGVjbGFyZSBzdGF0aWMgW1N5bWJvbC5tZXRhZGF0YV06IG9iamVjdCAmIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHN0YXRpYyBvd24gcHJvcGVydGllcyBvZiB0aGUgY2xhc3MgdXNlZCBpbiBib29ra2VlcGluZ1xuICAgKiBmb3IgZWxlbWVudCBwcm9wZXJ0aWVzLCBpbml0aWFsaXplcnMsIGV0Yy5cbiAgICpcbiAgICogQ2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBieSBjb2RlIHRoYXQgbmVlZHMgdG8gZW5zdXJlIHRoZXNlXG4gICAqIHByb3BlcnRpZXMgZXhpc3QgYmVmb3JlIHVzaW5nIHRoZW0uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhlIHN1cGVyY2xhc3MgaXMgZmluYWxpemVkIHNvIHRoYXQgaW5oZXJpdGVkXG4gICAqIHByb3BlcnR5IG1ldGFkYXRhIGNhbiBiZSBjb3BpZWQgZG93bi5cbiAgICogQG5vY29sbGFwc2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9fcHJlcGFyZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2VsZW1lbnRQcm9wZXJ0aWVzJywgdGhpcykpXG4gICAgKSB7XG4gICAgICAvLyBBbHJlYWR5IHByZXBhcmVkXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZpbmFsaXplIGFueSBzdXBlcmNsYXNzZXNcbiAgICBjb25zdCBzdXBlckN0b3IgPSBnZXRQcm90b3R5cGVPZih0aGlzKSBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50O1xuICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpO1xuXG4gICAgLy8gQ3JlYXRlIG93biBzZXQgb2YgaW5pdGlhbGl6ZXJzIGZvciB0aGlzIGNsYXNzIGlmIGFueSBleGlzdCBvbiB0aGVcbiAgICAvLyBzdXBlcmNsYXNzIGFuZCBjb3B5IHRoZW0gZG93bi4gTm90ZSwgZm9yIGEgc21hbGwgcGVyZiBib29zdCwgYXZvaWRcbiAgICAvLyBjcmVhdGluZyBpbml0aWFsaXplcnMgdW5sZXNzIG5lZWRlZC5cbiAgICBpZiAoc3VwZXJDdG9yLl9pbml0aWFsaXplcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZXJzID0gWy4uLnN1cGVyQ3Rvci5faW5pdGlhbGl6ZXJzXTtcbiAgICB9XG4gICAgLy8gSW5pdGlhbGl6ZSBlbGVtZW50UHJvcGVydGllcyBmcm9tIHRoZSBzdXBlcmNsYXNzXG4gICAgdGhpcy5lbGVtZW50UHJvcGVydGllcyA9IG5ldyBNYXAoc3VwZXJDdG9yLmVsZW1lbnRQcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5pc2hlcyBzZXR0aW5nIHVwIHRoZSBjbGFzcyBzbyB0aGF0IGl0J3MgcmVhZHkgdG8gYmUgcmVnaXN0ZXJlZFxuICAgKiBhcyBhIGN1c3RvbSBlbGVtZW50IGFuZCBpbnN0YW50aWF0ZWQuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgUmVhY3RpdmVFbGVtZW50Lm9ic2VydmVkQXR0cmlidXRlcyBnZXR0ZXIuXG4gICAqIElmIHlvdSBvdmVycmlkZSB0aGUgb2JzZXJ2ZWRBdHRyaWJ1dGVzIGdldHRlciwgeW91IG11c3QgZWl0aGVyIGNhbGxcbiAgICogc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzIHRvIHRyaWdnZXIgZmluYWxpemF0aW9uLCBvciBjYWxsIGZpbmFsaXplKClcbiAgICogeW91cnNlbGYuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsaXplKCkge1xuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2ZpbmFsaXplZCcsIHRoaXMpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZpbmFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5fX3ByZXBhcmUoKTtcblxuICAgIC8vIENyZWF0ZSBwcm9wZXJ0aWVzIGZyb20gdGhlIHN0YXRpYyBwcm9wZXJ0aWVzIGJsb2NrOlxuICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCB0aGlzKSkpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgY29uc3QgcHJvcEtleXMgPSBbXG4gICAgICAgIC4uLmdldE93blByb3BlcnR5TmFtZXMocHJvcHMpLFxuICAgICAgICAuLi5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocHJvcHMpLFxuICAgICAgXSBhcyBBcnJheTxrZXlvZiB0eXBlb2YgcHJvcHM+O1xuICAgICAgZm9yIChjb25zdCBwIG9mIHByb3BLZXlzKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydHkocCwgcHJvcHNbcF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBwcm9wZXJ0aWVzIGZyb20gc3RhbmRhcmQgZGVjb3JhdG9yIG1ldGFkYXRhOlxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpc1tTeW1ib2wubWV0YWRhdGFdO1xuICAgIGlmIChtZXRhZGF0YSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IGxpdFByb3BlcnR5TWV0YWRhdGEuZ2V0KG1ldGFkYXRhKTtcbiAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBbcCwgb3B0aW9uc10gb2YgcHJvcGVydGllcykge1xuICAgICAgICAgIHRoaXMuZWxlbWVudFByb3BlcnRpZXMuc2V0KHAsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBhdHRyaWJ1dGUtdG8tcHJvcGVydHkgbWFwXG4gICAgdGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCBbcCwgb3B0aW9uc10gb2YgdGhpcy5lbGVtZW50UHJvcGVydGllcykge1xuICAgICAgY29uc3QgYXR0ciA9IHRoaXMuX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocCwgb3B0aW9ucyk7XG4gICAgICBpZiAoYXR0ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwLnNldChhdHRyLCBwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnRTdHlsZXMgPSB0aGlzLmZpbmFsaXplU3R5bGVzKHRoaXMuc3R5bGVzKTtcblxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ2NyZWF0ZVByb3BlcnR5JykpIHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAgICduby1vdmVycmlkZS1jcmVhdGUtcHJvcGVydHknLFxuICAgICAgICAgICdPdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC5jcmVhdGVQcm9wZXJ0eSgpIGlzIGRlcHJlY2F0ZWQuICcgK1xuICAgICAgICAgICAgJ1RoZSBvdmVycmlkZSB3aWxsIG5vdCBiZSBjYWxsZWQgd2l0aCBzdGFuZGFyZCBkZWNvcmF0b3JzJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ2dldFByb3BlcnR5RGVzY3JpcHRvcicpKSB7XG4gICAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgICAnbm8tb3ZlcnJpZGUtZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3InLFxuICAgICAgICAgICdPdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC5nZXRQcm9wZXJ0eURlc2NyaXB0b3IoKSBpcyBkZXByZWNhdGVkLiAnICtcbiAgICAgICAgICAgICdUaGUgb3ZlcnJpZGUgd2lsbCBub3QgYmUgY2FsbGVkIHdpdGggc3RhbmRhcmQgZGVjb3JhdG9ycydcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3B0aW9ucyB1c2VkIHdoZW4gY2FsbGluZyBgYXR0YWNoU2hhZG93YC4gU2V0IHRoaXMgcHJvcGVydHkgdG8gY3VzdG9taXplXG4gICAqIHRoZSBvcHRpb25zIGZvciB0aGUgc2hhZG93Um9vdDsgZm9yIGV4YW1wbGUsIHRvIGNyZWF0ZSBhIGNsb3NlZFxuICAgKiBzaGFkb3dSb290OiBge21vZGU6ICdjbG9zZWQnfWAuXG4gICAqXG4gICAqIE5vdGUsIHRoZXNlIG9wdGlvbnMgYXJlIHVzZWQgaW4gYGNyZWF0ZVJlbmRlclJvb3RgLiBJZiB0aGlzIG1ldGhvZFxuICAgKiBpcyBjdXN0b21pemVkLCBvcHRpb25zIHNob3VsZCBiZSByZXNwZWN0ZWQgaWYgcG9zc2libGUuXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHN0YXRpYyBzaGFkb3dSb290T3B0aW9uczogU2hhZG93Um9vdEluaXQgPSB7bW9kZTogJ29wZW4nfTtcblxuICAvKipcbiAgICogVGFrZXMgdGhlIHN0eWxlcyB0aGUgdXNlciBzdXBwbGllZCB2aWEgdGhlIGBzdGF0aWMgc3R5bGVzYCBwcm9wZXJ0eSBhbmRcbiAgICogcmV0dXJucyB0aGUgYXJyYXkgb2Ygc3R5bGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50LlxuICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbnRlZ3JhdGUgaW50byBhIHN0eWxlIG1hbmFnZW1lbnQgc3lzdGVtLlxuICAgKlxuICAgKiBTdHlsZXMgYXJlIGRlZHVwbGljYXRlZCBwcmVzZXJ2aW5nIHRoZSBfbGFzdF8gaW5zdGFuY2UgaW4gdGhlIGxpc3QuIFRoaXNcbiAgICogaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdG8gYXZvaWQgZHVwbGljYXRlZCBzdHlsZXMgdGhhdCBjYW4gb2NjdXJcbiAgICogZXNwZWNpYWxseSB3aGVuIGNvbXBvc2luZyB2aWEgc3ViY2xhc3NpbmcuIFRoZSBsYXN0IGl0ZW0gaXMga2VwdCB0byB0cnlcbiAgICogdG8gcHJlc2VydmUgdGhlIGNhc2NhZGUgb3JkZXIgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0J3MgbW9zdCBpbXBvcnRhbnRcbiAgICogdGhhdCBsYXN0IGFkZGVkIHN0eWxlcyBvdmVycmlkZSBwcmV2aW91cyBzdHlsZXMuXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBzdHlsZXNcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmluYWxpemVTdHlsZXMoXG4gICAgc3R5bGVzPzogQ1NTUmVzdWx0R3JvdXBcbiAgKTogQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmU+IHtcbiAgICBjb25zdCBlbGVtZW50U3R5bGVzID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGVzKSkge1xuICAgICAgLy8gRGVkdXBlIHRoZSBmbGF0dGVuZWQgYXJyYXkgaW4gcmV2ZXJzZSBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgbGFzdCBpdGVtcy5cbiAgICAgIC8vIENhc3RpbmcgdG8gQXJyYXk8dW5rbm93bj4gd29ya3MgYXJvdW5kIFRTIGVycm9yIHRoYXRcbiAgICAgIC8vIGFwcGVhcnMgdG8gY29tZSBmcm9tIHRyeWluZyB0byBmbGF0dGVuIGEgdHlwZSBDU1NSZXN1bHRBcnJheS5cbiAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKHN0eWxlcyBhcyBBcnJheTx1bmtub3duPikuZmxhdChJbmZpbml0eSkucmV2ZXJzZSgpKTtcbiAgICAgIC8vIFRoZW4gcHJlc2VydmUgb3JpZ2luYWwgb3JkZXIgYnkgYWRkaW5nIHRoZSBzZXQgaXRlbXMgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgIGZvciAoY29uc3QgcyBvZiBzZXQpIHtcbiAgICAgICAgZWxlbWVudFN0eWxlcy51bnNoaWZ0KGdldENvbXBhdGlibGVTdHlsZShzIGFzIENTU1Jlc3VsdE9yTmF0aXZlKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdHlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZWxlbWVudFN0eWxlcy5wdXNoKGdldENvbXBhdGlibGVTdHlsZShzdHlsZXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRTdHlsZXM7XG4gIH1cblxuICAvKipcbiAgICogTm9kZSBvciBTaGFkb3dSb290IGludG8gd2hpY2ggZWxlbWVudCBET00gc2hvdWxkIGJlIHJlbmRlcmVkLiBEZWZhdWx0c1xuICAgKiB0byBhbiBvcGVuIHNoYWRvd1Jvb3QuXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlclJvb3QhOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgYG5hbWVgLlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkoXG4gICAgbmFtZTogUHJvcGVydHlLZXksXG4gICAgb3B0aW9uczogUHJvcGVydHlEZWNsYXJhdGlvblxuICApIHtcbiAgICBjb25zdCBhdHRyaWJ1dGUgPSBvcHRpb25zLmF0dHJpYnV0ZTtcbiAgICByZXR1cm4gYXR0cmlidXRlID09PSBmYWxzZVxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogdHlwZW9mIGF0dHJpYnV0ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBhdHRyaWJ1dGVcbiAgICAgICAgOiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IG5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSB0byBhbiB1bnJlc29sdmVkIFByb21pc2Ugc28gd2UgY2FuIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBoYXNcbiAgLy8gY29ubmVjdGVkIGJlZm9yZSBmaXJzdCB1cGRhdGUuXG4gIHByaXZhdGUgX191cGRhdGVQcm9taXNlITogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogVHJ1ZSBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgdXBkYXRlIGFzIGEgcmVzdWx0IG9mIGNhbGxpbmcgYHJlcXVlc3RVcGRhdGUoKWAuXG4gICAqIFNob3VsZCBvbmx5IGJlIHJlYWQuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBpc1VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogSXMgc2V0IHRvIGB0cnVlYCBhZnRlciB0aGUgZmlyc3QgdXBkYXRlLiBUaGUgZWxlbWVudCBjb2RlIGNhbm5vdCBhc3N1bWVcbiAgICogdGhhdCBgcmVuZGVyUm9vdGAgZXhpc3RzIGJlZm9yZSB0aGUgZWxlbWVudCBgaGFzVXBkYXRlZGAuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBoYXNVcGRhdGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE1hcCB3aXRoIGtleXMgZm9yIGFueSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0XG4gICAqIHVwZGF0ZSBjeWNsZSB3aXRoIHByZXZpb3VzIHZhbHVlcy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfJGNoYW5nZWRQcm9wZXJ0aWVzITogUHJvcGVydHlWYWx1ZXM7XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgcHJvcGVydHkgZGVmYXVsdCB2YWx1ZXMgd2hlbiB0aGVcbiAgICogYHVzZURlZmF1bHRgIG9wdGlvbiBpcyB1c2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBfX2RlZmF1bHRWYWx1ZXM/OiBNYXA8UHJvcGVydHlLZXksIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBQcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIHJlZmxlY3RlZCB3aGVuIHVwZGF0ZWQuXG4gICAqL1xuICBwcml2YXRlIF9fcmVmbGVjdGluZ1Byb3BlcnRpZXM/OiBTZXQ8UHJvcGVydHlLZXk+O1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIGN1cnJlbnRseSByZWZsZWN0aW5nIHByb3BlcnR5XG4gICAqL1xuICBwcml2YXRlIF9fcmVmbGVjdGluZ1Byb3BlcnR5OiBQcm9wZXJ0eUtleSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgY29udHJvbGxlcnMuXG4gICAqL1xuICBwcml2YXRlIF9fY29udHJvbGxlcnM/OiBTZXQ8UmVhY3RpdmVDb250cm9sbGVyPjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX19pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgb25seSBvdmVycmlkZSBwb2ludCBmb3IgY3VzdG9taXppbmcgd29yayBkb25lIHdoZW4gZWxlbWVudHNcbiAgICogYXJlIGNvbnN0cnVjdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfX2luaXRpYWxpemUoKSB7XG4gICAgdGhpcy5fX3VwZGF0ZVByb21pc2UgPSBuZXcgUHJvbWlzZTxib29sZWFuPihcbiAgICAgIChyZXMpID0+ICh0aGlzLmVuYWJsZVVwZGF0aW5nID0gcmVzKVxuICAgICk7XG4gICAgdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzID0gbmV3IE1hcCgpO1xuICAgIC8vIFRoaXMgZW5xdWV1ZXMgYSBtaWNyb3Rhc2sgdGhhdCBtdXN0IHJ1biBiZWZvcmUgdGhlIGZpcnN0IHVwZGF0ZSwgc28gaXRcbiAgICAvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgcmVxdWVzdFVwZGF0ZSgpXG4gICAgdGhpcy5fX3NhdmVJbnN0YW5jZVByb3BlcnRpZXMoKTtcbiAgICAvLyBlbnN1cmVzIGZpcnN0IHVwZGF0ZSB3aWxsIGJlIGNhdWdodCBieSBhbiBlYXJseSBhY2Nlc3Mgb2ZcbiAgICAvLyBgdXBkYXRlQ29tcGxldGVgXG4gICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7XG4gICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuX2luaXRpYWxpemVycz8uZm9yRWFjaCgoaSkgPT5cbiAgICAgIGkodGhpcylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGBSZWFjdGl2ZUNvbnRyb2xsZXJgIHRvIHBhcnRpY2lwYXRlIGluIHRoZSBlbGVtZW50J3MgcmVhY3RpdmVcbiAgICogdXBkYXRlIGN5Y2xlLiBUaGUgZWxlbWVudCBhdXRvbWF0aWNhbGx5IGNhbGxzIGludG8gYW55IHJlZ2lzdGVyZWRcbiAgICogY29udHJvbGxlcnMgZHVyaW5nIGl0cyBsaWZlY3ljbGUgY2FsbGJhY2tzLlxuICAgKlxuICAgKiBJZiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgd2hlbiBgYWRkQ29udHJvbGxlcigpYCBpcyBjYWxsZWQsIHRoZVxuICAgKiBjb250cm9sbGVyJ3MgYGhvc3RDb25uZWN0ZWQoKWAgY2FsbGJhY2sgd2lsbCBiZSBpbW1lZGlhdGVseSBjYWxsZWQuXG4gICAqIEBjYXRlZ29yeSBjb250cm9sbGVyc1xuICAgKi9cbiAgYWRkQ29udHJvbGxlcihjb250cm9sbGVyOiBSZWFjdGl2ZUNvbnRyb2xsZXIpIHtcbiAgICAodGhpcy5fX2NvbnRyb2xsZXJzID8/PSBuZXcgU2V0KCkpLmFkZChjb250cm9sbGVyKTtcbiAgICAvLyBJZiBhIGNvbnRyb2xsZXIgaXMgYWRkZWQgYWZ0ZXIgdGhlIGVsZW1lbnQgaGFzIGJlZW4gY29ubmVjdGVkLFxuICAgIC8vIGNhbGwgaG9zdENvbm5lY3RlZC4gTm90ZSwgcmUtdXNpbmcgZXhpc3RlbmNlIG9mIGByZW5kZXJSb290YCBoZXJlXG4gICAgLy8gKHdoaWNoIGlzIHNldCBpbiBjb25uZWN0ZWRDYWxsYmFjaykgdG8gYXZvaWQgdGhlIG5lZWQgdG8gdHJhY2sgYVxuICAgIC8vIGZpcnN0IGNvbm5lY3RlZCBzdGF0ZS5cbiAgICBpZiAodGhpcy5yZW5kZXJSb290ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgY29udHJvbGxlci5ob3N0Q29ubmVjdGVkPy4oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGBSZWFjdGl2ZUNvbnRyb2xsZXJgIGZyb20gdGhlIGVsZW1lbnQuXG4gICAqIEBjYXRlZ29yeSBjb250cm9sbGVyc1xuICAgKi9cbiAgcmVtb3ZlQ29udHJvbGxlcihjb250cm9sbGVyOiBSZWFjdGl2ZUNvbnRyb2xsZXIpIHtcbiAgICB0aGlzLl9fY29udHJvbGxlcnM/LmRlbGV0ZShjb250cm9sbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXhlcyBhbnkgcHJvcGVydGllcyBzZXQgb24gdGhlIGluc3RhbmNlIGJlZm9yZSB1cGdyYWRlIHRpbWUuXG4gICAqIE90aGVyd2lzZSB0aGVzZSB3b3VsZCBzaGFkb3cgdGhlIGFjY2Vzc29yIGFuZCBicmVhayB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgKiBUaGUgcHJvcGVydGllcyBhcmUgc3RvcmVkIGluIGEgTWFwIHdoaWNoIGlzIHBsYXllZCBiYWNrIGFmdGVyIHRoZVxuICAgKiBjb25zdHJ1Y3RvciBydW5zLlxuICAgKi9cbiAgcHJpdmF0ZSBfX3NhdmVJbnN0YW5jZVByb3BlcnRpZXMoKSB7XG4gICAgY29uc3QgaW5zdGFuY2VQcm9wZXJ0aWVzID0gbmV3IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4oKTtcbiAgICBjb25zdCBlbGVtZW50UHJvcGVydGllcyA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpXG4gICAgICAuZWxlbWVudFByb3BlcnRpZXM7XG4gICAgZm9yIChjb25zdCBwIG9mIGVsZW1lbnRQcm9wZXJ0aWVzLmtleXMoKSBhcyBJdGVyYWJsZUl0ZXJhdG9yPGtleW9mIHRoaXM+KSB7XG4gICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICBpbnN0YW5jZVByb3BlcnRpZXMuc2V0KHAsIHRoaXNbcF0pO1xuICAgICAgICBkZWxldGUgdGhpc1twXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluc3RhbmNlUHJvcGVydGllcy5zaXplID4gMCkge1xuICAgICAgdGhpcy5fX2luc3RhbmNlUHJvcGVydGllcyA9IGluc3RhbmNlUHJvcGVydGllcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbm9kZSBpbnRvIHdoaWNoIHRoZSBlbGVtZW50IHNob3VsZCByZW5kZXIgYW5kIGJ5IGRlZmF1bHRcbiAgICogY3JlYXRlcyBhbmQgcmV0dXJucyBhbiBvcGVuIHNoYWRvd1Jvb3QuIEltcGxlbWVudCB0byBjdXN0b21pemUgd2hlcmUgdGhlXG4gICAqIGVsZW1lbnQncyBET00gaXMgcmVuZGVyZWQuIEZvciBleGFtcGxlLCB0byByZW5kZXIgaW50byB0aGUgZWxlbWVudCdzXG4gICAqIGNoaWxkTm9kZXMsIHJldHVybiBgdGhpc2AuXG4gICAqXG4gICAqIEByZXR1cm4gUmV0dXJucyBhIG5vZGUgaW50byB3aGljaCB0byByZW5kZXIuXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVSZW5kZXJSb290KCk6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgcmVuZGVyUm9vdCA9XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QgPz9cbiAgICAgIHRoaXMuYXR0YWNoU2hhZG93KFxuICAgICAgICAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50KS5zaGFkb3dSb290T3B0aW9uc1xuICAgICAgKTtcbiAgICBhZG9wdFN0eWxlcyhcbiAgICAgIHJlbmRlclJvb3QsXG4gICAgICAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50KS5lbGVtZW50U3R5bGVzXG4gICAgKTtcbiAgICByZXR1cm4gcmVuZGVyUm9vdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBmaXJzdCBjb25uZWN0aW9uLCBjcmVhdGVzIHRoZSBlbGVtZW50J3MgcmVuZGVyUm9vdCwgc2V0cyB1cFxuICAgKiBlbGVtZW50IHN0eWxpbmcsIGFuZCBlbmFibGVzIHVwZGF0aW5nLlxuICAgKiBAY2F0ZWdvcnkgbGlmZWN5Y2xlXG4gICAqL1xuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAvLyBDcmVhdGUgcmVuZGVyUm9vdCBiZWZvcmUgY29udHJvbGxlcnMgYGhvc3RDb25uZWN0ZWRgXG4gICAgKHRoaXMgYXMgTXV0YWJsZTx0eXBlb2YgdGhpcywgJ3JlbmRlclJvb3QnPikucmVuZGVyUm9vdCA/Pz1cbiAgICAgIHRoaXMuY3JlYXRlUmVuZGVyUm9vdCgpO1xuICAgIHRoaXMuZW5hYmxlVXBkYXRpbmcodHJ1ZSk7XG4gICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5mb3JFYWNoKChjKSA9PiBjLmhvc3RDb25uZWN0ZWQ/LigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RlLCB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY29uc2lkZXJlZCBmaW5hbCBhbmQgbm90IG92ZXJyaWRkZW4uIEl0IGlzXG4gICAqIG92ZXJyaWRkZW4gb24gdGhlIGVsZW1lbnQgaW5zdGFuY2Ugd2l0aCBhIGZ1bmN0aW9uIHRoYXQgdHJpZ2dlcnMgdGhlIGZpcnN0XG4gICAqIHVwZGF0ZS5cbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCBlbmFibGVVcGRhdGluZyhfcmVxdWVzdGVkVXBkYXRlOiBib29sZWFuKSB7fVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgZm9yIGBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpYCBpbiBleHRlbnNpb25zIHdoaWxlXG4gICAqIHJlc2VydmluZyB0aGUgcG9zc2liaWxpdHkgb2YgbWFraW5nIG5vbi1icmVha2luZyBmZWF0dXJlIGFkZGl0aW9uc1xuICAgKiB3aGVuIGRpc2Nvbm5lY3RpbmcgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLlxuICAgKiBAY2F0ZWdvcnkgbGlmZWN5Y2xlXG4gICAqL1xuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9fY29udHJvbGxlcnM/LmZvckVhY2goKGMpID0+IGMuaG9zdERpc2Nvbm5lY3RlZD8uKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9uaXplcyBwcm9wZXJ0eSB2YWx1ZXMgd2hlbiBhdHRyaWJ1dGVzIGNoYW5nZS5cbiAgICpcbiAgICogU3BlY2lmaWNhbGx5LCB3aGVuIGFuIGF0dHJpYnV0ZSBpcyBzZXQsIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IGlzIHNldC5cbiAgICogWW91IHNob3VsZCByYXJlbHkgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBjYWxsYmFjay4gSWYgdGhpcyBtZXRob2QgaXNcbiAgICogb3ZlcnJpZGRlbiwgYHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBfb2xkLCB2YWx1ZSlgIG11c3QgYmVcbiAgICogY2FsbGVkLlxuICAgKlxuICAgKiBTZWUgW3Jlc3BvbmRpbmcgdG8gYXR0cmlidXRlIGNoYW5nZXNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJfY29tcG9uZW50cy9Vc2luZ19jdXN0b21fZWxlbWVudHMjcmVzcG9uZGluZ190b19hdHRyaWJ1dGVfY2hhbmdlcylcbiAgICogb24gTUROIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYC5cbiAgICogQGNhdGVnb3J5IGF0dHJpYnV0ZXNcbiAgICovXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgX29sZDogc3RyaW5nIHwgbnVsbCxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbFxuICApIHtcbiAgICB0aGlzLl8kYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9fcHJvcGVydHlUb0F0dHJpYnV0ZShuYW1lOiBQcm9wZXJ0eUtleSwgdmFsdWU6IHVua25vd24pIHtcbiAgICBjb25zdCBlbGVtUHJvcGVydGllczogUHJvcGVydHlEZWNsYXJhdGlvbk1hcCA9IChcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudFxuICAgICkuZWxlbWVudFByb3BlcnRpZXM7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGVsZW1Qcm9wZXJ0aWVzLmdldChuYW1lKSE7XG4gICAgY29uc3QgYXR0ciA9IChcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudFxuICAgICkuX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkobmFtZSwgb3B0aW9ucyk7XG4gICAgaWYgKGF0dHIgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnJlZmxlY3QgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGNvbnZlcnRlciA9XG4gICAgICAgIChvcHRpb25zLmNvbnZlcnRlciBhcyBDb21wbGV4QXR0cmlidXRlQ29udmVydGVyKT8udG9BdHRyaWJ1dGUgIT09XG4gICAgICAgIHVuZGVmaW5lZFxuICAgICAgICAgID8gKG9wdGlvbnMuY29udmVydGVyIGFzIENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIpXG4gICAgICAgICAgOiBkZWZhdWx0Q29udmVydGVyO1xuICAgICAgY29uc3QgYXR0clZhbHVlID0gY29udmVydGVyLnRvQXR0cmlidXRlISh2YWx1ZSwgb3B0aW9ucy50eXBlKTtcbiAgICAgIGlmIChcbiAgICAgICAgREVWX01PREUgJiZcbiAgICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuZW5hYmxlZFdhcm5pbmdzIS5pbmNsdWRlcyhcbiAgICAgICAgICAnbWlncmF0aW9uJ1xuICAgICAgICApICYmXG4gICAgICAgIGF0dHJWYWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAgICd1bmRlZmluZWQtYXR0cmlidXRlLXZhbHVlJyxcbiAgICAgICAgICBgVGhlIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgdGhlICR7bmFtZSBhcyBzdHJpbmd9IHByb3BlcnR5IGlzIGAgK1xuICAgICAgICAgICAgYHVuZGVmaW5lZCBvbiBlbGVtZW50ICR7dGhpcy5sb2NhbE5hbWV9LiBUaGUgYXR0cmlidXRlIHdpbGwgYmUgYCArXG4gICAgICAgICAgICBgcmVtb3ZlZCwgYnV0IGluIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIFxcYFJlYWN0aXZlRWxlbWVudFxcYCwgYCArXG4gICAgICAgICAgICBgdGhlIGF0dHJpYnV0ZSB3b3VsZCBub3QgaGF2ZSBjaGFuZ2VkLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIFRyYWNrIGlmIHRoZSBwcm9wZXJ0eSBpcyBiZWluZyByZWZsZWN0ZWQgdG8gYXZvaWRcbiAgICAgIC8vIHNldHRpbmcgdGhlIHByb3BlcnR5IGFnYWluIHZpYSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYC4gTm90ZTpcbiAgICAgIC8vIDEuIHRoaXMgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgdGhlIGNhbGxiYWNrIGlzIHN5bmNocm9ub3VzLlxuICAgICAgLy8gMi4gd2lsbCBiZWhhdmUgaW5jb3JyZWN0bHkgaWYgbXVsdGlwbGUgYXR0cmlidXRlcyBhcmUgaW4gdGhlIHJlYWN0aW9uXG4gICAgICAvLyBzdGFjayBhdCB0aW1lIG9mIGNhbGxpbmcuIEhvd2V2ZXIsIHNpbmNlIHdlIHByb2Nlc3MgYXR0cmlidXRlc1xuICAgICAgLy8gaW4gYHVwZGF0ZWAgdGhpcyBzaG91bGQgbm90IGJlIHBvc3NpYmxlIChvciBhbiBleHRyZW1lIGNvcm5lciBjYXNlXG4gICAgICAvLyB0aGF0IHdlJ2QgbGlrZSB0byBkaXNjb3ZlcikuXG4gICAgICAvLyBtYXJrIHN0YXRlIHJlZmxlY3RpbmdcbiAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBuYW1lO1xuICAgICAgaWYgKGF0dHJWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0clZhbHVlIGFzIHN0cmluZyk7XG4gICAgICB9XG4gICAgICAvLyBtYXJrIHN0YXRlIG5vdCByZWZsZWN0aW5nXG4gICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF8kYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgY29uc3QgY3RvciA9IHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudDtcbiAgICAvLyBOb3RlLCBoaW50IHRoaXMgYXMgYW4gYEF0dHJpYnV0ZU1hcGAgc28gY2xvc3VyZSBjbGVhcmx5IHVuZGVyc3RhbmRzXG4gICAgLy8gdGhlIHR5cGU7IGl0IGhhcyBpc3N1ZXMgd2l0aCB0cmFja2luZyB0eXBlcyB0aHJvdWdoIHN0YXRpY3NcbiAgICBjb25zdCBwcm9wTmFtZSA9IChjdG9yLl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcCBhcyBBdHRyaWJ1dGVNYXApLmdldChuYW1lKTtcbiAgICAvLyBVc2UgdHJhY2tpbmcgaW5mbyB0byBhdm9pZCByZWZsZWN0aW5nIGEgcHJvcGVydHkgdmFsdWUgdG8gYW4gYXR0cmlidXRlXG4gICAgLy8gaWYgaXQgd2FzIGp1c3Qgc2V0IGJlY2F1c2UgdGhlIGF0dHJpYnV0ZSBjaGFuZ2VkLlxuICAgIGlmIChwcm9wTmFtZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgIT09IHByb3BOYW1lKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gY3Rvci5nZXRQcm9wZXJ0eU9wdGlvbnMocHJvcE5hbWUpO1xuICAgICAgY29uc3QgY29udmVydGVyID1cbiAgICAgICAgdHlwZW9mIG9wdGlvbnMuY29udmVydGVyID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyB7ZnJvbUF0dHJpYnV0ZTogb3B0aW9ucy5jb252ZXJ0ZXJ9XG4gICAgICAgICAgOiBvcHRpb25zLmNvbnZlcnRlcj8uZnJvbUF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IG9wdGlvbnMuY29udmVydGVyXG4gICAgICAgICAgICA6IGRlZmF1bHRDb252ZXJ0ZXI7XG4gICAgICAvLyBtYXJrIHN0YXRlIHJlZmxlY3RpbmdcbiAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBwcm9wTmFtZTtcbiAgICAgIHRoaXNbcHJvcE5hbWUgYXMga2V5b2YgdGhpc10gPVxuICAgICAgICBjb252ZXJ0ZXIuZnJvbUF0dHJpYnV0ZSEodmFsdWUsIG9wdGlvbnMudHlwZSkgPz9cbiAgICAgICAgdGhpcy5fX2RlZmF1bHRWYWx1ZXM/LmdldChwcm9wTmFtZSkgPz9cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgKG51bGwgYXMgYW55KTtcbiAgICAgIC8vIG1hcmsgc3RhdGUgbm90IHJlZmxlY3RpbmdcbiAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBhbiB1cGRhdGUgd2hpY2ggaXMgcHJvY2Vzc2VkIGFzeW5jaHJvbm91c2x5LiBUaGlzIHNob3VsZCBiZSBjYWxsZWRcbiAgICogd2hlbiBhbiBlbGVtZW50IHNob3VsZCB1cGRhdGUgYmFzZWQgb24gc29tZSBzdGF0ZSBub3QgdHJpZ2dlcmVkIGJ5IHNldHRpbmdcbiAgICogYSByZWFjdGl2ZSBwcm9wZXJ0eS4gSW4gdGhpcyBjYXNlLCBwYXNzIG5vIGFyZ3VtZW50cy4gSXQgc2hvdWxkIGFsc28gYmVcbiAgICogY2FsbGVkIHdoZW4gbWFudWFsbHkgaW1wbGVtZW50aW5nIGEgcHJvcGVydHkgc2V0dGVyLiBJbiB0aGlzIGNhc2UsIHBhc3MgdGhlXG4gICAqIHByb3BlcnR5IGBuYW1lYCBhbmQgYG9sZFZhbHVlYCB0byBlbnN1cmUgdGhhdCBhbnkgY29uZmlndXJlZCBwcm9wZXJ0eVxuICAgKiBvcHRpb25zIGFyZSBob25vcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHJlcXVlc3RpbmcgcHJvcGVydHlcbiAgICogQHBhcmFtIG9sZFZhbHVlIG9sZCB2YWx1ZSBvZiByZXF1ZXN0aW5nIHByb3BlcnR5XG4gICAqIEBwYXJhbSBvcHRpb25zIHByb3BlcnR5IG9wdGlvbnMgdG8gdXNlIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzbHlcbiAgICogICAgIGNvbmZpZ3VyZWQgb3B0aW9uc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcmVxdWVzdFVwZGF0ZShcbiAgICBuYW1lPzogUHJvcGVydHlLZXksXG4gICAgb2xkVmFsdWU/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBQcm9wZXJ0eURlY2xhcmF0aW9uXG4gICk6IHZvaWQge1xuICAgIC8vIElmIHdlIGhhdmUgYSBwcm9wZXJ0eSBrZXksIHBlcmZvcm0gcHJvcGVydHkgdXBkYXRlIHN0ZXBzLlxuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChERVZfTU9ERSAmJiAobmFtZSBhcyB1bmtub3duKSBpbnN0YW5jZW9mIEV2ZW50KSB7XG4gICAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgICBgYCxcbiAgICAgICAgICBgVGhlIHJlcXVlc3RVcGRhdGUoKSBtZXRob2Qgd2FzIGNhbGxlZCB3aXRoIGFuIEV2ZW50IGFzIHRoZSBwcm9wZXJ0eSBuYW1lLiBUaGlzIGlzIHByb2JhYmx5IGEgbWlzdGFrZSBjYXVzZWQgYnkgYmluZGluZyB0aGlzLnJlcXVlc3RVcGRhdGUgYXMgYW4gZXZlbnQgbGlzdGVuZXIuIEluc3RlYWQgYmluZCBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBjYWxsIGl0IHdpdGggbm8gYXJndW1lbnRzOiAoKSA9PiB0aGlzLnJlcXVlc3RVcGRhdGUoKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXNbbmFtZSBhcyBrZXlvZiB0aGlzXTtcbiAgICAgIG9wdGlvbnMgPz89IGN0b3IuZ2V0UHJvcGVydHlPcHRpb25zKG5hbWUpO1xuICAgICAgY29uc3QgY2hhbmdlZCA9XG4gICAgICAgIChvcHRpb25zLmhhc0NoYW5nZWQgPz8gbm90RXF1YWwpKG5ld1ZhbHVlLCBvbGRWYWx1ZSkgfHxcbiAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBubyBjaGFuZ2UsIGNoZWNrIGEgY29ybmVyIGNhc2UgdGhhdCBjYW4gb2NjdXIgd2hlblxuICAgICAgICAvLyAxLiB0aGVyZSdzIGEgaW5pdGlhbCB2YWx1ZSB3aGljaCB3YXMgbm90IHJlZmxlY3RlZFxuICAgICAgICAvLyAyLiB0aGUgcHJvcGVydHkgaXMgc3Vic2VxdWVudGx5IHNldCB0byB0aGlzIHZhbHVlLlxuICAgICAgICAvLyBGb3IgZXhhbXBsZSwgYHByb3A6IHt1c2VEZWZhdWx0OiB0cnVlLCByZWZsZWN0OiB0cnVlfWBcbiAgICAgICAgLy8gYW5kIGVsLnByb3AgPSAnZm9vJy4gVGhpcyBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZSBpZiB0aGVcbiAgICAgICAgLy8gYXR0cmlidXRlIGlzIG5vdCBzZXQgYmVjYXVzZSB3ZSB3aWxsIG5vdyByZWZsZWN0IHRoZSBwcm9wZXJ0eSB0byB0aGUgYXR0cmlidXRlLlxuICAgICAgICAob3B0aW9ucy51c2VEZWZhdWx0ICYmXG4gICAgICAgICAgb3B0aW9ucy5yZWZsZWN0ICYmXG4gICAgICAgICAgbmV3VmFsdWUgPT09IHRoaXMuX19kZWZhdWx0VmFsdWVzPy5nZXQobmFtZSkgJiZcbiAgICAgICAgICAhdGhpcy5oYXNBdHRyaWJ1dGUoY3Rvci5fX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShuYW1lLCBvcHRpb25zKSEpKTtcbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIHRoaXMuXyRjaGFuZ2VQcm9wZXJ0eShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBYm9ydCB0aGUgcmVxdWVzdCBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGNoYW5nZWQuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaXNVcGRhdGVQZW5kaW5nID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fX3VwZGF0ZVByb21pc2UgPSB0aGlzLl9fZW5xdWV1ZVVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF8kY2hhbmdlUHJvcGVydHkoXG4gICAgbmFtZTogUHJvcGVydHlLZXksXG4gICAgb2xkVmFsdWU6IHVua25vd24sXG4gICAge3VzZURlZmF1bHQsIHJlZmxlY3QsIHdyYXBwZWR9OiBQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICAgIGluaXRpYWxpemVWYWx1ZT86IHVua25vd25cbiAgKSB7XG4gICAgLy8gUmVjb3JkIGRlZmF1bHQgdmFsdWUgd2hlbiB1c2VEZWZhdWx0IGlzIHVzZWQuIFRoaXMgYWxsb3dzIHVzIHRvXG4gICAgLy8gcmVzdG9yZSB0aGlzIHZhbHVlIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyByZW1vdmVkLlxuICAgIGlmICh1c2VEZWZhdWx0ICYmICEodGhpcy5fX2RlZmF1bHRWYWx1ZXMgPz89IG5ldyBNYXAoKSkuaGFzKG5hbWUpKSB7XG4gICAgICB0aGlzLl9fZGVmYXVsdFZhbHVlcy5zZXQoXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGluaXRpYWxpemVWYWx1ZSA/PyBvbGRWYWx1ZSA/PyB0aGlzW25hbWUgYXMga2V5b2YgdGhpc11cbiAgICAgICk7XG4gICAgICAvLyBpZiB0aGlzIGlzIG5vdCB3cmFwcGluZyBhbiBhY2Nlc3NvciwgaXQgbXVzdCBiZSBhbiBpbml0aWFsIHNldHRpbmdcbiAgICAgIC8vIGFuZCBpbiB0aGlzIGNhc2Ugd2UgZG8gbm90IHdhbnQgdG8gcmVjb3JkIHRoZSBjaGFuZ2Ugb3IgcmVmbGVjdC5cbiAgICAgIGlmICh3cmFwcGVkICE9PSB0cnVlIHx8IGluaXRpYWxpemVWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IENyZWF0ZSBhIGJlbmNobWFyayBvZiBNYXAuaGFzKCkgKyBNYXAuc2V0KFxuICAgIC8vIHZzIGp1c3QgTWFwLnNldCgpXG4gICAgaWYgKCF0aGlzLl8kY2hhbmdlZFByb3BlcnRpZXMuaGFzKG5hbWUpKSB7XG4gICAgICAvLyBPbiB0aGUgaW5pdGlhbCBjaGFuZ2UsIHRoZSBvbGQgdmFsdWUgc2hvdWxkIGJlIGB1bmRlZmluZWRgLCBleGNlcHRcbiAgICAgIC8vIHdpdGggYHVzZURlZmF1bHRgXG4gICAgICBpZiAoIXRoaXMuaGFzVXBkYXRlZCAmJiAhdXNlRGVmYXVsdCkge1xuICAgICAgICBvbGRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcy5zZXQobmFtZSwgb2xkVmFsdWUpO1xuICAgIH1cbiAgICAvLyBBZGQgdG8gcmVmbGVjdGluZyBwcm9wZXJ0aWVzIHNldC5cbiAgICAvLyBOb3RlLCBpdCdzIGltcG9ydGFudCB0aGF0IGV2ZXJ5IGNoYW5nZSBoYXMgYSBjaGFuY2UgdG8gYWRkIHRoZVxuICAgIC8vIHByb3BlcnR5IHRvIGBfX3JlZmxlY3RpbmdQcm9wZXJ0aWVzYC4gVGhpcyBlbnN1cmVzIHNldHRpbmdcbiAgICAvLyBhdHRyaWJ1dGUgKyBwcm9wZXJ0eSByZWZsZWN0cyBjb3JyZWN0bHkuXG4gICAgaWYgKHJlZmxlY3QgPT09IHRydWUgJiYgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSAhPT0gbmFtZSkge1xuICAgICAgKHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydGllcyA/Pz0gbmV3IFNldDxQcm9wZXJ0eUtleT4oKSkuYWRkKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIHRoZSBlbGVtZW50IHRvIGFzeW5jaHJvbm91c2x5IHVwZGF0ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX19lbnF1ZXVlVXBkYXRlKCkge1xuICAgIHRoaXMuaXNVcGRhdGVQZW5kaW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIGFueSBwcmV2aW91cyB1cGRhdGUgaGFzIHJlc29sdmVkIGJlZm9yZSB1cGRhdGluZy5cbiAgICAgIC8vIFRoaXMgYGF3YWl0YCBhbHNvIGVuc3VyZXMgdGhhdCBwcm9wZXJ0eSBjaGFuZ2VzIGFyZSBiYXRjaGVkLlxuICAgICAgYXdhaXQgdGhpcy5fX3VwZGF0ZVByb21pc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gUmVmaXJlIGFueSBwcmV2aW91cyBlcnJvcnMgYXN5bmMgc28gdGhleSBkbyBub3QgZGlzcnVwdCB0aGUgdXBkYXRlXG4gICAgICAvLyBjeWNsZS4gRXJyb3JzIGFyZSByZWZpcmVkIHNvIGRldmVsb3BlcnMgaGF2ZSBhIGNoYW5jZSB0byBvYnNlcnZlXG4gICAgICAvLyB0aGVtLCBhbmQgdGhpcyBjYW4gYmUgZG9uZSBieSBpbXBsZW1lbnRpbmdcbiAgICAgIC8vIGB3aW5kb3cub251bmhhbmRsZWRyZWplY3Rpb25gLlxuICAgICAgUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAvLyBJZiBgc2NoZWR1bGVVcGRhdGVgIHJldHVybnMgYSBQcm9taXNlLCB3ZSBhd2FpdCBpdC4gVGhpcyBpcyBkb25lIHRvXG4gICAgLy8gZW5hYmxlIGNvb3JkaW5hdGluZyB1cGRhdGVzIHdpdGggYSBzY2hlZHVsZXIuIE5vdGUsIHRoZSByZXN1bHQgaXNcbiAgICAvLyBjaGVja2VkIHRvIGF2b2lkIGRlbGF5aW5nIGFuIGFkZGl0aW9uYWwgbWljcm90YXNrIHVubGVzcyB3ZSBuZWVkIHRvLlxuICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgYXdhaXQgcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gIXRoaXMuaXNVcGRhdGVQZW5kaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhbiBlbGVtZW50IHVwZGF0ZS4gWW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjaGFuZ2UgdGhlXG4gICAqIHRpbWluZyBvZiB1cGRhdGVzIGJ5IHJldHVybmluZyBhIFByb21pc2UuIFRoZSB1cGRhdGUgd2lsbCBhd2FpdCB0aGVcbiAgICogcmV0dXJuZWQgUHJvbWlzZSwgYW5kIHlvdSBzaG91bGQgcmVzb2x2ZSB0aGUgUHJvbWlzZSB0byBhbGxvdyB0aGUgdXBkYXRlXG4gICAqIHRvIHByb2NlZWQuIElmIHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4sIGBzdXBlci5zY2hlZHVsZVVwZGF0ZSgpYFxuICAgKiBtdXN0IGJlIGNhbGxlZC5cbiAgICpcbiAgICogRm9yIGluc3RhbmNlLCB0byBzY2hlZHVsZSB1cGRhdGVzIHRvIG9jY3VyIGp1c3QgYmVmb3JlIHRoZSBuZXh0IGZyYW1lOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBvdmVycmlkZSBwcm90ZWN0ZWQgYXN5bmMgc2NoZWR1bGVVcGRhdGUoKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAqICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNvbHZlKCkpKTtcbiAgICogICBzdXBlci5zY2hlZHVsZVVwZGF0ZSgpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHNjaGVkdWxlVXBkYXRlKCk6IHZvaWQgfCBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBlcmZvcm1VcGRhdGUoKTtcbiAgICBpZiAoXG4gICAgICBERVZfTU9ERSAmJlxuICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuZW5hYmxlZFdhcm5pbmdzIS5pbmNsdWRlcyhcbiAgICAgICAgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJ1xuICAgICAgKSAmJlxuICAgICAgdHlwZW9mIChyZXN1bHQgYXMgdW5rbm93biBhcyBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkKT8udGhlbiA9PT1cbiAgICAgICAgJ2Z1bmN0aW9uJ1xuICAgICkge1xuICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAnYXN5bmMtcGVyZm9ybS11cGRhdGUnLFxuICAgICAgICBgRWxlbWVudCAke3RoaXMubG9jYWxOYW1lfSByZXR1cm5lZCBhIFByb21pc2UgZnJvbSBwZXJmb3JtVXBkYXRlKCkuIGAgK1xuICAgICAgICAgIGBUaGlzIGJlaGF2aW9yIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBgICtcbiAgICAgICAgICBgdmVyc2lvbiBvZiBSZWFjdGl2ZUVsZW1lbnQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhbiBlbGVtZW50IHVwZGF0ZS4gTm90ZSwgaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgdGhlXG4gICAqIHVwZGF0ZSwgYGZpcnN0VXBkYXRlZGAgYW5kIGB1cGRhdGVkYCB3aWxsIG5vdCBiZSBjYWxsZWQuXG4gICAqXG4gICAqIENhbGwgYHBlcmZvcm1VcGRhdGUoKWAgdG8gaW1tZWRpYXRlbHkgcHJvY2VzcyBhIHBlbmRpbmcgdXBkYXRlLiBUaGlzIHNob3VsZFxuICAgKiBnZW5lcmFsbHkgbm90IGJlIG5lZWRlZCwgYnV0IGl0IGNhbiBiZSBkb25lIGluIHJhcmUgY2FzZXMgd2hlbiB5b3UgbmVlZCB0b1xuICAgKiB1cGRhdGUgc3luY2hyb25vdXNseS5cbiAgICpcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCBwZXJmb3JtVXBkYXRlKCk6IHZvaWQge1xuICAgIC8vIEFib3J0IGFueSB1cGRhdGUgaWYgb25lIGlzIG5vdCBwZW5kaW5nIHdoZW4gdGhpcyBpcyBjYWxsZWQuXG4gICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIGBwZXJmb3JtVXBkYXRlYCBpcyBjYWxsZWQgZWFybHkgdG8gXCJmbHVzaFwiXG4gICAgLy8gdGhlIHVwZGF0ZS5cbiAgICBpZiAoIXRoaXMuaXNVcGRhdGVQZW5kaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRlYnVnTG9nRXZlbnQ/Lih7a2luZDogJ3VwZGF0ZSd9KTtcbiAgICBpZiAoIXRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgLy8gQ3JlYXRlIHJlbmRlclJvb3QgYmVmb3JlIGZpcnN0IHVwZGF0ZS4gVGhpcyBvY2N1cnMgaW4gYGNvbm5lY3RlZENhbGxiYWNrYFxuICAgICAgLy8gYnV0IGlzIGRvbmUgaGVyZSB0byBzdXBwb3J0IG91dCBvZiB0cmVlIGNhbGxzIHRvIGBlbmFibGVVcGRhdGluZ2AvYHBlcmZvcm1VcGRhdGVgLlxuICAgICAgKHRoaXMgYXMgTXV0YWJsZTx0eXBlb2YgdGhpcywgJ3JlbmRlclJvb3QnPikucmVuZGVyUm9vdCA/Pz1cbiAgICAgICAgdGhpcy5jcmVhdGVSZW5kZXJSb290KCk7XG4gICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgLy8gUHJvZHVjZSB3YXJuaW5nIGlmIGFueSByZWFjdGl2ZSBwcm9wZXJ0aWVzIG9uIHRoZSBwcm90b3R5cGUgYXJlXG4gICAgICAgIC8vIHNoYWRvd2VkIGJ5IGNsYXNzIGZpZWxkcy4gSW5zdGFuY2UgZmllbGRzIHNldCBiZWZvcmUgdXBncmFkZSBhcmVcbiAgICAgICAgLy8gZGVsZXRlZCBieSB0aGlzIHBvaW50LCBzbyBhbnkgb3duIHByb3BlcnR5IGlzIGNhdXNlZCBieSBjbGFzcyBmaWVsZFxuICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgIGNvbnN0IGN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHNoYWRvd2VkUHJvcGVydGllcyA9IFsuLi5jdG9yLmVsZW1lbnRQcm9wZXJ0aWVzLmtleXMoKV0uZmlsdGVyKFxuICAgICAgICAgIChwKSA9PiB0aGlzLmhhc093blByb3BlcnR5KHApICYmIHAgaW4gZ2V0UHJvdG90eXBlT2YodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHNoYWRvd2VkUHJvcGVydGllcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG9uIGVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0gd2lsbCBub3QgYCArXG4gICAgICAgICAgICAgIGB0cmlnZ2VyIHVwZGF0ZXMgYXMgZXhwZWN0ZWQgYmVjYXVzZSB0aGV5IGFyZSBzZXQgdXNpbmcgY2xhc3MgYCArXG4gICAgICAgICAgICAgIGBmaWVsZHM6ICR7c2hhZG93ZWRQcm9wZXJ0aWVzLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgICAgICAgYE5hdGl2ZSBjbGFzcyBmaWVsZHMgYW5kIHNvbWUgY29tcGlsZWQgb3V0cHV0IHdpbGwgb3ZlcndyaXRlIGAgK1xuICAgICAgICAgICAgICBgYWNjZXNzb3JzIHVzZWQgZm9yIGRldGVjdGluZyBjaGFuZ2VzLiBTZWUgYCArXG4gICAgICAgICAgICAgIGBodHRwczovL2xpdC5kZXYvbXNnL2NsYXNzLWZpZWxkLXNoYWRvd2luZyBgICtcbiAgICAgICAgICAgICAgYGZvciBtb3JlIGluZm9ybWF0aW9uLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBNaXhpbiBpbnN0YW5jZSBwcm9wZXJ0aWVzIG9uY2UsIGlmIHRoZXkgZXhpc3QuXG4gICAgICBpZiAodGhpcy5fX2luc3RhbmNlUHJvcGVydGllcykge1xuICAgICAgICAvLyBUT0RPIChqdXN0aW5mYWduYW5pKTogc2hvdWxkIHdlIHVzZSB0aGUgc3RvcmVkIHZhbHVlPyBDb3VsZCBhIG5ldyB2YWx1ZVxuICAgICAgICAvLyBoYXZlIGJlZW4gc2V0IHNpbmNlIHdlIHN0b3JlZCB0aGUgb3duIHByb3BlcnR5IHZhbHVlP1xuICAgICAgICBmb3IgKGNvbnN0IFtwLCB2YWx1ZV0gb2YgdGhpcy5fX2luc3RhbmNlUHJvcGVydGllcykge1xuICAgICAgICAgIHRoaXNbcCBhcyBrZXlvZiB0aGlzXSA9IHZhbHVlIGFzIHRoaXNba2V5b2YgdGhpc107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fX2luc3RhbmNlUHJvcGVydGllcyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIC8vIFRyaWdnZXIgaW5pdGlhbCB2YWx1ZSByZWZsZWN0aW9uIGFuZCBwb3B1bGF0ZSB0aGUgaW5pdGlhbFxuICAgICAgLy8gYGNoYW5nZWRQcm9wZXJ0aWVzYCBtYXAsIGJ1dCBvbmx5IGZvciB0aGUgY2FzZSBvZiBwcm9wZXJ0aWVzIGNyZWF0ZWRcbiAgICAgIC8vIHZpYSBgY3JlYXRlUHJvcGVydHlgIG9uIGFjY2Vzc29ycywgd2hpY2ggd2lsbCBub3QgaGF2ZSBhbHJlYWR5XG4gICAgICAvLyBwb3B1bGF0ZWQgdGhlIGBjaGFuZ2VkUHJvcGVydGllc2AgbWFwIHNpbmNlIHRoZXkgYXJlIG5vdCBzZXQuXG4gICAgICAvLyBXZSBjYW4ndCBrbm93IGlmIHRoZXNlIGFjY2Vzc29ycyBoYWQgaW5pdGlhbGl6ZXJzLCBzbyB3ZSBqdXN0IHNldFxuICAgICAgLy8gdGhlbSBhbnl3YXkgLSBhIGRpZmZlcmVuY2UgZnJvbSBleHBlcmltZW50YWwgZGVjb3JhdG9ycyBvbiBmaWVsZHMgYW5kXG4gICAgICAvLyBzdGFuZGFyZCBkZWNvcmF0b3JzIG9uIGF1dG8tYWNjZXNzb3JzLlxuICAgICAgLy8gRm9yIGNvbnRleHQgc2VlOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvcHVsbC80MTgzI2lzc3VlY29tbWVudC0xNzExOTU5NjM1XG4gICAgICBjb25zdCBlbGVtZW50UHJvcGVydGllcyA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpXG4gICAgICAgIC5lbGVtZW50UHJvcGVydGllcztcbiAgICAgIGlmIChlbGVtZW50UHJvcGVydGllcy5zaXplID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtwLCBvcHRpb25zXSBvZiBlbGVtZW50UHJvcGVydGllcykge1xuICAgICAgICAgIGNvbnN0IHt3cmFwcGVkfSA9IG9wdGlvbnM7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW3AgYXMga2V5b2YgdGhpc107XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgd3JhcHBlZCA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgIXRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcy5oYXMocCkgJiZcbiAgICAgICAgICAgIHZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuXyRjaGFuZ2VQcm9wZXJ0eShwLCB1bmRlZmluZWQsIG9wdGlvbnMsIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IHNob3VsZFVwZGF0ZSA9IGZhbHNlO1xuICAgIGNvbnN0IGNoYW5nZWRQcm9wZXJ0aWVzID0gdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzO1xuICAgIHRyeSB7XG4gICAgICBzaG91bGRVcGRhdGUgPSB0aGlzLnNob3VsZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgIHRoaXMud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0VXBkYXRlPy4oKSk7XG4gICAgICAgIHRoaXMudXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX19tYXJrVXBkYXRlZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFByZXZlbnQgYGZpcnN0VXBkYXRlZGAgYW5kIGB1cGRhdGVkYCBmcm9tIHJ1bm5pbmcgd2hlbiB0aGVyZSdzIGFuXG4gICAgICAvLyB1cGRhdGUgZXhjZXB0aW9uLlxuICAgICAgc2hvdWxkVXBkYXRlID0gZmFsc2U7XG4gICAgICAvLyBFbnN1cmUgZWxlbWVudCBjYW4gYWNjZXB0IGFkZGl0aW9uYWwgdXBkYXRlcyBhZnRlciBhbiBleGNlcHRpb24uXG4gICAgICB0aGlzLl9fbWFya1VwZGF0ZWQoKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIC8vIFRoZSB1cGRhdGUgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgcGVuZGluZyBhbmQgZnVydGhlciB1cGRhdGVzIGFyZSBub3cgYWxsb3dlZC5cbiAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICB0aGlzLl8kZGlkVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlZCBiZWZvcmUgYHVwZGF0ZSgpYCB0byBjb21wdXRlIHZhbHVlcyBuZWVkZWQgZHVyaW5nIHRoZSB1cGRhdGUuXG4gICAqXG4gICAqIEltcGxlbWVudCBgd2lsbFVwZGF0ZWAgdG8gY29tcHV0ZSBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBkZXBlbmQgb24gb3RoZXJcbiAgICogcHJvcGVydGllcyBhbmQgYXJlIHVzZWQgaW4gdGhlIHJlc3Qgb2YgdGhlIHVwZGF0ZSBwcm9jZXNzLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKSB7XG4gICAqICAgLy8gb25seSBuZWVkIHRvIGNoZWNrIGNoYW5nZWQgcHJvcGVydGllcyBmb3IgYW4gZXhwZW5zaXZlIGNvbXB1dGF0aW9uLlxuICAgKiAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2ZpcnN0TmFtZScpIHx8IGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbGFzdE5hbWUnKSkge1xuICAgKiAgICAgdGhpcy5zaGEgPSBjb21wdXRlU0hBKGAke3RoaXMuZmlyc3ROYW1lfSAke3RoaXMubGFzdE5hbWV9YCk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIHJlbmRlcigpIHtcbiAgICogICByZXR1cm4gaHRtbGBTSEE6ICR7dGhpcy5zaGF9YDtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCB3aWxsVXBkYXRlKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpOiB2b2lkIHt9XG5cbiAgLy8gTm90ZSwgdGhpcyBpcyBhbiBvdmVycmlkZSBwb2ludCBmb3IgcG9seWZpbGwtc3VwcG9ydC5cbiAgLy8gQGludGVybmFsXG4gIF8kZGlkVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcykge1xuICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0VXBkYXRlZD8uKCkpO1xuICAgIGlmICghdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICB0aGlzLmhhc1VwZGF0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIGlmIChcbiAgICAgIERFVl9NT0RFICYmXG4gICAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyAmJlxuICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuZW5hYmxlZFdhcm5pbmdzIS5pbmNsdWRlcyhcbiAgICAgICAgJ2NoYW5nZS1pbi11cGRhdGUnXG4gICAgICApXG4gICAgKSB7XG4gICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICdjaGFuZ2UtaW4tdXBkYXRlJyxcbiAgICAgICAgYEVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0gc2NoZWR1bGVkIGFuIHVwZGF0ZSBgICtcbiAgICAgICAgICBgKGdlbmVyYWxseSBiZWNhdXNlIGEgcHJvcGVydHkgd2FzIHNldCkgYCArXG4gICAgICAgICAgYGFmdGVyIGFuIHVwZGF0ZSBjb21wbGV0ZWQsIGNhdXNpbmcgYSBuZXcgdXBkYXRlIHRvIGJlIHNjaGVkdWxlZC4gYCArXG4gICAgICAgICAgYFRoaXMgaXMgaW5lZmZpY2llbnQgYW5kIHNob3VsZCBiZSBhdm9pZGVkIHVubGVzcyB0aGUgbmV4dCB1cGRhdGUgYCArXG4gICAgICAgICAgYGNhbiBvbmx5IGJlIHNjaGVkdWxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBwcmV2aW91cyB1cGRhdGUuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9fbWFya1VwZGF0ZWQoKSB7XG4gICAgdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuaXNVcGRhdGVQZW5kaW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IGhhcyBjb21wbGV0ZWQgdXBkYXRpbmcuXG4gICAqIFRoZSBQcm9taXNlIHZhbHVlIGlzIGEgYm9vbGVhbiB0aGF0IGlzIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBjb21wbGV0ZWQgdGhlXG4gICAqIHVwZGF0ZSB3aXRob3V0IHRyaWdnZXJpbmcgYW5vdGhlciB1cGRhdGUuIFRoZSBQcm9taXNlIHJlc3VsdCBpcyBgZmFsc2VgIGlmXG4gICAqIGEgcHJvcGVydHkgd2FzIHNldCBpbnNpZGUgYHVwZGF0ZWQoKWAuIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBhblxuICAgKiBleGNlcHRpb24gd2FzIHRocm93biBkdXJpbmcgdGhlIHVwZGF0ZS5cbiAgICpcbiAgICogVG8gYXdhaXQgYWRkaXRpb25hbCBhc3luY2hyb25vdXMgd29yaywgb3ZlcnJpZGUgdGhlIGBnZXRVcGRhdGVDb21wbGV0ZWBcbiAgICogbWV0aG9kLiBGb3IgZXhhbXBsZSwgaXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBhd2FpdCBhIHJlbmRlcmVkIGVsZW1lbnRcbiAgICogYmVmb3JlIGZ1bGZpbGxpbmcgdGhpcyBQcm9taXNlLiBUbyBkbyB0aGlzLCBmaXJzdCBhd2FpdFxuICAgKiBgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKWAsIHRoZW4gYW55IHN1YnNlcXVlbnQgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHVwZGF0ZSBjb21wbGV0ZWRcbiAgICogICAgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbm90aGVyIHVwZGF0ZS5cbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIGdldCB1cGRhdGVDb21wbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVDb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHBvaW50IGZvciB0aGUgYHVwZGF0ZUNvbXBsZXRlYCBwcm9taXNlLlxuICAgKlxuICAgKiBJdCBpcyBub3Qgc2FmZSB0byBvdmVycmlkZSB0aGUgYHVwZGF0ZUNvbXBsZXRlYCBnZXR0ZXIgZGlyZWN0bHkgZHVlIHRvIGFcbiAgICogbGltaXRhdGlvbiBpbiBUeXBlU2NyaXB0IHdoaWNoIG1lYW5zIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYWxsIGFcbiAgICogc3VwZXJjbGFzcyBnZXR0ZXIgKGUuZy4gYHN1cGVyLnVwZGF0ZUNvbXBsZXRlLnRoZW4oLi4uKWApIHdoZW4gdGhlIHRhcmdldFxuICAgKiBsYW5ndWFnZSBpcyBFUzUgKGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzM4KS5cbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW5zdGVhZC4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICAgKiAgIG92ZXJyaWRlIGFzeW5jIGdldFVwZGF0ZUNvbXBsZXRlKCkge1xuICAgKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKTtcbiAgICogICAgIGF3YWl0IHRoaXMuX215Q2hpbGQudXBkYXRlQ29tcGxldGU7XG4gICAqICAgICByZXR1cm4gcmVzdWx0O1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQHJldHVybiBBIHByb21pc2Ugb2YgYSBib29sZWFuIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgdXBkYXRlIGNvbXBsZXRlZFxuICAgKiAgICAgd2l0aG91dCB0cmlnZ2VyaW5nIGFub3RoZXIgdXBkYXRlLlxuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldFVwZGF0ZUNvbXBsZXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9fdXBkYXRlUHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCBgdXBkYXRlKClgIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCByZXF1ZXN0c1xuICAgKiBhbiB1cGRhdGUuIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGB0cnVlYCwgYnV0IHRoaXMgY2FuIGJlXG4gICAqIGN1c3RvbWl6ZWQgdG8gY29udHJvbCB3aGVuIHRvIHVwZGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHNob3VsZFVwZGF0ZShfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZWxlbWVudC4gVGhpcyBtZXRob2QgcmVmbGVjdHMgcHJvcGVydHkgdmFsdWVzIHRvIGF0dHJpYnV0ZXMuXG4gICAqIEl0IGNhbiBiZSBvdmVycmlkZGVuIHRvIHJlbmRlciBhbmQga2VlcCB1cGRhdGVkIGVsZW1lbnQgRE9NLlxuICAgKiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgKm5vdCogdHJpZ2dlclxuICAgKiBhbm90aGVyIHVwZGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZShfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKSB7XG4gICAgLy8gVGhlIGZvckVhY2goKSBleHByZXNzaW9uIHdpbGwgb25seSBydW4gd2hlbiBfX3JlZmxlY3RpbmdQcm9wZXJ0aWVzIGlzXG4gICAgLy8gZGVmaW5lZCwgYW5kIGl0IHJldHVybnMgdW5kZWZpbmVkLCBzZXR0aW5nIF9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgdG9cbiAgICAvLyB1bmRlZmluZWRcbiAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgJiY9IHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydGllcy5mb3JFYWNoKChwKSA9PlxuICAgICAgdGhpcy5fX3Byb3BlcnR5VG9BdHRyaWJ1dGUocCwgdGhpc1twIGFzIGtleW9mIHRoaXNdKVxuICAgICkgYXMgdW5kZWZpbmVkO1xuICAgIHRoaXMuX19tYXJrVXBkYXRlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbmV2ZXIgdGhlIGVsZW1lbnQgaXMgdXBkYXRlZC4gSW1wbGVtZW50IHRvIHBlcmZvcm1cbiAgICogcG9zdC11cGRhdGluZyB0YXNrcyB2aWEgRE9NIEFQSXMsIGZvciBleGFtcGxlLCBmb2N1c2luZyBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB0aGUgZWxlbWVudCB0byB1cGRhdGVcbiAgICogYWdhaW4gYWZ0ZXIgdGhpcyB1cGRhdGUgY3ljbGUgY29tcGxldGVzLlxuICAgKlxuICAgKiBAcGFyYW0gX2NoYW5nZWRQcm9wZXJ0aWVzIE1hcCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgd2l0aCBvbGQgdmFsdWVzXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKSB7fVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGVsZW1lbnQgaXMgZmlyc3QgdXBkYXRlZC4gSW1wbGVtZW50IHRvIHBlcmZvcm0gb25lIHRpbWVcbiAgICogd29yayBvbiB0aGUgZWxlbWVudCBhZnRlciB1cGRhdGUuXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGZpcnN0VXBkYXRlZCgpIHtcbiAgICogICB0aGlzLnJlbmRlclJvb3QuZ2V0RWxlbWVudEJ5SWQoJ215LXRleHQtYXJlYScpLmZvY3VzKCk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFNldHRpbmcgcHJvcGVydGllcyBpbnNpZGUgdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHRoZSBlbGVtZW50IHRvIHVwZGF0ZVxuICAgKiBhZ2FpbiBhZnRlciB0aGlzIHVwZGF0ZSBjeWNsZSBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBfY2hhbmdlZFByb3BlcnRpZXMgTWFwIG9mIGNoYW5nZWQgcHJvcGVydGllcyB3aXRoIG9sZCB2YWx1ZXNcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcykge31cbn1cbi8vIEFzc2lnbmVkIGhlcmUgdG8gd29yayBhcm91bmQgYSBqc2NvbXBpbGVyIGJ1ZyB3aXRoIHN0YXRpYyBmaWVsZHNcbi8vIHdoZW4gY29tcGlsaW5nIHRvIEVTNS5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1jb21waWxlci9pc3N1ZXMvMzE3N1xuKFJlYWN0aXZlRWxlbWVudCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtcbiAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnZWxlbWVudFByb3BlcnRpZXMnLCBSZWFjdGl2ZUVsZW1lbnQpXG5dID0gbmV3IE1hcCgpO1xuKFJlYWN0aXZlRWxlbWVudCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtcbiAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnZmluYWxpemVkJywgUmVhY3RpdmVFbGVtZW50KVxuXSA9IG5ldyBNYXAoKTtcblxuLy8gQXBwbHkgcG9seWZpbGxzIGlmIGF2YWlsYWJsZVxucG9seWZpbGxTdXBwb3J0Py4oe1JlYWN0aXZlRWxlbWVudH0pO1xuXG4vLyBEZXYgbW9kZSB3YXJuaW5ncy4uLlxuaWYgKERFVl9NT0RFKSB7XG4gIC8vIERlZmF1bHQgd2FybmluZyBzZXQuXG4gIFJlYWN0aXZlRWxlbWVudC5lbmFibGVkV2FybmluZ3MgPSBbXG4gICAgJ2NoYW5nZS1pbi11cGRhdGUnLFxuICAgICdhc3luYy1wZXJmb3JtLXVwZGF0ZScsXG4gIF07XG4gIGNvbnN0IGVuc3VyZU93bldhcm5pbmdzID0gZnVuY3Rpb24gKGN0b3I6IHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpIHtcbiAgICBpZiAoXG4gICAgICAhY3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdlbmFibGVkV2FybmluZ3MnLCBjdG9yKSlcbiAgICApIHtcbiAgICAgIGN0b3IuZW5hYmxlZFdhcm5pbmdzID0gY3Rvci5lbmFibGVkV2FybmluZ3MhLnNsaWNlKCk7XG4gICAgfVxuICB9O1xuICBSZWFjdGl2ZUVsZW1lbnQuZW5hYmxlV2FybmluZyA9IGZ1bmN0aW9uIChcbiAgICB0aGlzOiB0eXBlb2YgUmVhY3RpdmVFbGVtZW50LFxuICAgIHdhcm5pbmc6IFdhcm5pbmdLaW5kXG4gICkge1xuICAgIGVuc3VyZU93bldhcm5pbmdzKHRoaXMpO1xuICAgIGlmICghdGhpcy5lbmFibGVkV2FybmluZ3MhLmluY2x1ZGVzKHdhcm5pbmcpKSB7XG4gICAgICB0aGlzLmVuYWJsZWRXYXJuaW5ncyEucHVzaCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG4gIFJlYWN0aXZlRWxlbWVudC5kaXNhYmxlV2FybmluZyA9IGZ1bmN0aW9uIChcbiAgICB0aGlzOiB0eXBlb2YgUmVhY3RpdmVFbGVtZW50LFxuICAgIHdhcm5pbmc6IFdhcm5pbmdLaW5kXG4gICkge1xuICAgIGVuc3VyZU93bldhcm5pbmdzKHRoaXMpO1xuICAgIGNvbnN0IGkgPSB0aGlzLmVuYWJsZWRXYXJuaW5ncyEuaW5kZXhPZih3YXJuaW5nKTtcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICB0aGlzLmVuYWJsZWRXYXJuaW5ncyEuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfTtcbn1cblxuLy8gSU1QT1JUQU5UOiBkbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0eSBuYW1lIG9yIHRoZSBhc3NpZ25tZW50IGV4cHJlc3Npb24uXG4vLyBUaGlzIGxpbmUgd2lsbCBiZSB1c2VkIGluIHJlZ2V4ZXMgdG8gc2VhcmNoIGZvciBSZWFjdGl2ZUVsZW1lbnQgdXNhZ2UuXG4oZ2xvYmFsLnJlYWN0aXZlRWxlbWVudFZlcnNpb25zID8/PSBbXSkucHVzaCgnMi4xLjAnKTtcbmlmIChERVZfTU9ERSAmJiBnbG9iYWwucmVhY3RpdmVFbGVtZW50VmVyc2lvbnMubGVuZ3RoID4gMSkge1xuICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgaXNzdWVXYXJuaW5nIShcbiAgICAgICdtdWx0aXBsZS12ZXJzaW9ucycsXG4gICAgICBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBgICtcbiAgICAgICAgYGlzIG5vdCByZWNvbW1lbmRlZC5gXG4gICAgKTtcbiAgfSk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbi8vIElNUE9SVEFOVDogdGhlc2UgaW1wb3J0cyBtdXN0IGJlIHR5cGUtb25seVxuaW1wb3J0IHR5cGUge0RpcmVjdGl2ZSwgRGlyZWN0aXZlUmVzdWx0LCBQYXJ0SW5mb30gZnJvbSAnLi9kaXJlY3RpdmUuanMnO1xuaW1wb3J0IHR5cGUge1RydXN0ZWRIVE1MLCBUcnVzdGVkVHlwZXNXaW5kb3d9IGZyb20gJ3RydXN0ZWQtdHlwZXMvbGliL2luZGV4LmpzJztcblxuY29uc3QgREVWX01PREUgPSB0cnVlO1xuY29uc3QgRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTID0gdHJ1ZTtcbmNvbnN0IEVOQUJMRV9TSEFEWURPTV9OT1BBVENIID0gdHJ1ZTtcbmNvbnN0IE5PREVfTU9ERSA9IGZhbHNlO1xuXG4vLyBBbGxvd3MgbWluaWZpZXJzIHRvIHJlbmFtZSByZWZlcmVuY2VzIHRvIGdsb2JhbFRoaXNcbmNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXM7XG5cbi8qKlxuICogQ29udGFpbnMgdHlwZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgdW5zdGFibGUgZGVidWcgQVBJLlxuICpcbiAqIEV2ZXJ5dGhpbmcgaW4gdGhpcyBBUEkgaXMgbm90IHN0YWJsZSBhbmQgbWF5IGNoYW5nZSBvciBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUsXG4gKiBldmVuIG9uIHBhdGNoIHJlbGVhc2VzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVxuZXhwb3J0IG5hbWVzcGFjZSBMaXRVbnN0YWJsZSB7XG4gIC8qKlxuICAgKiBXaGVuIExpdCBpcyBydW5uaW5nIGluIGRldiBtb2RlIGFuZCBgd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50c2AgaXMgdHJ1ZSxcbiAgICogd2Ugd2lsbCBlbWl0ICdsaXQtZGVidWcnIGV2ZW50cyB0byB3aW5kb3csIHdpdGggbGl2ZSBkZXRhaWxzIGFib3V0IHRoZSB1cGRhdGUgYW5kIHJlbmRlclxuICAgKiBsaWZlY3ljbGUuIFRoZXNlIGNhbiBiZSB1c2VmdWwgZm9yIHdyaXRpbmcgZGVidWcgdG9vbGluZyBhbmQgdmlzdWFsaXphdGlvbnMuXG4gICAqXG4gICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHJ1bm5pbmcgd2l0aCB3aW5kb3cuZW1pdExpdERlYnVnTG9nRXZlbnRzIGhhcyBwZXJmb3JtYW5jZSBvdmVyaGVhZCxcbiAgICogbWFraW5nIGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3JtYWxseSB2ZXJ5IGNoZWFwIChsaWtlIGEgbm8tb3AgcmVuZGVyKSBtdWNoIHNsb3dlcixcbiAgICogYmVjYXVzZSB3ZSBtdXN0IGNvcHkgZGF0YSBhbmQgZGlzcGF0Y2ggZXZlbnRzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbiAgZXhwb3J0IG5hbWVzcGFjZSBEZWJ1Z0xvZyB7XG4gICAgZXhwb3J0IHR5cGUgRW50cnkgPVxuICAgICAgfCBUZW1wbGF0ZVByZXBcbiAgICAgIHwgVGVtcGxhdGVJbnN0YW50aWF0ZWRcbiAgICAgIHwgVGVtcGxhdGVJbnN0YW50aWF0ZWRBbmRVcGRhdGVkXG4gICAgICB8IFRlbXBsYXRlVXBkYXRpbmdcbiAgICAgIHwgQmVnaW5SZW5kZXJcbiAgICAgIHwgRW5kUmVuZGVyXG4gICAgICB8IENvbW1pdFBhcnRFbnRyeVxuICAgICAgfCBTZXRQYXJ0VmFsdWU7XG4gICAgZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZVByZXAge1xuICAgICAga2luZDogJ3RlbXBsYXRlIHByZXAnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlO1xuICAgICAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXk7XG4gICAgICBjbG9uYWJsZVRlbXBsYXRlOiBIVE1MVGVtcGxhdGVFbGVtZW50O1xuICAgICAgcGFydHM6IFRlbXBsYXRlUGFydFtdO1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIEJlZ2luUmVuZGVyIHtcbiAgICAgIGtpbmQ6ICdiZWdpbiByZW5kZXInO1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgcGFydDogQ2hpbGRQYXJ0IHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIEVuZFJlbmRlciB7XG4gICAgICBraW5kOiAnZW5kIHJlbmRlcic7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgICBwYXJ0OiBDaGlsZFBhcnQ7XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVJbnN0YW50aWF0ZWQge1xuICAgICAga2luZDogJ3RlbXBsYXRlIGluc3RhbnRpYXRlZCc7XG4gICAgICB0ZW1wbGF0ZTogVGVtcGxhdGUgfCBDb21waWxlZFRlbXBsYXRlO1xuICAgICAgaW5zdGFuY2U6IFRlbXBsYXRlSW5zdGFuY2U7XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgZnJhZ21lbnQ6IE5vZGU7XG4gICAgICBwYXJ0czogQXJyYXk8UGFydCB8IHVuZGVmaW5lZD47XG4gICAgICB2YWx1ZXM6IHVua25vd25bXTtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZUluc3RhbnRpYXRlZEFuZFVwZGF0ZWQge1xuICAgICAga2luZDogJ3RlbXBsYXRlIGluc3RhbnRpYXRlZCBhbmQgdXBkYXRlZCc7XG4gICAgICB0ZW1wbGF0ZTogVGVtcGxhdGUgfCBDb21waWxlZFRlbXBsYXRlO1xuICAgICAgaW5zdGFuY2U6IFRlbXBsYXRlSW5zdGFuY2U7XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgZnJhZ21lbnQ6IE5vZGU7XG4gICAgICBwYXJ0czogQXJyYXk8UGFydCB8IHVuZGVmaW5lZD47XG4gICAgICB2YWx1ZXM6IHVua25vd25bXTtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZVVwZGF0aW5nIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSB1cGRhdGluZyc7XG4gICAgICB0ZW1wbGF0ZTogVGVtcGxhdGUgfCBDb21waWxlZFRlbXBsYXRlO1xuICAgICAgaW5zdGFuY2U6IFRlbXBsYXRlSW5zdGFuY2U7XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgcGFydHM6IEFycmF5PFBhcnQgfCB1bmRlZmluZWQ+O1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgU2V0UGFydFZhbHVlIHtcbiAgICAgIGtpbmQ6ICdzZXQgcGFydCc7XG4gICAgICBwYXJ0OiBQYXJ0O1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgICB2YWx1ZUluZGV4OiBudW1iZXI7XG4gICAgICB2YWx1ZXM6IHVua25vd25bXTtcbiAgICAgIHRlbXBsYXRlSW5zdGFuY2U6IFRlbXBsYXRlSW5zdGFuY2U7XG4gICAgfVxuXG4gICAgZXhwb3J0IHR5cGUgQ29tbWl0UGFydEVudHJ5ID1cbiAgICAgIHwgQ29tbWl0Tm90aGluZ1RvQ2hpbGRFbnRyeVxuICAgICAgfCBDb21taXRUZXh0XG4gICAgICB8IENvbW1pdE5vZGVcbiAgICAgIHwgQ29tbWl0QXR0cmlidXRlXG4gICAgICB8IENvbW1pdFByb3BlcnR5XG4gICAgICB8IENvbW1pdEJvb2xlYW5BdHRyaWJ1dGVcbiAgICAgIHwgQ29tbWl0RXZlbnRMaXN0ZW5lclxuICAgICAgfCBDb21taXRUb0VsZW1lbnRCaW5kaW5nO1xuXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb21taXROb3RoaW5nVG9DaGlsZEVudHJ5IHtcbiAgICAgIGtpbmQ6ICdjb21taXQgbm90aGluZyB0byBjaGlsZCc7XG4gICAgICBzdGFydDogQ2hpbGROb2RlO1xuICAgICAgZW5kOiBDaGlsZE5vZGUgfCBudWxsO1xuICAgICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSB8IHVuZGVmaW5lZDtcbiAgICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb21taXRUZXh0IHtcbiAgICAgIGtpbmQ6ICdjb21taXQgdGV4dCc7XG4gICAgICBub2RlOiBUZXh0O1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0Tm9kZSB7XG4gICAgICBraW5kOiAnY29tbWl0IG5vZGUnO1xuICAgICAgc3RhcnQ6IE5vZGU7XG4gICAgICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlIHwgdW5kZWZpbmVkO1xuICAgICAgdmFsdWU6IE5vZGU7XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0QXR0cmlidXRlIHtcbiAgICAgIGtpbmQ6ICdjb21taXQgYXR0cmlidXRlJztcbiAgICAgIGVsZW1lbnQ6IEVsZW1lbnQ7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICB2YWx1ZTogdW5rbm93bjtcbiAgICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb21taXRQcm9wZXJ0eSB7XG4gICAgICBraW5kOiAnY29tbWl0IHByb3BlcnR5JztcbiAgICAgIGVsZW1lbnQ6IEVsZW1lbnQ7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICB2YWx1ZTogdW5rbm93bjtcbiAgICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb21taXRCb29sZWFuQXR0cmlidXRlIHtcbiAgICAgIGtpbmQ6ICdjb21taXQgYm9vbGVhbiBhdHRyaWJ1dGUnO1xuICAgICAgZWxlbWVudDogRWxlbWVudDtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIHZhbHVlOiBib29sZWFuO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdEV2ZW50TGlzdGVuZXIge1xuICAgICAga2luZDogJ2NvbW1pdCBldmVudCBsaXN0ZW5lcic7XG4gICAgICBlbGVtZW50OiBFbGVtZW50O1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgICBvbGRMaXN0ZW5lcjogdW5rbm93bjtcbiAgICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgICAvLyBUcnVlIGlmIHdlJ3JlIHJlbW92aW5nIHRoZSBvbGQgZXZlbnQgbGlzdGVuZXIgKGUuZy4gYmVjYXVzZSBzZXR0aW5ncyBjaGFuZ2VkLCBvciB2YWx1ZSBpcyBub3RoaW5nKVxuICAgICAgcmVtb3ZlTGlzdGVuZXI6IGJvb2xlYW47XG4gICAgICAvLyBUcnVlIGlmIHdlJ3JlIGFkZGluZyBhIG5ldyBldmVudCBsaXN0ZW5lciAoZS5nLiBiZWNhdXNlIGZpcnN0IHJlbmRlciwgb3Igc2V0dGluZ3MgY2hhbmdlZClcbiAgICAgIGFkZExpc3RlbmVyOiBib29sZWFuO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0VG9FbGVtZW50QmluZGluZyB7XG4gICAgICBraW5kOiAnY29tbWl0IHRvIGVsZW1lbnQgYmluZGluZyc7XG4gICAgICBlbGVtZW50OiBFbGVtZW50O1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgRGVidWdMb2dnaW5nV2luZG93IHtcbiAgLy8gRXZlbiBpbiBkZXYgbW9kZSwgd2UgZ2VuZXJhbGx5IGRvbid0IHdhbnQgdG8gZW1pdCB0aGVzZSBldmVudHMsIGFzIHRoYXQnc1xuICAvLyBhbm90aGVyIGxldmVsIG9mIGNvc3QsIHNvIG9ubHkgZW1pdCB0aGVtIHdoZW4gREVWX01PREUgaXMgdHJ1ZSBfYW5kXyB3aGVuXG4gIC8vIHdpbmRvdy5lbWl0TGl0RGVidWdFdmVudHMgaXMgdHJ1ZS5cbiAgZW1pdExpdERlYnVnTG9nRXZlbnRzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBVc2VmdWwgZm9yIHZpc3VhbGl6aW5nIGFuZCBsb2dnaW5nIGluc2lnaHRzIGludG8gd2hhdCB0aGUgTGl0IHRlbXBsYXRlIHN5c3RlbSBpcyBkb2luZy5cbiAqXG4gKiBDb21waWxlZCBvdXQgb2YgcHJvZCBtb2RlIGJ1aWxkcy5cbiAqL1xuY29uc3QgZGVidWdMb2dFdmVudCA9IERFVl9NT0RFXG4gID8gKGV2ZW50OiBMaXRVbnN0YWJsZS5EZWJ1Z0xvZy5FbnRyeSkgPT4ge1xuICAgICAgY29uc3Qgc2hvdWxkRW1pdCA9IChnbG9iYWwgYXMgdW5rbm93biBhcyBEZWJ1Z0xvZ2dpbmdXaW5kb3cpXG4gICAgICAgIC5lbWl0TGl0RGVidWdMb2dFdmVudHM7XG4gICAgICBpZiAoIXNob3VsZEVtaXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudDxMaXRVbnN0YWJsZS5EZWJ1Z0xvZy5FbnRyeT4oJ2xpdC1kZWJ1ZycsIHtcbiAgICAgICAgICBkZXRhaWw6IGV2ZW50LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIDogdW5kZWZpbmVkO1xuLy8gVXNlZCBmb3IgY29ubmVjdGluZyBiZWdpblJlbmRlciBhbmQgZW5kUmVuZGVyIGV2ZW50cyB3aGVuIHRoZXJlIGFyZSBuZXN0ZWRcbi8vIHJlbmRlcnMgd2hlbiBlcnJvcnMgYXJlIHRocm93biBwcmV2ZW50aW5nIGFuIGVuZFJlbmRlciBldmVudCBmcm9tIGJlaW5nXG4vLyBjYWxsZWQuXG5sZXQgZGVidWdMb2dSZW5kZXJJZCA9IDA7XG5cbmxldCBpc3N1ZVdhcm5pbmc6IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4gdm9pZDtcblxuaWYgKERFVl9NT0RFKSB7XG4gIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyA/Pz0gbmV3IFNldCgpO1xuXG4gIC8qKlxuICAgKiBJc3N1ZSBhIHdhcm5pbmcgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LCBiYXNlZCBlaXRoZXIgb24gYGNvZGVgIG9yIGB3YXJuaW5nYC5cbiAgICogV2FybmluZ3MgYXJlIGRpc2FibGVkIGF1dG9tYXRpY2FsbHkgb25seSBieSBgd2FybmluZ2A7IGRpc2FibGluZyB2aWEgYGNvZGVgXG4gICAqIGNhbiBiZSBkb25lIGJ5IHVzZXJzLlxuICAgKi9cbiAgaXNzdWVXYXJuaW5nID0gKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB7XG4gICAgd2FybmluZyArPSBjb2RlXG4gICAgICA/IGAgU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvJHtjb2RlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gXG4gICAgICA6ICcnO1xuICAgIGlmIChcbiAgICAgICFnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MhLmhhcyh3YXJuaW5nKSAmJlxuICAgICAgIWdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyEuaGFzKGNvZGUpXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MhLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG5cbiAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgIGlzc3VlV2FybmluZyhcbiAgICAgICdkZXYtbW9kZScsXG4gICAgICBgTGl0IGlzIGluIGRldiBtb2RlLiBOb3QgcmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24hYFxuICAgICk7XG4gIH0pO1xufVxuXG5jb25zdCB3cmFwID1cbiAgRU5BQkxFX1NIQURZRE9NX05PUEFUQ0ggJiZcbiAgZ2xvYmFsLlNoYWR5RE9NPy5pblVzZSAmJlxuICBnbG9iYWwuU2hhZHlET00/Lm5vUGF0Y2ggPT09IHRydWVcbiAgICA/IChnbG9iYWwuU2hhZHlET00hLndyYXAgYXMgPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBUKSA9PiBUKVxuICAgIDogPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBUKSA9PiBub2RlO1xuXG5jb25zdCB0cnVzdGVkVHlwZXMgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMgVHJ1c3RlZFR5cGVzV2luZG93KS50cnVzdGVkVHlwZXM7XG5cbi8qKlxuICogT3VyIFRydXN0ZWRUeXBlUG9saWN5IGZvciBIVE1MIHdoaWNoIGlzIGRlY2xhcmVkIHVzaW5nIHRoZSBodG1sIHRlbXBsYXRlXG4gKiB0YWcgZnVuY3Rpb24uXG4gKlxuICogVGhhdCBIVE1MIGlzIGEgZGV2ZWxvcGVyLWF1dGhvcmVkIGNvbnN0YW50LCBhbmQgaXMgcGFyc2VkIHdpdGggaW5uZXJIVE1MXG4gKiBiZWZvcmUgYW55IHVudHJ1c3RlZCBleHByZXNzaW9ucyBoYXZlIGJlZW4gbWl4ZWQgaW4uIFRoZXJlZm9yIGl0IGlzXG4gKiBjb25zaWRlcmVkIHNhZmUgYnkgY29uc3RydWN0aW9uLlxuICovXG5jb25zdCBwb2xpY3kgPSB0cnVzdGVkVHlwZXNcbiAgPyB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KCdsaXQtaHRtbCcsIHtcbiAgICAgIGNyZWF0ZUhUTUw6IChzKSA9PiBzLFxuICAgIH0pXG4gIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFVzZWQgdG8gc2FuaXRpemUgYW55IHZhbHVlIGJlZm9yZSBpdCBpcyB3cml0dGVuIGludG8gdGhlIERPTS4gVGhpcyBjYW4gYmVcbiAqIHVzZWQgdG8gaW1wbGVtZW50IGEgc2VjdXJpdHkgcG9saWN5IG9mIGFsbG93ZWQgYW5kIGRpc2FsbG93ZWQgdmFsdWVzIGluXG4gKiBvcmRlciB0byBwcmV2ZW50IFhTUyBhdHRhY2tzLlxuICpcbiAqIE9uZSB3YXkgb2YgdXNpbmcgdGhpcyBjYWxsYmFjayB3b3VsZCBiZSB0byBjaGVjayBhdHRyaWJ1dGVzIGFuZCBwcm9wZXJ0aWVzXG4gKiBhZ2FpbnN0IGEgbGlzdCBvZiBoaWdoIHJpc2sgZmllbGRzLCBhbmQgcmVxdWlyZSB0aGF0IHZhbHVlcyB3cml0dGVuIHRvIHN1Y2hcbiAqIGZpZWxkcyBiZSBpbnN0YW5jZXMgb2YgYSBjbGFzcyB3aGljaCBpcyBzYWZlIGJ5IGNvbnN0cnVjdGlvbi4gQ2xvc3VyZSdzIFNhZmVcbiAqIEhUTUwgVHlwZXMgaXMgb25lIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgdGVjaG5pcXVlIChcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvc2FmZS1odG1sLXR5cGVzL2Jsb2IvbWFzdGVyL2RvYy9zYWZlaHRtbC10eXBlcy5tZCkuXG4gKiBUaGUgVHJ1c3RlZFR5cGVzIHBvbHlmaWxsIGluIEFQSS1vbmx5IG1vZGUgY291bGQgYWxzbyBiZSB1c2VkIGFzIGEgYmFzaXNcbiAqIGZvciB0aGlzIHRlY2huaXF1ZSAoaHR0cHM6Ly9naXRodWIuY29tL1dJQ0cvdHJ1c3RlZC10eXBlcykuXG4gKlxuICogQHBhcmFtIG5vZGUgVGhlIEhUTUwgbm9kZSAodXN1YWxseSBlaXRoZXIgYSAjdGV4dCBub2RlIG9yIGFuIEVsZW1lbnQpIHRoYXRcbiAqICAgICBpcyBiZWluZyB3cml0dGVuIHRvLiBOb3RlIHRoYXQgdGhpcyBpcyBqdXN0IGFuIGV4ZW1wbGFyIG5vZGUsIHRoZSB3cml0ZVxuICogICAgIG1heSB0YWtlIHBsYWNlIGFnYWluc3QgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgc2FtZSBjbGFzcyBvZiBub2RlLlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIG9yIHByb3BlcnR5IChmb3IgZXhhbXBsZSwgJ2hyZWYnKS5cbiAqIEBwYXJhbSB0eXBlIEluZGljYXRlcyB3aGV0aGVyIHRoZSB3cml0ZSB0aGF0J3MgYWJvdXQgdG8gYmUgcGVyZm9ybWVkIHdpbGxcbiAqICAgICBiZSB0byBhIHByb3BlcnR5IG9yIGEgbm9kZS5cbiAqIEByZXR1cm4gQSBmdW5jdGlvbiB0aGF0IHdpbGwgc2FuaXRpemUgdGhpcyBjbGFzcyBvZiB3cml0ZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFNhbml0aXplckZhY3RvcnkgPSAoXG4gIG5vZGU6IE5vZGUsXG4gIG5hbWU6IHN0cmluZyxcbiAgdHlwZTogJ3Byb3BlcnR5JyB8ICdhdHRyaWJ1dGUnXG4pID0+IFZhbHVlU2FuaXRpemVyO1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gd2hpY2ggY2FuIHNhbml0aXplIHZhbHVlcyB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byBhIHNwZWNpZmljIGtpbmRcbiAqIG9mIERPTSBzaW5rLlxuICpcbiAqIFNlZSBTYW5pdGl6ZXJGYWN0b3J5LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2FuaXRpemUuIFdpbGwgYmUgdGhlIGFjdHVhbCB2YWx1ZSBwYXNzZWQgaW50b1xuICogICAgIHRoZSBsaXQtaHRtbCB0ZW1wbGF0ZSBsaXRlcmFsLCBzbyB0aGlzIGNvdWxkIGJlIG9mIGFueSB0eXBlLlxuICogQHJldHVybiBUaGUgdmFsdWUgdG8gd3JpdGUgdG8gdGhlIERPTS4gVXN1YWxseSB0aGUgc2FtZSBhcyB0aGUgaW5wdXQgdmFsdWUsXG4gKiAgICAgdW5sZXNzIHNhbml0aXphdGlvbiBpcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFZhbHVlU2FuaXRpemVyID0gKHZhbHVlOiB1bmtub3duKSA9PiB1bmtub3duO1xuXG5jb25zdCBpZGVudGl0eUZ1bmN0aW9uOiBWYWx1ZVNhbml0aXplciA9ICh2YWx1ZTogdW5rbm93bikgPT4gdmFsdWU7XG5jb25zdCBub29wU2FuaXRpemVyOiBTYW5pdGl6ZXJGYWN0b3J5ID0gKFxuICBfbm9kZTogTm9kZSxcbiAgX25hbWU6IHN0cmluZyxcbiAgX3R5cGU6ICdwcm9wZXJ0eScgfCAnYXR0cmlidXRlJ1xuKSA9PiBpZGVudGl0eUZ1bmN0aW9uO1xuXG4vKiogU2V0cyB0aGUgZ2xvYmFsIHNhbml0aXplciBmYWN0b3J5LiAqL1xuY29uc3Qgc2V0U2FuaXRpemVyID0gKG5ld1Nhbml0aXplcjogU2FuaXRpemVyRmFjdG9yeSkgPT4ge1xuICBpZiAoIUVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoc2FuaXRpemVyRmFjdG9yeUludGVybmFsICE9PSBub29wU2FuaXRpemVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEF0dGVtcHRlZCB0byBvdmVyd3JpdGUgZXhpc3RpbmcgbGl0LWh0bWwgc2VjdXJpdHkgcG9saWN5LmAgK1xuICAgICAgICBgIHNldFNhbml0aXplRE9NVmFsdWVGYWN0b3J5IHNob3VsZCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlLmBcbiAgICApO1xuICB9XG4gIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCA9IG5ld1Nhbml0aXplcjtcbn07XG5cbi8qKlxuICogT25seSB1c2VkIGluIGludGVybmFsIHRlc3RzLCBub3QgYSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLlxuICovXG5jb25zdCBfdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2UgPSAoKSA9PiB7XG4gIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCA9IG5vb3BTYW5pdGl6ZXI7XG59O1xuXG5jb25zdCBjcmVhdGVTYW5pdGl6ZXI6IFNhbml0aXplckZhY3RvcnkgPSAobm9kZSwgbmFtZSwgdHlwZSkgPT4ge1xuICByZXR1cm4gc2FuaXRpemVyRmFjdG9yeUludGVybmFsKG5vZGUsIG5hbWUsIHR5cGUpO1xufTtcblxuLy8gQWRkZWQgdG8gYW4gYXR0cmlidXRlIG5hbWUgdG8gbWFyayB0aGUgYXR0cmlidXRlIGFzIGJvdW5kIHNvIHdlIGNhbiBmaW5kXG4vLyBpdCBlYXNpbHkuXG5jb25zdCBib3VuZEF0dHJpYnV0ZVN1ZmZpeCA9ICckbGl0JCc7XG5cbi8vIFRoaXMgbWFya2VyIGlzIHVzZWQgaW4gbWFueSBzeW50YWN0aWMgcG9zaXRpb25zIGluIEhUTUwsIHNvIGl0IG11c3QgYmVcbi8vIGEgdmFsaWQgZWxlbWVudCBuYW1lIGFuZCBhdHRyaWJ1dGUgbmFtZS4gV2UgZG9uJ3Qgc3VwcG9ydCBkeW5hbWljIG5hbWVzICh5ZXQpXG4vLyBidXQgdGhpcyBhdCBsZWFzdCBlbnN1cmVzIHRoYXQgdGhlIHBhcnNlIHRyZWUgaXMgY2xvc2VyIHRvIHRoZSB0ZW1wbGF0ZVxuLy8gaW50ZW50aW9uLlxuY29uc3QgbWFya2VyID0gYGxpdCQke01hdGgucmFuZG9tKCkudG9GaXhlZCg5KS5zbGljZSgyKX0kYDtcblxuLy8gU3RyaW5nIHVzZWQgdG8gdGVsbCBpZiBhIGNvbW1lbnQgaXMgYSBtYXJrZXIgY29tbWVudFxuY29uc3QgbWFya2VyTWF0Y2ggPSAnPycgKyBtYXJrZXI7XG5cbi8vIFRleHQgdXNlZCB0byBpbnNlcnQgYSBjb21tZW50IG1hcmtlciBub2RlLiBXZSB1c2UgcHJvY2Vzc2luZyBpbnN0cnVjdGlvblxuLy8gc3ludGF4IGJlY2F1c2UgaXQncyBzbGlnaHRseSBzbWFsbGVyLCBidXQgcGFyc2VzIGFzIGEgY29tbWVudCBub2RlLlxuY29uc3Qgbm9kZU1hcmtlciA9IGA8JHttYXJrZXJNYXRjaH0+YDtcblxuY29uc3QgZCA9XG4gIE5PREVfTU9ERSAmJiBnbG9iYWwuZG9jdW1lbnQgPT09IHVuZGVmaW5lZFxuICAgID8gKHtcbiAgICAgICAgY3JlYXRlVHJlZVdhbGtlcigpIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH0sXG4gICAgICB9IGFzIHVua25vd24gYXMgRG9jdW1lbnQpXG4gICAgOiBkb2N1bWVudDtcblxuLy8gQ3JlYXRlcyBhIGR5bmFtaWMgbWFya2VyLiBXZSBuZXZlciBoYXZlIHRvIHNlYXJjaCBmb3IgdGhlc2UgaW4gdGhlIERPTS5cbmNvbnN0IGNyZWF0ZU1hcmtlciA9ICgpID0+IGQuY3JlYXRlQ29tbWVudCgnJyk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVvZi1vcGVyYXRvclxudHlwZSBQcmltaXRpdmUgPSBudWxsIHwgdW5kZWZpbmVkIHwgYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IHN5bWJvbCB8IGJpZ2ludDtcbmNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJpbWl0aXZlID0+XG4gIHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9ICdmdW5jdGlvbicpO1xuY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5jb25zdCBpc0l0ZXJhYmxlID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgSXRlcmFibGU8dW5rbm93bj4gPT5cbiAgaXNBcnJheSh2YWx1ZSkgfHxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgdHlwZW9mICh2YWx1ZSBhcyBhbnkpPy5bU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcblxuY29uc3QgU1BBQ0VfQ0hBUiA9IGBbIFxcdFxcblxcZlxccl1gO1xuY29uc3QgQVRUUl9WQUxVRV9DSEFSID0gYFteIFxcdFxcblxcZlxcclwiJ1xcYDw+PV1gO1xuY29uc3QgTkFNRV9DSEFSID0gYFteXFxcXHNcIic+PS9dYDtcblxuLy8gVGhlc2UgcmVnZXhlcyByZXByZXNlbnQgdGhlIGZpdmUgcGFyc2luZyBzdGF0ZXMgdGhhdCB3ZSBjYXJlIGFib3V0IGluIHRoZVxuLy8gVGVtcGxhdGUncyBIVE1MIHNjYW5uZXIuIFRoZXkgbWF0Y2ggdGhlICplbmQqIG9mIHRoZSBzdGF0ZSB0aGV5J3JlIG5hbWVkXG4vLyBhZnRlci5cbi8vIERlcGVuZGluZyBvbiB0aGUgbWF0Y2gsIHdlIHRyYW5zaXRpb24gdG8gYSBuZXcgc3RhdGUuIElmIHRoZXJlJ3Mgbm8gbWF0Y2gsXG4vLyB3ZSBzdGF5IGluIHRoZSBzYW1lIHN0YXRlLlxuLy8gTm90ZSB0aGF0IHRoZSByZWdleGVzIGFyZSBzdGF0ZWZ1bC4gV2UgdXRpbGl6ZSBsYXN0SW5kZXggYW5kIHN5bmMgaXRcbi8vIGFjcm9zcyB0aGUgbXVsdGlwbGUgcmVnZXhlcyB1c2VkLiBJbiBhZGRpdGlvbiB0byB0aGUgZml2ZSByZWdleGVzIGJlbG93XG4vLyB3ZSBhbHNvIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIHJlZ2V4IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVuZCB0YWdzIGZvciByYXdcbi8vIHRleHQgZWxlbWVudHMuXG5cbi8qKlxuICogRW5kIG9mIHRleHQgaXM6IGA8YCBmb2xsb3dlZCBieTpcbiAqICAgKGNvbW1lbnQgc3RhcnQpIG9yICh0YWcpIG9yIChkeW5hbWljIHRhZyBiaW5kaW5nKVxuICovXG5jb25zdCB0ZXh0RW5kUmVnZXggPSAvPCg/OighLS18XFwvW15hLXpBLVpdKXwoXFwvP1thLXpBLVpdW14+XFxzXSopfChcXC8/JCkpL2c7XG5jb25zdCBDT01NRU5UX1NUQVJUID0gMTtcbmNvbnN0IFRBR19OQU1FID0gMjtcbmNvbnN0IERZTkFNSUNfVEFHX05BTUUgPSAzO1xuXG5jb25zdCBjb21tZW50RW5kUmVnZXggPSAvLS0+L2c7XG4vKipcbiAqIENvbW1lbnRzIG5vdCBzdGFydGVkIHdpdGggPCEtLSwgbGlrZSA8L3ssIGNhbiBiZSBlbmRlZCBieSBhIHNpbmdsZSBgPmBcbiAqL1xuY29uc3QgY29tbWVudDJFbmRSZWdleCA9IC8+L2c7XG5cbi8qKlxuICogVGhlIHRhZ0VuZCByZWdleCBtYXRjaGVzIHRoZSBlbmQgb2YgdGhlIFwiaW5zaWRlIGFuIG9wZW5pbmdcIiB0YWcgc3ludGF4XG4gKiBwb3NpdGlvbi4gSXQgZWl0aGVyIG1hdGNoZXMgYSBgPmAsIGFuIGF0dHJpYnV0ZS1saWtlIHNlcXVlbmNlLCBvciB0aGUgZW5kXG4gKiBvZiB0aGUgc3RyaW5nIGFmdGVyIGEgc3BhY2UgKGF0dHJpYnV0ZS1uYW1lIHBvc2l0aW9uIGVuZGluZykuXG4gKlxuICogU2VlIGF0dHJpYnV0ZXMgaW4gdGhlIEhUTUwgc3BlYzpcbiAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zeW50YXguaHRtbCNlbGVtZW50cy1hdHRyaWJ1dGVzXG4gKlxuICogXCIgXFx0XFxuXFxmXFxyXCIgYXJlIEhUTUwgc3BhY2UgY2hhcmFjdGVyczpcbiAqIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS13aGl0ZXNwYWNlXG4gKlxuICogU28gYW4gYXR0cmlidXRlIGlzOlxuICogICogVGhlIG5hbWU6IGFueSBjaGFyYWN0ZXIgZXhjZXB0IGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIsIChcIiksICgnKSwgXCI+XCIsXG4gKiAgICBcIj1cIiwgb3IgXCIvXCIuIE5vdGU6IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIEhUTUwgc3BlYyB3aGljaCBhbHNvIGV4Y2x1ZGVzIGNvbnRyb2wgY2hhcmFjdGVycy5cbiAqICAqIEZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBzcGFjZSBjaGFyYWN0ZXJzXG4gKiAgKiBGb2xsb3dlZCBieSBcIj1cIlxuICogICogRm9sbG93ZWQgYnkgemVybyBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnNcbiAqICAqIEZvbGxvd2VkIGJ5OlxuICogICAgKiBBbnkgY2hhcmFjdGVyIGV4Y2VwdCBzcGFjZSwgKCcpLCAoXCIpLCBcIjxcIiwgXCI+XCIsIFwiPVwiLCAoYCksIG9yXG4gKiAgICAqIChcIikgdGhlbiBhbnkgbm9uLShcIiksIG9yXG4gKiAgICAqICgnKSB0aGVuIGFueSBub24tKCcpXG4gKi9cbmNvbnN0IHRhZ0VuZFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgYD58JHtTUEFDRV9DSEFSfSg/Oigke05BTUVfQ0hBUn0rKSgke1NQQUNFX0NIQVJ9Kj0ke1NQQUNFX0NIQVJ9Kig/OiR7QVRUUl9WQUxVRV9DSEFSfXwoXCJ8Jyl8KSl8JClgLFxuICAnZydcbik7XG5jb25zdCBFTlRJUkVfTUFUQ0ggPSAwO1xuY29uc3QgQVRUUklCVVRFX05BTUUgPSAxO1xuY29uc3QgU1BBQ0VTX0FORF9FUVVBTFMgPSAyO1xuY29uc3QgUVVPVEVfQ0hBUiA9IDM7XG5cbmNvbnN0IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4ID0gLycvZztcbmNvbnN0IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4ID0gL1wiL2c7XG4vKipcbiAqIE1hdGNoZXMgdGhlIHJhdyB0ZXh0IGVsZW1lbnRzLlxuICpcbiAqIENvbW1lbnRzIGFyZSBub3QgcGFyc2VkIHdpdGhpbiByYXcgdGV4dCBlbGVtZW50cywgc28gd2UgbmVlZCB0byBzZWFyY2ggdGhlaXJcbiAqIHRleHQgY29udGVudCBmb3IgbWFya2VyIHN0cmluZ3MuXG4gKi9cbmNvbnN0IHJhd1RleHRFbGVtZW50ID0gL14oPzpzY3JpcHR8c3R5bGV8dGV4dGFyZWF8dGl0bGUpJC9pO1xuXG4vKiogVGVtcGxhdGVSZXN1bHQgdHlwZXMgKi9cbmNvbnN0IEhUTUxfUkVTVUxUID0gMTtcbmNvbnN0IFNWR19SRVNVTFQgPSAyO1xuY29uc3QgTUFUSE1MX1JFU1VMVCA9IDM7XG5cbnR5cGUgUmVzdWx0VHlwZSA9IHR5cGVvZiBIVE1MX1JFU1VMVCB8IHR5cGVvZiBTVkdfUkVTVUxUIHwgdHlwZW9mIE1BVEhNTF9SRVNVTFQ7XG5cbi8vIFRlbXBsYXRlUGFydCB0eXBlc1xuLy8gSU1QT1JUQU5UOiB0aGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gUGFydFR5cGVcbmNvbnN0IEFUVFJJQlVURV9QQVJUID0gMTtcbmNvbnN0IENISUxEX1BBUlQgPSAyO1xuY29uc3QgUFJPUEVSVFlfUEFSVCA9IDM7XG5jb25zdCBCT09MRUFOX0FUVFJJQlVURV9QQVJUID0gNDtcbmNvbnN0IEVWRU5UX1BBUlQgPSA1O1xuY29uc3QgRUxFTUVOVF9QQVJUID0gNjtcbmNvbnN0IENPTU1FTlRfUEFSVCA9IDc7XG5cbi8qKlxuICogVGhlIHJldHVybiB0eXBlIG9mIHRoZSB0ZW1wbGF0ZSB0YWcgZnVuY3Rpb25zLCB7QGxpbmtjb2RlIGh0bWx9IGFuZFxuICoge0BsaW5rY29kZSBzdmd9IHdoZW4gaXQgaGFzbid0IGJlZW4gY29tcGlsZWQgYnkgQGxpdC1sYWJzL2NvbXBpbGVyLlxuICpcbiAqIEEgYFRlbXBsYXRlUmVzdWx0YCBvYmplY3QgaG9sZHMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRlbXBsYXRlXG4gKiBleHByZXNzaW9uIHJlcXVpcmVkIHRvIHJlbmRlciBpdDogdGhlIHRlbXBsYXRlIHN0cmluZ3MsIGV4cHJlc3Npb24gdmFsdWVzLFxuICogYW5kIHR5cGUgb2YgdGVtcGxhdGUgKGh0bWwgb3Igc3ZnKS5cbiAqXG4gKiBgVGVtcGxhdGVSZXN1bHRgIG9iamVjdHMgZG8gbm90IGNyZWF0ZSBhbnkgRE9NIG9uIHRoZWlyIG93bi4gVG8gY3JlYXRlIG9yXG4gKiB1cGRhdGUgRE9NIHlvdSBuZWVkIHRvIHJlbmRlciB0aGUgYFRlbXBsYXRlUmVzdWx0YC4gU2VlXG4gKiBbUmVuZGVyaW5nXShodHRwczovL2xpdC5kZXYvZG9jcy9jb21wb25lbnRzL3JlbmRlcmluZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICovXG5leHBvcnQgdHlwZSBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQ8VCBleHRlbmRzIFJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlPiA9IHtcbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgWydfJGxpdFR5cGUkJ106IFQ7XG4gIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5O1xuICB2YWx1ZXM6IHVua25vd25bXTtcbn07XG5cbi8qKlxuICogVGhpcyBpcyBhIHRlbXBsYXRlIHJlc3VsdCB0aGF0IG1heSBiZSBlaXRoZXIgdW5jb21waWxlZCBvciBjb21waWxlZC5cbiAqXG4gKiBJbiB0aGUgZnV0dXJlLCBUZW1wbGF0ZVJlc3VsdCB3aWxsIGJlIHRoaXMgdHlwZS4gSWYgeW91IHdhbnQgdG8gZXhwbGljaXRseVxuICogbm90ZSB0aGF0IGEgdGVtcGxhdGUgcmVzdWx0IGlzIHBvdGVudGlhbGx5IGNvbXBpbGVkLCB5b3UgY2FuIHJlZmVyZW5jZSB0aGlzXG4gKiB0eXBlIGFuZCBpdCB3aWxsIGNvbnRpbnVlIHRvIGJlaGF2ZSB0aGUgc2FtZSB0aHJvdWdoIHRoZSBuZXh0IG1ham9yIHZlcnNpb25cbiAqIG9mIExpdC4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBjb2RlIHRoYXQgd2FudHMgdG8gcHJlcGFyZSBmb3IgdGhlIG5leHRcbiAqIG1ham9yIHZlcnNpb24gb2YgTGl0LlxuICovXG5leHBvcnQgdHlwZSBNYXliZUNvbXBpbGVkVGVtcGxhdGVSZXN1bHQ8VCBleHRlbmRzIFJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlPiA9XG4gIHwgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0PFQ+XG4gIHwgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdDtcblxuLyoqXG4gKiBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIHRlbXBsYXRlIHRhZyBmdW5jdGlvbnMsIHtAbGlua2NvZGUgaHRtbH0gYW5kXG4gKiB7QGxpbmtjb2RlIHN2Z30uXG4gKlxuICogQSBgVGVtcGxhdGVSZXN1bHRgIG9iamVjdCBob2xkcyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgdGVtcGxhdGVcbiAqIGV4cHJlc3Npb24gcmVxdWlyZWQgdG8gcmVuZGVyIGl0OiB0aGUgdGVtcGxhdGUgc3RyaW5ncywgZXhwcmVzc2lvbiB2YWx1ZXMsXG4gKiBhbmQgdHlwZSBvZiB0ZW1wbGF0ZSAoaHRtbCBvciBzdmcpLlxuICpcbiAqIGBUZW1wbGF0ZVJlc3VsdGAgb2JqZWN0cyBkbyBub3QgY3JlYXRlIGFueSBET00gb24gdGhlaXIgb3duLiBUbyBjcmVhdGUgb3JcbiAqIHVwZGF0ZSBET00geW91IG5lZWQgdG8gcmVuZGVyIHRoZSBgVGVtcGxhdGVSZXN1bHRgLiBTZWVcbiAqIFtSZW5kZXJpbmddKGh0dHBzOi8vbGl0LmRldi9kb2NzL2NvbXBvbmVudHMvcmVuZGVyaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBJbiBMaXQgNCwgdGhpcyB0eXBlIHdpbGwgYmUgYW4gYWxpYXMgb2ZcbiAqIE1heWJlQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCwgc28gdGhhdCBjb2RlIHdpbGwgZ2V0IHR5cGUgZXJyb3JzIGlmIGl0IGFzc3VtZXNcbiAqIHRoYXQgTGl0IHRlbXBsYXRlcyBhcmUgbm90IGNvbXBpbGVkLiBXaGVuIGRlbGliZXJhdGVseSB3b3JraW5nIHdpdGggb25seVxuICogb25lLCB1c2UgZWl0aGVyIHtAbGlua2NvZGUgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdH0gb3JcbiAqIHtAbGlua2NvZGUgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0fSBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgdHlwZSBUZW1wbGF0ZVJlc3VsdDxUIGV4dGVuZHMgUmVzdWx0VHlwZSA9IFJlc3VsdFR5cGU+ID1cbiAgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0PFQ+O1xuXG5leHBvcnQgdHlwZSBIVE1MVGVtcGxhdGVSZXN1bHQgPSBUZW1wbGF0ZVJlc3VsdDx0eXBlb2YgSFRNTF9SRVNVTFQ+O1xuXG5leHBvcnQgdHlwZSBTVkdUZW1wbGF0ZVJlc3VsdCA9IFRlbXBsYXRlUmVzdWx0PHR5cGVvZiBTVkdfUkVTVUxUPjtcblxuZXhwb3J0IHR5cGUgTWF0aE1MVGVtcGxhdGVSZXN1bHQgPSBUZW1wbGF0ZVJlc3VsdDx0eXBlb2YgTUFUSE1MX1JFU1VMVD47XG5cbi8qKlxuICogQSBUZW1wbGF0ZVJlc3VsdCB0aGF0IGhhcyBiZWVuIGNvbXBpbGVkIGJ5IEBsaXQtbGFicy9jb21waWxlciwgc2tpcHBpbmcgdGhlXG4gKiBwcmVwYXJlIHN0ZXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCB7XG4gIC8vIFRoaXMgaXMgYSBmYWN0b3J5IGluIG9yZGVyIHRvIG1ha2UgdGVtcGxhdGUgaW5pdGlhbGl6YXRpb24gbGF6eVxuICAvLyBhbmQgYWxsb3cgU2hhZHlSZW5kZXJPcHRpb25zIHNjb3BlIHRvIGJlIHBhc3NlZCBpbi5cbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgWydfJGxpdFR5cGUkJ106IENvbXBpbGVkVGVtcGxhdGU7XG4gIHZhbHVlczogdW5rbm93bltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVkVGVtcGxhdGUgZXh0ZW5kcyBPbWl0PFRlbXBsYXRlLCAnZWwnPiB7XG4gIC8vIGVsIGlzIG92ZXJyaWRkZW4gdG8gYmUgb3B0aW9uYWwuIFdlIGluaXRpYWxpemUgaXQgb24gZmlyc3QgcmVuZGVyXG4gIGVsPzogSFRNTFRlbXBsYXRlRWxlbWVudDtcblxuICAvLyBUaGUgcHJlcGFyZWQgSFRNTCBzdHJpbmcgdG8gY3JlYXRlIGEgdGVtcGxhdGUgZWxlbWVudCBmcm9tLlxuICAvLyBUaGUgdHlwZSBpcyBhIFRlbXBsYXRlU3RyaW5nc0FycmF5IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSB2YWx1ZSBjYW1lIGZyb21cbiAgLy8gc291cmNlIGNvZGUsIHByZXZlbnRpbmcgYSBKU09OIGluamVjdGlvbiBhdHRhY2suXG4gIGg6IFRlbXBsYXRlU3RyaW5nc0FycmF5O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIFRlbXBsYXRlUmVzdWx0IHdpdGhcbiAqIHRoZSBnaXZlbiByZXN1bHQgdHlwZS5cbiAqL1xuY29uc3QgdGFnID1cbiAgPFQgZXh0ZW5kcyBSZXN1bHRUeXBlPih0eXBlOiBUKSA9PlxuICAoc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnZhbHVlczogdW5rbm93bltdKTogVGVtcGxhdGVSZXN1bHQ8VD4gPT4ge1xuICAgIC8vIFdhcm4gYWdhaW5zdCB0ZW1wbGF0ZXMgb2N0YWwgZXNjYXBlIHNlcXVlbmNlc1xuICAgIC8vIFdlIGRvIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBpbiByZW5kZXIgc28gdGhhdCB0aGUgd2FybmluZyBpcyBjbG9zZXIgdG8gdGhlXG4gICAgLy8gdGVtcGxhdGUgZGVmaW5pdGlvbi5cbiAgICBpZiAoREVWX01PREUgJiYgc3RyaW5ncy5zb21lKChzKSA9PiBzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdTb21lIHRlbXBsYXRlIHN0cmluZ3MgYXJlIHVuZGVmaW5lZC5cXG4nICtcbiAgICAgICAgICAnVGhpcyBpcyBwcm9iYWJseSBjYXVzZWQgYnkgaWxsZWdhbCBvY3RhbCBlc2NhcGUgc2VxdWVuY2VzLidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgLy8gSW1wb3J0IHN0YXRpYy1odG1sLmpzIHJlc3VsdHMgaW4gYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdoaWNoIGczIGRvZXNuJ3RcbiAgICAgIC8vIGhhbmRsZS4gSW5zdGVhZCB3ZSBrbm93IHRoYXQgc3RhdGljIHZhbHVlcyBtdXN0IGhhdmUgdGhlIGZpZWxkXG4gICAgICAvLyBgXyRsaXRTdGF0aWMkYC5cbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWVzLnNvbWUoKHZhbCkgPT4gKHZhbCBhcyB7XyRsaXRTdGF0aWMkOiB1bmtub3dufSk/LlsnXyRsaXRTdGF0aWMkJ10pXG4gICAgICApIHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAgICcnLFxuICAgICAgICAgIGBTdGF0aWMgdmFsdWVzICdsaXRlcmFsJyBvciAndW5zYWZlU3RhdGljJyBjYW5ub3QgYmUgdXNlZCBhcyB2YWx1ZXMgdG8gbm9uLXN0YXRpYyB0ZW1wbGF0ZXMuXFxuYCArXG4gICAgICAgICAgICBgUGxlYXNlIHVzZSB0aGUgc3RhdGljICdodG1sJyB0YWcgZnVuY3Rpb24uIFNlZSBodHRwczovL2xpdC5kZXYvZG9jcy90ZW1wbGF0ZXMvZXhwcmVzc2lvbnMvI3N0YXRpYy1leHByZXNzaW9uc2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICBbJ18kbGl0VHlwZSQnXTogdHlwZSxcbiAgICAgIHN0cmluZ3MsXG4gICAgICB2YWx1ZXMsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBJbnRlcnByZXRzIGEgdGVtcGxhdGUgbGl0ZXJhbCBhcyBhbiBIVE1MIHRlbXBsYXRlIHRoYXQgY2FuIGVmZmljaWVudGx5XG4gKiByZW5kZXIgdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgaGVhZGVyID0gKHRpdGxlOiBzdHJpbmcpID0+IGh0bWxgPGgxPiR7dGl0bGV9PC9oMT5gO1xuICogYGBgXG4gKlxuICogVGhlIGBodG1sYCB0YWcgcmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBET00gdG8gcmVuZGVyIGFzIGEgdmFsdWUuIEl0IGlzXG4gKiBsYXp5LCBtZWFuaW5nIG5vIHdvcmsgaXMgZG9uZSB1bnRpbCB0aGUgdGVtcGxhdGUgaXMgcmVuZGVyZWQuIFdoZW4gcmVuZGVyaW5nLFxuICogaWYgYSB0ZW1wbGF0ZSBjb21lcyBmcm9tIHRoZSBzYW1lIGV4cHJlc3Npb24gYXMgYSBwcmV2aW91c2x5IHJlbmRlcmVkIHJlc3VsdCxcbiAqIGl0J3MgZWZmaWNpZW50bHkgdXBkYXRlZCBpbnN0ZWFkIG9mIHJlcGxhY2VkLlxuICovXG5leHBvcnQgY29uc3QgaHRtbCA9IHRhZyhIVE1MX1JFU1VMVCk7XG5cbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgYW4gU1ZHIGZyYWdtZW50IHRoYXQgY2FuIGVmZmljaWVudGx5IHJlbmRlclxuICogdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVjdCA9IHN2Z2A8cmVjdCB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIj48L3JlY3Q+YDtcbiAqXG4gKiBjb25zdCBteUltYWdlID0gaHRtbGBcbiAqICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICogICAgICR7cmVjdH1cbiAqICAgPC9zdmc+YDtcbiAqIGBgYFxuICpcbiAqIFRoZSBgc3ZnYCAqdGFnIGZ1bmN0aW9uKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBTVkcgZnJhZ21lbnRzLCBvciBlbGVtZW50c1xuICogdGhhdCB3b3VsZCBiZSBjb250YWluZWQgKippbnNpZGUqKiBhbiBgPHN2Zz5gIEhUTUwgZWxlbWVudC4gQSBjb21tb24gZXJyb3IgaXNcbiAqIHBsYWNpbmcgYW4gYDxzdmc+YCAqZWxlbWVudCogaW4gYSB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUgYHN2Z2AgdGFnXG4gKiBmdW5jdGlvbi4gVGhlIGA8c3ZnPmAgZWxlbWVudCBpcyBhbiBIVE1MIGVsZW1lbnQgYW5kIHNob3VsZCBiZSB1c2VkIHdpdGhpbiBhXG4gKiB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUge0BsaW5rY29kZSBodG1sfSB0YWcgZnVuY3Rpb24uXG4gKlxuICogSW4gTGl0RWxlbWVudCB1c2FnZSwgaXQncyBpbnZhbGlkIHRvIHJldHVybiBhbiBTVkcgZnJhZ21lbnQgZnJvbSB0aGVcbiAqIGByZW5kZXIoKWAgbWV0aG9kLCBhcyB0aGUgU1ZHIGZyYWdtZW50IHdpbGwgYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgZWxlbWVudCdzXG4gKiBzaGFkb3cgcm9vdCBhbmQgdGh1cyBub3QgYmUgcHJvcGVybHkgY29udGFpbmVkIHdpdGhpbiBhbiBgPHN2Zz5gIEhUTUxcbiAqIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBzdmcgPSB0YWcoU1ZHX1JFU1VMVCk7XG5cbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgTWF0aE1MIGZyYWdtZW50IHRoYXQgY2FuIGVmZmljaWVudGx5IHJlbmRlclxuICogdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgbnVtID0gbWF0aG1sYDxtbj4xPC9tbj5gO1xuICpcbiAqIGNvbnN0IGVxID0gaHRtbGBcbiAqICAgPG1hdGg+XG4gKiAgICAgJHtudW19XG4gKiAgIDwvbWF0aD5gO1xuICogYGBgXG4gKlxuICogVGhlIGBtYXRobWxgICp0YWcgZnVuY3Rpb24qIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIE1hdGhNTCBmcmFnbWVudHMsIG9yXG4gKiBlbGVtZW50cyB0aGF0IHdvdWxkIGJlIGNvbnRhaW5lZCAqKmluc2lkZSoqIGEgYDxtYXRoPmAgSFRNTCBlbGVtZW50LiBBIGNvbW1vblxuICogZXJyb3IgaXMgcGxhY2luZyBhIGA8bWF0aD5gICplbGVtZW50KiBpbiBhIHRlbXBsYXRlIHRhZ2dlZCB3aXRoIHRoZSBgbWF0aG1sYFxuICogdGFnIGZ1bmN0aW9uLiBUaGUgYDxtYXRoPmAgZWxlbWVudCBpcyBhbiBIVE1MIGVsZW1lbnQgYW5kIHNob3VsZCBiZSB1c2VkXG4gKiB3aXRoaW4gYSB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUge0BsaW5rY29kZSBodG1sfSB0YWcgZnVuY3Rpb24uXG4gKlxuICogSW4gTGl0RWxlbWVudCB1c2FnZSwgaXQncyBpbnZhbGlkIHRvIHJldHVybiBhbiBNYXRoTUwgZnJhZ21lbnQgZnJvbSB0aGVcbiAqIGByZW5kZXIoKWAgbWV0aG9kLCBhcyB0aGUgTWF0aE1MIGZyYWdtZW50IHdpbGwgYmUgY29udGFpbmVkIHdpdGhpbiB0aGVcbiAqIGVsZW1lbnQncyBzaGFkb3cgcm9vdCBhbmQgdGh1cyBub3QgYmUgcHJvcGVybHkgY29udGFpbmVkIHdpdGhpbiBhIGA8bWF0aD5gXG4gKiBIVE1MIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBtYXRobWwgPSB0YWcoTUFUSE1MX1JFU1VMVCk7XG5cbi8qKlxuICogQSBzZW50aW5lbCB2YWx1ZSB0aGF0IHNpZ25hbHMgdGhhdCBhIHZhbHVlIHdhcyBoYW5kbGVkIGJ5IGEgZGlyZWN0aXZlIGFuZFxuICogc2hvdWxkIG5vdCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG4gKi9cbmV4cG9ydCBjb25zdCBub0NoYW5nZSA9IFN5bWJvbC5mb3IoJ2xpdC1ub0NoYW5nZScpO1xuXG4vKipcbiAqIEEgc2VudGluZWwgdmFsdWUgdGhhdCBzaWduYWxzIGEgQ2hpbGRQYXJ0IHRvIGZ1bGx5IGNsZWFyIGl0cyBjb250ZW50LlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBidXR0b24gPSBodG1sYCR7XG4gKiAgdXNlci5pc0FkbWluXG4gKiAgICA/IGh0bWxgPGJ1dHRvbj5ERUxFVEU8L2J1dHRvbj5gXG4gKiAgICA6IG5vdGhpbmdcbiAqIH1gO1xuICogYGBgXG4gKlxuICogUHJlZmVyIHVzaW5nIGBub3RoaW5nYCBvdmVyIG90aGVyIGZhbHN5IHZhbHVlcyBhcyBpdCBwcm92aWRlcyBhIGNvbnNpc3RlbnRcbiAqIGJlaGF2aW9yIGJldHdlZW4gdmFyaW91cyBleHByZXNzaW9uIGJpbmRpbmcgY29udGV4dHMuXG4gKlxuICogSW4gY2hpbGQgZXhwcmVzc2lvbnMsIGB1bmRlZmluZWRgLCBgbnVsbGAsIGAnJ2AsIGFuZCBgbm90aGluZ2AgYWxsIGJlaGF2ZSB0aGVcbiAqIHNhbWUgYW5kIHJlbmRlciBubyBub2Rlcy4gSW4gYXR0cmlidXRlIGV4cHJlc3Npb25zLCBgbm90aGluZ2AgX3JlbW92ZXNfIHRoZVxuICogYXR0cmlidXRlLCB3aGlsZSBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIHdpbGwgcmVuZGVyIGFuIGVtcHR5IHN0cmluZy4gSW5cbiAqIHByb3BlcnR5IGV4cHJlc3Npb25zIGBub3RoaW5nYCBiZWNvbWVzIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgY29uc3Qgbm90aGluZyA9IFN5bWJvbC5mb3IoJ2xpdC1ub3RoaW5nJyk7XG5cbi8qKlxuICogVGhlIGNhY2hlIG9mIHByZXBhcmVkIHRlbXBsYXRlcywga2V5ZWQgYnkgdGhlIHRhZ2dlZCBUZW1wbGF0ZVN0cmluZ3NBcnJheVxuICogYW5kIF9ub3RfIGFjY291bnRpbmcgZm9yIHRoZSBzcGVjaWZpYyB0ZW1wbGF0ZSB0YWcgdXNlZC4gVGhpcyBtZWFucyB0aGF0XG4gKiB0ZW1wbGF0ZSB0YWdzIGNhbm5vdCBiZSBkeW5hbWljIC0gdGhleSBtdXN0IHN0YXRpY2FsbHkgYmUgb25lIG9mIGh0bWwsIHN2ZyxcbiAqIG9yIGF0dHIuIFRoaXMgcmVzdHJpY3Rpb24gc2ltcGxpZmllcyB0aGUgY2FjaGUgbG9va3VwLCB3aGljaCBpcyBvbiB0aGUgaG90XG4gKiBwYXRoIGZvciByZW5kZXJpbmcuXG4gKi9cbmNvbnN0IHRlbXBsYXRlQ2FjaGUgPSBuZXcgV2Vha01hcDxUZW1wbGF0ZVN0cmluZ3NBcnJheSwgVGVtcGxhdGU+KCk7XG5cbi8qKlxuICogT2JqZWN0IHNwZWNpZnlpbmcgb3B0aW9ucyBmb3IgY29udHJvbGxpbmcgbGl0LWh0bWwgcmVuZGVyaW5nLiBOb3RlIHRoYXRcbiAqIHdoaWxlIGByZW5kZXJgIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUgYGNvbnRhaW5lcmAgKGFuZFxuICogYHJlbmRlckJlZm9yZWAgcmVmZXJlbmNlIG5vZGUpIHRvIGVmZmljaWVudGx5IHVwZGF0ZSB0aGUgcmVuZGVyZWQgY29udGVudCxcbiAqIG9ubHkgdGhlIG9wdGlvbnMgcGFzc2VkIGluIGR1cmluZyB0aGUgZmlyc3QgcmVuZGVyIGFyZSByZXNwZWN0ZWQgZHVyaW5nXG4gKiB0aGUgbGlmZXRpbWUgb2YgcmVuZGVycyB0byB0aGF0IHVuaXF1ZSBgY29udGFpbmVyYCArIGByZW5kZXJCZWZvcmVgXG4gKiBjb21iaW5hdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCB0byB1c2UgYXMgdGhlIGB0aGlzYCB2YWx1ZSBmb3IgZXZlbnQgbGlzdGVuZXJzLiBJdCdzIG9mdGVuXG4gICAqIHVzZWZ1bCB0byBzZXQgdGhpcyB0byB0aGUgaG9zdCBjb21wb25lbnQgcmVuZGVyaW5nIGEgdGVtcGxhdGUuXG4gICAqL1xuICBob3N0Pzogb2JqZWN0O1xuICAvKipcbiAgICogQSBET00gbm9kZSBiZWZvcmUgd2hpY2ggdG8gcmVuZGVyIGNvbnRlbnQgaW4gdGhlIGNvbnRhaW5lci5cbiAgICovXG4gIHJlbmRlckJlZm9yZT86IENoaWxkTm9kZSB8IG51bGw7XG4gIC8qKlxuICAgKiBOb2RlIHVzZWQgZm9yIGNsb25pbmcgdGhlIHRlbXBsYXRlIChgaW1wb3J0Tm9kZWAgd2lsbCBiZSBjYWxsZWQgb24gdGhpc1xuICAgKiBub2RlKS4gVGhpcyBjb250cm9scyB0aGUgYG93bmVyRG9jdW1lbnRgIG9mIHRoZSByZW5kZXJlZCBET00sIGFsb25nIHdpdGhcbiAgICogYW55IGluaGVyaXRlZCBjb250ZXh0LiBEZWZhdWx0cyB0byB0aGUgZ2xvYmFsIGBkb2N1bWVudGAuXG4gICAqL1xuICBjcmVhdGlvblNjb3BlPzoge2ltcG9ydE5vZGUobm9kZTogTm9kZSwgZGVlcD86IGJvb2xlYW4pOiBOb2RlfTtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIGNvbm5lY3RlZCBzdGF0ZSBmb3IgdGhlIHRvcC1sZXZlbCBwYXJ0IGJlaW5nIHJlbmRlcmVkLiBJZiBub1xuICAgKiBgaXNDb25uZWN0ZWRgIG9wdGlvbiBpcyBzZXQsIGBBc3luY0RpcmVjdGl2ZWBzIHdpbGwgYmUgY29ubmVjdGVkIGJ5XG4gICAqIGRlZmF1bHQuIFNldCB0byBgZmFsc2VgIGlmIHRoZSBpbml0aWFsIHJlbmRlciBvY2N1cnMgaW4gYSBkaXNjb25uZWN0ZWQgdHJlZVxuICAgKiBhbmQgYEFzeW5jRGlyZWN0aXZlYHMgc2hvdWxkIHNlZSBgaXNDb25uZWN0ZWQgPT09IGZhbHNlYCBmb3IgdGhlaXIgaW5pdGlhbFxuICAgKiByZW5kZXIuIFRoZSBgcGFydC5zZXRDb25uZWN0ZWQoKWAgbWV0aG9kIG11c3QgYmUgdXNlZCBzdWJzZXF1ZW50IHRvIGluaXRpYWxcbiAgICogcmVuZGVyIHRvIGNoYW5nZSB0aGUgY29ubmVjdGVkIHN0YXRlIG9mIHRoZSBwYXJ0LlxuICAgKi9cbiAgaXNDb25uZWN0ZWQ/OiBib29sZWFuO1xufVxuXG5jb25zdCB3YWxrZXIgPSBkLmNyZWF0ZVRyZWVXYWxrZXIoXG4gIGQsXG4gIDEyOSAvKiBOb2RlRmlsdGVyLlNIT1dfe0VMRU1FTlR8Q09NTUVOVH0gKi9cbik7XG5cbmxldCBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWw6IFNhbml0aXplckZhY3RvcnkgPSBub29wU2FuaXRpemVyO1xuXG4vL1xuLy8gQ2xhc3NlcyBvbmx5IGJlbG93IGhlcmUsIGNvbnN0IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvbmx5IGFib3ZlIGhlcmUuLi5cbi8vXG4vLyBLZWVwaW5nIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBhbmQgY2xhc3NlcyB0b2dldGhlciBpbXByb3ZlcyBtaW5pZmljYXRpb24uXG4vLyBJbnRlcmZhY2VzIGFuZCB0eXBlIGFsaWFzZXMgY2FuIGJlIGludGVybGVhdmVkIGZyZWVseS5cbi8vXG5cbi8vIFR5cGUgZm9yIGNsYXNzZXMgdGhhdCBoYXZlIGEgYF9kaXJlY3RpdmVgIG9yIGBfZGlyZWN0aXZlc1tdYCBmaWVsZCwgdXNlZCBieVxuLy8gYHJlc29sdmVEaXJlY3RpdmVgXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZVBhcmVudCB7XG4gIF8kcGFyZW50PzogRGlyZWN0aXZlUGFyZW50O1xuICBfJGlzQ29ubmVjdGVkOiBib29sZWFuO1xuICBfX2RpcmVjdGl2ZT86IERpcmVjdGl2ZTtcbiAgX19kaXJlY3RpdmVzPzogQXJyYXk8RGlyZWN0aXZlIHwgdW5kZWZpbmVkPjtcbn1cblxuZnVuY3Rpb24gdHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmcoXG4gIHRzYTogVGVtcGxhdGVTdHJpbmdzQXJyYXksXG4gIHN0cmluZ0Zyb21UU0E6IHN0cmluZ1xuKTogVHJ1c3RlZEhUTUwge1xuICAvLyBBIHNlY3VyaXR5IGNoZWNrIHRvIHByZXZlbnQgc3Bvb2Zpbmcgb2YgTGl0IHRlbXBsYXRlIHJlc3VsdHMuXG4gIC8vIEluIHRoZSBmdXR1cmUsIHdlIG1heSBiZSBhYmxlIHRvIHJlcGxhY2UgdGhpcyB3aXRoIEFycmF5LmlzVGVtcGxhdGVPYmplY3QsXG4gIC8vIHRob3VnaCB3ZSBtaWdodCBuZWVkIHRvIG1ha2UgdGhhdCBjaGVjayBpbnNpZGUgb2YgdGhlIGh0bWwgYW5kIHN2Z1xuICAvLyBmdW5jdGlvbnMsIGJlY2F1c2UgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGRvbid0IGNvbWUgaW4gYXNcbiAgLy8gVGVtcGxhdGVTdHJpbmdBcnJheSBvYmplY3RzLlxuICBpZiAoIWlzQXJyYXkodHNhKSB8fCAhdHNhLmhhc093blByb3BlcnR5KCdyYXcnKSkge1xuICAgIGxldCBtZXNzYWdlID0gJ2ludmFsaWQgdGVtcGxhdGUgc3RyaW5ncyBhcnJheSc7XG4gICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICBtZXNzYWdlID0gYFxuICAgICAgICAgIEludGVybmFsIEVycm9yOiBleHBlY3RlZCB0ZW1wbGF0ZSBzdHJpbmdzIHRvIGJlIGFuIGFycmF5XG4gICAgICAgICAgd2l0aCBhICdyYXcnIGZpZWxkLiBGYWtpbmcgYSB0ZW1wbGF0ZSBzdHJpbmdzIGFycmF5IGJ5XG4gICAgICAgICAgY2FsbGluZyBodG1sIG9yIHN2ZyBsaWtlIGFuIG9yZGluYXJ5IGZ1bmN0aW9uIGlzIGVmZmVjdGl2ZWx5XG4gICAgICAgICAgdGhlIHNhbWUgYXMgY2FsbGluZyB1bnNhZmVIdG1sIGFuZCBjYW4gbGVhZCB0byBtYWpvciBzZWN1cml0eVxuICAgICAgICAgIGlzc3VlcywgZS5nLiBvcGVuaW5nIHlvdXIgY29kZSB1cCB0byBYU1MgYXR0YWNrcy5cbiAgICAgICAgICBJZiB5b3UncmUgdXNpbmcgdGhlIGh0bWwgb3Igc3ZnIHRhZ2dlZCB0ZW1wbGF0ZSBmdW5jdGlvbnMgbm9ybWFsbHlcbiAgICAgICAgICBhbmQgc3RpbGwgc2VlaW5nIHRoaXMgZXJyb3IsIHBsZWFzZSBmaWxlIGEgYnVnIGF0XG4gICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvaXNzdWVzL25ldz90ZW1wbGF0ZT1idWdfcmVwb3J0Lm1kXG4gICAgICAgICAgYW5kIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBidWlsZCB0b29saW5nLCBpZiBhbnkuXG4gICAgICAgIGBcbiAgICAgICAgLnRyaW0oKVxuICAgICAgICAucmVwbGFjZSgvXFxuICovZywgJ1xcbicpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgcmV0dXJuIHBvbGljeSAhPT0gdW5kZWZpbmVkXG4gICAgPyBwb2xpY3kuY3JlYXRlSFRNTChzdHJpbmdGcm9tVFNBKVxuICAgIDogKHN0cmluZ0Zyb21UU0EgYXMgdW5rbm93biBhcyBUcnVzdGVkSFRNTCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBIVE1MIHN0cmluZyBmb3IgdGhlIGdpdmVuIFRlbXBsYXRlU3RyaW5nc0FycmF5IGFuZCByZXN1bHQgdHlwZVxuICogKEhUTUwgb3IgU1ZHKSwgYWxvbmcgd2l0aCB0aGUgY2FzZS1zZW5zaXRpdmUgYm91bmQgYXR0cmlidXRlIG5hbWVzIGluXG4gKiB0ZW1wbGF0ZSBvcmRlci4gVGhlIEhUTUwgY29udGFpbnMgY29tbWVudCBtYXJrZXJzIGRlbm90aW5nIHRoZSBgQ2hpbGRQYXJ0YHNcbiAqIGFuZCBzdWZmaXhlcyBvbiBib3VuZCBhdHRyaWJ1dGVzIGRlbm90aW5nIHRoZSBgQXR0cmlidXRlUGFydHNgLlxuICpcbiAqIEBwYXJhbSBzdHJpbmdzIHRlbXBsYXRlIHN0cmluZ3MgYXJyYXlcbiAqIEBwYXJhbSB0eXBlIEhUTUwgb3IgU1ZHXG4gKiBAcmV0dXJuIEFycmF5IGNvbnRhaW5pbmcgYFtodG1sLCBhdHRyTmFtZXNdYCAoYXJyYXkgcmV0dXJuZWQgZm9yIHRlcnNlbmVzcyxcbiAqICAgICB0byBhdm9pZCBvYmplY3QgZmllbGRzIHNpbmNlIHRoaXMgY29kZSBpcyBzaGFyZWQgd2l0aCBub24tbWluaWZpZWQgU1NSXG4gKiAgICAgY29kZSlcbiAqL1xuY29uc3QgZ2V0VGVtcGxhdGVIdG1sID0gKFxuICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgdHlwZTogUmVzdWx0VHlwZVxuKTogW1RydXN0ZWRIVE1MLCBBcnJheTxzdHJpbmc+XSA9PiB7XG4gIC8vIEluc2VydCBtYWtlcnMgaW50byB0aGUgdGVtcGxhdGUgSFRNTCB0byByZXByZXNlbnQgdGhlIHBvc2l0aW9uIG9mXG4gIC8vIGJpbmRpbmdzLiBUaGUgZm9sbG93aW5nIGNvZGUgc2NhbnMgdGhlIHRlbXBsYXRlIHN0cmluZ3MgdG8gZGV0ZXJtaW5lIHRoZVxuICAvLyBzeW50YWN0aWMgcG9zaXRpb24gb2YgdGhlIGJpbmRpbmdzLiBUaGV5IGNhbiBiZSBpbiB0ZXh0IHBvc2l0aW9uLCB3aGVyZVxuICAvLyB3ZSBpbnNlcnQgYW4gSFRNTCBjb21tZW50LCBhdHRyaWJ1dGUgdmFsdWUgcG9zaXRpb24sIHdoZXJlIHdlIGluc2VydCBhXG4gIC8vIHNlbnRpbmVsIHN0cmluZyBhbmQgcmUtd3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lLCBvciBpbnNpZGUgYSB0YWcgd2hlcmVcbiAgLy8gd2UgaW5zZXJ0IHRoZSBzZW50aW5lbCBzdHJpbmcuXG4gIGNvbnN0IGwgPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gIC8vIFN0b3JlcyB0aGUgY2FzZS1zZW5zaXRpdmUgYm91bmQgYXR0cmlidXRlIG5hbWVzIGluIHRoZSBvcmRlciBvZiB0aGVpclxuICAvLyBwYXJ0cy4gRWxlbWVudFBhcnRzIGFyZSBhbHNvIHJlZmxlY3RlZCBpbiB0aGlzIGFycmF5IGFzIHVuZGVmaW5lZFxuICAvLyByYXRoZXIgdGhhbiBhIHN0cmluZywgdG8gZGlzYW1iaWd1YXRlIGZyb20gYXR0cmlidXRlIGJpbmRpbmdzLlxuICBjb25zdCBhdHRyTmFtZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgbGV0IGh0bWwgPVxuICAgIHR5cGUgPT09IFNWR19SRVNVTFQgPyAnPHN2Zz4nIDogdHlwZSA9PT0gTUFUSE1MX1JFU1VMVCA/ICc8bWF0aD4nIDogJyc7XG5cbiAgLy8gV2hlbiB3ZSdyZSBpbnNpZGUgYSByYXcgdGV4dCB0YWcgKG5vdCBpdCdzIHRleHQgY29udGVudCksIHRoZSByZWdleFxuICAvLyB3aWxsIHN0aWxsIGJlIHRhZ1JlZ2V4IHNvIHdlIGNhbiBmaW5kIGF0dHJpYnV0ZXMsIGJ1dCB3aWxsIHN3aXRjaCB0b1xuICAvLyB0aGlzIHJlZ2V4IHdoZW4gdGhlIHRhZyBlbmRzLlxuICBsZXQgcmF3VGV4dEVuZFJlZ2V4OiBSZWdFeHAgfCB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIGN1cnJlbnQgcGFyc2luZyBzdGF0ZSwgcmVwcmVzZW50ZWQgYXMgYSByZWZlcmVuY2UgdG8gb25lIG9mIHRoZVxuICAvLyByZWdleGVzXG4gIGxldCByZWdleCA9IHRleHRFbmRSZWdleDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IHMgPSBzdHJpbmdzW2ldO1xuICAgIC8vIFRoZSBpbmRleCBvZiB0aGUgZW5kIG9mIHRoZSBsYXN0IGF0dHJpYnV0ZSBuYW1lLiBXaGVuIHRoaXMgaXNcbiAgICAvLyBwb3NpdGl2ZSBhdCBlbmQgb2YgYSBzdHJpbmcsIGl0IG1lYW5zIHdlJ3JlIGluIGFuIGF0dHJpYnV0ZSB2YWx1ZVxuICAgIC8vIHBvc2l0aW9uIGFuZCBuZWVkIHRvIHJld3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lLlxuICAgIC8vIFdlIGFsc28gdXNlIGEgc3BlY2lhbCB2YWx1ZSBvZiAtMiB0byBpbmRpY2F0ZSB0aGF0IHdlIGVuY291bnRlcmVkXG4gICAgLy8gdGhlIGVuZCBvZiBhIHN0cmluZyBpbiBhdHRyaWJ1dGUgbmFtZSBwb3NpdGlvbi5cbiAgICBsZXQgYXR0ck5hbWVFbmRJbmRleCA9IC0xO1xuICAgIGxldCBhdHRyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBsYXN0SW5kZXggPSAwO1xuICAgIGxldCBtYXRjaCE6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGw7XG5cbiAgICAvLyBUaGUgY29uZGl0aW9ucyBpbiB0aGlzIGxvb3AgaGFuZGxlIHRoZSBjdXJyZW50IHBhcnNlIHN0YXRlLCBhbmQgdGhlXG4gICAgLy8gYXNzaWdubWVudHMgdG8gdGhlIGByZWdleGAgdmFyaWFibGUgYXJlIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucy5cbiAgICB3aGlsZSAobGFzdEluZGV4IDwgcy5sZW5ndGgpIHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aGVyZSB3ZSBwcmV2aW91c2x5IGxlZnQgb2ZmXG4gICAgICByZWdleC5sYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICBtYXRjaCA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsYXN0SW5kZXggPSByZWdleC5sYXN0SW5kZXg7XG4gICAgICBpZiAocmVnZXggPT09IHRleHRFbmRSZWdleCkge1xuICAgICAgICBpZiAobWF0Y2hbQ09NTUVOVF9TVEFSVF0gPT09ICchLS0nKSB7XG4gICAgICAgICAgcmVnZXggPSBjb21tZW50RW5kUmVnZXg7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbQ09NTUVOVF9TVEFSVF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFdlIHN0YXJ0ZWQgYSB3ZWlyZCBjb21tZW50LCBsaWtlIDwve1xuICAgICAgICAgIHJlZ2V4ID0gY29tbWVudDJFbmRSZWdleDtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaFtUQUdfTkFNRV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChyYXdUZXh0RWxlbWVudC50ZXN0KG1hdGNoW1RBR19OQU1FXSkpIHtcbiAgICAgICAgICAgIC8vIFJlY29yZCBpZiB3ZSBlbmNvdW50ZXIgYSByYXctdGV4dCBlbGVtZW50LiBXZSdsbCBzd2l0Y2ggdG9cbiAgICAgICAgICAgIC8vIHRoaXMgcmVnZXggYXQgdGhlIGVuZCBvZiB0aGUgdGFnLlxuICAgICAgICAgICAgcmF3VGV4dEVuZFJlZ2V4ID0gbmV3IFJlZ0V4cChgPC8ke21hdGNoW1RBR19OQU1FXX1gLCAnZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoW0RZTkFNSUNfVEFHX05BTUVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ0JpbmRpbmdzIGluIHRhZyBuYW1lcyBhcmUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBzdGF0aWMgdGVtcGxhdGVzIGluc3RlYWQuICcgK1xuICAgICAgICAgICAgICAgICdTZWUgaHR0cHM6Ly9saXQuZGV2L2RvY3MvdGVtcGxhdGVzL2V4cHJlc3Npb25zLyNzdGF0aWMtZXhwcmVzc2lvbnMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlZ2V4ID09PSB0YWdFbmRSZWdleCkge1xuICAgICAgICBpZiAobWF0Y2hbRU5USVJFX01BVENIXSA9PT0gJz4nKSB7XG4gICAgICAgICAgLy8gRW5kIG9mIGEgdGFnLiBJZiB3ZSBoYWQgc3RhcnRlZCBhIHJhdy10ZXh0IGVsZW1lbnQsIHVzZSB0aGF0XG4gICAgICAgICAgLy8gcmVnZXhcbiAgICAgICAgICByZWdleCA9IHJhd1RleHRFbmRSZWdleCA/PyB0ZXh0RW5kUmVnZXg7XG4gICAgICAgICAgLy8gV2UgbWF5IGJlIGVuZGluZyBhbiB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUsIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICAgIC8vIGNsZWFyIGFueSBwZW5kaW5nIGF0dHJOYW1lRW5kSW5kZXhcbiAgICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID0gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbQVRUUklCVVRFX05BTUVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBBdHRyaWJ1dGUgbmFtZSBwb3NpdGlvblxuICAgICAgICAgIGF0dHJOYW1lRW5kSW5kZXggPSAtMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID0gcmVnZXgubGFzdEluZGV4IC0gbWF0Y2hbU1BBQ0VTX0FORF9FUVVBTFNdLmxlbmd0aDtcbiAgICAgICAgICBhdHRyTmFtZSA9IG1hdGNoW0FUVFJJQlVURV9OQU1FXTtcbiAgICAgICAgICByZWdleCA9XG4gICAgICAgICAgICBtYXRjaFtRVU9URV9DSEFSXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gdGFnRW5kUmVnZXhcbiAgICAgICAgICAgICAgOiBtYXRjaFtRVU9URV9DSEFSXSA9PT0gJ1wiJ1xuICAgICAgICAgICAgICAgID8gZG91YmxlUXVvdGVBdHRyRW5kUmVnZXhcbiAgICAgICAgICAgICAgICA6IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICByZWdleCA9PT0gZG91YmxlUXVvdGVBdHRyRW5kUmVnZXggfHxcbiAgICAgICAgcmVnZXggPT09IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4XG4gICAgICApIHtcbiAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgIH0gZWxzZSBpZiAocmVnZXggPT09IGNvbW1lbnRFbmRSZWdleCB8fCByZWdleCA9PT0gY29tbWVudDJFbmRSZWdleCkge1xuICAgICAgICByZWdleCA9IHRleHRFbmRSZWdleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vdCBvbmUgb2YgdGhlIGZpdmUgc3RhdGUgcmVnZXhlcywgc28gaXQgbXVzdCBiZSB0aGUgZHluYW1pY2FsbHlcbiAgICAgICAgLy8gY3JlYXRlZCByYXcgdGV4dCByZWdleCBhbmQgd2UncmUgYXQgdGhlIGNsb3NlIG9mIHRoYXQgZWxlbWVudC5cbiAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgICAgcmF3VGV4dEVuZFJlZ2V4ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBhIGF0dHJOYW1lRW5kSW5kZXgsIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZFxuICAgICAgLy8gcmV3cml0ZSB0aGUgYXR0cmlidXRlIG5hbWUsIGFzc2VydCB0aGF0IHdlJ3JlIGluIGEgdmFsaWQgYXR0cmlidXRlXG4gICAgICAvLyBwb3NpdGlvbiAtIGVpdGhlciBpbiBhIHRhZywgb3IgYSBxdW90ZWQgYXR0cmlidXRlIHZhbHVlLlxuICAgICAgY29uc29sZS5hc3NlcnQoXG4gICAgICAgIGF0dHJOYW1lRW5kSW5kZXggPT09IC0xIHx8XG4gICAgICAgICAgcmVnZXggPT09IHRhZ0VuZFJlZ2V4IHx8XG4gICAgICAgICAgcmVnZXggPT09IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4IHx8XG4gICAgICAgICAgcmVnZXggPT09IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4LFxuICAgICAgICAndW5leHBlY3RlZCBwYXJzZSBzdGF0ZSBCJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBXZSBoYXZlIGZvdXIgY2FzZXM6XG4gICAgLy8gIDEuIFdlJ3JlIGluIHRleHQgcG9zaXRpb24sIGFuZCBub3QgaW4gYSByYXcgdGV4dCBlbGVtZW50XG4gICAgLy8gICAgIChyZWdleCA9PT0gdGV4dEVuZFJlZ2V4KTogaW5zZXJ0IGEgY29tbWVudCBtYXJrZXIuXG4gICAgLy8gIDIuIFdlIGhhdmUgYSBub24tbmVnYXRpdmUgYXR0ck5hbWVFbmRJbmRleCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvXG4gICAgLy8gICAgIHJld3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGFkZCBhIGJvdW5kIGF0dHJpYnV0ZSBzdWZmaXguXG4gICAgLy8gIDMuIFdlJ3JlIGF0IHRoZSBub24tZmlyc3QgYmluZGluZyBpbiBhIG11bHRpLWJpbmRpbmcgYXR0cmlidXRlLCB1c2UgYVxuICAgIC8vICAgICBwbGFpbiBtYXJrZXIuXG4gICAgLy8gIDQuIFdlJ3JlIHNvbWV3aGVyZSBlbHNlIGluc2lkZSB0aGUgdGFnLiBJZiB3ZSdyZSBpbiBhdHRyaWJ1dGUgbmFtZVxuICAgIC8vICAgICBwb3NpdGlvbiAoYXR0ck5hbWVFbmRJbmRleCA9PT0gLTIpLCBhZGQgYSBzZXF1ZW50aWFsIHN1ZmZpeCB0b1xuICAgIC8vICAgICBnZW5lcmF0ZSBhIHVuaXF1ZSBhdHRyaWJ1dGUgbmFtZS5cblxuICAgIC8vIERldGVjdCBhIGJpbmRpbmcgbmV4dCB0byBzZWxmLWNsb3NpbmcgdGFnIGVuZCBhbmQgaW5zZXJ0IGEgc3BhY2UgdG9cbiAgICAvLyBzZXBhcmF0ZSB0aGUgbWFya2VyIGZyb20gdGhlIHRhZyBlbmQ6XG4gICAgY29uc3QgZW5kID1cbiAgICAgIHJlZ2V4ID09PSB0YWdFbmRSZWdleCAmJiBzdHJpbmdzW2kgKyAxXS5zdGFydHNXaXRoKCcvPicpID8gJyAnIDogJyc7XG4gICAgaHRtbCArPVxuICAgICAgcmVnZXggPT09IHRleHRFbmRSZWdleFxuICAgICAgICA/IHMgKyBub2RlTWFya2VyXG4gICAgICAgIDogYXR0ck5hbWVFbmRJbmRleCA+PSAwXG4gICAgICAgICAgPyAoYXR0ck5hbWVzLnB1c2goYXR0ck5hbWUhKSxcbiAgICAgICAgICAgIHMuc2xpY2UoMCwgYXR0ck5hbWVFbmRJbmRleCkgK1xuICAgICAgICAgICAgICBib3VuZEF0dHJpYnV0ZVN1ZmZpeCArXG4gICAgICAgICAgICAgIHMuc2xpY2UoYXR0ck5hbWVFbmRJbmRleCkpICtcbiAgICAgICAgICAgIG1hcmtlciArXG4gICAgICAgICAgICBlbmRcbiAgICAgICAgICA6IHMgKyBtYXJrZXIgKyAoYXR0ck5hbWVFbmRJbmRleCA9PT0gLTIgPyBpIDogZW5kKTtcbiAgfVxuXG4gIGNvbnN0IGh0bWxSZXN1bHQ6IHN0cmluZyB8IFRydXN0ZWRIVE1MID1cbiAgICBodG1sICtcbiAgICAoc3RyaW5nc1tsXSB8fCAnPD8+JykgK1xuICAgICh0eXBlID09PSBTVkdfUkVTVUxUID8gJzwvc3ZnPicgOiB0eXBlID09PSBNQVRITUxfUkVTVUxUID8gJzwvbWF0aD4nIDogJycpO1xuXG4gIC8vIFJldHVybmVkIGFzIGFuIGFycmF5IGZvciB0ZXJzZW5lc3NcbiAgcmV0dXJuIFt0cnVzdEZyb21UZW1wbGF0ZVN0cmluZyhzdHJpbmdzLCBodG1sUmVzdWx0KSwgYXR0ck5hbWVzXTtcbn07XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCB0eXBlIHtUZW1wbGF0ZX07XG5jbGFzcyBUZW1wbGF0ZSB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZWwhOiBIVE1MVGVtcGxhdGVFbGVtZW50O1xuXG4gIHBhcnRzOiBBcnJheTxUZW1wbGF0ZVBhcnQ+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICB7c3RyaW5ncywgWydfJGxpdFR5cGUkJ106IHR5cGV9OiBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQsXG4gICAgb3B0aW9ucz86IFJlbmRlck9wdGlvbnNcbiAgKSB7XG4gICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsO1xuICAgIGxldCBub2RlSW5kZXggPSAwO1xuICAgIGxldCBhdHRyTmFtZUluZGV4ID0gMDtcbiAgICBjb25zdCBwYXJ0Q291bnQgPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzO1xuXG4gICAgLy8gQ3JlYXRlIHRlbXBsYXRlIGVsZW1lbnRcbiAgICBjb25zdCBbaHRtbCwgYXR0ck5hbWVzXSA9IGdldFRlbXBsYXRlSHRtbChzdHJpbmdzLCB0eXBlKTtcbiAgICB0aGlzLmVsID0gVGVtcGxhdGUuY3JlYXRlRWxlbWVudChodG1sLCBvcHRpb25zKTtcbiAgICB3YWxrZXIuY3VycmVudE5vZGUgPSB0aGlzLmVsLmNvbnRlbnQ7XG5cbiAgICAvLyBSZS1wYXJlbnQgU1ZHIG9yIE1hdGhNTCBub2RlcyBpbnRvIHRlbXBsYXRlIHJvb3RcbiAgICBpZiAodHlwZSA9PT0gU1ZHX1JFU1VMVCB8fCB0eXBlID09PSBNQVRITUxfUkVTVUxUKSB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5lbC5jb250ZW50LmZpcnN0Q2hpbGQhO1xuICAgICAgd3JhcHBlci5yZXBsYWNlV2l0aCguLi53cmFwcGVyLmNoaWxkTm9kZXMpO1xuICAgIH1cblxuICAgIC8vIFdhbGsgdGhlIHRlbXBsYXRlIHRvIGZpbmQgYmluZGluZyBtYXJrZXJzIGFuZCBjcmVhdGUgVGVtcGxhdGVQYXJ0c1xuICAgIHdoaWxlICgobm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpKSAhPT0gbnVsbCAmJiBwYXJ0cy5sZW5ndGggPCBwYXJ0Q291bnQpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgIGNvbnN0IHRhZyA9IChub2RlIGFzIEVsZW1lbnQpLmxvY2FsTmFtZTtcbiAgICAgICAgICAvLyBXYXJuIGlmIGB0ZXh0YXJlYWAgaW5jbHVkZXMgYW4gZXhwcmVzc2lvbiBhbmQgdGhyb3cgaWYgYHRlbXBsYXRlYFxuICAgICAgICAgIC8vIGRvZXMgc2luY2UgdGhlc2UgYXJlIG5vdCBzdXBwb3J0ZWQuIFdlIGRvIHRoaXMgYnkgY2hlY2tpbmdcbiAgICAgICAgICAvLyBpbm5lckhUTUwgZm9yIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIG1hcmtlci4gVGhpcyBjYXRjaGVzXG4gICAgICAgICAgLy8gY2FzZXMgbGlrZSBiaW5kaW5ncyBpbiB0ZXh0YXJlYSB0aGVyZSBtYXJrZXJzIHR1cm4gaW50byB0ZXh0IG5vZGVzLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC9eKD86dGV4dGFyZWF8dGVtcGxhdGUpJC9pIS50ZXN0KHRhZykgJiZcbiAgICAgICAgICAgIChub2RlIGFzIEVsZW1lbnQpLmlubmVySFRNTC5pbmNsdWRlcyhtYXJrZXIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBtID1cbiAgICAgICAgICAgICAgYEV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluc2lkZSBcXGAke3RhZ31cXGAgYCArXG4gICAgICAgICAgICAgIGBlbGVtZW50cy4gU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvZXhwcmVzc2lvbi1pbi0ke3RhZ30gZm9yIG1vcmUgYCArXG4gICAgICAgICAgICAgIGBpbmZvcm1hdGlvbi5gO1xuICAgICAgICAgICAgaWYgKHRhZyA9PT0gJ3RlbXBsYXRlJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobSk7XG4gICAgICAgICAgICB9IGVsc2UgaXNzdWVXYXJuaW5nKCcnLCBtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IGZvciBhdHRlbXB0ZWQgZHluYW1pYyB0YWcgbmFtZXMsIHdlIGRvbid0XG4gICAgICAgIC8vIGluY3JlbWVudCB0aGUgYmluZGluZ0luZGV4LCBhbmQgaXQnbGwgYmUgb2ZmIGJ5IDEgaW4gdGhlIGVsZW1lbnRcbiAgICAgICAgLy8gYW5kIG9mZiBieSB0d28gYWZ0ZXIgaXQuXG4gICAgICAgIGlmICgobm9kZSBhcyBFbGVtZW50KS5oYXNBdHRyaWJ1dGVzKCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoYm91bmRBdHRyaWJ1dGVTdWZmaXgpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlYWxOYW1lID0gYXR0ck5hbWVzW2F0dHJOYW1lSW5kZXgrK107XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKG5hbWUpITtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdGljcyA9IHZhbHVlLnNwbGl0KG1hcmtlcik7XG4gICAgICAgICAgICAgIGNvbnN0IG0gPSAvKFsuP0BdKT8oLiopLy5leGVjKHJlYWxOYW1lKSE7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IEFUVFJJQlVURV9QQVJULFxuICAgICAgICAgICAgICAgIGluZGV4OiBub2RlSW5kZXgsXG4gICAgICAgICAgICAgICAgbmFtZTogbVsyXSxcbiAgICAgICAgICAgICAgICBzdHJpbmdzOiBzdGF0aWNzLFxuICAgICAgICAgICAgICAgIGN0b3I6XG4gICAgICAgICAgICAgICAgICBtWzFdID09PSAnLidcbiAgICAgICAgICAgICAgICAgICAgPyBQcm9wZXJ0eVBhcnRcbiAgICAgICAgICAgICAgICAgICAgOiBtWzFdID09PSAnPydcbiAgICAgICAgICAgICAgICAgICAgICA/IEJvb2xlYW5BdHRyaWJ1dGVQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgOiBtWzFdID09PSAnQCdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gRXZlbnRQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IEF0dHJpYnV0ZVBhcnQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAobm9kZSBhcyBFbGVtZW50KS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChtYXJrZXIpKSB7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IEVMRU1FTlRfUEFSVCxcbiAgICAgICAgICAgICAgICBpbmRleDogbm9kZUluZGV4LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIChqdXN0aW5mYWduYW5pKTogYmVuY2htYXJrIHRoZSByZWdleCBhZ2FpbnN0IHRlc3RpbmcgZm9yIGVhY2hcbiAgICAgICAgLy8gb2YgdGhlIDMgcmF3IHRleHQgZWxlbWVudCBuYW1lcy5cbiAgICAgICAgaWYgKHJhd1RleHRFbGVtZW50LnRlc3QoKG5vZGUgYXMgRWxlbWVudCkudGFnTmFtZSkpIHtcbiAgICAgICAgICAvLyBGb3IgcmF3IHRleHQgZWxlbWVudHMgd2UgbmVlZCB0byBzcGxpdCB0aGUgdGV4dCBjb250ZW50IG9uXG4gICAgICAgICAgLy8gbWFya2VycywgY3JlYXRlIGEgVGV4dCBub2RlIGZvciBlYWNoIHNlZ21lbnQsIGFuZCBjcmVhdGVcbiAgICAgICAgICAvLyBhIFRlbXBsYXRlUGFydCBmb3IgZWFjaCBtYXJrZXIuXG4gICAgICAgICAgY29uc3Qgc3RyaW5ncyA9IChub2RlIGFzIEVsZW1lbnQpLnRleHRDb250ZW50IS5zcGxpdChtYXJrZXIpO1xuICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHN0cmluZ3MubGVuZ3RoIC0gMTtcbiAgICAgICAgICBpZiAobGFzdEluZGV4ID4gMCkge1xuICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkudGV4dENvbnRlbnQgPSB0cnVzdGVkVHlwZXNcbiAgICAgICAgICAgICAgPyAodHJ1c3RlZFR5cGVzLmVtcHR5U2NyaXB0IGFzIHVua25vd24gYXMgJycpXG4gICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIG5ldyB0ZXh0IG5vZGUgZm9yIGVhY2ggbGl0ZXJhbCBzZWN0aW9uXG4gICAgICAgICAgICAvLyBUaGVzZSBub2RlcyBhcmUgYWxzbyB1c2VkIGFzIHRoZSBtYXJrZXJzIGZvciBjaGlsZCBwYXJ0c1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXN0SW5kZXg7IGkrKykge1xuICAgICAgICAgICAgICAobm9kZSBhcyBFbGVtZW50KS5hcHBlbmQoc3RyaW5nc1tpXSwgY3JlYXRlTWFya2VyKCkpO1xuICAgICAgICAgICAgICAvLyBXYWxrIHBhc3QgdGhlIG1hcmtlciBub2RlIHdlIGp1c3QgYWRkZWRcbiAgICAgICAgICAgICAgd2Fsa2VyLm5leHROb2RlKCk7XG4gICAgICAgICAgICAgIHBhcnRzLnB1c2goe3R5cGU6IENISUxEX1BBUlQsIGluZGV4OiArK25vZGVJbmRleH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTm90ZSBiZWNhdXNlIHRoaXMgbWFya2VyIGlzIGFkZGVkIGFmdGVyIHRoZSB3YWxrZXIncyBjdXJyZW50XG4gICAgICAgICAgICAvLyBub2RlLCBpdCB3aWxsIGJlIHdhbGtlZCB0byBpbiB0aGUgb3V0ZXIgbG9vcCAoYW5kIGlnbm9yZWQpLCBzb1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBhZGp1c3Qgbm9kZUluZGV4IGhlcmVcbiAgICAgICAgICAgIChub2RlIGFzIEVsZW1lbnQpLmFwcGVuZChzdHJpbmdzW2xhc3RJbmRleF0sIGNyZWF0ZU1hcmtlcigpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gOCkge1xuICAgICAgICBjb25zdCBkYXRhID0gKG5vZGUgYXMgQ29tbWVudCkuZGF0YTtcbiAgICAgICAgaWYgKGRhdGEgPT09IG1hcmtlck1hdGNoKSB7XG4gICAgICAgICAgcGFydHMucHVzaCh7dHlwZTogQ0hJTERfUEFSVCwgaW5kZXg6IG5vZGVJbmRleH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBpID0gLTE7XG4gICAgICAgICAgd2hpbGUgKChpID0gKG5vZGUgYXMgQ29tbWVudCkuZGF0YS5pbmRleE9mKG1hcmtlciwgaSArIDEpKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIENvbW1lbnQgbm9kZSBoYXMgYSBiaW5kaW5nIG1hcmtlciBpbnNpZGUsIG1ha2UgYW4gaW5hY3RpdmUgcGFydFxuICAgICAgICAgICAgLy8gVGhlIGJpbmRpbmcgd29uJ3Qgd29yaywgYnV0IHN1YnNlcXVlbnQgYmluZGluZ3Mgd2lsbFxuICAgICAgICAgICAgcGFydHMucHVzaCh7dHlwZTogQ09NTUVOVF9QQVJULCBpbmRleDogbm9kZUluZGV4fSk7XG4gICAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoXG4gICAgICAgICAgICBpICs9IG1hcmtlci5sZW5ndGggLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbm9kZUluZGV4Kys7XG4gICAgfVxuXG4gICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAvLyBJZiB0aGVyZSB3YXMgYSBkdXBsaWNhdGUgYXR0cmlidXRlIG9uIGEgdGFnLCB0aGVuIHdoZW4gdGhlIHRhZyBpc1xuICAgICAgLy8gcGFyc2VkIGludG8gYW4gZWxlbWVudCB0aGUgYXR0cmlidXRlIGdldHMgZGUtZHVwbGljYXRlZC4gV2UgY2FuIGRldGVjdFxuICAgICAgLy8gdGhpcyBtaXNtYXRjaCBpZiB3ZSBoYXZlbid0IHByZWNpc2VseSBjb25zdW1lZCBldmVyeSBhdHRyaWJ1dGUgbmFtZVxuICAgICAgLy8gd2hlbiBwcmVwYXJpbmcgdGhlIHRlbXBsYXRlLiBUaGlzIHdvcmtzIGJlY2F1c2UgYGF0dHJOYW1lc2AgaXMgYnVpbHRcbiAgICAgIC8vIGZyb20gdGhlIHRlbXBsYXRlIHN0cmluZyBhbmQgYGF0dHJOYW1lSW5kZXhgIGNvbWVzIGZyb20gcHJvY2Vzc2luZyB0aGVcbiAgICAgIC8vIHJlc3VsdGluZyBET00uXG4gICAgICBpZiAoYXR0ck5hbWVzLmxlbmd0aCAhPT0gYXR0ck5hbWVJbmRleCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYERldGVjdGVkIGR1cGxpY2F0ZSBhdHRyaWJ1dGUgYmluZGluZ3MuIFRoaXMgb2NjdXJzIGlmIHlvdXIgdGVtcGxhdGUgYCArXG4gICAgICAgICAgICBgaGFzIGR1cGxpY2F0ZSBhdHRyaWJ1dGVzIG9uIGFuIGVsZW1lbnQgdGFnLiBGb3IgZXhhbXBsZSBgICtcbiAgICAgICAgICAgIGBcIjxpbnB1dCA/ZGlzYWJsZWQ9XFwke3RydWV9ID9kaXNhYmxlZD1cXCR7ZmFsc2V9PlwiIGNvbnRhaW5zIGEgYCArXG4gICAgICAgICAgICBgZHVwbGljYXRlIFwiZGlzYWJsZWRcIiBhdHRyaWJ1dGUuIFRoZSBlcnJvciB3YXMgZGV0ZWN0ZWQgaW4gYCArXG4gICAgICAgICAgICBgdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZTogXFxuYCArXG4gICAgICAgICAgICAnYCcgK1xuICAgICAgICAgICAgc3RyaW5ncy5qb2luKCckey4uLn0nKSArXG4gICAgICAgICAgICAnYCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXZSBjb3VsZCBzZXQgd2Fsa2VyLmN1cnJlbnROb2RlIHRvIGFub3RoZXIgbm9kZSBoZXJlIHRvIHByZXZlbnQgYSBtZW1vcnlcbiAgICAvLyBsZWFrLCBidXQgZXZlcnkgdGltZSB3ZSBwcmVwYXJlIGEgdGVtcGxhdGUsIHdlIGltbWVkaWF0ZWx5IHJlbmRlciBpdFxuICAgIC8vIGFuZCByZS11c2UgdGhlIHdhbGtlciBpbiBuZXcgVGVtcGxhdGVJbnN0YW5jZS5fY2xvbmUoKS5cbiAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAga2luZDogJ3RlbXBsYXRlIHByZXAnLFxuICAgICAgICB0ZW1wbGF0ZTogdGhpcyxcbiAgICAgICAgY2xvbmFibGVUZW1wbGF0ZTogdGhpcy5lbCxcbiAgICAgICAgcGFydHM6IHRoaXMucGFydHMsXG4gICAgICAgIHN0cmluZ3MsXG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIE92ZXJyaWRkZW4gdmlhIGBsaXRIdG1sUG9seWZpbGxTdXBwb3J0YCB0byBwcm92aWRlIHBsYXRmb3JtIHN1cHBvcnQuXG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY3JlYXRlRWxlbWVudChodG1sOiBUcnVzdGVkSFRNTCwgX29wdGlvbnM/OiBSZW5kZXJPcHRpb25zKSB7XG4gICAgY29uc3QgZWwgPSBkLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgZWwuaW5uZXJIVE1MID0gaHRtbCBhcyB1bmtub3duIGFzIHN0cmluZztcbiAgICByZXR1cm4gZWw7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaXNjb25uZWN0YWJsZSB7XG4gIF8kcGFyZW50PzogRGlzY29ubmVjdGFibGU7XG4gIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT47XG4gIC8vIFJhdGhlciB0aGFuIGhvbGQgY29ubmVjdGlvbiBzdGF0ZSBvbiBpbnN0YW5jZXMsIERpc2Nvbm5lY3RhYmxlcyByZWN1cnNpdmVseVxuICAvLyBmZXRjaCB0aGUgY29ubmVjdGlvbiBzdGF0ZSBmcm9tIHRoZSBSb290UGFydCB0aGV5IGFyZSBjb25uZWN0ZWQgaW4gdmlhXG4gIC8vIGdldHRlcnMgdXAgdGhlIERpc2Nvbm5lY3RhYmxlIHRyZWUgdmlhIF8kcGFyZW50IHJlZmVyZW5jZXMuIFRoaXMgcHVzaGVzIHRoZVxuICAvLyBjb3N0IG9mIHRyYWNraW5nIHRoZSBpc0Nvbm5lY3RlZCBzdGF0ZSB0byBgQXN5bmNEaXJlY3RpdmVzYCwgYW5kIGF2b2lkc1xuICAvLyBuZWVkaW5nIHRvIHBhc3MgYWxsIERpc2Nvbm5lY3RhYmxlcyAocGFydHMsIHRlbXBsYXRlIGluc3RhbmNlcywgYW5kXG4gIC8vIGRpcmVjdGl2ZXMpIHRoZWlyIGNvbm5lY3Rpb24gc3RhdGUgZWFjaCB0aW1lIGl0IGNoYW5nZXMsIHdoaWNoIHdvdWxkIGJlXG4gIC8vIGNvc3RseSBmb3IgdHJlZXMgdGhhdCBoYXZlIG5vIEFzeW5jRGlyZWN0aXZlcy5cbiAgXyRpc0Nvbm5lY3RlZDogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURpcmVjdGl2ZShcbiAgcGFydDogQ2hpbGRQYXJ0IHwgQXR0cmlidXRlUGFydCB8IEVsZW1lbnRQYXJ0LFxuICB2YWx1ZTogdW5rbm93bixcbiAgcGFyZW50OiBEaXJlY3RpdmVQYXJlbnQgPSBwYXJ0LFxuICBhdHRyaWJ1dGVJbmRleD86IG51bWJlclxuKTogdW5rbm93biB7XG4gIC8vIEJhaWwgZWFybHkgaWYgdGhlIHZhbHVlIGlzIGV4cGxpY2l0bHkgbm9DaGFuZ2UuIE5vdGUsIHRoaXMgbWVhbnMgYW55XG4gIC8vIG5lc3RlZCBkaXJlY3RpdmUgaXMgc3RpbGwgYXR0YWNoZWQgYW5kIGlzIG5vdCBydW4uXG4gIGlmICh2YWx1ZSA9PT0gbm9DaGFuZ2UpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgbGV0IGN1cnJlbnREaXJlY3RpdmUgPVxuICAgIGF0dHJpYnV0ZUluZGV4ICE9PSB1bmRlZmluZWRcbiAgICAgID8gKHBhcmVudCBhcyBBdHRyaWJ1dGVQYXJ0KS5fX2RpcmVjdGl2ZXM/LlthdHRyaWJ1dGVJbmRleF1cbiAgICAgIDogKHBhcmVudCBhcyBDaGlsZFBhcnQgfCBFbGVtZW50UGFydCB8IERpcmVjdGl2ZSkuX19kaXJlY3RpdmU7XG4gIGNvbnN0IG5leHREaXJlY3RpdmVDb25zdHJ1Y3RvciA9IGlzUHJpbWl0aXZlKHZhbHVlKVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgKHZhbHVlIGFzIERpcmVjdGl2ZVJlc3VsdClbJ18kbGl0RGlyZWN0aXZlJCddO1xuICBpZiAoY3VycmVudERpcmVjdGl2ZT8uY29uc3RydWN0b3IgIT09IG5leHREaXJlY3RpdmVDb25zdHJ1Y3Rvcikge1xuICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgY3VycmVudERpcmVjdGl2ZT8uWydfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkJ10/LihmYWxzZSk7XG4gICAgaWYgKG5leHREaXJlY3RpdmVDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjdXJyZW50RGlyZWN0aXZlID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50RGlyZWN0aXZlID0gbmV3IG5leHREaXJlY3RpdmVDb25zdHJ1Y3RvcihwYXJ0IGFzIFBhcnRJbmZvKTtcbiAgICAgIGN1cnJlbnREaXJlY3RpdmUuXyRpbml0aWFsaXplKHBhcnQsIHBhcmVudCwgYXR0cmlidXRlSW5kZXgpO1xuICAgIH1cbiAgICBpZiAoYXR0cmlidXRlSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgKChwYXJlbnQgYXMgQXR0cmlidXRlUGFydCkuX19kaXJlY3RpdmVzID8/PSBbXSlbYXR0cmlidXRlSW5kZXhdID1cbiAgICAgICAgY3VycmVudERpcmVjdGl2ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgKHBhcmVudCBhcyBDaGlsZFBhcnQgfCBEaXJlY3RpdmUpLl9fZGlyZWN0aXZlID0gY3VycmVudERpcmVjdGl2ZTtcbiAgICB9XG4gIH1cbiAgaWYgKGN1cnJlbnREaXJlY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbHVlID0gcmVzb2x2ZURpcmVjdGl2ZShcbiAgICAgIHBhcnQsXG4gICAgICBjdXJyZW50RGlyZWN0aXZlLl8kcmVzb2x2ZShwYXJ0LCAodmFsdWUgYXMgRGlyZWN0aXZlUmVzdWx0KS52YWx1ZXMpLFxuICAgICAgY3VycmVudERpcmVjdGl2ZSxcbiAgICAgIGF0dHJpYnV0ZUluZGV4XG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCB0eXBlIHtUZW1wbGF0ZUluc3RhbmNlfTtcbi8qKlxuICogQW4gdXBkYXRlYWJsZSBpbnN0YW5jZSBvZiBhIFRlbXBsYXRlLiBIb2xkcyByZWZlcmVuY2VzIHRvIHRoZSBQYXJ0cyB1c2VkIHRvXG4gKiB1cGRhdGUgdGhlIHRlbXBsYXRlIGluc3RhbmNlLlxuICovXG5jbGFzcyBUZW1wbGF0ZUluc3RhbmNlIGltcGxlbWVudHMgRGlzY29ubmVjdGFibGUge1xuICBfJHRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgXyRwYXJ0czogQXJyYXk8UGFydCB8IHVuZGVmaW5lZD4gPSBbXTtcblxuICAvKiogQGludGVybmFsICovXG4gIF8kcGFyZW50OiBDaGlsZFBhcnQ7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuPzogU2V0PERpc2Nvbm5lY3RhYmxlPiA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZTogVGVtcGxhdGUsIHBhcmVudDogQ2hpbGRQYXJ0KSB7XG4gICAgdGhpcy5fJHRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgfVxuXG4gIC8vIENhbGxlZCBieSBDaGlsZFBhcnQgcGFyZW50Tm9kZSBnZXR0ZXJcbiAgZ2V0IHBhcmVudE5vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQucGFyZW50Tm9kZTtcbiAgfVxuXG4gIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQuXyRpc0Nvbm5lY3RlZDtcbiAgfVxuXG4gIC8vIFRoaXMgbWV0aG9kIGlzIHNlcGFyYXRlIGZyb20gdGhlIGNvbnN0cnVjdG9yIGJlY2F1c2Ugd2UgbmVlZCB0byByZXR1cm4gYVxuICAvLyBEb2N1bWVudEZyYWdtZW50IGFuZCB3ZSBkb24ndCB3YW50IHRvIGhvbGQgb250byBpdCB3aXRoIGFuIGluc3RhbmNlIGZpZWxkLlxuICBfY2xvbmUob3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGVsOiB7Y29udGVudH0sXG4gICAgICBwYXJ0czogcGFydHMsXG4gICAgfSA9IHRoaXMuXyR0ZW1wbGF0ZTtcbiAgICBjb25zdCBmcmFnbWVudCA9IChvcHRpb25zPy5jcmVhdGlvblNjb3BlID8/IGQpLmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSk7XG4gICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gZnJhZ21lbnQ7XG5cbiAgICBsZXQgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpITtcbiAgICBsZXQgbm9kZUluZGV4ID0gMDtcbiAgICBsZXQgcGFydEluZGV4ID0gMDtcbiAgICBsZXQgdGVtcGxhdGVQYXJ0ID0gcGFydHNbMF07XG5cbiAgICB3aGlsZSAodGVtcGxhdGVQYXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChub2RlSW5kZXggPT09IHRlbXBsYXRlUGFydC5pbmRleCkge1xuICAgICAgICBsZXQgcGFydDogUGFydCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRlbXBsYXRlUGFydC50eXBlID09PSBDSElMRF9QQVJUKSB7XG4gICAgICAgICAgcGFydCA9IG5ldyBDaGlsZFBhcnQoXG4gICAgICAgICAgICBub2RlIGFzIEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgbm9kZS5uZXh0U2libGluZyxcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZVBhcnQudHlwZSA9PT0gQVRUUklCVVRFX1BBUlQpIHtcbiAgICAgICAgICBwYXJ0ID0gbmV3IHRlbXBsYXRlUGFydC5jdG9yKFxuICAgICAgICAgICAgbm9kZSBhcyBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgIHRlbXBsYXRlUGFydC5uYW1lLFxuICAgICAgICAgICAgdGVtcGxhdGVQYXJ0LnN0cmluZ3MsXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGVtcGxhdGVQYXJ0LnR5cGUgPT09IEVMRU1FTlRfUEFSVCkge1xuICAgICAgICAgIHBhcnQgPSBuZXcgRWxlbWVudFBhcnQobm9kZSBhcyBIVE1MRWxlbWVudCwgdGhpcywgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fJHBhcnRzLnB1c2gocGFydCk7XG4gICAgICAgIHRlbXBsYXRlUGFydCA9IHBhcnRzWysrcGFydEluZGV4XTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlSW5kZXggIT09IHRlbXBsYXRlUGFydD8uaW5kZXgpIHtcbiAgICAgICAgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpITtcbiAgICAgICAgbm9kZUluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIG5lZWQgdG8gc2V0IHRoZSBjdXJyZW50Tm9kZSBhd2F5IGZyb20gdGhlIGNsb25lZCB0cmVlIHNvIHRoYXQgd2VcbiAgICAvLyBkb24ndCBob2xkIG9udG8gdGhlIHRyZWUgZXZlbiBpZiB0aGUgdHJlZSBpcyBkZXRhY2hlZCBhbmQgc2hvdWxkIGJlXG4gICAgLy8gZnJlZWQuXG4gICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gZDtcbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICBfdXBkYXRlKHZhbHVlczogQXJyYXk8dW5rbm93bj4pIHtcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHRoaXMuXyRwYXJ0cykge1xuICAgICAgaWYgKHBhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICBraW5kOiAnc2V0IHBhcnQnLFxuICAgICAgICAgICAgcGFydCxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZXNbaV0sXG4gICAgICAgICAgICB2YWx1ZUluZGV4OiBpLFxuICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgdGVtcGxhdGVJbnN0YW5jZTogdGhpcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgaWYgKChwYXJ0IGFzIEF0dHJpYnV0ZVBhcnQpLnN0cmluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChwYXJ0IGFzIEF0dHJpYnV0ZVBhcnQpLl8kc2V0VmFsdWUodmFsdWVzLCBwYXJ0IGFzIEF0dHJpYnV0ZVBhcnQsIGkpO1xuICAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgdmFsdWVzIHRoZSBwYXJ0IGNvbnN1bWVzIGlzIHBhcnQuc3RyaW5ncy5sZW5ndGggLSAxXG4gICAgICAgICAgLy8gc2luY2UgdmFsdWVzIGFyZSBpbiBiZXR3ZWVuIHRlbXBsYXRlIHNwYW5zLiBXZSBpbmNyZW1lbnQgaSBieSAxXG4gICAgICAgICAgLy8gbGF0ZXIgaW4gdGhlIGxvb3AsIHNvIGluY3JlbWVudCBpdCBieSBwYXJ0LnN0cmluZ3MubGVuZ3RoIC0gMiBoZXJlXG4gICAgICAgICAgaSArPSAocGFydCBhcyBBdHRyaWJ1dGVQYXJ0KS5zdHJpbmdzIS5sZW5ndGggLSAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcnQuXyRzZXRWYWx1ZSh2YWx1ZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuICB9XG59XG5cbi8qXG4gKiBQYXJ0c1xuICovXG50eXBlIEF0dHJpYnV0ZVRlbXBsYXRlUGFydCA9IHtcbiAgcmVhZG9ubHkgdHlwZTogdHlwZW9mIEFUVFJJQlVURV9QQVJUO1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGN0b3I6IHR5cGVvZiBBdHRyaWJ1dGVQYXJ0O1xuICByZWFkb25seSBzdHJpbmdzOiBSZWFkb25seUFycmF5PHN0cmluZz47XG59O1xudHlwZSBDaGlsZFRlbXBsYXRlUGFydCA9IHtcbiAgcmVhZG9ubHkgdHlwZTogdHlwZW9mIENISUxEX1BBUlQ7XG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG59O1xudHlwZSBFbGVtZW50VGVtcGxhdGVQYXJ0ID0ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgRUxFTUVOVF9QQVJUO1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xufTtcbnR5cGUgQ29tbWVudFRlbXBsYXRlUGFydCA9IHtcbiAgcmVhZG9ubHkgdHlwZTogdHlwZW9mIENPTU1FTlRfUEFSVDtcbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcbn07XG5cbi8qKlxuICogQSBUZW1wbGF0ZVBhcnQgcmVwcmVzZW50cyBhIGR5bmFtaWMgcGFydCBpbiBhIHRlbXBsYXRlLCBiZWZvcmUgdGhlIHRlbXBsYXRlXG4gKiBpcyBpbnN0YW50aWF0ZWQuIFdoZW4gYSB0ZW1wbGF0ZSBpcyBpbnN0YW50aWF0ZWQgUGFydHMgYXJlIGNyZWF0ZWQgZnJvbVxuICogVGVtcGxhdGVQYXJ0cy5cbiAqL1xudHlwZSBUZW1wbGF0ZVBhcnQgPVxuICB8IENoaWxkVGVtcGxhdGVQYXJ0XG4gIHwgQXR0cmlidXRlVGVtcGxhdGVQYXJ0XG4gIHwgRWxlbWVudFRlbXBsYXRlUGFydFxuICB8IENvbW1lbnRUZW1wbGF0ZVBhcnQ7XG5cbmV4cG9ydCB0eXBlIFBhcnQgPVxuICB8IENoaWxkUGFydFxuICB8IEF0dHJpYnV0ZVBhcnRcbiAgfCBQcm9wZXJ0eVBhcnRcbiAgfCBCb29sZWFuQXR0cmlidXRlUGFydFxuICB8IEVsZW1lbnRQYXJ0XG4gIHwgRXZlbnRQYXJ0O1xuXG5leHBvcnQgdHlwZSB7Q2hpbGRQYXJ0fTtcbmNsYXNzIENoaWxkUGFydCBpbXBsZW1lbnRzIERpc2Nvbm5lY3RhYmxlIHtcbiAgcmVhZG9ubHkgdHlwZSA9IENISUxEX1BBUlQ7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIF8kY29tbWl0dGVkVmFsdWU6IHVua25vd24gPSBub3RoaW5nO1xuICAvKiogQGludGVybmFsICovXG4gIF9fZGlyZWN0aXZlPzogRGlyZWN0aXZlO1xuICAvKiogQGludGVybmFsICovXG4gIF8kc3RhcnROb2RlOiBDaGlsZE5vZGU7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRlbmROb2RlOiBDaGlsZE5vZGUgfCBudWxsO1xuICBwcml2YXRlIF90ZXh0U2FuaXRpemVyOiBWYWx1ZVNhbml0aXplciB8IHVuZGVmaW5lZDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJHBhcmVudDogRGlzY29ubmVjdGFibGUgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBDb25uZWN0aW9uIHN0YXRlIGZvciBSb290UGFydHMgb25seSAoaS5lLiBDaGlsZFBhcnQgd2l0aG91dCBfJHBhcmVudFxuICAgKiByZXR1cm5lZCBmcm9tIHRvcC1sZXZlbCBgcmVuZGVyYCkuIFRoaXMgZmllbGQgaXMgdW51c2VkIG90aGVyd2lzZS4gVGhlXG4gICAqIGludGVudGlvbiB3b3VsZCBiZSBjbGVhcmVyIGlmIHdlIG1hZGUgYFJvb3RQYXJ0YCBhIHN1YmNsYXNzIG9mIGBDaGlsZFBhcnRgXG4gICAqIHdpdGggdGhpcyBmaWVsZCAoYW5kIGEgZGlmZmVyZW50IF8kaXNDb25uZWN0ZWQgZ2V0dGVyKSwgYnV0IHRoZSBzdWJjbGFzc1xuICAgKiBjYXVzZWQgYSBwZXJmIHJlZ3Jlc3Npb24sIHBvc3NpYmx5IGR1ZSB0byBtYWtpbmcgY2FsbCBzaXRlcyBwb2x5bW9ycGhpYy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBfX2lzQ29ubmVjdGVkOiBib29sZWFuO1xuXG4gIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgLy8gQ2hpbGRQYXJ0cyB0aGF0IGFyZSBub3QgYXQgdGhlIHJvb3Qgc2hvdWxkIGFsd2F5cyBiZSBjcmVhdGVkIHdpdGggYVxuICAgIC8vIHBhcmVudDsgb25seSBSb290Q2hpbGROb2RlJ3Mgd29uJ3QsIHNvIHRoZXkgcmV0dXJuIHRoZSBsb2NhbCBpc0Nvbm5lY3RlZFxuICAgIC8vIHN0YXRlXG4gICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQ/Ll8kaXNDb25uZWN0ZWQgPz8gdGhpcy5fX2lzQ29ubmVjdGVkO1xuICB9XG5cbiAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgd2lsbCBiZSBwYXRjaGVkIG9udG8gQ2hpbGRQYXJ0cyB3aGVuIHJlcXVpcmVkIGJ5XG4gIC8vIEFzeW5jRGlyZWN0aXZlXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuPzogU2V0PERpc2Nvbm5lY3RhYmxlPiA9IHVuZGVmaW5lZDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkPyhcbiAgICBpc0Nvbm5lY3RlZDogYm9vbGVhbixcbiAgICByZW1vdmVGcm9tUGFyZW50PzogYm9vbGVhbixcbiAgICBmcm9tPzogbnVtYmVyXG4gICk6IHZvaWQ7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRyZXBhcmVudERpc2Nvbm5lY3RhYmxlcz8ocGFyZW50OiBEaXNjb25uZWN0YWJsZSk6IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc3RhcnROb2RlOiBDaGlsZE5vZGUsXG4gICAgZW5kTm9kZTogQ2hpbGROb2RlIHwgbnVsbCxcbiAgICBwYXJlbnQ6IFRlbXBsYXRlSW5zdGFuY2UgfCBDaGlsZFBhcnQgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZFxuICApIHtcbiAgICB0aGlzLl8kc3RhcnROb2RlID0gc3RhcnROb2RlO1xuICAgIHRoaXMuXyRlbmROb2RlID0gZW5kTm9kZTtcbiAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgLy8gTm90ZSBfX2lzQ29ubmVjdGVkIGlzIG9ubHkgZXZlciBhY2Nlc3NlZCBvbiBSb290UGFydHMgKGkuZS4gd2hlbiB0aGVyZSBpc1xuICAgIC8vIG5vIF8kcGFyZW50KTsgdGhlIHZhbHVlIG9uIGEgbm9uLXJvb3QtcGFydCBpcyBcImRvbid0IGNhcmVcIiwgYnV0IGNoZWNraW5nXG4gICAgLy8gZm9yIHBhcmVudCB3b3VsZCBiZSBtb3JlIGNvZGVcbiAgICB0aGlzLl9faXNDb25uZWN0ZWQgPSBvcHRpb25zPy5pc0Nvbm5lY3RlZCA/PyB0cnVlO1xuICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgIC8vIEV4cGxpY2l0bHkgaW5pdGlhbGl6ZSBmb3IgY29uc2lzdGVudCBjbGFzcyBzaGFwZS5cbiAgICAgIHRoaXMuX3RleHRTYW5pdGl6ZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgbm9kZSBpbnRvIHdoaWNoIHRoZSBwYXJ0IHJlbmRlcnMgaXRzIGNvbnRlbnQuXG4gICAqXG4gICAqIEEgQ2hpbGRQYXJ0J3MgY29udGVudCBjb25zaXN0cyBvZiBhIHJhbmdlIG9mIGFkamFjZW50IGNoaWxkIG5vZGVzIG9mXG4gICAqIGAucGFyZW50Tm9kZWAsIHBvc3NpYmx5IGJvcmRlcmVkIGJ5ICdtYXJrZXIgbm9kZXMnIChgLnN0YXJ0Tm9kZWAgYW5kXG4gICAqIGAuZW5kTm9kZWApLlxuICAgKlxuICAgKiAtIElmIGJvdGggYC5zdGFydE5vZGVgIGFuZCBgLmVuZE5vZGVgIGFyZSBub24tbnVsbCwgdGhlbiB0aGUgcGFydCdzIGNvbnRlbnRcbiAgICogY29uc2lzdHMgb2YgYWxsIHNpYmxpbmdzIGJldHdlZW4gYC5zdGFydE5vZGVgIGFuZCBgLmVuZE5vZGVgLCBleGNsdXNpdmVseS5cbiAgICpcbiAgICogLSBJZiBgLnN0YXJ0Tm9kZWAgaXMgbm9uLW51bGwgYnV0IGAuZW5kTm9kZWAgaXMgbnVsbCwgdGhlbiB0aGUgcGFydCdzXG4gICAqIGNvbnRlbnQgY29uc2lzdHMgb2YgYWxsIHNpYmxpbmdzIGZvbGxvd2luZyBgLnN0YXJ0Tm9kZWAsIHVwIHRvIGFuZFxuICAgKiBpbmNsdWRpbmcgdGhlIGxhc3QgY2hpbGQgb2YgYC5wYXJlbnROb2RlYC4gSWYgYC5lbmROb2RlYCBpcyBub24tbnVsbCwgdGhlblxuICAgKiBgLnN0YXJ0Tm9kZWAgd2lsbCBhbHdheXMgYmUgbm9uLW51bGwuXG4gICAqXG4gICAqIC0gSWYgYm90aCBgLmVuZE5vZGVgIGFuZCBgLnN0YXJ0Tm9kZWAgYXJlIG51bGwsIHRoZW4gdGhlIHBhcnQncyBjb250ZW50XG4gICAqIGNvbnNpc3RzIG9mIGFsbCBjaGlsZCBub2RlcyBvZiBgLnBhcmVudE5vZGVgLlxuICAgKi9cbiAgZ2V0IHBhcmVudE5vZGUoKTogTm9kZSB7XG4gICAgbGV0IHBhcmVudE5vZGU6IE5vZGUgPSB3cmFwKHRoaXMuXyRzdGFydE5vZGUpLnBhcmVudE5vZGUhO1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuXyRwYXJlbnQ7XG4gICAgaWYgKFxuICAgICAgcGFyZW50ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmVudE5vZGU/Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UICovXG4gICAgKSB7XG4gICAgICAvLyBJZiB0aGUgcGFyZW50Tm9kZSBpcyBhIERvY3VtZW50RnJhZ21lbnQsIGl0IG1heSBiZSBiZWNhdXNlIHRoZSBET00gaXNcbiAgICAgIC8vIHN0aWxsIGluIHRoZSBjbG9uZWQgZnJhZ21lbnQgZHVyaW5nIGluaXRpYWwgcmVuZGVyOyBpZiBzbywgZ2V0IHRoZSByZWFsXG4gICAgICAvLyBwYXJlbnROb2RlIHRoZSBwYXJ0IHdpbGwgYmUgY29tbWl0dGVkIGludG8gYnkgYXNraW5nIHRoZSBwYXJlbnQuXG4gICAgICBwYXJlbnROb2RlID0gKHBhcmVudCBhcyBDaGlsZFBhcnQgfCBUZW1wbGF0ZUluc3RhbmNlKS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50Tm9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGFydCdzIGxlYWRpbmcgbWFya2VyIG5vZGUsIGlmIGFueS4gU2VlIGAucGFyZW50Tm9kZWAgZm9yIG1vcmVcbiAgICogaW5mb3JtYXRpb24uXG4gICAqL1xuICBnZXQgc3RhcnROb2RlKCk6IE5vZGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fJHN0YXJ0Tm9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGFydCdzIHRyYWlsaW5nIG1hcmtlciBub2RlLCBpZiBhbnkuIFNlZSBgLnBhcmVudE5vZGVgIGZvciBtb3JlXG4gICAqIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZ2V0IGVuZE5vZGUoKTogTm9kZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl8kZW5kTm9kZTtcbiAgfVxuXG4gIF8kc2V0VmFsdWUodmFsdWU6IHVua25vd24sIGRpcmVjdGl2ZVBhcmVudDogRGlyZWN0aXZlUGFyZW50ID0gdGhpcyk6IHZvaWQge1xuICAgIGlmIChERVZfTU9ERSAmJiB0aGlzLnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoaXMgXFxgQ2hpbGRQYXJ0XFxgIGhhcyBubyBcXGBwYXJlbnROb2RlXFxgIGFuZCB0aGVyZWZvcmUgY2Fubm90IGFjY2VwdCBhIHZhbHVlLiBUaGlzIGxpa2VseSBtZWFucyB0aGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBwYXJ0IHdhcyBtYW5pcHVsYXRlZCBpbiBhbiB1bnN1cHBvcnRlZCB3YXkgb3V0c2lkZSBvZiBMaXQncyBjb250cm9sIHN1Y2ggdGhhdCB0aGUgcGFydCdzIG1hcmtlciBub2RlcyB3ZXJlIGVqZWN0ZWQgZnJvbSBET00uIEZvciBleGFtcGxlLCBzZXR0aW5nIHRoZSBlbGVtZW50J3MgXFxgaW5uZXJIVE1MXFxgIG9yIFxcYHRleHRDb250ZW50XFxgIGNhbiBkbyB0aGlzLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHZhbHVlID0gcmVzb2x2ZURpcmVjdGl2ZSh0aGlzLCB2YWx1ZSwgZGlyZWN0aXZlUGFyZW50KTtcbiAgICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgICAvLyBOb24tcmVuZGVyaW5nIGNoaWxkIHZhbHVlcy4gSXQncyBpbXBvcnRhbnQgdGhhdCB0aGVzZSBkbyBub3QgcmVuZGVyXG4gICAgICAvLyBlbXB0eSB0ZXh0IG5vZGVzIHRvIGF2b2lkIGlzc3VlcyB3aXRoIHByZXZlbnRpbmcgZGVmYXVsdCA8c2xvdD5cbiAgICAgIC8vIGZhbGxiYWNrIGNvbnRlbnQuXG4gICAgICBpZiAodmFsdWUgPT09IG5vdGhpbmcgfHwgdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgaWYgKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSAhPT0gbm90aGluZykge1xuICAgICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICBraW5kOiAnY29tbWl0IG5vdGhpbmcgdG8gY2hpbGQnLFxuICAgICAgICAgICAgICBzdGFydDogdGhpcy5fJHN0YXJ0Tm9kZSxcbiAgICAgICAgICAgICAgZW5kOiB0aGlzLl8kZW5kTm9kZSxcbiAgICAgICAgICAgICAgcGFyZW50OiB0aGlzLl8kcGFyZW50LFxuICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLl8kY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBub3RoaW5nO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlICYmIHZhbHVlICE9PSBub0NoYW5nZSkge1xuICAgICAgICB0aGlzLl9jb21taXRUZXh0KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgfSBlbHNlIGlmICgodmFsdWUgYXMgVGVtcGxhdGVSZXN1bHQpWydfJGxpdFR5cGUkJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fY29tbWl0VGVtcGxhdGVSZXN1bHQodmFsdWUgYXMgVGVtcGxhdGVSZXN1bHQpO1xuICAgIH0gZWxzZSBpZiAoKHZhbHVlIGFzIE5vZGUpLm5vZGVUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChERVZfTU9ERSAmJiB0aGlzLm9wdGlvbnM/Lmhvc3QgPT09IHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NvbW1pdFRleHQoXG4gICAgICAgICAgYFtwcm9iYWJsZSBtaXN0YWtlOiByZW5kZXJlZCBhIHRlbXBsYXRlJ3MgaG9zdCBpbiBpdHNlbGYgYCArXG4gICAgICAgICAgICBgKGNvbW1vbmx5IGNhdXNlZCBieSB3cml0aW5nIFxcJHt0aGlzfSBpbiBhIHRlbXBsYXRlXWBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBBdHRlbXB0ZWQgdG8gcmVuZGVyIHRoZSB0ZW1wbGF0ZSBob3N0YCxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBgaW5zaWRlIGl0c2VsZi4gVGhpcyBpcyBhbG1vc3QgYWx3YXlzIGEgbWlzdGFrZSwgYW5kIGluIGRldiBtb2RlIGAsXG4gICAgICAgICAgYHdlIHJlbmRlciBzb21lIHdhcm5pbmcgdGV4dC4gSW4gcHJvZHVjdGlvbiBob3dldmVyLCB3ZSdsbCBgLFxuICAgICAgICAgIGByZW5kZXIgaXQsIHdoaWNoIHdpbGwgdXN1YWxseSByZXN1bHQgaW4gYW4gZXJyb3IsIGFuZCBzb21ldGltZXMgYCxcbiAgICAgICAgICBgaW4gdGhlIGVsZW1lbnQgZGlzYXBwZWFyaW5nIGZyb20gdGhlIERPTS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NvbW1pdE5vZGUodmFsdWUgYXMgTm9kZSk7XG4gICAgfSBlbHNlIGlmIChpc0l0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5fY29tbWl0SXRlcmFibGUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGYWxsYmFjaywgd2lsbCByZW5kZXIgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgICAgdGhpcy5fY29tbWl0VGV4dCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaW5zZXJ0PFQgZXh0ZW5kcyBOb2RlPihub2RlOiBUKSB7XG4gICAgcmV0dXJuIHdyYXAod3JhcCh0aGlzLl8kc3RhcnROb2RlKS5wYXJlbnROb2RlISkuaW5zZXJ0QmVmb3JlKFxuICAgICAgbm9kZSxcbiAgICAgIHRoaXMuXyRlbmROb2RlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbW1pdE5vZGUodmFsdWU6IE5vZGUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fJGNvbW1pdHRlZFZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fJGNsZWFyKCk7XG4gICAgICBpZiAoXG4gICAgICAgIEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUyAmJlxuICAgICAgICBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwgIT09IG5vb3BTYW5pdGl6ZXJcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwYXJlbnROb2RlTmFtZSA9IHRoaXMuXyRzdGFydE5vZGUucGFyZW50Tm9kZT8ubm9kZU5hbWU7XG4gICAgICAgIGlmIChwYXJlbnROb2RlTmFtZSA9PT0gJ1NUWUxFJyB8fCBwYXJlbnROb2RlTmFtZSA9PT0gJ1NDUklQVCcpIHtcbiAgICAgICAgICBsZXQgbWVzc2FnZSA9ICdGb3JiaWRkZW4nO1xuICAgICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGVOYW1lID09PSAnU1RZTEUnKSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgIGBMaXQgZG9lcyBub3Qgc3VwcG9ydCBiaW5kaW5nIGluc2lkZSBzdHlsZSBub2Rlcy4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgaXMgYSBzZWN1cml0eSByaXNrLCBhcyBzdHlsZSBpbmplY3Rpb24gYXR0YWNrcyBjYW4gYCArXG4gICAgICAgICAgICAgICAgYGV4ZmlsdHJhdGUgZGF0YSBhbmQgc3Bvb2YgVUlzLiBgICtcbiAgICAgICAgICAgICAgICBgQ29uc2lkZXIgaW5zdGVhZCB1c2luZyBjc3NcXGAuLi5cXGAgbGl0ZXJhbHMgYCArXG4gICAgICAgICAgICAgICAgYHRvIGNvbXBvc2Ugc3R5bGVzLCBhbmQgZG8gZHluYW1pYyBzdHlsaW5nIHdpdGggYCArXG4gICAgICAgICAgICAgICAgYGNzcyBjdXN0b20gcHJvcGVydGllcywgOjpwYXJ0cywgPHNsb3Q+cywgYCArXG4gICAgICAgICAgICAgICAgYGFuZCBieSBtdXRhdGluZyB0aGUgRE9NIHJhdGhlciB0aGFuIHN0eWxlc2hlZXRzLmA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtZXNzYWdlID1cbiAgICAgICAgICAgICAgICBgTGl0IGRvZXMgbm90IHN1cHBvcnQgYmluZGluZyBpbnNpZGUgc2NyaXB0IG5vZGVzLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2ssIGFzIGl0IGNvdWxkIGFsbG93IGFyYml0cmFyeSBgICtcbiAgICAgICAgICAgICAgICBgY29kZSBleGVjdXRpb24uYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgIGtpbmQ6ICdjb21taXQgbm9kZScsXG4gICAgICAgICAgc3RhcnQ6IHRoaXMuXyRzdGFydE5vZGUsXG4gICAgICAgICAgcGFyZW50OiB0aGlzLl8kcGFyZW50LFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gdGhpcy5faW5zZXJ0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jb21taXRUZXh0KHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgLy8gSWYgdGhlIGNvbW1pdHRlZCB2YWx1ZSBpcyBhIHByaW1pdGl2ZSBpdCBtZWFucyB3ZSBjYWxsZWQgX2NvbW1pdFRleHQgb25cbiAgICAvLyB0aGUgcHJldmlvdXMgcmVuZGVyLCBhbmQgd2Uga25vdyB0aGF0IHRoaXMuXyRzdGFydE5vZGUubmV4dFNpYmxpbmcgaXMgYVxuICAgIC8vIFRleHQgbm9kZS4gV2UgY2FuIG5vdyBqdXN0IHJlcGxhY2UgdGhlIHRleHQgY29udGVudCAoLmRhdGEpIG9mIHRoZSBub2RlLlxuICAgIGlmIChcbiAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSAhPT0gbm90aGluZyAmJlxuICAgICAgaXNQcmltaXRpdmUodGhpcy5fJGNvbW1pdHRlZFZhbHVlKVxuICAgICkge1xuICAgICAgY29uc3Qgbm9kZSA9IHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkubmV4dFNpYmxpbmcgYXMgVGV4dDtcbiAgICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RleHRTYW5pdGl6ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuX3RleHRTYW5pdGl6ZXIgPSBjcmVhdGVTYW5pdGl6ZXIobm9kZSwgJ2RhdGEnLCAncHJvcGVydHknKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IHRoaXMuX3RleHRTYW5pdGl6ZXIodmFsdWUpO1xuICAgICAgfVxuICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICBraW5kOiAnY29tbWl0IHRleHQnLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICB9KTtcbiAgICAgIChub2RlIGFzIFRleHQpLmRhdGEgPSB2YWx1ZSBhcyBzdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkLmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICAgICAgdGhpcy5fY29tbWl0Tm9kZSh0ZXh0Tm9kZSk7XG4gICAgICAgIC8vIFdoZW4gc2V0dGluZyB0ZXh0IGNvbnRlbnQsIGZvciBzZWN1cml0eSBwdXJwb3NlcyBpdCBtYXR0ZXJzIGEgbG90XG4gICAgICAgIC8vIHdoYXQgdGhlIHBhcmVudCBpcy4gRm9yIGV4YW1wbGUsIDxzdHlsZT4gYW5kIDxzY3JpcHQ+IG5lZWQgdG8gYmVcbiAgICAgICAgLy8gaGFuZGxlZCB3aXRoIGNhcmUsIHdoaWxlIDxzcGFuPiBkb2VzIG5vdC4gU28gZmlyc3Qgd2UgbmVlZCB0byBwdXQgYVxuICAgICAgICAvLyB0ZXh0IG5vZGUgaW50byB0aGUgZG9jdW1lbnQsIHRoZW4gd2UgY2FuIHNhbml0aXplIGl0cyBjb250ZW50LlxuICAgICAgICBpZiAodGhpcy5fdGV4dFNhbml0aXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fdGV4dFNhbml0aXplciA9IGNyZWF0ZVNhbml0aXplcih0ZXh0Tm9kZSwgJ2RhdGEnLCAncHJvcGVydHknKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IHRoaXMuX3RleHRTYW5pdGl6ZXIodmFsdWUpO1xuICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICBraW5kOiAnY29tbWl0IHRleHQnLFxuICAgICAgICAgICAgbm9kZTogdGV4dE5vZGUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGV4dE5vZGUuZGF0YSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NvbW1pdE5vZGUoZC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSBhcyBzdHJpbmcpKTtcbiAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAga2luZDogJ2NvbW1pdCB0ZXh0JyxcbiAgICAgICAgICAgIG5vZGU6IHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkubmV4dFNpYmxpbmcgYXMgVGV4dCxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbW1pdFRlbXBsYXRlUmVzdWx0KFxuICAgIHJlc3VsdDogVGVtcGxhdGVSZXN1bHQgfCBDb21waWxlZFRlbXBsYXRlUmVzdWx0XG4gICk6IHZvaWQge1xuICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgY29uc3Qge3ZhbHVlcywgWydfJGxpdFR5cGUkJ106IHR5cGV9ID0gcmVzdWx0O1xuICAgIC8vIElmICRsaXRUeXBlJCBpcyBhIG51bWJlciwgcmVzdWx0IGlzIGEgcGxhaW4gVGVtcGxhdGVSZXN1bHQgYW5kIHdlIGdldFxuICAgIC8vIHRoZSB0ZW1wbGF0ZSBmcm9tIHRoZSB0ZW1wbGF0ZSBjYWNoZS4gSWYgbm90LCByZXN1bHQgaXMgYVxuICAgIC8vIENvbXBpbGVkVGVtcGxhdGVSZXN1bHQgYW5kIF8kbGl0VHlwZSQgaXMgYSBDb21waWxlZFRlbXBsYXRlIGFuZCB3ZSBuZWVkXG4gICAgLy8gdG8gY3JlYXRlIHRoZSA8dGVtcGxhdGU+IGVsZW1lbnQgdGhlIGZpcnN0IHRpbWUgd2Ugc2VlIGl0LlxuICAgIGNvbnN0IHRlbXBsYXRlOiBUZW1wbGF0ZSB8IENvbXBpbGVkVGVtcGxhdGUgPVxuICAgICAgdHlwZW9mIHR5cGUgPT09ICdudW1iZXInXG4gICAgICAgID8gdGhpcy5fJGdldFRlbXBsYXRlKHJlc3VsdCBhcyBVbmNvbXBpbGVkVGVtcGxhdGVSZXN1bHQpXG4gICAgICAgIDogKHR5cGUuZWwgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKHR5cGUuZWwgPSBUZW1wbGF0ZS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICB0cnVzdEZyb21UZW1wbGF0ZVN0cmluZyh0eXBlLmgsIHR5cGUuaFswXSksXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9uc1xuICAgICAgICAgICAgKSksXG4gICAgICAgICAgdHlwZSk7XG5cbiAgICBpZiAoKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBUZW1wbGF0ZUluc3RhbmNlKT8uXyR0ZW1wbGF0ZSA9PT0gdGVtcGxhdGUpIHtcbiAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAga2luZDogJ3RlbXBsYXRlIHVwZGF0aW5nJyxcbiAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICBpbnN0YW5jZTogdGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIFRlbXBsYXRlSW5zdGFuY2UsXG4gICAgICAgICAgcGFydHM6ICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgVGVtcGxhdGVJbnN0YW5jZSkuXyRwYXJ0cyxcbiAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgdmFsdWVzLFxuICAgICAgICB9KTtcbiAgICAgICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgVGVtcGxhdGVJbnN0YW5jZSkuX3VwZGF0ZSh2YWx1ZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBUZW1wbGF0ZUluc3RhbmNlKHRlbXBsYXRlIGFzIFRlbXBsYXRlLCB0aGlzKTtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gaW5zdGFuY2UuX2Nsb25lKHRoaXMub3B0aW9ucyk7XG4gICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQnLFxuICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIHBhcnRzOiBpbnN0YW5jZS5fJHBhcnRzLFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICBmcmFnbWVudCxcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgIH0pO1xuICAgICAgaW5zdGFuY2UuX3VwZGF0ZSh2YWx1ZXMpO1xuICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICBraW5kOiAndGVtcGxhdGUgaW5zdGFudGlhdGVkIGFuZCB1cGRhdGVkJyxcbiAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBwYXJ0czogaW5zdGFuY2UuXyRwYXJ0cyxcbiAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgZnJhZ21lbnQsXG4gICAgICAgICAgdmFsdWVzLFxuICAgICAgICB9KTtcbiAgICAgIHRoaXMuX2NvbW1pdE5vZGUoZnJhZ21lbnQpO1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gaW5zdGFuY2U7XG4gICAgfVxuICB9XG5cbiAgLy8gT3ZlcnJpZGRlbiB2aWEgYGxpdEh0bWxQb2x5ZmlsbFN1cHBvcnRgIHRvIHByb3ZpZGUgcGxhdGZvcm0gc3VwcG9ydC5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGdldFRlbXBsYXRlKHJlc3VsdDogVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0KSB7XG4gICAgbGV0IHRlbXBsYXRlID0gdGVtcGxhdGVDYWNoZS5nZXQocmVzdWx0LnN0cmluZ3MpO1xuICAgIGlmICh0ZW1wbGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZW1wbGF0ZUNhY2hlLnNldChyZXN1bHQuc3RyaW5ncywgKHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHJlc3VsdCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tbWl0SXRlcmFibGUodmFsdWU6IEl0ZXJhYmxlPHVua25vd24+KTogdm9pZCB7XG4gICAgLy8gRm9yIGFuIEl0ZXJhYmxlLCB3ZSBjcmVhdGUgYSBuZXcgSW5zdGFuY2VQYXJ0IHBlciBpdGVtLCB0aGVuIHNldCBpdHNcbiAgICAvLyB2YWx1ZSB0byB0aGUgaXRlbS4gVGhpcyBpcyBhIGxpdHRsZSBiaXQgb2Ygb3ZlcmhlYWQgZm9yIGV2ZXJ5IGl0ZW0gaW5cbiAgICAvLyBhbiBJdGVyYWJsZSwgYnV0IGl0IGxldHMgdXMgcmVjdXJzZSBlYXNpbHkgYW5kIGVmZmljaWVudGx5IHVwZGF0ZSBBcnJheXNcbiAgICAvLyBvZiBUZW1wbGF0ZVJlc3VsdHMgdGhhdCB3aWxsIGJlIGNvbW1vbmx5IHJldHVybmVkIGZyb20gZXhwcmVzc2lvbnMgbGlrZTpcbiAgICAvLyBhcnJheS5tYXAoKGkpID0+IGh0bWxgJHtpfWApLCBieSByZXVzaW5nIGV4aXN0aW5nIFRlbXBsYXRlSW5zdGFuY2VzLlxuXG4gICAgLy8gSWYgdmFsdWUgaXMgYW4gYXJyYXksIHRoZW4gdGhlIHByZXZpb3VzIHJlbmRlciB3YXMgb2YgYW5cbiAgICAvLyBpdGVyYWJsZSBhbmQgdmFsdWUgd2lsbCBjb250YWluIHRoZSBDaGlsZFBhcnRzIGZyb20gdGhlIHByZXZpb3VzXG4gICAgLy8gcmVuZGVyLiBJZiB2YWx1ZSBpcyBub3QgYW4gYXJyYXksIGNsZWFyIHRoaXMgcGFydCBhbmQgbWFrZSBhIG5ld1xuICAgIC8vIGFycmF5IGZvciBDaGlsZFBhcnRzLlxuICAgIGlmICghaXNBcnJheSh0aGlzLl8kY29tbWl0dGVkVmFsdWUpKSB7XG4gICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBbXTtcbiAgICAgIHRoaXMuXyRjbGVhcigpO1xuICAgIH1cblxuICAgIC8vIExldHMgdXMga2VlcCB0cmFjayBvZiBob3cgbWFueSBpdGVtcyB3ZSBzdGFtcGVkIHNvIHdlIGNhbiBjbGVhciBsZWZ0b3ZlclxuICAgIC8vIGl0ZW1zIGZyb20gYSBwcmV2aW91cyByZW5kZXJcbiAgICBjb25zdCBpdGVtUGFydHMgPSB0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgQ2hpbGRQYXJ0W107XG4gICAgbGV0IHBhcnRJbmRleCA9IDA7XG4gICAgbGV0IGl0ZW1QYXJ0OiBDaGlsZFBhcnQgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgIGlmIChwYXJ0SW5kZXggPT09IGl0ZW1QYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgLy8gSWYgbm8gZXhpc3RpbmcgcGFydCwgY3JlYXRlIGEgbmV3IG9uZVxuICAgICAgICAvLyBUT0RPIChqdXN0aW5mYWduYW5pKTogdGVzdCBwZXJmIGltcGFjdCBvZiBhbHdheXMgY3JlYXRpbmcgdHdvIHBhcnRzXG4gICAgICAgIC8vIGluc3RlYWQgb2Ygc2hhcmluZyBwYXJ0cyBiZXR3ZWVuIG5vZGVzXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9saXQvbGl0L2lzc3Vlcy8xMjY2XG4gICAgICAgIGl0ZW1QYXJ0cy5wdXNoKFxuICAgICAgICAgIChpdGVtUGFydCA9IG5ldyBDaGlsZFBhcnQoXG4gICAgICAgICAgICB0aGlzLl9pbnNlcnQoY3JlYXRlTWFya2VyKCkpLFxuICAgICAgICAgICAgdGhpcy5faW5zZXJ0KGNyZWF0ZU1hcmtlcigpKSxcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICAgICApKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmV1c2UgYW4gZXhpc3RpbmcgcGFydFxuICAgICAgICBpdGVtUGFydCA9IGl0ZW1QYXJ0c1twYXJ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgaXRlbVBhcnQuXyRzZXRWYWx1ZShpdGVtKTtcbiAgICAgIHBhcnRJbmRleCsrO1xuICAgIH1cblxuICAgIGlmIChwYXJ0SW5kZXggPCBpdGVtUGFydHMubGVuZ3RoKSB7XG4gICAgICAvLyBpdGVtUGFydHMgYWx3YXlzIGhhdmUgZW5kIG5vZGVzXG4gICAgICB0aGlzLl8kY2xlYXIoXG4gICAgICAgIGl0ZW1QYXJ0ICYmIHdyYXAoaXRlbVBhcnQuXyRlbmROb2RlISkubmV4dFNpYmxpbmcsXG4gICAgICAgIHBhcnRJbmRleFxuICAgICAgKTtcbiAgICAgIC8vIFRydW5jYXRlIHRoZSBwYXJ0cyBhcnJheSBzbyBfdmFsdWUgcmVmbGVjdHMgdGhlIGN1cnJlbnQgc3RhdGVcbiAgICAgIGl0ZW1QYXJ0cy5sZW5ndGggPSBwYXJ0SW5kZXg7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIG5vZGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBQYXJ0IGZyb20gdGhlIERPTS5cbiAgICpcbiAgICogQHBhcmFtIHN0YXJ0IFN0YXJ0IG5vZGUgdG8gY2xlYXIgZnJvbSwgZm9yIGNsZWFyaW5nIGEgc3Vic2V0IG9mIHRoZSBwYXJ0J3NcbiAgICogICAgIERPTSAodXNlZCB3aGVuIHRydW5jYXRpbmcgaXRlcmFibGVzKVxuICAgKiBAcGFyYW0gZnJvbSAgV2hlbiBgc3RhcnRgIGlzIHNwZWNpZmllZCwgdGhlIGluZGV4IHdpdGhpbiB0aGUgaXRlcmFibGUgZnJvbVxuICAgKiAgICAgd2hpY2ggQ2hpbGRQYXJ0cyBhcmUgYmVpbmcgcmVtb3ZlZCwgdXNlZCBmb3IgZGlzY29ubmVjdGluZyBkaXJlY3RpdmVzIGluXG4gICAqICAgICB0aG9zZSBQYXJ0cy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfJGNsZWFyKFxuICAgIHN0YXJ0OiBDaGlsZE5vZGUgfCBudWxsID0gd3JhcCh0aGlzLl8kc3RhcnROb2RlKS5uZXh0U2libGluZyxcbiAgICBmcm9tPzogbnVtYmVyXG4gICkge1xuICAgIHRoaXMuXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZD8uKGZhbHNlLCB0cnVlLCBmcm9tKTtcbiAgICB3aGlsZSAoc3RhcnQgJiYgc3RhcnQgIT09IHRoaXMuXyRlbmROb2RlKSB7XG4gICAgICBjb25zdCBuID0gd3JhcChzdGFydCEpLm5leHRTaWJsaW5nO1xuICAgICAgKHdyYXAoc3RhcnQhKSBhcyBFbGVtZW50KS5yZW1vdmUoKTtcbiAgICAgIHN0YXJ0ID0gbjtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIG9mIFJvb3RQYXJ0J3MgYGlzQ29ubmVjdGVkYC4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kXG4gICAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBgUm9vdFBhcnRgcyAodGhlIGBDaGlsZFBhcnRgIHJldHVybmVkIGZyb20gYVxuICAgKiB0b3AtbGV2ZWwgYHJlbmRlcigpYCBjYWxsKS4gSXQgaGFzIG5vIGVmZmVjdCBvbiBub24tcm9vdCBDaGlsZFBhcnRzLlxuICAgKiBAcGFyYW0gaXNDb25uZWN0ZWQgV2hldGhlciB0byBzZXRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzZXRDb25uZWN0ZWQoaXNDb25uZWN0ZWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5fJHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9faXNDb25uZWN0ZWQgPSBpc0Nvbm5lY3RlZDtcbiAgICAgIHRoaXMuXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZD8uKGlzQ29ubmVjdGVkKTtcbiAgICB9IGVsc2UgaWYgKERFVl9NT0RFKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdwYXJ0LnNldENvbm5lY3RlZCgpIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhICcgK1xuICAgICAgICAgICdSb290UGFydCByZXR1cm5lZCBmcm9tIHJlbmRlcigpLidcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQSB0b3AtbGV2ZWwgYENoaWxkUGFydGAgcmV0dXJuZWQgZnJvbSBgcmVuZGVyYCB0aGF0IG1hbmFnZXMgdGhlIGNvbm5lY3RlZFxuICogc3RhdGUgb2YgYEFzeW5jRGlyZWN0aXZlYHMgY3JlYXRlZCB0aHJvdWdob3V0IHRoZSB0cmVlIGJlbG93IGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RQYXJ0IGV4dGVuZHMgQ2hpbGRQYXJ0IHtcbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvbm5lY3Rpb24gc3RhdGUgZm9yIGBBc3luY0RpcmVjdGl2ZWBzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyByb290XG4gICAqIENoaWxkUGFydC5cbiAgICpcbiAgICogbGl0LWh0bWwgZG9lcyBub3QgYXV0b21hdGljYWxseSBtb25pdG9yIHRoZSBjb25uZWN0ZWRuZXNzIG9mIERPTSByZW5kZXJlZDtcbiAgICogYXMgc3VjaCwgaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gYHJlbmRlcmAgdG8gZW5zdXJlIHRoYXRcbiAgICogYHBhcnQuc2V0Q29ubmVjdGVkKGZhbHNlKWAgaXMgY2FsbGVkIGJlZm9yZSB0aGUgcGFydCBvYmplY3QgaXMgcG90ZW50aWFsbHlcbiAgICogZGlzY2FyZGVkLCB0byBlbnN1cmUgdGhhdCBgQXN5bmNEaXJlY3RpdmVgcyBoYXZlIGEgY2hhbmNlIHRvIGRpc3Bvc2Ugb2ZcbiAgICogYW55IHJlc291cmNlcyBiZWluZyBoZWxkLiBJZiBhIGBSb290UGFydGAgdGhhdCB3YXMgcHJldmlvdXNseVxuICAgKiBkaXNjb25uZWN0ZWQgaXMgc3Vic2VxdWVudGx5IHJlLWNvbm5lY3RlZCAoYW5kIGl0cyBgQXN5bmNEaXJlY3RpdmVgcyBzaG91bGRcbiAgICogcmUtY29ubmVjdCksIGBzZXRDb25uZWN0ZWQodHJ1ZSlgIHNob3VsZCBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBpc0Nvbm5lY3RlZCBXaGV0aGVyIGRpcmVjdGl2ZXMgd2l0aGluIHRoaXMgdHJlZSBzaG91bGQgYmUgY29ubmVjdGVkXG4gICAqIG9yIG5vdFxuICAgKi9cbiAgc2V0Q29ubmVjdGVkKGlzQ29ubmVjdGVkOiBib29sZWFuKTogdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUge0F0dHJpYnV0ZVBhcnR9O1xuY2xhc3MgQXR0cmlidXRlUGFydCBpbXBsZW1lbnRzIERpc2Nvbm5lY3RhYmxlIHtcbiAgcmVhZG9ubHkgdHlwZTpcbiAgICB8IHR5cGVvZiBBVFRSSUJVVEVfUEFSVFxuICAgIHwgdHlwZW9mIFBST1BFUlRZX1BBUlRcbiAgICB8IHR5cGVvZiBCT09MRUFOX0FUVFJJQlVURV9QQVJUXG4gICAgfCB0eXBlb2YgRVZFTlRfUEFSVCA9IEFUVFJJQlVURV9QQVJUO1xuICByZWFkb25seSBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJZiB0aGlzIGF0dHJpYnV0ZSBwYXJ0IHJlcHJlc2VudHMgYW4gaW50ZXJwb2xhdGlvbiwgdGhpcyBjb250YWlucyB0aGVcbiAgICogc3RhdGljIHN0cmluZ3Mgb2YgdGhlIGludGVycG9sYXRpb24uIEZvciBzaW5nbGUtdmFsdWUsIGNvbXBsZXRlIGJpbmRpbmdzLFxuICAgKiB0aGlzIGlzIHVuZGVmaW5lZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0cmluZ3M/OiBSZWFkb25seUFycmF5PHN0cmluZz47XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRjb21taXR0ZWRWYWx1ZTogdW5rbm93biB8IEFycmF5PHVua25vd24+ID0gbm90aGluZztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2RpcmVjdGl2ZXM/OiBBcnJheTxEaXJlY3RpdmUgfCB1bmRlZmluZWQ+O1xuICAvKiogQGludGVybmFsICovXG4gIF8kcGFyZW50OiBEaXNjb25uZWN0YWJsZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4/OiBTZXQ8RGlzY29ubmVjdGFibGU+ID0gdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBfc2FuaXRpemVyOiBWYWx1ZVNhbml0aXplciB8IHVuZGVmaW5lZDtcblxuICBnZXQgdGFnTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50LnRhZ05hbWU7XG4gIH1cblxuICAvLyBTZWUgY29tbWVudCBpbiBEaXNjb25uZWN0YWJsZSBpbnRlcmZhY2UgZm9yIHdoeSB0aGlzIGlzIGEgZ2V0dGVyXG4gIGdldCBfJGlzQ29ubmVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl8kcGFyZW50Ll8kaXNDb25uZWN0ZWQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RyaW5nczogUmVhZG9ubHlBcnJheTxzdHJpbmc+LFxuICAgIHBhcmVudDogRGlzY29ubmVjdGFibGUsXG4gICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZFxuICApIHtcbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIGlmIChzdHJpbmdzLmxlbmd0aCA+IDIgfHwgc3RyaW5nc1swXSAhPT0gJycgfHwgc3RyaW5nc1sxXSAhPT0gJycpIHtcbiAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5ldyBBcnJheShzdHJpbmdzLmxlbmd0aCAtIDEpLmZpbGwobmV3IFN0cmluZygpKTtcbiAgICAgIHRoaXMuc3RyaW5ncyA9IHN0cmluZ3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5vdGhpbmc7XG4gICAgfVxuICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgIHRoaXMuX3Nhbml0aXplciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBwYXJ0IGJ5IHJlc29sdmluZyB0aGUgdmFsdWUgZnJvbSBwb3NzaWJseSBtdWx0aXBsZVxuICAgKiB2YWx1ZXMgYW5kIHN0YXRpYyBzdHJpbmdzIGFuZCBjb21taXR0aW5nIGl0IHRvIHRoZSBET00uXG4gICAqIElmIHRoaXMgcGFydCBpcyBzaW5nbGUtdmFsdWVkLCBgdGhpcy5fc3RyaW5nc2Agd2lsbCBiZSB1bmRlZmluZWQsIGFuZCB0aGVcbiAgICogbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGggYSBzaW5nbGUgdmFsdWUgYXJndW1lbnQuIElmIHRoaXMgcGFydCBpc1xuICAgKiBtdWx0aS12YWx1ZSwgYHRoaXMuX3N0cmluZ3NgIHdpbGwgYmUgZGVmaW5lZCwgYW5kIHRoZSBtZXRob2QgaXMgY2FsbGVkXG4gICAqIHdpdGggdGhlIHZhbHVlIGFycmF5IG9mIHRoZSBwYXJ0J3Mgb3duaW5nIFRlbXBsYXRlSW5zdGFuY2UsIGFuZCBhbiBvZmZzZXRcbiAgICogaW50byB0aGUgdmFsdWUgYXJyYXkgZnJvbSB3aGljaCB0aGUgdmFsdWVzIHNob3VsZCBiZSByZWFkLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBvdmVybG9hZGVkIHRoaXMgd2F5IHRvIGVsaW1pbmF0ZSBzaG9ydC1saXZlZCBhcnJheSBzbGljZXNcbiAgICogb2YgdGhlIHRlbXBsYXRlIGluc3RhbmNlIHZhbHVlcywgYW5kIGFsbG93IGEgZmFzdC1wYXRoIGZvciBzaW5nbGUtdmFsdWVkXG4gICAqIHBhcnRzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHBhcnQgdmFsdWUsIG9yIGFuIGFycmF5IG9mIHZhbHVlcyBmb3IgbXVsdGktdmFsdWVkIHBhcnRzXG4gICAqIEBwYXJhbSB2YWx1ZUluZGV4IHRoZSBpbmRleCB0byBzdGFydCByZWFkaW5nIHZhbHVlcyBmcm9tLiBgdW5kZWZpbmVkYCBmb3JcbiAgICogICBzaW5nbGUtdmFsdWVkIHBhcnRzXG4gICAqIEBwYXJhbSBub0NvbW1pdCBjYXVzZXMgdGhlIHBhcnQgdG8gbm90IGNvbW1pdCBpdHMgdmFsdWUgdG8gdGhlIERPTS4gVXNlZFxuICAgKiAgIGluIGh5ZHJhdGlvbiB0byBwcmltZSBhdHRyaWJ1dGUgcGFydHMgd2l0aCB0aGVpciBmaXJzdC1yZW5kZXJlZCB2YWx1ZSxcbiAgICogICBidXQgbm90IHNldCB0aGUgYXR0cmlidXRlLCBhbmQgaW4gU1NSIHRvIG5vLW9wIHRoZSBET00gb3BlcmF0aW9uIGFuZFxuICAgKiAgIGNhcHR1cmUgdGhlIHZhbHVlIGZvciBzZXJpYWxpemF0aW9uLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF8kc2V0VmFsdWUoXG4gICAgdmFsdWU6IHVua25vd24gfCBBcnJheTx1bmtub3duPixcbiAgICBkaXJlY3RpdmVQYXJlbnQ6IERpcmVjdGl2ZVBhcmVudCA9IHRoaXMsXG4gICAgdmFsdWVJbmRleD86IG51bWJlcixcbiAgICBub0NvbW1pdD86IGJvb2xlYW5cbiAgKSB7XG4gICAgY29uc3Qgc3RyaW5ncyA9IHRoaXMuc3RyaW5ncztcblxuICAgIC8vIFdoZXRoZXIgYW55IG9mIHRoZSB2YWx1ZXMgaGFzIGNoYW5nZWQsIGZvciBkaXJ0eS1jaGVja2luZ1xuICAgIGxldCBjaGFuZ2UgPSBmYWxzZTtcblxuICAgIGlmIChzdHJpbmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFNpbmdsZS12YWx1ZSBiaW5kaW5nIGNhc2VcbiAgICAgIHZhbHVlID0gcmVzb2x2ZURpcmVjdGl2ZSh0aGlzLCB2YWx1ZSwgZGlyZWN0aXZlUGFyZW50LCAwKTtcbiAgICAgIGNoYW5nZSA9XG4gICAgICAgICFpc1ByaW1pdGl2ZSh2YWx1ZSkgfHxcbiAgICAgICAgKHZhbHVlICE9PSB0aGlzLl8kY29tbWl0dGVkVmFsdWUgJiYgdmFsdWUgIT09IG5vQ2hhbmdlKTtcbiAgICAgIGlmIChjaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEludGVycG9sYXRpb24gY2FzZVxuICAgICAgY29uc3QgdmFsdWVzID0gdmFsdWUgYXMgQXJyYXk8dW5rbm93bj47XG4gICAgICB2YWx1ZSA9IHN0cmluZ3NbMF07XG5cbiAgICAgIGxldCBpLCB2O1xuICAgICAgZm9yIChpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIHYgPSByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIHZhbHVlc1t2YWx1ZUluZGV4ISArIGldLCBkaXJlY3RpdmVQYXJlbnQsIGkpO1xuXG4gICAgICAgIGlmICh2ID09PSBub0NoYW5nZSkge1xuICAgICAgICAgIC8vIElmIHRoZSB1c2VyLXByb3ZpZGVkIHZhbHVlIGlzIGBub0NoYW5nZWAsIHVzZSB0aGUgcHJldmlvdXMgdmFsdWVcbiAgICAgICAgICB2ID0gKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBBcnJheTx1bmtub3duPilbaV07XG4gICAgICAgIH1cbiAgICAgICAgY2hhbmdlIHx8PVxuICAgICAgICAgICFpc1ByaW1pdGl2ZSh2KSB8fCB2ICE9PSAodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIEFycmF5PHVua25vd24+KVtpXTtcbiAgICAgICAgaWYgKHYgPT09IG5vdGhpbmcpIHtcbiAgICAgICAgICB2YWx1ZSA9IG5vdGhpbmc7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IG5vdGhpbmcpIHtcbiAgICAgICAgICB2YWx1ZSArPSAodiA/PyAnJykgKyBzdHJpbmdzW2kgKyAxXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBhbHdheXMgcmVjb3JkIGVhY2ggdmFsdWUsIGV2ZW4gaWYgb25lIGlzIGBub3RoaW5nYCwgZm9yIGZ1dHVyZVxuICAgICAgICAvLyBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgICAgICAodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIEFycmF5PHVua25vd24+KVtpXSA9IHY7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2UgJiYgIW5vQ29tbWl0KSB7XG4gICAgICB0aGlzLl9jb21taXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfY29tbWl0VmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAodmFsdWUgPT09IG5vdGhpbmcpIHtcbiAgICAgICh3cmFwKHRoaXMuZWxlbWVudCkgYXMgRWxlbWVudCkucmVtb3ZlQXR0cmlidXRlKHRoaXMubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Nhbml0aXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fc2FuaXRpemVyID0gc2FuaXRpemVyRmFjdG9yeUludGVybmFsKFxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LFxuICAgICAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICAgICAgJ2F0dHJpYnV0ZSdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdGhpcy5fc2FuaXRpemVyKHZhbHVlID8/ICcnKTtcbiAgICAgIH1cbiAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAga2luZDogJ2NvbW1pdCBhdHRyaWJ1dGUnLFxuICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICB9KTtcbiAgICAgICh3cmFwKHRoaXMuZWxlbWVudCkgYXMgRWxlbWVudCkuc2V0QXR0cmlidXRlKFxuICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgICh2YWx1ZSA/PyAnJykgYXMgc3RyaW5nXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSB7UHJvcGVydHlQYXJ0fTtcbmNsYXNzIFByb3BlcnR5UGFydCBleHRlbmRzIEF0dHJpYnV0ZVBhcnQge1xuICBvdmVycmlkZSByZWFkb25seSB0eXBlID0gUFJPUEVSVFlfUEFSVDtcblxuICAvKiogQGludGVybmFsICovXG4gIG92ZXJyaWRlIF9jb21taXRWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xuICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgIGlmICh0aGlzLl9zYW5pdGl6ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9zYW5pdGl6ZXIgPSBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwoXG4gICAgICAgICAgdGhpcy5lbGVtZW50LFxuICAgICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgICAncHJvcGVydHknXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHRoaXMuX3Nhbml0aXplcih2YWx1ZSk7XG4gICAgfVxuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICBraW5kOiAnY29tbWl0IHByb3BlcnR5JyxcbiAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICB9KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICh0aGlzLmVsZW1lbnQgYXMgYW55KVt0aGlzLm5hbWVdID0gdmFsdWUgPT09IG5vdGhpbmcgPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSB7Qm9vbGVhbkF0dHJpYnV0ZVBhcnR9O1xuY2xhc3MgQm9vbGVhbkF0dHJpYnV0ZVBhcnQgZXh0ZW5kcyBBdHRyaWJ1dGVQYXJ0IHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgdHlwZSA9IEJPT0xFQU5fQVRUUklCVVRFX1BBUlQ7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvdmVycmlkZSBfY29tbWl0VmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAga2luZDogJ2NvbW1pdCBib29sZWFuIGF0dHJpYnV0ZScsXG4gICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICB2YWx1ZTogISEodmFsdWUgJiYgdmFsdWUgIT09IG5vdGhpbmcpLFxuICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICB9KTtcbiAgICAod3JhcCh0aGlzLmVsZW1lbnQpIGFzIEVsZW1lbnQpLnRvZ2dsZUF0dHJpYnV0ZShcbiAgICAgIHRoaXMubmFtZSxcbiAgICAgICEhdmFsdWUgJiYgdmFsdWUgIT09IG5vdGhpbmdcbiAgICApO1xuICB9XG59XG5cbnR5cGUgRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zID0gRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCAmXG4gIFBhcnRpYWw8QWRkRXZlbnRMaXN0ZW5lck9wdGlvbnM+O1xuXG4vKipcbiAqIEFuIEF0dHJpYnV0ZVBhcnQgdGhhdCBtYW5hZ2VzIGFuIGV2ZW50IGxpc3RlbmVyIHZpYSBhZGQvcmVtb3ZlRXZlbnRMaXN0ZW5lci5cbiAqXG4gKiBUaGlzIHBhcnQgd29ya3MgYnkgYWRkaW5nIGl0c2VsZiBhcyB0aGUgZXZlbnQgbGlzdGVuZXIgb24gYW4gZWxlbWVudCwgdGhlblxuICogZGVsZWdhdGluZyB0byB0aGUgdmFsdWUgcGFzc2VkIHRvIGl0LiBUaGlzIHJlZHVjZXMgdGhlIG51bWJlciBvZiBjYWxscyB0b1xuICogYWRkL3JlbW92ZUV2ZW50TGlzdGVuZXIgaWYgdGhlIGxpc3RlbmVyIGNoYW5nZXMgZnJlcXVlbnRseSwgc3VjaCBhcyB3aGVuIGFuXG4gKiBpbmxpbmUgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGxpc3RlbmVyLlxuICpcbiAqIEJlY2F1c2UgZXZlbnQgb3B0aW9ucyBhcmUgcGFzc2VkIHdoZW4gYWRkaW5nIGxpc3RlbmVycywgd2UgbXVzdCB0YWtlIGNhc2VcbiAqIHRvIGFkZCBhbmQgcmVtb3ZlIHRoZSBwYXJ0IGFzIGEgbGlzdGVuZXIgd2hlbiB0aGUgZXZlbnQgb3B0aW9ucyBjaGFuZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIHtFdmVudFBhcnR9O1xuY2xhc3MgRXZlbnRQYXJ0IGV4dGVuZHMgQXR0cmlidXRlUGFydCB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHR5cGUgPSBFVkVOVF9QQVJUO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdHJpbmdzOiBSZWFkb25seUFycmF5PHN0cmluZz4sXG4gICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSxcbiAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHN1cGVyKGVsZW1lbnQsIG5hbWUsIHN0cmluZ3MsIHBhcmVudCwgb3B0aW9ucyk7XG5cbiAgICBpZiAoREVWX01PREUgJiYgdGhpcy5zdHJpbmdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEEgXFxgPCR7ZWxlbWVudC5sb2NhbE5hbWV9PlxcYCBoYXMgYSBcXGBAJHtuYW1lfT0uLi5cXGAgbGlzdGVuZXIgd2l0aCBgICtcbiAgICAgICAgICAnaW52YWxpZCBjb250ZW50LiBFdmVudCBsaXN0ZW5lcnMgaW4gdGVtcGxhdGVzIG11c3QgaGF2ZSBleGFjdGx5ICcgK1xuICAgICAgICAgICdvbmUgZXhwcmVzc2lvbiBhbmQgbm8gc3Vycm91bmRpbmcgdGV4dC4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEV2ZW50UGFydCBkb2VzIG5vdCB1c2UgdGhlIGJhc2UgXyRzZXRWYWx1ZS9fcmVzb2x2ZVZhbHVlIGltcGxlbWVudGF0aW9uXG4gIC8vIHNpbmNlIHRoZSBkaXJ0eSBjaGVja2luZyBpcyBtb3JlIGNvbXBsZXhcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvdmVycmlkZSBfJHNldFZhbHVlKFxuICAgIG5ld0xpc3RlbmVyOiB1bmtub3duLFxuICAgIGRpcmVjdGl2ZVBhcmVudDogRGlyZWN0aXZlUGFyZW50ID0gdGhpc1xuICApIHtcbiAgICBuZXdMaXN0ZW5lciA9XG4gICAgICByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIG5ld0xpc3RlbmVyLCBkaXJlY3RpdmVQYXJlbnQsIDApID8/IG5vdGhpbmc7XG4gICAgaWYgKG5ld0xpc3RlbmVyID09PSBub0NoYW5nZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvbGRMaXN0ZW5lciA9IHRoaXMuXyRjb21taXR0ZWRWYWx1ZTtcblxuICAgIC8vIElmIHRoZSBuZXcgdmFsdWUgaXMgbm90aGluZyBvciBhbnkgb3B0aW9ucyBjaGFuZ2Ugd2UgaGF2ZSB0byByZW1vdmUgdGhlXG4gICAgLy8gcGFydCBhcyBhIGxpc3RlbmVyLlxuICAgIGNvbnN0IHNob3VsZFJlbW92ZUxpc3RlbmVyID1cbiAgICAgIChuZXdMaXN0ZW5lciA9PT0gbm90aGluZyAmJiBvbGRMaXN0ZW5lciAhPT0gbm90aGluZykgfHxcbiAgICAgIChuZXdMaXN0ZW5lciBhcyBFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMpLmNhcHR1cmUgIT09XG4gICAgICAgIChvbGRMaXN0ZW5lciBhcyBFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMpLmNhcHR1cmUgfHxcbiAgICAgIChuZXdMaXN0ZW5lciBhcyBFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMpLm9uY2UgIT09XG4gICAgICAgIChvbGRMaXN0ZW5lciBhcyBFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMpLm9uY2UgfHxcbiAgICAgIChuZXdMaXN0ZW5lciBhcyBFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMpLnBhc3NpdmUgIT09XG4gICAgICAgIChvbGRMaXN0ZW5lciBhcyBFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMpLnBhc3NpdmU7XG5cbiAgICAvLyBJZiB0aGUgbmV3IHZhbHVlIGlzIG5vdCBub3RoaW5nIGFuZCB3ZSByZW1vdmVkIHRoZSBsaXN0ZW5lciwgd2UgaGF2ZVxuICAgIC8vIHRvIGFkZCB0aGUgcGFydCBhcyBhIGxpc3RlbmVyLlxuICAgIGNvbnN0IHNob3VsZEFkZExpc3RlbmVyID1cbiAgICAgIG5ld0xpc3RlbmVyICE9PSBub3RoaW5nICYmXG4gICAgICAob2xkTGlzdGVuZXIgPT09IG5vdGhpbmcgfHwgc2hvdWxkUmVtb3ZlTGlzdGVuZXIpO1xuXG4gICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgIGtpbmQ6ICdjb21taXQgZXZlbnQgbGlzdGVuZXInLFxuICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgdmFsdWU6IG5ld0xpc3RlbmVyLFxuICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgIHJlbW92ZUxpc3RlbmVyOiBzaG91bGRSZW1vdmVMaXN0ZW5lcixcbiAgICAgICAgYWRkTGlzdGVuZXI6IHNob3VsZEFkZExpc3RlbmVyLFxuICAgICAgICBvbGRMaXN0ZW5lcixcbiAgICAgIH0pO1xuICAgIGlmIChzaG91bGRSZW1vdmVMaXN0ZW5lcikge1xuICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgdGhpcyxcbiAgICAgICAgb2xkTGlzdGVuZXIgYXMgRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoc2hvdWxkQWRkTGlzdGVuZXIpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgIHRoaXMsXG4gICAgICAgIG5ld0xpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbmV3TGlzdGVuZXI7XG4gIH1cblxuICBoYW5kbGVFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlLmNhbGwodGhpcy5vcHRpb25zPy5ob3N0ID8/IHRoaXMuZWxlbWVudCwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIEV2ZW50TGlzdGVuZXJPYmplY3QpLmhhbmRsZUV2ZW50KGV2ZW50KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUge0VsZW1lbnRQYXJ0fTtcbmNsYXNzIEVsZW1lbnRQYXJ0IGltcGxlbWVudHMgRGlzY29ubmVjdGFibGUge1xuICByZWFkb25seSB0eXBlID0gRUxFTUVOVF9QQVJUO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19kaXJlY3RpdmU/OiBEaXJlY3RpdmU7XG5cbiAgLy8gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCBldmVyeSBQYXJ0IGhhcyBhIF8kY29tbWl0dGVkVmFsdWVcbiAgXyRjb21taXR0ZWRWYWx1ZTogdW5kZWZpbmVkO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRwYXJlbnQhOiBEaXNjb25uZWN0YWJsZTtcblxuICAvKiogQGludGVybmFsICovXG4gIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT4gPSB1bmRlZmluZWQ7XG5cbiAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudDogRWxlbWVudCxcbiAgICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICB9XG5cbiAgXyRzZXRWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICBraW5kOiAnY29tbWl0IHRvIGVsZW1lbnQgYmluZGluZycsXG4gICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogRU5EIFVTRVJTIFNIT1VMRCBOT1QgUkVMWSBPTiBUSElTIE9CSkVDVC5cbiAqXG4gKiBQcml2YXRlIGV4cG9ydHMgZm9yIHVzZSBieSBvdGhlciBMaXQgcGFja2FnZXMsIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGJ5XG4gKiBleHRlcm5hbCB1c2Vycy5cbiAqXG4gKiBXZSBjdXJyZW50bHkgZG8gbm90IG1ha2UgYSBtYW5nbGVkIHJvbGx1cCBidWlsZCBvZiB0aGUgbGl0LXNzciBjb2RlLiBJbiBvcmRlclxuICogdG8ga2VlcCBhIG51bWJlciBvZiAob3RoZXJ3aXNlIHByaXZhdGUpIHRvcC1sZXZlbCBleHBvcnRzIG1hbmdsZWQgaW4gdGhlXG4gKiBjbGllbnQgc2lkZSBjb2RlLCB3ZSBleHBvcnQgYSBfJExIIG9iamVjdCBjb250YWluaW5nIHRob3NlIG1lbWJlcnMgKG9yXG4gKiBoZWxwZXIgbWV0aG9kcyBmb3IgYWNjZXNzaW5nIHByaXZhdGUgZmllbGRzIG9mIHRob3NlIG1lbWJlcnMpLCBhbmQgdGhlblxuICogcmUtZXhwb3J0IHRoZW0gZm9yIHVzZSBpbiBsaXQtc3NyLiBUaGlzIGtlZXBzIGxpdC1zc3IgYWdub3N0aWMgdG8gd2hldGhlciB0aGVcbiAqIGNsaWVudC1zaWRlIGNvZGUgaXMgYmVpbmcgdXNlZCBpbiBgZGV2YCBtb2RlIG9yIGBwcm9kYCBtb2RlLlxuICpcbiAqIFRoaXMgaGFzIGEgdW5pcXVlIG5hbWUsIHRvIGRpc2FtYmlndWF0ZSBpdCBmcm9tIHByaXZhdGUgZXhwb3J0cyBpblxuICogbGl0LWVsZW1lbnQsIHdoaWNoIHJlLWV4cG9ydHMgYWxsIG9mIGxpdC1odG1sLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBfJExIID0ge1xuICAvLyBVc2VkIGluIGxpdC1zc3JcbiAgX2JvdW5kQXR0cmlidXRlU3VmZml4OiBib3VuZEF0dHJpYnV0ZVN1ZmZpeCxcbiAgX21hcmtlcjogbWFya2VyLFxuICBfbWFya2VyTWF0Y2g6IG1hcmtlck1hdGNoLFxuICBfSFRNTF9SRVNVTFQ6IEhUTUxfUkVTVUxULFxuICBfZ2V0VGVtcGxhdGVIdG1sOiBnZXRUZW1wbGF0ZUh0bWwsXG4gIC8vIFVzZWQgaW4gdGVzdHMgYW5kIHByaXZhdGUtc3NyLXN1cHBvcnRcbiAgX1RlbXBsYXRlSW5zdGFuY2U6IFRlbXBsYXRlSW5zdGFuY2UsXG4gIF9pc0l0ZXJhYmxlOiBpc0l0ZXJhYmxlLFxuICBfcmVzb2x2ZURpcmVjdGl2ZTogcmVzb2x2ZURpcmVjdGl2ZSxcbiAgX0NoaWxkUGFydDogQ2hpbGRQYXJ0LFxuICBfQXR0cmlidXRlUGFydDogQXR0cmlidXRlUGFydCxcbiAgX0Jvb2xlYW5BdHRyaWJ1dGVQYXJ0OiBCb29sZWFuQXR0cmlidXRlUGFydCxcbiAgX0V2ZW50UGFydDogRXZlbnRQYXJ0LFxuICBfUHJvcGVydHlQYXJ0OiBQcm9wZXJ0eVBhcnQsXG4gIF9FbGVtZW50UGFydDogRWxlbWVudFBhcnQsXG59O1xuXG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5jb25zdCBwb2x5ZmlsbFN1cHBvcnQgPSBERVZfTU9ERVxuICA/IGdsb2JhbC5saXRIdG1sUG9seWZpbGxTdXBwb3J0RGV2TW9kZVxuICA6IGdsb2JhbC5saXRIdG1sUG9seWZpbGxTdXBwb3J0O1xucG9seWZpbGxTdXBwb3J0Py4oVGVtcGxhdGUsIENoaWxkUGFydCk7XG5cbi8vIElNUE9SVEFOVDogZG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydHkgbmFtZSBvciB0aGUgYXNzaWdubWVudCBleHByZXNzaW9uLlxuLy8gVGhpcyBsaW5lIHdpbGwgYmUgdXNlZCBpbiByZWdleGVzIHRvIHNlYXJjaCBmb3IgbGl0LWh0bWwgdXNhZ2UuXG4oZ2xvYmFsLmxpdEh0bWxWZXJzaW9ucyA/Pz0gW10pLnB1c2goJzMuMy4wJyk7XG5pZiAoREVWX01PREUgJiYgZ2xvYmFsLmxpdEh0bWxWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICBpc3N1ZVdhcm5pbmchKFxuICAgICAgJ211bHRpcGxlLXZlcnNpb25zJyxcbiAgICAgIGBNdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXQgbG9hZGVkLiBgICtcbiAgICAgICAgYExvYWRpbmcgbXVsdGlwbGUgdmVyc2lvbnMgaXMgbm90IHJlY29tbWVuZGVkLmBcbiAgICApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdmFsdWUsIHVzdWFsbHkgYSBsaXQtaHRtbCBUZW1wbGF0ZVJlc3VsdCwgdG8gdGhlIGNvbnRhaW5lci5cbiAqXG4gKiBUaGlzIGV4YW1wbGUgcmVuZGVycyB0aGUgdGV4dCBcIkhlbGxvLCBab2UhXCIgaW5zaWRlIGEgcGFyYWdyYXBoIHRhZywgYXBwZW5kaW5nXG4gKiBpdCB0byB0aGUgY29udGFpbmVyIGBkb2N1bWVudC5ib2R5YC5cbiAqXG4gKiBgYGBqc1xuICogaW1wb3J0IHtodG1sLCByZW5kZXJ9IGZyb20gJ2xpdCc7XG4gKlxuICogY29uc3QgbmFtZSA9IFwiWm9lXCI7XG4gKiByZW5kZXIoaHRtbGA8cD5IZWxsbywgJHtuYW1lfSE8L3A+YCwgZG9jdW1lbnQuYm9keSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgQW55IFtyZW5kZXJhYmxlXG4gKiAgIHZhbHVlXShodHRwczovL2xpdC5kZXYvZG9jcy90ZW1wbGF0ZXMvZXhwcmVzc2lvbnMvI2NoaWxkLWV4cHJlc3Npb25zKSxcbiAqICAgdHlwaWNhbGx5IGEge0BsaW5rY29kZSBUZW1wbGF0ZVJlc3VsdH0gY3JlYXRlZCBieSBldmFsdWF0aW5nIGEgdGVtcGxhdGUgdGFnXG4gKiAgIGxpa2Uge0BsaW5rY29kZSBodG1sfSBvciB7QGxpbmtjb2RlIHN2Z30uXG4gKiBAcGFyYW0gY29udGFpbmVyIEEgRE9NIGNvbnRhaW5lciB0byByZW5kZXIgdG8uIFRoZSBmaXJzdCByZW5kZXIgd2lsbCBhcHBlbmRcbiAqICAgdGhlIHJlbmRlcmVkIHZhbHVlIHRvIHRoZSBjb250YWluZXIsIGFuZCBzdWJzZXF1ZW50IHJlbmRlcnMgd2lsbFxuICogICBlZmZpY2llbnRseSB1cGRhdGUgdGhlIHJlbmRlcmVkIHZhbHVlIGlmIHRoZSBzYW1lIHJlc3VsdCB0eXBlIHdhc1xuICogICBwcmV2aW91c2x5IHJlbmRlcmVkIHRoZXJlLlxuICogQHBhcmFtIG9wdGlvbnMgU2VlIHtAbGlua2NvZGUgUmVuZGVyT3B0aW9uc30gZm9yIG9wdGlvbnMgZG9jdW1lbnRhdGlvbi5cbiAqIEBzZWVcbiAqIHtAbGluayBodHRwczovL2xpdC5kZXYvZG9jcy9saWJyYXJpZXMvc3RhbmRhbG9uZS10ZW1wbGF0ZXMvI3JlbmRlcmluZy1saXQtaHRtbC10ZW1wbGF0ZXN8IFJlbmRlcmluZyBMaXQgSFRNTCBUZW1wbGF0ZXN9XG4gKi9cbmV4cG9ydCBjb25zdCByZW5kZXIgPSAoXG4gIHZhbHVlOiB1bmtub3duLFxuICBjb250YWluZXI6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnRGcmFnbWVudCxcbiAgb3B0aW9ucz86IFJlbmRlck9wdGlvbnNcbik6IFJvb3RQYXJ0ID0+IHtcbiAgaWYgKERFVl9NT0RFICYmIGNvbnRhaW5lciA9PSBudWxsKSB7XG4gICAgLy8gR2l2ZSBhIGNsZWFyZXIgZXJyb3IgbWVzc2FnZSB0aGFuXG4gICAgLy8gICAgIFVuY2F1Z2h0IFR5cGVFcnJvcjogQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiBudWxsIChyZWFkaW5nXG4gICAgLy8gICAgICdfJGxpdFBhcnQkJylcbiAgICAvLyB3aGljaCByZWFkcyBsaWtlIGFuIGludGVybmFsIExpdCBlcnJvci5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBUaGUgY29udGFpbmVyIHRvIHJlbmRlciBpbnRvIG1heSBub3QgYmUgJHtjb250YWluZXJ9YCk7XG4gIH1cbiAgY29uc3QgcmVuZGVySWQgPSBERVZfTU9ERSA/IGRlYnVnTG9nUmVuZGVySWQrKyA6IDA7XG4gIGNvbnN0IHBhcnRPd25lck5vZGUgPSBvcHRpb25zPy5yZW5kZXJCZWZvcmUgPz8gY29udGFpbmVyO1xuICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBsZXQgcGFydDogQ2hpbGRQYXJ0ID0gKHBhcnRPd25lck5vZGUgYXMgYW55KVsnXyRsaXRQYXJ0JCddO1xuICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgZGVidWdMb2dFdmVudCh7XG4gICAgICBraW5kOiAnYmVnaW4gcmVuZGVyJyxcbiAgICAgIGlkOiByZW5kZXJJZCxcbiAgICAgIHZhbHVlLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHBhcnQsXG4gICAgfSk7XG4gIGlmIChwYXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlbmROb2RlID0gb3B0aW9ucz8ucmVuZGVyQmVmb3JlID8/IG51bGw7XG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIChwYXJ0T3duZXJOb2RlIGFzIGFueSlbJ18kbGl0UGFydCQnXSA9IHBhcnQgPSBuZXcgQ2hpbGRQYXJ0KFxuICAgICAgY29udGFpbmVyLmluc2VydEJlZm9yZShjcmVhdGVNYXJrZXIoKSwgZW5kTm9kZSksXG4gICAgICBlbmROb2RlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgb3B0aW9ucyA/PyB7fVxuICAgICk7XG4gIH1cbiAgcGFydC5fJHNldFZhbHVlKHZhbHVlKTtcbiAgZGVidWdMb2dFdmVudCAmJlxuICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAga2luZDogJ2VuZCByZW5kZXInLFxuICAgICAgaWQ6IHJlbmRlcklkLFxuICAgICAgdmFsdWUsXG4gICAgICBjb250YWluZXIsXG4gICAgICBvcHRpb25zLFxuICAgICAgcGFydCxcbiAgICB9KTtcbiAgcmV0dXJuIHBhcnQgYXMgUm9vdFBhcnQ7XG59O1xuXG5pZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gIHJlbmRlci5zZXRTYW5pdGl6ZXIgPSBzZXRTYW5pdGl6ZXI7XG4gIHJlbmRlci5jcmVhdGVTYW5pdGl6ZXIgPSBjcmVhdGVTYW5pdGl6ZXI7XG4gIGlmIChERVZfTU9ERSkge1xuICAgIHJlbmRlci5fdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2UgPVxuICAgICAgX3Rlc3RPbmx5Q2xlYXJTYW5pdGl6ZXJGYWN0b3J5RG9Ob3RDYWxsT3JFbHNlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogVGhlIG1haW4gTGl0RWxlbWVudCBtb2R1bGUsIHdoaWNoIGRlZmluZXMgdGhlIHtAbGlua2NvZGUgTGl0RWxlbWVudH0gYmFzZVxuICogY2xhc3MgYW5kIHJlbGF0ZWQgQVBJcy5cbiAqXG4gKiBMaXRFbGVtZW50IGNvbXBvbmVudHMgY2FuIGRlZmluZSBhIHRlbXBsYXRlIGFuZCBhIHNldCBvZiBvYnNlcnZlZFxuICogcHJvcGVydGllcy4gQ2hhbmdpbmcgYW4gb2JzZXJ2ZWQgcHJvcGVydHkgdHJpZ2dlcnMgYSByZS1yZW5kZXIgb2YgdGhlXG4gKiBlbGVtZW50LlxuICpcbiAqIEltcG9ydCB7QGxpbmtjb2RlIExpdEVsZW1lbnR9IGFuZCB7QGxpbmtjb2RlIGh0bWx9IGZyb20gdGhpcyBtb2R1bGUgdG9cbiAqIGNyZWF0ZSBhIGNvbXBvbmVudDpcbiAqXG4gKiAgYGBganNcbiAqIGltcG9ydCB7TGl0RWxlbWVudCwgaHRtbH0gZnJvbSAnbGl0LWVsZW1lbnQnO1xuICpcbiAqIGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICpcbiAqICAgLy8gRGVjbGFyZSBvYnNlcnZlZCBwcm9wZXJ0aWVzXG4gKiAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAqICAgICByZXR1cm4ge1xuICogICAgICAgYWRqZWN0aXZlOiB7fVxuICogICAgIH1cbiAqICAgfVxuICpcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgdGhpcy5hZGplY3RpdmUgPSAnYXdlc29tZSc7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIERlZmluZSB0aGUgZWxlbWVudCdzIHRlbXBsYXRlXG4gKiAgIHJlbmRlcigpIHtcbiAqICAgICByZXR1cm4gaHRtbGA8cD55b3VyICR7YWRqZWN0aXZlfSB0ZW1wbGF0ZSBoZXJlPC9wPmA7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ215LWVsZW1lbnQnLCBNeUVsZW1lbnQpO1xuICogYGBgXG4gKlxuICogYExpdEVsZW1lbnRgIGV4dGVuZHMge0BsaW5rY29kZSBSZWFjdGl2ZUVsZW1lbnR9IGFuZCBhZGRzIGxpdC1odG1sXG4gKiB0ZW1wbGF0aW5nLiBUaGUgYFJlYWN0aXZlRWxlbWVudGAgY2xhc3MgaXMgcHJvdmlkZWQgZm9yIHVzZXJzIHRoYXQgd2FudCB0b1xuICogYnVpbGQgdGhlaXIgb3duIGN1c3RvbSBlbGVtZW50IGJhc2UgY2xhc3NlcyB0aGF0IGRvbid0IHVzZSBsaXQtaHRtbC5cbiAqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuaW1wb3J0IHtQcm9wZXJ0eVZhbHVlcywgUmVhY3RpdmVFbGVtZW50fSBmcm9tICdAbGl0L3JlYWN0aXZlLWVsZW1lbnQnO1xuaW1wb3J0IHtyZW5kZXIsIFJlbmRlck9wdGlvbnMsIG5vQ2hhbmdlLCBSb290UGFydH0gZnJvbSAnbGl0LWh0bWwnO1xuZXhwb3J0ICogZnJvbSAnQGxpdC9yZWFjdGl2ZS1lbGVtZW50JztcbmV4cG9ydCAqIGZyb20gJ2xpdC1odG1sJztcblxuaW1wb3J0IHtMaXRVbnN0YWJsZX0gZnJvbSAnbGl0LWh0bWwnO1xuaW1wb3J0IHtSZWFjdGl2ZVVuc3RhYmxlfSBmcm9tICdAbGl0L3JlYWN0aXZlLWVsZW1lbnQnO1xuXG4vKipcbiAqIENvbnRhaW5zIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHVuc3RhYmxlIGRlYnVnIEFQSS5cbiAqXG4gKiBFdmVyeXRoaW5nIGluIHRoaXMgQVBJIGlzIG5vdCBzdGFibGUgYW5kIG1heSBjaGFuZ2Ugb3IgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLFxuICogZXZlbiBvbiBwYXRjaCByZWxlYXNlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbmV4cG9ydCBuYW1lc3BhY2UgVW5zdGFibGUge1xuICAvKipcbiAgICogV2hlbiBMaXQgaXMgcnVubmluZyBpbiBkZXYgbW9kZSBhbmQgYHdpbmRvdy5lbWl0TGl0RGVidWdMb2dFdmVudHNgIGlzIHRydWUsXG4gICAqIHdlIHdpbGwgZW1pdCAnbGl0LWRlYnVnJyBldmVudHMgdG8gd2luZG93LCB3aXRoIGxpdmUgZGV0YWlscyBhYm91dCB0aGUgdXBkYXRlIGFuZCByZW5kZXJcbiAgICogbGlmZWN5Y2xlLiBUaGVzZSBjYW4gYmUgdXNlZnVsIGZvciB3cml0aW5nIGRlYnVnIHRvb2xpbmcgYW5kIHZpc3VhbGl6YXRpb25zLlxuICAgKlxuICAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCBydW5uaW5nIHdpdGggd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50cyBoYXMgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsXG4gICAqIG1ha2luZyBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm9ybWFsbHkgdmVyeSBjaGVhcCAobGlrZSBhIG5vLW9wIHJlbmRlcikgbXVjaCBzbG93ZXIsXG4gICAqIGJlY2F1c2Ugd2UgbXVzdCBjb3B5IGRhdGEgYW5kIGRpc3BhdGNoIGV2ZW50cy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG4gIGV4cG9ydCBuYW1lc3BhY2UgRGVidWdMb2cge1xuICAgIGV4cG9ydCB0eXBlIEVudHJ5ID1cbiAgICAgIHwgTGl0VW5zdGFibGUuRGVidWdMb2cuRW50cnlcbiAgICAgIHwgUmVhY3RpdmVVbnN0YWJsZS5EZWJ1Z0xvZy5FbnRyeTtcbiAgfVxufVxuLypcbiAqIFdoZW4gdXNpbmcgQ2xvc3VyZSBDb21waWxlciwgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eShwcm9wZXJ0eSwgb2JqZWN0KSBpc1xuICogcmVwbGFjZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSBtdW5nZWQgbmFtZSBmb3Igb2JqZWN0W3Byb3BlcnR5XS4gV2UgY2Fubm90XG4gKiBhbGlhcyB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIHNtYWxsIHNoaW0gdGhhdCBoYXMgdGhlIHNhbWVcbiAqIGJlaGF2aW9yIHdoZW4gbm90IGNvbXBpbGluZy5cbiAqL1xuLypAX19JTkxJTkVfXyovXG5jb25zdCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5ID0gPFAgZXh0ZW5kcyBQcm9wZXJ0eUtleT4oXG4gIHByb3A6IFAsXG4gIF9vYmo6IHVua25vd25cbik6IFAgPT4gcHJvcDtcblxuY29uc3QgREVWX01PREUgPSB0cnVlO1xuLy8gQWxsb3dzIG1pbmlmaWVycyB0byByZW5hbWUgcmVmZXJlbmNlcyB0byBnbG9iYWxUaGlzXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuXG5sZXQgaXNzdWVXYXJuaW5nOiAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHZvaWQ7XG5cbmlmIChERVZfTU9ERSkge1xuICAvLyBFbnN1cmUgd2FybmluZ3MgYXJlIGlzc3VlZCBvbmx5IDF4LCBldmVuIGlmIG11bHRpcGxlIHZlcnNpb25zIG9mIExpdFxuICAvLyBhcmUgbG9hZGVkLlxuICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MgPz89IG5ldyBTZXQoKTtcblxuICAvKipcbiAgICogSXNzdWUgYSB3YXJuaW5nIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSwgYmFzZWQgZWl0aGVyIG9uIGBjb2RlYCBvciBgd2FybmluZ2AuXG4gICAqIFdhcm5pbmdzIGFyZSBkaXNhYmxlZCBhdXRvbWF0aWNhbGx5IG9ubHkgYnkgYHdhcm5pbmdgOyBkaXNhYmxpbmcgdmlhIGBjb2RlYFxuICAgKiBjYW4gYmUgZG9uZSBieSB1c2Vycy5cbiAgICovXG4gIGlzc3VlV2FybmluZyA9IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4ge1xuICAgIHdhcm5pbmcgKz0gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmA7XG4gICAgaWYgKFxuICAgICAgIWdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyEuaGFzKHdhcm5pbmcpICYmXG4gICAgICAhZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzIS5oYXMoY29kZSlcbiAgICApIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyEuYWRkKHdhcm5pbmcpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBCYXNlIGVsZW1lbnQgY2xhc3MgdGhhdCBtYW5hZ2VzIGVsZW1lbnQgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcywgYW5kXG4gKiByZW5kZXJzIGEgbGl0LWh0bWwgdGVtcGxhdGUuXG4gKlxuICogVG8gZGVmaW5lIGEgY29tcG9uZW50LCBzdWJjbGFzcyBgTGl0RWxlbWVudGAgYW5kIGltcGxlbWVudCBhXG4gKiBgcmVuZGVyYCBtZXRob2QgdG8gcHJvdmlkZSB0aGUgY29tcG9uZW50J3MgdGVtcGxhdGUuIERlZmluZSBwcm9wZXJ0aWVzXG4gKiB1c2luZyB0aGUge0BsaW5rY29kZSBMaXRFbGVtZW50LnByb3BlcnRpZXMgcHJvcGVydGllc30gcHJvcGVydHkgb3IgdGhlXG4gKiB7QGxpbmtjb2RlIHByb3BlcnR5fSBkZWNvcmF0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBMaXRFbGVtZW50IGV4dGVuZHMgUmVhY3RpdmVFbGVtZW50IHtcbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgc3RhdGljIFsnXyRsaXRFbGVtZW50JCddID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGNhdGVnb3J5IHJlbmRlcmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgcmVuZGVyT3B0aW9uczogUmVuZGVyT3B0aW9ucyA9IHtob3N0OiB0aGlzfTtcblxuICBwcml2YXRlIF9fY2hpbGRQYXJ0OiBSb290UGFydCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGNhdGVnb3J5IHJlbmRlcmluZ1xuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNyZWF0ZVJlbmRlclJvb3QoKSB7XG4gICAgY29uc3QgcmVuZGVyUm9vdCA9IHN1cGVyLmNyZWF0ZVJlbmRlclJvb3QoKTtcbiAgICAvLyBXaGVuIGFkb3B0ZWRTdHlsZVNoZWV0cyBhcmUgc2hpbW1lZCwgdGhleSBhcmUgaW5zZXJ0ZWQgaW50byB0aGVcbiAgICAvLyBzaGFkb3dSb290IGJ5IGNyZWF0ZVJlbmRlclJvb3QuIEFkanVzdCB0aGUgcmVuZGVyQmVmb3JlIG5vZGUgc28gdGhhdFxuICAgIC8vIGFueSBzdHlsZXMgaW4gTGl0IGNvbnRlbnQgcmVuZGVyIGJlZm9yZSBhZG9wdGVkU3R5bGVTaGVldHMuIFRoaXMgaXNcbiAgICAvLyBpbXBvcnRhbnQgc28gdGhhdCBhZG9wdGVkU3R5bGVTaGVldHMgaGF2ZSBwcmVjZWRlbmNlIG92ZXIgc3R5bGVzIGluXG4gICAgLy8gdGhlIHNoYWRvd1Jvb3QuXG4gICAgdGhpcy5yZW5kZXJPcHRpb25zLnJlbmRlckJlZm9yZSA/Pz0gcmVuZGVyUm9vdCEuZmlyc3RDaGlsZCBhcyBDaGlsZE5vZGU7XG4gICAgcmV0dXJuIHJlbmRlclJvb3Q7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZWxlbWVudC4gVGhpcyBtZXRob2QgcmVmbGVjdHMgcHJvcGVydHkgdmFsdWVzIHRvIGF0dHJpYnV0ZXNcbiAgICogYW5kIGNhbGxzIGByZW5kZXJgIHRvIHJlbmRlciBET00gdmlhIGxpdC1odG1sLiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlXG4gICAqIHRoaXMgbWV0aG9kIHdpbGwgKm5vdCogdHJpZ2dlciBhbm90aGVyIHVwZGF0ZS5cbiAgICogQHBhcmFtIGNoYW5nZWRQcm9wZXJ0aWVzIE1hcCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgd2l0aCBvbGQgdmFsdWVzXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcykge1xuICAgIC8vIFNldHRpbmcgcHJvcGVydGllcyBpbiBgcmVuZGVyYCBzaG91bGQgbm90IHRyaWdnZXIgYW4gdXBkYXRlLiBTaW5jZVxuICAgIC8vIHVwZGF0ZXMgYXJlIGFsbG93ZWQgYWZ0ZXIgc3VwZXIudXBkYXRlLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGByZW5kZXJgXG4gICAgLy8gYmVmb3JlIHRoYXQuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlbmRlcigpO1xuICAgIGlmICghdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICB0aGlzLnJlbmRlck9wdGlvbnMuaXNDb25uZWN0ZWQgPSB0aGlzLmlzQ29ubmVjdGVkO1xuICAgIH1cbiAgICBzdXBlci51cGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgIHRoaXMuX19jaGlsZFBhcnQgPSByZW5kZXIodmFsdWUsIHRoaXMucmVuZGVyUm9vdCwgdGhpcy5yZW5kZXJPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBhZGRlZCB0byB0aGUgZG9jdW1lbnQncyBET00uXG4gICAqXG4gICAqIEluIGBjb25uZWN0ZWRDYWxsYmFjaygpYCB5b3Ugc2hvdWxkIHNldHVwIHRhc2tzIHRoYXQgc2hvdWxkIG9ubHkgb2NjdXIgd2hlblxuICAgKiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIGRvY3VtZW50LiBUaGUgbW9zdCBjb21tb24gb2YgdGhlc2UgaXNcbiAgICogYWRkaW5nIGV2ZW50IGxpc3RlbmVycyB0byBub2RlcyBleHRlcm5hbCB0byB0aGUgZWxlbWVudCwgbGlrZSBhIGtleWRvd25cbiAgICogZXZlbnQgaGFuZGxlciBhZGRlZCB0byB0aGUgd2luZG93LlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICogICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgKiAgIGFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9oYW5kbGVLZXlkb3duKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogVHlwaWNhbGx5LCBhbnl0aGluZyBkb25lIGluIGBjb25uZWN0ZWRDYWxsYmFjaygpYCBzaG91bGQgYmUgdW5kb25lIHdoZW4gdGhlXG4gICAqIGVsZW1lbnQgaXMgZGlzY29ubmVjdGVkLCBpbiBgZGlzY29ubmVjdGVkQ2FsbGJhY2soKWAuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBsaWZlY3ljbGVcbiAgICovXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5fX2NoaWxkUGFydD8uc2V0Q29ubmVjdGVkKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQncyBET00uXG4gICAqXG4gICAqIFRoaXMgY2FsbGJhY2sgaXMgdGhlIG1haW4gc2lnbmFsIHRvIHRoZSBlbGVtZW50IHRoYXQgaXQgbWF5IG5vIGxvbmdlciBiZVxuICAgKiB1c2VkLiBgZGlzY29ubmVjdGVkQ2FsbGJhY2soKWAgc2hvdWxkIGVuc3VyZSB0aGF0IG5vdGhpbmcgaXMgaG9sZGluZyBhXG4gICAqIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCAoc3VjaCBhcyBldmVudCBsaXN0ZW5lcnMgYWRkZWQgdG8gbm9kZXMgZXh0ZXJuYWxcbiAgICogdG8gdGhlIGVsZW1lbnQpLCBzbyB0aGF0IGl0IGlzIGZyZWUgdG8gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgKiAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAqICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9oYW5kbGVLZXlkb3duKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQW4gZWxlbWVudCBtYXkgYmUgcmUtY29ubmVjdGVkIGFmdGVyIGJlaW5nIGRpc2Nvbm5lY3RlZC5cbiAgICpcbiAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgKi9cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLl9fY2hpbGRQYXJ0Py5zZXRDb25uZWN0ZWQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZWQgb24gZWFjaCB1cGRhdGUgdG8gcGVyZm9ybSByZW5kZXJpbmcgdGFza3MuIFRoaXMgbWV0aG9kIG1heSByZXR1cm5cbiAgICogYW55IHZhbHVlIHJlbmRlcmFibGUgYnkgbGl0LWh0bWwncyBgQ2hpbGRQYXJ0YCAtIHR5cGljYWxseSBhXG4gICAqIGBUZW1wbGF0ZVJlc3VsdGAuIFNldHRpbmcgcHJvcGVydGllcyBpbnNpZGUgdGhpcyBtZXRob2Qgd2lsbCAqbm90KiB0cmlnZ2VyXG4gICAqIHRoZSBlbGVtZW50IHRvIHVwZGF0ZS5cbiAgICogQGNhdGVnb3J5IHJlbmRlcmluZ1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlbmRlcigpOiB1bmtub3duIHtcbiAgICByZXR1cm4gbm9DaGFuZ2U7XG4gIH1cbn1cblxuLyoqXG4gKiBFbnN1cmUgdGhpcyBjbGFzcyBpcyBtYXJrZWQgYXMgYGZpbmFsaXplZGAgYXMgYW4gb3B0aW1pemF0aW9uIGVuc3VyaW5nXG4gKiBpdCB3aWxsIG5vdCBuZWVkbGVzc2x5IHRyeSB0byBgZmluYWxpemVgLlxuICpcbiAqIE5vdGUgdGhpcyBwcm9wZXJ0eSBuYW1lIGlzIGEgc3RyaW5nIHRvIHByZXZlbnQgYnJlYWtpbmcgQ2xvc3VyZSBKUyBDb21waWxlclxuICogb3B0aW1pemF0aW9ucy4gU2VlIEBsaXQvcmVhY3RpdmUtZWxlbWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqL1xuKExpdEVsZW1lbnQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbXG4gIEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2ZpbmFsaXplZCcsIExpdEVsZW1lbnQpXG5dID0gdHJ1ZTtcblxuLy8gSW5zdGFsbCBoeWRyYXRpb24gaWYgYXZhaWxhYmxlXG5nbG9iYWwubGl0RWxlbWVudEh5ZHJhdGVTdXBwb3J0Py4oe0xpdEVsZW1lbnR9KTtcblxuLy8gQXBwbHkgcG9seWZpbGxzIGlmIGF2YWlsYWJsZVxuY29uc3QgcG9seWZpbGxTdXBwb3J0ID0gREVWX01PREVcbiAgPyBnbG9iYWwubGl0RWxlbWVudFBvbHlmaWxsU3VwcG9ydERldk1vZGVcbiAgOiBnbG9iYWwubGl0RWxlbWVudFBvbHlmaWxsU3VwcG9ydDtcbnBvbHlmaWxsU3VwcG9ydD8uKHtMaXRFbGVtZW50fSk7XG5cbi8qKlxuICogRU5EIFVTRVJTIFNIT1VMRCBOT1QgUkVMWSBPTiBUSElTIE9CSkVDVC5cbiAqXG4gKiBQcml2YXRlIGV4cG9ydHMgZm9yIHVzZSBieSBvdGhlciBMaXQgcGFja2FnZXMsIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGJ5XG4gKiBleHRlcm5hbCB1c2Vycy5cbiAqXG4gKiBXZSBjdXJyZW50bHkgZG8gbm90IG1ha2UgYSBtYW5nbGVkIHJvbGx1cCBidWlsZCBvZiB0aGUgbGl0LXNzciBjb2RlLiBJbiBvcmRlclxuICogdG8ga2VlcCBhIG51bWJlciBvZiAob3RoZXJ3aXNlIHByaXZhdGUpIHRvcC1sZXZlbCBleHBvcnRzICBtYW5nbGVkIGluIHRoZVxuICogY2xpZW50IHNpZGUgY29kZSwgd2UgZXhwb3J0IGEgXyRMRSBvYmplY3QgY29udGFpbmluZyB0aG9zZSBtZW1iZXJzIChvclxuICogaGVscGVyIG1ldGhvZHMgZm9yIGFjY2Vzc2luZyBwcml2YXRlIGZpZWxkcyBvZiB0aG9zZSBtZW1iZXJzKSwgYW5kIHRoZW5cbiAqIHJlLWV4cG9ydCB0aGVtIGZvciB1c2UgaW4gbGl0LXNzci4gVGhpcyBrZWVwcyBsaXQtc3NyIGFnbm9zdGljIHRvIHdoZXRoZXIgdGhlXG4gKiBjbGllbnQtc2lkZSBjb2RlIGlzIGJlaW5nIHVzZWQgaW4gYGRldmAgbW9kZSBvciBgcHJvZGAgbW9kZS5cbiAqXG4gKiBUaGlzIGhhcyBhIHVuaXF1ZSBuYW1lLCB0byBkaXNhbWJpZ3VhdGUgaXQgZnJvbSBwcml2YXRlIGV4cG9ydHMgaW5cbiAqIGxpdC1odG1sLCBzaW5jZSB0aGlzIG1vZHVsZSByZS1leHBvcnRzIGFsbCBvZiBsaXQtaHRtbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgXyRMRSA9IHtcbiAgXyRhdHRyaWJ1dGVUb1Byb3BlcnR5OiAoXG4gICAgZWw6IExpdEVsZW1lbnQsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlOiBzdHJpbmcgfCBudWxsXG4gICkgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIChlbCBhcyBhbnkpLl8kYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lLCB2YWx1ZSk7XG4gIH0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBfJGNoYW5nZWRQcm9wZXJ0aWVzOiAoZWw6IExpdEVsZW1lbnQpID0+IChlbCBhcyBhbnkpLl8kY2hhbmdlZFByb3BlcnRpZXMsXG59O1xuXG4vLyBJTVBPUlRBTlQ6IGRvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnR5IG5hbWUgb3IgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi5cbi8vIFRoaXMgbGluZSB3aWxsIGJlIHVzZWQgaW4gcmVnZXhlcyB0byBzZWFyY2ggZm9yIExpdEVsZW1lbnQgdXNhZ2UuXG4oZ2xvYmFsLmxpdEVsZW1lbnRWZXJzaW9ucyA/Pz0gW10pLnB1c2goJzQuMi4wJyk7XG5pZiAoREVWX01PREUgJiYgZ2xvYmFsLmxpdEVsZW1lbnRWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICBpc3N1ZVdhcm5pbmchKFxuICAgICAgJ211bHRpcGxlLXZlcnNpb25zJyxcbiAgICAgIGBNdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXQgbG9hZGVkLiBMb2FkaW5nIG11bHRpcGxlIHZlcnNpb25zIGAgK1xuICAgICAgICBgaXMgbm90IHJlY29tbWVuZGVkLmBcbiAgICApO1xuICB9KTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuaW1wb3J0IHR5cGUge0NvbnN0cnVjdG9yfSBmcm9tICcuL2Jhc2UuanMnO1xuXG4vKipcbiAqIEFsbG93IGZvciBjdXN0b20gZWxlbWVudCBjbGFzc2VzIHdpdGggcHJpdmF0ZSBjb25zdHJ1Y3RvcnNcbiAqL1xudHlwZSBDdXN0b21FbGVtZW50Q2xhc3MgPSBPbWl0PHR5cGVvZiBIVE1MRWxlbWVudCwgJ25ldyc+O1xuXG5leHBvcnQgdHlwZSBDdXN0b21FbGVtZW50RGVjb3JhdG9yID0ge1xuICAvLyBsZWdhY3lcbiAgKGNsczogQ3VzdG9tRWxlbWVudENsYXNzKTogdm9pZDtcblxuICAvLyBzdGFuZGFyZFxuICAoXG4gICAgdGFyZ2V0OiBDdXN0b21FbGVtZW50Q2xhc3MsXG4gICAgY29udGV4dDogQ2xhc3NEZWNvcmF0b3JDb250ZXh0PENvbnN0cnVjdG9yPEhUTUxFbGVtZW50Pj5cbiAgKTogdm9pZDtcbn07XG5cbi8qKlxuICogQ2xhc3MgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBkZWZpbmVzIHRoZSBkZWNvcmF0ZWQgY2xhc3MgYXMgYSBjdXN0b20gZWxlbWVudC5cbiAqXG4gKiBgYGBqc1xuICogQGN1c3RvbUVsZW1lbnQoJ215LWVsZW1lbnQnKVxuICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gKiAgIHJlbmRlcigpIHtcbiAqICAgICByZXR1cm4gaHRtbGBgO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JcbiAqIEBwYXJhbSB0YWdOYW1lIFRoZSB0YWcgbmFtZSBvZiB0aGUgY3VzdG9tIGVsZW1lbnQgdG8gZGVmaW5lLlxuICovXG5leHBvcnQgY29uc3QgY3VzdG9tRWxlbWVudCA9XG4gICh0YWdOYW1lOiBzdHJpbmcpOiBDdXN0b21FbGVtZW50RGVjb3JhdG9yID0+XG4gIChcbiAgICBjbGFzc09yVGFyZ2V0OiBDdXN0b21FbGVtZW50Q2xhc3MgfCBDb25zdHJ1Y3RvcjxIVE1MRWxlbWVudD4sXG4gICAgY29udGV4dD86IENsYXNzRGVjb3JhdG9yQ29udGV4dDxDb25zdHJ1Y3RvcjxIVE1MRWxlbWVudD4+XG4gICkgPT4ge1xuICAgIGlmIChjb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIoKCkgPT4ge1xuICAgICAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gICAgICAgICAgdGFnTmFtZSxcbiAgICAgICAgICBjbGFzc09yVGFyZ2V0IGFzIEN1c3RvbUVsZW1lbnRDb25zdHJ1Y3RvclxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSh0YWdOYW1lLCBjbGFzc09yVGFyZ2V0IGFzIEN1c3RvbUVsZW1lbnRDb25zdHJ1Y3Rvcik7XG4gICAgfVxuICB9O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vKlxuICogSU1QT1JUQU5UOiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRzaWNrbGUgYW5kIHRoZSBDbG9zdXJlIEpTIGNvbXBpbGVyLCBhbGxcbiAqIHByb3BlcnR5IGRlY29yYXRvcnMgKGJ1dCBub3QgY2xhc3MgZGVjb3JhdG9ycykgaW4gdGhpcyBmaWxlIHRoYXQgaGF2ZVxuICogYW4gQEV4cG9ydERlY29yYXRlZEl0ZW1zIGFubm90YXRpb24gbXVzdCBiZSBkZWZpbmVkIGFzIGEgcmVndWxhciBmdW5jdGlvbixcbiAqIG5vdCBhbiBhcnJvdyBmdW5jdGlvbi5cbiAqL1xuXG5pbXBvcnQge1xuICB0eXBlIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIHR5cGUgUmVhY3RpdmVFbGVtZW50LFxuICBkZWZhdWx0Q29udmVydGVyLFxuICBub3RFcXVhbCxcbn0gZnJvbSAnLi4vcmVhY3RpdmUtZWxlbWVudC5qcyc7XG5pbXBvcnQgdHlwZSB7SW50ZXJmYWNlfSBmcm9tICcuL2Jhc2UuanMnO1xuXG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG5cbmxldCBpc3N1ZVdhcm5pbmc6IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4gdm9pZDtcblxuaWYgKERFVl9NT0RFKSB7XG4gIC8vIEVuc3VyZSB3YXJuaW5ncyBhcmUgaXNzdWVkIG9ubHkgMXgsIGV2ZW4gaWYgbXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0XG4gIC8vIGFyZSBsb2FkZWQuXG4gIGdsb2JhbFRoaXMubGl0SXNzdWVkV2FybmluZ3MgPz89IG5ldyBTZXQoKTtcblxuICAvKipcbiAgICogSXNzdWUgYSB3YXJuaW5nIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSwgYmFzZWQgZWl0aGVyIG9uIGBjb2RlYCBvciBgd2FybmluZ2AuXG4gICAqIFdhcm5pbmdzIGFyZSBkaXNhYmxlZCBhdXRvbWF0aWNhbGx5IG9ubHkgYnkgYHdhcm5pbmdgOyBkaXNhYmxpbmcgdmlhIGBjb2RlYFxuICAgKiBjYW4gYmUgZG9uZSBieSB1c2Vycy5cbiAgICovXG4gIGlzc3VlV2FybmluZyA9IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4ge1xuICAgIHdhcm5pbmcgKz0gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmA7XG4gICAgaWYgKFxuICAgICAgIWdsb2JhbFRoaXMubGl0SXNzdWVkV2FybmluZ3MhLmhhcyh3YXJuaW5nKSAmJlxuICAgICAgIWdsb2JhbFRoaXMubGl0SXNzdWVkV2FybmluZ3MhLmhhcyhjb2RlKVxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgICAgZ2xvYmFsVGhpcy5saXRJc3N1ZWRXYXJuaW5ncyEuYWRkKHdhcm5pbmcpO1xuICAgIH1cbiAgfTtcbn1cblxuLy8gT3ZlcmxvYWRzIGZvciBwcm9wZXJ0eSBkZWNvcmF0b3Igc28gdGhhdCBUeXBlU2NyaXB0IGNhbiBpbmZlciB0aGUgY29ycmVjdFxuLy8gcmV0dXJuIHR5cGUgd2hlbiBhIGRlY29yYXRvciBpcyB1c2VkIGFzIGFuIGFjY2Vzc29yIGRlY29yYXRvciBvciBhIHNldHRlclxuLy8gZGVjb3JhdG9yLlxuZXhwb3J0IHR5cGUgUHJvcGVydHlEZWNvcmF0b3IgPSB7XG4gIC8vIGFjY2Vzc29yIGRlY29yYXRvciBzaWduYXR1cmVcbiAgPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gICAgdGFyZ2V0OiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yVGFyZ2V0PEMsIFY+LFxuICAgIGNvbnRleHQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICk6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JSZXN1bHQ8QywgVj47XG5cbiAgLy8gc2V0dGVyIGRlY29yYXRvciBzaWduYXR1cmVcbiAgPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gICAgdGFyZ2V0OiAodmFsdWU6IFYpID0+IHZvaWQsXG4gICAgY29udGV4dDogQ2xhc3NTZXR0ZXJEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICk6ICh0aGlzOiBDLCB2YWx1ZTogVikgPT4gdm9pZDtcblxuICAvLyBsZWdhY3kgZGVjb3JhdG9yIHNpZ25hdHVyZVxuICAoXG4gICAgcHJvdG9PckRlc2NyaXB0b3I6IE9iamVjdCxcbiAgICBuYW1lOiBQcm9wZXJ0eUtleSxcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogYW55O1xufTtcblxuY29uc3QgbGVnYWN5UHJvcGVydHkgPSAoXG4gIG9wdGlvbnM6IFByb3BlcnR5RGVjbGFyYXRpb24gfCB1bmRlZmluZWQsXG4gIHByb3RvOiBPYmplY3QsXG4gIG5hbWU6IFByb3BlcnR5S2V5XG4pID0+IHtcbiAgY29uc3QgaGFzT3duUHJvcGVydHkgPSBwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgKHByb3RvLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLmNyZWF0ZVByb3BlcnR5KG5hbWUsIG9wdGlvbnMpO1xuICAvLyBGb3IgYWNjZXNzb3JzICh3aGljaCBoYXZlIGEgZGVzY3JpcHRvciBvbiB0aGUgcHJvdG90eXBlKSB3ZSBuZWVkIHRvXG4gIC8vIHJldHVybiBhIGRlc2NyaXB0b3IsIG90aGVyd2lzZSBUeXBlU2NyaXB0IG92ZXJ3cml0ZXMgdGhlIGRlc2NyaXB0b3Igd2VcbiAgLy8gZGVmaW5lIGluIGNyZWF0ZVByb3BlcnR5KCkgd2l0aCB0aGUgb3JpZ2luYWwgZGVzY3JpcHRvci4gV2UgZG9uJ3QgZG8gdGhpc1xuICAvLyBmb3IgZmllbGRzLCB3aGljaCBkb24ndCBoYXZlIGEgZGVzY3JpcHRvciwgYmVjYXVzZSB0aGlzIGNvdWxkIG92ZXJ3cml0ZVxuICAvLyBkZXNjcmlwdG9yIGRlZmluZWQgYnkgb3RoZXIgZGVjb3JhdG9ycy5cbiAgcmV0dXJuIGhhc093blByb3BlcnR5XG4gICAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBuYW1lKVxuICAgIDogdW5kZWZpbmVkO1xufTtcblxuLy8gVGhpcyBpcyBkdXBsaWNhdGVkIGZyb20gYSBzaW1pbGFyIHZhcmlhYmxlIGluIHJlYWN0aXZlLWVsZW1lbnQudHMsIGJ1dFxuLy8gYWN0dWFsbHkgbWFrZXMgc2Vuc2UgdG8gaGF2ZSB0aGlzIGRlZmF1bHQgZGVmaW5lZCB3aXRoIHRoZSBkZWNvcmF0b3IsIHNvXG4vLyB0aGF0IGRpZmZlcmVudCBkZWNvcmF0b3JzIGNvdWxkIGhhdmUgZGlmZmVyZW50IGRlZmF1bHRzLlxuY29uc3QgZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb246IFByb3BlcnR5RGVjbGFyYXRpb24gPSB7XG4gIGF0dHJpYnV0ZTogdHJ1ZSxcbiAgdHlwZTogU3RyaW5nLFxuICBjb252ZXJ0ZXI6IGRlZmF1bHRDb252ZXJ0ZXIsXG4gIHJlZmxlY3Q6IGZhbHNlLFxuICBoYXNDaGFuZ2VkOiBub3RFcXVhbCxcbn07XG5cbi8vIFRlbXBvcmFyeSB0eXBlLCB1bnRpbCBnb29nbGUzIGlzIG9uIFR5cGVTY3JpcHQgNS4yXG50eXBlIFN0YW5kYXJkUHJvcGVydHlDb250ZXh0PEMsIFY+ID0gKFxuICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gIHwgQ2xhc3NTZXR0ZXJEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4pICYge21ldGFkYXRhOiBvYmplY3R9O1xuXG4vKipcbiAqIFdyYXBzIGEgY2xhc3MgYWNjZXNzb3Igb3Igc2V0dGVyIHNvIHRoYXQgYHJlcXVlc3RVcGRhdGUoKWAgaXMgY2FsbGVkIHdpdGggdGhlXG4gKiBwcm9wZXJ0eSBuYW1lIGFuZCBvbGQgdmFsdWUgd2hlbiB0aGUgYWNjZXNzb3IgaXMgc2V0LlxuICovXG5leHBvcnQgY29uc3Qgc3RhbmRhcmRQcm9wZXJ0eSA9IDxDIGV4dGVuZHMgSW50ZXJmYWNlPFJlYWN0aXZlRWxlbWVudD4sIFY+KFxuICBvcHRpb25zOiBQcm9wZXJ0eURlY2xhcmF0aW9uID0gZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIHRhcmdldDogQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPiB8ICgodmFsdWU6IFYpID0+IHZvaWQpLFxuICBjb250ZXh0OiBTdGFuZGFyZFByb3BlcnR5Q29udGV4dDxDLCBWPlxuKTogQ2xhc3NBY2Nlc3NvckRlY29yYXRvclJlc3VsdDxDLCBWPiB8ICgodGhpczogQywgdmFsdWU6IFYpID0+IHZvaWQpID0+IHtcbiAgY29uc3Qge2tpbmQsIG1ldGFkYXRhfSA9IGNvbnRleHQ7XG5cbiAgaWYgKERFVl9NT0RFICYmIG1ldGFkYXRhID09IG51bGwpIHtcbiAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAnbWlzc2luZy1jbGFzcy1tZXRhZGF0YScsXG4gICAgICBgVGhlIGNsYXNzICR7dGFyZ2V0fSBpcyBtaXNzaW5nIGRlY29yYXRvciBtZXRhZGF0YS4gVGhpcyBgICtcbiAgICAgICAgYGNvdWxkIG1lYW4gdGhhdCB5b3UncmUgdXNpbmcgYSBjb21waWxlciB0aGF0IHN1cHBvcnRzIGRlY29yYXRvcnMgYCArXG4gICAgICAgIGBidXQgZG9lc24ndCBzdXBwb3J0IGRlY29yYXRvciBtZXRhZGF0YSwgc3VjaCBhcyBUeXBlU2NyaXB0IDUuMS4gYCArXG4gICAgICAgIGBQbGVhc2UgdXBkYXRlIHlvdXIgY29tcGlsZXIuYFxuICAgICk7XG4gIH1cblxuICAvLyBTdG9yZSB0aGUgcHJvcGVydHkgb3B0aW9uc1xuICBsZXQgcHJvcGVydGllcyA9IGdsb2JhbFRoaXMubGl0UHJvcGVydHlNZXRhZGF0YS5nZXQobWV0YWRhdGEpO1xuICBpZiAocHJvcGVydGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZ2xvYmFsVGhpcy5saXRQcm9wZXJ0eU1ldGFkYXRhLnNldChtZXRhZGF0YSwgKHByb3BlcnRpZXMgPSBuZXcgTWFwKCkpKTtcbiAgfVxuICBpZiAoa2luZCA9PT0gJ3NldHRlcicpIHtcbiAgICBvcHRpb25zID0gT2JqZWN0LmNyZWF0ZShvcHRpb25zKTtcbiAgICBvcHRpb25zLndyYXBwZWQgPSB0cnVlO1xuICB9XG4gIHByb3BlcnRpZXMuc2V0KGNvbnRleHQubmFtZSwgb3B0aW9ucyk7XG5cbiAgaWYgKGtpbmQgPT09ICdhY2Nlc3NvcicpIHtcbiAgICAvLyBTdGFuZGFyZCBkZWNvcmF0b3JzIGNhbm5vdCBkeW5hbWljYWxseSBtb2RpZnkgdGhlIGNsYXNzLCBzbyB3ZSBjYW4ndFxuICAgIC8vIHJlcGxhY2UgYSBmaWVsZCB3aXRoIGFjY2Vzc29ycy4gVGhlIHVzZXIgbXVzdCB1c2UgdGhlIG5ldyBgYWNjZXNzb3JgXG4gICAgLy8ga2V5d29yZCBpbnN0ZWFkLlxuICAgIGNvbnN0IHtuYW1lfSA9IGNvbnRleHQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHY6IFYpIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSAoXG4gICAgICAgICAgdGFyZ2V0IGFzIENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj5cbiAgICAgICAgKS5nZXQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgQyk7XG4gICAgICAgICh0YXJnZXQgYXMgQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPikuc2V0LmNhbGwoXG4gICAgICAgICAgdGhpcyBhcyB1bmtub3duIGFzIEMsXG4gICAgICAgICAgdlxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICAgIGluaXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2OiBWKTogViB7XG4gICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl8kY2hhbmdlUHJvcGVydHkobmFtZSwgdW5kZWZpbmVkLCBvcHRpb25zLCB2KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIENsYXNzQWNjZXNzb3JEZWNvcmF0b3JSZXN1bHQ8QywgVj47XG4gIH0gZWxzZSBpZiAoa2luZCA9PT0gJ3NldHRlcicpIHtcbiAgICBjb25zdCB7bmFtZX0gPSBjb250ZXh0O1xuICAgIHJldHVybiBmdW5jdGlvbiAodGhpczogUmVhY3RpdmVFbGVtZW50LCB2YWx1ZTogVikge1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzW25hbWUgYXMga2V5b2YgUmVhY3RpdmVFbGVtZW50XTtcbiAgICAgICh0YXJnZXQgYXMgKHZhbHVlOiBWKSA9PiB2b2lkKS5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG4gICAgfSBhcyB1bmtub3duIGFzICh0aGlzOiBDLCB2YWx1ZTogVikgPT4gdm9pZDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRlY29yYXRvciBsb2NhdGlvbjogJHtraW5kfWApO1xufTtcblxuLyoqXG4gKiBBIGNsYXNzIGZpZWxkIG9yIGFjY2Vzc29yIGRlY29yYXRvciB3aGljaCBjcmVhdGVzIGEgcmVhY3RpdmUgcHJvcGVydHkgdGhhdFxuICogcmVmbGVjdHMgYSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSB2YWx1ZS4gV2hlbiBhIGRlY29yYXRlZCBwcm9wZXJ0eSBpcyBzZXRcbiAqIHRoZSBlbGVtZW50IHdpbGwgdXBkYXRlIGFuZCByZW5kZXIuIEEge0BsaW5rY29kZSBQcm9wZXJ0eURlY2xhcmF0aW9ufSBtYXlcbiAqIG9wdGlvbmFsbHkgYmUgc3VwcGxpZWQgdG8gY29uZmlndXJlIHByb3BlcnR5IGZlYXR1cmVzLlxuICpcbiAqIFRoaXMgZGVjb3JhdG9yIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHB1YmxpYyBmaWVsZHMuIEFzIHB1YmxpYyBmaWVsZHMsXG4gKiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIHByaW1hcmlseSBzZXR0YWJsZSBieSBlbGVtZW50IHVzZXJzLFxuICogZWl0aGVyIHZpYSBhdHRyaWJ1dGUgb3IgdGhlIHByb3BlcnR5IGl0c2VsZi5cbiAqXG4gKiBHZW5lcmFsbHksIHByb3BlcnRpZXMgdGhhdCBhcmUgY2hhbmdlZCBieSB0aGUgZWxlbWVudCBzaG91bGQgYmUgcHJpdmF0ZSBvclxuICogcHJvdGVjdGVkIGZpZWxkcyBhbmQgc2hvdWxkIHVzZSB0aGUge0BsaW5rY29kZSBzdGF0ZX0gZGVjb3JhdG9yLlxuICpcbiAqIEhvd2V2ZXIsIHNvbWV0aW1lcyBlbGVtZW50IGNvZGUgZG9lcyBuZWVkIHRvIHNldCBhIHB1YmxpYyBwcm9wZXJ0eS4gVGhpc1xuICogc2hvdWxkIHR5cGljYWxseSBvbmx5IGJlIGRvbmUgaW4gcmVzcG9uc2UgdG8gdXNlciBpbnRlcmFjdGlvbiwgYW5kIGFuIGV2ZW50XG4gKiBzaG91bGQgYmUgZmlyZWQgaW5mb3JtaW5nIHRoZSB1c2VyOyBmb3IgZXhhbXBsZSwgYSBjaGVja2JveCBzZXRzIGl0c1xuICogYGNoZWNrZWRgIHByb3BlcnR5IHdoZW4gY2xpY2tlZCBhbmQgZmlyZXMgYSBgY2hhbmdlZGAgZXZlbnQuIE11dGF0aW5nIHB1YmxpY1xuICogcHJvcGVydGllcyBzaG91bGQgdHlwaWNhbGx5IG5vdCBiZSBkb25lIGZvciBub24tcHJpbWl0aXZlIChvYmplY3Qgb3IgYXJyYXkpXG4gKiBwcm9wZXJ0aWVzLiBJbiBvdGhlciBjYXNlcyB3aGVuIGFuIGVsZW1lbnQgbmVlZHMgdG8gbWFuYWdlIHN0YXRlLCBhIHByaXZhdGVcbiAqIHByb3BlcnR5IGRlY29yYXRlZCB2aWEgdGhlIHtAbGlua2NvZGUgc3RhdGV9IGRlY29yYXRvciBzaG91bGQgYmUgdXNlZC4gV2hlblxuICogbmVlZGVkLCBzdGF0ZSBwcm9wZXJ0aWVzIGNhbiBiZSBpbml0aWFsaXplZCB2aWEgcHVibGljIHByb3BlcnRpZXMgdG9cbiAqIGZhY2lsaXRhdGUgY29tcGxleCBpbnRlcmFjdGlvbnMuXG4gKlxuICogYGBgdHNcbiAqIGNsYXNzIE15RWxlbWVudCB7XG4gKiAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSlcbiAqICAgY2xpY2tlZCA9IGZhbHNlO1xuICogfVxuICogYGBgXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yXG4gKiBARXhwb3J0RGVjb3JhdGVkSXRlbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5KG9wdGlvbnM/OiBQcm9wZXJ0eURlY2xhcmF0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gPEMgZXh0ZW5kcyBJbnRlcmZhY2U8UmVhY3RpdmVFbGVtZW50PiwgVj4oXG4gICAgcHJvdG9PclRhcmdldDpcbiAgICAgIHwgb2JqZWN0XG4gICAgICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj5cbiAgICAgIHwgKCh2YWx1ZTogVikgPT4gdm9pZCksXG4gICAgbmFtZU9yQ29udGV4dDpcbiAgICAgIHwgUHJvcGVydHlLZXlcbiAgICAgIHwgQ2xhc3NBY2Nlc3NvckRlY29yYXRvckNvbnRleHQ8QywgVj5cbiAgICAgIHwgQ2xhc3NTZXR0ZXJEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgKTogYW55ID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIG5hbWVPckNvbnRleHQgPT09ICdvYmplY3QnXG4gICAgICAgID8gc3RhbmRhcmRQcm9wZXJ0eTxDLCBWPihcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBwcm90b09yVGFyZ2V0IGFzXG4gICAgICAgICAgICAgIHwgQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPlxuICAgICAgICAgICAgICB8ICgodmFsdWU6IFYpID0+IHZvaWQpLFxuICAgICAgICAgICAgbmFtZU9yQ29udGV4dCBhcyBTdGFuZGFyZFByb3BlcnR5Q29udGV4dDxDLCBWPlxuICAgICAgICAgIClcbiAgICAgICAgOiBsZWdhY3lQcm9wZXJ0eShcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBwcm90b09yVGFyZ2V0IGFzIE9iamVjdCxcbiAgICAgICAgICAgIG5hbWVPckNvbnRleHQgYXMgUHJvcGVydHlLZXlcbiAgICAgICAgICApXG4gICAgKSBhcyBQcm9wZXJ0eURlY29yYXRvcjtcbiAgfTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuaW1wb3J0IHtwcm9wZXJ0eX0gZnJvbSAnLi9wcm9wZXJ0eS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVEZWNsYXJhdGlvbjxUeXBlID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGluZGljYXRlcyBpZiBhIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGNoYW5nZWQgd2hlblxuICAgKiBpdCBpcyBzZXQuIFRoZSBmdW5jdGlvbiBzaG91bGQgdGFrZSB0aGUgYG5ld1ZhbHVlYCBhbmQgYG9sZFZhbHVlYCBhbmRcbiAgICogcmV0dXJuIGB0cnVlYCBpZiBhbiB1cGRhdGUgc2hvdWxkIGJlIHJlcXVlc3RlZC5cbiAgICovXG4gIGhhc0NoYW5nZWQ/KHZhbHVlOiBUeXBlLCBvbGRWYWx1ZTogVHlwZSk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0YXRlRGVjbGFyYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgSW50ZXJuYWxQcm9wZXJ0eURlY2xhcmF0aW9uPFR5cGUgPSB1bmtub3duPiA9XG4gIFN0YXRlRGVjbGFyYXRpb248VHlwZT47XG5cbi8qKlxuICogRGVjbGFyZXMgYSBwcml2YXRlIG9yIHByb3RlY3RlZCByZWFjdGl2ZSBwcm9wZXJ0eSB0aGF0IHN0aWxsIHRyaWdnZXJzXG4gKiB1cGRhdGVzIHRvIHRoZSBlbGVtZW50IHdoZW4gaXQgY2hhbmdlcy4gSXQgZG9lcyBub3QgcmVmbGVjdCBmcm9tIHRoZVxuICogY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUuXG4gKlxuICogUHJvcGVydGllcyBkZWNsYXJlZCB0aGlzIHdheSBtdXN0IG5vdCBiZSB1c2VkIGZyb20gSFRNTCBvciBIVE1MIHRlbXBsYXRpbmdcbiAqIHN5c3RlbXMsIHRoZXkncmUgc29sZWx5IGZvciBwcm9wZXJ0aWVzIGludGVybmFsIHRvIHRoZSBlbGVtZW50LiBUaGVzZVxuICogcHJvcGVydGllcyBtYXkgYmUgcmVuYW1lZCBieSBvcHRpbWl6YXRpb24gdG9vbHMgbGlrZSBjbG9zdXJlIGNvbXBpbGVyLlxuICogQGNhdGVnb3J5IERlY29yYXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhdGUob3B0aW9ucz86IFN0YXRlRGVjbGFyYXRpb24pIHtcbiAgcmV0dXJuIHByb3BlcnR5KHtcbiAgICAuLi5vcHRpb25zLFxuICAgIC8vIEFkZCBib3RoIGBzdGF0ZWAgYW5kIGBhdHRyaWJ1dGVgIGJlY2F1c2Ugd2UgZm91bmQgYSB0aGlyZCBwYXJ0eVxuICAgIC8vIGNvbnRyb2xsZXIgdGhhdCBpcyBrZXlpbmcgb2ZmIG9mIFByb3BlcnR5T3B0aW9ucy5zdGF0ZSB0byBkZXRlcm1pbmVcbiAgICAvLyB3aGV0aGVyIGEgZmllbGQgaXMgYSBwcml2YXRlIGludGVybmFsIHByb3BlcnR5IG9yIG5vdC5cbiAgICBzdGF0ZTogdHJ1ZSxcbiAgICBhdHRyaWJ1dGU6IGZhbHNlLFxuICB9KTtcbn1cbiIsICIvKipcbiAqIEBmaWxlIGFwaS1mb3JtYXQudHNcbiAqIEBkZXNjcmlwdGlvbiBIZXVyaXN0aWNzIGZvciBkZXRlY3RpbmcgYW5kIGxhYmVsaW5nIExMTSBBUEkgd2lyZSBmb3JtYXRzLlxuICpcbiAqIE9wZW5Db2RlIGFuZCBDb2RleCBtYXkgcHJveHkgQW50aHJvcGljIE1lc3NhZ2VzLCBPcGVuQUkgQ2hhdCBDb21wbGV0aW9ucyxcbiAqIG9yIE9wZW5BSSBSZXNwb25zZXMgQVBJcy4gVGhlc2UgaGVscGVycyBpbmZlciBmb3JtYXQgZnJvbSBucG0gcGFja2FnZSBuYW1lcyxcbiAqIFVSTCBwYXRocywgYW5kIEpTT04gYm9keSBzaGFwZXMgZm9yIHZpZXdlciBkaXNwbGF5IGFuZCBwYXJzaW5nIGRlY2lzaW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwaUZvcm1hdCB9IGZyb20gXCIuLi90b29scy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBSYXdQYWlyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogSW5mZXIgQVBJIGZvcm1hdCBmcm9tIGFuIE9wZW5Db2RlIHByb3ZpZGVyIG5wbSBwYWNrYWdlIG5hbWUuXG4gKiBAcGFyYW0gbnBtIC0gVmFsdWUgZnJvbSBvcGVuY29kZS5qc29uIHByb3ZpZGVyIGNvbmZpZyAoZS5nLiBcIkBhaS1zZGsvYW50aHJvcGljXCIpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmZlckFwaUZvcm1hdEZyb21OcG0obnBtOiBzdHJpbmcpOiBBcGlGb3JtYXQge1xuXHRpZiAobnBtLmluY2x1ZGVzKFwiYW50aHJvcGljXCIpKSB7XG5cdFx0cmV0dXJuIFwiYW50aHJvcGljXCI7XG5cdH1cblx0aWYgKG5wbS5pbmNsdWRlcyhcIm9wZW5haS1jb21wYXRpYmxlXCIpKSB7XG5cdFx0cmV0dXJuIFwib3BlbmFpXCI7XG5cdH1cblx0aWYgKG5wbS5pbmNsdWRlcyhcIm9wZW5haVwiKSkge1xuXHRcdHJldHVybiBcIm9wZW5haS1yZXNwb25zZXNcIjtcblx0fVxuXHRyZXR1cm4gXCJ1bmtub3duXCI7XG59XG5cbi8qKlxuICogSW5mZXIgQVBJIGZvcm1hdCBmcm9tIHRoZSByZXF1ZXN0IFVSTCBwYXRoIHNlZ21lbnQuXG4gKiBAcGFyYW0gdXJsIC0gRnVsbCByZXF1ZXN0IFVSTFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5mZXJBcGlGb3JtYXRGcm9tVXJsKHVybDogc3RyaW5nIHwgdW5kZWZpbmVkKTogQXBpRm9ybWF0IHtcblx0aWYgKCF1cmwpIHtcblx0XHRyZXR1cm4gXCJ1bmtub3duXCI7XG5cdH1cblx0aWYgKHVybC5pbmNsdWRlcyhcIi9jaGF0L2NvbXBsZXRpb25zXCIpKSB7XG5cdFx0cmV0dXJuIFwib3BlbmFpXCI7XG5cdH1cblx0aWYgKHVybC5pbmNsdWRlcyhcIi9yZXNwb25zZXNcIikpIHtcblx0XHRyZXR1cm4gXCJvcGVuYWktcmVzcG9uc2VzXCI7XG5cdH1cblx0aWYgKHVybC5pbmNsdWRlcyhcIi9tZXNzYWdlc1wiKSkge1xuXHRcdHJldHVybiBcImFudGhyb3BpY1wiO1xuXHR9XG5cdHJldHVybiBcInVua25vd25cIjtcbn1cblxuLyoqXG4gKiBJbmZlciBBUEkgZm9ybWF0IGZyb20gSlNPTiByZXF1ZXN0L3Jlc3BvbnNlIGJvZHkgc3RydWN0dXJlLlxuICogQ2hlY2tzIGZvciBwcm92aWRlci1zcGVjaWZpYyB0b3AtbGV2ZWwga2V5cyBhbmQgbWVzc2FnZSBibG9jayBzaGFwZXMuXG4gKiBAcGFyYW0gYm9keSAtIFBhcnNlZCBKU09OIGJvZHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZmVyQXBpRm9ybWF0RnJvbUJvZHkoYm9keTogdW5rbm93bik6IEFwaUZvcm1hdCB7XG5cdGlmICghYm9keSB8fCB0eXBlb2YgYm9keSAhPT0gXCJvYmplY3RcIikge1xuXHRcdHJldHVybiBcInVua25vd25cIjtcblx0fVxuXHRjb25zdCByZWNvcmQgPSBib2R5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRpZiAoXCJjaG9pY2VzXCIgaW4gcmVjb3JkKSB7XG5cdFx0cmV0dXJuIFwib3BlbmFpXCI7XG5cdH1cblx0aWYgKFwib3V0cHV0XCIgaW4gcmVjb3JkICYmIEFycmF5LmlzQXJyYXkocmVjb3JkLm91dHB1dCkpIHtcblx0XHRyZXR1cm4gXCJvcGVuYWktcmVzcG9uc2VzXCI7XG5cdH1cblx0aWYgKFwiY29udGVudFwiIGluIHJlY29yZCAmJiBBcnJheS5pc0FycmF5KHJlY29yZC5jb250ZW50KSkge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSByZWNvcmQuY29udGVudCBhcyB1bmtub3duW107XG5cdFx0aWYgKGNvbnRlbnQuc29tZSgoYmxvY2spID0+IHR5cGVvZiBibG9jayA9PT0gXCJvYmplY3RcIiAmJiBibG9jayAhPT0gbnVsbCAmJiBcInR5cGVcIiBpbiBibG9jaykpIHtcblx0XHRcdHJldHVybiBcImFudGhyb3BpY1wiO1xuXHRcdH1cblx0fVxuXHRpZiAoXCJtZXNzYWdlc1wiIGluIHJlY29yZCAmJiBBcnJheS5pc0FycmF5KHJlY29yZC5tZXNzYWdlcykpIHtcblx0XHRjb25zdCBtZXNzYWdlcyA9IHJlY29yZC5tZXNzYWdlcyBhcyB1bmtub3duW107XG5cdFx0aWYgKFxuXHRcdFx0bWVzc2FnZXMuc29tZShcblx0XHRcdFx0KG1zZykgPT5cblx0XHRcdFx0XHR0eXBlb2YgbXNnID09PSBcIm9iamVjdFwiICYmXG5cdFx0XHRcdFx0bXNnICE9PSBudWxsICYmXG5cdFx0XHRcdFx0XCJyb2xlXCIgaW4gbXNnICYmXG5cdFx0XHRcdFx0KChtc2cgYXMgeyByb2xlOiBzdHJpbmcgfSkucm9sZSA9PT0gXCJ0b29sXCIgfHxcblx0XHRcdFx0XHRcdFwidG9vbF9jYWxsc1wiIGluIChtc2cgYXMgb2JqZWN0KSksXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gXCJvcGVuYWlcIjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIFwidW5rbm93blwiO1xufVxuXG4vKiogSHVtYW4tcmVhZGFibGUgbGFiZWxzIHNob3duIGluIHRoZSBIVE1MIHZpZXdlciBhbmQgaW5kZXggc3VtbWFyaWVzLiAqL1xuY29uc3QgQVBJX0ZPUk1BVF9MQUJFTFM6IFJlY29yZDxBcGlGb3JtYXQsIHN0cmluZz4gPSB7XG5cdGFudGhyb3BpYzogXCJBbnRocm9waWMgTWVzc2FnZXNcIixcblx0b3BlbmFpOiBcIk9wZW5BSSBDaGF0XCIsXG5cdFwib3BlbmFpLXJlc3BvbnNlc1wiOiBcIk9wZW5BSSBSZXNwb25zZXNcIixcblx0dW5rbm93bjogXCJVbmtub3duXCIsXG59O1xuXG4vKiogQHBhcmFtIGZvcm1hdCAtIEludGVybmFsIEFwaUZvcm1hdCBlbnVtIHZhbHVlICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QXBpRm9ybWF0TGFiZWwoZm9ybWF0OiBBcGlGb3JtYXQpOiBzdHJpbmcge1xuXHRyZXR1cm4gQVBJX0ZPUk1BVF9MQUJFTFNbZm9ybWF0XSA/PyBmb3JtYXQ7XG59XG5cbi8qKlxuICogQnVpbGQgYSBkaXNwbGF5IHN0cmluZyBmb3IgY29udmVyc2F0aW9ucyB0aGF0IHVzZWQgbXVsdGlwbGUgQVBJIGZvcm1hdHMuXG4gKiBAcGFyYW0gZm9ybWF0cyAtIExpc3Qgb2YgZm9ybWF0cyBkZXRlY3RlZCBhY3Jvc3MgcGFpcnMgaW4gYSBjb252ZXJzYXRpb25cbiAqIEByZXR1cm5zIFNpbmdsZSBsYWJlbCwgXCJNaXhlZCAoLi4uKVwiLCBvciB1bmRlZmluZWQgaWYgYWxsIHVua25vd25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEFwaUZvcm1hdHNEaXNwbGF5KGZvcm1hdHM6IEFwaUZvcm1hdFtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgdW5pcXVlID0gWy4uLm5ldyBTZXQoZm9ybWF0cy5maWx0ZXIoKGZvcm1hdCkgPT4gZm9ybWF0ICYmIGZvcm1hdCAhPT0gXCJ1bmtub3duXCIpKV07XG5cdGlmICh1bmlxdWUubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRpZiAodW5pcXVlLmxlbmd0aCA9PT0gMSkge1xuXHRcdHJldHVybiBmb3JtYXRBcGlGb3JtYXRMYWJlbCh1bmlxdWVbMF0pO1xuXHR9XG5cdHJldHVybiBgTWl4ZWQgKCR7dW5pcXVlLm1hcChmb3JtYXRBcGlGb3JtYXRMYWJlbCkuam9pbihcIiArIFwiKX0pYDtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBBUEkgZm9ybWF0IGRldGVjdGlvbiBmb3IgYSBsb2dnZWQgcmVxdWVzdC9yZXNwb25zZSBwYWlyLlxuICogUHJlZmVycyBleHBsaWNpdCBwcm94eSBhbm5vdGF0aW9uLCB0aGVuIFVSTCwgdGhlbiByZXF1ZXN0IGJvZHksIHRoZW4gcmVzcG9uc2UgYm9keS5cbiAqIEBwYXJhbSBwYWlyIC0gT25lIFJhd1BhaXIgZnJvbSBKU09OTCBsb2dzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RBcGlGb3JtYXQocGFpcjogUmF3UGFpcik6IEFwaUZvcm1hdCB7XG5cdGNvbnN0IHJlc3BvbnNlID0gcGFpci5yZXNwb25zZTtcblx0aWYgKHJlc3BvbnNlICYmIFwiYXBpX2Zvcm1hdFwiIGluIHJlc3BvbnNlICYmIHJlc3BvbnNlLmFwaV9mb3JtYXQpIHtcblx0XHRyZXR1cm4gcmVzcG9uc2UuYXBpX2Zvcm1hdCBhcyBBcGlGb3JtYXQ7XG5cdH1cblxuXHRjb25zdCB1cmxGb3JtYXQgPSBpbmZlckFwaUZvcm1hdEZyb21VcmwocGFpci5yZXF1ZXN0Py51cmwpO1xuXHRpZiAodXJsRm9ybWF0ICE9PSBcInVua25vd25cIikge1xuXHRcdHJldHVybiB1cmxGb3JtYXQ7XG5cdH1cblxuXHRjb25zdCByZXF1ZXN0Qm9keUZvcm1hdCA9IGluZmVyQXBpRm9ybWF0RnJvbUJvZHkocGFpci5yZXF1ZXN0Py5ib2R5KTtcblx0aWYgKHJlcXVlc3RCb2R5Rm9ybWF0ICE9PSBcInVua25vd25cIikge1xuXHRcdHJldHVybiByZXF1ZXN0Qm9keUZvcm1hdDtcblx0fVxuXG5cdHJldHVybiBpbmZlckFwaUZvcm1hdEZyb21Cb2R5KHJlc3BvbnNlPy5ib2R5KTtcbn1cbiIsICIvKipcbiAqIEBmaWxlIE9wZW5BSSBcdTIxOTQgQW50aHJvcGljIGZvcm1hdCBhZGFwdGVyLlxuICpcbiAqIE5vcm1hbGl6ZXMgT3BlbkFJIENoYXQgQ29tcGxldGlvbnMgYW5kIFJlc3BvbnNlcyBBUEkgcGF5bG9hZHMgaW50byBBbnRocm9waWNcbiAqIGBNZXNzYWdlQ3JlYXRlUGFyYW1zYCAvIGBNZXNzYWdlYCBzaGFwZXMgc28gdGhlIHNoYXJlZCBjb252ZXJzYXRpb24gcHJvY2Vzc29yXG4gKiBhbmQgSFRNTCB2aWV3ZXIgY2FuIHJlbmRlciBhbGwgaW50ZXJjZXB0ZWQgcHJvdmlkZXJzIHVuaWZvcm1seS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG5cdENvbnRlbnRCbG9jayxcblx0TWVzc2FnZSxcblx0TWVzc2FnZUNyZWF0ZVBhcmFtcyxcblx0TWVzc2FnZVBhcmFtLFxuXHRUZXh0QmxvY2tQYXJhbSxcblx0VG9vbFJlc3VsdEJsb2NrUGFyYW0sXG5cdFRvb2xVc2VCbG9jayxcbn0gZnJvbSBcIkBhbnRocm9waWMtYWkvc2RrL3Jlc291cmNlcy9tZXNzYWdlc1wiO1xuaW1wb3J0IHR5cGUgeyBBcGlGb3JtYXQgfSBmcm9tIFwiLi4vdG9vbHMvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgUmF3UGFpciB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgZGV0ZWN0QXBpRm9ybWF0LCBpbmZlckFwaUZvcm1hdEZyb21VcmwgfSBmcm9tIFwiLi9hcGktZm9ybWF0XCI7XG5cbi8qKiBPcGVuQUkgY2hhdCBtZXNzYWdlIHNoYXBlIChyZXF1ZXN0IG9yIGNvbXBsZXRpb24gY2hvaWNlKS4gKi9cbmludGVyZmFjZSBPcGVuQUlNZXNzYWdlIHtcblx0cm9sZTogc3RyaW5nO1xuXHRjb250ZW50Pzogc3RyaW5nIHwgbnVsbCB8IEFycmF5PHsgdHlwZTogc3RyaW5nOyB0ZXh0Pzogc3RyaW5nIH0+O1xuXHR0b29sX2NhbGxzPzogT3BlbkFJVG9vbENhbGxbXTtcblx0dG9vbF9jYWxsX2lkPzogc3RyaW5nO1xuXHRuYW1lPzogc3RyaW5nO1xufVxuXG4vKiogQSBzaW5nbGUgdG9vbCBjYWxsIGVtaXR0ZWQgYnkgT3BlbkFJIGNoYXQgY29tcGxldGlvbnMuICovXG5pbnRlcmZhY2UgT3BlbkFJVG9vbENhbGwge1xuXHRpZDogc3RyaW5nO1xuXHR0eXBlOiBzdHJpbmc7XG5cdGZ1bmN0aW9uOiB7XG5cdFx0bmFtZTogc3RyaW5nO1xuXHRcdGFyZ3VtZW50czogc3RyaW5nO1xuXHR9O1xufVxuXG4vKiogT3BlbkFJIGZ1bmN0aW9uLXRvb2wgZGVmaW5pdGlvbiBpbiBjaGF0IG9yIHJlc3BvbnNlcyByZXF1ZXN0cy4gKi9cbmludGVyZmFjZSBPcGVuQUlUb29sIHtcblx0dHlwZTogc3RyaW5nO1xuXHRmdW5jdGlvbjoge1xuXHRcdG5hbWU6IHN0cmluZztcblx0XHRkZXNjcmlwdGlvbj86IHN0cmluZztcblx0XHRwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdH07XG59XG5cbi8qKiBQYXJzZWQgT3BlbkFJIGNoYXQgY29tcGxldGlvbiByZXNwb25zZSBib2R5LiAqL1xuaW50ZXJmYWNlIE9wZW5BSUNoYXRDb21wbGV0aW9uIHtcblx0aWQ/OiBzdHJpbmc7XG5cdG1vZGVsPzogc3RyaW5nO1xuXHRjaG9pY2VzPzogQXJyYXk8e1xuXHRcdGluZGV4PzogbnVtYmVyO1xuXHRcdG1lc3NhZ2U/OiBPcGVuQUlNZXNzYWdlO1xuXHRcdGRlbHRhPzogT3BlbkFJTWVzc2FnZSAmIHsgcm9sZT86IHN0cmluZyB9O1xuXHRcdGZpbmlzaF9yZWFzb24/OiBzdHJpbmcgfCBudWxsO1xuXHR9Pjtcblx0dXNhZ2U/OiB7XG5cdFx0cHJvbXB0X3Rva2Vucz86IG51bWJlcjtcblx0XHRjb21wbGV0aW9uX3Rva2Vucz86IG51bWJlcjtcblx0XHR0b3RhbF90b2tlbnM/OiBudW1iZXI7XG5cdH07XG59XG5cbi8qKiBPbmUgaXRlbSBpbiBhbiBPcGVuQUkgUmVzcG9uc2VzIEFQSSBgaW5wdXRgIGFycmF5LiAqL1xuaW50ZXJmYWNlIE9wZW5BSVJlc3BvbnNlc0lucHV0SXRlbSB7XG5cdHR5cGU/OiBzdHJpbmc7XG5cdHJvbGU/OiBzdHJpbmc7XG5cdGlkPzogc3RyaW5nO1xuXHRjYWxsX2lkPzogc3RyaW5nO1xuXHRuYW1lPzogc3RyaW5nO1xuXHRhcmd1bWVudHM/OiBzdHJpbmc7XG5cdG91dHB1dD86IHN0cmluZztcblx0Y29udGVudD86IHN0cmluZyB8IEFycmF5PHsgdHlwZTogc3RyaW5nOyB0ZXh0Pzogc3RyaW5nIH0+O1xuXHRzdW1tYXJ5PzogQXJyYXk8eyB0eXBlOiBzdHJpbmc7IHRleHQ/OiBzdHJpbmcgfT47XG59XG5cbi8qKiBPbmUgaXRlbSBpbiBhbiBPcGVuQUkgUmVzcG9uc2VzIEFQSSBgb3V0cHV0YCBhcnJheS4gKi9cbmludGVyZmFjZSBPcGVuQUlSZXNwb25zZXNPdXRwdXRJdGVtIHtcblx0dHlwZTogc3RyaW5nO1xuXHRpZD86IHN0cmluZztcblx0cm9sZT86IHN0cmluZztcblx0bmFtZT86IHN0cmluZztcblx0YXJndW1lbnRzPzogc3RyaW5nO1xuXHRjYWxsX2lkPzogc3RyaW5nO1xuXHRjb250ZW50Pzogc3RyaW5nIHwgQXJyYXk8eyB0eXBlOiBzdHJpbmc7IHRleHQ/OiBzdHJpbmcgfT47XG5cdHN1bW1hcnk/OiBzdHJpbmcgfCBBcnJheTx7IHR5cGU6IHN0cmluZzsgdGV4dD86IHN0cmluZyB9Pjtcbn1cblxuLyoqIFBhcnNlZCBPcGVuQUkgUmVzcG9uc2VzIEFQSSByZXNwb25zZSBib2R5LiAqL1xuaW50ZXJmYWNlIE9wZW5BSVJlc3BvbnNlc0JvZHkge1xuXHRpZD86IHN0cmluZztcblx0bW9kZWw/OiBzdHJpbmc7XG5cdG91dHB1dD86IE9wZW5BSVJlc3BvbnNlc091dHB1dEl0ZW1bXTtcblx0dXNhZ2U/OiB7XG5cdFx0aW5wdXRfdG9rZW5zPzogbnVtYmVyO1xuXHRcdG91dHB1dF90b2tlbnM/OiBudW1iZXI7XG5cdFx0dG90YWxfdG9rZW5zPzogbnVtYmVyO1xuXHR9O1xufVxuXG4vKiogUmV0dXJucyBhIHplcm9lZCBBbnRocm9waWMtc3R5bGUgdXNhZ2Ugb2JqZWN0IGZvciBzeW50aGVzaXplZCBtZXNzYWdlcy4gKi9cbmZ1bmN0aW9uIGVtcHR5VXNhZ2UoKSB7XG5cdHJldHVybiB7XG5cdFx0aW5wdXRfdG9rZW5zOiAwLFxuXHRcdG91dHB1dF90b2tlbnM6IDAsXG5cdFx0Y2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiBudWxsLFxuXHRcdGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiBudWxsLFxuXHRcdHNlcnZlcl90b29sX3VzZTogbnVsbCxcblx0XHRzZXJ2aWNlX3RpZXI6IG51bGwsXG5cdH07XG59XG5cbi8qKiBPcGVuQUkvUmVzcG9uc2VzIGNvbnRlbnQgcGFydCB0eXBlcyB0aGF0IG1hcCB0byBBbnRocm9waWMgdGV4dCBibG9ja3MuICovXG5jb25zdCBURVhUX1BBUlRfVFlQRVMgPSBuZXcgU2V0KFtcInRleHRcIiwgXCJpbnB1dF90ZXh0XCIsIFwib3V0cHV0X3RleHRcIl0pO1xuXG4vKiogTm9ybWFsaXplIHByb3ZpZGVyIHZhcmlhbnRzIG9mIFJlc3BvbnNlcyB0ZXh0IHBhcnRzIGludG8gYW4gaXRlcmFibGUgbGlzdC4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRleHRQYXJ0cyh2YWx1ZTogdW5rbm93bik6IEFycmF5PHsgdHlwZTogc3RyaW5nOyB0ZXh0Pzogc3RyaW5nIH0+IHtcblx0aWYgKCF2YWx1ZSkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXHRpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiB2YWx1ZSB9XTtcblx0fVxuXHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRyZXR1cm4gdmFsdWUuZmlsdGVyKChwYXJ0KTogcGFydCBpcyB7IHR5cGU6IHN0cmluZzsgdGV4dD86IHN0cmluZyB9ID0+IHtcblx0XHRcdHJldHVybiB0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIiAmJiBwYXJ0ICE9PSBudWxsICYmIFwidHlwZVwiIGluIHBhcnQ7XG5cdFx0fSk7XG5cdH1cblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBcInR5cGVcIiBpbiB2YWx1ZSkge1xuXHRcdHJldHVybiBbdmFsdWUgYXMgeyB0eXBlOiBzdHJpbmc7IHRleHQ/OiBzdHJpbmcgfV07XG5cdH1cblx0cmV0dXJuIFtdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIE9wZW5BSSBtZXNzYWdlIGNvbnRlbnQgKHN0cmluZyBvciBwYXJ0IGFycmF5KSB0byBBbnRocm9waWMgdGV4dCBibG9ja3MuXG4gKi9cbmZ1bmN0aW9uIHRvVGV4dEJsb2Nrcyhjb250ZW50OiBPcGVuQUlNZXNzYWdlW1wiY29udGVudFwiXSk6IFRleHRCbG9ja1BhcmFtW10ge1xuXHRpZiAoY29udGVudCA9PSBudWxsKSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cdGlmICh0eXBlb2YgY29udGVudCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiBjb250ZW50ID8gW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGNvbnRlbnQgfV0gOiBbXTtcblx0fVxuXHRyZXR1cm4gY29udGVudFxuXHRcdC5maWx0ZXIoKHBhcnQpID0+IFRFWFRfUEFSVF9UWVBFUy5oYXMocGFydC50eXBlKSAmJiBwYXJ0LnRleHQpXG5cdFx0Lm1hcCgocGFydCkgPT4gKHsgdHlwZTogXCJ0ZXh0XCIgYXMgY29uc3QsIHRleHQ6IHBhcnQudGV4dCEgfSkpO1xufVxuXG4vKiogVG9vbCBkZWZpbml0aW9uIGFzIHNlZW4gaW4gUmVzcG9uc2VzIEFQSSAoZmxhdCBvciBuZXN0ZWQgdW5kZXIgYGZ1bmN0aW9uYCkuICovXG5pbnRlcmZhY2UgUmVzcG9uc2VzQXBpVG9vbCB7XG5cdHR5cGU/OiBzdHJpbmc7XG5cdG5hbWU/OiBzdHJpbmc7XG5cdGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXHRwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdGZ1bmN0aW9uPzoge1xuXHRcdG5hbWU6IHN0cmluZztcblx0XHRkZXNjcmlwdGlvbj86IHN0cmluZztcblx0XHRwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdH07XG59XG5cbi8qKlxuICogTWFwcyBPcGVuQUkvUmVzcG9uc2VzIHRvb2wgZGVmaW5pdGlvbnMgdG8gQW50aHJvcGljIGB0b29sc2AgYXJyYXkgZW50cmllcy5cbiAqL1xuZnVuY3Rpb24gbWFwT3BlbkFJVG9vbHModG9vbHM6IFJlc3BvbnNlc0FwaVRvb2xbXSB8IE9wZW5BSVRvb2xbXSB8IHVuZGVmaW5lZCk6IE1lc3NhZ2VDcmVhdGVQYXJhbXNbXCJ0b29sc1wiXSB7XG5cdGlmICghdG9vbHM/Lmxlbmd0aCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb25zdCBtYXBwZWQgPSB0b29sc1xuXHRcdC5tYXAoKHRvb2wpID0+IHtcblx0XHRcdGNvbnN0IGZsYXQgPSB0b29sIGFzIFJlc3BvbnNlc0FwaVRvb2w7XG5cdFx0XHRpZiAoZmxhdC5uYW1lKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0bmFtZTogZmxhdC5uYW1lLFxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBmbGF0LmRlc2NyaXB0aW9uLFxuXHRcdFx0XHRcdGlucHV0X3NjaGVtYTogZmxhdC5wYXJhbWV0ZXJzIHx8IHsgdHlwZTogXCJvYmplY3RcIiwgcHJvcGVydGllczoge30gfSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG5lc3RlZCA9IHRvb2wgYXMgT3BlbkFJVG9vbDtcblx0XHRcdGlmIChuZXN0ZWQuZnVuY3Rpb24/Lm5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRuYW1lOiBuZXN0ZWQuZnVuY3Rpb24ubmFtZSxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogbmVzdGVkLmZ1bmN0aW9uLmRlc2NyaXB0aW9uLFxuXHRcdFx0XHRcdGlucHV0X3NjaGVtYTogbmVzdGVkLmZ1bmN0aW9uLnBhcmFtZXRlcnMgfHwgeyB0eXBlOiBcIm9iamVjdFwiLCBwcm9wZXJ0aWVzOiB7fSB9LFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdFx0aWYgKGZsYXQudHlwZSAmJiBmbGF0LnR5cGUgIT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdG5hbWU6IGZsYXQudHlwZSxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjogZmxhdC5kZXNjcmlwdGlvbixcblx0XHRcdFx0XHRpbnB1dF9zY2hlbWE6IGZsYXQucGFyYW1ldGVycyB8fCB7IHR5cGU6IFwib2JqZWN0XCIsIHByb3BlcnRpZXM6IHt9IH0sXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9KVxuXHRcdC5maWx0ZXIoKHRvb2wpOiB0b29sIGlzIE5vbk51bGxhYmxlPHR5cGVvZiB0b29sPiA9PiB0b29sICE9PSBudWxsKTtcblxuXHRyZXR1cm4gbWFwcGVkLmxlbmd0aCA+IDAgPyAobWFwcGVkIGFzIE1lc3NhZ2VDcmVhdGVQYXJhbXNbXCJ0b29sc1wiXSkgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhbiBPcGVuQUkgQ2hhdCBDb21wbGV0aW9ucyByZXF1ZXN0IGJvZHkgdG8gQW50aHJvcGljIGBNZXNzYWdlQ3JlYXRlUGFyYW1zYC5cbiAqXG4gKiBAcGFyYW0gYm9keSAtIFBhcnNlZCBKU09OIHJlcXVlc3QgYm9keSBmcm9tIHRoZSBwcm94eSBsb2cuXG4gKiBAcmV0dXJucyBBbnRocm9waWMtc2hhcGVkIHBhcmFtcyBmb3IgdGhlIHNoYXJlZCBjb252ZXJzYXRpb24gcHJvY2Vzc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplT3BlbkFJQ2hhdFJlcXVlc3QoYm9keTogdW5rbm93bik6IE1lc3NhZ2VDcmVhdGVQYXJhbXMge1xuXHRjb25zdCByZXEgPSBib2R5IGFzIHtcblx0XHRtb2RlbD86IHN0cmluZztcblx0XHRtZXNzYWdlcz86IE9wZW5BSU1lc3NhZ2VbXTtcblx0XHR0b29scz86IE9wZW5BSVRvb2xbXTtcblx0XHR0ZW1wZXJhdHVyZT86IG51bWJlcjtcblx0XHRtYXhfdG9rZW5zPzogbnVtYmVyO1xuXHRcdHN0cmVhbT86IGJvb2xlYW47XG5cdH07XG5cblx0bGV0IHN5c3RlbTogc3RyaW5nIHwgVGV4dEJsb2NrUGFyYW1bXSB8IHVuZGVmaW5lZDtcblx0Y29uc3QgbWVzc2FnZXM6IE1lc3NhZ2VQYXJhbVtdID0gW107XG5cblx0Zm9yIChjb25zdCBtc2cgb2YgcmVxLm1lc3NhZ2VzIHx8IFtdKSB7XG5cdFx0aWYgKG1zZy5yb2xlID09PSBcInN5c3RlbVwiKSB7XG5cdFx0XHRjb25zdCBibG9ja3MgPSB0b1RleHRCbG9ja3MobXNnLmNvbnRlbnQpO1xuXHRcdFx0aWYgKGJsb2Nrcy5sZW5ndGggPT09IDEgJiYgYmxvY2tzWzBdLnR5cGUgPT09IFwidGV4dFwiKSB7XG5cdFx0XHRcdHN5c3RlbSA9IGJsb2Nrc1swXS50ZXh0O1xuXHRcdFx0fSBlbHNlIGlmIChibG9ja3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRzeXN0ZW0gPSBibG9ja3M7XG5cdFx0XHR9XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHQvLyBPcGVuQUkgYHRvb2xgIHJvbGUgbWFwcyB0byBBbnRocm9waWMgdXNlciBtZXNzYWdlIHdpdGggdG9vbF9yZXN1bHQgYmxvY2tzXG5cdFx0aWYgKG1zZy5yb2xlID09PSBcInRvb2xcIikge1xuXHRcdFx0Y29uc3QgdG9vbENvbnRlbnQgPVxuXHRcdFx0XHR0eXBlb2YgbXNnLmNvbnRlbnQgPT09IFwic3RyaW5nXCJcblx0XHRcdFx0XHQ/IG1zZy5jb250ZW50XG5cdFx0XHRcdFx0OiB0b1RleHRCbG9ja3MobXNnLmNvbnRlbnQpXG5cdFx0XHRcdFx0XHRcdC5tYXAoKGIpID0+IChiLnR5cGUgPT09IFwidGV4dFwiID8gYi50ZXh0IDogXCJcIikpXG5cdFx0XHRcdFx0XHRcdC5qb2luKFwiXCIpO1xuXHRcdFx0bWVzc2FnZXMucHVzaCh7XG5cdFx0XHRcdHJvbGU6IFwidXNlclwiLFxuXHRcdFx0XHRjb250ZW50OiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dHlwZTogXCJ0b29sX3Jlc3VsdFwiLFxuXHRcdFx0XHRcdFx0dG9vbF91c2VfaWQ6IG1zZy50b29sX2NhbGxfaWQgfHwgbXNnLm5hbWUgfHwgXCJ1bmtub3duXCIsXG5cdFx0XHRcdFx0XHRjb250ZW50OiB0b29sQ29udGVudCxcblx0XHRcdFx0XHR9IGFzIFRvb2xSZXN1bHRCbG9ja1BhcmFtLFxuXHRcdFx0XHRdLFxuXHRcdFx0fSk7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBjb250ZW50OiBNZXNzYWdlUGFyYW1bXCJjb250ZW50XCJdID0gW107XG5cblx0XHRjb25zdCB0ZXh0QmxvY2tzID0gdG9UZXh0QmxvY2tzKG1zZy5jb250ZW50KTtcblx0XHRmb3IgKGNvbnN0IGJsb2NrIG9mIHRleHRCbG9ja3MpIHtcblx0XHRcdGNvbnRlbnQucHVzaChibG9jayk7XG5cdFx0fVxuXG5cdFx0aWYgKG1zZy50b29sX2NhbGxzPy5sZW5ndGgpIHtcblx0XHRcdGZvciAoY29uc3QgY2FsbCBvZiBtc2cudG9vbF9jYWxscykge1xuXHRcdFx0XHRsZXQgcGFyc2VkSW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0cGFyc2VkSW5wdXQgPSBKU09OLnBhcnNlKGNhbGwuZnVuY3Rpb24uYXJndW1lbnRzIHx8IFwie31cIikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdHBhcnNlZElucHV0ID0geyBfcmF3OiBjYWxsLmZ1bmN0aW9uLmFyZ3VtZW50cyB9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRlbnQucHVzaCh7XG5cdFx0XHRcdFx0dHlwZTogXCJ0b29sX3VzZVwiLFxuXHRcdFx0XHRcdGlkOiBjYWxsLmlkLFxuXHRcdFx0XHRcdG5hbWU6IGNhbGwuZnVuY3Rpb24ubmFtZSxcblx0XHRcdFx0XHRpbnB1dDogcGFyc2VkSW5wdXQsXG5cdFx0XHRcdH0gYXMgVG9vbFVzZUJsb2NrKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtZXNzYWdlcy5wdXNoKHtcblx0XHRcdHJvbGU6IG1zZy5yb2xlID09PSBcImFzc2lzdGFudFwiID8gXCJhc3Npc3RhbnRcIiA6IFwidXNlclwiLFxuXHRcdFx0Y29udGVudDogY29udGVudC5sZW5ndGggPiAwID8gY29udGVudCA6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBcIlwiIH1dLFxuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRtb2RlbDogcmVxLm1vZGVsIHx8IFwidW5rbm93blwiLFxuXHRcdG1heF90b2tlbnM6IHJlcS5tYXhfdG9rZW5zIHx8IDQwOTYsXG5cdFx0bWVzc2FnZXMsXG5cdFx0c3lzdGVtLFxuXHRcdHRvb2xzOiBtYXBPcGVuQUlUb29scyhyZXEudG9vbHMpLFxuXHR9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIG9uZSBPcGVuQUkgUmVzcG9uc2VzIGBpbnB1dGAgaXRlbSB0byBBbnRocm9waWMgbWVzc2FnZSBjb250ZW50IGJsb2Nrcy5cbiAqL1xuZnVuY3Rpb24gcmVzcG9uc2VzSW5wdXRUb0NvbnRlbnQoaXRlbTogT3BlbkFJUmVzcG9uc2VzSW5wdXRJdGVtKTogTWVzc2FnZVBhcmFtW1wiY29udGVudFwiXSB7XG5cdGlmIChpdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG5cdFx0bGV0IHBhcnNlZElucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXHRcdHRyeSB7XG5cdFx0XHRwYXJzZWRJbnB1dCA9IEpTT04ucGFyc2UoaXRlbS5hcmd1bWVudHMgfHwgXCJ7fVwiKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHBhcnNlZElucHV0ID0geyBfcmF3OiBpdGVtLmFyZ3VtZW50cyB9O1xuXHRcdH1cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiBcInRvb2xfdXNlXCIsXG5cdFx0XHRcdGlkOiBpdGVtLmNhbGxfaWQgfHwgaXRlbS5pZCB8fCBcInVua25vd25cIixcblx0XHRcdFx0bmFtZTogaXRlbS5uYW1lIHx8IFwidW5rbm93blwiLFxuXHRcdFx0XHRpbnB1dDogcGFyc2VkSW5wdXQsXG5cdFx0XHR9IGFzIFRvb2xVc2VCbG9jayxcblx0XHRdO1xuXHR9XG5cblx0aWYgKGl0ZW0udHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsX291dHB1dFwiKSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogXCJ0b29sX3Jlc3VsdFwiLFxuXHRcdFx0XHR0b29sX3VzZV9pZDogaXRlbS5jYWxsX2lkIHx8IFwidW5rbm93blwiLFxuXHRcdFx0XHRjb250ZW50OiBpdGVtLm91dHB1dCB8fCBcIlwiLFxuXHRcdFx0fSBhcyBUb29sUmVzdWx0QmxvY2tQYXJhbSxcblx0XHRdO1xuXHR9XG5cblx0Ly8gQ29kZXggcmVhc29uaW5nIGl0ZW1zIGJlY29tZSBBbnRocm9waWMgdGhpbmtpbmcgYmxvY2tzXG5cdGlmIChpdGVtLnR5cGUgPT09IFwicmVhc29uaW5nXCIpIHtcblx0XHRjb25zdCBzdW1tYXJ5VGV4dCA9IChpdGVtLnN1bW1hcnkgfHwgW10pXG5cdFx0XHQubWFwKChwYXJ0KSA9PiAocGFydC50eXBlID09PSBcInN1bW1hcnlfdGV4dFwiID8gcGFydC50ZXh0IHx8IFwiXCIgOiBcIlwiKSlcblx0XHRcdC5qb2luKFwiXCIpO1xuXHRcdGlmIChzdW1tYXJ5VGV4dCkge1xuXHRcdFx0cmV0dXJuIFt7IHR5cGU6IFwidGhpbmtpbmdcIiwgdGhpbmtpbmc6IHN1bW1hcnlUZXh0LCBzaWduYXR1cmU6IFwiXCIgfV07XG5cdFx0fVxuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdGlmIChpdGVtLnR5cGUgPT09IFwibWVzc2FnZVwiIHx8IGl0ZW0ucm9sZSkge1xuXHRcdHJldHVybiB0b1RleHRCbG9ja3MoaXRlbS5jb250ZW50IGFzIE9wZW5BSU1lc3NhZ2VbXCJjb250ZW50XCJdKTtcblx0fVxuXG5cdHJldHVybiB0b1RleHRCbG9ja3MoaXRlbS5jb250ZW50IGFzIE9wZW5BSU1lc3NhZ2VbXCJjb250ZW50XCJdKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGFuIE9wZW5BSSBSZXNwb25zZXMgQVBJIHJlcXVlc3QgYm9keSB0byBBbnRocm9waWMgYE1lc3NhZ2VDcmVhdGVQYXJhbXNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplT3BlbkFJUmVzcG9uc2VzUmVxdWVzdChib2R5OiB1bmtub3duKTogTWVzc2FnZUNyZWF0ZVBhcmFtcyB7XG5cdGNvbnN0IHJlcSA9IGJvZHkgYXMge1xuXHRcdG1vZGVsPzogc3RyaW5nO1xuXHRcdGluc3RydWN0aW9ucz86IHN0cmluZztcblx0XHRpbnB1dD86IHN0cmluZyB8IE9wZW5BSVJlc3BvbnNlc0lucHV0SXRlbVtdO1xuXHRcdHRvb2xzPzogT3BlbkFJVG9vbFtdO1xuXHR9O1xuXG5cdGNvbnN0IG1lc3NhZ2VzOiBNZXNzYWdlUGFyYW1bXSA9IFtdO1xuXG5cdGlmICh0eXBlb2YgcmVxLmlucHV0ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0bWVzc2FnZXMucHVzaCh7IHJvbGU6IFwidXNlclwiLCBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogcmVxLmlucHV0IH1dIH0pO1xuXHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxLmlucHV0KSkge1xuXHRcdGZvciAoY29uc3QgaXRlbSBvZiByZXEuaW5wdXQpIHtcblx0XHRcdGNvbnN0IGNvbnRlbnQgPSByZXNwb25zZXNJbnB1dFRvQ29udGVudChpdGVtKTtcblx0XHRcdGlmICghY29udGVudCB8fCAoQXJyYXkuaXNBcnJheShjb250ZW50KSAmJiBjb250ZW50Lmxlbmd0aCA9PT0gMCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHJvbGUgPVxuXHRcdFx0XHRpdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiXG5cdFx0XHRcdFx0PyBcImFzc2lzdGFudFwiXG5cdFx0XHRcdFx0OiBpdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbF9vdXRwdXRcIiB8fCBpdGVtLnR5cGUgPT09IFwicmVhc29uaW5nXCJcblx0XHRcdFx0XHRcdD8gXCJ1c2VyXCJcblx0XHRcdFx0XHRcdDogaXRlbS5yb2xlID09PSBcImFzc2lzdGFudFwiXG5cdFx0XHRcdFx0XHRcdD8gXCJhc3Npc3RhbnRcIlxuXHRcdFx0XHRcdFx0XHQ6IFwidXNlclwiO1xuXG5cdFx0XHRtZXNzYWdlcy5wdXNoKHsgcm9sZSwgY29udGVudCB9KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG1vZGVsOiByZXEubW9kZWwgfHwgXCJ1bmtub3duXCIsXG5cdFx0bWF4X3Rva2VuczogNDA5Nixcblx0XHRtZXNzYWdlcyxcblx0XHRzeXN0ZW06IHJlcS5pbnN0cnVjdGlvbnMsXG5cdFx0dG9vbHM6IG1hcE9wZW5BSVRvb2xzKHJlcS50b29scyksXG5cdH07XG59XG5cbi8qKiBDb252ZXJ0cyBhIHNpbmdsZSBPcGVuQUkgYXNzaXN0YW50IG1lc3NhZ2UgdG8gYW4gQW50aHJvcGljIGBNZXNzYWdlYC4gKi9cbmZ1bmN0aW9uIG9wZW5BSU1lc3NhZ2VUb0FudGhyb3BpYyhtZXNzYWdlOiBPcGVuQUlNZXNzYWdlLCBtb2RlbDogc3RyaW5nKTogTWVzc2FnZSB7XG5cdGNvbnN0IGNvbnRlbnQ6IENvbnRlbnRCbG9ja1tdID0gW107XG5cdGNvbnN0IHRleHRCbG9ja3MgPSB0b1RleHRCbG9ja3MobWVzc2FnZS5jb250ZW50KTtcblx0Zm9yIChjb25zdCBibG9jayBvZiB0ZXh0QmxvY2tzKSB7XG5cdFx0Y29udGVudC5wdXNoKHsgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGJsb2NrLnRleHQsIGNpdGF0aW9uczogbnVsbCB9KTtcblx0fVxuXG5cdGlmIChtZXNzYWdlLnRvb2xfY2FsbHM/Lmxlbmd0aCkge1xuXHRcdGZvciAoY29uc3QgY2FsbCBvZiBtZXNzYWdlLnRvb2xfY2FsbHMpIHtcblx0XHRcdGxldCBwYXJzZWRJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHBhcnNlZElucHV0ID0gSlNPTi5wYXJzZShjYWxsLmZ1bmN0aW9uLmFyZ3VtZW50cyB8fCBcInt9XCIpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdHBhcnNlZElucHV0ID0geyBfcmF3OiBjYWxsLmZ1bmN0aW9uLmFyZ3VtZW50cyB9O1xuXHRcdFx0fVxuXHRcdFx0Y29udGVudC5wdXNoKHtcblx0XHRcdFx0dHlwZTogXCJ0b29sX3VzZVwiLFxuXHRcdFx0XHRpZDogY2FsbC5pZCxcblx0XHRcdFx0bmFtZTogY2FsbC5mdW5jdGlvbi5uYW1lLFxuXHRcdFx0XHRpbnB1dDogcGFyc2VkSW5wdXQsXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGlkOiBcIlwiLFxuXHRcdHR5cGU6IFwibWVzc2FnZVwiLFxuXHRcdHJvbGU6IFwiYXNzaXN0YW50XCIsXG5cdFx0bW9kZWwsXG5cdFx0Y29udGVudCxcblx0XHRzdG9wX3JlYXNvbjogXCJlbmRfdHVyblwiLFxuXHRcdHN0b3Bfc2VxdWVuY2U6IG51bGwsXG5cdFx0dXNhZ2U6IGVtcHR5VXNhZ2UoKSxcblx0fTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBub24tc3RyZWFtaW5nIE9wZW5BSSBDaGF0IENvbXBsZXRpb25zIEpTT04gYm9keSBpbnRvIGFuIEFudGhyb3BpYyBgTWVzc2FnZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9wZW5BSUNoYXRDb21wbGV0aW9uQm9keShib2R5OiB1bmtub3duLCBtb2RlbCA9IFwidW5rbm93blwiKTogTWVzc2FnZSB7XG5cdGNvbnN0IGNvbXBsZXRpb24gPSBib2R5IGFzIE9wZW5BSUNoYXRDb21wbGV0aW9uO1xuXHRjb25zdCBjaG9pY2VNZXNzYWdlID0gY29tcGxldGlvbi5jaG9pY2VzPy5bMF0/Lm1lc3NhZ2U7XG5cdGlmICghY2hvaWNlTWVzc2FnZSkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpZDogY29tcGxldGlvbi5pZCB8fCBcIlwiLFxuXHRcdFx0dHlwZTogXCJtZXNzYWdlXCIsXG5cdFx0XHRyb2xlOiBcImFzc2lzdGFudFwiLFxuXHRcdFx0bW9kZWw6IGNvbXBsZXRpb24ubW9kZWwgfHwgbW9kZWwsXG5cdFx0XHRjb250ZW50OiBbXSxcblx0XHRcdHN0b3BfcmVhc29uOiBudWxsLFxuXHRcdFx0c3RvcF9zZXF1ZW5jZTogbnVsbCxcblx0XHRcdHVzYWdlOiB7XG5cdFx0XHRcdC4uLmVtcHR5VXNhZ2UoKSxcblx0XHRcdFx0aW5wdXRfdG9rZW5zOiBjb21wbGV0aW9uLnVzYWdlPy5wcm9tcHRfdG9rZW5zIHx8IDAsXG5cdFx0XHRcdG91dHB1dF90b2tlbnM6IGNvbXBsZXRpb24udXNhZ2U/LmNvbXBsZXRpb25fdG9rZW5zIHx8IDAsXG5cdFx0XHR9LFxuXHRcdH07XG5cdH1cblxuXHRjb25zdCBtZXNzYWdlID0gb3BlbkFJTWVzc2FnZVRvQW50aHJvcGljKGNob2ljZU1lc3NhZ2UsIGNvbXBsZXRpb24ubW9kZWwgfHwgbW9kZWwpO1xuXHRtZXNzYWdlLmlkID0gY29tcGxldGlvbi5pZCB8fCBcIlwiO1xuXHRtZXNzYWdlLnVzYWdlID0ge1xuXHRcdC4uLmVtcHR5VXNhZ2UoKSxcblx0XHRpbnB1dF90b2tlbnM6IGNvbXBsZXRpb24udXNhZ2U/LnByb21wdF90b2tlbnMgfHwgMCxcblx0XHRvdXRwdXRfdG9rZW5zOiBjb21wbGV0aW9uLnVzYWdlPy5jb21wbGV0aW9uX3Rva2VucyB8fCAwLFxuXHR9O1xuXHRjb25zdCBmaW5pc2hSZWFzb24gPSBjb21wbGV0aW9uLmNob2ljZXM/LlswXT8uZmluaXNoX3JlYXNvbjtcblx0bWVzc2FnZS5zdG9wX3JlYXNvbiA9IGZpbmlzaFJlYXNvbiA9PT0gXCJ0b29sX2NhbGxzXCIgPyBcInRvb2xfdXNlXCIgOiBmaW5pc2hSZWFzb24gPT09IFwic3RvcFwiID8gXCJlbmRfdHVyblwiIDogbnVsbDtcblx0cmV0dXJuIG1lc3NhZ2U7XG59XG5cbi8qKiBNYXBzIG9uZSBPcGVuQUkgUmVzcG9uc2VzIG91dHB1dCBpdGVtIHRvIEFudGhyb3BpYyBjb250ZW50IGJsb2Nrcy4gKi9cbmZ1bmN0aW9uIHBhcnNlUmVzcG9uc2VzT3V0cHV0SXRlbShpdGVtOiBPcGVuQUlSZXNwb25zZXNPdXRwdXRJdGVtKTogQ29udGVudEJsb2NrW10ge1xuXHRjb25zdCBibG9ja3M6IENvbnRlbnRCbG9ja1tdID0gW107XG5cblx0aWYgKGl0ZW0udHlwZSA9PT0gXCJtZXNzYWdlXCIgJiYgaXRlbS5jb250ZW50KSB7XG5cdFx0Zm9yIChjb25zdCBwYXJ0IG9mIG5vcm1hbGl6ZVRleHRQYXJ0cyhpdGVtLmNvbnRlbnQpKSB7XG5cdFx0XHRpZiAocGFydC50eXBlID09PSBcIm91dHB1dF90ZXh0XCIgfHwgcGFydC50eXBlID09PSBcInRleHRcIikge1xuXHRcdFx0XHRibG9ja3MucHVzaCh7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBwYXJ0LnRleHQgfHwgXCJcIiwgY2l0YXRpb25zOiBudWxsIH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gYmxvY2tzO1xuXHR9XG5cblx0aWYgKGl0ZW0udHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsXCIpIHtcblx0XHRsZXQgcGFyc2VkSW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0dHJ5IHtcblx0XHRcdHBhcnNlZElucHV0ID0gSlNPTi5wYXJzZShpdGVtLmFyZ3VtZW50cyB8fCBcInt9XCIpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cGFyc2VkSW5wdXQgPSB7IF9yYXc6IGl0ZW0uYXJndW1lbnRzIH07XG5cdFx0fVxuXHRcdGJsb2Nrcy5wdXNoKHtcblx0XHRcdHR5cGU6IFwidG9vbF91c2VcIixcblx0XHRcdGlkOiBpdGVtLmNhbGxfaWQgfHwgaXRlbS5pZCB8fCBcInVua25vd25cIixcblx0XHRcdG5hbWU6IGl0ZW0ubmFtZSB8fCBcInVua25vd25cIixcblx0XHRcdGlucHV0OiBwYXJzZWRJbnB1dCxcblx0XHR9KTtcblx0XHRyZXR1cm4gYmxvY2tzO1xuXHR9XG5cblx0aWYgKGl0ZW0udHlwZSA9PT0gXCJyZWFzb25pbmdcIikge1xuXHRcdGNvbnN0IHN1bW1hcnlUZXh0ID0gWy4uLm5vcm1hbGl6ZVRleHRQYXJ0cyhpdGVtLnN1bW1hcnkpLCAuLi5ub3JtYWxpemVUZXh0UGFydHMoaXRlbS5jb250ZW50KV1cblx0XHRcdC5tYXAoKHBhcnQpID0+IChwYXJ0LnR5cGUgPT09IFwic3VtbWFyeV90ZXh0XCIgPyBwYXJ0LnRleHQgfHwgXCJcIiA6IFwiXCIpKVxuXHRcdFx0LmpvaW4oXCJcIik7XG5cdFx0aWYgKHN1bW1hcnlUZXh0KSB7XG5cdFx0XHRibG9ja3MucHVzaCh7IHR5cGU6IFwidGhpbmtpbmdcIiwgdGhpbmtpbmc6IHN1bW1hcnlUZXh0LCBzaWduYXR1cmU6IFwiXCIgfSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGJsb2Nrcztcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBub24tc3RyZWFtaW5nIE9wZW5BSSBSZXNwb25zZXMgQVBJIEpTT04gYm9keSBpbnRvIGFuIEFudGhyb3BpYyBgTWVzc2FnZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9wZW5BSVJlc3BvbnNlc0JvZHkoYm9keTogdW5rbm93biwgbW9kZWwgPSBcInVua25vd25cIik6IE1lc3NhZ2Uge1xuXHRjb25zdCByZXNwb25zZSA9IGJvZHkgYXMgT3BlbkFJUmVzcG9uc2VzQm9keTtcblx0Y29uc3QgY29udGVudDogQ29udGVudEJsb2NrW10gPSBbXTtcblx0bGV0IGhhc1Rvb2xVc2UgPSBmYWxzZTtcblxuXHRmb3IgKGNvbnN0IGl0ZW0gb2YgcmVzcG9uc2Uub3V0cHV0IHx8IFtdKSB7XG5cdFx0Y29uc3QgYmxvY2tzID0gcGFyc2VSZXNwb25zZXNPdXRwdXRJdGVtKGl0ZW0pO1xuXHRcdGlmIChpdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG5cdFx0XHRoYXNUb29sVXNlID0gdHJ1ZTtcblx0XHR9XG5cdFx0Y29udGVudC5wdXNoKC4uLmJsb2Nrcyk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGlkOiByZXNwb25zZS5pZCB8fCBcIlwiLFxuXHRcdHR5cGU6IFwibWVzc2FnZVwiLFxuXHRcdHJvbGU6IFwiYXNzaXN0YW50XCIsXG5cdFx0bW9kZWw6IHJlc3BvbnNlLm1vZGVsIHx8IG1vZGVsLFxuXHRcdGNvbnRlbnQsXG5cdFx0c3RvcF9yZWFzb246IGhhc1Rvb2xVc2UgPyBcInRvb2xfdXNlXCIgOiBcImVuZF90dXJuXCIsXG5cdFx0c3RvcF9zZXF1ZW5jZTogbnVsbCxcblx0XHR1c2FnZToge1xuXHRcdFx0Li4uZW1wdHlVc2FnZSgpLFxuXHRcdFx0aW5wdXRfdG9rZW5zOiByZXNwb25zZS51c2FnZT8uaW5wdXRfdG9rZW5zIHx8IDAsXG5cdFx0XHRvdXRwdXRfdG9rZW5zOiByZXNwb25zZS51c2FnZT8ub3V0cHV0X3Rva2VucyB8fCAwLFxuXHRcdH0sXG5cdH07XG59XG5cbi8qKlxuICogRXh0cmFjdHMgSlNPTiBwYXlsb2FkcyBmcm9tIFNTRSBgZGF0YTpgIGxpbmVzIGluIGEgcmF3IHJlc3BvbnNlIGJvZHkuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU1NFRGF0YUxpbmVzKGJvZHlSYXc6IHN0cmluZyk6IHVua25vd25bXSB7XG5cdGNvbnN0IGNodW5rczogdW5rbm93bltdID0gW107XG5cdGNvbnN0IGxpbmVzID0gYm9keVJhdy5zcGxpdChcIlxcblwiKTtcblxuXHRmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcblx0XHRpZiAoIWxpbmUuc3RhcnRzV2l0aChcImRhdGE6IFwiKSkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGNvbnN0IGRhdGEgPSBsaW5lLnN1YnN0cmluZyg2KS50cmltKCk7XG5cdFx0aWYgKGRhdGEgPT09IFwiW0RPTkVdXCIpIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0Y2h1bmtzLnB1c2goSlNPTi5wYXJzZShkYXRhKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHQvLyBza2lwIG1hbGZvcm1lZCBsaW5lc1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjaHVua3M7XG59XG5cbi8qKlxuICogUmVjb25zdHJ1Y3RzIGEgY29tcGxldGUgT3BlbkFJIENoYXQgQ29tcGxldGlvbiBvYmplY3QgZnJvbSBzdHJlYW1lZCBTU0UgY2h1bmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPcGVuQUlDaGF0Q29tcGxldGlvbkZyb21TU0UoYm9keVJhdzogc3RyaW5nLCBtb2RlbCA9IFwidW5rbm93blwiKTogT3BlbkFJQ2hhdENvbXBsZXRpb24ge1xuXHRjb25zdCBjaHVua3MgPSBwYXJzZVNTRURhdGFMaW5lcyhib2R5UmF3KSBhcyBPcGVuQUlDaGF0Q29tcGxldGlvbltdO1xuXHRjb25zdCByZXN1bHQ6IE9wZW5BSUNoYXRDb21wbGV0aW9uID0ge1xuXHRcdGlkOiBcIlwiLFxuXHRcdG1vZGVsLFxuXHRcdGNob2ljZXM6IFt7IGluZGV4OiAwLCBtZXNzYWdlOiB7IHJvbGU6IFwiYXNzaXN0YW50XCIsIGNvbnRlbnQ6IFwiXCIgfSwgZmluaXNoX3JlYXNvbjogbnVsbCB9XSxcblx0XHR1c2FnZToge30sXG5cdH07XG5cblx0Ly8gVG9vbCBjYWxscyBtYXkgYXJyaXZlIGluIG11bHRpcGxlIGRlbHRhIGNodW5rcyBrZXllZCBieSBpbmRleFxuXHRjb25zdCB0b29sQ2FsbHMgPSBuZXcgTWFwPG51bWJlciwgT3BlbkFJVG9vbENhbGw+KCk7XG5cdGxldCBjb250ZW50ID0gXCJcIjtcblxuXHRmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuXHRcdGlmIChjaHVuay5pZCkge1xuXHRcdFx0cmVzdWx0LmlkID0gY2h1bmsuaWQ7XG5cdFx0fVxuXHRcdGlmIChjaHVuay5tb2RlbCkge1xuXHRcdFx0cmVzdWx0Lm1vZGVsID0gY2h1bmsubW9kZWw7XG5cdFx0fVxuXHRcdGlmIChjaHVuay51c2FnZSkge1xuXHRcdFx0cmVzdWx0LnVzYWdlID0geyAuLi5yZXN1bHQudXNhZ2UsIC4uLmNodW5rLnVzYWdlIH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hvaWNlID0gY2h1bmsuY2hvaWNlcz8uWzBdO1xuXHRcdGlmICghY2hvaWNlKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRpZiAoY2hvaWNlLmZpbmlzaF9yZWFzb24pIHtcblx0XHRcdHJlc3VsdC5jaG9pY2VzIVswXS5maW5pc2hfcmVhc29uID0gY2hvaWNlLmZpbmlzaF9yZWFzb247XG5cdFx0fVxuXG5cdFx0Y29uc3QgZGVsdGEgPSBjaG9pY2UuZGVsdGE7XG5cdFx0aWYgKCFkZWx0YSkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBkZWx0YS5jb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRjb250ZW50ICs9IGRlbHRhLmNvbnRlbnQ7XG5cdFx0fVxuXG5cdFx0aWYgKGRlbHRhLnRvb2xfY2FsbHMpIHtcblx0XHRcdGZvciAoY29uc3QgdGMgb2YgZGVsdGEudG9vbF9jYWxscykge1xuXHRcdFx0XHRjb25zdCBpbmRleCA9ICh0YyBhcyB7IGluZGV4PzogbnVtYmVyIH0pLmluZGV4ID8/IDA7XG5cdFx0XHRcdGlmICghdG9vbENhbGxzLmhhcyhpbmRleCkpIHtcblx0XHRcdFx0XHR0b29sQ2FsbHMuc2V0KGluZGV4LCB7XG5cdFx0XHRcdFx0XHRpZDogdGMuaWQgfHwgXCJcIixcblx0XHRcdFx0XHRcdHR5cGU6IFwiZnVuY3Rpb25cIixcblx0XHRcdFx0XHRcdGZ1bmN0aW9uOiB7IG5hbWU6IHRjLmZ1bmN0aW9uPy5uYW1lIHx8IFwiXCIsIGFyZ3VtZW50czogXCJcIiB9LFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGV4aXN0aW5nID0gdG9vbENhbGxzLmdldChpbmRleCkhO1xuXHRcdFx0XHRpZiAodGMuaWQpIHtcblx0XHRcdFx0XHRleGlzdGluZy5pZCA9IHRjLmlkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0Yy5mdW5jdGlvbj8ubmFtZSkge1xuXHRcdFx0XHRcdGV4aXN0aW5nLmZ1bmN0aW9uLm5hbWUgPSB0Yy5mdW5jdGlvbi5uYW1lO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0Yy5mdW5jdGlvbj8uYXJndW1lbnRzKSB7XG5cdFx0XHRcdFx0ZXhpc3RpbmcuZnVuY3Rpb24uYXJndW1lbnRzICs9IHRjLmZ1bmN0aW9uLmFyZ3VtZW50cztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGNvbnN0IG1lc3NhZ2U6IE9wZW5BSU1lc3NhZ2UgPSB7IHJvbGU6IFwiYXNzaXN0YW50XCIsIGNvbnRlbnQgfTtcblx0aWYgKHRvb2xDYWxscy5zaXplID4gMCkge1xuXHRcdG1lc3NhZ2UudG9vbF9jYWxscyA9IFsuLi50b29sQ2FsbHMuZW50cmllcygpXVxuXHRcdFx0LnNvcnQoKFthXSwgW2JdKSA9PiBhIC0gYilcblx0XHRcdC5tYXAoKFssIHRjXSkgPT4gdGMpO1xuXHR9XG5cblx0cmVzdWx0LmNob2ljZXMhWzBdLm1lc3NhZ2UgPSBtZXNzYWdlO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJlY29uc3RydWN0cyBhbiBPcGVuQUkgUmVzcG9uc2VzIGJvZHkgZnJvbSBzdHJlYW1lZCBTU0UgZXZlbnRzLlxuICogUmV0dXJucyBlYXJseSB3aGVuIGEgYHJlc3BvbnNlLmNvbXBsZXRlZGAgZXZlbnQgY2FycmllcyB0aGUgZnVsbCByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT3BlbkFJUmVzcG9uc2VzRnJvbVNTRShib2R5UmF3OiBzdHJpbmcsIG1vZGVsID0gXCJ1bmtub3duXCIpOiBPcGVuQUlSZXNwb25zZXNCb2R5IHtcblx0Y29uc3QgY2h1bmtzID0gcGFyc2VTU0VEYXRhTGluZXMoYm9keVJhdyk7XG5cdGNvbnN0IHJlc3VsdDogT3BlbkFJUmVzcG9uc2VzQm9keSA9IHtcblx0XHRpZDogXCJcIixcblx0XHRtb2RlbCxcblx0XHRvdXRwdXQ6IFt7IHR5cGU6IFwibWVzc2FnZVwiLCByb2xlOiBcImFzc2lzdGFudFwiLCBjb250ZW50OiBbeyB0eXBlOiBcIm91dHB1dF90ZXh0XCIsIHRleHQ6IFwiXCIgfV0gfV0sXG5cdFx0dXNhZ2U6IHt9LFxuXHR9O1xuXG5cdGxldCB0ZXh0ID0gXCJcIjtcblx0Y29uc3QgZnVuY3Rpb25DYWxscyA9IG5ldyBNYXA8c3RyaW5nLCBPcGVuQUlSZXNwb25zZXNPdXRwdXRJdGVtPigpO1xuXG5cdGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG5cdFx0Y29uc3QgcmVjb3JkID0gY2h1bmsgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0aWYgKHR5cGVvZiByZWNvcmQuaWQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHJlc3VsdC5pZCA9IHJlY29yZC5pZDtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiByZWNvcmQubW9kZWwgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHJlc3VsdC5tb2RlbCA9IHJlY29yZC5tb2RlbDtcblx0XHR9XG5cdFx0aWYgKHJlY29yZC51c2FnZSAmJiB0eXBlb2YgcmVjb3JkLnVzYWdlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRyZXN1bHQudXNhZ2UgPSB7IC4uLnJlc3VsdC51c2FnZSwgLi4uKHJlY29yZC51c2FnZSBhcyBPcGVuQUlSZXNwb25zZXNCb2R5W1widXNhZ2VcIl0pIH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgdHlwZSA9IHJlY29yZC50eXBlO1xuXHRcdGlmICh0eXBlID09PSBcInJlc3BvbnNlLm91dHB1dF90ZXh0LmRlbHRhXCIgJiYgdHlwZW9mIHJlY29yZC5kZWx0YSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0dGV4dCArPSByZWNvcmQuZGVsdGE7XG5cdFx0fSBlbHNlIGlmICh0eXBlID09PSBcInJlc3BvbnNlLm91dHB1dF90ZXh0LmRvbmVcIiAmJiB0eXBlb2YgcmVjb3JkLnRleHQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdC8vIENvZGV4IENoYXRHUFQgT0F1dGggbWF5IGluY2x1ZGUgdGhlIGZ1bGwgdGV4dCBvbmx5IG9uIHRoZSBkb25lIGV2ZW50LlxuXHRcdFx0dGV4dCA9IHJlY29yZC50ZXh0O1xuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gXCJyZXNwb25zZS5mdW5jdGlvbl9jYWxsX2FyZ3VtZW50cy5kZWx0YVwiKSB7XG5cdFx0XHRjb25zdCBpdGVtSWQgPSB0eXBlb2YgcmVjb3JkLml0ZW1faWQgPT09IFwic3RyaW5nXCIgPyByZWNvcmQuaXRlbV9pZCA6IFwiZGVmYXVsdFwiO1xuXHRcdFx0aWYgKCFmdW5jdGlvbkNhbGxzLmhhcyhpdGVtSWQpKSB7XG5cdFx0XHRcdGZ1bmN0aW9uQ2FsbHMuc2V0KGl0ZW1JZCwge1xuXHRcdFx0XHRcdHR5cGU6IFwiZnVuY3Rpb25fY2FsbFwiLFxuXHRcdFx0XHRcdGlkOiBpdGVtSWQsXG5cdFx0XHRcdFx0Y2FsbF9pZDogaXRlbUlkLFxuXHRcdFx0XHRcdG5hbWU6IFwiXCIsXG5cdFx0XHRcdFx0YXJndW1lbnRzOiBcIlwiLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGNhbGwgPSBmdW5jdGlvbkNhbGxzLmdldChpdGVtSWQpITtcblx0XHRcdGlmICh0eXBlb2YgcmVjb3JkLmRlbHRhID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdGNhbGwuYXJndW1lbnRzID0gKGNhbGwuYXJndW1lbnRzIHx8IFwiXCIpICsgcmVjb3JkLmRlbHRhO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5hZGRlZFwiICYmIHJlY29yZC5pdGVtKSB7XG5cdFx0XHRjb25zdCBpdGVtID0gcmVjb3JkLml0ZW0gYXMgT3BlbkFJUmVzcG9uc2VzT3V0cHV0SXRlbTtcblx0XHRcdGlmIChpdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG5cdFx0XHRcdGNvbnN0IGl0ZW1JZCA9IGl0ZW0uY2FsbF9pZCB8fCBpdGVtLmlkIHx8IFwiZGVmYXVsdFwiO1xuXHRcdFx0XHRmdW5jdGlvbkNhbGxzLnNldChpdGVtSWQsIHsgLi4uaXRlbSwgYXJndW1lbnRzOiBpdGVtLmFyZ3VtZW50cyB8fCBcIlwiIH0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gXCJyZXNwb25zZS5jb21wbGV0ZWRcIiAmJiByZWNvcmQucmVzcG9uc2UpIHtcblx0XHRcdGNvbnN0IGNvbXBsZXRlZCA9IHJlY29yZC5yZXNwb25zZSBhcyBPcGVuQUlSZXNwb25zZXNCb2R5O1xuXHRcdFx0Ly8gUHJlZmVyIHRoZSB0ZXJtaW5hbCBzbmFwc2hvdCB3aGVuIHRoZSBwcm92aWRlciBzZW5kcyBwb3B1bGF0ZWQgb3V0cHV0LlxuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoY29tcGxldGVkLm91dHB1dCkgJiYgY29tcGxldGVkLm91dHB1dC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiBjb21wbGV0ZWQ7XG5cdFx0XHR9XG5cdFx0XHQvLyBDb2RleCBDaGF0R1BUIE9BdXRoIG9mdGVuIHNlbmRzIHJlc3BvbnNlLmNvbXBsZXRlZCB3aXRoIG91dHB1dDogW10gd2hpbGVcblx0XHRcdC8vIHN0cmVhbWluZyBkZWx0YXMvZG9uZSBldmVudHMgY2FycnkgdGhlIGFzc2lzdGFudCB0ZXh0IFx1MjAxNCBrZWVwIGFjY3VtdWxhdGluZy5cblx0XHRcdGlmICh0eXBlb2YgY29tcGxldGVkLmlkID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdHJlc3VsdC5pZCA9IGNvbXBsZXRlZC5pZDtcblx0XHRcdH1cblx0XHRcdGlmICh0eXBlb2YgY29tcGxldGVkLm1vZGVsID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdHJlc3VsdC5tb2RlbCA9IGNvbXBsZXRlZC5tb2RlbDtcblx0XHRcdH1cblx0XHRcdGlmIChjb21wbGV0ZWQudXNhZ2UgJiYgdHlwZW9mIGNvbXBsZXRlZC51c2FnZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRyZXN1bHQudXNhZ2UgPSB7IC4uLnJlc3VsdC51c2FnZSwgLi4uKGNvbXBsZXRlZC51c2FnZSBhcyBPcGVuQUlSZXNwb25zZXNCb2R5W1widXNhZ2VcIl0pIH07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgZmlyc3RDb250ZW50ID0gcmVzdWx0Lm91dHB1dD8uWzBdPy5jb250ZW50O1xuXHRpZiAoQXJyYXkuaXNBcnJheShmaXJzdENvbnRlbnQpICYmIGZpcnN0Q29udGVudFswXSkge1xuXHRcdGZpcnN0Q29udGVudFswXS50ZXh0ID0gdGV4dDtcblx0fVxuXG5cdGlmIChmdW5jdGlvbkNhbGxzLnNpemUgPiAwKSB7XG5cdFx0cmVzdWx0Lm91dHB1dCA9IFtcblx0XHRcdC4uLih0ZXh0ID8gW3sgdHlwZTogXCJtZXNzYWdlXCIsIHJvbGU6IFwiYXNzaXN0YW50XCIsIGNvbnRlbnQ6IFt7IHR5cGU6IFwib3V0cHV0X3RleHRcIiwgdGV4dCB9XSB9XSA6IFtdKSxcblx0XHRcdC4uLmZ1bmN0aW9uQ2FsbHMudmFsdWVzKCksXG5cdFx0XTtcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgbG9nZ2VkIHJlc3BvbnNlIChKU09OIGJvZHkgb3IgU1NFIHJhdykgaW50byBhbiBBbnRocm9waWMgYE1lc3NhZ2VgLlxuICogRGlzcGF0Y2hlcyBvbiBkZXRlY3RlZCBBUEkgZm9ybWF0IGFuZCB3aGV0aGVyIHRoZSBib2R5IGlzIGFscmVhZHkgQW50aHJvcGljLXNoYXBlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT3BlbkFJUmVzcG9uc2UoXG5cdHBhaXJSZXNwb25zZTogTm9uTnVsbGFibGU8UmF3UGFpcltcInJlc3BvbnNlXCJdPixcblx0YXBpRm9ybWF0OiBBcGlGb3JtYXQsXG5cdG1vZGVsID0gXCJ1bmtub3duXCIsXG4pOiBNZXNzYWdlIHtcblx0aWYgKHBhaXJSZXNwb25zZS5ib2R5ICYmIHR5cGVvZiBwYWlyUmVzcG9uc2UuYm9keSA9PT0gXCJvYmplY3RcIikge1xuXHRcdGNvbnN0IGJvZHkgPSBwYWlyUmVzcG9uc2UuYm9keSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHQvLyBBbHJlYWR5IG5vcm1hbGl6ZWQgdG8gQW50aHJvcGljIHNoYXBlIChlLmcuIGJ5IHByb3h5KVxuXHRcdGlmIChcInJvbGVcIiBpbiBib2R5ICYmIFwiY29udGVudFwiIGluIGJvZHkgJiYgQXJyYXkuaXNBcnJheShib2R5LmNvbnRlbnQpKSB7XG5cdFx0XHRyZXR1cm4gYm9keSBhcyB1bmtub3duIGFzIE1lc3NhZ2U7XG5cdFx0fVxuXHRcdGlmIChhcGlGb3JtYXQgPT09IFwib3BlbmFpLXJlc3BvbnNlc1wiIHx8IChcIm91dHB1dFwiIGluIGJvZHkgJiYgQXJyYXkuaXNBcnJheShib2R5Lm91dHB1dCkpKSB7XG5cdFx0XHRyZXR1cm4gcGFyc2VPcGVuQUlSZXNwb25zZXNCb2R5KGJvZHksIG1vZGVsKTtcblx0XHR9XG5cdFx0aWYgKFwiY2hvaWNlc1wiIGluIGJvZHkpIHtcblx0XHRcdHJldHVybiBwYXJzZU9wZW5BSUNoYXRDb21wbGV0aW9uQm9keShib2R5LCBtb2RlbCk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHBhaXJSZXNwb25zZS5ib2R5X3Jhdykge1xuXHRcdGlmIChhcGlGb3JtYXQgPT09IFwib3BlbmFpLXJlc3BvbnNlc1wiKSB7XG5cdFx0XHRjb25zdCBidWlsdCA9IGJ1aWxkT3BlbkFJUmVzcG9uc2VzRnJvbVNTRShwYWlyUmVzcG9uc2UuYm9keV9yYXcsIG1vZGVsKTtcblx0XHRcdHJldHVybiBwYXJzZU9wZW5BSVJlc3BvbnNlc0JvZHkoYnVpbHQsIG1vZGVsKTtcblx0XHR9XG5cdFx0Y29uc3QgYnVpbHQgPSBidWlsZE9wZW5BSUNoYXRDb21wbGV0aW9uRnJvbVNTRShwYWlyUmVzcG9uc2UuYm9keV9yYXcsIG1vZGVsKTtcblx0XHRyZXR1cm4gcGFyc2VPcGVuQUlDaGF0Q29tcGxldGlvbkJvZHkoYnVpbHQsIG1vZGVsKTtcblx0fVxuXG5cdHRocm93IG5ldyBFcnJvcihcIk5vIE9wZW5BSSByZXNwb25zZSBib2R5IGF2YWlsYWJsZVwiKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGFuIE9wZW5BSSByZXF1ZXN0IGJvZHkgdG8gQW50aHJvcGljIGBNZXNzYWdlQ3JlYXRlUGFyYW1zYFxuICogYmFzZWQgb24gdGhlIGRldGVjdGVkIEFQSSBmb3JtYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVPcGVuQUlSZXF1ZXN0KGJvZHk6IHVua25vd24sIGFwaUZvcm1hdDogQXBpRm9ybWF0KTogTWVzc2FnZUNyZWF0ZVBhcmFtcyB7XG5cdGlmIChhcGlGb3JtYXQgPT09IFwib3BlbmFpLXJlc3BvbnNlc1wiKSB7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZU9wZW5BSVJlc3BvbnNlc1JlcXVlc3QoYm9keSk7XG5cdH1cblx0cmV0dXJuIG5vcm1hbGl6ZU9wZW5BSUNoYXRSZXF1ZXN0KGJvZHkpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBBUEkgZm9ybWF0IGZvciBhIHJhdyBwYWlyLCBwcmVmZXJyaW5nIHRoZSB2YWx1ZSBzdGFtcGVkIGF0IGxvZyB0aW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhaXJBcGlGb3JtYXQocGFpcjogUmF3UGFpcik6IEFwaUZvcm1hdCB7XG5cdGNvbnN0IGZyb21SZXNwb25zZSA9IHBhaXIucmVzcG9uc2U/LmFwaV9mb3JtYXQ7XG5cdGlmIChmcm9tUmVzcG9uc2UgJiYgZnJvbVJlc3BvbnNlICE9PSBcInVua25vd25cIikge1xuXHRcdHJldHVybiBmcm9tUmVzcG9uc2U7XG5cdH1cblx0cmV0dXJuIGRldGVjdEFwaUZvcm1hdChwYWlyKTtcbn1cblxuLyoqIEV4dHJhY3RzIHRoZSBtb2RlbCBpZCBzdHJpbmcgZnJvbSBhIHJhdyBwYWlyJ3MgcmVxdWVzdCBib2R5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RNb2RlbEZyb21QYWlyKHBhaXI6IFJhd1BhaXIpOiBzdHJpbmcge1xuXHRjb25zdCBib2R5ID0gcGFpci5yZXF1ZXN0Py5ib2R5O1xuXHRpZiAoYm9keSAmJiB0eXBlb2YgYm9keSA9PT0gXCJvYmplY3RcIiAmJiBcIm1vZGVsXCIgaW4gYm9keSAmJiB0eXBlb2YgKGJvZHkgYXMgeyBtb2RlbDogdW5rbm93biB9KS5tb2RlbCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHJldHVybiAoYm9keSBhcyB7IG1vZGVsOiBzdHJpbmcgfSkubW9kZWw7XG5cdH1cblx0cmV0dXJuIFwidW5rbm93blwiO1xufVxuXG5leHBvcnQgeyBpbmZlckFwaUZvcm1hdEZyb21VcmwgfTtcbiIsICIvKipcbiAqIEBmaWxlIFNoYXJlZCBjb252ZXJzYXRpb24gcGFyc2luZyBmb3IgZnJvbnRlbmQgYW5kIGJhY2tlbmQuXG4gKlxuICogQ29udmVydHMgcmF3IEpTT05MIHJlcXVlc3QvcmVzcG9uc2UgcGFpcnMgaW50byBub3JtYWxpemVkIEFudGhyb3BpYy1zaGFwZWRcbiAqIG1lc3NhZ2VzLCBncm91cHMgdGhlbSBpbnRvIGNvbnZlcnNhdGlvbiB0aHJlYWRzLCBwYWlycyB0b29sX3VzZSB3aXRoXG4gKiB0b29sX3Jlc3VsdCBibG9ja3MsIGFuZCBkZXRlY3RzIGNvbXBhY3RlZCAoc3VtbWFyaXplZCkgY29udmVyc2F0aW9ucy5cbiAqXG4gKiBVc2VkIGJ5IGJvdGggdGhlIExpdCBIVE1MIHZpZXdlciBhbmQgdGhlIENMSSBpbmRleCBnZW5lcmF0b3Igc28gcGFyc2luZ1xuICogYmVoYXZpb3Igc3RheXMgaWRlbnRpY2FsIGFjcm9zcyBzdXJmYWNlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gICAgQ29udGVudEJsb2NrLFxuICAgIENvbnRlbnRCbG9ja1BhcmFtLFxuICAgIE1lc3NhZ2UsXG4gICAgTWVzc2FnZUNyZWF0ZVBhcmFtcyxcbiAgICBNZXNzYWdlUGFyYW0sXG4gICAgUmF3TWVzc2FnZVN0cmVhbUV2ZW50LFxuICAgIFRleHRCbG9jayxcbiAgICBUZXh0QmxvY2tQYXJhbSxcbiAgICBUb29sUmVzdWx0QmxvY2tQYXJhbSxcbiAgICBUaGlua2luZ0Jsb2NrLFxuICAgIFRvb2xVc2VCbG9jayBhcyBUb29sVXNlQmxvY2tUeXBlLFxufSBmcm9tIFwiQGFudGhyb3BpYy1haS9zZGsvcmVzb3VyY2VzL21lc3NhZ2VzXCI7XG5pbXBvcnQgdHlwZSB7IEFwaUZvcm1hdCB9IGZyb20gXCIuLi90b29scy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBSYXdQYWlyLCBCZWRyb2NrSW52b2NhdGlvbk1ldHJpY3MgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGZvcm1hdEFwaUZvcm1hdHNEaXNwbGF5IH0gZnJvbSBcIi4uL2FkYXB0L2FwaS1mb3JtYXRcIjtcbmltcG9ydCB7XG4gICAgZXh0cmFjdE1vZGVsRnJvbVBhaXIsXG4gICAgbm9ybWFsaXplT3BlbkFJUmVxdWVzdCxcbiAgICBwYXJzZU9wZW5BSVJlc3BvbnNlLFxuICAgIHJlc29sdmVQYWlyQXBpRm9ybWF0LFxufSBmcm9tIFwiLi4vYWRhcHQvb3BlbmFpLWFkYXB0ZXJcIjtcblxuLyoqIEEgc2luZ2xlIGxvZ2dlZCBBUEkgcm91bmQtdHJpcCBub3JtYWxpemVkIGZvciBkaXNwbGF5IGFuZCBncm91cGluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc2VkUGFpciB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICByZXF1ZXN0OiBNZXNzYWdlQ3JlYXRlUGFyYW1zO1xuICAgIHJlc3BvbnNlOiBNZXNzYWdlO1xuICAgIG1vZGVsOiBzdHJpbmc7XG4gICAgaXNTdHJlYW1pbmc6IGJvb2xlYW47XG4gICAgLyoqIFJhdyBTU0Ugb3IgQmVkcm9jayBldmVudC1zdHJlYW0gYm9keSBwcmVzZXJ2ZWQgZm9yIGRlYnVnIHZpZXdzLiAqL1xuICAgIHJhd1N0cmVhbURhdGE/OiBzdHJpbmc7XG4gICAgLyoqIFdoZXRoZXIgc3RyZWFtaW5nIGRhdGEgdXNlZCBBbnRocm9waWMgU1NFIG9yIEFXUyBCZWRyb2NrIGJpbmFyeSBmb3JtYXQuICovXG4gICAgc3RyZWFtRm9ybWF0PzogXCJzdGFuZGFyZFwiIHwgXCJiZWRyb2NrXCIgfCBudWxsO1xuICAgIC8qKiBEZXRlY3RlZCB1cHN0cmVhbSBBUEkgZm9ybWF0IHdoZW4ga25vd24gYXQgbG9nIG9yIHBhcnNlIHRpbWUuICovXG4gICAgYXBpRm9ybWF0PzogQXBpRm9ybWF0O1xufVxuXG4vKiogTWVzc2FnZSB3aXRoIHBhaXJlZCB0b29sIHJlc3VsdHMgYXR0YWNoZWQgYW5kIG9wdGlvbmFsIFVJIGhpZGUgZmxhZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5oYW5jZWRNZXNzYWdlUGFyYW0gZXh0ZW5kcyBNZXNzYWdlUGFyYW0ge1xuICAgIC8qKiBUb29sIHJlc3VsdHMga2V5ZWQgYnkgYHRvb2xfdXNlX2lkYCwgaG9pc3RlZCBvbnRvIHRoZSBhc3Npc3RhbnQgdHVybi4gKi9cbiAgICB0b29sUmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIFRvb2xSZXN1bHRCbG9ja1BhcmFtPjtcbiAgICAvKiogV2hlbiB0cnVlLCB0aGUgbWVzc2FnZSBpcyB0b29sLXJlc3VsdC1vbmx5IGFuZCBoaWRkZW4gaW4gdGhlIFVJLiAqL1xuICAgIGhpZGU/OiBib29sZWFuO1xufVxuXG4vKiogVG9rZW4gdXNhZ2UgZmllbGRzIGFnZ3JlZ2F0ZWQgZnJvbSBBUEkgcGFpcnMgaW4gYSBjb252ZXJzYXRpb24gdGhyZWFkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb252ZXJzYXRpb25Vc2FnZU1ldGFkYXRhIHtcbiAgICAvKiogTGFzdCByZXF1ZXN0IGNvbnRleHQgc2l6ZTsgYWxpYXMgb2Yge0BsaW5rIGxhc3RUdXJuSW5wdXRUb2tlbnN9LiAqL1xuICAgIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gICAgLyoqIFN1bSBvZiBvdXRwdXQgdG9rZW5zIGFjcm9zcyBhbGwgcGFpcnM7IGFsaWFzIG9mIHtAbGluayBzZXNzaW9uT3V0cHV0VG9rZW5zfS4gKi9cbiAgICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgICAvKiogQWxpYXMgb2Yge0BsaW5rIHNlc3Npb25PdXRwdXRUb2tlbnN9IChub3QgaW5wdXQgKyBvdXRwdXQpLiAqL1xuICAgIHRvdGFsVG9rZW5zOiBudW1iZXI7XG4gICAgLyoqIENvbnRleHQgdG9rZW4gY291bnQgZnJvbSB0aGUgY2hyb25vbG9naWNhbGx5IGxhc3QgQVBJIHJlc3BvbnNlLiAqL1xuICAgIGxhc3RUdXJuSW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgICAvKiogT3V0cHV0IHRva2VuIGNvdW50IGZyb20gdGhlIGNocm9ub2xvZ2ljYWxseSBsYXN0IEFQSSByZXNwb25zZS4gKi9cbiAgICBsYXN0VHVybk91dHB1dFRva2VuczogbnVtYmVyO1xuICAgIC8qKiBTdW0gb2YgYG91dHB1dF90b2tlbnNgIGFjcm9zcyBldmVyeSBwYWlyIGluIHRoZSB0aHJlYWQuICovXG4gICAgc2Vzc2lvbk91dHB1dFRva2VuczogbnVtYmVyO1xuICAgIC8qKiBQcm9tcHQgY2FjaGUgaGl0cyBvbiB0aGUgbGFzdCB0dXJuLCB3aGVuIHJlcG9ydGVkIGJ5IHRoZSBBUEkuICovXG4gICAgY2FjaGVSZWFkVG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKiogUHJvbXB0IGNhY2hlIHdyaXRlcyBvbiB0aGUgbGFzdCB0dXJuLCB3aGVuIHJlcG9ydGVkIGJ5IHRoZSBBUEkuICovXG4gICAgY2FjaGVDcmVhdGlvblRva2Vucz86IG51bWJlciB8IG51bGw7XG59XG5cbi8qKiBPbmUgbG9naWNhbCBjb252ZXJzYXRpb24gdGhyZWFkIG1lcmdlZCBmcm9tIG11bHRpcGxlIEFQSSBwYWlycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2ltcGxlQ29udmVyc2F0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG1vZGVsczogU2V0PHN0cmluZz47XG4gICAgc3lzdGVtPzogc3RyaW5nIHwgVGV4dEJsb2NrUGFyYW1bXTtcbiAgICBtZXNzYWdlczogRW5oYW5jZWRNZXNzYWdlUGFyYW1bXTtcbiAgICByZXNwb25zZTogTWVzc2FnZTtcbiAgICAvKiogQWxsIEFQSSBwYWlycyB0aGF0IGJlbG9uZyB0byB0aGlzIHRocmVhZCwgc29ydGVkIGJ5IHRpbWUuICovXG4gICAgYWxsUGFpcnM6IFByb2Nlc3NlZFBhaXJbXTtcbiAgICAvKiogVGhlIHBhaXIgd2l0aCB0aGUgbG9uZ2VzdCBtZXNzYWdlIGxpc3QgXHUyMDE0IHRyZWF0ZWQgYXMgdGhlIHRocmVhZCBzbmFwc2hvdC4gKi9cbiAgICBmaW5hbFBhaXI6IFByb2Nlc3NlZFBhaXI7XG4gICAgLyoqIFRydWUgd2hlbiB0aGlzIHRocmVhZCB3YXMgZGV0ZWN0ZWQgYXMgYSBwb3N0LWNvbXBhY3Rpb24gc3VtbWFyeS4gKi9cbiAgICBjb21wYWN0ZWQ/OiBib29sZWFuO1xuICAgIC8qKiBIdW1hbi1yZWFkYWJsZSBBUEkgZm9ybWF0IGxhYmVsLCBlLmcuIFwiT3BlbkFJIENoYXRcIi4gKi9cbiAgICBhcGlGb3JtYXREaXNwbGF5Pzogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHN0YXJ0VGltZTogc3RyaW5nO1xuICAgICAgICBlbmRUaW1lOiBzdHJpbmc7XG4gICAgICAgIHRvdGFsUGFpcnM6IG51bWJlcjtcbiAgICB9ICYgQ29udmVyc2F0aW9uVXNhZ2VNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBBZ2dyZWdhdGVzIHRva2VuIHVzYWdlIGZyb20gY2hyb25vbG9naWNhbGx5IG9yZGVyZWQgQVBJIHBhaXJzLlxuICpcbiAqIElucHV0IHRva2VucyByZWZsZWN0IHRoZSBsYXN0IHR1cm4ncyBjb250ZXh0IHNuYXBzaG90IChub3Qgc3VtbWVkIGFjcm9zcyB0dXJucykuXG4gKiBPdXRwdXQgdG9rZW5zIGFyZSBzdW1tZWQgYWNyb3NzIGFsbCBwYWlycyBhcyB0aGUgc2Vzc2lvbiBnZW5lcmF0aW9uIGNvc3QuXG4gKlxuICogQHBhcmFtIHBhaXJzIC0gUHJvY2Vzc2VkIHBhaXJzIGJlbG9uZ2luZyB0byBvbmUgY29udmVyc2F0aW9uIHRocmVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFnZ3JlZ2F0ZVVzYWdlRnJvbVBhaXJzKHBhaXJzOiBQcm9jZXNzZWRQYWlyW10pOiBDb252ZXJzYXRpb25Vc2FnZU1ldGFkYXRhIHtcbiAgICBpZiAoIXBhaXJzIHx8IHBhaXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgICAgICAgICBvdXRwdXRUb2tlbnM6IDAsXG4gICAgICAgICAgICB0b3RhbFRva2VuczogMCxcbiAgICAgICAgICAgIGxhc3RUdXJuSW5wdXRUb2tlbnM6IDAsXG4gICAgICAgICAgICBsYXN0VHVybk91dHB1dFRva2VuczogMCxcbiAgICAgICAgICAgIHNlc3Npb25PdXRwdXRUb2tlbnM6IDAsXG4gICAgICAgICAgICBjYWNoZVJlYWRUb2tlbnM6IG51bGwsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uVG9rZW5zOiBudWxsLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNvcnRlZFBhaXJzID0gWy4uLnBhaXJzXS5zb3J0KFxuICAgICAgICAoYSwgYikgPT4gbmV3IERhdGUoYS50aW1lc3RhbXApLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIudGltZXN0YW1wKS5nZXRUaW1lKCksXG4gICAgKTtcbiAgICBjb25zdCBsYXN0UGFpciA9IHNvcnRlZFBhaXJzW3NvcnRlZFBhaXJzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGxhc3RVc2FnZSA9IGxhc3RQYWlyLnJlc3BvbnNlPy51c2FnZTtcblxuICAgIGNvbnN0IGxhc3RUdXJuSW5wdXRUb2tlbnMgPSBsYXN0VXNhZ2U/LmlucHV0X3Rva2VucyA/PyAwO1xuICAgIGNvbnN0IGxhc3RUdXJuT3V0cHV0VG9rZW5zID0gbGFzdFVzYWdlPy5vdXRwdXRfdG9rZW5zID8/IDA7XG4gICAgY29uc3Qgc2Vzc2lvbk91dHB1dFRva2VucyA9IHNvcnRlZFBhaXJzLnJlZHVjZShcbiAgICAgICAgKHN1bSwgcGFpcikgPT4gc3VtICsgKHBhaXIucmVzcG9uc2U/LnVzYWdlPy5vdXRwdXRfdG9rZW5zID8/IDApLFxuICAgICAgICAwLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBpbnB1dFRva2VuczogbGFzdFR1cm5JbnB1dFRva2VucyxcbiAgICAgICAgb3V0cHV0VG9rZW5zOiBzZXNzaW9uT3V0cHV0VG9rZW5zLFxuICAgICAgICB0b3RhbFRva2Vuczogc2Vzc2lvbk91dHB1dFRva2VucyxcbiAgICAgICAgbGFzdFR1cm5JbnB1dFRva2VucyxcbiAgICAgICAgbGFzdFR1cm5PdXRwdXRUb2tlbnMsXG4gICAgICAgIHNlc3Npb25PdXRwdXRUb2tlbnMsXG4gICAgICAgIGNhY2hlUmVhZFRva2VuczogbGFzdFVzYWdlPy5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyA/PyBudWxsLFxuICAgICAgICBjYWNoZUNyZWF0aW9uVG9rZW5zOiBsYXN0VXNhZ2U/LmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyA/PyBudWxsLFxuICAgIH07XG59XG5cbi8qKlxuICogUGFyc2VzIHJhdyB0cmFjZSBwYWlycyBhbmQgbWVyZ2VzIHRoZW0gaW50byB2aWV3ZXItcmVhZHkgY29udmVyc2F0aW9ucy5cbiAqIFVzZWQgYnkgYm90aCB0aGUgTGl0IGZyb250ZW5kIGFuZCB0aGUgQ0xJIGluZGV4IGdlbmVyYXRvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFNoYXJlZENvbnZlcnNhdGlvblByb2Nlc3NvciB7XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgZWFjaCB7QGxpbmsgUmF3UGFpcn0gaW50byBhIHtAbGluayBQcm9jZXNzZWRQYWlyfS5cbiAgICAgKlxuICAgICAqIEhhbmRsZXMgQW50aHJvcGljIEpTT04sIEFudGhyb3BpYy9CZWRyb2NrIFNTRSwgYW5kIE9wZW5BSSBDaGF0L1Jlc3BvbnNlc1xuICAgICAqIGZvcm1hdHMuIFBhaXJzIG1pc3NpbmcgcmVxdWVzdC9yZXNwb25zZSBvciBmYWlsaW5nIHBhcnNlIGFyZSBza2lwcGVkIHdpdGhcbiAgICAgKiBhIGNvbnNvbGUgd2FybmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYXdQYWlycyAtIExpbmVzIHBhcnNlZCBmcm9tIGEgc2Vzc2lvbiBKU09OTCBsb2cuXG4gICAgICogQHJldHVybnMgTm9ybWFsaXplZCBwYWlycyByZWFkeSBmb3IgbWVyZ2luZyBvciBKU09OIGRlYnVnIGRpc3BsYXkuXG4gICAgICovXG4gICAgcHJvY2Vzc1Jhd1BhaXJzKHJhd1BhaXJzOiBSYXdQYWlyW10pOiBQcm9jZXNzZWRQYWlyW10ge1xuICAgICAgICBpZiAoIXJhd1BhaXJzIHx8IHJhd1BhaXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvY2Vzc2VkUGFpcnM6IFByb2Nlc3NlZFBhaXJbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3UGFpcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSByYXdQYWlyc1tpXTtcbiAgICAgICAgICAgIGlmICghcGFpcj8ucmVxdWVzdCB8fCAhcGFpcj8ucmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcGlGb3JtYXQgPSByZXNvbHZlUGFpckFwaUZvcm1hdChwYWlyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc09wZW5BSUZvcm1hdCA9IGFwaUZvcm1hdCA9PT0gXCJvcGVuYWlcIiB8fCBhcGlGb3JtYXQgPT09IFwib3BlbmFpLXJlc3BvbnNlc1wiO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU3RyZWFtaW5nID0gISFwYWlyLnJlc3BvbnNlLmJvZHlfcmF3O1xuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZTogTWVzc2FnZTtcbiAgICAgICAgICAgICAgICBsZXQgc3RyZWFtRm9ybWF0OiBcInN0YW5kYXJkXCIgfCBcImJlZHJvY2tcIiB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0OiBNZXNzYWdlQ3JlYXRlUGFyYW1zO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzT3BlbkFJRm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBub3JtYWxpemVPcGVuQUlSZXF1ZXN0KHBhaXIucmVxdWVzdC5ib2R5LCBhcGlGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHBhcnNlT3BlbkFJUmVzcG9uc2UocGFpci5yZXNwb25zZSwgYXBpRm9ybWF0LCBleHRyYWN0TW9kZWxGcm9tUGFpcihwYWlyKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYWlyLnJlc3BvbnNlLmJvZHlfcmF3KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUZvcm1hdCA9IHRoaXMuaXNCZWRyb2NrUmVzcG9uc2UocGFpci5yZXNwb25zZS5ib2R5X3JhdykgPyBcImJlZHJvY2tcIiA6IFwic3RhbmRhcmRcIjtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB0aGlzLnBhcnNlU3RyZWFtaW5nUmVzcG9uc2UocGFpci5yZXNwb25zZS5ib2R5X3Jhdyk7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBwYWlyLnJlcXVlc3QuYm9keSBhcyBNZXNzYWdlQ3JlYXRlUGFyYW1zO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFpci5yZXNwb25zZS5ib2R5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcGFpci5yZXNwb25zZS5ib2R5IGFzIE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBwYWlyLnJlcXVlc3QuYm9keSBhcyBNZXNzYWdlQ3JlYXRlUGFyYW1zO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5leHRyYWN0TW9kZWwocGFpcik7XG5cbiAgICAgICAgICAgICAgICBwcm9jZXNzZWRQYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGAke3BhaXIucmVxdWVzdC50aW1lc3RhbXAgfHwgRGF0ZS5ub3coKX1fJHtNYXRoLnJhbmRvbSgpfWAsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKHBhaXIucmVxdWVzdC50aW1lc3RhbXAgfHwgRGF0ZS5ub3coKSkgKiAxMDAwKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGlzU3RyZWFtaW5nLFxuICAgICAgICAgICAgICAgICAgICByYXdTdHJlYW1EYXRhOiBwYWlyLnJlc3BvbnNlLmJvZHlfcmF3LFxuICAgICAgICAgICAgICAgICAgICBzdHJlYW1Gb3JtYXQsXG4gICAgICAgICAgICAgICAgICAgIGFwaUZvcm1hdDogYXBpRm9ybWF0ICE9PSBcInVua25vd25cIiA/IGFwaUZvcm1hdCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gcHJvY2VzcyByYXcgcGFpciBhdCBpbmRleCAke2l9OmAsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAvLyBDb250aW51ZSBwcm9jZXNzaW5nIG90aGVyIHBhaXJzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJvY2Vzc2VkUGFpcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZWN0cyBBV1MgQmVkcm9jayBiaW5hcnkgZXZlbnQtc3RyZWFtIHJlc3BvbnNlcyBieSB0aGVpciBsZWFkaW5nIE5VTCBieXRlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBib2R5UmF3IC0gUmF3IHJlc3BvbnNlIGJvZHkgc3RyaW5nIGZyb20gdGhlIHByb3h5IGxvZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzQmVkcm9ja1Jlc3BvbnNlKGJvZHlSYXc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBCZWRyb2NrIEV2ZW50U3RyZWFtIGZyYW1lcyBzdGFydCB3aXRoIGEgNC1ieXRlIHRvdGFsLWxlbmd0aCBwcmVmaXggb2YgemVyb2VzXG4gICAgICAgIHJldHVybiBib2R5UmF3LnN0YXJ0c1dpdGgoXCJcXHUwMDAwXFx1MDAwMFwiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgQmVkcm9jayBiaW5hcnkgZXZlbnQgc3RyZWFtIGludG8gYSBzeW50aGV0aWMgQW50aHJvcGljIHtAbGluayBNZXNzYWdlfS5cbiAgICAgKlxuICAgICAqIEV4dHJhY3RzIGJhc2U2NC13cmFwcGVkIEpTT04gZXZlbnRzIGZyb20gYGV2ZW50e1wiYnl0ZXNcIjouLi59YCBmcmFtZXMgYW5kXG4gICAgICogbWVyZ2VzIEJlZHJvY2sgaW52b2NhdGlvbiBtZXRyaWNzIGludG8gdXNhZ2Ugd2hlbiBwcmVzZW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgcGFyc2VCZWRyb2NrU3RyZWFtaW5nUmVzcG9uc2UoYm9keVJhdzogc3RyaW5nKTogTWVzc2FnZSB7XG4gICAgICAgIGlmICghYm9keVJhdyB8fCBib2R5UmF3Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW1wdHkgYm9keVJhdyBwcm92aWRlZCB0byBwYXJzZUJlZHJvY2tTdHJlYW1pbmdSZXNwb25zZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50czogUmF3TWVzc2FnZVN0cmVhbUV2ZW50W10gPSBbXTtcbiAgICAgICAgbGV0IGJlZHJvY2tNZXRyaWNzOiBCZWRyb2NrSW52b2NhdGlvbk1ldHJpY3MgfCBudWxsID0gbnVsbDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRXh0cmFjdCBKU09OIHBheWxvYWRzIGZyb20gQVdTIEV2ZW50U3RyZWFtIGZvcm1hdFxuICAgICAgICAgICAgLy8gVGhlIGZvcm1hdCBjb250YWlucyBiaW5hcnkgaGVhZGVycyBmb2xsb3dlZCBieSBKU09OIHBheWxvYWRzXG4gICAgICAgICAgICBjb25zdCBqc29uQ2h1bmtzID0gdGhpcy5leHRyYWN0SnNvbkNodW5rc0Zyb21FdmVudFN0cmVhbShib2R5UmF3KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBqc29uQ2h1bmsgb2YganNvbkNodW5rcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50UGF5bG9hZCA9IEpTT04ucGFyc2UoanNvbkNodW5rKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBFYWNoIGZyYW1lIHdyYXBzIHRoZSBBbnRocm9waWMgU1NFIGV2ZW50IEpTT04gaW4gYSBiYXNlNjQgYGJ5dGVzYCBmaWVsZFxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRQYXlsb2FkLmJ5dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlNjREYXRhID0gZXZlbnRQYXlsb2FkLmJ5dGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjb2RlZEpzb24gPSB0aGlzLmRlY29kZUJhc2U2NFRvVXRmOChiYXNlNjREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gSlNPTi5wYXJzZShkZWNvZGVkSnNvbikgYXMgUmF3TWVzc2FnZVN0cmVhbUV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLnB1c2goZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoY2h1bmtFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gcGFyc2UgSlNPTiBjaHVuazpcIiwganNvbkNodW5rLCBjaHVua0Vycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUgd2l0aCBvdGhlciBjaHVua3NcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEV4dHJhY3QgQmVkcm9jayBtZXRyaWNzIGZyb20gdGhlIGxhc3QgZXZlbnQgaWYgcHJlc2VudFxuICAgICAgICAgICAgYmVkcm9ja01ldHJpY3MgPSB0aGlzLmV4dHJhY3RCZWRyb2NrTWV0cmljcyhib2R5UmF3KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgQmVkcm9jayBzdHJlYW1pbmcgcmVzcG9uc2U6XCIsIGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQmVkcm9jayBzdHJlYW1pbmcgcmVzcG9uc2UgcGFyc2luZyBmYWlsZWQ6ICR7ZXJyb3J9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5idWlsZE1lc3NhZ2VGcm9tRXZlbnRzKGV2ZW50cywgYmVkcm9ja01ldHJpY3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlY29kZXMgYmFzZTY0IHRvIFVURi04IGluIGJvdGggYnJvd3NlciAoYXRvYikgYW5kIE5vZGUuanMgKEJ1ZmZlcikuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIFdoZW4gbmVpdGhlciBBUEkgaXMgYXZhaWxhYmxlICh1bmxpa2VseSBpbiB0aGlzIHByb2plY3QncyB0YXJnZXRzKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGRlY29kZUJhc2U2NFRvVXRmOChiYXNlNjREYXRhOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgYXRvYiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIGF0b2IoYmFzZTY0RGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJhc2U2NERhdGEsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYXNlNjQgZGVjb2Rpbmcgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50XCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2NhbnMgcmF3IEJlZHJvY2sgZXZlbnQtc3RyZWFtIHRleHQgZm9yIGBldmVudHtcImJ5dGVzXCI6ey4uLn19YCBKU09OIHdyYXBwZXJzLlxuICAgICAqXG4gICAgICogVXNlcyBicmFjZSBjb3VudGluZyByYXRoZXIgdGhhbiByZWdleCB0byBoYW5kbGUgbmVzdGVkIEpTT04gb2JqZWN0cyBzYWZlbHkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0SnNvbkNodW5rc0Zyb21FdmVudFN0cmVhbShib2R5UmF3OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICghYm9keVJhdyB8fCBib2R5UmF3Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QganNvbkNodW5rczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9ICdldmVudHtcImJ5dGVzXCI6JztcblxuICAgICAgICBsZXQgc2VhcmNoSW5kZXggPSAwO1xuXG4gICAgICAgIHdoaWxlIChzZWFyY2hJbmRleCA8IGJvZHlSYXcubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBwYXR0ZXJuSW5kZXggPSBib2R5UmF3LmluZGV4T2YocGF0dGVybiwgc2VhcmNoSW5kZXgpO1xuICAgICAgICAgICAgaWYgKHBhdHRlcm5JbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3RhcnQgZXh0cmFjdGluZyBKU09OIGZyb20gdGhlICd7JyBhZnRlciAnZXZlbnQnXG4gICAgICAgICAgICBjb25zdCBqc29uU3RhcnRJbmRleCA9IHBhdHRlcm5JbmRleCArIDU7XG4gICAgICAgICAgICBsZXQgYnJhY2VDb3VudCA9IDA7XG4gICAgICAgICAgICBsZXQganNvbkVuZEluZGV4ID0gLTE7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBqc29uU3RhcnRJbmRleDsgaSA8IGJvZHlSYXcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyID0gYm9keVJhd1tpXTtcblxuICAgICAgICAgICAgICAgIGlmIChjaGFyID09PSBcIntcIikge1xuICAgICAgICAgICAgICAgICAgICBicmFjZUNvdW50Kys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSBcIn1cIikge1xuICAgICAgICAgICAgICAgICAgICBicmFjZUNvdW50LS07XG4gICAgICAgICAgICAgICAgICAgIGlmIChicmFjZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uRW5kSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChqc29uRW5kSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QganNvbkNodW5rID0gYm9keVJhdy5zdWJzdHJpbmcoanNvblN0YXJ0SW5kZXgsIGpzb25FbmRJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIGpzb25DaHVua3MucHVzaChqc29uQ2h1bmspO1xuICAgICAgICAgICAgICAgIHNlYXJjaEluZGV4ID0ganNvbkVuZEluZGV4ICsgMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoSW5kZXggPSBwYXR0ZXJuSW5kZXggKyBwYXR0ZXJuLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBqc29uQ2h1bmtzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJlc3QtZWZmb3J0IGV4dHJhY3Rpb24gb2YgQmVkcm9jayB0b2tlbiBtZXRyaWNzIGVtYmVkZGVkIGluIHRoZSByYXcgc3RyZWFtLlxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdEJlZHJvY2tNZXRyaWNzKGJvZHlSYXc6IHN0cmluZyk6IEJlZHJvY2tJbnZvY2F0aW9uTWV0cmljcyB8IG51bGwge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbWV0cmljc01hdGNoID0gYm9keVJhdy5tYXRjaCgvXCJhbWF6b24tYmVkcm9jay1pbnZvY2F0aW9uTWV0cmljc1wiOlxccyooXFx7W159XStcXH0pLyk7XG4gICAgICAgICAgICBpZiAobWV0cmljc01hdGNoICYmIG1ldHJpY3NNYXRjaFsxXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKG1ldHJpY3NNYXRjaFsxXSkgYXMgQmVkcm9ja0ludm9jYXRpb25NZXRyaWNzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGludmFsaWQgbWV0cmljc1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoZXMgc3RyZWFtaW5nIGJvZHkgcGFyc2luZyB0byBCZWRyb2NrIG9yIHN0YW5kYXJkIEFudGhyb3BpYyBTU0UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYm9keVJhdyAtIFJhdyBgYm9keV9yYXdgIGZpZWxkIGZyb20gYSBsb2dnZWQgcmVzcG9uc2UuXG4gICAgICogQHJldHVybnMgUmVjb25zdHJ1Y3RlZCBhc3Npc3RhbnQge0BsaW5rIE1lc3NhZ2V9LlxuICAgICAqL1xuICAgIHBhcnNlU3RyZWFtaW5nUmVzcG9uc2UoYm9keVJhdzogc3RyaW5nKTogTWVzc2FnZSB7XG4gICAgICAgIGlmICh0aGlzLmlzQmVkcm9ja1Jlc3BvbnNlKGJvZHlSYXcpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJlZHJvY2tTdHJlYW1pbmdSZXNwb25zZShib2R5UmF3KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlU3RhbmRhcmRTdHJlYW1pbmdSZXNwb25zZShib2R5UmF3KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBBbnRocm9waWMtc3R5bGUgYGRhdGE6IHsuLi59YCBTU0UgbGluZXMgaW50byBhIHtAbGluayBNZXNzYWdlfS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlU3RhbmRhcmRTdHJlYW1pbmdSZXNwb25zZShib2R5UmF3OiBzdHJpbmcpOiBNZXNzYWdlIHtcbiAgICAgICAgaWYgKCFib2R5UmF3IHx8IGJvZHlSYXcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbXB0eSBib2R5UmF3IHByb3ZpZGVkIHRvIHBhcnNlU3RhbmRhcmRTdHJlYW1pbmdSZXNwb25zZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmVzID0gYm9keVJhdy5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgY29uc3QgZXZlbnRzOiBSYXdNZXNzYWdlU3RyZWFtRXZlbnRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAgICAgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoXCJkYXRhOiBcIikpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gbGluZS5zdWJzdHJpbmcoNikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKGRhdGEgPT09IFwiW0RPTkVdXCIpIGJyZWFrO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gSlNPTi5wYXJzZShkYXRhKSBhcyBSYXdNZXNzYWdlU3RyZWFtRXZlbnQ7XG4gICAgICAgICAgICAgICAgZXZlbnRzLnB1c2goZXZlbnQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBwYXJzZSBTU0UgZXZlbnQ6XCIsIGRhdGEsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRNZXNzYWdlRnJvbUV2ZW50cyhldmVudHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxheXMgc3RyZWFtaW5nIGV2ZW50cyBpbnRvIGEgY29tcGxldGUge0BsaW5rIE1lc3NhZ2V9LCBhY2N1bXVsYXRpbmdcbiAgICAgKiB0ZXh0LCB0aGlua2luZywgYW5kIHRvb2xfdXNlIGRlbHRhcyBhbmQgcGFyc2luZyB0b29sIEpTT04gYXQgYmxvY2sgc3RvcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBldmVudHMgLSBPcmRlcmVkIHN0cmVhbSBldmVudHMgZnJvbSBTU0Ugb3IgQmVkcm9jayBkZWNvZGUuXG4gICAgICogQHBhcmFtIGJlZHJvY2tNZXRyaWNzIC0gT3B0aW9uYWwgQmVkcm9jayB0b2tlbiBjb3VudHMgb3ZlcnJpZGluZyB1c2FnZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkTWVzc2FnZUZyb21FdmVudHMoXG4gICAgICAgIGV2ZW50czogUmF3TWVzc2FnZVN0cmVhbUV2ZW50W10sXG4gICAgICAgIGJlZHJvY2tNZXRyaWNzPzogQmVkcm9ja0ludm9jYXRpb25NZXRyaWNzIHwgbnVsbCxcbiAgICApOiBNZXNzYWdlIHtcbiAgICAgICAgbGV0IG1lc3NhZ2U6IFBhcnRpYWw8TWVzc2FnZT4gPSB7XG4gICAgICAgICAgICBpZDogXCJcIixcbiAgICAgICAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtdLFxuICAgICAgICAgICAgbW9kZWw6IFwiXCIsXG4gICAgICAgICAgICBzdG9wX3JlYXNvbjogbnVsbCxcbiAgICAgICAgICAgIHN0b3Bfc2VxdWVuY2U6IG51bGwsXG4gICAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgICAgIGlucHV0X3Rva2VuczogMCxcbiAgICAgICAgICAgICAgICBvdXRwdXRfdG9rZW5zOiAwLFxuICAgICAgICAgICAgICAgIGNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VuczogbnVsbCxcbiAgICAgICAgICAgICAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2VuczogbnVsbCxcbiAgICAgICAgICAgICAgICBzZXJ2ZXJfdG9vbF91c2U6IG51bGwsXG4gICAgICAgICAgICAgICAgc2VydmljZV90aWVyOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjb250ZW50QmxvY2tzOiBDb250ZW50QmxvY2tbXSA9IFtdO1xuICAgICAgICBsZXQgY3VycmVudEJsb2NrSW5kZXggPSAtMTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2Vfc3RhcnRcIjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHsgLi4ubWVzc2FnZSwgLi4uZXZlbnQubWVzc2FnZSB9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgXCJjb250ZW50X2Jsb2NrX3N0YXJ0XCI6XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9ja0luZGV4ID0gZXZlbnQuaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRCbG9ja3NbY3VycmVudEJsb2NrSW5kZXhdID0geyAuLi5ldmVudC5jb250ZW50X2Jsb2NrIH07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbnRlbnRfYmxvY2tfZGVsdGFcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCbG9ja0luZGV4ID49IDAgJiYgY29udGVudEJsb2Nrc1tjdXJyZW50QmxvY2tJbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gY29udGVudEJsb2Nrc1tjdXJyZW50QmxvY2tJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YSA9IGV2ZW50LmRlbHRhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlbHRhLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dF9kZWx0YVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2sudHlwZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibG9jayBhcyBUZXh0QmxvY2spLnRleHQgPSAoKGJsb2NrIGFzIFRleHRCbG9jaykudGV4dCB8fCBcIlwiKSArIGRlbHRhLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaW5wdXRfanNvbl9kZWx0YVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2sudHlwZSA9PT0gXCJ0b29sX3VzZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b29sQmxvY2sgPSBibG9jayBhcyBUb29sVXNlQmxvY2tUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0b29sQmxvY2suaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sQmxvY2suaW5wdXQgPSB0b29sQmxvY2suaW5wdXQgKyBkZWx0YS5wYXJ0aWFsX2pzb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b29sQmxvY2suaW5wdXQgYXMgYW55KSA9IGRlbHRhLnBhcnRpYWxfanNvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0aGlua2luZ19kZWx0YVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2sudHlwZSA9PT0gXCJ0aGlua2luZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmxvY2sgYXMgVGhpbmtpbmdCbG9jaykudGhpbmtpbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmxvY2sgYXMgVGhpbmtpbmdCbG9jaykudGhpbmtpbmcgfHwgXCJcIikgKyBkZWx0YS50aGlua2luZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzaWduYXR1cmVfZGVsdGFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrLnR5cGUgPT09IFwidGhpbmtpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NrIGFzIFRoaW5raW5nQmxvY2spLnNpZ25hdHVyZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChibG9jayBhcyBUaGlua2luZ0Jsb2NrKS5zaWduYXR1cmUgfHwgXCJcIikgKyBkZWx0YS5zaWduYXR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2l0YXRpb25zX2RlbHRhXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbnRlbnRfYmxvY2tfc3RvcFwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJsb2NrSW5kZXggPj0gMCAmJiBjb250ZW50QmxvY2tzW2N1cnJlbnRCbG9ja0luZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2sgPSBjb250ZW50QmxvY2tzW2N1cnJlbnRCbG9ja0luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9jay50eXBlID09PSBcInRvb2xfdXNlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b29sQmxvY2sgPSBibG9jayBhcyBUb29sVXNlQmxvY2tUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdG9vbEJsb2NrLmlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sQmxvY2suaW5wdXQgPSBKU09OLnBhcnNlKHRvb2xCbG9jay5pbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBwYXJzZSB0b29sIGlucHV0IEpTT046XCIsIHRvb2xCbG9jay5pbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZV9kZWx0YVwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGVsdGEuc3RvcF9yZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RvcF9yZWFzb24gPSBldmVudC5kZWx0YS5zdG9wX3JlYXNvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGVsdGEuc3RvcF9zZXF1ZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdG9wX3NlcXVlbmNlID0gZXZlbnQuZGVsdGEuc3RvcF9zZXF1ZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudXNhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElucHV0IHRva2VucyBhcmUgdXN1YWxseSBzZW50IG9uY2U7IHByZXNlcnZlIHByaW9yIHZhbHVlIG9uIGxhdGVyIGRlbHRhc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudElucHV0VG9rZW5zID0gbWVzc2FnZS51c2FnZT8uaW5wdXRfdG9rZW5zID8/IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudXNhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdG9rZW5zOiBldmVudC51c2FnZS5pbnB1dF90b2tlbnMgPz8gY3VycmVudElucHV0VG9rZW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90b2tlbnM6IGV2ZW50LnVzYWdlLm91dHB1dF90b2tlbnMgPz8gbWVzc2FnZS51c2FnZT8ub3V0cHV0X3Rva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VuczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudXNhZ2UuY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zID8/IG1lc3NhZ2UudXNhZ2U/LmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC51c2FnZS5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyA/PyBtZXNzYWdlLnVzYWdlPy5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl90b29sX3VzZTogZXZlbnQudXNhZ2Uuc2VydmVyX3Rvb2xfdXNlID8/IG1lc3NhZ2UudXNhZ2U/LnNlcnZlcl90b29sX3VzZSA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfdGllcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZV9zdG9wXCI6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbWVzc2FnZS5jb250ZW50ID0gY29udGVudEJsb2Nrcy5maWx0ZXIoKGJsb2NrKSA9PiBibG9jayAhPSBudWxsKTtcblxuICAgICAgICBpZiAoYmVkcm9ja01ldHJpY3MgJiYgbWVzc2FnZS51c2FnZSkge1xuICAgICAgICAgICAgbWVzc2FnZS51c2FnZS5pbnB1dF90b2tlbnMgPSBiZWRyb2NrTWV0cmljcy5pbnB1dFRva2VuQ291bnQ7XG4gICAgICAgICAgICBtZXNzYWdlLnVzYWdlLm91dHB1dF90b2tlbnMgPSBiZWRyb2NrTWV0cmljcy5vdXRwdXRUb2tlbkNvdW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UgYXMgTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBhIGRpc3BsYXkgbW9kZWwgaWQgZnJvbSBCZWRyb2NrIFVSTCwgcmVxdWVzdCBib2R5LCBvciByZXNwb25zZSBib2R5LlxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdE1vZGVsKHBhaXI6IFJhd1BhaXIpOiBzdHJpbmcge1xuICAgICAgICBpZiAocGFpci5yZXF1ZXN0Py51cmwgJiYgcGFpci5yZXF1ZXN0LnVybC5pbmNsdWRlcyhcImJlZHJvY2stcnVudGltZVwiKSkge1xuICAgICAgICAgICAgY29uc3QgdXJsTWF0Y2ggPSBwYWlyLnJlcXVlc3QudXJsLm1hdGNoKC9cXC9tb2RlbFxcLyhbXlxcL10rKS8pO1xuICAgICAgICAgICAgaWYgKHVybE1hdGNoICYmIHVybE1hdGNoWzFdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplTW9kZWxOYW1lKHVybE1hdGNoWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYWlyLnJlcXVlc3Q/LmJvZHkgJiYgdHlwZW9mIHBhaXIucmVxdWVzdC5ib2R5ID09PSBcIm9iamVjdFwiICYmIFwibW9kZWxcIiBpbiBwYWlyLnJlcXVlc3QuYm9keSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplTW9kZWxOYW1lKChwYWlyLnJlcXVlc3QuYm9keSBhcyBhbnkpLm1vZGVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYWlyLnJlc3BvbnNlPy5ib2R5ICYmIHR5cGVvZiBwYWlyLnJlc3BvbnNlLmJvZHkgPT09IFwib2JqZWN0XCIgJiYgXCJtb2RlbFwiIGluIHBhaXIucmVzcG9uc2UuYm9keSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplTW9kZWxOYW1lKChwYWlyLnJlc3BvbnNlLmJvZHkgYXMgYW55KS5tb2RlbCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyaXBzIEJlZHJvY2sgaW5mZXJlbmNlLXByb2ZpbGUgcHJlZml4ZXMgZm9yIHNob3J0ZXIgZGlzcGxheSBuYW1lcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIG5vcm1hbGl6ZU1vZGVsTmFtZShtb2RlbE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICghbW9kZWxOYW1lKSByZXR1cm4gXCJ1bmtub3duXCI7XG5cbiAgICAgICAgaWYgKG1vZGVsTmFtZS5zdGFydHNXaXRoKFwidXMuYW50aHJvcGljLlwiKSkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBtb2RlbE5hbWUubWF0Y2goL3VzXFwuYW50aHJvcGljXFwuKFteOl0rKS8pO1xuICAgICAgICAgICAgaWYgKG1hdGNoICYmIG1hdGNoWzFdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1vZGVsTmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHcm91cHMge0BsaW5rIFByb2Nlc3NlZFBhaXJ9IHJvd3MgaW50byB7QGxpbmsgU2ltcGxlQ29udmVyc2F0aW9ufSB0aHJlYWRzLlxuICAgICAqXG4gICAgICogVGhyZWFkaW5nIGhldXJpc3RpYzogc2FtZSBzeXN0ZW0gcHJvbXB0ICsgbW9kZWwsIHRoZW4gYnVja2V0IGJ5IG5vcm1hbGl6ZWRcbiAgICAgKiBmaXJzdCB1c2VyIG1lc3NhZ2UuIFdpdGhpbiBlYWNoIGJ1Y2tldCB0aGUgcGFpciB3aXRoIHRoZSBtb3N0IG1lc3NhZ2VzXG4gICAgICogYmVjb21lcyB0aGUgdGhyZWFkIHNuYXBzaG90LiBDb21wYWN0ZWQgY29udmVyc2F0aW9ucyBhcmUgbWVyZ2VkIHdoZW4gZGV0ZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFpcnMgLSBOb3JtYWxpemVkIHBhaXJzIGZyb20ge0BsaW5rIHByb2Nlc3NSYXdQYWlyc30uXG4gICAgICogQHBhcmFtIG9wdGlvbnMuaW5jbHVkZVNob3J0Q29udmVyc2F0aW9ucyAtIEluY2x1ZGUgdGhyZWFkcyB3aXRoIFx1MjI2NDIgbWVzc2FnZXMuXG4gICAgICogQHJldHVybnMgQ29udmVyc2F0aW9ucyBzb3J0ZWQgYnkgc3RhcnQgdGltZS5cbiAgICAgKi9cbiAgICBtZXJnZUNvbnZlcnNhdGlvbnMoXG4gICAgICAgIHBhaXJzOiBQcm9jZXNzZWRQYWlyW10sXG4gICAgICAgIG9wdGlvbnM6IHsgaW5jbHVkZVNob3J0Q29udmVyc2F0aW9ucz86IGJvb2xlYW4gfSA9IHt9LFxuICAgICk6IFNpbXBsZUNvbnZlcnNhdGlvbltdIHtcbiAgICAgICAgaWYgKCFwYWlycyB8fCBwYWlycy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgICAgICAvLyBGaXJzdCBzcGxpdCBieSBzeXN0ZW0gcHJvbXB0ICsgbW9kZWwgc28gdW5yZWxhdGVkIHNlc3Npb25zIGRvbid0IG1lcmdlXG4gICAgICAgIGNvbnN0IHBhaXJzQnlTeXN0ZW0gPSBuZXcgTWFwPHN0cmluZywgUHJvY2Vzc2VkUGFpcltdPigpO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgY29uc3Qgc3lzdGVtID0gcGFpci5yZXF1ZXN0LnN5c3RlbTtcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gcGFpci5tb2RlbDtcbiAgICAgICAgICAgIGNvbnN0IHN5c3RlbUtleSA9IEpTT04uc3RyaW5naWZ5KHsgc3lzdGVtLCBtb2RlbCB9KTtcblxuICAgICAgICAgICAgaWYgKCFwYWlyc0J5U3lzdGVtLmhhcyhzeXN0ZW1LZXkpKSB7XG4gICAgICAgICAgICAgICAgcGFpcnNCeVN5c3RlbS5zZXQoc3lzdGVtS2V5LCBbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWlyc0J5U3lzdGVtLmdldChzeXN0ZW1LZXkpIS5wdXNoKHBhaXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWxsQ29udmVyc2F0aW9uczogU2ltcGxlQ29udmVyc2F0aW9uW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IFssIHN5c3RlbVBhaXJzXSBvZiBwYWlyc0J5U3lzdGVtKSB7XG4gICAgICAgICAgICBjb25zdCBzb3J0ZWRQYWlycyA9IFsuLi5zeXN0ZW1QYWlyc10uc29ydChcbiAgICAgICAgICAgICAgICAoYSwgYikgPT4gbmV3IERhdGUoYS50aW1lc3RhbXApLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIudGltZXN0YW1wKS5nZXRUaW1lKCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBjb252ZXJzYXRpb25UaHJlYWRzID0gbmV3IE1hcDxzdHJpbmcsIFByb2Nlc3NlZFBhaXJbXT4oKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHNvcnRlZFBhaXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBwYWlyLnJlcXVlc3QubWVzc2FnZXMgfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFVzZXJNZXNzYWdlID0gbWVzc2FnZXNbMF07XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEZpcnN0TWVzc2FnZSA9IHRoaXMubm9ybWFsaXplTWVzc2FnZUZvckdyb3VwaW5nKGZpcnN0VXNlck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbktleSA9IEpTT04uc3RyaW5naWZ5KHsgZmlyc3RNZXNzYWdlOiBub3JtYWxpemVkRmlyc3RNZXNzYWdlIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleUhhc2ggPSB0aGlzLmhhc2hTdHJpbmcoY29udmVyc2F0aW9uS2V5KTtcblxuICAgICAgICAgICAgICAgIGlmICghY29udmVyc2F0aW9uVGhyZWFkcy5oYXMoa2V5SGFzaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uVGhyZWFkcy5zZXQoa2V5SGFzaCwgW10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25UaHJlYWRzLmdldChrZXlIYXNoKSEucHVzaChwYWlyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBbY29udmVyc2F0aW9uS2V5LCB0aHJlYWRQYWlyc10gb2YgY29udmVyc2F0aW9uVGhyZWFkcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRocmVhZFBhaXJzID0gWy4uLnRocmVhZFBhaXJzXS5zb3J0KFxuICAgICAgICAgICAgICAgICAgICAoYSwgYikgPT4gbmV3IERhdGUoYS50aW1lc3RhbXApLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIudGltZXN0YW1wKS5nZXRUaW1lKCksXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIExvbmdlc3QgbWVzc2FnZSBsaXN0IFx1MjI0OCBsYXRlc3QgdHVybiBpbiBhIG11bHRpLXJlcXVlc3QgdGhyZWFkXG4gICAgICAgICAgICAgICAgY29uc3QgZmluYWxQYWlyID0gc29ydGVkVGhyZWFkUGFpcnMucmVkdWNlKChsb25nZXN0LCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNZXNzYWdlcyA9IGN1cnJlbnQucmVxdWVzdC5tZXNzYWdlcyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9uZ2VzdE1lc3NhZ2VzID0gbG9uZ2VzdC5yZXF1ZXN0Lm1lc3NhZ2VzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudE1lc3NhZ2VzLmxlbmd0aCA+IGxvbmdlc3RNZXNzYWdlcy5sZW5ndGggPyBjdXJyZW50IDogbG9uZ2VzdDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsc1VzZWQgPSBuZXcgU2V0KHNvcnRlZFRocmVhZFBhaXJzLm1hcCgocGFpcikgPT4gcGFpci5tb2RlbCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuaGFuY2VkTWVzc2FnZXMgPSB0aGlzLnByb2Nlc3NUb29sUmVzdWx0cyhmaW5hbFBhaXIucmVxdWVzdC5tZXNzYWdlcyB8fCBbXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXBpRm9ybWF0RGlzcGxheSA9IGZvcm1hdEFwaUZvcm1hdHNEaXNwbGF5KFxuICAgICAgICAgICAgICAgICAgICBzb3J0ZWRUaHJlYWRQYWlycy5tYXAoKHBhaXIpID0+IHBhaXIuYXBpRm9ybWF0IHx8IFwidW5rbm93blwiKSxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdXNhZ2UgPSBhZ2dyZWdhdGVVc2FnZUZyb21QYWlycyhzb3J0ZWRUaHJlYWRQYWlycyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb252ZXJzYXRpb246IFNpbXBsZUNvbnZlcnNhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuaGFzaFN0cmluZyhjb252ZXJzYXRpb25LZXkpLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbHM6IG1vZGVsc1VzZWQsXG4gICAgICAgICAgICAgICAgICAgIHN5c3RlbTogZmluYWxQYWlyLnJlcXVlc3Quc3lzdGVtLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlczogZW5oYW5jZWRNZXNzYWdlcyxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IGZpbmFsUGFpci5yZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgYWxsUGFpcnM6IHNvcnRlZFRocmVhZFBhaXJzLFxuICAgICAgICAgICAgICAgICAgICBmaW5hbFBhaXI6IGZpbmFsUGFpcixcbiAgICAgICAgICAgICAgICAgICAgYXBpRm9ybWF0RGlzcGxheSxcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogc29ydGVkVGhyZWFkUGFpcnNbMF0udGltZXN0YW1wLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogZmluYWxQYWlyLnRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUGFpcnM6IHNvcnRlZFRocmVhZFBhaXJzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnVzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBhbGxDb252ZXJzYXRpb25zLnB1c2goY29udmVyc2F0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1lcmdlZENvbnZlcnNhdGlvbnMgPSB0aGlzLmRldGVjdEFuZE1lcmdlQ29tcGFjdENvbnZlcnNhdGlvbnMoYWxsQ29udmVyc2F0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgZmlsdGVyZWRDb252ZXJzYXRpb25zID0gb3B0aW9ucy5pbmNsdWRlU2hvcnRDb252ZXJzYXRpb25zXG4gICAgICAgICAgICA/IG1lcmdlZENvbnZlcnNhdGlvbnNcbiAgICAgICAgICAgIDogbWVyZ2VkQ29udmVyc2F0aW9ucy5maWx0ZXIoKGNvbnYpID0+IGNvbnYubWVzc2FnZXMubGVuZ3RoID4gMik7XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkQ29udmVyc2F0aW9ucy5zb3J0KFxuICAgICAgICAgICAgKGEsIGIpID0+IG5ldyBEYXRlKGEubWV0YWRhdGEuc3RhcnRUaW1lKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShiLm1ldGFkYXRhLnN0YXJ0VGltZSkuZ2V0VGltZSgpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIHRvb2xfcmVzdWx0IGJsb2NrcyB0byB0aGVpciB0b29sX3VzZSBtZXNzYWdlcyBhbmQgaGlkZXNcbiAgICAgKiB1c2VyIHR1cm5zIHRoYXQgY29udGFpbiBvbmx5IG9ycGhhbmVkIHRvb2wgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByb2Nlc3NUb29sUmVzdWx0cyhtZXNzYWdlczogTWVzc2FnZVBhcmFtW10pOiBFbmhhbmNlZE1lc3NhZ2VQYXJhbVtdIHtcbiAgICAgICAgY29uc3QgZW5oYW5jZWRNZXNzYWdlczogRW5oYW5jZWRNZXNzYWdlUGFyYW1bXSA9IFtdO1xuICAgICAgICBjb25zdCBwZW5kaW5nVG9vbFVzZXM6IFJlY29yZDxzdHJpbmcsIHsgbWVzc2FnZUluZGV4OiBudW1iZXI7IHRvb2xJbmRleDogbnVtYmVyIH0+ID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldO1xuICAgICAgICAgICAgY29uc3QgZW5oYW5jZWRNZXNzYWdlOiBFbmhhbmNlZE1lc3NhZ2VQYXJhbSA9IHsgLi4ubWVzc2FnZSwgdG9vbFJlc3VsdHM6IHt9LCBoaWRlOiBmYWxzZSB9O1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhc09ubHlUb29sUmVzdWx0cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGV0IGhhc1RleHRDb250ZW50ID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1lc3NhZ2UuY29udGVudC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9jayA9IG1lc3NhZ2UuY29udGVudFtqXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2sudHlwZSA9PT0gXCJ0b29sX3VzZVwiICYmIFwiaWRcIiBpbiBibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9vbFVzZSA9IGJsb2NrIGFzIFRvb2xVc2VCbG9ja1R5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nVG9vbFVzZXNbdG9vbFVzZS5pZF0gPSB7IG1lc3NhZ2VJbmRleDogaSwgdG9vbEluZGV4OiBqIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNPbmx5VG9vbFJlc3VsdHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChibG9jay50eXBlID09PSBcInRvb2xfcmVzdWx0XCIgJiYgXCJ0b29sX3VzZV9pZFwiIGluIGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b29sUmVzdWx0ID0gYmxvY2sgYXMgVG9vbFJlc3VsdEJsb2NrUGFyYW07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b29sVXNlSWQgPSB0b29sUmVzdWx0LnRvb2xfdXNlX2lkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVuZGluZ1Rvb2xVc2VzW3Rvb2xVc2VJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG1lc3NhZ2VJbmRleCB9ID0gcGVuZGluZ1Rvb2xVc2VzW3Rvb2xVc2VJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmhhbmNlZE1lc3NhZ2VzW21lc3NhZ2VJbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5oYW5jZWRNZXNzYWdlc1ttZXNzYWdlSW5kZXhdID0geyAuLi5tZXNzYWdlc1ttZXNzYWdlSW5kZXhdLCB0b29sUmVzdWx0czoge30sIGhpZGU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZXNbbWVzc2FnZUluZGV4XS50b29sUmVzdWx0cyFbdG9vbFVzZUlkXSA9IHRvb2xSZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBlbmRpbmdUb29sVXNlc1t0b29sVXNlSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJsb2NrLnR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNUZXh0Q29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNPbmx5VG9vbFJlc3VsdHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc09ubHlUb29sUmVzdWx0cyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGhhc09ubHlUb29sUmVzdWx0cyAmJiAhaGFzVGV4dENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5oYW5jZWRNZXNzYWdlLmhpZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZW5oYW5jZWRNZXNzYWdlc1tpXSA9IGVuaGFuY2VkTWVzc2FnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbmhhbmNlZE1lc3NhZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVjdHMgQ2xhdWRlIENvZGUgY29tcGFjdGlvbjogYSBzaW5nbGUtcGFpciBjb252ZXJzYXRpb24gd2hvc2UgbWVzc2FnZVxuICAgICAqIGxpc3QgaXMgdHdvIGxvbmdlciB0aGFuIGFuIGVhcmxpZXIgdGhyZWFkIHdpdGggbWF0Y2hpbmcgdGFpbCBtZXNzYWdlcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGRldGVjdEFuZE1lcmdlQ29tcGFjdENvbnZlcnNhdGlvbnMoY29udmVyc2F0aW9uczogU2ltcGxlQ29udmVyc2F0aW9uW10pOiBTaW1wbGVDb252ZXJzYXRpb25bXSB7XG4gICAgICAgIGlmIChjb252ZXJzYXRpb25zLmxlbmd0aCA8PSAxKSByZXR1cm4gY29udmVyc2F0aW9ucztcblxuICAgICAgICBjb25zdCBzb3J0ZWRDb252ZXJzYXRpb25zID0gWy4uLmNvbnZlcnNhdGlvbnNdLnNvcnQoXG4gICAgICAgICAgICAoYSwgYikgPT4gbmV3IERhdGUoYS5tZXRhZGF0YS5zdGFydFRpbWUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIubWV0YWRhdGEuc3RhcnRUaW1lKS5nZXRUaW1lKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdXNlZENvbnZlcnNhdGlvbnMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAgICAgY29uc3QgbWVyZ2VkQ29udmVyc2F0aW9uczogU2ltcGxlQ29udmVyc2F0aW9uW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZENvbnZlcnNhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb252ID0gc29ydGVkQ29udmVyc2F0aW9uc1tpXTtcblxuICAgICAgICAgICAgaWYgKHVzZWRDb252ZXJzYXRpb25zLmhhcyhpKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Q29udi5hbGxQYWlycy5sZW5ndGggPT09IDEgJiYgY3VycmVudENvbnYubWVzc2FnZXMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgIGxldCBvcmlnaW5hbENvbnY6IFNpbXBsZUNvbnZlcnNhdGlvbiB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBvcmlnaW5hbEluZGV4ID0gLTE7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNvcnRlZENvbnZlcnNhdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGkgfHwgdXNlZENvbnZlcnNhdGlvbnMuaGFzKGopKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdGhlckNvbnYgPSBzb3J0ZWRDb252ZXJzYXRpb25zW2pdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvdGhlckNvbnYubWVzc2FnZXMubGVuZ3RoID09PSBjdXJyZW50Q29udi5tZXNzYWdlcy5sZW5ndGggLSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMTsgayA8IG90aGVyQ29udi5tZXNzYWdlcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5tZXNzYWdlc1JvdWdobHlFcXVhbChvdGhlckNvbnYubWVzc2FnZXNba10sIGN1cnJlbnRDb252Lm1lc3NhZ2VzW2tdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc01hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbENvbnYgPSBvdGhlckNvbnY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxJbmRleCA9IGo7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxDb252KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZENvbnYgPSB0aGlzLm1lcmdlQ29tcGFjdENvbnZlcnNhdGlvbihvcmlnaW5hbENvbnYsIGN1cnJlbnRDb252KTtcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VkQ29udmVyc2F0aW9ucy5wdXNoKG1lcmdlZENvbnYpO1xuICAgICAgICAgICAgICAgICAgICB1c2VkQ29udmVyc2F0aW9ucy5hZGQoaSk7XG4gICAgICAgICAgICAgICAgICAgIHVzZWRDb252ZXJzYXRpb25zLmFkZChvcmlnaW5hbEluZGV4KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udi5jb21wYWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBtZXJnZWRDb252ZXJzYXRpb25zLnB1c2goY3VycmVudENvbnYpO1xuICAgICAgICAgICAgICAgICAgICB1c2VkQ29udmVyc2F0aW9ucy5hZGQoaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXJnZWRDb252ZXJzYXRpb25zLnB1c2goY3VycmVudENvbnYpO1xuICAgICAgICAgICAgICAgIHVzZWRDb252ZXJzYXRpb25zLmFkZChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkQ29udmVyc2F0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF1c2VkQ29udmVyc2F0aW9ucy5oYXMoaSkpIHtcbiAgICAgICAgICAgICAgICBtZXJnZWRDb252ZXJzYXRpb25zLnB1c2goc29ydGVkQ29udmVyc2F0aW9uc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVyZ2VkQ29udmVyc2F0aW9ucy5zb3J0KFxuICAgICAgICAgICAgKGEsIGIpID0+IG5ldyBEYXRlKGEubWV0YWRhdGEuc3RhcnRUaW1lKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShiLm1ldGFkYXRhLnN0YXJ0VGltZSkuZ2V0VGltZSgpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbWJpbmVzIHByZS0gYW5kIHBvc3QtY29tcGFjdGlvbiB0aHJlYWRzLCByZXN0b3JpbmcgdGhlIG9yaWdpbmFsIGZpcnN0XG4gICAgICogdXNlciBtZXNzYWdlIHdoaWxlIGtlZXBpbmcgdGhlIGNvbXBhY3RlZCByZXNwb25zZSBhbmQgcGFpciBsaXN0LlxuICAgICAqL1xuICAgIHByaXZhdGUgbWVyZ2VDb21wYWN0Q29udmVyc2F0aW9uKFxuICAgICAgICBvcmlnaW5hbENvbnY6IFNpbXBsZUNvbnZlcnNhdGlvbixcbiAgICAgICAgY29tcGFjdENvbnY6IFNpbXBsZUNvbnZlcnNhdGlvbixcbiAgICApOiBTaW1wbGVDb252ZXJzYXRpb24ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbE1lc3NhZ2VzID0gb3JpZ2luYWxDb252Lm1lc3NhZ2VzIHx8IFtdO1xuICAgICAgICBjb25zdCBjb21wYWN0TWVzc2FnZXMgPSBjb21wYWN0Q29udi5tZXNzYWdlcyB8fCBbXTtcblxuICAgICAgICBjb25zdCBtZXJnZWRNZXNzYWdlcyA9IFsuLi5jb21wYWN0TWVzc2FnZXNdO1xuICAgICAgICBpZiAob3JpZ2luYWxNZXNzYWdlcy5sZW5ndGggPiAwICYmIG1lcmdlZE1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1lcmdlZE1lc3NhZ2VzWzBdID0gb3JpZ2luYWxNZXNzYWdlc1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFsbFBhaXJzID0gWy4uLm9yaWdpbmFsQ29udi5hbGxQYWlycywgLi4uY29tcGFjdENvbnYuYWxsUGFpcnNdLnNvcnQoXG4gICAgICAgICAgICAoYSwgYikgPT4gbmV3IERhdGUoYS50aW1lc3RhbXApLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIudGltZXN0YW1wKS5nZXRUaW1lKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYWxsTW9kZWxzID0gbmV3IFNldChbLi4ub3JpZ2luYWxDb252Lm1vZGVscywgLi4uY29tcGFjdENvbnYubW9kZWxzXSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGFsbFBhaXJzWzBdLnRpbWVzdGFtcDtcbiAgICAgICAgY29uc3QgZW5kVGltZSA9IGFsbFBhaXJzW2FsbFBhaXJzLmxlbmd0aCAtIDFdLnRpbWVzdGFtcDtcbiAgICAgICAgY29uc3QgYXBpRm9ybWF0RGlzcGxheSA9IGZvcm1hdEFwaUZvcm1hdHNEaXNwbGF5KFxuICAgICAgICAgICAgYWxsUGFpcnMubWFwKChwYWlyKSA9PiBwYWlyLmFwaUZvcm1hdCB8fCBcInVua25vd25cIiksXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdXNhZ2UgPSBhZ2dyZWdhdGVVc2FnZUZyb21QYWlycyhhbGxQYWlycyk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBjb21wYWN0Q29udi5pZCxcbiAgICAgICAgICAgIG1vZGVsczogYWxsTW9kZWxzLFxuICAgICAgICAgICAgc3lzdGVtOiBvcmlnaW5hbENvbnYuc3lzdGVtLFxuICAgICAgICAgICAgbWVzc2FnZXM6IG1lcmdlZE1lc3NhZ2VzLFxuICAgICAgICAgICAgcmVzcG9uc2U6IGNvbXBhY3RDb252LnJlc3BvbnNlLFxuICAgICAgICAgICAgYWxsUGFpcnM6IGFsbFBhaXJzLFxuICAgICAgICAgICAgZmluYWxQYWlyOiBjb21wYWN0Q29udi5maW5hbFBhaXIsXG4gICAgICAgICAgICBjb21wYWN0ZWQ6IHRydWUsXG4gICAgICAgICAgICBhcGlGb3JtYXREaXNwbGF5LFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICBzdGFydFRpbWU6IHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBlbmRUaW1lOiBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIHRvdGFsUGFpcnM6IGFsbFBhaXJzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAuLi51c2FnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9vc2UgZXF1YWxpdHkgY2hlY2sgZm9yIGNvbXBhY3Rpb24gcGFpcmluZyBcdTIwMTQgY29tcGFyZXMgcm9sZSBhbmQgY29udGVudCBzaGFwZSBvbmx5LlxuICAgICAqL1xuICAgIHByaXZhdGUgbWVzc2FnZXNSb3VnaGx5RXF1YWwobXNnMTogTWVzc2FnZVBhcmFtLCBtc2cyOiBNZXNzYWdlUGFyYW0pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG1zZzEucm9sZSAhPT0gbXNnMi5yb2xlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgY29udGVudDEgPSBtc2cxLmNvbnRlbnQ7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQyID0gbXNnMi5jb250ZW50O1xuXG4gICAgICAgIGlmICh0eXBlb2YgY29udGVudDEgIT09IHR5cGVvZiBjb250ZW50MikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZW50MSkgIT09IEFycmF5LmlzQXJyYXkoY29udGVudDIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyaXBzIHZvbGF0aWxlIHN1YnN0cmluZ3MgZnJvbSB0aGUgZmlyc3QgbWVzc2FnZSBzbyB0aHJlYWRpbmcga2V5cyBzdGF5XG4gICAgICogc3RhYmxlIGFjcm9zcyByZXRyaWVzICh0aW1lc3RhbXBzLCBJREUgb3BlbiBldmVudHMsIHN5c3RlbSByZW1pbmRlcnMpLlxuICAgICAqL1xuICAgIHByaXZhdGUgbm9ybWFsaXplTWVzc2FnZUZvckdyb3VwaW5nKG1lc3NhZ2U6IE1lc3NhZ2VQYXJhbSk6IE1lc3NhZ2VQYXJhbSB7XG4gICAgICAgIGlmICghbWVzc2FnZSB8fCAhbWVzc2FnZS5jb250ZW50KSByZXR1cm4gbWVzc2FnZTtcblxuICAgICAgICBsZXQgbm9ybWFsaXplZENvbnRlbnQ6IHN0cmluZyB8IENvbnRlbnRCbG9ja1BhcmFtW107XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSkge1xuICAgICAgICAgICAgbm9ybWFsaXplZENvbnRlbnQgPSBtZXNzYWdlLmNvbnRlbnQubWFwKChibG9jaykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChibG9jay50eXBlID09PSBcInRleHRcIiAmJiBcInRleHRcIiBpbiBibG9jaykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IGJsb2NrLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL0dlbmVyYXRlZCBcXGR7NH0tXFxkezJ9LVxcZHsyfSBcXGR7Mn06XFxkezJ9OlxcZHsyfS9nLCBcIkdlbmVyYXRlZCBbVElNRVNUQU1QXVwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvVGhlIHVzZXIgb3BlbmVkIHRoZSBmaWxlIFteXFxzXSsgaW4gdGhlIElERVxcLi9nLCBcIlRoZSB1c2VyIG9wZW5lZCBmaWxlIGluIElERS5cIik7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLzxzeXN0ZW0tcmVtaW5kZXI+Lio/PFxcL3N5c3RlbS1yZW1pbmRlcj4vZ3MsIFwiW1NZU1RFTS1SRU1JTkRFUl1cIik7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLzxFWFRSRU1FTFlfSU1QT1JUQU5UPi4qPzxcXC9FWFRSRU1FTFlfSU1QT1JUQU5UPi9ncywgXCJbRVhUUkVNRUxZLUlNUE9SVEFOVF1cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiB0ZXh0IH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBibG9jaztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9ybWFsaXplZENvbnRlbnQgPSBtZXNzYWdlLmNvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcm9sZTogbWVzc2FnZS5yb2xlLFxuICAgICAgICAgICAgY29udGVudDogbm9ybWFsaXplZENvbnRlbnQsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2ltcGxlIHN0cmluZyBoYXNoIGZvciBjb252ZXJzYXRpb24gZ3JvdXBpbmcga2V5cyAobm90IGNyeXB0b2dyYXBoaWMpLlxuICAgICAqL1xuICAgIHByaXZhdGUgaGFzaFN0cmluZyhzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBoYXNoID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBjaGFyO1xuICAgICAgICAgICAgaGFzaCA9IGhhc2ggJiBoYXNoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLmFicyhoYXNoKS50b1N0cmluZygpO1xuICAgIH1cbn1cbiIsICIvKipcbiAqIEBmaWxlIFJvb3QgTGl0IGFwcGxpY2F0aW9uIGZvciB0aGUgc2VsZi1jb250YWluZWQgdHJhY2UgSFRNTCB2aWV3ZXIuXG4gKlxuICogUmVhZHMgYmFzZTY0LWRlY29kZWQgc2Vzc2lvbiBkYXRhIGZyb20gYHdpbmRvdy5jbGF1ZGVEYXRhYCwgcHJvY2Vzc2VzIHJhd1xuICogcGFpcnMgaW50byBjb252ZXJzYXRpb25zIHZpYSB7QGxpbmsgU2hhcmVkQ29udmVyc2F0aW9uUHJvY2Vzc29yfSwgYW5kXG4gKiBzd2l0Y2hlcyBiZXR3ZWVuIGNvbnZlcnNhdGlvbiwgcmF3LCBhbmQgSlNPTiBkZWJ1ZyB2aWV3cyB3aXRoIG1vZGVsIGZpbHRlcmluZy5cbiAqL1xuXG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSBcImxpdFwiO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgc3RhdGUgfSBmcm9tIFwibGl0L2RlY29yYXRvcnMuanNcIjtcbmltcG9ydCB7IENsYXVkZURhdGEgfSBmcm9tIFwiLi4vLi4vc3JjL3R5cGVzXCI7XG5pbXBvcnQge1xuXHRTaGFyZWRDb252ZXJzYXRpb25Qcm9jZXNzb3IsXG5cdFNpbXBsZUNvbnZlcnNhdGlvbixcblx0UHJvY2Vzc2VkUGFpcixcbn0gZnJvbSBcIi4uLy4uL3NyYy9yZXBvcnQvc2hhcmVkLWNvbnZlcnNhdGlvbi1wcm9jZXNzb3JcIjtcblxuLyoqIFRvcC1sZXZlbCB0cmFjZSB2aWV3ZXIgc2hlbGwgbW91bnRlZCBvbiBgI2FwcGAgaW4gZ2VuZXJhdGVkIEhUTUwgcmVwb3J0cy4gKi9cbkBjdXN0b21FbGVtZW50KFwiY2xhdWRlLWFwcFwiKVxuZXhwb3J0IGNsYXNzIENsYXVkZUFwcCBleHRlbmRzIExpdEVsZW1lbnQge1xuXHRAc3RhdGUoKSBwcml2YXRlIGRhdGE6IENsYXVkZURhdGEgPSB7IHJhd1BhaXJzOiBbXSB9O1xuXHRAc3RhdGUoKSBwcml2YXRlIGNvbnZlcnNhdGlvbnM6IFNpbXBsZUNvbnZlcnNhdGlvbltdID0gW107XG5cdEBzdGF0ZSgpIHByaXZhdGUgcHJvY2Vzc2VkUGFpcnM6IFByb2Nlc3NlZFBhaXJbXSA9IFtdO1xuXHRAc3RhdGUoKSBwcml2YXRlIGN1cnJlbnRWaWV3OiBcImNvbnZlcnNhdGlvbnNcIiB8IFwicmF3XCIgfCBcImpzb25cIiA9IFwiY29udmVyc2F0aW9uc1wiO1xuXHRAc3RhdGUoKSBwcml2YXRlIHNlbGVjdGVkTW9kZWxzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuXHQvKipcblx0ICogUmVuZGVyIGludG8gdGhlIGxpZ2h0IERPTSBzbyBUYWlsd2luZCB1dGlsaXR5IGNsYXNzZXMgZnJvbSB0aGUgaW5qZWN0ZWRcblx0ICogc3R5bGVzaGVldCBhcHBseSB0byBjaGlsZCBlbGVtZW50cyAoc2hhZG93IERPTSB3b3VsZCBpc29sYXRlIHN0eWxlcykuXG5cdCAqL1xuXHRjcmVhdGVSZW5kZXJSb290KCkge1xuXHRcdGNvbnNvbGUubG9nKFwiY3JlYXRlUmVuZGVyUm9vdFwiKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBMb2FkcyBlbWJlZGRlZCB0cmFjZSBkYXRhIGFuZCBydW5zIHRoZSBzaGFyZWQgY29udmVyc2F0aW9uIHBpcGVsaW5lLiAqL1xuXHRjb25uZWN0ZWRDYWxsYmFjaygpIHtcblx0XHRzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXHRcdHRoaXMuZGF0YSA9IHdpbmRvdy5jbGF1ZGVEYXRhIHx8IHsgcmF3UGFpcnM6IFtdIH07XG5cdFx0dGhpcy5wcm9jZXNzRGF0YSgpO1xuXHR9XG5cblx0LyoqIE5vcm1hbGl6ZXMgcmF3IHBhaXJzIGFuZCBidWlsZHMgY29udmVyc2F0aW9uIHRocmVhZHMgZm9yIHRoZSBVSS4gKi9cblx0cHJpdmF0ZSBwcm9jZXNzRGF0YSgpIHtcblx0XHRjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG5cdFx0Ly8gVXNlIHNoYXJlZCBwcm9jZXNzb3IgZm9yIGJvdGggcHJvY2Vzc2VkIHBhaXJzIGFuZCBjb252ZXJzYXRpb25zXG5cdFx0Y29uc3QgcHJvY2Vzc29yID0gbmV3IFNoYXJlZENvbnZlcnNhdGlvblByb2Nlc3NvcigpO1xuXG5cdFx0Ly8gUHJvY2VzcyByYXcgcGFpcnMgdXNpbmcgc2hhcmVkIHByb2Nlc3NvclxuXHRcdHRoaXMucHJvY2Vzc2VkUGFpcnMgPSBwcm9jZXNzb3IucHJvY2Vzc1Jhd1BhaXJzKHRoaXMuZGF0YS5yYXdQYWlycyk7XG5cdFx0Ly8gQ2hlY2sgZm9yIGluY2x1ZGUgYWxsIHJlcXVlc3RzIGZsYWcgZnJvbSBlbnZpcm9ubWVudCBvciBkYXRhXG5cdFx0Y29uc3QgaW5jbHVkZUFsbFJlcXVlc3RzID0gdGhpcy5kYXRhLm1ldGFkYXRhPy5pbmNsdWRlQWxsUmVxdWVzdHMgfHwgZmFsc2U7XG5cdFx0dGhpcy5jb252ZXJzYXRpb25zID0gcHJvY2Vzc29yLm1lcmdlQ29udmVyc2F0aW9ucyh0aGlzLnByb2Nlc3NlZFBhaXJzLCB7XG5cdFx0XHRpbmNsdWRlU2hvcnRDb252ZXJzYXRpb25zOiBpbmNsdWRlQWxsUmVxdWVzdHMsXG5cdFx0fSk7XG5cblx0XHQvLyBDb2xsZWN0IGV2ZXJ5IG1vZGVsIG5hbWUgc2VlbiBhY3Jvc3MgY29udmVyc2F0aW9ucywgcHJvY2Vzc2VkIHBhaXJzLCBhbmQgcmF3IGxvZ3Ncblx0XHRjb25zdCBjb252ZXJzYXRpb25Nb2RlbHMgPSBuZXcgU2V0KHRoaXMuY29udmVyc2F0aW9ucy5mbGF0TWFwKChjKSA9PiBBcnJheS5mcm9tKGMubW9kZWxzKSkpO1xuXHRcdGNvbnN0IHByb2Nlc3NlZFBhaXJNb2RlbHMgPSBuZXcgU2V0KHRoaXMucHJvY2Vzc2VkUGFpcnMubWFwKChwKSA9PiBwLm1vZGVsKSk7XG5cdFx0Y29uc3QgcmF3UGFpck1vZGVscyA9IG5ldyBTZXQodGhpcy5kYXRhLnJhd1BhaXJzLm1hcCgocGFpcikgPT4gcGFpci5yZXF1ZXN0LmJvZHk/Lm1vZGVsIHx8IFwidW5rbm93blwiKSk7XG5cdFx0Y29uc3QgYWxsTW9kZWxzID0gbmV3IFNldChbLi4uY29udmVyc2F0aW9uTW9kZWxzLCAuLi5wcm9jZXNzZWRQYWlyTW9kZWxzLCAuLi5yYXdQYWlyTW9kZWxzXSk7XG5cblx0XHQvLyBTZWxlY3QgYWxsIG1vZGVscyBieSBkZWZhdWx0IChpbmNsdWRpbmcgaGFpa3UpXG5cdFx0dGhpcy5zZWxlY3RlZE1vZGVscyA9IGFsbE1vZGVscztcblx0XHRjb25zb2xlLmxvZyhgUHJvY2Vzc2VkIGRhdGEgaW4gJHtwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0fW1zYCk7XG5cdH1cblxuXHQvKiogU3dpdGNoZXMgdGhlIGFjdGl2ZSB0YWI6IGNvbnZlcnNhdGlvbnMsIHJhdyBjYWxscywgb3IgSlNPTiBkZWJ1Zy4gKi9cblx0cHJpdmF0ZSBzd2l0Y2hWaWV3KHZpZXc6IFwiY29udmVyc2F0aW9uc1wiIHwgXCJyYXdcIiB8IFwianNvblwiKSB7XG5cdFx0dGhpcy5jdXJyZW50VmlldyA9IHZpZXc7XG5cdH1cblxuXHQvKiogVG9nZ2xlcyBhIG1vZGVsIGluIHRoZSBmaWx0ZXIgc2V0OyB0cmlnZ2VycyBMaXQgcmUtcmVuZGVyIHZpYSBuZXcgU2V0IHJlZmVyZW5jZS4gKi9cblx0cHJpdmF0ZSB0b2dnbGVNb2RlbChtb2RlbDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgbmV3U2VsZWN0ZWRNb2RlbHMgPSBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRNb2RlbHMpO1xuXHRcdGlmIChuZXdTZWxlY3RlZE1vZGVscy5oYXMobW9kZWwpKSB7XG5cdFx0XHRuZXdTZWxlY3RlZE1vZGVscy5kZWxldGUobW9kZWwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRuZXdTZWxlY3RlZE1vZGVscy5hZGQobW9kZWwpO1xuXHRcdH1cblx0XHR0aGlzLnNlbGVjdGVkTW9kZWxzID0gbmV3U2VsZWN0ZWRNb2RlbHM7XG5cdH1cblxuXHQvKiogQ29udmVyc2F0aW9ucyB3aGVyZSBhdCBsZWFzdCBvbmUgbW9kZWwgaXMgY3VycmVudGx5IHNlbGVjdGVkLiAqL1xuXHRwcml2YXRlIGdldCBmaWx0ZXJlZENvbnZlcnNhdGlvbnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29udmVyc2F0aW9ucy5maWx0ZXIoKGMpID0+IHtcblx0XHRcdC8vIFNob3cgY29udmVyc2F0aW9uIGlmIEFOWSBvZiBpdHMgbW9kZWxzIGFyZSBzZWxlY3RlZFxuXHRcdFx0cmV0dXJuIEFycmF5LmZyb20oYy5tb2RlbHMpLnNvbWUoKG1vZGVsKSA9PiB0aGlzLnNlbGVjdGVkTW9kZWxzLmhhcyhtb2RlbCkpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqIFByb2Nlc3NlZCBwYWlycyBmaWx0ZXJlZCBieSBzZWxlY3RlZCBtb2RlbHMgKEpTT04gZGVidWcgdmlldykuICovXG5cdHByaXZhdGUgZ2V0IGZpbHRlcmVkUHJvY2Vzc2VkUGFpcnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc2VkUGFpcnMuZmlsdGVyKChwYWlyKSA9PiB0aGlzLnNlbGVjdGVkTW9kZWxzLmhhcyhwYWlyLm1vZGVsKSk7XG5cdH1cblxuXHQvKiogUmF3IHBhaXJzIGZpbHRlcmVkIGJ5IHNlbGVjdGVkIG1vZGVscyAodW51c2VkIFx1MjAxNCByYXcgdmlldyBzaG93cyBhbGwpLiAqL1xuXHRwcml2YXRlIGdldCBmaWx0ZXJlZFJhd1BhaXJzKCkge1xuXHRcdHJldHVybiB0aGlzLmRhdGEucmF3UGFpcnMuZmlsdGVyKChwYWlyKSA9PiB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IHBhaXIucmVxdWVzdC5ib2R5Py5tb2RlbCB8fCBcInVua25vd25cIjtcblx0XHRcdHJldHVybiB0aGlzLnNlbGVjdGVkTW9kZWxzLmhhcyhtb2RlbCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKiogQWxsIHJhdyBwYWlycyB3aXRoIGEgbm9uLW51bGwgcmVzcG9uc2UgXHUyMDE0IG5vIG1vZGVsIGZpbHRlciBhcHBsaWVkLiAqL1xuXHRwcml2YXRlIGdldCBhbGxSYXdQYWlycygpIHtcblx0XHQvLyBEZWJ1ZyB2aWV3IHNob3dzIEFMTCByYXcgcGFpcnMgd2l0aG91dCBhbnkgZmlsdGVyaW5nXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5yYXdQYWlycy5maWx0ZXIoKHBhaXIpID0+IHBhaXIucmVzcG9uc2UgIT09IG51bGwpO1xuXHR9XG5cblx0LyoqIENvdW50IG9mIGNvbnZlcnNhdGlvbnMgcGVyIG1vZGVsIGZvciB0aGUgZmlsdGVyIGNoZWNrYm94IHJvdy4gKi9cblx0cHJpdmF0ZSBnZXQgbW9kZWxDb3VudHMoKSB7XG5cdFx0Y29uc3QgY291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblx0XHR0aGlzLmNvbnZlcnNhdGlvbnMuZm9yRWFjaCgoYykgPT4ge1xuXHRcdFx0Ly8gQ291bnQgZWFjaCBtb2RlbCB1c2VkIGluIGNvbnZlcnNhdGlvbnNcblx0XHRcdEFycmF5LmZyb20oYy5tb2RlbHMpLmZvckVhY2goKG1vZGVsKSA9PiB7XG5cdFx0XHRcdGNvdW50cy5zZXQobW9kZWwsIChjb3VudHMuZ2V0KG1vZGVsKSB8fCAwKSArIDEpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGNvdW50cztcblx0fVxuXG5cdC8qKiBSZXNvbHZlcyB0aGUgdG9vbC1zcGVjaWZpYyBicmFuZCBzdHJpbmcgZm9yIHRoZSBwYWdlIGhlYWRlci4gKi9cblx0cHJpdmF0ZSBnZXRCcmFuZE5hbWUoKTogc3RyaW5nIHtcblx0XHRjb25zdCB0b29sID0gdGhpcy5kYXRhLm1ldGFkYXRhPy50b29sIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRpZiAodG9vbCA9PT0gXCJjbGF1ZGVcIikgcmV0dXJuIFwiY2xhdWRlLXRyYWNlXCI7XG5cdFx0aWYgKHRvb2wgPT09IFwib3BlbmNvZGVcIikgcmV0dXJuIFwib3BlbmNvZGUtdHJhY2VcIjtcblx0XHRpZiAodG9vbCA9PT0gXCJjb2RleFwiKSByZXR1cm4gXCJjb2RleC10cmFjZVwiO1xuXHRcdHJldHVybiBcInRyYWNlXCI7XG5cdH1cblxuXHQvKiogTWFpbiBsYXlvdXQ6IGhlYWRlciwgdmlldyB0YWJzLCBtb2RlbCBmaWx0ZXJzLCBhbmQgYWN0aXZlIHZpZXcgY29udGVudC4gKi9cblx0cmVuZGVyKCkge1xuXHRcdGNvbnN0IG1vZGVsQ291bnRzID0gdGhpcy5tb2RlbENvdW50cztcblx0XHRjb25zdCBmaWx0ZXJlZENvbnZlcnNhdGlvbnMgPSB0aGlzLmZpbHRlcmVkQ29udmVyc2F0aW9ucztcblxuXHRcdHJldHVybiBodG1sYFxuXHRcdFx0PGRpdiBjbGFzcz1cIm1pbi1oLXNjcmVlbiBiZy12cy1iZyB0ZXh0LXZzLXRleHQgZm9udC1tb25vXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJtYXgtdy1bNjBlbV0gbXgtYXV0byBwLTRcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWItOFwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1iLTQgdGV4dC1jZW50ZXJcIj5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJ0ZXh0LXZzLWZ1bmN0aW9uXCI+fiAke3RoaXMuZ2V0QnJhbmROYW1lKCl9PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInRleHQtdnMtbXV0ZWQgbWwtOFwiPiR7dGhpcy5kYXRhLnRpbWVzdGFtcCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9PC9zcGFuPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYi04IHRleHQtY2VudGVyXCI+XG5cdFx0XHRcdFx0XHRcdDxzcGFuXG5cdFx0XHRcdFx0XHRcdFx0QGNsaWNrPSR7KCkgPT4gdGhpcy5zd2l0Y2hWaWV3KFwiY29udmVyc2F0aW9uc1wiKX1cblx0XHRcdFx0XHRcdFx0XHRjbGFzcz1cImN1cnNvci1wb2ludGVyIG1yLTEyICR7dGhpcy5jdXJyZW50VmlldyA9PT0gXCJjb252ZXJzYXRpb25zXCJcblx0XHRcdFx0XHRcdFx0XHRcdD8gXCJ0ZXh0LXZzLW5hdi1hY3RpdmVcIlxuXHRcdFx0XHRcdFx0XHRcdFx0OiBcInRleHQtdnMtdGV4dCBob3Zlcjp0ZXh0LXZzLWFjY2VudFwifVwiXG5cdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRjb252ZXJzYXRpb25zICgke2ZpbHRlcmVkQ29udmVyc2F0aW9ucy5sZW5ndGh9KVxuXHRcdFx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdDxzcGFuXG5cdFx0XHRcdFx0XHRcdFx0QGNsaWNrPSR7KCkgPT4gdGhpcy5zd2l0Y2hWaWV3KFwicmF3XCIpfVxuXHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbXItMTIgJHt0aGlzLmN1cnJlbnRWaWV3ID09PSBcInJhd1wiXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IFwidGV4dC12cy1uYXYtYWN0aXZlXCJcblx0XHRcdFx0XHRcdFx0XHRcdDogXCJ0ZXh0LXZzLXRleHQgaG92ZXI6dGV4dC12cy1hY2NlbnRcIn1cIlxuXHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0cmF3IGNhbGxzICgke3RoaXMuYWxsUmF3UGFpcnMubGVuZ3RofSlcblx0XHRcdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8c3BhblxuXHRcdFx0XHRcdFx0XHRcdEBjbGljaz0keygpID0+IHRoaXMuc3dpdGNoVmlldyhcImpzb25cIil9XG5cdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJjdXJzb3ItcG9pbnRlciBtci0xMiAke3RoaXMuY3VycmVudFZpZXcgPT09IFwianNvblwiXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IFwidGV4dC12cy1uYXYtYWN0aXZlXCJcblx0XHRcdFx0XHRcdFx0XHRcdDogXCJ0ZXh0LXZzLXRleHQgaG92ZXI6dGV4dC12cy1hY2NlbnRcIn1cIlxuXHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0anNvbiBkZWJ1ZyAoJHt0aGlzLmZpbHRlcmVkUHJvY2Vzc2VkUGFpcnMubGVuZ3RofSlcblx0XHRcdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdCR7bW9kZWxDb3VudHMuc2l6ZSA+IDEgJiYgdGhpcy5jdXJyZW50VmlldyAhPT0gXCJyYXdcIlxuXHRcdFx0XHRcdFx0XHQ/IGh0bWxgXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWItNCB0ZXh0LWNlbnRlclwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQke0FycmF5LmZyb20obW9kZWxDb3VudHMuZW50cmllcygpKS5tYXAoKFttb2RlbCwgX2NvdW50XSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBodG1sYFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0QGNsaWNrPSR7KCkgPT4gdGhpcy50b2dnbGVNb2RlbChtb2RlbCl9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgaG92ZXI6dGV4dC12cy1hY2NlbnQgbXItOFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR7dGhpcy5zZWxlY3RlZE1vZGVscy5oYXMobW9kZWwpID8gXCJbeF1cIiA6IFwiWyBdXCJ9ICR7bW9kZWx9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSl9XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRgXG5cdFx0XHRcdFx0XHRcdDogXCJcIn1cblx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0XHQke3RoaXMuY3VycmVudFZpZXcgPT09IFwiY29udmVyc2F0aW9uc1wiXG5cdFx0XHRcdFx0XHRcdD8gaHRtbGBcblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgaWQ9XCJjb252ZXJzYXRpb25zLXZpZXdcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0JHtmaWx0ZXJlZENvbnZlcnNhdGlvbnMubGVuZ3RoID09PSAwXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBodG1sYDxkaXY+Tm8gY29udmVyc2F0aW9ucyBmb3VuZCBmb3Igc2VsZWN0ZWQgbW9kZWxzLjwvZGl2PmBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IGh0bWxgPHNpbXBsZS1jb252ZXJzYXRpb24tdmlld1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuY29udmVyc2F0aW9ucz0ke2ZpbHRlcmVkQ29udmVyc2F0aW9uc31cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD48L3NpbXBsZS1jb252ZXJzYXRpb24tdmlldz5gfVxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0YFxuXHRcdFx0XHRcdFx0XHQ6IFwiXCJ9XG5cdFx0XHRcdFx0XHQke3RoaXMuY3VycmVudFZpZXcgPT09IFwicmF3XCJcblx0XHRcdFx0XHRcdFx0PyBodG1sYFxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBpZD1cInJhdy12aWV3XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCR7dGhpcy5hbGxSYXdQYWlycy5sZW5ndGggPT09IDBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IGh0bWxgPGRpdj5ObyByYXcgcGFpcnMgZm91bmQuPC9kaXY+YFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogaHRtbGA8cmF3LXBhaXJzLXZpZXcgLnJhd1BhaXJzPSR7dGhpcy5hbGxSYXdQYWlyc30+PC9yYXctcGFpcnMtdmlldz5gfVxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0YFxuXHRcdFx0XHRcdFx0XHQ6IFwiXCJ9XG5cdFx0XHRcdFx0XHQke3RoaXMuY3VycmVudFZpZXcgPT09IFwianNvblwiXG5cdFx0XHRcdFx0XHRcdD8gaHRtbGBcblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgaWQ9XCJqc29uLXZpZXdcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0JHt0aGlzLmZpbHRlcmVkUHJvY2Vzc2VkUGFpcnMubGVuZ3RoID09PSAwXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBodG1sYDxkaXY+Tm8gcHJvY2Vzc2VkIHBhaXJzIGZvdW5kIGZvciBzZWxlY3RlZCBtb2RlbHMuPC9kaXY+YFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDogaHRtbGA8anNvbi12aWV3IC5wcm9jZXNzZWRQYWlycz0ke3RoaXMuZmlsdGVyZWRQcm9jZXNzZWRQYWlyc30+PC9qc29uLXZpZXc+YH1cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdGBcblx0XHRcdFx0XHRcdFx0OiBcIlwifVxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdGA7XG5cdH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuaW1wb3J0IHtEaXNjb25uZWN0YWJsZSwgUGFydH0gZnJvbSAnLi9saXQtaHRtbC5qcyc7XG5cbmV4cG9ydCB7XG4gIEF0dHJpYnV0ZVBhcnQsXG4gIEJvb2xlYW5BdHRyaWJ1dGVQYXJ0LFxuICBDaGlsZFBhcnQsXG4gIEVsZW1lbnRQYXJ0LFxuICBFdmVudFBhcnQsXG4gIFBhcnQsXG4gIFByb3BlcnR5UGFydCxcbn0gZnJvbSAnLi9saXQtaHRtbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0aXZlQ2xhc3Mge1xuICBuZXcgKHBhcnQ6IFBhcnRJbmZvKTogRGlyZWN0aXZlO1xufVxuXG4vKipcbiAqIFRoaXMgdXRpbGl0eSB0eXBlIGV4dHJhY3RzIHRoZSBzaWduYXR1cmUgb2YgYSBkaXJlY3RpdmUgY2xhc3MncyByZW5kZXIoKVxuICogbWV0aG9kIHNvIHdlIGNhbiB1c2UgaXQgZm9yIHRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgZGlyZWN0aXZlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBEaXJlY3RpdmVQYXJhbWV0ZXJzPEMgZXh0ZW5kcyBEaXJlY3RpdmU+ID0gUGFyYW1ldGVyczxDWydyZW5kZXInXT47XG5cbi8qKlxuICogQSBnZW5lcmF0ZWQgZGlyZWN0aXZlIGZ1bmN0aW9uIGRvZXNuJ3QgZXZhbHVhdGUgdGhlIGRpcmVjdGl2ZSwgYnV0IGp1c3RcbiAqIHJldHVybnMgYSBEaXJlY3RpdmVSZXN1bHQgb2JqZWN0IHRoYXQgY2FwdHVyZXMgdGhlIGFyZ3VtZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmVSZXN1bHQ8QyBleHRlbmRzIERpcmVjdGl2ZUNsYXNzID0gRGlyZWN0aXZlQ2xhc3M+IHtcbiAgLyoqXG4gICAqIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgWydfJGxpdERpcmVjdGl2ZSQnXTogQztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICB2YWx1ZXM6IERpcmVjdGl2ZVBhcmFtZXRlcnM8SW5zdGFuY2VUeXBlPEM+Pjtcbn1cblxuZXhwb3J0IGNvbnN0IFBhcnRUeXBlID0ge1xuICBBVFRSSUJVVEU6IDEsXG4gIENISUxEOiAyLFxuICBQUk9QRVJUWTogMyxcbiAgQk9PTEVBTl9BVFRSSUJVVEU6IDQsXG4gIEVWRU5UOiA1LFxuICBFTEVNRU5UOiA2LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgUGFydFR5cGUgPSAodHlwZW9mIFBhcnRUeXBlKVtrZXlvZiB0eXBlb2YgUGFydFR5cGVdO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoaWxkUGFydEluZm8ge1xuICByZWFkb25seSB0eXBlOiB0eXBlb2YgUGFydFR5cGUuQ0hJTEQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXR0cmlidXRlUGFydEluZm8ge1xuICByZWFkb25seSB0eXBlOlxuICAgIHwgdHlwZW9mIFBhcnRUeXBlLkFUVFJJQlVURVxuICAgIHwgdHlwZW9mIFBhcnRUeXBlLlBST1BFUlRZXG4gICAgfCB0eXBlb2YgUGFydFR5cGUuQk9PTEVBTl9BVFRSSUJVVEVcbiAgICB8IHR5cGVvZiBQYXJ0VHlwZS5FVkVOVDtcbiAgcmVhZG9ubHkgc3RyaW5ncz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPjtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0YWdOYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFBhcnRJbmZvIHtcbiAgcmVhZG9ubHkgdHlwZTogdHlwZW9mIFBhcnRUeXBlLkVMRU1FTlQ7XG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcnQgYSBkaXJlY3RpdmUgaXMgYm91bmQgdG8uXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgZm9yIGNoZWNraW5nIHRoYXQgYSBkaXJlY3RpdmUgaXMgYXR0YWNoZWQgdG8gYSB2YWxpZCBwYXJ0LFxuICogc3VjaCBhcyB3aXRoIGRpcmVjdGl2ZSB0aGF0IGNhbiBvbmx5IGJlIHVzZWQgb24gYXR0cmlidXRlIGJpbmRpbmdzLlxuICovXG5leHBvcnQgdHlwZSBQYXJ0SW5mbyA9IENoaWxkUGFydEluZm8gfCBBdHRyaWJ1dGVQYXJ0SW5mbyB8IEVsZW1lbnRQYXJ0SW5mbztcblxuLyoqXG4gKiBDcmVhdGVzIGEgdXNlci1mYWNpbmcgZGlyZWN0aXZlIGZ1bmN0aW9uIGZyb20gYSBEaXJlY3RpdmUgY2xhc3MuIFRoaXNcbiAqIGZ1bmN0aW9uIGhhcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIHRoZSBkaXJlY3RpdmUncyByZW5kZXIoKSBtZXRob2QuXG4gKi9cbmV4cG9ydCBjb25zdCBkaXJlY3RpdmUgPVxuICA8QyBleHRlbmRzIERpcmVjdGl2ZUNsYXNzPihjOiBDKSA9PlxuICAoLi4udmFsdWVzOiBEaXJlY3RpdmVQYXJhbWV0ZXJzPEluc3RhbmNlVHlwZTxDPj4pOiBEaXJlY3RpdmVSZXN1bHQ8Qz4gPT4gKHtcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIFsnXyRsaXREaXJlY3RpdmUkJ106IGMsXG4gICAgdmFsdWVzLFxuICB9KTtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBjcmVhdGluZyBjdXN0b20gZGlyZWN0aXZlcy4gVXNlcnMgc2hvdWxkIGV4dGVuZCB0aGlzIGNsYXNzLFxuICogaW1wbGVtZW50IGByZW5kZXJgIGFuZC9vciBgdXBkYXRlYCwgYW5kIHRoZW4gcGFzcyB0aGVpciBzdWJjbGFzcyB0b1xuICogYGRpcmVjdGl2ZWAuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEaXJlY3RpdmUgaW1wbGVtZW50cyBEaXNjb25uZWN0YWJsZSB7XG4gIC8vQGludGVybmFsXG4gIF9fcGFydCE6IFBhcnQ7XG4gIC8vQGludGVybmFsXG4gIF9fYXR0cmlidXRlSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLy9AaW50ZXJuYWxcbiAgX19kaXJlY3RpdmU/OiBEaXJlY3RpdmU7XG5cbiAgLy9AaW50ZXJuYWxcbiAgXyRwYXJlbnQhOiBEaXNjb25uZWN0YWJsZTtcblxuICAvLyBUaGVzZSB3aWxsIG9ubHkgZXhpc3Qgb24gdGhlIEFzeW5jRGlyZWN0aXZlIHN1YmNsYXNzXG4gIC8vQGludGVybmFsXG4gIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT47XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIC8vQGludGVybmFsXG4gIFsnXyRub3RpZnlEaXJlY3RpdmVDb25uZWN0aW9uQ2hhbmdlZCddPyhpc0Nvbm5lY3RlZDogYm9vbGVhbik6IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoX3BhcnRJbmZvOiBQYXJ0SW5mbykge31cblxuICAvLyBTZWUgY29tbWVudCBpbiBEaXNjb25uZWN0YWJsZSBpbnRlcmZhY2UgZm9yIHdoeSB0aGlzIGlzIGEgZ2V0dGVyXG4gIGdldCBfJGlzQ29ubmVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl8kcGFyZW50Ll8kaXNDb25uZWN0ZWQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF8kaW5pdGlhbGl6ZShcbiAgICBwYXJ0OiBQYXJ0LFxuICAgIHBhcmVudDogRGlzY29ubmVjdGFibGUsXG4gICAgYXR0cmlidXRlSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZFxuICApIHtcbiAgICB0aGlzLl9fcGFydCA9IHBhcnQ7XG4gICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICB0aGlzLl9fYXR0cmlidXRlSW5kZXggPSBhdHRyaWJ1dGVJbmRleDtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF8kcmVzb2x2ZShwYXJ0OiBQYXJ0LCBwcm9wczogQXJyYXk8dW5rbm93bj4pOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGUocGFydCwgcHJvcHMpO1xuICB9XG5cbiAgYWJzdHJhY3QgcmVuZGVyKC4uLnByb3BzOiBBcnJheTx1bmtub3duPik6IHVua25vd247XG5cbiAgdXBkYXRlKF9wYXJ0OiBQYXJ0LCBwcm9wczogQXJyYXk8dW5rbm93bj4pOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXIoLi4ucHJvcHMpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmltcG9ydCB7bm90aGluZywgVGVtcGxhdGVSZXN1bHQsIG5vQ2hhbmdlfSBmcm9tICcuLi9saXQtaHRtbC5qcyc7XG5pbXBvcnQge2RpcmVjdGl2ZSwgRGlyZWN0aXZlLCBQYXJ0SW5mbywgUGFydFR5cGV9IGZyb20gJy4uL2RpcmVjdGl2ZS5qcyc7XG5cbmNvbnN0IEhUTUxfUkVTVUxUID0gMTtcblxuZXhwb3J0IGNsYXNzIFVuc2FmZUhUTUxEaXJlY3RpdmUgZXh0ZW5kcyBEaXJlY3RpdmUge1xuICBzdGF0aWMgZGlyZWN0aXZlTmFtZSA9ICd1bnNhZmVIVE1MJztcbiAgc3RhdGljIHJlc3VsdFR5cGUgPSBIVE1MX1JFU1VMVDtcblxuICBwcml2YXRlIF92YWx1ZTogdW5rbm93biA9IG5vdGhpbmc7XG4gIHByaXZhdGUgX3RlbXBsYXRlUmVzdWx0PzogVGVtcGxhdGVSZXN1bHQ7XG5cbiAgY29uc3RydWN0b3IocGFydEluZm86IFBhcnRJbmZvKSB7XG4gICAgc3VwZXIocGFydEluZm8pO1xuICAgIGlmIChwYXJ0SW5mby50eXBlICE9PSBQYXJ0VHlwZS5DSElMRCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtcbiAgICAgICAgICAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgVW5zYWZlSFRNTERpcmVjdGl2ZSkuZGlyZWN0aXZlTmFtZVxuICAgICAgICB9KCkgY2FuIG9ubHkgYmUgdXNlZCBpbiBjaGlsZCBiaW5kaW5nc2BcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKHZhbHVlOiBzdHJpbmcgfCB0eXBlb2Ygbm90aGluZyB8IHR5cGVvZiBub0NoYW5nZSB8IHVuZGVmaW5lZCB8IG51bGwpIHtcbiAgICBpZiAodmFsdWUgPT09IG5vdGhpbmcgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgdGhpcy5fdGVtcGxhdGVSZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gKHRoaXMuX3ZhbHVlID0gdmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IG5vQ2hhbmdlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7XG4gICAgICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFVuc2FmZUhUTUxEaXJlY3RpdmUpLmRpcmVjdGl2ZU5hbWVcbiAgICAgICAgfSgpIGNhbGxlZCB3aXRoIGEgbm9uLXN0cmluZyB2YWx1ZWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5fdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZVJlc3VsdDtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICBjb25zdCBzdHJpbmdzID0gW3ZhbHVlXSBhcyB1bmtub3duIGFzIFRlbXBsYXRlU3RyaW5nc0FycmF5O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgKHN0cmluZ3MgYXMgYW55KS5yYXcgPSBzdHJpbmdzO1xuICAgIC8vIFdBUk5JTkc6IGltcGVyc29uYXRpbmcgYSBUZW1wbGF0ZVJlc3VsdCBsaWtlIHRoaXMgaXMgZXh0cmVtZWx5XG4gICAgLy8gZGFuZ2Vyb3VzLiBUaGlyZC1wYXJ0eSBkaXJlY3RpdmVzIHNob3VsZCBub3QgZG8gdGhpcy5cbiAgICByZXR1cm4gKHRoaXMuX3RlbXBsYXRlUmVzdWx0ID0ge1xuICAgICAgLy8gQ2FzdCB0byBhIGtub3duIHNldCBvZiBpbnRlZ2VycyB0aGF0IHNhdGlzZnkgUmVzdWx0VHlwZSBzbyB0aGF0IHdlXG4gICAgICAvLyBkb24ndCBoYXZlIHRvIGV4cG9ydCBSZXN1bHRUeXBlIGFuZCBwb3NzaWJseSBlbmNvdXJhZ2UgdGhpcyBwYXR0ZXJuLlxuICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAgIFsnXyRsaXRUeXBlJCddOiAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgVW5zYWZlSFRNTERpcmVjdGl2ZSlcbiAgICAgICAgLnJlc3VsdFR5cGUgYXMgMSB8IDIsXG4gICAgICBzdHJpbmdzLFxuICAgICAgdmFsdWVzOiBbXSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlcnMgdGhlIHJlc3VsdCBhcyBIVE1MLCByYXRoZXIgdGhhbiB0ZXh0LlxuICpcbiAqIFRoZSB2YWx1ZXMgYHVuZGVmaW5lZGAsIGBudWxsYCwgYW5kIGBub3RoaW5nYCwgd2lsbCBhbGwgcmVzdWx0IGluIG5vIGNvbnRlbnRcbiAqIChlbXB0eSBzdHJpbmcpIGJlaW5nIHJlbmRlcmVkLlxuICpcbiAqIE5vdGUsIHRoaXMgaXMgdW5zYWZlIHRvIHVzZSB3aXRoIGFueSB1c2VyLXByb3ZpZGVkIGlucHV0IHRoYXQgaGFzbid0IGJlZW5cbiAqIHNhbml0aXplZCBvciBlc2NhcGVkLCBhcyBpdCBtYXkgbGVhZCB0byBjcm9zcy1zaXRlLXNjcmlwdGluZ1xuICogdnVsbmVyYWJpbGl0aWVzLlxuICovXG5leHBvcnQgY29uc3QgdW5zYWZlSFRNTCA9IGRpcmVjdGl2ZShVbnNhZmVIVE1MRGlyZWN0aXZlKTtcbiIsICJleHBvcnQgZGVmYXVsdCBjbGFzcyBEaWZmIHtcbiAgICBkaWZmKG9sZFN0ciwgbmV3U3RyLCBcbiAgICAvLyBUeXBlIGJlbG93IGlzIG5vdCBhY2N1cmF0ZS9jb21wbGV0ZSAtIHNlZSBhYm92ZSBmb3IgZnVsbCBwb3NzaWJpbGl0aWVzIC0gYnV0IGl0IGNvbXBpbGVzXG4gICAgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoJ2NhbGxiYWNrJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2s7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxsb3cgc3ViY2xhc3NlcyB0byBtYXNzYWdlIHRoZSBpbnB1dCBwcmlvciB0byBydW5uaW5nXG4gICAgICAgIGNvbnN0IG9sZFN0cmluZyA9IHRoaXMuY2FzdElucHV0KG9sZFN0ciwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IG5ld1N0cmluZyA9IHRoaXMuY2FzdElucHV0KG5ld1N0ciwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IG9sZFRva2VucyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShvbGRTdHJpbmcsIG9wdGlvbnMpKTtcbiAgICAgICAgY29uc3QgbmV3VG9rZW5zID0gdGhpcy5yZW1vdmVFbXB0eSh0aGlzLnRva2VuaXplKG5ld1N0cmluZywgb3B0aW9ucykpO1xuICAgICAgICByZXR1cm4gdGhpcy5kaWZmV2l0aE9wdGlvbnNPYmoob2xkVG9rZW5zLCBuZXdUb2tlbnMsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZGlmZldpdGhPcHRpb25zT2JqKG9sZFRva2VucywgbmV3VG9rZW5zLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGRvbmUgPSAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wb3N0UHJvY2Vzcyh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgY2FsbGJhY2sodmFsdWUpOyB9LCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXdMZW4gPSBuZXdUb2tlbnMubGVuZ3RoLCBvbGRMZW4gPSBvbGRUb2tlbnMubGVuZ3RoO1xuICAgICAgICBsZXQgZWRpdExlbmd0aCA9IDE7XG4gICAgICAgIGxldCBtYXhFZGl0TGVuZ3RoID0gbmV3TGVuICsgb2xkTGVuO1xuICAgICAgICBpZiAob3B0aW9ucy5tYXhFZGl0TGVuZ3RoICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1heEVkaXRMZW5ndGggPSBNYXRoLm1pbihtYXhFZGl0TGVuZ3RoLCBvcHRpb25zLm1heEVkaXRMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1heEV4ZWN1dGlvblRpbWUgPSAoX2EgPSBvcHRpb25zLnRpbWVvdXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IEluZmluaXR5O1xuICAgICAgICBjb25zdCBhYm9ydEFmdGVyVGltZXN0YW1wID0gRGF0ZS5ub3coKSArIG1heEV4ZWN1dGlvblRpbWU7XG4gICAgICAgIGNvbnN0IGJlc3RQYXRoID0gW3sgb2xkUG9zOiAtMSwgbGFzdENvbXBvbmVudDogdW5kZWZpbmVkIH1dO1xuICAgICAgICAvLyBTZWVkIGVkaXRMZW5ndGggPSAwLCBpLmUuIHRoZSBjb250ZW50IHN0YXJ0cyB3aXRoIHRoZSBzYW1lIHZhbHVlc1xuICAgICAgICBsZXQgbmV3UG9zID0gdGhpcy5leHRyYWN0Q29tbW9uKGJlc3RQYXRoWzBdLCBuZXdUb2tlbnMsIG9sZFRva2VucywgMCwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChiZXN0UGF0aFswXS5vbGRQb3MgKyAxID49IG9sZExlbiAmJiBuZXdQb3MgKyAxID49IG5ld0xlbikge1xuICAgICAgICAgICAgLy8gSWRlbnRpdHkgcGVyIHRoZSBlcXVhbGl0eSBhbmQgdG9rZW5pemVyXG4gICAgICAgICAgICByZXR1cm4gZG9uZSh0aGlzLmJ1aWxkVmFsdWVzKGJlc3RQYXRoWzBdLmxhc3RDb21wb25lbnQsIG5ld1Rva2Vucywgb2xkVG9rZW5zKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25jZSB3ZSBoaXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGVkaXQgZ3JhcGggb24gc29tZSBkaWFnb25hbCBrLCB3ZSBjYW5cbiAgICAgICAgLy8gZGVmaW5pdGVseSByZWFjaCB0aGUgZW5kIG9mIHRoZSBlZGl0IGdyYXBoIGluIG5vIG1vcmUgdGhhbiBrIGVkaXRzLCBzb1xuICAgICAgICAvLyB0aGVyZSdzIG5vIHBvaW50IGluIGNvbnNpZGVyaW5nIGFueSBtb3ZlcyB0byBkaWFnb25hbCBrKzEgYW55IG1vcmUgKGZyb21cbiAgICAgICAgLy8gd2hpY2ggd2UncmUgZ3VhcmFudGVlZCB0byBuZWVkIGF0IGxlYXN0IGsrMSBtb3JlIGVkaXRzKS5cbiAgICAgICAgLy8gU2ltaWxhcmx5LCBvbmNlIHdlJ3ZlIHJlYWNoZWQgdGhlIGJvdHRvbSBvZiB0aGUgZWRpdCBncmFwaCwgdGhlcmUncyBub1xuICAgICAgICAvLyBwb2ludCBjb25zaWRlcmluZyBtb3ZlcyB0byBsb3dlciBkaWFnb25hbHMuXG4gICAgICAgIC8vIFdlIHJlY29yZCB0aGlzIGZhY3QgYnkgc2V0dGluZyBtaW5EaWFnb25hbFRvQ29uc2lkZXIgYW5kXG4gICAgICAgIC8vIG1heERpYWdvbmFsVG9Db25zaWRlciB0byBzb21lIGZpbml0ZSB2YWx1ZSBvbmNlIHdlJ3ZlIGhpdCB0aGUgZWRnZSBvZlxuICAgICAgICAvLyB0aGUgZWRpdCBncmFwaC5cbiAgICAgICAgLy8gVGhpcyBvcHRpbWl6YXRpb24gaXMgbm90IGZhaXRoZnVsIHRvIHRoZSBvcmlnaW5hbCBhbGdvcml0aG0gcHJlc2VudGVkIGluXG4gICAgICAgIC8vIE15ZXJzJ3MgcGFwZXIsIHdoaWNoIGluc3RlYWQgcG9pbnRsZXNzbHkgZXh0ZW5kcyBELXBhdGhzIG9mZiB0aGUgZW5kIG9mXG4gICAgICAgIC8vIHRoZSBlZGl0IGdyYXBoIC0gc2VlIHBhZ2UgNyBvZiBNeWVycydzIHBhcGVyIHdoaWNoIG5vdGVzIHRoaXMgcG9pbnRcbiAgICAgICAgLy8gZXhwbGljaXRseSBhbmQgaWxsdXN0cmF0ZXMgaXQgd2l0aCBhIGRpYWdyYW0uIFRoaXMgaGFzIG1ham9yIHBlcmZvcm1hbmNlXG4gICAgICAgIC8vIGltcGxpY2F0aW9ucyBmb3Igc29tZSBjb21tb24gc2NlbmFyaW9zLiBGb3IgaW5zdGFuY2UsIHRvIGNvbXB1dGUgYSBkaWZmXG4gICAgICAgIC8vIHdoZXJlIHRoZSBuZXcgdGV4dCBzaW1wbHkgYXBwZW5kcyBkIGNoYXJhY3RlcnMgb24gdGhlIGVuZCBvZiB0aGVcbiAgICAgICAgLy8gb3JpZ2luYWwgdGV4dCBvZiBsZW5ndGggbiwgdGhlIHRydWUgTXllcnMgYWxnb3JpdGhtIHdpbGwgdGFrZSBPKG4rZF4yKVxuICAgICAgICAvLyB0aW1lIHdoaWxlIHRoaXMgb3B0aW1pemF0aW9uIG5lZWRzIG9ubHkgTyhuK2QpIHRpbWUuXG4gICAgICAgIGxldCBtaW5EaWFnb25hbFRvQ29uc2lkZXIgPSAtSW5maW5pdHksIG1heERpYWdvbmFsVG9Db25zaWRlciA9IEluZmluaXR5O1xuICAgICAgICAvLyBNYWluIHdvcmtlciBtZXRob2QuIGNoZWNrcyBhbGwgcGVybXV0YXRpb25zIG9mIGEgZ2l2ZW4gZWRpdCBsZW5ndGggZm9yIGFjY2VwdGFuY2UuXG4gICAgICAgIGNvbnN0IGV4ZWNFZGl0TGVuZ3RoID0gKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgZGlhZ29uYWxQYXRoID0gTWF0aC5tYXgobWluRGlhZ29uYWxUb0NvbnNpZGVyLCAtZWRpdExlbmd0aCk7IGRpYWdvbmFsUGF0aCA8PSBNYXRoLm1pbihtYXhEaWFnb25hbFRvQ29uc2lkZXIsIGVkaXRMZW5ndGgpOyBkaWFnb25hbFBhdGggKz0gMikge1xuICAgICAgICAgICAgICAgIGxldCBiYXNlUGF0aDtcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0sIGFkZFBhdGggPSBiZXN0UGF0aFtkaWFnb25hbFBhdGggKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyBvbmUgZWxzZSBpcyBnb2luZyB0byBhdHRlbXB0IHRvIHVzZSB0aGlzIHZhbHVlLCBjbGVhciBpdFxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gcGVyZiBvcHRpbWlzYXRpb24uIFRoaXMgdHlwZS12aW9sYXRpbmcgdmFsdWUgd2lsbCBuZXZlciBiZSByZWFkLlxuICAgICAgICAgICAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNhbkFkZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChhZGRQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdoYXQgbmV3UG9zIHdpbGwgYmUgYWZ0ZXIgd2UgZG8gYW4gaW5zZXJ0aW9uOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRQYXRoTmV3UG9zID0gYWRkUGF0aC5vbGRQb3MgLSBkaWFnb25hbFBhdGg7XG4gICAgICAgICAgICAgICAgICAgIGNhbkFkZCA9IGFkZFBhdGggJiYgMCA8PSBhZGRQYXRoTmV3UG9zICYmIGFkZFBhdGhOZXdQb3MgPCBuZXdMZW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhblJlbW92ZSA9IHJlbW92ZVBhdGggJiYgcmVtb3ZlUGF0aC5vbGRQb3MgKyAxIDwgb2xkTGVuO1xuICAgICAgICAgICAgICAgIGlmICghY2FuQWRkICYmICFjYW5SZW1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBwYXRoIGlzIGEgdGVybWluYWwgdGhlbiBwcnVuZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gcGVyZiBvcHRpbWlzYXRpb24uIFRoaXMgdHlwZS12aW9sYXRpbmcgdmFsdWUgd2lsbCBuZXZlciBiZSByZWFkLlxuICAgICAgICAgICAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSBkaWFnb25hbCB0aGF0IHdlIHdhbnQgdG8gYnJhbmNoIGZyb20uIFdlIHNlbGVjdCB0aGUgcHJpb3JcbiAgICAgICAgICAgICAgICAvLyBwYXRoIHdob3NlIHBvc2l0aW9uIGluIHRoZSBvbGQgc3RyaW5nIGlzIHRoZSBmYXJ0aGVzdCBmcm9tIHRoZSBvcmlnaW5cbiAgICAgICAgICAgICAgICAvLyBhbmQgZG9lcyBub3QgcGFzcyB0aGUgYm91bmRzIG9mIHRoZSBkaWZmIGdyYXBoXG4gICAgICAgICAgICAgICAgaWYgKCFjYW5SZW1vdmUgfHwgKGNhbkFkZCAmJiByZW1vdmVQYXRoLm9sZFBvcyA8IGFkZFBhdGgub2xkUG9zKSkge1xuICAgICAgICAgICAgICAgICAgICBiYXNlUGF0aCA9IHRoaXMuYWRkVG9QYXRoKGFkZFBhdGgsIHRydWUsIGZhbHNlLCAwLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VQYXRoID0gdGhpcy5hZGRUb1BhdGgocmVtb3ZlUGF0aCwgZmFsc2UsIHRydWUsIDEsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXdQb3MgPSB0aGlzLmV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1Rva2Vucywgb2xkVG9rZW5zLCBkaWFnb25hbFBhdGgsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChiYXNlUGF0aC5vbGRQb3MgKyAxID49IG9sZExlbiAmJiBuZXdQb3MgKyAxID49IG5ld0xlbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGhpdCB0aGUgZW5kIG9mIGJvdGggc3RyaW5ncywgdGhlbiB3ZSBhcmUgZG9uZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9uZSh0aGlzLmJ1aWxkVmFsdWVzKGJhc2VQYXRoLmxhc3RDb21wb25lbnQsIG5ld1Rva2Vucywgb2xkVG9rZW5zKSkgfHwgdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSBiYXNlUGF0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VQYXRoLm9sZFBvcyArIDEgPj0gb2xkTGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhEaWFnb25hbFRvQ29uc2lkZXIgPSBNYXRoLm1pbihtYXhEaWFnb25hbFRvQ29uc2lkZXIsIGRpYWdvbmFsUGF0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdQb3MgKyAxID49IG5ld0xlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluRGlhZ29uYWxUb0NvbnNpZGVyID0gTWF0aC5tYXgobWluRGlhZ29uYWxUb0NvbnNpZGVyLCBkaWFnb25hbFBhdGggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVkaXRMZW5ndGgrKztcbiAgICAgICAgfTtcbiAgICAgICAgLy8gUGVyZm9ybXMgdGhlIGxlbmd0aCBvZiBlZGl0IGl0ZXJhdGlvbi4gSXMgYSBiaXQgZnVnbHkgYXMgdGhpcyBoYXMgdG8gc3VwcG9ydCB0aGVcbiAgICAgICAgLy8gc3luYyBhbmQgYXN5bmMgbW9kZSB3aGljaCBpcyBuZXZlciBmdW4uIExvb3BzIG92ZXIgZXhlY0VkaXRMZW5ndGggdW50aWwgYSB2YWx1ZVxuICAgICAgICAvLyBpcyBwcm9kdWNlZCwgb3IgdW50aWwgdGhlIGVkaXQgbGVuZ3RoIGV4Y2VlZHMgb3B0aW9ucy5tYXhFZGl0TGVuZ3RoIChpZiBnaXZlbiksXG4gICAgICAgIC8vIGluIHdoaWNoIGNhc2UgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIChmdW5jdGlvbiBleGVjKCkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdExlbmd0aCA+IG1heEVkaXRMZW5ndGggfHwgRGF0ZS5ub3coKSA+IGFib3J0QWZ0ZXJUaW1lc3RhbXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhlY0VkaXRMZW5ndGgoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhlYygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKGVkaXRMZW5ndGggPD0gbWF4RWRpdExlbmd0aCAmJiBEYXRlLm5vdygpIDw9IGFib3J0QWZ0ZXJUaW1lc3RhbXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBleGVjRWRpdExlbmd0aCgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkVG9QYXRoKHBhdGgsIGFkZGVkLCByZW1vdmVkLCBvbGRQb3NJbmMsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHBhdGgubGFzdENvbXBvbmVudDtcbiAgICAgICAgaWYgKGxhc3QgJiYgIW9wdGlvbnMub25lQ2hhbmdlUGVyVG9rZW4gJiYgbGFzdC5hZGRlZCA9PT0gYWRkZWQgJiYgbGFzdC5yZW1vdmVkID09PSByZW1vdmVkKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9sZFBvczogcGF0aC5vbGRQb3MgKyBvbGRQb3NJbmMsXG4gICAgICAgICAgICAgICAgbGFzdENvbXBvbmVudDogeyBjb3VudDogbGFzdC5jb3VudCArIDEsIGFkZGVkOiBhZGRlZCwgcmVtb3ZlZDogcmVtb3ZlZCwgcHJldmlvdXNDb21wb25lbnQ6IGxhc3QucHJldmlvdXNDb21wb25lbnQgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2xkUG9zOiBwYXRoLm9sZFBvcyArIG9sZFBvc0luYyxcbiAgICAgICAgICAgICAgICBsYXN0Q29tcG9uZW50OiB7IGNvdW50OiAxLCBhZGRlZDogYWRkZWQsIHJlbW92ZWQ6IHJlbW92ZWQsIHByZXZpb3VzQ29tcG9uZW50OiBsYXN0IH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3VG9rZW5zLCBvbGRUb2tlbnMsIGRpYWdvbmFsUGF0aCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBuZXdMZW4gPSBuZXdUb2tlbnMubGVuZ3RoLCBvbGRMZW4gPSBvbGRUb2tlbnMubGVuZ3RoO1xuICAgICAgICBsZXQgb2xkUG9zID0gYmFzZVBhdGgub2xkUG9zLCBuZXdQb3MgPSBvbGRQb3MgLSBkaWFnb25hbFBhdGgsIGNvbW1vbkNvdW50ID0gMDtcbiAgICAgICAgd2hpbGUgKG5ld1BvcyArIDEgPCBuZXdMZW4gJiYgb2xkUG9zICsgMSA8IG9sZExlbiAmJiB0aGlzLmVxdWFscyhvbGRUb2tlbnNbb2xkUG9zICsgMV0sIG5ld1Rva2Vuc1tuZXdQb3MgKyAxXSwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIG5ld1BvcysrO1xuICAgICAgICAgICAgb2xkUG9zKys7XG4gICAgICAgICAgICBjb21tb25Db3VudCsrO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMub25lQ2hhbmdlUGVyVG9rZW4pIHtcbiAgICAgICAgICAgICAgICBiYXNlUGF0aC5sYXN0Q29tcG9uZW50ID0geyBjb3VudDogMSwgcHJldmlvdXNDb21wb25lbnQ6IGJhc2VQYXRoLmxhc3RDb21wb25lbnQsIGFkZGVkOiBmYWxzZSwgcmVtb3ZlZDogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbW9uQ291bnQgJiYgIW9wdGlvbnMub25lQ2hhbmdlUGVyVG9rZW4pIHtcbiAgICAgICAgICAgIGJhc2VQYXRoLmxhc3RDb21wb25lbnQgPSB7IGNvdW50OiBjb21tb25Db3VudCwgcHJldmlvdXNDb21wb25lbnQ6IGJhc2VQYXRoLmxhc3RDb21wb25lbnQsIGFkZGVkOiBmYWxzZSwgcmVtb3ZlZDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBiYXNlUGF0aC5vbGRQb3MgPSBvbGRQb3M7XG4gICAgICAgIHJldHVybiBuZXdQb3M7XG4gICAgfVxuICAgIGVxdWFscyhsZWZ0LCByaWdodCwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucy5jb21wYXJhdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodFxuICAgICAgICAgICAgICAgIHx8ICghIW9wdGlvbnMuaWdub3JlQ2FzZSAmJiBsZWZ0LnRvTG93ZXJDYXNlKCkgPT09IHJpZ2h0LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZUVtcHR5KGFycmF5KSB7XG4gICAgICAgIGNvbnN0IHJldCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYXJyYXlbaV0pIHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChhcnJheVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNhc3RJbnB1dCh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB0b2tlbml6ZSh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh2YWx1ZSk7XG4gICAgfVxuICAgIGpvaW4oY2hhcnMpIHtcbiAgICAgICAgLy8gQXNzdW1lcyBWYWx1ZVQgaXMgc3RyaW5nLCB3aGljaCBpcyB0aGUgY2FzZSBmb3IgbW9zdCBzdWJjbGFzc2VzLlxuICAgICAgICAvLyBXaGVuIGl0J3MgZmFsc2UsIGUuZy4gaW4gZGlmZkFycmF5cywgdGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgb3ZlcnJpZGRlbiAoZS5nLiB3aXRoIGEgbm8tb3ApXG4gICAgICAgIC8vIFllcywgdGhlIGNhc3RzIGFyZSB2ZXJib3NlIGFuZCB1Z2x5LCBiZWNhdXNlIHRoaXMgcGF0dGVybiAtIG9mIGhhdmluZyB0aGUgYmFzZSBjbGFzcyBTT1JUIE9GXG4gICAgICAgIC8vIGFzc3VtZSB0b2tlbnMgYW5kIHZhbHVlcyBhcmUgc3RyaW5ncywgYnV0IG5vdCBjb21wbGV0ZWx5IC0gaXMgd2VpcmQgYW5kIGphbmt5LlxuICAgICAgICByZXR1cm4gY2hhcnMuam9pbignJyk7XG4gICAgfVxuICAgIHBvc3RQcm9jZXNzKGNoYW5nZU9iamVjdHMsIFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBjaGFuZ2VPYmplY3RzO1xuICAgIH1cbiAgICBnZXQgdXNlTG9uZ2VzdFRva2VuKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGJ1aWxkVmFsdWVzKGxhc3RDb21wb25lbnQsIG5ld1Rva2Vucywgb2xkVG9rZW5zKSB7XG4gICAgICAgIC8vIEZpcnN0IHdlIGNvbnZlcnQgb3VyIGxpbmtlZCBsaXN0IG9mIGNvbXBvbmVudHMgaW4gcmV2ZXJzZSBvcmRlciB0byBhblxuICAgICAgICAvLyBhcnJheSBpbiB0aGUgcmlnaHQgb3JkZXI6XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgbGV0IG5leHRDb21wb25lbnQ7XG4gICAgICAgIHdoaWxlIChsYXN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLnB1c2gobGFzdENvbXBvbmVudCk7XG4gICAgICAgICAgICBuZXh0Q29tcG9uZW50ID0gbGFzdENvbXBvbmVudC5wcmV2aW91c0NvbXBvbmVudDtcbiAgICAgICAgICAgIGRlbGV0ZSBsYXN0Q29tcG9uZW50LnByZXZpb3VzQ29tcG9uZW50O1xuICAgICAgICAgICAgbGFzdENvbXBvbmVudCA9IG5leHRDb21wb25lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9uZW50cy5yZXZlcnNlKCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudExlbiA9IGNvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgICBsZXQgY29tcG9uZW50UG9zID0gMCwgbmV3UG9zID0gMCwgb2xkUG9zID0gMDtcbiAgICAgICAgZm9yICg7IGNvbXBvbmVudFBvcyA8IGNvbXBvbmVudExlbjsgY29tcG9uZW50UG9zKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcbiAgICAgICAgICAgIGlmICghY29tcG9uZW50LnJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudC5hZGRlZCAmJiB0aGlzLnVzZUxvbmdlc3RUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBuZXdUb2tlbnMuc2xpY2UobmV3UG9zLCBuZXdQb3MgKyBjb21wb25lbnQuY291bnQpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcChmdW5jdGlvbiAodmFsdWUsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkVG9rZW5zW29sZFBvcyArIGldO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9sZFZhbHVlLmxlbmd0aCA+IHZhbHVlLmxlbmd0aCA/IG9sZFZhbHVlIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQudmFsdWUgPSB0aGlzLmpvaW4odmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnZhbHVlID0gdGhpcy5qb2luKG5ld1Rva2Vucy5zbGljZShuZXdQb3MsIG5ld1BvcyArIGNvbXBvbmVudC5jb3VudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXdQb3MgKz0gY29tcG9uZW50LmNvdW50O1xuICAgICAgICAgICAgICAgIC8vIENvbW1vbiBjYXNlXG4gICAgICAgICAgICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQudmFsdWUgPSB0aGlzLmpvaW4ob2xkVG9rZW5zLnNsaWNlKG9sZFBvcywgb2xkUG9zICsgY29tcG9uZW50LmNvdW50KSk7XG4gICAgICAgICAgICAgICAgb2xkUG9zICs9IGNvbXBvbmVudC5jb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50cztcbiAgICB9XG59XG4iLCAiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3B0aW9ucyB9IGZyb20gJy4uL3V0aWwvcGFyYW1zLmpzJztcbmNsYXNzIExpbmVEaWZmIGV4dGVuZHMgRGlmZiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudG9rZW5pemUgPSB0b2tlbml6ZTtcbiAgICB9XG4gICAgZXF1YWxzKGxlZnQsIHJpZ2h0LCBvcHRpb25zKSB7XG4gICAgICAgIC8vIElmIHdlJ3JlIGlnbm9yaW5nIHdoaXRlc3BhY2UsIHdlIG5lZWQgdG8gbm9ybWFsaXNlIGxpbmVzIGJ5IHN0cmlwcGluZ1xuICAgICAgICAvLyB3aGl0ZXNwYWNlIGJlZm9yZSBjaGVja2luZyBlcXVhbGl0eS4gKFRoaXMgaGFzIGFuIGFubm95aW5nIGludGVyYWN0aW9uXG4gICAgICAgIC8vIHdpdGggbmV3bGluZUlzVG9rZW4gdGhhdCByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nOiBpZiBuZXdsaW5lcyBnZXQgdGhlaXJcbiAgICAgICAgLy8gb3duIHRva2VuLCB0aGVuIHdlIERPTidUIHdhbnQgdG8gdHJpbSB0aGUgKm5ld2xpbmUqIHRva2VucyBkb3duIHRvIGVtcHR5XG4gICAgICAgIC8vIHN0cmluZ3MsIHNpbmNlIHRoaXMgd291bGQgY2F1c2UgdXMgdG8gdHJlYXQgd2hpdGVzcGFjZS1vbmx5IGxpbmUgY29udGVudFxuICAgICAgICAvLyBhcyBlcXVhbCB0byBhIHNlcGFyYXRvciBiZXR3ZWVuIGxpbmVzLCB3aGljaCB3b3VsZCBiZSB3ZWlyZCBhbmRcbiAgICAgICAgLy8gaW5jb25zaXN0ZW50IHdpdGggdGhlIGRvY3VtZW50ZWQgYmVoYXZpb3Igb2YgdGhlIG9wdGlvbnMuKVxuICAgICAgICBpZiAob3B0aW9ucy5pZ25vcmVXaGl0ZXNwYWNlKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMubmV3bGluZUlzVG9rZW4gfHwgIWxlZnQuaW5jbHVkZXMoJ1xcbicpKSB7XG4gICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLm5ld2xpbmVJc1Rva2VuIHx8ICFyaWdodC5pbmNsdWRlcygnXFxuJykpIHtcbiAgICAgICAgICAgICAgICByaWdodCA9IHJpZ2h0LnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zLmlnbm9yZU5ld2xpbmVBdEVvZiAmJiAhb3B0aW9ucy5uZXdsaW5lSXNUb2tlbikge1xuICAgICAgICAgICAgaWYgKGxlZnQuZW5kc1dpdGgoJ1xcbicpKSB7XG4gICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJpZ2h0LmVuZHNXaXRoKCdcXG4nKSkge1xuICAgICAgICAgICAgICAgIHJpZ2h0ID0gcmlnaHQuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMobGVmdCwgcmlnaHQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBsaW5lRGlmZiA9IG5ldyBMaW5lRGlmZigpO1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZMaW5lcyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICAgIHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkaWZmVHJpbW1lZExpbmVzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IGdlbmVyYXRlT3B0aW9ucyhvcHRpb25zLCB7IGlnbm9yZVdoaXRlc3BhY2U6IHRydWUgfSk7XG4gICAgcmV0dXJuIGxpbmVEaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuLy8gRXhwb3J0ZWQgc3RhbmRhbG9uZSBzbyBpdCBjYW4gYmUgdXNlZCBmcm9tIGpzb25EaWZmIHRvby5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZSh2YWx1ZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnN0cmlwVHJhaWxpbmdDcikge1xuICAgICAgICAvLyByZW1vdmUgb25lIFxcciBiZWZvcmUgXFxuIHRvIG1hdGNoIEdOVSBkaWZmJ3MgLS1zdHJpcC10cmFpbGluZy1jciBiZWhhdmlvclxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcclxcbi9nLCAnXFxuJyk7XG4gICAgfVxuICAgIGNvbnN0IHJldExpbmVzID0gW10sIGxpbmVzQW5kTmV3bGluZXMgPSB2YWx1ZS5zcGxpdCgvKFxcbnxcXHJcXG4pLyk7XG4gICAgLy8gSWdub3JlIHRoZSBmaW5hbCBlbXB0eSB0b2tlbiB0aGF0IG9jY3VycyBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCBhIG5ldyBsaW5lXG4gICAgaWYgKCFsaW5lc0FuZE5ld2xpbmVzW2xpbmVzQW5kTmV3bGluZXMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgbGluZXNBbmROZXdsaW5lcy5wb3AoKTtcbiAgICB9XG4gICAgLy8gTWVyZ2UgdGhlIGNvbnRlbnQgYW5kIGxpbmUgc2VwYXJhdG9ycyBpbnRvIHNpbmdsZSB0b2tlbnNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzQW5kTmV3bGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzQW5kTmV3bGluZXNbaV07XG4gICAgICAgIGlmIChpICUgMiAmJiAhb3B0aW9ucy5uZXdsaW5lSXNUb2tlbikge1xuICAgICAgICAgICAgcmV0TGluZXNbcmV0TGluZXMubGVuZ3RoIC0gMV0gKz0gbGluZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldExpbmVzLnB1c2gobGluZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldExpbmVzO1xufVxuIiwgIi8qKlxuICogR2V0cyB0aGUgb3JpZ2luYWwgbWFya2VkIGRlZmF1bHQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9nZXREZWZhdWx0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBhc3luYzogZmFsc2UsXG4gICAgICAgIGJyZWFrczogZmFsc2UsXG4gICAgICAgIGV4dGVuc2lvbnM6IG51bGwsXG4gICAgICAgIGdmbTogdHJ1ZSxcbiAgICAgICAgaG9va3M6IG51bGwsXG4gICAgICAgIHBlZGFudGljOiBmYWxzZSxcbiAgICAgICAgcmVuZGVyZXI6IG51bGwsXG4gICAgICAgIHNpbGVudDogZmFsc2UsXG4gICAgICAgIHRva2VuaXplcjogbnVsbCxcbiAgICAgICAgd2Fsa1Rva2VuczogbnVsbFxuICAgIH07XG59XG5leHBvcnQgbGV0IF9kZWZhdWx0cyA9IF9nZXREZWZhdWx0cygpO1xuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZURlZmF1bHRzKG5ld0RlZmF1bHRzKSB7XG4gICAgX2RlZmF1bHRzID0gbmV3RGVmYXVsdHM7XG59XG4iLCAiLyoqXG4gKiBIZWxwZXJzXG4gKi9cbmNvbnN0IGVzY2FwZVRlc3QgPSAvWyY8PlwiJ10vO1xuY29uc3QgZXNjYXBlUmVwbGFjZSA9IG5ldyBSZWdFeHAoZXNjYXBlVGVzdC5zb3VyY2UsICdnJyk7XG5jb25zdCBlc2NhcGVUZXN0Tm9FbmNvZGUgPSAvWzw+XCInXXwmKD8hKCNcXGR7MSw3fXwjW1h4XVthLWZBLUYwLTldezEsNn18XFx3Kyk7KS87XG5jb25zdCBlc2NhcGVSZXBsYWNlTm9FbmNvZGUgPSBuZXcgUmVnRXhwKGVzY2FwZVRlc3ROb0VuY29kZS5zb3VyY2UsICdnJyk7XG5jb25zdCBlc2NhcGVSZXBsYWNlbWVudHMgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMzOTsnXG59O1xuY29uc3QgZ2V0RXNjYXBlUmVwbGFjZW1lbnQgPSAoY2gpID0+IGVzY2FwZVJlcGxhY2VtZW50c1tjaF07XG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlKGh0bWwsIGVuY29kZSkge1xuICAgIGlmIChlbmNvZGUpIHtcbiAgICAgICAgaWYgKGVzY2FwZVRlc3QudGVzdChodG1sKSkge1xuICAgICAgICAgICAgcmV0dXJuIGh0bWwucmVwbGFjZShlc2NhcGVSZXBsYWNlLCBnZXRFc2NhcGVSZXBsYWNlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChlc2NhcGVUZXN0Tm9FbmNvZGUudGVzdChodG1sKSkge1xuICAgICAgICAgICAgcmV0dXJuIGh0bWwucmVwbGFjZShlc2NhcGVSZXBsYWNlTm9FbmNvZGUsIGdldEVzY2FwZVJlcGxhY2VtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaHRtbDtcbn1cbmNvbnN0IHVuZXNjYXBlVGVzdCA9IC8mKCMoPzpcXGQrKXwoPzojeFswLTlBLUZhLWZdKyl8KD86XFx3KykpOz8vaWc7XG5leHBvcnQgZnVuY3Rpb24gdW5lc2NhcGUoaHRtbCkge1xuICAgIC8vIGV4cGxpY2l0bHkgbWF0Y2ggZGVjaW1hbCwgaGV4LCBhbmQgbmFtZWQgSFRNTCBlbnRpdGllc1xuICAgIHJldHVybiBodG1sLnJlcGxhY2UodW5lc2NhcGVUZXN0LCAoXywgbikgPT4ge1xuICAgICAgICBuID0gbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobiA9PT0gJ2NvbG9uJylcbiAgICAgICAgICAgIHJldHVybiAnOic7XG4gICAgICAgIGlmIChuLmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICAgICAgICByZXR1cm4gbi5jaGFyQXQoMSkgPT09ICd4J1xuICAgICAgICAgICAgICAgID8gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChuLnN1YnN0cmluZygyKSwgMTYpKVxuICAgICAgICAgICAgICAgIDogU3RyaW5nLmZyb21DaGFyQ29kZSgrbi5zdWJzdHJpbmcoMSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcbn1cbmNvbnN0IGNhcmV0ID0gLyhefFteXFxbXSlcXF4vZztcbmV4cG9ydCBmdW5jdGlvbiBlZGl0KHJlZ2V4LCBvcHQpIHtcbiAgICBsZXQgc291cmNlID0gdHlwZW9mIHJlZ2V4ID09PSAnc3RyaW5nJyA/IHJlZ2V4IDogcmVnZXguc291cmNlO1xuICAgIG9wdCA9IG9wdCB8fCAnJztcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICAgIHJlcGxhY2U6IChuYW1lLCB2YWwpID0+IHtcbiAgICAgICAgICAgIGxldCB2YWxTb3VyY2UgPSB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IHZhbCA6IHZhbC5zb3VyY2U7XG4gICAgICAgICAgICB2YWxTb3VyY2UgPSB2YWxTb3VyY2UucmVwbGFjZShjYXJldCwgJyQxJyk7XG4gICAgICAgICAgICBzb3VyY2UgPSBzb3VyY2UucmVwbGFjZShuYW1lLCB2YWxTb3VyY2UpO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0UmVnZXg6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHNvdXJjZSwgb3B0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIG9iajtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVybChocmVmKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaHJlZiA9IGVuY29kZVVSSShocmVmKS5yZXBsYWNlKC8lMjUvZywgJyUnKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBocmVmO1xufVxuZXhwb3J0IGNvbnN0IG5vb3BUZXN0ID0geyBleGVjOiAoKSA9PiBudWxsIH07XG5leHBvcnQgZnVuY3Rpb24gc3BsaXRDZWxscyh0YWJsZVJvdywgY291bnQpIHtcbiAgICAvLyBlbnN1cmUgdGhhdCBldmVyeSBjZWxsLWRlbGltaXRpbmcgcGlwZSBoYXMgYSBzcGFjZVxuICAgIC8vIGJlZm9yZSBpdCB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIGFuIGVzY2FwZWQgcGlwZVxuICAgIGNvbnN0IHJvdyA9IHRhYmxlUm93LnJlcGxhY2UoL1xcfC9nLCAobWF0Y2gsIG9mZnNldCwgc3RyKSA9PiB7XG4gICAgICAgIGxldCBlc2NhcGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBjdXJyID0gb2Zmc2V0O1xuICAgICAgICB3aGlsZSAoLS1jdXJyID49IDAgJiYgc3RyW2N1cnJdID09PSAnXFxcXCcpXG4gICAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQ7XG4gICAgICAgIGlmIChlc2NhcGVkKSB7XG4gICAgICAgICAgICAvLyBvZGQgbnVtYmVyIG9mIHNsYXNoZXMgbWVhbnMgfCBpcyBlc2NhcGVkXG4gICAgICAgICAgICAvLyBzbyB3ZSBsZWF2ZSBpdCBhbG9uZVxuICAgICAgICAgICAgcmV0dXJuICd8JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFkZCBzcGFjZSBiZWZvcmUgdW5lc2NhcGVkIHxcbiAgICAgICAgICAgIHJldHVybiAnIHwnO1xuICAgICAgICB9XG4gICAgfSksIGNlbGxzID0gcm93LnNwbGl0KC8gXFx8Lyk7XG4gICAgbGV0IGkgPSAwO1xuICAgIC8vIEZpcnN0L2xhc3QgY2VsbCBpbiBhIHJvdyBjYW5ub3QgYmUgZW1wdHkgaWYgaXQgaGFzIG5vIGxlYWRpbmcvdHJhaWxpbmcgcGlwZVxuICAgIGlmICghY2VsbHNbMF0udHJpbSgpKSB7XG4gICAgICAgIGNlbGxzLnNoaWZ0KCk7XG4gICAgfVxuICAgIGlmIChjZWxscy5sZW5ndGggPiAwICYmICFjZWxsc1tjZWxscy5sZW5ndGggLSAxXS50cmltKCkpIHtcbiAgICAgICAgY2VsbHMucG9wKCk7XG4gICAgfVxuICAgIGlmIChjb3VudCkge1xuICAgICAgICBpZiAoY2VsbHMubGVuZ3RoID4gY291bnQpIHtcbiAgICAgICAgICAgIGNlbGxzLnNwbGljZShjb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aGlsZSAoY2VsbHMubGVuZ3RoIDwgY291bnQpXG4gICAgICAgICAgICAgICAgY2VsbHMucHVzaCgnJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yICg7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgaWdub3JlZCBwZXIgdGhlIGdmbSBzcGVjXG4gICAgICAgIGNlbGxzW2ldID0gY2VsbHNbaV0udHJpbSgpLnJlcGxhY2UoL1xcXFxcXHwvZywgJ3wnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNlbGxzO1xufVxuLyoqXG4gKiBSZW1vdmUgdHJhaWxpbmcgJ2Mncy4gRXF1aXZhbGVudCB0byBzdHIucmVwbGFjZSgvYyokLywgJycpLlxuICogL2MqJC8gaXMgdnVsbmVyYWJsZSB0byBSRURPUy5cbiAqXG4gKiBAcGFyYW0gc3RyXG4gKiBAcGFyYW0gY1xuICogQHBhcmFtIGludmVydCBSZW1vdmUgc3VmZml4IG9mIG5vbi1jIGNoYXJzIGluc3RlYWQuIERlZmF1bHQgZmFsc2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnRyaW0oc3RyLCBjLCBpbnZlcnQpIHtcbiAgICBjb25zdCBsID0gc3RyLmxlbmd0aDtcbiAgICBpZiAobCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIC8vIExlbmd0aCBvZiBzdWZmaXggbWF0Y2hpbmcgdGhlIGludmVydCBjb25kaXRpb24uXG4gICAgbGV0IHN1ZmZMZW4gPSAwO1xuICAgIC8vIFN0ZXAgbGVmdCB1bnRpbCB3ZSBmYWlsIHRvIG1hdGNoIHRoZSBpbnZlcnQgY29uZGl0aW9uLlxuICAgIHdoaWxlIChzdWZmTGVuIDwgbCkge1xuICAgICAgICBjb25zdCBjdXJyQ2hhciA9IHN0ci5jaGFyQXQobCAtIHN1ZmZMZW4gLSAxKTtcbiAgICAgICAgaWYgKGN1cnJDaGFyID09PSBjICYmICFpbnZlcnQpIHtcbiAgICAgICAgICAgIHN1ZmZMZW4rKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjdXJyQ2hhciAhPT0gYyAmJiBpbnZlcnQpIHtcbiAgICAgICAgICAgIHN1ZmZMZW4rKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHIuc2xpY2UoMCwgbCAtIHN1ZmZMZW4pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDbG9zaW5nQnJhY2tldChzdHIsIGIpIHtcbiAgICBpZiAoc3RyLmluZGV4T2YoYlsxXSkgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgbGV0IGxldmVsID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc3RyW2ldID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdHJbaV0gPT09IGJbMF0pIHtcbiAgICAgICAgICAgIGxldmVsKys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RyW2ldID09PSBiWzFdKSB7XG4gICAgICAgICAgICBsZXZlbC0tO1xuICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbiIsICJpbXBvcnQgeyBfZGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLnRzJztcbmltcG9ydCB7IHJ0cmltLCBzcGxpdENlbGxzLCBlc2NhcGUsIGZpbmRDbG9zaW5nQnJhY2tldCB9IGZyb20gJy4vaGVscGVycy50cyc7XG5mdW5jdGlvbiBvdXRwdXRMaW5rKGNhcCwgbGluaywgcmF3LCBsZXhlcikge1xuICAgIGNvbnN0IGhyZWYgPSBsaW5rLmhyZWY7XG4gICAgY29uc3QgdGl0bGUgPSBsaW5rLnRpdGxlID8gZXNjYXBlKGxpbmsudGl0bGUpIDogbnVsbDtcbiAgICBjb25zdCB0ZXh0ID0gY2FwWzFdLnJlcGxhY2UoL1xcXFwoW1xcW1xcXV0pL2csICckMScpO1xuICAgIGlmIChjYXBbMF0uY2hhckF0KDApICE9PSAnIScpIHtcbiAgICAgICAgbGV4ZXIuc3RhdGUuaW5MaW5rID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB7XG4gICAgICAgICAgICB0eXBlOiAnbGluaycsXG4gICAgICAgICAgICByYXcsXG4gICAgICAgICAgICBocmVmLFxuICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgdG9rZW5zOiBsZXhlci5pbmxpbmVUb2tlbnModGV4dClcbiAgICAgICAgfTtcbiAgICAgICAgbGV4ZXIuc3RhdGUuaW5MaW5rID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2ltYWdlJyxcbiAgICAgICAgcmF3LFxuICAgICAgICBocmVmLFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgdGV4dDogZXNjYXBlKHRleHQpXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGluZGVudENvZGVDb21wZW5zYXRpb24ocmF3LCB0ZXh0KSB7XG4gICAgY29uc3QgbWF0Y2hJbmRlbnRUb0NvZGUgPSByYXcubWF0Y2goL14oXFxzKykoPzpgYGApLyk7XG4gICAgaWYgKG1hdGNoSW5kZW50VG9Db2RlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBjb25zdCBpbmRlbnRUb0NvZGUgPSBtYXRjaEluZGVudFRvQ29kZVsxXTtcbiAgICByZXR1cm4gdGV4dFxuICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgIC5tYXAobm9kZSA9PiB7XG4gICAgICAgIGNvbnN0IG1hdGNoSW5kZW50SW5Ob2RlID0gbm9kZS5tYXRjaCgvXlxccysvKTtcbiAgICAgICAgaWYgKG1hdGNoSW5kZW50SW5Ob2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbaW5kZW50SW5Ob2RlXSA9IG1hdGNoSW5kZW50SW5Ob2RlO1xuICAgICAgICBpZiAoaW5kZW50SW5Ob2RlLmxlbmd0aCA+PSBpbmRlbnRUb0NvZGUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5zbGljZShpbmRlbnRUb0NvZGUubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9KVxuICAgICAgICAuam9pbignXFxuJyk7XG59XG4vKipcbiAqIFRva2VuaXplclxuICovXG5leHBvcnQgY2xhc3MgX1Rva2VuaXplciB7XG4gICAgb3B0aW9ucztcbiAgICBydWxlczsgLy8gc2V0IGJ5IHRoZSBsZXhlclxuICAgIGxleGVyOyAvLyBzZXQgYnkgdGhlIGxleGVyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IF9kZWZhdWx0cztcbiAgICB9XG4gICAgc3BhY2Uoc3JjKSB7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2submV3bGluZS5leGVjKHNyYyk7XG4gICAgICAgIGlmIChjYXAgJiYgY2FwWzBdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3NwYWNlJyxcbiAgICAgICAgICAgICAgICByYXc6IGNhcFswXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb2RlKHNyYykge1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmNvZGUuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoY2FwKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gY2FwWzBdLnJlcGxhY2UoL14gezEsNH0vZ20sICcnKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NvZGUnLFxuICAgICAgICAgICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICAgICAgICAgIGNvZGVCbG9ja1N0eWxlOiAnaW5kZW50ZWQnLFxuICAgICAgICAgICAgICAgIHRleHQ6ICF0aGlzLm9wdGlvbnMucGVkYW50aWNcbiAgICAgICAgICAgICAgICAgICAgPyBydHJpbSh0ZXh0LCAnXFxuJylcbiAgICAgICAgICAgICAgICAgICAgOiB0ZXh0XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGZlbmNlcyhzcmMpIHtcbiAgICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5mZW5jZXMuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoY2FwKSB7XG4gICAgICAgICAgICBjb25zdCByYXcgPSBjYXBbMF07XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gaW5kZW50Q29kZUNvbXBlbnNhdGlvbihyYXcsIGNhcFszXSB8fCAnJyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJyxcbiAgICAgICAgICAgICAgICByYXcsXG4gICAgICAgICAgICAgICAgbGFuZzogY2FwWzJdID8gY2FwWzJdLnRyaW0oKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLCAnJDEnKSA6IGNhcFsyXSxcbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGhlYWRpbmcoc3JjKSB7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suaGVhZGluZy5leGVjKHNyYyk7XG4gICAgICAgIGlmIChjYXApIHtcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gY2FwWzJdLnRyaW0oKTtcbiAgICAgICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyAjc1xuICAgICAgICAgICAgaWYgKC8jJC8udGVzdCh0ZXh0KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSBydHJpbSh0ZXh0LCAnIycpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRyaW1tZWQudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghdHJpbW1lZCB8fCAvICQvLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29tbW9uTWFyayByZXF1aXJlcyBzcGFjZSBiZWZvcmUgdHJhaWxpbmcgI3NcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRyaW1tZWQudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2hlYWRpbmcnLFxuICAgICAgICAgICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICAgICAgICAgIGRlcHRoOiBjYXBbMV0ubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgICAgdG9rZW5zOiB0aGlzLmxleGVyLmlubGluZSh0ZXh0KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBocihzcmMpIHtcbiAgICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5oci5leGVjKHNyYyk7XG4gICAgICAgIGlmIChjYXApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2hyJyxcbiAgICAgICAgICAgICAgICByYXc6IGNhcFswXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBibG9ja3F1b3RlKHNyYykge1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmJsb2NrcXVvdGUuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoY2FwKSB7XG4gICAgICAgICAgICAvLyBwcmVjZWRlIHNldGV4dCBjb250aW51YXRpb24gd2l0aCA0IHNwYWNlcyBzbyBpdCBpc24ndCBhIHNldGV4dFxuICAgICAgICAgICAgbGV0IHRleHQgPSBjYXBbMF0ucmVwbGFjZSgvXFxuIHswLDN9KCg/Oj0rfC0rKSAqKSg/PVxcbnwkKS9nLCAnXFxuICAgICQxJyk7XG4gICAgICAgICAgICB0ZXh0ID0gcnRyaW0odGV4dC5yZXBsYWNlKC9eICo+WyBcXHRdPy9nbSwgJycpLCAnXFxuJyk7XG4gICAgICAgICAgICBjb25zdCB0b3AgPSB0aGlzLmxleGVyLnN0YXRlLnRvcDtcbiAgICAgICAgICAgIHRoaXMubGV4ZXIuc3RhdGUudG9wID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IHRva2VucyA9IHRoaXMubGV4ZXIuYmxvY2tUb2tlbnModGV4dCk7XG4gICAgICAgICAgICB0aGlzLmxleGVyLnN0YXRlLnRvcCA9IHRvcDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Jsb2NrcXVvdGUnLFxuICAgICAgICAgICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICAgICAgICAgIHRva2VucyxcbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGxpc3Qoc3JjKSB7XG4gICAgICAgIGxldCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmxpc3QuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoY2FwKSB7XG4gICAgICAgICAgICBsZXQgYnVsbCA9IGNhcFsxXS50cmltKCk7XG4gICAgICAgICAgICBjb25zdCBpc29yZGVyZWQgPSBidWxsLmxlbmd0aCA+IDE7XG4gICAgICAgICAgICBjb25zdCBsaXN0ID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgICAgICAgICAgICByYXc6ICcnLFxuICAgICAgICAgICAgICAgIG9yZGVyZWQ6IGlzb3JkZXJlZCxcbiAgICAgICAgICAgICAgICBzdGFydDogaXNvcmRlcmVkID8gK2J1bGwuc2xpY2UoMCwgLTEpIDogJycsXG4gICAgICAgICAgICAgICAgbG9vc2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJ1bGwgPSBpc29yZGVyZWQgPyBgXFxcXGR7MSw5fVxcXFwke2J1bGwuc2xpY2UoLTEpfWAgOiBgXFxcXCR7YnVsbH1gO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICAgICAgICAgIGJ1bGwgPSBpc29yZGVyZWQgPyBidWxsIDogJ1sqKy1dJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEdldCBuZXh0IGxpc3QgaXRlbVxuICAgICAgICAgICAgY29uc3QgaXRlbVJlZ2V4ID0gbmV3IFJlZ0V4cChgXiggezAsM30ke2J1bGx9KSgoPzpbXFx0IF1bXlxcXFxuXSopPyg/OlxcXFxufCQpKWApO1xuICAgICAgICAgICAgbGV0IHJhdyA9ICcnO1xuICAgICAgICAgICAgbGV0IGl0ZW1Db250ZW50cyA9ICcnO1xuICAgICAgICAgICAgbGV0IGVuZHNXaXRoQmxhbmtMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBjdXJyZW50IGJ1bGxldCBwb2ludCBjYW4gc3RhcnQgYSBuZXcgTGlzdCBJdGVtXG4gICAgICAgICAgICB3aGlsZSAoc3JjKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZEVhcmx5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCEoY2FwID0gaXRlbVJlZ2V4LmV4ZWMoc3JjKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJ1bGVzLmJsb2NrLmhyLnRlc3Qoc3JjKSkgeyAvLyBFbmQgbGlzdCBpZiBidWxsZXQgd2FzIGFjdHVhbGx5IEhSIChwb3NzaWJseSBtb3ZlIGludG8gaXRlbVJlZ2V4PylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJhdyA9IGNhcFswXTtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGxldCBsaW5lID0gY2FwWzJdLnNwbGl0KCdcXG4nLCAxKVswXS5yZXBsYWNlKC9eXFx0Ky8sICh0KSA9PiAnICcucmVwZWF0KDMgKiB0Lmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIGxldCBuZXh0TGluZSA9IHNyYy5zcGxpdCgnXFxuJywgMSlbMF07XG4gICAgICAgICAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAyO1xuICAgICAgICAgICAgICAgICAgICBpdGVtQ29udGVudHMgPSBsaW5lLnRyaW1TdGFydCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gY2FwWzJdLnNlYXJjaCgvW14gXS8pOyAvLyBGaW5kIGZpcnN0IG5vbi1zcGFjZSBjaGFyXG4gICAgICAgICAgICAgICAgICAgIGluZGVudCA9IGluZGVudCA+IDQgPyAxIDogaW5kZW50OyAvLyBUcmVhdCBpbmRlbnRlZCBjb2RlIGJsb2NrcyAoPiA0IHNwYWNlcykgYXMgaGF2aW5nIG9ubHkgMSBpbmRlbnRcbiAgICAgICAgICAgICAgICAgICAgaXRlbUNvbnRlbnRzID0gbGluZS5zbGljZShpbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gY2FwWzFdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGJsYW5rTGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICghbGluZSAmJiAvXiAqJC8udGVzdChuZXh0TGluZSkpIHsgLy8gSXRlbXMgYmVnaW4gd2l0aCBhdCBtb3N0IG9uZSBibGFuayBsaW5lXG4gICAgICAgICAgICAgICAgICAgIHJhdyArPSBuZXh0TGluZSArICdcXG4nO1xuICAgICAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKG5leHRMaW5lLmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgICAgICAgICBlbmRFYXJseSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZW5kRWFybHkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dEJ1bGxldFJlZ2V4ID0gbmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsIGluZGVudCAtIDEpfX0oPzpbKistXXxcXFxcZHsxLDl9Wy4pXSkoKD86WyBcXHRdW15cXFxcbl0qKT8oPzpcXFxcbnwkKSlgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaHJSZWdleCA9IG5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLCBpbmRlbnQgLSAxKX19KCg/Oi0gKil7Myx9fCg/Ol8gKil7Myx9fCg/OlxcXFwqICopezMsfSkoPzpcXFxcbit8JClgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmVuY2VzQmVnaW5SZWdleCA9IG5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLCBpbmRlbnQgLSAxKX19KD86XFxgXFxgXFxgfH5+filgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGluZ0JlZ2luUmVnZXggPSBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSNgKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZm9sbG93aW5nIGxpbmVzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBMaXN0IEl0ZW1cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNyYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3TGluZSA9IHNyYy5zcGxpdCgnXFxuJywgMSlbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGluZSA9IHJhd0xpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZS1hbGlnbiB0byBmb2xsb3cgY29tbW9ubWFyayBuZXN0aW5nIHJ1bGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExpbmUgPSBuZXh0TGluZS5yZXBsYWNlKC9eIHsxLDR9KD89KCB7NH0pKlteIF0pL2csICcgICcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5kIGxpc3QgaXRlbSBpZiBmb3VuZCBjb2RlIGZlbmNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZlbmNlc0JlZ2luUmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuZCBsaXN0IGl0ZW0gaWYgZm91bmQgc3RhcnQgb2YgbmV3IGhlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkaW5nQmVnaW5SZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5kIGxpc3QgaXRlbSBpZiBmb3VuZCBzdGFydCBvZiBuZXcgYnVsbGV0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEJ1bGxldFJlZ2V4LnRlc3QobmV4dExpbmUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIb3Jpem9udGFsIHJ1bGUgZm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoclJlZ2V4LnRlc3Qoc3JjKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRMaW5lLnNlYXJjaCgvW14gXS8pID49IGluZGVudCB8fCAhbmV4dExpbmUudHJpbSgpKSB7IC8vIERlZGVudCBpZiBwb3NzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1Db250ZW50cyArPSAnXFxuJyArIG5leHRMaW5lLnNsaWNlKGluZGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgZW5vdWdoIGluZGVudGF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsYW5rTGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYWdyYXBoIGNvbnRpbnVhdGlvbiB1bmxlc3MgbGFzdCBsaW5lIHdhcyBhIGRpZmZlcmVudCBibG9jayBsZXZlbCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUuc2VhcmNoKC9bXiBdLykgPj0gNCkgeyAvLyBpbmRlbnRlZCBjb2RlIGJsb2NrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmVuY2VzQmVnaW5SZWdleC50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGluZ0JlZ2luUmVnZXgudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhyUmVnZXgudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUNvbnRlbnRzICs9ICdcXG4nICsgbmV4dExpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJsYW5rTGluZSAmJiAhbmV4dExpbmUudHJpbSgpKSB7IC8vIENoZWNrIGlmIGN1cnJlbnQgbGluZSBpcyBibGFua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYW5rTGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByYXcgKz0gcmF3TGluZSArICdcXG4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhyYXdMaW5lLmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IG5leHRMaW5lLnNsaWNlKGluZGVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFsaXN0Lmxvb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBpdGVtIGVuZGVkIHdpdGggYSBibGFuayBsaW5lLCB0aGUgbGlzdCBpcyBsb29zZVxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5kc1dpdGhCbGFua0xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QubG9vc2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKC9cXG4gKlxcbiAqJC8udGVzdChyYXcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRzV2l0aEJsYW5rTGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGlzdGFzayA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGlzY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdGFzayBsaXN0IGl0ZW1zXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5nZm0pIHtcbiAgICAgICAgICAgICAgICAgICAgaXN0YXNrID0gL15cXFtbIHhYXVxcXSAvLmV4ZWMoaXRlbUNvbnRlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzdGFzaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNjaGVja2VkID0gaXN0YXNrWzBdICE9PSAnWyBdICc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtQ29udGVudHMgPSBpdGVtQ29udGVudHMucmVwbGFjZSgvXlxcW1sgeFhdXFxdICsvLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGlzdC5pdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpc3RfaXRlbScsXG4gICAgICAgICAgICAgICAgICAgIHJhdyxcbiAgICAgICAgICAgICAgICAgICAgdGFzazogISFpc3Rhc2ssXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ6IGlzY2hlY2tlZCxcbiAgICAgICAgICAgICAgICAgICAgbG9vc2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBpdGVtQ29udGVudHMsXG4gICAgICAgICAgICAgICAgICAgIHRva2VuczogW11cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsaXN0LnJhdyArPSByYXc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBEbyBub3QgY29uc3VtZSBuZXdsaW5lcyBhdCBlbmQgb2YgZmluYWwgaXRlbS4gQWx0ZXJuYXRpdmVseSwgbWFrZSBpdGVtUmVnZXggKnN0YXJ0KiB3aXRoIGFueSBuZXdsaW5lcyB0byBzaW1wbGlmeS9zcGVlZCB1cCBlbmRzV2l0aEJsYW5rTGluZSBsb2dpY1xuICAgICAgICAgICAgbGlzdC5pdGVtc1tsaXN0Lml0ZW1zLmxlbmd0aCAtIDFdLnJhdyA9IHJhdy50cmltRW5kKCk7XG4gICAgICAgICAgICAobGlzdC5pdGVtc1tsaXN0Lml0ZW1zLmxlbmd0aCAtIDFdKS50ZXh0ID0gaXRlbUNvbnRlbnRzLnRyaW1FbmQoKTtcbiAgICAgICAgICAgIGxpc3QucmF3ID0gbGlzdC5yYXcudHJpbUVuZCgpO1xuICAgICAgICAgICAgLy8gSXRlbSBjaGlsZCB0b2tlbnMgaGFuZGxlZCBoZXJlIGF0IGVuZCBiZWNhdXNlIHdlIG5lZWRlZCB0byBoYXZlIHRoZSBmaW5hbCBpdGVtIHRvIHRyaW0gaXQgZmlyc3RcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMubGV4ZXIuc3RhdGUudG9wID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGlzdC5pdGVtc1tpXS50b2tlbnMgPSB0aGlzLmxleGVyLmJsb2NrVG9rZW5zKGxpc3QuaXRlbXNbaV0udGV4dCwgW10pO1xuICAgICAgICAgICAgICAgIGlmICghbGlzdC5sb29zZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBsaXN0IHNob3VsZCBiZSBsb29zZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGFjZXJzID0gbGlzdC5pdGVtc1tpXS50b2tlbnMuZmlsdGVyKHQgPT4gdC50eXBlID09PSAnc3BhY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzTXVsdGlwbGVMaW5lQnJlYWtzID0gc3BhY2Vycy5sZW5ndGggPiAwICYmIHNwYWNlcnMuc29tZSh0ID0+IC9cXG4uKlxcbi8udGVzdCh0LnJhdykpO1xuICAgICAgICAgICAgICAgICAgICBsaXN0Lmxvb3NlID0gaGFzTXVsdGlwbGVMaW5lQnJlYWtzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldCBhbGwgaXRlbXMgdG8gbG9vc2UgaWYgbGlzdCBpcyBsb29zZVxuICAgICAgICAgICAgaWYgKGxpc3QubG9vc2UpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdC5pdGVtc1tpXS5sb29zZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaHRtbChzcmMpIHtcbiAgICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5odG1sLmV4ZWMoc3JjKTtcbiAgICAgICAgaWYgKGNhcCkge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2h0bWwnLFxuICAgICAgICAgICAgICAgIGJsb2NrOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICAgICAgICAgIHByZTogY2FwWzFdID09PSAncHJlJyB8fCBjYXBbMV0gPT09ICdzY3JpcHQnIHx8IGNhcFsxXSA9PT0gJ3N0eWxlJyxcbiAgICAgICAgICAgICAgICB0ZXh0OiBjYXBbMF1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVmKHNyYykge1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmRlZi5leGVjKHNyYyk7XG4gICAgICAgIGlmIChjYXApIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZyA9IGNhcFsxXS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJyAnKTtcbiAgICAgICAgICAgIGNvbnN0IGhyZWYgPSBjYXBbMl0gPyBjYXBbMl0ucmVwbGFjZSgvXjwoLiopPiQvLCAnJDEnKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLCAnJDEnKSA6ICcnO1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBjYXBbM10gPyBjYXBbM10uc3Vic3RyaW5nKDEsIGNhcFszXS5sZW5ndGggLSAxKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLCAnJDEnKSA6IGNhcFszXTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2RlZicsXG4gICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgICAgICAgdGl0bGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGFibGUoc3JjKSB7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2sudGFibGUuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoIWNhcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghL1s6fF0vLnRlc3QoY2FwWzJdKSkge1xuICAgICAgICAgICAgLy8gZGVsaW1pdGVyIHJvdyBtdXN0IGhhdmUgYSBwaXBlICh8KSBvciBjb2xvbiAoOikgb3RoZXJ3aXNlIGl0IGlzIGEgc2V0ZXh0IGhlYWRpbmdcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWFkZXJzID0gc3BsaXRDZWxscyhjYXBbMV0pO1xuICAgICAgICBjb25zdCBhbGlnbnMgPSBjYXBbMl0ucmVwbGFjZSgvXlxcfHxcXHwgKiQvZywgJycpLnNwbGl0KCd8Jyk7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBjYXBbM10gJiYgY2FwWzNdLnRyaW0oKSA/IGNhcFszXS5yZXBsYWNlKC9cXG5bIFxcdF0qJC8sICcnKS5zcGxpdCgnXFxuJykgOiBbXTtcbiAgICAgICAgY29uc3QgaXRlbSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICd0YWJsZScsXG4gICAgICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgICAgIGhlYWRlcjogW10sXG4gICAgICAgICAgICBhbGlnbjogW10sXG4gICAgICAgICAgICByb3dzOiBbXVxuICAgICAgICB9O1xuICAgICAgICBpZiAoaGVhZGVycy5sZW5ndGggIT09IGFsaWducy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGhlYWRlciBhbmQgYWxpZ24gY29sdW1ucyBtdXN0IGJlIGVxdWFsLCByb3dzIGNhbiBiZSBkaWZmZXJlbnQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBhbGlnbiBvZiBhbGlnbnMpIHtcbiAgICAgICAgICAgIGlmICgvXiAqLSs6ICokLy50ZXN0KGFsaWduKSkge1xuICAgICAgICAgICAgICAgIGl0ZW0uYWxpZ24ucHVzaCgncmlnaHQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKC9eICo6LSs6ICokLy50ZXN0KGFsaWduKSkge1xuICAgICAgICAgICAgICAgIGl0ZW0uYWxpZ24ucHVzaCgnY2VudGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgvXiAqOi0rICokLy50ZXN0KGFsaWduKSkge1xuICAgICAgICAgICAgICAgIGl0ZW0uYWxpZ24ucHVzaCgnbGVmdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlbS5hbGlnbi5wdXNoKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgaGVhZGVyIG9mIGhlYWRlcnMpIHtcbiAgICAgICAgICAgIGl0ZW0uaGVhZGVyLnB1c2goe1xuICAgICAgICAgICAgICAgIHRleHQ6IGhlYWRlcixcbiAgICAgICAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKGhlYWRlcilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgICAgIGl0ZW0ucm93cy5wdXNoKHNwbGl0Q2VsbHMocm93LCBpdGVtLmhlYWRlci5sZW5ndGgpLm1hcChjZWxsID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjZWxsLFxuICAgICAgICAgICAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKGNlbGwpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gICAgbGhlYWRpbmcoc3JjKSB7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2subGhlYWRpbmcuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoY2FwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdoZWFkaW5nJyxcbiAgICAgICAgICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgICAgICAgICBkZXB0aDogY2FwWzJdLmNoYXJBdCgwKSA9PT0gJz0nID8gMSA6IDIsXG4gICAgICAgICAgICAgICAgdGV4dDogY2FwWzFdLFxuICAgICAgICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUoY2FwWzFdKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYXJhZ3JhcGgoc3JjKSB7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2sucGFyYWdyYXBoLmV4ZWMoc3JjKTtcbiAgICAgICAgaWYgKGNhcCkge1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGNhcFsxXS5jaGFyQXQoY2FwWzFdLmxlbmd0aCAtIDEpID09PSAnXFxuJ1xuICAgICAgICAgICAgICAgID8gY2FwWzFdLnNsaWNlKDAsIC0xKVxuICAgICAgICAgICAgICAgIDogY2FwWzFdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAncGFyYWdyYXBoJyxcbiAgICAgICAgICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUodGV4dClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGV4dChzcmMpIHtcbiAgICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay50ZXh0LmV4ZWMoc3JjKTtcbiAgICAgICAgaWYgKGNhcCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgICAgICAgICAgdGV4dDogY2FwWzBdLFxuICAgICAgICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUoY2FwWzBdKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlc2NhcGUoc3JjKSB7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmVzY2FwZS5leGVjKHNyYyk7XG4gICAgICAgIGlmIChjYXApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2VzY2FwZScsXG4gICAgICAgICAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgICAgICAgICAgdGV4dDogZXNjYXBlKGNhcFsxXSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGFnKHNyYykge1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS50YWcuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoY2FwKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rICYmIC9ePGEgL2kudGVzdChjYXBbMF0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsgJiYgL148XFwvYT4vaS50ZXN0KGNhcFswXSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxleGVyLnN0YXRlLmluTGluayA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2sgJiYgL148KHByZXxjb2RlfGtiZHxzY3JpcHQpKFxcc3w+KS9pLnRlc3QoY2FwWzBdKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2sgJiYgL148XFwvKHByZXxjb2RlfGtiZHxzY3JpcHQpKFxcc3w+KS9pLnRlc3QoY2FwWzBdKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnaHRtbCcsXG4gICAgICAgICAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgICAgICAgICAgaW5MaW5rOiB0aGlzLmxleGVyLnN0YXRlLmluTGluayxcbiAgICAgICAgICAgICAgICBpblJhd0Jsb2NrOiB0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2ssXG4gICAgICAgICAgICAgICAgYmxvY2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRleHQ6IGNhcFswXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsaW5rKHNyYykge1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS5saW5rLmV4ZWMoc3JjKTtcbiAgICAgICAgaWYgKGNhcCkge1xuICAgICAgICAgICAgY29uc3QgdHJpbW1lZFVybCA9IGNhcFsyXS50cmltKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5wZWRhbnRpYyAmJiAvXjwvLnRlc3QodHJpbW1lZFVybCkpIHtcbiAgICAgICAgICAgICAgICAvLyBjb21tb25tYXJrIHJlcXVpcmVzIG1hdGNoaW5nIGFuZ2xlIGJyYWNrZXRzXG4gICAgICAgICAgICAgICAgaWYgKCEoLz4kLy50ZXN0KHRyaW1tZWRVcmwpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVuZGluZyBhbmdsZSBicmFja2V0IGNhbm5vdCBiZSBlc2NhcGVkXG4gICAgICAgICAgICAgICAgY29uc3QgcnRyaW1TbGFzaCA9IHJ0cmltKHRyaW1tZWRVcmwuc2xpY2UoMCwgLTEpLCAnXFxcXCcpO1xuICAgICAgICAgICAgICAgIGlmICgodHJpbW1lZFVybC5sZW5ndGggLSBydHJpbVNsYXNoLmxlbmd0aCkgJSAyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmaW5kIGNsb3NpbmcgcGFyZW50aGVzaXNcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0UGFyZW5JbmRleCA9IGZpbmRDbG9zaW5nQnJhY2tldChjYXBbMl0sICcoKScpO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0UGFyZW5JbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gY2FwWzBdLmluZGV4T2YoJyEnKSA9PT0gMCA/IDUgOiA0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5rTGVuID0gc3RhcnQgKyBjYXBbMV0ubGVuZ3RoICsgbGFzdFBhcmVuSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGNhcFsyXSA9IGNhcFsyXS5zdWJzdHJpbmcoMCwgbGFzdFBhcmVuSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjYXBbMF0gPSBjYXBbMF0uc3Vic3RyaW5nKDAsIGxpbmtMZW4pLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgY2FwWzNdID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGhyZWYgPSBjYXBbMl07XG4gICAgICAgICAgICBsZXQgdGl0bGUgPSAnJztcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGxpdCBwZWRhbnRpYyBocmVmIGFuZCB0aXRsZVxuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmsgPSAvXihbXidcIl0qW15cXHNdKVxccysoWydcIl0pKC4qKVxcMi8uZXhlYyhocmVmKTtcbiAgICAgICAgICAgICAgICBpZiAobGluaykge1xuICAgICAgICAgICAgICAgICAgICBocmVmID0gbGlua1sxXTtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBsaW5rWzNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpdGxlID0gY2FwWzNdID8gY2FwWzNdLnNsaWNlKDEsIC0xKSA6ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaHJlZiA9IGhyZWYudHJpbSgpO1xuICAgICAgICAgICAgaWYgKC9ePC8udGVzdChocmVmKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMgJiYgISgvPiQvLnRlc3QodHJpbW1lZFVybCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHBlZGFudGljIGFsbG93cyBzdGFydGluZyBhbmdsZSBicmFja2V0IHdpdGhvdXQgZW5kaW5nIGFuZ2xlIGJyYWNrZXRcbiAgICAgICAgICAgICAgICAgICAgaHJlZiA9IGhyZWYuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBocmVmID0gaHJlZi5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dExpbmsoY2FwLCB7XG4gICAgICAgICAgICAgICAgaHJlZjogaHJlZiA/IGhyZWYucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiBocmVmLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSA/IHRpdGxlLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICckMScpIDogdGl0bGVcbiAgICAgICAgICAgIH0sIGNhcFswXSwgdGhpcy5sZXhlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVmbGluayhzcmMsIGxpbmtzKSB7XG4gICAgICAgIGxldCBjYXA7XG4gICAgICAgIGlmICgoY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUucmVmbGluay5leGVjKHNyYykpXG4gICAgICAgICAgICB8fCAoY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUubm9saW5rLmV4ZWMoc3JjKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtTdHJpbmcgPSAoY2FwWzJdIHx8IGNhcFsxXSkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGxpbmtzW2xpbmtTdHJpbmcudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgICBpZiAoIWxpbmspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gY2FwWzBdLmNoYXJBdCgwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgICAgIHJhdzogdGV4dCxcbiAgICAgICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0TGluayhjYXAsIGxpbmssIGNhcFswXSwgdGhpcy5sZXhlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW1TdHJvbmcoc3JjLCBtYXNrZWRTcmMsIHByZXZDaGFyID0gJycpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdMRGVsaW0uZXhlYyhzcmMpO1xuICAgICAgICBpZiAoIW1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyBfIGNhbid0IGJlIGJldHdlZW4gdHdvIGFscGhhbnVtZXJpY3MuIFxccHtMfVxccHtOfSBpbmNsdWRlcyBub24tZW5nbGlzaCBhbHBoYWJldC9udW1iZXJzIGFzIHdlbGxcbiAgICAgICAgaWYgKG1hdGNoWzNdICYmIHByZXZDaGFyLm1hdGNoKC9bXFxwe0x9XFxwe059XS91KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBtYXRjaFsxXSB8fCBtYXRjaFsyXSB8fCAnJztcbiAgICAgICAgaWYgKCFuZXh0Q2hhciB8fCAhcHJldkNoYXIgfHwgdGhpcy5ydWxlcy5pbmxpbmUucHVuY3R1YXRpb24uZXhlYyhwcmV2Q2hhcikpIHtcbiAgICAgICAgICAgIC8vIHVuaWNvZGUgUmVnZXggY291bnRzIGVtb2ppIGFzIDEgY2hhcjsgc3ByZWFkIGludG8gYXJyYXkgZm9yIHByb3BlciBjb3VudCAodXNlZCBtdWx0aXBsZSB0aW1lcyBiZWxvdylcbiAgICAgICAgICAgIGNvbnN0IGxMZW5ndGggPSBbLi4ubWF0Y2hbMF1dLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBsZXQgckRlbGltLCByTGVuZ3RoLCBkZWxpbVRvdGFsID0gbExlbmd0aCwgbWlkRGVsaW1Ub3RhbCA9IDA7XG4gICAgICAgICAgICBjb25zdCBlbmRSZWcgPSBtYXRjaFswXVswXSA9PT0gJyonID8gdGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdSRGVsaW1Bc3QgOiB0aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZ1JEZWxpbVVuZDtcbiAgICAgICAgICAgIGVuZFJlZy5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgLy8gQ2xpcCBtYXNrZWRTcmMgdG8gc2FtZSBzZWN0aW9uIG9mIHN0cmluZyBhcyBzcmMgKG1vdmUgdG8gbGV4ZXI/KVxuICAgICAgICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKC0xICogc3JjLmxlbmd0aCArIGxMZW5ndGgpO1xuICAgICAgICAgICAgd2hpbGUgKChtYXRjaCA9IGVuZFJlZy5leGVjKG1hc2tlZFNyYykpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByRGVsaW0gPSBtYXRjaFsxXSB8fCBtYXRjaFsyXSB8fCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBtYXRjaFs2XTtcbiAgICAgICAgICAgICAgICBpZiAoIXJEZWxpbSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgc2luZ2xlICogaW4gX19hYmMqYWJjX19cbiAgICAgICAgICAgICAgICByTGVuZ3RoID0gWy4uLnJEZWxpbV0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFszXSB8fCBtYXRjaFs0XSkgeyAvLyBmb3VuZCBhbm90aGVyIExlZnQgRGVsaW1cbiAgICAgICAgICAgICAgICAgICAgZGVsaW1Ub3RhbCArPSByTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hbNV0gfHwgbWF0Y2hbNl0pIHsgLy8gZWl0aGVyIExlZnQgb3IgUmlnaHQgRGVsaW1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxMZW5ndGggJSAzICYmICEoKGxMZW5ndGggKyByTGVuZ3RoKSAlIDMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaWREZWxpbVRvdGFsICs9IHJMZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gQ29tbW9uTWFyayBFbXBoYXNpcyBSdWxlcyA5LTEwXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsaW1Ub3RhbCAtPSByTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChkZWxpbVRvdGFsID4gMClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIEhhdmVuJ3QgZm91bmQgZW5vdWdoIGNsb3NpbmcgZGVsaW1pdGVyc1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBleHRyYSBjaGFyYWN0ZXJzLiAqYSoqKiAtPiAqYSpcbiAgICAgICAgICAgICAgICByTGVuZ3RoID0gTWF0aC5taW4ockxlbmd0aCwgckxlbmd0aCArIGRlbGltVG90YWwgKyBtaWREZWxpbVRvdGFsKTtcbiAgICAgICAgICAgICAgICAvLyBjaGFyIGxlbmd0aCBjYW4gYmUgPjEgZm9yIHVuaWNvZGUgY2hhcmFjdGVycztcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0Q2hhckxlbmd0aCA9IFsuLi5tYXRjaFswXV1bMF0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHNyYy5zbGljZSgwLCBsTGVuZ3RoICsgbWF0Y2guaW5kZXggKyBsYXN0Q2hhckxlbmd0aCArIHJMZW5ndGgpO1xuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBgZW1gIGlmIHNtYWxsZXN0IGRlbGltaXRlciBoYXMgb2RkIGNoYXIgY291bnQuICphKioqXG4gICAgICAgICAgICAgICAgaWYgKE1hdGgubWluKGxMZW5ndGgsIHJMZW5ndGgpICUgMikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gcmF3LnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlbScsXG4gICAgICAgICAgICAgICAgICAgICAgICByYXcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zOiB0aGlzLmxleGVyLmlubGluZVRva2Vucyh0ZXh0KVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgJ3N0cm9uZycgaWYgc21hbGxlc3QgZGVsaW1pdGVyIGhhcyBldmVuIGNoYXIgY291bnQuICoqYSoqKlxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSByYXcuc2xpY2UoMiwgLTIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJvbmcnLFxuICAgICAgICAgICAgICAgICAgICByYXcsXG4gICAgICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmVUb2tlbnModGV4dClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNvZGVzcGFuKHNyYykge1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS5jb2RlLmV4ZWMoc3JjKTtcbiAgICAgICAgaWYgKGNhcCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBjYXBbMl0ucmVwbGFjZSgvXFxuL2csICcgJyk7XG4gICAgICAgICAgICBjb25zdCBoYXNOb25TcGFjZUNoYXJzID0gL1teIF0vLnRlc3QodGV4dCk7XG4gICAgICAgICAgICBjb25zdCBoYXNTcGFjZUNoYXJzT25Cb3RoRW5kcyA9IC9eIC8udGVzdCh0ZXh0KSAmJiAvICQvLnRlc3QodGV4dCk7XG4gICAgICAgICAgICBpZiAoaGFzTm9uU3BhY2VDaGFycyAmJiBoYXNTcGFjZUNoYXJzT25Cb3RoRW5kcykge1xuICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGV4dCA9IGVzY2FwZSh0ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NvZGVzcGFuJyxcbiAgICAgICAgICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGJyKHNyYykge1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS5ici5leGVjKHNyYyk7XG4gICAgICAgIGlmIChjYXApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2JyJyxcbiAgICAgICAgICAgICAgICByYXc6IGNhcFswXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWwoc3JjKSB7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmRlbC5leGVjKHNyYyk7XG4gICAgICAgIGlmIChjYXApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2RlbCcsXG4gICAgICAgICAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgICAgICAgICAgdGV4dDogY2FwWzJdLFxuICAgICAgICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmVUb2tlbnMoY2FwWzJdKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhdXRvbGluayhzcmMpIHtcbiAgICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUuYXV0b2xpbmsuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoY2FwKSB7XG4gICAgICAgICAgICBsZXQgdGV4dCwgaHJlZjtcbiAgICAgICAgICAgIGlmIChjYXBbMl0gPT09ICdAJykge1xuICAgICAgICAgICAgICAgIHRleHQgPSBlc2NhcGUoY2FwWzFdKTtcbiAgICAgICAgICAgICAgICBocmVmID0gJ21haWx0bzonICsgdGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRleHQgPSBlc2NhcGUoY2FwWzFdKTtcbiAgICAgICAgICAgICAgICBocmVmID0gdGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLFxuICAgICAgICAgICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgICAgaHJlZixcbiAgICAgICAgICAgICAgICB0b2tlbnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3OiB0ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cmwoc3JjKSB7XG4gICAgICAgIGxldCBjYXA7XG4gICAgICAgIGlmIChjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS51cmwuZXhlYyhzcmMpKSB7XG4gICAgICAgICAgICBsZXQgdGV4dCwgaHJlZjtcbiAgICAgICAgICAgIGlmIChjYXBbMl0gPT09ICdAJykge1xuICAgICAgICAgICAgICAgIHRleHQgPSBlc2NhcGUoY2FwWzBdKTtcbiAgICAgICAgICAgICAgICBocmVmID0gJ21haWx0bzonICsgdGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGRvIGV4dGVuZGVkIGF1dG9saW5rIHBhdGggdmFsaWRhdGlvblxuICAgICAgICAgICAgICAgIGxldCBwcmV2Q2FwWmVybztcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZDYXBaZXJvID0gY2FwWzBdO1xuICAgICAgICAgICAgICAgICAgICBjYXBbMF0gPSB0aGlzLnJ1bGVzLmlubGluZS5fYmFja3BlZGFsLmV4ZWMoY2FwWzBdKT8uWzBdID8/ICcnO1xuICAgICAgICAgICAgICAgIH0gd2hpbGUgKHByZXZDYXBaZXJvICE9PSBjYXBbMF0pO1xuICAgICAgICAgICAgICAgIHRleHQgPSBlc2NhcGUoY2FwWzBdKTtcbiAgICAgICAgICAgICAgICBpZiAoY2FwWzFdID09PSAnd3d3LicpIHtcbiAgICAgICAgICAgICAgICAgICAgaHJlZiA9ICdodHRwOi8vJyArIGNhcFswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhyZWYgPSBjYXBbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsXG4gICAgICAgICAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgICBocmVmLFxuICAgICAgICAgICAgICAgIHRva2VuczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICByYXc6IHRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGlubGluZVRleHQoc3JjKSB7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLnRleHQuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoY2FwKSB7XG4gICAgICAgICAgICBsZXQgdGV4dDtcbiAgICAgICAgICAgIGlmICh0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2spIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gY2FwWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IGVzY2FwZShjYXBbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBlZGl0LCBub29wVGVzdCB9IGZyb20gJy4vaGVscGVycy50cyc7XG4vKipcbiAqIEJsb2NrLUxldmVsIEdyYW1tYXJcbiAqL1xuY29uc3QgbmV3bGluZSA9IC9eKD86ICooPzpcXG58JCkpKy87XG5jb25zdCBibG9ja0NvZGUgPSAvXiggezR9W15cXG5dKyg/Olxcbig/OiAqKD86XFxufCQpKSopPykrLztcbmNvbnN0IGZlbmNlcyA9IC9eIHswLDN9KGB7Myx9KD89W15gXFxuXSooPzpcXG58JCkpfH57Myx9KShbXlxcbl0qKSg/OlxcbnwkKSg/OnwoW1xcc1xcU10qPykoPzpcXG58JCkpKD86IHswLDN9XFwxW35gXSogKig/PVxcbnwkKXwkKS87XG5jb25zdCBociA9IC9eIHswLDN9KCg/Oi1bXFx0IF0qKXszLH18KD86X1sgXFx0XSopezMsfXwoPzpcXCpbIFxcdF0qKXszLH0pKD86XFxuK3wkKS87XG5jb25zdCBoZWFkaW5nID0gL14gezAsM30oI3sxLDZ9KSg/PVxcc3wkKSguKikoPzpcXG4rfCQpLztcbmNvbnN0IGJ1bGxldCA9IC8oPzpbKistXXxcXGR7MSw5fVsuKV0pLztcbmNvbnN0IGxoZWFkaW5nID0gZWRpdCgvXig/IWJ1bGwgfGJsb2NrQ29kZXxmZW5jZXN8YmxvY2txdW90ZXxoZWFkaW5nfGh0bWwpKCg/Oi58XFxuKD8hXFxzKj9cXG58YnVsbCB8YmxvY2tDb2RlfGZlbmNlc3xibG9ja3F1b3RlfGhlYWRpbmd8aHRtbCkpKz8pXFxuIHswLDN9KD0rfC0rKSAqKD86XFxuK3wkKS8pXG4gICAgLnJlcGxhY2UoL2J1bGwvZywgYnVsbGV0KSAvLyBsaXN0cyBjYW4gaW50ZXJydXB0XG4gICAgLnJlcGxhY2UoL2Jsb2NrQ29kZS9nLCAvIHs0fS8pIC8vIGluZGVudGVkIGNvZGUgYmxvY2tzIGNhbiBpbnRlcnJ1cHRcbiAgICAucmVwbGFjZSgvZmVuY2VzL2csIC8gezAsM30oPzpgezMsfXx+ezMsfSkvKSAvLyBmZW5jZWQgY29kZSBibG9ja3MgY2FuIGludGVycnVwdFxuICAgIC5yZXBsYWNlKC9ibG9ja3F1b3RlL2csIC8gezAsM30+LykgLy8gYmxvY2txdW90ZSBjYW4gaW50ZXJydXB0XG4gICAgLnJlcGxhY2UoL2hlYWRpbmcvZywgLyB7MCwzfSN7MSw2fS8pIC8vIEFUWCBoZWFkaW5nIGNhbiBpbnRlcnJ1cHRcbiAgICAucmVwbGFjZSgvaHRtbC9nLCAvIHswLDN9PFteXFxuPl0rPlxcbi8pIC8vIGJsb2NrIGh0bWwgY2FuIGludGVycnVwdFxuICAgIC5nZXRSZWdleCgpO1xuY29uc3QgX3BhcmFncmFwaCA9IC9eKFteXFxuXSsoPzpcXG4oPyFocnxoZWFkaW5nfGxoZWFkaW5nfGJsb2NrcXVvdGV8ZmVuY2VzfGxpc3R8aHRtbHx0YWJsZXwgK1xcbilbXlxcbl0rKSopLztcbmNvbnN0IGJsb2NrVGV4dCA9IC9eW15cXG5dKy87XG5jb25zdCBfYmxvY2tMYWJlbCA9IC8oPyFcXHMqXFxdKSg/OlxcXFwufFteXFxbXFxdXFxcXF0pKy87XG5jb25zdCBkZWYgPSBlZGl0KC9eIHswLDN9XFxbKGxhYmVsKVxcXTogKig/OlxcbiAqKT8oW148XFxzXVteXFxzXSp8PC4qPz4pKD86KD86ICsoPzpcXG4gKik/fCAqXFxuICopKHRpdGxlKSk/ICooPzpcXG4rfCQpLylcbiAgICAucmVwbGFjZSgnbGFiZWwnLCBfYmxvY2tMYWJlbClcbiAgICAucmVwbGFjZSgndGl0bGUnLCAvKD86XCIoPzpcXFxcXCI/fFteXCJcXFxcXSkqXCJ8J1teJ1xcbl0qKD86XFxuW14nXFxuXSspKlxcbj8nfFxcKFteKCldKlxcKSkvKVxuICAgIC5nZXRSZWdleCgpO1xuY29uc3QgbGlzdCA9IGVkaXQoL14oIHswLDN9YnVsbCkoWyBcXHRdW15cXG5dKz8pPyg/OlxcbnwkKS8pXG4gICAgLnJlcGxhY2UoL2J1bGwvZywgYnVsbGV0KVxuICAgIC5nZXRSZWdleCgpO1xuY29uc3QgX3RhZyA9ICdhZGRyZXNzfGFydGljbGV8YXNpZGV8YmFzZXxiYXNlZm9udHxibG9ja3F1b3RlfGJvZHl8Y2FwdGlvbidcbiAgICArICd8Y2VudGVyfGNvbHxjb2xncm91cHxkZHxkZXRhaWxzfGRpYWxvZ3xkaXJ8ZGl2fGRsfGR0fGZpZWxkc2V0fGZpZ2NhcHRpb24nXG4gICAgKyAnfGZpZ3VyZXxmb290ZXJ8Zm9ybXxmcmFtZXxmcmFtZXNldHxoWzEtNl18aGVhZHxoZWFkZXJ8aHJ8aHRtbHxpZnJhbWUnXG4gICAgKyAnfGxlZ2VuZHxsaXxsaW5rfG1haW58bWVudXxtZW51aXRlbXxtZXRhfG5hdnxub2ZyYW1lc3xvbHxvcHRncm91cHxvcHRpb24nXG4gICAgKyAnfHB8cGFyYW18c2VhcmNofHNlY3Rpb258c3VtbWFyeXx0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0aGVhZHx0aXRsZSdcbiAgICArICd8dHJ8dHJhY2t8dWwnO1xuY29uc3QgX2NvbW1lbnQgPSAvPCEtLSg/Oi0/PnxbXFxzXFxTXSo/KD86LS0+fCQpKS87XG5jb25zdCBodG1sID0gZWRpdCgnXiB7MCwzfSg/OicgLy8gb3B0aW9uYWwgaW5kZW50YXRpb25cbiAgICArICc8KHNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpW1xcXFxzPl1bXFxcXHNcXFxcU10qPyg/OjwvXFxcXDE+W15cXFxcbl0qXFxcXG4rfCQpJyAvLyAoMSlcbiAgICArICd8Y29tbWVudFteXFxcXG5dKihcXFxcbit8JCknIC8vICgyKVxuICAgICsgJ3w8XFxcXD9bXFxcXHNcXFxcU10qPyg/OlxcXFw/PlxcXFxuKnwkKScgLy8gKDMpXG4gICAgKyAnfDwhW0EtWl1bXFxcXHNcXFxcU10qPyg/Oj5cXFxcbip8JCknIC8vICg0KVxuICAgICsgJ3w8IVxcXFxbQ0RBVEFcXFxcW1tcXFxcc1xcXFxTXSo/KD86XFxcXF1cXFxcXT5cXFxcbip8JCknIC8vICg1KVxuICAgICsgJ3w8Lz8odGFnKSg/OiArfFxcXFxufC8/PilbXFxcXHNcXFxcU10qPyg/Oig/OlxcXFxuICopK1xcXFxufCQpJyAvLyAoNilcbiAgICArICd8PCg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpKFthLXpdW1xcXFx3LV0qKSg/OmF0dHJpYnV0ZSkqPyAqLz8+KD89WyBcXFxcdF0qKD86XFxcXG58JCkpW1xcXFxzXFxcXFNdKj8oPzooPzpcXFxcbiAqKStcXFxcbnwkKScgLy8gKDcpIG9wZW4gdGFnXG4gICAgKyAnfDwvKD8hc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbYS16XVtcXFxcdy1dKlxcXFxzKj4oPz1bIFxcXFx0XSooPzpcXFxcbnwkKSlbXFxcXHNcXFxcU10qPyg/Oig/OlxcXFxuICopK1xcXFxufCQpJyAvLyAoNykgY2xvc2luZyB0YWdcbiAgICArICcpJywgJ2knKVxuICAgIC5yZXBsYWNlKCdjb21tZW50JywgX2NvbW1lbnQpXG4gICAgLnJlcGxhY2UoJ3RhZycsIF90YWcpXG4gICAgLnJlcGxhY2UoJ2F0dHJpYnV0ZScsIC8gK1thLXpBLVo6X11bXFx3LjotXSooPzogKj0gKlwiW15cIlxcbl0qXCJ8ICo9IConW14nXFxuXSonfCAqPSAqW15cXHNcIic9PD5gXSspPy8pXG4gICAgLmdldFJlZ2V4KCk7XG5jb25zdCBwYXJhZ3JhcGggPSBlZGl0KF9wYXJhZ3JhcGgpXG4gICAgLnJlcGxhY2UoJ2hyJywgaHIpXG4gICAgLnJlcGxhY2UoJ2hlYWRpbmcnLCAnIHswLDN9I3sxLDZ9KD86XFxcXHN8JCknKVxuICAgIC5yZXBsYWNlKCd8bGhlYWRpbmcnLCAnJykgLy8gc2V0ZXh0IGhlYWRpbmdzIGRvbid0IGludGVycnVwdCBjb21tb25tYXJrIHBhcmFncmFwaHNcbiAgICAucmVwbGFjZSgnfHRhYmxlJywgJycpXG4gICAgLnJlcGxhY2UoJ2Jsb2NrcXVvdGUnLCAnIHswLDN9PicpXG4gICAgLnJlcGxhY2UoJ2ZlbmNlcycsICcgezAsM30oPzpgezMsfSg/PVteYFxcXFxuXSpcXFxcbil8fnszLH0pW15cXFxcbl0qXFxcXG4nKVxuICAgIC5yZXBsYWNlKCdsaXN0JywgJyB7MCwzfSg/OlsqKy1dfDFbLildKSAnKSAvLyBvbmx5IGxpc3RzIHN0YXJ0aW5nIGZyb20gMSBjYW4gaW50ZXJydXB0XG4gICAgLnJlcGxhY2UoJ2h0bWwnLCAnPC8/KD86dGFnKSg/OiArfFxcXFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKScpXG4gICAgLnJlcGxhY2UoJ3RhZycsIF90YWcpIC8vIHBhcnMgY2FuIGJlIGludGVycnVwdGVkIGJ5IHR5cGUgKDYpIGh0bWwgYmxvY2tzXG4gICAgLmdldFJlZ2V4KCk7XG5jb25zdCBibG9ja3F1b3RlID0gZWRpdCgvXiggezAsM30+ID8ocGFyYWdyYXBofFteXFxuXSopKD86XFxufCQpKSsvKVxuICAgIC5yZXBsYWNlKCdwYXJhZ3JhcGgnLCBwYXJhZ3JhcGgpXG4gICAgLmdldFJlZ2V4KCk7XG4vKipcbiAqIE5vcm1hbCBCbG9jayBHcmFtbWFyXG4gKi9cbmNvbnN0IGJsb2NrTm9ybWFsID0ge1xuICAgIGJsb2NrcXVvdGUsXG4gICAgY29kZTogYmxvY2tDb2RlLFxuICAgIGRlZixcbiAgICBmZW5jZXMsXG4gICAgaGVhZGluZyxcbiAgICBocixcbiAgICBodG1sLFxuICAgIGxoZWFkaW5nLFxuICAgIGxpc3QsXG4gICAgbmV3bGluZSxcbiAgICBwYXJhZ3JhcGgsXG4gICAgdGFibGU6IG5vb3BUZXN0LFxuICAgIHRleHQ6IGJsb2NrVGV4dFxufTtcbi8qKlxuICogR0ZNIEJsb2NrIEdyYW1tYXJcbiAqL1xuY29uc3QgZ2ZtVGFibGUgPSBlZGl0KCdeICooW15cXFxcbiBdLiopXFxcXG4nIC8vIEhlYWRlclxuICAgICsgJyB7MCwzfSgoPzpcXFxcfCAqKT86Py0rOj8gKig/OlxcXFx8ICo6Py0rOj8gKikqKD86XFxcXHwgKik/KScgLy8gQWxpZ25cbiAgICArICcoPzpcXFxcbigoPzooPyEgKlxcXFxufGhyfGhlYWRpbmd8YmxvY2txdW90ZXxjb2RlfGZlbmNlc3xsaXN0fGh0bWwpLiooPzpcXFxcbnwkKSkqKVxcXFxuKnwkKScpIC8vIENlbGxzXG4gICAgLnJlcGxhY2UoJ2hyJywgaHIpXG4gICAgLnJlcGxhY2UoJ2hlYWRpbmcnLCAnIHswLDN9I3sxLDZ9KD86XFxcXHN8JCknKVxuICAgIC5yZXBsYWNlKCdibG9ja3F1b3RlJywgJyB7MCwzfT4nKVxuICAgIC5yZXBsYWNlKCdjb2RlJywgJyB7NH1bXlxcXFxuXScpXG4gICAgLnJlcGxhY2UoJ2ZlbmNlcycsICcgezAsM30oPzpgezMsfSg/PVteYFxcXFxuXSpcXFxcbil8fnszLH0pW15cXFxcbl0qXFxcXG4nKVxuICAgIC5yZXBsYWNlKCdsaXN0JywgJyB7MCwzfSg/OlsqKy1dfDFbLildKSAnKSAvLyBvbmx5IGxpc3RzIHN0YXJ0aW5nIGZyb20gMSBjYW4gaW50ZXJydXB0XG4gICAgLnJlcGxhY2UoJ2h0bWwnLCAnPC8/KD86dGFnKSg/OiArfFxcXFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKScpXG4gICAgLnJlcGxhY2UoJ3RhZycsIF90YWcpIC8vIHRhYmxlcyBjYW4gYmUgaW50ZXJydXB0ZWQgYnkgdHlwZSAoNikgaHRtbCBibG9ja3NcbiAgICAuZ2V0UmVnZXgoKTtcbmNvbnN0IGJsb2NrR2ZtID0ge1xuICAgIC4uLmJsb2NrTm9ybWFsLFxuICAgIHRhYmxlOiBnZm1UYWJsZSxcbiAgICBwYXJhZ3JhcGg6IGVkaXQoX3BhcmFncmFwaClcbiAgICAgICAgLnJlcGxhY2UoJ2hyJywgaHIpXG4gICAgICAgIC5yZXBsYWNlKCdoZWFkaW5nJywgJyB7MCwzfSN7MSw2fSg/OlxcXFxzfCQpJylcbiAgICAgICAgLnJlcGxhY2UoJ3xsaGVhZGluZycsICcnKSAvLyBzZXRleHQgaGVhZGluZ3MgZG9uJ3QgaW50ZXJydXB0IGNvbW1vbm1hcmsgcGFyYWdyYXBoc1xuICAgICAgICAucmVwbGFjZSgndGFibGUnLCBnZm1UYWJsZSkgLy8gaW50ZXJydXB0IHBhcmFncmFwaHMgd2l0aCB0YWJsZVxuICAgICAgICAucmVwbGFjZSgnYmxvY2txdW90ZScsICcgezAsM30+JylcbiAgICAgICAgLnJlcGxhY2UoJ2ZlbmNlcycsICcgezAsM30oPzpgezMsfSg/PVteYFxcXFxuXSpcXFxcbil8fnszLH0pW15cXFxcbl0qXFxcXG4nKVxuICAgICAgICAucmVwbGFjZSgnbGlzdCcsICcgezAsM30oPzpbKistXXwxWy4pXSkgJykgLy8gb25seSBsaXN0cyBzdGFydGluZyBmcm9tIDEgY2FuIGludGVycnVwdFxuICAgICAgICAucmVwbGFjZSgnaHRtbCcsICc8Lz8oPzp0YWcpKD86ICt8XFxcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pJylcbiAgICAgICAgLnJlcGxhY2UoJ3RhZycsIF90YWcpIC8vIHBhcnMgY2FuIGJlIGludGVycnVwdGVkIGJ5IHR5cGUgKDYpIGh0bWwgYmxvY2tzXG4gICAgICAgIC5nZXRSZWdleCgpXG59O1xuLyoqXG4gKiBQZWRhbnRpYyBncmFtbWFyIChvcmlnaW5hbCBKb2huIEdydWJlcidzIGxvb3NlIG1hcmtkb3duIHNwZWNpZmljYXRpb24pXG4gKi9cbmNvbnN0IGJsb2NrUGVkYW50aWMgPSB7XG4gICAgLi4uYmxvY2tOb3JtYWwsXG4gICAgaHRtbDogZWRpdCgnXiAqKD86Y29tbWVudCAqKD86XFxcXG58XFxcXHMqJCknXG4gICAgICAgICsgJ3w8KHRhZylbXFxcXHNcXFxcU10rPzwvXFxcXDE+ICooPzpcXFxcbnsyLH18XFxcXHMqJCknIC8vIGNsb3NlZCB0YWdcbiAgICAgICAgKyAnfDx0YWcoPzpcIlteXCJdKlwifFxcJ1teXFwnXSpcXCd8XFxcXHNbXlxcJ1wiLz5cXFxcc10qKSo/Lz8+ICooPzpcXFxcbnsyLH18XFxcXHMqJCkpJylcbiAgICAgICAgLnJlcGxhY2UoJ2NvbW1lbnQnLCBfY29tbWVudClcbiAgICAgICAgLnJlcGxhY2UoL3RhZy9nLCAnKD8hKD86J1xuICAgICAgICArICdhfGVtfHN0cm9uZ3xzbWFsbHxzfGNpdGV8cXxkZm58YWJicnxkYXRhfHRpbWV8Y29kZXx2YXJ8c2FtcHxrYmR8c3ViJ1xuICAgICAgICArICd8c3VwfGl8Ynx1fG1hcmt8cnVieXxydHxycHxiZGl8YmRvfHNwYW58YnJ8d2JyfGluc3xkZWx8aW1nKSdcbiAgICAgICAgKyAnXFxcXGIpXFxcXHcrKD8hOnxbXlxcXFx3XFxcXHNAXSpAKVxcXFxiJylcbiAgICAgICAgLmdldFJlZ2V4KCksXG4gICAgZGVmOiAvXiAqXFxbKFteXFxdXSspXFxdOiAqPD8oW15cXHM+XSspPj8oPzogKyhbXCIoXVteXFxuXStbXCIpXSkpPyAqKD86XFxuK3wkKS8sXG4gICAgaGVhZGluZzogL14oI3sxLDZ9KSguKikoPzpcXG4rfCQpLyxcbiAgICBmZW5jZXM6IG5vb3BUZXN0LCAvLyBmZW5jZXMgbm90IHN1cHBvcnRlZFxuICAgIGxoZWFkaW5nOiAvXiguKz8pXFxuIHswLDN9KD0rfC0rKSAqKD86XFxuK3wkKS8sXG4gICAgcGFyYWdyYXBoOiBlZGl0KF9wYXJhZ3JhcGgpXG4gICAgICAgIC5yZXBsYWNlKCdocicsIGhyKVxuICAgICAgICAucmVwbGFjZSgnaGVhZGluZycsICcgKiN7MSw2fSAqW15cXG5dJylcbiAgICAgICAgLnJlcGxhY2UoJ2xoZWFkaW5nJywgbGhlYWRpbmcpXG4gICAgICAgIC5yZXBsYWNlKCd8dGFibGUnLCAnJylcbiAgICAgICAgLnJlcGxhY2UoJ2Jsb2NrcXVvdGUnLCAnIHswLDN9PicpXG4gICAgICAgIC5yZXBsYWNlKCd8ZmVuY2VzJywgJycpXG4gICAgICAgIC5yZXBsYWNlKCd8bGlzdCcsICcnKVxuICAgICAgICAucmVwbGFjZSgnfGh0bWwnLCAnJylcbiAgICAgICAgLnJlcGxhY2UoJ3x0YWcnLCAnJylcbiAgICAgICAgLmdldFJlZ2V4KClcbn07XG4vKipcbiAqIElubGluZS1MZXZlbCBHcmFtbWFyXG4gKi9cbmNvbnN0IGVzY2FwZSA9IC9eXFxcXChbIVwiIyQlJicoKSorLFxcLS4vOjs8PT4/QFxcW1xcXVxcXFxeX2B7fH1+XSkvO1xuY29uc3QgaW5saW5lQ29kZSA9IC9eKGArKShbXmBdfFteYF1bXFxzXFxTXSo/W15gXSlcXDEoPyFgKS87XG5jb25zdCBiciA9IC9eKCB7Mix9fFxcXFwpXFxuKD8hXFxzKiQpLztcbmNvbnN0IGlubGluZVRleHQgPSAvXihgK3xbXmBdKSg/Oig/PSB7Mix9XFxuKXxbXFxzXFxTXSo/KD86KD89W1xcXFw8IVxcW2AqX118XFxiX3wkKXxbXiBdKD89IHsyLH1cXG4pKSkvO1xuLy8gbGlzdCBvZiB1bmljb2RlIHB1bmN0dWF0aW9uIG1hcmtzLCBwbHVzIGFueSBtaXNzaW5nIGNoYXJhY3RlcnMgZnJvbSBDb21tb25NYXJrIHNwZWNcbmNvbnN0IF9wdW5jdHVhdGlvbiA9ICdcXFxccHtQfVxcXFxwe1N9JztcbmNvbnN0IHB1bmN0dWF0aW9uID0gZWRpdCgvXigoPyFbKl9dKVtcXHNwdW5jdHVhdGlvbl0pLywgJ3UnKVxuICAgIC5yZXBsYWNlKC9wdW5jdHVhdGlvbi9nLCBfcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7XG4vLyBzZXF1ZW5jZXMgZW0gc2hvdWxkIHNraXAgb3ZlciBbdGl0bGVdKGxpbmspLCBgY29kZWAsIDxodG1sPlxuY29uc3QgYmxvY2tTa2lwID0gL1xcW1teW1xcXV0qP1xcXVxcKFteXFwoXFwpXSo/XFwpfGBbXmBdKj9gfDxbXjw+XSo/Pi9nO1xuY29uc3QgZW1TdHJvbmdMRGVsaW0gPSBlZGl0KC9eKD86XFwqKyg/OigoPyFcXCopW3B1bmN0XSl8W15cXHMqXSkpfF5fKyg/OigoPyFfKVtwdW5jdF0pfChbXlxcc19dKSkvLCAndScpXG4gICAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgICAuZ2V0UmVnZXgoKTtcbmNvbnN0IGVtU3Ryb25nUkRlbGltQXN0ID0gZWRpdCgnXlteXypdKj9fX1teXypdKj9cXFxcKlteXypdKj8oPz1fXyknIC8vIFNraXAgb3JwaGFuIGluc2lkZSBzdHJvbmdcbiAgICArICd8W14qXSsoPz1bXipdKScgLy8gQ29uc3VtZSB0byBkZWxpbVxuICAgICsgJ3woPyFcXFxcKilbcHVuY3RdKFxcXFwqKykoPz1bXFxcXHNdfCQpJyAvLyAoMSkgIyoqKiBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuICAgICsgJ3xbXnB1bmN0XFxcXHNdKFxcXFwqKykoPyFcXFxcKikoPz1bcHVuY3RcXFxcc118JCknIC8vICgyKSBhKioqIywgYSoqKiBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuICAgICsgJ3woPyFcXFxcKilbcHVuY3RcXFxcc10oXFxcXCorKSg/PVtecHVuY3RcXFxcc10pJyAvLyAoMykgIyoqKmEsICoqKmEgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbiAgICArICd8W1xcXFxzXShcXFxcKispKD8hXFxcXCopKD89W3B1bmN0XSknIC8vICg0KSAqKiojIGNhbiBvbmx5IGJlIExlZnQgRGVsaW1pdGVyXG4gICAgKyAnfCg/IVxcXFwqKVtwdW5jdF0oXFxcXCorKSg/IVxcXFwqKSg/PVtwdW5jdF0pJyAvLyAoNSkgIyoqKiMgY2FuIGJlIGVpdGhlciBMZWZ0IG9yIFJpZ2h0IERlbGltaXRlclxuICAgICsgJ3xbXnB1bmN0XFxcXHNdKFxcXFwqKykoPz1bXnB1bmN0XFxcXHNdKScsICdndScpIC8vICg2KSBhKioqYSBjYW4gYmUgZWl0aGVyIExlZnQgb3IgUmlnaHQgRGVsaW1pdGVyXG4gICAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgICAuZ2V0UmVnZXgoKTtcbi8vICg2KSBOb3QgYWxsb3dlZCBmb3IgX1xuY29uc3QgZW1TdHJvbmdSRGVsaW1VbmQgPSBlZGl0KCdeW15fKl0qP1xcXFwqXFxcXCpbXl8qXSo/X1teXypdKj8oPz1cXFxcKlxcXFwqKScgLy8gU2tpcCBvcnBoYW4gaW5zaWRlIHN0cm9uZ1xuICAgICsgJ3xbXl9dKyg/PVteX10pJyAvLyBDb25zdW1lIHRvIGRlbGltXG4gICAgKyAnfCg/IV8pW3B1bmN0XShfKykoPz1bXFxcXHNdfCQpJyAvLyAoMSkgI19fXyBjYW4gb25seSBiZSBhIFJpZ2h0IERlbGltaXRlclxuICAgICsgJ3xbXnB1bmN0XFxcXHNdKF8rKSg/IV8pKD89W3B1bmN0XFxcXHNdfCQpJyAvLyAoMikgYV9fXyMsIGFfX18gY2FuIG9ubHkgYmUgYSBSaWdodCBEZWxpbWl0ZXJcbiAgICArICd8KD8hXylbcHVuY3RcXFxcc10oXyspKD89W15wdW5jdFxcXFxzXSknIC8vICgzKSAjX19fYSwgX19fYSBjYW4gb25seSBiZSBMZWZ0IERlbGltaXRlclxuICAgICsgJ3xbXFxcXHNdKF8rKSg/IV8pKD89W3B1bmN0XSknIC8vICg0KSBfX18jIGNhbiBvbmx5IGJlIExlZnQgRGVsaW1pdGVyXG4gICAgKyAnfCg/IV8pW3B1bmN0XShfKykoPyFfKSg/PVtwdW5jdF0pJywgJ2d1JykgLy8gKDUpICNfX18jIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcbiAgICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uKVxuICAgIC5nZXRSZWdleCgpO1xuY29uc3QgYW55UHVuY3R1YXRpb24gPSBlZGl0KC9cXFxcKFtwdW5jdF0pLywgJ2d1JylcbiAgICAucmVwbGFjZSgvcHVuY3QvZywgX3B1bmN0dWF0aW9uKVxuICAgIC5nZXRSZWdleCgpO1xuY29uc3QgYXV0b2xpbmsgPSBlZGl0KC9ePChzY2hlbWU6W15cXHNcXHgwMC1cXHgxZjw+XSp8ZW1haWwpPi8pXG4gICAgLnJlcGxhY2UoJ3NjaGVtZScsIC9bYS16QS1aXVthLXpBLVowLTkrLi1dezEsMzF9LylcbiAgICAucmVwbGFjZSgnZW1haWwnLCAvW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXSsoQClbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKyg/IVstX10pLylcbiAgICAuZ2V0UmVnZXgoKTtcbmNvbnN0IF9pbmxpbmVDb21tZW50ID0gZWRpdChfY29tbWVudCkucmVwbGFjZSgnKD86LS0+fCQpJywgJy0tPicpLmdldFJlZ2V4KCk7XG5jb25zdCB0YWcgPSBlZGl0KCdeY29tbWVudCdcbiAgICArICd8XjwvW2EtekEtWl1bXFxcXHc6LV0qXFxcXHMqPicgLy8gc2VsZi1jbG9zaW5nIHRhZ1xuICAgICsgJ3xePFthLXpBLVpdW1xcXFx3LV0qKD86YXR0cmlidXRlKSo/XFxcXHMqLz8+JyAvLyBvcGVuIHRhZ1xuICAgICsgJ3xePFxcXFw/W1xcXFxzXFxcXFNdKj9cXFxcPz4nIC8vIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24sIGUuZy4gPD9waHAgPz5cbiAgICArICd8XjwhW2EtekEtWl0rXFxcXHNbXFxcXHNcXFxcU10qPz4nIC8vIGRlY2xhcmF0aW9uLCBlLmcuIDwhRE9DVFlQRSBodG1sPlxuICAgICsgJ3xePCFcXFxcW0NEQVRBXFxcXFtbXFxcXHNcXFxcU10qP1xcXFxdXFxcXF0+JykgLy8gQ0RBVEEgc2VjdGlvblxuICAgIC5yZXBsYWNlKCdjb21tZW50JywgX2lubGluZUNvbW1lbnQpXG4gICAgLnJlcGxhY2UoJ2F0dHJpYnV0ZScsIC9cXHMrW2EtekEtWjpfXVtcXHcuOi1dKig/Olxccyo9XFxzKlwiW15cIl0qXCJ8XFxzKj1cXHMqJ1teJ10qJ3xcXHMqPVxccypbXlxcc1wiJz08PmBdKyk/LylcbiAgICAuZ2V0UmVnZXgoKTtcbmNvbnN0IF9pbmxpbmVMYWJlbCA9IC8oPzpcXFsoPzpcXFxcLnxbXlxcW1xcXVxcXFxdKSpcXF18XFxcXC58YFteYF0qYHxbXlxcW1xcXVxcXFxgXSkqPy87XG5jb25zdCBsaW5rID0gZWRpdCgvXiE/XFxbKGxhYmVsKVxcXVxcKFxccyooaHJlZikoPzpcXHMrKHRpdGxlKSk/XFxzKlxcKS8pXG4gICAgLnJlcGxhY2UoJ2xhYmVsJywgX2lubGluZUxhYmVsKVxuICAgIC5yZXBsYWNlKCdocmVmJywgLzwoPzpcXFxcLnxbXlxcbjw+XFxcXF0pKz58W15cXHNcXHgwMC1cXHgxZl0qLylcbiAgICAucmVwbGFjZSgndGl0bGUnLCAvXCIoPzpcXFxcXCI/fFteXCJcXFxcXSkqXCJ8Jyg/OlxcXFwnP3xbXidcXFxcXSkqJ3xcXCgoPzpcXFxcXFwpP3xbXilcXFxcXSkqXFwpLylcbiAgICAuZ2V0UmVnZXgoKTtcbmNvbnN0IHJlZmxpbmsgPSBlZGl0KC9eIT9cXFsobGFiZWwpXFxdXFxbKHJlZilcXF0vKVxuICAgIC5yZXBsYWNlKCdsYWJlbCcsIF9pbmxpbmVMYWJlbClcbiAgICAucmVwbGFjZSgncmVmJywgX2Jsb2NrTGFiZWwpXG4gICAgLmdldFJlZ2V4KCk7XG5jb25zdCBub2xpbmsgPSBlZGl0KC9eIT9cXFsocmVmKVxcXSg/OlxcW1xcXSk/LylcbiAgICAucmVwbGFjZSgncmVmJywgX2Jsb2NrTGFiZWwpXG4gICAgLmdldFJlZ2V4KCk7XG5jb25zdCByZWZsaW5rU2VhcmNoID0gZWRpdCgncmVmbGlua3xub2xpbmsoPyFcXFxcKCknLCAnZycpXG4gICAgLnJlcGxhY2UoJ3JlZmxpbmsnLCByZWZsaW5rKVxuICAgIC5yZXBsYWNlKCdub2xpbmsnLCBub2xpbmspXG4gICAgLmdldFJlZ2V4KCk7XG4vKipcbiAqIE5vcm1hbCBJbmxpbmUgR3JhbW1hclxuICovXG5jb25zdCBpbmxpbmVOb3JtYWwgPSB7XG4gICAgX2JhY2twZWRhbDogbm9vcFRlc3QsIC8vIG9ubHkgdXNlZCBmb3IgR0ZNIHVybFxuICAgIGFueVB1bmN0dWF0aW9uLFxuICAgIGF1dG9saW5rLFxuICAgIGJsb2NrU2tpcCxcbiAgICBicixcbiAgICBjb2RlOiBpbmxpbmVDb2RlLFxuICAgIGRlbDogbm9vcFRlc3QsXG4gICAgZW1TdHJvbmdMRGVsaW0sXG4gICAgZW1TdHJvbmdSRGVsaW1Bc3QsXG4gICAgZW1TdHJvbmdSRGVsaW1VbmQsXG4gICAgZXNjYXBlLFxuICAgIGxpbmssXG4gICAgbm9saW5rLFxuICAgIHB1bmN0dWF0aW9uLFxuICAgIHJlZmxpbmssXG4gICAgcmVmbGlua1NlYXJjaCxcbiAgICB0YWcsXG4gICAgdGV4dDogaW5saW5lVGV4dCxcbiAgICB1cmw6IG5vb3BUZXN0XG59O1xuLyoqXG4gKiBQZWRhbnRpYyBJbmxpbmUgR3JhbW1hclxuICovXG5jb25zdCBpbmxpbmVQZWRhbnRpYyA9IHtcbiAgICAuLi5pbmxpbmVOb3JtYWwsXG4gICAgbGluazogZWRpdCgvXiE/XFxbKGxhYmVsKVxcXVxcKCguKj8pXFwpLylcbiAgICAgICAgLnJlcGxhY2UoJ2xhYmVsJywgX2lubGluZUxhYmVsKVxuICAgICAgICAuZ2V0UmVnZXgoKSxcbiAgICByZWZsaW5rOiBlZGl0KC9eIT9cXFsobGFiZWwpXFxdXFxzKlxcWyhbXlxcXV0qKVxcXS8pXG4gICAgICAgIC5yZXBsYWNlKCdsYWJlbCcsIF9pbmxpbmVMYWJlbClcbiAgICAgICAgLmdldFJlZ2V4KClcbn07XG4vKipcbiAqIEdGTSBJbmxpbmUgR3JhbW1hclxuICovXG5jb25zdCBpbmxpbmVHZm0gPSB7XG4gICAgLi4uaW5saW5lTm9ybWFsLFxuICAgIGVzY2FwZTogZWRpdChlc2NhcGUpLnJlcGxhY2UoJ10pJywgJ358XSknKS5nZXRSZWdleCgpLFxuICAgIHVybDogZWRpdCgvXigoPzpmdHB8aHR0cHM/KTpcXC9cXC98d3d3XFwuKSg/OlthLXpBLVowLTlcXC1dK1xcLj8pK1teXFxzPF0qfF5lbWFpbC8sICdpJylcbiAgICAgICAgLnJlcGxhY2UoJ2VtYWlsJywgL1tBLVphLXowLTkuXystXSsoQClbYS16QS1aMC05LV9dKyg/OlxcLlthLXpBLVowLTktX10qW2EtekEtWjAtOV0pKyg/IVstX10pLylcbiAgICAgICAgLmdldFJlZ2V4KCksXG4gICAgX2JhY2twZWRhbDogLyg/OltePyEuLDo7Kl8nXCJ+KCkmXSt8XFwoW14pXSpcXCl8Jig/IVthLXpBLVowLTldKzskKXxbPyEuLDo7Kl8nXCJ+KV0rKD8hJCkpKy8sXG4gICAgZGVsOiAvXih+fj8pKD89W15cXHN+XSkoW1xcc1xcU10qP1teXFxzfl0pXFwxKD89W15+XXwkKS8sXG4gICAgdGV4dDogL14oW2B+XSt8W15gfl0pKD86KD89IHsyLH1cXG4pfCg/PVthLXpBLVowLTkuISMkJSYnKitcXC89P19ge1xcfH1+LV0rQCl8W1xcc1xcU10qPyg/Oig/PVtcXFxcPCFcXFtgKn5fXXxcXGJffGh0dHBzPzpcXC9cXC98ZnRwOlxcL1xcL3x3d3dcXC58JCl8W14gXSg/PSB7Mix9XFxuKXxbXmEtekEtWjAtOS4hIyQlJicqK1xcLz0/X2B7XFx8fX4tXSg/PVthLXpBLVowLTkuISMkJSYnKitcXC89P19ge1xcfH1+LV0rQCkpKS9cbn07XG4vKipcbiAqIEdGTSArIExpbmUgQnJlYWtzIElubGluZSBHcmFtbWFyXG4gKi9cbmNvbnN0IGlubGluZUJyZWFrcyA9IHtcbiAgICAuLi5pbmxpbmVHZm0sXG4gICAgYnI6IGVkaXQoYnIpLnJlcGxhY2UoJ3syLH0nLCAnKicpLmdldFJlZ2V4KCksXG4gICAgdGV4dDogZWRpdChpbmxpbmVHZm0udGV4dClcbiAgICAgICAgLnJlcGxhY2UoJ1xcXFxiXycsICdcXFxcYl98IHsyLH1cXFxcbicpXG4gICAgICAgIC5yZXBsYWNlKC9cXHsyLFxcfS9nLCAnKicpXG4gICAgICAgIC5nZXRSZWdleCgpXG59O1xuLyoqXG4gKiBleHBvcnRzXG4gKi9cbmV4cG9ydCBjb25zdCBibG9jayA9IHtcbiAgICBub3JtYWw6IGJsb2NrTm9ybWFsLFxuICAgIGdmbTogYmxvY2tHZm0sXG4gICAgcGVkYW50aWM6IGJsb2NrUGVkYW50aWNcbn07XG5leHBvcnQgY29uc3QgaW5saW5lID0ge1xuICAgIG5vcm1hbDogaW5saW5lTm9ybWFsLFxuICAgIGdmbTogaW5saW5lR2ZtLFxuICAgIGJyZWFrczogaW5saW5lQnJlYWtzLFxuICAgIHBlZGFudGljOiBpbmxpbmVQZWRhbnRpY1xufTtcbiIsICJpbXBvcnQgeyBfVG9rZW5pemVyIH0gZnJvbSAnLi9Ub2tlbml6ZXIudHMnO1xuaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgeyBibG9jaywgaW5saW5lIH0gZnJvbSAnLi9ydWxlcy50cyc7XG4vKipcbiAqIEJsb2NrIExleGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBfTGV4ZXIge1xuICAgIHRva2VucztcbiAgICBvcHRpb25zO1xuICAgIHN0YXRlO1xuICAgIHRva2VuaXplcjtcbiAgICBpbmxpbmVRdWV1ZTtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIC8vIFRva2VuTGlzdCBjYW5ub3QgYmUgY3JlYXRlZCBpbiBvbmUgZ29cbiAgICAgICAgdGhpcy50b2tlbnMgPSBbXTtcbiAgICAgICAgdGhpcy50b2tlbnMubGlua3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IF9kZWZhdWx0cztcbiAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuaXplciA9IHRoaXMub3B0aW9ucy50b2tlbml6ZXIgfHwgbmV3IF9Ub2tlbml6ZXIoKTtcbiAgICAgICAgdGhpcy50b2tlbml6ZXIgPSB0aGlzLm9wdGlvbnMudG9rZW5pemVyO1xuICAgICAgICB0aGlzLnRva2VuaXplci5vcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB0aGlzLnRva2VuaXplci5sZXhlciA9IHRoaXM7XG4gICAgICAgIHRoaXMuaW5saW5lUXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGluTGluazogZmFsc2UsXG4gICAgICAgICAgICBpblJhd0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgICAgIHRvcDogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBydWxlcyA9IHtcbiAgICAgICAgICAgIGJsb2NrOiBibG9jay5ub3JtYWwsXG4gICAgICAgICAgICBpbmxpbmU6IGlubGluZS5ub3JtYWxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICAgICAgcnVsZXMuYmxvY2sgPSBibG9jay5wZWRhbnRpYztcbiAgICAgICAgICAgIHJ1bGVzLmlubGluZSA9IGlubGluZS5wZWRhbnRpYztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZ2ZtKSB7XG4gICAgICAgICAgICBydWxlcy5ibG9jayA9IGJsb2NrLmdmbTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnJlYWtzKSB7XG4gICAgICAgICAgICAgICAgcnVsZXMuaW5saW5lID0gaW5saW5lLmJyZWFrcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJ1bGVzLmlubGluZSA9IGlubGluZS5nZm07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b2tlbml6ZXIucnVsZXMgPSBydWxlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhwb3NlIFJ1bGVzXG4gICAgICovXG4gICAgc3RhdGljIGdldCBydWxlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJsb2NrLFxuICAgICAgICAgICAgaW5saW5lXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXRpYyBMZXggTWV0aG9kXG4gICAgICovXG4gICAgc3RhdGljIGxleChzcmMsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgbGV4ZXIgPSBuZXcgX0xleGVyKG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gbGV4ZXIubGV4KHNyYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXRpYyBMZXggSW5saW5lIE1ldGhvZFxuICAgICAqL1xuICAgIHN0YXRpYyBsZXhJbmxpbmUoc3JjLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGxleGVyID0gbmV3IF9MZXhlcihvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIGxleGVyLmlubGluZVRva2VucyhzcmMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmVwcm9jZXNzaW5nXG4gICAgICovXG4gICAgbGV4KHNyYykge1xuICAgICAgICBzcmMgPSBzcmNcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXHJcXG58XFxyL2csICdcXG4nKTtcbiAgICAgICAgdGhpcy5ibG9ja1Rva2VucyhzcmMsIHRoaXMudG9rZW5zKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmlubGluZVF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5pbmxpbmVRdWV1ZVtpXTtcbiAgICAgICAgICAgIHRoaXMuaW5saW5lVG9rZW5zKG5leHQuc3JjLCBuZXh0LnRva2Vucyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZSA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnM7XG4gICAgfVxuICAgIGJsb2NrVG9rZW5zKHNyYywgdG9rZW5zID0gW10pIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICAgICAgc3JjID0gc3JjLnJlcGxhY2UoL1xcdC9nLCAnICAgICcpLnJlcGxhY2UoL14gKyQvZ20sICcnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNyYyA9IHNyYy5yZXBsYWNlKC9eKCAqKShcXHQrKS9nbSwgKF8sIGxlYWRpbmcsIHRhYnMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGVhZGluZyArICcgICAgJy5yZXBlYXQodGFicy5sZW5ndGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRva2VuO1xuICAgICAgICBsZXQgbGFzdFRva2VuO1xuICAgICAgICBsZXQgY3V0U3JjO1xuICAgICAgICBsZXQgbGFzdFBhcmFncmFwaENsaXBwZWQ7XG4gICAgICAgIHdoaWxlIChzcmMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9uc1xuICAgICAgICAgICAgICAgICYmIHRoaXMub3B0aW9ucy5leHRlbnNpb25zLmJsb2NrXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuYmxvY2suc29tZSgoZXh0VG9rZW5pemVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9IGV4dFRva2VuaXplci5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgc3JjLCB0b2tlbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBuZXdsaW5lXG4gICAgICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5zcGFjZShzcmMpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4ucmF3Lmxlbmd0aCA9PT0gMSAmJiB0b2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIGEgc2luZ2xlIFxcbiBhcyBhIHNwYWNlciwgaXQncyB0ZXJtaW5hdGluZyB0aGUgbGFzdCBsaW5lLFxuICAgICAgICAgICAgICAgICAgICAvLyBzbyBtb3ZlIGl0IHRoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHVubmVjZXNzYXJ5IHBhcmFncmFwaCB0YWdzXG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0ucmF3ICs9ICdcXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvZGVcbiAgICAgICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmNvZGUoc3JjKSkge1xuICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgbGFzdFRva2VuID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAvLyBBbiBpbmRlbnRlZCBjb2RlIGJsb2NrIGNhbm5vdCBpbnRlcnJ1cHQgYSBwYXJhZ3JhcGguXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RUb2tlbiAmJiAobGFzdFRva2VuLnR5cGUgPT09ICdwYXJhZ3JhcGgnIHx8IGxhc3RUb2tlbi50eXBlID09PSAndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gJ1xcbicgKyB0b2tlbi5yYXc7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9ICdcXG4nICsgdG9rZW4udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZVt0aGlzLmlubGluZVF1ZXVlLmxlbmd0aCAtIDFdLnNyYyA9IGxhc3RUb2tlbi50ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGZlbmNlc1xuICAgICAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZmVuY2VzKHNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGhlYWRpbmdcbiAgICAgICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmhlYWRpbmcoc3JjKSkge1xuICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaHJcbiAgICAgICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmhyKHNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGJsb2NrcXVvdGVcbiAgICAgICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmJsb2NrcXVvdGUoc3JjKSkge1xuICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbGlzdFxuICAgICAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIubGlzdChzcmMpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBodG1sXG4gICAgICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5odG1sKHNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGRlZlxuICAgICAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZGVmKHNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGxhc3RUb2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RUb2tlbiAmJiAobGFzdFRva2VuLnR5cGUgPT09ICdwYXJhZ3JhcGgnIHx8IGxhc3RUb2tlbi50eXBlID09PSAndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gJ1xcbicgKyB0b2tlbi5yYXc7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9ICdcXG4nICsgdG9rZW4ucmF3O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlubGluZVF1ZXVlW3RoaXMuaW5saW5lUXVldWUubGVuZ3RoIC0gMV0uc3JjID0gbGFzdFRva2VuLnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnRva2Vucy5saW5rc1t0b2tlbi50YWddKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zLmxpbmtzW3Rva2VuLnRhZ10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmOiB0b2tlbi5ocmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRva2VuLnRpdGxlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGFibGUgKGdmbSlcbiAgICAgICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnRhYmxlKHNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGxoZWFkaW5nXG4gICAgICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5saGVhZGluZyhzcmMpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0b3AtbGV2ZWwgcGFyYWdyYXBoXG4gICAgICAgICAgICAvLyBwcmV2ZW50IHBhcmFncmFwaCBjb25zdW1pbmcgZXh0ZW5zaW9ucyBieSBjbGlwcGluZyAnc3JjJyB0byBleHRlbnNpb24gc3RhcnRcbiAgICAgICAgICAgIGN1dFNyYyA9IHNyYztcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyAmJiB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBJbmZpbml0eTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wU3JjID0gc3JjLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIGxldCB0ZW1wU3RhcnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRCbG9jay5mb3JFYWNoKChnZXRTdGFydEluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBTdGFydCA9IGdldFN0YXJ0SW5kZXguY2FsbCh7IGxleGVyOiB0aGlzIH0sIHRlbXBTcmMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRlbXBTdGFydCA9PT0gJ251bWJlcicgJiYgdGVtcFN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBNYXRoLm1pbihzdGFydEluZGV4LCB0ZW1wU3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPCBJbmZpbml0eSAmJiBzdGFydEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY3V0U3JjID0gc3JjLnN1YnN0cmluZygwLCBzdGFydEluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUudG9wICYmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnBhcmFncmFwaChjdXRTcmMpKSkge1xuICAgICAgICAgICAgICAgIGxhc3RUb2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RQYXJhZ3JhcGhDbGlwcGVkICYmIGxhc3RUb2tlbi50eXBlID09PSAncGFyYWdyYXBoJykge1xuICAgICAgICAgICAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9ICdcXG4nICsgdG9rZW4ucmF3O1xuICAgICAgICAgICAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSAnXFxuJyArIHRva2VuLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5saW5lUXVldWUucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5saW5lUXVldWVbdGhpcy5pbmxpbmVRdWV1ZS5sZW5ndGggLSAxXS5zcmMgPSBsYXN0VG9rZW4udGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGFzdFBhcmFncmFwaENsaXBwZWQgPSAoY3V0U3JjLmxlbmd0aCAhPT0gc3JjLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRleHRcbiAgICAgICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnRleHQoc3JjKSkge1xuICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgbGFzdFRva2VuID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdFRva2VuICYmIGxhc3RUb2tlbi50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFRva2VuLnJhdyArPSAnXFxuJyArIHRva2VuLnJhdztcbiAgICAgICAgICAgICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gJ1xcbicgKyB0b2tlbi50ZXh0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlubGluZVF1ZXVlLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlubGluZVF1ZXVlW3RoaXMuaW5saW5lUXVldWUubGVuZ3RoIC0gMV0uc3JjID0gbGFzdFRva2VuLnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNyYykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9ICdJbmZpbml0ZSBsb29wIG9uIGJ5dGU6ICcgKyBzcmMuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyck1zZyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUudG9wID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRva2VucztcbiAgICB9XG4gICAgaW5saW5lKHNyYywgdG9rZW5zID0gW10pIHtcbiAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5wdXNoKHsgc3JjLCB0b2tlbnMgfSk7XG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExleGluZy9Db21waWxpbmdcbiAgICAgKi9cbiAgICBpbmxpbmVUb2tlbnMoc3JjLCB0b2tlbnMgPSBbXSkge1xuICAgICAgICBsZXQgdG9rZW4sIGxhc3RUb2tlbiwgY3V0U3JjO1xuICAgICAgICAvLyBTdHJpbmcgd2l0aCBsaW5rcyBtYXNrZWQgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIHdpdGggZW0gYW5kIHN0cm9uZ1xuICAgICAgICBsZXQgbWFza2VkU3JjID0gc3JjO1xuICAgICAgICBsZXQgbWF0Y2g7XG4gICAgICAgIGxldCBrZWVwUHJldkNoYXIsIHByZXZDaGFyO1xuICAgICAgICAvLyBNYXNrIG91dCByZWZsaW5rc1xuICAgICAgICBpZiAodGhpcy50b2tlbnMubGlua3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtzID0gT2JqZWN0LmtleXModGhpcy50b2tlbnMubGlua3MpO1xuICAgICAgICAgICAgaWYgKGxpbmtzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoKG1hdGNoID0gdGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2guZXhlYyhtYXNrZWRTcmMpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5rcy5pbmNsdWRlcyhtYXRjaFswXS5zbGljZShtYXRjaFswXS5sYXN0SW5kZXhPZignWycpICsgMSwgLTEpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKDAsIG1hdGNoLmluZGV4KSArICdbJyArICdhJy5yZXBlYXQobWF0Y2hbMF0ubGVuZ3RoIC0gMikgKyAnXScgKyBtYXNrZWRTcmMuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2gubGFzdEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBNYXNrIG91dCBvdGhlciBibG9ja3NcbiAgICAgICAgd2hpbGUgKChtYXRjaCA9IHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAuZXhlYyhtYXNrZWRTcmMpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXNrZWRTcmMgPSBtYXNrZWRTcmMuc2xpY2UoMCwgbWF0Y2guaW5kZXgpICsgJ1snICsgJ2EnLnJlcGVhdChtYXRjaFswXS5sZW5ndGggLSAyKSArICddJyArIG1hc2tlZFNyYy5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYmxvY2tTa2lwLmxhc3RJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFzayBvdXQgZXNjYXBlZCBjaGFyYWN0ZXJzXG4gICAgICAgIHdoaWxlICgobWF0Y2ggPSB0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24uZXhlYyhtYXNrZWRTcmMpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXNrZWRTcmMgPSBtYXNrZWRTcmMuc2xpY2UoMCwgbWF0Y2guaW5kZXgpICsgJysrJyArIG1hc2tlZFNyYy5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24ubGFzdEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoc3JjKSB7XG4gICAgICAgICAgICBpZiAoIWtlZXBQcmV2Q2hhcikge1xuICAgICAgICAgICAgICAgIHByZXZDaGFyID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrZWVwUHJldkNoYXIgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIGV4dGVuc2lvbnNcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9uc1xuICAgICAgICAgICAgICAgICYmIHRoaXMub3B0aW9ucy5leHRlbnNpb25zLmlubGluZVxuICAgICAgICAgICAgICAgICYmIHRoaXMub3B0aW9ucy5leHRlbnNpb25zLmlubGluZS5zb21lKChleHRUb2tlbml6ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuID0gZXh0VG9rZW5pemVyLmNhbGwoeyBsZXhlcjogdGhpcyB9LCBzcmMsIHRva2VucykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzY2FwZVxuICAgICAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZXNjYXBlKHNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRhZ1xuICAgICAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIudGFnKHNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGxhc3RUb2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RUb2tlbiAmJiB0b2tlbi50eXBlID09PSAndGV4dCcgJiYgbGFzdFRva2VuLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IHRva2VuLnJhdztcbiAgICAgICAgICAgICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gdG9rZW4udGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBsaW5rXG4gICAgICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5saW5rKHNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJlZmxpbmssIG5vbGlua1xuICAgICAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIucmVmbGluayhzcmMsIHRoaXMudG9rZW5zLmxpbmtzKSkge1xuICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgbGFzdFRva2VuID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdFRva2VuICYmIHRva2VuLnR5cGUgPT09ICd0ZXh0JyAmJiBsYXN0VG9rZW4udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gdG9rZW4ucmF3O1xuICAgICAgICAgICAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSB0b2tlbi50ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVtICYgc3Ryb25nXG4gICAgICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5lbVN0cm9uZyhzcmMsIG1hc2tlZFNyYywgcHJldkNoYXIpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb2RlXG4gICAgICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5jb2Rlc3BhbihzcmMpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBiclxuICAgICAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuYnIoc3JjKSkge1xuICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZGVsIChnZm0pXG4gICAgICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5kZWwoc3JjKSkge1xuICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYXV0b2xpbmtcbiAgICAgICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmF1dG9saW5rKHNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHVybCAoZ2ZtKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmluTGluayAmJiAodG9rZW4gPSB0aGlzLnRva2VuaXplci51cmwoc3JjKSkpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRleHRcbiAgICAgICAgICAgIC8vIHByZXZlbnQgaW5saW5lVGV4dCBjb25zdW1pbmcgZXh0ZW5zaW9ucyBieSBjbGlwcGluZyAnc3JjJyB0byBleHRlbnNpb24gc3RhcnRcbiAgICAgICAgICAgIGN1dFNyYyA9IHNyYztcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyAmJiB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydElubGluZSkge1xuICAgICAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcFNyYyA9IHNyYy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICBsZXQgdGVtcFN0YXJ0O1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0SW5saW5lLmZvckVhY2goKGdldFN0YXJ0SW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXJ0ID0gZ2V0U3RhcnRJbmRleC5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgdGVtcFNyYyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGVtcFN0YXJ0ID09PSAnbnVtYmVyJyAmJiB0ZW1wU3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IE1hdGgubWluKHN0YXJ0SW5kZXgsIHRlbXBTdGFydCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRJbmRleCA8IEluZmluaXR5ICYmIHN0YXJ0SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjdXRTcmMgPSBzcmMuc3Vic3RyaW5nKDAsIHN0YXJ0SW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5pbmxpbmVUZXh0KGN1dFNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbi5yYXcuc2xpY2UoLTEpICE9PSAnXycpIHsgLy8gVHJhY2sgcHJldkNoYXIgYmVmb3JlIHN0cmluZyBvZiBfX19fIHN0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgcHJldkNoYXIgPSB0b2tlbi5yYXcuc2xpY2UoLTEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBrZWVwUHJldkNoYXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxhc3RUb2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RUb2tlbiAmJiBsYXN0VG9rZW4udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gdG9rZW4ucmF3O1xuICAgICAgICAgICAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSB0b2tlbi50ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJNc2cgPSAnSW5maW5pdGUgbG9vcCBvbiBieXRlOiAnICsgc3JjLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9rZW5zO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBfZGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLnRzJztcbmltcG9ydCB7IGNsZWFuVXJsLCBlc2NhcGUgfSBmcm9tICcuL2hlbHBlcnMudHMnO1xuLyoqXG4gKiBSZW5kZXJlclxuICovXG5leHBvcnQgY2xhc3MgX1JlbmRlcmVyIHtcbiAgICBvcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBfZGVmYXVsdHM7XG4gICAgfVxuICAgIGNvZGUoY29kZSwgaW5mb3N0cmluZywgZXNjYXBlZCkge1xuICAgICAgICBjb25zdCBsYW5nID0gKGluZm9zdHJpbmcgfHwgJycpLm1hdGNoKC9eXFxTKi8pPy5bMF07XG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UoL1xcbiQvLCAnJykgKyAnXFxuJztcbiAgICAgICAgaWYgKCFsYW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gJzxwcmU+PGNvZGU+J1xuICAgICAgICAgICAgICAgICsgKGVzY2FwZWQgPyBjb2RlIDogZXNjYXBlKGNvZGUsIHRydWUpKVxuICAgICAgICAgICAgICAgICsgJzwvY29kZT48L3ByZT5cXG4nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnPHByZT48Y29kZSBjbGFzcz1cImxhbmd1YWdlLSdcbiAgICAgICAgICAgICsgZXNjYXBlKGxhbmcpXG4gICAgICAgICAgICArICdcIj4nXG4gICAgICAgICAgICArIChlc2NhcGVkID8gY29kZSA6IGVzY2FwZShjb2RlLCB0cnVlKSlcbiAgICAgICAgICAgICsgJzwvY29kZT48L3ByZT5cXG4nO1xuICAgIH1cbiAgICBibG9ja3F1b3RlKHF1b3RlKSB7XG4gICAgICAgIHJldHVybiBgPGJsb2NrcXVvdGU+XFxuJHtxdW90ZX08L2Jsb2NrcXVvdGU+XFxuYDtcbiAgICB9XG4gICAgaHRtbChodG1sLCBibG9jaykge1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gICAgaGVhZGluZyh0ZXh0LCBsZXZlbCwgcmF3KSB7XG4gICAgICAgIC8vIGlnbm9yZSBJRHNcbiAgICAgICAgcmV0dXJuIGA8aCR7bGV2ZWx9PiR7dGV4dH08L2gke2xldmVsfT5cXG5gO1xuICAgIH1cbiAgICBocigpIHtcbiAgICAgICAgcmV0dXJuICc8aHI+XFxuJztcbiAgICB9XG4gICAgbGlzdChib2R5LCBvcmRlcmVkLCBzdGFydCkge1xuICAgICAgICBjb25zdCB0eXBlID0gb3JkZXJlZCA/ICdvbCcgOiAndWwnO1xuICAgICAgICBjb25zdCBzdGFydGF0dCA9IChvcmRlcmVkICYmIHN0YXJ0ICE9PSAxKSA/ICgnIHN0YXJ0PVwiJyArIHN0YXJ0ICsgJ1wiJykgOiAnJztcbiAgICAgICAgcmV0dXJuICc8JyArIHR5cGUgKyBzdGFydGF0dCArICc+XFxuJyArIGJvZHkgKyAnPC8nICsgdHlwZSArICc+XFxuJztcbiAgICB9XG4gICAgbGlzdGl0ZW0odGV4dCwgdGFzaywgY2hlY2tlZCkge1xuICAgICAgICByZXR1cm4gYDxsaT4ke3RleHR9PC9saT5cXG5gO1xuICAgIH1cbiAgICBjaGVja2JveChjaGVja2VkKSB7XG4gICAgICAgIHJldHVybiAnPGlucHV0ICdcbiAgICAgICAgICAgICsgKGNoZWNrZWQgPyAnY2hlY2tlZD1cIlwiICcgOiAnJylcbiAgICAgICAgICAgICsgJ2Rpc2FibGVkPVwiXCIgdHlwZT1cImNoZWNrYm94XCI+JztcbiAgICB9XG4gICAgcGFyYWdyYXBoKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIGA8cD4ke3RleHR9PC9wPlxcbmA7XG4gICAgfVxuICAgIHRhYmxlKGhlYWRlciwgYm9keSkge1xuICAgICAgICBpZiAoYm9keSlcbiAgICAgICAgICAgIGJvZHkgPSBgPHRib2R5PiR7Ym9keX08L3Rib2R5PmA7XG4gICAgICAgIHJldHVybiAnPHRhYmxlPlxcbidcbiAgICAgICAgICAgICsgJzx0aGVhZD5cXG4nXG4gICAgICAgICAgICArIGhlYWRlclxuICAgICAgICAgICAgKyAnPC90aGVhZD5cXG4nXG4gICAgICAgICAgICArIGJvZHlcbiAgICAgICAgICAgICsgJzwvdGFibGU+XFxuJztcbiAgICB9XG4gICAgdGFibGVyb3coY29udGVudCkge1xuICAgICAgICByZXR1cm4gYDx0cj5cXG4ke2NvbnRlbnR9PC90cj5cXG5gO1xuICAgIH1cbiAgICB0YWJsZWNlbGwoY29udGVudCwgZmxhZ3MpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGZsYWdzLmhlYWRlciA/ICd0aCcgOiAndGQnO1xuICAgICAgICBjb25zdCB0YWcgPSBmbGFncy5hbGlnblxuICAgICAgICAgICAgPyBgPCR7dHlwZX0gYWxpZ249XCIke2ZsYWdzLmFsaWdufVwiPmBcbiAgICAgICAgICAgIDogYDwke3R5cGV9PmA7XG4gICAgICAgIHJldHVybiB0YWcgKyBjb250ZW50ICsgYDwvJHt0eXBlfT5cXG5gO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBzcGFuIGxldmVsIHJlbmRlcmVyXG4gICAgICovXG4gICAgc3Ryb25nKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIGA8c3Ryb25nPiR7dGV4dH08L3N0cm9uZz5gO1xuICAgIH1cbiAgICBlbSh0ZXh0KSB7XG4gICAgICAgIHJldHVybiBgPGVtPiR7dGV4dH08L2VtPmA7XG4gICAgfVxuICAgIGNvZGVzcGFuKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIGA8Y29kZT4ke3RleHR9PC9jb2RlPmA7XG4gICAgfVxuICAgIGJyKCkge1xuICAgICAgICByZXR1cm4gJzxicj4nO1xuICAgIH1cbiAgICBkZWwodGV4dCkge1xuICAgICAgICByZXR1cm4gYDxkZWw+JHt0ZXh0fTwvZGVsPmA7XG4gICAgfVxuICAgIGxpbmsoaHJlZiwgdGl0bGUsIHRleHQpIHtcbiAgICAgICAgY29uc3QgY2xlYW5IcmVmID0gY2xlYW5VcmwoaHJlZik7XG4gICAgICAgIGlmIChjbGVhbkhyZWYgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGhyZWYgPSBjbGVhbkhyZWY7XG4gICAgICAgIGxldCBvdXQgPSAnPGEgaHJlZj1cIicgKyBocmVmICsgJ1wiJztcbiAgICAgICAgaWYgKHRpdGxlKSB7XG4gICAgICAgICAgICBvdXQgKz0gJyB0aXRsZT1cIicgKyB0aXRsZSArICdcIic7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICc+JyArIHRleHQgKyAnPC9hPic7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIGltYWdlKGhyZWYsIHRpdGxlLCB0ZXh0KSB7XG4gICAgICAgIGNvbnN0IGNsZWFuSHJlZiA9IGNsZWFuVXJsKGhyZWYpO1xuICAgICAgICBpZiAoY2xlYW5IcmVmID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfVxuICAgICAgICBocmVmID0gY2xlYW5IcmVmO1xuICAgICAgICBsZXQgb3V0ID0gYDxpbWcgc3JjPVwiJHtocmVmfVwiIGFsdD1cIiR7dGV4dH1cImA7XG4gICAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICAgICAgb3V0ICs9IGAgdGl0bGU9XCIke3RpdGxlfVwiYDtcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJz4nO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICB0ZXh0KHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxufVxuIiwgIi8qKlxuICogVGV4dFJlbmRlcmVyXG4gKiByZXR1cm5zIG9ubHkgdGhlIHRleHR1YWwgcGFydCBvZiB0aGUgdG9rZW5cbiAqL1xuZXhwb3J0IGNsYXNzIF9UZXh0UmVuZGVyZXIge1xuICAgIC8vIG5vIG5lZWQgZm9yIGJsb2NrIGxldmVsIHJlbmRlcmVyc1xuICAgIHN0cm9uZyh0ZXh0KSB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBlbSh0ZXh0KSB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBjb2Rlc3Bhbih0ZXh0KSB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBkZWwodGV4dCkge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgaHRtbCh0ZXh0KSB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICB0ZXh0KHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIGxpbmsoaHJlZiwgdGl0bGUsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdGV4dDtcbiAgICB9XG4gICAgaW1hZ2UoaHJlZiwgdGl0bGUsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdGV4dDtcbiAgICB9XG4gICAgYnIoKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgX1JlbmRlcmVyIH0gZnJvbSAnLi9SZW5kZXJlci50cyc7XG5pbXBvcnQgeyBfVGV4dFJlbmRlcmVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgeyB1bmVzY2FwZSB9IGZyb20gJy4vaGVscGVycy50cyc7XG4vKipcbiAqIFBhcnNpbmcgJiBDb21waWxpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIF9QYXJzZXIge1xuICAgIG9wdGlvbnM7XG4gICAgcmVuZGVyZXI7XG4gICAgdGV4dFJlbmRlcmVyO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBfZGVmYXVsdHM7XG4gICAgICAgIHRoaXMub3B0aW9ucy5yZW5kZXJlciA9IHRoaXMub3B0aW9ucy5yZW5kZXJlciB8fCBuZXcgX1JlbmRlcmVyKCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSB0aGlzLm9wdGlvbnMucmVuZGVyZXI7XG4gICAgICAgIHRoaXMucmVuZGVyZXIub3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgdGhpcy50ZXh0UmVuZGVyZXIgPSBuZXcgX1RleHRSZW5kZXJlcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGF0aWMgUGFyc2UgTWV0aG9kXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlKHRva2Vucywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgX1BhcnNlcihvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZSh0b2tlbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGF0aWMgUGFyc2UgSW5saW5lIE1ldGhvZFxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZUlubGluZSh0b2tlbnMsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IF9QYXJzZXIob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBwYXJzZXIucGFyc2VJbmxpbmUodG9rZW5zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2UgTG9vcFxuICAgICAqL1xuICAgIHBhcnNlKHRva2VucywgdG9wID0gdHJ1ZSkge1xuICAgICAgICBsZXQgb3V0ID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpXTtcbiAgICAgICAgICAgIC8vIFJ1biBhbnkgcmVuZGVyZXIgZXh0ZW5zaW9uc1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHRlbnNpb25zICYmIHRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVycyAmJiB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbdG9rZW4udHlwZV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBnZW5lcmljVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbZ2VuZXJpY1Rva2VuLnR5cGVdLmNhbGwoeyBwYXJzZXI6IHRoaXMgfSwgZ2VuZXJpY1Rva2VuKTtcbiAgICAgICAgICAgICAgICBpZiAocmV0ICE9PSBmYWxzZSB8fCAhWydzcGFjZScsICdocicsICdoZWFkaW5nJywgJ2NvZGUnLCAndGFibGUnLCAnYmxvY2txdW90ZScsICdsaXN0JywgJ2h0bWwnLCAncGFyYWdyYXBoJywgJ3RleHQnXS5pbmNsdWRlcyhnZW5lcmljVG9rZW4udHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHJldCB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3BhY2UnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdocic6IHtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuaHIoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2hlYWRpbmcnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRpbmdUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5oZWFkaW5nKHRoaXMucGFyc2VJbmxpbmUoaGVhZGluZ1Rva2VuLnRva2VucyksIGhlYWRpbmdUb2tlbi5kZXB0aCwgdW5lc2NhcGUodGhpcy5wYXJzZUlubGluZShoZWFkaW5nVG9rZW4udG9rZW5zLCB0aGlzLnRleHRSZW5kZXJlcikpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2NvZGUnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5jb2RlKGNvZGVUb2tlbi50ZXh0LCBjb2RlVG9rZW4ubGFuZywgISFjb2RlVG9rZW4uZXNjYXBlZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICd0YWJsZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFibGVUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZGVyID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhlYWRlclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2VsbCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRhYmxlVG9rZW4uaGVhZGVyLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsICs9IHRoaXMucmVuZGVyZXIudGFibGVjZWxsKHRoaXMucGFyc2VJbmxpbmUodGFibGVUb2tlbi5oZWFkZXJbal0udG9rZW5zKSwgeyBoZWFkZXI6IHRydWUsIGFsaWduOiB0YWJsZVRva2VuLmFsaWduW2pdIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlciArPSB0aGlzLnJlbmRlcmVyLnRhYmxlcm93KGNlbGwpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYm9keSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRhYmxlVG9rZW4ucm93cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gdGFibGVUb2tlbi5yb3dzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCByb3cubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsICs9IHRoaXMucmVuZGVyZXIudGFibGVjZWxsKHRoaXMucGFyc2VJbmxpbmUocm93W2tdLnRva2VucyksIHsgaGVhZGVyOiBmYWxzZSwgYWxpZ246IHRhYmxlVG9rZW4uYWxpZ25ba10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHRoaXMucmVuZGVyZXIudGFibGVyb3coY2VsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIudGFibGUoaGVhZGVyLCBib2R5KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2Jsb2NrcXVvdGUnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrcXVvdGVUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gdGhpcy5wYXJzZShibG9ja3F1b3RlVG9rZW4udG9rZW5zKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuYmxvY2txdW90ZShib2R5KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2xpc3QnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmRlcmVkID0gbGlzdFRva2VuLm9yZGVyZWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gbGlzdFRva2VuLnN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb29zZSA9IGxpc3RUb2tlbi5sb29zZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJvZHkgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaXN0VG9rZW4uaXRlbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBsaXN0VG9rZW4uaXRlbXNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gaXRlbS5jaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IGl0ZW0udGFzaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdGVtQm9keSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0udGFzaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrYm94ID0gdGhpcy5yZW5kZXJlci5jaGVja2JveCghIWNoZWNrZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb29zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS50b2tlbnMubGVuZ3RoID4gMCAmJiBpdGVtLnRva2Vuc1swXS50eXBlID09PSAncGFyYWdyYXBoJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS50b2tlbnNbMF0udGV4dCA9IGNoZWNrYm94ICsgJyAnICsgaXRlbS50b2tlbnNbMF0udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnRva2Vuc1swXS50b2tlbnMgJiYgaXRlbS50b2tlbnNbMF0udG9rZW5zLmxlbmd0aCA+IDAgJiYgaXRlbS50b2tlbnNbMF0udG9rZW5zWzBdLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udG9rZW5zWzBdLnRva2Vuc1swXS50ZXh0ID0gY2hlY2tib3ggKyAnICcgKyBpdGVtLnRva2Vuc1swXS50b2tlbnNbMF0udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udG9rZW5zLnVuc2hpZnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjaGVja2JveCArICcgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1Cb2R5ICs9IGNoZWNrYm94ICsgJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1Cb2R5ICs9IHRoaXMucGFyc2UoaXRlbS50b2tlbnMsIGxvb3NlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gdGhpcy5yZW5kZXJlci5saXN0aXRlbShpdGVtQm9keSwgdGFzaywgISFjaGVja2VkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5saXN0KGJvZHksIG9yZGVyZWQsIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2h0bWwnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGh0bWxUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5odG1sKGh0bWxUb2tlbi50ZXh0LCBodG1sVG9rZW4uYmxvY2spO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAncGFyYWdyYXBoJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhZ3JhcGhUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gdGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgodGhpcy5wYXJzZUlubGluZShwYXJhZ3JhcGhUb2tlbi50b2tlbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0VG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJvZHkgPSB0ZXh0VG9rZW4udG9rZW5zID8gdGhpcy5wYXJzZUlubGluZSh0ZXh0VG9rZW4udG9rZW5zKSA6IHRleHRUb2tlbi50ZXh0O1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSArIDEgPCB0b2tlbnMubGVuZ3RoICYmIHRva2Vuc1tpICsgMV0udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0VG9rZW4gPSB0b2tlbnNbKytpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gJ1xcbicgKyAodGV4dFRva2VuLnRva2VucyA/IHRoaXMucGFyc2VJbmxpbmUodGV4dFRva2VuLnRva2VucykgOiB0ZXh0VG9rZW4udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHRvcCA/IHRoaXMucmVuZGVyZXIucGFyYWdyYXBoKGJvZHkpIDogYm9keTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gJ1Rva2VuIHdpdGggXCInICsgdG9rZW4udHlwZSArICdcIiB0eXBlIHdhcyBub3QgZm91bmQuJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlIElubGluZSBUb2tlbnNcbiAgICAgKi9cbiAgICBwYXJzZUlubGluZSh0b2tlbnMsIHJlbmRlcmVyKSB7XG4gICAgICAgIHJlbmRlcmVyID0gcmVuZGVyZXIgfHwgdGhpcy5yZW5kZXJlcjtcbiAgICAgICAgbGV0IG91dCA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaV07XG4gICAgICAgICAgICAvLyBSdW4gYW55IHJlbmRlcmVyIGV4dGVuc2lvbnNcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyAmJiB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnMgJiYgdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW3Rva2VuLnR5cGVdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW3Rva2VuLnR5cGVdLmNhbGwoeyBwYXJzZXI6IHRoaXMgfSwgdG9rZW4pO1xuICAgICAgICAgICAgICAgIGlmIChyZXQgIT09IGZhbHNlIHx8ICFbJ2VzY2FwZScsICdodG1sJywgJ2xpbmsnLCAnaW1hZ2UnLCAnc3Ryb25nJywgJ2VtJywgJ2NvZGVzcGFuJywgJ2JyJywgJ2RlbCcsICd0ZXh0J10uaW5jbHVkZXModG9rZW4udHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHJldCB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZXNjYXBlJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlc2NhcGVUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIudGV4dChlc2NhcGVUb2tlbi50ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2h0bWwnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ1Rva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSByZW5kZXJlci5odG1sKHRhZ1Rva2VuLnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnbGluayc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlua1Rva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSByZW5kZXJlci5saW5rKGxpbmtUb2tlbi5ocmVmLCBsaW5rVG9rZW4udGl0bGUsIHRoaXMucGFyc2VJbmxpbmUobGlua1Rva2VuLnRva2VucywgcmVuZGVyZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2ltYWdlJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZVRva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSByZW5kZXJlci5pbWFnZShpbWFnZVRva2VuLmhyZWYsIGltYWdlVG9rZW4udGl0bGUsIGltYWdlVG9rZW4udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdzdHJvbmcnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cm9uZ1Rva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSByZW5kZXJlci5zdHJvbmcodGhpcy5wYXJzZUlubGluZShzdHJvbmdUb2tlbi50b2tlbnMsIHJlbmRlcmVyKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdlbSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1Ub2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuZW0odGhpcy5wYXJzZUlubGluZShlbVRva2VuLnRva2VucywgcmVuZGVyZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2NvZGVzcGFuJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2Rlc3BhblRva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSByZW5kZXJlci5jb2Rlc3Bhbihjb2Rlc3BhblRva2VuLnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnYnInOiB7XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSByZW5kZXJlci5icigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZGVsJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuZGVsKHRoaXMucGFyc2VJbmxpbmUoZGVsVG9rZW4udG9rZW5zLCByZW5kZXJlcikpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dFRva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSByZW5kZXJlci50ZXh0KHRleHRUb2tlbi50ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gJ1Rva2VuIHdpdGggXCInICsgdG9rZW4udHlwZSArICdcIiB0eXBlIHdhcyBub3QgZm91bmQuJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IF9kZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuZXhwb3J0IGNsYXNzIF9Ib29rcyB7XG4gICAgb3B0aW9ucztcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgX2RlZmF1bHRzO1xuICAgIH1cbiAgICBzdGF0aWMgcGFzc1Rocm91Z2hIb29rcyA9IG5ldyBTZXQoW1xuICAgICAgICAncHJlcHJvY2VzcycsXG4gICAgICAgICdwb3N0cHJvY2VzcycsXG4gICAgICAgICdwcm9jZXNzQWxsVG9rZW5zJ1xuICAgIF0pO1xuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgbWFya2Rvd24gYmVmb3JlIG1hcmtlZFxuICAgICAqL1xuICAgIHByZXByb2Nlc3MobWFya2Rvd24pIHtcbiAgICAgICAgcmV0dXJuIG1hcmtkb3duO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIEhUTUwgYWZ0ZXIgbWFya2VkIGlzIGZpbmlzaGVkXG4gICAgICovXG4gICAgcG9zdHByb2Nlc3MoaHRtbCkge1xuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyBhbGwgdG9rZW5zIGJlZm9yZSB3YWxrIHRva2Vuc1xuICAgICAqL1xuICAgIHByb2Nlc3NBbGxUb2tlbnModG9rZW5zKSB7XG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IF9nZXREZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHsgX0xleGVyIH0gZnJvbSAnLi9MZXhlci50cyc7XG5pbXBvcnQgeyBfUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuaW1wb3J0IHsgX0hvb2tzIH0gZnJvbSAnLi9Ib29rcy50cyc7XG5pbXBvcnQgeyBfUmVuZGVyZXIgfSBmcm9tICcuL1JlbmRlcmVyLnRzJztcbmltcG9ydCB7IF9Ub2tlbml6ZXIgfSBmcm9tICcuL1Rva2VuaXplci50cyc7XG5pbXBvcnQgeyBfVGV4dFJlbmRlcmVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgZXNjYXBlIH0gZnJvbSAnLi9oZWxwZXJzLnRzJztcbmV4cG9ydCBjbGFzcyBNYXJrZWQge1xuICAgIGRlZmF1bHRzID0gX2dldERlZmF1bHRzKCk7XG4gICAgb3B0aW9ucyA9IHRoaXMuc2V0T3B0aW9ucztcbiAgICBwYXJzZSA9IHRoaXMuI3BhcnNlTWFya2Rvd24oX0xleGVyLmxleCwgX1BhcnNlci5wYXJzZSk7XG4gICAgcGFyc2VJbmxpbmUgPSB0aGlzLiNwYXJzZU1hcmtkb3duKF9MZXhlci5sZXhJbmxpbmUsIF9QYXJzZXIucGFyc2VJbmxpbmUpO1xuICAgIFBhcnNlciA9IF9QYXJzZXI7XG4gICAgUmVuZGVyZXIgPSBfUmVuZGVyZXI7XG4gICAgVGV4dFJlbmRlcmVyID0gX1RleHRSZW5kZXJlcjtcbiAgICBMZXhlciA9IF9MZXhlcjtcbiAgICBUb2tlbml6ZXIgPSBfVG9rZW5pemVyO1xuICAgIEhvb2tzID0gX0hvb2tzO1xuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy51c2UoLi4uYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJ1biBjYWxsYmFjayBmb3IgZXZlcnkgdG9rZW5cbiAgICAgKi9cbiAgICB3YWxrVG9rZW5zKHRva2VucywgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdChjYWxsYmFjay5jYWxsKHRoaXMsIHRva2VuKSk7XG4gICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd0YWJsZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFibGVUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGFibGVUb2tlbi5oZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQodGhpcy53YWxrVG9rZW5zKGNlbGwudG9rZW5zLCBjYWxsYmFjaykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHRhYmxlVG9rZW4ucm93cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHJvdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQodGhpcy53YWxrVG9rZW5zKGNlbGwudG9rZW5zLCBjYWxsYmFjaykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdsaXN0Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0VG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMobGlzdFRva2VuLml0ZW1zLCBjYWxsYmFjaykpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZW5lcmljVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9ucz8uY2hpbGRUb2tlbnM/LltnZW5lcmljVG9rZW4udHlwZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9ucy5jaGlsZFRva2Vuc1tnZW5lcmljVG9rZW4udHlwZV0uZm9yRWFjaCgoY2hpbGRUb2tlbnMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b2tlbnMgPSBnZW5lcmljVG9rZW5bY2hpbGRUb2tlbnNdLmZsYXQoSW5maW5pdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQodGhpcy53YWxrVG9rZW5zKHRva2VucywgY2FsbGJhY2spKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGdlbmVyaWNUb2tlbi50b2tlbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQodGhpcy53YWxrVG9rZW5zKGdlbmVyaWNUb2tlbi50b2tlbnMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG4gICAgdXNlKC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9ucyA9IHRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9ucyB8fCB7IHJlbmRlcmVyczoge30sIGNoaWxkVG9rZW5zOiB7fSB9O1xuICAgICAgICBhcmdzLmZvckVhY2goKHBhY2spID0+IHtcbiAgICAgICAgICAgIC8vIGNvcHkgb3B0aW9ucyB0byBuZXcgb2JqZWN0XG4gICAgICAgICAgICBjb25zdCBvcHRzID0geyAuLi5wYWNrIH07XG4gICAgICAgICAgICAvLyBzZXQgYXN5bmMgdG8gdHJ1ZSBpZiBpdCB3YXMgc2V0IHRvIHRydWUgYmVmb3JlXG4gICAgICAgICAgICBvcHRzLmFzeW5jID0gdGhpcy5kZWZhdWx0cy5hc3luYyB8fCBvcHRzLmFzeW5jIHx8IGZhbHNlO1xuICAgICAgICAgICAgLy8gPT0tLSBQYXJzZSBcImFkZG9uXCIgZXh0ZW5zaW9ucyAtLT09IC8vXG4gICAgICAgICAgICBpZiAocGFjay5leHRlbnNpb25zKSB7XG4gICAgICAgICAgICAgICAgcGFjay5leHRlbnNpb25zLmZvckVhY2goKGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4dC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4dGVuc2lvbiBuYW1lIHJlcXVpcmVkJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCdyZW5kZXJlcicgaW4gZXh0KSB7IC8vIFJlbmRlcmVyIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZSZW5kZXJlciA9IGV4dGVuc2lvbnMucmVuZGVyZXJzW2V4dC5uYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2UmVuZGVyZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGV4dGVuc2lvbiB3aXRoIGZ1bmMgdG8gcnVuIG5ldyBleHRlbnNpb24gYnV0IGZhbGwgYmFjayBpZiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMucmVuZGVyZXJzW2V4dC5uYW1lXSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXQgPSBleHQucmVuZGVyZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBwcmV2UmVuZGVyZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5yZW5kZXJlcnNbZXh0Lm5hbWVdID0gZXh0LnJlbmRlcmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICgndG9rZW5pemVyJyBpbiBleHQpIHsgLy8gVG9rZW5pemVyIEV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXh0LmxldmVsIHx8IChleHQubGV2ZWwgIT09ICdibG9jaycgJiYgZXh0LmxldmVsICE9PSAnaW5saW5lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHRlbnNpb24gbGV2ZWwgbXVzdCBiZSAnYmxvY2snIG9yICdpbmxpbmUnXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0TGV2ZWwgPSBleHRlbnNpb25zW2V4dC5sZXZlbF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0TGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRMZXZlbC51bnNoaWZ0KGV4dC50b2tlbml6ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc1tleHQubGV2ZWxdID0gW2V4dC50b2tlbml6ZXJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dC5zdGFydCkgeyAvLyBGdW5jdGlvbiB0byBjaGVjayBmb3Igc3RhcnQgb2YgdG9rZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0LmxldmVsID09PSAnYmxvY2snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb25zLnN0YXJ0QmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuc3RhcnRCbG9jay5wdXNoKGV4dC5zdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0QmxvY2sgPSBbZXh0LnN0YXJ0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChleHQubGV2ZWwgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb25zLnN0YXJ0SW5saW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0SW5saW5lLnB1c2goZXh0LnN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuc3RhcnRJbmxpbmUgPSBbZXh0LnN0YXJ0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoJ2NoaWxkVG9rZW5zJyBpbiBleHQgJiYgZXh0LmNoaWxkVG9rZW5zKSB7IC8vIENoaWxkIHRva2VucyB0byBiZSB2aXNpdGVkIGJ5IHdhbGtUb2tlbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuY2hpbGRUb2tlbnNbZXh0Lm5hbWVdID0gZXh0LmNoaWxkVG9rZW5zO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgb3B0cy5leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vID09LS0gUGFyc2UgXCJvdmVyd3JpdGVcIiBleHRlbnNpb25zIC0tPT0gLy9cbiAgICAgICAgICAgIGlmIChwYWNrLnJlbmRlcmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyZXIgPSB0aGlzLmRlZmF1bHRzLnJlbmRlcmVyIHx8IG5ldyBfUmVuZGVyZXIodGhpcy5kZWZhdWx0cyk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHBhY2sucmVuZGVyZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEocHJvcCBpbiByZW5kZXJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcmVuZGVyZXIgJyR7cHJvcH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09ICdvcHRpb25zJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIG9wdGlvbnMgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVyUHJvcCA9IHByb3A7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVyRnVuYyA9IHBhY2sucmVuZGVyZXJbcmVuZGVyZXJQcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldlJlbmRlcmVyID0gcmVuZGVyZXJbcmVuZGVyZXJQcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSByZW5kZXJlciB3aXRoIGZ1bmMgdG8gcnVuIGV4dGVuc2lvbiwgYnV0IGZhbGwgYmFjayBpZiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICByZW5kZXJlcltyZW5kZXJlclByb3BdID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXQgPSByZW5kZXJlckZ1bmMuYXBwbHkocmVuZGVyZXIsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBwcmV2UmVuZGVyZXIuYXBwbHkocmVuZGVyZXIsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0cy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhY2sudG9rZW5pemVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW5pemVyID0gdGhpcy5kZWZhdWx0cy50b2tlbml6ZXIgfHwgbmV3IF9Ub2tlbml6ZXIodGhpcy5kZWZhdWx0cyk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHBhY2sudG9rZW5pemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHByb3AgaW4gdG9rZW5pemVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0b2tlbml6ZXIgJyR7cHJvcH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFsnb3B0aW9ucycsICdydWxlcycsICdsZXhlciddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgb3B0aW9ucywgcnVsZXMsIGFuZCBsZXhlciBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b2tlbml6ZXJQcm9wID0gcHJvcDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9rZW5pemVyRnVuYyA9IHBhY2sudG9rZW5pemVyW3Rva2VuaXplclByb3BdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2VG9rZW5pemVyID0gdG9rZW5pemVyW3Rva2VuaXplclByb3BdO1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRva2VuaXplciB3aXRoIGZ1bmMgdG8gcnVuIGV4dGVuc2lvbiwgYnV0IGZhbGwgYmFjayBpZiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNhbm5vdCB0eXBlIHRva2VuaXplciBmdW5jdGlvbiBkeW5hbWljYWxseVxuICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXJbdG9rZW5pemVyUHJvcF0gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJldCA9IHRva2VuaXplckZ1bmMuYXBwbHkodG9rZW5pemVyLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcHJldlRva2VuaXplci5hcHBseSh0b2tlbml6ZXIsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0cy50b2tlbml6ZXIgPSB0b2tlbml6ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyA9PS0tIFBhcnNlIEhvb2tzIGV4dGVuc2lvbnMgLS09PSAvL1xuICAgICAgICAgICAgaWYgKHBhY2suaG9va3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob29rcyA9IHRoaXMuZGVmYXVsdHMuaG9va3MgfHwgbmV3IF9Ib29rcygpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwYWNrLmhvb2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHByb3AgaW4gaG9va3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGhvb2sgJyR7cHJvcH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09ICdvcHRpb25zJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIG9wdGlvbnMgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvb2tzUHJvcCA9IHByb3A7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvb2tzRnVuYyA9IHBhY2suaG9va3NbaG9va3NQcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldkhvb2sgPSBob29rc1tob29rc1Byb3BdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoX0hvb2tzLnBhc3NUaHJvdWdoSG9va3MuaGFzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNhbm5vdCB0eXBlIGhvb2sgZnVuY3Rpb24gZHluYW1pY2FsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzW2hvb2tzUHJvcF0gPSAoYXJnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdHMuYXN5bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShob29rc0Z1bmMuY2FsbChob29rcywgYXJnKSkudGhlbihyZXQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZIb29rLmNhbGwoaG9va3MsIHJldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBob29rc0Z1bmMuY2FsbChob29rcywgYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldkhvb2suY2FsbChob29rcywgcmV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGNhbm5vdCB0eXBlIGhvb2sgZnVuY3Rpb24gZHluYW1pY2FsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzW2hvb2tzUHJvcF0gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXQgPSBob29rc0Z1bmMuYXBwbHkoaG9va3MsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHByZXZIb29rLmFwcGx5KGhvb2tzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0cy5ob29rcyA9IGhvb2tzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gPT0tLSBQYXJzZSBXYWxrVG9rZW5zIGV4dGVuc2lvbnMgLS09PSAvL1xuICAgICAgICAgICAgaWYgKHBhY2sud2Fsa1Rva2Vucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdhbGtUb2tlbnMgPSB0aGlzLmRlZmF1bHRzLndhbGtUb2tlbnM7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFja1dhbGt0b2tlbnMgPSBwYWNrLndhbGtUb2tlbnM7XG4gICAgICAgICAgICAgICAgb3B0cy53YWxrVG9rZW5zID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2gocGFja1dhbGt0b2tlbnMuY2FsbCh0aGlzLCB0b2tlbikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAod2Fsa1Rva2Vucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLmNvbmNhdCh3YWxrVG9rZW5zLmNhbGwodGhpcywgdG9rZW4pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRzID0geyAuLi50aGlzLmRlZmF1bHRzLCAuLi5vcHRzIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgc2V0T3B0aW9ucyhvcHQpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0cyA9IHsgLi4udGhpcy5kZWZhdWx0cywgLi4ub3B0IH07XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBsZXhlcihzcmMsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9MZXhlci5sZXgoc3JjLCBvcHRpb25zID8/IHRoaXMuZGVmYXVsdHMpO1xuICAgIH1cbiAgICBwYXJzZXIodG9rZW5zLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfUGFyc2VyLnBhcnNlKHRva2Vucywgb3B0aW9ucyA/PyB0aGlzLmRlZmF1bHRzKTtcbiAgICB9XG4gICAgI3BhcnNlTWFya2Rvd24obGV4ZXIsIHBhcnNlcikge1xuICAgICAgICByZXR1cm4gKHNyYywgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ09wdCA9IHsgLi4ub3B0aW9ucyB9O1xuICAgICAgICAgICAgY29uc3Qgb3B0ID0geyAuLi50aGlzLmRlZmF1bHRzLCAuLi5vcmlnT3B0IH07XG4gICAgICAgICAgICAvLyBTaG93IHdhcm5pbmcgaWYgYW4gZXh0ZW5zaW9uIHNldCBhc3luYyB0byB0cnVlIGJ1dCB0aGUgcGFyc2Ugd2FzIGNhbGxlZCB3aXRoIGFzeW5jOiBmYWxzZVxuICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdHMuYXN5bmMgPT09IHRydWUgJiYgb3JpZ09wdC5hc3luYyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdC5zaWxlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdtYXJrZWQoKTogVGhlIGFzeW5jIG9wdGlvbiB3YXMgc2V0IHRvIHRydWUgYnkgYW4gZXh0ZW5zaW9uLiBUaGUgYXN5bmM6IGZhbHNlIG9wdGlvbiBzZW50IHRvIHBhcnNlIHdpbGwgYmUgaWdub3JlZC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0LmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRocm93RXJyb3IgPSB0aGlzLiNvbkVycm9yKCEhb3B0LnNpbGVudCwgISFvcHQuYXN5bmMpO1xuICAgICAgICAgICAgLy8gdGhyb3cgZXJyb3IgaW4gY2FzZSBvZiBub24gc3RyaW5nIGlucHV0XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNyYyA9PT0gJ3VuZGVmaW5lZCcgfHwgc3JjID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IEVycm9yKCdtYXJrZWQoKTogaW5wdXQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCBvciBudWxsJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzcmMgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IEVycm9yKCdtYXJrZWQoKTogaW5wdXQgcGFyYW1ldGVyIGlzIG9mIHR5cGUgJ1xuICAgICAgICAgICAgICAgICAgICArIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzcmMpICsgJywgc3RyaW5nIGV4cGVjdGVkJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5ob29rcykge1xuICAgICAgICAgICAgICAgIG9wdC5ob29rcy5vcHRpb25zID0gb3B0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdC5hc3luYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUob3B0Lmhvb2tzID8gb3B0Lmhvb2tzLnByZXByb2Nlc3Moc3JjKSA6IHNyYylcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oc3JjID0+IGxleGVyKHNyYywgb3B0KSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4odG9rZW5zID0+IG9wdC5ob29rcyA/IG9wdC5ob29rcy5wcm9jZXNzQWxsVG9rZW5zKHRva2VucykgOiB0b2tlbnMpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHRva2VucyA9PiBvcHQud2Fsa1Rva2VucyA/IFByb21pc2UuYWxsKHRoaXMud2Fsa1Rva2Vucyh0b2tlbnMsIG9wdC53YWxrVG9rZW5zKSkudGhlbigoKSA9PiB0b2tlbnMpIDogdG9rZW5zKVxuICAgICAgICAgICAgICAgICAgICAudGhlbih0b2tlbnMgPT4gcGFyc2VyKHRva2Vucywgb3B0KSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oaHRtbCA9PiBvcHQuaG9va3MgPyBvcHQuaG9va3MucG9zdHByb2Nlc3MoaHRtbCkgOiBodG1sKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2godGhyb3dFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChvcHQuaG9va3MpIHtcbiAgICAgICAgICAgICAgICAgICAgc3JjID0gb3B0Lmhvb2tzLnByZXByb2Nlc3Moc3JjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHRva2VucyA9IGxleGVyKHNyYywgb3B0KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0Lmhvb2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VucyA9IG9wdC5ob29rcy5wcm9jZXNzQWxsVG9rZW5zKHRva2Vucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvcHQud2Fsa1Rva2Vucykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndhbGtUb2tlbnModG9rZW5zLCBvcHQud2Fsa1Rva2Vucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBodG1sID0gcGFyc2VyKHRva2Vucywgb3B0KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0Lmhvb2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0bWwgPSBvcHQuaG9va3MucG9zdHByb2Nlc3MoaHRtbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgI29uRXJyb3Ioc2lsZW50LCBhc3luYykge1xuICAgICAgICByZXR1cm4gKGUpID0+IHtcbiAgICAgICAgICAgIGUubWVzc2FnZSArPSAnXFxuUGxlYXNlIHJlcG9ydCB0aGlzIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZWRqcy9tYXJrZWQuJztcbiAgICAgICAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSAnPHA+QW4gZXJyb3Igb2NjdXJyZWQ6PC9wPjxwcmU+J1xuICAgICAgICAgICAgICAgICAgICArIGVzY2FwZShlLm1lc3NhZ2UgKyAnJywgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgKyAnPC9wcmU+JztcbiAgICAgICAgICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbXNnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgX0xleGVyIH0gZnJvbSAnLi9MZXhlci50cyc7XG5pbXBvcnQgeyBfUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuaW1wb3J0IHsgX1Rva2VuaXplciB9IGZyb20gJy4vVG9rZW5pemVyLnRzJztcbmltcG9ydCB7IF9SZW5kZXJlciB9IGZyb20gJy4vUmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX1RleHRSZW5kZXJlciB9IGZyb20gJy4vVGV4dFJlbmRlcmVyLnRzJztcbmltcG9ydCB7IF9Ib29rcyB9IGZyb20gJy4vSG9va3MudHMnO1xuaW1wb3J0IHsgTWFya2VkIH0gZnJvbSAnLi9JbnN0YW5jZS50cyc7XG5pbXBvcnQgeyBfZ2V0RGVmYXVsdHMsIGNoYW5nZURlZmF1bHRzLCBfZGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLnRzJztcbmNvbnN0IG1hcmtlZEluc3RhbmNlID0gbmV3IE1hcmtlZCgpO1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlZChzcmMsIG9wdCkge1xuICAgIHJldHVybiBtYXJrZWRJbnN0YW5jZS5wYXJzZShzcmMsIG9wdCk7XG59XG4vKipcbiAqIFNldHMgdGhlIGRlZmF1bHQgb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBIYXNoIG9mIG9wdGlvbnNcbiAqL1xubWFya2VkLm9wdGlvbnMgPVxuICAgIG1hcmtlZC5zZXRPcHRpb25zID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgbWFya2VkSW5zdGFuY2Uuc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgbWFya2VkLmRlZmF1bHRzID0gbWFya2VkSW5zdGFuY2UuZGVmYXVsdHM7XG4gICAgICAgIGNoYW5nZURlZmF1bHRzKG1hcmtlZC5kZWZhdWx0cyk7XG4gICAgICAgIHJldHVybiBtYXJrZWQ7XG4gICAgfTtcbi8qKlxuICogR2V0cyB0aGUgb3JpZ2luYWwgbWFya2VkIGRlZmF1bHQgb3B0aW9ucy5cbiAqL1xubWFya2VkLmdldERlZmF1bHRzID0gX2dldERlZmF1bHRzO1xubWFya2VkLmRlZmF1bHRzID0gX2RlZmF1bHRzO1xuLyoqXG4gKiBVc2UgRXh0ZW5zaW9uXG4gKi9cbm1hcmtlZC51c2UgPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIG1hcmtlZEluc3RhbmNlLnVzZSguLi5hcmdzKTtcbiAgICBtYXJrZWQuZGVmYXVsdHMgPSBtYXJrZWRJbnN0YW5jZS5kZWZhdWx0cztcbiAgICBjaGFuZ2VEZWZhdWx0cyhtYXJrZWQuZGVmYXVsdHMpO1xuICAgIHJldHVybiBtYXJrZWQ7XG59O1xuLyoqXG4gKiBSdW4gY2FsbGJhY2sgZm9yIGV2ZXJ5IHRva2VuXG4gKi9cbm1hcmtlZC53YWxrVG9rZW5zID0gZnVuY3Rpb24gKHRva2VucywgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gbWFya2VkSW5zdGFuY2Uud2Fsa1Rva2Vucyh0b2tlbnMsIGNhbGxiYWNrKTtcbn07XG4vKipcbiAqIENvbXBpbGVzIG1hcmtkb3duIHRvIEhUTUwgd2l0aG91dCBlbmNsb3NpbmcgYHBgIHRhZy5cbiAqXG4gKiBAcGFyYW0gc3JjIFN0cmluZyBvZiBtYXJrZG93biBzb3VyY2UgdG8gYmUgY29tcGlsZWRcbiAqIEBwYXJhbSBvcHRpb25zIEhhc2ggb2Ygb3B0aW9uc1xuICogQHJldHVybiBTdHJpbmcgb2YgY29tcGlsZWQgSFRNTFxuICovXG5tYXJrZWQucGFyc2VJbmxpbmUgPSBtYXJrZWRJbnN0YW5jZS5wYXJzZUlubGluZTtcbi8qKlxuICogRXhwb3NlXG4gKi9cbm1hcmtlZC5QYXJzZXIgPSBfUGFyc2VyO1xubWFya2VkLnBhcnNlciA9IF9QYXJzZXIucGFyc2U7XG5tYXJrZWQuUmVuZGVyZXIgPSBfUmVuZGVyZXI7XG5tYXJrZWQuVGV4dFJlbmRlcmVyID0gX1RleHRSZW5kZXJlcjtcbm1hcmtlZC5MZXhlciA9IF9MZXhlcjtcbm1hcmtlZC5sZXhlciA9IF9MZXhlci5sZXg7XG5tYXJrZWQuVG9rZW5pemVyID0gX1Rva2VuaXplcjtcbm1hcmtlZC5Ib29rcyA9IF9Ib29rcztcbm1hcmtlZC5wYXJzZSA9IG1hcmtlZDtcbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbWFya2VkLm9wdGlvbnM7XG5leHBvcnQgY29uc3Qgc2V0T3B0aW9ucyA9IG1hcmtlZC5zZXRPcHRpb25zO1xuZXhwb3J0IGNvbnN0IHVzZSA9IG1hcmtlZC51c2U7XG5leHBvcnQgY29uc3Qgd2Fsa1Rva2VucyA9IG1hcmtlZC53YWxrVG9rZW5zO1xuZXhwb3J0IGNvbnN0IHBhcnNlSW5saW5lID0gbWFya2VkLnBhcnNlSW5saW5lO1xuZXhwb3J0IGNvbnN0IHBhcnNlID0gbWFya2VkO1xuZXhwb3J0IGNvbnN0IHBhcnNlciA9IF9QYXJzZXIucGFyc2U7XG5leHBvcnQgY29uc3QgbGV4ZXIgPSBfTGV4ZXIubGV4O1xuZXhwb3J0IHsgX2RlZmF1bHRzIGFzIGRlZmF1bHRzLCBfZ2V0RGVmYXVsdHMgYXMgZ2V0RGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLnRzJztcbmV4cG9ydCB7IF9MZXhlciBhcyBMZXhlciB9IGZyb20gJy4vTGV4ZXIudHMnO1xuZXhwb3J0IHsgX1BhcnNlciBhcyBQYXJzZXIgfSBmcm9tICcuL1BhcnNlci50cyc7XG5leHBvcnQgeyBfVG9rZW5pemVyIGFzIFRva2VuaXplciB9IGZyb20gJy4vVG9rZW5pemVyLnRzJztcbmV4cG9ydCB7IF9SZW5kZXJlciBhcyBSZW5kZXJlciB9IGZyb20gJy4vUmVuZGVyZXIudHMnO1xuZXhwb3J0IHsgX1RleHRSZW5kZXJlciBhcyBUZXh0UmVuZGVyZXIgfSBmcm9tICcuL1RleHRSZW5kZXJlci50cyc7XG5leHBvcnQgeyBfSG9va3MgYXMgSG9va3MgfSBmcm9tICcuL0hvb2tzLnRzJztcbmV4cG9ydCB7IE1hcmtlZCB9IGZyb20gJy4vSW5zdGFuY2UudHMnO1xuIiwgIi8qKlxuICogQGZpbGUgU2FmZSBtYXJrZG93bi10by1IVE1MIGNvbnZlcnNpb24gZm9yIHRoZSB0cmFjZSB2aWV3ZXIuXG4gKlxuICogRXNjYXBlcyByYXcgSFRNTCBiZWZvcmUgcGFyc2luZyB3aXRoIGBtYXJrZWRgIHRvIHJlZHVjZSBYU1MgcmlzayB3aGVuXG4gKiByZW5kZXJpbmcgdXNlciBhbmQgYXNzaXN0YW50IG1lc3NhZ2UgY29udGVudCBpbiB0aGUgc2VsZi1jb250YWluZWQgcmVwb3J0LlxuICovXG5cbmltcG9ydCB7IG1hcmtlZCB9IGZyb20gXCJtYXJrZWRcIjtcblxuLy8gQ29uZmlndXJlIG1hcmtlZCBmb3Igc2FmZSBIVE1MIHJlbmRlcmluZ1xubWFya2VkLnNldE9wdGlvbnMoe1xuXHRnZm06IHRydWUsIC8vIEdpdEh1YiBGbGF2b3JlZCBNYXJrZG93blxuXHRicmVha3M6IHRydWUsIC8vIENvbnZlcnQgXFxuIHRvIDxicj5cbn0pO1xuXG4vKipcbiAqIEVzY2FwZSBIVE1MIGVudGl0aWVzIHRvIHByZXZlbnQgWFNTIHdoZW4gY29udGVudCBpcyBsYXRlciBwYXJzZWQgYXMgbWFya2Rvd24uXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHRleHRcblx0XHQucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpXG5cdFx0LnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpXG5cdFx0LnJlcGxhY2UoLz4vZywgXCImZ3Q7XCIpXG5cdFx0LnJlcGxhY2UoL1wiL2csIFwiJnF1b3Q7XCIpXG5cdFx0LnJlcGxhY2UoLycvZywgXCImIzM5O1wiKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IG1hcmtkb3duIHRleHQgdG8gYW4gSFRNTCBzdHJpbmcgd2l0aCBlbnRpdHkgZXNjYXBpbmcgYXBwbGllZCBmaXJzdC5cbiAqXG4gKiBAcGFyYW0gbWFya2Rvd24gLSBSYXcgbWFya2Rvd24gZnJvbSBsb2dnZWQgbWVzc2FnZXMuXG4gKiBAcmV0dXJucyBIVE1MIHN0cmluZyBzYWZlIGZvciBgdW5zYWZlSFRNTGAgcmVuZGVyaW5nIGluIExpdCB0ZW1wbGF0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZG93blRvSHRtbChtYXJrZG93bjogc3RyaW5nKTogc3RyaW5nIHtcblx0aWYgKCFtYXJrZG93bikgcmV0dXJuIFwiXCI7XG5cblx0dHJ5IHtcblx0XHQvLyBGaXJzdCBlc2NhcGUgYW55IGV4aXN0aW5nIEhUTUwgZW50aXRpZXMgdG8gcHJldmVudCBYU1Ncblx0XHRjb25zdCBlc2NhcGVkTWFya2Rvd24gPSBlc2NhcGVIdG1sKG1hcmtkb3duKTtcblx0XHRyZXR1cm4gbWFya2VkKGVzY2FwZWRNYXJrZG93bikgYXMgc3RyaW5nO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBwYXJzZSBtYXJrZG93bjpcIiwgZXJyb3IpO1xuXHRcdC8vIEZhbGxiYWNrIHRvIHBsYWluIHRleHQgd2l0aCBiYXNpYyBsaW5lIGJyZWFrIGhhbmRsaW5nIGFuZCBIVE1MIGVzY2FwaW5nXG5cdFx0cmV0dXJuIGVzY2FwZUh0bWwobWFya2Rvd24pLnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIik7XG5cdH1cbn1cbiIsICIvKipcbiAqIEBmaWxlIEh1bWFuLXJlYWRhYmxlIGNvbnZlcnNhdGlvbiByZW5kZXJlci5cbiAqXG4gKiBEaXNwbGF5cyBtZXJnZWQgY29udmVyc2F0aW9uIHRocmVhZHMgd2l0aCBtYXJrZG93biBmb3JtYXR0aW5nLCB0b29sIGNhbGxcbiAqIHByZXZpZXdzLCBkaWZmcywgY29sbGFwc2libGUgc3lzdGVtIHByb21wdHMsIGFuZCBDb2RleC1zcGVjaWZpYyBjb250ZXh0IHRhZ3MuXG4gKi9cblxuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCwgVGVtcGxhdGVSZXN1bHQgfSBmcm9tIFwibGl0XCI7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gXCJsaXQvZGVjb3JhdG9ycy5qc1wiO1xuaW1wb3J0IHsgdW5zYWZlSFRNTCB9IGZyb20gXCJsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qc1wiO1xuaW1wb3J0ICogYXMgRGlmZiBmcm9tIFwiZGlmZlwiO1xuaW1wb3J0IHR5cGUge1xuXHRNZXNzYWdlUGFyYW0sXG5cdFRleHRCbG9ja1BhcmFtLFxuXHRDb250ZW50QmxvY2ssXG5cdENvbnRlbnRCbG9ja1BhcmFtLFxuXHRNZXNzYWdlLFxuXHRUb29sVW5pb24sXG59IGZyb20gXCJAYW50aHJvcGljLWFpL3Nkay9yZXNvdXJjZXMvbWVzc2FnZXNcIjtcbmltcG9ydCB7IFNpbXBsZUNvbnZlcnNhdGlvbiwgRW5oYW5jZWRNZXNzYWdlUGFyYW0gfSBmcm9tIFwiLi4vLi4vLi4vc3JjL3JlcG9ydC9zaGFyZWQtY29udmVyc2F0aW9uLXByb2Nlc3NvclwiO1xuaW1wb3J0IHsgbWFya2Rvd25Ub0h0bWwgfSBmcm9tIFwiLi4vdXRpbHMvbWFya2Rvd25cIjtcblxuLyoqIFJlbmRlcnMge0BsaW5rIFNpbXBsZUNvbnZlcnNhdGlvbn0gdGhyZWFkcyBpbiB0aGUgbWFpbiBjb252ZXJzYXRpb25zIHRhYi4gKi9cbkBjdXN0b21FbGVtZW50KFwic2ltcGxlLWNvbnZlcnNhdGlvbi12aWV3XCIpXG5leHBvcnQgY2xhc3MgU2ltcGxlQ29udmVyc2F0aW9uVmlldyBleHRlbmRzIExpdEVsZW1lbnQge1xuXHRAcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSBjb252ZXJzYXRpb25zOiBTaW1wbGVDb252ZXJzYXRpb25bXSA9IFtdO1xuXG5cdC8qKiBMaWdodCBET00gc28gZ2xvYmFsIFRhaWx3aW5kIGNsYXNzZXMgYXBwbHkuICovXG5cdGNyZWF0ZVJlbmRlclJvb3QoKSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJpYyBjbGljayBoYW5kbGVyIGZvciBjb2xsYXBzaWJsZSBzZWN0aW9ucy5cblx0ICogU3VwcG9ydHMgc3RhbmRhcmQgY29udGVudCB0b2dnbGUsIFdyaXRlLXRvb2wgcHJldmlldyBzd2FwLCBvciBjdXN0b20gbG9naWMuXG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZVRvZ2dsZShcblx0XHRlOiBFdmVudCxcblx0XHRvcHRpb25zOiB7XG5cdFx0XHR0eXBlPzogXCJjb250ZW50XCIgfCBcIndyaXRlXCIgfCBcImN1c3RvbVwiO1xuXHRcdFx0dGFyZ2V0U2VsZWN0b3I/OiBzdHJpbmc7XG5cdFx0XHR0b2dnbGVTZWxlY3Rvcj86IHN0cmluZztcblx0XHRcdGN1c3RvbUhhbmRsZXI/OiAoZWxlbWVudDogSFRNTEVsZW1lbnQsIGlzSGlkZGVuOiBib29sZWFuKSA9PiB2b2lkO1xuXHRcdH0gPSB7fSxcblx0KSB7XG5cdFx0Y29uc3QgeyB0eXBlID0gXCJjb250ZW50XCIsIHRhcmdldFNlbGVjdG9yLCB0b2dnbGVTZWxlY3RvciwgY3VzdG9tSGFuZGxlciB9ID0gb3B0aW9ucztcblx0XHRjb25zdCBjdXJyZW50RWxlbWVudCA9IGUuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcblxuXHRcdGlmICh0eXBlID09PSBcIndyaXRlXCIpIHtcblx0XHRcdGNvbnN0IGZ1bGxDb250ZW50ID0gY3VycmVudEVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudDtcblx0XHRcdGlmIChmdWxsQ29udGVudCkge1xuXHRcdFx0XHRjb25zdCBpc0V4cGFuZGVkID0gIWZ1bGxDb250ZW50LmNsYXNzTGlzdC5jb250YWlucyhcImhpZGRlblwiKTtcblx0XHRcdFx0aWYgKGlzRXhwYW5kZWQpIHtcblx0XHRcdFx0XHRmdWxsQ29udGVudC5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuXHRcdFx0XHRcdGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRkZW5cIik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZnVsbENvbnRlbnQuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcblx0XHRcdFx0XHRjdXJyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGVmYXVsdCBjb250ZW50IHRvZ2dsZSBiZWhhdmlvclxuXHRcdGNvbnN0IHRhcmdldCA9IHRhcmdldFNlbGVjdG9yXG5cdFx0XHQ/IChjdXJyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldFNlbGVjdG9yKSBhcyBIVE1MRWxlbWVudClcblx0XHRcdDogKGN1cnJlbnRFbGVtZW50Lm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk7XG5cdFx0Y29uc3QgdG9nZ2xlID0gdG9nZ2xlU2VsZWN0b3Jcblx0XHRcdD8gKGN1cnJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IodG9nZ2xlU2VsZWN0b3IpIGFzIEhUTUxFbGVtZW50KVxuXHRcdFx0OiAoY3VycmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcihcInNwYW46Zmlyc3QtY2hpbGRcIikgYXMgSFRNTEVsZW1lbnQpO1xuXG5cdFx0aWYgKHRhcmdldCkge1xuXHRcdFx0Y29uc3QgaXNIaWRkZW4gPSB0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiaGlkZGVuXCIpO1xuXG5cdFx0XHRpZiAoY3VzdG9tSGFuZGxlcikge1xuXHRcdFx0XHRjdXN0b21IYW5kbGVyKHRhcmdldCwgaXNIaWRkZW4pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGFyZ2V0LmNsYXNzTGlzdC50b2dnbGUoXCJoaWRkZW5cIiwgIWlzSGlkZGVuKTtcblx0XHRcdFx0aWYgKHRvZ2dsZSkge1xuXHRcdFx0XHRcdHRvZ2dsZS50ZXh0Q29udGVudCA9IGlzSGlkZGVuID8gXCJbLV1cIiA6IFwiWytdXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKiogRGVsZWdhdGVzIHRvIHtAbGluayBoYW5kbGVUb2dnbGV9IHdpdGggZGVmYXVsdCBjb250ZW50LXRvZ2dsZSBiZWhhdmlvci4gKi9cblx0cHJpdmF0ZSB0b2dnbGVDb250ZW50KGU6IEV2ZW50KSB7XG5cdFx0dGhpcy5oYW5kbGVUb2dnbGUoZSk7XG5cdH1cblxuXHQvKiogU3dhcHMgV3JpdGUtdG9vbCBwcmV2aWV3IHZzIGZ1bGwgY29udGVudCBwYW5lbHMuICovXG5cdHByaXZhdGUgdG9nZ2xlV3JpdGVDb250ZW50KGU6IEV2ZW50KSB7XG5cdFx0dGhpcy5oYW5kbGVUb2dnbGUoZSwgeyB0eXBlOiBcIndyaXRlXCIgfSk7XG5cdH1cblxuXHQvKiogUmVuZGVycyBhbiBleHBhbmRhYmxlIFwiVGhpbmtpbmdcIiBibG9jayB3aXRoIG1hcmtkb3duIGZvcm1hdHRpbmcuICovXG5cdHByaXZhdGUgcmVuZGVyVGhpbmtpbmdCbG9jayh0aGlua2luZzogc3RyaW5nKTogVGVtcGxhdGVSZXN1bHQge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSB0aGlua2luZy50cmltKCk7XG5cdFx0aWYgKCFjb250ZW50KSB7XG5cdFx0XHRyZXR1cm4gaHRtbGBgO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlbmRlckNvbGxhcHNpYmxlU2VjdGlvbihcblx0XHRcdFwiVGhpbmtpbmdcIixcblx0XHRcdGh0bWxgPGRpdiBjbGFzcz1cInRleHQtZ3JheS00MDAgbWFya2Rvd24tY29udGVudFwiPiR7dW5zYWZlSFRNTChtYXJrZG93blRvSHRtbChjb250ZW50KSl9PC9kaXY+YCxcblx0XHRcdHtcblx0XHRcdFx0dGl0bGVDbGFzc2VzOiBcInRleHQtZ3JheS01MDAgaXRhbGljXCIsXG5cdFx0XHRcdGNvbnRhaW5lckNsYXNzZXM6IFwibXQtNCBtYi00XCIsXG5cdFx0XHR9LFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVuZGVycyBtZXNzYWdlIGNvbnRlbnQgYmxvY2tzIFx1MjAxNCB0ZXh0LCB0aGlua2luZywgYW5kIHRvb2xfdXNlIHdpdGggcGFpcmVkIHJlc3VsdHMuXG5cdCAqXG5cdCAqIEBwYXJhbSB0b29sUmVzdWx0cyAtIE1hcCBvZiB0b29sX3VzZV9pZCBcdTIxOTIgdG9vbF9yZXN1bHQgaG9pc3RlZCBieSB0aGUgcHJvY2Vzc29yLlxuXHQgKi9cblx0cHJpdmF0ZSBmb3JtYXRDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IENvbnRlbnRCbG9ja1BhcmFtW10sIHRvb2xSZXN1bHRzPzogUmVjb3JkPHN0cmluZywgYW55Pik6IFRlbXBsYXRlUmVzdWx0IHtcblx0XHRpZiAodHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFN0cmluZ0NvbnRlbnQoY29udGVudCk7XG5cdFx0fVxuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoY29udGVudCkpIHtcblx0XHRcdHJldHVybiBodG1sYFxuXHRcdFx0XHQke2NvbnRlbnQubWFwKChibG9jaykgPT4ge1xuXHRcdFx0XHRcdGlmIChibG9jay50eXBlID09PSBcInRleHRcIikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0U3RyaW5nQ29udGVudChibG9jay50ZXh0KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGJsb2NrLnR5cGUgPT09IFwidGhpbmtpbmdcIikge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGhpbmtpbmdCbG9jayA9IGJsb2NrIGFzIGFueTtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnJlbmRlclRoaW5raW5nQmxvY2sodGhpbmtpbmdCbG9jay50aGlua2luZyB8fCBcIlwiKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGJsb2NrLnR5cGUgPT09IFwidG9vbF9yZXN1bHRcIikge1xuXHRcdFx0XHRcdFx0Ly8gU2tpcCBzdGFuZGFsb25lIHRvb2xfcmVzdWx0IGJsb2NrcyAtIHRoZXkgd2lsbCBiZSBwYWlyZWQgd2l0aCB0b29sX3VzZVxuXHRcdFx0XHRcdFx0cmV0dXJuIGh0bWxgYDtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGJsb2NrLnR5cGUgPT09IFwidG9vbF91c2VcIikge1xuXHRcdFx0XHRcdFx0Y29uc3QgdG9vbFVzZSA9IGJsb2NrIGFzIGFueTtcblx0XHRcdFx0XHRcdGNvbnN0IHRvb2xSZXN1bHQgPSB0b29sUmVzdWx0cz8uW3Rvb2xVc2UuaWRdO1xuXG5cdFx0XHRcdFx0XHRpZiAoYmxvY2submFtZSA9PT0gXCJUb2RvV3JpdGVcIiB8fCBibG9jay5uYW1lID09PSBcIkVkaXRcIiB8fCBibG9jay5uYW1lID09PSBcIk11bHRpRWRpdFwiKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnJlbmRlclRvb2xDb250YWluZXIoYmxvY2ssIHRvb2xSZXN1bHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKGJsb2NrLm5hbWUgPT09IFwiV3JpdGVcIikge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjdXN0b21Db250ZW50ID0gaHRtbGBcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYmctdnMtYmctc2Vjb25kYXJ5IHAtNCB0ZXh0LXZzLXRleHQgaGlkZGVuXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQke3RoaXMucmVuZGVyVG9vbFVzZUNvbnRlbnQoYmxvY2spfVxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDxkaXZcblx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwiYmctdnMtYmctc2Vjb25kYXJ5IG14LTQgcC00IHRleHQtdnMtdGV4dCBjdXJzb3ItcG9pbnRlciBob3ZlcjpiZy12cy1ib3JkZXIgdHJhbnNpdGlvbi1jb2xvcnNcIlxuXHRcdFx0XHRcdFx0XHRcdFx0QGNsaWNrPSR7dGhpcy50b2dnbGVXcml0ZUNvbnRlbnR9XG5cdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0JHt0aGlzLnJlbmRlcldyaXRlUHJldmlldyhibG9jayl9XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdGA7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBodG1sYFxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtdC00IG1iLTRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLXR5cGUgcHgtNCBicmVhay1hbGxcIj4ke3RoaXMuZ2V0VG9vbERpc3BsYXlOYW1lKGJsb2NrKX08L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdCR7Y3VzdG9tQ29udGVudH0gJHt0b29sUmVzdWx0ID8gdGhpcy5yZW5kZXJUb29sUmVzdWx0KHRvb2xSZXN1bHQsIGJsb2NrKSA6IFwiXCJ9XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdGA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZW5kZXJUb29sQ29udGFpbmVyKGJsb2NrLCB0b29sUmVzdWx0LCB7XG5cdFx0XHRcdFx0XHRcdGlzQ29sbGFwc2libGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGlzQ29sbGFwc2VkOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRpc0NsaWNrVG9FeHBhbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGh0bWxgPHByZSBjbGFzcz1cIm1iLTRcIj4ke0pTT04uc3RyaW5naWZ5KGJsb2NrLCBudWxsLCAyKX08L3ByZT5gO1xuXHRcdFx0XHR9KX1cblx0XHRcdGA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGh0bWxgPHByZT4ke0pTT04uc3RyaW5naWZ5KGNvbnRlbnQsIG51bGwsIDIpfTwvcHJlPmA7XG5cdH1cblxuXHQvKipcblx0ICogRmluZHMgYWxsIG9jY3VycmVuY2VzIG9mIGA8dGFnPi4uLjwvdGFnPmAgKHJhdyBvciBIVE1MLWVzY2FwZWQpIGFuZCByZXR1cm5zXG5cdCAqIGlubmVyIHRleHQgcGx1cyB0aGUgc3RyaW5nIHdpdGggdGhvc2UgYmxvY2tzIHJlbW92ZWQuXG5cdCAqL1xuXHRwcml2YXRlIGV4dHJhY3RUYWdnZWRCbG9ja3MoXG5cdFx0Y29udGVudDogc3RyaW5nLFxuXHRcdHRhZ05hbWU6IHN0cmluZyxcblx0KTogeyBibG9ja3M6IHN0cmluZ1tdOyByZW1haW5pbmc6IHN0cmluZyB9IHtcblx0XHRjb25zdCBlc2NhcGVkUGF0dGVybiA9IG5ldyBSZWdFeHAoYCZsdDske3RhZ05hbWV9Jmd0OyhbXFxcXHNcXFxcU10qPykmbHQ7LyR7dGFnTmFtZX0mZ3Q7YCwgXCJnXCIpO1xuXHRcdGNvbnN0IHJhd1BhdHRlcm4gPSBuZXcgUmVnRXhwKGA8JHt0YWdOYW1lfT4oW1xcXFxzXFxcXFNdKj8pPFxcXFwvJHt0YWdOYW1lfT5gLCBcImdcIik7XG5cdFx0Y29uc3QgYmxvY2tzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCByZWdleCBvZiBbZXNjYXBlZFBhdHRlcm4sIHJhd1BhdHRlcm5dKSB7XG5cdFx0XHRsZXQgbWF0Y2g7XG5cdFx0XHR3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhjb250ZW50KSkgIT09IG51bGwpIHtcblx0XHRcdFx0YmxvY2tzLnB1c2gobWF0Y2hbMV0udHJpbSgpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCByZW1haW5pbmcgPSBjb250ZW50LnJlcGxhY2UoZXNjYXBlZFBhdHRlcm4sIFwiXCIpLnJlcGxhY2UocmF3UGF0dGVybiwgXCJcIikudHJpbSgpO1xuXHRcdHJldHVybiB7IGJsb2NrcywgcmVtYWluaW5nIH07XG5cdH1cblxuXHQvKipcblx0ICogRXh0cmFjdCBhIHNpbmdsZSBvdXRlcm1vc3QgdGFnIHdyYXBwZXIuIENvZGV4IGJsb2NrcyBvZnRlbiBtZW50aW9uIG5lc3RlZFxuXHQgKiBgPHRhZz4uLi48L3RhZz5gIGV4YW1wbGVzIGluc2lkZSBiYWNrdGlja3M7IG5vbi1ncmVlZHkgcmVnZXggc3RvcHMgYXQgdGhlXG5cdCAqIGZpcnN0IGlubmVyIGNsb3NlIHRhZyBhbmQgbGVha3MgdGhlIHJlc3QgaW50byB0aGUgY29udmVyc2F0aW9uIHZpZXcuXG5cdCAqL1xuXHRwcml2YXRlIGV4dHJhY3RPdXRlcm1vc3RUYWdnZWRCbG9jayhcblx0XHRjb250ZW50OiBzdHJpbmcsXG5cdFx0dGFnTmFtZTogc3RyaW5nLFxuXHQpOiB7IGJsb2NrOiBzdHJpbmcgfCBudWxsOyByZW1haW5pbmc6IHN0cmluZyB9IHtcblx0XHRjb25zdCB2YXJpYW50cyA9IFtcblx0XHRcdHsgb3BlbjogYDwke3RhZ05hbWV9PmAsIGNsb3NlOiBgPC8ke3RhZ05hbWV9PmAgfSxcblx0XHRcdHsgb3BlbjogYCZsdDske3RhZ05hbWV9Jmd0O2AsIGNsb3NlOiBgJmx0Oy8ke3RhZ05hbWV9Jmd0O2AgfSxcblx0XHRdO1xuXG5cdFx0Y29uc3QgdHJpbW1lZCA9IGNvbnRlbnQudHJpbSgpO1xuXHRcdGZvciAoY29uc3QgeyBvcGVuLCBjbG9zZSB9IG9mIHZhcmlhbnRzKSB7XG5cdFx0XHRpZiAoIXRyaW1tZWQuc3RhcnRzV2l0aChvcGVuKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbGFzdENsb3NlID0gdHJpbW1lZC5sYXN0SW5kZXhPZihjbG9zZSk7XG5cdFx0XHRpZiAobGFzdENsb3NlIDw9IG9wZW4ubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiB7IGJsb2NrOiBudWxsLCByZW1haW5pbmc6IGNvbnRlbnQgfTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYmxvY2sgPSB0cmltbWVkLnNsaWNlKG9wZW4ubGVuZ3RoLCBsYXN0Q2xvc2UpLnRyaW0oKTtcblx0XHRcdGNvbnN0IGFmdGVyID0gdHJpbW1lZC5zbGljZShsYXN0Q2xvc2UgKyBjbG9zZS5sZW5ndGgpLnRyaW0oKTtcblx0XHRcdGNvbnN0IGxlYWRpbmcgPSBjb250ZW50LnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZih0cmltbWVkKSk7XG5cdFx0XHRjb25zdCByZW1haW5pbmcgPSAobGVhZGluZyArIGFmdGVyKS50cmltKCk7XG5cdFx0XHRyZXR1cm4geyBibG9jaywgcmVtYWluaW5nIH07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHsgYmxvY2s6IG51bGwsIHJlbWFpbmluZzogY29udGVudCB9O1xuXHR9XG5cblx0LyoqIFdyYXBzIGV4dHJhY3RlZCB0YWcgYmxvY2tzIGluIGEgbnVtYmVyZWQgY29sbGFwc2libGUgbWFya2Rvd24gc2VjdGlvbi4gKi9cblx0cHJpdmF0ZSByZW5kZXJUYWdnZWRDb2xsYXBzaWJsZVNlY3Rpb25zKFxuXHRcdHRpdGxlOiBzdHJpbmcsXG5cdFx0YmxvY2tzOiBzdHJpbmdbXSxcblx0KTogVGVtcGxhdGVSZXN1bHQge1xuXHRcdGlmIChibG9ja3MubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gaHRtbGBgO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlbmRlckNvbGxhcHNpYmxlU2VjdGlvbihcblx0XHRcdHRpdGxlLFxuXHRcdFx0aHRtbGA8ZGl2IGNsYXNzPVwidGV4dC12cy1tdXRlZFwiPlxuXHRcdFx0XHQke2Jsb2Nrcy5tYXAoXG5cdFx0XHRcdFx0KGJsb2NrLCBpbmRleCkgPT4gaHRtbGBcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYi00XCI+XG5cdFx0XHRcdFx0XHRcdCR7YmxvY2tzLmxlbmd0aCA+IDFcblx0XHRcdFx0XHRcdFx0XHQ/IGh0bWxgPGRpdiBjbGFzcz1cInRleHQtdnMtZnVuY3Rpb24gZm9udC1ib2xkIG1iLTJcIj4ke3RpdGxlfSAke2luZGV4ICsgMX06PC9kaXY+YFxuXHRcdFx0XHRcdFx0XHRcdDogXCJcIn1cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1hcmtkb3duLWNvbnRlbnRcIj4ke3Vuc2FmZUhUTUwobWFya2Rvd25Ub0h0bWwoYmxvY2spKX08L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdGAsXG5cdFx0XHRcdCl9XG5cdFx0XHQ8L2Rpdj5gLFxuXHRcdFx0e1xuXHRcdFx0XHR0aXRsZUNsYXNzZXM6IFwidGV4dC12cy1tdXRlZFwiLFxuXHRcdFx0XHRjb250YWluZXJDbGFzc2VzOiBcIm10LTQgbWItNFwiLFxuXHRcdFx0XHRjb3VudDogYmxvY2tzLmxlbmd0aCA+IDEgPyBibG9ja3MubGVuZ3RoIDogdW5kZWZpbmVkLFxuXHRcdFx0fSxcblx0XHQpO1xuXHR9XG5cblx0LyoqIENvZGV4IGluamVjdHMgdGhlc2UgWE1MLWxpa2UgdGFncyBpbiB1c2VyIG1lc3NhZ2VzOyBleHRyYWN0ZWQgaW50byBjb2xsYXBzaWJsZSBzZWN0aW9ucy4gKi9cblx0cHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ09ERVhfQ09OVEVYVF9UQUdTOiBSZWFkb25seUFycmF5PHsgdGFnOiBzdHJpbmc7IHRpdGxlOiBzdHJpbmcgfT4gPSBbXG5cdFx0eyB0YWc6IFwicGVybWlzc2lvbnMgaW5zdHJ1Y3Rpb25zXCIsIHRpdGxlOiBcIlBlcm1pc3Npb25zIEluc3RydWN0aW9uc1wiIH0sXG5cdFx0eyB0YWc6IFwiY29sbGFib3JhdGlvbl9tb2RlXCIsIHRpdGxlOiBcIkNvbGxhYm9yYXRpb24gTW9kZVwiIH0sXG5cdFx0eyB0YWc6IFwic2tpbGxzX2luc3RydWN0aW9uc1wiLCB0aXRsZTogXCJTa2lsbHMgSW5zdHJ1Y3Rpb25zXCIgfSxcblx0XHR7IHRhZzogXCJlbnZpcm9ubWVudF9jb250ZXh0XCIsIHRpdGxlOiBcIkVudmlyb25tZW50IENvbnRleHRcIiB9LFxuXHRdO1xuXG5cdC8qKiBUcnVlIHdoZW4gdGhlIHN0cmluZyBjb250YWlucyBvbmx5IENvZGV4IGNvbnRleHQgdGFncyBhbmQgbm8gdXNlciB0ZXh0LiAqL1xuXHRwcml2YXRlIGlzQ29kZXhDb250ZXh0T25seVRleHQoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgeyBzZWN0aW9ucywgcmVtYWluaW5nIH0gPSB0aGlzLmV4dHJhY3RDb2RleENvbnRleHRTZWN0aW9ucyhjb250ZW50KTtcblx0XHRpZiAoc2VjdGlvbnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Y29uc3QgeyByZW1haW5pbmc6IGFmdGVyRXh0cmVtZWx5SW1wb3J0YW50IH0gPSB0aGlzLmV4dHJhY3RUYWdnZWRCbG9ja3MocmVtYWluaW5nLCBcIkVYVFJFTUVMWV9JTVBPUlRBTlRcIik7XG5cdFx0Y29uc3QgeyByZW1haW5pbmc6IGFmdGVyU3lzdGVtUmVtaW5kZXIgfSA9IHRoaXMuZXh0cmFjdFRhZ2dlZEJsb2NrcyhhZnRlckV4dHJlbWVseUltcG9ydGFudCwgXCJzeXN0ZW0tcmVtaW5kZXJcIik7XG5cdFx0cmV0dXJuIGFmdGVyU3lzdGVtUmVtaW5kZXIudHJpbSgpLmxlbmd0aCA9PT0gMDtcblx0fVxuXG5cdC8qKiBSZXR1cm5zIHRydWUgd2hlbiBtZXNzYWdlIHRleHQgaXMgb25seSBDb2RleCBjb250ZXh0IHRhZ3MgKG5vIHVzZXItdmlzaWJsZSBjb250ZW50KS4gKi9cblx0cHJpdmF0ZSBpc0NvZGV4Q29udGV4dE9ubHlNZXNzYWdlKG1lc3NhZ2U6IEVuaGFuY2VkTWVzc2FnZVBhcmFtKTogYm9vbGVhbiB7XG5cdFx0aWYgKCFBcnJheS5pc0FycmF5KG1lc3NhZ2UuY29udGVudCkgfHwgbWVzc2FnZS5jb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBtZXNzYWdlLmNvbnRlbnQuZXZlcnkoKGJsb2NrKSA9PiB7XG5cdFx0XHRpZiAoYmxvY2sudHlwZSAhPT0gXCJ0ZXh0XCIgfHwgIShcInRleHRcIiBpbiBibG9jaykpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuaXNDb2RleENvbnRleHRPbmx5VGV4dChibG9jay50ZXh0KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKiBQdWxscyBrbm93biBDb2RleCBjb250ZXh0IHRhZyBibG9ja3MgZnJvbSB0aGUgc3RhcnQgb2YgYSBtZXNzYWdlIHN0cmluZy4gKi9cblx0cHJpdmF0ZSBleHRyYWN0Q29kZXhDb250ZXh0U2VjdGlvbnMoY29udGVudDogc3RyaW5nKTogeyBzZWN0aW9uczogQXJyYXk8eyB0aXRsZTogc3RyaW5nOyBibG9ja3M6IHN0cmluZ1tdIH0+OyByZW1haW5pbmc6IHN0cmluZyB9IHtcblx0XHRjb25zdCBzZWN0aW9uczogQXJyYXk8eyB0aXRsZTogc3RyaW5nOyBibG9ja3M6IHN0cmluZ1tdIH0+ID0gW107XG5cdFx0bGV0IHJlbWFpbmluZyA9IGNvbnRlbnQ7XG5cblx0XHRmb3IgKGNvbnN0IHsgdGFnLCB0aXRsZSB9IG9mIFNpbXBsZUNvbnZlcnNhdGlvblZpZXcuQ09ERVhfQ09OVEVYVF9UQUdTKSB7XG5cdFx0XHRjb25zdCBleHRyYWN0ZWQgPSB0aGlzLmV4dHJhY3RPdXRlcm1vc3RUYWdnZWRCbG9jayhyZW1haW5pbmcsIHRhZyk7XG5cdFx0XHRpZiAoZXh0cmFjdGVkLmJsb2NrKSB7XG5cdFx0XHRcdHNlY3Rpb25zLnB1c2goeyB0aXRsZSwgYmxvY2tzOiBbZXh0cmFjdGVkLmJsb2NrXSB9KTtcblx0XHRcdFx0cmVtYWluaW5nID0gZXh0cmFjdGVkLnJlbWFpbmluZztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4geyBzZWN0aW9ucywgcmVtYWluaW5nIH07XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2VzIGEgcGxhaW4tdGV4dCBtZXNzYWdlOiBtYWluIG1hcmtkb3duIGJvZHkgcGx1cyBjb2xsYXBzaWJsZSBzZWN0aW9uc1xuXHQgKiBmb3IgQ29kZXggY29udGV4dCB0YWdzLCBFWFRSRU1FTFlfSU1QT1JUQU5ULCBhbmQgc3lzdGVtLXJlbWluZGVyIGJsb2Nrcy5cblx0ICovXG5cdHByaXZhdGUgZm9ybWF0U3RyaW5nQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0Y29uc3QgeyBzZWN0aW9uczogY29kZXhDb250ZXh0U2VjdGlvbnMsIHJlbWFpbmluZzogYWZ0ZXJDb2RleENvbnRleHQgfSA9XG5cdFx0XHR0aGlzLmV4dHJhY3RDb2RleENvbnRleHRTZWN0aW9ucyhjb250ZW50KTtcblx0XHRjb25zdCB7IGJsb2NrczogZXh0cmVtZWx5SW1wb3J0YW50QmxvY2tzLCByZW1haW5pbmc6IGFmdGVyRXh0cmVtZWx5SW1wb3J0YW50IH0gPVxuXHRcdFx0dGhpcy5leHRyYWN0VGFnZ2VkQmxvY2tzKGFmdGVyQ29kZXhDb250ZXh0LCBcIkVYVFJFTUVMWV9JTVBPUlRBTlRcIik7XG5cdFx0Y29uc3QgeyBibG9ja3M6IHN5c3RlbVJlbWluZGVyQmxvY2tzLCByZW1haW5pbmc6IG1haW5Db250ZW50IH0gPSB0aGlzLmV4dHJhY3RUYWdnZWRCbG9ja3MoXG5cdFx0XHRhZnRlckV4dHJlbWVseUltcG9ydGFudCxcblx0XHRcdFwic3lzdGVtLXJlbWluZGVyXCIsXG5cdFx0KTtcblxuXHRcdHJldHVybiBodG1sYFxuXHRcdFx0JHttYWluQ29udGVudCA/IGh0bWxgPGRpdiBjbGFzcz1cIm10LTQgbWFya2Rvd24tY29udGVudFwiPiR7dW5zYWZlSFRNTChtYXJrZG93blRvSHRtbChtYWluQ29udGVudCkpfTwvZGl2PmAgOiBcIlwifVxuXHRcdFx0JHtjb2RleENvbnRleHRTZWN0aW9ucy5tYXAoKHsgdGl0bGUsIGJsb2NrcyB9KSA9PiB0aGlzLnJlbmRlclRhZ2dlZENvbGxhcHNpYmxlU2VjdGlvbnModGl0bGUsIGJsb2NrcykpfVxuXHRcdFx0JHt0aGlzLnJlbmRlclRhZ2dlZENvbGxhcHNpYmxlU2VjdGlvbnMoXCJFeHRyZW1lbHkgSW1wb3J0YW50XCIsIGV4dHJlbWVseUltcG9ydGFudEJsb2Nrcyl9XG5cdFx0XHQke3RoaXMucmVuZGVyVGFnZ2VkQ29sbGFwc2libGVTZWN0aW9ucyhcIlN5c3RlbSBSZW1pbmRlclwiLCBzeXN0ZW1SZW1pbmRlckJsb2Nrcyl9XG5cdFx0YDtcblx0fVxuXG5cdC8qKiBDb252ZXJ0cyBzeXN0ZW0gcHJvbXB0IChzdHJpbmcgb3IgYmxvY2sgYXJyYXkpIHRvIEhUTUwgdmlhIG1hcmtkb3duLiAqL1xuXHRwcml2YXRlIGZvcm1hdFN5c3RlbShzeXN0ZW06IHN0cmluZyB8IFRleHRCbG9ja1BhcmFtW10gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuXHRcdGlmICghc3lzdGVtKSByZXR1cm4gXCJcIjtcblxuXHRcdGlmICh0eXBlb2Ygc3lzdGVtID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRyZXR1cm4gbWFya2Rvd25Ub0h0bWwoc3lzdGVtKTtcblx0XHR9XG5cblx0XHRpZiAoQXJyYXkuaXNBcnJheShzeXN0ZW0pKSB7XG5cdFx0XHRjb25zdCB0ZXh0Q29udGVudCA9IHN5c3RlbVxuXHRcdFx0XHQubWFwKChibG9jaykgPT4ge1xuXHRcdFx0XHRcdGlmIChibG9jay50eXBlID09PSBcInRleHRcIikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGJsb2NrLnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShibG9jaywgbnVsbCwgMik7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5qb2luKFwiXFxuXCIpO1xuXHRcdFx0cmV0dXJuIG1hcmtkb3duVG9IdG1sKHRleHRDb250ZW50KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoc3lzdGVtLCBudWxsLCAyKTtcblx0fVxuXG5cdC8qKiBSZW5kZXJzIHRoZSBmaW5hbCBhc3Npc3RhbnQgcmVzcG9uc2UgbWVzc2FnZSBmb3IgYSBjb252ZXJzYXRpb24gdGhyZWFkLiAqL1xuXHRwcml2YXRlIGZvcm1hdFJlc3BvbnNlQ29udGVudChyZXNwb25zZTogTWVzc2FnZSk6IFRlbXBsYXRlUmVzdWx0IHtcblx0XHRpZiAoIXJlc3BvbnNlKSByZXR1cm4gaHRtbGBgO1xuXG5cdFx0aWYgKHJlc3BvbnNlLmNvbnRlbnQgJiYgQXJyYXkuaXNBcnJheShyZXNwb25zZS5jb250ZW50KSkge1xuXHRcdFx0cmV0dXJuIGh0bWxgXG5cdFx0XHRcdCR7cmVzcG9uc2UuY29udGVudC5tYXAoKGJsb2NrKSA9PiB7XG5cdFx0XHRcdFx0aWYgKGJsb2NrLnR5cGUgPT09IFwidGV4dFwiKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwibXQtNCBtYXJrZG93bi1jb250ZW50XCI+JHt1bnNhZmVIVE1MKG1hcmtkb3duVG9IdG1sKGJsb2NrLnRleHQpKX08L2Rpdj5gO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYmxvY2sudHlwZSA9PT0gXCJ0aGlua2luZ1wiKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0aGlua2luZ0Jsb2NrID0gYmxvY2sgYXMgYW55O1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMucmVuZGVyVGhpbmtpbmdCbG9jayh0aGlua2luZ0Jsb2NrLnRoaW5raW5nIHx8IFwiXCIpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYmxvY2sudHlwZSA9PT0gXCJ0b29sX3VzZVwiKSB7XG5cdFx0XHRcdFx0XHRpZiAoYmxvY2submFtZSA9PT0gXCJUb2RvV3JpdGVcIikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibXQtNCBtYi00XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy10eXBlIHB4LTQgYnJlYWstYWxsXCI+JHt0aGlzLmdldFRvb2xEaXNwbGF5TmFtZShibG9jayl9PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYmctdnMtYmctc2Vjb25kYXJ5IG14LTQgcC00IHRleHQtdnMtdGV4dFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQke3RoaXMucmVuZGVyVG9vbFVzZUNvbnRlbnQoYmxvY2spfVxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdGA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm10LTQgbWItNFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXZcblx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwidGV4dC12cy10eXBlIHB4LTQgcHktMiBicmVhay1hbGwgY3Vyc29yLXBvaW50ZXIgaG92ZXI6dGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9yc1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRAY2xpY2s9JHt0aGlzLnRvZ2dsZUNvbnRlbnR9XG5cdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJtci0yXCI+WytdPC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0JHt0aGlzLmdldFRvb2xEaXNwbGF5TmFtZShibG9jayl9XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImJnLXZzLWJnLXNlY29uZGFyeSBteC00IHAtNCB0ZXh0LXZzLXRleHQgaGlkZGVuXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQke3RoaXMucmVuZGVyVG9vbFVzZUNvbnRlbnQoYmxvY2spfVxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdGA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBodG1sYDxwcmUgY2xhc3M9XCJtYi00XCI+JHtKU09OLnN0cmluZ2lmeShibG9jaywgbnVsbCwgMil9PC9wcmU+YDtcblx0XHRcdFx0fSl9XG5cdFx0XHRgO1xuXHRcdH1cblxuXHRcdHJldHVybiBodG1sYDxwcmU+JHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSwgbnVsbCwgMil9PC9wcmU+YDtcblx0fVxuXG5cdC8qKiBGb3JtYXRzIGBUb29sTmFtZShwYXJhbSlgIGhlYWRlciB0ZXh0IGZvciBzaW5nbGUtYXJndW1lbnQgdG9vbHMuICovXG5cdHByaXZhdGUgZm9ybWF0U2luZ2xlUGFyYW0odG9vbE5hbWU6IHN0cmluZywgcGFyYW1WYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwYXJhbU5hbWU6IHN0cmluZyA9IFwiXCIpOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0cmV0dXJuIHBhcmFtVmFsdWVcblx0XHRcdD8gaHRtbGAke3Rvb2xOYW1lfSg8c3BhbiBjbGFzcz1cInRleHQtdnMtdGV4dFwiPiR7dGhpcy51bmVzY2FwZUh0bWwocGFyYW1WYWx1ZSl9PC9zcGFuPilgXG5cdFx0XHQ6IGh0bWxgJHt0b29sTmFtZX1gO1xuXHR9XG5cblx0LyoqIEZvcm1hdHMgYFRvb2xOYW1lKGEsIGIsIC4uLilgIGhlYWRlciB0ZXh0IGZvciBtdWx0aS1hcmd1bWVudCB0b29scy4gKi9cblx0cHJpdmF0ZSBmb3JtYXRNdWx0aVBhcmFtKHRvb2xOYW1lOiBzdHJpbmcsIHBhcmFtczogc3RyaW5nW10pOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0cmV0dXJuIHBhcmFtcy5sZW5ndGggPiAwXG5cdFx0XHQ/IGh0bWxgJHt0b29sTmFtZX0oPHNwYW4gY2xhc3M9XCJ0ZXh0LXZzLXRleHRcIj4ke3BhcmFtcy5qb2luKFwiLCBcIil9PC9zcGFuPilgXG5cdFx0XHQ6IGh0bWxgJHt0b29sTmFtZX1gO1xuXHR9XG5cblx0LyoqIERlY29kZXMgSFRNTCBlbnRpdGllcyBpbiB0b29sIGFyZ3VtZW50IHN0cmluZ3MgZm9yIGRpc3BsYXkuICovXG5cdHByaXZhdGUgdW5lc2NhcGVIdG1sKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdGRpdi5pbm5lckhUTUwgPSBzdHI7XG5cdFx0cmV0dXJuIGRpdi50ZXh0Q29udGVudCB8fCBkaXYuaW5uZXJUZXh0IHx8IFwiXCI7XG5cdH1cblxuXHQvKiogV3JhcHMgdG9vbCBvdXRwdXQgaW4gYSBob3Jpem9udGFsbHkgc2Nyb2xsYWJsZSBjb250YWluZXIuICovXG5cdHByaXZhdGUgd3JhcEluU2Nyb2xsYWJsZShjb250ZW50OiBUZW1wbGF0ZVJlc3VsdCB8IHN0cmluZywgdXNlUHJlRm9ybWF0dGluZzogYm9vbGVhbiA9IHRydWUpOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0aWYgKHVzZVByZUZvcm1hdHRpbmcgJiYgdHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHJldHVybiBodG1sYFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwib3ZlcmZsb3cteC1hdXRvXCI+XG5cdFx0XHRcdFx0PHByZSBjbGFzcz1cInRleHQtdnMtdGV4dCBtLTBcIiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmU7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XCI+JHtjb250ZW50fTwvcHJlPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdGA7XG5cdFx0fVxuXHRcdHJldHVybiBodG1sYCA8ZGl2IGNsYXNzPVwib3ZlcmZsb3cteC1hdXRvXCI+JHtjb250ZW50fTwvZGl2PiBgO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyaWMgYFsrXS9bLV1gIGNvbGxhcHNpYmxlIHNlY3Rpb24gdXNlZCBmb3Igc3lzdGVtIHByb21wdCwgdG9vbHMsIGFuZCB0YWdzLlxuXHQgKlxuXHQgKiBAcGFyYW0gY291bnQgLSBPcHRpb25hbCBpdGVtIGNvdW50IGFwcGVuZGVkIHRvIHRoZSB0aXRsZSwgZS5nLiBcIlRvb2xzICgxMilcIi5cblx0ICovXG5cdHByaXZhdGUgcmVuZGVyQ29sbGFwc2libGVTZWN0aW9uKFxuXHRcdHRpdGxlOiBzdHJpbmcsXG5cdFx0Y29udGVudDogVGVtcGxhdGVSZXN1bHQsXG5cdFx0b3B0aW9uczoge1xuXHRcdFx0aXNFeHBhbmRlZD86IGJvb2xlYW47XG5cdFx0XHR0aXRsZUNsYXNzZXM/OiBzdHJpbmc7XG5cdFx0XHRjb250YWluZXJDbGFzc2VzPzogc3RyaW5nO1xuXHRcdFx0Y291bnQ/OiBudW1iZXI7XG5cdFx0fSA9IHt9LFxuXHQpOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0Y29uc3QgeyBpc0V4cGFuZGVkID0gZmFsc2UsIHRpdGxlQ2xhc3NlcyA9IFwiXCIsIGNvbnRhaW5lckNsYXNzZXMgPSBcIlwiLCBjb3VudCB9ID0gb3B0aW9ucztcblx0XHRjb25zdCBleHBhbmRlZENsYXNzID0gaXNFeHBhbmRlZCA/IFwiXCIgOiBcImhpZGRlblwiO1xuXHRcdGNvbnN0IHRvZ2dsZVN5bWJvbCA9IGlzRXhwYW5kZWQgPyBcIlstXVwiIDogXCJbK11cIjtcblx0XHRjb25zdCBkaXNwbGF5VGl0bGUgPSBjb3VudCAhPT0gdW5kZWZpbmVkID8gYCR7dGl0bGV9ICgke2NvdW50fSlgIDogdGl0bGU7XG5cblx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdDxkaXYgY2xhc3M9XCIke2NvbnRhaW5lckNsYXNzZXN9XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBob3Zlcjp0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzICR7dGl0bGVDbGFzc2VzfVwiIEBjbGljaz0ke3RoaXMudG9nZ2xlQ29udGVudH0+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJtci0yXCI+JHt0b2dnbGVTeW1ib2x9PC9zcGFuPlxuXHRcdFx0XHRcdDxzcGFuPiR7ZGlzcGxheVRpdGxlfTwvc3Bhbj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCIke2V4cGFuZGVkQ2xhc3N9IG10LTRcIj4ke2NvbnRlbnR9PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRgO1xuXHR9XG5cblx0LyoqIEh1bWFuLXJlYWRhYmxlIG9uZS1saW5lIHN1bW1hcnkgZm9yIGVhY2gga25vd24gQ2xhdWRlIENvZGUgdG9vbCBuYW1lLiAqL1xuXHRwcml2YXRlIGdldFRvb2xEaXNwbGF5TmFtZSh0b29sVXNlOiBhbnksIHRvb2xSZXN1bHQ/OiBhbnkpOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0Y29uc3QgdG9vbE5hbWUgPSB0b29sVXNlLm5hbWU7XG5cdFx0Y29uc3QgaW5wdXQgPSB0b29sVXNlLmlucHV0O1xuXG5cdFx0c3dpdGNoICh0b29sTmFtZSkge1xuXHRcdFx0Y2FzZSBcIlJlYWRcIjpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0U2luZ2xlUGFyYW0odG9vbE5hbWUsIGlucHV0Py5maWxlX3BhdGgpO1xuXHRcdFx0Y2FzZSBcIkJhc2hcIjpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0U2luZ2xlUGFyYW0odG9vbE5hbWUsIGlucHV0Py5jb21tYW5kKTtcblx0XHRcdGNhc2UgXCJXcml0ZVwiOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRTaW5nbGVQYXJhbSh0b29sTmFtZSwgaW5wdXQ/LmZpbGVfcGF0aCk7XG5cdFx0XHRjYXNlIFwiR2xvYlwiOlxuXHRcdFx0XHRpZiAoaW5wdXQ/LnBhdHRlcm4pIHtcblx0XHRcdFx0XHRjb25zdCBwYXJhbXMgPSBbdGhpcy51bmVzY2FwZUh0bWwoaW5wdXQucGF0dGVybildO1xuXHRcdFx0XHRcdGlmIChpbnB1dD8ucGF0aCkgcGFyYW1zLnB1c2godGhpcy51bmVzY2FwZUh0bWwoaW5wdXQucGF0aCkpO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdE11bHRpUGFyYW0odG9vbE5hbWUsIHBhcmFtcyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGh0bWxgJHt0b29sTmFtZX1gO1xuXHRcdFx0Y2FzZSBcIkdyZXBcIjpcblx0XHRcdFx0aWYgKGlucHV0Py5wYXR0ZXJuKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyYW1zID0gW3RoaXMudW5lc2NhcGVIdG1sKGlucHV0LnBhdHRlcm4pXTtcblx0XHRcdFx0XHRpZiAoaW5wdXQ/LmluY2x1ZGUpIHBhcmFtcy5wdXNoKHRoaXMudW5lc2NhcGVIdG1sKGlucHV0LmluY2x1ZGUpKTtcblx0XHRcdFx0XHRpZiAoaW5wdXQ/LnBhdGgpIHBhcmFtcy5wdXNoKHRoaXMudW5lc2NhcGVIdG1sKGlucHV0LnBhdGgpKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRNdWx0aVBhcmFtKHRvb2xOYW1lLCBwYXJhbXMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBodG1sYCR7dG9vbE5hbWV9YDtcblx0XHRcdGNhc2UgXCJMU1wiOlxuXHRcdFx0XHRpZiAoaW5wdXQ/LnBhdGgpIHtcblx0XHRcdFx0XHRjb25zdCBwYXJhbXMgPSBbdGhpcy51bmVzY2FwZUh0bWwoaW5wdXQucGF0aCldO1xuXHRcdFx0XHRcdGlmIChpbnB1dD8uaWdub3JlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpZ25vcmVTdHIgPSBpbnB1dC5pZ25vcmUubWFwKChwOiBzdHJpbmcpID0+IHRoaXMudW5lc2NhcGVIdG1sKHApKS5qb2luKFwiLCBcIik7XG5cdFx0XHRcdFx0XHRwYXJhbXMucHVzaChgaWdub3JlOiAke2lnbm9yZVN0cn1gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0TXVsdGlQYXJhbSh0b29sTmFtZSwgcGFyYW1zKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaHRtbGAke3Rvb2xOYW1lfWA7XG5cdFx0XHRjYXNlIFwiRWRpdFwiOlxuXHRcdFx0XHRyZXR1cm4gaW5wdXQ/LmZpbGVfcGF0aFxuXHRcdFx0XHRcdD8gdGhpcy5mb3JtYXRTaW5nbGVQYXJhbSh0b29sTmFtZSwgdGhpcy51bmVzY2FwZUh0bWwoaW5wdXQuZmlsZV9wYXRoKS5zcGxpdChcIi9cIikucG9wKCkpXG5cdFx0XHRcdFx0OiBodG1sYCR7dG9vbE5hbWV9YDtcblx0XHRcdGNhc2UgXCJNdWx0aUVkaXRcIjpcblx0XHRcdFx0aWYgKGlucHV0Py5maWxlX3BhdGgpIHtcblx0XHRcdFx0XHRjb25zdCBmaWxlTmFtZSA9IHRoaXMudW5lc2NhcGVIdG1sKGlucHV0LmZpbGVfcGF0aCkuc3BsaXQoXCIvXCIpLnBvcCgpIHx8IGlucHV0LmZpbGVfcGF0aDtcblx0XHRcdFx0XHRjb25zdCBlZGl0Q291bnQgPSBpbnB1dD8uZWRpdHMgPyBpbnB1dC5lZGl0cy5sZW5ndGggOiAwO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdE11bHRpUGFyYW0odG9vbE5hbWUsIFtmaWxlTmFtZSwgYCR7ZWRpdENvdW50fSBlZGl0c2BdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaHRtbGAke3Rvb2xOYW1lfWA7XG5cdFx0XHRjYXNlIFwiTm90ZWJvb2tSZWFkXCI6XG5cdFx0XHRcdHJldHVybiBpbnB1dD8ubm90ZWJvb2tfcGF0aFxuXHRcdFx0XHRcdD8gdGhpcy5mb3JtYXRTaW5nbGVQYXJhbSh0b29sTmFtZSwgdGhpcy51bmVzY2FwZUh0bWwoaW5wdXQubm90ZWJvb2tfcGF0aCkuc3BsaXQoXCIvXCIpLnBvcCgpKVxuXHRcdFx0XHRcdDogaHRtbGAke3Rvb2xOYW1lfWA7XG5cdFx0XHRjYXNlIFwiTm90ZWJvb2tFZGl0XCI6XG5cdFx0XHRcdGlmIChpbnB1dD8ubm90ZWJvb2tfcGF0aCAmJiBpbnB1dD8uY2VsbF9udW1iZXIgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGNvbnN0IGZpbGVOYW1lID0gdGhpcy51bmVzY2FwZUh0bWwoaW5wdXQubm90ZWJvb2tfcGF0aCkuc3BsaXQoXCIvXCIpLnBvcCgpO1xuXHRcdFx0XHRcdGNvbnN0IGNlbGxOdW0gPSBpbnB1dC5jZWxsX251bWJlcjtcblx0XHRcdFx0XHRjb25zdCBtb2RlID0gaW5wdXQ/LmVkaXRfbW9kZSB8fCBcInJlcGxhY2VcIjtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRNdWx0aVBhcmFtKHRvb2xOYW1lLCBbZmlsZU5hbWUsIGBjZWxsICR7Y2VsbE51bX1gLCBtb2RlXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGh0bWxgJHt0b29sTmFtZX1gO1xuXHRcdFx0Y2FzZSBcIldlYkZldGNoXCI6XG5cdFx0XHRcdHJldHVybiBpbnB1dD8udXJsID8gdGhpcy5mb3JtYXRTaW5nbGVQYXJhbSh0b29sTmFtZSwgaW5wdXQudXJsKSA6IGh0bWxgJHt0b29sTmFtZX1gO1xuXHRcdFx0Y2FzZSBcIldlYlNlYXJjaFwiOlxuXHRcdFx0XHRyZXR1cm4gaW5wdXQ/LnF1ZXJ5ID8gdGhpcy5mb3JtYXRTaW5nbGVQYXJhbSh0b29sTmFtZSwgaW5wdXQucXVlcnkpIDogaHRtbGAke3Rvb2xOYW1lfWA7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gaHRtbGAke3Rvb2xOYW1lfWA7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFJlbmRlcnMgZXhwYW5kZWQgdG9vbCBpbnB1dCBcdTIwMTQgZGlmZnMgZm9yIEVkaXQsIHRvZG9zIGZvciBUb2RvV3JpdGUsIEpTT04gZmFsbGJhY2suICovXG5cdHByaXZhdGUgcmVuZGVyVG9vbFVzZUNvbnRlbnQodG9vbFVzZTogYW55KTogVGVtcGxhdGVSZXN1bHQge1xuXHRcdGNvbnN0IHRvb2xOYW1lID0gdG9vbFVzZS5uYW1lO1xuXHRcdGNvbnN0IGlucHV0ID0gdG9vbFVzZS5pbnB1dDtcblxuXHRcdGlmICh0b29sTmFtZSA9PT0gXCJUb2RvV3JpdGVcIiAmJiBpbnB1dD8udG9kb3MpIHtcblx0XHRcdGNvbnN0IHRvZG9zID0gaW5wdXQudG9kb3M7XG5cblx0XHRcdHJldHVybiB0aGlzLndyYXBJblNjcm9sbGFibGUoXG5cdFx0XHRcdGh0bWxgJHt0b2Rvcy5tYXAoKHRvZG86IGFueSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHN0YXR1c0NsYXNzID1cblx0XHRcdFx0XHRcdHRvZG8uc3RhdHVzID09PSBcImNvbXBsZXRlZFwiXG5cdFx0XHRcdFx0XHRcdD8gXCJsaW5lLXRocm91Z2ggdGV4dC12cy10ZXh0XCJcblx0XHRcdFx0XHRcdFx0OiB0b2RvLnN0YXR1cyA9PT0gXCJpbl9wcm9ncmVzc1wiXG5cdFx0XHRcdFx0XHRcdFx0PyBcInRleHQtZ3JlZW4tNDAwXCJcblx0XHRcdFx0XHRcdFx0XHQ6IFwidGV4dC12cy1tdXRlZFwiO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGh0bWxgXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwib3ZlcmZsb3ctaGlkZGVuIHdoaXRlc3BhY2Utbm93cmFwIHRleHQtZWxsaXBzaXMgJHtzdGF0dXNDbGFzc31cIj5cdTIwMjIgJHt0b2RvLmNvbnRlbnR9PC9kaXY+XG5cdFx0XHRcdFx0YDtcblx0XHRcdFx0fSl9YCxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmICh0b29sTmFtZSA9PT0gXCJOb3RlYm9va0VkaXRcIiAmJiBpbnB1dD8ubmV3X3NvdXJjZSkge1xuXHRcdFx0Y29uc3QgY29udGVudCA9IGlucHV0Lm5ld19zb3VyY2U7XG5cblx0XHRcdHJldHVybiB0aGlzLndyYXBJblNjcm9sbGFibGUoY29udGVudCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRvb2xOYW1lID09PSBcIldyaXRlXCIgJiYgaW5wdXQ/LmNvbnRlbnQpIHtcblx0XHRcdGNvbnN0IGNvbnRlbnQgPSBpbnB1dC5jb250ZW50O1xuXG5cdFx0XHRyZXR1cm4gdGhpcy53cmFwSW5TY3JvbGxhYmxlKGNvbnRlbnQpO1xuXHRcdH1cblxuXHRcdGlmICh0b29sTmFtZSA9PT0gXCJNdWx0aUVkaXRcIiAmJiBpbnB1dD8uZWRpdHMpIHtcblx0XHRcdGNvbnN0IGVkaXRzID0gaW5wdXQuZWRpdHM7XG5cblx0XHRcdHJldHVybiB0aGlzLndyYXBJblNjcm9sbGFibGUoXG5cdFx0XHRcdGh0bWxgJHtlZGl0cy5tYXAoKGVkaXQ6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9sZFN0ciA9IGVkaXQub2xkX3N0cmluZztcblx0XHRcdFx0XHRjb25zdCBuZXdTdHIgPSBlZGl0Lm5ld19zdHJpbmc7XG5cblx0XHRcdFx0XHRjb25zdCBkaWZmTGluZXMgPSB0aGlzLnJlbmRlckRpZmYob2xkU3RyLCBuZXdTdHIpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGh0bWxgXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWItNFwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy1tdXRlZCBtYi0yXCI+RWRpdCAke2luZGV4ICsgMX06PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDxkaXY+JHtkaWZmTGluZXN9PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRgO1xuXHRcdFx0XHR9KX1gLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRvb2xOYW1lID09PSBcIkVkaXRcIiAmJiBpbnB1dD8ub2xkX3N0cmluZyAmJiBpbnB1dD8ubmV3X3N0cmluZykge1xuXHRcdFx0Y29uc3Qgb2xkU3RyID0gaW5wdXQub2xkX3N0cmluZztcblx0XHRcdGNvbnN0IG5ld1N0ciA9IGlucHV0Lm5ld19zdHJpbmc7XG5cblx0XHRcdGNvbnN0IGRpZmZMaW5lcyA9IHRoaXMucmVuZGVyRGlmZihvbGRTdHIsIG5ld1N0cik7XG5cblx0XHRcdHJldHVybiB0aGlzLndyYXBJblNjcm9sbGFibGUoaHRtbGAke2RpZmZMaW5lc31gLCBmYWxzZSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRvb2xOYW1lID09PSBcIldlYkZldGNoXCIgJiYgaW5wdXQ/LnVybCAmJiBpbnB1dD8ucHJvbXB0KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy53cmFwSW5TY3JvbGxhYmxlKFxuXHRcdFx0XHRodG1sYFxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYi0zXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy1tdXRlZCBtYi0xXCI+VVJMOjwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtdnMtdGV4dFwiPiR7aW5wdXQudXJsfTwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy1tdXRlZCBtYi0xXCI+UHJvbXB0OjwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtdnMtdGV4dFwiPiR7aW5wdXQucHJvbXB0fTwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRgLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRvb2xOYW1lID09PSBcIldlYlNlYXJjaFwiICYmIGlucHV0Py5xdWVyeSkge1xuXHRcdFx0Y29uc3QgcGFyYW1zID0gW107XG5cdFx0XHRwYXJhbXMucHVzaChodG1sYFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWItM1wiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLW11dGVkIG1iLTFcIj5RdWVyeTo8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy10ZXh0XCI+JHtpbnB1dC5xdWVyeX08L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRgKTtcblxuXHRcdFx0aWYgKGlucHV0Py5hbGxvd2VkX2RvbWFpbnMpIHtcblx0XHRcdFx0cGFyYW1zLnB1c2goaHRtbGBcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWItM1wiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtdnMtbXV0ZWQgbWItMVwiPkFsbG93ZWQgRG9tYWluczo8L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLXRleHRcIj4ke2lucHV0LmFsbG93ZWRfZG9tYWlucy5qb2luKFwiLCBcIil9PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdGApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaW5wdXQ/LmJsb2NrZWRfZG9tYWlucykge1xuXHRcdFx0XHRwYXJhbXMucHVzaChodG1sYFxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYi0zXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy1tdXRlZCBtYi0xXCI+QmxvY2tlZCBEb21haW5zOjwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtdnMtdGV4dFwiPiR7aW5wdXQuYmxvY2tlZF9kb21haW5zLmpvaW4oXCIsIFwiKX08L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0YCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLndyYXBJblNjcm9sbGFibGUoaHRtbGAke3BhcmFtc31gLCBmYWxzZSk7XG5cdFx0fVxuXG5cdFx0Ly8gRGVmYXVsdDogc2hvdyBKU09OIHBhcmFtZXRlcnNcblx0XHRyZXR1cm4gdGhpcy53cmFwSW5TY3JvbGxhYmxlKEpTT04uc3RyaW5naWZ5KGlucHV0LCBudWxsLCAyKSk7XG5cdH1cblxuXHQvKiogQ29sbGFwc2libGUgdG9vbF9yZXN1bHQgb3V0cHV0IHBsdXMgb3B0aW9uYWwgcmF3IHRvb2xfdXNlIEpTT04gZHVtcC4gKi9cblx0cHJpdmF0ZSByZW5kZXJUb29sUmVzdWx0KHRvb2xSZXN1bHQ6IGFueSwgdG9vbFVzZT86IGFueSk6IFRlbXBsYXRlUmVzdWx0IHtcblx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdDxkaXYgY2xhc3M9XCJtYi00XCI+XG5cdFx0XHRcdDxkaXZcblx0XHRcdFx0XHRjbGFzcz1cInRleHQtdnMtbXV0ZWQgcHgtNCBwYi0wIGN1cnNvci1wb2ludGVyIGhvdmVyOnRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnNcIlxuXHRcdFx0XHRcdEBjbGljaz0ke3RoaXMudG9nZ2xlQ29udGVudH1cblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibXItMlwiPlsrXTwvc3Bhbj5cblx0XHRcdFx0XHRUb29sIFJlc3VsdCAke3Rvb2xSZXN1bHQ/LmlzX2Vycm9yID8gXCJcdTI3NENcIiA6IFwiXHUyNzA1XCJ9XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYmctdnMtYmctc2Vjb25kYXJ5IG14LTQgcC00IHRleHQtdnMtdGV4dCBoaWRkZW4gb3ZlcmZsb3cteC1hdXRvXCI+XG5cdFx0XHRcdFx0PHByZSBjbGFzcz1cIndoaXRlc3BhY2UtcHJlIG92ZXJmbG93LXgtYXV0b1wiIHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcIj5cbiR7dHlwZW9mIHRvb2xSZXN1bHQuY29udGVudCA9PT0gXCJzdHJpbmdcIiA/IHRvb2xSZXN1bHQuY29udGVudCA6IEpTT04uc3RyaW5naWZ5KHRvb2xSZXN1bHQuY29udGVudCwgbnVsbCwgMil9PC9wcmVcblx0XHRcdFx0XHQ+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQke3Rvb2xVc2Vcblx0XHRcdFx0XHQ/IGh0bWxgXG5cdFx0XHRcdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJ0ZXh0LXZzLW11dGVkIHB4LTQgY3Vyc29yLXBvaW50ZXIgaG92ZXI6dGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9yc1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRAY2xpY2s9JHt0aGlzLnRvZ2dsZUNvbnRlbnR9XG5cdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJtci0yXCI+WytdPC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0UmF3IFRvb2wgQ2FsbFxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJiZy12cy1iZy1zZWNvbmRhcnkgbXgtNCBwLTQgdGV4dC12cy10ZXh0IGhpZGRlblwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0JHt0aGlzLndyYXBJblNjcm9sbGFibGUoSlNPTi5zdHJpbmdpZnkodG9vbFVzZSwgbnVsbCwgMikpfVxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdGBcblx0XHRcdFx0XHQ6IFwiXCJ9XG5cdFx0XHQ8L2Rpdj5cblx0XHRgO1xuXHR9XG5cblx0LyoqIFN0YW5kYXJkIGxheW91dCB3cmFwcGVyIGZvciBhIHRvb2wgaGVhZGVyLCBib2R5LCBhbmQgb3B0aW9uYWwgcmVzdWx0LiAqL1xuXHRwcml2YXRlIHJlbmRlclRvb2xDb250YWluZXIoXG5cdFx0dG9vbFVzZTogYW55LFxuXHRcdHRvb2xSZXN1bHQ/OiBhbnksXG5cdFx0b3B0aW9uczoge1xuXHRcdFx0aXNDb2xsYXBzaWJsZT86IGJvb2xlYW47XG5cdFx0XHRpc0NvbGxhcHNlZD86IGJvb2xlYW47XG5cdFx0XHRpc0NsaWNrVG9FeHBhbmQ/OiBib29sZWFuO1xuXHRcdFx0Y3VzdG9tQ29udGVudD86IFRlbXBsYXRlUmVzdWx0O1xuXHRcdH0gPSB7fSxcblx0KTogVGVtcGxhdGVSZXN1bHQge1xuXHRcdGNvbnN0IHsgaXNDb2xsYXBzaWJsZSA9IGZhbHNlLCBpc0NvbGxhcHNlZCA9IGZhbHNlLCBpc0NsaWNrVG9FeHBhbmQgPSBmYWxzZSwgY3VzdG9tQ29udGVudCB9ID0gb3B0aW9ucztcblxuXHRcdGNvbnN0IGNvbnRlbnREaXYgPSBjdXN0b21Db250ZW50IHx8IGh0bWxgJHt0aGlzLnJlbmRlclRvb2xVc2VDb250ZW50KHRvb2xVc2UpfWA7XG5cdFx0Y29uc3QgaGVhZGVyQ2xhc3NlcyA9IGlzQ2xpY2tUb0V4cGFuZFxuXHRcdFx0PyBcInRleHQtdnMtdHlwZSBweC00IGJyZWFrLWFsbCBjdXJzb3ItcG9pbnRlciBob3Zlcjp0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzXCJcblx0XHRcdDogXCJ0ZXh0LXZzLXR5cGUgcHgtNCBicmVhay1hbGxcIjtcblx0XHRjb25zdCBjb250ZW50Q2xhc3NlcyA9IGlzQ29sbGFwc2VkXG5cdFx0XHQ/IFwiYmctdnMtYmctc2Vjb25kYXJ5IG14LTQgcC00IHRleHQtdnMtdGV4dCBoaWRkZW5cIlxuXHRcdFx0OiBcImJnLXZzLWJnLXNlY29uZGFyeSBteC00IHAtNCB0ZXh0LXZzLXRleHRcIjtcblxuXHRcdHJldHVybiBodG1sYFxuXHRcdFx0PGRpdiBjbGFzcz1cIm10LTQgbWItNFwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiJHtoZWFkZXJDbGFzc2VzfVwiIEBjbGljaz0ke2lzQ2xpY2tUb0V4cGFuZCA/IHRoaXMudG9nZ2xlQ29udGVudCA6IHVuZGVmaW5lZH0+XG5cdFx0XHRcdFx0JHtpc0NvbGxhcHNpYmxlID8gaHRtbGA8c3BhbiBjbGFzcz1cIm1yLTJcIj5bJHtpc0NvbGxhcHNlZCA/IFwiK1wiIDogXCItXCJ9XTwvc3Bhbj5gIDogXCJcIn1cblx0XHRcdFx0XHQke3RoaXMuZ2V0VG9vbERpc3BsYXlOYW1lKHRvb2xVc2UpfVxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cIiR7Y29udGVudENsYXNzZXN9XCI+JHtjb250ZW50RGl2fTwvZGl2PlxuXHRcdFx0XHQke3Rvb2xSZXN1bHQgPyB0aGlzLnJlbmRlclRvb2xSZXN1bHQodG9vbFJlc3VsdCwgdG9vbFVzZSkgOiBcIlwifVxuXHRcdFx0PC9kaXY+XG5cdFx0YDtcblx0fVxuXG5cdC8qKiBTaG93cyB0aGUgZmlyc3QgMTAgbGluZXMgb2YgV3JpdGUgdG9vbCBjb250ZW50IHdpdGggYW4gZXhwYW5kIGhpbnQuICovXG5cdHByaXZhdGUgcmVuZGVyV3JpdGVQcmV2aWV3KHRvb2xVc2U6IGFueSk6IFRlbXBsYXRlUmVzdWx0IHtcblx0XHRjb25zdCBpbnB1dCA9IHRvb2xVc2UuaW5wdXQ7XG5cdFx0aWYgKCFpbnB1dD8uY29udGVudCkge1xuXHRcdFx0cmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cInRleHQtdnMtbXV0ZWRcIj5ObyBjb250ZW50PC9kaXY+YDtcblx0XHR9XG5cblx0XHRjb25zdCBjb250ZW50ID0gaW5wdXQuY29udGVudDtcblx0XHRjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XG5cdFx0Y29uc3QgcHJldmlldyA9IGxpbmVzLnNsaWNlKDAsIDEwKTtcblx0XHRjb25zdCBoYXNNb3JlID0gbGluZXMubGVuZ3RoID4gMTA7XG5cblx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdCR7dGhpcy53cmFwSW5TY3JvbGxhYmxlKHByZXZpZXcuam9pbihcIlxcblwiKSl9XG5cdFx0XHQke2hhc01vcmUgPyBodG1sYDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLW11dGVkXCI+Li4uICR7bGluZXMubGVuZ3RoIC0gMTB9IG1vcmUgbGluZXMgKGNsaWNrIHRvIGV4cGFuZCk8L2Rpdj5gIDogXCJcIn1cblx0XHRgO1xuXHR9XG5cblx0LyoqIFJlbmRlcnMgYSBsaW5lLWJhc2VkIGRpZmYgYmV0d2VlbiBvbGQgYW5kIG5ldyBzdHJpbmdzIGZvciBFZGl0L011bHRpRWRpdCB0b29scy4gKi9cblx0cHJpdmF0ZSByZW5kZXJEaWZmKG9sZFN0cjogc3RyaW5nLCBuZXdTdHI6IHN0cmluZyk6IFRlbXBsYXRlUmVzdWx0W10ge1xuXHRcdGNvbnN0IGRpZmYgPSBEaWZmLmRpZmZMaW5lcyhvbGRTdHIsIG5ld1N0cik7XG5cdFx0Y29uc3QgZGlmZkxpbmVzID0gW107XG5cblx0XHRmb3IgKGNvbnN0IHBhcnQgb2YgZGlmZikge1xuXHRcdFx0Y29uc3QgbGluZXMgPSBwYXJ0LnZhbHVlLnNwbGl0KFwiXFxuXCIpO1xuXHRcdFx0Ly8gUmVtb3ZlIGVtcHR5IGxhc3QgbGluZSBmcm9tIHNwbGl0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID09PSBcIlwiKSB7XG5cdFx0XHRcdGxpbmVzLnBvcCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcblx0XHRcdFx0aWYgKHBhcnQuYWRkZWQpIHtcblx0XHRcdFx0XHRkaWZmTGluZXMucHVzaChodG1sYDxkaXYgY2xhc3M9XCJiZy1ncmVlbi02MDAvMjBcIj48cHJlIGNsYXNzPVwidGV4dC12cy10ZXh0IG0tMFwiPisgJHtsaW5lfTwvcHJlPjwvZGl2PmApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHBhcnQucmVtb3ZlZCkge1xuXHRcdFx0XHRcdGRpZmZMaW5lcy5wdXNoKGh0bWxgPGRpdiBjbGFzcz1cImJnLXJlZC02MDAvMjBcIj48cHJlIGNsYXNzPVwidGV4dC12cy10ZXh0IG0tMFwiPi0gJHtsaW5lfTwvcHJlPjwvZGl2PmApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRpZmZMaW5lcy5wdXNoKGh0bWxgPGRpdj48cHJlIGNsYXNzPVwidGV4dC12cy10ZXh0IG0tMFwiPiAgJHtsaW5lfTwvcHJlPjwvZGl2PmApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRpZmZMaW5lcztcblx0fVxuXG5cdC8qKiBGb3JtYXRzIGEgdG9rZW4gY291bnQgZm9yIGNvbXBhY3QgaGVhZGVyIGRpc3BsYXkgKGUuZy4gNDJrLCAxLjJNKS4gKi9cblx0cHJpdmF0ZSBmb3JtYXRUb2tlbkNvdW50KGNvdW50OiBudW1iZXIpOiBzdHJpbmcge1xuXHRcdGlmIChjb3VudCA+PSAxXzAwMF8wMDApIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gY291bnQgLyAxXzAwMF8wMDA7XG5cdFx0XHRyZXR1cm4gYCR7TnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlLnRvRml4ZWQoMSkucmVwbGFjZSgvXFwuMCQvLCBcIlwiKX1NYDtcblx0XHR9XG5cdFx0aWYgKGNvdW50ID49IDEwXzAwMCkge1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBjb3VudCAvIDEwMDA7XG5cdFx0XHRyZXR1cm4gYCR7TnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlLnRvRml4ZWQoMSkucmVwbGFjZSgvXFwuMCQvLCBcIlwiKX1rYDtcblx0XHR9XG5cdFx0cmV0dXJuIGNvdW50LnRvTG9jYWxlU3RyaW5nKCk7XG5cdH1cblxuXHQvKiogQnVpbGRzIHRoZSB0b2tlbiB1c2FnZSBzZWdtZW50IGZvciBhIGNvbnZlcnNhdGlvbiBoZWFkZXIsIG9yIG51bGwgd2hlbiBubyB1c2FnZSBkYXRhLiAqL1xuXHRwcml2YXRlIGZvcm1hdFRva2VuVXNhZ2VMaW5lKGNvbnZlcnNhdGlvbjogU2ltcGxlQ29udmVyc2F0aW9uKTogc3RyaW5nIHwgbnVsbCB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBjb252ZXJzYXRpb24ubWV0YWRhdGE7XG5cdFx0Y29uc3QgbGFzdEluID0gbWV0YWRhdGEubGFzdFR1cm5JbnB1dFRva2VucyA/PyBtZXRhZGF0YS5pbnB1dFRva2VucyA/PyAwO1xuXHRcdGNvbnN0IHNlc3Npb25PdXQgPSBtZXRhZGF0YS5zZXNzaW9uT3V0cHV0VG9rZW5zID8/IG1ldGFkYXRhLm91dHB1dFRva2VucyA/PyAwO1xuXG5cdFx0aWYgKGxhc3RJbiA9PT0gMCAmJiBzZXNzaW9uT3V0ID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJ0cyA9IFtgXHUyMTkxJHt0aGlzLmZvcm1hdFRva2VuQ291bnQobGFzdEluKX0gaW5gLCBgXHUyMTkzJHt0aGlzLmZvcm1hdFRva2VuQ291bnQoc2Vzc2lvbk91dCl9IG91dGBdO1xuXG5cdFx0aWYgKG1ldGFkYXRhLnRvdGFsUGFpcnMgPiAxKSB7XG5cdFx0XHRwYXJ0cy5wdXNoKGAke21ldGFkYXRhLnRvdGFsUGFpcnN9IGNhbGxzYCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2FjaGVSZWFkID0gbWV0YWRhdGEuY2FjaGVSZWFkVG9rZW5zID8/IDA7XG5cdFx0aWYgKGNhY2hlUmVhZCA+IDApIHtcblx0XHRcdHBhcnRzLnB1c2goYGNhY2hlICR7dGhpcy5mb3JtYXRUb2tlbkNvdW50KGNhY2hlUmVhZCl9IHJlYWRgKTtcblx0XHR9XG5cblx0XHRjb25zdCBjYWNoZVdyaXRlID0gbWV0YWRhdGEuY2FjaGVDcmVhdGlvblRva2VucyA/PyAwO1xuXHRcdGlmIChjYWNoZVdyaXRlID4gMCkge1xuXHRcdFx0cGFydHMucHVzaChgY2FjaGUgJHt0aGlzLmZvcm1hdFRva2VuQ291bnQoY2FjaGVXcml0ZSl9IHdyaXRlYCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBhcnRzLmpvaW4oXCIgXHUwMEI3IFwiKTtcblx0fVxuXG5cdC8qKiBCdWlsZHMgdGhlIHN1YnRpdGxlIHVuZGVyIGVhY2ggY29udmVyc2F0aW9uIGhlYWRlciAobWVzc2FnZSBjb3VudCArIEFQSSBmb3JtYXQgKyB0b2tlbnMpLiAqL1xuXHRwcml2YXRlIGZvcm1hdE1ldGFkYXRhTGluZShjb252ZXJzYXRpb246IFNpbXBsZUNvbnZlcnNhdGlvbik6IHN0cmluZyB7XG5cdFx0Y29uc3QgcGFydHMgPSBbYCR7Y29udmVyc2F0aW9uLm1lc3NhZ2VzLmxlbmd0aCArIDF9IG1lc3NhZ2VzYF07XG5cblx0XHRpZiAoY29udmVyc2F0aW9uLmFwaUZvcm1hdERpc3BsYXkpIHtcblx0XHRcdHBhcnRzLnB1c2goY29udmVyc2F0aW9uLmFwaUZvcm1hdERpc3BsYXkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRva2VuVXNhZ2UgPSB0aGlzLmZvcm1hdFRva2VuVXNhZ2VMaW5lKGNvbnZlcnNhdGlvbik7XG5cdFx0aWYgKHRva2VuVXNhZ2UpIHtcblx0XHRcdHBhcnRzLnB1c2godG9rZW5Vc2FnZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBhcnRzLmpvaW4oXCIgXHUwMEI3IFwiKTtcblx0fVxuXG5cdC8qKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZmluYWwgcmVxdWVzdCBpbmNsdWRlZCB0b29sIGRlZmluaXRpb25zLiAqL1xuXHRwcml2YXRlIGhhc1Rvb2xzKGNvbnZlcnNhdGlvbjogU2ltcGxlQ29udmVyc2F0aW9uKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICEhKGNvbnZlcnNhdGlvbi5maW5hbFBhaXIucmVxdWVzdC50b29scyAmJiBjb252ZXJzYXRpb24uZmluYWxQYWlyLnJlcXVlc3QudG9vbHMubGVuZ3RoID4gMCk7XG5cdH1cblxuXHQvKiogUmVuZGVycyBleHBhbmRhYmxlIHRvb2wgc2NoZW1hIGNhcmRzIGZyb20gdGhlIHJlcXVlc3QncyBgdG9vbHNgIGFycmF5LiAqL1xuXHRwcml2YXRlIHJlbmRlclRvb2xzKHRvb2xzOiBUb29sVW5pb25bXSk6IFRlbXBsYXRlUmVzdWx0IHtcblx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdCR7dG9vbHMubWFwKCh0b29sKSA9PiB7XG5cdFx0XHRcdGlmIChcIm5hbWVcIiBpbiB0b29sICYmIHRvb2wubmFtZSkge1xuXHRcdFx0XHRcdGNvbnN0IGRlc2NyaXB0aW9uID0gKFwiZGVzY3JpcHRpb25cIiBpbiB0b29sICYmIHRvb2wuZGVzY3JpcHRpb24pIHx8IFwiTm8gZGVzY3JpcHRpb25cIjtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnJlbmRlckNvbGxhcHNpYmxlU2VjdGlvbihcblx0XHRcdFx0XHRcdHRvb2wubmFtZSxcblx0XHRcdFx0XHRcdGh0bWxgXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLXRleHQgbWwtNCBtYi0zIG1hcmtkb3duLWNvbnRlbnRcIj5cblx0XHRcdFx0XHRcdFx0XHQke3Vuc2FmZUhUTUwobWFya2Rvd25Ub0h0bWwoZGVzY3JpcHRpb24pKX1cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdFx0JHtcImlucHV0X3NjaGVtYVwiIGluIHRvb2wgJiYgdG9vbC5pbnB1dF9zY2hlbWEgJiYgdHlwZW9mIHRvb2wuaW5wdXRfc2NoZW1hID09PSBcIm9iamVjdFwiXG5cdFx0XHRcdFx0XHRcdFx0PyAoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzY2hlbWEgPSB0b29sLmlucHV0X3NjaGVtYSBhcyBhbnk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChzY2hlbWEucHJvcGVydGllcykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBodG1sYFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtdnMtbXV0ZWQgbWItMlwiPlBhcmFtZXRlcnM6PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQke09iamVjdC5lbnRyaWVzKHNjaGVtYS5wcm9wZXJ0aWVzKS5tYXAoKFtwYXJhbU5hbWUsIHBhcmFtRGVmXSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBkZWYgPSBwYXJhbURlZiBhcyBhbnk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHJlcXVpcmVkID0gc2NoZW1hLnJlcXVpcmVkPy5pbmNsdWRlcyhwYXJhbU5hbWUpID8gXCIgKHJlcXVpcmVkKVwiIDogXCJcIjtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgdHlwZSA9IGRlZi50eXBlID8gYCBbJHtkZWYudHlwZX1dYCA6IFwiXCI7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGRlc2MgPSBkZWYuZGVzY3JpcHRpb24gPyBgIC0gJHtkZWYuZGVzY3JpcHRpb259YCA6IFwiXCI7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBodG1sYFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtbC00IG1iLTFcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwidGV4dC12cy11c2VyXCI+JHtwYXJhbU5hbWV9PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJ0ZXh0LXZzLW11dGVkXCI+JHt0eXBlfSR7cmVxdWlyZWR9JHtkZXNjfTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGh0bWxgYDtcblx0XHRcdFx0XHRcdFx0XHRcdH0pKClcblx0XHRcdFx0XHRcdFx0XHQ6IGh0bWxgYH1cblx0XHRcdFx0XHRcdGAsXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRpdGxlQ2xhc3NlczogXCJ0ZXh0LXZzLXR5cGUgZm9udC1ib2xkXCIsXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5lckNsYXNzZXM6IFwibWItNFwiLFxuXHRcdFx0XHRcdFx0XHRpc0V4cGFuZGVkOiB0cnVlLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBodG1sYDxwcmUgY2xhc3M9XCJtYi00XCI+JHtKU09OLnN0cmluZ2lmeSh0b29sLCBudWxsLCAyKX08L3ByZT5gO1xuXHRcdFx0fSl9XG5cdFx0YDtcblx0fVxuXG5cdC8qKiBGdWxsIGlubmVyIGxheW91dCBmb3Igb25lIGNvbnZlcnNhdGlvbjogc3lzdGVtLCB0b29scywgbWVzc2FnZXMsIHJlc3BvbnNlLiAqL1xuXHRwcml2YXRlIHJlbmRlckNvbnZlcnNhdGlvbkNvbnRlbnQoY29udmVyc2F0aW9uOiBTaW1wbGVDb252ZXJzYXRpb24pOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0cmV0dXJuIGh0bWxgXG5cdFx0XHQ8IS0tIFN5c3RlbSBQcm9tcHQgKEV4cGFuZGFibGUpIC0tPlxuXHRcdFx0JHtjb252ZXJzYXRpb24uc3lzdGVtXG5cdFx0XHRcdD8gdGhpcy5yZW5kZXJDb2xsYXBzaWJsZVNlY3Rpb24oXG5cdFx0XHRcdFx0XHRcIlN5c3RlbSBQcm9tcHRcIixcblx0XHRcdFx0XHRcdGh0bWxgPGRpdiBjbGFzcz1cInRleHQtdnMtdGV4dCBtYXJrZG93bi1jb250ZW50IG1iLTRcIj5cblx0XHRcdFx0XHRcdFx0JHt1bnNhZmVIVE1MKHRoaXMuZm9ybWF0U3lzdGVtKGNvbnZlcnNhdGlvbi5zeXN0ZW0pKX1cblx0XHRcdFx0XHRcdDwvZGl2PmAsXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRpdGxlQ2xhc3NlczogXCJ0ZXh0LXZzLWZ1bmN0aW9uXCIsXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5lckNsYXNzZXM6IFwicHgtNCBtdC00XCIsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdClcblx0XHRcdFx0OiBcIlwifVxuXG5cdFx0XHQ8IS0tIFRvb2xzIChFeHBhbmRhYmxlKSAtLT5cblx0XHRcdCR7dGhpcy5oYXNUb29scyhjb252ZXJzYXRpb24pXG5cdFx0XHRcdD8gdGhpcy5yZW5kZXJDb2xsYXBzaWJsZVNlY3Rpb24oXG5cdFx0XHRcdFx0XHRcIlRvb2xzXCIsXG5cdFx0XHRcdFx0XHRodG1sYDxkaXYgY2xhc3M9XCJtbC00XCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLXRleHRcIj4ke3RoaXMucmVuZGVyVG9vbHMoY29udmVyc2F0aW9uLmZpbmFsUGFpci5yZXF1ZXN0LnRvb2xzIHx8IFtdKX08L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PmAsXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRpdGxlQ2xhc3NlczogXCJ0ZXh0LXZzLXR5cGVcIixcblx0XHRcdFx0XHRcdFx0Y29udGFpbmVyQ2xhc3NlczogXCJweC00XCIsXG5cdFx0XHRcdFx0XHRcdGNvdW50OiBjb252ZXJzYXRpb24uZmluYWxQYWlyLnJlcXVlc3QudG9vbHM/Lmxlbmd0aCB8fCAwLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdDogXCJcIn1cblxuXHRcdFx0PCEtLSBDb252ZXJzYXRpb24gTWVzc2FnZXMgLS0+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwicHgtNCBtdC00XCI+XG5cdFx0XHRcdCR7Y29udmVyc2F0aW9uLm1lc3NhZ2VzXG5cdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZSkgPT4gIShtZXNzYWdlIGFzIEVuaGFuY2VkTWVzc2FnZVBhcmFtKS5oaWRlKVxuXHRcdFx0XHRcdC5tYXAoXG5cdFx0XHRcdFx0XHQobWVzc2FnZSwgbXNnSW5kZXgpID0+IGh0bWxgXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYi00XCI+XG5cdFx0XHRcdFx0XHRcdFx0JHt0aGlzLmlzQ29kZXhDb250ZXh0T25seU1lc3NhZ2UobWVzc2FnZSBhcyBFbmhhbmNlZE1lc3NhZ2VQYXJhbSlcblx0XHRcdFx0XHRcdFx0XHRcdD8gXCJcIlxuXHRcdFx0XHRcdFx0XHRcdFx0OiBodG1sYFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwiZm9udC1ib2xkIHVwcGVyY2FzZSAke21lc3NhZ2Uucm9sZSA9PT0gXCJ1c2VyXCIgPyBcInRleHQtdnMtdXNlclwiIDogXCJ0ZXh0LXZzLWFzc2lzdGFudFwifVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4+JHttZXNzYWdlLnJvbGV9PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRgfVxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLXRleHRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdCR7dGhpcy5mb3JtYXRDb250ZW50KG1lc3NhZ2UuY29udGVudCwgKG1lc3NhZ2UgYXMgRW5oYW5jZWRNZXNzYWdlUGFyYW0pLnRvb2xSZXN1bHRzKX1cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRgLFxuXHRcdFx0XHRcdCl9XG5cblx0XHRcdFx0PCEtLSBBc3Npc3RhbnQgUmVzcG9uc2UgLS0+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJtYi00XCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZvbnQtYm9sZCB1cHBlcmNhc2UgdGV4dC12cy1hc3Npc3RhbnRcIj5cblx0XHRcdFx0XHRcdDxzcGFuPmFzc2lzdGFudDwvc3Bhbj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy10ZXh0XCI+JHt0aGlzLmZvcm1hdFJlc3BvbnNlQ29udGVudChjb252ZXJzYXRpb24ucmVzcG9uc2UpfTwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdGA7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0aWYgKHRoaXMuY29udmVyc2F0aW9ucy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBodG1sYDxkaXY+Tm8gY29udmVyc2F0aW9ucyBmb3VuZC48L2Rpdj5gO1xuXHRcdH1cblxuXHRcdHJldHVybiBodG1sYFxuXHRcdFx0PGRpdiBjbGFzcz1cIm1heC13LVs2MGVtXSBteC1hdXRvXCI+XG5cdFx0XHRcdCR7dGhpcy5jb252ZXJzYXRpb25zLm1hcChcblx0XHRcdFx0XHQoY29udmVyc2F0aW9uKSA9PiBodG1sYFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm10LTggZmlyc3Q6bXQtMFwiPlxuXHRcdFx0XHRcdFx0XHQke2NvbnZlcnNhdGlvbi5jb21wYWN0ZWRcblx0XHRcdFx0XHRcdFx0XHQ/IGh0bWxgXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwhLS0gQ29tcGFjdGVkIENvbnZlcnNhdGlvbiAoQ29sbGFwc2VkKSAtLT5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgdGV4dC1yZWQtNDAwIGhvdmVyOnRleHQtcmVkLTMwMCB0cmFuc2l0aW9uLWNvbG9ycyBib3JkZXIgYm9yZGVyLXJlZC03MDAgcC00XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRAY2xpY2s9JHt0aGlzLnRvZ2dsZUNvbnRlbnR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1yLTJcIj5bK108L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4+Q29tcGFjdGVkIChjbGljayB0byB2aWV3IGRldGFpbHMpPC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImhpZGRlbiBtdC04XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSBDb252ZXJzYXRpb24gSGVhZGVyIC0tPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJib3JkZXIgYm9yZGVyLXJlZC03MDAgcC00IG1iLTBcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXJlZC00MDBcIj4ke0FycmF5LmZyb20oY29udmVyc2F0aW9uLm1vZGVscykuam9pbihcIiwgXCIpfTwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtdnMtbXV0ZWRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHtuZXcgRGF0ZShjb252ZXJzYXRpb24ubWV0YWRhdGEuc3RhcnRUaW1lKS50b0xvY2FsZVN0cmluZygpfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1sLTRcIj4ke3RoaXMuZm9ybWF0TWV0YWRhdGFMaW5lKGNvbnZlcnNhdGlvbil9PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHt0aGlzLnJlbmRlckNvbnZlcnNhdGlvbkNvbnRlbnQoY29udmVyc2F0aW9uKX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRgXG5cdFx0XHRcdFx0XHRcdFx0OiBodG1sYFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tIFJlZ3VsYXIgQ29udmVyc2F0aW9uIC0tPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tIENvbnZlcnNhdGlvbiBIZWFkZXIgLS0+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJib3JkZXIgYm9yZGVyLXZzLWhpZ2hsaWdodCBwLTQgbWItMFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLWFzc2lzdGFudFwiPiR7QXJyYXkuZnJvbShjb252ZXJzYXRpb24ubW9kZWxzKS5qb2luKFwiLCBcIil9PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtdnMtbXV0ZWRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR7bmV3IERhdGUoY29udmVyc2F0aW9uLm1ldGFkYXRhLnN0YXJ0VGltZSkudG9Mb2NhbGVTdHJpbmcoKX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibWwtNFwiPiR7dGhpcy5mb3JtYXRNZXRhZGF0YUxpbmUoY29udmVyc2F0aW9uKX08L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQke3RoaXMucmVuZGVyQ29udmVyc2F0aW9uQ29udGVudChjb252ZXJzYXRpb24pfVxuXHRcdFx0XHRcdFx0XHRcdFx0YH1cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdGAsXG5cdFx0XHRcdCl9XG5cdFx0XHQ8L2Rpdj5cblx0XHRgO1xuXHR9XG59XG4iLCAiLyoqXG4gKiBAZmlsZSBSYXcgQVBJIHBhaXIgZGVidWcgdmlldy5cbiAqXG4gKiBTaG93cyB1bnByb2Nlc3NlZCByZXF1ZXN0L3Jlc3BvbnNlIG9iamVjdHMgZXhhY3RseSBhcyBsb2dnZWQsIGluY2x1ZGluZ1xuICogb3B0aW9uYWwgU1NFIGV2ZW50IGFycmF5cywgd2l0aCBjb2xsYXBzaWJsZSBzZWN0aW9ucyBwZXIgcGFpci5cbiAqL1xuXG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSBcImxpdFwiO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tIFwibGl0L2RlY29yYXRvcnMuanNcIjtcbmltcG9ydCB7IFJhd1BhaXIgfSBmcm9tIFwiLi4vLi4vLi4vc3JjL3R5cGVzXCI7XG5cbi8qKiBFeHBhbmRhYmxlIGR1bXAgb2YgbG9nZ2VkIHtAbGluayBSYXdQYWlyfSBvYmplY3RzIGJlZm9yZSBub3JtYWxpemF0aW9uLiAqL1xuQGN1c3RvbUVsZW1lbnQoXCJyYXctcGFpcnMtdmlld1wiKVxuZXhwb3J0IGNsYXNzIFJhd1BhaXJzVmlldyBleHRlbmRzIExpdEVsZW1lbnQge1xuXHRAcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSByYXdQYWlyczogUmF3UGFpcltdID0gW107XG5cblx0LyoqIExpZ2h0IERPTSBzbyBnbG9iYWwgVGFpbHdpbmQgY2xhc3NlcyBhcHBseS4gKi9cblx0Y3JlYXRlUmVuZGVyUm9vdCgpIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBSZW5kZXJzIGNvbGxhcHNpYmxlIHJhdyByZXF1ZXN0L3Jlc3BvbnNlL1NTRSBzZWN0aW9ucyBmb3IgZWFjaCBsb2dnZWQgcGFpci4gKi9cblx0cmVuZGVyKCkge1xuXHRcdGlmICh0aGlzLnJhd1BhaXJzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cInRleHQtdnMtbXV0ZWRcIj5ObyByYXcgcGFpcnMgZm91bmQuPC9kaXY+YDtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXIgb3V0IHBhaXJzIHdpdGggbnVsbCByZXNwb25zZXMgZm9yIGRpc3BsYXlcblx0XHRjb25zdCB2YWxpZFBhaXJzID0gdGhpcy5yYXdQYWlycy5maWx0ZXIoKHBhaXIpID0+IHBhaXIucmVzcG9uc2UgIT09IG51bGwpO1xuXG5cdFx0cmV0dXJuIGh0bWxgXG5cdFx0XHQ8ZGl2PlxuXHRcdFx0XHQke3ZhbGlkUGFpcnMubWFwKFxuXHRcdFx0XHRcdChwYWlyLCBpbmRleCkgPT4gaHRtbGBcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtdC04IGZpcnN0Om10LTBcIj5cblx0XHRcdFx0XHRcdFx0PCEtLSBQYWlyIEhlYWRlciAtLT5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImJvcmRlciBib3JkZXItdnMtaGlnaGxpZ2h0IHAtNCBtYi0wXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtdnMtYXNzaXN0YW50IGZvbnQtYm9sZFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0JHtwYWlyLnJlcXVlc3QubWV0aG9kfSAke3RoaXMuZ2V0VXJsUGF0aChwYWlyLnJlcXVlc3QudXJsKX1cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy1tdXRlZFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0UmF3IFBhaXIgJHtpbmRleCArIDF9IFx1MjAyMiAke3RoaXMuZ2V0TW9kZWxOYW1lKHBhaXIpfSBcdTIwMjIgU3RhdHVzICR7cGFpci5yZXNwb25zZSEuc3RhdHVzX2NvZGV9IFx1MjAyMlxuXHRcdFx0XHRcdFx0XHRcdFx0JHtuZXcgRGF0ZShwYWlyLmxvZ2dlZF9hdCkudG9Mb2NhbGVTdHJpbmcoKX1cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdFx0PCEtLSBSZXF1ZXN0IFNlY3Rpb24gLS0+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJweC00IG10LTRcIj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWItNFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzcz1cImN1cnNvci1wb2ludGVyIHRleHQtdnMtdXNlciBmb250LWJvbGQgaG92ZXI6dGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9yc1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdEBjbGljaz0keyhlOiBFdmVudCkgPT4gdGhpcy50b2dnbGVDb250ZW50KGUpfVxuXHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1yLTJcIj5bK108L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuPlJlcXVlc3Q8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJoaWRkZW4gbXQtMlwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYmctdnMtYmctc2Vjb25kYXJ5IHAtNCB0ZXh0LXZzLXRleHQgb3ZlcmZsb3cteC1hdXRvXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHByZSBjbGFzcz1cIndoaXRlc3BhY2UtcHJlIHRleHQtdnMtdGV4dCBtLTBcIj4ke3RoaXMuZm9ybWF0SnNvbihwYWlyLnJlcXVlc3QpfTwvcHJlPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHRcdFx0PCEtLSBSZXNwb25zZSBTZWN0aW9uIC0tPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYi00XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgdGV4dC12cy1hc3Npc3RhbnQgZm9udC1ib2xkIGhvdmVyOnRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnNcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRAY2xpY2s9JHsoZTogRXZlbnQpID0+IHRoaXMudG9nZ2xlQ29udGVudChlKX1cblx0XHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJtci0yXCI+WytdPC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3Bhbj5SZXNwb25zZTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImhpZGRlbiBtdC0yXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJiZy12cy1iZy1zZWNvbmRhcnkgcC00IHRleHQtdnMtdGV4dCBvdmVyZmxvdy14LWF1dG9cIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8cHJlIGNsYXNzPVwid2hpdGVzcGFjZS1wcmUgdGV4dC12cy10ZXh0IG0tMFwiPiR7dGhpcy5mb3JtYXRKc29uKHBhaXIucmVzcG9uc2UpfTwvcHJlPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHRcdFx0PCEtLSBTU0UgRXZlbnRzIFNlY3Rpb24gLS0+XG5cdFx0XHRcdFx0XHRcdFx0JHtwYWlyLnJlc3BvbnNlIS5ldmVudHMgJiYgcGFpci5yZXNwb25zZSEuZXZlbnRzLmxlbmd0aCA+IDBcblx0XHRcdFx0XHRcdFx0XHRcdD8gaHRtbGBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWItNFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzcz1cImN1cnNvci1wb2ludGVyIHRleHQtdnMtdHlwZSBmb250LWJvbGQgaG92ZXI6dGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9yc1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdEBjbGljaz0keyhlOiBFdmVudCkgPT4gdGhpcy50b2dnbGVDb250ZW50KGUpfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1yLTJcIj5bK108L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuPlNTRSBFdmVudHMgKCR7cGFpci5yZXNwb25zZSEuZXZlbnRzLmxlbmd0aH0pPC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGlkZGVuIG10LTJcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImJnLXZzLWJnLXNlY29uZGFyeSBwLTQgdGV4dC12cy10ZXh0IG92ZXJmbG93LXgtYXV0b1wiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxwcmUgY2xhc3M9XCJ3aGl0ZXNwYWNlLXByZSB0ZXh0LXZzLXRleHQgbS0wXCI+XG4ke3RoaXMuZm9ybWF0SnNvbihwYWlyLnJlc3BvbnNlIS5ldmVudHMpfTwvcHJlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRgXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IFwiXCJ9XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0YCxcblx0XHRcdFx0KX1cblx0XHRcdDwvZGl2PlxuXHRcdGA7XG5cdH1cblxuXHQvKiogUmV0dXJucyBVUkwgcGF0aG5hbWUgZm9yIGRpc3BsYXksIGZhbGxpbmcgYmFjayB0byB0aGUgcmF3IHN0cmluZyBvbiBwYXJzZSBlcnJvcnMuICovXG5cdHByaXZhdGUgZ2V0VXJsUGF0aCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBuZXcgVVJMKHVybCkucGF0aG5hbWU7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gdXJsO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFeHRyYWN0cyBhIGRpc3BsYXkgbW9kZWwgbmFtZSBmcm9tIHRoZSByZXF1ZXN0IFVSTCAoQmVkcm9jaykgb3IgYm9keS5cblx0ICovXG5cdHByaXZhdGUgZ2V0TW9kZWxOYW1lKHBhaXI6IFJhd1BhaXIpOiBzdHJpbmcge1xuXHRcdC8vIFRyeSB0byBleHRyYWN0IGZyb20gQmVkcm9jayBVUkwgZmlyc3Rcblx0XHRpZiAocGFpci5yZXF1ZXN0LnVybCAmJiBwYWlyLnJlcXVlc3QudXJsLmluY2x1ZGVzKFwiYmVkcm9jay1ydW50aW1lXCIpKSB7XG5cdFx0XHRjb25zdCB1cmxNYXRjaCA9IHBhaXIucmVxdWVzdC51cmwubWF0Y2goL1xcL21vZGVsXFwvKFteXFwvXSspLyk7XG5cdFx0XHRpZiAodXJsTWF0Y2ggJiYgdXJsTWF0Y2hbMV0pIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplTW9kZWxOYW1lKHVybE1hdGNoWzFdKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBUcnkgdG8gZ2V0IG1vZGVsIGZyb20gcmVxdWVzdCBib2R5XG5cdFx0aWYgKHBhaXIucmVxdWVzdC5ib2R5ICYmIHBhaXIucmVxdWVzdC5ib2R5Lm1vZGVsKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemVNb2RlbE5hbWUocGFpci5yZXF1ZXN0LmJvZHkubW9kZWwpO1xuXHRcdH1cblxuXHRcdC8vIERlZmF1bHQgZmFsbGJhY2tcblx0XHRyZXR1cm4gXCJ1bmtub3duXCI7XG5cdH1cblxuXHQvKiogU3RyaXBzIEJlZHJvY2sgcHJvdmlkZXIgcHJlZml4IGZvciBzaG9ydGVyIGRpc3BsYXkgbmFtZXMuICovXG5cdHByaXZhdGUgbm9ybWFsaXplTW9kZWxOYW1lKG1vZGVsTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRpZiAoIW1vZGVsTmFtZSkgcmV0dXJuIFwidW5rbm93blwiO1xuXG5cdFx0Ly8gSGFuZGxlIEJlZHJvY2sgbW9kZWwgbmFtZXNcblx0XHRpZiAobW9kZWxOYW1lLnN0YXJ0c1dpdGgoXCJ1cy5hbnRocm9waWMuXCIpKSB7XG5cdFx0XHQvLyBDb252ZXJ0IFwidXMuYW50aHJvcGljLmNsYXVkZS0zLTUtc29ubmV0LTIwMjQxMDIyLXYxOjBcIiB0byBcImNsYXVkZS0zLTUtc29ubmV0LTIwMjQxMDIyXCJcblx0XHRcdGNvbnN0IG1hdGNoID0gbW9kZWxOYW1lLm1hdGNoKC91c1xcLmFudGhyb3BpY1xcLihbXjpdKykvKTtcblx0XHRcdGlmIChtYXRjaCAmJiBtYXRjaFsxXSkge1xuXHRcdFx0XHRyZXR1cm4gbWF0Y2hbMV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIGFzLWlzIGZvciBvdGhlciBmb3JtYXRzXG5cdFx0cmV0dXJuIG1vZGVsTmFtZTtcblx0fVxuXG5cdC8qKiBQcmV0dHktcHJpbnRzIGFuIG9iamVjdCBmb3IgdGhlIGA8cHJlPmAgYmxvY2suICovXG5cdHByaXZhdGUgZm9ybWF0SnNvbihvYmo6IGFueSk6IHN0cmluZyB7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIFN0cmluZyhvYmopO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBUb2dnbGVzIHRoZSBjb2xsYXBzaWJsZSBzZWN0aW9uIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgY2xpY2tlZCBoZWFkZXIuICovXG5cdHByaXZhdGUgdG9nZ2xlQ29udGVudChlOiBFdmVudCkge1xuXHRcdGNvbnN0IGhlYWRlciA9IGUuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcblx0XHRjb25zdCBjb250ZW50ID0gaGVhZGVyLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudDtcblx0XHRjb25zdCB0b2dnbGUgPSBoZWFkZXIucXVlcnlTZWxlY3RvcihcInNwYW46Zmlyc3QtY2hpbGRcIikgYXMgSFRNTEVsZW1lbnQ7XG5cblx0XHRpZiAoY29udGVudCAmJiB0b2dnbGUpIHtcblx0XHRcdGNvbnN0IGlzSGlkZGVuID0gY29udGVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJoaWRkZW5cIik7XG5cdFx0XHRjb250ZW50LmNsYXNzTGlzdC50b2dnbGUoXCJoaWRkZW5cIiwgIWlzSGlkZGVuKTtcblx0XHRcdHRvZ2dsZS50ZXh0Q29udGVudCA9IGlzSGlkZGVuID8gXCJbLV1cIiA6IFwiWytdXCI7XG5cdFx0fVxuXHR9XG59XG4iLCAiLyoqXG4gKiBAZmlsZSBKU09OIGRlYnVnIHZpZXcgZm9yIHByb2Nlc3NlZCBBUEkgcGFpcnMuXG4gKlxuICogUmVuZGVycyBlYWNoIG5vcm1hbGl6ZWQgcmVxdWVzdC9yZXNwb25zZSBwYWlyIGFzIGNvbGxhcHNpYmxlIHByZXR0eS1wcmludGVkXG4gKiBKU09OLCBpbmNsdWRpbmcgYSBub3RlIHdoZW4gdGhlIHJlc3BvbnNlIHdhcyByZWNvbnN0cnVjdGVkIGZyb20gU1NFIHN0cmVhbXMuXG4gKi9cblxuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gXCJsaXRcIjtcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSBcImxpdC9kZWNvcmF0b3JzLmpzXCI7XG5pbXBvcnQgeyBQcm9jZXNzZWRQYWlyIH0gZnJvbSBcIi4uLy4uLy4uL3NyYy9yZXBvcnQvc2hhcmVkLWNvbnZlcnNhdGlvbi1wcm9jZXNzb3JcIjtcblxuLyoqIEV4cGFuZGFibGUgSlNPTiBkdW1wIG9mIHtAbGluayBQcm9jZXNzZWRQYWlyfSByZXF1ZXN0IGFuZCByZXNwb25zZSBib2RpZXMuICovXG5AY3VzdG9tRWxlbWVudChcImpzb24tdmlld1wiKVxuZXhwb3J0IGNsYXNzIEpzb25WaWV3IGV4dGVuZHMgTGl0RWxlbWVudCB7XG5cdEBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pIHByb2Nlc3NlZFBhaXJzOiBQcm9jZXNzZWRQYWlyW10gPSBbXTtcblxuXHQvKiogTGlnaHQgRE9NIHNvIGdsb2JhbCBUYWlsd2luZCBjbGFzc2VzIGFwcGx5LiAqL1xuXHRjcmVhdGVSZW5kZXJSb290KCkge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqIFJlbmRlcnMgY29sbGFwc2libGUgcmVxdWVzdC9yZXNwb25zZSBKU09OIHNlY3Rpb25zIGZvciBlYWNoIHByb2Nlc3NlZCBwYWlyLiAqL1xuXHRyZW5kZXIoKSB7XG5cdFx0aWYgKHRoaXMucHJvY2Vzc2VkUGFpcnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwidGV4dC12cy1tdXRlZFwiPk5vIHByb2Nlc3NlZCBwYWlycyBmb3VuZC48L2Rpdj5gO1xuXHRcdH1cblxuXHRcdHJldHVybiBodG1sYFxuXHRcdFx0PGRpdj5cblx0XHRcdFx0JHt0aGlzLnByb2Nlc3NlZFBhaXJzLm1hcChcblx0XHRcdFx0XHQocGFpciwgaW5kZXgpID0+IGh0bWxgXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibXQtOCBmaXJzdDptdC0wXCI+XG5cdFx0XHRcdFx0XHRcdDwhLS0gUGFpciBIZWFkZXIgLS0+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJib3JkZXIgYm9yZGVyLXZzLWhpZ2hsaWdodCBwLTQgbWItMFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLWFzc2lzdGFudCBmb250LWJvbGRcIj4ke3BhaXIubW9kZWx9PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtdnMtbXV0ZWRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFBhaXIgJHtpbmRleCArIDF9IFx1MjAyMiAke3BhaXIuaXNTdHJlYW1pbmcgPyBcInN0cmVhbWluZ1wiIDogXCJub24tc3RyZWFtaW5nXCJ9IFx1MjAyMlxuXHRcdFx0XHRcdFx0XHRcdFx0JHtuZXcgRGF0ZShwYWlyLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKX1cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdFx0PCEtLSBSZXF1ZXN0IFNlY3Rpb24gLS0+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJweC00IG10LTRcIj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWItNFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzcz1cImN1cnNvci1wb2ludGVyIHRleHQtdnMtdXNlciBmb250LWJvbGQgaG92ZXI6dGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9yc1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdEBjbGljaz0keyhlOiBFdmVudCkgPT4gdGhpcy50b2dnbGVDb250ZW50KGUpfVxuXHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1yLTJcIj5bK108L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuPlJlcXVlc3QgKE1lc3NhZ2VDcmVhdGVQYXJhbXMpPC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGlkZGVuIG10LTJcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImJnLXZzLWJnLXNlY29uZGFyeSBwLTQgdGV4dC12cy10ZXh0IG92ZXJmbG93LXgtYXV0b1wiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxwcmUgY2xhc3M9XCJ3aGl0ZXNwYWNlLXByZSB0ZXh0LXZzLXRleHQgbS0wXCI+JHt0aGlzLmZvcm1hdEpzb24ocGFpci5yZXF1ZXN0KX08L3ByZT5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdFx0XHRcdDwhLS0gUmVzcG9uc2UgU2VjdGlvbiAtLT5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWItNFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzcz1cImN1cnNvci1wb2ludGVyIHRleHQtdnMtYXNzaXN0YW50IGZvbnQtYm9sZCBob3Zlcjp0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0QGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB0aGlzLnRvZ2dsZUNvbnRlbnQoZSl9XG5cdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibXItMlwiPlsrXTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4+UmVzcG9uc2UgKE1lc3NhZ2UpJHtwYWlyLmlzU3RyZWFtaW5nID8gXCIgLSBSZWNvbnN0cnVjdGVkIGZyb20gU1NFXCIgOiBcIlwifTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImhpZGRlbiBtdC0yXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJiZy12cy1iZy1zZWNvbmRhcnkgcC00IHRleHQtdnMtdGV4dCBvdmVyZmxvdy14LWF1dG9cIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8cHJlIGNsYXNzPVwid2hpdGVzcGFjZS1wcmUgdGV4dC12cy10ZXh0IG0tMFwiPiR7dGhpcy5mb3JtYXRKc29uKHBhaXIucmVzcG9uc2UpfTwvcHJlPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdGAsXG5cdFx0XHRcdCl9XG5cdFx0XHQ8L2Rpdj5cblx0XHRgO1xuXHR9XG5cblx0LyoqIFByZXR0eS1wcmludHMgYW4gb2JqZWN0OyByZXR1cm5zIGFuIGVycm9yIHN0cmluZyBvbiBjaXJjdWxhciByZWZlcmVuY2VzLiAqL1xuXHRwcml2YXRlIGZvcm1hdEpzb24ob2JqOiBhbnkpOiBzdHJpbmcge1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRyZXR1cm4gYEVycm9yIGZvcm1hdHRpbmcgSlNPTjogJHtlfWA7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFRvZ2dsZXMgdGhlIGNvbGxhcHNpYmxlIHNlY3Rpb24gaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBjbGlja2VkIGhlYWRlci4gKi9cblx0cHJpdmF0ZSB0b2dnbGVDb250ZW50KGU6IEV2ZW50KSB7XG5cdFx0Y29uc3QgaGVhZGVyID0gZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBoZWFkZXIubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50O1xuXHRcdGNvbnN0IHRvZ2dsZSA9IGhlYWRlci5xdWVyeVNlbGVjdG9yKFwic3BhbjpmaXJzdC1jaGlsZFwiKSBhcyBIVE1MRWxlbWVudDtcblxuXHRcdGlmIChjb250ZW50ICYmIHRvZ2dsZSkge1xuXHRcdFx0Y29uc3QgaXNIaWRkZW4gPSBjb250ZW50LmNsYXNzTGlzdC5jb250YWlucyhcImhpZGRlblwiKTtcblx0XHRcdGNvbnRlbnQuY2xhc3NMaXN0LnRvZ2dsZShcImhpZGRlblwiLCAhaXNIaWRkZW4pO1xuXHRcdFx0dG9nZ2xlLnRleHRDb250ZW50ID0gaXNIaWRkZW4gPyBcIlstXVwiIDogXCJbK11cIjtcblx0XHR9XG5cdH1cbn1cbiIsICIvKipcbiAqIEBmaWxlIEZyb250ZW5kIGVudHJ5IHBvaW50IGZvciB0aGUgc2VsZi1jb250YWluZWQgSFRNTCB0cmFjZSB2aWV3ZXIuXG4gKlxuICogSW5qZWN0cyBjb21waWxlZCBUYWlsd2luZCBDU1MsIHJlZ2lzdGVycyBMaXQgY2hpbGQgY29tcG9uZW50cywgYW5kIG1vdW50c1xuICoge0BsaW5rIENsYXVkZUFwcH0gb250byB0aGUgYCNhcHBgIGVsZW1lbnQgZW1iZWRkZWQgYnkgYHRlbXBsYXRlLmh0bWxgLlxuICovXG5cbmltcG9ydCB7IENsYXVkZUFwcCB9IGZyb20gXCIuL2FwcFwiO1xuaW1wb3J0IFwiLi9jb21wb25lbnRzL3NpbXBsZS1jb252ZXJzYXRpb24tdmlld1wiO1xuaW1wb3J0IFwiLi9jb21wb25lbnRzL3Jhdy1wYWlycy12aWV3XCI7XG5pbXBvcnQgXCIuL2NvbXBvbmVudHMvanNvbi12aWV3XCI7XG5cbi8vIEluamVjdGVkIGF0IGJ1aWxkIHRpbWUgYnkgdHN1cCB2aWEgdGhlIF9fQ1NTX0NPTlRFTlRfXyBkZWZpbmVcbmRlY2xhcmUgY29uc3QgX19DU1NfQ09OVEVOVF9fOiBzdHJpbmc7XG5jb25zdCBjc3MgPSBfX0NTU19DT05URU5UX187XG5pZiAoY3NzICYmIGNzcyAhPT0gXCJfX0NTU19DT05URU5UX19cIikge1xuXHRjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcblx0c3R5bGUudGV4dENvbnRlbnQgPSBjc3M7XG5cdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxuXG4vLyBJbml0aWFsaXplIHRoZSBhcHBsaWNhdGlvbiB3aGVuIERPTSBpcyByZWFkeVxuaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwibG9hZGluZ1wiKSB7XG5cdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGluaXRBcHApO1xufSBlbHNlIHtcblx0aW5pdEFwcCgpO1xufVxuXG4vKiogQ3JlYXRlcyBhbmQgYXBwZW5kcyB0aGUgcm9vdCBMaXQgYXBwbGljYXRpb24gZWxlbWVudC4gKi9cbmZ1bmN0aW9uIGluaXRBcHAoKSB7XG5cdGNvbnN0IGFwcCA9IG5ldyBDbGF1ZGVBcHAoKTtcblx0Y29uc3QgYXBwRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYXBwXCIpO1xuXHRpZiAoYXBwRWxlbWVudCkge1xuXHRcdGFwcEVsZW1lbnQuYXBwZW5kQ2hpbGQoYXBwKTtcblx0fSBlbHNlIHtcblx0XHRjb25zb2xlLmVycm9yKFwiQXBwIG1vdW50IHBvaW50IG5vdCBmb3VuZFwiKTtcblx0fVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs2T0E4RE8sSUFBTUEsR0FBdUIsS0FBc0IsQ0E2Q3hELElBQUksWUFBVSxDQUlaLE9BQVEsS0FBSyxPQUNWLFlBQ0wsQ0FDQSxZQUFZQyxFQUFrQixDQWpEOUIsS0FBQSxXQUFhLEdBQ2IsS0FBQSxpQkFBbUIsR0FDbkIsS0FBQSxpQkFBbUIsR0FDbkIsS0FBQSwyQkFBNkIsR0FDN0IsS0FBQSxTQUFXLEdBQ1gsS0FBQSxZQUFjLEdBQ2QsS0FBQSxhQUFlLEdBQ2YsS0FBQSxhQUFlLEdBQ2YsS0FBQSxZQUFjLEdBQ2QsS0FBQSxZQUFjLEdBQ2QsS0FBQSxnQkFBa0IsR0FDbEIsS0FBQSxhQUFlLEdBQ2YsS0FBQSxhQUFlLEdBQ2YsS0FBQSxhQUFlLEdBQ2YsS0FBQSxXQUFhLEdBQ2IsS0FBQSxZQUFjLEdBQ2QsS0FBQSxpQkFBbUIsR0FDbkIsS0FBQSxVQUFZLEdBQ1osS0FBQSxVQUFZLEdBQ1osS0FBQSxTQUFXLEdBQ1gsS0FBQSxVQUFZLEdBQ1osS0FBQSxjQUFnQixHQUNoQixLQUFBLG9CQUFzQixHQUN0QixLQUFBLGdCQUFrQixHQUNsQixLQUFBLGdCQUFrQixHQUNsQixLQUFBLGFBQWUsR0FDZixLQUFBLFlBQWMsR0FDZCxLQUFBLGFBQWUsR0FD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TyxZQUFjQyxFQUFXLE1BQVEsS0FDekMsQ0FDRCxDQUNELEVBeEY0QkMsRUFBQSxDQUExQkMsRUFBUyxDQUFFLEtBQU0sS0FBTSxDQUFDLEdBRGJaLEdBQ2UsOEJBRGZBLEdBQU5XLEVBQUEsQ0FETkUsRUFBYyxXQUFXLEdBQ2JiLElDQ2IsSUFBTWMsR0FBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBQ1osR0FBSUEsSUFBT0EsS0FBUSxrQkFBbUIsQ0FDckMsSUFBTUMsRUFBUSxTQUFTLGNBQWMsT0FBTyxFQUM1Q0EsRUFBTSxZQUFjRCxHQUNwQixTQUFTLEtBQUssWUFBWUMsQ0FBSyxDQUNoQyxDQUdJLFNBQVMsYUFBZSxVQUMzQixTQUFTLGlCQUFpQixtQkFBb0JDLEVBQU8sRUFFckRBLEdBQVEsRUFJVCxTQUFTQSxJQUFVLENBQ2xCLElBQU1DLEVBQU0sSUFBSUMsRUFDVkMsRUFBYSxTQUFTLGVBQWUsS0FBSyxFQUM1Q0EsRUFDSEEsRUFBVyxZQUFZRixDQUFHLEVBRTFCLFFBQVEsTUFBTSwyQkFBMkIsQ0FFM0MiLAogICJuYW1lcyI6IFsiRWxlbWVudEludGVybmFsc1NoaW0iLCAiX2hvc3QiLCAiaXNDYXB0dXJlRXZlbnRMaXN0ZW5lciIsICJvcHRpb25zIiwgIkV2ZW50VGFyZ2V0U2hpbSIsICJ0eXBlIiwgImNhbGxiYWNrIiwgIm9wdGlvbnMiLCAiZXZlbnRMaXN0ZW5lcnNNYXAiLCAiaXNDYXB0dXJlRXZlbnRMaXN0ZW5lciIsICJldmVudExpc3RlbmVycyIsICJub3JtYWxpemVkT3B0aW9ucyIsICJldmVudCIsICJjb21wb3NlZFBhdGgiLCAicGFyZW50IiwgInN0b3BQcm9wYWdhdGlvbiIsICJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCAiZXZlbnRQaGFzZSIsICJ0YXJnZXQiLCAidG1wVGFyZ2V0IiwgImN1cnJlbnRUYXJnZXQiLCAib3JpZ2luYWxTdG9wUHJvcGFnYXRpb24iLCAib3JpZ2luYWxTdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCAiZW51bWVyYWJsZVByb3BlcnR5IiwgImludm9rZUV2ZW50TGlzdGVuZXIiLCAibGlzdGVuZXIiLCAiZXZlbnRMaXN0ZW5lck1hcCIsICJmaW5pc2hEaXNwYXRjaCIsICJjYXB0dXJlRXZlbnRQYXRoIiwgInJldGFyZ2V0IiwgImV2ZW50VGFyZ2V0cyIsICJldmVudFRhcmdldCIsICJjYXB0dXJlRXZlbnRMaXN0ZW5lcnMiLCAiYnViYmxlRXZlbnRQYXRoIiwgIkV2ZW50VGFyZ2V0U2hpbVdpdGhSZWFsVHlwZSIsICJlbnVtZXJhYmxlUHJvcGVydHkiLCAiRXZlbnRTaGltIiwgIl9hIiwgInR5cGUiLCAib3B0aW9ucyIsICJfRXZlbnRfY2FuY2VsYWJsZSIsICJfRXZlbnRfYnViYmxlcyIsICJfRXZlbnRfY29tcG9zZWQiLCAiX0V2ZW50X2RlZmF1bHRQcmV2ZW50ZWQiLCAiX0V2ZW50X3RpbWVzdGFtcCIsICJfRXZlbnRfcHJvcGFnYXRpb25TdG9wcGVkIiwgIl9FdmVudF90eXBlIiwgIl9FdmVudF90YXJnZXQiLCAiX0V2ZW50X2lzQmVpbmdEaXNwYXRjaGVkIiwgImJ1YmJsZXMiLCAiY2FuY2VsYWJsZSIsICJjb21wb3NlZCIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0IiwgIl90eXBlIiwgIl9idWJibGVzIiwgIl9jYW5jZWxhYmxlIiwgIl9fY2xhc3NQcml2YXRlRmllbGRHZXQiLCAidmFsdWUiLCAiQ3VzdG9tRXZlbnRTaGltIiwgIl9iIiwgIl9DdXN0b21FdmVudF9kZXRhaWwiLCAiX2RldGFpbCIsICJFdmVudFNoaW1XaXRoUmVhbFR5cGUiLCAiQ3VzdG9tRXZlbnRTaGltV2l0aFJlYWxUeXBlIiwgIkV2ZW50U2hpbVdpdGhSZWFsVHlwZSIsICJDdXN0b21FdmVudFNoaW1XaXRoUmVhbFR5cGUiLCAiYXR0cmlidXRlcyIsICJhdHRyaWJ1dGVzRm9yRWxlbWVudCIsICJlbGVtZW50IiwgImF0dHJzIiwgIkVsZW1lbnRTaGltIiwgIkV2ZW50VGFyZ2V0U2hpbVdpdGhSZWFsVHlwZSIsICJuYW1lIiwgInZhbHVlIiwgImZvcmNlIiwgImluaXQiLCAic2hhZG93Um9vdCIsICJpbnRlcm5hbHMiLCAiRWxlbWVudEludGVybmFsc1NoaW0iLCAiSFRNTEVsZW1lbnRTaGltIiwgIkVsZW1lbnRTaGltIiwgIkhUTUxFbGVtZW50U2hpbVdpdGhSZWFsVHlwZSIsICJIVE1MRWxlbWVudFNoaW1XaXRoUmVhbFR5cGUiLCAiQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbSIsICJuYW1lIiwgImN0b3IiLCAiQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbVdpdGhSZWFsVHlwZSIsICJjdXN0b21FbGVtZW50cyIsICJDdXN0b21FbGVtZW50UmVnaXN0cnlTaGltV2l0aFJlYWxUeXBlIiwgImdsb2JhbCIsICJnbG9iYWxUaGlzIiwgInN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0cyIsICJTaGFkb3dSb290IiwgIlNoYWR5Q1NTIiwgIm5hdGl2ZVNoYWRvdyIsICJEb2N1bWVudCIsICJwcm90b3R5cGUiLCAiQ1NTU3R5bGVTaGVldCIsICJjb25zdHJ1Y3Rpb25Ub2tlbiIsICJTeW1ib2wiLCAiY3NzVGFnQ2FjaGUiLCAiV2Vha01hcCIsICJDU1NSZXN1bHQiLCAiY3NzVGV4dCIsICJzdHJpbmdzIiwgInNhZmVUb2tlbiIsICJ0aGlzIiwgIkVycm9yIiwgIl9zdHJpbmdzIiwgInN0eWxlU2hlZXQiLCAiX3N0eWxlU2hlZXQiLCAiY2FjaGVhYmxlIiwgImxlbmd0aCIsICJnZXQiLCAicmVwbGFjZVN5bmMiLCAic2V0IiwgInRvU3RyaW5nIiwgInVuc2FmZUNTUyIsICJ2YWx1ZSIsICJTdHJpbmciLCAiYWRvcHRTdHlsZXMiLCAicmVuZGVyUm9vdCIsICJzdHlsZXMiLCAic3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzIiwgImFkb3B0ZWRTdHlsZVNoZWV0cyIsICJtYXAiLCAicyIsICJDU1NTdHlsZVNoZWV0IiwgInN0eWxlU2hlZXQiLCAic3R5bGUiLCAiZG9jdW1lbnQiLCAiY3JlYXRlRWxlbWVudCIsICJub25jZSIsICJnbG9iYWwiLCAic2V0QXR0cmlidXRlIiwgInRleHRDb250ZW50IiwgImNzc1RleHQiLCAiYXBwZW5kQ2hpbGQiLCAiZ2V0Q29tcGF0aWJsZVN0eWxlIiwgInNoZWV0IiwgInJ1bGUiLCAiY3NzUnVsZXMiLCAidW5zYWZlQ1NTIiwgImlzIiwgImRlZmluZVByb3BlcnR5IiwgImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsICJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwgImdldE93blByb3BlcnR5U3ltYm9scyIsICJnZXRQcm90b3R5cGVPZiIsICJPYmplY3QiLCAiZ2xvYmFsIiwgImdsb2JhbFRoaXMiLCAiY3VzdG9tRWxlbWVudHMiLCAidHJ1c3RlZFR5cGVzIiwgImVtcHR5U3RyaW5nRm9yQm9vbGVhbkF0dHJpYnV0ZSIsICJlbXB0eVNjcmlwdCIsICJwb2x5ZmlsbFN1cHBvcnQiLCAicmVhY3RpdmVFbGVtZW50UG9seWZpbGxTdXBwb3J0IiwgIkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkiLCAicHJvcCIsICJfb2JqIiwgImRlZmF1bHRDb252ZXJ0ZXIiLCAidmFsdWUiLCAidHlwZSIsICJCb29sZWFuIiwgIkFycmF5IiwgIkpTT04iLCAic3RyaW5naWZ5IiwgImZyb21WYWx1ZSIsICJOdW1iZXIiLCAicGFyc2UiLCAiZSIsICJub3RFcXVhbCIsICJvbGQiLCAiZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb24iLCAiYXR0cmlidXRlIiwgIlN0cmluZyIsICJjb252ZXJ0ZXIiLCAicmVmbGVjdCIsICJ1c2VEZWZhdWx0IiwgImhhc0NoYW5nZWQiLCAiU3ltYm9sIiwgIm1ldGFkYXRhIiwgImxpdFByb3BlcnR5TWV0YWRhdGEiLCAiV2Vha01hcCIsICJSZWFjdGl2ZUVsZW1lbnQiLCAiSFRNTEVsZW1lbnQiLCAiaW5pdGlhbGl6ZXIiLCAidGhpcyIsICJfX3ByZXBhcmUiLCAiX2luaXRpYWxpemVycyIsICJwdXNoIiwgIm9ic2VydmVkQXR0cmlidXRlcyIsICJmaW5hbGl6ZSIsICJfX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAiLCAia2V5cyIsICJuYW1lIiwgIm9wdGlvbnMiLCAic3RhdGUiLCAicHJvdG90eXBlIiwgImhhc093blByb3BlcnR5IiwgImNyZWF0ZSIsICJ3cmFwcGVkIiwgImVsZW1lbnRQcm9wZXJ0aWVzIiwgInNldCIsICJub0FjY2Vzc29yIiwgImtleSIsICJkZXNjcmlwdG9yIiwgImdldFByb3BlcnR5RGVzY3JpcHRvciIsICJnZXQiLCAidiIsICJvbGRWYWx1ZSIsICJjYWxsIiwgInJlcXVlc3RVcGRhdGUiLCAiY29uZmlndXJhYmxlIiwgImVudW1lcmFibGUiLCAic3VwZXJDdG9yIiwgIk1hcCIsICJmaW5hbGl6ZWQiLCAicHJvcHMiLCAicHJvcGVydGllcyIsICJwcm9wS2V5cyIsICJwIiwgImNyZWF0ZVByb3BlcnR5IiwgImF0dHIiLCAiX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkiLCAiZWxlbWVudFN0eWxlcyIsICJmaW5hbGl6ZVN0eWxlcyIsICJzdHlsZXMiLCAiaXNBcnJheSIsICJTZXQiLCAiZmxhdCIsICJJbmZpbml0eSIsICJyZXZlcnNlIiwgInMiLCAidW5zaGlmdCIsICJnZXRDb21wYXRpYmxlU3R5bGUiLCAidG9Mb3dlckNhc2UiLCAiY29uc3RydWN0b3IiLCAic3VwZXIiLCAiX19pbnN0YW5jZVByb3BlcnRpZXMiLCAiaXNVcGRhdGVQZW5kaW5nIiwgImhhc1VwZGF0ZWQiLCAiX19yZWZsZWN0aW5nUHJvcGVydHkiLCAiX19pbml0aWFsaXplIiwgIl9fdXBkYXRlUHJvbWlzZSIsICJQcm9taXNlIiwgInJlcyIsICJlbmFibGVVcGRhdGluZyIsICJfJGNoYW5nZWRQcm9wZXJ0aWVzIiwgIl9fc2F2ZUluc3RhbmNlUHJvcGVydGllcyIsICJmb3JFYWNoIiwgImkiLCAiY29udHJvbGxlciIsICJfX2NvbnRyb2xsZXJzIiwgImFkZCIsICJyZW5kZXJSb290IiwgImlzQ29ubmVjdGVkIiwgImhvc3RDb25uZWN0ZWQiLCAiZGVsZXRlIiwgImluc3RhbmNlUHJvcGVydGllcyIsICJzaXplIiwgImNyZWF0ZVJlbmRlclJvb3QiLCAic2hhZG93Um9vdCIsICJhdHRhY2hTaGFkb3ciLCAic2hhZG93Um9vdE9wdGlvbnMiLCAiYWRvcHRTdHlsZXMiLCAiY29ubmVjdGVkQ2FsbGJhY2siLCAiYyIsICJfcmVxdWVzdGVkVXBkYXRlIiwgImRpc2Nvbm5lY3RlZENhbGxiYWNrIiwgImhvc3REaXNjb25uZWN0ZWQiLCAiX29sZCIsICJfJGF0dHJpYnV0ZVRvUHJvcGVydHkiLCAiYXR0clZhbHVlIiwgInRvQXR0cmlidXRlIiwgInJlbW92ZUF0dHJpYnV0ZSIsICJzZXRBdHRyaWJ1dGUiLCAiY3RvciIsICJwcm9wTmFtZSIsICJnZXRQcm9wZXJ0eU9wdGlvbnMiLCAiZnJvbUF0dHJpYnV0ZSIsICJfX2RlZmF1bHRWYWx1ZXMiLCAibmV3VmFsdWUiLCAiaGFzQXR0cmlidXRlIiwgIl8kY2hhbmdlUHJvcGVydHkiLCAiX19lbnF1ZXVlVXBkYXRlIiwgImluaXRpYWxpemVWYWx1ZSIsICJoYXMiLCAiX19yZWZsZWN0aW5nUHJvcGVydGllcyIsICJyZWplY3QiLCAicmVzdWx0IiwgInNjaGVkdWxlVXBkYXRlIiwgInBlcmZvcm1VcGRhdGUiLCAic2hvdWxkVXBkYXRlIiwgImNoYW5nZWRQcm9wZXJ0aWVzIiwgIndpbGxVcGRhdGUiLCAiaG9zdFVwZGF0ZSIsICJ1cGRhdGUiLCAiX19tYXJrVXBkYXRlZCIsICJfJGRpZFVwZGF0ZSIsICJfY2hhbmdlZFByb3BlcnRpZXMiLCAiaG9zdFVwZGF0ZWQiLCAiZmlyc3RVcGRhdGVkIiwgInVwZGF0ZWQiLCAidXBkYXRlQ29tcGxldGUiLCAiZ2V0VXBkYXRlQ29tcGxldGUiLCAiX19wcm9wZXJ0eVRvQXR0cmlidXRlIiwgIm1vZGUiLCAicmVhY3RpdmVFbGVtZW50VmVyc2lvbnMiLCAiZ2xvYmFsIiwgImdsb2JhbFRoaXMiLCAidHJ1c3RlZFR5cGVzIiwgInBvbGljeSIsICJjcmVhdGVQb2xpY3kiLCAiY3JlYXRlSFRNTCIsICJzIiwgImJvdW5kQXR0cmlidXRlU3VmZml4IiwgIm1hcmtlciIsICJNYXRoIiwgInJhbmRvbSIsICJ0b0ZpeGVkIiwgInNsaWNlIiwgIm1hcmtlck1hdGNoIiwgIm5vZGVNYXJrZXIiLCAiZCIsICJkb2N1bWVudCIsICJjcmVhdGVUcmVlV2Fsa2VyIiwgImNyZWF0ZU1hcmtlciIsICJjcmVhdGVDb21tZW50IiwgImlzUHJpbWl0aXZlIiwgInZhbHVlIiwgImlzQXJyYXkiLCAiQXJyYXkiLCAiaXNJdGVyYWJsZSIsICJTeW1ib2wiLCAiaXRlcmF0b3IiLCAiU1BBQ0VfQ0hBUiIsICJ0ZXh0RW5kUmVnZXgiLCAiY29tbWVudEVuZFJlZ2V4IiwgImNvbW1lbnQyRW5kUmVnZXgiLCAidGFnRW5kUmVnZXgiLCAiUmVnRXhwIiwgInNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4IiwgImRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4IiwgInJhd1RleHRFbGVtZW50IiwgInRhZyIsICJ0eXBlIiwgInN0cmluZ3MiLCAidmFsdWVzIiwgIl8kbGl0VHlwZSQiLCAiaHRtbCIsICJzdmciLCAibWF0aG1sIiwgIm5vQ2hhbmdlIiwgImZvciIsICJub3RoaW5nIiwgInRlbXBsYXRlQ2FjaGUiLCAiV2Vha01hcCIsICJ3YWxrZXIiLCAidHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmciLCAidHNhIiwgInN0cmluZ0Zyb21UU0EiLCAiaGFzT3duUHJvcGVydHkiLCAiRXJyb3IiLCAiZ2V0VGVtcGxhdGVIdG1sIiwgImwiLCAibGVuZ3RoIiwgImF0dHJOYW1lcyIsICJyYXdUZXh0RW5kUmVnZXgiLCAicmVnZXgiLCAiaSIsICJhdHRyTmFtZSIsICJtYXRjaCIsICJhdHRyTmFtZUVuZEluZGV4IiwgImxhc3RJbmRleCIsICJleGVjIiwgInRlc3QiLCAiZW5kIiwgInN0YXJ0c1dpdGgiLCAicHVzaCIsICJUZW1wbGF0ZSIsICJjb25zdHJ1Y3RvciIsICJvcHRpb25zIiwgIm5vZGUiLCAidGhpcyIsICJwYXJ0cyIsICJub2RlSW5kZXgiLCAiYXR0ck5hbWVJbmRleCIsICJwYXJ0Q291bnQiLCAiZWwiLCAiY3JlYXRlRWxlbWVudCIsICJjdXJyZW50Tm9kZSIsICJjb250ZW50IiwgIndyYXBwZXIiLCAiZmlyc3RDaGlsZCIsICJyZXBsYWNlV2l0aCIsICJjaGlsZE5vZGVzIiwgIm5leHROb2RlIiwgIm5vZGVUeXBlIiwgImhhc0F0dHJpYnV0ZXMiLCAibmFtZSIsICJnZXRBdHRyaWJ1dGVOYW1lcyIsICJlbmRzV2l0aCIsICJyZWFsTmFtZSIsICJzdGF0aWNzIiwgImdldEF0dHJpYnV0ZSIsICJzcGxpdCIsICJtIiwgImluZGV4IiwgImN0b3IiLCAiUHJvcGVydHlQYXJ0IiwgIkJvb2xlYW5BdHRyaWJ1dGVQYXJ0IiwgIkV2ZW50UGFydCIsICJBdHRyaWJ1dGVQYXJ0IiwgInJlbW92ZUF0dHJpYnV0ZSIsICJ0YWdOYW1lIiwgInRleHRDb250ZW50IiwgImVtcHR5U2NyaXB0IiwgImFwcGVuZCIsICJkYXRhIiwgImluZGV4T2YiLCAiX29wdGlvbnMiLCAiaW5uZXJIVE1MIiwgInJlc29sdmVEaXJlY3RpdmUiLCAicGFydCIsICJwYXJlbnQiLCAiYXR0cmlidXRlSW5kZXgiLCAiY3VycmVudERpcmVjdGl2ZSIsICJfX2RpcmVjdGl2ZXMiLCAiX19kaXJlY3RpdmUiLCAibmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yIiwgIl8kaW5pdGlhbGl6ZSIsICJfJHJlc29sdmUiLCAiVGVtcGxhdGVJbnN0YW5jZSIsICJ0ZW1wbGF0ZSIsICJfJHBhcnRzIiwgIl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiIsICJfJHRlbXBsYXRlIiwgIl8kcGFyZW50IiwgInBhcmVudE5vZGUiLCAiXyRpc0Nvbm5lY3RlZCIsICJmcmFnbWVudCIsICJjcmVhdGlvblNjb3BlIiwgImltcG9ydE5vZGUiLCAicGFydEluZGV4IiwgInRlbXBsYXRlUGFydCIsICJDaGlsZFBhcnQiLCAibmV4dFNpYmxpbmciLCAiRWxlbWVudFBhcnQiLCAiXyRzZXRWYWx1ZSIsICJfX2lzQ29ubmVjdGVkIiwgInN0YXJ0Tm9kZSIsICJlbmROb2RlIiwgIl8kY29tbWl0dGVkVmFsdWUiLCAiXyRzdGFydE5vZGUiLCAiXyRlbmROb2RlIiwgImlzQ29ubmVjdGVkIiwgImRpcmVjdGl2ZVBhcmVudCIsICJfJGNsZWFyIiwgIl9jb21taXRUZXh0IiwgIl9jb21taXRUZW1wbGF0ZVJlc3VsdCIsICJfY29tbWl0Tm9kZSIsICJfY29tbWl0SXRlcmFibGUiLCAiaW5zZXJ0QmVmb3JlIiwgIl9pbnNlcnQiLCAiY3JlYXRlVGV4dE5vZGUiLCAicmVzdWx0IiwgIl8kZ2V0VGVtcGxhdGUiLCAiaCIsICJfdXBkYXRlIiwgImluc3RhbmNlIiwgIl9jbG9uZSIsICJnZXQiLCAic2V0IiwgIml0ZW1QYXJ0cyIsICJpdGVtUGFydCIsICJpdGVtIiwgInN0YXJ0IiwgImZyb20iLCAiXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZCIsICJuIiwgInJlbW92ZSIsICJlbGVtZW50IiwgImZpbGwiLCAiU3RyaW5nIiwgInZhbHVlSW5kZXgiLCAibm9Db21taXQiLCAiY2hhbmdlIiwgInYiLCAiX2NvbW1pdFZhbHVlIiwgInNldEF0dHJpYnV0ZSIsICJ0b2dnbGVBdHRyaWJ1dGUiLCAic3VwZXIiLCAibmV3TGlzdGVuZXIiLCAib2xkTGlzdGVuZXIiLCAic2hvdWxkUmVtb3ZlTGlzdGVuZXIiLCAiY2FwdHVyZSIsICJvbmNlIiwgInBhc3NpdmUiLCAic2hvdWxkQWRkTGlzdGVuZXIiLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciIsICJhZGRFdmVudExpc3RlbmVyIiwgImV2ZW50IiwgImNhbGwiLCAiaG9zdCIsICJoYW5kbGVFdmVudCIsICJwb2x5ZmlsbFN1cHBvcnQiLCAiZ2xvYmFsIiwgImxpdEh0bWxQb2x5ZmlsbFN1cHBvcnQiLCAiVGVtcGxhdGUiLCAiQ2hpbGRQYXJ0IiwgImxpdEh0bWxWZXJzaW9ucyIsICJwdXNoIiwgInJlbmRlciIsICJ2YWx1ZSIsICJjb250YWluZXIiLCAib3B0aW9ucyIsICJwYXJ0T3duZXJOb2RlIiwgInJlbmRlckJlZm9yZSIsICJwYXJ0IiwgImVuZE5vZGUiLCAiaW5zZXJ0QmVmb3JlIiwgImNyZWF0ZU1hcmtlciIsICJfJHNldFZhbHVlIiwgImdsb2JhbCIsICJnbG9iYWxUaGlzIiwgIkxpdEVsZW1lbnQiLCAiUmVhY3RpdmVFbGVtZW50IiwgImNvbnN0cnVjdG9yIiwgInRoaXMiLCAicmVuZGVyT3B0aW9ucyIsICJob3N0IiwgIl9fY2hpbGRQYXJ0IiwgImNyZWF0ZVJlbmRlclJvb3QiLCAicmVuZGVyUm9vdCIsICJzdXBlciIsICJyZW5kZXJCZWZvcmUiLCAiZmlyc3RDaGlsZCIsICJjaGFuZ2VkUHJvcGVydGllcyIsICJ2YWx1ZSIsICJyZW5kZXIiLCAiaGFzVXBkYXRlZCIsICJpc0Nvbm5lY3RlZCIsICJ1cGRhdGUiLCAiY29ubmVjdGVkQ2FsbGJhY2siLCAic2V0Q29ubmVjdGVkIiwgImRpc2Nvbm5lY3RlZENhbGxiYWNrIiwgIm5vQ2hhbmdlIiwgImxpdEVsZW1lbnRIeWRyYXRlU3VwcG9ydCIsICJwb2x5ZmlsbFN1cHBvcnQiLCAibGl0RWxlbWVudFBvbHlmaWxsU3VwcG9ydCIsICJnbG9iYWwiLCAibGl0RWxlbWVudFZlcnNpb25zIiwgInB1c2giLCAiY3VzdG9tRWxlbWVudCIsICJ0YWdOYW1lIiwgImNsYXNzT3JUYXJnZXQiLCAiY29udGV4dCIsICJhZGRJbml0aWFsaXplciIsICJjdXN0b21FbGVtZW50cyIsICJkZWZpbmUiLCAiZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb24iLCAiYXR0cmlidXRlIiwgInR5cGUiLCAiU3RyaW5nIiwgImNvbnZlcnRlciIsICJkZWZhdWx0Q29udmVydGVyIiwgInJlZmxlY3QiLCAiaGFzQ2hhbmdlZCIsICJub3RFcXVhbCIsICJzdGFuZGFyZFByb3BlcnR5IiwgIm9wdGlvbnMiLCAidGFyZ2V0IiwgImNvbnRleHQiLCAia2luZCIsICJtZXRhZGF0YSIsICJwcm9wZXJ0aWVzIiwgImdsb2JhbFRoaXMiLCAibGl0UHJvcGVydHlNZXRhZGF0YSIsICJnZXQiLCAic2V0IiwgIk1hcCIsICJPYmplY3QiLCAiY3JlYXRlIiwgIndyYXBwZWQiLCAibmFtZSIsICJ2IiwgIm9sZFZhbHVlIiwgImNhbGwiLCAidGhpcyIsICJyZXF1ZXN0VXBkYXRlIiwgIl8kY2hhbmdlUHJvcGVydHkiLCAidmFsdWUiLCAiRXJyb3IiLCAicHJvcGVydHkiLCAicHJvdG9PclRhcmdldCIsICJuYW1lT3JDb250ZXh0IiwgInByb3RvIiwgImhhc093blByb3BlcnR5IiwgImNvbnN0cnVjdG9yIiwgImNyZWF0ZVByb3BlcnR5IiwgImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsICJzdGF0ZSIsICJvcHRpb25zIiwgInByb3BlcnR5IiwgImF0dHJpYnV0ZSIsICJpbmZlckFwaUZvcm1hdEZyb21VcmwiLCAidXJsIiwgImluZmVyQXBpRm9ybWF0RnJvbUJvZHkiLCAiYm9keSIsICJyZWNvcmQiLCAiYmxvY2siLCAibXNnIiwgIkFQSV9GT1JNQVRfTEFCRUxTIiwgImZvcm1hdEFwaUZvcm1hdExhYmVsIiwgImZvcm1hdCIsICJmb3JtYXRBcGlGb3JtYXRzRGlzcGxheSIsICJmb3JtYXRzIiwgInVuaXF1ZSIsICJkZXRlY3RBcGlGb3JtYXQiLCAicGFpciIsICJyZXNwb25zZSIsICJ1cmxGb3JtYXQiLCAicmVxdWVzdEJvZHlGb3JtYXQiLCAiZW1wdHlVc2FnZSIsICJURVhUX1BBUlRfVFlQRVMiLCAibm9ybWFsaXplVGV4dFBhcnRzIiwgInZhbHVlIiwgInBhcnQiLCAidG9UZXh0QmxvY2tzIiwgImNvbnRlbnQiLCAibWFwT3BlbkFJVG9vbHMiLCAidG9vbHMiLCAibWFwcGVkIiwgInRvb2wiLCAiZmxhdCIsICJuZXN0ZWQiLCAibm9ybWFsaXplT3BlbkFJQ2hhdFJlcXVlc3QiLCAiYm9keSIsICJyZXEiLCAic3lzdGVtIiwgIm1lc3NhZ2VzIiwgIm1zZyIsICJibG9ja3MiLCAidG9vbENvbnRlbnQiLCAiYiIsICJ0ZXh0QmxvY2tzIiwgImJsb2NrIiwgImNhbGwiLCAicGFyc2VkSW5wdXQiLCAicmVzcG9uc2VzSW5wdXRUb0NvbnRlbnQiLCAiaXRlbSIsICJzdW1tYXJ5VGV4dCIsICJub3JtYWxpemVPcGVuQUlSZXNwb25zZXNSZXF1ZXN0IiwgInJvbGUiLCAib3BlbkFJTWVzc2FnZVRvQW50aHJvcGljIiwgIm1lc3NhZ2UiLCAibW9kZWwiLCAicGFyc2VPcGVuQUlDaGF0Q29tcGxldGlvbkJvZHkiLCAiY29tcGxldGlvbiIsICJjaG9pY2VNZXNzYWdlIiwgImZpbmlzaFJlYXNvbiIsICJwYXJzZVJlc3BvbnNlc091dHB1dEl0ZW0iLCAicGFyc2VPcGVuQUlSZXNwb25zZXNCb2R5IiwgInJlc3BvbnNlIiwgImhhc1Rvb2xVc2UiLCAicGFyc2VTU0VEYXRhTGluZXMiLCAiYm9keVJhdyIsICJjaHVua3MiLCAibGluZXMiLCAibGluZSIsICJkYXRhIiwgImJ1aWxkT3BlbkFJQ2hhdENvbXBsZXRpb25Gcm9tU1NFIiwgInJlc3VsdCIsICJ0b29sQ2FsbHMiLCAiY2h1bmsiLCAiY2hvaWNlIiwgImRlbHRhIiwgInRjIiwgImluZGV4IiwgImV4aXN0aW5nIiwgImEiLCAiYnVpbGRPcGVuQUlSZXNwb25zZXNGcm9tU1NFIiwgInRleHQiLCAiZnVuY3Rpb25DYWxscyIsICJyZWNvcmQiLCAidHlwZSIsICJpdGVtSWQiLCAiY29tcGxldGVkIiwgImZpcnN0Q29udGVudCIsICJwYXJzZU9wZW5BSVJlc3BvbnNlIiwgInBhaXJSZXNwb25zZSIsICJhcGlGb3JtYXQiLCAiYnVpbHQiLCAibm9ybWFsaXplT3BlbkFJUmVxdWVzdCIsICJyZXNvbHZlUGFpckFwaUZvcm1hdCIsICJwYWlyIiwgImZyb21SZXNwb25zZSIsICJkZXRlY3RBcGlGb3JtYXQiLCAiZXh0cmFjdE1vZGVsRnJvbVBhaXIiLCAiYWdncmVnYXRlVXNhZ2VGcm9tUGFpcnMiLCAicGFpcnMiLCAic29ydGVkUGFpcnMiLCAiYSIsICJiIiwgImxhc3RVc2FnZSIsICJsYXN0VHVybklucHV0VG9rZW5zIiwgImxhc3RUdXJuT3V0cHV0VG9rZW5zIiwgInNlc3Npb25PdXRwdXRUb2tlbnMiLCAic3VtIiwgInBhaXIiLCAiU2hhcmVkQ29udmVyc2F0aW9uUHJvY2Vzc29yIiwgInJhd1BhaXJzIiwgInByb2Nlc3NlZFBhaXJzIiwgImkiLCAiYXBpRm9ybWF0IiwgInJlc29sdmVQYWlyQXBpRm9ybWF0IiwgImlzT3BlbkFJRm9ybWF0IiwgImlzU3RyZWFtaW5nIiwgInJlc3BvbnNlIiwgInN0cmVhbUZvcm1hdCIsICJyZXF1ZXN0IiwgIm5vcm1hbGl6ZU9wZW5BSVJlcXVlc3QiLCAicGFyc2VPcGVuQUlSZXNwb25zZSIsICJleHRyYWN0TW9kZWxGcm9tUGFpciIsICJtb2RlbCIsICJlcnJvciIsICJib2R5UmF3IiwgImV2ZW50cyIsICJiZWRyb2NrTWV0cmljcyIsICJqc29uQ2h1bmtzIiwgImpzb25DaHVuayIsICJldmVudFBheWxvYWQiLCAiYmFzZTY0RGF0YSIsICJkZWNvZGVkSnNvbiIsICJldmVudCIsICJjaHVua0Vycm9yIiwgInBhdHRlcm4iLCAic2VhcmNoSW5kZXgiLCAicGF0dGVybkluZGV4IiwgImpzb25TdGFydEluZGV4IiwgImJyYWNlQ291bnQiLCAianNvbkVuZEluZGV4IiwgImNoYXIiLCAibWV0cmljc01hdGNoIiwgImxpbmVzIiwgImxpbmUiLCAiZGF0YSIsICJlIiwgIm1lc3NhZ2UiLCAiY29udGVudEJsb2NrcyIsICJjdXJyZW50QmxvY2tJbmRleCIsICJibG9jayIsICJkZWx0YSIsICJ0b29sQmxvY2siLCAiY3VycmVudElucHV0VG9rZW5zIiwgInVybE1hdGNoIiwgIm1vZGVsTmFtZSIsICJtYXRjaCIsICJvcHRpb25zIiwgInBhaXJzQnlTeXN0ZW0iLCAic3lzdGVtIiwgInN5c3RlbUtleSIsICJhbGxDb252ZXJzYXRpb25zIiwgInN5c3RlbVBhaXJzIiwgImNvbnZlcnNhdGlvblRocmVhZHMiLCAibWVzc2FnZXMiLCAiZmlyc3RVc2VyTWVzc2FnZSIsICJub3JtYWxpemVkRmlyc3RNZXNzYWdlIiwgImNvbnZlcnNhdGlvbktleSIsICJrZXlIYXNoIiwgInRocmVhZFBhaXJzIiwgInNvcnRlZFRocmVhZFBhaXJzIiwgImZpbmFsUGFpciIsICJsb25nZXN0IiwgImN1cnJlbnQiLCAiY3VycmVudE1lc3NhZ2VzIiwgImxvbmdlc3RNZXNzYWdlcyIsICJtb2RlbHNVc2VkIiwgImVuaGFuY2VkTWVzc2FnZXMiLCAiYXBpRm9ybWF0RGlzcGxheSIsICJmb3JtYXRBcGlGb3JtYXRzRGlzcGxheSIsICJ1c2FnZSIsICJjb252ZXJzYXRpb24iLCAibWVyZ2VkQ29udmVyc2F0aW9ucyIsICJjb252IiwgInBlbmRpbmdUb29sVXNlcyIsICJlbmhhbmNlZE1lc3NhZ2UiLCAiaGFzT25seVRvb2xSZXN1bHRzIiwgImhhc1RleHRDb250ZW50IiwgImoiLCAidG9vbFVzZSIsICJ0b29sUmVzdWx0IiwgInRvb2xVc2VJZCIsICJtZXNzYWdlSW5kZXgiLCAiY29udmVyc2F0aW9ucyIsICJzb3J0ZWRDb252ZXJzYXRpb25zIiwgInVzZWRDb252ZXJzYXRpb25zIiwgImN1cnJlbnRDb252IiwgIm9yaWdpbmFsQ29udiIsICJvcmlnaW5hbEluZGV4IiwgIm90aGVyQ29udiIsICJtZXNzYWdlc01hdGNoIiwgImsiLCAibWVyZ2VkQ29udiIsICJjb21wYWN0Q29udiIsICJvcmlnaW5hbE1lc3NhZ2VzIiwgIm1lcmdlZE1lc3NhZ2VzIiwgImFsbFBhaXJzIiwgImFsbE1vZGVscyIsICJzdGFydFRpbWUiLCAiZW5kVGltZSIsICJtc2cxIiwgIm1zZzIiLCAiY29udGVudDEiLCAiY29udGVudDIiLCAibm9ybWFsaXplZENvbnRlbnQiLCAidGV4dCIsICJzdHIiLCAiaGFzaCIsICJDbGF1ZGVBcHAiLCAiaSIsICJzdGFydCIsICJwcm9jZXNzb3IiLCAiU2hhcmVkQ29udmVyc2F0aW9uUHJvY2Vzc29yIiwgImluY2x1ZGVBbGxSZXF1ZXN0cyIsICJjb252ZXJzYXRpb25Nb2RlbHMiLCAiYyIsICJwcm9jZXNzZWRQYWlyTW9kZWxzIiwgInAiLCAicmF3UGFpck1vZGVscyIsICJwYWlyIiwgImFsbE1vZGVscyIsICJ2aWV3IiwgIm1vZGVsIiwgIm5ld1NlbGVjdGVkTW9kZWxzIiwgImNvdW50cyIsICJ0b29sIiwgIm1vZGVsQ291bnRzIiwgImZpbHRlcmVkQ29udmVyc2F0aW9ucyIsICJ4IiwgIl9jb3VudCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiciIsICJ0IiwgIlBhcnRUeXBlIiwgIkFUVFJJQlVURSIsICJDSElMRCIsICJQUk9QRVJUWSIsICJCT09MRUFOX0FUVFJJQlVURSIsICJFVkVOVCIsICJFTEVNRU5UIiwgImRpcmVjdGl2ZSIsICJjIiwgInZhbHVlcyIsICJfJGxpdERpcmVjdGl2ZSQiLCAiRGlyZWN0aXZlIiwgIl9wYXJ0SW5mbyIsICJfJGlzQ29ubmVjdGVkIiwgInRoaXMiLCAiXyRwYXJlbnQiLCAicGFydCIsICJwYXJlbnQiLCAiYXR0cmlidXRlSW5kZXgiLCAiX19wYXJ0IiwgIl9fYXR0cmlidXRlSW5kZXgiLCAicHJvcHMiLCAidXBkYXRlIiwgIl9wYXJ0IiwgInJlbmRlciIsICJVbnNhZmVIVE1MRGlyZWN0aXZlIiwgIkRpcmVjdGl2ZSIsICJwYXJ0SW5mbyIsICJzdXBlciIsICJ0aGlzIiwgIl92YWx1ZSIsICJub3RoaW5nIiwgInR5cGUiLCAiUGFydFR5cGUiLCAiQ0hJTEQiLCAiRXJyb3IiLCAiY29uc3RydWN0b3IiLCAiZGlyZWN0aXZlTmFtZSIsICJ2YWx1ZSIsICJfdGVtcGxhdGVSZXN1bHQiLCAibm9DaGFuZ2UiLCAic3RyaW5ncyIsICJyYXciLCAiXyRsaXRUeXBlJCIsICJyZXN1bHRUeXBlIiwgInZhbHVlcyIsICJ1bnNhZmVIVE1MIiwgImRpcmVjdGl2ZSIsICJEaWZmIiwgIm9sZFN0ciIsICJuZXdTdHIiLCAib3B0aW9ucyIsICJjYWxsYmFjayIsICJvbGRTdHJpbmciLCAibmV3U3RyaW5nIiwgIm9sZFRva2VucyIsICJuZXdUb2tlbnMiLCAiX2EiLCAiZG9uZSIsICJ2YWx1ZSIsICJuZXdMZW4iLCAib2xkTGVuIiwgImVkaXRMZW5ndGgiLCAibWF4RWRpdExlbmd0aCIsICJtYXhFeGVjdXRpb25UaW1lIiwgImFib3J0QWZ0ZXJUaW1lc3RhbXAiLCAiYmVzdFBhdGgiLCAibmV3UG9zIiwgIm1pbkRpYWdvbmFsVG9Db25zaWRlciIsICJtYXhEaWFnb25hbFRvQ29uc2lkZXIiLCAiZXhlY0VkaXRMZW5ndGgiLCAiZGlhZ29uYWxQYXRoIiwgImJhc2VQYXRoIiwgInJlbW92ZVBhdGgiLCAiYWRkUGF0aCIsICJjYW5BZGQiLCAiYWRkUGF0aE5ld1BvcyIsICJjYW5SZW1vdmUiLCAiZXhlYyIsICJyZXQiLCAicGF0aCIsICJhZGRlZCIsICJyZW1vdmVkIiwgIm9sZFBvc0luYyIsICJsYXN0IiwgIm9sZFBvcyIsICJjb21tb25Db3VudCIsICJsZWZ0IiwgInJpZ2h0IiwgImFycmF5IiwgImkiLCAiY2hhcnMiLCAiY2hhbmdlT2JqZWN0cyIsICJsYXN0Q29tcG9uZW50IiwgImNvbXBvbmVudHMiLCAibmV4dENvbXBvbmVudCIsICJjb21wb25lbnRMZW4iLCAiY29tcG9uZW50UG9zIiwgImNvbXBvbmVudCIsICJvbGRWYWx1ZSIsICJMaW5lRGlmZiIsICJEaWZmIiwgInRva2VuaXplIiwgImxlZnQiLCAicmlnaHQiLCAib3B0aW9ucyIsICJsaW5lRGlmZiIsICJkaWZmTGluZXMiLCAib2xkU3RyIiwgIm5ld1N0ciIsICJ0b2tlbml6ZSIsICJ2YWx1ZSIsICJvcHRpb25zIiwgInJldExpbmVzIiwgImxpbmVzQW5kTmV3bGluZXMiLCAiaSIsICJsaW5lIiwgIl9nZXREZWZhdWx0cyIsICJfZGVmYXVsdHMiLCAiY2hhbmdlRGVmYXVsdHMiLCAibmV3RGVmYXVsdHMiLCAiZXNjYXBlVGVzdCIsICJlc2NhcGVSZXBsYWNlIiwgImVzY2FwZVRlc3ROb0VuY29kZSIsICJlc2NhcGVSZXBsYWNlTm9FbmNvZGUiLCAiZXNjYXBlUmVwbGFjZW1lbnRzIiwgImdldEVzY2FwZVJlcGxhY2VtZW50IiwgImNoIiwgImVzY2FwZSIsICJodG1sIiwgImVuY29kZSIsICJ1bmVzY2FwZVRlc3QiLCAidW5lc2NhcGUiLCAiXyIsICJuIiwgImNhcmV0IiwgImVkaXQiLCAicmVnZXgiLCAib3B0IiwgInNvdXJjZSIsICJvYmoiLCAibmFtZSIsICJ2YWwiLCAidmFsU291cmNlIiwgImNsZWFuVXJsIiwgImhyZWYiLCAibm9vcFRlc3QiLCAic3BsaXRDZWxscyIsICJ0YWJsZVJvdyIsICJjb3VudCIsICJyb3ciLCAibWF0Y2giLCAib2Zmc2V0IiwgInN0ciIsICJlc2NhcGVkIiwgImN1cnIiLCAiY2VsbHMiLCAiaSIsICJydHJpbSIsICJjIiwgImludmVydCIsICJsIiwgInN1ZmZMZW4iLCAiY3VyckNoYXIiLCAiZmluZENsb3NpbmdCcmFja2V0IiwgImIiLCAibGV2ZWwiLCAib3V0cHV0TGluayIsICJjYXAiLCAibGluayIsICJyYXciLCAibGV4ZXIiLCAidGl0bGUiLCAidGV4dCIsICJ0b2tlbiIsICJpbmRlbnRDb2RlQ29tcGVuc2F0aW9uIiwgIm1hdGNoSW5kZW50VG9Db2RlIiwgImluZGVudFRvQ29kZSIsICJub2RlIiwgIm1hdGNoSW5kZW50SW5Ob2RlIiwgImluZGVudEluTm9kZSIsICJfVG9rZW5pemVyIiwgIm9wdGlvbnMiLCAic3JjIiwgInRyaW1tZWQiLCAidG9wIiwgInRva2VucyIsICJidWxsIiwgImlzb3JkZXJlZCIsICJsaXN0IiwgIml0ZW1SZWdleCIsICJpdGVtQ29udGVudHMiLCAiZW5kc1dpdGhCbGFua0xpbmUiLCAiZW5kRWFybHkiLCAibGluZSIsICJ0IiwgIm5leHRMaW5lIiwgImluZGVudCIsICJibGFua0xpbmUiLCAibmV4dEJ1bGxldFJlZ2V4IiwgImhyUmVnZXgiLCAiZmVuY2VzQmVnaW5SZWdleCIsICJoZWFkaW5nQmVnaW5SZWdleCIsICJyYXdMaW5lIiwgImlzdGFzayIsICJpc2NoZWNrZWQiLCAic3BhY2VycyIsICJoYXNNdWx0aXBsZUxpbmVCcmVha3MiLCAidGFnIiwgImhlYWRlcnMiLCAiYWxpZ25zIiwgInJvd3MiLCAiaXRlbSIsICJhbGlnbiIsICJoZWFkZXIiLCAiY2VsbCIsICJ0cmltbWVkVXJsIiwgInJ0cmltU2xhc2giLCAibGFzdFBhcmVuSW5kZXgiLCAibGlua0xlbiIsICJsaW5rcyIsICJsaW5rU3RyaW5nIiwgIm1hc2tlZFNyYyIsICJwcmV2Q2hhciIsICJsTGVuZ3RoIiwgInJEZWxpbSIsICJyTGVuZ3RoIiwgImRlbGltVG90YWwiLCAibWlkRGVsaW1Ub3RhbCIsICJlbmRSZWciLCAibGFzdENoYXJMZW5ndGgiLCAiaGFzTm9uU3BhY2VDaGFycyIsICJoYXNTcGFjZUNoYXJzT25Cb3RoRW5kcyIsICJwcmV2Q2FwWmVybyIsICJuZXdsaW5lIiwgImJsb2NrQ29kZSIsICJmZW5jZXMiLCAiaHIiLCAiaGVhZGluZyIsICJidWxsZXQiLCAibGhlYWRpbmciLCAiX3BhcmFncmFwaCIsICJibG9ja1RleHQiLCAiX2Jsb2NrTGFiZWwiLCAiZGVmIiwgIl90YWciLCAiX2NvbW1lbnQiLCAicGFyYWdyYXBoIiwgImJsb2NrcXVvdGUiLCAiYmxvY2tOb3JtYWwiLCAiZ2ZtVGFibGUiLCAiYmxvY2tHZm0iLCAiYmxvY2tQZWRhbnRpYyIsICJpbmxpbmVDb2RlIiwgImJyIiwgImlubGluZVRleHQiLCAiX3B1bmN0dWF0aW9uIiwgInB1bmN0dWF0aW9uIiwgImJsb2NrU2tpcCIsICJlbVN0cm9uZ0xEZWxpbSIsICJlbVN0cm9uZ1JEZWxpbUFzdCIsICJlbVN0cm9uZ1JEZWxpbVVuZCIsICJhbnlQdW5jdHVhdGlvbiIsICJhdXRvbGluayIsICJfaW5saW5lQ29tbWVudCIsICJfaW5saW5lTGFiZWwiLCAicmVmbGluayIsICJub2xpbmsiLCAicmVmbGlua1NlYXJjaCIsICJpbmxpbmVOb3JtYWwiLCAiaW5saW5lUGVkYW50aWMiLCAiaW5saW5lR2ZtIiwgImlubGluZUJyZWFrcyIsICJibG9jayIsICJpbmxpbmUiLCAiX0xleGVyIiwgIl9fTGV4ZXIiLCAicnVsZXMiLCAibmV4dCIsICJsZWFkaW5nIiwgInRhYnMiLCAibGFzdFRva2VuIiwgImN1dFNyYyIsICJsYXN0UGFyYWdyYXBoQ2xpcHBlZCIsICJleHRUb2tlbml6ZXIiLCAic3RhcnRJbmRleCIsICJ0ZW1wU3JjIiwgInRlbXBTdGFydCIsICJnZXRTdGFydEluZGV4IiwgImVyck1zZyIsICJrZWVwUHJldkNoYXIiLCAiX1JlbmRlcmVyIiwgImNvZGUiLCAiaW5mb3N0cmluZyIsICJsYW5nIiwgInF1b3RlIiwgImJvZHkiLCAib3JkZXJlZCIsICJzdGFydCIsICJ0eXBlIiwgInN0YXJ0YXR0IiwgInRhc2siLCAiY2hlY2tlZCIsICJjb250ZW50IiwgImZsYWdzIiwgImNsZWFuSHJlZiIsICJvdXQiLCAiX1RleHRSZW5kZXJlciIsICJfUGFyc2VyIiwgIl9fUGFyc2VyIiwgImdlbmVyaWNUb2tlbiIsICJyZXQiLCAiaGVhZGluZ1Rva2VuIiwgImNvZGVUb2tlbiIsICJ0YWJsZVRva2VuIiwgImoiLCAiayIsICJibG9ja3F1b3RlVG9rZW4iLCAibGlzdFRva2VuIiwgImxvb3NlIiwgIml0ZW1Cb2R5IiwgImNoZWNrYm94IiwgImh0bWxUb2tlbiIsICJwYXJhZ3JhcGhUb2tlbiIsICJ0ZXh0VG9rZW4iLCAicmVuZGVyZXIiLCAiZXNjYXBlVG9rZW4iLCAidGFnVG9rZW4iLCAibGlua1Rva2VuIiwgImltYWdlVG9rZW4iLCAic3Ryb25nVG9rZW4iLCAiZW1Ub2tlbiIsICJjb2Rlc3BhblRva2VuIiwgImRlbFRva2VuIiwgIl9Ib29rcyIsICJtYXJrZG93biIsICJNYXJrZWQiLCAiI3BhcnNlTWFya2Rvd24iLCAiYXJncyIsICJjYWxsYmFjayIsICJ2YWx1ZXMiLCAiY2hpbGRUb2tlbnMiLCAiZXh0ZW5zaW9ucyIsICJwYWNrIiwgIm9wdHMiLCAiZXh0IiwgInByZXZSZW5kZXJlciIsICJleHRMZXZlbCIsICJwcm9wIiwgInJlbmRlcmVyUHJvcCIsICJyZW5kZXJlckZ1bmMiLCAidG9rZW5pemVyIiwgInRva2VuaXplclByb3AiLCAidG9rZW5pemVyRnVuYyIsICJwcmV2VG9rZW5pemVyIiwgImhvb2tzIiwgImhvb2tzUHJvcCIsICJob29rc0Z1bmMiLCAicHJldkhvb2siLCAiYXJnIiwgIndhbGtUb2tlbnMiLCAicGFja1dhbGt0b2tlbnMiLCAicGFyc2VyIiwgIm9yaWdPcHQiLCAidGhyb3dFcnJvciIsICIjb25FcnJvciIsICJlIiwgInNpbGVudCIsICJhc3luYyIsICJtc2ciLCAibWFya2VkSW5zdGFuY2UiLCAibWFya2VkIiwgInNldE9wdGlvbnMiLCAidXNlIiwgInBhcnNlSW5saW5lIiwgInBhcnNlciIsICJfUGFyc2VyIiwgImxleGVyIiwgIl9MZXhlciIsICJtYXJrZWQiLCAiZXNjYXBlSHRtbCIsICJ0ZXh0IiwgIm1hcmtkb3duVG9IdG1sIiwgIm1hcmtkb3duIiwgImVzY2FwZWRNYXJrZG93biIsICJlcnJvciIsICJTaW1wbGVDb252ZXJzYXRpb25WaWV3IiwgImkiLCAiZSIsICJvcHRpb25zIiwgInR5cGUiLCAidGFyZ2V0U2VsZWN0b3IiLCAidG9nZ2xlU2VsZWN0b3IiLCAiY3VzdG9tSGFuZGxlciIsICJjdXJyZW50RWxlbWVudCIsICJmdWxsQ29udGVudCIsICJ0YXJnZXQiLCAidG9nZ2xlIiwgImlzSGlkZGVuIiwgInRoaW5raW5nIiwgImNvbnRlbnQiLCAieCIsICJvIiwgIm1hcmtkb3duVG9IdG1sIiwgInRvb2xSZXN1bHRzIiwgImJsb2NrIiwgInRoaW5raW5nQmxvY2siLCAidG9vbFJlc3VsdCIsICJjdXN0b21Db250ZW50IiwgInRhZ05hbWUiLCAiZXNjYXBlZFBhdHRlcm4iLCAicmF3UGF0dGVybiIsICJibG9ja3MiLCAicmVnZXgiLCAibWF0Y2giLCAicmVtYWluaW5nIiwgInZhcmlhbnRzIiwgInRyaW1tZWQiLCAib3BlbiIsICJjbG9zZSIsICJsYXN0Q2xvc2UiLCAiYWZ0ZXIiLCAidGl0bGUiLCAiaW5kZXgiLCAic2VjdGlvbnMiLCAiYWZ0ZXJFeHRyZW1lbHlJbXBvcnRhbnQiLCAiYWZ0ZXJTeXN0ZW1SZW1pbmRlciIsICJtZXNzYWdlIiwgInRhZyIsICJleHRyYWN0ZWQiLCAiY29kZXhDb250ZXh0U2VjdGlvbnMiLCAiYWZ0ZXJDb2RleENvbnRleHQiLCAiZXh0cmVtZWx5SW1wb3J0YW50QmxvY2tzIiwgInN5c3RlbVJlbWluZGVyQmxvY2tzIiwgIm1haW5Db250ZW50IiwgInN5c3RlbSIsICJ0ZXh0Q29udGVudCIsICJyZXNwb25zZSIsICJ0b29sTmFtZSIsICJwYXJhbVZhbHVlIiwgInBhcmFtTmFtZSIsICJwYXJhbXMiLCAic3RyIiwgImRpdiIsICJ1c2VQcmVGb3JtYXR0aW5nIiwgImlzRXhwYW5kZWQiLCAidGl0bGVDbGFzc2VzIiwgImNvbnRhaW5lckNsYXNzZXMiLCAiY291bnQiLCAiZXhwYW5kZWRDbGFzcyIsICJ0b2dnbGVTeW1ib2wiLCAiZGlzcGxheVRpdGxlIiwgInRvb2xVc2UiLCAiaW5wdXQiLCAiaWdub3JlU3RyIiwgInAiLCAiZmlsZU5hbWUiLCAiZWRpdENvdW50IiwgImNlbGxOdW0iLCAibW9kZSIsICJ0b2RvcyIsICJ0b2RvIiwgInN0YXR1c0NsYXNzIiwgImVkaXRzIiwgImVkaXQiLCAib2xkU3RyIiwgIm5ld1N0ciIsICJkaWZmTGluZXMiLCAiaXNDb2xsYXBzaWJsZSIsICJpc0NvbGxhcHNlZCIsICJpc0NsaWNrVG9FeHBhbmQiLCAiY29udGVudERpdiIsICJoZWFkZXJDbGFzc2VzIiwgImNvbnRlbnRDbGFzc2VzIiwgImxpbmVzIiwgInByZXZpZXciLCAiaGFzTW9yZSIsICJkaWZmIiwgInBhcnQiLCAibGluZSIsICJ2YWx1ZSIsICJjb252ZXJzYXRpb24iLCAibWV0YWRhdGEiLCAibGFzdEluIiwgInNlc3Npb25PdXQiLCAicGFydHMiLCAiY2FjaGVSZWFkIiwgImNhY2hlV3JpdGUiLCAidG9rZW5Vc2FnZSIsICJ0b29scyIsICJ0b29sIiwgImRlc2NyaXB0aW9uIiwgInNjaGVtYSIsICJwYXJhbURlZiIsICJkZWYiLCAicmVxdWlyZWQiLCAiZGVzYyIsICJtc2dJbmRleCIsICJfX2RlY29yYXRlQ2xhc3MiLCAibiIsICJ0IiwgIlJhd1BhaXJzVmlldyIsICJpIiwgIngiLCAidmFsaWRQYWlycyIsICJwYWlyIiwgImluZGV4IiwgImUiLCAidXJsIiwgInVybE1hdGNoIiwgIm1vZGVsTmFtZSIsICJtYXRjaCIsICJvYmoiLCAiaGVhZGVyIiwgImNvbnRlbnQiLCAidG9nZ2xlIiwgImlzSGlkZGVuIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJuIiwgInQiLCAiSnNvblZpZXciLCAiaSIsICJ4IiwgInBhaXIiLCAiaW5kZXgiLCAiZSIsICJvYmoiLCAiaGVhZGVyIiwgImNvbnRlbnQiLCAidG9nZ2xlIiwgImlzSGlkZGVuIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJuIiwgInQiLCAiY3NzIiwgInN0eWxlIiwgImluaXRBcHAiLCAiYXBwIiwgIkNsYXVkZUFwcCIsICJhcHBFbGVtZW50Il0KfQo=