simpo-component-library 3.2.91 → 3.3.0

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 (207) 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 +329 -89
  9. package/esm2022/lib/constants/business.constant.mjs +1 -1
  10. package/esm2022/lib/directive/animation-directive.mjs +4 -4
  11. package/esm2022/lib/directive/background-directive.mjs +4 -4
  12. package/esm2022/lib/directive/banner-content-fit-directive.mjs +4 -4
  13. package/esm2022/lib/directive/blur-content.directive.mjs +4 -4
  14. package/esm2022/lib/directive/border-directive.mjs +4 -4
  15. package/esm2022/lib/directive/borderlessImage.directive.mjs +4 -4
  16. package/esm2022/lib/directive/button-directive.directive.mjs +4 -4
  17. package/esm2022/lib/directive/button-editor.directive.mjs +4 -4
  18. package/esm2022/lib/directive/color.directive.mjs +4 -4
  19. package/esm2022/lib/directive/column-directive.directive.mjs +4 -4
  20. package/esm2022/lib/directive/container-alignment.directive.mjs +4 -4
  21. package/esm2022/lib/directive/container-fir.directive.mjs +4 -4
  22. package/esm2022/lib/directive/content-alignment-directive.mjs +4 -4
  23. package/esm2022/lib/directive/content-fit-directive.mjs +4 -4
  24. package/esm2022/lib/directive/content-title-spacing.directive.mjs +4 -4
  25. package/esm2022/lib/directive/contenteditable.directive.mjs +4 -4
  26. package/esm2022/lib/directive/corner-directive.mjs +4 -4
  27. package/esm2022/lib/directive/footer-layout-directive.mjs +4 -4
  28. package/esm2022/lib/directive/hover-element-directive.mjs +4 -4
  29. package/esm2022/lib/directive/hoverborder.directive.mjs +4 -4
  30. package/esm2022/lib/directive/image-container.directive.mjs +4 -4
  31. package/esm2022/lib/directive/image-directive.directive.mjs +4 -4
  32. package/esm2022/lib/directive/image-editor.directive.mjs +4 -4
  33. package/esm2022/lib/directive/image-position.directive.mjs +4 -4
  34. package/esm2022/lib/directive/overlay-directive.mjs +4 -4
  35. package/esm2022/lib/directive/position-layout-directive.directive.mjs +4 -4
  36. package/esm2022/lib/directive/removeCarousel-directive.mjs +4 -4
  37. package/esm2022/lib/directive/spacing-around.directive.mjs +4 -4
  38. package/esm2022/lib/directive/spacing-horizontal.directive.mjs +4 -4
  39. package/esm2022/lib/directive/sticky-directive.mjs +4 -4
  40. package/esm2022/lib/directive/text-background-directive.directive.mjs +4 -4
  41. package/esm2022/lib/directive/text-size.directive.mjs +4 -4
  42. package/esm2022/lib/directive/wrap-containers.directive.mjs +4 -4
  43. package/esm2022/lib/ecommerce/sections/address/address.component.mjs +5 -5
  44. package/esm2022/lib/ecommerce/sections/authenticate-user/authenticate-user.component.mjs +5 -5
  45. package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.component.mjs +5 -5
  46. package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.model.mjs +1 -1
  47. package/esm2022/lib/ecommerce/sections/cart/cart.component.mjs +5 -5
  48. package/esm2022/lib/ecommerce/sections/cart/cart.modal.mjs +1 -1
  49. package/esm2022/lib/ecommerce/sections/category-product/category-product.component.mjs +5 -5
  50. package/esm2022/lib/ecommerce/sections/category-product/category-product.model.mjs +1 -1
  51. package/esm2022/lib/ecommerce/sections/checkout/checkout.component.mjs +5 -5
  52. package/esm2022/lib/ecommerce/sections/checkout/checkout.modal.mjs +1 -1
  53. package/esm2022/lib/ecommerce/sections/customer-review/customer-review.component.mjs +5 -5
  54. package/esm2022/lib/ecommerce/sections/customer-review/customer-review.model.mjs +1 -1
  55. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.component.mjs +5 -5
  56. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.modal.mjs +1 -1
  57. package/esm2022/lib/ecommerce/sections/featured-category/featured-collection.component.mjs +5 -5
  58. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.component.mjs +5 -5
  59. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.modal.mjs +1 -1
  60. package/esm2022/lib/ecommerce/sections/item-varient/item-varient.component.mjs +5 -5
  61. package/esm2022/lib/ecommerce/sections/order-details/order-details.component.mjs +5 -5
  62. package/esm2022/lib/ecommerce/sections/pagnination/pagnination.component.mjs +5 -5
  63. package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.component.mjs +5 -5
  64. package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.model.mjs +1 -1
  65. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.component.mjs +5 -5
  66. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.modal.mjs +1 -1
  67. package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +6 -6
  68. package/esm2022/lib/ecommerce/sections/product-list/product-list.modal.mjs +1 -1
  69. package/esm2022/lib/ecommerce/sections/small-product-listing/small-product-listing.component.mjs +5 -5
  70. package/esm2022/lib/ecommerce/sections/user-basic-info/user-basic-info.component.mjs +5 -5
  71. package/esm2022/lib/ecommerce/sections/user-profile/user-profile.component.mjs +5 -5
  72. package/esm2022/lib/ecommerce/sections/user-profile/user-profile.modal.mjs +1 -1
  73. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.component.mjs +5 -5
  74. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.model.mjs +1 -1
  75. package/esm2022/lib/ecommerce/sections/whislist/whislist.component.mjs +5 -5
  76. package/esm2022/lib/ecommerce/styles/BaseCollection.modal.mjs +1 -1
  77. package/esm2022/lib/ecommerce/styles/Collection.modal.mjs +1 -1
  78. package/esm2022/lib/ecommerce/styles/OrderedItems.modal.mjs +1 -1
  79. package/esm2022/lib/ecommerce/styles/PincodeLocation.model.mjs +1 -1
  80. package/esm2022/lib/ecommerce/styles/PincodeLocationInter.model.mjs +1 -1
  81. package/esm2022/lib/ecommerce/styles/cart.modal.mjs +1 -1
  82. package/esm2022/lib/ecommerce/styles/category.modal.mjs +1 -1
  83. package/esm2022/lib/ecommerce/styles/order.modal.mjs +1 -1
  84. package/esm2022/lib/ecommerce/styles/product.modal.mjs +1 -1
  85. package/esm2022/lib/ecommerce/styles/review.modal.mjs +1 -1
  86. package/esm2022/lib/ecommerce/styles/user.modal.mjs +1 -1
  87. package/esm2022/lib/elements/add-section/add-section.component.mjs +5 -5
  88. package/esm2022/lib/elements/below-image-card/below-image-card.component.mjs +5 -5
  89. package/esm2022/lib/elements/button/button.component.mjs +5 -5
  90. package/esm2022/lib/elements/button/button.model.mjs +1 -1
  91. package/esm2022/lib/elements/card-skeleton-loader/card-skeleton-loader.component.mjs +5 -5
  92. package/esm2022/lib/elements/covering-image-card/covering-image-card.component.mjs +5 -5
  93. package/esm2022/lib/elements/editor-service.service.mjs +19 -6
  94. package/esm2022/lib/elements/heading-element/heading-element.component.mjs +5 -5
  95. package/esm2022/lib/elements/image-editor/image-editor.component.mjs +5 -5
  96. package/esm2022/lib/elements/index.mjs +5 -5
  97. package/esm2022/lib/elements/link-editor/link-editor.component.mjs +5 -5
  98. package/esm2022/lib/elements/media-selector/media-selector.component.mjs +5 -5
  99. package/esm2022/lib/elements/navbar-button-element/navbar-button-element.component.mjs +4 -4
  100. package/esm2022/lib/elements/portfolio/portfolio.component.mjs +5 -5
  101. package/esm2022/lib/elements/property/property.component.mjs +5 -5
  102. package/esm2022/lib/elements/simpo-button/simpo-button.component.mjs +5 -5
  103. package/esm2022/lib/elements/socia-icons/socia-icons.component.mjs +4 -4
  104. package/esm2022/lib/elements/svg-divider/svg-divider.component.mjs +5 -5
  105. package/esm2022/lib/elements/text/text.component.mjs +5 -5
  106. package/esm2022/lib/elements/text-editor/text-editor.component.mjs +5 -5
  107. package/esm2022/lib/elements/top-of-image-card/top-of-image-card.component.mjs +5 -5
  108. package/esm2022/lib/pipes/amount.pipe.mjs +4 -4
  109. package/esm2022/lib/pipes/gender.pipe.mjs +4 -4
  110. package/esm2022/lib/sections/BaseSection.mjs +1 -1
  111. package/esm2022/lib/sections/add-new-section/add-new-section.component.mjs +5 -5
  112. package/esm2022/lib/sections/appointment-form/appointment-form.component.mjs +5 -5
  113. package/esm2022/lib/sections/appointment-form/appointment-form.model.mjs +1 -1
  114. package/esm2022/lib/sections/banner-carousel/banner-carousel.component.mjs +5 -5
  115. package/esm2022/lib/sections/banner-carousel/banner-carousel.model.mjs +1 -1
  116. package/esm2022/lib/sections/banner-grid-section/banner-grid-section.component.mjs +5 -5
  117. package/esm2022/lib/sections/banner-section/banner-section.component.mjs +4 -4
  118. package/esm2022/lib/sections/blog-list/blog-list.component.mjs +5 -5
  119. package/esm2022/lib/sections/blog-list/blog-list.model.mjs +1 -1
  120. package/esm2022/lib/sections/carousel-banner/carousel-banner.component.mjs +4 -4
  121. package/esm2022/lib/sections/choose-us-section/choose-us-section.component.mjs +5 -5
  122. package/esm2022/lib/sections/choose-us-section/choose-us-section.model.mjs +1 -1
  123. package/esm2022/lib/sections/contact-us/contact-us.component.mjs +4 -4
  124. package/esm2022/lib/sections/faq-section/faq-section.component.mjs +5 -5
  125. package/esm2022/lib/sections/faq-section/faq-section.modal.mjs +1 -1
  126. package/esm2022/lib/sections/features-section/features-section.component.mjs +5 -5
  127. package/esm2022/lib/sections/features-section/features-section.model.mjs +1 -1
  128. package/esm2022/lib/sections/footer/footer.component.mjs +5 -5
  129. package/esm2022/lib/sections/footer/footer.modal.mjs +1 -1
  130. package/esm2022/lib/sections/footer-section/footer-section.component.mjs +4 -4
  131. package/esm2022/lib/sections/header-section/header-section.component.mjs +5 -5
  132. package/esm2022/lib/sections/header-section/header-section.model.mjs +1 -1
  133. package/esm2022/lib/sections/header-text/header-text.component.mjs +5 -5
  134. package/esm2022/lib/sections/header-text/header-text.model.mjs +1 -1
  135. package/esm2022/lib/sections/image-carousel-section/image-carousel-section.component.mjs +5 -5
  136. package/esm2022/lib/sections/image-carousel-section/image-carousel.model.mjs +1 -1
  137. package/esm2022/lib/sections/image-grid-section/image-grid-section.component.mjs +5 -5
  138. package/esm2022/lib/sections/image-grid-section/image-grid-section.model.mjs +1 -1
  139. package/esm2022/lib/sections/image-section/image-section.component.mjs +5 -5
  140. package/esm2022/lib/sections/image-section/image-section.model.mjs +1 -1
  141. package/esm2022/lib/sections/location-section/location-section.component.mjs +5 -5
  142. package/esm2022/lib/sections/location-section/location-section.modal.mjs +1 -1
  143. package/esm2022/lib/sections/logo-gallery/logo-gallery.component.mjs +4 -4
  144. package/esm2022/lib/sections/logo-showcase/logo-showcase.component.mjs +5 -5
  145. package/esm2022/lib/sections/logo-showcase/logo-showcase.modal.mjs +1 -1
  146. package/esm2022/lib/sections/navbar-section/navbar-section.component.mjs +4 -4
  147. package/esm2022/lib/sections/new-services/new-services.component.mjs +5 -5
  148. package/esm2022/lib/sections/new-services/new-services.model.mjs +1 -1
  149. package/esm2022/lib/sections/new-testimonials/new-testimonials.component.mjs +5 -5
  150. package/esm2022/lib/sections/new-testimonials/new-testimonials.model.mjs +1 -1
  151. package/esm2022/lib/sections/pricing-section/pricing-section.component.mjs +5 -5
  152. package/esm2022/lib/sections/pricing-section/pricing-section.modal.mjs +1 -1
  153. package/esm2022/lib/sections/process-modern/process-modern.component.mjs +5 -5
  154. package/esm2022/lib/sections/process-modern/process-modern.model.mjs +1 -1
  155. package/esm2022/lib/sections/process-section/process-section.component.mjs +5 -5
  156. package/esm2022/lib/sections/process-section/process-section.modal.mjs +1 -1
  157. package/esm2022/lib/sections/property-component/property-component.component.mjs +5 -5
  158. package/esm2022/lib/sections/property-component/property-component.modal.mjs +1 -1
  159. package/esm2022/lib/sections/property-list/property-list.component.mjs +5 -5
  160. package/esm2022/lib/sections/property-list/property-list.modal.mjs +1 -1
  161. package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.component.mjs +5 -5
  162. package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.model.mjs +1 -1
  163. package/esm2022/lib/sections/registration-form/registration-form.component.mjs +144 -43
  164. package/esm2022/lib/sections/registration-form/registrationForm.model.mjs +1 -1
  165. package/esm2022/lib/sections/service-section/service-section.component.mjs +5 -5
  166. package/esm2022/lib/sections/service-section/service-section.model.mjs +1 -1
  167. package/esm2022/lib/sections/skeleton-loader-section/skeleton-loader-section.component.mjs +5 -5
  168. package/esm2022/lib/sections/team-member-section/team-member-section.component.mjs +5 -5
  169. package/esm2022/lib/sections/team-member-section/team-member-section.model.mjs +1 -1
  170. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.component.mjs +5 -5
  171. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.model.mjs +1 -1
  172. package/esm2022/lib/sections/testimonial-section/testimonial-section.component.mjs +5 -5
  173. package/esm2022/lib/sections/testimonial-section/testimonial-section.model.mjs +1 -1
  174. package/esm2022/lib/sections/testimonial-video/testimonial-video.component.mjs +5 -5
  175. package/esm2022/lib/sections/testimonial-video/testimonial-video.model.mjs +1 -1
  176. package/esm2022/lib/sections/text-image-section/text-image-section.component.mjs +4 -4
  177. package/esm2022/lib/sections/text-section/text-section.component.mjs +4 -4
  178. package/esm2022/lib/sections/text-section/text-section.model.mjs +1 -1
  179. package/esm2022/lib/sections/usp-video-section/usp-video-section.component.mjs +5 -5
  180. package/esm2022/lib/sections/usp-video-section/usp-video-section.model.mjs +1 -1
  181. package/esm2022/lib/sections/video-section/video-section.component.mjs +5 -5
  182. package/esm2022/lib/sections/video-section/video-section.model.mjs +1 -1
  183. package/esm2022/lib/sections/view-blog/view-blog.component.mjs +5 -5
  184. package/esm2022/lib/services/cart.service.mjs +4 -4
  185. package/esm2022/lib/services/endUser.service.mjs +4 -4
  186. package/esm2022/lib/services/events.service.mjs +4 -4
  187. package/esm2022/lib/services/image-upload-service.service.mjs +10 -15
  188. package/esm2022/lib/services/rest.service.mjs +10 -4
  189. package/esm2022/lib/services/sanitizeHtml.mjs +4 -4
  190. package/esm2022/lib/services/storage.service.mjs +4 -4
  191. package/esm2022/lib/styles/index.mjs +1 -1
  192. package/esm2022/lib/styles/style.model.mjs +1 -1
  193. package/esm2022/lib/styles/types.mjs +1 -1
  194. package/esm2022/lib/tokens/api-token.mjs +1 -2
  195. package/esm2022/public-api.mjs +1 -1
  196. package/fesm2022/simpo-component-library.mjs +999 -642
  197. package/fesm2022/simpo-component-library.mjs.map +1 -1
  198. package/lib/components/payment-details/payment-details.component.d.ts +39 -7
  199. package/lib/elements/editor-service.service.d.ts +5 -1
  200. package/lib/sections/registration-form/registration-form.component.d.ts +5 -0
  201. package/lib/services/image-upload-service.service.d.ts +2 -2
  202. package/lib/services/rest.service.d.ts +2 -0
  203. package/lib/tokens/api-token.d.ts +0 -1
  204. package/package.json +1 -1
  205. package/simpo-component-library-3.3.0.tgz +0 -0
  206. package/src/lib/styles/global-styles.css +191 -191
  207. package/simpo-component-library-3.2.91.tgz +0 -0
@@ -3,15 +3,27 @@ import { Component, Input } from '@angular/core';
3
3
  import { FormsModule } from '@angular/forms';
4
4
  import { MatOptionModule } from '@angular/material/core';
5
5
  import { MatFormFieldModule } from '@angular/material/form-field';
6
+ import { MatRadioModule } from '@angular/material/radio';
6
7
  import { MatSelectModule } from '@angular/material/select';
8
+ import { MatCheckboxModule } from '@angular/material/checkbox';
9
+ import { MatDialogModule } from '@angular/material/dialog';
10
+ import { MatAutocompleteModule } from '@angular/material/autocomplete';
11
+ import { MatInputModule } from '@angular/material/input';
7
12
  import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/common";
9
- import * as i2 from "@angular/forms";
10
- import * as i3 from "@angular/material/core";
11
- import * as i4 from "@angular/material/form-field";
12
- import * as i5 from "@angular/material/select";
13
+ import * as i1 from "../../elements/editor-service.service";
14
+ import * as i2 from "@angular/material/snack-bar";
15
+ import * as i3 from "@angular/common";
16
+ import * as i4 from "@angular/forms";
17
+ import * as i5 from "@angular/material/core";
18
+ import * as i6 from "@angular/material/form-field";
19
+ import * as i7 from "@angular/material/radio";
20
+ import * as i8 from "@angular/material/checkbox";
21
+ import * as i9 from "@angular/material/autocomplete";
22
+ import * as i10 from "@angular/material/input";
13
23
  export class PaymentDetailsComponent {
14
- constructor() {
24
+ constructor(restService, snackBar) {
25
+ this.restService = restService;
26
+ this.snackBar = snackBar;
15
27
  this.subscriptionsData = [];
16
28
  this.termPaymentList = [];
17
29
  this.Object = Object;
@@ -54,118 +66,346 @@ export class PaymentDetailsComponent {
54
66
  },
55
67
  "active": true,
56
68
  };
69
+ this.stopsList = [];
70
+ this.filteredStopsList = [];
71
+ this.vehicleTypesList = [];
72
+ this.filteredVehicleTypesList = [];
73
+ this.stopSearchText = '';
74
+ this.routeValues = [];
75
+ this.vehicleTypeSearchText = '';
57
76
  this.defaultImage = 'https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/917067c1734337280303cancel.png';
58
- this.subscriptions = {
59
- "Food Fee": [
60
- {
61
- subscriptionTitle: 'Breakfast',
62
- pricing: {
63
- "WEEKLY": 2000,
64
- "MONTHLY": 3000,
65
- "YEARLY": 4000
66
- }
67
- },
68
- {
69
- subscriptionTitle: 'Lunch',
70
- pricing: {
71
- "WEEKLY": 2000,
72
- "MONTHLY": 3000,
73
- "YEARLY": 4000
74
- }
75
- },
76
- {
77
- subscriptionTitle: 'Snacks',
78
- pricing: {
79
- "WEEKLY": 2000,
80
- "MONTHLY": 3000,
81
- "YEARLY": 4000
82
- }
77
+ }
78
+ ngOnInit() {
79
+ this.admissionData.subscriptionPlans = [];
80
+ this.subscriptionsData.forEach(element => {
81
+ if (element.newPricingList) {
82
+ element.newPricingList.forEach((elem) => {
83
+ elem.selecteStatus = false;
84
+ });
85
+ }
86
+ });
87
+ this.admissionData?.studentFeeStructureV2?.feeConfig.forEach((element) => {
88
+ if (element.termsList.length > 0) {
89
+ element.selectedTermValue = 'SINGLE';
90
+ if (element.selectedTermValue === 'SINGLE') {
91
+ element.term = false;
92
+ element.paid = true;
93
+ }
94
+ else {
95
+ element.paid = false;
83
96
  }
84
- ]
97
+ }
98
+ else {
99
+ element.paid = true;
100
+ }
101
+ });
102
+ this.feeStructure = this.admissionData?.studentFeeStructureV2;
103
+ this.getAllStops();
104
+ this.getVehicleTypes();
105
+ }
106
+ getAllStops() {
107
+ this.restService.getAllStops(this.admissionData?.businessDetails?.id).subscribe({
108
+ next: (res) => {
109
+ this.stopsList = res.data.data;
110
+ this.filteredStopsList = [...this.stopsList];
111
+ },
112
+ error: (err) => {
113
+ this.snackBar.open(err.error ? err.error.message : err.statusText, 'Close', {
114
+ duration: 3500
115
+ });
116
+ }
117
+ });
118
+ }
119
+ filterStops() {
120
+ if (!this.stopSearchText) {
121
+ this.filteredStopsList = [...this.stopsList];
122
+ }
123
+ else {
124
+ const searchText = this.stopSearchText.toLowerCase();
125
+ this.filteredStopsList = this.stopsList.filter((stop) => stop.stopName.toLowerCase().includes(searchText));
126
+ }
127
+ }
128
+ onStopSelection(event) {
129
+ this.selectedVehicleType = '';
130
+ this.vehicleTypeSearchText = '';
131
+ this.removeTrasportFee();
132
+ this.admissionData.selectedStopDetail = null;
133
+ let selectedStudent;
134
+ this.stopsList.forEach((element) => {
135
+ if (element.stopName.split(' ').join('_').toLowerCase() === event.option.value.split(' ').join('_').toLowerCase()) {
136
+ selectedStudent = element;
137
+ this.selectedStop = element;
138
+ }
139
+ });
140
+ }
141
+ getVehicleTypes() {
142
+ let data = {
143
+ "businessId": this.admissionData ? this.admissionData.businessDetails.id : '',
144
+ "pageNo": 0,
145
+ "pageSize": 10000,
146
+ "isPagination": false
85
147
  };
148
+ this.restService.getAllVehicleTypes(data).subscribe((res) => {
149
+ this.vehicleTypesList = res.data.data;
150
+ this.filteredVehicleTypesList = [...this.vehicleTypesList];
151
+ });
86
152
  }
87
- ngOnInit() {
88
- this.feeStructure = this.admissionData.studentFeeStructure;
89
- this.subscriptions = this.arrangeSubscriptionForAdmission(this.subscriptionsData);
90
- this.feeConfig = this.arrangeFeeConfig(this.feeStructure.feeConfigs);
91
- this.calculateTotalAmount();
92
- }
93
- toggleSelection(subscription, frequency) {
94
- if (!this.feeStructure.subscriptionPlans)
95
- this.feeStructure.subscriptionPlans = [];
96
- let removeIndex = -1;
97
- for (let i = 0; i < this.feeStructure.subscriptionPlans.length; i++) {
98
- let sub = this.feeStructure.subscriptionPlans[i];
99
- if (sub.subId === subscription.subId) {
100
- removeIndex = i;
101
- break;
153
+ filtereVehicleTypes() {
154
+ if (!this.vehicleTypeSearchText) {
155
+ this.filteredVehicleTypesList = [...this.vehicleTypesList];
156
+ }
157
+ else {
158
+ const searchText = this.vehicleTypeSearchText.toLowerCase();
159
+ this.filteredVehicleTypesList = this.vehicleTypesList.filter((stop) => stop.vehicleType.toLowerCase().includes(searchText));
160
+ }
161
+ }
162
+ onVehicleTypeSelection(event) {
163
+ this.vehicleTypeSearchText = '';
164
+ this.removeTrasportFee();
165
+ this.admissionData.selectedStopDetail = null;
166
+ this.vehicleTypesList.forEach((element) => {
167
+ if (element.vehicleType.split(' ').join('_').toLowerCase() === event.option.value.split(' ').join('_').toLowerCase()) {
168
+ this.selectedVehicleType = element;
169
+ }
170
+ });
171
+ this.getVehicleRoutesByStops();
172
+ }
173
+ getVehicleRoutesByStops() {
174
+ this.restService.getVehicleRoutes(this.selectedStop.id, this.selectedVehicleType.vehicleTypeId).subscribe((res) => {
175
+ if (res.data.length > 0) {
176
+ res.data.forEach((element) => {
177
+ element.charges.selectedTermValue = 'SINGLE';
178
+ element.charges.amount = element.charges.totalAmount;
179
+ });
180
+ this.admissionData.selectedStopDetail = res.data[0];
181
+ this.calculateTotalAmountV2(1, this.admissionData.selectedStopDetail?.charges);
182
+ this.routeValues = res.data;
102
183
  }
184
+ else {
185
+ this.snackBar.open(`${this.selectedVehicleType.vehicleType} doesn't have any routes`, 'Ok', {
186
+ duration: 3500
187
+ });
188
+ }
189
+ }, (err) => {
190
+ this.snackBar.open(err.error ? err.error.message : err.statusText, 'Close', {
191
+ duration: 3500
192
+ });
193
+ });
194
+ }
195
+ changeTermValue(item) {
196
+ this.selectedItem = item;
197
+ if (item.selectedTermValue === 'TERM') {
198
+ this.calculateTotalAmountV2(-1, item);
199
+ item.term = true;
200
+ item.paid = false;
103
201
  }
104
- if (removeIndex == -1) {
105
- this.feeStructure.subscriptionPlans.push({ ...subscription, frequency: frequency });
106
- this.calculateTotalAmount();
107
- return;
202
+ else {
203
+ item.term = false;
204
+ item.termsList.forEach((element) => {
205
+ if (element.selected) {
206
+ this.calculateTotalAmountV2(-1, element);
207
+ element.selected = false;
208
+ }
209
+ });
210
+ this.calculateTotalAmountV2(1, item);
108
211
  }
109
- this.feeStructure.subscriptionPlans.splice(removeIndex, 1);
110
- if (subscription.selectedOption === frequency) {
111
- subscription.selectedOption = null;
212
+ }
213
+ addTerms(ev, item) {
214
+ if (ev.target.checked) {
215
+ this.calculateTotalAmountV2(1, item);
112
216
  }
113
217
  else {
114
- subscription.selectedOption = frequency;
115
- this.feeStructure.subscriptionPlans.push({ ...subscription, frequency: frequency });
218
+ this.calculateTotalAmountV2(-1, item);
116
219
  }
117
- this.calculateTotalAmount();
220
+ this.selectedItem.termsList.forEach((element) => {
221
+ if (element.termId == item.termId) {
222
+ element.selected = ev.target.checked;
223
+ }
224
+ });
225
+ }
226
+ getOrdinalSuffix(i) {
227
+ const j = i % 10, k = i % 100;
228
+ if (j == 1 && k != 11) {
229
+ return i + "st";
230
+ }
231
+ if (j == 2 && k != 12) {
232
+ return i + "nd";
233
+ }
234
+ if (j == 3 && k != 13) {
235
+ return i + "rd";
236
+ }
237
+ return i + "th";
118
238
  }
119
- calculateTotalAmount() {
120
- this.feeStructure.totalAmount = 0;
121
- if (this.admissionData.paymentPlanType === 'ANNUALLY') {
122
- for (let config of this.feeStructure.feeConfigs) {
123
- this.feeStructure.totalAmount += config.amount;
239
+ isSubscriptionSelected(item) {
240
+ return this.admissionData.subscriptionPlans.some((plan) => plan.subscriptionId === item.subscriptionId);
241
+ }
242
+ onSubscriptionItemChange(event, item) {
243
+ const isChecked = event.checked;
244
+ if (isChecked) {
245
+ const exists = this.admissionData.subscriptionPlans.some((plan) => plan.subId === item.subscriptionId);
246
+ if (!exists) {
247
+ item.newPricingList.forEach((el) => el.selecteStatus = false);
248
+ item.newPricingList[0].selecteStatus = true;
249
+ this.admissionData.subscriptionPlans.push({
250
+ subId: item.subscriptionId,
251
+ subName: item.subscriptionTitle,
252
+ frequency: item.newPricingList[0].name,
253
+ subscriptionType: item.subscriptionType.subscriptionTypeName,
254
+ pricing: item.pricing,
255
+ inclusions: item.inclusions
256
+ });
257
+ const addAmount = item.pricing[item.newPricingList[0].name];
258
+ this.calculateTotalAmountV2(1, { amount: addAmount });
124
259
  }
125
260
  }
126
261
  else {
127
- for (let term of this.feeStructure?.termPaymentList || []) {
128
- this.feeStructure.totalAmount += term.termAmount;
262
+ const removedPlan = this.admissionData.subscriptionPlans.find((plan) => plan.subId === item.subscriptionId);
263
+ if (removedPlan) {
264
+ const removeAmount = item.pricing[removedPlan.frequency];
265
+ this.calculateTotalAmountV2(-1, { amount: removeAmount });
129
266
  }
267
+ this.admissionData.subscriptionPlans = this.admissionData.subscriptionPlans.filter((plan) => plan.subId !== item.subscriptionId);
268
+ item.newPricingList.forEach((el) => el.selecteStatus = false);
269
+ }
270
+ }
271
+ toggleSubscriptionSelection(list, selectedIndex, parentItem) {
272
+ let unselectedItem = null;
273
+ let previouslySelectedIndex = list.findIndex(el => el.selecteStatus);
274
+ if (previouslySelectedIndex !== -1 && previouslySelectedIndex !== selectedIndex) {
275
+ unselectedItem = list[previouslySelectedIndex];
276
+ }
277
+ list.forEach((el, index) => {
278
+ el.selecteStatus = index === selectedIndex;
279
+ });
280
+ const selectedItem = list[selectedIndex];
281
+ const selectedPlan = this.admissionData.subscriptionPlans.find((plan) => plan.subId === parentItem.subscriptionId);
282
+ if (selectedPlan) {
283
+ selectedPlan.frequency = selectedItem.name;
284
+ }
285
+ if (unselectedItem) {
286
+ const removeAmount = parentItem.pricing[unselectedItem.name];
287
+ this.calculateTotalAmountV2(-1, { ...unselectedItem, amount: removeAmount });
130
288
  }
131
- for (let subscription of this.feeStructure.subscriptionPlans) {
132
- this.feeStructure.totalAmount += subscription.pricing[subscription.frequency];
289
+ if (selectedItem) {
290
+ const addAmount = parentItem.pricing[selectedItem.name];
291
+ this.calculateTotalAmountV2(1, { ...selectedItem, amount: addAmount });
133
292
  }
134
293
  }
135
- changeAnnualPaymentTerm(payentType) {
136
- this.admissionData.paymentPlanType = payentType;
137
- this.calculateTotalAmount();
294
+ hasActiveSubscriptions() {
295
+ return this.admissionData.subscriptionPlans.length > 0;
138
296
  }
139
- arrangeSubscriptionForAdmission(subscriptionList) {
140
- let response = {};
141
- for (let subscription of subscriptionList) {
142
- if (!response[subscription.subscriptionType]) {
143
- response[subscription.subscriptionType] = [];
297
+ disableSubscriptionSelection(item) {
298
+ return this.admissionData.subscriptionPlans.some((elem) => elem.subId === item.subscriptionId);
299
+ }
300
+ addingTransportFee() {
301
+ if (this.admissionData.selectedStopDetail.charges.term) {
302
+ this.admissionData.selectedStopDetail.charges.termPaymentList.forEach((element) => {
303
+ if (element.selected) {
304
+ this.calculateTotalAmountV2(1, element);
305
+ }
306
+ });
307
+ }
308
+ else {
309
+ this.calculateTotalAmountV2(1, this.admissionData.selectedStopDetail.charges);
310
+ }
311
+ }
312
+ removeTrasportFee() {
313
+ if (this.admissionData.selectedStopDetail != null) {
314
+ if (this.admissionData.selectedStopDetail.charges.term) {
315
+ this.admissionData.selectedStopDetail.charges.termPaymentList.forEach((element) => {
316
+ if (element.selected) {
317
+ this.calculateTotalAmountV2(-1, element);
318
+ }
319
+ });
320
+ }
321
+ else {
322
+ this.calculateTotalAmountV2(-1, this.admissionData.selectedStopDetail.charges);
144
323
  }
145
- response[subscription.subscriptionType].push(subscription);
146
324
  }
147
- return response;
148
325
  }
149
- arrangeFeeConfig(feeConfigList) {
150
- let response = {};
151
- for (let config of feeConfigList) {
152
- if (!response[config.feeType])
153
- response[config.feeType] = [];
154
- response[config.feeType].push(config);
326
+ onCheckboxChange(item, event) {
327
+ // if(this.admissionData.selectedStopDetail)
328
+ this.removeTrasportFee();
329
+ if (event.checked) {
330
+ this.admissionData.selectedStopDetail = item;
331
+ this.addingTransportFee();
332
+ }
333
+ else {
334
+ this.admissionData.selectedStopDetail = null;
335
+ }
336
+ }
337
+ getPickupTime(item) {
338
+ const matchedItem = item.find((element) => element.stop.id === this.selectedStop.id);
339
+ const isoTime = new Date(`1970-01-01T${matchedItem.pickup.pickupTime}`);
340
+ return matchedItem ? isoTime : null;
341
+ }
342
+ getDroptime(item) {
343
+ const matchedItem = item.find((element) => element.stop.id === this.selectedStop.id);
344
+ const isoTime = new Date(`1970-01-01T${matchedItem.drop.dropTime}`);
345
+ return matchedItem ? isoTime : null;
346
+ }
347
+ changeTransportTermValue(item) {
348
+ if (item.charges.selectedTermValue === 'TERM') {
349
+ this.calculateTotalAmountV2(-1, item.charges);
350
+ item.charges.term = true;
351
+ item.charges.paid = false;
352
+ }
353
+ else {
354
+ item.charges.term = false;
355
+ item.charges.termPaymentList.forEach((element) => {
356
+ if (element.selected) {
357
+ this.calculateTotalAmountV2(-1, element);
358
+ }
359
+ });
360
+ this.calculateTotalAmountV2(1, item.charges);
361
+ }
362
+ }
363
+ addSingleStop(ev, item) {
364
+ if (ev.target.checked) {
365
+ this.calculateTotalAmountV2(1, item);
366
+ }
367
+ else {
368
+ this.calculateTotalAmountV2(-1, item);
369
+ }
370
+ this.admissionData.selectedStopDetail.charges.termPaymentList.forEach((element) => {
371
+ if (element.termId == item.termId) {
372
+ element.selected = ev.target.checked;
373
+ }
374
+ });
375
+ }
376
+ calculateTotalAmountV2(cal, value) {
377
+ if (!value)
378
+ return;
379
+ const amount = value.amount ?? value.termAmount ?? 0;
380
+ if (cal === -1) {
381
+ this.feeStructure.totalFee -= amount;
382
+ }
383
+ else {
384
+ this.feeStructure.totalFee += amount;
155
385
  }
156
- return response;
157
386
  }
158
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: PaymentDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
159
- 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", styles: [".heading{font-size:18px;font-weight:500}.left-side{background:#fafcff99;padding:2rem}.mt-10{margin-top:10px}.justify-space{justify-content:space-between}.sub-heading,.amount{font-size:16px;font-weight:500}.mb-20{margin-bottom:20px}.mb-15{margin-bottom:15px}.subscription-table{width:50%}.subscription-table th{color:#434443;font-weight:400;font-size:16px;font-family:DM SANS}.subscription-table td{font-weight:500;color:#000;font-size:16px;margin-top:67px;padding-top:10px}.right-side{background-color:#fdfbfa;padding:2rem;position:relative}.right-side .sub-heading{font-size:18px}.right-side .amount{font-size:16px}.right-side .heading{font-weight:400}.mb-5{margin-bottom:5px}.total-fee{position:absolute;bottom:20px;width:90%}.total-fee .amount{background:#fff;height:87px;display:flex;align-items:center;justify-content:center;font-size:32px;border-radius:8px}.defaultImage{height:15px;width:15px}.g-5{gap:5rem}.g-2{gap:2rem}.mb-2{margin-bottom:2rem!important}.mt-1{margin-top:1rem!important}.mb-0{margin-bottom:0}.input-text{border-radius:7px;border:2px solid rgba(208,213,221,1);height:42px;margin-top:5px;padding-left:10px;margin-top:1.5rem;width:100%}@media screen and (max-width: 475px){.row{margin-left:0;margin-right:0}.total-fee{position:relative;width:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }] }); }
387
+ 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 }); }
388
+ 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)\">\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>\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\">\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>\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}\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.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.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"] }] }); }
160
389
  }
161
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: PaymentDetailsComponent, decorators: [{
390
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PaymentDetailsComponent, decorators: [{
162
391
  type: Component,
163
- args: [{ selector: 'simpo-payment-details', standalone: true, imports: [CommonModule, FormsModule, MatOptionModule, MatFormFieldModule, MatSelectModule], 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", styles: [".heading{font-size:18px;font-weight:500}.left-side{background:#fafcff99;padding:2rem}.mt-10{margin-top:10px}.justify-space{justify-content:space-between}.sub-heading,.amount{font-size:16px;font-weight:500}.mb-20{margin-bottom:20px}.mb-15{margin-bottom:15px}.subscription-table{width:50%}.subscription-table th{color:#434443;font-weight:400;font-size:16px;font-family:DM SANS}.subscription-table td{font-weight:500;color:#000;font-size:16px;margin-top:67px;padding-top:10px}.right-side{background-color:#fdfbfa;padding:2rem;position:relative}.right-side .sub-heading{font-size:18px}.right-side .amount{font-size:16px}.right-side .heading{font-weight:400}.mb-5{margin-bottom:5px}.total-fee{position:absolute;bottom:20px;width:90%}.total-fee .amount{background:#fff;height:87px;display:flex;align-items:center;justify-content:center;font-size:32px;border-radius:8px}.defaultImage{height:15px;width:15px}.g-5{gap:5rem}.g-2{gap:2rem}.mb-2{margin-bottom:2rem!important}.mt-1{margin-top:1rem!important}.mb-0{margin-bottom:0}.input-text{border-radius:7px;border:2px solid rgba(208,213,221,1);height:42px;margin-top:5px;padding-left:10px;margin-top:1.5rem;width:100%}@media screen and (max-width: 475px){.row{margin-left:0;margin-right:0}.total-fee{position:relative;width:100%}}\n"] }]
164
- }], ctorParameters: () => [], propDecorators: { admissionData: [{
392
+ args: [{ selector: 'simpo-payment-details', standalone: true, imports: [
393
+ CommonModule,
394
+ FormsModule,
395
+ MatOptionModule,
396
+ MatFormFieldModule,
397
+ MatSelectModule,
398
+ MatRadioModule,
399
+ MatCheckboxModule,
400
+ MatDialogModule,
401
+ MatAutocompleteModule,
402
+ MatInputModule
403
+ ], 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)\">\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>\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\">\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>\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}\n"] }]
404
+ }], ctorParameters: () => [{ type: i1.ElementServiceService }, { type: i2.MatSnackBar }], propDecorators: { admissionData: [{
165
405
  type: Input
166
406
  }], subscriptionsData: [{
167
407
  type: Input
168
408
  }], termPaymentList: [{
169
409
  type: Input
170
410
  }] } });
171
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LWRldGFpbHMvcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LWRldGFpbHMvcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7OztBQVMzRCxNQUFNLE9BQU8sdUJBQXVCO0lBT2xDO1FBTFMsc0JBQWlCLEdBQVUsRUFBRSxDQUFBO1FBQzdCLG9CQUFlLEdBQVUsRUFBRSxDQUFDO1FBRXJDLFdBQU0sR0FBRyxNQUFNLENBQUE7UUFJZixpQkFBWSxHQUFRO1lBQ2xCLElBQUksRUFBRSxNQUFNO1lBQ1osaUJBQWlCLEVBQUU7Z0JBQ2pCLElBQUksRUFBRSxNQUFNO2FBQ2I7WUFDRCxRQUFRLEVBQUU7Z0JBQ1I7b0JBQ0UsS0FBSyxFQUFFLE1BQU07b0JBQ2IsTUFBTSxFQUFFLFVBQVU7aUJBQ25CO2dCQUNEO29CQUNFLEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxVQUFVO2lCQUNuQjthQUNG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QVM7K0JBQ0UsdUJBQXVCLGNBQ3JCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLGVBQWUsQ0FBQzt3REFLakYsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2ltcG8tcGF5bWVudC1kZXRhaWxzJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBNYXRPcHRpb25Nb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgTWF0U2VsZWN0TW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5jc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQYXltZW50RGV0YWlsc0NvbXBvbmVudCB7XHJcbiAgQElucHV0KCkgYWRtaXNzaW9uRGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIHN1YnNjcmlwdGlvbnNEYXRhOiBhbnlbXSA9IFtdXHJcbiAgQElucHV0KCkgdGVybVBheW1lbnRMaXN0OiBhbnlbXSA9IFtdO1xyXG5cclxuICBPYmplY3QgPSBPYmplY3RcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7fVxyXG5cclxuICBmZWVTdHJ1Y3R1cmU6IGFueSA9IHtcclxuICAgIFwiaWRcIjogJzEyMzQnLFxyXG4gICAgXCJidXNpbmVzc0RldGFpbHNcIjoge1xyXG4gICAgICBcImlkXCI6ICcxMjM0J1xyXG4gICAgfSxcclxuICAgIFwiZ3JhZGVzXCI6IFtcclxuICAgICAge1xyXG4gICAgICAgIFwiX2lkXCI6IFwiMTIzNFwiLFxyXG4gICAgICAgIFwibmFtZVwiOiBcIkdyYWRlIElJXCJcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIFwiX2lkXCI6IFwiMTIzNFwiLFxyXG4gICAgICAgIFwibmFtZVwiOiBcIkdyYWRlIElWXCJcclxuICAgICAgfVxyXG4gICAgXSxcclxuICAgIFwiYm9hcmRcIjogXCJTVEFURVwiLFxyXG4gICAgXCJhY2FkZW1pY1llYXJTdGFydFwiOiAyMDI0LFxyXG4gICAgXCJhY2FkZW1pY1llYXJFbmRcIjogMjAyNSxcclxuICAgIFwiZmVlQ29uZmlnc1wiOiBbXHJcbiAgICAgIHtcclxuICAgICAgICBcImZlZVR5cGVJZFwiOiAnMTIzMjQnLFxyXG4gICAgICAgIFwiZmVlSGVhZElkXCI6ICcxMjM0JyxcclxuICAgICAgICBcImZlZVR5cGVcIjogXCJUdXRpb24gZmVlXCIsXHJcbiAgICAgICAgXCJmZWVIZWFkXCI6IFwiZXhhbSBmZWVcIixcclxuICAgICAgICBcImFtb3VudFwiOiAzMDAsXHJcbiAgICAgICAgXCJkaXNjb3VudEFtb3VudFwiOiAwLFxyXG4gICAgICAgIFwiaXNGaXhlZFwiOiBmYWxzZVxyXG4gICAgICB9XHJcbiAgICBdLFxyXG4gICAgXCJzdWJzY3JpcHRpb25QbGFuc1wiOiBbXSxcclxuICAgIFwidG90YWxBbW91bnRcIjogMzAwLFxyXG4gICAgXCJjcmVhdGVkVGltZXN0YW1wXCI6IHtcclxuICAgICAgXCIkZGF0ZVwiOiBcIjIwMjQtMTItMTVUMDc6MTA6NTQuODg5WlwiXHJcbiAgICB9LFxyXG4gICAgXCJ1cGRhdGVkVGltZXN0YW1wXCI6IHtcclxuICAgICAgXCIkZGF0ZVwiOiBcIjIwMjQtMTItMTVUMDc6MTA6NTQuODg5WlwiXHJcbiAgICB9LFxyXG4gICAgXCJhY3RpdmVcIjogdHJ1ZSxcclxuICB9XHJcblxyXG5cclxuICBmZWVDb25maWc6IGFueTtcclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuZmVlU3RydWN0dXJlID0gdGhpcy5hZG1pc3Npb25EYXRhLnN0dWRlbnRGZWVTdHJ1Y3R1cmU7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSB0aGlzLmFycmFuZ2VTdWJzY3JpcHRpb25Gb3JBZG1pc3Npb24odGhpcy5zdWJzY3JpcHRpb25zRGF0YSk7XHJcbiAgICB0aGlzLmZlZUNvbmZpZyA9IHRoaXMuYXJyYW5nZUZlZUNvbmZpZyh0aGlzLmZlZVN0cnVjdHVyZS5mZWVDb25maWdzKTtcclxuICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnQoKTtcclxuICB9XHJcblxyXG4gIGRlZmF1bHRJbWFnZTogc3RyaW5nID0gJ2h0dHBzOi8vcHJvZC1zaW1wby5zMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20vcHJvZC1pbWFnZXMvOTE3MDY3YzE3MzQzMzcyODAzMDNjYW5jZWwucG5nJztcclxuICBzdWJzY3JpcHRpb25zOiBhbnkgPSB7XHJcbiAgICBcIkZvb2QgRmVlXCIgOiBbXHJcbiAgICAgIHtcclxuICAgICAgICBzdWJzY3JpcHRpb25UaXRsZSA6ICdCcmVha2Zhc3QnLFxyXG4gICAgICAgIHByaWNpbmcgIDoge1xyXG4gICAgICAgICAgXCJXRUVLTFlcIiA6IDIwMDAsXHJcbiAgICAgICAgICBcIk1PTlRITFlcIiAgOiAzMDAwLFxyXG4gICAgICAgICAgXCJZRUFSTFlcIiA6IDQwMDBcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBzdWJzY3JpcHRpb25UaXRsZSA6ICdMdW5jaCcsXHJcbiAgICAgICAgcHJpY2luZyAgOiB7XHJcbiAgICAgICAgICBcIldFRUtMWVwiIDogMjAwMCxcclxuICAgICAgICAgIFwiTU9OVEhMWVwiICA6IDMwMDAsXHJcbiAgICAgICAgICBcIllFQVJMWVwiIDogNDAwMFxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIHN1YnNjcmlwdGlvblRpdGxlIDogJ1NuYWNrcycsXHJcbiAgICAgICAgcHJpY2luZyAgOiB7XHJcbiAgICAgICAgICBcIldFRUtMWVwiIDogMjAwMCxcclxuICAgICAgICAgIFwiTU9OVEhMWVwiICA6IDMwMDAsXHJcbiAgICAgICAgICBcIllFQVJMWVwiIDogNDAwMFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgXVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0aW9uKHN1YnNjcmlwdGlvbjogYW55LCBmcmVxdWVuY3k6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYoIXRoaXMuZmVlU3RydWN0dXJlLnN1YnNjcmlwdGlvblBsYW5zKVxyXG4gICAgICB0aGlzLmZlZVN0cnVjdHVyZS5zdWJzY3JpcHRpb25QbGFucyA9IFtdO1xyXG5cclxuICAgIGxldCByZW1vdmVJbmRleDogbnVtYmVyID0gLTE7XHJcbiAgICBmb3IobGV0IGkgPSAwO2k8dGhpcy5mZWVTdHJ1Y3R1cmUuc3Vic2NyaXB0aW9uUGxhbnMubGVuZ3RoO2krKykge1xyXG4gICAgICBsZXQgc3ViID0gdGhpcy5mZWVTdHJ1Y3R1cmUuc3Vic2NyaXB0aW9uUGxhbnNbaV07XHJcblxyXG4gICAgICBpZihzdWIuc3ViSWQgPT09IHN1YnNjcmlwdGlvbi5zdWJJZCl7XHJcbiAgICAgICAgcmVtb3ZlSW5kZXggPSBpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYocmVtb3ZlSW5kZXggPT0gLTEpIHtcclxuICAgICAgdGhpcy5mZWVTdHJ1Y3R1cmUuc3Vic2NyaXB0aW9uUGxhbnMucHVzaCh7Li4uc3Vic2NyaXB0aW9uLCBmcmVxdWVuY3k6IGZyZXF1ZW5jeX0pXHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmVlU3RydWN0dXJlLnN1YnNjcmlwdGlvblBsYW5zLnNwbGljZShyZW1vdmVJbmRleCwgMSk7XHJcblxyXG4gICAgaWYgKHN1YnNjcmlwdGlvbi5zZWxlY3RlZE9wdGlvbiA9PT0gZnJlcXVlbmN5KSB7XHJcbiAgICAgIHN1YnNjcmlwdGlvbi5zZWxlY3RlZE9wdGlvbiA9IG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzdWJzY3JpcHRpb24uc2VsZWN0ZWRPcHRpb24gPSBmcmVxdWVuY3k7XHJcbiAgICAgIHRoaXMuZmVlU3RydWN0dXJlLnN1YnNjcmlwdGlvblBsYW5zLnB1c2goey4uLnN1YnNjcmlwdGlvbiwgZnJlcXVlbmN5OiBmcmVxdWVuY3l9KVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnQoKTtcclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZVRvdGFsQW1vdW50KCkge1xyXG4gICAgdGhpcy5mZWVTdHJ1Y3R1cmUudG90YWxBbW91bnQgPSAwO1xyXG5cclxuICAgIGlmKHRoaXMuYWRtaXNzaW9uRGF0YS5wYXltZW50UGxhblR5cGUgPT09ICdBTk5VQUxMWScpe1xyXG4gICAgICBmb3IobGV0IGNvbmZpZyBvZiB0aGlzLmZlZVN0cnVjdHVyZS5mZWVDb25maWdzKSB7XHJcbiAgICAgICAgdGhpcy5mZWVTdHJ1Y3R1cmUudG90YWxBbW91bnQgKz0gY29uZmlnLmFtb3VudDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yKGxldCB0ZXJtIG9mIHRoaXMuZmVlU3RydWN0dXJlPy50ZXJtUGF5bWVudExpc3QgfHwgW10pIHtcclxuICAgICAgICB0aGlzLmZlZVN0cnVjdHVyZS50b3RhbEFtb3VudCArPSB0ZXJtLnRlcm1BbW91bnQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3IobGV0IHN1YnNjcmlwdGlvbiBvZiB0aGlzLmZlZVN0cnVjdHVyZS5zdWJzY3JpcHRpb25QbGFucykge1xyXG4gICAgICB0aGlzLmZlZVN0cnVjdHVyZS50b3RhbEFtb3VudCArPSBzdWJzY3JpcHRpb24ucHJpY2luZ1tzdWJzY3JpcHRpb24uZnJlcXVlbmN5XTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoYW5nZUFubnVhbFBheW1lbnRUZXJtKHBheWVudFR5cGU6IGFueSkge1xyXG4gICAgdGhpcy5hZG1pc3Npb25EYXRhLnBheW1lbnRQbGFuVHlwZSA9IHBheWVudFR5cGU7XHJcbiAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50KCk7XHJcbiAgfVxyXG5cclxuICBhcnJhbmdlU3Vic2NyaXB0aW9uRm9yQWRtaXNzaW9uKHN1YnNjcmlwdGlvbkxpc3Q6IGFueVtdKSB7XHJcbiAgICBsZXQgcmVzcG9uc2U6IGFueSA9IHt9O1xyXG5cclxuICAgIGZvcihsZXQgc3Vic2NyaXB0aW9uIG9mIHN1YnNjcmlwdGlvbkxpc3QpIHtcclxuICAgICAgaWYoIXJlc3BvbnNlW3N1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25UeXBlXSkge1xyXG4gICAgICAgIHJlc3BvbnNlW3N1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25UeXBlXSA9IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc3BvbnNlW3N1YnNjcmlwdGlvbi5zdWJzY3JpcHRpb25UeXBlXS5wdXNoKHN1YnNjcmlwdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgYXJyYW5nZUZlZUNvbmZpZyhmZWVDb25maWdMaXN0OiBhbnlbXSkge1xyXG4gICAgbGV0IHJlc3BvbnNlOiBhbnkgPSB7fTtcclxuXHJcbiAgICBmb3IobGV0IGNvbmZpZyBvZiBmZWVDb25maWdMaXN0KSB7XHJcbiAgICAgIGlmKCFyZXNwb25zZVtjb25maWcuZmVlVHlwZV0pXHJcbiAgICAgICAgcmVzcG9uc2VbY29uZmlnLmZlZVR5cGVdID0gW107XHJcblxyXG4gICAgICByZXNwb25zZVtjb25maWcuZmVlVHlwZV0ucHVzaChjb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcbn1cclxuIiwiPHNlY3Rpb24gY2xhc3M9XCJtYWluLXNlY3Rpb25cIj5cclxuICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmcgbGVmdC1zaWRlXCI+XHJcbiAgICAgICAgQWRtaXNzaW9uIEZlZVxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGUgbXQtMTBcIiAqbmdGb3I9XCJsZXQgY29uZmlnTGlzdCBvZiBPYmplY3Qua2V5cyhmZWVDb25maWcpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmcgbWItMjBcIj57e2NvbmZpZ0xpc3R9fTwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktc3BhY2UgbXQtMTAgbWItMTVcIiAqbmdGb3I9XCJsZXQgY29uZmlnIG9mIGZlZUNvbmZpZ1tjb25maWdMaXN0XVwiPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJzdWItaGVhZGluZyBtYi0wXCI+e3tjb25maWcuZmVlSGVhZH19PC9wPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJhbW91bnQgbWItMFwiPuKCuSB7e2NvbmZpZy5hbW91bnR9fTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGVmdC1zaWRlIG10LTEwXCIgKm5nRm9yPVwibGV0IHR5cGUgb2YgT2JqZWN0LmtleXMoc3Vic2NyaXB0aW9ucylcIj5cclxuICAgICAgICA8cCBjbGFzcz1cImhlYWRpbmdcIj57e3R5cGV9fTwvcD5cclxuXHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwic3Vic2NyaXB0aW9uLXRhYmxlIHctMTAwXCI+XHJcbiAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0aD5TdWJzY3JpcHRpb24gVGl0bGU8L3RoPlxyXG4gICAgICAgICAgICA8dGg+TW9udGhseTwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5RdWF0ZXJseTwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5ZZWFybHk8L3RoPlxyXG4gICAgICAgICAgICA8dGg+T24gRGVtYW5kPC90aD5cclxuICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBzdWJzY3JpcHRpb25zW3R5cGVdO2xldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICA8dGQ+e3tkYXRhLnN1Yk5hbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiAqbmdJZj1cImRhdGEucHJpY2luZ1snUVVBUlRFUkxZJ11cIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzdWJzY3JpcHRpb257e2l9fVwiICBbdmFsdWVdPVwiJ01PTlRITFknXCIgKGNsaWNrKT1cInRvZ2dsZVNlbGVjdGlvbihkYXRhLCAnTU9OVEhMWScpXCIgIFtjaGVja2VkXT1cImRhdGEuc2VsZWN0ZWRPcHRpb24gPT09ICdNT05USExZJ1wiICBbKG5nTW9kZWwpXT1cImRhdGEuc2VsZWN0ZWRPcHRpb25cIiBpZD1cImZsZXhSYWRpb0RlZmF1bHQyXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAg4oK5IHt7ZGF0YS5wcmljaW5nWydNT05USExZJ119fVxyXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZGVmYXVsdEltYWdlXCIgKm5nSWY9XCIhZGF0YS5wcmljaW5nWydRVUFSVEVSTFknXVwiIFtzcmNdPVwiZGVmYXVsdEltYWdlXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiAqbmdJZj1cImRhdGEucHJpY2luZ1snTU9OVEhMWSddXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3Vic2NyaXB0aW9ue3tpfX1cIiBbdmFsdWVdPVwiJ1FVQVJURVJMWSdcIiAoY2xpY2spPVwidG9nZ2xlU2VsZWN0aW9uKGRhdGEsICdRVUFSVEVSTFknKVwiICBbY2hlY2tlZF09XCJkYXRhLnNlbGVjdGVkT3B0aW9uID09PSAnUVVBUlRFUkxZJ1wiIFsobmdNb2RlbCldPVwiZGF0YS5zZWxlY3RlZE9wdGlvblwiIGlkPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIOKCuSB7e2RhdGEucHJpY2luZ1snUVVBUlRFUkxZJ119fVxyXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZGVmYXVsdEltYWdlXCIgKm5nSWY9XCIhZGF0YS5wcmljaW5nWydNT05USExZJ11cIiBbc3JjXT1cImRlZmF1bHRJbWFnZVwiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiICpuZ0lmPVwiZGF0YS5wcmljaW5nWydBTk5VQUxMWSddXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3Vic2NyaXB0aW9ue3tpfX1cIiBbdmFsdWVdPVwiJ0FOTlVBTExZJ1wiIChjbGljayk9XCJ0b2dnbGVTZWxlY3Rpb24oZGF0YSwgJ0FOTlVBTExZJylcIiAgW2NoZWNrZWRdPVwiZGF0YS5zZWxlY3RlZE9wdGlvbiA9PT0gJ0FOTlVBTExZJ1wiIFsobmdNb2RlbCldPVwiZGF0YS5zZWxlY3RlZE9wdGlvblwiIGlkPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIOKCuSB7e2RhdGEucHJpY2luZ1snQU5OVUFMTFknXX19XHJcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJkZWZhdWx0SW1hZ2VcIiAqbmdJZj1cIiFkYXRhLnByaWNpbmdbJ0FOTlVBTExZJ11cIiBbc3JjXT1cImRlZmF1bHRJbWFnZVwiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiAqbmdJZj1cImRhdGEucHJpY2luZ1snT05ERU1BTkQnXVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1YnNjcmlwdGlvbnt7aX19XCIgW3ZhbHVlXT1cIidPTkRFTUFORCdcIiAoY2xpY2spPVwidG9nZ2xlU2VsZWN0aW9uKGRhdGEsICdPTkRFTUFORCcpXCIgIFtjaGVja2VkXT1cImRhdGEuc2VsZWN0ZWRPcHRpb24gPT09ICdPTkRFTUFORCdcIiBbKG5nTW9kZWwpXT1cImRhdGEuc2VsZWN0ZWRPcHRpb25cIiBpZD1cImZsZXhDaGVja0NoZWNrZWRcIj5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZsZXhDaGVja0NoZWNrZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICDigrkge3tkYXRhLnByaWNpbmdbJ09OREVNQU5EJ119fVxyXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZGVmYXVsdEltYWdlXCIgKm5nSWY9XCIhZGF0YS5wcmljaW5nWydPTkRFTUFORCddXCIgW3NyY109XCJkZWZhdWx0SW1hZ2VcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGUgbXQtMTBcIj5cclxuICAgICAgICA8cCBjbGFzcz1cImhlYWRpbmdcIj5QYXltZW50IFBsYW48L3A+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZy0yXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiIChjbGljayk9XCJjaGFuZ2VBbm51YWxQYXltZW50VGVybSgnQU5OVUFMTFknKVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cInJhZGlvXCIgdmFsdWU9XCJcIiBuYW1lPVwicGF5bWVudC1wbGFuXCIgaWQ9XCJmbGV4Q2hlY2tDaGVja2VkXCIgW2NoZWNrZWRdPVwiYWRtaXNzaW9uRGF0YS5wYXltZW50UGxhblR5cGUgPT09ICdBTk5VQUxMWSdcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZsZXhDaGVja0NoZWNrZWRcIj5cclxuICAgICAgICAgICAgICBBbm51YWxseVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiIChjbGljayk9XCJjaGFuZ2VBbm51YWxQYXltZW50VGVybSgnVEVSTScpXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiB2YWx1ZT1cIlwiIG5hbWU9XCJwYXltZW50LXBsYW5cIiBpZD1cImZsZXhDaGVja0NoZWNrZWRcIiBbY2hlY2tlZF09XCJhZG1pc3Npb25EYXRhLnBheW1lbnRQbGFuVHlwZSA9PT0gJ1RFUk0nXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgVGVybVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZG1pc3Npb25cIiAqbmdJZj1cImFkbWlzc2lvbkRhdGEucGF5bWVudFBsYW5UeXBlID09PSAnVEVSTSdcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImlucHV0LXRleHRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBjbGFzcz1cImlucHV0U3R5bGVcIiBwbGFjZWhvbGRlcj1cIi0tU2VsZWN0LS1cIiBtdWx0aXBsZT1cInRydWVcIiBbKG5nTW9kZWwpXT1cImZlZVN0cnVjdHVyZS50ZXJtUGF5bWVudExpc3RcIiAobmdNb2RlbENoYW5nZSk9XCJjYWxjdWxhdGVUb3RhbEFtb3VudCgpXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdGVybSBvZiB0ZXJtUGF5bWVudExpc3RcIiBbdmFsdWVdPVwidGVybVwiPnRlcm0ge3t0ZXJtLnRlcm1OdW1iZXJ9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgcmlnaHQtc2lkZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZyBtYi0yMFwiPlxyXG4gICAgICAgIEZlZSBDYWxjdWxhdGlvblxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LXNwYWNlIG10LTEwIG1iLTE1XCIgKm5nRm9yPVwibGV0IGNvbmZpZyBvZiBmZWVTdHJ1Y3R1cmUuZmVlQ29uZmlnc1wiPlxyXG4gICAgICAgIDxwIGNsYXNzPVwic3ViLWhlYWRpbmcgbWItMFwiPnt7Y29uZmlnLmZlZUhlYWR9fTwvcD5cclxuICAgICAgICA8cCBjbGFzcz1cImFtb3VudCBtYi0wXCI+4oK5IHt7Y29uZmlnLmFtb3VudH19PC9wPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1zcGFjZSBtdC0xMCBtYi0xNVwiICpuZ0Zvcj1cImxldCBzdWJzY3JpcGl0aW9uIG9mIGZlZVN0cnVjdHVyZS5zdWJzY3JpcHRpb25QbGFuc1wiPlxyXG4gICAgICAgIDxwIGNsYXNzPVwic3ViLWhlYWRpbmcgbWItMFwiPnt7c3Vic2NyaXBpdGlvbi5zdWJOYW1lfX08L3A+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJhbW91bnQgbWItMFwiPuKCuSB7e3N1YnNjcmlwaXRpb24ucHJpY2luZ1tzdWJzY3JpcGl0aW9uLmZyZXF1ZW5jeV19fTwvcD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwidG90YWwtZmVlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmcgbWItNVwiPlxyXG4gICAgICAgICAgVG90YWwgRmVlXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFtb3VudFwiPlxyXG4gICAgICAgICAg4oK5IHt7ZmVlU3RydWN0dXJlLnRvdGFsQW1vdW50fX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG4iXX0=
411
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LWRldGFpbHMvcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvY29tcG9uZW50cy9wYXltZW50LWRldGFpbHMvcGF5bWVudC1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRyxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSxxQkFBcUIsRUFBZ0MsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7Ozs7OztBQW1CekQsTUFBTSxPQUFPLHVCQUF1QjtJQU9sQyxZQUNVLFdBQW1DLEVBQ25DLFFBQXNCO1FBRHRCLGdCQUFXLEdBQVgsV0FBVyxDQUF3QjtRQUNuQyxhQUFRLEdBQVIsUUFBUSxDQUFjO1FBUHZCLHNCQUFpQixHQUFVLEVBQUUsQ0FBQTtRQUM3QixvQkFBZSxHQUFVLEVBQUUsQ0FBQztRQUVyQyxXQUFNLEdBQUcsTUFBTSxDQUFBO1FBT2YsaUJBQVksR0FBUTtZQUNsQixJQUFJLEVBQUUsTUFBTTtZQUNaLGlCQUFpQixFQUFFO2dCQUNqQixJQUFJLEVBQUUsTUFBTTthQUNiO1lBQ0QsUUFBUSxFQUFFO2dCQUNSO29CQUNFLEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxVQUFVO2lCQUNuQjtnQkFDRDtvQkFDRSxLQUFLLEVBQUUsTUFBTTtvQkFDYixNQUFNLEVBQUUsVUFBVTtpQkFDbkI7YUFDRjtZQUNELE9BQU8sRUFBRSxPQUFPO1lBQ2hCLG1CQUFtQixFQUFFLElBQUk7WUFDekIsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixZQUFZLEVBQUU7Z0JBQ1o7b0JBQ0UsV0FBVyxFQUFFLE9BQU87b0JBQ3BCLFdBQVcsRUFBRSxNQUFNO29CQUNuQixTQUFTLEVBQUUsWUFBWTtvQkFDdkIsU0FBUyxFQUFFLFVBQVU7b0JBQ3JCLFFBQVEsRUFBRSxHQUFHO29CQUNiLGdCQUFnQixFQUFFLENBQUM7b0JBQ25CLFNBQVMsRUFBRSxLQUFLO2lCQUNqQjthQUNGO1lBQ0QsbUJBQW1CLEVBQUUsRUFBRTtZQUN2QixhQUFhLEVBQUUsR0FBRztZQUNsQixrQkFBa0IsRUFBRTtnQkFDbEIsT0FBTyxFQUFFLDBCQUEwQjthQUNwQztZQUNELGtCQUFrQixFQUFFO2dCQUNsQixPQUFPLEVBQUUsMEJBQTBCO2FBQ3BDO1lBQ0QsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFBO1FBa0NELGNBQVMsR0FBUSxFQUFFLENBQUM7UUFDcEIsc0JBQWlCLEdBQVMsRUFBRSxDQUFDO1FBQzdCLHFCQUFnQixHQUFRLEVBQUUsQ0FBQztRQUMzQiw2QkFBd0IsR0FBUSxFQUFFLENBQUM7UUFFbkMsbUJBQWMsR0FBVyxFQUFFLENBQUM7UUFHNUIsZ0JBQVcsR0FBUSxFQUFFLENBQUM7UUFDdEIsMEJBQXFCLEdBQVEsRUFBRSxDQUFDO1FBc0hoQyxpQkFBWSxHQUFXLDJGQUEyRixDQUFDO0lBek1oSCxDQUFDO0lBNENKLFFBQVE7UUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixHQUFFLEVBQUUsQ0FBQTtRQUN4QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3ZDLElBQUcsT0FBTyxDQUFDLGNBQWMsRUFBQyxDQUFDO2dCQUN6QixPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVEsRUFBRSxFQUFFO29CQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztnQkFDN0IsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxFQUFFLHFCQUFxQixFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFXLEVBQUUsRUFBRTtZQUMzRSxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDO2dCQUNyQyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDM0MsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7b0JBQ3JCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixDQUFDO3FCQUNJLENBQUM7b0JBQ0osT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDO2lCQUNJLENBQUM7Z0JBQ0osT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLHFCQUFxQixDQUFDO1FBQzlELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQWFELFdBQVc7UUFDVCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDOUUsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUE7Z0JBQzlCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ2hCLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUM5QyxPQUFPLEVBQ1A7b0JBQ0UsUUFBUSxFQUFDLElBQUk7aUJBQ2QsQ0FDRixDQUFBO1lBQ0gsQ0FBQztTQUNGLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBUSxFQUFFLEVBQUUsQ0FDMUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQ2pELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFtQztRQUNqRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUE7UUFDNUMsSUFBSSxlQUFvQixDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBVyxFQUFFLEVBQUU7WUFDckMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUNsSCxlQUFlLEdBQUcsT0FBTyxDQUFDO2dCQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksSUFBSSxHQUFHO1lBQ1QsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM3RSxRQUFRLEVBQUUsQ0FBQztZQUNYLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLGNBQWMsRUFBRSxLQUFLO1NBQ3RCLENBQUE7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FDakQsQ0FBQyxHQUFPLEVBQUUsRUFBRTtZQUNULElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQTtZQUNyQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FDRixDQUFBO0lBQ0gsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM3RCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1RCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVEsRUFBRSxFQUFFLENBQ3hFLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUNwRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxLQUFtQztRQUN4RCxJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFBO1FBQzVDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFXLEVBQUUsRUFBRTtZQUM1QyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQ3JILElBQUksQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLENBQUE7WUFDcEMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQyxTQUFTLENBQ3ZHLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDWCxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQVcsRUFBRSxFQUFFO29CQUMvQixPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQztvQkFDN0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxDQUFBO2dCQUM5RSxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDOUIsQ0FBQztpQkFDSSxDQUFDO2dCQUNKLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUNoQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLDBCQUEwQixFQUNqRSxJQUFJLEVBQ0o7b0JBQ0UsUUFBUSxFQUFDLElBQUk7aUJBQ2QsQ0FDRixDQUFBO1lBQ0gsQ0FBQztRQUNILENBQUMsRUFDRCxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ2hCLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUM5QyxPQUFPLEVBQ1A7Z0JBQ0UsUUFBUSxFQUFDLElBQUk7YUFDZCxDQUNGLENBQUE7UUFDSCxDQUFDLENBQ0YsQ0FBQTtJQUNILENBQUM7SUFNRCxlQUFlLENBQUMsSUFBUztRQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUV6QixJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDcEIsQ0FBQzthQUVJLENBQUM7WUFDSixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQVcsRUFBRSxFQUFFO2dCQUNyQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDckIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUN6QyxPQUFPLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztnQkFDM0IsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVEsQ0FBQyxFQUFPLEVBQUUsSUFBUztRQUN6QixJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN0QyxDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN2QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBVyxFQUFFLEVBQUU7WUFDbEQsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsQ0FBUztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUNkLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN0QixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDbEIsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDdEIsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNsQixDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxJQUFTO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQzlDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQzNELENBQUM7SUFDSixDQUFDO0lBRUQsd0JBQXdCLENBQUMsS0FBVSxFQUFFLElBQVM7UUFDNUMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUVoQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQ3RELENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQ2xELENBQUM7WUFFRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1osSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLENBQUM7Z0JBQ2xFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFFNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7b0JBQ3hDLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYztvQkFDMUIsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUI7b0JBQy9CLFNBQVMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7b0JBQ3RDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0I7b0JBQzVELE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztvQkFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2lCQUM1QixDQUFDLENBQUM7Z0JBRUgsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDeEQsQ0FBQztRQUVILENBQUM7YUFBTSxDQUFDO1lBRU4sTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQzNELENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQ2xELENBQUM7WUFFRixJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDNUQsQ0FBQztZQUVELElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQ2hGLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQ2xELENBQUM7WUFFRixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBRUgsQ0FBQztJQUVELDJCQUEyQixDQUFDLElBQVcsRUFBRSxhQUFxQixFQUFFLFVBQWU7UUFDN0UsSUFBSSxjQUFjLEdBQVEsSUFBSSxDQUFDO1FBQy9CLElBQUksdUJBQXVCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVyRSxJQUFJLHVCQUF1QixLQUFLLENBQUMsQ0FBQyxJQUFJLHVCQUF1QixLQUFLLGFBQWEsRUFBRSxDQUFDO1lBQ2hGLGNBQWMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN6QixFQUFFLENBQUMsYUFBYSxHQUFHLEtBQUssS0FBSyxhQUFhLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQzVELENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQyxjQUFjLENBQ3hELENBQUM7UUFFRixJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLFlBQVksQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQztRQUM3QyxDQUFDO1FBRUQsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLGNBQWMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBRUQsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDekUsQ0FBQztJQUVILENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFDeEQsQ0FBQztJQUVELDRCQUE0QixDQUFDLElBQVM7UUFDcEMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FDOUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FDbEQsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2RCxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBVyxFQUFFLEVBQUU7Z0JBQ3BGLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFBO2dCQUN6QyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUMvRSxDQUFDO0lBQ0gsQ0FBQztJQUNELGlCQUFpQjtRQUNmLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN2RCxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBVyxFQUFFLEVBQUU7b0JBQ3BGLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNyQixJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUE7b0JBQzFDLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUNJLENBQUM7Z0JBQ0osSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDaEYsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsSUFBUyxFQUFFLEtBQVU7UUFDcEMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1lBQzdDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsSUFBUztRQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pGLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLGNBQWMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN0QyxDQUFDO0lBRUQsV0FBVyxDQUFDLElBQVM7UUFDbkIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RixNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxjQUFjLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNwRSxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdEMsQ0FBQztJQUVELHdCQUF3QixDQUFDLElBQVM7UUFDaEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUM1QixDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFXLEVBQUUsRUFBRTtnQkFDbkQsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3JCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDM0MsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsRUFBTSxFQUFFLElBQVM7UUFDN0IsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDdEMsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDdkMsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFXLEVBQUUsRUFBRTtZQUNwRixJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQyxPQUFPLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQ3ZDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFHRCxzQkFBc0IsQ0FBQyxHQUFXLEVBQUUsS0FBVTtRQUM1QyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFFbkIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQztRQUVyRCxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDO1FBQ3ZDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDOytHQW5jVSx1QkFBdUI7bUdBQXZCLHVCQUF1Qix5TUMvQnBDLGczbkJBd1hVLHl2RUR2V04sWUFBWSw2Y0FDWixXQUFXLDhtQkFDWCxlQUFlLCtMQUNmLGtCQUFrQix5T0FDbEIsZUFBZSw4QkFDZixjQUFjLG9sQkFDZCxpQkFBaUIsb1lBQ2pCLGVBQWUsOEJBQ2YscUJBQXFCLHVyQkFDckIsY0FBYzs7NEZBS0wsdUJBQXVCO2tCQWxCbkMsU0FBUzsrQkFDRSx1QkFBdUIsY0FDckIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGtCQUFrQjt3QkFDbEIsZUFBZTt3QkFDZixjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFDZixxQkFBcUI7d0JBQ3JCLGNBQWM7cUJBQ2Y7b0hBS1EsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyAgTWF0UmFkaW9Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9yYWRpbyc7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBFbGVtZW50U2VydmljZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9lZGl0b3Itc2VydmljZS5zZXJ2aWNlJ1xuaW1wb3J0IHsgTWF0RGlhbG9nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZU1vZHVsZSwgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpbXBvLXBheW1lbnQtZGV0YWlscycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsIFxuICAgIEZvcm1zTW9kdWxlLCBcbiAgICBNYXRPcHRpb25Nb2R1bGUsIFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSwgXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIE1hdFJhZGlvTW9kdWxlLFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgIE1hdERpYWxvZ01vZHVsZSxcbiAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGVcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3BheW1lbnQtZGV0YWlscy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9wYXltZW50LWRldGFpbHMuY29tcG9uZW50LmNzcydcbn0pXG5leHBvcnQgY2xhc3MgUGF5bWVudERldGFpbHNDb21wb25lbnQge1xuICBASW5wdXQoKSBhZG1pc3Npb25EYXRhOiBhbnk7XG4gIEBJbnB1dCgpIHN1YnNjcmlwdGlvbnNEYXRhOiBhbnlbXSA9IFtdXG4gIEBJbnB1dCgpIHRlcm1QYXltZW50TGlzdDogYW55W10gPSBbXTtcblxuICBPYmplY3QgPSBPYmplY3RcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlc3RTZXJ2aWNlIDogRWxlbWVudFNlcnZpY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgc25hY2tCYXIgOiBNYXRTbmFja0JhclxuICApIHt9XG5cbiAgZmVlU3RydWN0dXJlOiBhbnkgPSB7XG4gICAgXCJpZFwiOiAnMTIzNCcsXG4gICAgXCJidXNpbmVzc0RldGFpbHNcIjoge1xuICAgICAgXCJpZFwiOiAnMTIzNCdcbiAgICB9LFxuICAgIFwiZ3JhZGVzXCI6IFtcbiAgICAgIHtcbiAgICAgICAgXCJfaWRcIjogXCIxMjM0XCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkdyYWRlIElJXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiX2lkXCI6IFwiMTIzNFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJHcmFkZSBJVlwiXG4gICAgICB9XG4gICAgXSxcbiAgICBcImJvYXJkXCI6IFwiU1RBVEVcIixcbiAgICBcImFjYWRlbWljWWVhclN0YXJ0XCI6IDIwMjQsXG4gICAgXCJhY2FkZW1pY1llYXJFbmRcIjogMjAyNSxcbiAgICBcImZlZUNvbmZpZ3NcIjogW1xuICAgICAge1xuICAgICAgICBcImZlZVR5cGVJZFwiOiAnMTIzMjQnLFxuICAgICAgICBcImZlZUhlYWRJZFwiOiAnMTIzNCcsXG4gICAgICAgIFwiZmVlVHlwZVwiOiBcIlR1dGlvbiBmZWVcIixcbiAgICAgICAgXCJmZWVIZWFkXCI6IFwiZXhhbSBmZWVcIixcbiAgICAgICAgXCJhbW91bnRcIjogMzAwLFxuICAgICAgICBcImRpc2NvdW50QW1vdW50XCI6IDAsXG4gICAgICAgIFwiaXNGaXhlZFwiOiBmYWxzZVxuICAgICAgfVxuICAgIF0sXG4gICAgXCJzdWJzY3JpcHRpb25QbGFuc1wiOiBbXSxcbiAgICBcInRvdGFsQW1vdW50XCI6IDMwMCxcbiAgICBcImNyZWF0ZWRUaW1lc3RhbXBcIjoge1xuICAgICAgXCIkZGF0ZVwiOiBcIjIwMjQtMTItMTVUMDc6MTA6NTQuODg5WlwiXG4gICAgfSxcbiAgICBcInVwZGF0ZWRUaW1lc3RhbXBcIjoge1xuICAgICAgXCIkZGF0ZVwiOiBcIjIwMjQtMTItMTVUMDc6MTA6NTQuODg5WlwiXG4gICAgfSxcbiAgICBcImFjdGl2ZVwiOiB0cnVlLFxuICB9XG5cblxuICBmZWVDb25maWc6IGFueTtcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zID1bXVxuICAgIHRoaXMuc3Vic2NyaXB0aW9uc0RhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGlmKGVsZW1lbnQubmV3UHJpY2luZ0xpc3Qpe1xuICAgICAgICBlbGVtZW50Lm5ld1ByaWNpbmdMaXN0LmZvckVhY2goKGVsZW06YW55KSA9PiB7XG4gICAgICAgICAgZWxlbS5zZWxlY3RlU3RhdHVzID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYWRtaXNzaW9uRGF0YT8uc3R1ZGVudEZlZVN0cnVjdHVyZVYyPy5mZWVDb25maWcuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LnRlcm1zTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVsZW1lbnQuc2VsZWN0ZWRUZXJtVmFsdWUgPSAnU0lOR0xFJztcbiAgICAgICAgaWYgKGVsZW1lbnQuc2VsZWN0ZWRUZXJtVmFsdWUgPT09ICdTSU5HTEUnKSB7XG4gICAgICAgICAgZWxlbWVudC50ZXJtID0gZmFsc2U7XG4gICAgICAgICAgZWxlbWVudC5wYWlkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LnBhaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGVsZW1lbnQucGFpZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5mZWVTdHJ1Y3R1cmUgPSB0aGlzLmFkbWlzc2lvbkRhdGE/LnN0dWRlbnRGZWVTdHJ1Y3R1cmVWMjtcbiAgICB0aGlzLmdldEFsbFN0b3BzKCk7XG4gICAgdGhpcy5nZXRWZWhpY2xlVHlwZXMoKTtcbiAgfVxuXG5cbiAgc3RvcHNMaXN0OiBhbnkgPSBbXTtcbiAgZmlsdGVyZWRTdG9wc0xpc3QgOiBhbnkgPSBbXTtcbiAgdmVoaWNsZVR5cGVzTGlzdCA6IGFueSA9W107XG4gIGZpbHRlcmVkVmVoaWNsZVR5cGVzTGlzdDogYW55ID0gW107XG5cbiAgc3RvcFNlYXJjaFRleHQ6IHN0cmluZyA9ICcnO1xuICBzZWxlY3RlZFN0b3A6IGFueTtcbiAgc2VsZWN0ZWRWZWhpY2xlVHlwZTogYW55O1xuICByb3V0ZVZhbHVlczogYW55ID0gW107XG4gIHZlaGljbGVUeXBlU2VhcmNoVGV4dDogYW55ID0gJyc7XG4gIGdldEFsbFN0b3BzKCkge1xuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsU3RvcHModGhpcy5hZG1pc3Npb25EYXRhPy5idXNpbmVzc0RldGFpbHM/LmlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcHNMaXN0ID0gcmVzLmRhdGEuZGF0YVxuICAgICAgICB0aGlzLmZpbHRlcmVkU3RvcHNMaXN0ID0gWy4uLnRoaXMuc3RvcHNMaXN0XTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgICBlcnIuZXJyb3IgPyBlcnIuZXJyb3IubWVzc2FnZSA6IGVyci5zdGF0dXNUZXh0LFxuICAgICAgICAgICdDbG9zZScsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZHVyYXRpb246MzUwMFxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmaWx0ZXJTdG9wcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RvcFNlYXJjaFRleHQpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRTdG9wc0xpc3QgPSBbLi4udGhpcy5zdG9wc0xpc3RdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZWFyY2hUZXh0ID0gdGhpcy5zdG9wU2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgdGhpcy5maWx0ZXJlZFN0b3BzTGlzdCA9IHRoaXMuc3RvcHNMaXN0LmZpbHRlcigoc3RvcDphbnkpID0+XG4gICAgICAgIHN0b3Auc3RvcE5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBvblN0b3BTZWxlY3Rpb24oZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkVmVoaWNsZVR5cGUgPSAnJztcbiAgICB0aGlzLnZlaGljbGVUeXBlU2VhcmNoVGV4dCA9ICcnO1xuICAgIHRoaXMucmVtb3ZlVHJhc3BvcnRGZWUoKTtcbiAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsID0gbnVsbFxuICAgIGxldCBzZWxlY3RlZFN0dWRlbnQ6IGFueTtcbiAgICB0aGlzLnN0b3BzTGlzdC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuc3RvcE5hbWUuc3BsaXQoJyAnKS5qb2luKCdfJykudG9Mb3dlckNhc2UoKSA9PT0gZXZlbnQub3B0aW9uLnZhbHVlLnNwbGl0KCcgJykuam9pbignXycpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgc2VsZWN0ZWRTdHVkZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3AgPSBlbGVtZW50O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0VmVoaWNsZVR5cGVzKCkge1xuICAgIGxldCBkYXRhID0ge1xuICAgICAgXCJidXNpbmVzc0lkXCI6IHRoaXMuYWRtaXNzaW9uRGF0YSA/IHRoaXMuYWRtaXNzaW9uRGF0YS5idXNpbmVzc0RldGFpbHMuaWQgOiAnJyxcbiAgICAgIFwicGFnZU5vXCI6IDAsXG4gICAgICBcInBhZ2VTaXplXCI6IDEwMDAwLFxuICAgICAgXCJpc1BhZ2luYXRpb25cIjogZmFsc2VcbiAgICB9XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxWZWhpY2xlVHlwZXMoZGF0YSkuc3Vic2NyaWJlKFxuICAgICAgKHJlczphbnkpID0+e1xuICAgICAgICAgdGhpcy52ZWhpY2xlVHlwZXNMaXN0ID0gcmVzLmRhdGEuZGF0YVxuICAgICAgICAgdGhpcy5maWx0ZXJlZFZlaGljbGVUeXBlc0xpc3QgPSBbLi4udGhpcy52ZWhpY2xlVHlwZXNMaXN0XTtcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICBmaWx0ZXJlVmVoaWNsZVR5cGVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52ZWhpY2xlVHlwZVNlYXJjaFRleHQpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRWZWhpY2xlVHlwZXNMaXN0ID0gWy4uLnRoaXMudmVoaWNsZVR5cGVzTGlzdF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNlYXJjaFRleHQgPSB0aGlzLnZlaGljbGVUeXBlU2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgdGhpcy5maWx0ZXJlZFZlaGljbGVUeXBlc0xpc3QgPSB0aGlzLnZlaGljbGVUeXBlc0xpc3QuZmlsdGVyKChzdG9wOmFueSkgPT5cbiAgICAgICAgc3RvcC52ZWhpY2xlVHlwZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRleHQpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG9uVmVoaWNsZVR5cGVTZWxlY3Rpb24oZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnZlaGljbGVUeXBlU2VhcmNoVGV4dCA9ICcnO1xuICAgIHRoaXMucmVtb3ZlVHJhc3BvcnRGZWUoKTtcbiAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsID0gbnVsbFxuICAgIHRoaXMudmVoaWNsZVR5cGVzTGlzdC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQudmVoaWNsZVR5cGUuc3BsaXQoJyAnKS5qb2luKCdfJykudG9Mb3dlckNhc2UoKSA9PT0gZXZlbnQub3B0aW9uLnZhbHVlLnNwbGl0KCcgJykuam9pbignXycpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZlaGljbGVUeXBlID0gZWxlbWVudFxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZ2V0VmVoaWNsZVJvdXRlc0J5U3RvcHMoKTtcbiAgfVxuXG4gIGdldFZlaGljbGVSb3V0ZXNCeVN0b3BzKCkge1xuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0VmVoaWNsZVJvdXRlcyh0aGlzLnNlbGVjdGVkU3RvcC5pZCwgdGhpcy5zZWxlY3RlZFZlaGljbGVUeXBlLnZlaGljbGVUeXBlSWQpLnN1YnNjcmliZShcbiAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlcy5kYXRhLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50LmNoYXJnZXMuc2VsZWN0ZWRUZXJtVmFsdWUgPSAnU0lOR0xFJztcbiAgICAgICAgICAgIGVsZW1lbnQuY2hhcmdlcy5hbW91bnQgPSBlbGVtZW50LmNoYXJnZXMudG90YWxBbW91bnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsID0gcmVzLmRhdGFbMF07XG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXMpXG4gICAgICAgICAgdGhpcy5yb3V0ZVZhbHVlcyA9IHJlcy5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgICAgIGAke3RoaXMuc2VsZWN0ZWRWZWhpY2xlVHlwZS52ZWhpY2xlVHlwZX0gZG9lc24ndCBoYXZlIGFueSByb3V0ZXNgLFxuICAgICAgICAgICAgJ09rJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246MzUwMFxuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgICAgZXJyLmVycm9yID8gZXJyLmVycm9yLm1lc3NhZ2UgOiBlcnIuc3RhdHVzVGV4dCxcbiAgICAgICAgICAnQ2xvc2UnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOjM1MDBcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICApXG4gIH1cblxuXG4gIGRlZmF1bHRJbWFnZTogc3RyaW5nID0gJ2h0dHBzOi8vcHJvZC1zaW1wby5zMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20vcHJvZC1pbWFnZXMvOTE3MDY3YzE3MzQzMzcyODAzMDNjYW5jZWwucG5nJztcblxuICBzZWxlY3RlZEl0ZW06IGFueVxuICBjaGFuZ2VUZXJtVmFsdWUoaXRlbTogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtO1xuICBcbiAgICBpZiAoaXRlbS5zZWxlY3RlZFRlcm1WYWx1ZSA9PT0gJ1RFUk0nKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsIGl0ZW0pOyBcbiAgICAgIGl0ZW0udGVybSA9IHRydWU7XG4gICAgICBpdGVtLnBhaWQgPSBmYWxzZTtcbiAgICB9IFxuICAgIFxuICAgIGVsc2Uge1xuICAgICAgaXRlbS50ZXJtID0gZmFsc2U7XG4gICAgICBpdGVtLnRlcm1zTGlzdC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudC5zZWxlY3RlZCkge1xuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgZWxlbWVudCk7XG4gICAgICAgICAgZWxlbWVudC5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgXG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgaXRlbSk7IFxuICAgIH1cbiAgfVxuXG4gIGFkZFRlcm1zKGV2OiBhbnksIGl0ZW06IGFueSkge1xuICAgIGlmIChldi50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIGl0ZW0pXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCBpdGVtKVxuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkSXRlbS50ZXJtc0xpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LnRlcm1JZCA9PSBpdGVtLnRlcm1JZCkge1xuICAgICAgICBlbGVtZW50LnNlbGVjdGVkID0gZXYudGFyZ2V0LmNoZWNrZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRPcmRpbmFsU3VmZml4KGk6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaiA9IGkgJSAxMCxcbiAgICAgIGsgPSBpICUgMTAwO1xuICAgIGlmIChqID09IDEgJiYgayAhPSAxMSkge1xuICAgICAgcmV0dXJuIGkgKyBcInN0XCI7XG4gICAgfVxuICAgIGlmIChqID09IDIgJiYgayAhPSAxMikge1xuICAgICAgcmV0dXJuIGkgKyBcIm5kXCI7XG4gICAgfVxuICAgIGlmIChqID09IDMgJiYgayAhPSAxMykge1xuICAgICAgcmV0dXJuIGkgKyBcInJkXCI7XG4gICAgfVxuICAgIHJldHVybiBpICsgXCJ0aFwiO1xuICB9XG5cbiAgaXNTdWJzY3JpcHRpb25TZWxlY3RlZChpdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zLnNvbWUoXG4gICAgICAocGxhbjogYW55KSA9PiBwbGFuLnN1YnNjcmlwdGlvbklkID09PSBpdGVtLnN1YnNjcmlwdGlvbklkXG4gICAgKTtcbiAgfVxuXG4gIG9uU3Vic2NyaXB0aW9uSXRlbUNoYW5nZShldmVudDogYW55LCBpdGVtOiBhbnkpIHtcbiAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC5jaGVja2VkO1xuICBcbiAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICBjb25zdCBleGlzdHMgPSB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMuc29tZShcbiAgICAgICAgKHBsYW46IGFueSkgPT4gcGxhbi5zdWJJZCA9PT0gaXRlbS5zdWJzY3JpcHRpb25JZFxuICAgICAgKTtcbiAgXG4gICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICBpdGVtLm5ld1ByaWNpbmdMaXN0LmZvckVhY2goKGVsOmFueSkgPT4gZWwuc2VsZWN0ZVN0YXR1cyA9IGZhbHNlKTtcbiAgICAgICAgaXRlbS5uZXdQcmljaW5nTGlzdFswXS5zZWxlY3RlU3RhdHVzID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMucHVzaCh7XG4gICAgICAgICAgc3ViSWQ6IGl0ZW0uc3Vic2NyaXB0aW9uSWQsXG4gICAgICAgICAgc3ViTmFtZTogaXRlbS5zdWJzY3JpcHRpb25UaXRsZSxcbiAgICAgICAgICBmcmVxdWVuY3k6IGl0ZW0ubmV3UHJpY2luZ0xpc3RbMF0ubmFtZSxcbiAgICAgICAgICBzdWJzY3JpcHRpb25UeXBlOiBpdGVtLnN1YnNjcmlwdGlvblR5cGUuc3Vic2NyaXB0aW9uVHlwZU5hbWUsXG4gICAgICAgICAgcHJpY2luZzogaXRlbS5wcmljaW5nLFxuICAgICAgICAgIGluY2x1c2lvbnM6IGl0ZW0uaW5jbHVzaW9uc1xuICAgICAgICB9KTtcbiAgXG4gICAgICAgIGNvbnN0IGFkZEFtb3VudCA9IGl0ZW0ucHJpY2luZ1tpdGVtLm5ld1ByaWNpbmdMaXN0WzBdLm5hbWVdO1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgeyBhbW91bnQ6IGFkZEFtb3VudCB9KTtcbiAgICAgIH1cbiAgXG4gICAgfSBlbHNlIHtcblxuICAgICAgY29uc3QgcmVtb3ZlZFBsYW4gPSB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMuZmluZChcbiAgICAgICAgKHBsYW46IGFueSkgPT4gcGxhbi5zdWJJZCA9PT0gaXRlbS5zdWJzY3JpcHRpb25JZFxuICAgICAgKTtcbiAgXG4gICAgICBpZiAocmVtb3ZlZFBsYW4pIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlQW1vdW50ID0gaXRlbS5wcmljaW5nW3JlbW92ZWRQbGFuLmZyZXF1ZW5jeV07XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgeyBhbW91bnQ6IHJlbW92ZUFtb3VudCB9KTtcbiAgICAgIH1cbiAgXG4gICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMgPSB0aGlzLmFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnMuZmlsdGVyKFxuICAgICAgICAocGxhbjogYW55KSA9PiBwbGFuLnN1YklkICE9PSBpdGVtLnN1YnNjcmlwdGlvbklkXG4gICAgICApO1xuICBcbiAgICAgIGl0ZW0ubmV3UHJpY2luZ0xpc3QuZm9yRWFjaCgoZWw6YW55KSA9PiBlbC5zZWxlY3RlU3RhdHVzID0gZmFsc2UpO1xuICAgIH1cblxuICB9XG5cbiAgdG9nZ2xlU3Vic2NyaXB0aW9uU2VsZWN0aW9uKGxpc3Q6IGFueVtdLCBzZWxlY3RlZEluZGV4OiBudW1iZXIsIHBhcmVudEl0ZW06IGFueSkge1xuICAgIGxldCB1bnNlbGVjdGVkSXRlbTogYW55ID0gbnVsbDtcbiAgICBsZXQgcHJldmlvdXNseVNlbGVjdGVkSW5kZXggPSBsaXN0LmZpbmRJbmRleChlbCA9PiBlbC5zZWxlY3RlU3RhdHVzKTtcblxuICAgIGlmIChwcmV2aW91c2x5U2VsZWN0ZWRJbmRleCAhPT0gLTEgJiYgcHJldmlvdXNseVNlbGVjdGVkSW5kZXggIT09IHNlbGVjdGVkSW5kZXgpIHtcbiAgICAgIHVuc2VsZWN0ZWRJdGVtID0gbGlzdFtwcmV2aW91c2x5U2VsZWN0ZWRJbmRleF07XG4gICAgfVxuICAgIGxpc3QuZm9yRWFjaCgoZWwsIGluZGV4KSA9PiB7XG4gICAgICBlbC5zZWxlY3RlU3RhdHVzID0gaW5kZXggPT09IHNlbGVjdGVkSW5kZXg7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSBsaXN0W3NlbGVjdGVkSW5kZXhdO1xuICAgIGNvbnN0IHNlbGVjdGVkUGxhbiA9IHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5maW5kKFxuICAgICAgKHBsYW46IGFueSkgPT4gcGxhbi5zdWJJZCA9PT0gcGFyZW50SXRlbS5zdWJzY3JpcHRpb25JZFxuICAgICk7XG5cbiAgICBpZiAoc2VsZWN0ZWRQbGFuKSB7XG4gICAgICBzZWxlY3RlZFBsYW4uZnJlcXVlbmN5ID0gc2VsZWN0ZWRJdGVtLm5hbWU7XG4gICAgfVxuXG4gICAgaWYgKHVuc2VsZWN0ZWRJdGVtKSB7XG4gICAgICBjb25zdCByZW1vdmVBbW91bnQgPSBwYXJlbnRJdGVtLnByaWNpbmdbdW5zZWxlY3RlZEl0ZW0ubmFtZV07XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoLTEsIHsgLi4udW5zZWxlY3RlZEl0ZW0sIGFtb3VudDogcmVtb3ZlQW1vdW50IH0pO1xuICAgIH1cblxuICAgIGlmIChzZWxlY3RlZEl0ZW0pIHtcbiAgICAgIGNvbnN0IGFkZEFtb3VudCA9IHBhcmVudEl0ZW0ucHJpY2luZ1tzZWxlY3RlZEl0ZW0ubmFtZV07XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgeyAuLi5zZWxlY3RlZEl0ZW0sIGFtb3VudDogYWRkQW1vdW50IH0pO1xuICAgIH1cblxuICB9XG5cbiAgaGFzQWN0aXZlU3Vic2NyaXB0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hZG1pc3Npb25EYXRhLnN1YnNjcmlwdGlvblBsYW5zLmxlbmd0aCA+IDBcbiAgfVxuXG4gIGRpc2FibGVTdWJzY3JpcHRpb25TZWxlY3Rpb24oaXRlbTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaXNzaW9uRGF0YS5zdWJzY3JpcHRpb25QbGFucy5zb21lKFxuICAgICAgKGVsZW06IGFueSkgPT4gZWxlbS5zdWJJZCA9PT0gaXRlbS5zdWJzY3JpcHRpb25JZFxuICAgICk7XG4gIH1cblxuICBhZGRpbmdUcmFuc3BvcnRGZWUoKSB7XG4gICAgaWYgKHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwuY2hhcmdlcy50ZXJtKSB7XG4gICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsLmNoYXJnZXMudGVybVBheW1lbnRMaXN0LmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LnNlbGVjdGVkKSB7XG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKDEsIGVsZW1lbnQpXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigxLCB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsLmNoYXJnZXMpXG4gICAgfVxuICB9XG4gIHJlbW92ZVRyYXNwb3J0RmVlKCkge1xuICAgIGlmICh0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsICE9IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsLmNoYXJnZXMudGVybSkge1xuICAgICAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsLmNoYXJnZXMudGVybVBheW1lbnRMaXN0LmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgZWxlbWVudClcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbC5jaGFyZ2VzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ2hlY2tib3hDaGFuZ2UoaXRlbTogYW55LCBldmVudDogYW55KSB7XG4gICAgLy8gaWYodGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbClcbiAgICB0aGlzLnJlbW92ZVRyYXNwb3J0RmVlKCk7XG4gICAgaWYgKGV2ZW50LmNoZWNrZWQpIHtcbiAgICAgIHRoaXMuYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgPSBpdGVtO1xuICAgICAgdGhpcy5hZGRpbmdUcmFuc3BvcnRGZWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0UGlja3VwVGltZShpdGVtOiBhbnkpIHtcbiAgICBjb25zdCBtYXRjaGVkSXRlbSA9IGl0ZW0uZmluZCgoZWxlbWVudDphbnkpID0+IGVsZW1lbnQuc3RvcC5pZCA9PT0gdGhpcy5zZWxlY3RlZFN0b3AuaWQpO1xuICAgIGNvbnN0IGlzb1RpbWUgPSBuZXcgRGF0ZShgMTk3MC0wMS0wMVQke21hdGNoZWRJdGVtLnBpY2t1cC5waWNrdXBUaW1lfWApO1xuICAgIHJldHVybiBtYXRjaGVkSXRlbSA/IGlzb1RpbWUgOiBudWxsO1xuICB9XG5cbiAgZ2V0RHJvcHRpbWUoaXRlbTogYW55KSB7XG4gICAgY29uc3QgbWF0Y2hlZEl0ZW0gPSBpdGVtLmZpbmQoKGVsZW1lbnQ6YW55KSA9PiBlbGVtZW50LnN0b3AuaWQgPT09IHRoaXMuc2VsZWN0ZWRTdG9wLmlkKTtcbiAgICBjb25zdCBpc29UaW1lID0gbmV3IERhdGUoYDE5NzAtMDEtMDFUJHttYXRjaGVkSXRlbS5kcm9wLmRyb3BUaW1lfWApO1xuICAgIHJldHVybiBtYXRjaGVkSXRlbSA/IGlzb1RpbWUgOiBudWxsO1xuICB9XG5cbiAgY2hhbmdlVHJhbnNwb3J0VGVybVZhbHVlKGl0ZW06IGFueSkge1xuICAgIGlmIChpdGVtLmNoYXJnZXMuc2VsZWN0ZWRUZXJtVmFsdWUgPT09ICdURVJNJykge1xuICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCBpdGVtLmNoYXJnZXMpXG4gICAgICBpdGVtLmNoYXJnZXMudGVybSA9IHRydWU7XG4gICAgICBpdGVtLmNoYXJnZXMucGFpZCA9IGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGl0ZW0uY2hhcmdlcy50ZXJtID0gZmFsc2U7XG4gICAgICBpdGVtLmNoYXJnZXMudGVybVBheW1lbnRMaXN0LmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LnNlbGVjdGVkKSB7XG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudFYyKC0xLCBlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50VjIoMSwgaXRlbS5jaGFyZ2VzKVxuICAgIH1cbiAgfVxuXG4gIGFkZFNpbmdsZVN0b3AoZXY6YW55LCBpdGVtOiBhbnkpIHtcbiAgICBpZiAoZXYudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigxLCBpdGVtKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnRWMigtMSwgaXRlbSlcbiAgICB9XG5cbiAgICB0aGlzLmFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsLmNoYXJnZXMudGVybVBheW1lbnRMaXN0LmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC50ZXJtSWQgPT0gaXRlbS50ZXJtSWQpIHtcbiAgICAgICAgZWxlbWVudC5zZWxlY3RlZCA9IGV2LnRhcmdldC5jaGVja2VkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuICBjYWxjdWxhdGVUb3RhbEFtb3VudFYyKGNhbDogbnVtYmVyLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICBcbiAgICBjb25zdCBhbW91bnQgPSB2YWx1ZS5hbW91bnQgPz8gdmFsdWUudGVybUFtb3VudCA/PyAwO1xuICBcbiAgICBpZiAoY2FsID09PSAtMSkge1xuICAgICAgdGhpcy5mZWVTdHJ1Y3R1cmUudG90YWxGZWUgLT0gYW1vdW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZlZVN0cnVjdHVyZS50b3RhbEZlZSArPSBhbW91bnQ7XG4gICAgfVxuICB9XG59XG4iLCI8IS0tIDxzZWN0aW9uIGNsYXNzPVwibWFpbi1zZWN0aW9uXCI+XG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nIGxlZnQtc2lkZVwiPlxuICAgICAgICBBZG1pc3Npb24gRmVlXG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImxlZnQtc2lkZSBtdC0xMFwiICpuZ0Zvcj1cImxldCBjb25maWdMaXN0IG9mIE9iamVjdC5rZXlzKGZlZUNvbmZpZylcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmcgbWItMjBcIj57e2NvbmZpZ0xpc3R9fTwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1zcGFjZSBtdC0xMCBtYi0xNVwiICpuZ0Zvcj1cImxldCBjb25maWcgb2YgZmVlQ29uZmlnW2NvbmZpZ0xpc3RdXCI+XG4gICAgICAgICAgPHAgY2xhc3M9XCJzdWItaGVhZGluZyBtYi0wXCI+e3tjb25maWcuZmVlSGVhZH19PC9wPlxuICAgICAgICAgIDxwIGNsYXNzPVwiYW1vdW50IG1iLTBcIj7igrkge3tjb25maWcuYW1vdW50fX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGUgbXQtMTBcIiAqbmdGb3I9XCJsZXQgdHlwZSBvZiBPYmplY3Qua2V5cyhzdWJzY3JpcHRpb25zKVwiPlxuICAgICAgICA8cCBjbGFzcz1cImhlYWRpbmdcIj57e3R5cGV9fTwvcD5cblxuICAgICAgICA8dGFibGUgY2xhc3M9XCJzdWJzY3JpcHRpb24tdGFibGUgdy0xMDBcIj5cbiAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICA8dGg+U3Vic2NyaXB0aW9uIFRpdGxlPC90aD5cbiAgICAgICAgICAgIDx0aD5Nb250aGx5PC90aD5cbiAgICAgICAgICAgIDx0aD5RdWF0ZXJseTwvdGg+XG4gICAgICAgICAgICA8dGg+WWVhcmx5PC90aD5cbiAgICAgICAgICAgIDx0aD5PbiBEZW1hbmQ8L3RoPlxuICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBkYXRhIG9mIHN1YnNjcmlwdGlvbnNbdHlwZV07bGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICA8dGQ+e3tkYXRhLnN1Yk5hbWV9fTwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiICpuZ0lmPVwiZGF0YS5wcmljaW5nWydRVUFSVEVSTFknXVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzdWJzY3JpcHRpb257e2l9fVwiICBbdmFsdWVdPVwiJ01PTlRITFknXCIgKGNsaWNrKT1cInRvZ2dsZVNlbGVjdGlvbihkYXRhLCAnTU9OVEhMWScpXCIgIFtjaGVja2VkXT1cImRhdGEuc2VsZWN0ZWRPcHRpb24gPT09ICdNT05USExZJ1wiICBbKG5nTW9kZWwpXT1cImRhdGEuc2VsZWN0ZWRPcHRpb25cIiBpZD1cImZsZXhSYWRpb0RlZmF1bHQyXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxuICAgICAgICAgICAgICAgICAgICDigrkge3tkYXRhLnByaWNpbmdbJ01PTlRITFknXX19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJkZWZhdWx0SW1hZ2VcIiAqbmdJZj1cIiFkYXRhLnByaWNpbmdbJ1FVQVJURVJMWSddXCIgW3NyY109XCJkZWZhdWx0SW1hZ2VcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiICpuZ0lmPVwiZGF0YS5wcmljaW5nWydNT05USExZJ11cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3Vic2NyaXB0aW9ue3tpfX1cIiBbdmFsdWVdPVwiJ1FVQVJURVJMWSdcIiAoY2xpY2spPVwidG9nZ2xlU2VsZWN0aW9uKGRhdGEsICdRVUFSVEVSTFknKVwiICBbY2hlY2tlZF09XCJkYXRhLnNlbGVjdGVkT3B0aW9uID09PSAnUVVBUlRFUkxZJ1wiIFsobmdNb2RlbCldPVwiZGF0YS5zZWxlY3RlZE9wdGlvblwiIGlkPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZsZXhDaGVja0NoZWNrZWRcIj5cbiAgICAgICAgICAgICAgICAgICAg4oK5IHt7ZGF0YS5wcmljaW5nWydRVUFSVEVSTFknXX19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImRlZmF1bHRJbWFnZVwiICpuZ0lmPVwiIWRhdGEucHJpY2luZ1snTU9OVEhMWSddXCIgW3NyY109XCJkZWZhdWx0SW1hZ2VcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCIgKm5nSWY9XCJkYXRhLnByaWNpbmdbJ0FOTlVBTExZJ11cIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiBuYW1lPVwic3Vic2NyaXB0aW9ue3tpfX1cIiBbdmFsdWVdPVwiJ0FOTlVBTExZJ1wiIChjbGljayk9XCJ0b2dnbGVTZWxlY3Rpb24oZGF0YSwgJ0FOTlVBTExZJylcIiAgW2NoZWNrZWRdPVwiZGF0YS5zZWxlY3RlZE9wdGlvbiA9PT0gJ0FOTlVBTExZJ1wiIFsobmdNb2RlbCldPVwiZGF0YS5zZWxlY3RlZE9wdGlvblwiIGlkPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZsZXhDaGVja0NoZWNrZWRcIj5cbiAgICAgICAgICAgICAgICAgICAg4oK5IHt7ZGF0YS5wcmljaW5nWydBTk5VQUxMWSddfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImRlZmF1bHRJbWFnZVwiICpuZ0lmPVwiIWRhdGEucHJpY2luZ1snQU5OVUFMTFknXVwiIFtzcmNdPVwiZGVmYXVsdEltYWdlXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiICpuZ0lmPVwiZGF0YS5wcmljaW5nWydPTkRFTUFORCddXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cInN1YnNjcmlwdGlvbnt7aX19XCIgW3ZhbHVlXT1cIidPTkRFTUFORCdcIiAoY2xpY2spPVwidG9nZ2xlU2VsZWN0aW9uKGRhdGEsICdPTkRFTUFORCcpXCIgIFtjaGVja2VkXT1cImRhdGEuc2VsZWN0ZWRPcHRpb24gPT09ICdPTkRFTUFORCdcIiBbKG5nTW9kZWwpXT1cImRhdGEuc2VsZWN0ZWRPcHRpb25cIiBpZD1cImZsZXhDaGVja0NoZWNrZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XG4gICAgICAgICAgICAgICAgICAgIOKCuSB7e2RhdGEucHJpY2luZ1snT05ERU1BTkQnXX19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJkZWZhdWx0SW1hZ2VcIiAqbmdJZj1cIiFkYXRhLnByaWNpbmdbJ09OREVNQU5EJ11cIiBbc3JjXT1cImRlZmF1bHRJbWFnZVwiIGFsdD1cIlwiPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICA8L3RhYmxlPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0LXNpZGUgbXQtMTBcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJoZWFkaW5nXCI+UGF5bWVudCBQbGFuPC9wPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZy0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiAoY2xpY2spPVwiY2hhbmdlQW5udWFsUGF5bWVudFRlcm0oJ0FOTlVBTExZJylcIj5cbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwicmFkaW9cIiB2YWx1ZT1cIlwiIG5hbWU9XCJwYXltZW50LXBsYW5cIiBpZD1cImZsZXhDaGVja0NoZWNrZWRcIiBbY2hlY2tlZF09XCJhZG1pc3Npb25EYXRhLnBheW1lbnRQbGFuVHlwZSA9PT0gJ0FOTlVBTExZJ1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZsZXhDaGVja0NoZWNrZWRcIj5cbiAgICAgICAgICAgICAgQW5udWFsbHlcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIiAoY2xpY2spPVwiY2hhbmdlQW5udWFsUGF5bWVudFRlcm0oJ1RFUk0nKVwiPlxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJyYWRpb1wiIHZhbHVlPVwiXCIgbmFtZT1cInBheW1lbnQtcGxhblwiIGlkPVwiZmxleENoZWNrQ2hlY2tlZFwiIFtjaGVja2VkXT1cImFkbWlzc2lvbkRhdGEucGF5bWVudFBsYW5UeXBlID09PSAnVEVSTSdcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XG4gICAgICAgICAgICAgIFRlcm1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZG1pc3Npb25cIiAqbmdJZj1cImFkbWlzc2lvbkRhdGEucGF5bWVudFBsYW5UeXBlID09PSAnVEVSTSdcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJpbnB1dC10ZXh0XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IGNsYXNzPVwiaW5wdXRTdHlsZVwiIHBsYWNlaG9sZGVyPVwiLS1TZWxlY3QtLVwiIG11bHRpcGxlPVwidHJ1ZVwiIFsobmdNb2RlbCldPVwiZmVlU3RydWN0dXJlLnRlcm1QYXltZW50TGlzdFwiIChuZ01vZGVsQ2hhbmdlKT1cImNhbGN1bGF0ZVRvdGFsQW1vdW50KClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdGVybSBvZiB0ZXJtUGF5bWVudExpc3RcIiBbdmFsdWVdPVwidGVybVwiPnRlcm0ge3t0ZXJtLnRlcm1OdW1iZXJ9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IHJpZ2h0LXNpZGVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nIG1iLTIwXCI+XG4gICAgICAgIEZlZSBDYWxjdWxhdGlvblxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktc3BhY2UgbXQtMTAgbWItMTVcIiAqbmdGb3I9XCJsZXQgY29uZmlnIG9mIGZlZVN0cnVjdHVyZS5mZWVDb25maWdzXCI+XG4gICAgICAgIDxwIGNsYXNzPVwic3ViLWhlYWRpbmcgbWItMFwiPnt7Y29uZmlnLmZlZUhlYWR9fTwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJhbW91bnQgbWItMFwiPuKCuSB7e2NvbmZpZy5hbW91bnR9fTwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktc3BhY2UgbXQtMTAgbWItMTVcIiAqbmdGb3I9XCJsZXQgc3Vic2NyaXBpdGlvbiBvZiBmZWVTdHJ1Y3R1cmUuc3Vic2NyaXB0aW9uUGxhbnNcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJzdWItaGVhZGluZyBtYi0wXCI+e3tzdWJzY3JpcGl0aW9uLnN1Yk5hbWV9fTwvcD5cbiAgICAgICAgPHAgY2xhc3M9XCJhbW91bnQgbWItMFwiPuKCuSB7e3N1YnNjcmlwaXRpb24ucHJpY2luZ1tzdWJzY3JpcGl0aW9uLmZyZXF1ZW5jeV19fTwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwidG90YWwtZmVlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nIG1iLTVcIj5cbiAgICAgICAgICBUb3RhbCBGZWVcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbW91bnRcIj5cbiAgICAgICAgICDigrkge3tmZWVTdHJ1Y3R1cmUudG90YWxBbW91bnR9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvc2VjdGlvbj4gLS0+XG5cblxuPHNlY3Rpb24gY2xhc3M9XCJtYWluX3BheW1lbnRfZGV0YWlsc19zZWN0aW9uIGgtMTAwIHctMTAwIHAtMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cbiAgPGRpdiBjbGFzcz1cImxlZnRfcGF5bWVudF9kZXRhaWxzIGgtMTAwIHAtMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJmZWVzX3NlY3Rpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWNfdGl0bGVcIj5cbiAgICAgICAgRmVlc1xuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibXQtMiBhbGxfZmVlX2NvbmZpZ3NcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmZWVTdHJ1Y3R1cmU/LmZlZUNvbmZpZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGVfZmVlX2NvbmZpZyBwLTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVfdGl0bGVcIj57e2l0ZW0uZmVlSGVhZCA/IGl0ZW0uZmVlSGVhZC5uYW1lIDogJ04vQSd9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVlX2Ftb3VudFwiPuKCuSB7e2l0ZW0uYW1vdW50fX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0udGVybXNMaXN0Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYW5nZV9zZWxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWdyb3VwIGFyaWEtbGFiZWw9XCJTZWxlY3QgYW4gb3B0aW9uXCIgWyhuZ01vZGVsKV09XCJpdGVtLnNlbGVjdGVkVGVybVZhbHVlXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwidGVybU9wdGlvbl97eyBpdGVtLmZlZUhlYWQuaWR9fVwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZVRlcm1WYWx1ZShpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gdmFsdWU9XCJTSU5HTEVcIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtmb250LXNpemU6MTNweFwiPlNpbmdsZTwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwiVEVSTVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpO2ZvbnQtc2l6ZToxM3B4XCI+VGVybTwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXJtQ291bnRcIiAqbmdJZj1cIml0ZW0uc2VsZWN0ZWRUZXJtVmFsdWUgPT09ICdURVJNJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja19kYXRhXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0ZXJtIG9mIGl0ZW0udGVybXNMaXN0O2xldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZURhdGEgZC1mbGV4IGdhcC0zIGFsaWduLWl0ZW1zLWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2hhbmdlKT1cImFkZFRlcm1zKCRldmVudCx0ZXJtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhX3ZhbHVlXCI+e3tnZXRPcmRpbmFsU3VmZml4KGkrMSl9fSBUZXJtICjigrkge3t0ZXJtPy50ZXJtQW1vdW50fX0pPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic3Vic2NyaXB0aW9uc19saXN0IG10LTNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5UcmFuc3BvcnQgRmVlPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGluZ190eXBlcyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDozMCVcIj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJpbnB1dF9jYXJkIG10LTIgdy0xMDBcIiBzdHlsZT1cImhlaWdodDo0MHB4XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWxlY3QgU3RvcFwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b0dyYWRlXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RvcFNlYXJjaFRleHRcIiAoaW5wdXQpPVwiZmlsdGVyU3RvcHMoKVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMTNweDtmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG9HcmFkZT1cIm1hdEF1dG9jb21wbGV0ZVwiIChvcHRpb25TZWxlY3RlZCk9XCJvblN0b3BTZWxlY3Rpb24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHN0b3Agb2YgZmlsdGVyZWRTdG9wc0xpc3RcIiBbdmFsdWVdPVwic3RvcC5zdG9wTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxM3B4O2ZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgc3RvcC5zdG9wTmFtZSB8IHRpdGxlY2FzZSB9fVxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOjMwJVwiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImlucHV0X2NhcmQgbXQtMiB3LTEwMFwiIHN0eWxlPVwiaGVpZ2h0OjQwcHhcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIlNlbGVjdCBWZWhpY2xlIFR5cGVcIiBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9HcmFkZTFcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2ZWhpY2xlVHlwZVNlYXJjaFRleHRcIiAoaW5wdXQpPVwiZmlsdGVyZVZlaGljbGVUeXBlcygpXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxM3B4O2ZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0b0dyYWRlMT1cIm1hdEF1dG9jb21wbGV0ZVwiIChvcHRpb25TZWxlY3RlZCk9XCJvblZlaGljbGVUeXBlU2VsZWN0aW9uKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBzdG9wIG9mIGZpbHRlcmVkVmVoaWNsZVR5cGVzTGlzdFwiIFt2YWx1ZV09XCJzdG9wLnZlaGljbGVUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDEzcHg7Zm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpO1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyBzdG9wLnZlaGljbGVUeXBlIHwgdGl0bGVjYXNlIH19XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdF9hbGxfc3Vic2NyaXB0aW9ucyBtdC0yXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiByb3V0ZVZhbHVlc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZV9mZWVfY29uZmlnIHAtM1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2NoZWNrZWRdPVwiYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgPT09IGl0ZW1cIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2hhbmdlKGl0ZW0sICRldmVudClcIj48L21hdC1jaGVja2JveD5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCIgc3R5bGU9XCJ3aWR0aDo5MiVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVfdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgaXRlbS50cmFuc3BvcnQucm91dGUgPyBpdGVtLnRyYW5zcG9ydC5yb3V0ZS5uYW1lIDogJ04vQScgfX1cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+KDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpO1wiPlBpY2t1cCBUaW1lIDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktc2VtaS1ib2xkLWZvbnQtZmFtaWx5KTtcIj57e2dldFBpY2t1cFRpbWUoaXRlbS50cmFuc3BvcnQuYnVzUm91dGVTdG9wVGltaW5ncylcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgZGF0ZTonaDptbSBhJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIC1cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OiB2YXIoLS1wcmltYXJ5LWZvbnQtZmFtaWx5KTtcIj5Ecm9wIFRpbWUgOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6MTJweDtmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1zZW1pLWJvbGQtZm9udC1mYW1pbHkpO1wiPnt7Z2V0RHJvcHRpbWUoaXRlbS50cmFuc3BvcnQuYnVzUm91dGVTdG9wVGltaW5ncylcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgZGF0ZTonaDptbSBhJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVfYW1vdW50XCI+4oK5IHt7IGl0ZW0uY2hhcmdlcy50b3RhbEFtb3VudCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbT8uY2hhcmdlcy50ZXJtUGF5bWVudExpc3QubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGFuZ2Vfc2VsZWN0aW9uXCIgc3R5bGU9XCJ3aWR0aDo5MCU7bWFyZ2luOjAgYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBhcmlhLWxhYmVsPVwiU2VsZWN0IGFuIG9wdGlvblwiIFsobmdNb2RlbCldPVwiaXRlbS5jaGFyZ2VzLnNlbGVjdGVkVGVybVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VUcmFuc3BvcnRUZXJtVmFsdWUoaXRlbSlcIiBbZGlzYWJsZWRdPVwiYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWwgIT09IGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gdmFsdWU9XCJTSU5HTEVcIlxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1mYW1pbHk6IHZhcigtLXByaW1hcnktZm9udC1mYW1pbHkpOyBmb250LXNpemU6IDEzcHhcIj5TaW5nbGU8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwiVEVSTVwiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LWZhbWlseTogdmFyKC0tcHJpbWFyeS1mb250LWZhbWlseSk7IGZvbnQtc2l6ZTogMTNweFwiPlRlcm08L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXJtQ291bnRcIiAqbmdJZj1cIml0ZW0uY2hhcmdlcy5zZWxlY3RlZFRlcm1WYWx1ZSA9PT0gJ1RFUk0nXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tfZGF0YVwiIHN0eWxlPVwid2lkdGg6NzUlO21hcmdpbjowIGF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGVybSBvZiBpdGVtLmNoYXJnZXMudGVybVBheW1lbnRMaXN0OyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZURhdGEgZC1mbGV4IGdhcC0zIGFsaWduLWl0ZW1zLWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIChjaGFuZ2UpPVwiYWRkU2luZ2xlU3RvcCgkZXZlbnQsIHRlcm0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsICE9PSBpdGVtXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhX3ZhbHVlXCI+e3sgZ2V0T3JkaW5hbFN1ZmZpeChpICsgMSkgfX0gVGVybSAo4oK5IHt7dGVybS50ZXJtQW1vdW50fX0pPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb25zX2xpc3QgbXQtM1wiICpuZ0lmPVwic3Vic2NyaXB0aW9uc0RhdGEubGVuZ3RoID4gMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj5TdWJzY3JpcHRpb25zPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X2FsbF9zdWJzY3JpcHRpb25zIG10LTJcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHN1YnNjcmlwdGlvbnNEYXRhXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wXzFcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFtjaGVja2VkXT1cImlzU3Vic2NyaXB0aW9uU2VsZWN0ZWQoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblN1YnNjcmlwdGlvbkl0ZW1DaGFuZ2UoJGV2ZW50LCBpdGVtKVwiPjwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb25fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIHt7aXRlbS5zdWJzY3JpcHRpb25UaXRsZX19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Vic2NyaXB0aW9uX3R5cGVzXCIgc3R5bGU9XCJ3aWR0aDo4NSU7bWFyZ2luOmF1dG9cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJWIG9mIGl0ZW0ubmV3UHJpY2luZ0xpc3Q7bGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNpbmdsZV9zdWJzY3JwdGlvbiBkLWZsZXggZ2FwLTIgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlX3RpdGxlIGQtZmxleCBnYXAtMyBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cIndpZHRoOjI1JVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBbY2hlY2tlZF09XCJzdWJWLnNlbGVjdGVTdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTdWJzY3JpcHRpb25TZWxlY3Rpb24oaXRlbS5uZXdQcmljaW5nTGlzdCwgaSwgaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFkaXNhYmxlU3Vic2NyaXB0aW9uU2VsZWN0aW9uKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGFfdmFsdWVcIj57e3N1YlYubmFtZSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlX3ZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3tzdWJWLmFtb3VudH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicmlnaHRfcGF5bWVudF9kZXRhaWxzIGgtMTAwXCI+XG4gICAgPGRpdiBjbGFzcz1cInRvdGFsX3BheW1lbnRfZGV0YWlscyBoLTEwMCB3LTEwMCBwLTNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIGNhbGN1bGF0aW9uX3RhYmxlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxjdWxhdGlvbl9zaW5nbGVfcGFydFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3RhbF90aXRsZVwiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZWRlZGU7cGFkZGluZy1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgICBUb3RhbCBBY2FkZW1pYyBGZWUgQnJlYWtkb3duXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmZWVTdHJ1Y3R1cmUuZmVlQ29uZmlnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiIHN0eWxlPVwibWFyZ2luLXRvcDogOHB4O1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmVlX3RpdGxlXCI+e3tpdGVtLmZlZUhlYWQgPyBpdGVtLmZlZUhlYWQubmFtZSA6ICdOL0EnfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV9hbW91bnRcIiAqbmdJZj1cIml0ZW0udGVybXNMaXN0Lmxlbmd0aCA9PT0gMCB8fCBpdGVtLnNlbGVjdGVkVGVybVZhbHVlICE9ICdURVJNJ1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cIihpdGVtPy5jb25jZXNzaW9uICE9IG51bGwgJiYgaXRlbT8uY29uY2Vzc2lvbj8ubGVuZ3RoICE9IDApID8gJ3N0cmlrZXRocm91Z2gnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgIOKCuSB7e2l0ZW0uYW1vdW50fX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5jb25jZXNzaW9uICE9IG51bGwgJiYgaXRlbT8uY29uY2Vzc2lvbi5sZW5ndGggIT0gMFwiPih7e2l0ZW0uYXBwbGllZENvbmNlc3Npb25BbW91bnR9fSk8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUgZnctNTAwXCIgKm5nSWY9XCJpdGVtLnRlcm1zTGlzdC5sZW5ndGggPj0gMFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZV90ZXJtc1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRhdGEgb2YgaXRlbS50ZXJtc0xpc3RcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZF9zaW5nbGVfdGVybSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCIgKm5nSWY9XCJkYXRhLnNlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICBUZXJtIHt7ZGF0YS50ZXJtTnVtYmVyfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBmdy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICDigrkge3tkYXRhLnRlcm1BbW91bnR9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGN1bGF0aW9uX3NpbmdsZV9wYXJ0XCIgKm5nSWY9XCJhZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbCAhPSBudWxsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRvdGFsX3RpdGxlXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RlZGVkZTtwYWRkaW5nLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgICAgIFRyYW5zcG9ydCBGZWVcbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDtcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV90aXRsZVwiPnt7YWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXM/LnZlaGljbGVUeXBlID9cbiAgICAgICAgICAgICAgICBhZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbD8uY2hhcmdlcz8udmVoaWNsZVR5cGU/Lm5hbWUgOiAnTi9BJ319PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmZWVfYW1vdW50XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsPy5jaGFyZ2VzPy50ZXJtUGF5bWVudExpc3Q/Lmxlbmd0aCA9PT0gMCB8fCBhZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbD8uY2hhcmdlcz8uc2VsZWN0ZWRUZXJtVmFsdWUgIT0gJ1RFUk0nXCI+XG4gICAgICAgICAgICAgICAg4oK5XG4gICAgICAgICAgICAgICAge3thZG1pc3Npb25EYXRhLnNlbGVjdGVkU3RvcERldGFpbD8uY2hhcmdlcz8udG90YWxBbW91bnR9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlIGZ3LTUwMFwiICpuZ0lmPVwiYWRtaXNzaW9uRGF0YS5zZWxlY3RlZFN0b3BEZXRhaWw/LmNoYXJnZXM/LnRlcm1QYXltZW50TGlzdD8ubGVuZ3RoID49IDBcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVfdGVybXNcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkYXRhIG9mIGFkbWlzc2lvbkRhdGEuc2VsZWN0ZWRTdG9wRGV0YWlsPy5jaGFyZ2VzPy50ZXJtUGF5bWVudExpc3RcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZF9zaW5nbGVfdGVybSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRhLnNlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICBUZXJtIHt7ZGF0YS50ZXJtTnVtYmVyfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZSBmdy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICDigrkge3tkYXRhLnRlcm1BbW91bnR9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGN1bGF0aW9uX3NpbmdsZV9wYXJ0XCIgKm5nSWY9XCJoYXNBY3RpdmVTdWJzY3JpcHRpb25zKClcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibmV3X3RpdGxlIG10LTJcIiBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGVkZWRlO3BhZGRpbmctYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgICAgU3Vic2NyaXB0aW9uc1xuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0aW5nX3NlbGVjdGVkX3N1c2NyaXB0aW9ucyBtdC0yXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGFkbWlzc2lvbkRhdGEuc3Vic2NyaXB0aW9uUGxhbnNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZlZV90aXRsZVwiPnt7aXRlbS5zdWJOYW1lIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlX3BheW1lbnRfY2FsY3VsYXRpb24gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0xXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2V5XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7aXRlbS5mcmVxdWVuY3kgfCB0aXRsZWNhc2V9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsdWUgZnctNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIOKCuSB7e2l0ZW0ucHJpY2luZ1tpdGVtLmZyZXF1ZW5jeV19fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyX3NlY3Rpb24gdG90YWxfY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXJfdGl0bGVcIj5HcmFuZCBUb3RhbCBGZWU8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIOKCuSB7e2ZlZVN0cnVjdHVyZT8udG90YWxGZWV9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvc2VjdGlvbj4iXX0=