simpo-component-library 1.8.97 → 1.8.99

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. package/README.md +24 -24
  2. package/esm2022/lib/components/delete-hover-element/delete-hover-element.component.mjs +3 -3
  3. package/esm2022/lib/components/image-loading/image-loading.component.mjs +3 -3
  4. package/esm2022/lib/constants/business.constant.mjs +1 -1
  5. package/esm2022/lib/directive/blur-content.directive.mjs +1 -1
  6. package/esm2022/lib/directive/borderlessImage.directive.mjs +1 -1
  7. package/esm2022/lib/directive/button-directive.directive.mjs +1 -1
  8. package/esm2022/lib/directive/color.directive.mjs +1 -1
  9. package/esm2022/lib/directive/column-directive.directive.mjs +1 -1
  10. package/esm2022/lib/directive/container-alignment.directive.mjs +1 -1
  11. package/esm2022/lib/directive/container-fir.directive.mjs +1 -1
  12. package/esm2022/lib/directive/content-title-spacing.directive.mjs +1 -1
  13. package/esm2022/lib/directive/corner-directive.mjs +1 -1
  14. package/esm2022/lib/directive/hoverborder.directive.mjs +1 -1
  15. package/esm2022/lib/directive/image-container.directive.mjs +1 -1
  16. package/esm2022/lib/directive/image-directive.directive.mjs +1 -1
  17. package/esm2022/lib/directive/image-position.directive.mjs +1 -1
  18. package/esm2022/lib/directive/position-layout-directive.directive.mjs +1 -1
  19. package/esm2022/lib/directive/spacing-horizontal.directive.mjs +1 -1
  20. package/esm2022/lib/directive/sticky-directive.mjs +1 -1
  21. package/esm2022/lib/directive/text-background-directive.directive.mjs +1 -1
  22. package/esm2022/lib/directive/text-size.directive.mjs +1 -1
  23. package/esm2022/lib/directive/wrap-containers.directive.mjs +1 -1
  24. package/esm2022/lib/ecommerce/sections/address/address.component.mjs +3 -3
  25. package/esm2022/lib/ecommerce/sections/authenticate-user/authenticate-user.component.mjs +3 -3
  26. package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.component.mjs +3 -3
  27. package/esm2022/lib/ecommerce/sections/cart/cart.component.mjs +5 -4
  28. package/esm2022/lib/ecommerce/sections/cart/cart.modal.mjs +1 -1
  29. package/esm2022/lib/ecommerce/sections/category-product/category-product.component.mjs +3 -3
  30. package/esm2022/lib/ecommerce/sections/category-product/category-product.model.mjs +1 -1
  31. package/esm2022/lib/ecommerce/sections/checkout/checkout.component.mjs +3 -3
  32. package/esm2022/lib/ecommerce/sections/checkout/checkout.modal.mjs +1 -1
  33. package/esm2022/lib/ecommerce/sections/customer-review/customer-review.component.mjs +3 -3
  34. package/esm2022/lib/ecommerce/sections/customer-review/customer-review.model.mjs +1 -1
  35. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.component.mjs +3 -3
  36. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.modal.mjs +1 -1
  37. package/esm2022/lib/ecommerce/sections/featured-category/featured-collection.component.mjs +3 -3
  38. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.component.mjs +3 -3
  39. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.modal.mjs +1 -1
  40. package/esm2022/lib/ecommerce/sections/item-varient/item-varient.component.mjs +3 -3
  41. package/esm2022/lib/ecommerce/sections/order-details/order-details.component.mjs +3 -3
  42. package/esm2022/lib/ecommerce/sections/pagnination/pagnination.component.mjs +3 -3
  43. package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.component.mjs +3 -3
  44. package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.model.mjs +1 -1
  45. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.component.mjs +3 -3
  46. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.modal.mjs +1 -1
  47. package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +3 -3
  48. package/esm2022/lib/ecommerce/sections/product-list/product-list.modal.mjs +1 -1
  49. package/esm2022/lib/ecommerce/sections/small-product-listing/small-product-listing.component.mjs +3 -3
  50. package/esm2022/lib/ecommerce/sections/user-basic-info/user-basic-info.component.mjs +3 -3
  51. package/esm2022/lib/ecommerce/sections/user-profile/user-profile.component.mjs +3 -3
  52. package/esm2022/lib/ecommerce/sections/user-profile/user-profile.modal.mjs +1 -1
  53. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.component.mjs +3 -3
  54. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.model.mjs +1 -1
  55. package/esm2022/lib/ecommerce/sections/whislist/whislist.component.mjs +3 -3
  56. package/esm2022/lib/ecommerce/styles/BaseCollection.modal.mjs +1 -1
  57. package/esm2022/lib/ecommerce/styles/Collection.modal.mjs +1 -1
  58. package/esm2022/lib/ecommerce/styles/OrderedItems.modal.mjs +1 -1
  59. package/esm2022/lib/ecommerce/styles/PincodeLocation.model.mjs +1 -1
  60. package/esm2022/lib/ecommerce/styles/PincodeLocationInter.model.mjs +1 -1
  61. package/esm2022/lib/ecommerce/styles/cart.modal.mjs +1 -1
  62. package/esm2022/lib/ecommerce/styles/category.modal.mjs +1 -1
  63. package/esm2022/lib/ecommerce/styles/order.modal.mjs +1 -1
  64. package/esm2022/lib/ecommerce/styles/product.modal.mjs +1 -1
  65. package/esm2022/lib/ecommerce/styles/review.modal.mjs +1 -1
  66. package/esm2022/lib/ecommerce/styles/user.modal.mjs +1 -1
  67. package/esm2022/lib/elements/below-image-card/below-image-card.component.mjs +3 -3
  68. package/esm2022/lib/elements/button/button.component.mjs +3 -3
  69. package/esm2022/lib/elements/button/button.model.mjs +1 -1
  70. package/esm2022/lib/elements/card-skeleton-loader/card-skeleton-loader.component.mjs +3 -3
  71. package/esm2022/lib/elements/covering-image-card/covering-image-card.component.mjs +3 -3
  72. package/esm2022/lib/elements/heading-element/heading-element.component.mjs +3 -3
  73. package/esm2022/lib/elements/index.mjs +1 -1
  74. package/esm2022/lib/elements/simpo-button/simpo-button.component.mjs +3 -3
  75. package/esm2022/lib/elements/text/text.component.mjs +3 -3
  76. package/esm2022/lib/elements/top-of-image-card/top-of-image-card.component.mjs +3 -3
  77. package/esm2022/lib/pipes/amount.pipe.mjs +1 -1
  78. package/esm2022/lib/pipes/gender.pipe.mjs +1 -1
  79. package/esm2022/lib/sections/BaseSection.mjs +1 -1
  80. package/esm2022/lib/sections/add-new-section/add-new-section.component.mjs +3 -3
  81. package/esm2022/lib/sections/appointment-form/appointment-form.component.mjs +3 -3
  82. package/esm2022/lib/sections/appointment-form/appointment-form.model.mjs +1 -1
  83. package/esm2022/lib/sections/banner-carousel/banner-carousel.component.mjs +3 -3
  84. package/esm2022/lib/sections/banner-carousel/banner-carousel.model.mjs +1 -1
  85. package/esm2022/lib/sections/banner-grid-section/banner-grid-section.component.mjs +3 -3
  86. package/esm2022/lib/sections/blog-list/blog-list.component.mjs +3 -3
  87. package/esm2022/lib/sections/blog-list/blog-list.model.mjs +1 -1
  88. package/esm2022/lib/sections/choose-us-section/choose-us-section.component.mjs +3 -3
  89. package/esm2022/lib/sections/choose-us-section/choose-us-section.model.mjs +1 -1
  90. package/esm2022/lib/sections/faq-section/faq-section.component.mjs +3 -3
  91. package/esm2022/lib/sections/faq-section/faq-section.modal.mjs +1 -1
  92. package/esm2022/lib/sections/features-section/features-section.component.mjs +3 -3
  93. package/esm2022/lib/sections/features-section/features-section.model.mjs +1 -1
  94. package/esm2022/lib/sections/header-text/header-text.component.mjs +3 -3
  95. package/esm2022/lib/sections/header-text/header-text.model.mjs +1 -1
  96. package/esm2022/lib/sections/image-carousel-section/image-carousel-section.component.mjs +3 -3
  97. package/esm2022/lib/sections/image-carousel-section/image-carousel.model.mjs +1 -1
  98. package/esm2022/lib/sections/image-grid-section/image-grid-section.component.mjs +3 -3
  99. package/esm2022/lib/sections/image-grid-section/image-grid-section.model.mjs +1 -1
  100. package/esm2022/lib/sections/image-section/image-section.component.mjs +3 -3
  101. package/esm2022/lib/sections/image-section/image-section.model.mjs +1 -1
  102. package/esm2022/lib/sections/location-section/location-section.component.mjs +3 -3
  103. package/esm2022/lib/sections/location-section/location-section.modal.mjs +1 -1
  104. package/esm2022/lib/sections/logo-showcase/logo-showcase.component.mjs +3 -3
  105. package/esm2022/lib/sections/logo-showcase/logo-showcase.modal.mjs +1 -1
  106. package/esm2022/lib/sections/pricing-section/pricing-section.component.mjs +3 -3
  107. package/esm2022/lib/sections/pricing-section/pricing-section.modal.mjs +1 -1
  108. package/esm2022/lib/sections/process-modern/process-modern.component.mjs +3 -3
  109. package/esm2022/lib/sections/process-modern/process-modern.model.mjs +1 -1
  110. package/esm2022/lib/sections/process-section/process-section.component.mjs +3 -3
  111. package/esm2022/lib/sections/process-section/process-section.modal.mjs +1 -1
  112. package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.component.mjs +3 -3
  113. package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.model.mjs +1 -1
  114. package/esm2022/lib/sections/service-section/service-section.component.mjs +3 -3
  115. package/esm2022/lib/sections/service-section/service-section.model.mjs +1 -1
  116. package/esm2022/lib/sections/skeleton-loader-section/skeleton-loader-section.component.mjs +3 -3
  117. package/esm2022/lib/sections/team-member-section/team-member-section.component.mjs +3 -3
  118. package/esm2022/lib/sections/team-member-section/team-member-section.model.mjs +1 -1
  119. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.component.mjs +3 -3
  120. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.model.mjs +1 -1
  121. package/esm2022/lib/sections/testimonial-section/testimonial-section.component.mjs +3 -3
  122. package/esm2022/lib/sections/testimonial-section/testimonial-section.model.mjs +1 -1
  123. package/esm2022/lib/sections/testimonial-video/testimonial-video.component.mjs +3 -3
  124. package/esm2022/lib/sections/testimonial-video/testimonial-video.model.mjs +1 -1
  125. package/esm2022/lib/sections/text-section/text-section.model.mjs +1 -1
  126. package/esm2022/lib/sections/video-section/video-section.component.mjs +3 -3
  127. package/esm2022/lib/sections/video-section/video-section.model.mjs +1 -1
  128. package/esm2022/lib/sections/view-blog/view-blog.component.mjs +3 -3
  129. package/esm2022/lib/services/cart.service.mjs +1 -1
  130. package/esm2022/lib/services/endUser.service.mjs +1 -1
  131. package/esm2022/lib/services/rest.service.mjs +1 -1
  132. package/esm2022/lib/services/sanitizeHtml.mjs +1 -1
  133. package/esm2022/lib/services/storage.service.mjs +1 -1
  134. package/esm2022/lib/styles/index.mjs +1 -1
  135. package/esm2022/lib/styles/style.model.mjs +1 -1
  136. package/esm2022/lib/styles/types.mjs +1 -1
  137. package/esm2022/public-api.mjs +1 -1
  138. package/fesm2022/simpo-component-library.mjs +114 -113
  139. package/fesm2022/simpo-component-library.mjs.map +1 -1
  140. package/package.json +1 -1
  141. package/simpo-component-library-1.8.99.tgz +0 -0
  142. package/simpo-component-library-1.8.97.tgz +0 -0
@@ -429,7 +429,7 @@ export class ProductDescComponent extends BaseSection {
429
429
  return window.innerWidth <= 475;
430
430
  }
431
431
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: ProductDescComponent, deps: [{ token: PLATFORM_ID }, { token: i1.EventsService }, { token: i2.Router }, { token: i2.ActivatedRoute }, { token: i3.RestService }, { token: i4.CartService }, { token: i5.StorageServiceService }, { token: i6.MessageService }, { token: i7.Meta }, { token: i7.Title }, { token: i8.MatBottomSheet }], target: i0.ɵɵFactoryTarget.Component }); }
432
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.4", type: ProductDescComponent, isStandalone: true, selector: "simpo-product-desc", inputs: { data: "data", responseData: "responseData", index: "index", edit: "edit", delete: "delete", customClass: "customClass" }, host: { listeners: { "window: resize": "getScreenSize($event)" } }, providers: [MessageService], viewQueries: [{ propertyName: "reviewComponent", first: true, predicate: CustomerReviewComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!isLoading\">\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <section class=\"total-container\" [id]=\"data?.id\" [simpoLayout]=\"styles?.layout\" [simpoBackground]=\"styles?.background\"\r\n simpoHover (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\" >\r\n\r\n <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\r\n </div>\r\n <section class=\"container\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\">\r\n <div><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\" (click)=\"routeToHome()\">Home</a> /\r\n <span>{{ responseData?.name | titlecase }}</span>\r\n </div>\r\n <div class=\"row h-100\" style=\"margin-top: 25px;\" class=\"above-height\" [ngStyle]=\"{'min-height: 95vh': isMobile, 'max-width: 95vh': !isMobile}\">\r\n <div class=\"col-lg-6 col-12 h-100\" class=\"height\">\r\n <div class=\"prod-img-block\">\r\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-12 h-100 product-detail\">\r\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div>\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n\r\n <!-- [attr.class]=\"!isVarientAvailable(varient) ? 'varient-tag disable-varient' : 'varient-tag'\" -->\r\n <div *ngFor=\"let varientValue of varient.value\"\r\n class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"product-desc body-large d-block trim-text\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData.brief\"></div>\r\n <div class=\"product-sku\">\r\n <div *ngIf=\"responseData?.itemInventory\">SKU : {{responseData.itemInventory?.openingStock}}</div>\r\n <div *ngIf=\"responseData?.itemCategorisation?.itemCategories && (responseData?.itemCategorisation?.itemCategories?.length || 0) > 0\">Category : <a href=\"javascript:void(0)\"\r\n (click)=\"goToFilter(cat.refName)\"\r\n *ngFor=\"let cat of responseData?.itemCategorisation?.itemCategories;let idx = index\">{{cat.refName |\r\n titlecase}} <ng-container\r\n *ngIf=\"(idx+1) != responseData?.itemCategorisation?.itemCategories?.length\">,</ng-container>\r\n </a></div>\r\n <div *ngIf=\"(responseData?.itemCategorisation?.productTags?.length || 0) > 0\">Tags : <span\r\n *ngFor=\"let tag of responseData?.itemCategorisation?.productTags\">{{tag.tagName}},\r\n </span></div>\r\n </div>\r\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\r\n <!-- <ng-container>\r\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\r\n </ng-container> -->\r\n </div>\r\n </div>\r\n <div class=\"row prod-desc\" *ngIf=\"responseData?.descriptor?.name\">\r\n <div class=\"tab-group\">\r\n <div class=\"tab\">Description</div>\r\n </div>\r\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name\"></div>\r\n </div>\r\n </section>\r\n <ng-container *ngIf=\"relatedProductData?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"relatedProductData\"\r\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\r\n </ng-container>\r\n <ng-container *ngIf=\"recentViewItemList?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\r\n [isRelatedProduct]=\"true\"></simpo-featured-products>\r\n </ng-container>\r\n <!-- <ng-container>\r\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\r\n </ng-container> -->\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '40vh',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n}\">\r\n</ngx-skeleton-loader>\r\n\r\n\r\n<div class=\"mobile-footer\">\r\n <div class=\"icons\">\r\n <div (click)=\"goToCart()\">\r\n <mat-icon>shopping_cart</mat-icon>\r\n </div>\r\n <div>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n <!-- <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">bookmark</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">bookmark_border</mat-icon> -->\r\n </div>\r\n </div>\r\n <div class=\"out-of-stock\" *ngIf=\"isItemOutOfStock\">Out of Stock</div>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !isItemOutOfStock\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center\">{{responseData.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\">+</div>\r\n </div>\r\n <button class=\"add-btn\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [color]=\"data?.styles?.background?.accentColor\" (click)=\"addToCart()\"\r\n *ngIf=\"!responseData?.quantity && !isItemOutOfStock\">{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n</div>\r\n\r\n<ng-template #ReviewSection>\r\n <div class=\"review-sec\">\r\n <div class=\"title\">Customer Review</div>\r\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\r\n <span>Be the first to write a review</span>\r\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [color]=\"data?.styles?.background?.accentColor\" [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add Review' : 'Cancel Review'}}</button>\r\n <ng-container *ngIf=\"showReview\">\r\n <hr />\r\n <div class=\"user-review\">\r\n <div class=\"title\">Write a review</div>\r\n <span class=\"secondary-text\">RATING</span>\r\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\r\n <div>\r\n <span class=\"secondary-text\">Review Title</span>\r\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\r\n </div>\r\n <div>\r\n <span class=\"secondary-text\">Review</span>\r\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\r\n </div>\r\n <div class=\"review-action-btn\">\r\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\" [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\r\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [color]=\"data?.styles?.background?.accentColor\" (click)=\"addProductReview()\" [disabled]=\"productReview == 0 && reviewTitle?.length == 0 && reviewDescription?.length == 0\">Submit review</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #SocialIcons>\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\r\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\r\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\r\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\r\n <div style=\"position: relative;margin-right: 10px;\">\r\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\" [sectionId]=\"data?.id\"></simpo-socia-icons>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #ActionBtn>\r\n <div class=\"button-parent\">\r\n <div class=\"out-of-stock\" *ngIf=\"isItemOutOfStock\">Out of Stock</div>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center\">{{responseData.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\">+</div>\r\n </div>\r\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\">\r\n <button class=\"send-btn\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"addToCart()\">{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n <div class=\"favourite\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #ProductDesc>\r\n <div class=\"heading-large trim-text\" class=\"product-heading\" >{{responseData?.name}}</div>\r\n <div class=\"d-flex\" style=\"gap: 10px; align-items: center; margin-top: 15px;\">\r\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\r\n *ngIf=\"responseData?.price?.discountedPrice != responseData?.price?.value\"><span [innerHTML]='currency'></span>\r\n {{responseData?.price?.value}}</div>\r\n <div class=\"price\" *ngIf=\"responseData?.price?.discountedPrice\"><span [innerHTML]='currency'></span>\r\n {{responseData?.price?.discountedPrice}}</div>\r\n <div class=\"tax-text\">(excluding all taxes)</div>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #ImageSection>\r\n <ng-container *ngIf=\"!varientLoading\">\r\n <div class=\"img-list\" *ngIf=\"screenWidth > 500\">\r\n <ng-container *ngFor=\"let img of itemImages\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\r\n alt=\"\" class=\"img\" (click)=\"changeImg(img.imgUrl)\"\r\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\r\n </ng-container>\r\n </div>\r\n <div class=\"item-img\">\r\n <ng-container *ngIf=\"currentImg\">\r\n\r\n <mat-icon class=\"share-icon\" (click)=\"shareProduct()\">share</mat-icon>\r\n <ng-container *ngIf=\"!isMobile\">\r\n <lib-ngx-image-zoom [thumbImage]=\"currentImg\" [fullImage]=\"currentImg\" [zoomMode]=\"'hover'\" [magnification]=\"2\"\r\n [lensHeight]=\"100\" [lensWidth]=\"100\" style=\"height: 100%; width: 100%;\"></lib-ngx-image-zoom>\r\n </ng-container>\r\n <ng-container *ngIf=\"isMobile\">\r\n <img loading=\"lazy\" [src]=\"currentImg\" alt=\"\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!currentImg\">\r\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\">\r\n </ng-container>\r\n </div>\r\n <div class=\"img-list\" *ngIf=\"screenWidth <= 500\">\r\n <ng-container *ngFor=\"let img of itemImages\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\r\n alt=\"\" class=\"img\" (click)=\"changeImg(img.imgUrl)\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <div class=\"item-img\" *ngIf=\"varientLoading\">\r\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '100%',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n\r\n<!-- <div class=\"modal fade\" id=\"itemVarients\" tabindex=\"-1\" aria-labelledby=\"itemVarients\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title\">Right-to-Left Modal</h5>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n This content is aligned from right to left.\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div> -->\r\n", styles: [".product-desc{display:flex}.share-icon{border:1.5px solid rgba(211,211,211,.382);position:absolute;top:10px;right:10px;z-index:1;opacity:.5;border-radius:50%;padding:5px;height:30px;width:30px;display:flex;align-items:center;justify-content:center;font-size:16px;box-shadow:#00000003 0 1px 2px;cursor:pointer}.row{margin-top:25px}.prod-img-block{height:100%;display:flex;gap:5px}.img-list{display:flex;flex-direction:column;gap:5px;max-height:460px;overflow:scroll}.img-list img{height:100px;width:100%;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:500px;height:500px;overflow:hidden}.item-img img{width:100%!important;height:100%!important}.fast-checkout{position:absolute;top:10px;right:10px;display:flex;gap:10px;width:fit-content}.fast-checkout img{cursor:pointer}.selling-fast-tag{background-color:#fff;color:#000;padding:5px 10px;border-radius:3px;font-weight:700}.price{font-weight:600;font-family:Poppins;font-size:20px}.product-desc{margin-top:15px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:2px solid #E6E6E6;align-items:center;gap:15px;height:50px;width:155px;justify-content:space-between;margin-top:1rem;border-radius:5px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.trim-text{-webkit-line-clamp:3!important}.product-sku{margin-top:20px}.product-sku div{font-weight:400;font-size:15px;color:#848484;font-family:Poppins;margin-top:.5rem}.tab-group{display:flex;gap:10px;overflow-y:scroll}.tab{font-family:Poppins;font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black}.discount-price{color:#d3d3d3;text-decoration:line-through;font-size:16px}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#d3d3d333;color:#000;padding:15px 20px;border-radius:5px;margin-top:15px}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#fff;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:5px 15px;cursor:pointer}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:15px;height:50px!important;width:130px!important;justify-content:space-between;margin-top:1rem;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:16px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.product-detail{overflow-y:auto}.above-height{height:90vh}.mobile-footer{display:none}@media (min-width: 1024px){.height{width:min-content}.above-height{width:100%;display:flex}.product-detail{padding:2%}.product-heading{font-size:35px}.prod-img-block{height:100%;display:flex;gap:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.total-container{padding-top:10px!important;padding-bottom:10px!important}.out-of-stock,.add-btn,.quantity{text-align:center;width:70%!important;border:none!important;padding:5px;margin-top:0!important}.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important}.item-img img{width:100%;height:448px}.prod-img-block{flex-direction:column;gap:5px}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{height:25%;width:25%;border:2px solid lightgray;cursor:pointer}.product-detail,.prod-desc{margin-top:20px}.product-img{height:220px}.send-btn{padding:.5rem 1rem!important}.favourite .mat-icon{padding:10px!important;position:relative!important;min-height:0px!important;height:43px!important;top:8px!important;min-width:52px!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%}.above-height{padding:0 20px;min-height:95vh!important;height:unset!important}.product-heading{font-size:25px}}.send-btn{font-size:16px!important;padding:1rem 2rem;display:inline-flex;align-items:center;justify-content:center;width:fit-content!important;margin-top:1rem}.favourite .mat-icon{min-height:55px;min-width:55px;font-size:35px;display:flex;align-items:center;justify-content:center;border-radius:5px;padding:30px 25px 25px;position:relative;top:5px;cursor:pointer}a{text-decoration:none}.body-large{color:#848484}.brief-desc{height:200px;overflow:scroll}.total-container{height:auto;position:relative;display:block!important}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.modal-dialog{height:100vh;position:absolute;top:0;margin:0;right:0;border:none}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}.above-height{width:100%;padding:2%;display:flex;flex-direction:column}.product-detail{padding:0vw 42vw 0vw 2vw}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:911px){.product-detail{padding:0% 34% 0% 2%}.above-height{display:flex}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:1024px){.product-detail{padding:0% 0% 0% 2%}.above-height{display:flex}.product-headig{font-size:35px}.prod-img-block{height:100%;display:flex;gap:5px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i9.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i9.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i9.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i10.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: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i11.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i12.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i13.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }, { kind: "directive", type: ButtonDirectiveDirective, selector: "[simpoButtonDirective]", inputs: ["buttonStyle", "color", "scrollValue"] }, { kind: "directive", type: AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "ngmodule", type: NgxImageZoomModule }, { kind: "component", type: i14.NgxImageZoomComponent, selector: "lib-ngx-image-zoom", inputs: ["thumbImage", "fullImage", "zoomMode", "magnification", "minZoomRatio", "maxZoomRatio", "scrollStepSize", "enableLens", "lensWidth", "lensHeight", "circularLens", "enableScrollZoom", "altText", "titleText"], outputs: ["zoomScroll", "zoomPosition", "imagesLoaded"] }, { kind: "component", type: FeaturedProductsComponent, selector: "simpo-featured-products", inputs: ["data", "responseData", "index", "isRelatedProduct", "edit", "customClass", "delete"], outputs: ["changeDetailProduct"] }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "component", type: SociaIconsComponent, selector: "simpo-socia-icons", inputs: ["socialIconData", "color", "sectionId"] }, { kind: "ngmodule", type: RatingModule }, { kind: "component", type: i15.Rating, selector: "p-rating", inputs: ["disabled", "readonly", "stars", "cancel", "iconOnClass", "iconOnStyle", "iconOffClass", "iconOffStyle", "iconCancelClass", "iconCancelStyle", "autofocus"], outputs: ["onRate", "onCancel", "onFocus", "onBlur"] }, { kind: "ngmodule", type: SpeedDialModule }, { kind: "component", type: i16.SpeedDial, selector: "p-speedDial", inputs: ["id", "model", "visible", "style", "className", "direction", "transitionDelay", "type", "radius", "mask", "disabled", "hideOnClickOutside", "buttonStyle", "buttonClassName", "maskStyle", "maskClassName", "showIcon", "hideIcon", "rotateAnimation", "ariaLabel", "ariaLabelledBy"], outputs: ["onVisibleChange", "visibleChange", "onClick", "onShow", "onHide"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i17.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }] }); }
432
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.4", type: ProductDescComponent, isStandalone: true, selector: "simpo-product-desc", inputs: { data: "data", responseData: "responseData", index: "index", edit: "edit", delete: "delete", customClass: "customClass" }, host: { listeners: { "window: resize": "getScreenSize($event)" } }, providers: [MessageService], viewQueries: [{ propertyName: "reviewComponent", first: true, predicate: CustomerReviewComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!isLoading\">\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n <section class=\"total-container\" [id]=\"data?.id\" [simpoLayout]=\"styles?.layout\" [simpoBackground]=\"styles?.background\"\n simpoHover (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\" >\n\n <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\n </div>\n <section class=\"container\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\">\n <div><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\" (click)=\"routeToHome()\">Home</a> /\n <span>{{ responseData?.name | titlecase }}</span>\n </div>\n <div class=\"row h-100\" style=\"margin-top: 25px;\" class=\"above-height\" [ngStyle]=\"{'min-height: 95vh': isMobile, 'max-width: 95vh': !isMobile}\">\n <div class=\"col-lg-6 col-12 h-100\" class=\"height\">\n <div class=\"prod-img-block\">\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\n </div>\n </div>\n <div class=\"col-lg-6 col-12 h-100 product-detail\">\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\n\n <ng-container *ngIf=\"!isMobile\">\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\n </ng-container>\n\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\n <div>\n <div class=\"varient-key\">{{varient.key}}</div>\n <div class=\"d-flex\" style=\"gap: 5px;\">\n\n <!-- [attr.class]=\"!isVarientAvailable(varient) ? 'varient-tag disable-varient' : 'varient-tag'\" -->\n <div *ngFor=\"let varientValue of varient.value\"\n class=\"varient-tag\"\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue}}</div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"product-desc body-large d-block trim-text\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData.brief\"></div>\n <div class=\"product-sku\">\n <div *ngIf=\"responseData?.itemInventory\">SKU : {{responseData.itemInventory?.openingStock}}</div>\n <div *ngIf=\"responseData?.itemCategorisation?.itemCategories && (responseData?.itemCategorisation?.itemCategories?.length || 0) > 0\">Category : <a href=\"javascript:void(0)\"\n (click)=\"goToFilter(cat.refName)\"\n *ngFor=\"let cat of responseData?.itemCategorisation?.itemCategories;let idx = index\">{{cat.refName |\n titlecase}} <ng-container\n *ngIf=\"(idx+1) != responseData?.itemCategorisation?.itemCategories?.length\">,</ng-container>\n </a></div>\n <div *ngIf=\"(responseData?.itemCategorisation?.productTags?.length || 0) > 0\">Tags : <span\n *ngFor=\"let tag of responseData?.itemCategorisation?.productTags\">{{tag.tagName}},\n </span></div>\n </div>\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\n <!-- <ng-container>\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\n </ng-container> -->\n </div>\n </div>\n <div class=\"row prod-desc\" *ngIf=\"responseData?.descriptor?.name\">\n <div class=\"tab-group\">\n <div class=\"tab\">Description</div>\n </div>\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\n [innerHTML]=\"responseData?.descriptor?.name\"></div>\n </div>\n </section>\n <ng-container *ngIf=\"relatedProductData?.length\">\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"relatedProductData\"\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\n </ng-container>\n <ng-container *ngIf=\"recentViewItemList?.length\">\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\n [isRelatedProduct]=\"true\"></simpo-featured-products>\n </ng-container>\n <!-- <ng-container>\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\n </ng-container> -->\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\n </div>\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\n </div>\n </section>\n</ng-container>\n\n\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '40vh',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n}\">\n</ngx-skeleton-loader>\n\n\n<div class=\"mobile-footer\">\n <div class=\"icons\">\n <div (click)=\"goToCart()\">\n <mat-icon>shopping_cart</mat-icon>\n </div>\n <div>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\n <!-- <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\n *ngIf=\"!isItemAsFavorite\">bookmark</mat-icon>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\n *ngIf=\"isItemAsFavorite\">bookmark_border</mat-icon> -->\n </div>\n </div>\n <div class=\"out-of-stock\" *ngIf=\"isItemOutOfStock\">Out of Stock</div>\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !isItemOutOfStock\">\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\">-</div>\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center\">{{responseData.quantity}}</div>\n <div class=\"minus\" (click)=\"addToCart('ADD')\">+</div>\n </div>\n <button class=\"add-btn\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [color]=\"data?.styles?.background?.accentColor\" (click)=\"addToCart()\"\n *ngIf=\"!responseData?.quantity && !isItemOutOfStock\">{{data?.action?.buttons?.[0]?.content?.label}}</button>\n</div>\n\n<ng-template #ReviewSection>\n <div class=\"review-sec\">\n <div class=\"title\">Customer Review</div>\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\n <span>Be the first to write a review</span>\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [color]=\"data?.styles?.background?.accentColor\" [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add Review' : 'Cancel Review'}}</button>\n <ng-container *ngIf=\"showReview\">\n <hr />\n <div class=\"user-review\">\n <div class=\"title\">Write a review</div>\n <span class=\"secondary-text\">RATING</span>\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\n <div>\n <span class=\"secondary-text\">Review Title</span>\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\n </div>\n <div>\n <span class=\"secondary-text\">Review</span>\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\n </div>\n <div class=\"review-action-btn\">\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\" [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [color]=\"data?.styles?.background?.accentColor\" (click)=\"addProductReview()\" [disabled]=\"productReview == 0 && reviewTitle?.length == 0 && reviewDescription?.length == 0\">Submit review</button>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #SocialIcons>\n <div class=\"d-flex\">\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\n <div style=\"position: relative;margin-right: 10px;\">\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\" [sectionId]=\"data?.id\"></simpo-socia-icons>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #ActionBtn>\n <div class=\"button-parent\">\n <div class=\"out-of-stock\" *ngIf=\"isItemOutOfStock\">Out of Stock</div>\n <div class=\"quantity\" *ngIf=\"responseData?.quantity\">\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\">-</div>\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center\">{{responseData.quantity}}</div>\n <div class=\"minus\" (click)=\"addToCart('ADD')\">+</div>\n </div>\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\">\n <button class=\"send-btn\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [color]=\"data?.styles?.background?.accentColor\"\n (click)=\"addToCart()\">{{data?.action?.buttons?.[0]?.content?.label}}</button>\n </div>\n <div class=\"favourite\">\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\n </div>\n </div>\n</ng-template>\n<ng-template #ProductDesc>\n <div class=\"heading-large trim-text\" class=\"product-heading\" >{{responseData?.name}}</div>\n <div class=\"d-flex\" style=\"gap: 10px; align-items: center; margin-top: 15px;\">\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\n *ngIf=\"responseData?.price?.discountedPrice != responseData?.price?.value\"><span [innerHTML]='currency'></span>\n {{responseData?.price?.value}}</div>\n <div class=\"price\" *ngIf=\"responseData?.price?.discountedPrice\"><span [innerHTML]='currency'></span>\n {{responseData?.price?.discountedPrice}}</div>\n <div class=\"tax-text\">(excluding all taxes)</div>\n </div>\n\n</ng-template>\n\n<ng-template #ImageSection>\n <ng-container *ngIf=\"!varientLoading\">\n <div class=\"img-list\" *ngIf=\"screenWidth > 500\">\n <ng-container *ngFor=\"let img of itemImages\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\n alt=\"\" class=\"img\" (click)=\"changeImg(img.imgUrl)\"\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\n </ng-container>\n </div>\n <div class=\"item-img\">\n <ng-container *ngIf=\"currentImg\">\n\n <mat-icon class=\"share-icon\" (click)=\"shareProduct()\">share</mat-icon>\n <ng-container *ngIf=\"!isMobile\">\n <lib-ngx-image-zoom [thumbImage]=\"currentImg\" [fullImage]=\"currentImg\" [zoomMode]=\"'hover'\" [magnification]=\"2\"\n [lensHeight]=\"100\" [lensWidth]=\"100\" style=\"height: 100%; width: 100%;\"></lib-ngx-image-zoom>\n </ng-container>\n <ng-container *ngIf=\"isMobile\">\n <img loading=\"lazy\" [src]=\"currentImg\" alt=\"\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!currentImg\">\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\">\n </ng-container>\n </div>\n <div class=\"img-list\" *ngIf=\"screenWidth <= 500\">\n <ng-container *ngFor=\"let img of itemImages\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\n alt=\"\" class=\"img\" (click)=\"changeImg(img.imgUrl)\">\n </ng-container>\n </div>\n </ng-container>\n <div class=\"item-img\" *ngIf=\"varientLoading\">\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '100%',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n }\">\n </ngx-skeleton-loader>\n </div>\n</ng-template>\n\n\n\n\n<!-- <div class=\"modal fade\" id=\"itemVarients\" tabindex=\"-1\" aria-labelledby=\"itemVarients\" aria-hidden=\"true\">\n <div class=\"modal-dialog\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Right-to-Left Modal</h5>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n </div>\n <div class=\"modal-body\">\n This content is aligned from right to left.\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n </div>\n </div>\n </div>\n</div> -->\n", styles: [".product-desc{display:flex}.share-icon{border:1.5px solid rgba(211,211,211,.382);position:absolute;top:10px;right:10px;z-index:1;opacity:.5;border-radius:50%;padding:5px;height:30px;width:30px;display:flex;align-items:center;justify-content:center;font-size:16px;box-shadow:#00000003 0 1px 2px;cursor:pointer}.row{margin-top:25px}.prod-img-block{height:100%;display:flex;gap:5px}.img-list{display:flex;flex-direction:column;gap:5px;max-height:460px;overflow:scroll}.img-list img{height:100px;width:100%;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:500px;height:500px;overflow:hidden}.item-img img{width:100%!important;height:100%!important}.fast-checkout{position:absolute;top:10px;right:10px;display:flex;gap:10px;width:fit-content}.fast-checkout img{cursor:pointer}.selling-fast-tag{background-color:#fff;color:#000;padding:5px 10px;border-radius:3px;font-weight:700}.price{font-weight:600;font-family:Poppins;font-size:20px}.product-desc{margin-top:15px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:2px solid #E6E6E6;align-items:center;gap:15px;height:50px;width:155px;justify-content:space-between;margin-top:1rem;border-radius:5px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.trim-text{-webkit-line-clamp:3!important}.product-sku{margin-top:20px}.product-sku div{font-weight:400;font-size:15px;color:#848484;font-family:Poppins;margin-top:.5rem}.tab-group{display:flex;gap:10px;overflow-y:scroll}.tab{font-family:Poppins;font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black}.discount-price{color:#d3d3d3;text-decoration:line-through;font-size:16px}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#d3d3d333;color:#000;padding:15px 20px;border-radius:5px;margin-top:15px}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#fff;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:5px 15px;cursor:pointer}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:15px;height:50px!important;width:130px!important;justify-content:space-between;margin-top:1rem;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:16px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.product-detail{overflow-y:auto}.above-height{height:90vh}.mobile-footer{display:none}@media (min-width: 1024px){.height{width:min-content}.above-height{width:100%;display:flex}.product-detail{padding:2%}.product-heading{font-size:35px}.prod-img-block{height:100%;display:flex;gap:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.total-container{padding-top:10px!important;padding-bottom:10px!important}.out-of-stock,.add-btn,.quantity{text-align:center;width:70%!important;border:none!important;padding:5px;margin-top:0!important}.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important}.item-img img{width:100%;height:448px}.prod-img-block{flex-direction:column;gap:5px}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{height:25%;width:25%;border:2px solid lightgray;cursor:pointer}.product-detail,.prod-desc{margin-top:20px}.product-img{height:220px}.send-btn{padding:.5rem 1rem!important}.favourite .mat-icon{padding:10px!important;position:relative!important;min-height:0px!important;height:43px!important;top:8px!important;min-width:52px!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%}.above-height{padding:0 20px;min-height:95vh!important;height:unset!important}.product-heading{font-size:25px}}.send-btn{font-size:16px!important;padding:1rem 2rem;display:inline-flex;align-items:center;justify-content:center;width:fit-content!important;margin-top:1rem}.favourite .mat-icon{min-height:55px;min-width:55px;font-size:35px;display:flex;align-items:center;justify-content:center;border-radius:5px;padding:30px 25px 25px;position:relative;top:5px;cursor:pointer}a{text-decoration:none}.body-large{color:#848484}.brief-desc{height:200px;overflow:scroll}.total-container{height:auto;position:relative;display:block!important}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.modal-dialog{height:100vh;position:absolute;top:0;margin:0;right:0;border:none}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}.above-height{width:100%;padding:2%;display:flex;flex-direction:column}.product-detail{padding:0vw 42vw 0vw 2vw}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:911px){.product-detail{padding:0% 34% 0% 2%}.above-height{display:flex}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:1024px){.product-detail{padding:0% 0% 0% 2%}.above-height{display:flex}.product-headig{font-size:35px}.prod-img-block{height:100%;display:flex;gap:5px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i9.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i9.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i9.KeyValuePipe, name: "keyvalue" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i10.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: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SimpoComponentModule }, { kind: "component", type: i11.HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "component", type: i12.DeleteHoverElementComponent, selector: "simpo-delete-hover-element", inputs: ["index", "data"], outputs: ["edit"] }, { kind: "component", type: i13.NgxSkeletonLoaderComponent, selector: "ngx-skeleton-loader", inputs: ["count", "loadingText", "appearance", "animation", "ariaLabel", "theme"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }, { kind: "directive", type: ButtonDirectiveDirective, selector: "[simpoButtonDirective]", inputs: ["buttonStyle", "color", "scrollValue"] }, { kind: "directive", type: AnimationDirective, selector: "[simpoAnimation]", inputs: ["simpoAnimation"] }, { kind: "directive", type: ContentFitDirective, selector: "[simpoLayout]", inputs: ["simpoLayout"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "ngmodule", type: NgxImageZoomModule }, { kind: "component", type: i14.NgxImageZoomComponent, selector: "lib-ngx-image-zoom", inputs: ["thumbImage", "fullImage", "zoomMode", "magnification", "minZoomRatio", "maxZoomRatio", "scrollStepSize", "enableLens", "lensWidth", "lensHeight", "circularLens", "enableScrollZoom", "altText", "titleText"], outputs: ["zoomScroll", "zoomPosition", "imagesLoaded"] }, { kind: "component", type: FeaturedProductsComponent, selector: "simpo-featured-products", inputs: ["data", "responseData", "index", "isRelatedProduct", "edit", "customClass", "delete"], outputs: ["changeDetailProduct"] }, { kind: "ngmodule", type: MatBottomSheetModule }, { kind: "component", type: SociaIconsComponent, selector: "simpo-socia-icons", inputs: ["socialIconData", "color", "sectionId"] }, { kind: "ngmodule", type: RatingModule }, { kind: "component", type: i15.Rating, selector: "p-rating", inputs: ["disabled", "readonly", "stars", "cancel", "iconOnClass", "iconOnStyle", "iconOffClass", "iconOffStyle", "iconCancelClass", "iconCancelStyle", "autofocus"], outputs: ["onRate", "onCancel", "onFocus", "onBlur"] }, { kind: "ngmodule", type: SpeedDialModule }, { kind: "component", type: i16.SpeedDial, selector: "p-speedDial", inputs: ["id", "model", "visible", "style", "className", "direction", "transitionDelay", "type", "radius", "mask", "disabled", "hideOnClickOutside", "buttonStyle", "buttonClassName", "maskStyle", "maskClassName", "showIcon", "hideIcon", "rotateAnimation", "ariaLabel", "ariaLabelledBy"], outputs: ["onVisibleChange", "visibleChange", "onClick", "onShow", "onHide"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i17.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }] }); }
433
433
  }
434
434
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImport: i0, type: ProductDescComponent, decorators: [{
435
435
  type: Component,
@@ -454,7 +454,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImpor
454
454
  SpeedDialModule,
455
455
  ToastModule,
456
456
  CustomerReviewComponent
457
- ], providers: [MessageService], template: "<ng-container *ngIf=\"!isLoading\">\r\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\r\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\r\n <section class=\"total-container\" [id]=\"data?.id\" [simpoLayout]=\"styles?.layout\" [simpoBackground]=\"styles?.background\"\r\n simpoHover (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\" >\r\n\r\n <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\r\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\r\n </div>\r\n <section class=\"container\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\">\r\n <div><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\" (click)=\"routeToHome()\">Home</a> /\r\n <span>{{ responseData?.name | titlecase }}</span>\r\n </div>\r\n <div class=\"row h-100\" style=\"margin-top: 25px;\" class=\"above-height\" [ngStyle]=\"{'min-height: 95vh': isMobile, 'max-width: 95vh': !isMobile}\">\r\n <div class=\"col-lg-6 col-12 h-100\" class=\"height\">\r\n <div class=\"prod-img-block\">\r\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-12 h-100 product-detail\">\r\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\r\n\r\n <ng-container *ngIf=\"!isMobile\">\r\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\r\n <div>\r\n <div class=\"varient-key\">{{varient.key}}</div>\r\n <div class=\"d-flex\" style=\"gap: 5px;\">\r\n\r\n <!-- [attr.class]=\"!isVarientAvailable(varient) ? 'varient-tag disable-varient' : 'varient-tag'\" -->\r\n <div *ngFor=\"let varientValue of varient.value\"\r\n class=\"varient-tag\"\r\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\r\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\r\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue}}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"product-desc body-large d-block trim-text\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData.brief\"></div>\r\n <div class=\"product-sku\">\r\n <div *ngIf=\"responseData?.itemInventory\">SKU : {{responseData.itemInventory?.openingStock}}</div>\r\n <div *ngIf=\"responseData?.itemCategorisation?.itemCategories && (responseData?.itemCategorisation?.itemCategories?.length || 0) > 0\">Category : <a href=\"javascript:void(0)\"\r\n (click)=\"goToFilter(cat.refName)\"\r\n *ngFor=\"let cat of responseData?.itemCategorisation?.itemCategories;let idx = index\">{{cat.refName |\r\n titlecase}} <ng-container\r\n *ngIf=\"(idx+1) != responseData?.itemCategorisation?.itemCategories?.length\">,</ng-container>\r\n </a></div>\r\n <div *ngIf=\"(responseData?.itemCategorisation?.productTags?.length || 0) > 0\">Tags : <span\r\n *ngFor=\"let tag of responseData?.itemCategorisation?.productTags\">{{tag.tagName}},\r\n </span></div>\r\n </div>\r\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\r\n <!-- <ng-container>\r\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\r\n </ng-container> -->\r\n </div>\r\n </div>\r\n <div class=\"row prod-desc\" *ngIf=\"responseData?.descriptor?.name\">\r\n <div class=\"tab-group\">\r\n <div class=\"tab\">Description</div>\r\n </div>\r\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\r\n [innerHTML]=\"responseData?.descriptor?.name\"></div>\r\n </div>\r\n </section>\r\n <ng-container *ngIf=\"relatedProductData?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"relatedProductData\"\r\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\r\n </ng-container>\r\n <ng-container *ngIf=\"recentViewItemList?.length\">\r\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\r\n [isRelatedProduct]=\"true\"></simpo-featured-products>\r\n </ng-container>\r\n <!-- <ng-container>\r\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\r\n </ng-container> -->\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\r\n </div>\r\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\r\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\r\n </div>\r\n </section>\r\n</ng-container>\r\n\r\n\r\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '40vh',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n}\">\r\n</ngx-skeleton-loader>\r\n\r\n\r\n<div class=\"mobile-footer\">\r\n <div class=\"icons\">\r\n <div (click)=\"goToCart()\">\r\n <mat-icon>shopping_cart</mat-icon>\r\n </div>\r\n <div>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n <!-- <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">bookmark</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">bookmark_border</mat-icon> -->\r\n </div>\r\n </div>\r\n <div class=\"out-of-stock\" *ngIf=\"isItemOutOfStock\">Out of Stock</div>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !isItemOutOfStock\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center\">{{responseData.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\">+</div>\r\n </div>\r\n <button class=\"add-btn\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [color]=\"data?.styles?.background?.accentColor\" (click)=\"addToCart()\"\r\n *ngIf=\"!responseData?.quantity && !isItemOutOfStock\">{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n</div>\r\n\r\n<ng-template #ReviewSection>\r\n <div class=\"review-sec\">\r\n <div class=\"title\">Customer Review</div>\r\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\r\n <span>Be the first to write a review</span>\r\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [color]=\"data?.styles?.background?.accentColor\" [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add Review' : 'Cancel Review'}}</button>\r\n <ng-container *ngIf=\"showReview\">\r\n <hr />\r\n <div class=\"user-review\">\r\n <div class=\"title\">Write a review</div>\r\n <span class=\"secondary-text\">RATING</span>\r\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\r\n <div>\r\n <span class=\"secondary-text\">Review Title</span>\r\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\r\n </div>\r\n <div>\r\n <span class=\"secondary-text\">Review</span>\r\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\r\n </div>\r\n <div class=\"review-action-btn\">\r\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\" [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\r\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [color]=\"data?.styles?.background?.accentColor\" (click)=\"addProductReview()\" [disabled]=\"productReview == 0 && reviewTitle?.length == 0 && reviewDescription?.length == 0\">Submit review</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #SocialIcons>\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\r\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\r\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\r\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\r\n <div style=\"position: relative;margin-right: 10px;\">\r\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\" [sectionId]=\"data?.id\"></simpo-socia-icons>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #ActionBtn>\r\n <div class=\"button-parent\">\r\n <div class=\"out-of-stock\" *ngIf=\"isItemOutOfStock\">Out of Stock</div>\r\n <div class=\"quantity\" *ngIf=\"responseData?.quantity\">\r\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\">-</div>\r\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center\">{{responseData.quantity}}</div>\r\n <div class=\"minus\" (click)=\"addToCart('ADD')\">+</div>\r\n </div>\r\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\">\r\n <button class=\"send-btn\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\r\n [color]=\"data?.styles?.background?.accentColor\"\r\n (click)=\"addToCart()\">{{data?.action?.buttons?.[0]?.content?.label}}</button>\r\n </div>\r\n <div class=\"favourite\">\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\r\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\r\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\r\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #ProductDesc>\r\n <div class=\"heading-large trim-text\" class=\"product-heading\" >{{responseData?.name}}</div>\r\n <div class=\"d-flex\" style=\"gap: 10px; align-items: center; margin-top: 15px;\">\r\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\r\n *ngIf=\"responseData?.price?.discountedPrice != responseData?.price?.value\"><span [innerHTML]='currency'></span>\r\n {{responseData?.price?.value}}</div>\r\n <div class=\"price\" *ngIf=\"responseData?.price?.discountedPrice\"><span [innerHTML]='currency'></span>\r\n {{responseData?.price?.discountedPrice}}</div>\r\n <div class=\"tax-text\">(excluding all taxes)</div>\r\n </div>\r\n\r\n</ng-template>\r\n\r\n<ng-template #ImageSection>\r\n <ng-container *ngIf=\"!varientLoading\">\r\n <div class=\"img-list\" *ngIf=\"screenWidth > 500\">\r\n <ng-container *ngFor=\"let img of itemImages\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\r\n alt=\"\" class=\"img\" (click)=\"changeImg(img.imgUrl)\"\r\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\r\n </ng-container>\r\n </div>\r\n <div class=\"item-img\">\r\n <ng-container *ngIf=\"currentImg\">\r\n\r\n <mat-icon class=\"share-icon\" (click)=\"shareProduct()\">share</mat-icon>\r\n <ng-container *ngIf=\"!isMobile\">\r\n <lib-ngx-image-zoom [thumbImage]=\"currentImg\" [fullImage]=\"currentImg\" [zoomMode]=\"'hover'\" [magnification]=\"2\"\r\n [lensHeight]=\"100\" [lensWidth]=\"100\" style=\"height: 100%; width: 100%;\"></lib-ngx-image-zoom>\r\n </ng-container>\r\n <ng-container *ngIf=\"isMobile\">\r\n <img loading=\"lazy\" [src]=\"currentImg\" alt=\"\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!currentImg\">\r\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\">\r\n </ng-container>\r\n </div>\r\n <div class=\"img-list\" *ngIf=\"screenWidth <= 500\">\r\n <ng-container *ngFor=\"let img of itemImages\">\r\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\r\n alt=\"\" class=\"img\" (click)=\"changeImg(img.imgUrl)\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <div class=\"item-img\" *ngIf=\"varientLoading\">\r\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\r\n width: '100%',\r\n height: '100%',\r\n 'border-radius': '10px',\r\n 'position': 'relative',\r\n 'right': '5px'\r\n }\">\r\n </ngx-skeleton-loader>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n\r\n\r\n<!-- <div class=\"modal fade\" id=\"itemVarients\" tabindex=\"-1\" aria-labelledby=\"itemVarients\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title\">Right-to-Left Modal</h5>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n This content is aligned from right to left.\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\r\n <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div> -->\r\n", styles: [".product-desc{display:flex}.share-icon{border:1.5px solid rgba(211,211,211,.382);position:absolute;top:10px;right:10px;z-index:1;opacity:.5;border-radius:50%;padding:5px;height:30px;width:30px;display:flex;align-items:center;justify-content:center;font-size:16px;box-shadow:#00000003 0 1px 2px;cursor:pointer}.row{margin-top:25px}.prod-img-block{height:100%;display:flex;gap:5px}.img-list{display:flex;flex-direction:column;gap:5px;max-height:460px;overflow:scroll}.img-list img{height:100px;width:100%;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:500px;height:500px;overflow:hidden}.item-img img{width:100%!important;height:100%!important}.fast-checkout{position:absolute;top:10px;right:10px;display:flex;gap:10px;width:fit-content}.fast-checkout img{cursor:pointer}.selling-fast-tag{background-color:#fff;color:#000;padding:5px 10px;border-radius:3px;font-weight:700}.price{font-weight:600;font-family:Poppins;font-size:20px}.product-desc{margin-top:15px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:2px solid #E6E6E6;align-items:center;gap:15px;height:50px;width:155px;justify-content:space-between;margin-top:1rem;border-radius:5px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.trim-text{-webkit-line-clamp:3!important}.product-sku{margin-top:20px}.product-sku div{font-weight:400;font-size:15px;color:#848484;font-family:Poppins;margin-top:.5rem}.tab-group{display:flex;gap:10px;overflow-y:scroll}.tab{font-family:Poppins;font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black}.discount-price{color:#d3d3d3;text-decoration:line-through;font-size:16px}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#d3d3d333;color:#000;padding:15px 20px;border-radius:5px;margin-top:15px}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#fff;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:5px 15px;cursor:pointer}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:15px;height:50px!important;width:130px!important;justify-content:space-between;margin-top:1rem;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:16px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.product-detail{overflow-y:auto}.above-height{height:90vh}.mobile-footer{display:none}@media (min-width: 1024px){.height{width:min-content}.above-height{width:100%;display:flex}.product-detail{padding:2%}.product-heading{font-size:35px}.prod-img-block{height:100%;display:flex;gap:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.total-container{padding-top:10px!important;padding-bottom:10px!important}.out-of-stock,.add-btn,.quantity{text-align:center;width:70%!important;border:none!important;padding:5px;margin-top:0!important}.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important}.item-img img{width:100%;height:448px}.prod-img-block{flex-direction:column;gap:5px}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{height:25%;width:25%;border:2px solid lightgray;cursor:pointer}.product-detail,.prod-desc{margin-top:20px}.product-img{height:220px}.send-btn{padding:.5rem 1rem!important}.favourite .mat-icon{padding:10px!important;position:relative!important;min-height:0px!important;height:43px!important;top:8px!important;min-width:52px!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%}.above-height{padding:0 20px;min-height:95vh!important;height:unset!important}.product-heading{font-size:25px}}.send-btn{font-size:16px!important;padding:1rem 2rem;display:inline-flex;align-items:center;justify-content:center;width:fit-content!important;margin-top:1rem}.favourite .mat-icon{min-height:55px;min-width:55px;font-size:35px;display:flex;align-items:center;justify-content:center;border-radius:5px;padding:30px 25px 25px;position:relative;top:5px;cursor:pointer}a{text-decoration:none}.body-large{color:#848484}.brief-desc{height:200px;overflow:scroll}.total-container{height:auto;position:relative;display:block!important}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.modal-dialog{height:100vh;position:absolute;top:0;margin:0;right:0;border:none}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}.above-height{width:100%;padding:2%;display:flex;flex-direction:column}.product-detail{padding:0vw 42vw 0vw 2vw}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:911px){.product-detail{padding:0% 34% 0% 2%}.above-height{display:flex}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:1024px){.product-detail{padding:0% 0% 0% 2%}.above-height{display:flex}.product-headig{font-size:35px}.prod-img-block{height:100%;display:flex;gap:5px}}\n"] }]
457
+ ], providers: [MessageService], template: "<ng-container *ngIf=\"!isLoading\">\n <p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\" key=\"wishlist\"\n [showTransformOptions]=\"isMobile ? 'translateY(-100%)' : ''\"></p-toast>\n <section class=\"total-container\" [id]=\"data?.id\" [simpoLayout]=\"styles?.layout\" [simpoBackground]=\"styles?.background\"\n simpoHover (hovering)=\"showEditTabs($event)\" [attr.style]=\"customClass\" >\n\n <div style=\"position: relative;\" class=\"speeddial-linear\" *ngIf=\"isMobile\">\n <p-speedDial [model]=\"items\" direction=\"up\" [buttonStyle]=\"{'border-radius': '50%', 'height': '30px'}\" />\n </div>\n <section class=\"container\" [id]=\"data?.id\" [simpoAnimation]=\"styles?.animation\">\n <div><a href=\"javascript:void(0)\" style=\"text-decoration: none; color: #0267C1\" (click)=\"routeToHome()\">Home</a> /\n <span>{{ responseData?.name | titlecase }}</span>\n </div>\n <div class=\"row h-100\" style=\"margin-top: 25px;\" class=\"above-height\" [ngStyle]=\"{'min-height: 95vh': isMobile, 'max-width: 95vh': !isMobile}\">\n <div class=\"col-lg-6 col-12 h-100\" class=\"height\">\n <div class=\"prod-img-block\">\n <ng-container *ngTemplateOutlet=\"ImageSection\"></ng-container>\n </div>\n </div>\n <div class=\"col-lg-6 col-12 h-100 product-detail\">\n <ng-container *ngTemplateOutlet=\"ProductDesc\"></ng-container>\n\n <ng-container *ngIf=\"!isMobile\">\n <ng-container *ngTemplateOutlet=\"ActionBtn\"></ng-container>\n </ng-container>\n\n <ng-container *ngFor=\"let varient of varients | keyvalue\">\n <div>\n <div class=\"varient-key\">{{varient.key}}</div>\n <div class=\"d-flex\" style=\"gap: 5px;\">\n\n <!-- [attr.class]=\"!isVarientAvailable(varient) ? 'varient-tag disable-varient' : 'varient-tag'\" -->\n <div *ngFor=\"let varientValue of varient.value\"\n class=\"varient-tag\"\n [style.color]=\"selectedVarient.get(varient.key) == varientValue ? 'white' : data?.styles?.background?.accentColor\"\n [style.backgroundColor]=\"selectedVarient.get(varient.key) == varientValue ? data?.styles?.background?.accentColor : ''\"\n (click)=\"selectVarient(varient.key, varientValue)\">{{varientValue}}</div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"product-desc body-large d-block trim-text\" *ngIf=\"responseData?.brief\" [innerHTML]=\"responseData.brief\"></div>\n <div class=\"product-sku\">\n <div *ngIf=\"responseData?.itemInventory\">SKU : {{responseData.itemInventory?.openingStock}}</div>\n <div *ngIf=\"responseData?.itemCategorisation?.itemCategories && (responseData?.itemCategorisation?.itemCategories?.length || 0) > 0\">Category : <a href=\"javascript:void(0)\"\n (click)=\"goToFilter(cat.refName)\"\n *ngFor=\"let cat of responseData?.itemCategorisation?.itemCategories;let idx = index\">{{cat.refName |\n titlecase}} <ng-container\n *ngIf=\"(idx+1) != responseData?.itemCategorisation?.itemCategories?.length\">,</ng-container>\n </a></div>\n <div *ngIf=\"(responseData?.itemCategorisation?.productTags?.length || 0) > 0\">Tags : <span\n *ngFor=\"let tag of responseData?.itemCategorisation?.productTags\">{{tag.tagName}},\n </span></div>\n </div>\n <!-- <ng-container *ngTemplateOutlet=\"SocialIcons\"></ng-container> -->\n <!-- <ng-container>\n <ng-container *ngTemplateOutlet=\"ReviewSection\"></ng-container>\n </ng-container> -->\n </div>\n </div>\n <div class=\"row prod-desc\" *ngIf=\"responseData?.descriptor?.name\">\n <div class=\"tab-group\">\n <div class=\"tab\">Description</div>\n </div>\n <div style=\"margin-top: 10px;\" class=\"body-large brief-desc\" *ngIf=\"responseData?.descriptor\"\n [innerHTML]=\"responseData?.descriptor?.name\"></div>\n </div>\n </section>\n <ng-container *ngIf=\"relatedProductData?.length\">\n <simpo-featured-products [edit]=\"false\" [data]=\"featureProductData\" [responseData]=\"relatedProductData\"\n [isRelatedProduct]=\"true\" (changeDetailProduct)=\"changeProduct($event)\"></simpo-featured-products>\n </ng-container>\n <ng-container *ngIf=\"recentViewItemList?.length\">\n <simpo-featured-products [edit]=\"false\" [data]=\"recentViewedData\" [responseData]=\"recentViewItemList\"\n [isRelatedProduct]=\"true\"></simpo-featured-products>\n </ng-container>\n <!-- <ng-container>\n <simpo-customer-review [data]=\"data\"></simpo-customer-review>\n </ng-container> -->\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\n </div>\n <div *ngIf=\"showDelete\" [ngClass]=\"{'hover_effect': delete}\">\n <simpo-delete-hover-element [data]=\"data\" [index]=\"index\"></simpo-delete-hover-element>\n </div>\n </section>\n</ng-container>\n\n\n<ngx-skeleton-loader *ngIf=\"isLoading\" count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '40vh',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n}\">\n</ngx-skeleton-loader>\n\n\n<div class=\"mobile-footer\">\n <div class=\"icons\">\n <div (click)=\"goToCart()\">\n <mat-icon>shopping_cart</mat-icon>\n </div>\n <div>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\n <!-- <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\n *ngIf=\"!isItemAsFavorite\">bookmark</mat-icon>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\n *ngIf=\"isItemAsFavorite\">bookmark_border</mat-icon> -->\n </div>\n </div>\n <div class=\"out-of-stock\" *ngIf=\"isItemOutOfStock\">Out of Stock</div>\n <div class=\"quantity\" *ngIf=\"responseData?.quantity && !isItemOutOfStock\">\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\">-</div>\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center\">{{responseData.quantity}}</div>\n <div class=\"minus\" (click)=\"addToCart('ADD')\">+</div>\n </div>\n <button class=\"add-btn\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [color]=\"data?.styles?.background?.accentColor\" (click)=\"addToCart()\"\n *ngIf=\"!responseData?.quantity && !isItemOutOfStock\">{{data?.action?.buttons?.[0]?.content?.label}}</button>\n</div>\n\n<ng-template #ReviewSection>\n <div class=\"review-sec\">\n <div class=\"title\">Customer Review</div>\n <p-rating [cancel]=\"false\" [readonly]=\"true\" [(ngModel)]=\"totalReview\" />\n <span>Be the first to write a review</span>\n <button class=\"mt-3\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [color]=\"data?.styles?.background?.accentColor\" [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = !showReview\">{{ !showReview ? 'Add Review' : 'Cancel Review'}}</button>\n <ng-container *ngIf=\"showReview\">\n <hr />\n <div class=\"user-review\">\n <div class=\"title\">Write a review</div>\n <span class=\"secondary-text\">RATING</span>\n <p-rating [(ngModel)]=\"productReview\" [cancel]=\"false\" [readonly]=\"false\" />\n <div>\n <span class=\"secondary-text\">Review Title</span>\n <input type=\"text\" placeholder=\"Give your review a title\" [(ngModel)]=\"reviewTitle\">\n </div>\n <div>\n <span class=\"secondary-text\">Review</span>\n <textarea placeholder=\"Write your comments here\" [(ngModel)]=\"reviewDescription\"></textarea>\n </div>\n <div class=\"review-action-btn\">\n <button [style.borderColor]=\"data?.styles?.background?.accentColor\" [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"showReview = false\">Cancel review</button>\n <button simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [color]=\"data?.styles?.background?.accentColor\" (click)=\"addProductReview()\" [disabled]=\"productReview == 0 && reviewTitle?.length == 0 && reviewDescription?.length == 0\">Submit review</button>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #SocialIcons>\n <div class=\"d-flex\">\n <div class=\"d-flex align-items-start align-items-lg-center flex-column flex-lg-row gap-lg-0 gap-3\"\n [ngClass]=\"data?.content?.socialLinks?.display ? 'justify-content-between' : 'justify-content-end'\">\n <div class=\"d-flex mt-0\" *ngIf=\"data?.content?.socialLinks?.display\">\n <ng-container *ngFor=\"let item of data?.content?.socialLinks?.channels\">\n <div style=\"position: relative;margin-right: 10px;\">\n <simpo-socia-icons [socialIconData]=\"item\" [color]=\"data?.styles?.background?.accentColor\" [sectionId]=\"data?.id\"></simpo-socia-icons>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #ActionBtn>\n <div class=\"button-parent\">\n <div class=\"out-of-stock\" *ngIf=\"isItemOutOfStock\">Out of Stock</div>\n <div class=\"quantity\" *ngIf=\"responseData?.quantity\">\n <div class=\"plus\" (click)=\"addToCart('SUBSTRACT')\">-</div>\n <div style=\"width: 50px;\" class=\"d-flex justify-content-center\">{{responseData.quantity}}</div>\n <div class=\"minus\" (click)=\"addToCart('ADD')\">+</div>\n </div>\n <div *ngIf=\"!responseData?.quantity && !isItemOutOfStock\">\n <button class=\"send-btn\" simpoButtonDirective [id]=\"buttonId\" [buttonStyle]=\"button?.styles\"\n [color]=\"data?.styles?.background?.accentColor\"\n (click)=\"addToCart()\">{{data?.action?.buttons?.[0]?.content?.label}}</button>\n </div>\n <div class=\"favourite\">\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"addToFavourite()\"\n *ngIf=\"!isItemAsFavorite\">favorite_border</mat-icon>\n <mat-icon [style.color]=\"data?.styles?.background?.accentColor\" (click)=\"removeToFavourite()\"\n *ngIf=\"isItemAsFavorite\">favorite</mat-icon>\n </div>\n </div>\n</ng-template>\n<ng-template #ProductDesc>\n <div class=\"heading-large trim-text\" class=\"product-heading\" >{{responseData?.name}}</div>\n <div class=\"d-flex\" style=\"gap: 10px; align-items: center; margin-top: 15px;\">\n <div class=\"price\" [ngClass]=\"{'discount-price': responseData?.price?.discountedPrice}\"\n *ngIf=\"responseData?.price?.discountedPrice != responseData?.price?.value\"><span [innerHTML]='currency'></span>\n {{responseData?.price?.value}}</div>\n <div class=\"price\" *ngIf=\"responseData?.price?.discountedPrice\"><span [innerHTML]='currency'></span>\n {{responseData?.price?.discountedPrice}}</div>\n <div class=\"tax-text\">(excluding all taxes)</div>\n </div>\n\n</ng-template>\n\n<ng-template #ImageSection>\n <ng-container *ngIf=\"!varientLoading\">\n <div class=\"img-list\" *ngIf=\"screenWidth > 500\">\n <ng-container *ngFor=\"let img of itemImages\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\n alt=\"\" class=\"img\" (click)=\"changeImg(img.imgUrl)\"\n [style.borderColor]=\"img.imgUrl == currentImg ? data?.styles?.background?.accentColor : 'transparent'\">\n </ng-container>\n </div>\n <div class=\"item-img\">\n <ng-container *ngIf=\"currentImg\">\n\n <mat-icon class=\"share-icon\" (click)=\"shareProduct()\">share</mat-icon>\n <ng-container *ngIf=\"!isMobile\">\n <lib-ngx-image-zoom [thumbImage]=\"currentImg\" [fullImage]=\"currentImg\" [zoomMode]=\"'hover'\" [magnification]=\"2\"\n [lensHeight]=\"100\" [lensWidth]=\"100\" style=\"height: 100%; width: 100%;\"></lib-ngx-image-zoom>\n </ng-container>\n <ng-container *ngIf=\"isMobile\">\n <img loading=\"lazy\" [src]=\"currentImg\" alt=\"\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!currentImg\">\n <img loading=\"lazy\" src=\"https://i.postimg.cc/hPS2JpV0/no-image-available.jpg\" alt=\"\">\n </ng-container>\n </div>\n <div class=\"img-list\" *ngIf=\"screenWidth <= 500\">\n <ng-container *ngFor=\"let img of itemImages\">\n <img loading=\"lazy\" onerror=\"this.src='https://i.postimg.cc/hPS2JpV0/no-image-available.jpg'\" [src]=\"img.imgUrl\"\n alt=\"\" class=\"img\" (click)=\"changeImg(img.imgUrl)\">\n </ng-container>\n </div>\n </ng-container>\n <div class=\"item-img\" *ngIf=\"varientLoading\">\n <ngx-skeleton-loader count=\"1\" appearance=\"circle\" [theme]=\"{\n width: '100%',\n height: '100%',\n 'border-radius': '10px',\n 'position': 'relative',\n 'right': '5px'\n }\">\n </ngx-skeleton-loader>\n </div>\n</ng-template>\n\n\n\n\n<!-- <div class=\"modal fade\" id=\"itemVarients\" tabindex=\"-1\" aria-labelledby=\"itemVarients\" aria-hidden=\"true\">\n <div class=\"modal-dialog\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Right-to-Left Modal</h5>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n </div>\n <div class=\"modal-body\">\n This content is aligned from right to left.\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n </div>\n </div>\n </div>\n</div> -->\n", styles: [".product-desc{display:flex}.share-icon{border:1.5px solid rgba(211,211,211,.382);position:absolute;top:10px;right:10px;z-index:1;opacity:.5;border-radius:50%;padding:5px;height:30px;width:30px;display:flex;align-items:center;justify-content:center;font-size:16px;box-shadow:#00000003 0 1px 2px;cursor:pointer}.row{margin-top:25px}.prod-img-block{height:100%;display:flex;gap:5px}.img-list{display:flex;flex-direction:column;gap:5px;max-height:460px;overflow:scroll}.img-list img{height:100px;width:100%;cursor:pointer}ngx-image-zoom{display:inline-block;position:relative}.ngx-image-zoom__zoomed{z-index:9999;max-width:100%;max-height:100%;object-fit:contain}.item-img{position:relative;width:500px;height:500px;overflow:hidden}.item-img img{width:100%!important;height:100%!important}.fast-checkout{position:absolute;top:10px;right:10px;display:flex;gap:10px;width:fit-content}.fast-checkout img{cursor:pointer}.selling-fast-tag{background-color:#fff;color:#000;padding:5px 10px;border-radius:3px;font-weight:700}.price{font-weight:600;font-family:Poppins;font-size:20px}.product-desc{margin-top:15px}.button-parent{margin-top:15px;display:flex;gap:10px;align-items:center}.quantity{display:flex;border:2px solid #E6E6E6;align-items:center;gap:15px;height:50px;width:155px;justify-content:space-between;margin-top:1rem;border-radius:5px}.quantity .plus{position:relative;left:10px;font-size:18px;font-weight:600;cursor:pointer;color:#848484}.quantity .minus{position:relative;right:15px;font-size:18px;font-weight:600;color:#848484;cursor:pointer}.quantity input{width:60px;border:none;outline:none;text-align:center}.trim-text{-webkit-line-clamp:3!important}.product-sku{margin-top:20px}.product-sku div{font-weight:400;font-size:15px;color:#848484;font-family:Poppins;margin-top:.5rem}.tab-group{display:flex;gap:10px;overflow-y:scroll}.tab{font-family:Poppins;font-weight:500;font-size:18px;color:#222;padding-bottom:2px;border-bottom:1px solid black}.discount-price{color:#d3d3d3;text-decoration:line-through;font-size:16px}.img-list>img{border:2px solid transparent;border-radius:3px}.out-of-stock{background-color:#d3d3d333;color:#000;padding:15px 20px;border-radius:5px;margin-top:15px}.varient-key{font-weight:500;font-size:16px;margin-top:10px;margin-bottom:5px}.varient-tag{background-color:#fff;color:#000;border-radius:3px;border:1px solid #d3d3d347;margin-right:5px;padding:5px 15px;cursor:pointer}.send-btn{display:flex;border:2px solid #E6E6E6;align-items:center;gap:15px;height:50px!important;width:130px!important;justify-content:space-between;margin-top:1rem;border-radius:5px}.disable-varient{text-decoration:line-through;cursor:not-allowed}.review-sec{box-shadow:#00000029 0 1px 4px;width:100%;padding:20px;margin:20px 0;display:flex;flex-direction:column;align-items:center;justify-content:center;border-radius:5px}.review-sec .title{font-size:26px;margin-bottom:10px}.review-sec button{border-radius:20px!important;background-color:transparent;padding:5px 15px;width:fit-content!important;margin:auto}.review-sec hr{border-top:1.5px solid lightgray;width:100%}.review-sec .user-review{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;width:100%}.review-sec .user-review>div{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%}.review-sec .user-review>div input{width:80%;margin:auto;border-radius:20px;padding:10px 10px 10px 20px;border:1.5px solid lightgray}.review-sec .user-review>div textarea{width:80%;border-radius:5px;padding:10px;border:1.5px solid lightgray}.review-sec .user-review .review-action-btn{display:flex;flex-direction:row;gap:10px}.review-sec .user-review .review-action-btn button{width:fit-content!important;font-size:16px!important;margin:5px!important;border:1px solid transparent}.review-sec .user-review .secondary-text{font-size:18px}.product-detail{overflow-y:auto}.above-height{height:90vh}.mobile-footer{display:none}@media (min-width: 1024px){.height{width:min-content}.above-height{width:100%;display:flex}.product-detail{padding:2%}.product-heading{font-size:35px}.prod-img-block{height:100%;display:flex;gap:5px}}@media only screen and (max-width: 475px){.mobile-footer{width:100vw;height:60px;box-shadow:#64646f33 -2px -16px 29px;position:fixed;bottom:0;z-index:100000001;background-color:#fff;display:flex!important;justify-content:space-around;align-items:center}.mobile-footer .icons{margin-top:5px;display:flex;color:#000;align-items:center;justify-content:center;gap:15px;width:20%}.mobile-footer .icons .mat-icon{font-size:26px}.total-container{padding-top:10px!important;padding-bottom:10px!important}.out-of-stock,.add-btn,.quantity{text-align:center;width:70%!important;border:none!important;padding:5px;margin-top:0!important}.quantity{border:1px solid rgba(211,211,211,.332)!important}.item-img{width:100%!important}.item-img img{width:100%;height:448px}.prod-img-block{flex-direction:column;gap:5px}.img-list{flex-direction:row;overflow-x:scroll}.img-list img{height:25%;width:25%;border:2px solid lightgray;cursor:pointer}.product-detail,.prod-desc{margin-top:20px}.product-img{height:220px}.send-btn{padding:.5rem 1rem!important}.favourite .mat-icon{padding:10px!important;position:relative!important;min-height:0px!important;height:43px!important;top:8px!important;min-width:52px!important}.review-sec :is(input,textarea){width:100%!important}.height{width:100%}.above-height{padding:0 20px;min-height:95vh!important;height:unset!important}.product-heading{font-size:25px}}.send-btn{font-size:16px!important;padding:1rem 2rem;display:inline-flex;align-items:center;justify-content:center;width:fit-content!important;margin-top:1rem}.favourite .mat-icon{min-height:55px;min-width:55px;font-size:35px;display:flex;align-items:center;justify-content:center;border-radius:5px;padding:30px 25px 25px;position:relative;top:5px;cursor:pointer}a{text-decoration:none}.body-large{color:#848484}.brief-desc{height:200px;overflow:scroll}.total-container{height:auto;position:relative;display:block!important}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.modal-dialog{height:100vh;position:absolute;top:0;margin:0;right:0;border:none}.modal-content{height:100%;border:none;border-radius:0!important}@media (min-width:768px) and (max-width:991px){.item-img{position:relative;width:auto!important;height:auto!important;overflow:hidden}.item-img img{height:auto!important;width:auto!important}.height{width:min-content}.above-height{width:100%;padding:2%;display:flex;flex-direction:column}.product-detail{padding:0vw 42vw 0vw 2vw}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:911px){.product-detail{padding:0% 34% 0% 2%}.above-height{display:flex}.prod-img-block{height:100%;display:flex;gap:5px}}@media (min-width:1024px){.product-detail{padding:0% 0% 0% 2%}.above-height{display:flex}.product-headig{font-size:35px}.prod-img-block{height:100%;display:flex;gap:5px}}\n"] }]
458
458
  }], ctorParameters: () => [{ type: Object, decorators: [{
459
459
  type: Inject,
460
460
  args: [PLATFORM_ID]
@@ -477,4 +477,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.4", ngImpor
477
477
  type: HostListener,
478
478
  args: ["window: resize", ["$event"]]
479
479
  }] } });
480
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXNjLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvZWNvbW1lcmNlL3NlY3Rpb25zL3Byb2R1Y3QtZGVzYy9wcm9kdWN0LWRlc2MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvcHJvZHVjdC1kZXNjL3Byb2R1Y3QtZGVzYy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0YsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUV6RixPQUFPLFdBQVcsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFNakUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzdGLE9B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ZEFDZixXQUFXOzsyRkFPRixvQkFBb0I7a0JBN0JoQyxTQUFTOytCQUNFLG9CQUFvQixjQUNsQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLG9CQUFvQjt3QkFDcEIsT0FBTzt3QkFDUCxjQUFjO3dCQUNkLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixtQkFBbUI7d0JBQ25CLHdCQUF3Qjt3QkFDeEIsa0JBQWtCO3dCQUNsQixtQkFBbUI7d0JBQ25CLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQix5QkFBeUI7d0JBQ3pCLG9CQUFvQjt3QkFDcEIsbUJBQW1CO3dCQUNuQixZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsV0FBVzt3QkFDWCx1QkFBdUI7cUJBQ3hCLGFBQ1UsQ0FBQyxjQUFjLENBQUM7OzBCQXlCeEIsTUFBTTsyQkFBQyxXQUFXO2dUQXBCa0MsZUFBZTtzQkFBckUsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRTVDLElBQUk7c0JBQVosS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBMk5OLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBQTEFURk9STV9JRCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFByb2R1Y3REZXNjTW9kYWwsIFByb2R1Y3REZXNjU3R5bGVzTW9kYWwgfSBmcm9tICcuL3Byb2R1Y3QtZGVzYy5tb2RhbCc7XHJcbmltcG9ydCB7IEl0ZW1JbWFnZSwgSXRlbVZhcmlhbnQsIFByb2R1Y3QgfSBmcm9tICcuLi8uLi9zdHlsZXMvcHJvZHVjdC5tb2RhbCc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQnV0dG9uRGlyZWN0aXZlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2J1dHRvbi1kaXJlY3RpdmUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQnV0dG9uTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9zdHlsZXMvc3R5bGUubW9kZWwnO1xyXG5pbXBvcnQgQmFzZVNlY3Rpb24gZnJvbSAnLi4vLi4vLi4vc2VjdGlvbnMvQmFzZVNlY3Rpb24nO1xyXG5pbXBvcnQgeyBBbmltYXRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYW5pbWF0aW9uLWRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEhvdmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2hvdmVyLWVsZW1lbnQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgQ29udGVudEZpdERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9jb250ZW50LWZpdC1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTaW1wb0NvbXBvbmVudE1vZHVsZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvaW5kZXgnO1xyXG5pbXBvcnQgeyBFdmVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi8uLi8uLi9zZXJ2aWNlcy9ldmVudHMuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NhcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTmd4SW1hZ2Vab29tTW9kdWxlIH0gZnJvbSAnbmd4LWltYWdlLXpvb20nO1xyXG5pbXBvcnQgeyBGZWF0dXJlZFByb2R1Y3RzQ29tcG9uZW50IH0gZnJvbSBcIi4uL2ZlYXR1cmVkLXByb2R1Y3RzL2ZlYXR1cmVkLXByb2R1Y3RzLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBGZWF0dXJlZFByb2R1Y3RNb2RhbCB9IGZyb20gJy4uL2ZlYXR1cmVkLXByb2R1Y3RzL2ZlYXR1cmVkLXByb2R1Y3RzLm1vZGFsJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT3JkZXJlZEl0ZW1zIH0gZnJvbSAnLi4vLi4vc3R5bGVzL09yZGVyZWRJdGVtcy5tb2RhbCc7XHJcbmltcG9ydCB7IEJVU0lORVNTX0NPTlNUQU5UUyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9idXNpbmVzcy5jb25zdGFudCc7XHJcbmltcG9ydCB7IFRvYXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b2FzdCc7XHJcbmltcG9ydCB7IE1lbnVJdGVtLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgTWV0YSwgVGl0bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgSXRlbVZhcmllbnRDb21wb25lbnQgfSBmcm9tICcuLi9pdGVtLXZhcmllbnQvaXRlbS12YXJpZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1hdEJvdHRvbVNoZWV0LCBNYXRCb3R0b21TaGVldE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2JvdHRvbS1zaGVldCc7XHJcbmltcG9ydCB7IEJhY2tncm91bmREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYmFja2dyb3VuZC1kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTaW1wb1dyYXBDb21udGFpbmVyIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL3dyYXAtY29udGFpbmVycy5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBDb2xvckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9jb2xvci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBTb2NpYUljb25zQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZWxlbWVudHMvc29jaWEtaWNvbnMvc29jaWEtaWNvbnMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUmF0aW5nTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9yYXRpbmcnO1xyXG5pbXBvcnQgeyBSZXZpZXcgfSBmcm9tICcuLi8uLi9zdHlsZXMvcmV2aWV3Lm1vZGFsJztcclxuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL3N0eWxlcy91c2VyLm1vZGFsJztcclxuaW1wb3J0IHsgU3BlZWREaWFsTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9zcGVlZGRpYWwnO1xyXG5pbXBvcnQgeyBDdXN0b21lclJldmlld0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NlY3Rpb25zL2N1c3RvbWVyLXJldmlldy9jdXN0b21lci1yZXZpZXcuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2ltcG8tcHJvZHVjdC1kZXNjJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgU2ltcG9Db21wb25lbnRNb2R1bGUsXHJcbiAgICBNYXRJY29uLFxyXG4gICAgQ29sb3JEaXJlY3RpdmUsXHJcbiAgICAvL0RJUkVDVElWRVxyXG4gICAgU2ltcG9XcmFwQ29tbnRhaW5lcixcclxuICAgIEJhY2tncm91bmREaXJlY3RpdmUsXHJcbiAgICBCdXR0b25EaXJlY3RpdmVEaXJlY3RpdmUsXHJcbiAgICBBbmltYXRpb25EaXJlY3RpdmUsXHJcbiAgICBDb250ZW50Rml0RGlyZWN0aXZlLFxyXG4gICAgSG92ZXJEaXJlY3RpdmUsXHJcbiAgICBOZ3hJbWFnZVpvb21Nb2R1bGUsXHJcbiAgICBGZWF0dXJlZFByb2R1Y3RzQ29tcG9uZW50LFxyXG4gICAgTWF0Qm90dG9tU2hlZXRNb2R1bGUsXHJcbiAgICBTb2NpYUljb25zQ29tcG9uZW50LFxyXG4gICAgUmF0aW5nTW9kdWxlLFxyXG4gICAgU3BlZWREaWFsTW9kdWxlLFxyXG4gICAgVG9hc3RNb2R1bGUsXHJcbiAgICBDdXN0b21lclJldmlld0NvbXBvbmVudFxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LWRlc2MuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9wcm9kdWN0LWRlc2MuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb2R1Y3REZXNjQ29tcG9uZW50IGV4dGVuZHMgQmFzZVNlY3Rpb24ge1xyXG4gIEBWaWV3Q2hpbGQoQ3VzdG9tZXJSZXZpZXdDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KSByZXZpZXdDb21wb25lbnQhOiBDdXN0b21lclJldmlld0NvbXBvbmVudDtcclxuXHJcbiAgQElucHV0KCkgZGF0YT86IFByb2R1Y3REZXNjTW9kYWw7XHJcbiAgQElucHV0KCkgcmVzcG9uc2VEYXRhITogUHJvZHVjdDtcclxuICBASW5wdXQoKSBpbmRleD86IG51bWJlcjtcclxuICBASW5wdXQoKSBlZGl0PzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBkZWxldGU/OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNsYXNzPzogc3RyaW5nO1xyXG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBmZWF0dXJlUHJvZHVjdERhdGE6IEZlYXR1cmVkUHJvZHVjdE1vZGFsIHwgbnVsbCA9IG51bGw7XHJcbiAgcHVibGljIHJlY2VudFZpZXdlZERhdGE6IEZlYXR1cmVkUHJvZHVjdE1vZGFsIHwgbnVsbCA9IG51bGw7XHJcbiAgcHVibGljIHZhcmllbnRzOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XHJcbiAgcHVibGljIHNlbGVjdGVkVmFyaWVudDogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcblxyXG4gIHB1YmxpYyByZWxhdGVkUHJvZHVjdERhdGE6IFByb2R1Y3RbXSA9IFtdO1xyXG4gIHB1YmxpYyBwcm9kdWN0UmV2aWV3OiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyB0b3RhbFJldmlldzogbnVtYmVyID0gNTtcclxuICBwdWJsaWMgc2hvd1JldmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZXZlbnRTZXJ2aWNlOiBFdmVudHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXN0U2VydmljZTogUmVzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXRhVGFnU2VydmljZTogTWV0YSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGl0bGVTZXJ2aWNlOiBUaXRsZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYm90dG9tU2hlZXQ6IE1hdEJvdHRvbVNoZWV0XHJcbiAgKSB7XHJcblxyXG4gICAgc3VwZXIoKVxyXG5cclxuICAgIC8vIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHsgbmFtZTogXCJkZXNjcmlwdGlvblwiLCBjb250ZW50OiBcIlRlc3RpbmdcIiB9KTtcclxuICAgIC8vIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6IFwib2c6dGl0bGVcIiwgY29udGVudDogXCJUaXRsZVwiIH0pO1xyXG4gICAgLy8gdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogXCJvZzppbWFnZVwiLCBjb250ZW50OiBcImh0dHBzOi8vZGV2LWJlZW9zLnMzLmFtYXpvbmF3cy5jb20vbGlicmFyeS1tZWRpYS84NDg3MjhjMTcyNjA4NjAwOTY1NmltYWdlcy5wbmdcIiB9KTtcclxuICAgIC8vIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6IFwib2c6ZGVzY3JpcHRpb25cIiwgY29udGVudDogXCJEZXNjcmlwdGlvblwiIH0pO1xyXG4gICAgLy8gdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogXCJvZzpzaXRlX25hbWVcIiwgY29udGVudDogXCJuYXR1cmFsc1wiIH0pO1xyXG4gICAgLy8gdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogXCJvZzp0eXBlXCIsIGNvbnRlbnQ6IFwid2Vic2l0ZVwiIH0pO1xyXG4gICAgLy8gdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogXCJvZzp1cmxcIiwgY29udGVudDogXCJodHRwczovL25hdHVyYWxzLmRldi5zaW1wby5haS9cIiB9KTtcclxuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgIHRoaXMuZ2V0U2NyZWVuU2l6ZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZXZlbnRTZXJ2aWNlLnNob3dMb2FkaW5nU2NyZWVuLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSByZXNwb25zZTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBidXR0b25JZD86IHN0cmluZztcclxuICBidXR0b24/OiBCdXR0b25Nb2RlbFxyXG4gIHN0eWxlcz86IFByb2R1Y3REZXNjU3R5bGVzTW9kYWw7XHJcblxyXG4gIGlzSXRlbUFzRmF2b3JpdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBVU0VSX0NBUlQ6IE9yZGVyZWRJdGVtc1tdIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBVU0VSX1dJU0hMSVNUOiBPcmRlcmVkSXRlbXNbXSB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyBpdGVtSW1hZ2VzOiBJdGVtSW1hZ2VbXSA9IFtdO1xyXG4gIGl0ZW1zOiBNZW51SXRlbVtdIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5mZWF0dXJlUHJvZHVjdERhdGEgPSBuZXcgRmVhdHVyZWRQcm9kdWN0TW9kYWwodGhpcy5kYXRhKTtcclxuICAgIHRoaXMucmVjZW50Vmlld2VkRGF0YSA9IG5ldyBGZWF0dXJlZFByb2R1Y3RNb2RhbCh0aGlzLmRhdGEsIHRydWUpO1xyXG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLmRhdGE/LnN0eWxlcztcclxuICAgIHRoaXMuY3VycmVudEltZyA9IHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW1hZ2VzWzBdPy5pbWdVcmxcclxuICAgIHRoaXMuYnV0dG9uID0gdGhpcy5kYXRhPy5hY3Rpb24/LmJ1dHRvbnNbMF07XHJcbiAgICB0aGlzLmJ1dHRvbklkID0gKHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5pZCA6ICcnKSArICh0aGlzLmJ1dHRvbiA/IHRoaXMuYnV0dG9uLmlkIDogJycpO1xyXG5cclxuICAgIHRoaXMuaXRlbXMgPSBbXHJcbiAgICAgIHtcclxuICAgICAgICBpY29uOiBcInBpIHBpLWhlYXJ0XCIsXHJcbiAgICAgICAgY29tbWFuZDogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvd2lzaGxpc3QnXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWNvbjogXCJwaSBwaS1zaGFyZS1hbHRcIixcclxuICAgICAgICBjb21tYW5kOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNoYXJlUHJvZHVjdCgpO1xyXG4gICAgICAgICAgLy8gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQod2luZG93LmxvY2F0aW9uLmhyZWYpO1xyXG4gICAgICAgICAgLy8gdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnQ29waWVkJywgZGV0YWlsOiAnWW91IGNhbiBzaGFyZSB0aGUgdXJsJywga2V5OiAnd2lzaGxpc3QnIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgXTtcclxuICAgIHRoaXMuZ2V0UHJvZHVjdEJ5Q2F0ZWdvcnkoKTtcclxuICAgIHRoaXMuX2V2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gcmVzcG9uc2U7XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChxUGFyYW0pID0+IHtcclxuICAgICAgY29uc3QgcHJvZHVjdElkID0gcVBhcmFtW1wiaWRcIl07XHJcbiAgICAgIGlmIChwcm9kdWN0SWQpIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRQcm9kdWN0RGV0YWlscyhwcm9kdWN0SWQpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlWzBdO1xyXG4gICAgICAgICAgdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50LCBpZHg6IG51bWJlcik9PiB7XHJcbiAgICAgICAgICAgIHZhcmllbnQucXVhbnRpdHkgPSAwO1xyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyh2YXJpZW50LnByb3BlcnRpZXMpLmZvckVhY2goKHZhcmllbnRLZXk6IHN0cmluZyk9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGlkeCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFZhcmllbnQuc2V0KHZhcmllbnRLZXksIHZhcmllbnQucHJvcGVydGllc1t2YXJpZW50S2V5XSk7XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhcmllbnRzLmdldCh2YXJpZW50S2V5KT8uaW5jbHVkZXModmFyaWVudC5wcm9wZXJ0aWVzW3ZhcmllbnRLZXldKSlcclxuICAgICAgICAgICAgICAgIHRoaXMudmFyaWVudHMuc2V0KHZhcmllbnRLZXksIFsuLi4odGhpcy52YXJpZW50cy5nZXQodmFyaWVudEtleSkgPz8gW10pLCB2YXJpZW50LnByb3BlcnRpZXNbdmFyaWVudEtleV1dKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5nZXRSZWxhdGVkUHJvZHVjdHMoKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBjb25zdCBpdGVtVmFyaWFudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudCgpO1xyXG4gICAgICAgICAgaWYgKGl0ZW1WYXJpYW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JbWFnZXMgPSBpdGVtVmFyaWFudC52YXJpYW50SW1hZ2VzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJEZXNjcmlwdGlvblwiLCB0aGlzLnJlc3BvbnNlRGF0YT8ubmFtZSwgdGhpcy5yZXNwb25zZURhdGE/LmRlc2NyaXB0b3I/Lm5hbWUpO1xyXG4gICAgICAgICAgdGhpcy50aXRsZVNlcnZpY2Uuc2V0VGl0bGUodGhpcy5yZXNwb25zZURhdGE/Lm5hbWUpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1JbWFnZXMgPSB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW1hZ2VzO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlckNhcnQoKS50aGVuKChjYXJ0UmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICBjYXJ0UmVzcG9uc2Uub25zdWNjZXNzID0gKGNhcnREYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuVVNFUl9DQVJUID0gY2FydERhdGEudGFyZ2V0LnJlc3VsdCBhcyB1bmtub3duIGFzIE9yZGVyZWRJdGVtc1tdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5VU0VSX0NBUlQ/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtSWQgPT0gcHJvZHVjdElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1WYXJpYW50ICYmIGl0ZW0udmFyaWVudElkID09IGl0ZW1WYXJpYW50LnZhcmlhbnRJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtVmFyaWFudC5xdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcldoaXNobGlzdCgpLnRoZW4oKHdpc2hsaXN0UmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICB3aXNobGlzdFJlc3BvbnNlLm9uc3VjY2VzcyA9ICh3aGlzbGlzdERhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUID0gd2hpc2xpc3REYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuVVNFUl9XSVNITElTVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtLml0ZW1JZCA9PSBwcm9kdWN0SWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtVmFyaWFudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1WYXJpYW50ICYmIGl0ZW1WYXJpYW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtVmFyaWFudC53aXNobGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJdGVtQXNGYXZvcml0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJdGVtQXNGYXZvcml0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEltZyA9IHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW1hZ2VzPy5bMF0/LmltZ1VybDtcclxuICAgICAgICAgICAgdGhpcy5nZXRQcm9kdWN0QnlDYXRlZ29yeSgpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnJlc3BvbnNlRGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbiAgdmFyaWVudExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICByZWNlbnRWaWV3SXRlbUxpc3Q6IFByb2R1Y3RbXSA9IFtdO1xyXG4gIGdldFJlbGF0ZWRQcm9kdWN0cygpIHtcclxuICAgIGNvbnN0IHVzZXJEZXRhaWxzOiBVc2VyIHwgbnVsbCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpO1xyXG4gICAgaWYgKCEhdXNlckRldGFpbHMpIHtcclxuICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRSZWNlbnRWaWV3UHJvZHVjdCh1c2VyRGV0YWlscy51c2VySWQpLnN1YnNjcmliZSgocmVzcG9uc2UpPT4ge1xyXG4gICAgICAgIHRoaXMucmVjZW50Vmlld0l0ZW1MaXN0ID0gcmVzcG9uc2U7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG4gIHNlbGVjdFZhcmllbnQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMudmFyaWVudExvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5zZWxlY3RlZFZhcmllbnQuc2V0KGtleSwgdmFsdWUpO1xyXG4gICAgdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5mb3JFYWNoKCh2YXJpZW50OiBJdGVtVmFyaWFudCk9PiB7XHJcbiAgICAgIGxldCBmb3VuZFZhcmllbnQgPSB0cnVlO1xyXG4gICAgICBPYmplY3Qua2V5cyh2YXJpZW50LnByb3BlcnRpZXMpLmZvckVhY2goKHByb3BlcnR5OiBzdHJpbmcpPT4ge1xyXG4gICAgICAgIGZvdW5kVmFyaWVudCA9ICh0aGlzLnNlbGVjdGVkVmFyaWVudC5nZXQocHJvcGVydHkpID09IHZhcmllbnQucHJvcGVydGllc1twcm9wZXJ0eV0pICYmIGZvdW5kVmFyaWVudDtcclxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnNlbGVjdGVkVmFyaWVudC5nZXQocHJvcGVydHkpLCB2YXJpZW50LnByb3BlcnRpZXNbcHJvcGVydHldKTtcclxuICAgICAgfSlcclxuICAgICAgY29uc29sZS5sb2coZm91bmRWYXJpZW50KTtcclxuICAgICAgaWYgKGZvdW5kVmFyaWVudCkge1xyXG4gICAgICAgIHRoaXMuaXRlbUltYWdlcyA9IHZhcmllbnQudmFyaWFudEltYWdlcztcclxuICAgICAgICB0aGlzLmN1cnJlbnRJbWcgPSB0aGlzLml0ZW1JbWFnZXNbMF0/LmltZ1VybDtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5wcmljZSA9IHZhcmllbnQuaXRlbVZhcmlhbnRQcmljZTtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW52ZW50b3J5ID0gdmFyaWVudC5pdGVtSW52ZW50b3J5O1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCA9IHZhcmllbnQudmFyaWFudElkO1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gdGhpcy5nZXRWYXJpZW50UXVhbnRpdHkodmFyaWVudCk7XHJcbiAgICAgICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gdGhpcy5pc1ZhcmllbnRQcmVzZW50SW5XaXNodGxpc3QodmFyaWVudCk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBzZXRUaW1lb3V0KCgpPT4ge1xyXG4gICAgICB0aGlzLnZhcmllbnRMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9LCAzMDApO1xyXG4gIH1cclxuICBnZXRJdGVtVmFyaWVudCgpOiBJdGVtVmFyaWFudCB8IG51bGwge1xyXG4gICAgbGV0IHNlbGVjdGVkVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gbnVsbDtcclxuICAgIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8uZm9yRWFjaCgodmFyaWVudDogSXRlbVZhcmlhbnQpPT4ge1xyXG4gICAgICBsZXQgZm91bmRWYXJpZW50ID0gdHJ1ZTtcclxuICAgICAgT2JqZWN0LmtleXModmFyaWVudC5wcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKT0+IHtcclxuICAgICAgICBmb3VuZFZhcmllbnQgPSAodGhpcy5zZWxlY3RlZFZhcmllbnQuZ2V0KHByb3BlcnR5KSA9PSB2YXJpZW50LnByb3BlcnRpZXNbcHJvcGVydHldKSAmJiBmb3VuZFZhcmllbnQ7XHJcbiAgICAgIH0pXHJcbiAgICAgIGlmIChmb3VuZFZhcmllbnQpXHJcbiAgICAgICAgc2VsZWN0ZWRWYXJpZW50ID0gdmFyaWVudDtcclxuICAgIH0pXHJcblxyXG4gICAgcmV0dXJuIHNlbGVjdGVkVmFyaWVudDtcclxuICB9XHJcblxyXG4gIHNoYXJlUHJvZHVjdCgpIHtcclxuICAgIG5hdmlnYXRvci5zaGFyZSh7XHJcbiAgICAgIHRpdGxlOiAnQnV5ICcgKyB0aGlzLnJlc3BvbnNlRGF0YT8ubmFtZSxcclxuICAgICAgdGV4dDogdGhpcy5yZXNwb25zZURhdGEuYnJpZWY/LnJlcGxhY2UoLzxcXC9bXj5dKyg+fCQpL2csIFwiXCIpLFxyXG4gICAgICB1cmw6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxyXG4gICAgfSlcclxuICAgIC50aGVuKCgpID0+IHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ1NoYXJlZCcsIGRldGFpbDogJ1Byb2R1Y3Qgc2hhcmVkJywga2V5OiAnd2lzaGxpc3QnIH0pKVxyXG4gICAgLmNhdGNoKChlcnJvcikgPT4gdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ1NoYXJlZCcsIGRldGFpbDogJ0ZhaWxlZCB0byBzaGFyZSBwcm9kdWN0LiBUcnkgQWdhaW4uJywga2V5OiAnd2lzaGxpc3QnIH0pKTtcclxuXHJcbiAgfVxyXG4gIHJvdXRlVG9Ib21lKCkge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pO1xyXG4gIH1cclxuXHJcbiAgc2NyZWVuV2lkdGg6IGFueTtcclxuICBASG9zdExpc3RlbmVyKFwid2luZG93OiByZXNpemVcIiwgW1wiJGV2ZW50XCJdKVxyXG4gIGdldFNjcmVlblNpemUoKSB7XHJcbiAgICB0aGlzLnNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgfVxyXG5cclxuICBjdXJyZW50SW1nOiBhbnk7XHJcbiAgY2hhbmdlSW1nKHVybDogYW55KSB7XHJcbiAgICB0aGlzLmN1cnJlbnRJbWcgPSB1cmw7XHJcbiAgfVxyXG5cclxuICBnZXRLZXlzKHZhcmllbnQ6IE9iamVjdCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyh2YXJpZW50KTtcclxuICB9XHJcblxyXG4gIGdvVG9DYXJ0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY2FydCddKTtcclxuICB9XHJcblxyXG4gIGFkZFRvQ2FydCh0eXBlOiAnQUREJyB8ICdTVUJTVFJBQ1QnID0gJ0FERCcpIHtcclxuICAgIGlmICh0aGlzLmlzSXRlbU91dE9mU3RvY2spIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3dhcm4nLCBzdW1tYXJ5OiAnQ2FydCcsIGRldGFpbDogJ0l0ZW0gaXMgbm90IGF2YWlsYWJsZSBhcyBvZiBub3cuIFdlIHdpbGwgbm90aWZ5IHlvdSBvbmNlIGF2YWlsYWJsZScgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1WYXJpZW50OiBJdGVtVmFyaWFudCB8IG51bGwgPSB0aGlzLmdldEl0ZW1WYXJpZW50KCk7XHJcbiAgICAgIGlmIChpdGVtVmFyaWVudCkge1xyXG4gICAgICAgIGl0ZW1WYXJpZW50LnF1YW50aXR5ICs9ICh0eXBlID09ICdBREQnID8gMSA6IC0xKTtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSA9IGl0ZW1WYXJpZW50LnF1YW50aXR5O1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JbnZlbnRvcnkgPSBpdGVtVmFyaWVudC5pdGVtSW52ZW50b3J5O1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JbWFnZXMgPSBpdGVtVmFyaWVudC52YXJpYW50SW1hZ2VzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkpIHtcclxuICAgICAgICBsZXQgaXNQcmVzZW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5VU0VSX0NBUlQ/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xyXG4gICAgICAgICAgaWYgKGl0ZW0udmFyaWVudElkID09IHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCkge1xyXG4gICAgICAgICAgICBpdGVtLnF1YW50aXR5ID0gdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHk7XHJcbiAgICAgICAgICAgIGlzUHJlc2VudCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICBpZiAoIWlzUHJlc2VudClcclxuICAgICAgICAgIHRoaXMuVVNFUl9DQVJUPy5wdXNoKG5ldyBPcmRlcmVkSXRlbXModGhpcy5yZXNwb25zZURhdGEsIHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuVVNFUl9DQVJUID0gdGhpcy5VU0VSX0NBUlQ/LmZpbHRlcigoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiBpdGVtLnZhcmllbnRJZCAhPSB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpID8/IFtdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0NhcnQodGhpcy5yZXNwb25zZURhdGEgYXMgUHJvZHVjdCwgaXRlbVZhcmllbnQ/LnZhcmlhbnRJZCk7XHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgaWYgKCF0aGlzLnJlc3BvbnNlRGF0YT8ucXVhbnRpdHkpXHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSAwO1xyXG4gICAgICBpZiAodHlwZSA9PSAnQUREJykge1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ICs9IDE7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgLT0gMTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9DYXJ0KHRoaXMucmVzcG9uc2VEYXRhIGFzIFByb2R1Y3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ29Ub0ZpbHRlcihjYXRlZ29yeTogc3RyaW5nKSB7XHJcbiAgICBjYXRlZ29yeSA9IGNhdGVnb3J5LnJlcGxhY2VBbGwoXCIgXCIsIFwiX1wiKVxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydsaXN0J10sIHsgcXVlcnlQYXJhbXM6IHsgY2F0ZWdvcnk6IGNhdGVnb3J5IH0gfSk7XHJcbiAgfVxyXG5cclxuICBhZGRUb0Zhdm91cml0ZSgpIHtcclxuICAgIHRoaXMuaXNJdGVtQXNGYXZvcml0ZSA9IHRydWU7XHJcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdTdWNjZXNzJywgZGV0YWlsOiAnSXRlbSBhZGRlZCB0byB5b3VyIHdpc2hsaXN0Jywga2V5OiAnd2lzaGxpc3QnIH0pO1xyXG4gICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBpdGVtVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gdGhpcy5nZXRJdGVtVmFyaWVudCgpO1xyXG4gICAgICBpZiAoaXRlbVZhcmllbnQpIHtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW52ZW50b3J5ID0gaXRlbVZhcmllbnQuaXRlbUludmVudG9yeTtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW1hZ2VzID0gaXRlbVZhcmllbnQudmFyaWFudEltYWdlcztcclxuICAgICAgICBpdGVtVmFyaWVudC53aXNobGlzdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9GYXZvdXJpdGUodGhpcy5yZXNwb25zZURhdGEgYXMgUHJvZHVjdCwgaXRlbVZhcmllbnQudmFyaWFudElkKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9GYXZvdXJpdGUodGhpcy5yZXNwb25zZURhdGEgYXMgUHJvZHVjdCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlKSB7XHJcbiAgICAgIHRoaXMuVVNFUl9XSVNITElTVD8ucHVzaChuZXcgT3JkZXJlZEl0ZW1zKHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuVVNFUl9XSVNITElTVCA9IHRoaXMuVVNFUl9XSVNITElTVD8uZmlsdGVyKChpdGVtOiBPcmRlcmVkSXRlbXMpID0+IGl0ZW0udmFyaWVudElkICE9IHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCkgPz8gW107XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJlbW92ZVRvRmF2b3VyaXRlKCkge1xyXG4gICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gZmFsc2U7XHJcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdTdWNjZXNzJywgZGV0YWlsOiAnSXRlbSByZW1vdmVkIGZyb20geW91ciB3aXNobGlzdCcsIGtleTogJ3dpc2hsaXN0JyB9KTtcclxuICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcclxuICAgICAgaWYgKGl0ZW1WYXJpZW50KSB7XHJcbiAgICAgICAgaXRlbVZhcmllbnQud2lzaGxpc3QgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLnJlbW92ZUl0ZW1Gcm9tRmF2b3VyaXRlKHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2FydFNlcnZpY2UucmVtb3ZlSXRlbUZyb21GYXZvdXJpdGUodGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFByb2R1Y3RCeUNhdGVnb3J5KCkge1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRQcm9kdWN0QnlDYXRlZ29yeUlkKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtQ2F0ZWdvcmlzYXRpb24/Lml0ZW1DYXRlZ29yaWVzPy5bMF0/LnJlZklkID8/IFwiXCIpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnJlbGF0ZWRQcm9kdWN0RGF0YSA9IHJlc3BvbnNlLmRhdGE/LmZpbHRlcigocHJvZHVjdDogUHJvZHVjdCkgPT4gdGhpcy5yZXNwb25zZURhdGEuaXRlbUlkICE9IHByb2R1Y3QuaXRlbUlkKTtcclxuICAgICAgaWYgKHRoaXMucmVsYXRlZFByb2R1Y3REYXRhPy5sZW5ndGggPT0gMClcclxuICAgICAgICB0aGlzLmdldFByb2R1Y3RCeUNvbGxlY3Rpb24oKTtcclxuICAgIH0pXHJcbiAgfVxyXG4gIGdldFByb2R1Y3RCeUNvbGxlY3Rpb24oKSB7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldFByb2R1Y3RCeUNvbGxlY3Rpb25JZCh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5pdGVtQ29sbGVjdGlvbj8uWzBdLnJlZklkID8/IFwiXCIpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSk9PiB7XHJcbiAgICAgIHRoaXMucmVsYXRlZFByb2R1Y3REYXRhID0gcmVzcG9uc2UuZGF0YT8uZmlsdGVyKChwcm9kdWN0OiBQcm9kdWN0KSA9PiB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSWQgIT0gcHJvZHVjdC5pdGVtSWQpO1xyXG4gICAgfSlcclxuICB9XHJcbiAgY2hhbmdlUHJvZHVjdChwcm9kdWN0OiBQcm9kdWN0KSB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9kZXRhaWxzJ10sIHtxdWVyeVBhcmFtczoge2lkOiBwcm9kdWN0Lml0ZW1JZH19KTtcclxuICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID0gMDtcclxuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gIH1cclxuICBnZXRLZXlCeUlkeChwcm9wZXJ0eTogYW55LCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocHJvcGVydHkpW2luZGV4XTtcclxuICB9XHJcbiAgaXNWYXJpZW50QXZhaWxhYmxlKHZhcmllbnQ6IGFueSk6IGJvb2xlYW4ge1xyXG5cclxuICAgIC8vIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8uZm9yRWFjaCgodmFyaWVudDogSXRlbVZhcmlhbnQpPT4ge1xyXG4gICAgLy8gICBsZXQgZm91bmRWYXJpZW50ID0gdHJ1ZTtcclxuICAgIC8vICAgT2JqZWN0LmtleXModmFyaWVudC5wcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKT0+IHtcclxuICAgIC8vICAgICAvLyBmb3VuZFZhcmllbnQgPSAodmFyaWVudEtleSA9PSB2YXJpZW50LnByb3BlcnRpZXNbcHJvcGVydHldKSAmJiBmb3VuZFZhcmllbnQ7XHJcbiAgICAvLyAgIH0pXHJcbiAgICAvLyB9KVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgcmV2aWV3VGl0bGU6IHN0cmluZyA9IFwiXCI7XHJcbiAgcmV2aWV3RGVzY3JpcHRpb246IHN0cmluZyA9IFwiXCI7XHJcbiAgYWRkUHJvZHVjdFJldmlldygpIHtcclxuICAgIGNvbnN0IHVzZXJEZXRhaWxzOiBVc2VyIHwgbnVsbCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpO1xyXG5cclxuICAgIGlmICh0aGlzLnJldmlld1RpdGxlLmxlbmd0aCA9PSAwICYmIHRoaXMucmV2aWV3RGVzY3JpcHRpb24ubGVuZ3RoID09IDAgJiYgdGhpcy5wcm9kdWN0UmV2aWV3ID09IDApXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBpZiAoIXVzZXJEZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ0xvZ2luJywgZGV0YWlsOiAnUGxlYXNlIGxvZ2luIHRvIHBvc3QgcmV2aWV3Jywga2V5OiAnd2lzaGxpc3QnIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXlsb2FkOiBSZXZpZXcgPSB7XHJcbiAgICAgIHByb2R1Y3RJZDogdGhpcy5yZXNwb25zZURhdGEuaXRlbUlkLFxyXG4gICAgICB1c2VySWQ6IHVzZXJEZXRhaWxzLnVzZXJJZCxcclxuICAgICAgcmF0aW5nOiB0aGlzLnByb2R1Y3RSZXZpZXcsXHJcbiAgICAgIHJldmlldzogdGhpcy5yZXZpZXdEZXNjcmlwdGlvbixcclxuICAgICAgdXNlck5hbWU6IHVzZXJEZXRhaWxzPy5jb250YWN0Py5uYW1lLFxyXG4gICAgICB0aXRsZTogdGhpcy5yZXZpZXdUaXRsZSxcclxuICAgICAgcHJvZHVjdEltYWdlczogW11cclxuICAgIH1cclxuICAgIHRoaXMucmVzdFNlcnZpY2UuYWRkUmV2aWV3KHBheWxvYWQpLnN1YnNjcmliZSgocmVzcG9uc2UpPT4ge1xyXG4gICAgICB0aGlzLnNob3dSZXZpZXcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5yZXNwb25zZURhdGEucmF0aW5nICs9IDE7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1JldmlldycsIGRldGFpbDogJ1RoYW5rcyBmb3IgZ2l2aW5nIHlvdXIgZmVlZGJhY2snLCBrZXk6ICd3aXNobGlzdCcgfSk7XHJcbiAgICAgIGlmKHRoaXMucmV2aWV3Q29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5yZXZpZXdDb21wb25lbnQuZ2V0QWxsUmV2aWV3cygpO1xyXG4gICAgICB9XHJcbiAgICB9LCAoZXJyb3IpPT4ge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnUmV2aWV3JywgZGV0YWlsOiBlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UsIGtleTogJ3dpc2hsaXN0JyB9KTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFZhcmllbnRRdWFudGl0eShwcm9kdWN0VmFyaWVudDogSXRlbVZhcmlhbnQpOiBudW1iZXIge1xyXG4gICAgbGV0IGl0ZW1RdWFudGl0eTogbnVtYmVyID0gMDtcclxuICAgIHRoaXMuVVNFUl9DQVJUPy5mb3JFYWNoKChpdGVtOiBPcmRlcmVkSXRlbXMpPT4ge1xyXG4gICAgICAgIGlmIChwcm9kdWN0VmFyaWVudC52YXJpYW50SWQgPT0gaXRlbS52YXJpZW50SWQpXHJcbiAgICAgICAgICBpdGVtUXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xyXG4gICAgfSlcclxuICAgIHJldHVybiBpdGVtUXVhbnRpdHk7XHJcbiAgfVxyXG4gIHByaXZhdGUgaXNWYXJpZW50UHJlc2VudEluV2lzaHRsaXN0KHByb2R1Y3RWYXJpZW50OiBJdGVtVmFyaWFudCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHByZXNlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHRoaXMuVVNFUl9XSVNITElTVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKT0+IHtcclxuICAgICAgICBpZiAocHJvZHVjdFZhcmllbnQudmFyaWFudElkID09IGl0ZW0udmFyaWVudElkKVxyXG4gICAgICAgICAgcHJlc2VudCA9IHRydWU7XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHByZXNlbnQ7XHJcbiAgfVxyXG5cclxuICBlZGl0U2VjdGlvbigpe1xyXG5cclxuICAgIGlmKHdpbmRvdy5pbm5lcldpZHRoIDw9IDQ3NSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuX2V2ZW50U2VydmljZS50b2dnbGVFZGl0b3JFdmVudC5lbWl0KGZhbHNlKTtcclxuICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcbiAgICAgIHRoaXMuX2V2ZW50U2VydmljZS5lZGl0U2VjdGlvbi5lbWl0KHtkYXRhOnRoaXMuZGF0YX0pO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0l0ZW1PdXRPZlN0b2NrKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW52ZW50b3J5Py5vcGVuaW5nU3RvY2sgPT0gMDtcclxuICB9XHJcbiAgZ2V0IGN1cnJlbmN5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gQlVTSU5FU1NfQ09OU1RBTlRTLkNVUlJFTkNZO1xyXG4gIH1cclxuICBnZXQgaXNJdGVtTG93U3RvY2soKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1JbnZlbnRvcnk/Lm9wZW5pbmdTdG9jayA8IDU7XHJcbiAgfVxyXG4gIGdldCBpc01vYmlsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCA8PSA0NzU7XHJcbiAgfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nXCI+XHJcbiAgPHAtdG9hc3QgcG9zaXRpb249XCJib3R0b20tcmlnaHRcIiBbYmFzZVpJbmRleF09XCIxMDAwMDAwMDAwMFwiIFthdXRvWkluZGV4XT1cInRydWVcIiBrZXk9XCJ3aXNobGlzdFwiXHJcbiAgICBbc2hvd1RyYW5zZm9ybU9wdGlvbnNdPVwiaXNNb2JpbGUgPyAndHJhbnNsYXRlWSgtMTAwJSknIDogJydcIj48L3AtdG9hc3Q+XHJcbiAgPHNlY3Rpb24gY2xhc3M9XCJ0b3RhbC1jb250YWluZXJcIiBbaWRdPVwiZGF0YT8uaWRcIiBbc2ltcG9MYXlvdXRdPVwic3R5bGVzPy5sYXlvdXRcIiBbc2ltcG9CYWNrZ3JvdW5kXT1cInN0eWxlcz8uYmFja2dyb3VuZFwiXHJcbiAgICBzaW1wb0hvdmVyIChob3ZlcmluZyk9XCJzaG93RWRpdFRhYnMoJGV2ZW50KVwiIFthdHRyLnN0eWxlXT1cImN1c3RvbUNsYXNzXCIgPlxyXG5cclxuICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCIgY2xhc3M9XCJzcGVlZGRpYWwtbGluZWFyXCIgKm5nSWY9XCJpc01vYmlsZVwiPlxyXG4gICAgICA8cC1zcGVlZERpYWwgW21vZGVsXT1cIml0ZW1zXCIgZGlyZWN0aW9uPVwidXBcIiBbYnV0dG9uU3R5bGVdPVwieydib3JkZXItcmFkaXVzJzogJzUwJScsICdoZWlnaHQnOiAnMzBweCd9XCIgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPHNlY3Rpb24gY2xhc3M9XCJjb250YWluZXJcIiBbaWRdPVwiZGF0YT8uaWRcIiBbc2ltcG9BbmltYXRpb25dPVwic3R5bGVzPy5hbmltYXRpb25cIj5cclxuICAgICAgPGRpdj48YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IG5vbmU7IGNvbG9yOiAjMDI2N0MxXCIgKGNsaWNrKT1cInJvdXRlVG9Ib21lKClcIj5Ib21lPC9hPiAvXHJcbiAgICAgICAgPHNwYW4+e3sgcmVzcG9uc2VEYXRhPy5uYW1lIHwgdGl0bGVjYXNlIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBoLTEwMFwiIHN0eWxlPVwibWFyZ2luLXRvcDogMjVweDtcIiAgY2xhc3M9XCJhYm92ZS1oZWlnaHRcIiBbbmdTdHlsZV09XCJ7J21pbi1oZWlnaHQ6IDk1dmgnOiBpc01vYmlsZSwgJ21heC13aWR0aDogOTV2aCc6ICFpc01vYmlsZX1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTYgY29sLTEyIGgtMTAwXCIgY2xhc3M9XCJoZWlnaHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kLWltZy1ibG9ja1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiSW1hZ2VTZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTYgY29sLTEyIGgtMTAwIHByb2R1Y3QtZGV0YWlsXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiUHJvZHVjdERlc2NcIj48L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTW9iaWxlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJBY3Rpb25CdG5cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmllbnQgb2YgdmFyaWVudHMgfCBrZXl2YWx1ZVwiPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YXJpZW50LWtleVwiPnt7dmFyaWVudC5rZXl9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiBzdHlsZT1cImdhcDogNXB4O1wiPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gW2F0dHIuY2xhc3NdPVwiIWlzVmFyaWVudEF2YWlsYWJsZSh2YXJpZW50KSA/ICd2YXJpZW50LXRhZyBkaXNhYmxlLXZhcmllbnQnIDogJ3ZhcmllbnQtdGFnJ1wiIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdmFyaWVudFZhbHVlIG9mIHZhcmllbnQudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ2YXJpZW50LXRhZ1wiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzZWxlY3RlZFZhcmllbnQuZ2V0KHZhcmllbnQua2V5KSA9PSB2YXJpZW50VmFsdWUgPyAnd2hpdGUnIDogZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwic2VsZWN0ZWRWYXJpZW50LmdldCh2YXJpZW50LmtleSkgPT0gdmFyaWVudFZhbHVlID8gZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFZhcmllbnQodmFyaWVudC5rZXksIHZhcmllbnRWYWx1ZSlcIj57e3ZhcmllbnRWYWx1ZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtZGVzYyBib2R5LWxhcmdlIGQtYmxvY2sgdHJpbS10ZXh0XCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmJyaWVmXCIgW2lubmVySFRNTF09XCJyZXNwb25zZURhdGEuYnJpZWZcIj48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LXNrdVwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5pdGVtSW52ZW50b3J5XCI+U0tVIDoge3tyZXNwb25zZURhdGEuaXRlbUludmVudG9yeT8ub3BlbmluZ1N0b2NrfX08L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5pdGVtQ2F0ZWdvcmllcyAmJiAocmVzcG9uc2VEYXRhPy5pdGVtQ2F0ZWdvcmlzYXRpb24/Lml0ZW1DYXRlZ29yaWVzPy5sZW5ndGggfHwgMCkgPiAwXCI+Q2F0ZWdvcnkgOiA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvRmlsdGVyKGNhdC5yZWZOYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2F0IG9mIHJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5pdGVtQ2F0ZWdvcmllcztsZXQgaWR4ID0gaW5kZXhcIj57e2NhdC5yZWZOYW1lIHxcclxuICAgICAgICAgICAgICAgIHRpdGxlY2FzZX19IDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoaWR4KzEpICE9IHJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5pdGVtQ2F0ZWdvcmllcz8ubGVuZ3RoXCI+LDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvYT48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIihyZXNwb25zZURhdGE/Lml0ZW1DYXRlZ29yaXNhdGlvbj8ucHJvZHVjdFRhZ3M/Lmxlbmd0aCB8fCAwKSA+IDBcIj5UYWdzIDogPHNwYW5cclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB0YWcgb2YgcmVzcG9uc2VEYXRhPy5pdGVtQ2F0ZWdvcmlzYXRpb24/LnByb2R1Y3RUYWdzXCI+e3t0YWcudGFnTmFtZX19LFxyXG4gICAgICAgICAgICAgIDwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiU29jaWFsSWNvbnNcIj48L25nLWNvbnRhaW5lcj4gLS0+XHJcbiAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJSZXZpZXdTZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IHByb2QtZGVzY1wiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5kZXNjcmlwdG9yPy5uYW1lXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1ncm91cFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRhYlwiPkRlc2NyaXB0aW9uPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEwcHg7XCIgY2xhc3M9XCJib2R5LWxhcmdlIGJyaWVmLWRlc2NcIiAqbmdJZj1cInJlc3BvbnNlRGF0YT8uZGVzY3JpcHRvclwiXHJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cInJlc3BvbnNlRGF0YT8uZGVzY3JpcHRvcj8ubmFtZVwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvc2VjdGlvbj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWxhdGVkUHJvZHVjdERhdGE/Lmxlbmd0aFwiPlxyXG4gICAgICA8c2ltcG8tZmVhdHVyZWQtcHJvZHVjdHMgW2VkaXRdPVwiZmFsc2VcIiBbZGF0YV09XCJmZWF0dXJlUHJvZHVjdERhdGFcIiBbcmVzcG9uc2VEYXRhXT1cInJlbGF0ZWRQcm9kdWN0RGF0YVwiXHJcbiAgICAgICAgW2lzUmVsYXRlZFByb2R1Y3RdPVwidHJ1ZVwiIChjaGFuZ2VEZXRhaWxQcm9kdWN0KT1cImNoYW5nZVByb2R1Y3QoJGV2ZW50KVwiPjwvc2ltcG8tZmVhdHVyZWQtcHJvZHVjdHM+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWNlbnRWaWV3SXRlbUxpc3Q/Lmxlbmd0aFwiPlxyXG4gICAgICA8c2ltcG8tZmVhdHVyZWQtcHJvZHVjdHMgW2VkaXRdPVwiZmFsc2VcIiBbZGF0YV09XCJyZWNlbnRWaWV3ZWREYXRhXCIgW3Jlc3BvbnNlRGF0YV09XCJyZWNlbnRWaWV3SXRlbUxpc3RcIlxyXG4gICAgICAgIFtpc1JlbGF0ZWRQcm9kdWN0XT1cInRydWVcIj48L3NpbXBvLWZlYXR1cmVkLXByb2R1Y3RzPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8IS0tIDxuZy1jb250YWluZXI+XHJcbiAgICAgIDxzaW1wby1jdXN0b21lci1yZXZpZXcgW2RhdGFdPVwiZGF0YVwiPjwvc2ltcG8tY3VzdG9tZXItcmV2aWV3PlxyXG4gICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG4gICAgPGRpdiBbbmdDbGFzc109XCJ7J2hvdmVyX2VmZmVjdCc6IGVkaXR9XCIgKm5nSWY9XCJzaG93RWRpdG9yc1wiPlxyXG4gICAgICA8c2ltcG8taG92ZXItZWxlbWVudHMgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiIFtlZGl0T3B0aW9uc109XCJlZGl0XCI+PC9zaW1wby1ob3Zlci1lbGVtZW50cz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cInNob3dEZWxldGVcIiBbbmdDbGFzc109XCJ7J2hvdmVyX2VmZmVjdCc6IGRlbGV0ZX1cIj5cclxuICAgICAgPHNpbXBvLWRlbGV0ZS1ob3Zlci1lbGVtZW50IFtkYXRhXT1cImRhdGFcIiBbaW5kZXhdPVwiaW5kZXhcIj48L3NpbXBvLWRlbGV0ZS1ob3Zlci1lbGVtZW50PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9zZWN0aW9uPlxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG48bmd4LXNrZWxldG9uLWxvYWRlciAqbmdJZj1cImlzTG9hZGluZ1wiIGNvdW50PVwiMVwiIGFwcGVhcmFuY2U9XCJjaXJjbGVcIiBbdGhlbWVdPVwie1xyXG4gIHdpZHRoOiAnMTAwJScsXHJcbiAgaGVpZ2h0OiAnNDB2aCcsXHJcbiAgJ2JvcmRlci1yYWRpdXMnOiAnMTBweCcsXHJcbiAgJ3Bvc2l0aW9uJzogJ3JlbGF0aXZlJyxcclxuICAncmlnaHQnOiAnNXB4J1xyXG59XCI+XHJcbjwvbmd4LXNrZWxldG9uLWxvYWRlcj5cclxuXHJcblxyXG48ZGl2IGNsYXNzPVwibW9iaWxlLWZvb3RlclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJpY29uc1wiPlxyXG4gICAgPGRpdiAoY2xpY2spPVwiZ29Ub0NhcnQoKVwiPlxyXG4gICAgICA8bWF0LWljb24+c2hvcHBpbmdfY2FydDwvbWF0LWljb24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIChjbGljayk9XCJhZGRUb0Zhdm91cml0ZSgpXCJcclxuICAgICAgICAqbmdJZj1cIiFpc0l0ZW1Bc0Zhdm9yaXRlXCI+ZmF2b3JpdGVfYm9yZGVyPC9tYXQtaWNvbj5cclxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cInJlbW92ZVRvRmF2b3VyaXRlKClcIlxyXG4gICAgICAgICpuZ0lmPVwiaXNJdGVtQXNGYXZvcml0ZVwiPmZhdm9yaXRlPC9tYXQtaWNvbj5cclxuICAgICAgPCEtLSA8bWF0LWljb24gW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwiYWRkVG9GYXZvdXJpdGUoKVwiXHJcbiAgICAgICAgKm5nSWY9XCIhaXNJdGVtQXNGYXZvcml0ZVwiPmJvb2ttYXJrPC9tYXQtaWNvbj5cclxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cInJlbW92ZVRvRmF2b3VyaXRlKClcIlxyXG4gICAgICAgICpuZ0lmPVwiaXNJdGVtQXNGYXZvcml0ZVwiPmJvb2ttYXJrX2JvcmRlcjwvbWF0LWljb24+IC0tPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cIm91dC1vZi1zdG9ja1wiICpuZ0lmPVwiaXNJdGVtT3V0T2ZTdG9ja1wiPk91dCBvZiBTdG9jazwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJxdWFudGl0eVwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhaXNJdGVtT3V0T2ZTdG9ja1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBsdXNcIiAoY2xpY2spPVwiYWRkVG9DYXJ0KCdTVUJTVFJBQ1QnKVwiPi08L2Rpdj5cclxuICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogNTBweDtcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+e3tyZXNwb25zZURhdGEucXVhbnRpdHl9fTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1pbnVzXCIgKGNsaWNrKT1cImFkZFRvQ2FydCgnQUREJylcIj4rPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGJ1dHRvbiBjbGFzcz1cImFkZC1idG5cIiBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbaWRdPVwiYnV0dG9uSWRcIiBbYnV0dG9uU3R5bGVdPVwiYnV0dG9uPy5zdHlsZXNcIlxyXG4gICAgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwiYWRkVG9DYXJ0KClcIlxyXG4gICAgKm5nSWY9XCIhcmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhaXNJdGVtT3V0T2ZTdG9ja1wiPnt7ZGF0YT8uYWN0aW9uPy5idXR0b25zPy5bMF0/LmNvbnRlbnQ/LmxhYmVsfX08L2J1dHRvbj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI1Jldmlld1NlY3Rpb24+XHJcbiAgPGRpdiBjbGFzcz1cInJldmlldy1zZWNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPkN1c3RvbWVyIFJldmlldzwvZGl2PlxyXG4gICAgPHAtcmF0aW5nIFtjYW5jZWxdPVwiZmFsc2VcIiBbcmVhZG9ubHldPVwidHJ1ZVwiIFsobmdNb2RlbCldPVwidG90YWxSZXZpZXdcIiAvPlxyXG4gICAgPHNwYW4+QmUgdGhlIGZpcnN0IHRvIHdyaXRlIGEgcmV2aWV3PC9zcGFuPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cIm10LTNcIiAgc2ltcG9CdXR0b25EaXJlY3RpdmUgW2lkXT1cImJ1dHRvbklkXCIgW2J1dHRvblN0eWxlXT1cImJ1dHRvbj8uc3R5bGVzXCJcclxuICAgIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwic2hvd1JldmlldyA9ICFzaG93UmV2aWV3XCI+e3sgIXNob3dSZXZpZXcgPyAnQWRkIFJldmlldycgOiAnQ2FuY2VsIFJldmlldyd9fTwvYnV0dG9uPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dSZXZpZXdcIj5cclxuICAgICAgPGhyIC8+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLXJldmlld1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPldyaXRlIGEgcmV2aWV3PC9kaXY+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWNvbmRhcnktdGV4dFwiPlJBVElORzwvc3Bhbj5cclxuICAgICAgICA8cC1yYXRpbmcgWyhuZ01vZGVsKV09XCJwcm9kdWN0UmV2aWV3XCIgW2NhbmNlbF09XCJmYWxzZVwiIFtyZWFkb25seV09XCJmYWxzZVwiIC8+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vjb25kYXJ5LXRleHRcIj5SZXZpZXcgVGl0bGU8L3NwYW4+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkdpdmUgeW91ciByZXZpZXcgYSB0aXRsZVwiIFsobmdNb2RlbCldPVwicmV2aWV3VGl0bGVcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWNvbmRhcnktdGV4dFwiPlJldmlldzwvc3Bhbj5cclxuICAgICAgICAgIDx0ZXh0YXJlYSBwbGFjZWhvbGRlcj1cIldyaXRlIHlvdXIgY29tbWVudHMgaGVyZVwiIFsobmdNb2RlbCldPVwicmV2aWV3RGVzY3JpcHRpb25cIj48L3RleHRhcmVhPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXZpZXctYWN0aW9uLWJ0blwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIChjbGljayk9XCJzaG93UmV2aWV3ID0gZmFsc2VcIj5DYW5jZWwgcmV2aWV3PC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uICBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbaWRdPVwiYnV0dG9uSWRcIiBbYnV0dG9uU3R5bGVdPVwiYnV0dG9uPy5zdHlsZXNcIlxyXG4gICAgICAgICAgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwiYWRkUHJvZHVjdFJldmlldygpXCIgW2Rpc2FibGVkXT1cInByb2R1Y3RSZXZpZXcgPT0gMCAmJiByZXZpZXdUaXRsZT8ubGVuZ3RoID09IDAgJiYgcmV2aWV3RGVzY3JpcHRpb24/Lmxlbmd0aCA9PSAwXCI+U3VibWl0IHJldmlldzwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI1NvY2lhbEljb25zPlxyXG4gIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQgYWxpZ24taXRlbXMtbGctY2VudGVyIGZsZXgtY29sdW1uIGZsZXgtbGctcm93IGdhcC1sZy0wIGdhcC0zXCJcclxuICAgICAgW25nQ2xhc3NdPVwiZGF0YT8uY29udGVudD8uc29jaWFsTGlua3M/LmRpc3BsYXkgPyAnanVzdGlmeS1jb250ZW50LWJldHdlZW4nIDogJ2p1c3RpZnktY29udGVudC1lbmQnXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbXQtMFwiICpuZ0lmPVwiZGF0YT8uY29udGVudD8uc29jaWFsTGlua3M/LmRpc3BsYXlcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhdGE/LmNvbnRlbnQ/LnNvY2lhbExpbmtzPy5jaGFubmVsc1wiPlxyXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTttYXJnaW4tcmlnaHQ6IDEwcHg7XCI+XHJcbiAgICAgICAgICAgIDxzaW1wby1zb2NpYS1pY29ucyBbc29jaWFsSWNvbkRhdGFdPVwiaXRlbVwiIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgW3NlY3Rpb25JZF09XCJkYXRhPy5pZFwiPjwvc2ltcG8tc29jaWEtaWNvbnM+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjQWN0aW9uQnRuPlxyXG4gIDxkaXYgY2xhc3M9XCJidXR0b24tcGFyZW50XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwib3V0LW9mLXN0b2NrXCIgKm5nSWY9XCJpc0l0ZW1PdXRPZlN0b2NrXCI+T3V0IG9mIFN0b2NrPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicXVhbnRpdHlcIiAqbmdJZj1cInJlc3BvbnNlRGF0YT8ucXVhbnRpdHlcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInBsdXNcIiAoY2xpY2spPVwiYWRkVG9DYXJ0KCdTVUJTVFJBQ1QnKVwiPi08L2Rpdj5cclxuICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiA1MHB4O1wiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj57e3Jlc3BvbnNlRGF0YS5xdWFudGl0eX19PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtaW51c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ0FERCcpXCI+KzwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiIXJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgIWlzSXRlbU91dE9mU3RvY2tcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuXCIgc2ltcG9CdXR0b25EaXJlY3RpdmUgW2lkXT1cImJ1dHRvbklkXCIgW2J1dHRvblN0eWxlXT1cImJ1dHRvbj8uc3R5bGVzXCJcclxuICAgICAgICBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgKGNsaWNrKT1cImFkZFRvQ2FydCgpXCI+e3tkYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXT8uY29udGVudD8ubGFiZWx9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmF2b3VyaXRlXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIChjbGljayk9XCJhZGRUb0Zhdm91cml0ZSgpXCJcclxuICAgICAgICAqbmdJZj1cIiFpc0l0ZW1Bc0Zhdm9yaXRlXCI+ZmF2b3JpdGVfYm9yZGVyPC9tYXQtaWNvbj5cclxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cInJlbW92ZVRvRmF2b3VyaXRlKClcIlxyXG4gICAgICAgICpuZ0lmPVwiaXNJdGVtQXNGYXZvcml0ZVwiPmZhdm9yaXRlPC9tYXQtaWNvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI1Byb2R1Y3REZXNjPlxyXG4gIDxkaXYgY2xhc3M9XCJoZWFkaW5nLWxhcmdlIHRyaW0tdGV4dFwiIGNsYXNzPVwicHJvZHVjdC1oZWFkaW5nXCIgPnt7cmVzcG9uc2VEYXRhPy5uYW1lfX08L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCIgc3R5bGU9XCJnYXA6IDEwcHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi10b3A6IDE1cHg7XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicHJpY2VcIiBbbmdDbGFzc109XCJ7J2Rpc2NvdW50LXByaWNlJzogcmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlfVwiXHJcbiAgICAgICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlICE9IHJlc3BvbnNlRGF0YT8ucHJpY2U/LnZhbHVlXCI+PHNwYW4gW2lubmVySFRNTF09J2N1cnJlbmN5Jz48L3NwYW4+XHJcbiAgICAgIHt7cmVzcG9uc2VEYXRhPy5wcmljZT8udmFsdWV9fTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInByaWNlXCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2VcIj48c3BhbiBbaW5uZXJIVE1MXT0nY3VycmVuY3knPjwvc3Bhbj5cclxuICAgICAge3tyZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2V9fTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInRheC10ZXh0XCI+KGV4Y2x1ZGluZyBhbGwgdGF4ZXMpPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNJbWFnZVNlY3Rpb24+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF2YXJpZW50TG9hZGluZ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImltZy1saXN0XCIgKm5nSWY9XCJzY3JlZW5XaWR0aCA+IDUwMFwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpbWcgb2YgaXRlbUltYWdlc1wiPlxyXG4gICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBvbmVycm9yPVwidGhpcy5zcmM9J2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCIgW3NyY109XCJpbWcuaW1nVXJsXCJcclxuICAgICAgICAgIGFsdD1cIlwiIGNsYXNzPVwiaW1nXCIgKGNsaWNrKT1cImNoYW5nZUltZyhpbWcuaW1nVXJsKVwiXHJcbiAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiaW1nLmltZ1VybCA9PSBjdXJyZW50SW1nID8gZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICd0cmFuc3BhcmVudCdcIj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJpdGVtLWltZ1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudEltZ1wiPlxyXG5cclxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJzaGFyZS1pY29uXCIgKGNsaWNrKT1cInNoYXJlUHJvZHVjdCgpXCI+c2hhcmU8L21hdC1pY29uPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNNb2JpbGVcIj5cclxuICAgICAgICAgIDxsaWItbmd4LWltYWdlLXpvb20gW3RodW1iSW1hZ2VdPVwiY3VycmVudEltZ1wiIFtmdWxsSW1hZ2VdPVwiY3VycmVudEltZ1wiIFt6b29tTW9kZV09XCInaG92ZXInXCIgW21hZ25pZmljYXRpb25dPVwiMlwiXHJcbiAgICAgICAgICAgIFtsZW5zSGVpZ2h0XT1cIjEwMFwiIFtsZW5zV2lkdGhdPVwiMTAwXCIgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7IHdpZHRoOiAxMDAlO1wiPjwvbGliLW5neC1pbWFnZS16b29tPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc01vYmlsZVwiPlxyXG4gICAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIFtzcmNdPVwiY3VycmVudEltZ1wiIGFsdD1cIlwiPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjdXJyZW50SW1nXCI+XHJcbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIHNyYz1cImh0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGdcIiBhbHQ9XCJcIj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJpbWctbGlzdFwiICpuZ0lmPVwic2NyZWVuV2lkdGggPD0gNTAwXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGltZyBvZiBpdGVtSW1hZ2VzXCI+XHJcbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIG9uZXJyb3I9XCJ0aGlzLnNyYz0naHR0cHM6Ly9pLnBvc3RpbWcuY2MvaFBTMkpwVjAvbm8taW1hZ2UtYXZhaWxhYmxlLmpwZydcIiBbc3JjXT1cImltZy5pbWdVcmxcIlxyXG4gICAgICAgICAgYWx0PVwiXCIgY2xhc3M9XCJpbWdcIiAoY2xpY2spPVwiY2hhbmdlSW1nKGltZy5pbWdVcmwpXCI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbiAgPGRpdiBjbGFzcz1cIml0ZW0taW1nXCIgKm5nSWY9XCJ2YXJpZW50TG9hZGluZ1wiPlxyXG4gICAgPG5neC1za2VsZXRvbi1sb2FkZXIgY291bnQ9XCIxXCIgYXBwZWFyYW5jZT1cImNpcmNsZVwiIFt0aGVtZV09XCJ7XHJcbiAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgIGhlaWdodDogJzEwMCUnLFxyXG4gICAgICAnYm9yZGVyLXJhZGl1cyc6ICcxMHB4JyxcclxuICAgICAgJ3Bvc2l0aW9uJzogJ3JlbGF0aXZlJyxcclxuICAgICAgJ3JpZ2h0JzogJzVweCdcclxuICAgIH1cIj5cclxuICAgIDwvbmd4LXNrZWxldG9uLWxvYWRlcj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG5cclxuXHJcbjwhLS0gPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiBpZD1cIml0ZW1WYXJpZW50c1wiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWxhYmVsbGVkYnk9XCJpdGVtVmFyaWVudHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5SaWdodC10by1MZWZ0IE1vZGFsPC9oNT5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgIFRoaXMgY29udGVudCBpcyBhbGlnbmVkIGZyb20gcmlnaHQgdG8gbGVmdC5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCI+U2F2ZSBjaGFuZ2VzPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiAtLT5cclxuIl19
480
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXNjLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpbXBvLXVpL3NyYy9saWIvZWNvbW1lcmNlL3NlY3Rpb25zL3Byb2R1Y3QtZGVzYy9wcm9kdWN0LWRlc2MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lY29tbWVyY2Uvc2VjdGlvbnMvcHJvZHVjdC1kZXNjL3Byb2R1Y3QtZGVzYy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0YsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUV6RixPQUFPLFdBQVcsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFNakUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzdGLE9B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ZEFDZixXQUFXOzsyRkFPRixvQkFBb0I7a0JBN0JoQyxTQUFTOytCQUNFLG9CQUFvQixjQUNsQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLG9CQUFvQjt3QkFDcEIsT0FBTzt3QkFDUCxjQUFjO3dCQUNkLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixtQkFBbUI7d0JBQ25CLHdCQUF3Qjt3QkFDeEIsa0JBQWtCO3dCQUNsQixtQkFBbUI7d0JBQ25CLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQix5QkFBeUI7d0JBQ3pCLG9CQUFvQjt3QkFDcEIsbUJBQW1CO3dCQUNuQixZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsV0FBVzt3QkFDWCx1QkFBdUI7cUJBQ3hCLGFBQ1UsQ0FBQyxjQUFjLENBQUM7OzBCQXlCeEIsTUFBTTsyQkFBQyxXQUFXO2dUQXBCa0MsZUFBZTtzQkFBckUsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRTVDLElBQUk7c0JBQVosS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBMk5OLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBQTEFURk9STV9JRCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQcm9kdWN0RGVzY01vZGFsLCBQcm9kdWN0RGVzY1N0eWxlc01vZGFsIH0gZnJvbSAnLi9wcm9kdWN0LWRlc2MubW9kYWwnO1xuaW1wb3J0IHsgSXRlbUltYWdlLCBJdGVtVmFyaWFudCwgUHJvZHVjdCB9IGZyb20gJy4uLy4uL3N0eWxlcy9wcm9kdWN0Lm1vZGFsJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCdXR0b25EaXJlY3RpdmVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYnV0dG9uLWRpcmVjdGl2ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQnV0dG9uTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9zdHlsZXMvc3R5bGUubW9kZWwnO1xuaW1wb3J0IEJhc2VTZWN0aW9uIGZyb20gJy4uLy4uLy4uL3NlY3Rpb25zL0Jhc2VTZWN0aW9uJztcbmltcG9ydCB7IEFuaW1hdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS9hbmltYXRpb24tZGlyZWN0aXZlJztcbmltcG9ydCB7IEhvdmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2hvdmVyLWVsZW1lbnQtZGlyZWN0aXZlJztcbmltcG9ydCB7IENvbnRlbnRGaXREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvY29udGVudC1maXQtZGlyZWN0aXZlJztcbmltcG9ydCB7IFNpbXBvQ29tcG9uZW50TW9kdWxlIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9pbmRleCc7XG5pbXBvcnQgeyBFdmVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi8uLi8uLi9zZXJ2aWNlcy9ldmVudHMuc2VydmljZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTmd4SW1hZ2Vab29tTW9kdWxlIH0gZnJvbSAnbmd4LWltYWdlLXpvb20nO1xuaW1wb3J0IHsgRmVhdHVyZWRQcm9kdWN0c0NvbXBvbmVudCB9IGZyb20gXCIuLi9mZWF0dXJlZC1wcm9kdWN0cy9mZWF0dXJlZC1wcm9kdWN0cy5jb21wb25lbnRcIjtcbmltcG9ydCB7IEZlYXR1cmVkUHJvZHVjdE1vZGFsIH0gZnJvbSAnLi4vZmVhdHVyZWQtcHJvZHVjdHMvZmVhdHVyZWQtcHJvZHVjdHMubW9kYWwnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9yZGVyZWRJdGVtcyB9IGZyb20gJy4uLy4uL3N0eWxlcy9PcmRlcmVkSXRlbXMubW9kYWwnO1xuaW1wb3J0IHsgQlVTSU5FU1NfQ09OU1RBTlRTIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2J1c2luZXNzLmNvbnN0YW50JztcbmltcG9ydCB7IFRvYXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b2FzdCc7XG5pbXBvcnQgeyBNZW51SXRlbSwgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBNZXRhLCBUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IEl0ZW1WYXJpZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vaXRlbS12YXJpZW50L2l0ZW0tdmFyaWVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0Qm90dG9tU2hlZXQsIE1hdEJvdHRvbVNoZWV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYm90dG9tLXNoZWV0JztcbmltcG9ydCB7IEJhY2tncm91bmREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmUvYmFja2dyb3VuZC1kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU2ltcG9XcmFwQ29tbnRhaW5lciB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZS93cmFwLWNvbnRhaW5lcnMuZGlyZWN0aXZlJztcbmltcG9ydCB7IENvbG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlL2NvbG9yLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTb2NpYUljb25zQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZWxlbWVudHMvc29jaWEtaWNvbnMvc29jaWEtaWNvbnMuY29tcG9uZW50JztcbmltcG9ydCB7IFJhdGluZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvcmF0aW5nJztcbmltcG9ydCB7IFJldmlldyB9IGZyb20gJy4uLy4uL3N0eWxlcy9yZXZpZXcubW9kYWwnO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL3N0eWxlcy91c2VyLm1vZGFsJztcbmltcG9ydCB7IFNwZWVkRGlhbE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc3BlZWRkaWFsJztcbmltcG9ydCB7IEN1c3RvbWVyUmV2aWV3Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2VjdGlvbnMvY3VzdG9tZXItcmV2aWV3L2N1c3RvbWVyLXJldmlldy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaW1wby1wcm9kdWN0LWRlc2MnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFNpbXBvQ29tcG9uZW50TW9kdWxlLFxuICAgIE1hdEljb24sXG4gICAgQ29sb3JEaXJlY3RpdmUsXG4gICAgLy9ESVJFQ1RJVkVcbiAgICBTaW1wb1dyYXBDb21udGFpbmVyLFxuICAgIEJhY2tncm91bmREaXJlY3RpdmUsXG4gICAgQnV0dG9uRGlyZWN0aXZlRGlyZWN0aXZlLFxuICAgIEFuaW1hdGlvbkRpcmVjdGl2ZSxcbiAgICBDb250ZW50Rml0RGlyZWN0aXZlLFxuICAgIEhvdmVyRGlyZWN0aXZlLFxuICAgIE5neEltYWdlWm9vbU1vZHVsZSxcbiAgICBGZWF0dXJlZFByb2R1Y3RzQ29tcG9uZW50LFxuICAgIE1hdEJvdHRvbVNoZWV0TW9kdWxlLFxuICAgIFNvY2lhSWNvbnNDb21wb25lbnQsXG4gICAgUmF0aW5nTW9kdWxlLFxuICAgIFNwZWVkRGlhbE1vZHVsZSxcbiAgICBUb2FzdE1vZHVsZSxcbiAgICBDdXN0b21lclJldmlld0NvbXBvbmVudFxuICBdLFxuICBwcm92aWRlcnM6IFtNZXNzYWdlU2VydmljZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LWRlc2MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcHJvZHVjdC1kZXNjLmNvbXBvbmVudC5jc3MnXG59KVxuZXhwb3J0IGNsYXNzIFByb2R1Y3REZXNjQ29tcG9uZW50IGV4dGVuZHMgQmFzZVNlY3Rpb24ge1xuICBAVmlld0NoaWxkKEN1c3RvbWVyUmV2aWV3Q29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSkgcmV2aWV3Q29tcG9uZW50ITogQ3VzdG9tZXJSZXZpZXdDb21wb25lbnQ7XG5cbiAgQElucHV0KCkgZGF0YT86IFByb2R1Y3REZXNjTW9kYWw7XG4gIEBJbnB1dCgpIHJlc3BvbnNlRGF0YSE6IFByb2R1Y3Q7XG4gIEBJbnB1dCgpIGluZGV4PzogbnVtYmVyO1xuICBASW5wdXQoKSBlZGl0PzogYm9vbGVhbjtcbiAgQElucHV0KCkgZGVsZXRlPzogYm9vbGVhbjtcbiAgQElucHV0KCkgY3VzdG9tQ2xhc3M/OiBzdHJpbmc7XG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZmVhdHVyZVByb2R1Y3REYXRhOiBGZWF0dXJlZFByb2R1Y3RNb2RhbCB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgcmVjZW50Vmlld2VkRGF0YTogRmVhdHVyZWRQcm9kdWN0TW9kYWwgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHZhcmllbnRzOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIHB1YmxpYyBzZWxlY3RlZFZhcmllbnQ6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHB1YmxpYyByZWxhdGVkUHJvZHVjdERhdGE6IFByb2R1Y3RbXSA9IFtdO1xuICBwdWJsaWMgcHJvZHVjdFJldmlldzogbnVtYmVyID0gMDtcbiAgcHVibGljIHRvdGFsUmV2aWV3OiBudW1iZXIgPSA1O1xuICBwdWJsaWMgc2hvd1JldmlldzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V2ZW50U2VydmljZTogRXZlbnRzU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1ldGFUYWdTZXJ2aWNlOiBNZXRhLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGl0bGVTZXJ2aWNlOiBUaXRsZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvdHRvbVNoZWV0OiBNYXRCb3R0b21TaGVldFxuICApIHtcblxuICAgIHN1cGVyKClcblxuICAgIC8vIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHsgbmFtZTogXCJkZXNjcmlwdGlvblwiLCBjb250ZW50OiBcIlRlc3RpbmdcIiB9KTtcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiBcIm9nOnRpdGxlXCIsIGNvbnRlbnQ6IFwiVGl0bGVcIiB9KTtcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiBcIm9nOmltYWdlXCIsIGNvbnRlbnQ6IFwiaHR0cHM6Ly9kZXYtYmVlb3MuczMuYW1hem9uYXdzLmNvbS9saWJyYXJ5LW1lZGlhLzg0ODcyOGMxNzI2MDg2MDA5NjU2aW1hZ2VzLnBuZ1wiIH0pO1xuICAgIC8vIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6IFwib2c6ZGVzY3JpcHRpb25cIiwgY29udGVudDogXCJEZXNjcmlwdGlvblwiIH0pO1xuICAgIC8vIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHsgcHJvcGVydHk6IFwib2c6c2l0ZV9uYW1lXCIsIGNvbnRlbnQ6IFwibmF0dXJhbHNcIiB9KTtcbiAgICAvLyB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7IHByb3BlcnR5OiBcIm9nOnR5cGVcIiwgY29udGVudDogXCJ3ZWJzaXRlXCIgfSk7XG4gICAgLy8gdGhpcy5tZXRhVGFnU2VydmljZS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogXCJvZzp1cmxcIiwgY29udGVudDogXCJodHRwczovL25hdHVyYWxzLmRldi5zaW1wby5haS9cIiB9KTtcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgdGhpcy5nZXRTY3JlZW5TaXplKCk7XG4gICAgfVxuICAgIHRoaXMuX2V2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHJlc3BvbnNlO1xuICAgIH0pXG4gIH1cblxuICBidXR0b25JZD86IHN0cmluZztcbiAgYnV0dG9uPzogQnV0dG9uTW9kZWxcbiAgc3R5bGVzPzogUHJvZHVjdERlc2NTdHlsZXNNb2RhbDtcblxuICBpc0l0ZW1Bc0Zhdm9yaXRlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBVU0VSX0NBUlQ6IE9yZGVyZWRJdGVtc1tdIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgVVNFUl9XSVNITElTVDogT3JkZXJlZEl0ZW1zW10gfCBudWxsID0gbnVsbDtcbiAgcHVibGljIGl0ZW1JbWFnZXM6IEl0ZW1JbWFnZVtdID0gW107XG4gIGl0ZW1zOiBNZW51SXRlbVtdIHwgbnVsbCA9IG51bGw7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mZWF0dXJlUHJvZHVjdERhdGEgPSBuZXcgRmVhdHVyZWRQcm9kdWN0TW9kYWwodGhpcy5kYXRhKTtcbiAgICB0aGlzLnJlY2VudFZpZXdlZERhdGEgPSBuZXcgRmVhdHVyZWRQcm9kdWN0TW9kYWwodGhpcy5kYXRhLCB0cnVlKTtcbiAgICB0aGlzLnN0eWxlcyA9IHRoaXMuZGF0YT8uc3R5bGVzO1xuICAgIHRoaXMuY3VycmVudEltZyA9IHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW1hZ2VzWzBdPy5pbWdVcmxcbiAgICB0aGlzLmJ1dHRvbiA9IHRoaXMuZGF0YT8uYWN0aW9uPy5idXR0b25zWzBdO1xuICAgIHRoaXMuYnV0dG9uSWQgPSAodGhpcy5kYXRhID8gdGhpcy5kYXRhLmlkIDogJycpICsgKHRoaXMuYnV0dG9uID8gdGhpcy5idXR0b24uaWQgOiAnJyk7XG5cbiAgICB0aGlzLml0ZW1zID0gW1xuICAgICAge1xuICAgICAgICBpY29uOiBcInBpIHBpLWhlYXJ0XCIsXG4gICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy93aXNobGlzdCddKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWNvbjogXCJwaSBwaS1zaGFyZS1hbHRcIixcbiAgICAgICAgY29tbWFuZDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hhcmVQcm9kdWN0KCk7XG4gICAgICAgICAgLy8gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICAgIC8vIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdpbmZvJywgc3VtbWFyeTogJ0NvcGllZCcsIGRldGFpbDogJ1lvdSBjYW4gc2hhcmUgdGhlIHVybCcsIGtleTogJ3dpc2hsaXN0JyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF07XG4gICAgdGhpcy5nZXRQcm9kdWN0QnlDYXRlZ29yeSgpO1xuICAgIHRoaXMuX2V2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHJlc3BvbnNlO1xuICAgIH0pXG5cbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocVBhcmFtKSA9PiB7XG4gICAgICBjb25zdCBwcm9kdWN0SWQgPSBxUGFyYW1bXCJpZFwiXTtcbiAgICAgIGlmIChwcm9kdWN0SWQpIHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRQcm9kdWN0RGV0YWlscyhwcm9kdWN0SWQpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhID0gcmVzcG9uc2VbMF07XG4gICAgICAgICAgdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50LCBpZHg6IG51bWJlcik9PiB7XG4gICAgICAgICAgICB2YXJpZW50LnF1YW50aXR5ID0gMDtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhcmllbnQucHJvcGVydGllcykuZm9yRWFjaCgodmFyaWVudEtleTogc3RyaW5nKT0+IHtcbiAgICAgICAgICAgICAgaWYgKGlkeCA9PSAwKVxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWYXJpZW50LnNldCh2YXJpZW50S2V5LCB2YXJpZW50LnByb3BlcnRpZXNbdmFyaWVudEtleV0pO1xuICAgICAgICAgICAgICBpZiAoIXRoaXMudmFyaWVudHMuZ2V0KHZhcmllbnRLZXkpPy5pbmNsdWRlcyh2YXJpZW50LnByb3BlcnRpZXNbdmFyaWVudEtleV0pKVxuICAgICAgICAgICAgICAgIHRoaXMudmFyaWVudHMuc2V0KHZhcmllbnRLZXksIFsuLi4odGhpcy52YXJpZW50cy5nZXQodmFyaWVudEtleSkgPz8gW10pLCB2YXJpZW50LnByb3BlcnRpZXNbdmFyaWVudEtleV1dKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aGlzLmdldFJlbGF0ZWRQcm9kdWN0cygpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgY29uc3QgaXRlbVZhcmlhbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcbiAgICAgICAgICBpZiAoaXRlbVZhcmlhbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JbWFnZXMgPSBpdGVtVmFyaWFudC52YXJpYW50SW1hZ2VzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkRlc2NyaXB0aW9uXCIsIHRoaXMucmVzcG9uc2VEYXRhPy5uYW1lLCB0aGlzLnJlc3BvbnNlRGF0YT8uZGVzY3JpcHRvcj8ubmFtZSk7XG4gICAgICAgICAgdGhpcy50aXRsZVNlcnZpY2Uuc2V0VGl0bGUodGhpcy5yZXNwb25zZURhdGE/Lm5hbWUpO1xuXG4gICAgICAgICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1JbWFnZXMgPSB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW1hZ2VzO1xuICAgICAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgPSAwO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyQ2FydCgpLnRoZW4oKGNhcnRSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICBjYXJ0UmVzcG9uc2Uub25zdWNjZXNzID0gKGNhcnREYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLlVTRVJfQ0FSVCA9IGNhcnREYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXTtcbiAgICAgICAgICAgICAgICB0aGlzLlVTRVJfQ0FSVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtSWQgPT0gcHJvZHVjdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVZhcmlhbnQgJiYgaXRlbS52YXJpZW50SWQgPT0gaXRlbVZhcmlhbnQudmFyaWFudElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtVmFyaWFudC5xdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eSA9IGl0ZW0ucXVhbnRpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gaXRlbS5xdWFudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXJXaGlzaGxpc3QoKS50aGVuKCh3aXNobGlzdFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgIHdpc2hsaXN0UmVzcG9uc2Uub25zdWNjZXNzID0gKHdoaXNsaXN0RGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUID0gd2hpc2xpc3REYXRhLnRhcmdldC5yZXN1bHQgYXMgdW5rbm93biBhcyBPcmRlcmVkSXRlbXNbXTtcbiAgICAgICAgICAgICAgICB0aGlzLlVTRVJfV0lTSExJU1Q/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbUlkID09IHByb2R1Y3RJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVZhcmlhbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVZhcmlhbnQgJiYgaXRlbVZhcmlhbnQudmFyaWFudElkID09IGl0ZW0udmFyaWVudElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtVmFyaWFudC53aXNobGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW1nID0gdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1JbWFnZXM/LlswXT8uaW1nVXJsO1xuICAgICAgICAgICAgdGhpcy5nZXRQcm9kdWN0QnlDYXRlZ29yeSgpO1xuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5yZXNwb25zZURhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIHZhcmllbnRMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHJlY2VudFZpZXdJdGVtTGlzdDogUHJvZHVjdFtdID0gW107XG4gIGdldFJlbGF0ZWRQcm9kdWN0cygpIHtcbiAgICBjb25zdCB1c2VyRGV0YWlsczogVXNlciB8IG51bGwgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKTtcbiAgICBpZiAoISF1c2VyRGV0YWlscykge1xuICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRSZWNlbnRWaWV3UHJvZHVjdCh1c2VyRGV0YWlscy51c2VySWQpLnN1YnNjcmliZSgocmVzcG9uc2UpPT4ge1xuICAgICAgICB0aGlzLnJlY2VudFZpZXdJdGVtTGlzdCA9IHJlc3BvbnNlO1xuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgc2VsZWN0VmFyaWVudChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudmFyaWVudExvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRWYXJpZW50LnNldChrZXksIHZhbHVlKTtcbiAgICB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50KT0+IHtcbiAgICAgIGxldCBmb3VuZFZhcmllbnQgPSB0cnVlO1xuICAgICAgT2JqZWN0LmtleXModmFyaWVudC5wcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKT0+IHtcbiAgICAgICAgZm91bmRWYXJpZW50ID0gKHRoaXMuc2VsZWN0ZWRWYXJpZW50LmdldChwcm9wZXJ0eSkgPT0gdmFyaWVudC5wcm9wZXJ0aWVzW3Byb3BlcnR5XSkgJiYgZm91bmRWYXJpZW50O1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnNlbGVjdGVkVmFyaWVudC5nZXQocHJvcGVydHkpLCB2YXJpZW50LnByb3BlcnRpZXNbcHJvcGVydHldKTtcbiAgICAgIH0pXG4gICAgICBjb25zb2xlLmxvZyhmb3VuZFZhcmllbnQpO1xuICAgICAgaWYgKGZvdW5kVmFyaWVudCkge1xuICAgICAgICB0aGlzLml0ZW1JbWFnZXMgPSB2YXJpZW50LnZhcmlhbnRJbWFnZXM7XG4gICAgICAgIHRoaXMuY3VycmVudEltZyA9IHRoaXMuaXRlbUltYWdlc1swXT8uaW1nVXJsO1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5wcmljZSA9IHZhcmllbnQuaXRlbVZhcmlhbnRQcmljZTtcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUludmVudG9yeSA9IHZhcmllbnQuaXRlbUludmVudG9yeTtcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkID0gdmFyaWVudC52YXJpYW50SWQ7XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gdGhpcy5nZXRWYXJpZW50UXVhbnRpdHkodmFyaWVudCk7XG4gICAgICAgIHRoaXMuaXNJdGVtQXNGYXZvcml0ZSA9IHRoaXMuaXNWYXJpZW50UHJlc2VudEluV2lzaHRsaXN0KHZhcmllbnQpO1xuICAgICAgfVxuICAgIH0pXG4gICAgc2V0VGltZW91dCgoKT0+IHtcbiAgICAgIHRoaXMudmFyaWVudExvYWRpbmcgPSBmYWxzZTtcbiAgICB9LCAzMDApO1xuICB9XG4gIGdldEl0ZW1WYXJpZW50KCk6IEl0ZW1WYXJpYW50IHwgbnVsbCB7XG4gICAgbGV0IHNlbGVjdGVkVmFyaWVudDogSXRlbVZhcmlhbnQgfCBudWxsID0gbnVsbDtcbiAgICB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbVZhcmlhbnQ/LmZvckVhY2goKHZhcmllbnQ6IEl0ZW1WYXJpYW50KT0+IHtcbiAgICAgIGxldCBmb3VuZFZhcmllbnQgPSB0cnVlO1xuICAgICAgT2JqZWN0LmtleXModmFyaWVudC5wcm9wZXJ0aWVzKS5mb3JFYWNoKChwcm9wZXJ0eTogc3RyaW5nKT0+IHtcbiAgICAgICAgZm91bmRWYXJpZW50ID0gKHRoaXMuc2VsZWN0ZWRWYXJpZW50LmdldChwcm9wZXJ0eSkgPT0gdmFyaWVudC5wcm9wZXJ0aWVzW3Byb3BlcnR5XSkgJiYgZm91bmRWYXJpZW50O1xuICAgICAgfSlcbiAgICAgIGlmIChmb3VuZFZhcmllbnQpXG4gICAgICAgIHNlbGVjdGVkVmFyaWVudCA9IHZhcmllbnQ7XG4gICAgfSlcblxuICAgIHJldHVybiBzZWxlY3RlZFZhcmllbnQ7XG4gIH1cblxuICBzaGFyZVByb2R1Y3QoKSB7XG4gICAgbmF2aWdhdG9yLnNoYXJlKHtcbiAgICAgIHRpdGxlOiAnQnV5ICcgKyB0aGlzLnJlc3BvbnNlRGF0YT8ubmFtZSxcbiAgICAgIHRleHQ6IHRoaXMucmVzcG9uc2VEYXRhLmJyaWVmPy5yZXBsYWNlKC88XFwvW14+XSsoPnwkKS9nLCBcIlwiKSxcbiAgICAgIHVybDogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnaW5mbycsIHN1bW1hcnk6ICdTaGFyZWQnLCBkZXRhaWw6ICdQcm9kdWN0IHNoYXJlZCcsIGtleTogJ3dpc2hsaXN0JyB9KSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnU2hhcmVkJywgZGV0YWlsOiAnRmFpbGVkIHRvIHNoYXJlIHByb2R1Y3QuIFRyeSBBZ2Fpbi4nLCBrZXk6ICd3aXNobGlzdCcgfSkpO1xuXG4gIH1cbiAgcm91dGVUb0hvbWUoKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pO1xuICB9XG5cbiAgc2NyZWVuV2lkdGg6IGFueTtcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzogcmVzaXplXCIsIFtcIiRldmVudFwiXSlcbiAgZ2V0U2NyZWVuU2l6ZSgpIHtcbiAgICB0aGlzLnNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gIH1cblxuICBjdXJyZW50SW1nOiBhbnk7XG4gIGNoYW5nZUltZyh1cmw6IGFueSkge1xuICAgIHRoaXMuY3VycmVudEltZyA9IHVybDtcbiAgfVxuXG4gIGdldEtleXModmFyaWVudDogT2JqZWN0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh2YXJpZW50KTtcbiAgfVxuXG4gIGdvVG9DYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2NhcnQnXSk7XG4gIH1cblxuICBhZGRUb0NhcnQodHlwZTogJ0FERCcgfCAnU1VCU1RSQUNUJyA9ICdBREQnKSB7XG4gICAgaWYgKHRoaXMuaXNJdGVtT3V0T2ZTdG9jaykge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3dhcm4nLCBzdW1tYXJ5OiAnQ2FydCcsIGRldGFpbDogJ0l0ZW0gaXMgbm90IGF2YWlsYWJsZSBhcyBvZiBub3cuIFdlIHdpbGwgbm90aWZ5IHlvdSBvbmNlIGF2YWlsYWJsZScgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcbiAgICAgIGlmIChpdGVtVmFyaWVudCkge1xuICAgICAgICBpdGVtVmFyaWVudC5xdWFudGl0eSArPSAodHlwZSA9PSAnQUREJyA/IDEgOiAtMSk7XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gaXRlbVZhcmllbnQucXVhbnRpdHk7XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLml0ZW1JbnZlbnRvcnkgPSBpdGVtVmFyaWVudC5pdGVtSW52ZW50b3J5O1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW1hZ2VzID0gaXRlbVZhcmllbnQudmFyaWFudEltYWdlcztcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5KSB7XG4gICAgICAgIGxldCBpc1ByZXNlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5VU0VSX0NBUlQ/LmZvckVhY2goKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLnZhcmllbnRJZCA9PSB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpIHtcbiAgICAgICAgICAgIGl0ZW0ucXVhbnRpdHkgPSB0aGlzLnJlc3BvbnNlRGF0YS5xdWFudGl0eTtcbiAgICAgICAgICAgIGlzUHJlc2VudCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBpZiAoIWlzUHJlc2VudClcbiAgICAgICAgICB0aGlzLlVTRVJfQ0FSVD8ucHVzaChuZXcgT3JkZXJlZEl0ZW1zKHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuVVNFUl9DQVJUID0gdGhpcy5VU0VSX0NBUlQ/LmZpbHRlcigoaXRlbTogT3JkZXJlZEl0ZW1zKSA9PiBpdGVtLnZhcmllbnRJZCAhPSB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpID8/IFtdO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZEl0ZW1Ub0NhcnQodGhpcy5yZXNwb25zZURhdGEgYXMgUHJvZHVjdCwgaXRlbVZhcmllbnQ/LnZhcmlhbnRJZCk7XG4gICAgfSBlbHNlIHtcblxuICAgICAgaWYgKCF0aGlzLnJlc3BvbnNlRGF0YT8ucXVhbnRpdHkpXG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ID0gMDtcbiAgICAgIGlmICh0eXBlID09ICdBREQnKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnF1YW50aXR5ICs9IDE7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEucXVhbnRpdHkgLT0gMTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9DYXJ0KHRoaXMucmVzcG9uc2VEYXRhIGFzIFByb2R1Y3QpO1xuICAgIH1cbiAgfVxuXG4gIGdvVG9GaWx0ZXIoY2F0ZWdvcnk6IHN0cmluZykge1xuICAgIGNhdGVnb3J5ID0gY2F0ZWdvcnkucmVwbGFjZUFsbChcIiBcIiwgXCJfXCIpXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydsaXN0J10sIHsgcXVlcnlQYXJhbXM6IHsgY2F0ZWdvcnk6IGNhdGVnb3J5IH0gfSk7XG4gIH1cblxuICBhZGRUb0Zhdm91cml0ZSgpIHtcbiAgICB0aGlzLmlzSXRlbUFzRmF2b3JpdGUgPSB0cnVlO1xuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ1N1Y2Nlc3MnLCBkZXRhaWw6ICdJdGVtIGFkZGVkIHRvIHlvdXIgd2lzaGxpc3QnLCBrZXk6ICd3aXNobGlzdCcgfSk7XG4gICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcbiAgICAgIGlmIChpdGVtVmFyaWVudCkge1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGF0YS5pdGVtSW52ZW50b3J5ID0gaXRlbVZhcmllbnQuaXRlbUludmVudG9yeTtcbiAgICAgICAgdGhpcy5yZXNwb25zZURhdGEuaXRlbUltYWdlcyA9IGl0ZW1WYXJpZW50LnZhcmlhbnRJbWFnZXM7XG4gICAgICAgIGl0ZW1WYXJpZW50Lndpc2hsaXN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9GYXZvdXJpdGUodGhpcy5yZXNwb25zZURhdGEgYXMgUHJvZHVjdCwgaXRlbVZhcmllbnQudmFyaWFudElkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRJdGVtVG9GYXZvdXJpdGUodGhpcy5yZXNwb25zZURhdGEgYXMgUHJvZHVjdCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzSXRlbUFzRmF2b3JpdGUpIHtcbiAgICAgIHRoaXMuVVNFUl9XSVNITElTVD8ucHVzaChuZXcgT3JkZXJlZEl0ZW1zKHRoaXMucmVzcG9uc2VEYXRhLCB0aGlzLnJlc3BvbnNlRGF0YS52YXJpZW50SWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5VU0VSX1dJU0hMSVNUID0gdGhpcy5VU0VSX1dJU0hMSVNUPy5maWx0ZXIoKGl0ZW06IE9yZGVyZWRJdGVtcykgPT4gaXRlbS52YXJpZW50SWQgIT0gdGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKSA/PyBbXTtcbiAgICB9XG4gIH1cbiAgcmVtb3ZlVG9GYXZvdXJpdGUoKSB7XG4gICAgdGhpcy5pc0l0ZW1Bc0Zhdm9yaXRlID0gZmFsc2U7XG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnU3VjY2VzcycsIGRldGFpbDogJ0l0ZW0gcmVtb3ZlZCBmcm9tIHlvdXIgd2lzaGxpc3QnLCBrZXk6ICd3aXNobGlzdCcgfSk7XG4gICAgaWYgKHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtVmFyaWFudD8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaXRlbVZhcmllbnQ6IEl0ZW1WYXJpYW50IHwgbnVsbCA9IHRoaXMuZ2V0SXRlbVZhcmllbnQoKTtcbiAgICAgIGlmIChpdGVtVmFyaWVudCkge1xuICAgICAgICBpdGVtVmFyaWVudC53aXNobGlzdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLnJlbW92ZUl0ZW1Gcm9tRmF2b3VyaXRlKHRoaXMucmVzcG9uc2VEYXRhLnZhcmllbnRJZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FydFNlcnZpY2UucmVtb3ZlSXRlbUZyb21GYXZvdXJpdGUodGhpcy5yZXNwb25zZURhdGEudmFyaWVudElkKTtcbiAgICB9XG4gIH1cblxuICBnZXRQcm9kdWN0QnlDYXRlZ29yeSgpIHtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldFByb2R1Y3RCeUNhdGVnb3J5SWQodGhpcy5yZXNwb25zZURhdGE/Lml0ZW1DYXRlZ29yaXNhdGlvbj8uaXRlbUNhdGVnb3JpZXM/LlswXT8ucmVmSWQgPz8gXCJcIikuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICB0aGlzLnJlbGF0ZWRQcm9kdWN0RGF0YSA9IHJlc3BvbnNlLmRhdGE/LmZpbHRlcigocHJvZHVjdDogUHJvZHVjdCkgPT4gdGhpcy5yZXNwb25zZURhdGEuaXRlbUlkICE9IHByb2R1Y3QuaXRlbUlkKTtcbiAgICAgIGlmICh0aGlzLnJlbGF0ZWRQcm9kdWN0RGF0YT8ubGVuZ3RoID09IDApXG4gICAgICAgIHRoaXMuZ2V0UHJvZHVjdEJ5Q29sbGVjdGlvbigpO1xuICAgIH0pXG4gIH1cbiAgZ2V0UHJvZHVjdEJ5Q29sbGVjdGlvbigpIHtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldFByb2R1Y3RCeUNvbGxlY3Rpb25JZCh0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5pdGVtQ29sbGVjdGlvbj8uWzBdLnJlZklkID8/IFwiXCIpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSk9PiB7XG4gICAgICB0aGlzLnJlbGF0ZWRQcm9kdWN0RGF0YSA9IHJlc3BvbnNlLmRhdGE/LmZpbHRlcigocHJvZHVjdDogUHJvZHVjdCkgPT4gdGhpcy5yZXNwb25zZURhdGEuaXRlbUlkICE9IHByb2R1Y3QuaXRlbUlkKTtcbiAgICB9KVxuICB9XG4gIGNoYW5nZVByb2R1Y3QocHJvZHVjdDogUHJvZHVjdCkge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2RldGFpbHMnXSwge3F1ZXJ5UGFyYW1zOiB7aWQ6IHByb2R1Y3QuaXRlbUlkfX0pO1xuICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID0gMDtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgfVxuICBnZXRLZXlCeUlkeChwcm9wZXJ0eTogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BlcnR5KVtpbmRleF07XG4gIH1cbiAgaXNWYXJpZW50QXZhaWxhYmxlKHZhcmllbnQ6IGFueSk6IGJvb2xlYW4ge1xuXG4gICAgLy8gdGhpcy5yZXNwb25zZURhdGE/Lml0ZW1WYXJpYW50Py5mb3JFYWNoKCh2YXJpZW50OiBJdGVtVmFyaWFudCk9PiB7XG4gICAgLy8gICBsZXQgZm91bmRWYXJpZW50ID0gdHJ1ZTtcbiAgICAvLyAgIE9iamVjdC5rZXlzKHZhcmllbnQucHJvcGVydGllcykuZm9yRWFjaCgocHJvcGVydHk6IHN0cmluZyk9PiB7XG4gICAgLy8gICAgIC8vIGZvdW5kVmFyaWVudCA9ICh2YXJpZW50S2V5ID09IHZhcmllbnQucHJvcGVydGllc1twcm9wZXJ0eV0pICYmIGZvdW5kVmFyaWVudDtcbiAgICAvLyAgIH0pXG4gICAgLy8gfSlcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXZpZXdUaXRsZTogc3RyaW5nID0gXCJcIjtcbiAgcmV2aWV3RGVzY3JpcHRpb246IHN0cmluZyA9IFwiXCI7XG4gIGFkZFByb2R1Y3RSZXZpZXcoKSB7XG4gICAgY29uc3QgdXNlckRldGFpbHM6IFVzZXIgfCBudWxsID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCk7XG5cbiAgICBpZiAodGhpcy5yZXZpZXdUaXRsZS5sZW5ndGggPT0gMCAmJiB0aGlzLnJldmlld0Rlc2NyaXB0aW9uLmxlbmd0aCA9PSAwICYmIHRoaXMucHJvZHVjdFJldmlldyA9PSAwKVxuICAgICAgcmV0dXJuO1xuXG4gICAgaWYgKCF1c2VyRGV0YWlscykge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnTG9naW4nLCBkZXRhaWw6ICdQbGVhc2UgbG9naW4gdG8gcG9zdCByZXZpZXcnLCBrZXk6ICd3aXNobGlzdCcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBheWxvYWQ6IFJldmlldyA9IHtcbiAgICAgIHByb2R1Y3RJZDogdGhpcy5yZXNwb25zZURhdGEuaXRlbUlkLFxuICAgICAgdXNlcklkOiB1c2VyRGV0YWlscy51c2VySWQsXG4gICAgICByYXRpbmc6IHRoaXMucHJvZHVjdFJldmlldyxcbiAgICAgIHJldmlldzogdGhpcy5yZXZpZXdEZXNjcmlwdGlvbixcbiAgICAgIHVzZXJOYW1lOiB1c2VyRGV0YWlscz8uY29udGFjdD8ubmFtZSxcbiAgICAgIHRpdGxlOiB0aGlzLnJldmlld1RpdGxlLFxuICAgICAgcHJvZHVjdEltYWdlczogW11cbiAgICB9XG4gICAgdGhpcy5yZXN0U2VydmljZS5hZGRSZXZpZXcocGF5bG9hZCkuc3Vic2NyaWJlKChyZXNwb25zZSk9PiB7XG4gICAgICB0aGlzLnNob3dSZXZpZXcgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzcG9uc2VEYXRhLnJhdGluZyArPSAxO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnUmV2aWV3JywgZGV0YWlsOiAnVGhhbmtzIGZvciBnaXZpbmcgeW91ciBmZWVkYmFjaycsIGtleTogJ3dpc2hsaXN0JyB9KTtcbiAgICAgIGlmKHRoaXMucmV2aWV3Q29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMucmV2aWV3Q29tcG9uZW50LmdldEFsbFJldmlld3MoKTtcbiAgICAgIH1cbiAgICB9LCAoZXJyb3IpPT4ge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ1JldmlldycsIGRldGFpbDogZXJyb3I/LmVycm9yPy5tZXNzYWdlLCBrZXk6ICd3aXNobGlzdCcgfSk7XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFyaWVudFF1YW50aXR5KHByb2R1Y3RWYXJpZW50OiBJdGVtVmFyaWFudCk6IG51bWJlciB7XG4gICAgbGV0IGl0ZW1RdWFudGl0eTogbnVtYmVyID0gMDtcbiAgICB0aGlzLlVTRVJfQ0FSVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKT0+IHtcbiAgICAgICAgaWYgKHByb2R1Y3RWYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZClcbiAgICAgICAgICBpdGVtUXVhbnRpdHkgPSBpdGVtLnF1YW50aXR5O1xuICAgIH0pXG4gICAgcmV0dXJuIGl0ZW1RdWFudGl0eTtcbiAgfVxuICBwcml2YXRlIGlzVmFyaWVudFByZXNlbnRJbldpc2h0bGlzdChwcm9kdWN0VmFyaWVudDogSXRlbVZhcmlhbnQpOiBib29sZWFuIHtcbiAgICBsZXQgcHJlc2VudDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHRoaXMuVVNFUl9XSVNITElTVD8uZm9yRWFjaCgoaXRlbTogT3JkZXJlZEl0ZW1zKT0+IHtcbiAgICAgICAgaWYgKHByb2R1Y3RWYXJpZW50LnZhcmlhbnRJZCA9PSBpdGVtLnZhcmllbnRJZClcbiAgICAgICAgICBwcmVzZW50ID0gdHJ1ZTtcbiAgICB9KVxuICAgIHJldHVybiBwcmVzZW50O1xuICB9XG5cbiAgZWRpdFNlY3Rpb24oKXtcblxuICAgIGlmKHdpbmRvdy5pbm5lcldpZHRoIDw9IDQ3NSlcbiAgICAgIHJldHVybjtcblxuICAgIHRoaXMuX2V2ZW50U2VydmljZS50b2dnbGVFZGl0b3JFdmVudC5lbWl0KGZhbHNlKTtcbiAgICBzZXRUaW1lb3V0KCgpPT4ge1xuICAgICAgdGhpcy5fZXZlbnRTZXJ2aWNlLmVkaXRTZWN0aW9uLmVtaXQoe2RhdGE6dGhpcy5kYXRhfSk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIGdldCBpc0l0ZW1PdXRPZlN0b2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlRGF0YT8uaXRlbUludmVudG9yeT8ub3BlbmluZ1N0b2NrID09IDA7XG4gIH1cbiAgZ2V0IGN1cnJlbmN5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEJVU0lORVNTX0NPTlNUQU5UUy5DVVJSRU5DWTtcbiAgfVxuICBnZXQgaXNJdGVtTG93U3RvY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2VEYXRhPy5pdGVtSW52ZW50b3J5Py5vcGVuaW5nU3RvY2sgPCA1O1xuICB9XG4gIGdldCBpc01vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggPD0gNDc1O1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxuICA8cC10b2FzdCBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiIFtiYXNlWkluZGV4XT1cIjEwMDAwMDAwMDAwXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiIGtleT1cIndpc2hsaXN0XCJcbiAgICBbc2hvd1RyYW5zZm9ybU9wdGlvbnNdPVwiaXNNb2JpbGUgPyAndHJhbnNsYXRlWSgtMTAwJSknIDogJydcIj48L3AtdG9hc3Q+XG4gIDxzZWN0aW9uIGNsYXNzPVwidG90YWwtY29udGFpbmVyXCIgW2lkXT1cImRhdGE/LmlkXCIgW3NpbXBvTGF5b3V0XT1cInN0eWxlcz8ubGF5b3V0XCIgW3NpbXBvQmFja2dyb3VuZF09XCJzdHlsZXM/LmJhY2tncm91bmRcIlxuICAgIHNpbXBvSG92ZXIgKGhvdmVyaW5nKT1cInNob3dFZGl0VGFicygkZXZlbnQpXCIgW2F0dHIuc3R5bGVdPVwiY3VzdG9tQ2xhc3NcIiA+XG5cbiAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiIGNsYXNzPVwic3BlZWRkaWFsLWxpbmVhclwiICpuZ0lmPVwiaXNNb2JpbGVcIj5cbiAgICAgIDxwLXNwZWVkRGlhbCBbbW9kZWxdPVwiaXRlbXNcIiBkaXJlY3Rpb249XCJ1cFwiIFtidXR0b25TdHlsZV09XCJ7J2JvcmRlci1yYWRpdXMnOiAnNTAlJywgJ2hlaWdodCc6ICczMHB4J31cIiAvPlxuICAgIDwvZGl2PlxuICAgIDxzZWN0aW9uIGNsYXNzPVwiY29udGFpbmVyXCIgW2lkXT1cImRhdGE/LmlkXCIgW3NpbXBvQW5pbWF0aW9uXT1cInN0eWxlcz8uYW5pbWF0aW9uXCI+XG4gICAgICA8ZGl2PjxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6ICMwMjY3QzFcIiAoY2xpY2spPVwicm91dGVUb0hvbWUoKVwiPkhvbWU8L2E+IC9cbiAgICAgICAgPHNwYW4+e3sgcmVzcG9uc2VEYXRhPy5uYW1lIHwgdGl0bGVjYXNlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IGgtMTAwXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAyNXB4O1wiICBjbGFzcz1cImFib3ZlLWhlaWdodFwiIFtuZ1N0eWxlXT1cInsnbWluLWhlaWdodDogOTV2aCc6IGlzTW9iaWxlLCAnbWF4LXdpZHRoOiA5NXZoJzogIWlzTW9iaWxlfVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTYgY29sLTEyIGgtMTAwXCIgY2xhc3M9XCJoZWlnaHRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZC1pbWctYmxvY2tcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJJbWFnZVNlY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctNiBjb2wtMTIgaC0xMDAgcHJvZHVjdC1kZXRhaWxcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiUHJvZHVjdERlc2NcIj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNNb2JpbGVcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJBY3Rpb25CdG5cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhcmllbnQgb2YgdmFyaWVudHMgfCBrZXl2YWx1ZVwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhcmllbnQta2V5XCI+e3t2YXJpZW50LmtleX19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiBzdHlsZT1cImdhcDogNXB4O1wiPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBbYXR0ci5jbGFzc109XCIhaXNWYXJpZW50QXZhaWxhYmxlKHZhcmllbnQpID8gJ3ZhcmllbnQtdGFnIGRpc2FibGUtdmFyaWVudCcgOiAndmFyaWVudC10YWcnXCIgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdmFyaWVudFZhbHVlIG9mIHZhcmllbnQudmFsdWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidmFyaWVudC10YWdcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInNlbGVjdGVkVmFyaWVudC5nZXQodmFyaWVudC5rZXkpID09IHZhcmllbnRWYWx1ZSA/ICd3aGl0ZScgOiBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwic2VsZWN0ZWRWYXJpZW50LmdldCh2YXJpZW50LmtleSkgPT0gdmFyaWVudFZhbHVlID8gZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6ICcnXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RWYXJpZW50KHZhcmllbnQua2V5LCB2YXJpZW50VmFsdWUpXCI+e3t2YXJpZW50VmFsdWV9fTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtZGVzYyBib2R5LWxhcmdlIGQtYmxvY2sgdHJpbS10ZXh0XCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LmJyaWVmXCIgW2lubmVySFRNTF09XCJyZXNwb25zZURhdGEuYnJpZWZcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1za3VcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyZXNwb25zZURhdGE/Lml0ZW1JbnZlbnRvcnlcIj5TS1UgOiB7e3Jlc3BvbnNlRGF0YS5pdGVtSW52ZW50b3J5Py5vcGVuaW5nU3RvY2t9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5pdGVtQ2F0ZWdvcmllcyAmJiAocmVzcG9uc2VEYXRhPy5pdGVtQ2F0ZWdvcmlzYXRpb24/Lml0ZW1DYXRlZ29yaWVzPy5sZW5ndGggfHwgMCkgPiAwXCI+Q2F0ZWdvcnkgOiA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ29Ub0ZpbHRlcihjYXQucmVmTmFtZSlcIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjYXQgb2YgcmVzcG9uc2VEYXRhPy5pdGVtQ2F0ZWdvcmlzYXRpb24/Lml0ZW1DYXRlZ29yaWVzO2xldCBpZHggPSBpbmRleFwiPnt7Y2F0LnJlZk5hbWUgfFxuICAgICAgICAgICAgICAgIHRpdGxlY2FzZX19IDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKGlkeCsxKSAhPSByZXNwb25zZURhdGE/Lml0ZW1DYXRlZ29yaXNhdGlvbj8uaXRlbUNhdGVnb3JpZXM/Lmxlbmd0aFwiPiw8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9hPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIihyZXNwb25zZURhdGE/Lml0ZW1DYXRlZ29yaXNhdGlvbj8ucHJvZHVjdFRhZ3M/Lmxlbmd0aCB8fCAwKSA+IDBcIj5UYWdzIDogPHNwYW5cbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGFnIG9mIHJlc3BvbnNlRGF0YT8uaXRlbUNhdGVnb3Jpc2F0aW9uPy5wcm9kdWN0VGFnc1wiPnt7dGFnLnRhZ05hbWV9fSxcbiAgICAgICAgICAgICAgPC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlNvY2lhbEljb25zXCI+PC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJSZXZpZXdTZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBwcm9kLWRlc2NcIiAqbmdJZj1cInJlc3BvbnNlRGF0YT8uZGVzY3JpcHRvcj8ubmFtZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWdyb3VwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRhYlwiPkRlc2NyaXB0aW9uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTBweDtcIiBjbGFzcz1cImJvZHktbGFyZ2UgYnJpZWYtZGVzY1wiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5kZXNjcmlwdG9yXCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cInJlc3BvbnNlRGF0YT8uZGVzY3JpcHRvcj8ubmFtZVwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9zZWN0aW9uPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWxhdGVkUHJvZHVjdERhdGE/Lmxlbmd0aFwiPlxuICAgICAgPHNpbXBvLWZlYXR1cmVkLXByb2R1Y3RzIFtlZGl0XT1cImZhbHNlXCIgW2RhdGFdPVwiZmVhdHVyZVByb2R1Y3REYXRhXCIgW3Jlc3BvbnNlRGF0YV09XCJyZWxhdGVkUHJvZHVjdERhdGFcIlxuICAgICAgICBbaXNSZWxhdGVkUHJvZHVjdF09XCJ0cnVlXCIgKGNoYW5nZURldGFpbFByb2R1Y3QpPVwiY2hhbmdlUHJvZHVjdCgkZXZlbnQpXCI+PC9zaW1wby1mZWF0dXJlZC1wcm9kdWN0cz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVjZW50Vmlld0l0ZW1MaXN0Py5sZW5ndGhcIj5cbiAgICAgIDxzaW1wby1mZWF0dXJlZC1wcm9kdWN0cyBbZWRpdF09XCJmYWxzZVwiIFtkYXRhXT1cInJlY2VudFZpZXdlZERhdGFcIiBbcmVzcG9uc2VEYXRhXT1cInJlY2VudFZpZXdJdGVtTGlzdFwiXG4gICAgICAgIFtpc1JlbGF0ZWRQcm9kdWN0XT1cInRydWVcIj48L3NpbXBvLWZlYXR1cmVkLXByb2R1Y3RzPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gPG5nLWNvbnRhaW5lcj5cbiAgICAgIDxzaW1wby1jdXN0b21lci1yZXZpZXcgW2RhdGFdPVwiZGF0YVwiPjwvc2ltcG8tY3VzdG9tZXItcmV2aWV3PlxuICAgIDwvbmctY29udGFpbmVyPiAtLT5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZWRpdH1cIiAqbmdJZj1cInNob3dFZGl0b3JzXCI+XG4gICAgICA8c2ltcG8taG92ZXItZWxlbWVudHMgW2RhdGFdPVwiZGF0YVwiIFtpbmRleF09XCJpbmRleFwiIFtlZGl0T3B0aW9uc109XCJlZGl0XCI+PC9zaW1wby1ob3Zlci1lbGVtZW50cz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0RlbGV0ZVwiIFtuZ0NsYXNzXT1cInsnaG92ZXJfZWZmZWN0JzogZGVsZXRlfVwiPlxuICAgICAgPHNpbXBvLWRlbGV0ZS1ob3Zlci1lbGVtZW50IFtkYXRhXT1cImRhdGFcIiBbaW5kZXhdPVwiaW5kZXhcIj48L3NpbXBvLWRlbGV0ZS1ob3Zlci1lbGVtZW50PlxuICAgIDwvZGl2PlxuICA8L3NlY3Rpb24+XG48L25nLWNvbnRhaW5lcj5cblxuXG48bmd4LXNrZWxldG9uLWxvYWRlciAqbmdJZj1cImlzTG9hZGluZ1wiIGNvdW50PVwiMVwiIGFwcGVhcmFuY2U9XCJjaXJjbGVcIiBbdGhlbWVdPVwie1xuICB3aWR0aDogJzEwMCUnLFxuICBoZWlnaHQ6ICc0MHZoJyxcbiAgJ2JvcmRlci1yYWRpdXMnOiAnMTBweCcsXG4gICdwb3NpdGlvbic6ICdyZWxhdGl2ZScsXG4gICdyaWdodCc6ICc1cHgnXG59XCI+XG48L25neC1za2VsZXRvbi1sb2FkZXI+XG5cblxuPGRpdiBjbGFzcz1cIm1vYmlsZS1mb290ZXJcIj5cbiAgPGRpdiBjbGFzcz1cImljb25zXCI+XG4gICAgPGRpdiAoY2xpY2spPVwiZ29Ub0NhcnQoKVwiPlxuICAgICAgPG1hdC1pY29uPnNob3BwaW5nX2NhcnQ8L21hdC1pY29uPlxuICAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgICA8bWF0LWljb24gW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwiYWRkVG9GYXZvdXJpdGUoKVwiXG4gICAgICAgICpuZ0lmPVwiIWlzSXRlbUFzRmF2b3JpdGVcIj5mYXZvcml0ZV9ib3JkZXI8L21hdC1pY29uPlxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cInJlbW92ZVRvRmF2b3VyaXRlKClcIlxuICAgICAgICAqbmdJZj1cImlzSXRlbUFzRmF2b3JpdGVcIj5mYXZvcml0ZTwvbWF0LWljb24+XG4gICAgICA8IS0tIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIChjbGljayk9XCJhZGRUb0Zhdm91cml0ZSgpXCJcbiAgICAgICAgKm5nSWY9XCIhaXNJdGVtQXNGYXZvcml0ZVwiPmJvb2ttYXJrPC9tYXQtaWNvbj5cbiAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIChjbGljayk9XCJyZW1vdmVUb0Zhdm91cml0ZSgpXCJcbiAgICAgICAgKm5nSWY9XCJpc0l0ZW1Bc0Zhdm9yaXRlXCI+Ym9va21hcmtfYm9yZGVyPC9tYXQtaWNvbj4gLS0+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwib3V0LW9mLXN0b2NrXCIgKm5nSWY9XCJpc0l0ZW1PdXRPZlN0b2NrXCI+T3V0IG9mIFN0b2NrPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJxdWFudGl0eVwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5xdWFudGl0eSAmJiAhaXNJdGVtT3V0T2ZTdG9ja1wiPlxuICAgIDxkaXYgY2xhc3M9XCJwbHVzXCIgKGNsaWNrKT1cImFkZFRvQ2FydCgnU1VCU1RSQUNUJylcIj4tPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cIndpZHRoOiA1MHB4O1wiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj57e3Jlc3BvbnNlRGF0YS5xdWFudGl0eX19PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1pbnVzXCIgKGNsaWNrKT1cImFkZFRvQ2FydCgnQUREJylcIj4rPC9kaXY+XG4gIDwvZGl2PlxuICA8YnV0dG9uIGNsYXNzPVwiYWRkLWJ0blwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtpZF09XCJidXR0b25JZFwiIFtidXR0b25TdHlsZV09XCJidXR0b24/LnN0eWxlc1wiXG4gICAgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwiYWRkVG9DYXJ0KClcIlxuICAgICpuZ0lmPVwiIXJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgIWlzSXRlbU91dE9mU3RvY2tcIj57e2RhdGE/LmFjdGlvbj8uYnV0dG9ucz8uWzBdPy5jb250ZW50Py5sYWJlbH19PC9idXR0b24+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNSZXZpZXdTZWN0aW9uPlxuICA8ZGl2IGNsYXNzPVwicmV2aWV3LXNlY1wiPlxuICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPkN1c3RvbWVyIFJldmlldzwvZGl2PlxuICAgIDxwLXJhdGluZyBbY2FuY2VsXT1cImZhbHNlXCIgW3JlYWRvbmx5XT1cInRydWVcIiBbKG5nTW9kZWwpXT1cInRvdGFsUmV2aWV3XCIgLz5cbiAgICA8c3Bhbj5CZSB0aGUgZmlyc3QgdG8gd3JpdGUgYSByZXZpZXc8L3NwYW4+XG4gICAgPGJ1dHRvbiBjbGFzcz1cIm10LTNcIiAgc2ltcG9CdXR0b25EaXJlY3RpdmUgW2lkXT1cImJ1dHRvbklkXCIgW2J1dHRvblN0eWxlXT1cImJ1dHRvbj8uc3R5bGVzXCJcbiAgICBbY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cInNob3dSZXZpZXcgPSAhc2hvd1Jldmlld1wiPnt7ICFzaG93UmV2aWV3ID8gJ0FkZCBSZXZpZXcnIDogJ0NhbmNlbCBSZXZpZXcnfX08L2J1dHRvbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd1Jldmlld1wiPlxuICAgICAgPGhyIC8+XG4gICAgICA8ZGl2IGNsYXNzPVwidXNlci1yZXZpZXdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+V3JpdGUgYSByZXZpZXc8L2Rpdj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWNvbmRhcnktdGV4dFwiPlJBVElORzwvc3Bhbj5cbiAgICAgICAgPHAtcmF0aW5nIFsobmdNb2RlbCldPVwicHJvZHVjdFJldmlld1wiIFtjYW5jZWxdPVwiZmFsc2VcIiBbcmVhZG9ubHldPVwiZmFsc2VcIiAvPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vjb25kYXJ5LXRleHRcIj5SZXZpZXcgVGl0bGU8L3NwYW4+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJHaXZlIHlvdXIgcmV2aWV3IGEgdGl0bGVcIiBbKG5nTW9kZWwpXT1cInJldmlld1RpdGxlXCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vjb25kYXJ5LXRleHRcIj5SZXZpZXc8L3NwYW4+XG4gICAgICAgICAgPHRleHRhcmVhIHBsYWNlaG9sZGVyPVwiV3JpdGUgeW91ciBjb21tZW50cyBoZXJlXCIgWyhuZ01vZGVsKV09XCJyZXZpZXdEZXNjcmlwdGlvblwiPjwvdGV4dGFyZWE+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmV2aWV3LWFjdGlvbi1idG5cIj5cbiAgICAgICAgICA8YnV0dG9uICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIFtzdHlsZS5jb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cInNob3dSZXZpZXcgPSBmYWxzZVwiPkNhbmNlbCByZXZpZXc8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uICBzaW1wb0J1dHRvbkRpcmVjdGl2ZSBbaWRdPVwiYnV0dG9uSWRcIiBbYnV0dG9uU3R5bGVdPVwiYnV0dG9uPy5zdHlsZXNcIlxuICAgICAgICAgIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCIgKGNsaWNrKT1cImFkZFByb2R1Y3RSZXZpZXcoKVwiIFtkaXNhYmxlZF09XCJwcm9kdWN0UmV2aWV3ID09IDAgJiYgcmV2aWV3VGl0bGU/Lmxlbmd0aCA9PSAwICYmIHJldmlld0Rlc2NyaXB0aW9uPy5sZW5ndGggPT0gMFwiPlN1Ym1pdCByZXZpZXc8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNTb2NpYWxJY29ucz5cbiAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQgYWxpZ24taXRlbXMtbGctY2VudGVyIGZsZXgtY29sdW1uIGZsZXgtbGctcm93IGdhcC1sZy0wIGdhcC0zXCJcbiAgICAgIFtuZ0NsYXNzXT1cImRhdGE/LmNvbnRlbnQ/LnNvY2lhbExpbmtzPy5kaXNwbGF5ID8gJ2p1c3RpZnktY29udGVudC1iZXR3ZWVuJyA6ICdqdXN0aWZ5LWNvbnRlbnQtZW5kJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBtdC0wXCIgKm5nSWY9XCJkYXRhPy5jb250ZW50Py5zb2NpYWxMaW5rcz8uZGlzcGxheVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhdGE/LmNvbnRlbnQ/LnNvY2lhbExpbmtzPy5jaGFubmVsc1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7bWFyZ2luLXJpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgICAgPHNpbXBvLXNvY2lhLWljb25zIFtzb2NpYWxJY29uRGF0YV09XCJpdGVtXCIgW2NvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiBbc2VjdGlvbklkXT1cImRhdGE/LmlkXCI+PC9zaW1wby1zb2NpYS1pY29ucz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI0FjdGlvbkJ0bj5cbiAgPGRpdiBjbGFzcz1cImJ1dHRvbi1wYXJlbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwib3V0LW9mLXN0b2NrXCIgKm5nSWY9XCJpc0l0ZW1PdXRPZlN0b2NrXCI+T3V0IG9mIFN0b2NrPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInF1YW50aXR5XCIgKm5nSWY9XCJyZXNwb25zZURhdGE/LnF1YW50aXR5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicGx1c1wiIChjbGljayk9XCJhZGRUb0NhcnQoJ1NVQlNUUkFDVCcpXCI+LTwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiA1MHB4O1wiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj57e3Jlc3BvbnNlRGF0YS5xdWFudGl0eX19PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibWludXNcIiAoY2xpY2spPVwiYWRkVG9DYXJ0KCdBREQnKVwiPis8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiIXJlc3BvbnNlRGF0YT8ucXVhbnRpdHkgJiYgIWlzSXRlbU91dE9mU3RvY2tcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJzZW5kLWJ0blwiIHNpbXBvQnV0dG9uRGlyZWN0aXZlIFtpZF09XCJidXR0b25JZFwiIFtidXR0b25TdHlsZV09XCJidXR0b24/LnN0eWxlc1wiXG4gICAgICAgIFtjb2xvcl09XCJkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgKGNsaWNrKT1cImFkZFRvQ2FydCgpXCI+e3tkYXRhPy5hY3Rpb24/LmJ1dHRvbnM/LlswXT8uY29udGVudD8ubGFiZWx9fTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmYXZvdXJpdGVcIj5cbiAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwiZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiIChjbGljayk9XCJhZGRUb0Zhdm91cml0ZSgpXCJcbiAgICAgICAgKm5nSWY9XCIhaXNJdGVtQXNGYXZvcml0ZVwiPmZhdm9yaXRlX2JvcmRlcjwvbWF0LWljb24+XG4gICAgICA8bWF0LWljb24gW3N0eWxlLmNvbG9yXT1cImRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIiAoY2xpY2spPVwicmVtb3ZlVG9GYXZvdXJpdGUoKVwiXG4gICAgICAgICpuZ0lmPVwiaXNJdGVtQXNGYXZvcml0ZVwiPmZhdm9yaXRlPC9tYXQtaWNvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNQcm9kdWN0RGVzYz5cbiAgPGRpdiBjbGFzcz1cImhlYWRpbmctbGFyZ2UgdHJpbS10ZXh0XCIgY2xhc3M9XCJwcm9kdWN0LWhlYWRpbmdcIiA+e3tyZXNwb25zZURhdGE/Lm5hbWV9fTwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCIgc3R5bGU9XCJnYXA6IDEwcHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi10b3A6IDE1cHg7XCI+XG4gICAgPGRpdiBjbGFzcz1cInByaWNlXCIgW25nQ2xhc3NdPVwieydkaXNjb3VudC1wcmljZSc6IHJlc3BvbnNlRGF0YT8ucHJpY2U/LmRpc2NvdW50ZWRQcmljZX1cIlxuICAgICAgKm5nSWY9XCJyZXNwb25zZURhdGE/LnByaWNlPy5kaXNjb3VudGVkUHJpY2UgIT0gcmVzcG9uc2VEYXRhPy5wcmljZT8udmFsdWVcIj48c3BhbiBbaW5uZXJIVE1MXT0nY3VycmVuY3knPjwvc3Bhbj5cbiAgICAgIHt7cmVzcG9uc2VEYXRhPy5wcmljZT8udmFsdWV9fTwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwcmljZVwiICpuZ0lmPVwicmVzcG9uc2VEYXRhPy5wcmljZT8uZGlzY291bnRlZFByaWNlXCI+PHNwYW4gW2lubmVySFRNTF09J2N1cnJlbmN5Jz48L3NwYW4+XG4gICAgICB7e3Jlc3BvbnNlRGF0YT8ucHJpY2U/LmRpc2NvdW50ZWRQcmljZX19PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInRheC10ZXh0XCI+KGV4Y2x1ZGluZyBhbGwgdGF4ZXMpPC9kaXY+XG4gIDwvZGl2PlxuXG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI0ltYWdlU2VjdGlvbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF2YXJpZW50TG9hZGluZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJpbWctbGlzdFwiICpuZ0lmPVwic2NyZWVuV2lkdGggPiA1MDBcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGltZyBvZiBpdGVtSW1hZ2VzXCI+XG4gICAgICAgIDxpbWcgbG9hZGluZz1cImxhenlcIiBvbmVycm9yPVwidGhpcy5zcmM9J2h0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGcnXCIgW3NyY109XCJpbWcuaW1nVXJsXCJcbiAgICAgICAgICBhbHQ9XCJcIiBjbGFzcz1cImltZ1wiIChjbGljayk9XCJjaGFuZ2VJbWcoaW1nLmltZ1VybClcIlxuICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJpbWcuaW1nVXJsID09IGN1cnJlbnRJbWcgPyBkYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogJ3RyYW5zcGFyZW50J1wiPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIml0ZW0taW1nXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudEltZ1wiPlxuXG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInNoYXJlLWljb25cIiAoY2xpY2spPVwic2hhcmVQcm9kdWN0KClcIj5zaGFyZTwvbWF0LWljb24+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNNb2JpbGVcIj5cbiAgICAgICAgICA8bGliLW5neC1pbWFnZS16b29tIFt0aHVtYkltYWdlXT1cImN1cnJlbnRJbWdcIiBbZnVsbEltYWdlXT1cImN1cnJlbnRJbWdcIiBbem9vbU1vZGVdPVwiJ2hvdmVyJ1wiIFttYWduaWZpY2F0aW9uXT1cIjJcIlxuICAgICAgICAgICAgW2xlbnNIZWlnaHRdPVwiMTAwXCIgW2xlbnNXaWR0aF09XCIxMDBcIiBzdHlsZT1cImhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7XCI+PC9saWItbmd4LWltYWdlLXpvb20+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNNb2JpbGVcIj5cbiAgICAgICAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgW3NyY109XCJjdXJyZW50SW1nXCIgYWx0PVwiXCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWN1cnJlbnRJbWdcIj5cbiAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIHNyYz1cImh0dHBzOi8vaS5wb3N0aW1nLmNjL2hQUzJKcFYwL25vLWltYWdlLWF2YWlsYWJsZS5qcGdcIiBhbHQ9XCJcIj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpbWctbGlzdFwiICpuZ0lmPVwic2NyZWVuV2lkdGggPD0gNTAwXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpbWcgb2YgaXRlbUltYWdlc1wiPlxuICAgICAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgb25lcnJvcj1cInRoaXMuc3JjPSdodHRwczovL2kucG9zdGltZy5jYy9oUFMySnBWMC9uby1pbWFnZS1hdmFpbGFibGUuanBnJ1wiIFtzcmNdPVwiaW1nLmltZ1VybFwiXG4gICAgICAgICAgYWx0PVwiXCIgY2xhc3M9XCJpbWdcIiAoY2xpY2spPVwiY2hhbmdlSW1nKGltZy5pbWdVcmwpXCI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJpdGVtLWltZ1wiICpuZ0lmPVwidmFyaWVudExvYWRpbmdcIj5cbiAgICA8bmd4LXNrZWxldG9uLWxvYWRlciBjb3VudD1cIjFcIiBhcHBlYXJhbmNlPVwiY2lyY2xlXCIgW3RoZW1lXT1cIntcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICdib3JkZXItcmFkaXVzJzogJzEwcHgnLFxuICAgICAgJ3Bvc2l0aW9uJzogJ3JlbGF0aXZlJyxcbiAgICAgICdyaWdodCc6ICc1cHgnXG4gICAgfVwiPlxuICAgIDwvbmd4LXNrZWxldG9uLWxvYWRlcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG5cblxuXG48IS0tIDxkaXYgY2xhc3M9XCJtb2RhbCBmYWRlXCIgaWQ9XCJpdGVtVmFyaWVudHNcIiB0YWJpbmRleD1cIi0xXCIgYXJpYS1sYWJlbGxlZGJ5PVwiaXRlbVZhcmllbnRzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiPlJpZ2h0LXRvLUxlZnQgTW9kYWw8L2g1PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgIFRoaXMgY29udGVudCBpcyBhbGlnbmVkIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPlNhdmUgY2hhbmdlczwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+IC0tPlxuIl19