simpo-component-library 3.6.91 → 3.6.93

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 (215) hide show
  1. package/README.md +24 -24
  2. package/esm2022/lib/components/delete-hover-element/delete-hover-element.component.mjs +5 -5
  3. package/esm2022/lib/components/document/document.component.mjs +5 -5
  4. package/esm2022/lib/components/hover-elements/hover-elements.component.mjs +4 -4
  5. package/esm2022/lib/components/image-loading/image-loading.component.mjs +5 -5
  6. package/esm2022/lib/components/index.mjs +5 -5
  7. package/esm2022/lib/components/input-fields/input-fields.component.mjs +4 -4
  8. package/esm2022/lib/components/payment-details/payment-details.component.mjs +5 -5
  9. package/esm2022/lib/components/trasport-availability/trasport-availability.component.mjs +4 -4
  10. package/esm2022/lib/constants/business.constant.mjs +1 -1
  11. package/esm2022/lib/directive/alignment.directive.mjs +23 -0
  12. package/esm2022/lib/directive/animation-directive.mjs +4 -4
  13. package/esm2022/lib/directive/background-directive.mjs +4 -4
  14. package/esm2022/lib/directive/banner-content-fit-directive.mjs +4 -4
  15. package/esm2022/lib/directive/blur-content.directive.mjs +4 -4
  16. package/esm2022/lib/directive/border-directive.mjs +4 -4
  17. package/esm2022/lib/directive/borderlessImage.directive.mjs +4 -4
  18. package/esm2022/lib/directive/button-directive.directive.mjs +4 -4
  19. package/esm2022/lib/directive/button-editor.directive.mjs +4 -4
  20. package/esm2022/lib/directive/color.directive.mjs +4 -4
  21. package/esm2022/lib/directive/column-directive.directive.mjs +4 -4
  22. package/esm2022/lib/directive/container-alignment.directive.mjs +4 -4
  23. package/esm2022/lib/directive/container-fir.directive.mjs +4 -4
  24. package/esm2022/lib/directive/content-alignment-directive.mjs +4 -4
  25. package/esm2022/lib/directive/content-fit-directive.mjs +4 -4
  26. package/esm2022/lib/directive/content-title-spacing.directive.mjs +4 -4
  27. package/esm2022/lib/directive/contenteditable.directive.mjs +4 -4
  28. package/esm2022/lib/directive/corner-directive.mjs +4 -4
  29. package/esm2022/lib/directive/footer-layout-directive.mjs +4 -4
  30. package/esm2022/lib/directive/height.directive.mjs +29 -0
  31. package/esm2022/lib/directive/hover-animation.directive.mjs +4 -4
  32. package/esm2022/lib/directive/hover-element-directive.mjs +4 -4
  33. package/esm2022/lib/directive/hoverborder.directive.mjs +4 -4
  34. package/esm2022/lib/directive/image-container.directive.mjs +4 -4
  35. package/esm2022/lib/directive/image-directive.directive.mjs +4 -4
  36. package/esm2022/lib/directive/image-editor.directive.mjs +4 -4
  37. package/esm2022/lib/directive/image-position.directive.mjs +4 -4
  38. package/esm2022/lib/directive/overlay-directive.mjs +4 -4
  39. package/esm2022/lib/directive/position-layout-directive.directive.mjs +4 -4
  40. package/esm2022/lib/directive/removeCarousel-directive.mjs +4 -4
  41. package/esm2022/lib/directive/spacing-around.directive.mjs +5 -5
  42. package/esm2022/lib/directive/spacing-horizontal.directive.mjs +4 -4
  43. package/esm2022/lib/directive/spacing.directive.mjs +29 -0
  44. package/esm2022/lib/directive/sticky-directive.mjs +4 -4
  45. package/esm2022/lib/directive/text-background-directive.directive.mjs +4 -4
  46. package/esm2022/lib/directive/text-size.directive.mjs +4 -4
  47. package/esm2022/lib/directive/wrap-containers.directive.mjs +4 -4
  48. package/esm2022/lib/ecommerce/sections/address/address.component.mjs +5 -5
  49. package/esm2022/lib/ecommerce/sections/authenticate-user/authenticate-user.component.mjs +5 -5
  50. package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.component.mjs +5 -5
  51. package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.model.mjs +1 -1
  52. package/esm2022/lib/ecommerce/sections/cart/cart.component.mjs +5 -5
  53. package/esm2022/lib/ecommerce/sections/cart/cart.modal.mjs +1 -1
  54. package/esm2022/lib/ecommerce/sections/category-product/category-product.component.mjs +5 -5
  55. package/esm2022/lib/ecommerce/sections/category-product/category-product.model.mjs +1 -1
  56. package/esm2022/lib/ecommerce/sections/checkout/checkout.component.mjs +5 -5
  57. package/esm2022/lib/ecommerce/sections/checkout/checkout.modal.mjs +1 -1
  58. package/esm2022/lib/ecommerce/sections/customer-review/customer-review.component.mjs +5 -5
  59. package/esm2022/lib/ecommerce/sections/customer-review/customer-review.model.mjs +1 -1
  60. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.component.mjs +5 -5
  61. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.modal.mjs +1 -1
  62. package/esm2022/lib/ecommerce/sections/featured-category/featured-collection.component.mjs +5 -5
  63. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.component.mjs +5 -5
  64. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.modal.mjs +1 -1
  65. package/esm2022/lib/ecommerce/sections/item-varient/item-varient.component.mjs +5 -5
  66. package/esm2022/lib/ecommerce/sections/order-details/order-details.component.mjs +5 -5
  67. package/esm2022/lib/ecommerce/sections/pagnination/pagnination.component.mjs +5 -5
  68. package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.component.mjs +5 -5
  69. package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.model.mjs +1 -1
  70. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.component.mjs +5 -5
  71. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.modal.mjs +1 -1
  72. package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +6 -6
  73. package/esm2022/lib/ecommerce/sections/product-list/product-list.modal.mjs +1 -1
  74. package/esm2022/lib/ecommerce/sections/small-product-listing/small-product-listing.component.mjs +5 -5
  75. package/esm2022/lib/ecommerce/sections/user-basic-info/user-basic-info.component.mjs +5 -5
  76. package/esm2022/lib/ecommerce/sections/user-profile/user-profile.component.mjs +5 -5
  77. package/esm2022/lib/ecommerce/sections/user-profile/user-profile.modal.mjs +1 -1
  78. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.component.mjs +5 -5
  79. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.model.mjs +1 -1
  80. package/esm2022/lib/ecommerce/sections/whislist/whislist.component.mjs +5 -5
  81. package/esm2022/lib/ecommerce/styles/BaseCollection.modal.mjs +1 -1
  82. package/esm2022/lib/ecommerce/styles/Collection.modal.mjs +1 -1
  83. package/esm2022/lib/ecommerce/styles/OrderedItems.modal.mjs +1 -1
  84. package/esm2022/lib/ecommerce/styles/PincodeLocation.model.mjs +1 -1
  85. package/esm2022/lib/ecommerce/styles/PincodeLocationInter.model.mjs +1 -1
  86. package/esm2022/lib/ecommerce/styles/cart.modal.mjs +1 -1
  87. package/esm2022/lib/ecommerce/styles/category.modal.mjs +1 -1
  88. package/esm2022/lib/ecommerce/styles/order.modal.mjs +1 -1
  89. package/esm2022/lib/ecommerce/styles/product.modal.mjs +1 -1
  90. package/esm2022/lib/ecommerce/styles/review.modal.mjs +1 -1
  91. package/esm2022/lib/ecommerce/styles/user.modal.mjs +1 -1
  92. package/esm2022/lib/elements/add-section/add-section.component.mjs +5 -5
  93. package/esm2022/lib/elements/below-image-card/below-image-card.component.mjs +5 -5
  94. package/esm2022/lib/elements/button/button.component.mjs +5 -5
  95. package/esm2022/lib/elements/button/button.model.mjs +1 -1
  96. package/esm2022/lib/elements/card-skeleton-loader/card-skeleton-loader.component.mjs +5 -5
  97. package/esm2022/lib/elements/covering-image-card/covering-image-card.component.mjs +5 -5
  98. package/esm2022/lib/elements/editor-service.service.mjs +4 -4
  99. package/esm2022/lib/elements/heading-element/heading-element.component.mjs +5 -5
  100. package/esm2022/lib/elements/image-editor/image-editor.component.mjs +5 -5
  101. package/esm2022/lib/elements/index.mjs +5 -5
  102. package/esm2022/lib/elements/link-editor/link-editor.component.mjs +5 -5
  103. package/esm2022/lib/elements/media-selector/media-selector.component.mjs +5 -5
  104. package/esm2022/lib/elements/navbar-button-element/navbar-button-element.component.mjs +4 -4
  105. package/esm2022/lib/elements/portfolio/portfolio.component.mjs +5 -5
  106. package/esm2022/lib/elements/pricing-s1/pricing-s1.component.mjs +5 -5
  107. package/esm2022/lib/elements/property/property.component.mjs +5 -5
  108. package/esm2022/lib/elements/simpo-button/simpo-button.component.mjs +5 -5
  109. package/esm2022/lib/elements/socia-icons/socia-icons.component.mjs +4 -4
  110. package/esm2022/lib/elements/svg-divider/svg-divider.component.mjs +5 -5
  111. package/esm2022/lib/elements/text/text.component.mjs +5 -5
  112. package/esm2022/lib/elements/text-editor/text-editor.component.mjs +5 -5
  113. package/esm2022/lib/elements/top-of-image-card/top-of-image-card.component.mjs +5 -5
  114. package/esm2022/lib/pipes/amount.pipe.mjs +4 -4
  115. package/esm2022/lib/pipes/gender.pipe.mjs +4 -4
  116. package/esm2022/lib/sections/BaseSection.mjs +1 -1
  117. package/esm2022/lib/sections/add-new-section/add-new-section.component.mjs +5 -5
  118. package/esm2022/lib/sections/appointment-form/appointment-form.component.mjs +7 -5
  119. package/esm2022/lib/sections/appointment-form/appointment-form.model.mjs +1 -1
  120. package/esm2022/lib/sections/banner-carousel/banner-carousel.component.mjs +5 -5
  121. package/esm2022/lib/sections/banner-carousel/banner-carousel.model.mjs +1 -1
  122. package/esm2022/lib/sections/banner-grid-section/banner-grid-section.component.mjs +43 -8
  123. package/esm2022/lib/sections/banner-section/banner-section.component.mjs +4 -4
  124. package/esm2022/lib/sections/blog-list/blog-list.component.mjs +5 -5
  125. package/esm2022/lib/sections/blog-list/blog-list.model.mjs +1 -1
  126. package/esm2022/lib/sections/carousel-banner/carousel-banner.component.mjs +5 -5
  127. package/esm2022/lib/sections/choose-us-section/choose-us-section.component.mjs +5 -5
  128. package/esm2022/lib/sections/choose-us-section/choose-us-section.model.mjs +1 -1
  129. package/esm2022/lib/sections/contact-us/contact-us.component.mjs +4 -4
  130. package/esm2022/lib/sections/faq-section/faq-section.component.mjs +5 -5
  131. package/esm2022/lib/sections/faq-section/faq-section.modal.mjs +1 -1
  132. package/esm2022/lib/sections/features-section/features-section.component.mjs +8 -6
  133. package/esm2022/lib/sections/features-section/features-section.model.mjs +1 -1
  134. package/esm2022/lib/sections/footer/footer.component.mjs +5 -5
  135. package/esm2022/lib/sections/footer/footer.modal.mjs +1 -1
  136. package/esm2022/lib/sections/footer-section/footer-section.component.mjs +4 -4
  137. package/esm2022/lib/sections/header-section/header-section.component.mjs +5 -5
  138. package/esm2022/lib/sections/header-section/header-section.model.mjs +1 -1
  139. package/esm2022/lib/sections/header-text/header-text.component.mjs +5 -5
  140. package/esm2022/lib/sections/header-text/header-text.model.mjs +1 -1
  141. package/esm2022/lib/sections/image-carousel-section/image-carousel-section.component.mjs +5 -5
  142. package/esm2022/lib/sections/image-carousel-section/image-carousel.model.mjs +1 -1
  143. package/esm2022/lib/sections/image-grid-section/image-grid-section.component.mjs +5 -5
  144. package/esm2022/lib/sections/image-grid-section/image-grid-section.model.mjs +1 -1
  145. package/esm2022/lib/sections/image-section/image-section.component.mjs +5 -5
  146. package/esm2022/lib/sections/image-section/image-section.model.mjs +1 -1
  147. package/esm2022/lib/sections/location-section/location-section.component.mjs +5 -5
  148. package/esm2022/lib/sections/location-section/location-section.modal.mjs +1 -1
  149. package/esm2022/lib/sections/logo-gallery/logo-gallery.component.mjs +5 -5
  150. package/esm2022/lib/sections/logo-showcase/logo-showcase.component.mjs +5 -5
  151. package/esm2022/lib/sections/logo-showcase/logo-showcase.modal.mjs +1 -1
  152. package/esm2022/lib/sections/moving-text/moving-text.component.mjs +5 -5
  153. package/esm2022/lib/sections/moving-text/moving-text.modal.mjs +1 -1
  154. package/esm2022/lib/sections/navbar-section/navbar-section.component.mjs +4 -4
  155. package/esm2022/lib/sections/new-services/new-services.component.mjs +5 -5
  156. package/esm2022/lib/sections/new-services/new-services.model.mjs +1 -1
  157. package/esm2022/lib/sections/new-testimonials/new-testimonials.component.mjs +5 -5
  158. package/esm2022/lib/sections/new-testimonials/new-testimonials.model.mjs +1 -1
  159. package/esm2022/lib/sections/pricing-section/pricing-section.component.mjs +5 -5
  160. package/esm2022/lib/sections/pricing-section/pricing-section.modal.mjs +1 -1
  161. package/esm2022/lib/sections/process-modern/process-modern.component.mjs +14 -6
  162. package/esm2022/lib/sections/process-modern/process-modern.model.mjs +1 -1
  163. package/esm2022/lib/sections/process-section/process-section.component.mjs +5 -5
  164. package/esm2022/lib/sections/process-section/process-section.modal.mjs +1 -1
  165. package/esm2022/lib/sections/property-component/property-component.component.mjs +5 -5
  166. package/esm2022/lib/sections/property-component/property-component.modal.mjs +1 -1
  167. package/esm2022/lib/sections/property-list/property-list.component.mjs +5 -5
  168. package/esm2022/lib/sections/property-list/property-list.modal.mjs +1 -1
  169. package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.component.mjs +5 -5
  170. package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.model.mjs +1 -1
  171. package/esm2022/lib/sections/registration-form/registration-form.component.mjs +6 -6
  172. package/esm2022/lib/sections/registration-form/registrationForm.model.mjs +1 -1
  173. package/esm2022/lib/sections/service-section/service-section.component.mjs +5 -5
  174. package/esm2022/lib/sections/service-section/service-section.model.mjs +1 -1
  175. package/esm2022/lib/sections/skeleton-loader-section/skeleton-loader-section.component.mjs +5 -5
  176. package/esm2022/lib/sections/team-member-section/team-member-section.component.mjs +5 -5
  177. package/esm2022/lib/sections/team-member-section/team-member-section.model.mjs +1 -1
  178. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.component.mjs +5 -5
  179. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.model.mjs +1 -1
  180. package/esm2022/lib/sections/testimonial-section/testimonial-section.component.mjs +5 -5
  181. package/esm2022/lib/sections/testimonial-section/testimonial-section.model.mjs +1 -1
  182. package/esm2022/lib/sections/testimonial-video/testimonial-video.component.mjs +5 -5
  183. package/esm2022/lib/sections/testimonial-video/testimonial-video.model.mjs +1 -1
  184. package/esm2022/lib/sections/text-image-section/text-image-section.component.mjs +4 -4
  185. package/esm2022/lib/sections/text-section/text-section.component.mjs +4 -4
  186. package/esm2022/lib/sections/text-section/text-section.model.mjs +1 -1
  187. package/esm2022/lib/sections/usp-video-section/usp-video-section.component.mjs +5 -5
  188. package/esm2022/lib/sections/usp-video-section/usp-video-section.model.mjs +1 -1
  189. package/esm2022/lib/sections/video-section/video-section.component.mjs +5 -5
  190. package/esm2022/lib/sections/video-section/video-section.model.mjs +1 -1
  191. package/esm2022/lib/sections/view-blog/view-blog.component.mjs +5 -5
  192. package/esm2022/lib/services/cart.service.mjs +4 -4
  193. package/esm2022/lib/services/endUser.service.mjs +4 -4
  194. package/esm2022/lib/services/events.service.mjs +4 -4
  195. package/esm2022/lib/services/image-upload-service.service.mjs +4 -4
  196. package/esm2022/lib/services/rest.service.mjs +4 -4
  197. package/esm2022/lib/services/sanitizeHtml.mjs +4 -4
  198. package/esm2022/lib/services/storage.service.mjs +4 -4
  199. package/esm2022/lib/styles/index.mjs +1 -1
  200. package/esm2022/lib/styles/style.model.mjs +1 -1
  201. package/esm2022/lib/styles/types.mjs +1 -1
  202. package/esm2022/lib/tokens/api-token.mjs +1 -1
  203. package/esm2022/public-api.mjs +4 -1
  204. package/fesm2022/simpo-component-library.mjs +609 -493
  205. package/fesm2022/simpo-component-library.mjs.map +1 -1
  206. package/lib/directive/alignment.directive.d.ts +11 -0
  207. package/lib/directive/height.directive.d.ts +11 -0
  208. package/lib/directive/spacing.directive.d.ts +12 -0
  209. package/lib/sections/banner-grid-section/banner-grid-section.component.d.ts +7 -1
  210. package/lib/sections/process-modern/process-modern.component.d.ts +2 -0
  211. package/package.json +1 -1
  212. package/public-api.d.ts +3 -0
  213. package/simpo-component-library-3.6.93.tgz +0 -0
  214. package/src/lib/styles/global-styles.css +199 -191
  215. package/simpo-component-library-3.6.91.tgz +0 -0
@@ -495,10 +495,10 @@ export class PaymentDetailsComponent {
495
495
  hasActiveKits() {
496
496
  return this.admissionData.selectedComboKits.length > 0;
497
497
  }
498
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaymentDetailsComponent, deps: [{ token: i1.ElementServiceService }, { token: i2.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
499
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PaymentDetailsComponent, isStandalone: true, selector: "simpo-payment-details", inputs: { admissionData: "admissionData", subscriptionsData: "subscriptionsData", termPaymentList: "termPaymentList" }, ngImport: i0, template: "<!-- <section class=\"main-section\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <div class=\"heading left-side\">\n Admission Fee\n </div>\n\n <div class=\"left-side mt-10\" *ngFor=\"let configList of Object.keys(feeConfig)\">\n <div class=\"heading mb-20\">{{configList}}</div>\n\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeConfig[configList]\">\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\n </div>\n </div>\n\n <div class=\"left-side mt-10\" *ngFor=\"let type of Object.keys(subscriptions)\">\n <p class=\"heading\">{{type}}</p>\n\n <table class=\"subscription-table w-100\">\n <thead>\n <th>Subscription Title</th>\n <th>Monthly</th>\n <th>Quaterly</th>\n <th>Yearly</th>\n <th>On Demand</th>\n </thead>\n <tbody>\n <tr *ngFor=\"let data of subscriptions[type];let i = index\">\n <td>{{data.subName}}</td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['QUARTERLY']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'MONTHLY'\" (click)=\"toggleSelection(data, 'MONTHLY')\" [checked]=\"data.selectedOption === 'MONTHLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexRadioDefault2\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['MONTHLY']}}\n </label>\n </div>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['QUARTERLY']\" [src]=\"defaultImage\" alt=\"\">\n </td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['MONTHLY']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'QUARTERLY'\" (click)=\"toggleSelection(data, 'QUARTERLY')\" [checked]=\"data.selectedOption === 'QUARTERLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['QUARTERLY']}}\n </label>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['MONTHLY']\" [src]=\"defaultImage\" alt=\"\">\n </div>\n </td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['ANNUALLY']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ANNUALLY'\" (click)=\"toggleSelection(data, 'ANNUALLY')\" [checked]=\"data.selectedOption === 'ANNUALLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['ANNUALLY']}}\n </label>\n </div>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ANNUALLY']\" [src]=\"defaultImage\" alt=\"\">\n </td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['ONDEMAND']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ONDEMAND'\" (click)=\"toggleSelection(data, 'ONDEMAND')\" [checked]=\"data.selectedOption === 'ONDEMAND'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['ONDEMAND']}}\n </label>\n </div>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ONDEMAND']\" [src]=\"defaultImage\" alt=\"\">\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div class=\"left-side mt-10\">\n <p class=\"heading\">Payment Plan</p>\n\n <div class=\"d-flex g-2\">\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('ANNUALLY')\">\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'ANNUALLY'\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n Annually\n </label>\n </div>\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('TERM')\">\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'TERM'\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n Term\n </label>\n </div>\n </div>\n\n <div class=\"admission\" *ngIf=\"admissionData.paymentPlanType === 'TERM'\">\n <mat-form-field class=\"input-text\" appearance=\"outline\">\n <mat-select class=\"inputStyle\" placeholder=\"--Select--\" multiple=\"true\" [(ngModel)]=\"feeStructure.termPaymentList\" (ngModelChange)=\"calculateTotalAmount()\">\n <mat-option *ngFor=\"let term of termPaymentList\" [value]=\"term\">term {{term.termNumber}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n </div>\n </div>\n <div class=\"col-md-6 right-side\">\n <div class=\"heading mb-20\">\n Fee Calculation\n </div>\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeStructure.feeConfigs\">\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\n </div>\n\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let subscripition of feeStructure.subscriptionPlans\">\n <p class=\"sub-heading mb-0\">{{subscripition.subName}}</p>\n <p class=\"amount mb-0\">\u20B9 {{subscripition.pricing[subscripition.frequency]}}</p>\n </div>\n\n <div class=\"total-fee\">\n <div class=\"heading mb-5\">\n Total Fee\n </div>\n <div class=\"amount\">\n \u20B9 {{feeStructure.totalAmount}}\n </div>\n </div>\n </div>\n </div>\n</section> -->\n\n\n<section class=\"main_payment_details_section h-100 w-100 p-2 d-flex justify-content-between\">\n <div class=\"left_payment_details h-100 p-2\">\n <div class=\"fees_section\">\n <div class=\"sec_title\">\n Fees\n </div>\n <div class=\"mt-2 all_fee_configs\">\n <ng-container *ngFor=\"let item of feeStructure?.feeConfig\">\n <div class=\"single_fee_config p-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\n <div class=\"fee_amount\">\u20B9 {{item.amount}}</div>\n </div>\n <div *ngIf=\"item.termsList.length > 0\">\n <div class=\"change_selection\">\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.selectedTermValue\"\n name=\"termOption_{{ item.feeHead.id}}\"\n (change)=\"changeTermValue(item)\">\n <mat-radio-button value=\"SINGLE\"\n style=\"font-family: var(--primary-font-family);font-size:13px\">Single</mat-radio-button>\n <mat-radio-button value=\"TERM\"\n style=\"font-family: var(--primary-font-family);font-size:13px\">Term</mat-radio-button>\n </mat-radio-group>\n </div>\n <div class=\"termCount\" *ngIf=\"item.selectedTermValue === 'TERM'\">\n <div class=\"check_data\">\n <ng-container *ngFor=\"let term of item.termsList;let i = index\">\n <div class=\"singleData d-flex gap-3 align-items-end\">\n <input type=\"checkbox\" (change)=\"addTerms($event,term)\" [checked]=\"term.selected\">\n <div class=\"data_value\">{{getOrdinalSuffix(i+1)}} Term (\u20B9 {{term?.termAmount}})</div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"subscriptions_list mt-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"title\">Transport Fee</div>\n <div class=\"selecting_types d-flex align-items-center gap-2 justify-content-end\">\n <div style=\"width:30%\">\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\n <input type=\"text\" matInput placeholder=\"Select Stop\" [matAutocomplete]=\"autoGrade\"\n [(ngModel)]=\"stopSearchText\" (input)=\"filterStops()\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n <mat-autocomplete #autoGrade=\"matAutocomplete\" (optionSelected)=\"onStopSelection($event)\">\n <mat-option *ngFor=\"let stop of filteredStopsList\" [value]=\"stop.stopName\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n {{ stop.stopName | titlecase }}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n <div style=\"width:30%\">\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\n <input type=\"text\" matInput placeholder=\"Select Vehicle Type\" [matAutocomplete]=\"autoGrade1\"\n [(ngModel)]=\"vehicleTypeSearchText\" (input)=\"filtereVehicleTypes()\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n <mat-autocomplete #autoGrade1=\"matAutocomplete\" (optionSelected)=\"onVehicleTypeSelection($event)\">\n <mat-option *ngFor=\"let stop of filteredVehicleTypesList\" [value]=\"stop.vehicleType\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n {{ stop.vehicleType | titlecase }}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div class=\"list_all_subscriptions mt-2\">\n <ng-container *ngFor=\"let item of routeValues\">\n <div class=\"single_fee_config p-3\">\n <div class=\"d-flex gap-2 align-items-center\">\n <mat-checkbox [checked]=\"admissionData.selectedStopDetail === item\"\n (change)=\"onCheckboxChange(item, $event)\"></mat-checkbox>\n\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width:92%\">\n <div class=\"fee_title\">\n {{ item.transport.route ? item.transport.route.name : 'N/A' }}\n <span>(<span style=\"font-size:12px;font-family: var(--primary-font-family);\">Pickup Time :</span>\n <span\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getPickupTime(item.transport.busRouteStopTimings)\n | date:'h:mm a'}}</span>\n -\n <span style=\"font-size:12px;font-family: var(--primary-font-family);\">Drop Time :</span>\n <span\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getDroptime(item.transport.busRouteStopTimings)\n | date:'h:mm a'}}</span>\n )</span>\n </div>\n <div class=\"fee_amount\">\u20B9 {{ item.charges.totalAmount }}</div>\n </div>\n </div>\n\n <div *ngIf=\"item?.charges.termPaymentList.length > 0\">\n <div class=\"change_selection\" style=\"width:90%;margin:0 auto\">\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.charges.selectedTermValue\"\n (change)=\"changeTransportTermValue(item)\" [disabled]=\"admissionData.selectedStopDetail !== item\">\n <mat-radio-button value=\"SINGLE\"\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Single</mat-radio-button>\n <mat-radio-button value=\"TERM\"\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Term</mat-radio-button>\n </mat-radio-group>\n </div>\n\n <div class=\"termCount\" *ngIf=\"item.charges.selectedTermValue === 'TERM'\">\n <div class=\"check_data\" style=\"width:75%;margin:0 auto\">\n <ng-container *ngFor=\"let term of item.charges.termPaymentList; let i = index\">\n <div class=\"singleData d-flex gap-3 align-items-end\">\n <input type=\"checkbox\" (change)=\"addSingleStop($event, term)\"\n [disabled]=\"admissionData.selectedStopDetail !== item\" />\n <div class=\"data_value\">{{ getOrdinalSuffix(i + 1) }} Term (\u20B9 {{term.termAmount}})</div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <div class=\"subscriptions_list mt-3\" *ngIf=\"subscriptionsData.length > 0\">\n <div class=\"title\">Subscriptions</div>\n <div class=\"list_all_subscriptions mt-2\">\n <ng-container *ngFor=\"let item of subscriptionsData\">\n <div class=\"top_1\">\n <div class=\"d-flex align-items-center gap-3\">\n <mat-checkbox [checked]=\"isSubscriptionSelected(item)\"\n (change)=\"onSubscriptionItemChange($event, item)\"></mat-checkbox>\n <div class=\"subscription_title\">\n {{item.subscriptionTitle}}\n </div>\n </div>\n <div class=\"subscription_types\" style=\"width:85%;margin:auto\">\n <ng-container *ngFor=\"let subV of item.newPricingList;let i = index\">\n <div class=\"single_subscrption d-flex gap-2 mt-2\">\n <div class=\"single_title d-flex gap-3 align-items-center\" style=\"width:25%\">\n <input type=\"radio\" [checked]=\"subV.selecteStatus\"\n (change)=\"toggleSubscriptionSelection(item.newPricingList, i, item)\"\n [disabled]=\"!disableSubscriptionSelection(item)\">\n <div class=\"data_value\">{{subV.name | titlecase}}</div>\n </div>\n <div class=\"single_value\">\n {{subV.amount}}\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n <div class=\"subscriptions_list mt-3\" *ngIf=\"listAllKits.length > 0\">\n <div class=\"title\">Student Kit</div>\n <div class=\"list_all_subscriptions mt-2 d-flex gap-2 flex-wrap\">\n <ng-container *ngFor=\"let item of listAllKits;let i = index\">\n <div class=\"single_kit\">\n <div class=\"top_layer d-flex justify-content-between align-items-center\">\n <div class=\"selection\">\n <input type=\"checkbox\" [(ngModel)]=\"item.selected\" class=\"cursor-pointer\"\n (change)=\"addRemoveKit(item,$event)\">\n </div>\n <div class=\"amount_section\">\n <div class=\"original_amount\" *ngIf=\"item.discountedAmount === 0\">\u20B9 {{item.amount}}</div>\n <div class=\"discounted_amount\" *ngIf=\"item.discountedAmount != 0\">\n \u20B9\n <span class=\"strikethrough\">{{item.originalAmount}}</span> &nbsp;\n <span style=\"font-family:var(--primary-semi-bold-font-family)\">{{item.discountedAmount}}</span>\n </div>\n </div>\n </div>\n <div class=\"kit_bottom_layer\">\n <div class=\"image_section d-flex justify-content-center align-items-center\">\n <div class=\"img_sec\" *ngIf=\"item.img != null\"><img [src]=\"item.img\" alt=\"\"></div>\n <div class=\"img_sec d-flex justify-content-center align-items-center\" *ngIf=\"item.img === null\">\n {{item.name.split('')[0] | uppercase}}\n </div>\n </div>\n <div class=\"mt-2 kit_title text-center\">\n {{item.name}}\n </div>\n <div class=\"kit_description text-center\" style=\"margin-top:4px\">\n {{item.description}}\n </div>\n </div>\n <div class=\"kit_footer_layer mt-2\" *ngIf=\"item.selected\">\n <div class=\"d-flex align-items-center justify-content-center gap-3 paying_options\">\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.kitPaymentSelected\"\n (ngModelChange)=\"changePaymentStatus(item)\">\n <mat-radio-button [value]=\"true\"><span style=\"font-family: var(--primary-font-family);font-size: 13px;\">Pay Now</span></mat-radio-button>\n <mat-radio-button [value]=\"false\"><span style=\"font-family: var(--primary-font-family);font-size: 13px;\">Pay Later</span></mat-radio-button>\n </mat-radio-group> \n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n <div class=\"right_payment_details h-100\">\n <div class=\"total_payment_details h-100 w-100 p-3\">\n <div class=\"mt-2 calculation_table\">\n <div class=\"calculation_single_part\">\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\n Total Academic Fee Breakdown\n </div>\n <ng-container *ngFor=\"let item of feeStructure.feeConfig\">\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\n <div class=\"fee_amount\" *ngIf=\"item.termsList.length === 0 || item.selectedTermValue != 'TERM'\">\n <span [ngClass]=\"(item?.concession != null && item?.concession?.length != 0) ? 'strikethrough' : ''\">\n \u20B9 {{item.amount}}\n </span>\n <span\n *ngIf=\"item.concession != null && item?.concession.length != 0\">({{item.appliedConcessionAmount}})</span>\n </div>\n </div>\n <div class=\"value fw-500\" *ngIf=\"item.termsList.length >= 0\">\n <div class=\"selecte_terms\">\n <ng-container *ngFor=\"let data of item.termsList\">\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\" *ngIf=\"data.selected\">\n <div class=\"key\">\n Term {{data.termNumber}}\n </div>\n <div class=\"value fw-500\">\n \u20B9 {{data.termAmount}}\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"calculation_single_part\" *ngIf=\"admissionData.selectedStopDetail != null && admissionData?.selectedStopDetail?.availability\">\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\n Transport Fee\n </div>\n <ng-container>\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\n <div class=\"fee_title\">{{admissionData.selectedStopDetail?.charges?.vehicleType ?\n admissionData.selectedStopDetail?.charges?.vehicleType?.name : 'N/A'}}</div>\n <div class=\"fee_amount\"\n *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length === 0 || admissionData.selectedStopDetail?.charges?.selectedTermValue != 'TERM'\">\n \u20B9\n {{admissionData.selectedStopDetail?.charges?.totalAmount}}\n </div>\n </div>\n <div class=\"value fw-500\" *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length >= 0\">\n <div class=\"selecte_terms\">\n <ng-container *ngFor=\"let data of admissionData.selectedStopDetail?.charges?.termPaymentList\">\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\"\n *ngIf=\"data.selected\">\n <div class=\"key\">\n Term {{data.termNumber}}\n </div>\n <div class=\"value fw-500\">\n \u20B9 {{data.termAmount}}\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"calculation_single_part\" *ngIf=\"hasActiveSubscriptions()\">\n <div class=\"new_title mt-2\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\n Subscriptions\n </div>\n <div class=\"listing_selected_suscriptions mt-2\">\n <ng-container *ngFor=\"let item of admissionData.subscriptionPlans\">\n <div class=\"fee_title\">{{item.subName | titlecase}}</div>\n <ng-container>\n <div class=\"single_payment_calculation d-flex justify-content-between align-items-center mb-1\">\n <div class=\"key\">\n {{item.frequency | titlecase}}\n </div>\n <div class=\"value fw-500\">\n \u20B9 {{item.pricing[item.frequency]}}\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <div class=\"calculation_single_part\" *ngIf=\"hasActiveKits()\">\n <div class=\"new_title mt-2\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\n Student Kits\n </div>\n <div class=\"listing_selected_suscriptions mt-2\">\n <ng-container *ngFor=\"let item of admissionData.selectedComboKits\">\n <ng-container *ngIf=\"item?.kitPaymentSelected\">\n <div class=\"single_payment_calculation d-flex justify-content-between align-items-center mb-1\">\n <div class=\"fee_title\">\n {{item.name | titlecase}}\n </div>\n <div class=\"value fw-500\">\n \u20B9 {{item.amount}}\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"footer_section total_container\">\n <div class=\"footer_title\">Grand Total Fee</div>\n <div class=\"d-flex justify-content-center align-items-center\">\n \u20B9 {{feeStructure?.totalFee}}\n </div>\n </div>\n </div>\n </div>\n</section>", styles: [".left_payment_details{width:55%;overflow-y:scroll}.right_payment_details{width:45%;padding:10px}.sec_title{font-size:16px;font-family:var(--primary-semi-bold-font-family);font-weight:500;color:#000}.single_fee_config{background-color:#f1f7ff99;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}.fee_title{font-size:14.5px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.fee_amount,.fee_amount span{font-size:14.5px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.total_payment_details{background:#faf5f199;box-shadow:0 0 2px #d3d3d3;border-radius:8px}.total_title{font-size:20px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500;line-height:18px}.calculation_table{height:90%;overflow-y:scroll}.footer_section{height:10%;display:flex;justify-content:space-between;align-items:center}.footer_title{font-size:18px;font-family:var(--primary-font-family);font-weight:500;color:#000}.total_container{background-color:#fff;padding:10px;font-size:20px;font-weight:500;font-family:var(--primary-semi-bold-font-family);color:#000}.calculation_single_part{background-color:#fff;padding:10px;border-radius:8px;margin-bottom:10px}.selected_single_term{margin-bottom:10px}.key{font-weight:500;font-size:14px;font-family:var(--primary-font-family);color:#3a3838;margin-left:30px}.fw-500{font-weight:500;font-family:var(--primary-semi-bold-font-family);font-size:16px;margin:0!important}.check_data{width:90%;margin:auto}.singleData{margin-bottom:10px}.singleData input{width:16px;height:16px}.singleData .data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.title{font-family:var(--primary-semi-bold-font-family);font-weight:500;font-size:15px;color:#000}.subscription_title{font-family:var(--primary-font-family);font-weight:500;font-size:14px;color:#000}.single_value{font-size:16px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.single_title input{width:16px;height:16px}.data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.top_1{background:#d2d4b999;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}.discounted_amount span,.original_amount{font-family:var(--primary-font-family);font-weight:500;font-size:13px}.img_sec{width:60px;height:60px;border-radius:50%;border:2px solid #0f9af1;font-size:18px;font-family:var(--primary-semi-bold-font-family);font-weight:500}.img_sec img{width:100%;height:100%;border-radius:50%}.selection input{width:16px;height:16px}.kit_title{font-size:14px;font-family:var(--primary-font-family);font-weight:500;color:#000}.kit_description{color:#434443;font-size:13px;font-family:var(--primary-font-family);font-weight:500}.paying_options label{font-size:14px;font-family:var(--primary-font-family);font-weight:500}.paying_options label input{width:16px;height:16px}.kit_bottom_layer{height:150px;overflow-y:scroll}.single_kit{background-color:#f2f2f9;padding:10px;border-radius:6px;width:32%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i3.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i7.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i7.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i9.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i9.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }] }); }
498
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: PaymentDetailsComponent, deps: [{ token: i1.ElementServiceService }, { token: i2.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
499
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.4", type: PaymentDetailsComponent, isStandalone: true, selector: "simpo-payment-details", inputs: { admissionData: "admissionData", subscriptionsData: "subscriptionsData", termPaymentList: "termPaymentList" }, ngImport: i0, template: "<!-- <section class=\"main-section\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <div class=\"heading left-side\">\r\n Admission Fee\r\n </div>\r\n\r\n <div class=\"left-side mt-10\" *ngFor=\"let configList of Object.keys(feeConfig)\">\r\n <div class=\"heading mb-20\">{{configList}}</div>\r\n\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeConfig[configList]\">\r\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"left-side mt-10\" *ngFor=\"let type of Object.keys(subscriptions)\">\r\n <p class=\"heading\">{{type}}</p>\r\n\r\n <table class=\"subscription-table w-100\">\r\n <thead>\r\n <th>Subscription Title</th>\r\n <th>Monthly</th>\r\n <th>Quaterly</th>\r\n <th>Yearly</th>\r\n <th>On Demand</th>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscriptions[type];let i = index\">\r\n <td>{{data.subName}}</td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['QUARTERLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'MONTHLY'\" (click)=\"toggleSelection(data, 'MONTHLY')\" [checked]=\"data.selectedOption === 'MONTHLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexRadioDefault2\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['MONTHLY']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['QUARTERLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['MONTHLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'QUARTERLY'\" (click)=\"toggleSelection(data, 'QUARTERLY')\" [checked]=\"data.selectedOption === 'QUARTERLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['QUARTERLY']}}\r\n </label>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['MONTHLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['ANNUALLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ANNUALLY'\" (click)=\"toggleSelection(data, 'ANNUALLY')\" [checked]=\"data.selectedOption === 'ANNUALLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['ANNUALLY']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ANNUALLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['ONDEMAND']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ONDEMAND'\" (click)=\"toggleSelection(data, 'ONDEMAND')\" [checked]=\"data.selectedOption === 'ONDEMAND'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['ONDEMAND']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ONDEMAND']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"left-side mt-10\">\r\n <p class=\"heading\">Payment Plan</p>\r\n\r\n <div class=\"d-flex g-2\">\r\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('ANNUALLY')\">\r\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'ANNUALLY'\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n Annually\r\n </label>\r\n </div>\r\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('TERM')\">\r\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'TERM'\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n Term\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"admission\" *ngIf=\"admissionData.paymentPlanType === 'TERM'\">\r\n <mat-form-field class=\"input-text\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"--Select--\" multiple=\"true\" [(ngModel)]=\"feeStructure.termPaymentList\" (ngModelChange)=\"calculateTotalAmount()\">\r\n <mat-option *ngFor=\"let term of termPaymentList\" [value]=\"term\">term {{term.termNumber}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"col-md-6 right-side\">\r\n <div class=\"heading mb-20\">\r\n Fee Calculation\r\n </div>\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeStructure.feeConfigs\">\r\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\r\n </div>\r\n\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let subscripition of feeStructure.subscriptionPlans\">\r\n <p class=\"sub-heading mb-0\">{{subscripition.subName}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{subscripition.pricing[subscripition.frequency]}}</p>\r\n </div>\r\n\r\n <div class=\"total-fee\">\r\n <div class=\"heading mb-5\">\r\n Total Fee\r\n </div>\r\n <div class=\"amount\">\r\n \u20B9 {{feeStructure.totalAmount}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section> -->\r\n\r\n\r\n<section class=\"main_payment_details_section h-100 w-100 p-2 d-flex justify-content-between\">\r\n <div class=\"left_payment_details h-100 p-2\">\r\n <div class=\"fees_section\">\r\n <div class=\"sec_title\">\r\n Fees\r\n </div>\r\n <div class=\"mt-2 all_fee_configs\">\r\n <ng-container *ngFor=\"let item of feeStructure?.feeConfig\">\r\n <div class=\"single_fee_config p-3\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\r\n <div class=\"fee_amount\">\u20B9 {{item.amount}}</div>\r\n </div>\r\n <div *ngIf=\"item.termsList.length > 0\">\r\n <div class=\"change_selection\">\r\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.selectedTermValue\"\r\n name=\"termOption_{{ item.feeHead.id}}\"\r\n (change)=\"changeTermValue(item)\">\r\n <mat-radio-button value=\"SINGLE\"\r\n style=\"font-family: var(--primary-font-family);font-size:13px\">Single</mat-radio-button>\r\n <mat-radio-button value=\"TERM\"\r\n style=\"font-family: var(--primary-font-family);font-size:13px\">Term</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n <div class=\"termCount\" *ngIf=\"item.selectedTermValue === 'TERM'\">\r\n <div class=\"check_data\">\r\n <ng-container *ngFor=\"let term of item.termsList;let i = index\">\r\n <div class=\"singleData d-flex gap-3 align-items-end\">\r\n <input type=\"checkbox\" (change)=\"addTerms($event,term)\" [checked]=\"term.selected\">\r\n <div class=\"data_value\">{{getOrdinalSuffix(i+1)}} Term (\u20B9 {{term?.termAmount}})</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"subscriptions_list mt-3\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"title\">Transport Fee</div>\r\n <div class=\"selecting_types d-flex align-items-center gap-2 justify-content-end\">\r\n <div style=\"width:30%\">\r\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\r\n <input type=\"text\" matInput placeholder=\"Select Stop\" [matAutocomplete]=\"autoGrade\"\r\n [(ngModel)]=\"stopSearchText\" (input)=\"filterStops()\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n <mat-autocomplete #autoGrade=\"matAutocomplete\" (optionSelected)=\"onStopSelection($event)\">\r\n <mat-option *ngFor=\"let stop of filteredStopsList\" [value]=\"stop.stopName\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n {{ stop.stopName | titlecase }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n </div>\r\n <div style=\"width:30%\">\r\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\r\n <input type=\"text\" matInput placeholder=\"Select Vehicle Type\" [matAutocomplete]=\"autoGrade1\"\r\n [(ngModel)]=\"vehicleTypeSearchText\" (input)=\"filtereVehicleTypes()\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n <mat-autocomplete #autoGrade1=\"matAutocomplete\" (optionSelected)=\"onVehicleTypeSelection($event)\">\r\n <mat-option *ngFor=\"let stop of filteredVehicleTypesList\" [value]=\"stop.vehicleType\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n {{ stop.vehicleType | titlecase }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"list_all_subscriptions mt-2\">\r\n <ng-container *ngFor=\"let item of routeValues\">\r\n <div class=\"single_fee_config p-3\">\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <mat-checkbox [checked]=\"admissionData.selectedStopDetail === item\"\r\n (change)=\"onCheckboxChange(item, $event)\"></mat-checkbox>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width:92%\">\r\n <div class=\"fee_title\">\r\n {{ item.transport.route ? item.transport.route.name : 'N/A' }}\r\n <span>(<span style=\"font-size:12px;font-family: var(--primary-font-family);\">Pickup Time :</span>\r\n <span\r\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getPickupTime(item.transport.busRouteStopTimings)\r\n | date:'h:mm a'}}</span>\r\n -\r\n <span style=\"font-size:12px;font-family: var(--primary-font-family);\">Drop Time :</span>\r\n <span\r\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getDroptime(item.transport.busRouteStopTimings)\r\n | date:'h:mm a'}}</span>\r\n )</span>\r\n </div>\r\n <div class=\"fee_amount\">\u20B9 {{ item.charges.totalAmount }}</div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"item?.charges.termPaymentList.length > 0\">\r\n <div class=\"change_selection\" style=\"width:90%;margin:0 auto\">\r\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.charges.selectedTermValue\"\r\n (change)=\"changeTransportTermValue(item)\" [disabled]=\"admissionData.selectedStopDetail !== item\">\r\n <mat-radio-button value=\"SINGLE\"\r\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Single</mat-radio-button>\r\n <mat-radio-button value=\"TERM\"\r\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Term</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div class=\"termCount\" *ngIf=\"item.charges.selectedTermValue === 'TERM'\">\r\n <div class=\"check_data\" style=\"width:75%;margin:0 auto\">\r\n <ng-container *ngFor=\"let term of item.charges.termPaymentList; let i = index\">\r\n <div class=\"singleData d-flex gap-3 align-items-end\">\r\n <input type=\"checkbox\" (change)=\"addSingleStop($event, term)\"\r\n [disabled]=\"admissionData.selectedStopDetail !== item\" />\r\n <div class=\"data_value\">{{ getOrdinalSuffix(i + 1) }} Term (\u20B9 {{term.termAmount}})</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n <div class=\"subscriptions_list mt-3\" *ngIf=\"subscriptionsData.length > 0\">\r\n <div class=\"title\">Subscriptions</div>\r\n <div class=\"list_all_subscriptions mt-2\">\r\n <ng-container *ngFor=\"let item of subscriptionsData\">\r\n <div class=\"top_1\">\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <mat-checkbox [checked]=\"isSubscriptionSelected(item)\"\r\n (change)=\"onSubscriptionItemChange($event, item)\"></mat-checkbox>\r\n <div class=\"subscription_title\">\r\n {{item.subscriptionTitle}}\r\n </div>\r\n </div>\r\n <div class=\"subscription_types\" style=\"width:85%;margin:auto\">\r\n <ng-container *ngFor=\"let subV of item.newPricingList;let i = index\">\r\n <div class=\"single_subscrption d-flex gap-2 mt-2\">\r\n <div class=\"single_title d-flex gap-3 align-items-center\" style=\"width:25%\">\r\n <input type=\"radio\" [checked]=\"subV.selecteStatus\"\r\n (change)=\"toggleSubscriptionSelection(item.newPricingList, i, item)\"\r\n [disabled]=\"!disableSubscriptionSelection(item)\">\r\n <div class=\"data_value\">{{subV.name | titlecase}}</div>\r\n </div>\r\n <div class=\"single_value\">\r\n {{subV.amount}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"subscriptions_list mt-3\" *ngIf=\"listAllKits.length > 0\">\r\n <div class=\"title\">Student Kit</div>\r\n <div class=\"list_all_subscriptions mt-2 d-flex gap-2 flex-wrap\">\r\n <ng-container *ngFor=\"let item of listAllKits;let i = index\">\r\n <div class=\"single_kit\">\r\n <div class=\"top_layer d-flex justify-content-between align-items-center\">\r\n <div class=\"selection\">\r\n <input type=\"checkbox\" [(ngModel)]=\"item.selected\" class=\"cursor-pointer\"\r\n (change)=\"addRemoveKit(item,$event)\">\r\n </div>\r\n <div class=\"amount_section\">\r\n <div class=\"original_amount\" *ngIf=\"item.discountedAmount === 0\">\u20B9 {{item.amount}}</div>\r\n <div class=\"discounted_amount\" *ngIf=\"item.discountedAmount != 0\">\r\n \u20B9\r\n <span class=\"strikethrough\">{{item.originalAmount}}</span> &nbsp;\r\n <span style=\"font-family:var(--primary-semi-bold-font-family)\">{{item.discountedAmount}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"kit_bottom_layer\">\r\n <div class=\"image_section d-flex justify-content-center align-items-center\">\r\n <div class=\"img_sec\" *ngIf=\"item.img != null\"><img [src]=\"item.img\" alt=\"\"></div>\r\n <div class=\"img_sec d-flex justify-content-center align-items-center\" *ngIf=\"item.img === null\">\r\n {{item.name.split('')[0] | uppercase}}\r\n </div>\r\n </div>\r\n <div class=\"mt-2 kit_title text-center\">\r\n {{item.name}}\r\n </div>\r\n <div class=\"kit_description text-center\" style=\"margin-top:4px\">\r\n {{item.description}}\r\n </div>\r\n </div>\r\n <div class=\"kit_footer_layer mt-2\" *ngIf=\"item.selected\">\r\n <div class=\"d-flex align-items-center justify-content-center gap-3 paying_options\">\r\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.kitPaymentSelected\"\r\n (ngModelChange)=\"changePaymentStatus(item)\">\r\n <mat-radio-button [value]=\"true\"><span style=\"font-family: var(--primary-font-family);font-size: 13px;\">Pay Now</span></mat-radio-button>\r\n <mat-radio-button [value]=\"false\"><span style=\"font-family: var(--primary-font-family);font-size: 13px;\">Pay Later</span></mat-radio-button>\r\n </mat-radio-group> \r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"right_payment_details h-100\">\r\n <div class=\"total_payment_details h-100 w-100 p-3\">\r\n <div class=\"mt-2 calculation_table\">\r\n <div class=\"calculation_single_part\">\r\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\r\n Total Academic Fee Breakdown\r\n </div>\r\n <ng-container *ngFor=\"let item of feeStructure.feeConfig\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\r\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\r\n <div class=\"fee_amount\" *ngIf=\"item.termsList.length === 0 || item.selectedTermValue != 'TERM'\">\r\n <span [ngClass]=\"(item?.concession != null && item?.concession?.length != 0) ? 'strikethrough' : ''\">\r\n \u20B9 {{item.amount}}\r\n </span>\r\n <span\r\n *ngIf=\"item.concession != null && item?.concession.length != 0\">({{item.appliedConcessionAmount}})</span>\r\n </div>\r\n </div>\r\n <div class=\"value fw-500\" *ngIf=\"item.termsList.length >= 0\">\r\n <div class=\"selecte_terms\">\r\n <ng-container *ngFor=\"let data of item.termsList\">\r\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\" *ngIf=\"data.selected\">\r\n <div class=\"key\">\r\n Term {{data.termNumber}}\r\n </div>\r\n <div class=\"value fw-500\">\r\n \u20B9 {{data.termAmount}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"calculation_single_part\" *ngIf=\"admissionData.selectedStopDetail != null && admissionData?.selectedStopDetail?.availability\">\r\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\r\n Transport Fee\r\n </div>\r\n <ng-container>\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\r\n <div class=\"fee_title\">{{admissionData.selectedStopDetail?.charges?.vehicleType ?\r\n admissionData.selectedStopDetail?.charges?.vehicleType?.name : 'N/A'}}</div>\r\n <div class=\"fee_amount\"\r\n *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length === 0 || admissionData.selectedStopDetail?.charges?.selectedTermValue != 'TERM'\">\r\n \u20B9\r\n {{admissionData.selectedStopDetail?.charges?.totalAmount}}\r\n </div>\r\n </div>\r\n <div class=\"value fw-500\" *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length >= 0\">\r\n <div class=\"selecte_terms\">\r\n <ng-container *ngFor=\"let data of admissionData.selectedStopDetail?.charges?.termPaymentList\">\r\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\"\r\n *ngIf=\"data.selected\">\r\n <div class=\"key\">\r\n Term {{data.termNumber}}\r\n </div>\r\n <div class=\"value fw-500\">\r\n \u20B9 {{data.termAmount}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"calculation_single_part\" *ngIf=\"hasActiveSubscriptions()\">\r\n <div class=\"new_title mt-2\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\r\n Subscriptions\r\n </div>\r\n <div class=\"listing_selected_suscriptions mt-2\">\r\n <ng-container *ngFor=\"let item of admissionData.subscriptionPlans\">\r\n <div class=\"fee_title\">{{item.subName | titlecase}}</div>\r\n <ng-container>\r\n <div class=\"single_payment_calculation d-flex justify-content-between align-items-center mb-1\">\r\n <div class=\"key\">\r\n {{item.frequency | titlecase}}\r\n </div>\r\n <div class=\"value fw-500\">\r\n \u20B9 {{item.pricing[item.frequency]}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"calculation_single_part\" *ngIf=\"hasActiveKits()\">\r\n <div class=\"new_title mt-2\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\r\n Student Kits\r\n </div>\r\n <div class=\"listing_selected_suscriptions mt-2\">\r\n <ng-container *ngFor=\"let item of admissionData.selectedComboKits\">\r\n <ng-container *ngIf=\"item?.kitPaymentSelected\">\r\n <div class=\"single_payment_calculation d-flex justify-content-between align-items-center mb-1\">\r\n <div class=\"fee_title\">\r\n {{item.name | titlecase}}\r\n </div>\r\n <div class=\"value fw-500\">\r\n \u20B9 {{item.amount}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"footer_section total_container\">\r\n <div class=\"footer_title\">Grand Total Fee</div>\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n \u20B9 {{feeStructure?.totalFee}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>", styles: [".left_payment_details{width:55%;overflow-y:scroll}.right_payment_details{width:45%;padding:10px}.sec_title{font-size:16px;font-family:var(--primary-semi-bold-font-family);font-weight:500;color:#000}.single_fee_config{background-color:#f1f7ff99;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}.fee_title{font-size:14.5px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.fee_amount,.fee_amount span{font-size:14.5px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.total_payment_details{background:#faf5f199;box-shadow:0 0 2px #d3d3d3;border-radius:8px}.total_title{font-size:20px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500;line-height:18px}.calculation_table{height:90%;overflow-y:scroll}.footer_section{height:10%;display:flex;justify-content:space-between;align-items:center}.footer_title{font-size:18px;font-family:var(--primary-font-family);font-weight:500;color:#000}.total_container{background-color:#fff;padding:10px;font-size:20px;font-weight:500;font-family:var(--primary-semi-bold-font-family);color:#000}.calculation_single_part{background-color:#fff;padding:10px;border-radius:8px;margin-bottom:10px}.selected_single_term{margin-bottom:10px}.key{font-weight:500;font-size:14px;font-family:var(--primary-font-family);color:#3a3838;margin-left:30px}.fw-500{font-weight:500;font-family:var(--primary-semi-bold-font-family);font-size:16px;margin:0!important}.check_data{width:90%;margin:auto}.singleData{margin-bottom:10px}.singleData input{width:16px;height:16px}.singleData .data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.title{font-family:var(--primary-semi-bold-font-family);font-weight:500;font-size:15px;color:#000}.subscription_title{font-family:var(--primary-font-family);font-weight:500;font-size:14px;color:#000}.single_value{font-size:16px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.single_title input{width:16px;height:16px}.data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.top_1{background:#d2d4b999;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}.discounted_amount span,.original_amount{font-family:var(--primary-font-family);font-weight:500;font-size:13px}.img_sec{width:60px;height:60px;border-radius:50%;border:2px solid #0f9af1;font-size:18px;font-family:var(--primary-semi-bold-font-family);font-weight:500}.img_sec img{width:100%;height:100%;border-radius:50%}.selection input{width:16px;height:16px}.kit_title{font-size:14px;font-family:var(--primary-font-family);font-weight:500;color:#000}.kit_description{color:#434443;font-size:13px;font-family:var(--primary-font-family);font-weight:500}.paying_options label{font-size:14px;font-family:var(--primary-font-family);font-weight:500}.paying_options label input{width:16px;height:16px}.kit_bottom_layer{height:150px;overflow-y:scroll}.single_kit{background-color:#f2f2f9;padding:10px;border-radius:6px;width:32%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i3.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i7.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i7.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i9.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i9.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }] }); }
500
500
  }
501
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaymentDetailsComponent, decorators: [{
501
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: PaymentDetailsComponent, decorators: [{
502
502
  type: Component,
503
503
  args: [{ selector: 'simpo-payment-details', standalone: true, imports: [
504
504
  CommonModule,
@@ -511,7 +511,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
511
511
  MatDialogModule,
512
512
  MatAutocompleteModule,
513
513
  MatInputModule
514
- ], template: "<!-- <section class=\"main-section\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <div class=\"heading left-side\">\n Admission Fee\n </div>\n\n <div class=\"left-side mt-10\" *ngFor=\"let configList of Object.keys(feeConfig)\">\n <div class=\"heading mb-20\">{{configList}}</div>\n\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeConfig[configList]\">\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\n </div>\n </div>\n\n <div class=\"left-side mt-10\" *ngFor=\"let type of Object.keys(subscriptions)\">\n <p class=\"heading\">{{type}}</p>\n\n <table class=\"subscription-table w-100\">\n <thead>\n <th>Subscription Title</th>\n <th>Monthly</th>\n <th>Quaterly</th>\n <th>Yearly</th>\n <th>On Demand</th>\n </thead>\n <tbody>\n <tr *ngFor=\"let data of subscriptions[type];let i = index\">\n <td>{{data.subName}}</td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['QUARTERLY']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'MONTHLY'\" (click)=\"toggleSelection(data, 'MONTHLY')\" [checked]=\"data.selectedOption === 'MONTHLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexRadioDefault2\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['MONTHLY']}}\n </label>\n </div>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['QUARTERLY']\" [src]=\"defaultImage\" alt=\"\">\n </td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['MONTHLY']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'QUARTERLY'\" (click)=\"toggleSelection(data, 'QUARTERLY')\" [checked]=\"data.selectedOption === 'QUARTERLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['QUARTERLY']}}\n </label>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['MONTHLY']\" [src]=\"defaultImage\" alt=\"\">\n </div>\n </td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['ANNUALLY']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ANNUALLY'\" (click)=\"toggleSelection(data, 'ANNUALLY')\" [checked]=\"data.selectedOption === 'ANNUALLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['ANNUALLY']}}\n </label>\n </div>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ANNUALLY']\" [src]=\"defaultImage\" alt=\"\">\n </td>\n <td>\n <div class=\"form-check\" *ngIf=\"data.pricing['ONDEMAND']\">\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ONDEMAND'\" (click)=\"toggleSelection(data, 'ONDEMAND')\" [checked]=\"data.selectedOption === 'ONDEMAND'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n \u20B9 {{data.pricing['ONDEMAND']}}\n </label>\n </div>\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ONDEMAND']\" [src]=\"defaultImage\" alt=\"\">\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div class=\"left-side mt-10\">\n <p class=\"heading\">Payment Plan</p>\n\n <div class=\"d-flex g-2\">\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('ANNUALLY')\">\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'ANNUALLY'\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n Annually\n </label>\n </div>\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('TERM')\">\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'TERM'\">\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\n Term\n </label>\n </div>\n </div>\n\n <div class=\"admission\" *ngIf=\"admissionData.paymentPlanType === 'TERM'\">\n <mat-form-field class=\"input-text\" appearance=\"outline\">\n <mat-select class=\"inputStyle\" placeholder=\"--Select--\" multiple=\"true\" [(ngModel)]=\"feeStructure.termPaymentList\" (ngModelChange)=\"calculateTotalAmount()\">\n <mat-option *ngFor=\"let term of termPaymentList\" [value]=\"term\">term {{term.termNumber}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n </div>\n </div>\n <div class=\"col-md-6 right-side\">\n <div class=\"heading mb-20\">\n Fee Calculation\n </div>\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeStructure.feeConfigs\">\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\n </div>\n\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let subscripition of feeStructure.subscriptionPlans\">\n <p class=\"sub-heading mb-0\">{{subscripition.subName}}</p>\n <p class=\"amount mb-0\">\u20B9 {{subscripition.pricing[subscripition.frequency]}}</p>\n </div>\n\n <div class=\"total-fee\">\n <div class=\"heading mb-5\">\n Total Fee\n </div>\n <div class=\"amount\">\n \u20B9 {{feeStructure.totalAmount}}\n </div>\n </div>\n </div>\n </div>\n</section> -->\n\n\n<section class=\"main_payment_details_section h-100 w-100 p-2 d-flex justify-content-between\">\n <div class=\"left_payment_details h-100 p-2\">\n <div class=\"fees_section\">\n <div class=\"sec_title\">\n Fees\n </div>\n <div class=\"mt-2 all_fee_configs\">\n <ng-container *ngFor=\"let item of feeStructure?.feeConfig\">\n <div class=\"single_fee_config p-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\n <div class=\"fee_amount\">\u20B9 {{item.amount}}</div>\n </div>\n <div *ngIf=\"item.termsList.length > 0\">\n <div class=\"change_selection\">\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.selectedTermValue\"\n name=\"termOption_{{ item.feeHead.id}}\"\n (change)=\"changeTermValue(item)\">\n <mat-radio-button value=\"SINGLE\"\n style=\"font-family: var(--primary-font-family);font-size:13px\">Single</mat-radio-button>\n <mat-radio-button value=\"TERM\"\n style=\"font-family: var(--primary-font-family);font-size:13px\">Term</mat-radio-button>\n </mat-radio-group>\n </div>\n <div class=\"termCount\" *ngIf=\"item.selectedTermValue === 'TERM'\">\n <div class=\"check_data\">\n <ng-container *ngFor=\"let term of item.termsList;let i = index\">\n <div class=\"singleData d-flex gap-3 align-items-end\">\n <input type=\"checkbox\" (change)=\"addTerms($event,term)\" [checked]=\"term.selected\">\n <div class=\"data_value\">{{getOrdinalSuffix(i+1)}} Term (\u20B9 {{term?.termAmount}})</div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"subscriptions_list mt-3\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"title\">Transport Fee</div>\n <div class=\"selecting_types d-flex align-items-center gap-2 justify-content-end\">\n <div style=\"width:30%\">\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\n <input type=\"text\" matInput placeholder=\"Select Stop\" [matAutocomplete]=\"autoGrade\"\n [(ngModel)]=\"stopSearchText\" (input)=\"filterStops()\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n <mat-autocomplete #autoGrade=\"matAutocomplete\" (optionSelected)=\"onStopSelection($event)\">\n <mat-option *ngFor=\"let stop of filteredStopsList\" [value]=\"stop.stopName\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n {{ stop.stopName | titlecase }}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n <div style=\"width:30%\">\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\n <input type=\"text\" matInput placeholder=\"Select Vehicle Type\" [matAutocomplete]=\"autoGrade1\"\n [(ngModel)]=\"vehicleTypeSearchText\" (input)=\"filtereVehicleTypes()\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n <mat-autocomplete #autoGrade1=\"matAutocomplete\" (optionSelected)=\"onVehicleTypeSelection($event)\">\n <mat-option *ngFor=\"let stop of filteredVehicleTypesList\" [value]=\"stop.vehicleType\"\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\n {{ stop.vehicleType | titlecase }}\n </mat-option>\n </mat-autocomplete>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div class=\"list_all_subscriptions mt-2\">\n <ng-container *ngFor=\"let item of routeValues\">\n <div class=\"single_fee_config p-3\">\n <div class=\"d-flex gap-2 align-items-center\">\n <mat-checkbox [checked]=\"admissionData.selectedStopDetail === item\"\n (change)=\"onCheckboxChange(item, $event)\"></mat-checkbox>\n\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width:92%\">\n <div class=\"fee_title\">\n {{ item.transport.route ? item.transport.route.name : 'N/A' }}\n <span>(<span style=\"font-size:12px;font-family: var(--primary-font-family);\">Pickup Time :</span>\n <span\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getPickupTime(item.transport.busRouteStopTimings)\n | date:'h:mm a'}}</span>\n -\n <span style=\"font-size:12px;font-family: var(--primary-font-family);\">Drop Time :</span>\n <span\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getDroptime(item.transport.busRouteStopTimings)\n | date:'h:mm a'}}</span>\n )</span>\n </div>\n <div class=\"fee_amount\">\u20B9 {{ item.charges.totalAmount }}</div>\n </div>\n </div>\n\n <div *ngIf=\"item?.charges.termPaymentList.length > 0\">\n <div class=\"change_selection\" style=\"width:90%;margin:0 auto\">\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.charges.selectedTermValue\"\n (change)=\"changeTransportTermValue(item)\" [disabled]=\"admissionData.selectedStopDetail !== item\">\n <mat-radio-button value=\"SINGLE\"\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Single</mat-radio-button>\n <mat-radio-button value=\"TERM\"\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Term</mat-radio-button>\n </mat-radio-group>\n </div>\n\n <div class=\"termCount\" *ngIf=\"item.charges.selectedTermValue === 'TERM'\">\n <div class=\"check_data\" style=\"width:75%;margin:0 auto\">\n <ng-container *ngFor=\"let term of item.charges.termPaymentList; let i = index\">\n <div class=\"singleData d-flex gap-3 align-items-end\">\n <input type=\"checkbox\" (change)=\"addSingleStop($event, term)\"\n [disabled]=\"admissionData.selectedStopDetail !== item\" />\n <div class=\"data_value\">{{ getOrdinalSuffix(i + 1) }} Term (\u20B9 {{term.termAmount}})</div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n <div class=\"subscriptions_list mt-3\" *ngIf=\"subscriptionsData.length > 0\">\n <div class=\"title\">Subscriptions</div>\n <div class=\"list_all_subscriptions mt-2\">\n <ng-container *ngFor=\"let item of subscriptionsData\">\n <div class=\"top_1\">\n <div class=\"d-flex align-items-center gap-3\">\n <mat-checkbox [checked]=\"isSubscriptionSelected(item)\"\n (change)=\"onSubscriptionItemChange($event, item)\"></mat-checkbox>\n <div class=\"subscription_title\">\n {{item.subscriptionTitle}}\n </div>\n </div>\n <div class=\"subscription_types\" style=\"width:85%;margin:auto\">\n <ng-container *ngFor=\"let subV of item.newPricingList;let i = index\">\n <div class=\"single_subscrption d-flex gap-2 mt-2\">\n <div class=\"single_title d-flex gap-3 align-items-center\" style=\"width:25%\">\n <input type=\"radio\" [checked]=\"subV.selecteStatus\"\n (change)=\"toggleSubscriptionSelection(item.newPricingList, i, item)\"\n [disabled]=\"!disableSubscriptionSelection(item)\">\n <div class=\"data_value\">{{subV.name | titlecase}}</div>\n </div>\n <div class=\"single_value\">\n {{subV.amount}}\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n <div class=\"subscriptions_list mt-3\" *ngIf=\"listAllKits.length > 0\">\n <div class=\"title\">Student Kit</div>\n <div class=\"list_all_subscriptions mt-2 d-flex gap-2 flex-wrap\">\n <ng-container *ngFor=\"let item of listAllKits;let i = index\">\n <div class=\"single_kit\">\n <div class=\"top_layer d-flex justify-content-between align-items-center\">\n <div class=\"selection\">\n <input type=\"checkbox\" [(ngModel)]=\"item.selected\" class=\"cursor-pointer\"\n (change)=\"addRemoveKit(item,$event)\">\n </div>\n <div class=\"amount_section\">\n <div class=\"original_amount\" *ngIf=\"item.discountedAmount === 0\">\u20B9 {{item.amount}}</div>\n <div class=\"discounted_amount\" *ngIf=\"item.discountedAmount != 0\">\n \u20B9\n <span class=\"strikethrough\">{{item.originalAmount}}</span> &nbsp;\n <span style=\"font-family:var(--primary-semi-bold-font-family)\">{{item.discountedAmount}}</span>\n </div>\n </div>\n </div>\n <div class=\"kit_bottom_layer\">\n <div class=\"image_section d-flex justify-content-center align-items-center\">\n <div class=\"img_sec\" *ngIf=\"item.img != null\"><img [src]=\"item.img\" alt=\"\"></div>\n <div class=\"img_sec d-flex justify-content-center align-items-center\" *ngIf=\"item.img === null\">\n {{item.name.split('')[0] | uppercase}}\n </div>\n </div>\n <div class=\"mt-2 kit_title text-center\">\n {{item.name}}\n </div>\n <div class=\"kit_description text-center\" style=\"margin-top:4px\">\n {{item.description}}\n </div>\n </div>\n <div class=\"kit_footer_layer mt-2\" *ngIf=\"item.selected\">\n <div class=\"d-flex align-items-center justify-content-center gap-3 paying_options\">\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.kitPaymentSelected\"\n (ngModelChange)=\"changePaymentStatus(item)\">\n <mat-radio-button [value]=\"true\"><span style=\"font-family: var(--primary-font-family);font-size: 13px;\">Pay Now</span></mat-radio-button>\n <mat-radio-button [value]=\"false\"><span style=\"font-family: var(--primary-font-family);font-size: 13px;\">Pay Later</span></mat-radio-button>\n </mat-radio-group> \n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n <div class=\"right_payment_details h-100\">\n <div class=\"total_payment_details h-100 w-100 p-3\">\n <div class=\"mt-2 calculation_table\">\n <div class=\"calculation_single_part\">\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\n Total Academic Fee Breakdown\n </div>\n <ng-container *ngFor=\"let item of feeStructure.feeConfig\">\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\n <div class=\"fee_amount\" *ngIf=\"item.termsList.length === 0 || item.selectedTermValue != 'TERM'\">\n <span [ngClass]=\"(item?.concession != null && item?.concession?.length != 0) ? 'strikethrough' : ''\">\n \u20B9 {{item.amount}}\n </span>\n <span\n *ngIf=\"item.concession != null && item?.concession.length != 0\">({{item.appliedConcessionAmount}})</span>\n </div>\n </div>\n <div class=\"value fw-500\" *ngIf=\"item.termsList.length >= 0\">\n <div class=\"selecte_terms\">\n <ng-container *ngFor=\"let data of item.termsList\">\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\" *ngIf=\"data.selected\">\n <div class=\"key\">\n Term {{data.termNumber}}\n </div>\n <div class=\"value fw-500\">\n \u20B9 {{data.termAmount}}\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"calculation_single_part\" *ngIf=\"admissionData.selectedStopDetail != null && admissionData?.selectedStopDetail?.availability\">\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\n Transport Fee\n </div>\n <ng-container>\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\n <div class=\"fee_title\">{{admissionData.selectedStopDetail?.charges?.vehicleType ?\n admissionData.selectedStopDetail?.charges?.vehicleType?.name : 'N/A'}}</div>\n <div class=\"fee_amount\"\n *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length === 0 || admissionData.selectedStopDetail?.charges?.selectedTermValue != 'TERM'\">\n \u20B9\n {{admissionData.selectedStopDetail?.charges?.totalAmount}}\n </div>\n </div>\n <div class=\"value fw-500\" *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length >= 0\">\n <div class=\"selecte_terms\">\n <ng-container *ngFor=\"let data of admissionData.selectedStopDetail?.charges?.termPaymentList\">\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\"\n *ngIf=\"data.selected\">\n <div class=\"key\">\n Term {{data.termNumber}}\n </div>\n <div class=\"value fw-500\">\n \u20B9 {{data.termAmount}}\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"calculation_single_part\" *ngIf=\"hasActiveSubscriptions()\">\n <div class=\"new_title mt-2\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\n Subscriptions\n </div>\n <div class=\"listing_selected_suscriptions mt-2\">\n <ng-container *ngFor=\"let item of admissionData.subscriptionPlans\">\n <div class=\"fee_title\">{{item.subName | titlecase}}</div>\n <ng-container>\n <div class=\"single_payment_calculation d-flex justify-content-between align-items-center mb-1\">\n <div class=\"key\">\n {{item.frequency | titlecase}}\n </div>\n <div class=\"value fw-500\">\n \u20B9 {{item.pricing[item.frequency]}}\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <div class=\"calculation_single_part\" *ngIf=\"hasActiveKits()\">\n <div class=\"new_title mt-2\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\n Student Kits\n </div>\n <div class=\"listing_selected_suscriptions mt-2\">\n <ng-container *ngFor=\"let item of admissionData.selectedComboKits\">\n <ng-container *ngIf=\"item?.kitPaymentSelected\">\n <div class=\"single_payment_calculation d-flex justify-content-between align-items-center mb-1\">\n <div class=\"fee_title\">\n {{item.name | titlecase}}\n </div>\n <div class=\"value fw-500\">\n \u20B9 {{item.amount}}\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"footer_section total_container\">\n <div class=\"footer_title\">Grand Total Fee</div>\n <div class=\"d-flex justify-content-center align-items-center\">\n \u20B9 {{feeStructure?.totalFee}}\n </div>\n </div>\n </div>\n </div>\n</section>", styles: [".left_payment_details{width:55%;overflow-y:scroll}.right_payment_details{width:45%;padding:10px}.sec_title{font-size:16px;font-family:var(--primary-semi-bold-font-family);font-weight:500;color:#000}.single_fee_config{background-color:#f1f7ff99;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}.fee_title{font-size:14.5px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.fee_amount,.fee_amount span{font-size:14.5px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.total_payment_details{background:#faf5f199;box-shadow:0 0 2px #d3d3d3;border-radius:8px}.total_title{font-size:20px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500;line-height:18px}.calculation_table{height:90%;overflow-y:scroll}.footer_section{height:10%;display:flex;justify-content:space-between;align-items:center}.footer_title{font-size:18px;font-family:var(--primary-font-family);font-weight:500;color:#000}.total_container{background-color:#fff;padding:10px;font-size:20px;font-weight:500;font-family:var(--primary-semi-bold-font-family);color:#000}.calculation_single_part{background-color:#fff;padding:10px;border-radius:8px;margin-bottom:10px}.selected_single_term{margin-bottom:10px}.key{font-weight:500;font-size:14px;font-family:var(--primary-font-family);color:#3a3838;margin-left:30px}.fw-500{font-weight:500;font-family:var(--primary-semi-bold-font-family);font-size:16px;margin:0!important}.check_data{width:90%;margin:auto}.singleData{margin-bottom:10px}.singleData input{width:16px;height:16px}.singleData .data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.title{font-family:var(--primary-semi-bold-font-family);font-weight:500;font-size:15px;color:#000}.subscription_title{font-family:var(--primary-font-family);font-weight:500;font-size:14px;color:#000}.single_value{font-size:16px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.single_title input{width:16px;height:16px}.data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.top_1{background:#d2d4b999;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}.discounted_amount span,.original_amount{font-family:var(--primary-font-family);font-weight:500;font-size:13px}.img_sec{width:60px;height:60px;border-radius:50%;border:2px solid #0f9af1;font-size:18px;font-family:var(--primary-semi-bold-font-family);font-weight:500}.img_sec img{width:100%;height:100%;border-radius:50%}.selection input{width:16px;height:16px}.kit_title{font-size:14px;font-family:var(--primary-font-family);font-weight:500;color:#000}.kit_description{color:#434443;font-size:13px;font-family:var(--primary-font-family);font-weight:500}.paying_options label{font-size:14px;font-family:var(--primary-font-family);font-weight:500}.paying_options label input{width:16px;height:16px}.kit_bottom_layer{height:150px;overflow-y:scroll}.single_kit{background-color:#f2f2f9;padding:10px;border-radius:6px;width:32%}\n"] }]
514
+ ], template: "<!-- <section class=\"main-section\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\">\r\n <div class=\"heading left-side\">\r\n Admission Fee\r\n </div>\r\n\r\n <div class=\"left-side mt-10\" *ngFor=\"let configList of Object.keys(feeConfig)\">\r\n <div class=\"heading mb-20\">{{configList}}</div>\r\n\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeConfig[configList]\">\r\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"left-side mt-10\" *ngFor=\"let type of Object.keys(subscriptions)\">\r\n <p class=\"heading\">{{type}}</p>\r\n\r\n <table class=\"subscription-table w-100\">\r\n <thead>\r\n <th>Subscription Title</th>\r\n <th>Monthly</th>\r\n <th>Quaterly</th>\r\n <th>Yearly</th>\r\n <th>On Demand</th>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of subscriptions[type];let i = index\">\r\n <td>{{data.subName}}</td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['QUARTERLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'MONTHLY'\" (click)=\"toggleSelection(data, 'MONTHLY')\" [checked]=\"data.selectedOption === 'MONTHLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexRadioDefault2\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['MONTHLY']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['QUARTERLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['MONTHLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'QUARTERLY'\" (click)=\"toggleSelection(data, 'QUARTERLY')\" [checked]=\"data.selectedOption === 'QUARTERLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['QUARTERLY']}}\r\n </label>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['MONTHLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['ANNUALLY']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ANNUALLY'\" (click)=\"toggleSelection(data, 'ANNUALLY')\" [checked]=\"data.selectedOption === 'ANNUALLY'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['ANNUALLY']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ANNUALLY']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n <td>\r\n <div class=\"form-check\" *ngIf=\"data.pricing['ONDEMAND']\">\r\n <input class=\"form-check-input\" type=\"radio\" name=\"subscription{{i}}\" [value]=\"'ONDEMAND'\" (click)=\"toggleSelection(data, 'ONDEMAND')\" [checked]=\"data.selectedOption === 'ONDEMAND'\" [(ngModel)]=\"data.selectedOption\" id=\"flexCheckChecked\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n \u20B9 {{data.pricing['ONDEMAND']}}\r\n </label>\r\n </div>\r\n <img class=\"defaultImage\" *ngIf=\"!data.pricing['ONDEMAND']\" [src]=\"defaultImage\" alt=\"\">\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"left-side mt-10\">\r\n <p class=\"heading\">Payment Plan</p>\r\n\r\n <div class=\"d-flex g-2\">\r\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('ANNUALLY')\">\r\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'ANNUALLY'\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n Annually\r\n </label>\r\n </div>\r\n <div class=\"form-check\" (click)=\"changeAnnualPaymentTerm('TERM')\">\r\n <input class=\"form-check-input\" type=\"radio\" value=\"\" name=\"payment-plan\" id=\"flexCheckChecked\" [checked]=\"admissionData.paymentPlanType === 'TERM'\">\r\n <label class=\"form-check-label\" for=\"flexCheckChecked\">\r\n Term\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"admission\" *ngIf=\"admissionData.paymentPlanType === 'TERM'\">\r\n <mat-form-field class=\"input-text\" appearance=\"outline\">\r\n <mat-select class=\"inputStyle\" placeholder=\"--Select--\" multiple=\"true\" [(ngModel)]=\"feeStructure.termPaymentList\" (ngModelChange)=\"calculateTotalAmount()\">\r\n <mat-option *ngFor=\"let term of termPaymentList\" [value]=\"term\">term {{term.termNumber}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"col-md-6 right-side\">\r\n <div class=\"heading mb-20\">\r\n Fee Calculation\r\n </div>\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let config of feeStructure.feeConfigs\">\r\n <p class=\"sub-heading mb-0\">{{config.feeHead}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{config.amount}}</p>\r\n </div>\r\n\r\n <div class=\"d-flex justify-space mt-10 mb-15\" *ngFor=\"let subscripition of feeStructure.subscriptionPlans\">\r\n <p class=\"sub-heading mb-0\">{{subscripition.subName}}</p>\r\n <p class=\"amount mb-0\">\u20B9 {{subscripition.pricing[subscripition.frequency]}}</p>\r\n </div>\r\n\r\n <div class=\"total-fee\">\r\n <div class=\"heading mb-5\">\r\n Total Fee\r\n </div>\r\n <div class=\"amount\">\r\n \u20B9 {{feeStructure.totalAmount}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section> -->\r\n\r\n\r\n<section class=\"main_payment_details_section h-100 w-100 p-2 d-flex justify-content-between\">\r\n <div class=\"left_payment_details h-100 p-2\">\r\n <div class=\"fees_section\">\r\n <div class=\"sec_title\">\r\n Fees\r\n </div>\r\n <div class=\"mt-2 all_fee_configs\">\r\n <ng-container *ngFor=\"let item of feeStructure?.feeConfig\">\r\n <div class=\"single_fee_config p-3\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\r\n <div class=\"fee_amount\">\u20B9 {{item.amount}}</div>\r\n </div>\r\n <div *ngIf=\"item.termsList.length > 0\">\r\n <div class=\"change_selection\">\r\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.selectedTermValue\"\r\n name=\"termOption_{{ item.feeHead.id}}\"\r\n (change)=\"changeTermValue(item)\">\r\n <mat-radio-button value=\"SINGLE\"\r\n style=\"font-family: var(--primary-font-family);font-size:13px\">Single</mat-radio-button>\r\n <mat-radio-button value=\"TERM\"\r\n style=\"font-family: var(--primary-font-family);font-size:13px\">Term</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n <div class=\"termCount\" *ngIf=\"item.selectedTermValue === 'TERM'\">\r\n <div class=\"check_data\">\r\n <ng-container *ngFor=\"let term of item.termsList;let i = index\">\r\n <div class=\"singleData d-flex gap-3 align-items-end\">\r\n <input type=\"checkbox\" (change)=\"addTerms($event,term)\" [checked]=\"term.selected\">\r\n <div class=\"data_value\">{{getOrdinalSuffix(i+1)}} Term (\u20B9 {{term?.termAmount}})</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"subscriptions_list mt-3\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"title\">Transport Fee</div>\r\n <div class=\"selecting_types d-flex align-items-center gap-2 justify-content-end\">\r\n <div style=\"width:30%\">\r\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\r\n <input type=\"text\" matInput placeholder=\"Select Stop\" [matAutocomplete]=\"autoGrade\"\r\n [(ngModel)]=\"stopSearchText\" (input)=\"filterStops()\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n <mat-autocomplete #autoGrade=\"matAutocomplete\" (optionSelected)=\"onStopSelection($event)\">\r\n <mat-option *ngFor=\"let stop of filteredStopsList\" [value]=\"stop.stopName\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n {{ stop.stopName | titlecase }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n </div>\r\n <div style=\"width:30%\">\r\n <mat-form-field appearance=\"outline\" class=\"input_card mt-2 w-100\" style=\"height:40px\">\r\n <input type=\"text\" matInput placeholder=\"Select Vehicle Type\" [matAutocomplete]=\"autoGrade1\"\r\n [(ngModel)]=\"vehicleTypeSearchText\" (input)=\"filtereVehicleTypes()\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n <mat-autocomplete #autoGrade1=\"matAutocomplete\" (optionSelected)=\"onVehicleTypeSelection($event)\">\r\n <mat-option *ngFor=\"let stop of filteredVehicleTypesList\" [value]=\"stop.vehicleType\"\r\n style=\"font-size: 13px;font-family: var(--primary-font-family);\">\r\n {{ stop.vehicleType | titlecase }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"list_all_subscriptions mt-2\">\r\n <ng-container *ngFor=\"let item of routeValues\">\r\n <div class=\"single_fee_config p-3\">\r\n <div class=\"d-flex gap-2 align-items-center\">\r\n <mat-checkbox [checked]=\"admissionData.selectedStopDetail === item\"\r\n (change)=\"onCheckboxChange(item, $event)\"></mat-checkbox>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"width:92%\">\r\n <div class=\"fee_title\">\r\n {{ item.transport.route ? item.transport.route.name : 'N/A' }}\r\n <span>(<span style=\"font-size:12px;font-family: var(--primary-font-family);\">Pickup Time :</span>\r\n <span\r\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getPickupTime(item.transport.busRouteStopTimings)\r\n | date:'h:mm a'}}</span>\r\n -\r\n <span style=\"font-size:12px;font-family: var(--primary-font-family);\">Drop Time :</span>\r\n <span\r\n style=\"font-size:12px;font-family: var(--primary-semi-bold-font-family);\">{{getDroptime(item.transport.busRouteStopTimings)\r\n | date:'h:mm a'}}</span>\r\n )</span>\r\n </div>\r\n <div class=\"fee_amount\">\u20B9 {{ item.charges.totalAmount }}</div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"item?.charges.termPaymentList.length > 0\">\r\n <div class=\"change_selection\" style=\"width:90%;margin:0 auto\">\r\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.charges.selectedTermValue\"\r\n (change)=\"changeTransportTermValue(item)\" [disabled]=\"admissionData.selectedStopDetail !== item\">\r\n <mat-radio-button value=\"SINGLE\"\r\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Single</mat-radio-button>\r\n <mat-radio-button value=\"TERM\"\r\n style=\"font-family: var(--primary-font-family); font-size: 13px\">Term</mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div class=\"termCount\" *ngIf=\"item.charges.selectedTermValue === 'TERM'\">\r\n <div class=\"check_data\" style=\"width:75%;margin:0 auto\">\r\n <ng-container *ngFor=\"let term of item.charges.termPaymentList; let i = index\">\r\n <div class=\"singleData d-flex gap-3 align-items-end\">\r\n <input type=\"checkbox\" (change)=\"addSingleStop($event, term)\"\r\n [disabled]=\"admissionData.selectedStopDetail !== item\" />\r\n <div class=\"data_value\">{{ getOrdinalSuffix(i + 1) }} Term (\u20B9 {{term.termAmount}})</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n <div class=\"subscriptions_list mt-3\" *ngIf=\"subscriptionsData.length > 0\">\r\n <div class=\"title\">Subscriptions</div>\r\n <div class=\"list_all_subscriptions mt-2\">\r\n <ng-container *ngFor=\"let item of subscriptionsData\">\r\n <div class=\"top_1\">\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <mat-checkbox [checked]=\"isSubscriptionSelected(item)\"\r\n (change)=\"onSubscriptionItemChange($event, item)\"></mat-checkbox>\r\n <div class=\"subscription_title\">\r\n {{item.subscriptionTitle}}\r\n </div>\r\n </div>\r\n <div class=\"subscription_types\" style=\"width:85%;margin:auto\">\r\n <ng-container *ngFor=\"let subV of item.newPricingList;let i = index\">\r\n <div class=\"single_subscrption d-flex gap-2 mt-2\">\r\n <div class=\"single_title d-flex gap-3 align-items-center\" style=\"width:25%\">\r\n <input type=\"radio\" [checked]=\"subV.selecteStatus\"\r\n (change)=\"toggleSubscriptionSelection(item.newPricingList, i, item)\"\r\n [disabled]=\"!disableSubscriptionSelection(item)\">\r\n <div class=\"data_value\">{{subV.name | titlecase}}</div>\r\n </div>\r\n <div class=\"single_value\">\r\n {{subV.amount}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"subscriptions_list mt-3\" *ngIf=\"listAllKits.length > 0\">\r\n <div class=\"title\">Student Kit</div>\r\n <div class=\"list_all_subscriptions mt-2 d-flex gap-2 flex-wrap\">\r\n <ng-container *ngFor=\"let item of listAllKits;let i = index\">\r\n <div class=\"single_kit\">\r\n <div class=\"top_layer d-flex justify-content-between align-items-center\">\r\n <div class=\"selection\">\r\n <input type=\"checkbox\" [(ngModel)]=\"item.selected\" class=\"cursor-pointer\"\r\n (change)=\"addRemoveKit(item,$event)\">\r\n </div>\r\n <div class=\"amount_section\">\r\n <div class=\"original_amount\" *ngIf=\"item.discountedAmount === 0\">\u20B9 {{item.amount}}</div>\r\n <div class=\"discounted_amount\" *ngIf=\"item.discountedAmount != 0\">\r\n \u20B9\r\n <span class=\"strikethrough\">{{item.originalAmount}}</span> &nbsp;\r\n <span style=\"font-family:var(--primary-semi-bold-font-family)\">{{item.discountedAmount}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"kit_bottom_layer\">\r\n <div class=\"image_section d-flex justify-content-center align-items-center\">\r\n <div class=\"img_sec\" *ngIf=\"item.img != null\"><img [src]=\"item.img\" alt=\"\"></div>\r\n <div class=\"img_sec d-flex justify-content-center align-items-center\" *ngIf=\"item.img === null\">\r\n {{item.name.split('')[0] | uppercase}}\r\n </div>\r\n </div>\r\n <div class=\"mt-2 kit_title text-center\">\r\n {{item.name}}\r\n </div>\r\n <div class=\"kit_description text-center\" style=\"margin-top:4px\">\r\n {{item.description}}\r\n </div>\r\n </div>\r\n <div class=\"kit_footer_layer mt-2\" *ngIf=\"item.selected\">\r\n <div class=\"d-flex align-items-center justify-content-center gap-3 paying_options\">\r\n <mat-radio-group aria-label=\"Select an option\" [(ngModel)]=\"item.kitPaymentSelected\"\r\n (ngModelChange)=\"changePaymentStatus(item)\">\r\n <mat-radio-button [value]=\"true\"><span style=\"font-family: var(--primary-font-family);font-size: 13px;\">Pay Now</span></mat-radio-button>\r\n <mat-radio-button [value]=\"false\"><span style=\"font-family: var(--primary-font-family);font-size: 13px;\">Pay Later</span></mat-radio-button>\r\n </mat-radio-group> \r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"right_payment_details h-100\">\r\n <div class=\"total_payment_details h-100 w-100 p-3\">\r\n <div class=\"mt-2 calculation_table\">\r\n <div class=\"calculation_single_part\">\r\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\r\n Total Academic Fee Breakdown\r\n </div>\r\n <ng-container *ngFor=\"let item of feeStructure.feeConfig\">\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\r\n <div class=\"fee_title\">{{item.feeHead ? item.feeHead.name : 'N/A'}}</div>\r\n <div class=\"fee_amount\" *ngIf=\"item.termsList.length === 0 || item.selectedTermValue != 'TERM'\">\r\n <span [ngClass]=\"(item?.concession != null && item?.concession?.length != 0) ? 'strikethrough' : ''\">\r\n \u20B9 {{item.amount}}\r\n </span>\r\n <span\r\n *ngIf=\"item.concession != null && item?.concession.length != 0\">({{item.appliedConcessionAmount}})</span>\r\n </div>\r\n </div>\r\n <div class=\"value fw-500\" *ngIf=\"item.termsList.length >= 0\">\r\n <div class=\"selecte_terms\">\r\n <ng-container *ngFor=\"let data of item.termsList\">\r\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\" *ngIf=\"data.selected\">\r\n <div class=\"key\">\r\n Term {{data.termNumber}}\r\n </div>\r\n <div class=\"value fw-500\">\r\n \u20B9 {{data.termAmount}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"calculation_single_part\" *ngIf=\"admissionData.selectedStopDetail != null && admissionData?.selectedStopDetail?.availability\">\r\n <div class=\"total_title\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\r\n Transport Fee\r\n </div>\r\n <ng-container>\r\n <div class=\"d-flex justify-content-between align-items-center\" style=\"margin-top: 8px;\">\r\n <div class=\"fee_title\">{{admissionData.selectedStopDetail?.charges?.vehicleType ?\r\n admissionData.selectedStopDetail?.charges?.vehicleType?.name : 'N/A'}}</div>\r\n <div class=\"fee_amount\"\r\n *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length === 0 || admissionData.selectedStopDetail?.charges?.selectedTermValue != 'TERM'\">\r\n \u20B9\r\n {{admissionData.selectedStopDetail?.charges?.totalAmount}}\r\n </div>\r\n </div>\r\n <div class=\"value fw-500\" *ngIf=\"admissionData.selectedStopDetail?.charges?.termPaymentList?.length >= 0\">\r\n <div class=\"selecte_terms\">\r\n <ng-container *ngFor=\"let data of admissionData.selectedStopDetail?.charges?.termPaymentList\">\r\n <div class=\"selected_single_term d-flex align-items-center justify-content-between\"\r\n *ngIf=\"data.selected\">\r\n <div class=\"key\">\r\n Term {{data.termNumber}}\r\n </div>\r\n <div class=\"value fw-500\">\r\n \u20B9 {{data.termAmount}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"calculation_single_part\" *ngIf=\"hasActiveSubscriptions()\">\r\n <div class=\"new_title mt-2\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\r\n Subscriptions\r\n </div>\r\n <div class=\"listing_selected_suscriptions mt-2\">\r\n <ng-container *ngFor=\"let item of admissionData.subscriptionPlans\">\r\n <div class=\"fee_title\">{{item.subName | titlecase}}</div>\r\n <ng-container>\r\n <div class=\"single_payment_calculation d-flex justify-content-between align-items-center mb-1\">\r\n <div class=\"key\">\r\n {{item.frequency | titlecase}}\r\n </div>\r\n <div class=\"value fw-500\">\r\n \u20B9 {{item.pricing[item.frequency]}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"calculation_single_part\" *ngIf=\"hasActiveKits()\">\r\n <div class=\"new_title mt-2\" style=\"border-bottom: 1px solid #dedede;padding-bottom: 12px;\">\r\n Student Kits\r\n </div>\r\n <div class=\"listing_selected_suscriptions mt-2\">\r\n <ng-container *ngFor=\"let item of admissionData.selectedComboKits\">\r\n <ng-container *ngIf=\"item?.kitPaymentSelected\">\r\n <div class=\"single_payment_calculation d-flex justify-content-between align-items-center mb-1\">\r\n <div class=\"fee_title\">\r\n {{item.name | titlecase}}\r\n </div>\r\n <div class=\"value fw-500\">\r\n \u20B9 {{item.amount}}\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"footer_section total_container\">\r\n <div class=\"footer_title\">Grand Total Fee</div>\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n \u20B9 {{feeStructure?.totalFee}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>", styles: [".left_payment_details{width:55%;overflow-y:scroll}.right_payment_details{width:45%;padding:10px}.sec_title{font-size:16px;font-family:var(--primary-semi-bold-font-family);font-weight:500;color:#000}.single_fee_config{background-color:#f1f7ff99;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}.fee_title{font-size:14.5px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.fee_amount,.fee_amount span{font-size:14.5px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.total_payment_details{background:#faf5f199;box-shadow:0 0 2px #d3d3d3;border-radius:8px}.total_title{font-size:20px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500;line-height:18px}.calculation_table{height:90%;overflow-y:scroll}.footer_section{height:10%;display:flex;justify-content:space-between;align-items:center}.footer_title{font-size:18px;font-family:var(--primary-font-family);font-weight:500;color:#000}.total_container{background-color:#fff;padding:10px;font-size:20px;font-weight:500;font-family:var(--primary-semi-bold-font-family);color:#000}.calculation_single_part{background-color:#fff;padding:10px;border-radius:8px;margin-bottom:10px}.selected_single_term{margin-bottom:10px}.key{font-weight:500;font-size:14px;font-family:var(--primary-font-family);color:#3a3838;margin-left:30px}.fw-500{font-weight:500;font-family:var(--primary-semi-bold-font-family);font-size:16px;margin:0!important}.check_data{width:90%;margin:auto}.singleData{margin-bottom:10px}.singleData input{width:16px;height:16px}.singleData .data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.title{font-family:var(--primary-semi-bold-font-family);font-weight:500;font-size:15px;color:#000}.subscription_title{font-family:var(--primary-font-family);font-weight:500;font-size:14px;color:#000}.single_value{font-size:16px;font-family:var(--primary-semi-bold-font-family);color:#000;font-weight:500}.single_title input{width:16px;height:16px}.data_value{font-size:14px;font-family:var(--primary-font-family);color:#3a3838;font-weight:500}.top_1{background:#d2d4b999;padding:10px;box-shadow:0 0 2px #d3d3d3;border-radius:8px;margin-bottom:10px}.discounted_amount span,.original_amount{font-family:var(--primary-font-family);font-weight:500;font-size:13px}.img_sec{width:60px;height:60px;border-radius:50%;border:2px solid #0f9af1;font-size:18px;font-family:var(--primary-semi-bold-font-family);font-weight:500}.img_sec img{width:100%;height:100%;border-radius:50%}.selection input{width:16px;height:16px}.kit_title{font-size:14px;font-family:var(--primary-font-family);font-weight:500;color:#000}.kit_description{color:#434443;font-size:13px;font-family:var(--primary-font-family);font-weight:500}.paying_options label{font-size:14px;font-family:var(--primary-font-family);font-weight:500}.paying_options label input{width:16px;height:16px}.kit_bottom_layer{height:150px;overflow-y:scroll}.single_kit{background-color:#f2f2f9;padding:10px;border-radius:6px;width:32%}\n"] }]
515
515
  }], ctorParameters: () => [{ type: i1.ElementServiceService }, { type: i2.MatSnackBar }], propDecorators: { admissionData: [{
516
516
  type: Input
517
517
  }], subscriptionsData: [{
@@ -519,4 +519,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
519
519
  }], termPaymentList: [{
520
520
  type: Input
521
521
  }] } });
522
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LWRldGFpbHMvcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LWRldGFpbHMvcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRyxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSxxQkFBcUIsRUFBZ0MsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sMERBQTBELENBQUM7Ozs7Ozs7Ozs7OztBQW1CekcsTUFBTSxPQUFPLHVCQUF1QjtJQU9sQyxZQUNVLFdBQW1DLEVBQ25DLFFB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O3NCQUF6QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRPcHRpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgIE1hdFJhZGlvTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW8nO1xuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgRWxlbWVudFNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvZWRpdG9yLXNlcnZpY2Uuc2VydmljZSdcbmltcG9ydCB7IE1hdERpYWxvZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVNb2R1bGUsIE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBUcmFzcG9ydEF2YWlsYWJpbGl0eUNvbXBvbmVudCB9IGZyb20gJy4uL3RyYXNwb3J0LWF2YWlsYWJpbGl0eS90cmFzcG9ydC1hdmFpbGFiaWxpdHkuY29tcG9uZW50JztcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpbXBvLXBheW1lbnQtZGV0YWlscycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsIFxuICAgIEZvcm1zTW9kdWxlLCBcbiAgICBNYXRPcHRpb25Nb2R1bGUsIFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSwgXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIE1hdFJhZGlvTW9kdWxlLFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgIE1hdERpYWxvZ01vZHVsZSxcbiAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGVcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3BheW1lbnQtZGV0YWlscy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9wYXltZW50LWRldGFpbHMuY29tcG9uZW50LmNzcydcbn0pXG5leHBvcnQgY2xhc3MgUGF5bWVudERldGFpbHNDb21wb25lbnQge1xuICBASW5wdXQoKSBhZG1pc3Npb25EYXRhOiBhbnk7XG4gIEBJbnB1dCgpIHN1YnNjcmlwdGlvbnNEYXRhOiBhbnlbXSA9IFtdXG4gIEBJbnB1dCgpIHRlcm1QYXltZW50TGlzdDogYW55W10gPSBbXTtcblxuICBPYmplY3QgPSBPYmplY3RcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlc3RTZXJ2aWNlIDogRWxlbWVudFNlcnZpY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgc25hY2tCYXIgOiBNYXRTbmFja0JhclxuICApIHt9XG5cbiAgZmVlU3RydWN0dXJlOiBhbnkgPSB7XG4gICAgXCJpZFwiOiAnMTIzNCcsXG4gICAgXCJidXNpbmVzc0RldGFpbHNcIjoge1xuICAgICAgXCJpZFwiOiAnMTIzNCdcbiAgICB9LFxuICAgIFwiZ3JhZGVzXCI6IFtcbiAgICAgIHtcbiAgICAgICAgXCJfaWRcIjogXCIxMjM0XCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkdyYWRlIElJXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiX2lkXCI6IFwiMTIzNFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJHcmFkZSBJVlwiXG4gICAgICB9XG4gICAgXSxcbiAgICBcImJvYXJkXCI6IFwiU1RBVEVcIixcbiAgICBcImFjYWRlbWljWWVhclN0YXJ0XCI6IDIwMjQsXG4gICAgXCJhY2FkZW1pY1llYXJFbmRcIjogMjAyNSxcbiAgICBcImZlZUNvbmZpZ3NcIjogW1xuICAgICAge1xuICAgICAgICBcImZlZVR5cGVJZFwiOiAnMTIzMjQnLFxuICAgICAgICBcImZlZUhlYWRJZFwiOiAnMTIzNCcsXG4gICAgICAgIFwiZmVlVHlwZVwiOiBcIlR1dGlvbiBmZWVcIixcbiAgICAgICAgXCJmZWVIZWFkXCI6IFwiZXhhbSBmZWVcIixcbiAgICAgICAgXCJhbW91bnRcIjogMzAwLFxuICAgICAgICBcImRpc2NvdW50QW1vdW50XCI6IDAsXG4gICAgICAgIFwiaXNGaXhlZFwiOiBmYWxzZVxuICAgICAgfVxuICAgIF0sXG4gICAgXCJzdWJzY3JpcHRpb25QbGFuc1wiOiBbXSxcbiAgICBcInRvdGFsQW1vdW50XCI6IDMwMCxcbiAgICBcImNyZWF0ZWRUaW1lc3RhbXBcIjoge1xuICAgICAgXCIkZGF0ZVwiOiBcIjIwMjQtMTItMTVUMDc6MTA6NTQuODg5WlwiXG4gICAgfSxcbiAgICBcInVwZGF0ZWRUaW1lc3RhbXBcIjoge1xuICAgICAgXCIkZGF0ZVwiOiBcIjIwMjQtMTItMTVUMDc6MTA6NTQuODg5WlwiXG4gICAgfSxcbiAgICBcImFjdGl2ZVwiOiB0cnVlLFxuICB9XG5cblxuICBmZWVDb25maWc6IGFueTtcbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zID1bXVxuICAgIHRoaXMuc3Vic2NyaXB0aW9uc0RhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGlmKGVsZW1lbnQubmV3UHJpY2luZ0xpc3Qpe1xuICAgICAgICBlbGVtZW50Lm5ld1ByaWNpbmdMaXN0LmZvckVhY2goKGVsZW06YW55KSA9PiB7XG4gICAgICAgICAgZWxlbS5zZWxlY3RlU3RhdHVzID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYWRtaXNzaW9uRGF0YT8uc3R1ZGVudEZlZVN0cnVjdHVyZVYyPy5mZWVDb25maWcuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LnRlcm1zTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmKCFlbGVtZW50LnNlbGVjdGVkVGVybVZhbHVlKXtcbiAgICAgICAgICBlbGVtZW50LnNlbGVjdGVkVGVybVZhbHVlID0gJ1NJTkdMRSc7XG4gICAgICAgICAgaWYgKGVsZW1lbnQuc2VsZWN0ZWRUZXJtVmFsdWUgPT09ICdTSU5HTEUnKSB7XG4gICAgICAgICAgICBlbGVtZW50LnRlcm0gPSBmYWxzZTtcbiAgICAgICAgICAgIGVsZW1lbnQucGFpZCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50LnBhaWQgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBlbGVtZW50LnBhaWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZmVlU3RydWN0dXJlID0gdGhpcy5hZG1pc3Npb25EYXRhPy5zdHVkZW50RmVlU3RydWN0dXJlVjI7XG4gICAgaWYgKHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnNEYXRhLmZvckVhY2goc3ViID0+IHtcbiAgICAgICAgc3ViLm5ld1ByaWNpbmdMaXN0LmZvckVhY2goKHBsOiBhbnkpID0+IHtcbiAgICAgICAgICBwbC5zZWxlY3RlU3RhdHVzID0gdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zLnNvbWUoKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBlbGVtZW50LmZyZXF1ZW5jeSA9PT0gcGwubmFtZTtcbiAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICB0aGlzLmlzU3Vic2NyaXB0aW9uU2VsZWN0ZWQoc3ViKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIFxuICAgIHRoaXMuZ2V0QWxsU3RvcHMoKTtcbiAgICB0aGlzLmdldFZlaGljbGVUeXBlcygpO1xuICAgIHRoaXMuZ2V0QWxsS2l0cygpO1xuICB9XG5cblxuICBzdG9wc0xpc3Q6IGFueSA9IFtdO1xuICBmaWx0ZXJlZFN0b3BzTGlzdCA6IGFueSA9IFtdO1xuICB2ZWhpY2xlVHlwZXNMaXN0IDogYW55ID1bXTtcbiAgZmlsdGVyZWRWZWhpY2xlVHlwZXNMaXN0OiBhbnkgPSBbXTtcblxuICBzdG9wU2VhcmNoVGV4dDogc3RyaW5nID0gJyc7XG4gIHNlbGVjdGVkU3RvcDogYW55O1xuICBzZWxlY3RlZFZlaGljbGVUeXBlOiBhbnk7XG4gIHJvdXRlVmFsdWVzOiBhbnkgPSBbXTtcbiAgdmVoaWNsZVR5cGVTZWFyY2hUZXh0OiBhbnkgPSAnJztcbiAgZ2V0QWxsU3RvcHMoKSB7XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxTdG9wcyh0aGlzLmFkbWlzc2lvbkRhdGE/LmJ1c2luZXNzRGV0YWlscz8uaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zdG9wc0xpc3QgPSByZXMuZGF0YS5kYXRhXG4gICAgICAgIHRoaXMuZmlsdGVyZWRTdG9wc0xpc3QgPSBbLi4udGhpcy5zdG9wc0xpc3RdO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxuICAgICAgICAgIGVyci5lcnJvciA/IGVyci5lcnJvci5tZXNzYWdlIDogZXJyLnN0YXR1c1RleHQsXG4gICAgICAgICAgJ0Nsb3NlJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkdXJhdGlvbjozNTAwXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZpbHRlclN0b3BzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdG9wU2VhcmNoVGV4dCkge1xuICAgICAgdGhpcy5maWx0ZXJlZFN0b3BzTGlzdCA9IFsuLi50aGlzLnN0b3BzTGlzdF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnN0b3BTZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICB0aGlzLmZpbHRlcmVkU3RvcHNMaXN0ID0gdGhpcy5zdG9wc0xpc3QuZmlsdGVyKChzdG9wOmFueSkgPT5cbiAgICAgICAgc3RvcC5zdG9wTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRleHQpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG9uU3RvcFNlbGVjdGlvbihldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMudmVoaWNsZVR5cGVTZWFyY2hUZXh0ID0gJyc7XG4gICAgdGhpcy5zZWxlY3RlZFZlaGljbGVUeXBlID0gJyc7XG4gICAgdGhpcy5zZWxlY3RlZFZlaGljbGVUeXBlID0gbnVsbDtcbiAgICB0aGlzLnJvdXRlVmFsdWVzID0gW107XG4gICAgdGhpcy5yZW1vdmVUcmFzcG9ydEZlZSgpO1xuICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgPSBudWxsXG4gICAgbGV0IHNlbGVjdGVkU3R1ZGVudDogYW55O1xuICAgIHRoaXMuc3RvcHNMaXN0LmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC5zdG9wTmFtZS5zcGxpdCgnICcpLmpvaW4oJ18nKS50b0xvd2VyQ2FzZSgpID09PSBldmVudC5vcHRpb24udmFsdWUuc3BsaXQoJyAnKS5qb2luKCdfJykudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBzZWxlY3RlZFN0dWRlbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcCA9IGVsZW1lbnQ7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzZWxlY3RlZFN0b3AnLEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRTdG9wKSlcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldFZlaGljbGVUeXBlcygpIHtcbiAgICBsZXQgZGF0YSA9IHtcbiAgICAgIFwiYnVzaW5lc3NJZFwiOiB0aGlzLmFkbWlzc2lvbkRhdGEgPyB0aGlzLmFkbWlzc2lvbkRhdGEuYnVzaW5lc3NEZXRhaWxzLmlkIDogJycsXG4gICAgICBcInBhZ2VOb1wiOiAwLFxuICAgICAgXCJwYWdlU2l6ZVwiOiAxMDAwMCxcbiAgICAgIFwiaXNQYWdpbmF0aW9uXCI6IGZhbHNlXG4gICAgfVxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsVmVoaWNsZVR5cGVzKGRhdGEpLnN1YnNjcmliZShcbiAgICAgIChyZXM6YW55KSA9PntcbiAgICAgICAgIHRoaXMudmVoaWNsZVR5cGVzTGlzdCA9IHJlcy5kYXRhLmRhdGFcbiAgICAgICAgIHRoaXMuZmlsdGVyZWRWZWhpY2xlVHlwZXNMaXN0ID0gWy4uLnRoaXMudmVoaWNsZVR5cGVzTGlzdF07XG4gICAgICAgICBcbiAgICAgICAgIGNvbnN0IHNlbGVjdGVkU3RvcCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NlbGVjdGVkU3RvcCcpIHx8ICdudWxsJyk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVmVoaWNsZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NlbGVjdGVkVmVoaWNsZScpIHx8ICdudWxsJyk7XG5cbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoVGV4dCA9IHNlbGVjdGVkU3RvcD8uc3RvcE5hbWUgfHwgJyc7XG4gICAgICAgIHRoaXMudmVoaWNsZVR5cGVTZWFyY2hUZXh0ID0gc2VsZWN0ZWRWZWhpY2xlPy52ZWhpY2xlVHlwZSB8fCAnJztcbiAgICAgICAgaWYodGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCAhPSBudWxsKXtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcCA9IHNlbGVjdGVkU3RvcDtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVmVoaWNsZVR5cGUgPSBzZWxlY3RlZFZlaGljbGVcbiAgICAgICAgICB0aGlzLmdldFZlaGljbGVSb3V0ZXNCeVN0b3BzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApXG4gIH1cblxuICBmaWx0ZXJlVmVoaWNsZVR5cGVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52ZWhpY2xlVHlwZVNlYXJjaFRleHQpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRWZWhpY2xlVHlwZXNMaXN0ID0gWy4uLnRoaXMudmVoaWNsZVR5cGVzTGlzdF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnZlaGljbGVUeXBlU2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgdGhpcy5maWx0ZXJlZFZlaGljbGVUeXBlc0xpc3QgPSB0aGlzLnZlaGljbGVUeXBlc0xpc3QuZmlsdGVyKChzdG9wOmFueSkgPT5cbiAgICAgICAgc3RvcC52ZWhpY2xlVHlwZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRleHQpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG9uVmVoaWNsZVR5cGVTZWxlY3Rpb24oZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnZlaGljbGVUeXBlU2VhcmNoVGV4dCA9ICcnO1xuICAgIHRoaXMucmVtb3ZlVHJhc3BvcnRGZWUoKTtcbiAgICB0aGlzLnJvdXRlVmFsdWVzID0gW107XG4gICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCA9IG51bGxcbiAgICB0aGlzLnZlaGljbGVUeXBlc0xpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LnZlaGljbGVUeXBlLnNwbGl0KCcgJykuam9pbignXycpLnRvTG93ZXJDYXNlKCkgPT09IGV2ZW50Lm9wdGlvbi52YWx1ZS5zcGxpdCgnICcpLmpvaW4oJ18nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWZWhpY2xlVHlwZSA9IGVsZW1lbnQ7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzZWxlY3RlZFZlaGljbGUnLEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRWZWhpY2xlVHlwZSkpXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5nZXRWZWhpY2xlUm91dGVzQnlTdG9wcygpO1xuICB9XG5cbiAgZ2V0VmVoaWNsZVJvdXRlc0J5U3RvcHMoKSB7XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRWZWhpY2xlUm91dGVzKHRoaXMuc2VsZWN0ZWRTdG9wLmlkLCB0aGlzLnNlbGVjdGVkVmVoaWNsZVR5cGUudmVoaWNsZVR5cGVJZCkuc3Vic2NyaWJlKFxuICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmVzLmRhdGEuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQuY2hhcmdlcy5zZWxlY3RlZFRlcm1WYWx1ZSA9ICdTSU5HTEUnO1xuICAgICAgICAgICAgZWxlbWVudC5jaGFyZ2VzLmFtb3VudCA9IGVsZW1lbnQuY2hhcmdlcy50b3RhbEFtb3VudDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgPSByZXMuZGF0YVswXTtcbiAgICAgICAgICBpZih0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsLmF2YWlsYWJpbGl0eSl7XG4gICAgICAgICAgICB0aGlzLmFkbWlzc2lvbkRhdGEudHJhbnNwb3J0UmVxdWVzdCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXMpXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICB0aGlzLmFkZGluZ1RyYW5zcG9ydFJlcXVlc3QoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgdGhpcy5yb3V0ZVZhbHVlcyA9IHJlcy5kYXRhO1xuXG4gICAgICAgICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbC5zdG9wID0ge1xuICAgICAgICAgICAgbmFtZTp0aGlzLnNlbGVjdGVkU3RvcC5zdG9wTmFtZSxcbiAgICAgICAgICAgIGlkOnRoaXMuc2VsZWN0ZWRTdG9wLmlkXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgICAgIGAke3RoaXMuc2VsZWN0ZWRWZWhpY2xlVHlwZS52ZWhpY2xlVHlwZX0gZG9lc24ndCBoYXZlIGFueSByb3V0ZXNgLFxuICAgICAgICAgICAgJ09rJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246MzUwMFxuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgICAgZXJyLmVycm9yID8gZXJyLmVycm9yLm1lc3NhZ2UgOiBlcnIuc3RhdHVzVGV4dCxcbiAgICAgICAgICAnQ2xvc2UnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOjM1MDBcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICApXG4gIH1cblxuXG4gIGRlZmF1bHRJbWFnZTogc3RyaW5nID0gJ2h0dHBzOi8vcHJvZC1zaW1wby5zMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20vcHJvZC1pbWFnZXMvOTE3MDY3YzE3MzQzMzcyODAzMDNjYW5jZWwucG5nJztcblxuICBzZWxlY3RlZEl0ZW06IGFueVxuICBjaGFuZ2VUZXJtVmFsdWUoaXRlbTogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtO1xuICBcbiAgICBpZiAoaXRlbS5zZWxlY3RlZFRlcm1WYWx1ZSA9PT0gJ1RFUk0nKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsIGl0ZW0pOyBcbiAgICAgIGl0ZW0udGVybSA9IHRydWU7XG4gICAgICBpdGVtLnBhaWQgPSBmYWxzZTtcbiAgICB9IFxuICAgIFxuICAgIGVsc2Uge1xuICAgICAgaXRlbS50ZXJtID0gZmFsc2U7XG4gICAgICBpdGVtLnRlcm1zTGlzdC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5zZWxlY3RlZCkge1xuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgZWxlbWVudCk7XG4gICAgICAgICAgZWxlbWVudC5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgaXRlbSk7IFxuICAgIH1cbiAgfVxuXG4gIGFkZFRlcm1zKGV2OiBhbnksIGl0ZW06IGFueSkge1xuICAgIGlmIChldi50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIGl0ZW0pXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCBpdGVtKVxuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkSXRlbS50ZXJtc0xpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LnRlcm1JZCA9PSBpdGVtLnRlcm1JZCkge1xuICAgICAgICBlbGVtZW50LnNlbGVjdGVkID0gZXYudGFyZ2V0LmNoZWNrZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRPcmRpbmFsU3VmZml4KGk6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaiA9IGkgJSAxMCxcbiAgICAgIGsgPSBpICUgMTAwO1xuICAgIGlmIChqID09IDEgJiYgayAhPSAxMSkge1xuICAgICAgcmV0dXJuIGkgKyBcInN0XCI7XG4gICAgfVxuICAgIGlmIChqID09IDIgJiYgayAhPSAxMikge1xuICAgICAgcmV0dXJuIGkgKyBcIm5kXCI7XG4gICAgfVxuICAgIGlmIChqID09IDMgJiYgayAhPSAxMykge1xuICAgICAgcmV0dXJuIGkgKyBcInJkXCI7XG4gICAgfVxuICAgIHJldHVybiBpICsgXCJ0aFwiO1xuICB9XG5cbiAgaXNTdWJzY3JpcHRpb25TZWxlY3RlZChpdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zLnNvbWUoXG4gICAgICAocGxhbjogYW55KSA9PiBwbGFuLnN1YnNjcmlwdGlvbklkID09PSBpdGVtLnN1YnNjcmlwdGlvbklkXG4gICAgKTtcbiAgfVxuXG4gIG9uU3Vic2NyaXB0aW9uSXRlbUNoYW5nZShldmVudDogYW55LCBpdGVtOiBhbnkpIHtcbiAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC5jaGVja2VkO1xuICBcbiAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICBjb25zdCBleGlzdHMgPSB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMuc29tZShcbiAgICAgICAgKHBsYW46IGFueSkgPT4gcGxhbi5zdWJJZCA9PT0gaXRlbS5zdWJzY3JpcHRpb25JZFxuICAgICAgKTtcbiAgXG4gICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICBpdGVtLm5ld1ByaWNpbmdMaXN0LmZvckVhY2goKGVsOmFueSkgPT4gZWwuc2VsZWN0ZVN0YXR1cyA9IGZhbHNlKTtcbiAgICAgICAgaXRlbS5uZXdQcmljaW5nTGlzdFswXS5zZWxlY3RlU3RhdHVzID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMucHVzaCh7XG4gICAgICAgICAgc3ViSWQ6IGl0ZW0uc3Vic2NyaXB0aW9uSWQsXG4gICAgICAgICAgc3ViTmFtZTogaXRlbS5zdWJzY3JpcHRpb25UaXRsZSxcbiAgICAgICAgICBmcmVxdWVuY3k6IGl0ZW0ubmV3UHJpY2luZ0xpc3RbMF0ubmFtZSxcbiAgICAgICAgICBzdWJzY3JpcHRpb25UeXBlOiBpdGVtLnN1YnNjcmlwdGlvblR5cGUuc3Vic2NyaXB0aW9uVHlwZU5hbWUsXG4gICAgICAgICAgcHJpY2luZzogaXRlbS5wcmljaW5nLFxuICAgICAgICAgIGluY2x1c2lvbnM6IGl0ZW0uaW5jbHVzaW9uc1xuICAgICAgICB9KTtcbiAgXG4gICAgICAgIGNvbnN0IGFkZEFtb3VudCA9IGl0ZW0ucHJpY2luZ1tpdGVtLm5ld1ByaWNpbmdMaXN0WzBdLm5hbWVdO1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgeyBhbW91bnQ6IGFkZEFtb3VudCB9KTtcbiAgICAgIH1cbiAgXG4gICAgfSBlbHNlIHtcblxuICAgICAgY29uc3QgcmVtb3ZlZFBsYW4gPSB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMuZmluZChcbiAgICAgICAgKHBsYW46IGFueSkgPT4gcGxhbi5zdWJJZCA9PT0gaXRlbS5zdWJzY3JpcHRpb25JZFxuICAgICAgKTtcbiAgXG4gICAgICBpZiAocmVtb3ZlZFBsYW4pIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlQW1vdW50ID0gaXRlbS5wcmljaW5nW3JlbW92ZWRQbGFuLmZyZXF1ZW5jeV07XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgeyBhbW91bnQ6IHJlbW92ZUFtb3VudCB9KTtcbiAgICAgIH1cbiAgXG4gICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMgPSB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMuZmlsdGVyKFxuICAgICAgICAocGxhbjogYW55KSA9PiBwbGFuLnN1YklkICE9PSBpdGVtLnN1YnNjcmlwdGlvbklkXG4gICAgICApO1xuICBcbiAgICAgIGl0ZW0ubmV3UHJpY2luZ0xpc3QuZm9yRWFjaCgoZWw6YW55KSA9PiBlbC5zZWxlY3RlU3RhdHVzID0gZmFsc2UpO1xuICAgIH1cblxuICB9XG5cbiAgdG9nZ2xlU3Vic2NyaXB0aW9uU2VsZWN0aW9uKGxpc3Q6IGFueVtdLCBzZWxlY3RlZEluZGV4OiBudW1iZXIsIHBhcmVudEl0ZW06IGFueSkge1xuICAgIGxldCB1bnNlbGVjdGVkSXRlbTogYW55ID0gbnVsbDtcbiAgICBsZXQgcHJldmlvdXNseVNlbGVjdGVkSW5kZXggPSBsaXN0LmZpbmRJbmRleChlbCA9PiBlbC5zZWxlY3RlU3RhdHVzKTtcblxuICAgIGlmIChwcmV2aW91c2x5U2VsZWN0ZWRJbmRleCAhPT0gLTEgJiYgcHJldmlvdXNseVNlbGVjdGVkSW5kZXggIT09IHNlbGVjdGVkSW5kZXgpIHtcbiAgICAgIHVuc2VsZWN0ZWRJdGVtID0gbGlzdFtwcmV2aW91c2x5U2VsZWN0ZWRJbmRleF07XG4gICAgfVxuICAgIGxpc3QuZm9yRWFjaCgoZWwsIGluZGV4KSA9PiB7XG4gICAgICBlbC5zZWxlY3RlU3RhdHVzID0gaW5kZXggPT09IHNlbGVjdGVkSW5kZXg7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSBsaXN0W3NlbGVjdGVkSW5kZXhdO1xuICAgIGNvbnN0IHNlbGVjdGVkUGxhbiA9IHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5maW5kKFxuICAgICAgKHBsYW46IGFueSkgPT4gcGxhbi5zdWJJZCA9PT0gcGFyZW50SXRlbS5zdWJzY3JpcHRpb25JZFxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWRQbGFuKSB7XG4gICAgICBzZWxlY3RlZFBsYW4uZnJlcXVlbmN5ID0gc2VsZWN0ZWRJdGVtLm5hbWU7XG4gICAgfVxuXG4gICAgaWYgKHVuc2VsZWN0ZWRJdGVtKSB7XG4gICAgICBjb25zdCByZW1vdmVBbW91bnQgPSBwYXJlbnRJdGVtLnByaWNpbmdbdW5zZWxlY3RlZEl0ZW0ubmFtZV07XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsIHsgLi4udW5zZWxlY3RlZEl0ZW0sIGFtb3VudDogcmVtb3ZlQW1vdW50IH0pO1xuICAgIH1cblxuICAgIGlmIChzZWxlY3RlZEl0ZW0pIHtcbiAgICAgIGNvbnN0IGFkZEFtb3VudCA9IHBhcmVudEl0ZW0ucHJpY2luZ1tzZWxlY3RlZEl0ZW0ubmFtZV07XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgeyAuLi5zZWxlY3RlZEl0ZW0sIGFtb3VudDogYWRkQW1vdW50IH0pO1xuICAgIH1cblxuICB9XG5cbiAgaGFzQWN0aXZlU3Vic2NyaXB0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zLmxlbmd0aCA+IDBcbiAgfVxuXG4gIGRpc2FibGVTdWJzY3JpcHRpb25TZWxlY3Rpb24oaXRlbTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5zb21lKFxuICAgICAgKGVsZW06IGFueSkgPT4gZWxlbS5zdWJJZCA9PT0gaXRlbS5zdWJzY3JpcHRpb25JZFxuICAgICk7XG4gIH1cblxuICBhZGRpbmdUcmFuc3BvcnRGZWUoKSB7XG4gICAgaWYgKHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwuY2hhcmdlcy50ZXJtKSB7XG4gICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsLmNoYXJnZXMudGVybVBheW1lbnRMaXN0LmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LnNlbGVjdGVkKSB7XG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIGVsZW1lbnQpXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigxLCB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsLmNoYXJnZXMpXG4gICAgfVxuICB9XG4gIHJlbW92ZVRyYXNwb3J0RmVlKCkge1xuICAgIGlmICh0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsICE9IG51bGwpIHtcbiAgICAgIGlmKHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmF2YWlsYWJpbGl0eSl7XG4gICAgICAgIGlmICh0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsLmNoYXJnZXMudGVybSkge1xuICAgICAgICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwuY2hhcmdlcy50ZXJtUGF5bWVudExpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgZWxlbWVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwuY2hhcmdlcylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ2hlY2tib3hDaGFuZ2UoaXRlbTogYW55LCBldmVudDogYW55KSB7XG4gICAgdGhpcy5yZW1vdmVUcmFzcG9ydEZlZSgpO1xuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG4gICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsID0gaXRlbTtcbiAgICAgIGlmKGl0ZW0uYXZhaWxhYmlsaXR5KXtcbiAgICAgICAgdGhpcy5hZG1pc3Npb25EYXRhLnRyYW5zcG9ydFJlcXVlc3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hZGRpbmdUcmFuc3BvcnRGZWUoKTtcbiAgICAgIH1cbiAgICAgIGVsc2V7XG4gICAgICAgIHRoaXMuYWRkaW5nVHJhbnNwb3J0UmVxdWVzdCgpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFkZGluZ1RyYW5zcG9ydFJlcXVlc3QoKXtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLm9wZW5Tb2NpYWxCcmFuZChcbiAgICAgIFRyYXNwb3J0QXZhaWxhYmlsaXR5Q29tcG9uZW50LFxuICAgICAgJzMwJScsXG4gICAgICAnMjUlJyxcbiAgICAgIHtkYXRhOnRoaXMuYWRtaXNzaW9uRGF0YX1cbiAgICApXG4gIH1cblxuICBnZXRQaWNrdXBUaW1lKGl0ZW06IGFueSkge1xuICAgIGNvbnN0IG1hdGNoZWRJdGVtID0gaXRlbS5maW5kKChlbGVtZW50OmFueSkgPT4gZWxlbWVudC5zdG9wLmlkID09PSB0aGlzLnNlbGVjdGVkU3RvcC5pZCk7XG4gICAgY29uc3QgaXNvVGltZSA9IG5ldyBEYXRlKGAxOTcwLTAxLTAxVCR7bWF0Y2hlZEl0ZW0ucGlja3VwLnBpY2t1cFRpbWV9YCk7XG4gICAgcmV0dXJuIG1hdGNoZWRJdGVtID8gaXNvVGltZSA6IG51bGw7XG4gIH1cblxuICBnZXREcm9wdGltZShpdGVtOiBhbnkpIHtcbiAgICBjb25zdCBtYXRjaGVkSXRlbSA9IGl0ZW0uZmluZCgoZWxlbWVudDphbnkpID0+IGVsZW1lbnQuc3RvcC5pZCA9PT0gdGhpcy5zZWxlY3RlZFN0b3AuaWQpO1xuICAgIGNvbnN0IGlzb1RpbWUgPSBuZXcgRGF0ZShgMTk3MC0wMS0wMVQke21hdGNoZWRJdGVtLmRyb3AuZHJvcFRpbWV9YCk7XG4gICAgcmV0dXJuIG1hdGNoZWRJdGVtID8gaXNvVGltZSA6IG51bGw7XG4gIH1cblxuICBjaGFuZ2VUcmFuc3BvcnRUZXJtVmFsdWUoaXRlbTogYW55KSB7XG4gICAgaWYgKGl0ZW0uY2hhcmdlcy5zZWxlY3RlZFRlcm1WYWx1ZSA9PT0gJ1RFUk0nKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsIGl0ZW0uY2hhcmdlcylcbiAgICAgIGl0ZW0uY2hhcmdlcy50ZXJtID0gdHJ1ZTtcbiAgICAgIGl0ZW0uY2hhcmdlcy5wYWlkID0gZmFsc2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaXRlbS5jaGFyZ2VzLnRlcm0gPSBmYWxzZTtcbiAgICAgIGl0ZW0uY2hhcmdlcy50ZXJtUGF5bWVudExpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQuc2VsZWN0ZWQpIHtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigxLCBpdGVtLmNoYXJnZXMpXG4gICAgfVxuICB9XG5cbiAgYWRkU2luZ2xlU3RvcChldjphbnksIGl0ZW06IGFueSkge1xuICAgIGlmIChldi50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIGl0ZW0pXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCBpdGVtKVxuICAgIH1cblxuICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwuY2hhcmdlcy50ZXJtUGF5bWVudExpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LnRlcm1JZCA9PSBpdGVtLnRlcm1JZCkge1xuICAgICAgICBlbGVtZW50LnNlbGVjdGVkID0gZXYudGFyZ2V0LmNoZWNrZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG4gIGNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoY2FsOiBudW1iZXIsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIFxuICAgIGNvbnN0IGFtb3VudCA9IHZhbHVlLmFtb3VudCA/PyB2YWx1ZS50ZXJtQW1vdW50ID8/IDA7XG4gIFxuICAgIGlmIChjYWwgPT09IC0xKSB7XG4gICAgICB0aGlzLmZlZVN0cnVjdHVyZS50b3RhbEZlZSAtPSBhbW91bnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmVlU3RydWN0dXJlLnRvdGFsRmVlICs9IGFtb3VudDtcbiAgICB9XG4gIH1cblxuICBsaXN0QWxsS2l0cyA6IGFueSA9IFtdO1xuICBnZXRBbGxLaXRzKCl7XG4gICAgbGV0IGRhdGEgPXtcbiAgICAgIFwiYnVzaW5lc3NJZFwiOiB0aGlzLmFkbWlzc2lvbkRhdGEgPyB0aGlzLmFkbWlzc2lvbkRhdGEuYnVzaW5lc3NEZXRhaWxzLmlkIDogJycsXG4gICAgICBcInRhcmdldFwiOiBcIkdSQURFXCIsXG4gICAgICBcImdyYWRlSWRcIjogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2dJZCcpIHx8ICcnLFxuICAgICAgXCJwYWdlTm9cIjogMCxcbiAgICAgIFwic2l6ZVwiOiAxMDAwMDBcbiAgICB9XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxDb21ib3MoZGF0YSkuc3Vic2NyaWJlKFxuICAgICAgKHJlczphbnkpID0+IHtcbiAgICAgICAgcmVzLmRhdGEuZGF0YS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xuICAgICAgICAgIHRoaXMubGlzdEFsbEtpdHMucHVzaCh7XG4gICAgICAgICAgICBpZDplbGVtZW50LmlkLFxuICAgICAgICAgICAgaW1nOmVsZW1lbnQuaW1hZ2VVcmwsXG4gICAgICAgICAgICBuYW1lOmVsZW1lbnQubmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOmVsZW1lbnQuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBhbW91bnQ6KGVsZW1lbnQuZGlzY291bnRlZFByaWNlICE9IDAgfHwgZWxlbWVudC5kaXNjb3VudGVkUHJpY2UgIT0gbnVsbCkgPyBlbGVtZW50LmRpc2NvdW50ZWRQcmljZSA6IGVsZW1lbnQudG90YWxQcmljZSxcbiAgICAgICAgICAgIG9yaWdpbmFsQW1vdW50IDogZWxlbWVudC50b3RhbFByaWNlLFxuICAgICAgICAgICAgZGlzY291bnRlZEFtb3VudDplbGVtZW50LmRpc2NvdW50ZWRQcmljZSxcbiAgICAgICAgICAgIHBhaWQ6ZmFsc2UsXG4gICAgICAgICAgICBraXRQYXltZW50U2VsZWN0ZWQ6dHJ1ZSxcbiAgICAgICAgICAgIHNlbGVjdGVkOmZhbHNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRDb21ib0tpdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMubGlzdEFsbEtpdHMgPSB0aGlzLmxpc3RBbGxLaXRzLm1hcCgoa2l0OmFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRDb21ib0tpdHMuZmluZCgoc2s6YW55KSA9PiBzay5pZCA9PT0ga2l0LmlkKTtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZCA/IHNlbGVjdGVkIDoga2l0O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKGVycjphbnkpID0+IHtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxuICAgICAgICAgIGVyci5lcnJvciA/IGVyci5lcnJvci5tZXNzYWdlIDogZXJyLnN0YXR1c1RleHQsXG4gICAgICAgICAgJ0Nsb3NlJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkdXJhdGlvbjoxNTAwXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgYWRkUmVtb3ZlS2l0KGl0ZW06YW55LGV2OmFueSl7XG4gICAgaWYgKGV2LnRhcmdldC5jaGVja2VkKSB7XG4gICAgICBjb25zdCBleGlzdHMgPSB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRDb21ib0tpdHMuc29tZSgoa2l0OiBhbnkpID0+IGtpdC5pZCA9PT0gaXRlbS5pZCk7XG4gICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRDb21ib0tpdHMucHVzaChpdGVtKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsaXRlbSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLGl0ZW0pXG4gICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRDb21ib0tpdHMgPSB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRDb21ib0tpdHMuZmlsdGVyKFxuICAgICAgICAoa2l0OiBhbnkpID0+IGtpdC5pZCAhPT0gaXRlbS5pZFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VQYXltZW50U3RhdHVzKGl0ZW06YW55KXtcbiAgICBpZighaXRlbS5raXRQYXltZW50U2VsZWN0ZWQpe1xuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLGl0ZW0pXG4gICAgfVxuICAgIGVsc2V7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSxpdGVtKVxuICAgIH1cbiAgfVxuXG4gIGhhc0FjdGl2ZUtpdHMoKTpib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkQ29tYm9LaXRzLmxlbmd0aCA+IDBcbiAgfVxufVxuIiwiPCEtLSA8c2VjdGlvbiBjbGFzcz1cIm1haW4tc2VjdGlvblwiPlxuICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZyBsZWZ0LXNpZGVcIj5cbiAgICAgICAgQWRtaXNzaW9uIEZlZVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGUgbXQtMTBcIiAqbmdGb3I9XCJsZXQgY29uZmlnTGlzdCBvZiBPYmplY3Qua2V5cyhmZWVDb25maWcpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nIG1iLTIwXCI+e3tjb25maWdMaXN0fX08L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktc3BhY2UgbXQtMTAgbWItMTVcIiAqbmdGb3I9XCJsZXQgY29uZmlnIG9mIGZlZUNvbmZpZ1tjb25maWdMaXN0XVwiPlxuICAgICAgICAgIDxwIGNsYXNzPVwic3ViLWhlYWRpbmcgbWItMFwiPnt7Y29uZmlnLmZlZUhlYWR9fTwvcD5cbiAgICAgICAgICA8cCBjbGFzcz1cImFtb3VudCBtYi0wXCI+4oK5IHt7Y29uZmlnLmFtb3VudH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibGVmdC1zaWRlIG10LTEwXCIgKm5nRm9yPVwibGV0IHR5cGUgb2YgT2JqZWN0LmtleXMoc3Vic2NyaXB0aW9ucylcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJoZWFkaW5nXCI+e3t0eXBlfX08L3A+XG5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwic3Vic2NyaXB0aW9uLXRhYmxlIHctMTAwXCI+XG4gICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgPHRoPlN1YnNjcmlwdGlvbiBUaXRsZTwvdGg+XG4gICAgICAgICAgICA8dGg+TW9udGhseTwvdGg+XG4gICAgICAgICAgICA8dGg+UXVhdGVybHk8L3RoPlxuICAgICAgICAgICAgPHRoPlllYXJseTwvdGg+XG4gICAgICAgICAgICA8dGg+T24gRGVtYW5kPC90aD5cbiAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBzdWJzY3JpcHRpb25zW3R5cGVdO2xldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgPHRkPnt7ZGF0YS5zdWJOYW1lfX08L3RkPlxuICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiAqbmdJZj1cImRhdGEucHJpY2luZ1snUVVBUlRFUkxZJ11cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3Vic2NyaXB0aW9ue3tpfX1cIiAgW3ZhbHVlXT1cIidNT05USExZJ1wiIChjbGljayk9XCJ0b2dnbGVTZWxlY3Rpb24oZGF0YSwgJ01PTlRITFknKVwiICBbY2hlY2tlZF09XCJkYXRhLnNlbGVjdGVkT3B0aW9uID09PSAnTU9OVEhMWSdcIiAgWyhuZ01vZGVsKV09XCJkYXRhLnNlbGVjdGVkT3B0aW9uXCIgaWQ9XCJmbGV4UmFkaW9EZWZhdWx0MlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZsZXhDaGVja0NoZWNrZWRcIj5cbiAgICAgICAgICAgICAgICAgICAg4oK5IHt7ZGF0YS5wcmljaW5nWydNT05USExZJ119fVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZGVmYXVsdEltYWdlXCIgKm5nSWY9XCIhZGF0YS5wcmljaW5nWydRVUFSVEVSTFknXVwiIFtzcmNdPVwiZGVmYXVsdEltYWdlXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiAqbmdJZj1cImRhdGEucHJpY2luZ1snTU9OVEhMWSddXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1YnNjcmlwdGlvbnt7aX19XCIgW3ZhbHVlXT1cIidRVUFSVEVSTFknXCIgKGNsaWNrKT1cInRvZ2dsZVNlbGVjdGlvbihkYXRhLCAnUVVBUlRFUkxZJylcIiAgW2NoZWNrZWRdPVwiZGF0YS5zZWxlY3RlZE9wdGlvbiA9PT0gJ1FVQVJURVJMWSdcIiBbKG5nTW9kZWwpXT1cImRhdGEuc2VsZWN0ZWRPcHRpb25cIiBpZD1cImZsZXhDaGVja0NoZWNrZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XG4gICAgICAgICAgICAgICAgICAgIOKCuSB7e2RhdGEucHJpY2luZ1snUVVBUlRFUkxZJ119fVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJkZWZhdWx0SW1hZ2VcIiAqbmdJZj1cIiFkYXRhLnByaWNpbmdbJ01PTlRITFknXVwiIFtzcmNdPVwiZGVmYXVsdEltYWdlXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiICpuZ0lmPVwiZGF0YS5wcmljaW5nWydBTk5VQUxMWSddXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1YnNjcmlwdGlvbnt7aX19XCIgW3ZhbHVlXT1cIidBTk5VQUxMWSdcIiAoY2xpY2spPVwidG9nZ2xlU2VsZWN0aW9uKGRhdGEsICdBTk5VQUxMWScpXCIgIFtjaGVja2VkXT1cImRhdGEuc2VsZWN0ZWRPcHRpb24gPT09ICdBTk5VQUxMWSdcIiBbKG5nTW9kZWwpXT1cImRhdGEuc2VsZWN0ZWRPcHRpb25cIiBpZD1cImZsZXhDaGVja0NoZWNrZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XG4gICAgICAgICAgICAgICAgICAgIOKCuSB7e2RhdGEucHJpY2luZ1snQU5OVUFMTFknXX19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJkZWZhdWx0SW1hZ2VcIiAqbmdJZj1cIiFkYXRhLnByaWNpbmdbJ0FOTlVBTExZJ11cIiBbc3JjXT1cImRlZmF1bHRJbWFnZVwiIGFsdD1cIlwiPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiAqbmdJZj1cImRhdGEucHJpY2luZ1snT05ERU1BTkQnXVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzdWJzY3JpcHRpb257e2l9fVwiIFt2YWx1ZV09XCInT05ERU1BTkQnXCIgKGNsaWNrKT1cInRvZ2dsZVNlbGVjdGlvbihkYXRhLCAnT05ERU1BTkQnKVwiICBbY2hlY2tlZF09XCJkYXRhLnNlbGVjdGVkT3B0aW9uID09PSAnT05ERU1BTkQnXCIgWyhuZ01vZGVsKV09XCJkYXRhLnNlbGVjdGVkT3B0aW9uXCIgaWQ9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxuICAgICAgICAgICAgICAgICAgICDigrkge3tkYXRhLnByaWNpbmdbJ09OREVNQU5EJ119fVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZGVmYXVsdEltYWdlXCIgKm5nSWY9XCIhZGF0YS5wcmljaW5nWydPTkRFTUFORCddXCIgW3NyY109XCJkZWZhdWx0SW1hZ2VcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibGVmdC1zaWRlIG10LTEwXCI+XG4gICAgICAgIDxwIGNsYXNzPVwiaGVhZGluZ1wiPlBheW1lbnQgUGxhbjwvcD5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGctMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCIgKGNsaWNrKT1cImNoYW5nZUFubnVhbFBheW1lbnRUZXJtKCdBTk5VQUxMWScpXCI+XG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cInJhZGlvXCIgdmFsdWU9XCJcIiBuYW1lPVwicGF5bWVudC1wbGFuXCIgaWQ9XCJmbGV4Q2hlY2tDaGVja2VkXCIgW2NoZWNrZWRdPVwiYWRtaXNzaW9uRGF0YS5wYXltZW50UGxhblR5cGUgPT09ICdBTk5VQUxMWSdcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XG4gICAgICAgICAgICAgIEFubnVhbGx5XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCIgKGNsaWNrKT1cImNoYW5nZUFubnVhbFBheW1lbnRUZXJtKCdURVJNJylcIj5cbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiB2YWx1ZT1cIlwiIG5hbWU9XCJwYXltZW50LXBsYW5cIiBpZD1cImZsZXhDaGVja0NoZWNrZWRcIiBbY2hlY2tlZF09XCJhZG1pc3Npb25EYXRhLnBheW1lbnRQbGFuVHlwZSA9PT0gJ1RFUk0nXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxuICAgICAgICAgICAgICBUZXJtXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWRtaXNzaW9uXCIgKm5nSWY9XCJhZG1pc3Npb25EYXRhLnBheW1lbnRQbGFuVHlwZSA9PT0gJ1RFUk0nXCI+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5wdXQtdGV4dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBjbGFzcz1cImlucHV0U3R5bGVcIiBwbGFjZWhvbGRlcj1cIi0tU2VsZWN0LS1cIiBtdWx0aXBsZT1cInRydWVcIiBbKG5nTW9kZWwpXT1cImZlZVN0cnVjdHVyZS50ZXJtUGF5bWVudExpc3RcIiAobmdNb2RlbENoYW5nZSk9XCJjYWxjdWxhdGVUb3RhbEFtb3VudCgpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHRlcm0gb2YgdGVybVBheW1lbnRMaXN0XCIgW3ZhbHVlXT1cInRlcm1cIj50ZXJtIHt7dGVybS50ZXJtTnVtYmVyfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiByaWdodC1zaWRlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZyBtYi0yMFwiPlxuICAgICAgICBGZWUgQ2FsY3VsYXRpb25cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LXNwYWNlIG10LTEwIG1iLTE1XCIgKm5nRm9yPVwibGV0IGNvbmZpZyBvZiBmZWVTdHJ1Y3R1cmUuZmVlQ29uZmlnc1wiPlxuICAgICAgICA8cCBjbGFzcz1cInN1Yi1oZWFkaW5nIG1iLTBcIj57e2NvbmZpZy5mZWVIZWFkfX08L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiYW1vdW50IG1iLTBcIj7igrkge3tjb25maWcuYW1vdW50fX08L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LXNwYWNlIG10LTEwIG1iLTE1XCIgKm5nRm9yPVwibGV0IHN1YnNjcmlwaXRpb24gb2YgZmVlU3RydWN0dXJlLnN1YnNjcmlwdGlvblBsYW5zXCI+XG4gICAgICAgIDxwIGNsYXNzPVwic3ViLWhlYWRpbmcgbWItMFwiPnt7c3Vic2NyaXBpdGlvbi5zdWJOYW1lfX08L3A+XG4gICAgICAgIDxwIGNsYXNzPVwiYW1vdW50IG1iLTBcIj7igrkge3tzdWJzY3JpcGl0aW9uLnByaWNpbmdbc3Vic2NyaXBpdGlvbi5mcmVxdWVuY3ldfX08L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInRvdGFsLWZlZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZyBtYi01XCI+XG4gICAgICAgICAgVG90YWwgRmVlXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYW1vdW50XCI+XG4gICAgICAgICAg4oK5IHt7ZmVlU3RydWN0dXJlLnRvdGFsQW1vdW50fX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3NlY3Rpb24+IC0tPlxuXG5cbjxzZWN0aW9uIGNsYXNzPVwibWFpbl9wYXltZW50X2RldGFpbHNfc2VjdGlvbiBoLTEwMCB3LTEwMCBwLTIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gIDxkaXYgY2xhc3M9XCJsZWZ0X3BheW1lbnRfZGV0YWlscyBoLTEwMCBwLTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmVlc19zZWN0aW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjX3RpdGxlXCI+XG4gICAgICAgIEZlZXNcbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm10LTIgYWxsX2ZlZV9jb25maWdzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmVlU3RydWN0dXJlPy5mZWVDb25maWdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlX2ZlZV9jb25maWcgcC0zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVlX3RpdGxlXCI+e3tpdGVtLmZlZUhlYWQgPyBpdGVtLmZlZUhlYWQubmFtZSA6ICdOL0EnfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV9hbW91bnRcIj7igrkge3tpdGVtLmFtb3VudH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnRlcm1zTGlzdC5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFuZ2Vfc2VsZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBhcmlhLWxhYmVsPVwiU2VsZWN0IGFuIG9wdGlvblwiIFsobmdNb2RlbCldPVwiaXRlbS5zZWxlY3RlZFRlcm1WYWx1ZVwiXG4gICAgICAgICAgICAgICAgbmFtZT1cInRlcm1PcHRpb25fe3sgaXRlbS5mZWVIZWFkLmlkfX1cIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VUZXJtVmFsdWUoaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwiU0lOR0xFXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7Zm9udC1zaXplOjEzcHhcIj5TaW5nbGU8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cIlRFUk1cIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtmb250LXNpemU6MTNweFwiPlRlcm08L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGVybUNvdW50XCIgKm5nSWY9XCJpdGVtLnNlbGVjdGVkVGVybVZhbHVlID09PSAnVEVSTSdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tfZGF0YVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGVybSBvZiBpdGVtLnRlcm1zTGlzdDtsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGVEYXRhIGQtZmxleCBnYXAtMyBhbGlnbi1pdGVtcy1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgKGNoYW5nZSk9XCJhZGRUZXJtcygkZXZlbnQsdGVybSlcIiBbY2hlY2tlZF09XCJ0ZXJtLnNlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGFfdmFsdWVcIj57e2dldE9yZGluYWxTdWZmaXgoaSsxKX19IFRlcm0gKOKCuSB7e3Rlcm0/LnRlcm1BbW91bnR9fSk8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb25zX2xpc3QgbXQtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlRyYW5zcG9ydCBGZWU8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0aW5nX3R5cGVzIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOjMwJVwiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImlucHV0X2NhcmQgbXQtMiB3LTEwMFwiIHN0eWxlPVwiaGVpZ2h0OjQwcHhcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIlNlbGVjdCBTdG9wXCIgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvR3JhZGVcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdG9wU2VhcmNoVGV4dFwiIChpbnB1dCk9XCJmaWx0ZXJTdG9wcygpXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxM3B4O2ZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0b0dyYWRlPVwibWF0QXV0b2NvbXBsZXRlXCIgKG9wdGlvblNlbGVjdGVkKT1cIm9uU3RvcFNlbGVjdGlvbigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgc3RvcCBvZiBmaWx0ZXJlZFN0b3BzTGlzdFwiIFt2YWx1ZV09XCJzdG9wLnN0b3BOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDEzcHg7Zm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpO1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyBzdG9wLnN0b3BOYW1lIHwgdGl0bGVjYXNlIH19XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6MzAlXCI+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiaW5wdXRfY2FyZCBtdC0yIHctMTAwXCIgc3R5bGU9XCJoZWlnaHQ6NDBweFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IHBsYWNlaG9sZGVyPVwiU2VsZWN0IFZlaGljbGUgVHlwZVwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b0dyYWRlMVwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZlaGljbGVUeXBlU2VhcmNoVGV4dFwiIChpbnB1dCk9XCJmaWx0ZXJlVmVoaWNsZVR5cGVzKClcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDEzcHg7Zm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpO1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvR3JhZGUxPVwibWF0QXV0b2NvbXBsZXRlXCIgKG9wdGlvblNlbGVjdGVkKT1cIm9uVmVoaWNsZVR5cGVTZWxlY3Rpb24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHN0b3Agb2YgZmlsdGVyZWRWZWhpY2xlVHlwZXNMaXN0XCIgW3ZhbHVlXT1cInN0b3AudmVoaWNsZVR5cGVcIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMTNweDtmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHN0b3AudmVoaWNsZVR5cGUgfCB0aXRsZWNhc2UgfX1cbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X2FsbF9zdWJzY3JpcHRpb25zIG10LTJcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHJvdXRlVmFsdWVzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlX2ZlZV9jb25maWcgcC0zXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBbY2hlY2tlZF09XCJhZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCA9PT0gaXRlbVwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hlY2tib3hDaGFuZ2UoaXRlbSwgJGV2ZW50KVwiPjwvbWF0LWNoZWNrYm94PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cIndpZHRoOjkyJVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV90aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnRyYW5zcG9ydC5yb3V0ZSA/IGl0ZW0udHJhbnNwb3J0LnJvdXRlLm5hbWUgOiAnTi9BJyB9fVxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj4oPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MTJweDtmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7XCI+UGlja3VwIFRpbWUgOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MTJweDtmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1zZW1pLWJvbGQtZm9udC1mYW1pbHkpO1wiPnt7Z2V0UGlja3VwVGltZShpdGVtLnRyYW5zcG9ydC5idXNSb3V0ZVN0b3BUaW1pbmdzKVxuICAgICAgICAgICAgICAgICAgICAgICAgfCBkYXRlOidoOm1tIGEnfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgLVxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpO1wiPkRyb3AgVGltZSA6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LXNlbWktYm9sZC1mb250LWZhbWlseSk7XCI+e3tnZXREcm9wdGltZShpdGVtLnRyYW5zcG9ydC5idXNSb3V0ZVN0b3BUaW1pbmdzKVxuICAgICAgICAgICAgICAgICAgICAgICAgfCBkYXRlOidoOm1tIGEnfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgKTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV9hbW91bnRcIj7igrkge3sgaXRlbS5jaGFyZ2VzLnRvdGFsQW1vdW50IH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5jaGFyZ2VzLnRlcm1QYXltZW50TGlzdC5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYW5nZV9zZWxlY3Rpb25cIiBzdHlsZT1cIndpZHRoOjkwJTttYXJnaW46MCBhdXRvXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWdyb3VwIGFyaWEtbGFiZWw9XCJTZWxlY3QgYW4gb3B0aW9uXCIgWyhuZ01vZGVsKV09XCJpdGVtLmNoYXJnZXMuc2VsZWN0ZWRUZXJtVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZVRyYW5zcG9ydFRlcm1WYWx1ZShpdGVtKVwiIFtkaXNhYmxlZF09XCJhZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCAhPT0gaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cIlNJTkdMRVwiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7IGZvbnQtc2l6ZTogMTNweFwiPlNpbmdsZTwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gdmFsdWU9XCJURVJNXCJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTsgZm9udC1zaXplOiAxM3B4XCI+VGVybTwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRlcm1Db3VudFwiICpuZ0lmPVwiaXRlbS5jaGFyZ2VzLnNlbGVjdGVkVGVybVZhbHVlID09PSAnVEVSTSdcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja19kYXRhXCIgc3R5bGU9XCJ3aWR0aDo3NSU7bWFyZ2luOjAgYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0ZXJtIG9mIGl0ZW0uY2hhcmdlcy50ZXJtUGF5bWVudExpc3Q7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlRGF0YSBkLWZsZXggZ2FwLTMgYWxpZ24taXRlbXMtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgKGNoYW5nZSk9XCJhZGRTaW5nbGVTdG9wKCRldmVudCwgdGVybSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgIT09IGl0ZW1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGFfdmFsdWVcIj57eyBnZXRPcmRpbmFsU3VmZml4KGkgKyAxKSB9fSBUZXJtICjigrkge3t0ZXJtLnRlcm1BbW91bnR9fSk8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbnNfbGlzdCBtdC0zXCIgKm5nSWY9XCJzdWJzY3JpcHRpb25zRGF0YS5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlN1YnNjcmlwdGlvbnM8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxpc3RfYWxsX3N1YnNjcmlwdGlvbnMgbXQtMlwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc3Vic2NyaXB0aW9uc0RhdGFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3BfMVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2NoZWNrZWRdPVwiaXNTdWJzY3JpcHRpb25TZWxlY3RlZChpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uU3Vic2NyaXB0aW9uSXRlbUNoYW5nZSgkZXZlbnQsIGl0ZW0pXCI+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbl90aXRsZVwiPlxuICAgICAgICAgICAgICAgICAge3tpdGVtLnN1YnNjcmlwdGlvblRpdGxlfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb25fdHlwZXNcIiBzdHlsZT1cIndpZHRoOjg1JTttYXJnaW46YXV0b1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1YlYgb2YgaXRlbS5uZXdQcmljaW5nTGlzdDtsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlX3N1YnNjcnB0aW9uIGQtZmxleCBnYXAtMiBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGVfdGl0bGUgZC1mbGV4IGdhcC0zIGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwid2lkdGg6MjUlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIFtjaGVja2VkXT1cInN1YlYuc2VsZWN0ZVN0YXR1c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVN1YnNjcmlwdGlvblNlbGVjdGlvbihpdGVtLm5ld1ByaWNpbmdMaXN0LCBpLCBpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWRpc2FibGVTdWJzY3JpcHRpb25TZWxlY3Rpb24oaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YV92YWx1ZVwiPnt7c3ViVi5uYW1lIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGVfdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7e3N1YlYuYW1vdW50fX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb25zX2xpc3QgbXQtM1wiICpuZ0lmPVwibGlzdEFsbEtpdHMubGVuZ3RoID4gMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5TdHVkZW50IEtpdDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdF9hbGxfc3Vic2NyaXB0aW9ucyBtdC0yIGQtZmxleCBnYXAtMiBmbGV4LXdyYXBcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxpc3RBbGxLaXRzO2xldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGVfa2l0XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3BfbGF5ZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cIml0ZW0uc2VsZWN0ZWRcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiYWRkUmVtb3ZlS2l0KGl0ZW0sJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbW91bnRfc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yaWdpbmFsX2Ftb3VudFwiICpuZ0lmPVwiaXRlbS5kaXNjb3VudGVkQW1vdW50ID09PSAwXCI+4oK5IHt7aXRlbS5hbW91bnR9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpc2NvdW50ZWRfYW1vdW50XCIgKm5nSWY9XCJpdGVtLmRpc2NvdW50ZWRBbW91bnQgIT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICDigrlcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdHJpa2V0aHJvdWdoXCI+e3tpdGVtLm9yaWdpbmFsQW1vdW50fX08L3NwYW4+ICZuYnNwO1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtZmFtaWx5OnZhcigtLXByaW1hcnktc2VtaS1ib2xkLWZvbnQtZmFtaWx5KVwiPnt7aXRlbS5kaXNjb3VudGVkQW1vdW50fX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJraXRfYm90dG9tX2xheWVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlX3NlY3Rpb24gZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1nX3NlY1wiICpuZ0lmPVwiaXRlbS5pbWcgIT0gbnVsbFwiPjxpbWcgW3NyY109XCJpdGVtLmltZ1wiIGFsdD1cIlwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltZ19zZWMgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCIgKm5nSWY9XCJpdGVtLmltZyA9PT0gbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICB7e2l0ZW0ubmFtZS5zcGxpdCgnJylbMF0gfCB1cHBlcmNhc2V9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIga2l0X3RpdGxlIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICB7e2l0ZW0ubmFtZX19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtpdF9kZXNjcmlwdGlvbiB0ZXh0LWNlbnRlclwiIHN0eWxlPVwibWFyZ2luLXRvcDo0cHhcIj5cbiAgICAgICAgICAgICAgICAgIHt7aXRlbS5kZXNjcmlwdGlvbn19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2l0X2Zvb3Rlcl9sYXllciBtdC0yXCIgKm5nSWY9XCJpdGVtLnNlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBnYXAtMyBwYXlpbmdfb3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBhcmlhLWxhYmVsPVwiU2VsZWN0IGFuIG9wdGlvblwiIFsobmdNb2RlbCldPVwiaXRlbS5raXRQYXltZW50U2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hhbmdlUGF5bWVudFN0YXR1cyhpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBbdmFsdWVdPVwidHJ1ZVwiPjxzcGFuIHN0eWxlPVwiZm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpO2ZvbnQtc2l6ZTogMTNweDtcIj5QYXkgTm93PC9zcGFuPjwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gW3ZhbHVlXT1cImZhbHNlXCI+PHNwYW4gc3R5bGU9XCJmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7Zm9udC1zaXplOiAxM3B4O1wiPlBheSBMYXRlcjwvc3Bhbj48L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJyaWdodF9wYXltZW50X2RldGFpbHMgaC0xMDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwidG90YWxfcGF5bWVudF9kZXRhaWxzIGgtMTAwIHctMTAwIHAtM1wiPlxuICAgICAgPGRpdiBjbGFzcz1cIm10LTIgY2FsY3VsYXRpb25fdGFibGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGN1bGF0aW9uX3NpbmdsZV9wYXJ0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRvdGFsX3RpdGxlXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RlZGVkZTtwYWRkaW5nLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICAgIFRvdGFsIEFjYWRlbWljIEZlZSBCcmVha2Rvd25cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZlZVN0cnVjdHVyZS5mZWVDb25maWdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVfdGl0bGVcIj57e2l0ZW0uZmVlSGVhZCA/IGl0ZW0uZmVlSGVhZC5uYW1lIDogJ04vQSd9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVlX2Ftb3VudFwiICpuZ0lmPVwiaXRlbS50ZXJtc0xpc3QubGVuZ3RoID09PSAwIHx8IGl0ZW0uc2VsZWN0ZWRUZXJtVmFsdWUgIT0gJ1RFUk0nXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiKGl0ZW0/LmNvbmNlc3Npb24gIT0gbnVsbCAmJiBpdGVtPy5jb25jZXNzaW9uPy5sZW5ndGggIT0gMCkgPyAnc3RyaWtldGhyb3VnaCcgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAg4oK5IHt7aXRlbS5hbW91bnR9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmNvbmNlc3Npb24gIT0gbnVsbCAmJiBpdGVtPy5jb25jZXNzaW9uLmxlbmd0aCAhPSAwXCI+KHt7aXRlbS5hcHBsaWVkQ29uY2Vzc2lvbkFtb3VudH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBmdy01MDBcIiAqbmdJZj1cIml0ZW0udGVybXNMaXN0Lmxlbmd0aCA+PSAwXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlX3Rlcm1zXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBpdGVtLnRlcm1zTGlzdFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkX3NpbmdsZV90ZXJtIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIiAqbmdJZj1cImRhdGEuc2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleVwiPlxuICAgICAgICAgICAgICAgICAgICAgIFRlcm0ge3tkYXRhLnRlcm1OdW1iZXJ9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlIGZ3LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgIOKCuSB7e2RhdGEudGVybUFtb3VudH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsY3VsYXRpb25fc2luZ2xlX3BhcnRcIiAqbmdJZj1cImFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsICE9IG51bGwgJiYgYWRtaXNzaW9uRGF0YT8uc2VsZWN0ZWRTdG9wRGV0YWlsPy5hdmFpbGFiaWxpdHlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG90YWxfdGl0bGVcIiBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGVkZWRlO3BhZGRpbmctYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgICAgVHJhbnNwb3J0IEZlZVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwibWFyZ2luLXRvcDogOHB4O1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVlX3RpdGxlXCI+e3thZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbD8uY2hhcmdlcz8udmVoaWNsZVR5cGUgP1xuICAgICAgICAgICAgICAgIGFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsPy5jaGFyZ2VzPy52ZWhpY2xlVHlwZT8ubmFtZSA6ICdOL0EnfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV9hbW91bnRcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXM/LnRlcm1QYXltZW50TGlzdD8ubGVuZ3RoID09PSAwIHx8IGFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsPy5jaGFyZ2VzPy5zZWxlY3RlZFRlcm1WYWx1ZSAhPSAnVEVSTSdcIj5cbiAgICAgICAgICAgICAgICDigrlcbiAgICAgICAgICAgICAgICB7e2FkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsPy5jaGFyZ2VzPy50b3RhbEFtb3VudH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUgZnctNTAwXCIgKm5nSWY9XCJhZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbD8uY2hhcmdlcz8udGVybVBheW1lbnRMaXN0Py5sZW5ndGggPj0gMFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZV90ZXJtc1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRhdGEgb2YgYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXM/LnRlcm1QYXltZW50TGlzdFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkX3NpbmdsZV90ZXJtIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGEuc2VsZWN0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleVwiPlxuICAgICAgICAgICAgICAgICAgICAgIFRlcm0ge3tkYXRhLnRlcm1OdW1iZXJ9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlIGZ3LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgIOKCuSB7e2RhdGEudGVybUFtb3VudH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsY3VsYXRpb25fc2luZ2xlX3BhcnRcIiAqbmdJZj1cImhhc0FjdGl2ZVN1YnNjcmlwdGlvbnMoKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZXdfdGl0bGUgbXQtMlwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZWRlZGU7cGFkZGluZy1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgICBTdWJzY3JpcHRpb25zXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3Rpbmdfc2VsZWN0ZWRfc3VzY3JpcHRpb25zIG10LTJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFuc1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVlX3RpdGxlXCI+e3tpdGVtLnN1Yk5hbWUgfCB0aXRsZWNhc2V9fTwvZGl2PlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGVfcGF5bWVudF9jYWxjdWxhdGlvbiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTFcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXlcIj5cbiAgICAgICAgICAgICAgICAgICAge3tpdGVtLmZyZXF1ZW5jeSB8IHRpdGxlY2FzZX19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBmdy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAg4oK5IHt7aXRlbS5wcmljaW5nW2l0ZW0uZnJlcXVlbmN5XX19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxjdWxhdGlvbl9zaW5nbGVfcGFydFwiICpuZ0lmPVwiaGFzQWN0aXZlS2l0cygpXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5ld190aXRsZSBtdC0yXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RlZGVkZTtwYWRkaW5nLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICAgIFN0dWRlbnQgS2l0c1xuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0aW5nX3NlbGVjdGVkX3N1c2NyaXB0aW9ucyBtdC0yXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRDb21ib0tpdHNcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0/LmtpdFBheW1lbnRTZWxlY3RlZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGVfcGF5bWVudF9jYWxjdWxhdGlvbiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTFcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVfdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAge3tpdGVtLm5hbWUgfCB0aXRsZWNhc2V9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUgZnctNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIOKCuSB7e2l0ZW0uYW1vdW50fX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlcl9zZWN0aW9uIHRvdGFsX2NvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyX3RpdGxlXCI+R3JhbmQgVG90YWwgRmVlPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICDigrkge3tmZWVTdHJ1Y3R1cmU/LnRvdGFsRmVlfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3NlY3Rpb24+Il19
522
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LWRldGFpbHMvcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LWRldGFpbHMvcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRyxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSxxQkFBcUIsRUFBZ0MsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sMERBQTBELENBQUM7Ozs7Ozs7Ozs7OztBQW1CekcsTUFBTSxPQUFPLHVCQUF1QjtJQU9sQyxZQUNVLFdBQW1DLEVBQ25DLFFB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O3NCQUF6QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRPcHRpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7ICBNYXRSYWRpb01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3JhZGlvJztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IEVsZW1lbnRTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2VkaXRvci1zZXJ2aWNlLnNlcnZpY2UnXHJcbmltcG9ydCB7IE1hdERpYWxvZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcclxuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLCBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IFRyYXNwb3J0QXZhaWxhYmlsaXR5Q29tcG9uZW50IH0gZnJvbSAnLi4vdHJhc3BvcnQtYXZhaWxhYmlsaXR5L3RyYXNwb3J0LWF2YWlsYWJpbGl0eS5jb21wb25lbnQnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NpbXBvLXBheW1lbnQtZGV0YWlscycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsIFxyXG4gICAgRm9ybXNNb2R1bGUsIFxyXG4gICAgTWF0T3B0aW9uTW9kdWxlLCBcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSwgXHJcbiAgICBNYXRTZWxlY3RNb2R1bGUsXHJcbiAgICBNYXRSYWRpb01vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0RGlhbG9nTW9kdWxlLFxyXG4gICAgTWF0QXV0b2NvbXBsZXRlTW9kdWxlLFxyXG4gICAgTWF0SW5wdXRNb2R1bGVcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wYXltZW50LWRldGFpbHMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9wYXltZW50LWRldGFpbHMuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFBheW1lbnREZXRhaWxzQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBhZG1pc3Npb25EYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgc3Vic2NyaXB0aW9uc0RhdGE6IGFueVtdID0gW11cclxuICBASW5wdXQoKSB0ZXJtUGF5bWVudExpc3Q6IGFueVtdID0gW107XHJcblxyXG4gIE9iamVjdCA9IE9iamVjdFxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVzdFNlcnZpY2UgOiBFbGVtZW50U2VydmljZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNuYWNrQmFyIDogTWF0U25hY2tCYXJcclxuICApIHt9XHJcblxyXG4gIGZlZVN0cnVjdHVyZTogYW55ID0ge1xyXG4gICAgXCJpZFwiOiAnMTIzNCcsXHJcbiAgICBcImJ1c2luZXNzRGV0YWlsc1wiOiB7XHJcbiAgICAgIFwiaWRcIjogJzEyMzQnXHJcbiAgICB9LFxyXG4gICAgXCJncmFkZXNcIjogW1xyXG4gICAgICB7XHJcbiAgICAgICAgXCJfaWRcIjogXCIxMjM0XCIsXHJcbiAgICAgICAgXCJuYW1lXCI6IFwiR3JhZGUgSUlcIlxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgXCJfaWRcIjogXCIxMjM0XCIsXHJcbiAgICAgICAgXCJuYW1lXCI6IFwiR3JhZGUgSVZcIlxyXG4gICAgICB9XHJcbiAgICBdLFxyXG4gICAgXCJib2FyZFwiOiBcIlNUQVRFXCIsXHJcbiAgICBcImFjYWRlbWljWWVhclN0YXJ0XCI6IDIwMjQsXHJcbiAgICBcImFjYWRlbWljWWVhckVuZFwiOiAyMDI1LFxyXG4gICAgXCJmZWVDb25maWdzXCI6IFtcclxuICAgICAge1xyXG4gICAgICAgIFwiZmVlVHlwZUlkXCI6ICcxMjMyNCcsXHJcbiAgICAgICAgXCJmZWVIZWFkSWRcIjogJzEyMzQnLFxyXG4gICAgICAgIFwiZmVlVHlwZVwiOiBcIlR1dGlvbiBmZWVcIixcclxuICAgICAgICBcImZlZUhlYWRcIjogXCJleGFtIGZlZVwiLFxyXG4gICAgICAgIFwiYW1vdW50XCI6IDMwMCxcclxuICAgICAgICBcImRpc2NvdW50QW1vdW50XCI6IDAsXHJcbiAgICAgICAgXCJpc0ZpeGVkXCI6IGZhbHNlXHJcbiAgICAgIH1cclxuICAgIF0sXHJcbiAgICBcInN1YnNjcmlwdGlvblBsYW5zXCI6IFtdLFxyXG4gICAgXCJ0b3RhbEFtb3VudFwiOiAzMDAsXHJcbiAgICBcImNyZWF0ZWRUaW1lc3RhbXBcIjoge1xyXG4gICAgICBcIiRkYXRlXCI6IFwiMjAyNC0xMi0xNVQwNzoxMDo1NC44ODlaXCJcclxuICAgIH0sXHJcbiAgICBcInVwZGF0ZWRUaW1lc3RhbXBcIjoge1xyXG4gICAgICBcIiRkYXRlXCI6IFwiMjAyNC0xMi0xNVQwNzoxMDo1NC44ODlaXCJcclxuICAgIH0sXHJcbiAgICBcImFjdGl2ZVwiOiB0cnVlLFxyXG4gIH1cclxuXHJcblxyXG4gIGZlZUNvbmZpZzogYW55O1xyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8gdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zID1bXVxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zRGF0YS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICBpZihlbGVtZW50Lm5ld1ByaWNpbmdMaXN0KXtcclxuICAgICAgICBlbGVtZW50Lm5ld1ByaWNpbmdMaXN0LmZvckVhY2goKGVsZW06YW55KSA9PiB7XHJcbiAgICAgICAgICBlbGVtLnNlbGVjdGVTdGF0dXMgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmFkbWlzc2lvbkRhdGE/LnN0dWRlbnRGZWVTdHJ1Y3R1cmVWMj8uZmVlQ29uZmlnLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgIGlmIChlbGVtZW50LnRlcm1zTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgaWYoIWVsZW1lbnQuc2VsZWN0ZWRUZXJtVmFsdWUpe1xyXG4gICAgICAgICAgZWxlbWVudC5zZWxlY3RlZFRlcm1WYWx1ZSA9ICdTSU5HTEUnO1xyXG4gICAgICAgICAgaWYgKGVsZW1lbnQuc2VsZWN0ZWRUZXJtVmFsdWUgPT09ICdTSU5HTEUnKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQudGVybSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBlbGVtZW50LnBhaWQgPSB0cnVlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZWxlbWVudC5wYWlkID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGVsZW1lbnQucGFpZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5mZWVTdHJ1Y3R1cmUgPSB0aGlzLmFkbWlzc2lvbkRhdGE/LnN0dWRlbnRGZWVTdHJ1Y3R1cmVWMjtcclxuICAgIGlmICh0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnNEYXRhLmZvckVhY2goc3ViID0+IHtcclxuICAgICAgICBzdWIubmV3UHJpY2luZ0xpc3QuZm9yRWFjaCgocGw6IGFueSkgPT4ge1xyXG4gICAgICAgICAgcGwuc2VsZWN0ZVN0YXR1cyA9IHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5zb21lKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBlbGVtZW50LmZyZXF1ZW5jeSA9PT0gcGwubmFtZTtcclxuICAgICAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5pc1N1YnNjcmlwdGlvblNlbGVjdGVkKHN1Yik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgdGhpcy5nZXRBbGxTdG9wcygpO1xyXG4gICAgdGhpcy5nZXRWZWhpY2xlVHlwZXMoKTtcclxuICAgIHRoaXMuZ2V0QWxsS2l0cygpO1xyXG4gIH1cclxuXHJcblxyXG4gIHN0b3BzTGlzdDogYW55ID0gW107XHJcbiAgZmlsdGVyZWRTdG9wc0xpc3QgOiBhbnkgPSBbXTtcclxuICB2ZWhpY2xlVHlwZXNMaXN0IDogYW55ID1bXTtcclxuICBmaWx0ZXJlZFZlaGljbGVUeXBlc0xpc3Q6IGFueSA9IFtdO1xyXG5cclxuICBzdG9wU2VhcmNoVGV4dDogc3RyaW5nID0gJyc7XHJcbiAgc2VsZWN0ZWRTdG9wOiBhbnk7XHJcbiAgc2VsZWN0ZWRWZWhpY2xlVHlwZTogYW55O1xyXG4gIHJvdXRlVmFsdWVzOiBhbnkgPSBbXTtcclxuICB2ZWhpY2xlVHlwZVNlYXJjaFRleHQ6IGFueSA9ICcnO1xyXG4gIGdldEFsbFN0b3BzKCkge1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxTdG9wcyh0aGlzLmFkbWlzc2lvbkRhdGE/LmJ1c2luZXNzRGV0YWlscz8uaWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcHNMaXN0ID0gcmVzLmRhdGEuZGF0YVxyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRTdG9wc0xpc3QgPSBbLi4udGhpcy5zdG9wc0xpc3RdO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxyXG4gICAgICAgICAgZXJyLmVycm9yID8gZXJyLmVycm9yLm1lc3NhZ2UgOiBlcnIuc3RhdHVzVGV4dCxcclxuICAgICAgICAgICdDbG9zZScsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOjM1MDBcclxuICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBmaWx0ZXJTdG9wcygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zdG9wU2VhcmNoVGV4dCkge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkU3RvcHNMaXN0ID0gWy4uLnRoaXMuc3RvcHNMaXN0XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnN0b3BTZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRTdG9wc0xpc3QgPSB0aGlzLnN0b3BzTGlzdC5maWx0ZXIoKHN0b3A6YW55KSA9PlxyXG4gICAgICAgIHN0b3Auc3RvcE5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TdG9wU2VsZWN0aW9uKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnZlaGljbGVUeXBlU2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgdGhpcy5zZWxlY3RlZFZlaGljbGVUeXBlID0gJyc7XHJcbiAgICB0aGlzLnNlbGVjdGVkVmVoaWNsZVR5cGUgPSBudWxsO1xyXG4gICAgdGhpcy5yb3V0ZVZhbHVlcyA9IFtdO1xyXG4gICAgdGhpcy5yZW1vdmVUcmFzcG9ydEZlZSgpO1xyXG4gICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCA9IG51bGxcclxuICAgIGxldCBzZWxlY3RlZFN0dWRlbnQ6IGFueTtcclxuICAgIHRoaXMuc3RvcHNMaXN0LmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgIGlmIChlbGVtZW50LnN0b3BOYW1lLnNwbGl0KCcgJykuam9pbignXycpLnRvTG93ZXJDYXNlKCkgPT09IGV2ZW50Lm9wdGlvbi52YWx1ZS5zcGxpdCgnICcpLmpvaW4oJ18nKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgc2VsZWN0ZWRTdHVkZW50ID0gZWxlbWVudDtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcCA9IGVsZW1lbnQ7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3NlbGVjdGVkU3RvcCcsSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZFN0b3ApKVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldFZlaGljbGVUeXBlcygpIHtcclxuICAgIGxldCBkYXRhID0ge1xyXG4gICAgICBcImJ1c2luZXNzSWRcIjogdGhpcy5hZG1pc3Npb25EYXRhID8gdGhpcy5hZG1pc3Npb25EYXRhLmJ1c2luZXNzRGV0YWlscy5pZCA6ICcnLFxyXG4gICAgICBcInBhZ2VOb1wiOiAwLFxyXG4gICAgICBcInBhZ2VTaXplXCI6IDEwMDAwLFxyXG4gICAgICBcImlzUGFnaW5hdGlvblwiOiBmYWxzZVxyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxWZWhpY2xlVHlwZXMoZGF0YSkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOmFueSkgPT57XHJcbiAgICAgICAgIHRoaXMudmVoaWNsZVR5cGVzTGlzdCA9IHJlcy5kYXRhLmRhdGFcclxuICAgICAgICAgdGhpcy5maWx0ZXJlZFZlaGljbGVUeXBlc0xpc3QgPSBbLi4udGhpcy52ZWhpY2xlVHlwZXNMaXN0XTtcclxuICAgICAgICAgXHJcbiAgICAgICAgIGNvbnN0IHNlbGVjdGVkU3RvcCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3NlbGVjdGVkU3RvcCcpIHx8ICdudWxsJyk7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRWZWhpY2xlID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2VsZWN0ZWRWZWhpY2xlJykgfHwgJ251bGwnKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdG9wU2VhcmNoVGV4dCA9IHNlbGVjdGVkU3RvcD8uc3RvcE5hbWUgfHwgJyc7XHJcbiAgICAgICAgdGhpcy52ZWhpY2xlVHlwZVNlYXJjaFRleHQgPSBzZWxlY3RlZFZlaGljbGU/LnZlaGljbGVUeXBlIHx8ICcnO1xyXG4gICAgICAgIGlmKHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgIT0gbnVsbCl7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcCA9IHNlbGVjdGVkU3RvcDtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWZWhpY2xlVHlwZSA9IHNlbGVjdGVkVmVoaWNsZVxyXG4gICAgICAgICAgdGhpcy5nZXRWZWhpY2xlUm91dGVzQnlTdG9wcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgZmlsdGVyZVZlaGljbGVUeXBlcygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy52ZWhpY2xlVHlwZVNlYXJjaFRleHQpIHtcclxuICAgICAgdGhpcy5maWx0ZXJlZFZlaGljbGVUeXBlc0xpc3QgPSBbLi4udGhpcy52ZWhpY2xlVHlwZXNMaXN0XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnZlaGljbGVUeXBlU2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkVmVoaWNsZVR5cGVzTGlzdCA9IHRoaXMudmVoaWNsZVR5cGVzTGlzdC5maWx0ZXIoKHN0b3A6YW55KSA9PlxyXG4gICAgICAgIHN0b3AudmVoaWNsZVR5cGUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25WZWhpY2xlVHlwZVNlbGVjdGlvbihldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy52ZWhpY2xlVHlwZVNlYXJjaFRleHQgPSAnJztcclxuICAgIHRoaXMucmVtb3ZlVHJhc3BvcnRGZWUoKTtcclxuICAgIHRoaXMucm91dGVWYWx1ZXMgPSBbXTtcclxuICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgPSBudWxsXHJcbiAgICB0aGlzLnZlaGljbGVUeXBlc0xpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgaWYgKGVsZW1lbnQudmVoaWNsZVR5cGUuc3BsaXQoJyAnKS5qb2luKCdfJykudG9Mb3dlckNhc2UoKSA9PT0gZXZlbnQub3B0aW9uLnZhbHVlLnNwbGl0KCcgJykuam9pbignXycpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVmVoaWNsZVR5cGUgPSBlbGVtZW50O1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzZWxlY3RlZFZlaGljbGUnLEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRWZWhpY2xlVHlwZSkpXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5nZXRWZWhpY2xlUm91dGVzQnlTdG9wcygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VmVoaWNsZVJvdXRlc0J5U3RvcHMoKSB7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldFZlaGljbGVSb3V0ZXModGhpcy5zZWxlY3RlZFN0b3AuaWQsIHRoaXMuc2VsZWN0ZWRWZWhpY2xlVHlwZS52ZWhpY2xlVHlwZUlkKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICByZXMuZGF0YS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LmNoYXJnZXMuc2VsZWN0ZWRUZXJtVmFsdWUgPSAnU0lOR0xFJztcclxuICAgICAgICAgICAgZWxlbWVudC5jaGFyZ2VzLmFtb3VudCA9IGVsZW1lbnQuY2hhcmdlcy50b3RhbEFtb3VudDtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgPSByZXMuZGF0YVswXTtcclxuICAgICAgICAgIGlmKHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwuYXZhaWxhYmlsaXR5KXtcclxuICAgICAgICAgICAgdGhpcy5hZG1pc3Npb25EYXRhLnRyYW5zcG9ydFJlcXVlc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXMpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICB0aGlzLmFkZGluZ1RyYW5zcG9ydFJlcXVlc3QoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgdGhpcy5yb3V0ZVZhbHVlcyA9IHJlcy5kYXRhO1xyXG5cclxuICAgICAgICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwuc3RvcCA9IHtcclxuICAgICAgICAgICAgbmFtZTp0aGlzLnNlbGVjdGVkU3RvcC5zdG9wTmFtZSxcclxuICAgICAgICAgICAgaWQ6dGhpcy5zZWxlY3RlZFN0b3AuaWRcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXHJcbiAgICAgICAgICAgIGAke3RoaXMuc2VsZWN0ZWRWZWhpY2xlVHlwZS52ZWhpY2xlVHlwZX0gZG9lc24ndCBoYXZlIGFueSByb3V0ZXNgLFxyXG4gICAgICAgICAgICAnT2snLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZHVyYXRpb246MzUwMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXHJcbiAgICAgICAgICBlcnIuZXJyb3IgPyBlcnIuZXJyb3IubWVzc2FnZSA6IGVyci5zdGF0dXNUZXh0LFxyXG4gICAgICAgICAgJ0Nsb3NlJyxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZHVyYXRpb246MzUwMFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgKVxyXG4gIH1cclxuXHJcblxyXG4gIGRlZmF1bHRJbWFnZTogc3RyaW5nID0gJ2h0dHBzOi8vcHJvZC1zaW1wby5zMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20vcHJvZC1pbWFnZXMvOTE3MDY3YzE3MzQzMzcyODAzMDNjYW5jZWwucG5nJztcclxuXHJcbiAgc2VsZWN0ZWRJdGVtOiBhbnlcclxuICBjaGFuZ2VUZXJtVmFsdWUoaXRlbTogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGl0ZW07XHJcbiAgXHJcbiAgICBpZiAoaXRlbS5zZWxlY3RlZFRlcm1WYWx1ZSA9PT0gJ1RFUk0nKSB7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgaXRlbSk7IFxyXG4gICAgICBpdGVtLnRlcm0gPSB0cnVlO1xyXG4gICAgICBpdGVtLnBhaWQgPSBmYWxzZTtcclxuICAgIH0gXHJcbiAgICBcclxuICAgIGVsc2Uge1xyXG4gICAgICBpdGVtLnRlcm0gPSBmYWxzZTtcclxuICAgICAgaXRlbS50ZXJtc0xpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICBpZiAoZWxlbWVudC5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCBlbGVtZW50KTtcclxuICAgICAgICAgIGVsZW1lbnQuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIFxyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgaXRlbSk7IFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkVGVybXMoZXY6IGFueSwgaXRlbTogYW55KSB7XHJcbiAgICBpZiAoZXYudGFyZ2V0LmNoZWNrZWQpIHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIGl0ZW0pXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCBpdGVtKVxyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0udGVybXNMaXN0LmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgIGlmIChlbGVtZW50LnRlcm1JZCA9PSBpdGVtLnRlcm1JZCkge1xyXG4gICAgICAgIGVsZW1lbnQuc2VsZWN0ZWQgPSBldi50YXJnZXQuY2hlY2tlZDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRPcmRpbmFsU3VmZml4KGk6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBqID0gaSAlIDEwLFxyXG4gICAgICBrID0gaSAlIDEwMDtcclxuICAgIGlmIChqID09IDEgJiYgayAhPSAxMSkge1xyXG4gICAgICByZXR1cm4gaSArIFwic3RcIjtcclxuICAgIH1cclxuICAgIGlmIChqID09IDIgJiYgayAhPSAxMikge1xyXG4gICAgICByZXR1cm4gaSArIFwibmRcIjtcclxuICAgIH1cclxuICAgIGlmIChqID09IDMgJiYgayAhPSAxMykge1xyXG4gICAgICByZXR1cm4gaSArIFwicmRcIjtcclxuICAgIH1cclxuICAgIHJldHVybiBpICsgXCJ0aFwiO1xyXG4gIH1cclxuXHJcbiAgaXNTdWJzY3JpcHRpb25TZWxlY3RlZChpdGVtOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMuc29tZShcclxuICAgICAgKHBsYW46IGFueSkgPT4gcGxhbi5zdWJzY3JpcHRpb25JZCA9PT0gaXRlbS5zdWJzY3JpcHRpb25JZFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG9uU3Vic2NyaXB0aW9uSXRlbUNoYW5nZShldmVudDogYW55LCBpdGVtOiBhbnkpIHtcclxuICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGV2ZW50LmNoZWNrZWQ7XHJcbiAgXHJcbiAgICBpZiAoaXNDaGVja2VkKSB7XHJcbiAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5zb21lKFxyXG4gICAgICAgIChwbGFuOiBhbnkpID0+IHBsYW4uc3ViSWQgPT09IGl0ZW0uc3Vic2NyaXB0aW9uSWRcclxuICAgICAgKTtcclxuICBcclxuICAgICAgaWYgKCFleGlzdHMpIHtcclxuICAgICAgICBpdGVtLm5ld1ByaWNpbmdMaXN0LmZvckVhY2goKGVsOmFueSkgPT4gZWwuc2VsZWN0ZVN0YXR1cyA9IGZhbHNlKTtcclxuICAgICAgICBpdGVtLm5ld1ByaWNpbmdMaXN0WzBdLnNlbGVjdGVTdGF0dXMgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMucHVzaCh7XHJcbiAgICAgICAgICBzdWJJZDogaXRlbS5zdWJzY3JpcHRpb25JZCxcclxuICAgICAgICAgIHN1Yk5hbWU6IGl0ZW0uc3Vic2NyaXB0aW9uVGl0bGUsXHJcbiAgICAgICAgICBmcmVxdWVuY3k6IGl0ZW0ubmV3UHJpY2luZ0xpc3RbMF0ubmFtZSxcclxuICAgICAgICAgIHN1YnNjcmlwdGlvblR5cGU6IGl0ZW0uc3Vic2NyaXB0aW9uVHlwZS5zdWJzY3JpcHRpb25UeXBlTmFtZSxcclxuICAgICAgICAgIHByaWNpbmc6IGl0ZW0ucHJpY2luZyxcclxuICAgICAgICAgIGluY2x1c2lvbnM6IGl0ZW0uaW5jbHVzaW9uc1xyXG4gICAgICAgIH0pO1xyXG4gIFxyXG4gICAgICAgIGNvbnN0IGFkZEFtb3VudCA9IGl0ZW0ucHJpY2luZ1tpdGVtLm5ld1ByaWNpbmdMaXN0WzBdLm5hbWVdO1xyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigxLCB7IGFtb3VudDogYWRkQW1vdW50IH0pO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgY29uc3QgcmVtb3ZlZFBsYW4gPSB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMuZmluZChcclxuICAgICAgICAocGxhbjogYW55KSA9PiBwbGFuLnN1YklkID09PSBpdGVtLnN1YnNjcmlwdGlvbklkXHJcbiAgICAgICk7XHJcbiAgXHJcbiAgICAgIGlmIChyZW1vdmVkUGxhbikge1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZUFtb3VudCA9IGl0ZW0ucHJpY2luZ1tyZW1vdmVkUGxhbi5mcmVxdWVuY3ldO1xyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgeyBhbW91bnQ6IHJlbW92ZUFtb3VudCB9KTtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMgPSB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMuZmlsdGVyKFxyXG4gICAgICAgIChwbGFuOiBhbnkpID0+IHBsYW4uc3ViSWQgIT09IGl0ZW0uc3Vic2NyaXB0aW9uSWRcclxuICAgICAgKTtcclxuICBcclxuICAgICAgaXRlbS5uZXdQcmljaW5nTGlzdC5mb3JFYWNoKChlbDphbnkpID0+IGVsLnNlbGVjdGVTdGF0dXMgPSBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU3Vic2NyaXB0aW9uU2VsZWN0aW9uKGxpc3Q6IGFueVtdLCBzZWxlY3RlZEluZGV4OiBudW1iZXIsIHBhcmVudEl0ZW06IGFueSkge1xyXG4gICAgbGV0IHVuc2VsZWN0ZWRJdGVtOiBhbnkgPSBudWxsO1xyXG4gICAgbGV0IHByZXZpb3VzbHlTZWxlY3RlZEluZGV4ID0gbGlzdC5maW5kSW5kZXgoZWwgPT4gZWwuc2VsZWN0ZVN0YXR1cyk7XHJcblxyXG4gICAgaWYgKHByZXZpb3VzbHlTZWxlY3RlZEluZGV4ICE9PSAtMSAmJiBwcmV2aW91c2x5U2VsZWN0ZWRJbmRleCAhPT0gc2VsZWN0ZWRJbmRleCkge1xyXG4gICAgICB1bnNlbGVjdGVkSXRlbSA9IGxpc3RbcHJldmlvdXNseVNlbGVjdGVkSW5kZXhdO1xyXG4gICAgfVxyXG4gICAgbGlzdC5mb3JFYWNoKChlbCwgaW5kZXgpID0+IHtcclxuICAgICAgZWwuc2VsZWN0ZVN0YXR1cyA9IGluZGV4ID09PSBzZWxlY3RlZEluZGV4O1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gbGlzdFtzZWxlY3RlZEluZGV4XTtcclxuICAgIGNvbnN0IHNlbGVjdGVkUGxhbiA9IHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5maW5kKFxyXG4gICAgICAocGxhbjogYW55KSA9PiBwbGFuLnN1YklkID09PSBwYXJlbnRJdGVtLnN1YnNjcmlwdGlvbklkXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChzZWxlY3RlZFBsYW4pIHtcclxuICAgICAgc2VsZWN0ZWRQbGFuLmZyZXF1ZW5jeSA9IHNlbGVjdGVkSXRlbS5uYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh1bnNlbGVjdGVkSXRlbSkge1xyXG4gICAgICBjb25zdCByZW1vdmVBbW91bnQgPSBwYXJlbnRJdGVtLnByaWNpbmdbdW5zZWxlY3RlZEl0ZW0ubmFtZV07XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgeyAuLi51bnNlbGVjdGVkSXRlbSwgYW1vdW50OiByZW1vdmVBbW91bnQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlbGVjdGVkSXRlbSkge1xyXG4gICAgICBjb25zdCBhZGRBbW91bnQgPSBwYXJlbnRJdGVtLnByaWNpbmdbc2VsZWN0ZWRJdGVtLm5hbWVdO1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgeyAuLi5zZWxlY3RlZEl0ZW0sIGFtb3VudDogYWRkQW1vdW50IH0pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGhhc0FjdGl2ZVN1YnNjcmlwdGlvbnMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zLmxlbmd0aCA+IDBcclxuICB9XHJcblxyXG4gIGRpc2FibGVTdWJzY3JpcHRpb25TZWxlY3Rpb24oaXRlbTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zLnNvbWUoXHJcbiAgICAgIChlbGVtOiBhbnkpID0+IGVsZW0uc3ViSWQgPT09IGl0ZW0uc3Vic2NyaXB0aW9uSWRcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhZGRpbmdUcmFuc3BvcnRGZWUoKSB7XHJcbiAgICBpZiAodGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbC5jaGFyZ2VzLnRlcm0pIHtcclxuICAgICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbC5jaGFyZ2VzLnRlcm1QYXltZW50TGlzdC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgIGlmIChlbGVtZW50LnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgZWxlbWVudClcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigxLCB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsLmNoYXJnZXMpXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJlbW92ZVRyYXNwb3J0RmVlKCkge1xyXG4gICAgaWYgKHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgIT0gbnVsbCkge1xyXG4gICAgICBpZih0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsPy5hdmFpbGFiaWxpdHkpe1xyXG4gICAgICAgIGlmICh0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsLmNoYXJnZXMudGVybSkge1xyXG4gICAgICAgICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbC5jaGFyZ2VzLnRlcm1QYXltZW50TGlzdC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgZWxlbWVudClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsLmNoYXJnZXMpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNoZWNrYm94Q2hhbmdlKGl0ZW06IGFueSwgZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5yZW1vdmVUcmFzcG9ydEZlZSgpO1xyXG4gICAgaWYgKGV2ZW50LmNoZWNrZWQpIHtcclxuICAgICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCA9IGl0ZW07XHJcbiAgICAgIGlmKGl0ZW0uYXZhaWxhYmlsaXR5KXtcclxuICAgICAgICB0aGlzLmFkbWlzc2lvbkRhdGEudHJhbnNwb3J0UmVxdWVzdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYWRkaW5nVHJhbnNwb3J0RmVlKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZXtcclxuICAgICAgICB0aGlzLmFkZGluZ1RyYW5zcG9ydFJlcXVlc3QoKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZGluZ1RyYW5zcG9ydFJlcXVlc3QoKXtcclxuICAgIHRoaXMucmVzdFNlcnZpY2Uub3BlblNvY2lhbEJyYW5kKFxyXG4gICAgICBUcmFzcG9ydEF2YWlsYWJpbGl0eUNvbXBvbmVudCxcclxuICAgICAgJzMwJScsXHJcbiAgICAgICcyNSUnLFxyXG4gICAgICB7ZGF0YTp0aGlzLmFkbWlzc2lvbkRhdGF9XHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBnZXRQaWNrdXBUaW1lKGl0ZW06IGFueSkge1xyXG4gICAgY29uc3QgbWF0Y2hlZEl0ZW0gPSBpdGVtLmZpbmQoKGVsZW1lbnQ6YW55KSA9PiBlbGVtZW50LnN0b3AuaWQgPT09IHRoaXMuc2VsZWN0ZWRTdG9wLmlkKTtcclxuICAgIGNvbnN0IGlzb1RpbWUgPSBuZXcgRGF0ZShgMTk3MC0wMS0wMVQke21hdGNoZWRJdGVtLnBpY2t1cC5waWNrdXBUaW1lfWApO1xyXG4gICAgcmV0dXJuIG1hdGNoZWRJdGVtID8gaXNvVGltZSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXREcm9wdGltZShpdGVtOiBhbnkpIHtcclxuICAgIGNvbnN0IG1hdGNoZWRJdGVtID0gaXRlbS5maW5kKChlbGVtZW50OmFueSkgPT4gZWxlbWVudC5zdG9wLmlkID09PSB0aGlzLnNlbGVjdGVkU3RvcC5pZCk7XHJcbiAgICBjb25zdCBpc29UaW1lID0gbmV3IERhdGUoYDE5NzAtMDEtMDFUJHttYXRjaGVkSXRlbS5kcm9wLmRyb3BUaW1lfWApO1xyXG4gICAgcmV0dXJuIG1hdGNoZWRJdGVtID8gaXNvVGltZSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VUcmFuc3BvcnRUZXJtVmFsdWUoaXRlbTogYW55KSB7XHJcbiAgICBpZiAoaXRlbS5jaGFyZ2VzLnNlbGVjdGVkVGVybVZhbHVlID09PSAnVEVSTScpIHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCBpdGVtLmNoYXJnZXMpXHJcbiAgICAgIGl0ZW0uY2hhcmdlcy50ZXJtID0gdHJ1ZTtcclxuICAgICAgaXRlbS5jaGFyZ2VzLnBhaWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpdGVtLmNoYXJnZXMudGVybSA9IGZhbHNlO1xyXG4gICAgICBpdGVtLmNoYXJnZXMudGVybVBheW1lbnRMaXN0LmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuc2VsZWN0ZWQpIHtcclxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIGl0ZW0uY2hhcmdlcylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZFNpbmdsZVN0b3AoZXY6YW55LCBpdGVtOiBhbnkpIHtcclxuICAgIGlmIChldi50YXJnZXQuY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgaXRlbSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsIGl0ZW0pXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbC5jaGFyZ2VzLnRlcm1QYXltZW50TGlzdC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICBpZiAoZWxlbWVudC50ZXJtSWQgPT0gaXRlbS50ZXJtSWQpIHtcclxuICAgICAgICBlbGVtZW50LnNlbGVjdGVkID0gZXYudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoY2FsOiBudW1iZXIsIHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICghdmFsdWUpIHJldHVybjtcclxuICBcclxuICAgIGNvbnN0IGFtb3VudCA9IHZhbHVlLmFtb3VudCA/PyB2YWx1ZS50ZXJtQW1vdW50ID8/IDA7XHJcbiAgXHJcbiAgICBpZiAoY2FsID09PSAtMSkge1xyXG4gICAgICB0aGlzLmZlZVN0cnVjdHVyZS50b3RhbEZlZSAtPSBhbW91bnQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZlZVN0cnVjdHVyZS50b3RhbEZlZSArPSBhbW91bnQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsaXN0QWxsS2l0cyA6IGFueSA9IFtdO1xyXG4gIGdldEFsbEtpdHMoKXtcclxuICAgIGxldCBkYXRhID17XHJcbiAgICAgIFwiYnVzaW5lc3NJZFwiOiB0aGlzLmFkbWlzc2lvbkRhdGEgPyB0aGlzLmFkbWlzc2lvbkRhdGEuYnVzaW5lc3NEZXRhaWxzLmlkIDogJycsXHJcbiAgICAgIFwidGFyZ2V0XCI6IFwiR1JBREVcIixcclxuICAgICAgXCJncmFkZUlkXCI6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdnSWQnKSB8fCAnJyxcclxuICAgICAgXCJwYWdlTm9cIjogMCxcclxuICAgICAgXCJzaXplXCI6IDEwMDAwMFxyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxDb21ib3MoZGF0YSkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOmFueSkgPT4ge1xyXG4gICAgICAgIHJlcy5kYXRhLmRhdGEuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMubGlzdEFsbEtpdHMucHVzaCh7XHJcbiAgICAgICAgICAgIGlkOmVsZW1lbnQuaWQsXHJcbiAgICAgICAgICAgIGltZzplbGVtZW50LmltYWdlVXJsLFxyXG4gICAgICAgICAgICBuYW1lOmVsZW1lbnQubmFtZSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246ZWxlbWVudC5kZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgYW1vdW50OihlbGVtZW50LmRpc2NvdW50ZWRQcmljZSAhPSAwIHx8IGVsZW1lbnQuZGlzY291bnRlZFByaWNlICE9IG51bGwpID8gZWxlbWVudC5kaXNjb3VudGVkUHJpY2UgOiBlbGVtZW50LnRvdGFsUHJpY2UsXHJcbiAgICAgICAgICAgIG9yaWdpbmFsQW1vdW50IDogZWxlbWVudC50b3RhbFByaWNlLFxyXG4gICAgICAgICAgICBkaXNjb3VudGVkQW1vdW50OmVsZW1lbnQuZGlzY291bnRlZFByaWNlLFxyXG4gICAgICAgICAgICBwYWlkOmZhbHNlLFxyXG4gICAgICAgICAgICBraXRQYXltZW50U2VsZWN0ZWQ6dHJ1ZSxcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6ZmFsc2VcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZENvbWJvS2l0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmxpc3RBbGxLaXRzID0gdGhpcy5saXN0QWxsS2l0cy5tYXAoKGtpdDphbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRDb21ib0tpdHMuZmluZCgoc2s6YW55KSA9PiBzay5pZCA9PT0ga2l0LmlkKTtcclxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkID8gc2VsZWN0ZWQgOiBraXQ7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnI6YW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKFxyXG4gICAgICAgICAgZXJyLmVycm9yID8gZXJyLmVycm9yLm1lc3NhZ2UgOiBlcnIuc3RhdHVzVGV4dCxcclxuICAgICAgICAgICdDbG9zZScsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOjE1MDBcclxuICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgIClcclxuICB9XHJcblxyXG4gIGFkZFJlbW92ZUtpdChpdGVtOmFueSxldjphbnkpe1xyXG4gICAgaWYgKGV2LnRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZENvbWJvS2l0cy5zb21lKChraXQ6IGFueSkgPT4ga2l0LmlkID09PSBpdGVtLmlkKTtcclxuICAgICAgaWYgKCFleGlzdHMpIHtcclxuICAgICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRDb21ib0tpdHMucHVzaChpdGVtKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSxpdGVtKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsaXRlbSlcclxuICAgICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkQ29tYm9LaXRzID0gdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkQ29tYm9LaXRzLmZpbHRlcihcclxuICAgICAgICAoa2l0OiBhbnkpID0+IGtpdC5pZCAhPT0gaXRlbS5pZFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlUGF5bWVudFN0YXR1cyhpdGVtOmFueSl7XHJcbiAgICBpZighaXRlbS5raXRQYXltZW50U2VsZWN0ZWQpe1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsaXRlbSlcclxuICAgIH1cclxuICAgIGVsc2V7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigxLGl0ZW0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYXNBY3RpdmVLaXRzKCk6Ym9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkQ29tYm9LaXRzLmxlbmd0aCA+IDBcclxuICB9XHJcbn1cclxuIiwiPCEtLSA8c2VjdGlvbiBjbGFzcz1cIm1haW4tc2VjdGlvblwiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZyBsZWZ0LXNpZGVcIj5cclxuICAgICAgICBBZG1pc3Npb24gRmVlXHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImxlZnQtc2lkZSBtdC0xMFwiICpuZ0Zvcj1cImxldCBjb25maWdMaXN0IG9mIE9iamVjdC5rZXlzKGZlZUNvbmZpZylcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZyBtYi0yMFwiPnt7Y29uZmlnTGlzdH19PC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1zcGFjZSBtdC0xMCBtYi0xNVwiICpuZ0Zvcj1cImxldCBjb25maWcgb2YgZmVlQ29uZmlnW2NvbmZpZ0xpc3RdXCI+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cInN1Yi1oZWFkaW5nIG1iLTBcIj57e2NvbmZpZy5mZWVIZWFkfX08L3A+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cImFtb3VudCBtYi0wXCI+4oK5IHt7Y29uZmlnLmFtb3VudH19PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGUgbXQtMTBcIiAqbmdGb3I9XCJsZXQgdHlwZSBvZiBPYmplY3Qua2V5cyhzdWJzY3JpcHRpb25zKVwiPlxyXG4gICAgICAgIDxwIGNsYXNzPVwiaGVhZGluZ1wiPnt7dHlwZX19PC9wPlxyXG5cclxuICAgICAgICA8dGFibGUgY2xhc3M9XCJzdWJzY3JpcHRpb24tdGFibGUgdy0xMDBcIj5cclxuICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgPHRoPlN1YnNjcmlwdGlvbiBUaXRsZTwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5Nb250aGx5PC90aD5cclxuICAgICAgICAgICAgPHRoPlF1YXRlcmx5PC90aD5cclxuICAgICAgICAgICAgPHRoPlllYXJseTwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5PbiBEZW1hbmQ8L3RoPlxyXG4gICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBkYXRhIG9mIHN1YnNjcmlwdGlvbnNbdHlwZV07bGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgIDx0ZD57e2RhdGEuc3ViTmFtZX19PC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiICpuZ0lmPVwiZGF0YS5wcmljaW5nWydRVUFSVEVSTFknXVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1YnNjcmlwdGlvbnt7aX19XCIgIFt2YWx1ZV09XCInTU9OVEhMWSdcIiAoY2xpY2spPVwidG9nZ2xlU2VsZWN0aW9uKGRhdGEsICdNT05USExZJylcIiAgW2NoZWNrZWRdPVwiZGF0YS5zZWxlY3RlZE9wdGlvbiA9PT0gJ01PTlRITFknXCIgIFsobmdNb2RlbCldPVwiZGF0YS5zZWxlY3RlZE9wdGlvblwiIGlkPVwiZmxleFJhZGlvRGVmYXVsdDJcIj5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZsZXhDaGVja0NoZWNrZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICDigrkge3tkYXRhLnByaWNpbmdbJ01PTlRITFknXX19XHJcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJkZWZhdWx0SW1hZ2VcIiAqbmdJZj1cIiFkYXRhLnByaWNpbmdbJ1FVQVJURVJMWSddXCIgW3NyY109XCJkZWZhdWx0SW1hZ2VcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiICpuZ0lmPVwiZGF0YS5wcmljaW5nWydNT05USExZJ11cIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzdWJzY3JpcHRpb257e2l9fVwiIFt2YWx1ZV09XCInUVVBUlRFUkxZJ1wiIChjbGljayk9XCJ0b2dnbGVTZWxlY3Rpb24oZGF0YSwgJ1FVQVJURVJMWScpXCIgIFtjaGVja2VkXT1cImRhdGEuc2VsZWN0ZWRPcHRpb24gPT09ICdRVUFSVEVSTFknXCIgWyhuZ01vZGVsKV09XCJkYXRhLnNlbGVjdGVkT3B0aW9uXCIgaWQ9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAg4oK5IHt7ZGF0YS5wcmljaW5nWydRVUFSVEVSTFknXX19XHJcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJkZWZhdWx0SW1hZ2VcIiAqbmdJZj1cIiFkYXRhLnByaWNpbmdbJ01PTlRITFknXVwiIFtzcmNdPVwiZGVmYXVsdEltYWdlXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCIgKm5nSWY9XCJkYXRhLnByaWNpbmdbJ0FOTlVBTExZJ11cIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzdWJzY3JpcHRpb257e2l9fVwiIFt2YWx1ZV09XCInQU5OVUFMTFknXCIgKGNsaWNrKT1cInRvZ2dsZVNlbGVjdGlvbihkYXRhLCAnQU5OVUFMTFknKVwiICBbY2hlY2tlZF09XCJkYXRhLnNlbGVjdGVkT3B0aW9uID09PSAnQU5OVUFMTFknXCIgWyhuZ01vZGVsKV09XCJkYXRhLnNlbGVjdGVkT3B0aW9uXCIgaWQ9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAg4oK5IHt7ZGF0YS5wcmljaW5nWydBTk5VQUxMWSddfX1cclxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImRlZmF1bHRJbWFnZVwiICpuZ0lmPVwiIWRhdGEucHJpY2luZ1snQU5OVUFMTFknXVwiIFtzcmNdPVwiZGVmYXVsdEltYWdlXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiICpuZ0lmPVwiZGF0YS5wcmljaW5nWydPTkRFTUFORCddXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3Vic2NyaXB0aW9ue3tpfX1cIiBbdmFsdWVdPVwiJ09OREVNQU5EJ1wiIChjbGljayk9XCJ0b2dnbGVTZWxlY3Rpb24oZGF0YSwgJ09OREVNQU5EJylcIiAgW2NoZWNrZWRdPVwiZGF0YS5zZWxlY3RlZE9wdGlvbiA9PT0gJ09OREVNQU5EJ1wiIFsobmdNb2RlbCldPVwiZGF0YS5zZWxlY3RlZE9wdGlvblwiIGlkPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIOKCuSB7e2RhdGEucHJpY2luZ1snT05ERU1BTkQnXX19XHJcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJkZWZhdWx0SW1hZ2VcIiAqbmdJZj1cIiFkYXRhLnByaWNpbmdbJ09OREVNQU5EJ11cIiBbc3JjXT1cImRlZmF1bHRJbWFnZVwiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImxlZnQtc2lkZSBtdC0xMFwiPlxyXG4gICAgICAgIDxwIGNsYXNzPVwiaGVhZGluZ1wiPlBheW1lbnQgUGxhbjwvcD5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnLTJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCIgKGNsaWNrKT1cImNoYW5nZUFubnVhbFBheW1lbnRUZXJtKCdBTk5VQUxMWScpXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiB2YWx1ZT1cIlwiIG5hbWU9XCJwYXltZW50LXBsYW5cIiBpZD1cImZsZXhDaGVja0NoZWNrZWRcIiBbY2hlY2tlZF09XCJhZG1pc3Npb25EYXRhLnBheW1lbnRQbGFuVHlwZSA9PT0gJ0FOTlVBTExZJ1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgIEFubnVhbGx5XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCIgKGNsaWNrKT1cImNoYW5nZUFubnVhbFBheW1lbnRUZXJtKCdURVJNJylcIj5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJyYWRpb1wiIHZhbHVlPVwiXCIgbmFtZT1cInBheW1lbnQtcGxhblwiIGlkPVwiZmxleENoZWNrQ2hlY2tlZFwiIFtjaGVja2VkXT1cImFkbWlzc2lvbkRhdGEucGF5bWVudFBsYW5UeXBlID09PSAnVEVSTSdcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZsZXhDaGVja0NoZWNrZWRcIj5cclxuICAgICAgICAgICAgICBUZXJtXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFkbWlzc2lvblwiICpuZ0lmPVwiYWRtaXNzaW9uRGF0YS5wYXltZW50UGxhblR5cGUgPT09ICdURVJNJ1wiPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiaW5wdXQtdGV4dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IGNsYXNzPVwiaW5wdXRTdHlsZVwiIHBsYWNlaG9sZGVyPVwiLS1TZWxlY3QtLVwiIG11bHRpcGxlPVwidHJ1ZVwiIFsobmdNb2RlbCldPVwiZmVlU3RydWN0dXJlLnRlcm1QYXltZW50TGlzdFwiIChuZ01vZGVsQ2hhbmdlKT1cImNhbGN1bGF0ZVRvdGFsQW1vdW50KClcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB0ZXJtIG9mIHRlcm1QYXltZW50TGlzdFwiIFt2YWx1ZV09XCJ0ZXJtXCI+dGVybSB7e3Rlcm0udGVybU51bWJlcn19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiByaWdodC1zaWRlXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nIG1iLTIwXCI+XHJcbiAgICAgICAgRmVlIENhbGN1bGF0aW9uXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktc3BhY2UgbXQtMTAgbWItMTVcIiAqbmdGb3I9XCJsZXQgY29uZmlnIG9mIGZlZVN0cnVjdHVyZS5mZWVDb25maWdzXCI+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJzdWItaGVhZGluZyBtYi0wXCI+e3tjb25maWcuZmVlSGVhZH19PC9wPlxyXG4gICAgICAgIDxwIGNsYXNzPVwiYW1vdW50IG1iLTBcIj7igrkge3tjb25maWcuYW1vdW50fX08L3A+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LXNwYWNlIG10LTEwIG1iLTE1XCIgKm5nRm9yPVwibGV0IHN1YnNjcmlwaXRpb24gb2YgZmVlU3RydWN0dXJlLnN1YnNjcmlwdGlvblBsYW5zXCI+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJzdWItaGVhZGluZyBtYi0wXCI+e3tzdWJzY3JpcGl0aW9uLnN1Yk5hbWV9fTwvcD5cclxuICAgICAgICA8cCBjbGFzcz1cImFtb3VudCBtYi0wXCI+4oK5IHt7c3Vic2NyaXBpdGlvbi5wcmljaW5nW3N1YnNjcmlwaXRpb24uZnJlcXVlbmN5XX19PC9wPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0b3RhbC1mZWVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZyBtYi01XCI+XHJcbiAgICAgICAgICBUb3RhbCBGZWVcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYW1vdW50XCI+XHJcbiAgICAgICAgICDigrkge3tmZWVTdHJ1Y3R1cmUudG90YWxBbW91bnR9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+IC0tPlxyXG5cclxuXHJcbjxzZWN0aW9uIGNsYXNzPVwibWFpbl9wYXltZW50X2RldGFpbHNfc2VjdGlvbiBoLTEwMCB3LTEwMCBwLTIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgPGRpdiBjbGFzcz1cImxlZnRfcGF5bWVudF9kZXRhaWxzIGgtMTAwIHAtMlwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZlZXNfc2VjdGlvblwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2VjX3RpdGxlXCI+XHJcbiAgICAgICAgRmVlc1xyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm10LTIgYWxsX2ZlZV9jb25maWdzXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmZWVTdHJ1Y3R1cmU/LmZlZUNvbmZpZ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZV9mZWVfY29uZmlnIHAtM1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVfdGl0bGVcIj57e2l0ZW0uZmVlSGVhZCA/IGl0ZW0uZmVlSGVhZC5uYW1lIDogJ04vQSd9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVfYW1vdW50XCI+4oK5IHt7aXRlbS5hbW91bnR9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0udGVybXNMaXN0Lmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhbmdlX3NlbGVjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBhcmlhLWxhYmVsPVwiU2VsZWN0IGFuIG9wdGlvblwiIFsobmdNb2RlbCldPVwiaXRlbS5zZWxlY3RlZFRlcm1WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICBuYW1lPVwidGVybU9wdGlvbl97eyBpdGVtLmZlZUhlYWQuaWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlVGVybVZhbHVlKGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwiU0lOR0xFXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtmb250LXNpemU6MTNweFwiPlNpbmdsZTwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gdmFsdWU9XCJURVJNXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtmb250LXNpemU6MTNweFwiPlRlcm08L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGVybUNvdW50XCIgKm5nSWY9XCJpdGVtLnNlbGVjdGVkVGVybVZhbHVlID09PSAnVEVSTSdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja19kYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRlcm0gb2YgaXRlbS50ZXJtc0xpc3Q7bGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGVEYXRhIGQtZmxleCBnYXAtMyBhbGlnbi1pdGVtcy1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2hhbmdlKT1cImFkZFRlcm1zKCRldmVudCx0ZXJtKVwiIFtjaGVja2VkXT1cInRlcm0uc2VsZWN0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhX3ZhbHVlXCI+e3tnZXRPcmRpbmFsU3VmZml4KGkrMSl9fSBUZXJtICjigrkge3t0ZXJtPy50ZXJtQW1vdW50fX0pPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3Vic2NyaXB0aW9uc19saXN0IG10LTNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+VHJhbnNwb3J0IEZlZTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGluZ190eXBlcyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOjMwJVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiaW5wdXRfY2FyZCBtdC0yIHctMTAwXCIgc3R5bGU9XCJoZWlnaHQ6NDBweFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWxlY3QgU3RvcFwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b0dyYWRlXCJcclxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdG9wU2VhcmNoVGV4dFwiIChpbnB1dCk9XCJmaWx0ZXJTdG9wcygpXCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDEzcHg7Zm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpO1wiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG9HcmFkZT1cIm1hdEF1dG9jb21wbGV0ZVwiIChvcHRpb25TZWxlY3RlZCk9XCJvblN0b3BTZWxlY3Rpb24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgc3RvcCBvZiBmaWx0ZXJlZFN0b3BzTGlzdFwiIFt2YWx1ZV09XCJzdG9wLnN0b3BOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMTNweDtmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgc3RvcC5zdG9wTmFtZSB8IHRpdGxlY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDozMCVcIj5cclxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImlucHV0X2NhcmQgbXQtMiB3LTEwMFwiIHN0eWxlPVwiaGVpZ2h0OjQwcHhcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IHBsYWNlaG9sZGVyPVwiU2VsZWN0IFZlaGljbGUgVHlwZVwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b0dyYWRlMVwiXHJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmVoaWNsZVR5cGVTZWFyY2hUZXh0XCIgKGlucHV0KT1cImZpbHRlcmVWZWhpY2xlVHlwZXMoKVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxM3B4O2ZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvR3JhZGUxPVwibWF0QXV0b2NvbXBsZXRlXCIgKG9wdGlvblNlbGVjdGVkKT1cIm9uVmVoaWNsZVR5cGVTZWxlY3Rpb24oJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgc3RvcCBvZiBmaWx0ZXJlZFZlaGljbGVUeXBlc0xpc3RcIiBbdmFsdWVdPVwic3RvcC52ZWhpY2xlVHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDEzcHg7Zm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHN0b3AudmVoaWNsZVR5cGUgfCB0aXRsZWNhc2UgfX1cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxpc3RfYWxsX3N1YnNjcmlwdGlvbnMgbXQtMlwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiByb3V0ZVZhbHVlc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlX2ZlZV9jb25maWcgcC0zXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2NoZWNrZWRdPVwiYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgPT09IGl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hlY2tib3hDaGFuZ2UoaXRlbSwgJGV2ZW50KVwiPjwvbWF0LWNoZWNrYm94PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJ3aWR0aDo5MiVcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV90aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0udHJhbnNwb3J0LnJvdXRlID8gaXRlbS50cmFuc3BvcnQucm91dGUubmFtZSA6ICdOL0EnIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+KDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpO1wiPlBpY2t1cCBUaW1lIDo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LXNlbWktYm9sZC1mb250LWZhbWlseSk7XCI+e3tnZXRQaWNrdXBUaW1lKGl0ZW0udHJhbnNwb3J0LmJ1c1JvdXRlU3RvcFRpbWluZ3MpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgZGF0ZTonaDptbSBhJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgLVxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6MTJweDtmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7XCI+RHJvcCBUaW1lIDo8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LXNlbWktYm9sZC1mb250LWZhbWlseSk7XCI+e3tnZXREcm9wdGltZShpdGVtLnRyYW5zcG9ydC5idXNSb3V0ZVN0b3BUaW1pbmdzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB8IGRhdGU6J2g6bW0gYSd9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVlX2Ftb3VudFwiPuKCuSB7eyBpdGVtLmNoYXJnZXMudG90YWxBbW91bnQgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbT8uY2hhcmdlcy50ZXJtUGF5bWVudExpc3QubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYW5nZV9zZWxlY3Rpb25cIiBzdHlsZT1cIndpZHRoOjkwJTttYXJnaW46MCBhdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgYXJpYS1sYWJlbD1cIlNlbGVjdCBhbiBvcHRpb25cIiBbKG5nTW9kZWwpXT1cIml0ZW0uY2hhcmdlcy5zZWxlY3RlZFRlcm1WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VUcmFuc3BvcnRUZXJtVmFsdWUoaXRlbSlcIiBbZGlzYWJsZWRdPVwiYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgIT09IGl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cIlNJTkdMRVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTsgZm9udC1zaXplOiAxM3B4XCI+U2luZ2xlPC9tYXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwiVEVSTVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTsgZm9udC1zaXplOiAxM3B4XCI+VGVybTwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGVybUNvdW50XCIgKm5nSWY9XCJpdGVtLmNoYXJnZXMuc2VsZWN0ZWRUZXJtVmFsdWUgPT09ICdURVJNJ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tfZGF0YVwiIHN0eWxlPVwid2lkdGg6NzUlO21hcmdpbjowIGF1dG9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0ZXJtIG9mIGl0ZW0uY2hhcmdlcy50ZXJtUGF5bWVudExpc3Q7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGVEYXRhIGQtZmxleCBnYXAtMyBhbGlnbi1pdGVtcy1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIChjaGFuZ2UpPVwiYWRkU2luZ2xlU3RvcCgkZXZlbnQsIHRlcm0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgIT09IGl0ZW1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YV92YWx1ZVwiPnt7IGdldE9yZGluYWxTdWZmaXgoaSArIDEpIH19IFRlcm0gKOKCuSB7e3Rlcm0udGVybUFtb3VudH19KTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbnNfbGlzdCBtdC0zXCIgKm5nSWY9XCJzdWJzY3JpcHRpb25zRGF0YS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+U3Vic2NyaXB0aW9uczwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X2FsbF9zdWJzY3JpcHRpb25zIG10LTJcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc3Vic2NyaXB0aW9uc0RhdGFcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcF8xXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2NoZWNrZWRdPVwiaXNTdWJzY3JpcHRpb25TZWxlY3RlZChpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25TdWJzY3JpcHRpb25JdGVtQ2hhbmdlKCRldmVudCwgaXRlbSlcIj48L21hdC1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb25fdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAge3tpdGVtLnN1YnNjcmlwdGlvblRpdGxlfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb25fdHlwZXNcIiBzdHlsZT1cIndpZHRoOjg1JTttYXJnaW46YXV0b1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3ViViBvZiBpdGVtLm5ld1ByaWNpbmdMaXN0O2xldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZV9zdWJzY3JwdGlvbiBkLWZsZXggZ2FwLTIgbXQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGVfdGl0bGUgZC1mbGV4IGdhcC0zIGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwid2lkdGg6MjUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgW2NoZWNrZWRdPVwic3ViVi5zZWxlY3RlU3RhdHVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTdWJzY3JpcHRpb25TZWxlY3Rpb24oaXRlbS5uZXdQcmljaW5nTGlzdCwgaSwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWRpc2FibGVTdWJzY3JpcHRpb25TZWxlY3Rpb24oaXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhX3ZhbHVlXCI+e3tzdWJWLm5hbWUgfCB0aXRsZWNhc2V9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGVfdmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7c3ViVi5hbW91bnR9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInN1YnNjcmlwdGlvbnNfbGlzdCBtdC0zXCIgKm5nSWY9XCJsaXN0QWxsS2l0cy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+U3R1ZGVudCBLaXQ8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdF9hbGxfc3Vic2NyaXB0aW9ucyBtdC0yIGQtZmxleCBnYXAtMiBmbGV4LXdyYXBcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbGlzdEFsbEtpdHM7bGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlX2tpdFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3BfbGF5ZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJpdGVtLnNlbGVjdGVkXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiYWRkUmVtb3ZlS2l0KGl0ZW0sJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW1vdW50X3NlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9yaWdpbmFsX2Ftb3VudFwiICpuZ0lmPVwiaXRlbS5kaXNjb3VudGVkQW1vdW50ID09PSAwXCI+4oK5IHt7aXRlbS5hbW91bnR9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzY291bnRlZF9hbW91bnRcIiAqbmdJZj1cIml0ZW0uZGlzY291bnRlZEFtb3VudCAhPSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAg4oK5XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdHJpa2V0aHJvdWdoXCI+e3tpdGVtLm9yaWdpbmFsQW1vdW50fX08L3NwYW4+ICZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1mYW1pbHk6dmFyKC0tcHJpbWFyeS1zZW1pLWJvbGQtZm9udC1mYW1pbHkpXCI+e3tpdGVtLmRpc2NvdW50ZWRBbW91bnR9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2l0X2JvdHRvbV9sYXllclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltYWdlX3NlY3Rpb24gZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWdfc2VjXCIgKm5nSWY9XCJpdGVtLmltZyAhPSBudWxsXCI+PGltZyBbc3JjXT1cIml0ZW0uaW1nXCIgYWx0PVwiXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWdfc2VjIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiICpuZ0lmPVwiaXRlbS5pbWcgPT09IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2l0ZW0ubmFtZS5zcGxpdCgnJylbMF0gfCB1cHBlcmNhc2V9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIga2l0X3RpdGxlIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7aXRlbS5uYW1lfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtpdF9kZXNjcmlwdGlvbiB0ZXh0LWNlbnRlclwiIHN0eWxlPVwibWFyZ2luLXRvcDo0cHhcIj5cclxuICAgICAgICAgICAgICAgICAge3tpdGVtLmRlc2NyaXB0aW9ufX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJraXRfZm9vdGVyX2xheWVyIG10LTJcIiAqbmdJZj1cIml0ZW0uc2VsZWN0ZWRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgZ2FwLTMgcGF5aW5nX29wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBhcmlhLWxhYmVsPVwiU2VsZWN0IGFuIG9wdGlvblwiIFsobmdNb2RlbCldPVwiaXRlbS5raXRQYXltZW50U2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VQYXltZW50U3RhdHVzKGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gW3ZhbHVlXT1cInRydWVcIj48c3BhbiBzdHlsZT1cImZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtmb250LXNpemU6IDEzcHg7XCI+UGF5IE5vdzwvc3Bhbj48L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gW3ZhbHVlXT1cImZhbHNlXCI+PHNwYW4gc3R5bGU9XCJmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7Zm9udC1zaXplOiAxM3B4O1wiPlBheSBMYXRlcjwvc3Bhbj48L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPiAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInJpZ2h0X3BheW1lbnRfZGV0YWlscyBoLTEwMFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRvdGFsX3BheW1lbnRfZGV0YWlscyBoLTEwMCB3LTEwMCBwLTNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm10LTIgY2FsY3VsYXRpb25fdGFibGVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsY3VsYXRpb25fc2luZ2xlX3BhcnRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3RhbF90aXRsZVwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZWRlZGU7cGFkZGluZy1ib3R0b206IDEycHg7XCI+XHJcbiAgICAgICAgICAgIFRvdGFsIEFjYWRlbWljIEZlZSBCcmVha2Rvd25cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmZWVTdHJ1Y3R1cmUuZmVlQ29uZmlnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV90aXRsZVwiPnt7aXRlbS5mZWVIZWFkID8gaXRlbS5mZWVIZWFkLm5hbWUgOiAnTi9BJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV9hbW91bnRcIiAqbmdJZj1cIml0ZW0udGVybXNMaXN0Lmxlbmd0aCA9PT0gMCB8fCBpdGVtLnNlbGVjdGVkVGVybVZhbHVlICE9ICdURVJNJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiKGl0ZW0/LmNvbmNlc3Npb24gIT0gbnVsbCAmJiBpdGVtPy5jb25jZXNzaW9uPy5sZW5ndGggIT0gMCkgPyAnc3RyaWtldGhyb3VnaCcgOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICDigrkge3tpdGVtLmFtb3VudH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uY29uY2Vzc2lvbiAhPSBudWxsICYmIGl0ZW0/LmNvbmNlc3Npb24ubGVuZ3RoICE9IDBcIj4oe3tpdGVtLmFwcGxpZWRDb25jZXNzaW9uQW1vdW50fX0pPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlIGZ3LTUwMFwiICpuZ0lmPVwiaXRlbS50ZXJtc0xpc3QubGVuZ3RoID49IDBcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZV90ZXJtc1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBpdGVtLnRlcm1zTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWRfc2luZ2xlX3Rlcm0gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiICpuZ0lmPVwiZGF0YS5zZWxlY3RlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIFRlcm0ge3tkYXRhLnRlcm1OdW1iZXJ9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBmdy01MDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIOKCuSB7e2RhdGEudGVybUFtb3VudH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGN1bGF0aW9uX3NpbmdsZV9wYXJ0XCIgKm5nSWY9XCJhZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCAhPSBudWxsICYmIGFkbWlzc2lvbkRhdGE/LnNlbGVjdGVkU3RvcERldGFpbD8uYXZhaWxhYmlsaXR5XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG90YWxfdGl0bGVcIiBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGVkZWRlO3BhZGRpbmctYm90dG9tOiAxMnB4O1wiPlxyXG4gICAgICAgICAgICBUcmFuc3BvcnQgRmVlXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV90aXRsZVwiPnt7YWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXM/LnZlaGljbGVUeXBlID9cclxuICAgICAgICAgICAgICAgIGFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsPy5jaGFyZ2VzPy52ZWhpY2xlVHlwZT8ubmFtZSA6ICdOL0EnfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVlX2Ftb3VudFwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsPy5jaGFyZ2VzPy50ZXJtUGF5bWVudExpc3Q/Lmxlbmd0aCA9PT0gMCB8fCBhZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbD8uY2hhcmdlcz8uc2VsZWN0ZWRUZXJtVmFsdWUgIT0gJ1RFUk0nXCI+XHJcbiAgICAgICAgICAgICAgICDigrlcclxuICAgICAgICAgICAgICAgIHt7YWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXM/LnRvdGFsQW1vdW50fX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBmdy01MDBcIiAqbmdJZj1cImFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsPy5jaGFyZ2VzPy50ZXJtUGF5bWVudExpc3Q/Lmxlbmd0aCA+PSAwXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVfdGVybXNcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRhdGEgb2YgYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXM/LnRlcm1QYXltZW50TGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWRfc2luZ2xlX3Rlcm0gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRhLnNlbGVjdGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgVGVybSB7e2RhdGEudGVybU51bWJlcn19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlIGZ3LTUwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAg4oK5IHt7ZGF0YS50ZXJtQW1vdW50fX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsY3VsYXRpb25fc2luZ2xlX3BhcnRcIiAqbmdJZj1cImhhc0FjdGl2ZVN1YnNjcmlwdGlvbnMoKVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5ld190aXRsZSBtdC0yXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RlZGVkZTtwYWRkaW5nLWJvdHRvbTogMTJweDtcIj5cclxuICAgICAgICAgICAgU3Vic2NyaXB0aW9uc1xyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdGluZ19zZWxlY3RlZF9zdXNjcmlwdGlvbnMgbXQtMlwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVlX3RpdGxlXCI+e3tpdGVtLnN1Yk5hbWUgfCB0aXRsZWNhc2V9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlX3BheW1lbnRfY2FsY3VsYXRpb24gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXlcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uZnJlcXVlbmN5IHwgdGl0bGVjYXNlfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBmdy01MDBcIj5cclxuICAgICAgICAgICAgICAgICAgICDigrkge3tpdGVtLnByaWNpbmdbaXRlbS5mcmVxdWVuY3ldfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsY3VsYXRpb25fc2luZ2xlX3BhcnRcIiAqbmdJZj1cImhhc0FjdGl2ZUtpdHMoKVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5ld190aXRsZSBtdC0yXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RlZGVkZTtwYWRkaW5nLWJvdHRvbTogMTJweDtcIj5cclxuICAgICAgICAgICAgU3R1ZGVudCBLaXRzXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0aW5nX3NlbGVjdGVkX3N1c2NyaXB0aW9ucyBtdC0yXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYWRtaXNzaW9uRGF0YS5zZWxlY3RlZENvbWJvS2l0c1wiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtPy5raXRQYXltZW50U2VsZWN0ZWRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGVfcGF5bWVudF9jYWxjdWxhdGlvbiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV90aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7aXRlbS5uYW1lIHwgdGl0bGVjYXNlfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBmdy01MDBcIj5cclxuICAgICAgICAgICAgICAgICAgICDigrkge3tpdGVtLmFtb3VudH19XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyX3NlY3Rpb24gdG90YWxfY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlcl90aXRsZVwiPkdyYW5kIFRvdGFsIEZlZTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIOKCuSB7e2ZlZVN0cnVjdHVyZT8udG90YWxGZWV9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3NlY3Rpb24+Il19