@cybrid/cybrid-api-bank-angular 0.123.152 → 0.123.153

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 (299) hide show
  1. package/README.md +2 -2
  2. package/esm2020/api/accounts.service.mjs +2 -2
  3. package/esm2020/api/assets.service.mjs +2 -2
  4. package/esm2020/api/banks.service.mjs +2 -2
  5. package/esm2020/api/counterparties.service.mjs +2 -2
  6. package/esm2020/api/customers.service.mjs +2 -2
  7. package/esm2020/api/depositAddresses.service.mjs +2 -2
  8. package/esm2020/api/depositBankAccounts.service.mjs +2 -2
  9. package/esm2020/api/externalBankAccounts.service.mjs +2 -2
  10. package/esm2020/api/externalWallets.service.mjs +2 -2
  11. package/esm2020/api/identityVerifications.service.mjs +2 -2
  12. package/esm2020/api/invoices.service.mjs +2 -2
  13. package/esm2020/api/paymentInstructions.service.mjs +2 -2
  14. package/esm2020/api/prices.service.mjs +2 -2
  15. package/esm2020/api/quotes.service.mjs +2 -2
  16. package/esm2020/api/symbols.service.mjs +2 -2
  17. package/esm2020/api/trades.service.mjs +2 -2
  18. package/esm2020/api/transfers.service.mjs +2 -2
  19. package/esm2020/api/workflows.service.mjs +2 -2
  20. package/esm2020/model/account.mjs +2 -2
  21. package/esm2020/model/accountList.mjs +1 -1
  22. package/esm2020/model/accountState.mjs +2 -2
  23. package/esm2020/model/accountType.mjs +2 -2
  24. package/esm2020/model/activityLimit.mjs +2 -2
  25. package/esm2020/model/activityType.mjs +2 -2
  26. package/esm2020/model/asset.mjs +2 -2
  27. package/esm2020/model/assetList.mjs +1 -1
  28. package/esm2020/model/assetTypes.mjs +2 -2
  29. package/esm2020/model/bank.mjs +1 -1
  30. package/esm2020/model/bankFeature.mjs +2 -2
  31. package/esm2020/model/bankList.mjs +1 -1
  32. package/esm2020/model/bankSupportedPayoutSymbolsInner.mjs +2 -2
  33. package/esm2020/model/bankType.mjs +2 -2
  34. package/esm2020/model/complianceCheck.mjs +2 -2
  35. package/esm2020/model/complianceCheckOutcome.mjs +2 -2
  36. package/esm2020/model/complianceCheckType.mjs +2 -2
  37. package/esm2020/model/complianceDecision.mjs +2 -2
  38. package/esm2020/model/complianceDecisionState.mjs +2 -2
  39. package/esm2020/model/complianceDecisionType.mjs +2 -2
  40. package/esm2020/model/counterparty.mjs +1 -1
  41. package/esm2020/model/counterpartyAddress.mjs +2 -2
  42. package/esm2020/model/counterpartyAliasesInner.mjs +2 -2
  43. package/esm2020/model/counterpartyList.mjs +1 -1
  44. package/esm2020/model/counterpartyName.mjs +2 -2
  45. package/esm2020/model/counterpartyState.mjs +2 -2
  46. package/esm2020/model/counterpartyType.mjs +2 -2
  47. package/esm2020/model/customer.mjs +1 -1
  48. package/esm2020/model/customerAddress.mjs +2 -2
  49. package/esm2020/model/customerAliasesInner.mjs +2 -2
  50. package/esm2020/model/customerList.mjs +1 -1
  51. package/esm2020/model/customerName.mjs +2 -2
  52. package/esm2020/model/customerState.mjs +2 -2
  53. package/esm2020/model/customerType.mjs +2 -2
  54. package/esm2020/model/depositAddress.mjs +2 -2
  55. package/esm2020/model/depositAddressFormat.mjs +2 -2
  56. package/esm2020/model/depositAddressList.mjs +1 -1
  57. package/esm2020/model/depositAddressState.mjs +2 -2
  58. package/esm2020/model/depositBankAccount.mjs +1 -1
  59. package/esm2020/model/depositBankAccountAccountDetailsInner.mjs +2 -2
  60. package/esm2020/model/depositBankAccountCounterpartyAddress.mjs +2 -2
  61. package/esm2020/model/depositBankAccountList.mjs +1 -1
  62. package/esm2020/model/depositBankAccountRoutingDetailsInner.mjs +2 -2
  63. package/esm2020/model/depositBankAccountRoutingNumberType.mjs +2 -2
  64. package/esm2020/model/depositBankAccountState.mjs +2 -2
  65. package/esm2020/model/errorResponse.mjs +2 -2
  66. package/esm2020/model/externalBankAccount.mjs +1 -1
  67. package/esm2020/model/externalBankAccountBalances.mjs +2 -2
  68. package/esm2020/model/externalBankAccountKind.mjs +2 -2
  69. package/esm2020/model/externalBankAccountList.mjs +1 -1
  70. package/esm2020/model/externalBankAccountPiiInner.mjs +1 -1
  71. package/esm2020/model/externalBankAccountPiiInnerAddressesInner.mjs +2 -2
  72. package/esm2020/model/externalBankAccountPiiInnerRoutingDetailsInner.mjs +2 -2
  73. package/esm2020/model/externalBankAccountState.mjs +2 -2
  74. package/esm2020/model/externalWallet.mjs +2 -2
  75. package/esm2020/model/externalWalletEnvironment.mjs +2 -2
  76. package/esm2020/model/externalWalletList.mjs +1 -1
  77. package/esm2020/model/externalWalletState.mjs +2 -2
  78. package/esm2020/model/identificationNumber.mjs +2 -2
  79. package/esm2020/model/identityVerification.mjs +1 -1
  80. package/esm2020/model/identityVerificationList.mjs +1 -1
  81. package/esm2020/model/identityVerificationMethod.mjs +2 -2
  82. package/esm2020/model/identityVerificationOutcome.mjs +2 -2
  83. package/esm2020/model/identityVerificationPersonaState.mjs +2 -2
  84. package/esm2020/model/identityVerificationState.mjs +2 -2
  85. package/esm2020/model/identityVerificationType.mjs +2 -2
  86. package/esm2020/model/identityVerificationWithDetails.mjs +1 -1
  87. package/esm2020/model/identityVerificationWithDetailsPii.mjs +1 -1
  88. package/esm2020/model/identityVerificationWithDetailsPiiAddress.mjs +2 -2
  89. package/esm2020/model/identityVerificationWithDetailsPiiName.mjs +2 -2
  90. package/esm2020/model/invoice.mjs +2 -2
  91. package/esm2020/model/invoiceList.mjs +1 -1
  92. package/esm2020/model/patchBank.mjs +2 -2
  93. package/esm2020/model/patchCustomer.mjs +2 -2
  94. package/esm2020/model/patchExternalBankAccount.mjs +2 -2
  95. package/esm2020/model/paymentInstruction.mjs +2 -2
  96. package/esm2020/model/paymentInstructionList.mjs +1 -1
  97. package/esm2020/model/postAccount.mjs +2 -2
  98. package/esm2020/model/postBank.mjs +2 -2
  99. package/esm2020/model/postCounterparty.mjs +1 -1
  100. package/esm2020/model/postCounterpartyAddress.mjs +2 -2
  101. package/esm2020/model/postCounterpartyAliasesInner.mjs +2 -2
  102. package/esm2020/model/postCounterpartyName.mjs +2 -2
  103. package/esm2020/model/postCustomer.mjs +1 -1
  104. package/esm2020/model/postCustomerAddress.mjs +2 -2
  105. package/esm2020/model/postCustomerName.mjs +2 -2
  106. package/esm2020/model/postDepositAddress.mjs +2 -2
  107. package/esm2020/model/postDepositBankAccount.mjs +2 -2
  108. package/esm2020/model/postExternalBankAccount.mjs +1 -1
  109. package/esm2020/model/postExternalBankAccountCounterpartyAddress.mjs +2 -2
  110. package/esm2020/model/postExternalBankAccountCounterpartyBankAccount.mjs +2 -2
  111. package/esm2020/model/postExternalBankAccountCounterpartyName.mjs +2 -2
  112. package/esm2020/model/postExternalWallet.mjs +2 -2
  113. package/esm2020/model/postFee.mjs +2 -2
  114. package/esm2020/model/postIdentificationNumber.mjs +2 -2
  115. package/esm2020/model/postIdentityVerification.mjs +1 -1
  116. package/esm2020/model/postIdentityVerificationAddress.mjs +2 -2
  117. package/esm2020/model/postIdentityVerificationName.mjs +2 -2
  118. package/esm2020/model/postInvoice.mjs +2 -2
  119. package/esm2020/model/postPaymentInstruction.mjs +2 -2
  120. package/esm2020/model/postQuote.mjs +1 -1
  121. package/esm2020/model/postQuoteEntry.mjs +2 -2
  122. package/esm2020/model/postTrade.mjs +2 -2
  123. package/esm2020/model/postTransfer.mjs +1 -1
  124. package/esm2020/model/postTransferParticipant.mjs +2 -2
  125. package/esm2020/model/postWorkflow.mjs +2 -2
  126. package/esm2020/model/quote.mjs +1 -1
  127. package/esm2020/model/quoteEntry.mjs +1 -1
  128. package/esm2020/model/quoteEntryDestinationAccount.mjs +2 -2
  129. package/esm2020/model/quoteEntrySourceAccount.mjs +2 -2
  130. package/esm2020/model/quoteList.mjs +1 -1
  131. package/esm2020/model/quoteSide.mjs +2 -2
  132. package/esm2020/model/quoteType.mjs +2 -2
  133. package/esm2020/model/symbolPrice.mjs +2 -2
  134. package/esm2020/model/trade.mjs +2 -2
  135. package/esm2020/model/tradeFailureCode.mjs +2 -2
  136. package/esm2020/model/tradeList.mjs +1 -1
  137. package/esm2020/model/tradeSide.mjs +2 -2
  138. package/esm2020/model/tradeState.mjs +2 -2
  139. package/esm2020/model/tradeType.mjs +2 -2
  140. package/esm2020/model/transfer.mjs +1 -1
  141. package/esm2020/model/transferAccountType.mjs +2 -2
  142. package/esm2020/model/transferDestinationAccount.mjs +2 -2
  143. package/esm2020/model/transferEntry.mjs +1 -1
  144. package/esm2020/model/transferEntryDestinationAccount.mjs +2 -2
  145. package/esm2020/model/transferFailureCode.mjs +2 -2
  146. package/esm2020/model/transferList.mjs +1 -1
  147. package/esm2020/model/transferParticipant.mjs +2 -2
  148. package/esm2020/model/transferSide.mjs +2 -2
  149. package/esm2020/model/transferSourceAccount.mjs +2 -2
  150. package/esm2020/model/transferState.mjs +2 -2
  151. package/esm2020/model/transferType.mjs +2 -2
  152. package/esm2020/model/workflow.mjs +2 -2
  153. package/esm2020/model/workflowState.mjs +2 -2
  154. package/esm2020/model/workflowType.mjs +2 -2
  155. package/esm2020/model/workflowWithDetails.mjs +1 -1
  156. package/esm2020/model/workflowWithDetailsAllOf.mjs +2 -2
  157. package/esm2020/model/workflowsList.mjs +1 -1
  158. package/fesm2015/cybrid-cybrid-api-bank-angular.mjs +71 -71
  159. package/fesm2015/cybrid-cybrid-api-bank-angular.mjs.map +1 -1
  160. package/fesm2020/cybrid-cybrid-api-bank-angular.mjs +120 -120
  161. package/fesm2020/cybrid-cybrid-api-bank-angular.mjs.map +1 -1
  162. package/model/account.d.ts +1 -1
  163. package/model/accountList.d.ts +1 -1
  164. package/model/accountState.d.ts +1 -1
  165. package/model/accountType.d.ts +1 -1
  166. package/model/activityLimit.d.ts +1 -1
  167. package/model/activityType.d.ts +1 -1
  168. package/model/asset.d.ts +1 -1
  169. package/model/assetList.d.ts +1 -1
  170. package/model/assetTypes.d.ts +1 -1
  171. package/model/bank.d.ts +1 -1
  172. package/model/bankFeature.d.ts +1 -1
  173. package/model/bankList.d.ts +1 -1
  174. package/model/bankSupportedPayoutSymbolsInner.d.ts +1 -1
  175. package/model/bankType.d.ts +1 -1
  176. package/model/complianceCheck.d.ts +1 -1
  177. package/model/complianceCheckOutcome.d.ts +1 -1
  178. package/model/complianceCheckType.d.ts +1 -1
  179. package/model/complianceDecision.d.ts +1 -1
  180. package/model/complianceDecisionState.d.ts +1 -1
  181. package/model/complianceDecisionType.d.ts +1 -1
  182. package/model/counterparty.d.ts +1 -1
  183. package/model/counterpartyAddress.d.ts +1 -1
  184. package/model/counterpartyAliasesInner.d.ts +1 -1
  185. package/model/counterpartyList.d.ts +1 -1
  186. package/model/counterpartyName.d.ts +1 -1
  187. package/model/counterpartyState.d.ts +1 -1
  188. package/model/counterpartyType.d.ts +1 -1
  189. package/model/customer.d.ts +1 -1
  190. package/model/customerAddress.d.ts +1 -1
  191. package/model/customerAliasesInner.d.ts +1 -1
  192. package/model/customerList.d.ts +1 -1
  193. package/model/customerName.d.ts +1 -1
  194. package/model/customerState.d.ts +1 -1
  195. package/model/customerType.d.ts +1 -1
  196. package/model/depositAddress.d.ts +1 -1
  197. package/model/depositAddressFormat.d.ts +1 -1
  198. package/model/depositAddressList.d.ts +1 -1
  199. package/model/depositAddressState.d.ts +1 -1
  200. package/model/depositBankAccount.d.ts +1 -1
  201. package/model/depositBankAccountAccountDetailsInner.d.ts +1 -1
  202. package/model/depositBankAccountCounterpartyAddress.d.ts +1 -1
  203. package/model/depositBankAccountList.d.ts +1 -1
  204. package/model/depositBankAccountRoutingDetailsInner.d.ts +1 -1
  205. package/model/depositBankAccountRoutingNumberType.d.ts +1 -1
  206. package/model/depositBankAccountState.d.ts +1 -1
  207. package/model/errorResponse.d.ts +1 -1
  208. package/model/externalBankAccount.d.ts +1 -1
  209. package/model/externalBankAccountBalances.d.ts +1 -1
  210. package/model/externalBankAccountKind.d.ts +1 -1
  211. package/model/externalBankAccountList.d.ts +1 -1
  212. package/model/externalBankAccountPiiInner.d.ts +1 -1
  213. package/model/externalBankAccountPiiInnerAddressesInner.d.ts +1 -1
  214. package/model/externalBankAccountPiiInnerRoutingDetailsInner.d.ts +1 -1
  215. package/model/externalBankAccountState.d.ts +1 -1
  216. package/model/externalWallet.d.ts +1 -1
  217. package/model/externalWalletEnvironment.d.ts +1 -1
  218. package/model/externalWalletList.d.ts +1 -1
  219. package/model/externalWalletState.d.ts +1 -1
  220. package/model/identificationNumber.d.ts +1 -1
  221. package/model/identityVerification.d.ts +1 -1
  222. package/model/identityVerificationList.d.ts +1 -1
  223. package/model/identityVerificationMethod.d.ts +1 -1
  224. package/model/identityVerificationOutcome.d.ts +1 -1
  225. package/model/identityVerificationPersonaState.d.ts +1 -1
  226. package/model/identityVerificationState.d.ts +1 -1
  227. package/model/identityVerificationType.d.ts +1 -1
  228. package/model/identityVerificationWithDetails.d.ts +1 -1
  229. package/model/identityVerificationWithDetailsPii.d.ts +1 -1
  230. package/model/identityVerificationWithDetailsPiiAddress.d.ts +1 -1
  231. package/model/identityVerificationWithDetailsPiiName.d.ts +1 -1
  232. package/model/invoice.d.ts +1 -1
  233. package/model/invoiceList.d.ts +1 -1
  234. package/model/patchBank.d.ts +1 -1
  235. package/model/patchCustomer.d.ts +1 -1
  236. package/model/patchExternalBankAccount.d.ts +1 -1
  237. package/model/paymentInstruction.d.ts +1 -1
  238. package/model/paymentInstructionList.d.ts +1 -1
  239. package/model/postAccount.d.ts +1 -1
  240. package/model/postBank.d.ts +1 -1
  241. package/model/postCounterparty.d.ts +1 -1
  242. package/model/postCounterpartyAddress.d.ts +1 -1
  243. package/model/postCounterpartyAliasesInner.d.ts +1 -1
  244. package/model/postCounterpartyName.d.ts +1 -1
  245. package/model/postCustomer.d.ts +1 -1
  246. package/model/postCustomerAddress.d.ts +1 -1
  247. package/model/postCustomerName.d.ts +1 -1
  248. package/model/postDepositAddress.d.ts +1 -1
  249. package/model/postDepositBankAccount.d.ts +1 -1
  250. package/model/postExternalBankAccount.d.ts +1 -1
  251. package/model/postExternalBankAccountCounterpartyAddress.d.ts +1 -1
  252. package/model/postExternalBankAccountCounterpartyBankAccount.d.ts +1 -1
  253. package/model/postExternalBankAccountCounterpartyName.d.ts +1 -1
  254. package/model/postExternalWallet.d.ts +1 -1
  255. package/model/postFee.d.ts +1 -1
  256. package/model/postIdentificationNumber.d.ts +1 -1
  257. package/model/postIdentityVerification.d.ts +1 -1
  258. package/model/postIdentityVerificationAddress.d.ts +1 -1
  259. package/model/postIdentityVerificationName.d.ts +1 -1
  260. package/model/postInvoice.d.ts +1 -1
  261. package/model/postPaymentInstruction.d.ts +1 -1
  262. package/model/postQuote.d.ts +1 -1
  263. package/model/postQuoteEntry.d.ts +1 -1
  264. package/model/postTrade.d.ts +1 -1
  265. package/model/postTransfer.d.ts +1 -1
  266. package/model/postTransferParticipant.d.ts +1 -1
  267. package/model/postWorkflow.d.ts +1 -1
  268. package/model/quote.d.ts +1 -1
  269. package/model/quoteEntry.d.ts +1 -1
  270. package/model/quoteEntryDestinationAccount.d.ts +1 -1
  271. package/model/quoteEntrySourceAccount.d.ts +1 -1
  272. package/model/quoteList.d.ts +1 -1
  273. package/model/quoteSide.d.ts +1 -1
  274. package/model/quoteType.d.ts +1 -1
  275. package/model/symbolPrice.d.ts +1 -1
  276. package/model/trade.d.ts +1 -1
  277. package/model/tradeFailureCode.d.ts +1 -1
  278. package/model/tradeList.d.ts +1 -1
  279. package/model/tradeSide.d.ts +1 -1
  280. package/model/tradeState.d.ts +1 -1
  281. package/model/tradeType.d.ts +1 -1
  282. package/model/transfer.d.ts +1 -1
  283. package/model/transferAccountType.d.ts +1 -1
  284. package/model/transferDestinationAccount.d.ts +1 -1
  285. package/model/transferEntry.d.ts +1 -1
  286. package/model/transferEntryDestinationAccount.d.ts +1 -1
  287. package/model/transferFailureCode.d.ts +1 -1
  288. package/model/transferList.d.ts +1 -1
  289. package/model/transferParticipant.d.ts +1 -1
  290. package/model/transferSide.d.ts +1 -1
  291. package/model/transferSourceAccount.d.ts +1 -1
  292. package/model/transferState.d.ts +1 -1
  293. package/model/transferType.d.ts +1 -1
  294. package/model/workflow.d.ts +1 -1
  295. package/model/workflowState.d.ts +1 -1
  296. package/model/workflowType.d.ts +1 -1
  297. package/model/workflowWithDetailsAllOf.d.ts +1 -1
  298. package/model/workflowsList.d.ts +1 -1
  299. package/package.json +1 -1
@@ -2,7 +2,7 @@
2
2
  * Cybrid Bank API
3
3
  * # Cybrid API documentation Welcome to Cybrid, an all-in-one crypto platform that enables you to easily **build** and **launch** white-label crypto products or services. In these documents, you\'ll find details on how our REST API operates and generally how our platform functions. If you\'re looking for our UI SDK Widgets for Web or Mobile (iOS/Android), generated API clients, or demo applications, head over to our [Github repo](https://github.com/Cybrid-app). 💡 We recommend bookmarking the [Cybrid LinkTree](https://linktr.ee/cybridtechnologies) which contains many helpful links to platform resources. ## Getting Started This is Cybrid\'s public interactive API documentation, which allows you to fully test our APIs. If you\'d like to use a different tool to exercise our APIs, you can download the [Open API 3.0 yaml](https://bank.production.cybrid.app/api/schema/v1/swagger.yaml) for import. If you\'re new to our APIs and the Cybrid Platform, follow the below guides to get set up and familiar with the platform: 1. [Introduction](https://docs.cybrid.xyz/docs/introduction) 2. [Platform Introduction](https://docs.cybrid.xyz/docs/how-is-cybrid-architected) 3. [Testing with Hosted Web Demo App](https://docs.cybrid.xyz/docs/testing-with-hosted-web-demo-app) In [Getting Started in the Cybrid Sandbox](https://docs.cybrid.xyz/docs/how-do-i-get-started-with-the-sandbox), we walk you through how to use the [Cybrid Sandbox](https://id.sandbox.cybrid.app/) to create a test bank and generate API keys. In [Getting Ready for Trading](https://kb.cybrid.xyz/getting-ready-for-trading), we walk through creating customers, customer identities, accounts, as well as executing quotes and trades. ## Working with the Cybrid Platform There are three primary ways you can interact with the Cybrid platform: 1. Directly via our RESTful API (this documentation) 2. Using our API clients available in a variety of languages ([Angular](https://github.com/Cybrid-app/cybrid-api-bank-angular), [Java](https://github.com/Cybrid-app/cybrid-api-bank-java), [Kotlin](https://github.com/Cybrid-app/cybrid-api-bank-kotlin), [Python](https://github.com/Cybrid-app/cybrid-api-bank-python), [Ruby](https://github.com/Cybrid-app/cybrid-api-bank-ruby), [Swift](https://github.com/Cybrid-app/cybrid-api-bank-swift) or [Typescript](https://github.com/Cybrid-app/cybrid-api-bank-typescript)) 3. Integrating a platform specific SDK ([Web](https://github.com/Cybrid-app/cybrid-sdk-web), [Android](https://github.com/Cybrid-app/cybrid-sdk-android), [iOS](https://github.com/Cybrid-app/cybrid-sdk-ios)) Our complete set of APIs allows you to manage resources across three distinct areas: your `Organization`, your `Banks` and your `Identities`. For most of your testing and interaction you\'ll be using the `Bank` API, which is where the majority of APIs reside. *The complete set of APIs can be found on the following pages:* | API | Description | |------------------------------------------------------------------|-------------------------------------------------------------| | [Organization API](https://organization.production.cybrid.app/api/schema/swagger-ui) | APIs to manage organizations | | [Bank API](https://bank.production.cybrid.app/api/schema/swagger-ui) | APIs to manage banks (and all downstream customer activity) | | [Identities API](https://id.production.cybrid.app/api/schema/swagger-ui) | APIs to manage organization and bank identities | For questions please contact [Support](mailto:support@cybrid.xyz) at any time for assistance, or contact the [Product Team](mailto:product@cybrid.xyz) for product suggestions. ## Authenticating with the API The Cybrid Platform uses OAuth 2.0 Bearer Tokens to authenticate requests to the platform. Credentials to create `Organization` and `Bank` tokens can be generated via the [Cybrid Sandbox](https://id.production.cybrid.app). Access tokens can be generated for a `Customer` as well via the [Cybrid IdP](https://id.production.cybrid.app) as well. An `Organization` access token applies broadly to the whole Organization and all of its `Banks`, whereas, a `Bank` access token is specific to an individual Bank. `Customer` tokens, similarly, are scoped to a specific customer in a bank. Both `Organization` and `Bank` tokens can be created using the OAuth Client Credential Grant flow. Each Organization and Bank has its own unique `Client ID` and `Secret` that allows for machine-to-machine authentication. A `Bank` can then generate `Customer` access tokens via API using our [Identities API](https://id.production.cybrid.app/api/schema/swagger-ui). <font color=\"orange\">**⚠️ Never share your Client ID or Secret publicly or in your source code repository.**</font> Your `Client ID` and `Secret` can be exchanged for a time-limited `Bearer Token` by interacting with the Cybrid Identity Provider or through interacting with the **Authorize** button in this document. The following curl command can be used to quickly generate a `Bearer Token` for use in testing the API or demo applications. ``` # Example request when using Bank credentials curl -X POST https://id.production.cybrid.app/oauth/token -d \'{ \"grant_type\": \"client_credentials\", \"client_id\": \"<Your Client ID>\", \"client_secret\": \"<Your Secret>\", \"scope\": \"banks:read banks:write bank_applications:execute accounts:read accounts:execute counterparties:read counterparties:write counterparties:execute customers:read customers:write customers:execute prices:read quotes:execute quotes:read trades:execute trades:read transfers:execute transfers:read external_bank_accounts:read external_bank_accounts:write external_bank_accounts:execute external_wallets:read external_wallets:execute workflows:read workflows:execute deposit_addresses:read deposit_addresses:execute deposit_bank_accounts:read deposit_bank_accounts:execute invoices:read invoices:write invoices:execute identity_verifications:read identity_verifications:write identity_verifications:execute\" }\' -H \"Content-Type: application/json\" # When using Organization credentials set `scope` to \'organizations:read organizations:write organization_applications:execute banks:read banks:write banks:execute bank_applications:execute users:read users:execute counterparties:read customers:read accounts:read prices:read quotes:execute quotes:read trades:execute trades:read transfers:read transfers:execute external_bank_accounts:read external_wallets:read workflows:read deposit_addresses:read deposit_bank_accounts:read invoices:read subscriptions:read subscriptions:write subscriptions:execute subscription_events:read subscription_events:execute identity_verifications:read\' ``` <font color=\"orange\">**⚠️ Note: The above curl will create a bearer token with full scope access. Delete scopes if you\'d like to restrict access.**</font> ## Authentication Scopes The Cybrid platform supports the use of scopes to control the level of access a token is limited to. Scopes do not grant access to resources; instead, they provide limits, in support of the least privilege principal. The following scopes are available on the platform and can be requested when generating either an Organization, Bank or Customer token. Generally speaking, the _Read_ scope is required to read and list resources, the _Write_ scope is required to update a resource and the _Execute_ scope is required to create a resource. | Resource | Read scope (Token Type) | Write scope (Token Type) | Execute scope (Token Type) | |-----------------------|------------------------------------------------------------|-----------------------------------------------|--------------------------------------------------| | Account | accounts:read (Organization, Bank, Customer) | | accounts:execute (Bank, Customer) | | Bank | banks:read (Organization, Bank) | banks:write (Organization, Bank) | banks:execute (Organization) | | Customer | customers:read (Organization, Bank, Customer) | customers:write (Bank, Customer) | customers:execute (Bank) | | Counterparty | counterparties:read (Organization, Bank, Customer) | counterparties:write (Bank, Customer) | counterparties:execute (Bank) | | Deposit Address | deposit_addresses:read (Organization, Bank, Customer) | deposit_addresses:write (Bank, Customer) | deposit_addresses:execute (Bank, Customer) | | External Bank Account | external_bank_accounts:read (Organization, Bank, Customer) | external_bank_accounts:write (Bank, Customer) | external_bank_accounts:execute (Bank, Customer) | | External Wallet | external_wallet:read (Organization, Bank, Customer) | | external_wallet:execute (Bank, Customer) | | Organization | organizations:read (Organization) | organizations:write (Organization) | | | User | users:read (Organization) | | users:execute (Organization) | | Price | prices:read (Bank, Customer) | | | | Quote | quotes:read (Organization, Bank, Customer) | | quotes:execute (Organization, Bank, Customer) | | Trade | trades:read (Organization, Bank, Customer) | | trades:execute (Organization, Bank, Customer) | | Transfer | transfers:read (Organization, Bank, Customer) | | transfers:execute (Organization, Bank, Customer) | | Workflow | workflows:read (Organization, Bank, Customer) | | workflows:execute (Bank, Customer) | | Invoice | invoices:read (Organization, Bank, Customer) | invoices:write (Bank, Customer) | invoices:execute (Bank, Customer) | ## Available Endpoints The available APIs for the [Identity](https://id.production.cybrid.app/api/schema/swagger-ui), [Organization](https://organization.production.cybrid.app/api/schema/swagger-ui) and [Bank](https://bank.production.cybrid.app/api/schema/swagger-ui) API services are listed below: | API Service | Model | API Endpoint Path | Description | |--------------|----------------------|--------------------------------|---------------------------------------------------------------------------------------------------| | Identity | Bank | /api/bank_applications | Create and list banks | | Identity | CustomerToken | /api/customer_tokens | Create customer JWT access tokens | | Identity | Organization | /api/organization_applications | Create and list organizations | | Identity | Organization | /api/users | Create and list organization users | | Organization | Organization | /api/organizations | APIs to retrieve and update organization name | | Bank | Account | /api/accounts | Create and list accounts, which hold a specific asset for a customers | | Bank | Asset | /api/assets | Get a list of assets supported by the platform (ex: BTC, ETH) | | Bank | Bank | /api/banks | Create, update and list banks, the parent to customers, accounts, etc | | Bank | Customer | /api/customers | Create and list customers | | Bank | Counterparty | /api/counterparties | Create and list counterparties | | Bank | DepositAddress | /api/deposit_addresses | Create, get and list deposit addresses | | Bank | ExternalBankAccount | /api/external_bank_accounts | Create, get and list external bank accounts, which connect customer bank accounts to the platform | | Bank | ExternalWallet | /api/external_wallets | Create, get, list and delete external wallets, which connect customer wallets to the platform | | Bank | IdentityVerification | /api/identity_verifications | Create and list identity verifications, which are performed on customers for KYC | | Bank | Invoice | /api/invoices | Create, get, cancel and list invoices | | Bank | PaymentInstruction | /api/payment_instructions | Create, get and list payment instructions for invoices | | Bank | Price | /api/prices | Get the current prices for assets on the platform | | Bank | Quote | /api/quotes | Create and list quotes, which are required to execute trades | | Bank | Symbol | /api/symbols | Get a list of symbols supported for trade (ex: BTC-USD) | | Bank | Trade | /api/trades | Create and list trades, which buy or sell cryptocurrency | | Bank | Transfer | /api/transfers | Create, get and list transfers (e.g., funding, book) | | Bank | Workflow | /api/workflows | Create, get and list workflows | ## Understanding Object Models & Endpoints **Organizations** An `Organization` is meant to represent the organization partnering with Cybrid to use our platform. An `Organization` typically does not directly interact with `customers`. Instead, an Organization has one or more `banks`, which encompass the financial service offerings of the platform. **Banks** A `Bank` is owned by an `Organization` and can be thought of as an environment or container for `customers` and product offerings. Banks are created in either `Sandbox` or `Production` mode, where `Sandbox` is the environment that you would test, prototype and build in prior to moving to `Production`. An `Organization` can have multiple `banks`, in either `Sandbox` or `Production` environments. A `Sandbox Bank` will be backed by stubbed data and process flows. For instance, funding source transfer processes as well as trades will be simulated rather than performed, however asset prices are representative of real-world values. You have an unlimited amount of simulated fiat currency for testing purposes. **Customers** `Customers` represent your banking users on the platform. At present, we offer support for `Individuals` as Customers. `Customers` must be verified (i.e., KYC\'d) in our system before they can play any part on the platform, which means they must have an associated and a passing `Identity Verification`. See the Identity Verifications section for more details on how a customer can be verified. `Customers` must also have an `Account` to be able to transact, in the desired asset class. See the Accounts APIs for more details on setting up accounts for the customer.
4
4
  *
5
- * The version of the OpenAPI document: v0.123.152
5
+ * The version of the OpenAPI document: v0.123.153
6
6
  * Contact: support@cybrid.app
7
7
  *
8
8
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
@@ -399,4 +399,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
399
399
  }] }, { type: i2.Configuration, decorators: [{
400
400
  type: Optional
401
401
  }] }]; } });
402
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZXJuYWxCYW5rQWNjb3VudHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FwaS9leHRlcm5hbEJhbmtBY2NvdW50cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQTJCLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFDVSxXQUFXLEVBQ3hELE1BQVksc0JBQXNCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQStCLFlBQVksQ0FBQztBQWMvRSxhQUFhO0FBQ2IsT0FBTyxFQUFFLFNBQVMsRUFBc0IsTUFBMEIsY0FBYyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBMEMsa0JBQWtCLENBQUM7Ozs7QUFPckYsTUFBTSxPQUFPLDJCQUEyQjtJQU9wQyxZQUFzQixVQUFzQixFQUFnQyxRQUFnQixFQUFjLGFBQTRCO1FBQWhILGVBQVUsR0FBVixVQUFVLENBQVk7UUFMbEMsYUFBUSxHQUFHLGlDQUFpQyxDQUFDO1FBQ2hELG1CQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxrQkFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFJdkMsSUFBSSxhQUFhLEVBQUU7WUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztTQUN0QztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDakQsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7Z0JBQzlCLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQzVCO1lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1NBQzFDO1FBQ0QsSUFB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QUFFO1lBQ3ZDLGVBQWUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1NBQ2xGO1FBRUQsSUFBSSxhQUFhLEdBQTZCLE1BQU0sQ0FBQztRQUNyRCxJQUFJLGdDQUFnQyxFQUFFO1lBQ2xDLElBQUksZ0NBQWdDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNyRCxhQUFhLEdBQUcsTUFBTSxDQUFDO2FBQzFCO2lCQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsZ0NBQWdDLENBQUMsRUFBRTtnQkFDeEUsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtpQkFBTTtnQkFDSCxhQUFhLEdBQUcsTUFBTSxDQUFDO2FBQzFCO1NBQ0o7UUFFRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUErQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSwrQkFBK0Isa0JBQWtCLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMsRUFBRSxFQUN6SyxpQ0FBaUMsRUFDakM7WUFDSSxPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLFlBQVksRUFBTyxhQUFhO1lBQ2hDLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWU7WUFDbkQsT0FBTyxFQUFFLGVBQWU7WUFDeEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsY0FBYyxFQUFFLGNBQWM7U0FDakMsQ0FDSixDQUFDO0lBQ04sQ0FBQzs7eUhBcmVRLDJCQUEyQiw0Q0FPNkIsU0FBUzs2SEFQakUsMkJBQTJCLGNBRjFCLE1BQU07NEZBRVAsMkJBQTJCO2tCQUh2QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBUWtELFFBQVE7OzBCQUFHLE1BQU07MkJBQUMsU0FBUzs7MEJBQXFCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN5YnJpZCBCYW5rIEFQSVxuICogIyBDeWJyaWQgQVBJIGRvY3VtZW50YXRpb24gIFdlbGNvbWUgdG8gQ3licmlkLCBhbiBhbGwtaW4tb25lIGNyeXB0byBwbGF0Zm9ybSB0aGF0IGVuYWJsZXMgeW91IHRvIGVhc2lseSAqKmJ1aWxkKiogYW5kICoqbGF1bmNoKiogd2hpdGUtbGFiZWwgY3J5cHRvIHByb2R1Y3RzIG9yIHNlcnZpY2VzLiAgSW4gdGhlc2UgZG9jdW1lbnRzLCB5b3VcXCdsbCBmaW5kIGRldGFpbHMgb24gaG93IG91ciBSRVNUIEFQSSBvcGVyYXRlcyBhbmQgZ2VuZXJhbGx5IGhvdyBvdXIgcGxhdGZvcm0gZnVuY3Rpb25zLiAgSWYgeW91XFwncmUgbG9va2luZyBmb3Igb3VyIFVJIFNESyBXaWRnZXRzIGZvciBXZWIgb3IgTW9iaWxlIChpT1MvQW5kcm9pZCksIGdlbmVyYXRlZCBBUEkgY2xpZW50cywgb3IgZGVtbyBhcHBsaWNhdGlvbnMsIGhlYWQgb3ZlciB0byBvdXIgW0dpdGh1YiByZXBvXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcCkuICDwn5KhIFdlIHJlY29tbWVuZCBib29rbWFya2luZyB0aGUgW0N5YnJpZCBMaW5rVHJlZV0oaHR0cHM6Ly9saW5rdHIuZWUvY3licmlkdGVjaG5vbG9naWVzKSB3aGljaCBjb250YWlucyBtYW55IGhlbHBmdWwgbGlua3MgdG8gcGxhdGZvcm0gcmVzb3VyY2VzLiAgIyMgR2V0dGluZyBTdGFydGVkICBUaGlzIGlzIEN5YnJpZFxcJ3MgcHVibGljIGludGVyYWN0aXZlIEFQSSBkb2N1bWVudGF0aW9uLCB3aGljaCBhbGxvd3MgeW91IHRvIGZ1bGx5IHRlc3Qgb3VyIEFQSXMuIElmIHlvdVxcJ2QgbGlrZSB0byB1c2UgYSBkaWZmZXJlbnQgdG9vbCB0byBleGVyY2lzZSBvdXIgQVBJcywgeW91IGNhbiBkb3dubG9hZCB0aGUgW09wZW4gQVBJIDMuMCB5YW1sXShodHRwczovL2JhbmsucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvdjEvc3dhZ2dlci55YW1sKSBmb3IgaW1wb3J0LiAgSWYgeW91XFwncmUgbmV3IHRvIG91ciBBUElzIGFuZCB0aGUgQ3licmlkIFBsYXRmb3JtLCBmb2xsb3cgdGhlIGJlbG93IGd1aWRlcyB0byBnZXQgc2V0IHVwIGFuZCBmYW1pbGlhciB3aXRoIHRoZSBwbGF0Zm9ybTogIDEuIFtJbnRyb2R1Y3Rpb25dKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaW50cm9kdWN0aW9uKSAyLiBbUGxhdGZvcm0gSW50cm9kdWN0aW9uXShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL2hvdy1pcy1jeWJyaWQtYXJjaGl0ZWN0ZWQpIDMuIFtUZXN0aW5nIHdpdGggSG9zdGVkIFdlYiBEZW1vIEFwcF0oaHR0cHM6Ly9kb2NzLmN5YnJpZC54eXovZG9jcy90ZXN0aW5nLXdpdGgtaG9zdGVkLXdlYi1kZW1vLWFwcCkgIEluIFtHZXR0aW5nIFN0YXJ0ZWQgaW4gdGhlIEN5YnJpZCBTYW5kYm94XShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL2hvdy1kby1pLWdldC1zdGFydGVkLXdpdGgtdGhlLXNhbmRib3gpLCB3ZSB3YWxrIHlvdSB0aHJvdWdoIGhvdyB0byB1c2UgdGhlIFtDeWJyaWQgU2FuZGJveF0oaHR0cHM6Ly9pZC5zYW5kYm94LmN5YnJpZC5hcHAvKSB0byBjcmVhdGUgYSB0ZXN0IGJhbmsgYW5kIGdlbmVyYXRlIEFQSSBrZXlzLiBJbiBbR2V0dGluZyBSZWFkeSBmb3IgVHJhZGluZ10oaHR0cHM6Ly9rYi5jeWJyaWQueHl6L2dldHRpbmctcmVhZHktZm9yLXRyYWRpbmcpLCB3ZSB3YWxrIHRocm91Z2ggY3JlYXRpbmcgY3VzdG9tZXJzLCBjdXN0b21lciBpZGVudGl0aWVzLCBhY2NvdW50cywgYXMgd2VsbCBhcyBleGVjdXRpbmcgcXVvdGVzIGFuZCB0cmFkZXMuICAjIyBXb3JraW5nIHdpdGggdGhlIEN5YnJpZCBQbGF0Zm9ybSAgVGhlcmUgYXJlIHRocmVlIHByaW1hcnkgd2F5cyB5b3UgY2FuIGludGVyYWN0IHdpdGggdGhlIEN5YnJpZCBwbGF0Zm9ybTogIDEuIERpcmVjdGx5IHZpYSBvdXIgUkVTVGZ1bCBBUEkgKHRoaXMgZG9jdW1lbnRhdGlvbikgMi4gVXNpbmcgb3VyIEFQSSBjbGllbnRzIGF2YWlsYWJsZSBpbiBhIHZhcmlldHkgb2YgbGFuZ3VhZ2VzIChbQW5ndWxhcl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLWFuZ3VsYXIpLCBbSmF2YV0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLWphdmEpLCBbS290bGluXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmsta290bGluKSwgW1B5dGhvbl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXB5dGhvbiksIFtSdWJ5XShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstcnVieSksIFtTd2lmdF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXN3aWZ0KSBvciBbVHlwZXNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXR5cGVzY3JpcHQpKSAzLiBJbnRlZ3JhdGluZyBhIHBsYXRmb3JtIHNwZWNpZmljIFNESyAoW1dlYl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay13ZWIpLCBbQW5kcm9pZF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay1hbmRyb2lkKSwgW2lPU10oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay1pb3MpKSAgT3VyIGNvbXBsZXRlIHNldCBvZiBBUElzIGFsbG93cyB5b3UgdG8gbWFuYWdlIHJlc291cmNlcyBhY3Jvc3MgdGhyZWUgZGlzdGluY3QgYXJlYXM6IHlvdXIgYE9yZ2FuaXphdGlvbmAsIHlvdXIgYEJhbmtzYCBhbmQgeW91ciBgSWRlbnRpdGllc2AuIEZvciBtb3N0IG9mIHlvdXIgdGVzdGluZyBhbmQgaW50ZXJhY3Rpb24geW91XFwnbGwgYmUgdXNpbmcgdGhlIGBCYW5rYCBBUEksIHdoaWNoIGlzIHdoZXJlIHRoZSBtYWpvcml0eSBvZiBBUElzIHJlc2lkZS4gICpUaGUgY29tcGxldGUgc2V0IG9mIEFQSXMgY2FuIGJlIGZvdW5kIG9uIHRoZSBmb2xsb3dpbmcgcGFnZXM6KiAgfCBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgW09yZ2FuaXphdGlvbiBBUEldKGh0dHBzOi8vb3JnYW5pemF0aW9uLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpICAgfCBBUElzIHRvIG1hbmFnZSBvcmdhbml6YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgW0JhbmsgQVBJXShodHRwczovL2JhbmsucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgICAgICAgICAgICAgICAgICAgfCBBUElzIHRvIG1hbmFnZSBiYW5rcyAoYW5kIGFsbCBkb3duc3RyZWFtIGN1c3RvbWVyIGFjdGl2aXR5KSB8IHwgW0lkZW50aXRpZXMgQVBJXShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpICAgICAgICAgICAgICAgICAgICAgICB8IEFQSXMgdG8gbWFuYWdlIG9yZ2FuaXphdGlvbiBhbmQgYmFuayBpZGVudGl0aWVzICAgICAgICAgICAgIHwgIEZvciBxdWVzdGlvbnMgcGxlYXNlIGNvbnRhY3QgW1N1cHBvcnRdKG1haWx0bzpzdXBwb3J0QGN5YnJpZC54eXopIGF0IGFueSB0aW1lIGZvciBhc3Npc3RhbmNlLCBvciBjb250YWN0IHRoZSBbUHJvZHVjdCBUZWFtXShtYWlsdG86cHJvZHVjdEBjeWJyaWQueHl6KSBmb3IgcHJvZHVjdCBzdWdnZXN0aW9ucy4gICMjIEF1dGhlbnRpY2F0aW5nIHdpdGggdGhlIEFQSSAgVGhlIEN5YnJpZCBQbGF0Zm9ybSB1c2VzIE9BdXRoIDIuMCBCZWFyZXIgVG9rZW5zIHRvIGF1dGhlbnRpY2F0ZSByZXF1ZXN0cyB0byB0aGUgcGxhdGZvcm0uIENyZWRlbnRpYWxzIHRvIGNyZWF0ZSBgT3JnYW5pemF0aW9uYCBhbmQgYEJhbmtgIHRva2VucyBjYW4gYmUgZ2VuZXJhdGVkIHZpYSB0aGUgW0N5YnJpZCBTYW5kYm94XShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcCkuIEFjY2VzcyB0b2tlbnMgY2FuIGJlIGdlbmVyYXRlZCBmb3IgYSBgQ3VzdG9tZXJgIGFzIHdlbGwgdmlhIHRoZSBbQ3licmlkIElkUF0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHApIGFzIHdlbGwuICBBbiBgT3JnYW5pemF0aW9uYCBhY2Nlc3MgdG9rZW4gYXBwbGllcyBicm9hZGx5IHRvIHRoZSB3aG9sZSBPcmdhbml6YXRpb24gYW5kIGFsbCBvZiBpdHMgYEJhbmtzYCwgd2hlcmVhcywgYSBgQmFua2AgYWNjZXNzIHRva2VuIGlzIHNwZWNpZmljIHRvIGFuIGluZGl2aWR1YWwgQmFuay4gYEN1c3RvbWVyYCB0b2tlbnMsIHNpbWlsYXJseSwgYXJlIHNjb3BlZCB0byBhIHNwZWNpZmljIGN1c3RvbWVyIGluIGEgYmFuay4gIEJvdGggYE9yZ2FuaXphdGlvbmAgYW5kIGBCYW5rYCB0b2tlbnMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIE9BdXRoIENsaWVudCBDcmVkZW50aWFsIEdyYW50IGZsb3cuIEVhY2ggT3JnYW5pemF0aW9uIGFuZCBCYW5rIGhhcyBpdHMgb3duIHVuaXF1ZSBgQ2xpZW50IElEYCBhbmQgYFNlY3JldGAgdGhhdCBhbGxvd3MgZm9yIG1hY2hpbmUtdG8tbWFjaGluZSBhdXRoZW50aWNhdGlvbi4gIEEgYEJhbmtgIGNhbiB0aGVuIGdlbmVyYXRlIGBDdXN0b21lcmAgYWNjZXNzIHRva2VucyB2aWEgQVBJIHVzaW5nIG91ciBbSWRlbnRpdGllcyBBUEldKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkuICA8Zm9udCBjb2xvcj1cXFwib3JhbmdlXFxcIj4qKuKaoO+4jyBOZXZlciBzaGFyZSB5b3VyIENsaWVudCBJRCBvciBTZWNyZXQgcHVibGljbHkgb3IgaW4geW91ciBzb3VyY2UgY29kZSByZXBvc2l0b3J5LioqPC9mb250PiAgWW91ciBgQ2xpZW50IElEYCBhbmQgYFNlY3JldGAgY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYSB0aW1lLWxpbWl0ZWQgYEJlYXJlciBUb2tlbmAgYnkgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgQ3licmlkIElkZW50aXR5IFByb3ZpZGVyIG9yIHRocm91Z2ggaW50ZXJhY3Rpbmcgd2l0aCB0aGUgKipBdXRob3JpemUqKiBidXR0b24gaW4gdGhpcyBkb2N1bWVudC4gIFRoZSBmb2xsb3dpbmcgY3VybCBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgZ2VuZXJhdGUgYSBgQmVhcmVyIFRva2VuYCBmb3IgdXNlIGluIHRlc3RpbmcgdGhlIEFQSSBvciBkZW1vIGFwcGxpY2F0aW9ucy4gIGBgYCAjIEV4YW1wbGUgcmVxdWVzdCB3aGVuIHVzaW5nIEJhbmsgY3JlZGVudGlhbHMgY3VybCAtWCBQT1NUIGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL29hdXRoL3Rva2VuIC1kIFxcJ3sgICAgIFxcXCJncmFudF90eXBlXFxcIjogXFxcImNsaWVudF9jcmVkZW50aWFsc1xcXCIsICAgICBcXFwiY2xpZW50X2lkXFxcIjogXFxcIjxZb3VyIENsaWVudCBJRD5cXFwiLCAgICAgXFxcImNsaWVudF9zZWNyZXRcXFwiOiBcXFwiPFlvdXIgU2VjcmV0PlxcXCIsICAgICBcXFwic2NvcGVcXFwiOiBcXFwiYmFua3M6cmVhZCBiYW5rczp3cml0ZSBiYW5rX2FwcGxpY2F0aW9uczpleGVjdXRlIGFjY291bnRzOnJlYWQgYWNjb3VudHM6ZXhlY3V0ZSBjb3VudGVycGFydGllczpyZWFkIGNvdW50ZXJwYXJ0aWVzOndyaXRlIGNvdW50ZXJwYXJ0aWVzOmV4ZWN1dGUgY3VzdG9tZXJzOnJlYWQgY3VzdG9tZXJzOndyaXRlIGN1c3RvbWVyczpleGVjdXRlIHByaWNlczpyZWFkIHF1b3RlczpleGVjdXRlIHF1b3RlczpyZWFkIHRyYWRlczpleGVjdXRlIHRyYWRlczpyZWFkIHRyYW5zZmVyczpleGVjdXRlIHRyYW5zZmVyczpyZWFkIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCBleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBleHRlcm5hbF93YWxsZXRzOnJlYWQgZXh0ZXJuYWxfd2FsbGV0czpleGVjdXRlIHdvcmtmbG93czpyZWFkIHdvcmtmbG93czpleGVjdXRlIGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgZGVwb3NpdF9hZGRyZXNzZXM6ZXhlY3V0ZSBkZXBvc2l0X2JhbmtfYWNjb3VudHM6cmVhZCBkZXBvc2l0X2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBpbnZvaWNlczpyZWFkIGludm9pY2VzOndyaXRlIGludm9pY2VzOmV4ZWN1dGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6d3JpdGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpleGVjdXRlXFxcIiAgIH1cXCcgLUggXFxcIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxcXCIgICMgV2hlbiB1c2luZyBPcmdhbml6YXRpb24gY3JlZGVudGlhbHMgc2V0IGBzY29wZWAgdG8gXFwnb3JnYW5pemF0aW9uczpyZWFkIG9yZ2FuaXphdGlvbnM6d3JpdGUgb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9uczpleGVjdXRlIGJhbmtzOnJlYWQgYmFua3M6d3JpdGUgYmFua3M6ZXhlY3V0ZSBiYW5rX2FwcGxpY2F0aW9uczpleGVjdXRlIHVzZXJzOnJlYWQgdXNlcnM6ZXhlY3V0ZSBjb3VudGVycGFydGllczpyZWFkIGN1c3RvbWVyczpyZWFkIGFjY291bnRzOnJlYWQgcHJpY2VzOnJlYWQgcXVvdGVzOmV4ZWN1dGUgcXVvdGVzOnJlYWQgdHJhZGVzOmV4ZWN1dGUgdHJhZGVzOnJlYWQgdHJhbnNmZXJzOnJlYWQgdHJhbnNmZXJzOmV4ZWN1dGUgZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkIGV4dGVybmFsX3dhbGxldHM6cmVhZCB3b3JrZmxvd3M6cmVhZCBkZXBvc2l0X2FkZHJlc3NlczpyZWFkIGRlcG9zaXRfYmFua19hY2NvdW50czpyZWFkIGludm9pY2VzOnJlYWQgc3Vic2NyaXB0aW9uczpyZWFkIHN1YnNjcmlwdGlvbnM6d3JpdGUgc3Vic2NyaXB0aW9uczpleGVjdXRlIHN1YnNjcmlwdGlvbl9ldmVudHM6cmVhZCBzdWJzY3JpcHRpb25fZXZlbnRzOmV4ZWN1dGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpyZWFkXFwnIGBgYCA8Zm9udCBjb2xvcj1cXFwib3JhbmdlXFxcIj4qKuKaoO+4jyBOb3RlOiBUaGUgYWJvdmUgY3VybCB3aWxsIGNyZWF0ZSBhIGJlYXJlciB0b2tlbiB3aXRoIGZ1bGwgc2NvcGUgYWNjZXNzLiBEZWxldGUgc2NvcGVzIGlmIHlvdVxcJ2QgbGlrZSB0byByZXN0cmljdCBhY2Nlc3MuKio8L2ZvbnQ+ICAjIyBBdXRoZW50aWNhdGlvbiBTY29wZXMgIFRoZSBDeWJyaWQgcGxhdGZvcm0gc3VwcG9ydHMgdGhlIHVzZSBvZiBzY29wZXMgdG8gY29udHJvbCB0aGUgbGV2ZWwgb2YgYWNjZXNzIGEgdG9rZW4gaXMgbGltaXRlZCB0by4gU2NvcGVzIGRvIG5vdCBncmFudCBhY2Nlc3MgdG8gcmVzb3VyY2VzOyBpbnN0ZWFkLCB0aGV5IHByb3ZpZGUgbGltaXRzLCBpbiBzdXBwb3J0IG9mIHRoZSBsZWFzdCBwcml2aWxlZ2UgcHJpbmNpcGFsLiAgVGhlIGZvbGxvd2luZyBzY29wZXMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgcGxhdGZvcm0gYW5kIGNhbiBiZSByZXF1ZXN0ZWQgd2hlbiBnZW5lcmF0aW5nIGVpdGhlciBhbiBPcmdhbml6YXRpb24sIEJhbmsgb3IgQ3VzdG9tZXIgdG9rZW4uIEdlbmVyYWxseSBzcGVha2luZywgdGhlIF9SZWFkXyBzY29wZSBpcyByZXF1aXJlZCB0byByZWFkIGFuZCBsaXN0IHJlc291cmNlcywgdGhlIF9Xcml0ZV8gc2NvcGUgaXMgcmVxdWlyZWQgdG8gdXBkYXRlIGEgcmVzb3VyY2UgYW5kIHRoZSBfRXhlY3V0ZV8gc2NvcGUgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGEgcmVzb3VyY2UuICB8IFJlc291cmNlICAgICAgICAgICAgICB8IFJlYWQgc2NvcGUgKFRva2VuIFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXcml0ZSBzY29wZSAoVG9rZW4gVHlwZSkgICAgICAgICAgICAgICAgICAgICAgfCBFeGVjdXRlIHNjb3BlIChUb2tlbiBUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IEFjY291bnQgICAgICAgICAgICAgICB8IGFjY291bnRzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhY2NvdW50czpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICAgICAgICAgICB8IGJhbmtzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYW5rczp3cml0ZSAoT3JnYW5pemF0aW9uLCBCYW5rKSAgICAgICAgICAgICAgfCBiYW5rczpleGVjdXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgfCB8IEN1c3RvbWVyICAgICAgICAgICAgICB8IGN1c3RvbWVyczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCBjdXN0b21lcnM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCBjdXN0b21lcnM6ZXhlY3V0ZSAoQmFuaykgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IENvdW50ZXJwYXJ0eSAgICAgICAgICB8IGNvdW50ZXJwYXJ0aWVzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCBjb3VudGVycGFydGllczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCBjb3VudGVycGFydGllczpleGVjdXRlIChCYW5rKSAgICAgICAgICAgICAgICAgICAgfCB8IERlcG9zaXQgQWRkcmVzcyAgICAgICB8IGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgfCBkZXBvc2l0X2FkZHJlc3Nlczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgfCBkZXBvc2l0X2FkZHJlc3NlczpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgfCB8IEV4dGVybmFsIEJhbmsgQWNjb3VudCB8IGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgfCBleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlIChCYW5rLCBDdXN0b21lcikgfCBleHRlcm5hbF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgfCB8IEV4dGVybmFsIFdhbGxldCAgICAgICB8IGV4dGVybmFsX3dhbGxldDpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleHRlcm5hbF93YWxsZXQ6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCB8IE9yZ2FuaXphdGlvbiAgICAgICAgICB8IG9yZ2FuaXphdGlvbnM6cmVhZCAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvcmdhbml6YXRpb25zOndyaXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IFVzZXIgICAgICAgICAgICAgICAgICB8IHVzZXJzOnJlYWQgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1c2VyczpleGVjdXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgfCB8IFByaWNlICAgICAgICAgICAgICAgICB8IHByaWNlczpyZWFkIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IFF1b3RlICAgICAgICAgICAgICAgICB8IHF1b3RlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxdW90ZXM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgfCB8IFRyYWRlICAgICAgICAgICAgICAgICB8IHRyYWRlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFkZXM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgfCB8IFRyYW5zZmVyICAgICAgICAgICAgICB8IHRyYW5zZmVyczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2ZlcnM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgfCB8IFdvcmtmbG93ICAgICAgICAgICAgICB8IHdvcmtmbG93czpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3b3JrZmxvd3M6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCB8IEludm9pY2UgICAgICAgICAgICAgICB8IGludm9pY2VzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCBpbnZvaWNlczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCBpbnZvaWNlczpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgfCAgIyMgQXZhaWxhYmxlIEVuZHBvaW50cyAgVGhlIGF2YWlsYWJsZSBBUElzIGZvciB0aGUgW0lkZW50aXR5XShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpLCBbT3JnYW5pemF0aW9uXShodHRwczovL29yZ2FuaXphdGlvbi5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSBhbmQgW0JhbmtdKGh0dHBzOi8vYmFuay5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSBBUEkgc2VydmljZXMgYXJlIGxpc3RlZCBiZWxvdzogIHwgQVBJIFNlcnZpY2UgIHwgTW9kZWwgICAgICAgICAgICAgICAgfCBBUEkgRW5kcG9pbnQgUGF0aCAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IElkZW50aXR5ICAgICB8IEJhbmsgICAgICAgICAgICAgICAgIHwgL2FwaS9iYW5rX2FwcGxpY2F0aW9ucyAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGJhbmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgSWRlbnRpdHkgICAgIHwgQ3VzdG9tZXJUb2tlbiAgICAgICAgfCAvYXBpL2N1c3RvbWVyX3Rva2VucyAgICAgICAgICAgfCBDcmVhdGUgY3VzdG9tZXIgSldUIGFjY2VzcyB0b2tlbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBJZGVudGl0eSAgICAgfCBPcmdhbml6YXRpb24gICAgICAgICB8IC9hcGkvb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9ucyB8IENyZWF0ZSBhbmQgbGlzdCBvcmdhbml6YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IElkZW50aXR5ICAgICB8IE9yZ2FuaXphdGlvbiAgICAgICAgIHwgL2FwaS91c2VycyAgICAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IG9yZ2FuaXphdGlvbiB1c2VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgT3JnYW5pemF0aW9uIHwgT3JnYW5pemF0aW9uICAgICAgICAgfCAvYXBpL29yZ2FuaXphdGlvbnMgICAgICAgICAgICAgfCBBUElzIHRvIHJldHJpZXZlIGFuZCB1cGRhdGUgb3JnYW5pemF0aW9uIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBBY2NvdW50ICAgICAgICAgICAgICB8IC9hcGkvYWNjb3VudHMgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBhY2NvdW50cywgd2hpY2ggaG9sZCBhIHNwZWNpZmljIGFzc2V0IGZvciBhIGN1c3RvbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEFzc2V0ICAgICAgICAgICAgICAgIHwgL2FwaS9hc3NldHMgICAgICAgICAgICAgICAgICAgIHwgR2V0IGEgbGlzdCBvZiBhc3NldHMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybSAoZXg6IEJUQywgRVRIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQmFuayAgICAgICAgICAgICAgICAgfCAvYXBpL2JhbmtzICAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUsIHVwZGF0ZSBhbmQgbGlzdCBiYW5rcywgdGhlIHBhcmVudCB0byBjdXN0b21lcnMsIGFjY291bnRzLCBldGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBDdXN0b21lciAgICAgICAgICAgICB8IC9hcGkvY3VzdG9tZXJzICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBjdXN0b21lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IENvdW50ZXJwYXJ0eSAgICAgICAgIHwgL2FwaS9jb3VudGVycGFydGllcyAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGNvdW50ZXJwYXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgRGVwb3NpdEFkZHJlc3MgICAgICAgfCAvYXBpL2RlcG9zaXRfYWRkcmVzc2VzICAgICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCBkZXBvc2l0IGFkZHJlc3NlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBFeHRlcm5hbEJhbmtBY2NvdW50ICB8IC9hcGkvZXh0ZXJuYWxfYmFua19hY2NvdW50cyAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IGV4dGVybmFsIGJhbmsgYWNjb3VudHMsIHdoaWNoIGNvbm5lY3QgY3VzdG9tZXIgYmFuayBhY2NvdW50cyB0byB0aGUgcGxhdGZvcm0gfCB8IEJhbmsgICAgICAgICB8IEV4dGVybmFsV2FsbGV0ICAgICAgIHwgL2FwaS9leHRlcm5hbF93YWxsZXRzICAgICAgICAgIHwgQ3JlYXRlLCBnZXQsIGxpc3QgYW5kIGRlbGV0ZSBleHRlcm5hbCB3YWxsZXRzLCB3aGljaCBjb25uZWN0IGN1c3RvbWVyIHdhbGxldHMgdG8gdGhlIHBsYXRmb3JtICAgICB8IHwgQmFuayAgICAgICAgIHwgSWRlbnRpdHlWZXJpZmljYXRpb24gfCAvYXBpL2lkZW50aXR5X3ZlcmlmaWNhdGlvbnMgICAgfCBDcmVhdGUgYW5kIGxpc3QgaWRlbnRpdHkgdmVyaWZpY2F0aW9ucywgd2hpY2ggYXJlIHBlcmZvcm1lZCBvbiBjdXN0b21lcnMgZm9yIEtZQyAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBJbnZvaWNlICAgICAgICAgICAgICB8IC9hcGkvaW52b2ljZXMgICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgZ2V0LCBjYW5jZWwgYW5kIGxpc3QgaW52b2ljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFBheW1lbnRJbnN0cnVjdGlvbiAgIHwgL2FwaS9wYXltZW50X2luc3RydWN0aW9ucyAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgcGF5bWVudCBpbnN0cnVjdGlvbnMgZm9yIGludm9pY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgUHJpY2UgICAgICAgICAgICAgICAgfCAvYXBpL3ByaWNlcyAgICAgICAgICAgICAgICAgICAgfCBHZXQgdGhlIGN1cnJlbnQgcHJpY2VzIGZvciBhc3NldHMgb24gdGhlIHBsYXRmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBRdW90ZSAgICAgICAgICAgICAgICB8IC9hcGkvcXVvdGVzICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBxdW90ZXMsIHdoaWNoIGFyZSByZXF1aXJlZCB0byBleGVjdXRlIHRyYWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFN5bWJvbCAgICAgICAgICAgICAgIHwgL2FwaS9zeW1ib2xzICAgICAgICAgICAgICAgICAgIHwgR2V0IGEgbGlzdCBvZiBzeW1ib2xzIHN1cHBvcnRlZCBmb3IgdHJhZGUgKGV4OiBCVEMtVVNEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgVHJhZGUgICAgICAgICAgICAgICAgfCAvYXBpL3RyYWRlcyAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgdHJhZGVzLCB3aGljaCBidXkgb3Igc2VsbCBjcnlwdG9jdXJyZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBUcmFuc2ZlciAgICAgICAgICAgICB8IC9hcGkvdHJhbnNmZXJzICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IHRyYW5zZmVycyAoZS5nLiwgZnVuZGluZywgYm9vaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFdvcmtmbG93ICAgICAgICAgICAgIHwgL2FwaS93b3JrZmxvd3MgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3Qgd29ya2Zsb3dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAjIyBVbmRlcnN0YW5kaW5nIE9iamVjdCBNb2RlbHMgJiBFbmRwb2ludHMgICoqT3JnYW5pemF0aW9ucyoqICBBbiBgT3JnYW5pemF0aW9uYCBpcyBtZWFudCB0byByZXByZXNlbnQgdGhlIG9yZ2FuaXphdGlvbiBwYXJ0bmVyaW5nIHdpdGggQ3licmlkIHRvIHVzZSBvdXIgcGxhdGZvcm0uICBBbiBgT3JnYW5pemF0aW9uYCB0eXBpY2FsbHkgZG9lcyBub3QgZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCBgY3VzdG9tZXJzYC4gSW5zdGVhZCwgYW4gT3JnYW5pemF0aW9uIGhhcyBvbmUgb3IgbW9yZSBgYmFua3NgLCB3aGljaCBlbmNvbXBhc3MgdGhlIGZpbmFuY2lhbCBzZXJ2aWNlIG9mZmVyaW5ncyBvZiB0aGUgcGxhdGZvcm0uICAqKkJhbmtzKiogIEEgYEJhbmtgIGlzIG93bmVkIGJ5IGFuIGBPcmdhbml6YXRpb25gIGFuZCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhbiBlbnZpcm9ubWVudCBvciBjb250YWluZXIgZm9yIGBjdXN0b21lcnNgIGFuZCBwcm9kdWN0IG9mZmVyaW5ncy4gQmFua3MgYXJlIGNyZWF0ZWQgaW4gZWl0aGVyIGBTYW5kYm94YCBvciBgUHJvZHVjdGlvbmAgbW9kZSwgd2hlcmUgYFNhbmRib3hgIGlzIHRoZSBlbnZpcm9ubWVudCB0aGF0IHlvdSB3b3VsZCB0ZXN0LCBwcm90b3R5cGUgYW5kIGJ1aWxkIGluIHByaW9yIHRvIG1vdmluZyB0byBgUHJvZHVjdGlvbmAuICBBbiBgT3JnYW5pemF0aW9uYCBjYW4gaGF2ZSBtdWx0aXBsZSBgYmFua3NgLCBpbiBlaXRoZXIgYFNhbmRib3hgIG9yIGBQcm9kdWN0aW9uYCBlbnZpcm9ubWVudHMuIEEgYFNhbmRib3ggQmFua2Agd2lsbCBiZSBiYWNrZWQgYnkgc3R1YmJlZCBkYXRhIGFuZCBwcm9jZXNzIGZsb3dzLiBGb3IgaW5zdGFuY2UsIGZ1bmRpbmcgc291cmNlIHRyYW5zZmVyIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRyYWRlcyB3aWxsIGJlIHNpbXVsYXRlZCByYXRoZXIgdGhhbiBwZXJmb3JtZWQsIGhvd2V2ZXIgYXNzZXQgcHJpY2VzIGFyZSByZXByZXNlbnRhdGl2ZSBvZiByZWFsLXdvcmxkIHZhbHVlcy4gWW91IGhhdmUgYW4gdW5saW1pdGVkIGFtb3VudCBvZiBzaW11bGF0ZWQgZmlhdCBjdXJyZW5jeSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gICoqQ3VzdG9tZXJzKiogIGBDdXN0b21lcnNgIHJlcHJlc2VudCB5b3VyIGJhbmtpbmcgdXNlcnMgb24gdGhlIHBsYXRmb3JtLiBBdCBwcmVzZW50LCB3ZSBvZmZlciBzdXBwb3J0IGZvciBgSW5kaXZpZHVhbHNgIGFzIEN1c3RvbWVycy4gIGBDdXN0b21lcnNgIG11c3QgYmUgdmVyaWZpZWQgKGkuZS4sIEtZQ1xcJ2QpIGluIG91ciBzeXN0ZW0gYmVmb3JlIHRoZXkgY2FuIHBsYXkgYW55IHBhcnQgb24gdGhlIHBsYXRmb3JtLCB3aGljaCBtZWFucyB0aGV5IG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGFuZCBhIHBhc3NpbmcgYElkZW50aXR5IFZlcmlmaWNhdGlvbmAuIFNlZSB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gaG93IGEgY3VzdG9tZXIgY2FuIGJlIHZlcmlmaWVkLiAgYEN1c3RvbWVyc2AgbXVzdCBhbHNvIGhhdmUgYW4gYEFjY291bnRgIHRvIGJlIGFibGUgdG8gdHJhbnNhY3QsIGluIHRoZSBkZXNpcmVkIGFzc2V0IGNsYXNzLiBTZWUgdGhlIEFjY291bnRzIEFQSXMgZm9yIG1vcmUgZGV0YWlscyBvbiBzZXR0aW5nIHVwIGFjY291bnRzIGZvciB0aGUgY3VzdG9tZXIuIFxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiB2MC4xMjMuMTUyXG4gKiBDb250YWN0OiBzdXBwb3J0QGN5YnJpZC5hcHBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbi8qIHRzbGludDpkaXNhYmxlOm5vLXVudXNlZC12YXJpYWJsZSBtZW1iZXItb3JkZXJpbmcgKi9cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9ICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsXG4gICAgICAgICBIdHRwUmVzcG9uc2UsIEh0dHBFdmVudCwgSHR0cFBhcmFtZXRlckNvZGVjLCBIdHRwQ29udGV4dCBcbiAgICAgICAgfSAgICAgICBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDdXN0b21IdHRwUGFyYW1ldGVyQ29kZWMgfSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vZW5jb2Rlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAncnhqcyc7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEVycm9yUmVzcG9uc2VCYW5rTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9lcnJvclJlc3BvbnNlJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9leHRlcm5hbEJhbmtBY2NvdW50Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEV4dGVybmFsQmFua0FjY291bnRMaXN0QmFua01vZGVsIH0gZnJvbSAnLi4vbW9kZWwvZXh0ZXJuYWxCYW5rQWNjb3VudExpc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsIH0gZnJvbSAnLi4vbW9kZWwvcGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsIH0gZnJvbSAnLi4vbW9kZWwvcG9zdEV4dGVybmFsQmFua0FjY291bnQnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBCQVNFX1BBVEgsIENPTExFQ1RJT05fRk9STUFUUyB9ICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vdmFyaWFibGVzJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcblxuXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEV4dGVybmFsQmFua0FjY291bnRzU2VydmljZSB7XG5cbiAgICBwcm90ZWN0ZWQgYmFzZVBhdGggPSAnaHR0cHM6Ly9iYW5rLnNhbmRib3guY3licmlkLmFwcCc7XG4gICAgcHVibGljIGRlZmF1bHRIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgcHVibGljIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpO1xuICAgIHB1YmxpYyBlbmNvZGVyOiBIdHRwUGFyYW1ldGVyQ29kZWM7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaHR0cENsaWVudDogSHR0cENsaWVudCwgQE9wdGlvbmFsKClASW5qZWN0KEJBU0VfUEFUSCkgYmFzZVBhdGg6IHN0cmluZywgQE9wdGlvbmFsKCkgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbikge1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYmFzZVBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgYmFzZVBhdGggPSB0aGlzLmJhc2VQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRoID0gYmFzZVBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbmNvZGVyID0gdGhpcy5jb25maWd1cmF0aW9uLmVuY29kZXIgfHwgbmV3IEN1c3RvbUh0dHBQYXJhbWV0ZXJDb2RlYygpO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBhZGRUb0h0dHBQYXJhbXMoaHR0cFBhcmFtczogSHR0cFBhcmFtcywgdmFsdWU6IGFueSwga2V5Pzogc3RyaW5nKTogSHR0cFBhcmFtcyB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBEYXRlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCB2YWx1ZSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHR0cFBhcmFtcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zOiBIdHRwUGFyYW1zLCB2YWx1ZT86IGFueSwga2V5Pzogc3RyaW5nKTogSHR0cFBhcmFtcyB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gaHR0cFBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICh2YWx1ZSBhcyBhbnlbXSkuZm9yRWFjaCggZWxlbSA9PiBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgZWxlbSwga2V5KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5hcHBlbmQoa2V5LCAodmFsdWUgYXMgRGF0ZSkudG9JU09TdHJpbmcoKS5zdWJzdHIoMCwgMTApKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwia2V5IG1heSBub3QgYmUgbnVsbCBpZiB2YWx1ZSBpcyBEYXRlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmZvckVhY2goIGsgPT4gaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKFxuICAgICAgICAgICAgICAgICAgICBodHRwUGFyYW1zLCB2YWx1ZVtrXSwga2V5ICE9IG51bGwgPyBgJHtrZXl9LiR7a31gIDogaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcImtleSBtYXkgbm90IGJlIG51bGwgaWYgdmFsdWUgaXMgbm90IG9iamVjdCBvciBhcnJheVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHR0cFBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgRXh0ZXJuYWxCYW5rQWNjb3VudFxuICAgICAqIENyZWF0ZSBhbiBFeHRlcm5hbEJhbmtBY2NvdW50LiAgIyMgQWNjb3VudCBjcmVhdGlvbiAgQWNjb3VudHMgY2FuIGJlIGNyZWF0ZWQgZm9yIGEgQmFuayBvciBhIEN1c3RvbWVyLiAgVG8gY3JlYXRlIGFjY291bnRzIGZvciB5b3VyIEJhbmssIG9taXQgdGhlICYjeDYwO2N1c3RvbWVyX2d1aWQmI3g2MDsgcGFyYW1ldGVyIGluIHRoZSByZXF1ZXN0IGJvZHkuIFRvIGNyZWF0ZSBhY2NvdW50cyBmb3IgeW91ciBDdXN0b21lcnMsIGluY2x1ZGUgdGhlICYjeDYwO2N1c3RvbWVyX2d1aWQmI3g2MDsgcGFyYW1ldGVyIGluIHRoZSByZXF1ZXN0IGJvZHkuICAjIyBTdGF0ZSAgfCBTdGF0ZSB8IERlc2NyaXB0aW9uIHwgfC0tLS0tLS18LS0tLS0tLS0tLS0tLXwgfCBzdG9yaW5nIHwgVGhlIFBsYXRmb3JtIGlzIHN0b3JpbmcgdGhlIGV4dGVybmFsIGJhbmsgYWNjb3VudCBkZXRhaWxzIGluIG91ciBwcml2YXRlIHN0b3JlIHwgfCBjb21wbGV0ZWQgfCBUaGUgUGxhdGZvcm0gaGFzIGNyZWF0ZWQgdGhlIGV4dGVybmFsIGJhbmsgYWNjb3VudCB8IHwgdW52ZXJpZmllZCB8IFRoZSBleHRlcm5hbCBiYW5rIGFjY291bnQgaXMgY3JlYXRlZCwgYnV0IGl0IGhhcyBub3QgeWV0IGJlZW4gdmVyaWZpZWQgfCB8IGZhaWxlZCB8IFRoZSBQbGF0Zm9ybSB3YXMgbm90IGFibGUgdG8gc3VjY2Vzc2Z1bGx5IGNyZWF0ZSB0aGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IHwgfCByZWZyZXNoX3JlcXVpcmVkIHwgVGhlIFBsYXRmb3JtIGhhcyBjcmVhdGVkIHRoZSBleHRlcm5hbCBiYW5rIGFjY291bnQsIGJ1dCBuZWVkcyB0byBiZSByZWZyZXNoZWQgfCB8IGRlbGV0aW5nIHwgVGhlIFBsYXRmb3JtIGlzIGRlbGV0aW5nIHRoZSBleHRlcm5hbCBiYW5rIGFjY291bnQgfCB8IGRlbGV0ZWQgfCBUaGUgUGxhdGZvcm0gaGFzIGRlbGV0ZWQgdGhlIGV4dGVybmFsIGJhbmsgYWNjb3VudCB8ICAjIyBGYWlsdXJlIGNvZGVzICB8IENvZGUgfCBEZXNjcmlwdGlvbiB8IHwtLS0tLS18LS0tLS0tLS0tLS0tLXwgfCBpbnZhbGlkX3JvdXRpbmdfbnVtYmVyIHwgVGhlIHByb3ZpZGVkIHJvdXRpbmcgbnVtYmVyIGlzIGludmFsaWQgfCB8IGR1cGxpY2F0ZSB8IEFuIGFjY291bnQgd2l0aCB0aGUgc2FtZSBkZXRhaWxzIGFscmVhZHkgZXhpc3RzIHwgfCBwbGFpZF9wcm9jZXNzb3JfdG9rZW4gfCBBbiBhY2NvdW50IGNvdWxkIG5vdCBiZSBjcmVhdGVkIGR1ZSB0byBhbiBpbnZhbGlkIFBsYWlkIHByb2Nlc3NvciB0b2tlbiBvciBhbiBlcnJvciB3aXRoIFBsYWlkIHwgfCBwbGFpZF9tdWx0aXBsZV9hY2NvdW50cyB8IFRoZSBzdXBwbGllZCBQbGFpZCB0b2tlbiBpcyBhc3NvY2lhdGVkIHdpdGggbXVsdGlwbGUgYWNjb3VudHMuIE11c3Qgb25seSBiZSBhIHNpbmdsZSBhY2NvdW50LiB8IHwgY3JlYXRlX2ZhaWxlZCB8IFRoZSBiYW5rIGFjY291bnQgYW5kIGFzc29jaWF0ZWQgaG9sZGVyIGNvdWxkIG5vdCBiZSBjcmVhdGVkIGNvcnJlY3RseSB8IHwgdW52ZXJpZmllZF9jb3VudGVycGFydHkgfCBUaGUgY291bnRlcnBhcnR5IGFjY291bnQgaXMgdW52ZXJpZmllZCB8ICAgIFJlcXVpcmVkIHNjb3BlOiAqKmV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSoqXG4gICAgICogQHBhcmFtIHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsIFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVFeHRlcm5hbEJhbmtBY2NvdW50KHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsOiBQb3N0RXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbCwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw+O1xuICAgIHB1YmxpYyBjcmVhdGVFeHRlcm5hbEJhbmtBY2NvdW50KHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsOiBQb3N0RXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbCwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8RXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbD4+O1xuICAgIHB1YmxpYyBjcmVhdGVFeHRlcm5hbEJhbmtBY2NvdW50KHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsOiBQb3N0RXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbCwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgY3JlYXRlRXh0ZXJuYWxCYW5rQWNjb3VudChwb3N0RXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbDogUG9zdEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWwsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgaWYgKHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsID09PSBudWxsIHx8IHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlRXh0ZXJuYWxCYW5rQWNjb3VudC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsPihgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9L2FwaS9leHRlcm5hbF9iYW5rX2FjY291bnRzYCxcbiAgICAgICAgICAgIHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBFeHRlcm5hbCBCYW5rIEFjY291bnRcbiAgICAgKiBEZWxldGVzIGFuIGV4dGVybmFsIGJhbmsgYWNjb3VudC4gIFJlcXVpcmVkIHNjb3BlOiAqKmV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSoqXG4gICAgICogQHBhcmFtIGV4dGVybmFsQmFua0FjY291bnRHdWlkIElkZW50aWZpZXIgZm9yIHRoZSBleHRlcm5hbCBiYW5rIGFjY291bnQuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUV4dGVybmFsQmFua0FjY291bnQoZXh0ZXJuYWxCYW5rQWNjb3VudEd1aWQ6IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw+O1xuICAgIHB1YmxpYyBkZWxldGVFeHRlcm5hbEJhbmtBY2NvdW50KGV4dGVybmFsQmFua0FjY291bnRHdWlkOiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgZGVsZXRlRXh0ZXJuYWxCYW5rQWNjb3VudChleHRlcm5hbEJhbmtBY2NvdW50R3VpZDogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbD4+O1xuICAgIHB1YmxpYyBkZWxldGVFeHRlcm5hbEJhbmtBY2NvdW50KGV4dGVybmFsQmFua0FjY291bnRHdWlkOiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgaWYgKGV4dGVybmFsQmFua0FjY291bnRHdWlkID09PSBudWxsIHx8IGV4dGVybmFsQmFua0FjY291bnRHdWlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4dGVybmFsQmFua0FjY291bnRHdWlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVsZXRlRXh0ZXJuYWxCYW5rQWNjb3VudC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5kZWxldGU8RXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbD4oYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofS9hcGkvZXh0ZXJuYWxfYmFua19hY2NvdW50cy8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZXh0ZXJuYWxCYW5rQWNjb3VudEd1aWQpKX1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBFeHRlcm5hbCBCYW5rIEFjY291bnRcbiAgICAgKiBSZXRyaWV2ZXMgYW4gZXh0ZXJuYWwgYmFuayBhY2NvdW50LiAgIyMgRXh0ZXJuYWxCYW5rQWNjb3VudCByZXRyaWV2YWwgIFdoZW4gcmV0cmlldmluZyBhbiBleHRlcm5hbCBiYW5rIGFjY291bnQgYW5kIGluY2x1ZGVfYmFsYW5jZXMgaXMgc2V0IHRvIHRydWUsIHRoZSBQbGF0Zm9ybSB3aWxsIGF0dGVtcHQgdG8gcmV0cmlldmUgdGhlIGJhbGFuY2UgZnJvbSB0aGUgYWNjb3VudFxcJiMzOTtzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIElmIGZvcmNlX2JhbGFuY2VfcmVmcmVzaCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIFBsYXRmb3JtIHdpbGwgYWx3YXlzIGF0dGVtcHQgdG8gcmV0cmlldmUgdGhlIG1vc3QgdXAgdG8gZGF0ZSBiYWxhbmNlIGZyb20gdGhlIGFjY291bnRcXCYjMzk7cyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIGZvcmNlX2JhbGFuY2VfcmVmcmVzaCBpcyBzZXQgdG8gZmFsc2UsIHRoZSBQbGF0Zm9ybSB3aWxsIHJldHVybiB0aGUgY2FjaGVkIGJhbGFuY2UuICBJZiB3aGlsZSBnZXR0aW5nIHRoZSBiYWxhbmNlIHRoZSBQbGF0Zm9ybSBkZXRlcm1pbmVzIHRoYXQgdGhlIGFjY291bnQgbmVlZHMgdG8gYmUgcmVmcmVzaGVkLCB0aGUgUGxhdGZvcm0gd2lsbCByZXR1cm4gYSA0MjIgc3RhdHVzIGNvZGUgd2l0aCB0aGUgbWVzc2FnZSBcXCZxdW90O0JhbmsgYWNjb3VudCByZWZyZXNoIHJlcXVpcmVkXFwmcXVvdDsgYW5kIHRoZSBFeHRlcm5hbEJhbmtBY2NvdW50IHdpbGwgYmUgcHV0IGludG8gdGhlIHJlZnJlc2hfcmVxdWlyZWQgc3RhdGUuICBJZiB3aGlsZSBnZXR0aW5nIHRoZSBiYWxhbmNlIHRoZSBQbGF0Zm9ybSBkZXRlcm1pbmVzIHRoYXQgdGhlIGFjY291bnQgaXMgbm8gbG9uZ2VyIHZhbGlkLCB0aGUgUGxhdGZvcm0gd2lsbCByZXR1cm4gYSA0MjIgc3RhdHVzIGNvZGUgd2l0aCB0aGUgbWVzc2FnZSBcXCZxdW90O0JhbmsgYWNjb3VudCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgYW5kIGlzIGJlaW5nIGRlbGV0ZWQuIEl0IG11c3QgYmUgcmUtYWRkZWRcXCZxdW90OyBhbmQgdGhlIEV4dGVybmFsQmFua0FjY291bnQgd2lsbCBiZSBkZWxldGVkLiAgV2hlbiByZXRyaWV2aW5nIGFuIGV4dGVybmFsIGJhbmsgYWNjb3VudCBhbmQgaW5jbHVkZV9waWkgaXMgc2V0IHRvIHRydWUsIHRoZSBQbGF0Zm9ybSB3aWxsIGluY2x1ZGUgdGhlIGFjY291bnQgaG9sZGVyXFwmIzM5O3MgaW5mb3JtYXRpb24gaW4gdGhlIHJlc3BvbnNlLiAgICBSZXF1aXJlZCBzY29wZTogKipleHRlcm5hbF9iYW5rX2FjY291bnRzOnJlYWQqKlxuICAgICAqIEBwYXJhbSBleHRlcm5hbEJhbmtBY2NvdW50R3VpZCBJZGVudGlmaWVyIGZvciB0aGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50LlxuICAgICAqIEBwYXJhbSBmb3JjZUJhbGFuY2VSZWZyZXNoIEZvcmNlIHRoZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IHRvIGJlIHJldHJpZXZlZC5cbiAgICAgKiBAcGFyYW0gaW5jbHVkZUJhbGFuY2VzIEluY2x1ZGUgYmFsYW5jZSBpbmZvcm1hdGlvbiBpbiB0aGUgcmVzcG9uc2UuIElmICYjeDYwO2ZvcmNlX2JhbGFuY2VfcmVmcmVzaCYjeDYwOyBpcyAmI3g2MDt0cnVlJiN4NjA7LCB0aGUgbW9zdCB1cCB0byBkYXRlIGJhbGFuY2Ugd2lsbCBiZSByZXR1cm5lZC4gSWYgJiN4NjA7Zm9yY2VfYmFsYW5jZV9yZWZyZXNoJiN4NjA7IGlzICYjeDYwO2ZhbHNlJiN4NjA7LCB0aGUgY2FjaGVkIGJhbGFuY2Ugd2lsbCBiZSByZXR1cm5lZC4gJiN4NjA7YmFsYW5jZV91cGRhdGVkX2F0JiN4NjA7IGluIHRoZSByZXNwb25zZSB3aWxsIHByb3ZpZGUgdGhlIHRpbWVzdGFtcCB0aGUgYmFsYW5jZSB3YXMgbGFzdCB1cGRhdGVkLlxuICAgICAqIEBwYXJhbSBpbmNsdWRlUGlpIEluY2x1ZGUgdGhlIGFjY291bnQgaG9sZGVyXFwmIzM5O3MgUElJIGluIHRoZSByZXNwb25zZS5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RXh0ZXJuYWxCYW5rQWNjb3VudChleHRlcm5hbEJhbmtBY2NvdW50R3VpZDogc3RyaW5nLCBmb3JjZUJhbGFuY2VSZWZyZXNoPzogYm9vbGVhbiwgaW5jbHVkZUJhbGFuY2VzPzogYm9vbGVhbiwgaW5jbHVkZVBpaT86IGJvb2xlYW4sIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsPjtcbiAgICBwdWJsaWMgZ2V0RXh0ZXJuYWxCYW5rQWNjb3VudChleHRlcm5hbEJhbmtBY2NvdW50R3VpZDogc3RyaW5nLCBmb3JjZUJhbGFuY2VSZWZyZXNoPzogYm9vbGVhbiwgaW5jbHVkZUJhbGFuY2VzPzogYm9vbGVhbiwgaW5jbHVkZVBpaT86IGJvb2xlYW4sIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgZ2V0RXh0ZXJuYWxCYW5rQWNjb3VudChleHRlcm5hbEJhbmtBY2NvdW50R3VpZDogc3RyaW5nLCBmb3JjZUJhbGFuY2VSZWZyZXNoPzogYm9vbGVhbiwgaW5jbHVkZUJhbGFuY2VzPzogYm9vbGVhbiwgaW5jbHVkZVBpaT86IGJvb2xlYW4sIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsPj47XG4gICAgcHVibGljIGdldEV4dGVybmFsQmFua0FjY291bnQoZXh0ZXJuYWxCYW5rQWNjb3VudEd1aWQ6IHN0cmluZywgZm9yY2VCYWxhbmNlUmVmcmVzaD86IGJvb2xlYW4sIGluY2x1ZGVCYWxhbmNlcz86IGJvb2xlYW4sIGluY2x1ZGVQaWk/OiBib29sZWFuLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGlmIChleHRlcm5hbEJhbmtBY2NvdW50R3VpZCA9PT0gbnVsbCB8fCBleHRlcm5hbEJhbmtBY2NvdW50R3VpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBleHRlcm5hbEJhbmtBY2NvdW50R3VpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEV4dGVybmFsQmFua0FjY291bnQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChmb3JjZUJhbGFuY2VSZWZyZXNoICE9PSB1bmRlZmluZWQgJiYgZm9yY2VCYWxhbmNlUmVmcmVzaCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmZvcmNlQmFsYW5jZVJlZnJlc2gsICdmb3JjZV9iYWxhbmNlX3JlZnJlc2gnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5jbHVkZUJhbGFuY2VzICE9PSB1bmRlZmluZWQgJiYgaW5jbHVkZUJhbGFuY2VzICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+aW5jbHVkZUJhbGFuY2VzLCAnaW5jbHVkZV9iYWxhbmNlcycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdWRlUGlpICE9PSB1bmRlZmluZWQgJiYgaW5jbHVkZVBpaSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmluY2x1ZGVQaWksICdpbmNsdWRlX3BpaScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQmVhcmVyQXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0JlYXJlckF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsPihgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9L2FwaS9leHRlcm5hbF9iYW5rX2FjY291bnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhleHRlcm5hbEJhbmtBY2NvdW50R3VpZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZXh0ZXJuYWwgYmFuayBhY2NvdW50cyBsaXN0XG4gICAgICogUmV0cmlldmVzIGEgbGlzdGluZyBvZiBleHRlcm5hbCBiYW5rIGFjY291bnRzLiAgUmVxdWlyZWQgc2NvcGU6ICoqZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkKipcbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSBpbmRleCB0byByZXRyaWV2ZS5cbiAgICAgKiBAcGFyYW0gcGVyUGFnZSBUaGUgbnVtYmVyIG9mIGVudGl0aWVzIHBlciBwYWdlIHRvIHJldHVybi5cbiAgICAgKiBAcGFyYW0gZ3VpZCBDb21tYSBzZXBhcmF0ZWQgZXh0ZXJuYWxfYmFua19hY2NvdW50X2d1aWRzIHRvIGxpc3QgZXh0ZXJuYWxfYmFua19hY2NvdW50cyBmb3IuXG4gICAgICogQHBhcmFtIGJhbmtHdWlkIENvbW1hIHNlcGFyYXRlZCBiYW5rX2d1aWRzIHRvIGxpc3QgZXh0ZXJuYWxfYmFua19hY2NvdW50cyBmb3IuXG4gICAgICogQHBhcmFtIGN1c3RvbWVyR3VpZCBDb21tYSBzZXBhcmF0ZWQgY3VzdG9tZXJfZ3VpZHMgdG8gbGlzdCBleHRlcm5hbF9iYW5rX2FjY291bnRzIGZvci5cbiAgICAgKiBAcGFyYW0gYXNzZXQgQ29tbWEgc2VwYXJhdGVkIGFzc2V0cyB0byBsaXN0IGV4dGVybmFsX2JhbmtfYWNjb3VudHMgZm9yLlxuICAgICAqIEBwYXJhbSBzdGF0ZSBDb21tYSBzZXBhcmF0ZWQgc3RhdGVzIHRvIGxpc3QgZXh0ZXJuYWxfYmFua19hY2NvdW50cyBmb3IuIEZpbHRlcmluZyBieSBcXCZxdW90O2NvbXBsZXRlZFxcJnF1b3Q7IGFuZCBcXCZxdW90O3VudmVyaWZpZWRcXCZxdW90OyBzdGF0ZXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGluZGl2aWR1YWwgY3VzdG9tZXIgYWNjb3VudHMuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGxpc3RFeHRlcm5hbEJhbmtBY2NvdW50cyhwYWdlPzogc3RyaW5nLCBwZXJQYWdlPzogc3RyaW5nLCBndWlkPzogc3RyaW5nLCBiYW5rR3VpZD86IHN0cmluZywgY3VzdG9tZXJHdWlkPzogc3RyaW5nLCBhc3NldD86IHN0cmluZywgc3RhdGU/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxFeHRlcm5hbEJhbmtBY2NvdW50TGlzdEJhbmtNb2RlbD47XG4gICAgcHVibGljIGxpc3RFeHRlcm5hbEJhbmtBY2NvdW50cyhwYWdlPzogc3RyaW5nLCBwZXJQYWdlPzogc3RyaW5nLCBndWlkPzogc3RyaW5nLCBiYW5rR3VpZD86IHN0cmluZywgY3VzdG9tZXJHdWlkPzogc3RyaW5nLCBhc3NldD86IHN0cmluZywgc3RhdGU/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEV4dGVybmFsQmFua0FjY291bnRMaXN0QmFua01vZGVsPj47XG4gICAgcHVibGljIGxpc3RFeHRlcm5hbEJhbmtBY2NvdW50cyhwYWdlPzogc3RyaW5nLCBwZXJQYWdlPzogc3RyaW5nLCBndWlkPzogc3RyaW5nLCBiYW5rR3VpZD86IHN0cmluZywgY3VzdG9tZXJHdWlkPzogc3RyaW5nLCBhc3NldD86IHN0cmluZywgc3RhdGU/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxFeHRlcm5hbEJhbmtBY2NvdW50TGlzdEJhbmtNb2RlbD4+O1xuICAgIHB1YmxpYyBsaXN0RXh0ZXJuYWxCYW5rQWNjb3VudHMocGFnZT86IHN0cmluZywgcGVyUGFnZT86IHN0cmluZywgZ3VpZD86IHN0cmluZywgYmFua0d1aWQ/OiBzdHJpbmcsIGN1c3RvbWVyR3VpZD86IHN0cmluZywgYXNzZXQ/OiBzdHJpbmcsIHN0YXRlPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wYWdlLCAncGFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJQYWdlICE9PSB1bmRlZmluZWQgJiYgcGVyUGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBlclBhZ2UsICdwZXJfcGFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChndWlkICE9PSB1bmRlZmluZWQgJiYgZ3VpZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pmd1aWQsICdndWlkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhbmtHdWlkICE9PSB1bmRlZmluZWQgJiYgYmFua0d1aWQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5iYW5rR3VpZCwgJ2JhbmtfZ3VpZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXN0b21lckd1aWQgIT09IHVuZGVmaW5lZCAmJiBjdXN0b21lckd1aWQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5jdXN0b21lckd1aWQsICdjdXN0b21lcl9ndWlkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzc2V0ICE9PSB1bmRlZmluZWQgJiYgYXNzZXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc3NldCwgJ2Fzc2V0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlICE9PSB1bmRlZmluZWQgJiYgc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5zdGF0ZSwgJ3N0YXRlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChCZWFyZXJBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnQmVhcmVyQXV0aCcpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEV4dGVybmFsQmFua0FjY291bnRMaXN0QmFua01vZGVsPihgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9L2FwaS9leHRlcm5hbF9iYW5rX2FjY291bnRzYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhdGNoIEV4dGVybmFsQmFua0FjY291bnRcbiAgICAgKiBQYXRjaCBhbiBleHRlcm5hbCBiYW5rIGFjY291bnQuICBSZXF1aXJlZCBzY29wZTogKipleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlKipcbiAgICAgKiBAcGFyYW0gZXh0ZXJuYWxCYW5rQWNjb3VudEd1aWQgSWRlbnRpZmllciBmb3IgdGhlIGV4dGVybmFsIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAcGFyYW0gcGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsIFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBwYXRjaEV4dGVybmFsQmFua0FjY291bnQoZXh0ZXJuYWxCYW5rQWNjb3VudEd1aWQ6IHN0cmluZywgcGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsOiBQYXRjaEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWwsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsPjtcbiAgICBwdWJsaWMgcGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50KGV4dGVybmFsQmFua0FjY291bnRHdWlkOiBzdHJpbmcsIHBhdGNoRXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbDogUGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsPj47XG4gICAgcHVibGljIHBhdGNoRXh0ZXJuYWxCYW5rQWNjb3VudChleHRlcm5hbEJhbmtBY2NvdW50R3VpZDogc3RyaW5nLCBwYXRjaEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw6IFBhdGNoRXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbCwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgcGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50KGV4dGVybmFsQmFua0FjY291bnRHdWlkOiBzdHJpbmcsIHBhdGNoRXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbDogUGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGlmIChleHRlcm5hbEJhbmtBY2NvdW50R3VpZCA9PT0gbnVsbCB8fCBleHRlcm5hbEJhbmtBY2NvdW50R3VpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBleHRlcm5hbEJhbmtBY2NvdW50R3VpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBhdGNoRXh0ZXJuYWxCYW5rQWNjb3VudC4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsID09PSBudWxsIHx8IHBhdGNoRXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBwYXRjaEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWwgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBwYXRjaEV4dGVybmFsQmFua0FjY291bnQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChCZWFyZXJBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnQmVhcmVyQXV0aCcpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBhdGNoPEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw+KGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0vYXBpL2V4dGVybmFsX2JhbmtfYWNjb3VudHMvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGV4dGVybmFsQmFua0FjY291bnRHdWlkKSl9YCxcbiAgICAgICAgICAgIHBhdGNoRXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbn1cbiJdfQ==
402
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZXJuYWxCYW5rQWNjb3VudHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FwaS9leHRlcm5hbEJhbmtBY2NvdW50cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQTJCLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFDVSxXQUFXLEVBQ3hELE1BQVksc0JBQXNCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQStCLFlBQVksQ0FBQztBQWMvRSxhQUFhO0FBQ2IsT0FBTyxFQUFFLFNBQVMsRUFBc0IsTUFBMEIsY0FBYyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBMEMsa0JBQWtCLENBQUM7Ozs7QUFPckYsTUFBTSxPQUFPLDJCQUEyQjtJQU9wQyxZQUFzQixVQUFzQixFQUFnQyxRQUFnQixFQUFjLGFBQTRCO1FBQWhILGVBQVUsR0FBVixVQUFVLENBQVk7UUFMbEMsYUFBUSxHQUFHLGlDQUFpQyxDQUFDO1FBQ2hELG1CQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxrQkFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFJdkMsSUFBSSxhQUFhLEVBQUU7WUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztTQUN0QztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDakQsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7Z0JBQzlCLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQzVCO1lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1NBQzFDO1FBQ0QsSUFB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QUFFO1lBQ3ZDLGVBQWUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1NBQ2xGO1FBRUQsSUFBSSxhQUFhLEdBQTZCLE1BQU0sQ0FBQztRQUNyRCxJQUFJLGdDQUFnQyxFQUFFO1lBQ2xDLElBQUksZ0NBQWdDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNyRCxhQUFhLEdBQUcsTUFBTSxDQUFDO2FBQzFCO2lCQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsZ0NBQWdDLENBQUMsRUFBRTtnQkFDeEUsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtpQkFBTTtnQkFDSCxhQUFhLEdBQUcsTUFBTSxDQUFDO2FBQzFCO1NBQ0o7UUFFRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUErQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSwrQkFBK0Isa0JBQWtCLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMsRUFBRSxFQUN6SyxpQ0FBaUMsRUFDakM7WUFDSSxPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLFlBQVksRUFBTyxhQUFhO1lBQ2hDLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWU7WUFDbkQsT0FBTyxFQUFFLGVBQWU7WUFDeEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsY0FBYyxFQUFFLGNBQWM7U0FDakMsQ0FDSixDQUFDO0lBQ04sQ0FBQzs7eUhBcmVRLDJCQUEyQiw0Q0FPNkIsU0FBUzs2SEFQakUsMkJBQTJCLGNBRjFCLE1BQU07NEZBRVAsMkJBQTJCO2tCQUh2QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBUWtELFFBQVE7OzBCQUFHLE1BQU07MkJBQUMsU0FBUzs7MEJBQXFCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN5YnJpZCBCYW5rIEFQSVxuICogIyBDeWJyaWQgQVBJIGRvY3VtZW50YXRpb24gIFdlbGNvbWUgdG8gQ3licmlkLCBhbiBhbGwtaW4tb25lIGNyeXB0byBwbGF0Zm9ybSB0aGF0IGVuYWJsZXMgeW91IHRvIGVhc2lseSAqKmJ1aWxkKiogYW5kICoqbGF1bmNoKiogd2hpdGUtbGFiZWwgY3J5cHRvIHByb2R1Y3RzIG9yIHNlcnZpY2VzLiAgSW4gdGhlc2UgZG9jdW1lbnRzLCB5b3VcXCdsbCBmaW5kIGRldGFpbHMgb24gaG93IG91ciBSRVNUIEFQSSBvcGVyYXRlcyBhbmQgZ2VuZXJhbGx5IGhvdyBvdXIgcGxhdGZvcm0gZnVuY3Rpb25zLiAgSWYgeW91XFwncmUgbG9va2luZyBmb3Igb3VyIFVJIFNESyBXaWRnZXRzIGZvciBXZWIgb3IgTW9iaWxlIChpT1MvQW5kcm9pZCksIGdlbmVyYXRlZCBBUEkgY2xpZW50cywgb3IgZGVtbyBhcHBsaWNhdGlvbnMsIGhlYWQgb3ZlciB0byBvdXIgW0dpdGh1YiByZXBvXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcCkuICDwn5KhIFdlIHJlY29tbWVuZCBib29rbWFya2luZyB0aGUgW0N5YnJpZCBMaW5rVHJlZV0oaHR0cHM6Ly9saW5rdHIuZWUvY3licmlkdGVjaG5vbG9naWVzKSB3aGljaCBjb250YWlucyBtYW55IGhlbHBmdWwgbGlua3MgdG8gcGxhdGZvcm0gcmVzb3VyY2VzLiAgIyMgR2V0dGluZyBTdGFydGVkICBUaGlzIGlzIEN5YnJpZFxcJ3MgcHVibGljIGludGVyYWN0aXZlIEFQSSBkb2N1bWVudGF0aW9uLCB3aGljaCBhbGxvd3MgeW91IHRvIGZ1bGx5IHRlc3Qgb3VyIEFQSXMuIElmIHlvdVxcJ2QgbGlrZSB0byB1c2UgYSBkaWZmZXJlbnQgdG9vbCB0byBleGVyY2lzZSBvdXIgQVBJcywgeW91IGNhbiBkb3dubG9hZCB0aGUgW09wZW4gQVBJIDMuMCB5YW1sXShodHRwczovL2JhbmsucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvdjEvc3dhZ2dlci55YW1sKSBmb3IgaW1wb3J0LiAgSWYgeW91XFwncmUgbmV3IHRvIG91ciBBUElzIGFuZCB0aGUgQ3licmlkIFBsYXRmb3JtLCBmb2xsb3cgdGhlIGJlbG93IGd1aWRlcyB0byBnZXQgc2V0IHVwIGFuZCBmYW1pbGlhciB3aXRoIHRoZSBwbGF0Zm9ybTogIDEuIFtJbnRyb2R1Y3Rpb25dKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaW50cm9kdWN0aW9uKSAyLiBbUGxhdGZvcm0gSW50cm9kdWN0aW9uXShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL2hvdy1pcy1jeWJyaWQtYXJjaGl0ZWN0ZWQpIDMuIFtUZXN0aW5nIHdpdGggSG9zdGVkIFdlYiBEZW1vIEFwcF0oaHR0cHM6Ly9kb2NzLmN5YnJpZC54eXovZG9jcy90ZXN0aW5nLXdpdGgtaG9zdGVkLXdlYi1kZW1vLWFwcCkgIEluIFtHZXR0aW5nIFN0YXJ0ZWQgaW4gdGhlIEN5YnJpZCBTYW5kYm94XShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL2hvdy1kby1pLWdldC1zdGFydGVkLXdpdGgtdGhlLXNhbmRib3gpLCB3ZSB3YWxrIHlvdSB0aHJvdWdoIGhvdyB0byB1c2UgdGhlIFtDeWJyaWQgU2FuZGJveF0oaHR0cHM6Ly9pZC5zYW5kYm94LmN5YnJpZC5hcHAvKSB0byBjcmVhdGUgYSB0ZXN0IGJhbmsgYW5kIGdlbmVyYXRlIEFQSSBrZXlzLiBJbiBbR2V0dGluZyBSZWFkeSBmb3IgVHJhZGluZ10oaHR0cHM6Ly9rYi5jeWJyaWQueHl6L2dldHRpbmctcmVhZHktZm9yLXRyYWRpbmcpLCB3ZSB3YWxrIHRocm91Z2ggY3JlYXRpbmcgY3VzdG9tZXJzLCBjdXN0b21lciBpZGVudGl0aWVzLCBhY2NvdW50cywgYXMgd2VsbCBhcyBleGVjdXRpbmcgcXVvdGVzIGFuZCB0cmFkZXMuICAjIyBXb3JraW5nIHdpdGggdGhlIEN5YnJpZCBQbGF0Zm9ybSAgVGhlcmUgYXJlIHRocmVlIHByaW1hcnkgd2F5cyB5b3UgY2FuIGludGVyYWN0IHdpdGggdGhlIEN5YnJpZCBwbGF0Zm9ybTogIDEuIERpcmVjdGx5IHZpYSBvdXIgUkVTVGZ1bCBBUEkgKHRoaXMgZG9jdW1lbnRhdGlvbikgMi4gVXNpbmcgb3VyIEFQSSBjbGllbnRzIGF2YWlsYWJsZSBpbiBhIHZhcmlldHkgb2YgbGFuZ3VhZ2VzIChbQW5ndWxhcl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLWFuZ3VsYXIpLCBbSmF2YV0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLWphdmEpLCBbS290bGluXShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmsta290bGluKSwgW1B5dGhvbl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXB5dGhvbiksIFtSdWJ5XShodHRwczovL2dpdGh1Yi5jb20vQ3licmlkLWFwcC9jeWJyaWQtYXBpLWJhbmstcnVieSksIFtTd2lmdF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXN3aWZ0KSBvciBbVHlwZXNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXR5cGVzY3JpcHQpKSAzLiBJbnRlZ3JhdGluZyBhIHBsYXRmb3JtIHNwZWNpZmljIFNESyAoW1dlYl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay13ZWIpLCBbQW5kcm9pZF0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay1hbmRyb2lkKSwgW2lPU10oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLXNkay1pb3MpKSAgT3VyIGNvbXBsZXRlIHNldCBvZiBBUElzIGFsbG93cyB5b3UgdG8gbWFuYWdlIHJlc291cmNlcyBhY3Jvc3MgdGhyZWUgZGlzdGluY3QgYXJlYXM6IHlvdXIgYE9yZ2FuaXphdGlvbmAsIHlvdXIgYEJhbmtzYCBhbmQgeW91ciBgSWRlbnRpdGllc2AuIEZvciBtb3N0IG9mIHlvdXIgdGVzdGluZyBhbmQgaW50ZXJhY3Rpb24geW91XFwnbGwgYmUgdXNpbmcgdGhlIGBCYW5rYCBBUEksIHdoaWNoIGlzIHdoZXJlIHRoZSBtYWpvcml0eSBvZiBBUElzIHJlc2lkZS4gICpUaGUgY29tcGxldGUgc2V0IG9mIEFQSXMgY2FuIGJlIGZvdW5kIG9uIHRoZSBmb2xsb3dpbmcgcGFnZXM6KiAgfCBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgW09yZ2FuaXphdGlvbiBBUEldKGh0dHBzOi8vb3JnYW5pemF0aW9uLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpICAgfCBBUElzIHRvIG1hbmFnZSBvcmdhbml6YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgW0JhbmsgQVBJXShodHRwczovL2JhbmsucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkgICAgICAgICAgICAgICAgICAgfCBBUElzIHRvIG1hbmFnZSBiYW5rcyAoYW5kIGFsbCBkb3duc3RyZWFtIGN1c3RvbWVyIGFjdGl2aXR5KSB8IHwgW0lkZW50aXRpZXMgQVBJXShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpICAgICAgICAgICAgICAgICAgICAgICB8IEFQSXMgdG8gbWFuYWdlIG9yZ2FuaXphdGlvbiBhbmQgYmFuayBpZGVudGl0aWVzICAgICAgICAgICAgIHwgIEZvciBxdWVzdGlvbnMgcGxlYXNlIGNvbnRhY3QgW1N1cHBvcnRdKG1haWx0bzpzdXBwb3J0QGN5YnJpZC54eXopIGF0IGFueSB0aW1lIGZvciBhc3Npc3RhbmNlLCBvciBjb250YWN0IHRoZSBbUHJvZHVjdCBUZWFtXShtYWlsdG86cHJvZHVjdEBjeWJyaWQueHl6KSBmb3IgcHJvZHVjdCBzdWdnZXN0aW9ucy4gICMjIEF1dGhlbnRpY2F0aW5nIHdpdGggdGhlIEFQSSAgVGhlIEN5YnJpZCBQbGF0Zm9ybSB1c2VzIE9BdXRoIDIuMCBCZWFyZXIgVG9rZW5zIHRvIGF1dGhlbnRpY2F0ZSByZXF1ZXN0cyB0byB0aGUgcGxhdGZvcm0uIENyZWRlbnRpYWxzIHRvIGNyZWF0ZSBgT3JnYW5pemF0aW9uYCBhbmQgYEJhbmtgIHRva2VucyBjYW4gYmUgZ2VuZXJhdGVkIHZpYSB0aGUgW0N5YnJpZCBTYW5kYm94XShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcCkuIEFjY2VzcyB0b2tlbnMgY2FuIGJlIGdlbmVyYXRlZCBmb3IgYSBgQ3VzdG9tZXJgIGFzIHdlbGwgdmlhIHRoZSBbQ3licmlkIElkUF0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHApIGFzIHdlbGwuICBBbiBgT3JnYW5pemF0aW9uYCBhY2Nlc3MgdG9rZW4gYXBwbGllcyBicm9hZGx5IHRvIHRoZSB3aG9sZSBPcmdhbml6YXRpb24gYW5kIGFsbCBvZiBpdHMgYEJhbmtzYCwgd2hlcmVhcywgYSBgQmFua2AgYWNjZXNzIHRva2VuIGlzIHNwZWNpZmljIHRvIGFuIGluZGl2aWR1YWwgQmFuay4gYEN1c3RvbWVyYCB0b2tlbnMsIHNpbWlsYXJseSwgYXJlIHNjb3BlZCB0byBhIHNwZWNpZmljIGN1c3RvbWVyIGluIGEgYmFuay4gIEJvdGggYE9yZ2FuaXphdGlvbmAgYW5kIGBCYW5rYCB0b2tlbnMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIE9BdXRoIENsaWVudCBDcmVkZW50aWFsIEdyYW50IGZsb3cuIEVhY2ggT3JnYW5pemF0aW9uIGFuZCBCYW5rIGhhcyBpdHMgb3duIHVuaXF1ZSBgQ2xpZW50IElEYCBhbmQgYFNlY3JldGAgdGhhdCBhbGxvd3MgZm9yIG1hY2hpbmUtdG8tbWFjaGluZSBhdXRoZW50aWNhdGlvbi4gIEEgYEJhbmtgIGNhbiB0aGVuIGdlbmVyYXRlIGBDdXN0b21lcmAgYWNjZXNzIHRva2VucyB2aWEgQVBJIHVzaW5nIG91ciBbSWRlbnRpdGllcyBBUEldKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSkuICA8Zm9udCBjb2xvcj1cXFwib3JhbmdlXFxcIj4qKuKaoO+4jyBOZXZlciBzaGFyZSB5b3VyIENsaWVudCBJRCBvciBTZWNyZXQgcHVibGljbHkgb3IgaW4geW91ciBzb3VyY2UgY29kZSByZXBvc2l0b3J5LioqPC9mb250PiAgWW91ciBgQ2xpZW50IElEYCBhbmQgYFNlY3JldGAgY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYSB0aW1lLWxpbWl0ZWQgYEJlYXJlciBUb2tlbmAgYnkgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgQ3licmlkIElkZW50aXR5IFByb3ZpZGVyIG9yIHRocm91Z2ggaW50ZXJhY3Rpbmcgd2l0aCB0aGUgKipBdXRob3JpemUqKiBidXR0b24gaW4gdGhpcyBkb2N1bWVudC4gIFRoZSBmb2xsb3dpbmcgY3VybCBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgZ2VuZXJhdGUgYSBgQmVhcmVyIFRva2VuYCBmb3IgdXNlIGluIHRlc3RpbmcgdGhlIEFQSSBvciBkZW1vIGFwcGxpY2F0aW9ucy4gIGBgYCAjIEV4YW1wbGUgcmVxdWVzdCB3aGVuIHVzaW5nIEJhbmsgY3JlZGVudGlhbHMgY3VybCAtWCBQT1NUIGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL29hdXRoL3Rva2VuIC1kIFxcJ3sgICAgIFxcXCJncmFudF90eXBlXFxcIjogXFxcImNsaWVudF9jcmVkZW50aWFsc1xcXCIsICAgICBcXFwiY2xpZW50X2lkXFxcIjogXFxcIjxZb3VyIENsaWVudCBJRD5cXFwiLCAgICAgXFxcImNsaWVudF9zZWNyZXRcXFwiOiBcXFwiPFlvdXIgU2VjcmV0PlxcXCIsICAgICBcXFwic2NvcGVcXFwiOiBcXFwiYmFua3M6cmVhZCBiYW5rczp3cml0ZSBiYW5rX2FwcGxpY2F0aW9uczpleGVjdXRlIGFjY291bnRzOnJlYWQgYWNjb3VudHM6ZXhlY3V0ZSBjb3VudGVycGFydGllczpyZWFkIGNvdW50ZXJwYXJ0aWVzOndyaXRlIGNvdW50ZXJwYXJ0aWVzOmV4ZWN1dGUgY3VzdG9tZXJzOnJlYWQgY3VzdG9tZXJzOndyaXRlIGN1c3RvbWVyczpleGVjdXRlIHByaWNlczpyZWFkIHF1b3RlczpleGVjdXRlIHF1b3RlczpyZWFkIHRyYWRlczpleGVjdXRlIHRyYWRlczpyZWFkIHRyYW5zZmVyczpleGVjdXRlIHRyYW5zZmVyczpyZWFkIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCBleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBleHRlcm5hbF93YWxsZXRzOnJlYWQgZXh0ZXJuYWxfd2FsbGV0czpleGVjdXRlIHdvcmtmbG93czpyZWFkIHdvcmtmbG93czpleGVjdXRlIGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgZGVwb3NpdF9hZGRyZXNzZXM6ZXhlY3V0ZSBkZXBvc2l0X2JhbmtfYWNjb3VudHM6cmVhZCBkZXBvc2l0X2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSBpbnZvaWNlczpyZWFkIGludm9pY2VzOndyaXRlIGludm9pY2VzOmV4ZWN1dGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6d3JpdGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpleGVjdXRlXFxcIiAgIH1cXCcgLUggXFxcIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxcXCIgICMgV2hlbiB1c2luZyBPcmdhbml6YXRpb24gY3JlZGVudGlhbHMgc2V0IGBzY29wZWAgdG8gXFwnb3JnYW5pemF0aW9uczpyZWFkIG9yZ2FuaXphdGlvbnM6d3JpdGUgb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9uczpleGVjdXRlIGJhbmtzOnJlYWQgYmFua3M6d3JpdGUgYmFua3M6ZXhlY3V0ZSBiYW5rX2FwcGxpY2F0aW9uczpleGVjdXRlIHVzZXJzOnJlYWQgdXNlcnM6ZXhlY3V0ZSBjb3VudGVycGFydGllczpyZWFkIGN1c3RvbWVyczpyZWFkIGFjY291bnRzOnJlYWQgcHJpY2VzOnJlYWQgcXVvdGVzOmV4ZWN1dGUgcXVvdGVzOnJlYWQgdHJhZGVzOmV4ZWN1dGUgdHJhZGVzOnJlYWQgdHJhbnNmZXJzOnJlYWQgdHJhbnNmZXJzOmV4ZWN1dGUgZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkIGV4dGVybmFsX3dhbGxldHM6cmVhZCB3b3JrZmxvd3M6cmVhZCBkZXBvc2l0X2FkZHJlc3NlczpyZWFkIGRlcG9zaXRfYmFua19hY2NvdW50czpyZWFkIGludm9pY2VzOnJlYWQgc3Vic2NyaXB0aW9uczpyZWFkIHN1YnNjcmlwdGlvbnM6d3JpdGUgc3Vic2NyaXB0aW9uczpleGVjdXRlIHN1YnNjcmlwdGlvbl9ldmVudHM6cmVhZCBzdWJzY3JpcHRpb25fZXZlbnRzOmV4ZWN1dGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpyZWFkXFwnIGBgYCA8Zm9udCBjb2xvcj1cXFwib3JhbmdlXFxcIj4qKuKaoO+4jyBOb3RlOiBUaGUgYWJvdmUgY3VybCB3aWxsIGNyZWF0ZSBhIGJlYXJlciB0b2tlbiB3aXRoIGZ1bGwgc2NvcGUgYWNjZXNzLiBEZWxldGUgc2NvcGVzIGlmIHlvdVxcJ2QgbGlrZSB0byByZXN0cmljdCBhY2Nlc3MuKio8L2ZvbnQ+ICAjIyBBdXRoZW50aWNhdGlvbiBTY29wZXMgIFRoZSBDeWJyaWQgcGxhdGZvcm0gc3VwcG9ydHMgdGhlIHVzZSBvZiBzY29wZXMgdG8gY29udHJvbCB0aGUgbGV2ZWwgb2YgYWNjZXNzIGEgdG9rZW4gaXMgbGltaXRlZCB0by4gU2NvcGVzIGRvIG5vdCBncmFudCBhY2Nlc3MgdG8gcmVzb3VyY2VzOyBpbnN0ZWFkLCB0aGV5IHByb3ZpZGUgbGltaXRzLCBpbiBzdXBwb3J0IG9mIHRoZSBsZWFzdCBwcml2aWxlZ2UgcHJpbmNpcGFsLiAgVGhlIGZvbGxvd2luZyBzY29wZXMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgcGxhdGZvcm0gYW5kIGNhbiBiZSByZXF1ZXN0ZWQgd2hlbiBnZW5lcmF0aW5nIGVpdGhlciBhbiBPcmdhbml6YXRpb24sIEJhbmsgb3IgQ3VzdG9tZXIgdG9rZW4uIEdlbmVyYWxseSBzcGVha2luZywgdGhlIF9SZWFkXyBzY29wZSBpcyByZXF1aXJlZCB0byByZWFkIGFuZCBsaXN0IHJlc291cmNlcywgdGhlIF9Xcml0ZV8gc2NvcGUgaXMgcmVxdWlyZWQgdG8gdXBkYXRlIGEgcmVzb3VyY2UgYW5kIHRoZSBfRXhlY3V0ZV8gc2NvcGUgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGEgcmVzb3VyY2UuICB8IFJlc291cmNlICAgICAgICAgICAgICB8IFJlYWQgc2NvcGUgKFRva2VuIFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXcml0ZSBzY29wZSAoVG9rZW4gVHlwZSkgICAgICAgICAgICAgICAgICAgICAgfCBFeGVjdXRlIHNjb3BlIChUb2tlbiBUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IEFjY291bnQgICAgICAgICAgICAgICB8IGFjY291bnRzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhY2NvdW50czpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICAgICAgICAgICB8IGJhbmtzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYW5rczp3cml0ZSAoT3JnYW5pemF0aW9uLCBCYW5rKSAgICAgICAgICAgICAgfCBiYW5rczpleGVjdXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgfCB8IEN1c3RvbWVyICAgICAgICAgICAgICB8IGN1c3RvbWVyczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCBjdXN0b21lcnM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCBjdXN0b21lcnM6ZXhlY3V0ZSAoQmFuaykgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IENvdW50ZXJwYXJ0eSAgICAgICAgICB8IGNvdW50ZXJwYXJ0aWVzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCBjb3VudGVycGFydGllczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCBjb3VudGVycGFydGllczpleGVjdXRlIChCYW5rKSAgICAgICAgICAgICAgICAgICAgfCB8IERlcG9zaXQgQWRkcmVzcyAgICAgICB8IGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgfCBkZXBvc2l0X2FkZHJlc3Nlczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgfCBkZXBvc2l0X2FkZHJlc3NlczpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgfCB8IEV4dGVybmFsIEJhbmsgQWNjb3VudCB8IGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgfCBleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlIChCYW5rLCBDdXN0b21lcikgfCBleHRlcm5hbF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgfCB8IEV4dGVybmFsIFdhbGxldCAgICAgICB8IGV4dGVybmFsX3dhbGxldDpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleHRlcm5hbF93YWxsZXQ6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgfCB8IE9yZ2FuaXphdGlvbiAgICAgICAgICB8IG9yZ2FuaXphdGlvbnM6cmVhZCAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvcmdhbml6YXRpb25zOndyaXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IFVzZXIgICAgICAgICAgICAgICAgICB8IHVzZXJzOnJlYWQgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1c2VyczpleGVjdXRlIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgfCB8IFByaWNlICAgICAgICAgICAgICAgICB8IHByaWNlczpyZWFkIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IFF1b3RlICAgICAgICAgICAgICAgICB8IHF1b3RlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxdW90ZXM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgfCB8IFRyYWRlICAgICAgICAgICAgICAgICB8IHRyYWRlczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFkZXM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgfCB8IFRyYW5zZmVyICAgICAgICAgICAgICB8IHRyYW5zZmVyczpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2ZlcnM6ZXhlY3V0ZSAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgfCB8IFdvcmtmbG93ICAgICAgICAgICAgICB8IHdvcmtmbG93czpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3b3JrZmxvd3M6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCB8IEludm9pY2UgICAgICAgICAgICAgICB8IGludm9pY2VzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCBpbnZvaWNlczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgfCBpbnZvaWNlczpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICAgfCAgIyMgQXZhaWxhYmxlIEVuZHBvaW50cyAgVGhlIGF2YWlsYWJsZSBBUElzIGZvciB0aGUgW0lkZW50aXR5XShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpLCBbT3JnYW5pemF0aW9uXShodHRwczovL29yZ2FuaXphdGlvbi5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSBhbmQgW0JhbmtdKGh0dHBzOi8vYmFuay5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSBBUEkgc2VydmljZXMgYXJlIGxpc3RlZCBiZWxvdzogIHwgQVBJIFNlcnZpY2UgIHwgTW9kZWwgICAgICAgICAgICAgICAgfCBBUEkgRW5kcG9pbnQgUGF0aCAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IElkZW50aXR5ICAgICB8IEJhbmsgICAgICAgICAgICAgICAgIHwgL2FwaS9iYW5rX2FwcGxpY2F0aW9ucyAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGJhbmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgSWRlbnRpdHkgICAgIHwgQ3VzdG9tZXJUb2tlbiAgICAgICAgfCAvYXBpL2N1c3RvbWVyX3Rva2VucyAgICAgICAgICAgfCBDcmVhdGUgY3VzdG9tZXIgSldUIGFjY2VzcyB0b2tlbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBJZGVudGl0eSAgICAgfCBPcmdhbml6YXRpb24gICAgICAgICB8IC9hcGkvb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9ucyB8IENyZWF0ZSBhbmQgbGlzdCBvcmdhbml6YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IElkZW50aXR5ICAgICB8IE9yZ2FuaXphdGlvbiAgICAgICAgIHwgL2FwaS91c2VycyAgICAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IG9yZ2FuaXphdGlvbiB1c2VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgT3JnYW5pemF0aW9uIHwgT3JnYW5pemF0aW9uICAgICAgICAgfCAvYXBpL29yZ2FuaXphdGlvbnMgICAgICAgICAgICAgfCBBUElzIHRvIHJldHJpZXZlIGFuZCB1cGRhdGUgb3JnYW5pemF0aW9uIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBBY2NvdW50ICAgICAgICAgICAgICB8IC9hcGkvYWNjb3VudHMgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBhY2NvdW50cywgd2hpY2ggaG9sZCBhIHNwZWNpZmljIGFzc2V0IGZvciBhIGN1c3RvbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEFzc2V0ICAgICAgICAgICAgICAgIHwgL2FwaS9hc3NldHMgICAgICAgICAgICAgICAgICAgIHwgR2V0IGEgbGlzdCBvZiBhc3NldHMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybSAoZXg6IEJUQywgRVRIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQmFuayAgICAgICAgICAgICAgICAgfCAvYXBpL2JhbmtzICAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUsIHVwZGF0ZSBhbmQgbGlzdCBiYW5rcywgdGhlIHBhcmVudCB0byBjdXN0b21lcnMsIGFjY291bnRzLCBldGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBDdXN0b21lciAgICAgICAgICAgICB8IC9hcGkvY3VzdG9tZXJzICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBjdXN0b21lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IENvdW50ZXJwYXJ0eSAgICAgICAgIHwgL2FwaS9jb3VudGVycGFydGllcyAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGNvdW50ZXJwYXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgRGVwb3NpdEFkZHJlc3MgICAgICAgfCAvYXBpL2RlcG9zaXRfYWRkcmVzc2VzICAgICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCBkZXBvc2l0IGFkZHJlc3NlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBFeHRlcm5hbEJhbmtBY2NvdW50ICB8IC9hcGkvZXh0ZXJuYWxfYmFua19hY2NvdW50cyAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IGV4dGVybmFsIGJhbmsgYWNjb3VudHMsIHdoaWNoIGNvbm5lY3QgY3VzdG9tZXIgYmFuayBhY2NvdW50cyB0byB0aGUgcGxhdGZvcm0gfCB8IEJhbmsgICAgICAgICB8IEV4dGVybmFsV2FsbGV0ICAgICAgIHwgL2FwaS9leHRlcm5hbF93YWxsZXRzICAgICAgICAgIHwgQ3JlYXRlLCBnZXQsIGxpc3QgYW5kIGRlbGV0ZSBleHRlcm5hbCB3YWxsZXRzLCB3aGljaCBjb25uZWN0IGN1c3RvbWVyIHdhbGxldHMgdG8gdGhlIHBsYXRmb3JtICAgICB8IHwgQmFuayAgICAgICAgIHwgSWRlbnRpdHlWZXJpZmljYXRpb24gfCAvYXBpL2lkZW50aXR5X3ZlcmlmaWNhdGlvbnMgICAgfCBDcmVhdGUgYW5kIGxpc3QgaWRlbnRpdHkgdmVyaWZpY2F0aW9ucywgd2hpY2ggYXJlIHBlcmZvcm1lZCBvbiBjdXN0b21lcnMgZm9yIEtZQyAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBJbnZvaWNlICAgICAgICAgICAgICB8IC9hcGkvaW52b2ljZXMgICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgZ2V0LCBjYW5jZWwgYW5kIGxpc3QgaW52b2ljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFBheW1lbnRJbnN0cnVjdGlvbiAgIHwgL2FwaS9wYXltZW50X2luc3RydWN0aW9ucyAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgcGF5bWVudCBpbnN0cnVjdGlvbnMgZm9yIGludm9pY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgUHJpY2UgICAgICAgICAgICAgICAgfCAvYXBpL3ByaWNlcyAgICAgICAgICAgICAgICAgICAgfCBHZXQgdGhlIGN1cnJlbnQgcHJpY2VzIGZvciBhc3NldHMgb24gdGhlIHBsYXRmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBRdW90ZSAgICAgICAgICAgICAgICB8IC9hcGkvcXVvdGVzICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCBxdW90ZXMsIHdoaWNoIGFyZSByZXF1aXJlZCB0byBleGVjdXRlIHRyYWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFN5bWJvbCAgICAgICAgICAgICAgIHwgL2FwaS9zeW1ib2xzICAgICAgICAgICAgICAgICAgIHwgR2V0IGEgbGlzdCBvZiBzeW1ib2xzIHN1cHBvcnRlZCBmb3IgdHJhZGUgKGV4OiBCVEMtVVNEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgVHJhZGUgICAgICAgICAgICAgICAgfCAvYXBpL3RyYWRlcyAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgdHJhZGVzLCB3aGljaCBidXkgb3Igc2VsbCBjcnlwdG9jdXJyZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBUcmFuc2ZlciAgICAgICAgICAgICB8IC9hcGkvdHJhbnNmZXJzICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IHRyYW5zZmVycyAoZS5nLiwgZnVuZGluZywgYm9vaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFdvcmtmbG93ICAgICAgICAgICAgIHwgL2FwaS93b3JrZmxvd3MgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3Qgd29ya2Zsb3dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAjIyBVbmRlcnN0YW5kaW5nIE9iamVjdCBNb2RlbHMgJiBFbmRwb2ludHMgICoqT3JnYW5pemF0aW9ucyoqICBBbiBgT3JnYW5pemF0aW9uYCBpcyBtZWFudCB0byByZXByZXNlbnQgdGhlIG9yZ2FuaXphdGlvbiBwYXJ0bmVyaW5nIHdpdGggQ3licmlkIHRvIHVzZSBvdXIgcGxhdGZvcm0uICBBbiBgT3JnYW5pemF0aW9uYCB0eXBpY2FsbHkgZG9lcyBub3QgZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCBgY3VzdG9tZXJzYC4gSW5zdGVhZCwgYW4gT3JnYW5pemF0aW9uIGhhcyBvbmUgb3IgbW9yZSBgYmFua3NgLCB3aGljaCBlbmNvbXBhc3MgdGhlIGZpbmFuY2lhbCBzZXJ2aWNlIG9mZmVyaW5ncyBvZiB0aGUgcGxhdGZvcm0uICAqKkJhbmtzKiogIEEgYEJhbmtgIGlzIG93bmVkIGJ5IGFuIGBPcmdhbml6YXRpb25gIGFuZCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhbiBlbnZpcm9ubWVudCBvciBjb250YWluZXIgZm9yIGBjdXN0b21lcnNgIGFuZCBwcm9kdWN0IG9mZmVyaW5ncy4gQmFua3MgYXJlIGNyZWF0ZWQgaW4gZWl0aGVyIGBTYW5kYm94YCBvciBgUHJvZHVjdGlvbmAgbW9kZSwgd2hlcmUgYFNhbmRib3hgIGlzIHRoZSBlbnZpcm9ubWVudCB0aGF0IHlvdSB3b3VsZCB0ZXN0LCBwcm90b3R5cGUgYW5kIGJ1aWxkIGluIHByaW9yIHRvIG1vdmluZyB0byBgUHJvZHVjdGlvbmAuICBBbiBgT3JnYW5pemF0aW9uYCBjYW4gaGF2ZSBtdWx0aXBsZSBgYmFua3NgLCBpbiBlaXRoZXIgYFNhbmRib3hgIG9yIGBQcm9kdWN0aW9uYCBlbnZpcm9ubWVudHMuIEEgYFNhbmRib3ggQmFua2Agd2lsbCBiZSBiYWNrZWQgYnkgc3R1YmJlZCBkYXRhIGFuZCBwcm9jZXNzIGZsb3dzLiBGb3IgaW5zdGFuY2UsIGZ1bmRpbmcgc291cmNlIHRyYW5zZmVyIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRyYWRlcyB3aWxsIGJlIHNpbXVsYXRlZCByYXRoZXIgdGhhbiBwZXJmb3JtZWQsIGhvd2V2ZXIgYXNzZXQgcHJpY2VzIGFyZSByZXByZXNlbnRhdGl2ZSBvZiByZWFsLXdvcmxkIHZhbHVlcy4gWW91IGhhdmUgYW4gdW5saW1pdGVkIGFtb3VudCBvZiBzaW11bGF0ZWQgZmlhdCBjdXJyZW5jeSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gICoqQ3VzdG9tZXJzKiogIGBDdXN0b21lcnNgIHJlcHJlc2VudCB5b3VyIGJhbmtpbmcgdXNlcnMgb24gdGhlIHBsYXRmb3JtLiBBdCBwcmVzZW50LCB3ZSBvZmZlciBzdXBwb3J0IGZvciBgSW5kaXZpZHVhbHNgIGFzIEN1c3RvbWVycy4gIGBDdXN0b21lcnNgIG11c3QgYmUgdmVyaWZpZWQgKGkuZS4sIEtZQ1xcJ2QpIGluIG91ciBzeXN0ZW0gYmVmb3JlIHRoZXkgY2FuIHBsYXkgYW55IHBhcnQgb24gdGhlIHBsYXRmb3JtLCB3aGljaCBtZWFucyB0aGV5IG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGFuZCBhIHBhc3NpbmcgYElkZW50aXR5IFZlcmlmaWNhdGlvbmAuIFNlZSB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gaG93IGEgY3VzdG9tZXIgY2FuIGJlIHZlcmlmaWVkLiAgYEN1c3RvbWVyc2AgbXVzdCBhbHNvIGhhdmUgYW4gYEFjY291bnRgIHRvIGJlIGFibGUgdG8gdHJhbnNhY3QsIGluIHRoZSBkZXNpcmVkIGFzc2V0IGNsYXNzLiBTZWUgdGhlIEFjY291bnRzIEFQSXMgZm9yIG1vcmUgZGV0YWlscyBvbiBzZXR0aW5nIHVwIGFjY291bnRzIGZvciB0aGUgY3VzdG9tZXIuIFxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiB2MC4xMjMuMTUzXG4gKiBDb250YWN0OiBzdXBwb3J0QGN5YnJpZC5hcHBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbi8qIHRzbGludDpkaXNhYmxlOm5vLXVudXNlZC12YXJpYWJsZSBtZW1iZXItb3JkZXJpbmcgKi9cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9ICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsXG4gICAgICAgICBIdHRwUmVzcG9uc2UsIEh0dHBFdmVudCwgSHR0cFBhcmFtZXRlckNvZGVjLCBIdHRwQ29udGV4dCBcbiAgICAgICAgfSAgICAgICBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDdXN0b21IdHRwUGFyYW1ldGVyQ29kZWMgfSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vZW5jb2Rlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAncnhqcyc7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEVycm9yUmVzcG9uc2VCYW5rTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9lcnJvclJlc3BvbnNlJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9leHRlcm5hbEJhbmtBY2NvdW50Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEV4dGVybmFsQmFua0FjY291bnRMaXN0QmFua01vZGVsIH0gZnJvbSAnLi4vbW9kZWwvZXh0ZXJuYWxCYW5rQWNjb3VudExpc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsIH0gZnJvbSAnLi4vbW9kZWwvcGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsIH0gZnJvbSAnLi4vbW9kZWwvcG9zdEV4dGVybmFsQmFua0FjY291bnQnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBCQVNFX1BBVEgsIENPTExFQ1RJT05fRk9STUFUUyB9ICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vdmFyaWFibGVzJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcblxuXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEV4dGVybmFsQmFua0FjY291bnRzU2VydmljZSB7XG5cbiAgICBwcm90ZWN0ZWQgYmFzZVBhdGggPSAnaHR0cHM6Ly9iYW5rLnNhbmRib3guY3licmlkLmFwcCc7XG4gICAgcHVibGljIGRlZmF1bHRIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgcHVibGljIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpO1xuICAgIHB1YmxpYyBlbmNvZGVyOiBIdHRwUGFyYW1ldGVyQ29kZWM7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaHR0cENsaWVudDogSHR0cENsaWVudCwgQE9wdGlvbmFsKClASW5qZWN0KEJBU0VfUEFUSCkgYmFzZVBhdGg6IHN0cmluZywgQE9wdGlvbmFsKCkgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbikge1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYmFzZVBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgYmFzZVBhdGggPSB0aGlzLmJhc2VQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRoID0gYmFzZVBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbmNvZGVyID0gdGhpcy5jb25maWd1cmF0aW9uLmVuY29kZXIgfHwgbmV3IEN1c3RvbUh0dHBQYXJhbWV0ZXJDb2RlYygpO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBhZGRUb0h0dHBQYXJhbXMoaHR0cFBhcmFtczogSHR0cFBhcmFtcywgdmFsdWU6IGFueSwga2V5Pzogc3RyaW5nKTogSHR0cFBhcmFtcyB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBEYXRlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCB2YWx1ZSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHR0cFBhcmFtcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zOiBIdHRwUGFyYW1zLCB2YWx1ZT86IGFueSwga2V5Pzogc3RyaW5nKTogSHR0cFBhcmFtcyB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gaHR0cFBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICh2YWx1ZSBhcyBhbnlbXSkuZm9yRWFjaCggZWxlbSA9PiBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgZWxlbSwga2V5KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5hcHBlbmQoa2V5LCAodmFsdWUgYXMgRGF0ZSkudG9JU09TdHJpbmcoKS5zdWJzdHIoMCwgMTApKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwia2V5IG1heSBub3QgYmUgbnVsbCBpZiB2YWx1ZSBpcyBEYXRlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmZvckVhY2goIGsgPT4gaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKFxuICAgICAgICAgICAgICAgICAgICBodHRwUGFyYW1zLCB2YWx1ZVtrXSwga2V5ICE9IG51bGwgPyBgJHtrZXl9LiR7a31gIDogaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcImtleSBtYXkgbm90IGJlIG51bGwgaWYgdmFsdWUgaXMgbm90IG9iamVjdCBvciBhcnJheVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHR0cFBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgRXh0ZXJuYWxCYW5rQWNjb3VudFxuICAgICAqIENyZWF0ZSBhbiBFeHRlcm5hbEJhbmtBY2NvdW50LiAgIyMgQWNjb3VudCBjcmVhdGlvbiAgQWNjb3VudHMgY2FuIGJlIGNyZWF0ZWQgZm9yIGEgQmFuayBvciBhIEN1c3RvbWVyLiAgVG8gY3JlYXRlIGFjY291bnRzIGZvciB5b3VyIEJhbmssIG9taXQgdGhlICYjeDYwO2N1c3RvbWVyX2d1aWQmI3g2MDsgcGFyYW1ldGVyIGluIHRoZSByZXF1ZXN0IGJvZHkuIFRvIGNyZWF0ZSBhY2NvdW50cyBmb3IgeW91ciBDdXN0b21lcnMsIGluY2x1ZGUgdGhlICYjeDYwO2N1c3RvbWVyX2d1aWQmI3g2MDsgcGFyYW1ldGVyIGluIHRoZSByZXF1ZXN0IGJvZHkuICAjIyBTdGF0ZSAgfCBTdGF0ZSB8IERlc2NyaXB0aW9uIHwgfC0tLS0tLS18LS0tLS0tLS0tLS0tLXwgfCBzdG9yaW5nIHwgVGhlIFBsYXRmb3JtIGlzIHN0b3JpbmcgdGhlIGV4dGVybmFsIGJhbmsgYWNjb3VudCBkZXRhaWxzIGluIG91ciBwcml2YXRlIHN0b3JlIHwgfCBjb21wbGV0ZWQgfCBUaGUgUGxhdGZvcm0gaGFzIGNyZWF0ZWQgdGhlIGV4dGVybmFsIGJhbmsgYWNjb3VudCB8IHwgdW52ZXJpZmllZCB8IFRoZSBleHRlcm5hbCBiYW5rIGFjY291bnQgaXMgY3JlYXRlZCwgYnV0IGl0IGhhcyBub3QgeWV0IGJlZW4gdmVyaWZpZWQgfCB8IGZhaWxlZCB8IFRoZSBQbGF0Zm9ybSB3YXMgbm90IGFibGUgdG8gc3VjY2Vzc2Z1bGx5IGNyZWF0ZSB0aGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50IHwgfCByZWZyZXNoX3JlcXVpcmVkIHwgVGhlIFBsYXRmb3JtIGhhcyBjcmVhdGVkIHRoZSBleHRlcm5hbCBiYW5rIGFjY291bnQsIGJ1dCBuZWVkcyB0byBiZSByZWZyZXNoZWQgfCB8IGRlbGV0aW5nIHwgVGhlIFBsYXRmb3JtIGlzIGRlbGV0aW5nIHRoZSBleHRlcm5hbCBiYW5rIGFjY291bnQgfCB8IGRlbGV0ZWQgfCBUaGUgUGxhdGZvcm0gaGFzIGRlbGV0ZWQgdGhlIGV4dGVybmFsIGJhbmsgYWNjb3VudCB8ICAjIyBGYWlsdXJlIGNvZGVzICB8IENvZGUgfCBEZXNjcmlwdGlvbiB8IHwtLS0tLS18LS0tLS0tLS0tLS0tLXwgfCBpbnZhbGlkX3JvdXRpbmdfbnVtYmVyIHwgVGhlIHByb3ZpZGVkIHJvdXRpbmcgbnVtYmVyIGlzIGludmFsaWQgfCB8IGR1cGxpY2F0ZSB8IEFuIGFjY291bnQgd2l0aCB0aGUgc2FtZSBkZXRhaWxzIGFscmVhZHkgZXhpc3RzIHwgfCBwbGFpZF9wcm9jZXNzb3JfdG9rZW4gfCBBbiBhY2NvdW50IGNvdWxkIG5vdCBiZSBjcmVhdGVkIGR1ZSB0byBhbiBpbnZhbGlkIFBsYWlkIHByb2Nlc3NvciB0b2tlbiBvciBhbiBlcnJvciB3aXRoIFBsYWlkIHwgfCBwbGFpZF9tdWx0aXBsZV9hY2NvdW50cyB8IFRoZSBzdXBwbGllZCBQbGFpZCB0b2tlbiBpcyBhc3NvY2lhdGVkIHdpdGggbXVsdGlwbGUgYWNjb3VudHMuIE11c3Qgb25seSBiZSBhIHNpbmdsZSBhY2NvdW50LiB8IHwgY3JlYXRlX2ZhaWxlZCB8IFRoZSBiYW5rIGFjY291bnQgYW5kIGFzc29jaWF0ZWQgaG9sZGVyIGNvdWxkIG5vdCBiZSBjcmVhdGVkIGNvcnJlY3RseSB8IHwgdW52ZXJpZmllZF9jb3VudGVycGFydHkgfCBUaGUgY291bnRlcnBhcnR5IGFjY291bnQgaXMgdW52ZXJpZmllZCB8ICAgIFJlcXVpcmVkIHNjb3BlOiAqKmV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSoqXG4gICAgICogQHBhcmFtIHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsIFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVFeHRlcm5hbEJhbmtBY2NvdW50KHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsOiBQb3N0RXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbCwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw+O1xuICAgIHB1YmxpYyBjcmVhdGVFeHRlcm5hbEJhbmtBY2NvdW50KHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsOiBQb3N0RXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbCwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8RXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbD4+O1xuICAgIHB1YmxpYyBjcmVhdGVFeHRlcm5hbEJhbmtBY2NvdW50KHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsOiBQb3N0RXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbCwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgY3JlYXRlRXh0ZXJuYWxCYW5rQWNjb3VudChwb3N0RXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbDogUG9zdEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWwsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgaWYgKHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsID09PSBudWxsIHx8IHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlRXh0ZXJuYWxCYW5rQWNjb3VudC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsPihgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9L2FwaS9leHRlcm5hbF9iYW5rX2FjY291bnRzYCxcbiAgICAgICAgICAgIHBvc3RFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBFeHRlcm5hbCBCYW5rIEFjY291bnRcbiAgICAgKiBEZWxldGVzIGFuIGV4dGVybmFsIGJhbmsgYWNjb3VudC4gIFJlcXVpcmVkIHNjb3BlOiAqKmV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSoqXG4gICAgICogQHBhcmFtIGV4dGVybmFsQmFua0FjY291bnRHdWlkIElkZW50aWZpZXIgZm9yIHRoZSBleHRlcm5hbCBiYW5rIGFjY291bnQuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUV4dGVybmFsQmFua0FjY291bnQoZXh0ZXJuYWxCYW5rQWNjb3VudEd1aWQ6IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw+O1xuICAgIHB1YmxpYyBkZWxldGVFeHRlcm5hbEJhbmtBY2NvdW50KGV4dGVybmFsQmFua0FjY291bnRHdWlkOiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgZGVsZXRlRXh0ZXJuYWxCYW5rQWNjb3VudChleHRlcm5hbEJhbmtBY2NvdW50R3VpZDogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbD4+O1xuICAgIHB1YmxpYyBkZWxldGVFeHRlcm5hbEJhbmtBY2NvdW50KGV4dGVybmFsQmFua0FjY291bnRHdWlkOiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgaWYgKGV4dGVybmFsQmFua0FjY291bnRHdWlkID09PSBudWxsIHx8IGV4dGVybmFsQmFua0FjY291bnRHdWlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4dGVybmFsQmFua0FjY291bnRHdWlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVsZXRlRXh0ZXJuYWxCYW5rQWNjb3VudC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5kZWxldGU8RXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbD4oYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofS9hcGkvZXh0ZXJuYWxfYmFua19hY2NvdW50cy8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZXh0ZXJuYWxCYW5rQWNjb3VudEd1aWQpKX1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBFeHRlcm5hbCBCYW5rIEFjY291bnRcbiAgICAgKiBSZXRyaWV2ZXMgYW4gZXh0ZXJuYWwgYmFuayBhY2NvdW50LiAgIyMgRXh0ZXJuYWxCYW5rQWNjb3VudCByZXRyaWV2YWwgIFdoZW4gcmV0cmlldmluZyBhbiBleHRlcm5hbCBiYW5rIGFjY291bnQgYW5kIGluY2x1ZGVfYmFsYW5jZXMgaXMgc2V0IHRvIHRydWUsIHRoZSBQbGF0Zm9ybSB3aWxsIGF0dGVtcHQgdG8gcmV0cmlldmUgdGhlIGJhbGFuY2UgZnJvbSB0aGUgYWNjb3VudFxcJiMzOTtzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIElmIGZvcmNlX2JhbGFuY2VfcmVmcmVzaCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIFBsYXRmb3JtIHdpbGwgYWx3YXlzIGF0dGVtcHQgdG8gcmV0cmlldmUgdGhlIG1vc3QgdXAgdG8gZGF0ZSBiYWxhbmNlIGZyb20gdGhlIGFjY291bnRcXCYjMzk7cyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIGZvcmNlX2JhbGFuY2VfcmVmcmVzaCBpcyBzZXQgdG8gZmFsc2UsIHRoZSBQbGF0Zm9ybSB3aWxsIHJldHVybiB0aGUgY2FjaGVkIGJhbGFuY2UuICBJZiB3aGlsZSBnZXR0aW5nIHRoZSBiYWxhbmNlIHRoZSBQbGF0Zm9ybSBkZXRlcm1pbmVzIHRoYXQgdGhlIGFjY291bnQgbmVlZHMgdG8gYmUgcmVmcmVzaGVkLCB0aGUgUGxhdGZvcm0gd2lsbCByZXR1cm4gYSA0MjIgc3RhdHVzIGNvZGUgd2l0aCB0aGUgbWVzc2FnZSBcXCZxdW90O0JhbmsgYWNjb3VudCByZWZyZXNoIHJlcXVpcmVkXFwmcXVvdDsgYW5kIHRoZSBFeHRlcm5hbEJhbmtBY2NvdW50IHdpbGwgYmUgcHV0IGludG8gdGhlIHJlZnJlc2hfcmVxdWlyZWQgc3RhdGUuICBJZiB3aGlsZSBnZXR0aW5nIHRoZSBiYWxhbmNlIHRoZSBQbGF0Zm9ybSBkZXRlcm1pbmVzIHRoYXQgdGhlIGFjY291bnQgaXMgbm8gbG9uZ2VyIHZhbGlkLCB0aGUgUGxhdGZvcm0gd2lsbCByZXR1cm4gYSA0MjIgc3RhdHVzIGNvZGUgd2l0aCB0aGUgbWVzc2FnZSBcXCZxdW90O0JhbmsgYWNjb3VudCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgYW5kIGlzIGJlaW5nIGRlbGV0ZWQuIEl0IG11c3QgYmUgcmUtYWRkZWRcXCZxdW90OyBhbmQgdGhlIEV4dGVybmFsQmFua0FjY291bnQgd2lsbCBiZSBkZWxldGVkLiAgV2hlbiByZXRyaWV2aW5nIGFuIGV4dGVybmFsIGJhbmsgYWNjb3VudCBhbmQgaW5jbHVkZV9waWkgaXMgc2V0IHRvIHRydWUsIHRoZSBQbGF0Zm9ybSB3aWxsIGluY2x1ZGUgdGhlIGFjY291bnQgaG9sZGVyXFwmIzM5O3MgaW5mb3JtYXRpb24gaW4gdGhlIHJlc3BvbnNlLiAgICBSZXF1aXJlZCBzY29wZTogKipleHRlcm5hbF9iYW5rX2FjY291bnRzOnJlYWQqKlxuICAgICAqIEBwYXJhbSBleHRlcm5hbEJhbmtBY2NvdW50R3VpZCBJZGVudGlmaWVyIGZvciB0aGUgZXh0ZXJuYWwgYmFuayBhY2NvdW50LlxuICAgICAqIEBwYXJhbSBmb3JjZUJhbGFuY2VSZWZyZXNoIEZvcmNlIHRoZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IHRvIGJlIHJldHJpZXZlZC5cbiAgICAgKiBAcGFyYW0gaW5jbHVkZUJhbGFuY2VzIEluY2x1ZGUgYmFsYW5jZSBpbmZvcm1hdGlvbiBpbiB0aGUgcmVzcG9uc2UuIElmICYjeDYwO2ZvcmNlX2JhbGFuY2VfcmVmcmVzaCYjeDYwOyBpcyAmI3g2MDt0cnVlJiN4NjA7LCB0aGUgbW9zdCB1cCB0byBkYXRlIGJhbGFuY2Ugd2lsbCBiZSByZXR1cm5lZC4gSWYgJiN4NjA7Zm9yY2VfYmFsYW5jZV9yZWZyZXNoJiN4NjA7IGlzICYjeDYwO2ZhbHNlJiN4NjA7LCB0aGUgY2FjaGVkIGJhbGFuY2Ugd2lsbCBiZSByZXR1cm5lZC4gJiN4NjA7YmFsYW5jZV91cGRhdGVkX2F0JiN4NjA7IGluIHRoZSByZXNwb25zZSB3aWxsIHByb3ZpZGUgdGhlIHRpbWVzdGFtcCB0aGUgYmFsYW5jZSB3YXMgbGFzdCB1cGRhdGVkLlxuICAgICAqIEBwYXJhbSBpbmNsdWRlUGlpIEluY2x1ZGUgdGhlIGFjY291bnQgaG9sZGVyXFwmIzM5O3MgUElJIGluIHRoZSByZXNwb25zZS5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RXh0ZXJuYWxCYW5rQWNjb3VudChleHRlcm5hbEJhbmtBY2NvdW50R3VpZDogc3RyaW5nLCBmb3JjZUJhbGFuY2VSZWZyZXNoPzogYm9vbGVhbiwgaW5jbHVkZUJhbGFuY2VzPzogYm9vbGVhbiwgaW5jbHVkZVBpaT86IGJvb2xlYW4sIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsPjtcbiAgICBwdWJsaWMgZ2V0RXh0ZXJuYWxCYW5rQWNjb3VudChleHRlcm5hbEJhbmtBY2NvdW50R3VpZDogc3RyaW5nLCBmb3JjZUJhbGFuY2VSZWZyZXNoPzogYm9vbGVhbiwgaW5jbHVkZUJhbGFuY2VzPzogYm9vbGVhbiwgaW5jbHVkZVBpaT86IGJvb2xlYW4sIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgZ2V0RXh0ZXJuYWxCYW5rQWNjb3VudChleHRlcm5hbEJhbmtBY2NvdW50R3VpZDogc3RyaW5nLCBmb3JjZUJhbGFuY2VSZWZyZXNoPzogYm9vbGVhbiwgaW5jbHVkZUJhbGFuY2VzPzogYm9vbGVhbiwgaW5jbHVkZVBpaT86IGJvb2xlYW4sIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsPj47XG4gICAgcHVibGljIGdldEV4dGVybmFsQmFua0FjY291bnQoZXh0ZXJuYWxCYW5rQWNjb3VudEd1aWQ6IHN0cmluZywgZm9yY2VCYWxhbmNlUmVmcmVzaD86IGJvb2xlYW4sIGluY2x1ZGVCYWxhbmNlcz86IGJvb2xlYW4sIGluY2x1ZGVQaWk/OiBib29sZWFuLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGlmIChleHRlcm5hbEJhbmtBY2NvdW50R3VpZCA9PT0gbnVsbCB8fCBleHRlcm5hbEJhbmtBY2NvdW50R3VpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBleHRlcm5hbEJhbmtBY2NvdW50R3VpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEV4dGVybmFsQmFua0FjY291bnQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChmb3JjZUJhbGFuY2VSZWZyZXNoICE9PSB1bmRlZmluZWQgJiYgZm9yY2VCYWxhbmNlUmVmcmVzaCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmZvcmNlQmFsYW5jZVJlZnJlc2gsICdmb3JjZV9iYWxhbmNlX3JlZnJlc2gnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5jbHVkZUJhbGFuY2VzICE9PSB1bmRlZmluZWQgJiYgaW5jbHVkZUJhbGFuY2VzICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+aW5jbHVkZUJhbGFuY2VzLCAnaW5jbHVkZV9iYWxhbmNlcycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdWRlUGlpICE9PSB1bmRlZmluZWQgJiYgaW5jbHVkZVBpaSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmluY2x1ZGVQaWksICdpbmNsdWRlX3BpaScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQmVhcmVyQXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0JlYXJlckF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsPihgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9L2FwaS9leHRlcm5hbF9iYW5rX2FjY291bnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhleHRlcm5hbEJhbmtBY2NvdW50R3VpZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZXh0ZXJuYWwgYmFuayBhY2NvdW50cyBsaXN0XG4gICAgICogUmV0cmlldmVzIGEgbGlzdGluZyBvZiBleHRlcm5hbCBiYW5rIGFjY291bnRzLiAgUmVxdWlyZWQgc2NvcGU6ICoqZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkKipcbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSBpbmRleCB0byByZXRyaWV2ZS5cbiAgICAgKiBAcGFyYW0gcGVyUGFnZSBUaGUgbnVtYmVyIG9mIGVudGl0aWVzIHBlciBwYWdlIHRvIHJldHVybi5cbiAgICAgKiBAcGFyYW0gZ3VpZCBDb21tYSBzZXBhcmF0ZWQgZXh0ZXJuYWxfYmFua19hY2NvdW50X2d1aWRzIHRvIGxpc3QgZXh0ZXJuYWxfYmFua19hY2NvdW50cyBmb3IuXG4gICAgICogQHBhcmFtIGJhbmtHdWlkIENvbW1hIHNlcGFyYXRlZCBiYW5rX2d1aWRzIHRvIGxpc3QgZXh0ZXJuYWxfYmFua19hY2NvdW50cyBmb3IuXG4gICAgICogQHBhcmFtIGN1c3RvbWVyR3VpZCBDb21tYSBzZXBhcmF0ZWQgY3VzdG9tZXJfZ3VpZHMgdG8gbGlzdCBleHRlcm5hbF9iYW5rX2FjY291bnRzIGZvci5cbiAgICAgKiBAcGFyYW0gYXNzZXQgQ29tbWEgc2VwYXJhdGVkIGFzc2V0cyB0byBsaXN0IGV4dGVybmFsX2JhbmtfYWNjb3VudHMgZm9yLlxuICAgICAqIEBwYXJhbSBzdGF0ZSBDb21tYSBzZXBhcmF0ZWQgc3RhdGVzIHRvIGxpc3QgZXh0ZXJuYWxfYmFua19hY2NvdW50cyBmb3IuIEZpbHRlcmluZyBieSBcXCZxdW90O2NvbXBsZXRlZFxcJnF1b3Q7IGFuZCBcXCZxdW90O3VudmVyaWZpZWRcXCZxdW90OyBzdGF0ZXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGluZGl2aWR1YWwgY3VzdG9tZXIgYWNjb3VudHMuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGxpc3RFeHRlcm5hbEJhbmtBY2NvdW50cyhwYWdlPzogc3RyaW5nLCBwZXJQYWdlPzogc3RyaW5nLCBndWlkPzogc3RyaW5nLCBiYW5rR3VpZD86IHN0cmluZywgY3VzdG9tZXJHdWlkPzogc3RyaW5nLCBhc3NldD86IHN0cmluZywgc3RhdGU/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxFeHRlcm5hbEJhbmtBY2NvdW50TGlzdEJhbmtNb2RlbD47XG4gICAgcHVibGljIGxpc3RFeHRlcm5hbEJhbmtBY2NvdW50cyhwYWdlPzogc3RyaW5nLCBwZXJQYWdlPzogc3RyaW5nLCBndWlkPzogc3RyaW5nLCBiYW5rR3VpZD86IHN0cmluZywgY3VzdG9tZXJHdWlkPzogc3RyaW5nLCBhc3NldD86IHN0cmluZywgc3RhdGU/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEV4dGVybmFsQmFua0FjY291bnRMaXN0QmFua01vZGVsPj47XG4gICAgcHVibGljIGxpc3RFeHRlcm5hbEJhbmtBY2NvdW50cyhwYWdlPzogc3RyaW5nLCBwZXJQYWdlPzogc3RyaW5nLCBndWlkPzogc3RyaW5nLCBiYW5rR3VpZD86IHN0cmluZywgY3VzdG9tZXJHdWlkPzogc3RyaW5nLCBhc3NldD86IHN0cmluZywgc3RhdGU/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxFeHRlcm5hbEJhbmtBY2NvdW50TGlzdEJhbmtNb2RlbD4+O1xuICAgIHB1YmxpYyBsaXN0RXh0ZXJuYWxCYW5rQWNjb3VudHMocGFnZT86IHN0cmluZywgcGVyUGFnZT86IHN0cmluZywgZ3VpZD86IHN0cmluZywgYmFua0d1aWQ/OiBzdHJpbmcsIGN1c3RvbWVyR3VpZD86IHN0cmluZywgYXNzZXQ/OiBzdHJpbmcsIHN0YXRlPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wYWdlLCAncGFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJQYWdlICE9PSB1bmRlZmluZWQgJiYgcGVyUGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBlclBhZ2UsICdwZXJfcGFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChndWlkICE9PSB1bmRlZmluZWQgJiYgZ3VpZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pmd1aWQsICdndWlkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhbmtHdWlkICE9PSB1bmRlZmluZWQgJiYgYmFua0d1aWQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5iYW5rR3VpZCwgJ2JhbmtfZ3VpZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXN0b21lckd1aWQgIT09IHVuZGVmaW5lZCAmJiBjdXN0b21lckd1aWQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5jdXN0b21lckd1aWQsICdjdXN0b21lcl9ndWlkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzc2V0ICE9PSB1bmRlZmluZWQgJiYgYXNzZXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc3NldCwgJ2Fzc2V0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlICE9PSB1bmRlZmluZWQgJiYgc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5zdGF0ZSwgJ3N0YXRlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChCZWFyZXJBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnQmVhcmVyQXV0aCcpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEV4dGVybmFsQmFua0FjY291bnRMaXN0QmFua01vZGVsPihgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9L2FwaS9leHRlcm5hbF9iYW5rX2FjY291bnRzYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhdGNoIEV4dGVybmFsQmFua0FjY291bnRcbiAgICAgKiBQYXRjaCBhbiBleHRlcm5hbCBiYW5rIGFjY291bnQuICBSZXF1aXJlZCBzY29wZTogKipleHRlcm5hbF9iYW5rX2FjY291bnRzOndyaXRlKipcbiAgICAgKiBAcGFyYW0gZXh0ZXJuYWxCYW5rQWNjb3VudEd1aWQgSWRlbnRpZmllciBmb3IgdGhlIGV4dGVybmFsIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAcGFyYW0gcGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsIFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBwYXRjaEV4dGVybmFsQmFua0FjY291bnQoZXh0ZXJuYWxCYW5rQWNjb3VudEd1aWQ6IHN0cmluZywgcGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsOiBQYXRjaEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWwsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsPjtcbiAgICBwdWJsaWMgcGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50KGV4dGVybmFsQmFua0FjY291bnRHdWlkOiBzdHJpbmcsIHBhdGNoRXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbDogUGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsPj47XG4gICAgcHVibGljIHBhdGNoRXh0ZXJuYWxCYW5rQWNjb3VudChleHRlcm5hbEJhbmtBY2NvdW50R3VpZDogc3RyaW5nLCBwYXRjaEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw6IFBhdGNoRXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbCwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw+PjtcbiAgICBwdWJsaWMgcGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50KGV4dGVybmFsQmFua0FjY291bnRHdWlkOiBzdHJpbmcsIHBhdGNoRXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbDogUGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGlmIChleHRlcm5hbEJhbmtBY2NvdW50R3VpZCA9PT0gbnVsbCB8fCBleHRlcm5hbEJhbmtBY2NvdW50R3VpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBleHRlcm5hbEJhbmtBY2NvdW50R3VpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBhdGNoRXh0ZXJuYWxCYW5rQWNjb3VudC4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0Y2hFeHRlcm5hbEJhbmtBY2NvdW50QmFua01vZGVsID09PSBudWxsIHx8IHBhdGNoRXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBwYXRjaEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWwgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBwYXRjaEV4dGVybmFsQmFua0FjY291bnQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChCZWFyZXJBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnQmVhcmVyQXV0aCcpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBhdGNoPEV4dGVybmFsQmFua0FjY291bnRCYW5rTW9kZWw+KGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0vYXBpL2V4dGVybmFsX2JhbmtfYWNjb3VudHMvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGV4dGVybmFsQmFua0FjY291bnRHdWlkKSl9YCxcbiAgICAgICAgICAgIHBhdGNoRXh0ZXJuYWxCYW5rQWNjb3VudEJhbmtNb2RlbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbn1cbiJdfQ==