@snabcentr/client-ui 2.1.0 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. package/cart/cart-item-mobile/sc-cart-item-mobile.component.d.ts +1 -2
  2. package/catalog/input-quantity/sc-input-quantity.component.d.ts +15 -3
  3. package/catalog/price-history/sc-price-history.component.d.ts +8 -0
  4. package/directives/abstract-price-card/abstract-sc-price-card.directive.d.ts +1 -2
  5. package/esm2022/accordion/sc-accordion-content.directive.mjs +3 -3
  6. package/esm2022/accordion/sc-accordion.component.mjs +3 -3
  7. package/esm2022/accordion/sc-accordion.module.mjs +4 -4
  8. package/esm2022/auth/sc-auth.module.mjs +4 -4
  9. package/esm2022/auth/sc-sign-in-form/sc-sign-in-form-by-email/sc-sign-in-form-by-email.component.mjs +3 -3
  10. package/esm2022/auth/sc-sign-in-form/sc-sign-in-form-by-phone/sc-sign-in-form-by-phone.component.mjs +3 -3
  11. package/esm2022/auth/sc-sign-in-form/sc-sign-in-form.component.mjs +3 -3
  12. package/esm2022/auth/sign-up-form/sc-sign-up-form.component.mjs +3 -3
  13. package/esm2022/banner/sc-banner.component.mjs +3 -3
  14. package/esm2022/banner/sc-banner.module.mjs +4 -4
  15. package/esm2022/brands-list/sc-brands-list.component.mjs +3 -3
  16. package/esm2022/brands-list/sc-brands-list.module.mjs +4 -4
  17. package/esm2022/cart/cart-item-mobile/sc-cart-item-mobile.component.mjs +6 -6
  18. package/esm2022/cart/sc-cart.module.mjs +4 -4
  19. package/esm2022/catalog/categories-list/sc-categories-list.component.mjs +3 -3
  20. package/esm2022/catalog/category-card/sc-category-card.component.mjs +3 -3
  21. package/esm2022/catalog/input-quantity/sc-input-quantity.component.mjs +31 -12
  22. package/esm2022/catalog/price-card/sc-price-card.component.mjs +5 -5
  23. package/esm2022/catalog/price-history/sc-price-history.component.mjs +29 -15
  24. package/esm2022/catalog/price-list-pagination/sc-price-list-pagination.component.mjs +3 -3
  25. package/esm2022/catalog/price-warehouse-stock/sc-price-warehouse-stock.component.mjs +3 -3
  26. package/esm2022/catalog/sc-catalog.module.mjs +4 -4
  27. package/esm2022/catalog/sc-favorite-btn/sc-favorite-btn.component.mjs +3 -3
  28. package/esm2022/contacts/add-contact-dialog/sc-add-contact-dialog.component.mjs +3 -3
  29. package/esm2022/contacts/contacts-accordion/sc-contacts-accordion.component.mjs +3 -3
  30. package/esm2022/contacts/new-contact-form/sc-new-contact-form.component.mjs +3 -3
  31. package/esm2022/contacts/sc-contacts.module.mjs +4 -4
  32. package/esm2022/contragents/add-contragent-bank-account-dialog/sc-add-contragent-bank-account-dialog.component.mjs +3 -3
  33. package/esm2022/contragents/add-contragent-dialog/sc-add-contragent-dialog.component.mjs +3 -3
  34. package/esm2022/contragents/contragents-accordion/contragents-accordion-item/sc-contragents-accordion-item.component.mjs +3 -3
  35. package/esm2022/contragents/contragents-accordion/sc-contragents-accordion.component.mjs +3 -3
  36. package/esm2022/contragents/new-contragent-bank-account-form/sc-new-contragent-bank-account-form.component.mjs +3 -3
  37. package/esm2022/contragents/new-contragent-form/sc-new-contragent-form.component.mjs +3 -3
  38. package/esm2022/contragents/sc-contragents.module.mjs +4 -4
  39. package/esm2022/delivery-address/add-delivery-address-dialog/sc-add-delivery-address-dialog.component.mjs +3 -3
  40. package/esm2022/delivery-address/delivery-address-accordion/delivery-address-accordion-item/sc-delivery-address-accordion-item.component.mjs +3 -3
  41. package/esm2022/delivery-address/delivery-address-accordion/sc-delivery-address-accordion.component.mjs +3 -3
  42. package/esm2022/delivery-address/sc-delivery-address.module.mjs +4 -4
  43. package/esm2022/directives/abstract-price-card/abstract-sc-price-card.directive.mjs +5 -6
  44. package/esm2022/directives/next-input-focus/sc-next-input-focus.directive.mjs +3 -3
  45. package/esm2022/directives/next-input-focus/sc-next-input-focus.module.mjs +4 -4
  46. package/esm2022/directives/tel-link/sc-tel-link.directive.mjs +3 -3
  47. package/esm2022/directives/tel-link/sc-tel-link.module.mjs +4 -4
  48. package/esm2022/directives/terminal-link/sc-terminal-link.directive.mjs +3 -3
  49. package/esm2022/files/directives/tree-top.directive.mjs +3 -3
  50. package/esm2022/files/directives/tree.directive.mjs +3 -3
  51. package/esm2022/files/file-tree-item/file-tree-item.component.mjs +3 -3
  52. package/esm2022/files/files-and-documents/files-and-documents.component.mjs +3 -3
  53. package/esm2022/files/files-and-documents.module.mjs +4 -4
  54. package/esm2022/files/services/tree-icon.service.mjs +3 -3
  55. package/esm2022/files/services/tree-loader.service.mjs +3 -3
  56. package/esm2022/form-fields/addresses-selection-field/sc-addresses-selection-field.component.mjs +5 -5
  57. package/esm2022/form-fields/form-fields.module.mjs +4 -4
  58. package/esm2022/form-fields/suggestion-field/sc-suggestion-field.component.mjs +10 -6
  59. package/esm2022/helpers/sc-px-converter.mjs +3 -3
  60. package/esm2022/news/news-card/sc-news-card.component.mjs +3 -3
  61. package/esm2022/news/news-card-skeleton/sc-news-card-skeleton.component.mjs +3 -3
  62. package/esm2022/news/sc-news.module.mjs +4 -4
  63. package/esm2022/order/index.mjs +2 -2
  64. package/esm2022/order/order-item-mobile/sc-order-item-mobile.component.mjs +80 -0
  65. package/esm2022/order/sc-order.module.mjs +6 -6
  66. package/esm2022/order/sc-payment-status/sc-payment-status.component.mjs +3 -3
  67. package/esm2022/pipes/sc-formatted-phone.mjs +3 -3
  68. package/esm2022/profile/sc-profile-accordions-content/sc-profile-accordions-content.component.mjs +3 -3
  69. package/esm2022/profile/sc-profile.module.mjs +4 -4
  70. package/esm2022/public-api.mjs +1 -2
  71. package/esm2022/qrcode/qrcode-dialog/sc-qrcode-dialog.component.mjs +3 -3
  72. package/esm2022/qrcode/sc-qrcode.module.mjs +4 -4
  73. package/esm2022/samples/ask-to-sample-form/sc-ask-to-sample-form.component.mjs +96 -10
  74. package/esm2022/samples/preview-sample/sc-preview-sample.component.mjs +3 -3
  75. package/esm2022/samples/sc-sample.module.mjs +10 -7
  76. package/esm2022/share-button/sc-share-button.component.mjs +3 -3
  77. package/esm2022/share-button/sc-share-button.module.mjs +4 -4
  78. package/esm2022/user/reset-user-password/sc-reset-user-password.component.mjs +3 -3
  79. package/esm2022/user/sc-user.module.mjs +4 -4
  80. package/esm2022/user/update-user-info-dialog/sc-update-user-info-dialog.component.mjs +3 -3
  81. package/esm2022/user/user-managers/sc-user-managers.component.mjs +5 -5
  82. package/esm2022/user/user-phone-approve-dialog/sc-user-phone-approve-dialog.component.mjs +3 -3
  83. package/esm2022/verification/sc-verification.module.mjs +4 -4
  84. package/esm2022/verification/verification-phone-check-form/sc-verification-phone-check-form.component.mjs +3 -3
  85. package/fesm2022/snabcentr-client-ui.mjs +413 -342
  86. package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
  87. package/form-fields/suggestion-field/sc-suggestion-field.component.d.ts +4 -0
  88. package/order/index.d.ts +1 -1
  89. package/order/order-item-mobile/{order-item-mobile.component.d.ts → sc-order-item-mobile.component.d.ts} +1 -2
  90. package/order/sc-order.module.d.ts +1 -1
  91. package/package.json +2 -2
  92. package/public-api.d.ts +0 -1
  93. package/release_notes.tmp +6 -1
  94. package/samples/ask-to-sample-form/sc-ask-to-sample-form.component.d.ts +38 -4
  95. package/samples/sc-sample.module.d.ts +1 -1
  96. package/styles/tailwind/tailwind.scss +11 -26
  97. package/esm2022/helpers/sc-units-helper.mjs +0 -45
  98. package/esm2022/order/order-item-mobile/order-item-mobile.component.mjs +0 -80
  99. package/esm2022/tokens/index.mjs +0 -2
  100. package/esm2022/tokens/sc-linear-values-token.mjs +0 -10
  101. package/helpers/sc-units-helper.d.ts +0 -28
  102. package/tokens/index.d.ts +0 -1
  103. package/tokens/sc-linear-values-token.d.ts +0 -8
@@ -43,12 +43,12 @@ export class ScPriceCardComponent extends AbstractScPriceCard {
43
43
  markForCheck() {
44
44
  this.cdr.markForCheck();
45
45
  }
46
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScPriceCardComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
47
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.3", type: ScPriceCardComponent, selector: "sc-price-card", inputs: { size: "size" }, host: { properties: { "attr.data-size": "this.size", "attr.is_mobile": "this.isMobile", "attr.is_in_cart": "this.isInCart" } }, providers: [SEARCH_TERM_PROVIDERS], usesInheritance: true, ngImport: i0, template: "<div\n *ngIf=\"product; else skeleton\"\n class=\"card-wrapper relative flex w-auto min-w-40 flex-col rounded-xl shadow-md\"\n>\n <div class=\"flex grow flex-col justify-center overflow-hidden rounded-xl p-2\">\n <img\n (click)=\"clickCardEvent.emit()\"\n [src]=\"getCardImagePreview()\"\n [alt]=\"product.name\"\n class=\"max-h-full w-full rounded-xl object-cover\"\n />\n <sc-favorite-btn\n *ngIf=\"authStatus$ | async\"\n class=\"absolute left-2 top-2\"\n (clickEvent)=\"clickFavoriteEvent.emit()\"\n [showLoader]=\"favoriteShowLoader\"\n [isFavorite]=\"product.isFavorite\"\n [disabled]=\"!!product.primaryCategory?.isFavorite\"\n ></sc-favorite-btn>\n <div class=\"absolute right-2 top-2 m-1 flex gap-2\">\n <tui-icon \n *ngIf=\"product.isPreviouslyOrdered\"\n icon=\"@tui.star\"\n class=\"!size-6 rounded-lg !fill-white text-tui-negative\"\n ></tui-icon>\n <tui-icon \n *ngIf=\"product.cartItem\"\n icon=\"@tui.check\"\n class=\"!size-6 rounded-lg bg-tui-primary text-white\"\n ></tui-icon>\n </div>\n </div>\n <div class=\"p-2\">\n <tui-elastic-container class=\"shrink-0\">\n <a\n tuiLink\n class=\"name\"\n \n [tuiHighlight]=\"(search$ | async) ?? ''\"\n (click)=\"clickCardEvent.emit()\"\n >\n {{ product.name }}\n </a>\n </tui-elastic-container>\n <tui-elastic-container class=\"shrink-0\">\n <p\n *ngIf=\"product?.pack\"\n class=\"text-tui-text-02\"\n >\n \u041D\u043E\u0440\u043C\u0430 \u0443\u043F\u0430\u043A\u043E\u0432\u043A\u0438: {{ product.pack }}\n </p>\n <p\n [tuiHighlight]=\"(search$ | async) ?? ''\"\n class=\"code text-tui-text-02\"\n >\n \u0410\u0440\u0442\u0438\u043A\u0443\u043B: {{ product.code }}\n </p>\n\n <a\n tuiLink\n *ngIf=\"!isMobile && (authStatus$ | async) && product?.costDate\"\n \n aria-disabled=\"true\"\n class=\"history\"\n (click)=\"clickPriceHistoryEvent.emit()\"\n >\n \u0414\u0430\u0442\u0430: {{ product.costDate }}\n </a>\n </tui-elastic-container>\n <div\n *ngIf=\"warehouseSelect$ | async as warehouseSelect\"\n class=\"flex flex-col\"\n >\n <span\n *ngIf=\"product.discount && !isMobile\"\n class=\"flex items-center text-tui-text-02\"\n >\n <span class=\"line-through\">{{ product.discountCostString }}</span> &nbsp;\n <span class=\"font-bold text-tui-success-fill\"> -{{ product.discount.percent }}% </span>\n <tui-icon \n icon=\"@tui.info\"\n [tuiHint]=\"discountHint\"\n [tuiHintShowDelay]=\"100\"\n tuiHintDirection=\"top\"\n class=\"!h-4 text-black\"\n ></tui-icon>\n <ng-template #discountHint>\n <div class=\"font-bold\">{{ product.discount.name }}</div>\n <div *ngIf=\"product.discount.expiredAt as expiredAt\">\u0414\u0430\u0442\u0430 \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F: {{ expiredAt }}</div>\n </ng-template>\n </span>\n <span\n [class.text-tui-text-02]=\"!product.isWarehouseStockExist(warehouseSelect.id)\"\n class=\"cost font-bold\"\n >{{ product.costRubString }}</span\n >\n <span\n *ngIf=\"!product.priceInRub\"\n class=\"hidden font-bold text-tui-text-02 group-hover:block\"\n >{{ product.costString }}</span\n >\n <sc-price-warehouse-stock [product]=\"product\"></sc-price-warehouse-stock>\n </div>\n <div class=\"cart-actions flex shrink-0 overflow-hidden\">\n <button\n *ngIf=\"!showQuantityControl\"\n tuiButton\n (click)=\"clickAddToCartEvent.emit(product)\"\n [loading]=\"quantityShowLoader\"\n [size]=\"size === 's' ? 'xs' : 's'\"\n class=\"mt-2 grow\"\n iconStart=\"@tui.shopping-cart\"\n >\n \u0412 \u043A\u043E\u0440\u0437\u0438\u043D\u0443\n </button>\n <sc-input-quantity\n #inputQuantity\n *ngIf=\"showQuantityControl\"\n [formControl]=\"quantityControl\"\n [size]=\"size\"\n [step]=\"unitsHelper.productMultiplicity(product)\"\n [showLoader]=\"quantityShowLoader\"\n (clickClearEvent)=\"clickClearEvent.emit(cartItem)\"\n class=\"mt-2 w-full\"\n (keydown.enter)=\"inputQuantity.nativeFocusableElement?.blur()\"\n ></sc-input-quantity>\n </div>\n </div>\n</div>\n\n<ng-template #skeleton>\n <div class=\"card-wrapper flex flex-col overflow-hidden rounded-xl bg-white shadow-sc-1\">\n <!-- \u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0442\u043E\u0432\u0430\u0440\u0430 -->\n <div class=\"h-3/5 w-full rounded-t bg-tui-base-02\"></div>\n <!-- \u041A\u0440\u0430\u0442\u043A\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E \u0442\u043E\u0432\u0430\u0440\u0435 -->\n <div class=\"flex grow flex-col gap-2.5 rounded-b bg-white p-5\">\n <div class=\"h-4 w-full rounded bg-tui-base-02\"></div>\n <div class=\"h-4 w-3/5 rounded bg-tui-base-02\"></div>\n <div class=\"h-4 w-full rounded bg-tui-base-02\"></div>\n </div>\n </div>\n</ng-template>\n", styles: [":host .name{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:4}:host[data-size=s] .card-wrapper{height:16rem;font:var(--tui-font-text-xs)}:host[data-size=s] .card-wrapper .name,:host[data-size=s] .card-wrapper .cost{font:var(--tui-font-text-s);font-weight:800}:host[data-size=m] .card-wrapper{height:20rem;font:var(--tui-font-text-s)}:host[data-size=m] .card-wrapper .name,:host[data-size=m] .card-wrapper .cost{font:var(--tui-font-text-m);font-weight:800}:host[is_mobile=false][is_in_cart=false] .name{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}:host[is_mobile=false][is_in_cart=false] .code,:host[is_mobile=false][is_in_cart=false] .history{display:none}:host[is_mobile=false][is_in_cart=false] .cart-actions{max-height:0;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out}:host[is_mobile=false][is_in_cart=false]:hover .code,:host[is_mobile=false][is_in_cart=false]:hover .history,:host[is_mobile=false][is_in_cart=false]:hover .name{display:-webkit-box;-webkit-line-clamp:4}:host[is_mobile=false][is_in_cart=false]:hover .cart-actions{max-height:3rem}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: i2.TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHintContext", "tuiHintAppearance", "tuiHint"] }, { kind: "directive", type: i2.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "component", type: i4.TuiElasticContainer, selector: "tui-elastic-container" }, { kind: "directive", type: i4.TuiHighlight, selector: "[tuiHighlight]", inputs: ["tuiHighlight", "tuiHighlightColor"] }, { kind: "component", type: i4.TuiButtonLoading, selector: "[tuiButton][loading],[tuiIconButton][loading]", inputs: ["size", "loading"] }, { kind: "component", type: i5.ScFavoriteBtnComponent, selector: "sc-favorite-btn", inputs: ["isFavorite", "showLoader", "disabled"], outputs: ["clickEvent"] }, { kind: "component", type: i6.ScInputQuantityComponent, selector: "sc-input-quantity", inputs: ["step", "showLoader", "showCross", "appearance", "isDisabled", "size"], outputs: ["clickClearEvent"] }, { kind: "component", type: i7.ScPriceWarehouseStockComponent, selector: "sc-price-warehouse-stock", inputs: ["classList", "product", "withStockHint", "fromMain"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
46
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScPriceCardComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
47
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: ScPriceCardComponent, selector: "sc-price-card", inputs: { size: "size" }, host: { properties: { "attr.data-size": "this.size", "attr.is_mobile": "this.isMobile", "attr.is_in_cart": "this.isInCart" } }, providers: [SEARCH_TERM_PROVIDERS], usesInheritance: true, ngImport: i0, template: "<div\n *ngIf=\"product; else skeleton\"\n class=\"card-wrapper relative flex w-auto min-w-40 flex-col rounded-xl shadow-md\"\n>\n <div class=\"flex grow flex-col justify-center overflow-hidden rounded-xl p-2\">\n <img\n (click)=\"clickCardEvent.emit()\"\n [src]=\"getCardImagePreview()\"\n [alt]=\"product.name\"\n class=\"max-h-full w-full rounded-xl object-cover\"\n />\n <sc-favorite-btn\n *ngIf=\"authStatus$ | async\"\n class=\"absolute left-2 top-2\"\n (clickEvent)=\"clickFavoriteEvent.emit()\"\n [showLoader]=\"favoriteShowLoader\"\n [isFavorite]=\"product.isFavorite\"\n [disabled]=\"!!product.primaryCategory?.isFavorite\"\n ></sc-favorite-btn>\n <div class=\"absolute right-2 top-2 m-1 flex gap-2\">\n <tui-icon \n *ngIf=\"product.isPreviouslyOrdered\"\n icon=\"@tui.star\"\n class=\"!size-6 rounded-lg !fill-white text-tui-negative\"\n ></tui-icon>\n <tui-icon \n *ngIf=\"product.cartItem\"\n icon=\"@tui.check\"\n class=\"!size-6 rounded-lg bg-tui-primary text-white\"\n ></tui-icon>\n </div>\n </div>\n <div class=\"p-2\">\n <tui-elastic-container class=\"shrink-0\">\n <a\n tuiLink\n class=\"name\"\n \n [tuiHighlight]=\"(search$ | async) ?? ''\"\n (click)=\"clickCardEvent.emit()\"\n >\n {{ product.name }}\n </a>\n </tui-elastic-container>\n <tui-elastic-container class=\"shrink-0\">\n <p\n *ngIf=\"product?.pack\"\n class=\"text-tui-text-02\"\n >\n \u041D\u043E\u0440\u043C\u0430 \u0443\u043F\u0430\u043A\u043E\u0432\u043A\u0438: {{ product.pack }}\n <tui-svg\n *ngIf=\"product.ignoreMinCountCheck\"\n src=\"tuiIconPackage\"\n [tuiHint]=\"minCountHint\"\n [tuiHintShowDelay]=\"100\"\n tuiHintDirection=\"top\"\n ></tui-svg>\n <ng-template #minCountHint>\n \u0414\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0437\u0430\u043A\u0430\u0437 <br />\n \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u043B\u044C\u043D\u043E\u0433\u043E <br />\n \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430\n </ng-template>\n </p>\n <p\n [tuiHighlight]=\"(search$ | async) ?? ''\"\n class=\"code text-tui-text-02\"\n >\n \u0410\u0440\u0442\u0438\u043A\u0443\u043B: {{ product.code }}\n </p>\n\n <a\n tuiLink\n *ngIf=\"!isMobile && (authStatus$ | async) && product?.costDate\"\n \n aria-disabled=\"true\"\n class=\"history\"\n (click)=\"clickPriceHistoryEvent.emit()\"\n >\n \u0414\u0430\u0442\u0430: {{ product.costDate }}\n </a>\n </tui-elastic-container>\n <div\n *ngIf=\"warehouseSelect$ | async as warehouseSelect\"\n class=\"flex flex-col\"\n >\n <span\n *ngIf=\"product.discount && !isMobile\"\n class=\"flex items-center text-tui-text-02\"\n >\n <span class=\"line-through\">{{ product.discountCostString }}</span> &nbsp;\n <span class=\"font-bold text-tui-success-fill\"> -{{ product.discount.percent }}% </span>\n <tui-icon \n icon=\"@tui.info\"\n [tuiHint]=\"discountHint\"\n [tuiHintShowDelay]=\"100\"\n tuiHintDirection=\"top\"\n class=\"!h-4 text-black\"\n ></tui-icon>\n <ng-template #discountHint>\n <div class=\"font-bold\">{{ product.discount.name }}</div>\n <div *ngIf=\"product.discount.expiredAt as expiredAt\">\u0414\u0430\u0442\u0430 \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F: {{ expiredAt }}</div>\n </ng-template>\n </span>\n <span\n [class.text-tui-text-02]=\"!product.isWarehouseStockExist(warehouseSelect.id)\"\n class=\"cost font-bold\"\n >{{ product.costRubString }}</span\n >\n <span\n *ngIf=\"!product.priceInRub\"\n class=\"hidden font-bold text-tui-text-02 group-hover:block\"\n >{{ product.costString }}</span\n >\n <sc-price-warehouse-stock [product]=\"product\"></sc-price-warehouse-stock>\n </div>\n <div class=\"cart-actions flex shrink-0 overflow-hidden\">\n <button\n *ngIf=\"!showQuantityControl\"\n tuiButton\n (click)=\"clickAddToCartEvent.emit(product)\"\n [loading]=\"quantityShowLoader\"\n [size]=\"size === 's' ? 'xs' : 's'\"\n class=\"mt-2 grow\"\n iconStart=\"@tui.shopping-cart\"\n >\n \u0412 \u043A\u043E\u0440\u0437\u0438\u043D\u0443\n </button>\n <sc-input-quantity\n #inputQuantity\n *ngIf=\"showQuantityControl\"\n [formControl]=\"quantityControl\"\n [size]=\"size\"\n [step]=\"unitsHelper.productMultiplicity(product)\"\n [ignoreStepValidators]=\"product.ignoreMinCountCheck\"\n [showLoader]=\"quantityShowLoader\"\n (clickClearEvent)=\"clickClearEvent.emit(cartItem)\"\n class=\"mt-2 w-full\"\n (keydown.enter)=\"inputQuantity.nativeFocusableElement?.blur()\"\n ></sc-input-quantity>\n </div>\n </div>\n</div>\n\n<ng-template #skeleton>\n <div class=\"card-wrapper flex flex-col overflow-hidden rounded-xl bg-white shadow-sc-1\">\n <!-- \u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0442\u043E\u0432\u0430\u0440\u0430 -->\n <div class=\"h-3/5 w-full rounded-t bg-tui-base-02\"></div>\n <!-- \u041A\u0440\u0430\u0442\u043A\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E \u0442\u043E\u0432\u0430\u0440\u0435 -->\n <div class=\"flex grow flex-col gap-2.5 rounded-b bg-white p-5\">\n <div class=\"h-4 w-full rounded bg-tui-base-02\"></div>\n <div class=\"h-4 w-3/5 rounded bg-tui-base-02\"></div>\n <div class=\"h-4 w-full rounded bg-tui-base-02\"></div>\n </div>\n </div>\n</ng-template>\n", styles: [":host .name{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:4}:host[data-size=s] .card-wrapper{height:16rem;font:var(--tui-font-text-xs)}:host[data-size=s] .card-wrapper .name,:host[data-size=s] .card-wrapper .cost{font:var(--tui-font-text-s);font-weight:800}:host[data-size=m] .card-wrapper{height:20rem;font:var(--tui-font-text-s)}:host[data-size=m] .card-wrapper .name,:host[data-size=m] .card-wrapper .cost{font:var(--tui-font-text-m);font-weight:800}:host[is_mobile=false][is_in_cart=false] .name{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}:host[is_mobile=false][is_in_cart=false] .code,:host[is_mobile=false][is_in_cart=false] .history{display:none}:host[is_mobile=false][is_in_cart=false] .cart-actions{max-height:0;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out}:host[is_mobile=false][is_in_cart=false]:hover .code,:host[is_mobile=false][is_in_cart=false]:hover .history,:host[is_mobile=false][is_in_cart=false]:hover .name{display:-webkit-box;-webkit-line-clamp:4}:host[is_mobile=false][is_in_cart=false]:hover .cart-actions{max-height:3rem}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: i2.TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHintContext", "tuiHintAppearance", "tuiHint"] }, { kind: "directive", type: i2.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "component", type: i4.TuiElasticContainer, selector: "tui-elastic-container" }, { kind: "directive", type: i4.TuiHighlight, selector: "[tuiHighlight]", inputs: ["tuiHighlight", "tuiHighlightColor"] }, { kind: "component", type: i4.TuiButtonLoading, selector: "[tuiButton][loading],[tuiIconButton][loading]", inputs: ["size", "loading"] }, { kind: "component", type: i5.ScFavoriteBtnComponent, selector: "sc-favorite-btn", inputs: ["isFavorite", "showLoader", "disabled"], outputs: ["clickEvent"] }, { kind: "component", type: i6.ScInputQuantityComponent, selector: "sc-input-quantity", inputs: ["step", "showLoader", "showCross", "ignoreStepValidators", "appearance", "isDisabled", "size"], outputs: ["clickClearEvent"] }, { kind: "component", type: i7.ScPriceWarehouseStockComponent, selector: "sc-price-warehouse-stock", inputs: ["classList", "product", "withStockHint", "fromMain"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
48
48
  }
49
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScPriceCardComponent, decorators: [{
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScPriceCardComponent, decorators: [{
50
50
  type: Component,
51
- args: [{ selector: 'sc-price-card', providers: [SEARCH_TERM_PROVIDERS], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"product; else skeleton\"\n class=\"card-wrapper relative flex w-auto min-w-40 flex-col rounded-xl shadow-md\"\n>\n <div class=\"flex grow flex-col justify-center overflow-hidden rounded-xl p-2\">\n <img\n (click)=\"clickCardEvent.emit()\"\n [src]=\"getCardImagePreview()\"\n [alt]=\"product.name\"\n class=\"max-h-full w-full rounded-xl object-cover\"\n />\n <sc-favorite-btn\n *ngIf=\"authStatus$ | async\"\n class=\"absolute left-2 top-2\"\n (clickEvent)=\"clickFavoriteEvent.emit()\"\n [showLoader]=\"favoriteShowLoader\"\n [isFavorite]=\"product.isFavorite\"\n [disabled]=\"!!product.primaryCategory?.isFavorite\"\n ></sc-favorite-btn>\n <div class=\"absolute right-2 top-2 m-1 flex gap-2\">\n <tui-icon \n *ngIf=\"product.isPreviouslyOrdered\"\n icon=\"@tui.star\"\n class=\"!size-6 rounded-lg !fill-white text-tui-negative\"\n ></tui-icon>\n <tui-icon \n *ngIf=\"product.cartItem\"\n icon=\"@tui.check\"\n class=\"!size-6 rounded-lg bg-tui-primary text-white\"\n ></tui-icon>\n </div>\n </div>\n <div class=\"p-2\">\n <tui-elastic-container class=\"shrink-0\">\n <a\n tuiLink\n class=\"name\"\n \n [tuiHighlight]=\"(search$ | async) ?? ''\"\n (click)=\"clickCardEvent.emit()\"\n >\n {{ product.name }}\n </a>\n </tui-elastic-container>\n <tui-elastic-container class=\"shrink-0\">\n <p\n *ngIf=\"product?.pack\"\n class=\"text-tui-text-02\"\n >\n \u041D\u043E\u0440\u043C\u0430 \u0443\u043F\u0430\u043A\u043E\u0432\u043A\u0438: {{ product.pack }}\n </p>\n <p\n [tuiHighlight]=\"(search$ | async) ?? ''\"\n class=\"code text-tui-text-02\"\n >\n \u0410\u0440\u0442\u0438\u043A\u0443\u043B: {{ product.code }}\n </p>\n\n <a\n tuiLink\n *ngIf=\"!isMobile && (authStatus$ | async) && product?.costDate\"\n \n aria-disabled=\"true\"\n class=\"history\"\n (click)=\"clickPriceHistoryEvent.emit()\"\n >\n \u0414\u0430\u0442\u0430: {{ product.costDate }}\n </a>\n </tui-elastic-container>\n <div\n *ngIf=\"warehouseSelect$ | async as warehouseSelect\"\n class=\"flex flex-col\"\n >\n <span\n *ngIf=\"product.discount && !isMobile\"\n class=\"flex items-center text-tui-text-02\"\n >\n <span class=\"line-through\">{{ product.discountCostString }}</span> &nbsp;\n <span class=\"font-bold text-tui-success-fill\"> -{{ product.discount.percent }}% </span>\n <tui-icon \n icon=\"@tui.info\"\n [tuiHint]=\"discountHint\"\n [tuiHintShowDelay]=\"100\"\n tuiHintDirection=\"top\"\n class=\"!h-4 text-black\"\n ></tui-icon>\n <ng-template #discountHint>\n <div class=\"font-bold\">{{ product.discount.name }}</div>\n <div *ngIf=\"product.discount.expiredAt as expiredAt\">\u0414\u0430\u0442\u0430 \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F: {{ expiredAt }}</div>\n </ng-template>\n </span>\n <span\n [class.text-tui-text-02]=\"!product.isWarehouseStockExist(warehouseSelect.id)\"\n class=\"cost font-bold\"\n >{{ product.costRubString }}</span\n >\n <span\n *ngIf=\"!product.priceInRub\"\n class=\"hidden font-bold text-tui-text-02 group-hover:block\"\n >{{ product.costString }}</span\n >\n <sc-price-warehouse-stock [product]=\"product\"></sc-price-warehouse-stock>\n </div>\n <div class=\"cart-actions flex shrink-0 overflow-hidden\">\n <button\n *ngIf=\"!showQuantityControl\"\n tuiButton\n (click)=\"clickAddToCartEvent.emit(product)\"\n [loading]=\"quantityShowLoader\"\n [size]=\"size === 's' ? 'xs' : 's'\"\n class=\"mt-2 grow\"\n iconStart=\"@tui.shopping-cart\"\n >\n \u0412 \u043A\u043E\u0440\u0437\u0438\u043D\u0443\n </button>\n <sc-input-quantity\n #inputQuantity\n *ngIf=\"showQuantityControl\"\n [formControl]=\"quantityControl\"\n [size]=\"size\"\n [step]=\"unitsHelper.productMultiplicity(product)\"\n [showLoader]=\"quantityShowLoader\"\n (clickClearEvent)=\"clickClearEvent.emit(cartItem)\"\n class=\"mt-2 w-full\"\n (keydown.enter)=\"inputQuantity.nativeFocusableElement?.blur()\"\n ></sc-input-quantity>\n </div>\n </div>\n</div>\n\n<ng-template #skeleton>\n <div class=\"card-wrapper flex flex-col overflow-hidden rounded-xl bg-white shadow-sc-1\">\n <!-- \u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0442\u043E\u0432\u0430\u0440\u0430 -->\n <div class=\"h-3/5 w-full rounded-t bg-tui-base-02\"></div>\n <!-- \u041A\u0440\u0430\u0442\u043A\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E \u0442\u043E\u0432\u0430\u0440\u0435 -->\n <div class=\"flex grow flex-col gap-2.5 rounded-b bg-white p-5\">\n <div class=\"h-4 w-full rounded bg-tui-base-02\"></div>\n <div class=\"h-4 w-3/5 rounded bg-tui-base-02\"></div>\n <div class=\"h-4 w-full rounded bg-tui-base-02\"></div>\n </div>\n </div>\n</ng-template>\n", styles: [":host .name{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:4}:host[data-size=s] .card-wrapper{height:16rem;font:var(--tui-font-text-xs)}:host[data-size=s] .card-wrapper .name,:host[data-size=s] .card-wrapper .cost{font:var(--tui-font-text-s);font-weight:800}:host[data-size=m] .card-wrapper{height:20rem;font:var(--tui-font-text-s)}:host[data-size=m] .card-wrapper .name,:host[data-size=m] .card-wrapper .cost{font:var(--tui-font-text-m);font-weight:800}:host[is_mobile=false][is_in_cart=false] .name{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}:host[is_mobile=false][is_in_cart=false] .code,:host[is_mobile=false][is_in_cart=false] .history{display:none}:host[is_mobile=false][is_in_cart=false] .cart-actions{max-height:0;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out}:host[is_mobile=false][is_in_cart=false]:hover .code,:host[is_mobile=false][is_in_cart=false]:hover .history,:host[is_mobile=false][is_in_cart=false]:hover .name{display:-webkit-box;-webkit-line-clamp:4}:host[is_mobile=false][is_in_cart=false]:hover .cart-actions{max-height:3rem}\n"] }]
51
+ args: [{ selector: 'sc-price-card', providers: [SEARCH_TERM_PROVIDERS], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"product; else skeleton\"\n class=\"card-wrapper relative flex w-auto min-w-40 flex-col rounded-xl shadow-md\"\n>\n <div class=\"flex grow flex-col justify-center overflow-hidden rounded-xl p-2\">\n <img\n (click)=\"clickCardEvent.emit()\"\n [src]=\"getCardImagePreview()\"\n [alt]=\"product.name\"\n class=\"max-h-full w-full rounded-xl object-cover\"\n />\n <sc-favorite-btn\n *ngIf=\"authStatus$ | async\"\n class=\"absolute left-2 top-2\"\n (clickEvent)=\"clickFavoriteEvent.emit()\"\n [showLoader]=\"favoriteShowLoader\"\n [isFavorite]=\"product.isFavorite\"\n [disabled]=\"!!product.primaryCategory?.isFavorite\"\n ></sc-favorite-btn>\n <div class=\"absolute right-2 top-2 m-1 flex gap-2\">\n <tui-icon \n *ngIf=\"product.isPreviouslyOrdered\"\n icon=\"@tui.star\"\n class=\"!size-6 rounded-lg !fill-white text-tui-negative\"\n ></tui-icon>\n <tui-icon \n *ngIf=\"product.cartItem\"\n icon=\"@tui.check\"\n class=\"!size-6 rounded-lg bg-tui-primary text-white\"\n ></tui-icon>\n </div>\n </div>\n <div class=\"p-2\">\n <tui-elastic-container class=\"shrink-0\">\n <a\n tuiLink\n class=\"name\"\n \n [tuiHighlight]=\"(search$ | async) ?? ''\"\n (click)=\"clickCardEvent.emit()\"\n >\n {{ product.name }}\n </a>\n </tui-elastic-container>\n <tui-elastic-container class=\"shrink-0\">\n <p\n *ngIf=\"product?.pack\"\n class=\"text-tui-text-02\"\n >\n \u041D\u043E\u0440\u043C\u0430 \u0443\u043F\u0430\u043A\u043E\u0432\u043A\u0438: {{ product.pack }}\n <tui-svg\n *ngIf=\"product.ignoreMinCountCheck\"\n src=\"tuiIconPackage\"\n [tuiHint]=\"minCountHint\"\n [tuiHintShowDelay]=\"100\"\n tuiHintDirection=\"top\"\n ></tui-svg>\n <ng-template #minCountHint>\n \u0414\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0437\u0430\u043A\u0430\u0437 <br />\n \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u043B\u044C\u043D\u043E\u0433\u043E <br />\n \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430\n </ng-template>\n </p>\n <p\n [tuiHighlight]=\"(search$ | async) ?? ''\"\n class=\"code text-tui-text-02\"\n >\n \u0410\u0440\u0442\u0438\u043A\u0443\u043B: {{ product.code }}\n </p>\n\n <a\n tuiLink\n *ngIf=\"!isMobile && (authStatus$ | async) && product?.costDate\"\n \n aria-disabled=\"true\"\n class=\"history\"\n (click)=\"clickPriceHistoryEvent.emit()\"\n >\n \u0414\u0430\u0442\u0430: {{ product.costDate }}\n </a>\n </tui-elastic-container>\n <div\n *ngIf=\"warehouseSelect$ | async as warehouseSelect\"\n class=\"flex flex-col\"\n >\n <span\n *ngIf=\"product.discount && !isMobile\"\n class=\"flex items-center text-tui-text-02\"\n >\n <span class=\"line-through\">{{ product.discountCostString }}</span> &nbsp;\n <span class=\"font-bold text-tui-success-fill\"> -{{ product.discount.percent }}% </span>\n <tui-icon \n icon=\"@tui.info\"\n [tuiHint]=\"discountHint\"\n [tuiHintShowDelay]=\"100\"\n tuiHintDirection=\"top\"\n class=\"!h-4 text-black\"\n ></tui-icon>\n <ng-template #discountHint>\n <div class=\"font-bold\">{{ product.discount.name }}</div>\n <div *ngIf=\"product.discount.expiredAt as expiredAt\">\u0414\u0430\u0442\u0430 \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F: {{ expiredAt }}</div>\n </ng-template>\n </span>\n <span\n [class.text-tui-text-02]=\"!product.isWarehouseStockExist(warehouseSelect.id)\"\n class=\"cost font-bold\"\n >{{ product.costRubString }}</span\n >\n <span\n *ngIf=\"!product.priceInRub\"\n class=\"hidden font-bold text-tui-text-02 group-hover:block\"\n >{{ product.costString }}</span\n >\n <sc-price-warehouse-stock [product]=\"product\"></sc-price-warehouse-stock>\n </div>\n <div class=\"cart-actions flex shrink-0 overflow-hidden\">\n <button\n *ngIf=\"!showQuantityControl\"\n tuiButton\n (click)=\"clickAddToCartEvent.emit(product)\"\n [loading]=\"quantityShowLoader\"\n [size]=\"size === 's' ? 'xs' : 's'\"\n class=\"mt-2 grow\"\n iconStart=\"@tui.shopping-cart\"\n >\n \u0412 \u043A\u043E\u0440\u0437\u0438\u043D\u0443\n </button>\n <sc-input-quantity\n #inputQuantity\n *ngIf=\"showQuantityControl\"\n [formControl]=\"quantityControl\"\n [size]=\"size\"\n [step]=\"unitsHelper.productMultiplicity(product)\"\n [ignoreStepValidators]=\"product.ignoreMinCountCheck\"\n [showLoader]=\"quantityShowLoader\"\n (clickClearEvent)=\"clickClearEvent.emit(cartItem)\"\n class=\"mt-2 w-full\"\n (keydown.enter)=\"inputQuantity.nativeFocusableElement?.blur()\"\n ></sc-input-quantity>\n </div>\n </div>\n</div>\n\n<ng-template #skeleton>\n <div class=\"card-wrapper flex flex-col overflow-hidden rounded-xl bg-white shadow-sc-1\">\n <!-- \u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0442\u043E\u0432\u0430\u0440\u0430 -->\n <div class=\"h-3/5 w-full rounded-t bg-tui-base-02\"></div>\n <!-- \u041A\u0440\u0430\u0442\u043A\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E \u0442\u043E\u0432\u0430\u0440\u0435 -->\n <div class=\"flex grow flex-col gap-2.5 rounded-b bg-white p-5\">\n <div class=\"h-4 w-full rounded bg-tui-base-02\"></div>\n <div class=\"h-4 w-3/5 rounded bg-tui-base-02\"></div>\n <div class=\"h-4 w-full rounded bg-tui-base-02\"></div>\n </div>\n </div>\n</ng-template>\n", styles: [":host .name{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:4}:host[data-size=s] .card-wrapper{height:16rem;font:var(--tui-font-text-xs)}:host[data-size=s] .card-wrapper .name,:host[data-size=s] .card-wrapper .cost{font:var(--tui-font-text-s);font-weight:800}:host[data-size=m] .card-wrapper{height:20rem;font:var(--tui-font-text-s)}:host[data-size=m] .card-wrapper .name,:host[data-size=m] .card-wrapper .cost{font:var(--tui-font-text-m);font-weight:800}:host[is_mobile=false][is_in_cart=false] .name{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}:host[is_mobile=false][is_in_cart=false] .code,:host[is_mobile=false][is_in_cart=false] .history{display:none}:host[is_mobile=false][is_in_cart=false] .cart-actions{max-height:0;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out}:host[is_mobile=false][is_in_cart=false]:hover .code,:host[is_mobile=false][is_in_cart=false]:hover .history,:host[is_mobile=false][is_in_cart=false]:hover .name{display:-webkit-box;-webkit-line-clamp:4}:host[is_mobile=false][is_in_cart=false]:hover .cart-actions{max-height:3rem}\n"] }]
52
52
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { size: [{
53
53
  type: Input
54
54
  }, {
@@ -61,4 +61,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImpor
61
61
  type: HostBinding,
62
62
  args: ['attr.is_in_cart']
63
63
  }] } });
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtcHJpY2UtY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2F0YWxvZy9wcmljZS1jYXJkL3NjLXByaWNlLWNhcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvcHJpY2UtY2FyZC9zYy1wcmljZS1jYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7OztBQUV2RDs7R0FFRztBQVFILE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxtQkFBbUI7SUFjekQ7Ozs7T0FJRztJQUNILFlBQW9DLEdBQXNCO1FBQ3RELEtBQUssRUFBRSxDQUFDO1FBRHdCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBbEIxRDs7V0FFRztRQUdJLFNBQUksR0FBYSxHQUFHLENBQUM7UUFFNUI7O1dBRUc7UUFFZ0IsYUFBUSxHQUFZLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQVM3RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUNJLFFBQVE7UUFDUixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWTtRQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDNUIsQ0FBQzs4R0FwQ1Esb0JBQW9CO2tHQUFwQixvQkFBb0Isa01BSGxCLENBQUMscUJBQXFCLENBQUMsaURDZHRDLDhrTUE4SUE7OzJGRDdIYSxvQkFBb0I7a0JBUGhDLFNBQVM7K0JBQ0ksZUFBZSxhQUdkLENBQUMscUJBQXFCLENBQUMsbUJBQ2pCLHVCQUF1QixDQUFDLE1BQU07c0ZBUXhDLElBQUk7c0JBRlYsS0FBSzs7c0JBQ0wsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBT1YsUUFBUTtzQkFEMUIsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBZ0J6QixRQUFRO3NCQURYLFdBQVc7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBpbmplY3QsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTRUFSQ0hfVEVSTV9QUk9WSURFUlMgfSBmcm9tICdAc25hYmNlbnRyL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IFRVSV9JU19NT0JJTEUgfSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7IFR1aVNpemVTIH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdFNjUHJpY2VDYXJkIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcyc7XG5cbi8qKlxuICog0JrQvtC80L/QvtC90LXQvdGCINC60LDRgNGC0L7Rh9C60Lgg0YLQvtCy0LDRgNCwLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3NjLXByaWNlLWNhcmQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zYy1wcmljZS1jYXJkLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zYy1wcmljZS1jYXJkLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbU0VBUkNIX1RFUk1fUFJPVklERVJTXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2NQcmljZUNhcmRDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdFNjUHJpY2VDYXJkIHtcbiAgICAvKipcbiAgICAgKiDQoNCw0LfQvNC10YAg0LrQvtC80L/QvtC90LXQvdGC0LAuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1zaXplJylcbiAgICBwdWJsaWMgc2l6ZTogVHVpU2l6ZVMgPSAnbSc7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiDRgtC+0LPQviwg0YfRgtC+INGN0YLQvtGCINC60L7QvNC/0L7QvdC10L3RgiDQvtGC0L7QsdGA0LDQttCw0LXRgtGB0Y8g0L3QsCDQvNC+0LHQuNC70YzQvdC+0Lwg0YPRgdGC0YDQvtC50YHRgtCy0LUuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlzX21vYmlsZScpXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTW9iaWxlOiBib29sZWFuID0gaW5qZWN0KFRVSV9JU19NT0JJTEUpO1xuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNC40YDRg9C10YIg0Y3QutC30LXQvNC/0LvRj9GAINC60LvQsNGB0YHQsCB7QGxpbmsgU2NQcmljZUNhcmRDb21wb25lbnR9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNkciDQntCx0YrQtdC60YIg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSDQvtCx0L3QsNGA0YPQttC10L3QuNC10Lwg0LjQt9C80LXQvdC10L3QuNC5LlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiDRgtC+0LPQviwg0YfRgtC+INC60L7QvNC/0L7QvdC10L3RgiDQvdCw0YXQvtC00LjRgtGB0Y8g0LIg0LrQvtGA0LfQuNC90LUuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlzX2luX2NhcnQnKVxuICAgIGdldCBpc0luQ2FydCgpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5jYXJ0SXRlbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0LrQvtC80L/QvtC90LXQvdGCINCyINC+0YfQtdGA0LXQtNGMINC90LAg0L7QsdC90L7QstC70LXQvdC40LUuXG4gICAgICovXG4gICAgcHVibGljIG1hcmtGb3JDaGVjaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxufVxuIiwiPGRpdlxuICAgICpuZ0lmPVwicHJvZHVjdDsgZWxzZSBza2VsZXRvblwiXG4gICAgY2xhc3M9XCJjYXJkLXdyYXBwZXIgcmVsYXRpdmUgZmxleCB3LWF1dG8gbWluLXctNDAgZmxleC1jb2wgcm91bmRlZC14bCBzaGFkb3ctbWRcIlxuPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdyb3cgZmxleC1jb2wganVzdGlmeS1jZW50ZXIgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQteGwgcC0yXCI+XG4gICAgICAgIDxpbWdcbiAgICAgICAgICAgIChjbGljayk9XCJjbGlja0NhcmRFdmVudC5lbWl0KClcIlxuICAgICAgICAgICAgW3NyY109XCJnZXRDYXJkSW1hZ2VQcmV2aWV3KClcIlxuICAgICAgICAgICAgW2FsdF09XCJwcm9kdWN0Lm5hbWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJtYXgtaC1mdWxsIHctZnVsbCByb3VuZGVkLXhsIG9iamVjdC1jb3ZlclwiXG4gICAgICAgIC8+XG4gICAgICAgIDxzYy1mYXZvcml0ZS1idG5cbiAgICAgICAgICAgICpuZ0lmPVwiYXV0aFN0YXR1cyQgfCBhc3luY1wiXG4gICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGxlZnQtMiB0b3AtMlwiXG4gICAgICAgICAgICAoY2xpY2tFdmVudCk9XCJjbGlja0Zhdm9yaXRlRXZlbnQuZW1pdCgpXCJcbiAgICAgICAgICAgIFtzaG93TG9hZGVyXT1cImZhdm9yaXRlU2hvd0xvYWRlclwiXG4gICAgICAgICAgICBbaXNGYXZvcml0ZV09XCJwcm9kdWN0LmlzRmF2b3JpdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhcHJvZHVjdC5wcmltYXJ5Q2F0ZWdvcnk/LmlzRmF2b3JpdGVcIlxuICAgICAgICA+PC9zYy1mYXZvcml0ZS1idG4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSByaWdodC0yIHRvcC0yIG0tMSBmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICA8dHVpLWljb24gXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9kdWN0LmlzUHJldmlvdXNseU9yZGVyZWRcIlxuICAgICAgICAgICAgICAgIGljb249XCJAdHVpLnN0YXJcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiIXNpemUtNiByb3VuZGVkLWxnICFmaWxsLXdoaXRlIHRleHQtdHVpLW5lZ2F0aXZlXCJcbiAgICAgICAgICAgID48L3R1aS1pY29uPlxuICAgICAgICAgICAgPHR1aS1pY29uIFxuICAgICAgICAgICAgICAgICpuZ0lmPVwicHJvZHVjdC5jYXJ0SXRlbVwiXG4gICAgICAgICAgICAgICAgaWNvbj1cIkB0dWkuY2hlY2tcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiIXNpemUtNiByb3VuZGVkLWxnIGJnLXR1aS1wcmltYXJ5IHRleHQtd2hpdGVcIlxuICAgICAgICAgICAgPjwvdHVpLWljb24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwLTJcIj5cbiAgICAgICAgPHR1aS1lbGFzdGljLWNvbnRhaW5lciBjbGFzcz1cInNocmluay0wXCI+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIHR1aUxpbmtcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm5hbWVcIlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFt0dWlIaWdobGlnaHRdPVwiKHNlYXJjaCQgfCBhc3luYykgPz8gJydcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0NhcmRFdmVudC5lbWl0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHByb2R1Y3QubmFtZSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICA8L3R1aS1lbGFzdGljLWNvbnRhaW5lcj5cbiAgICAgICAgPHR1aS1lbGFzdGljLWNvbnRhaW5lciBjbGFzcz1cInNocmluay0wXCI+XG4gICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICpuZ0lmPVwicHJvZHVjdD8ucGFja1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXR1aS10ZXh0LTAyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICDQndC+0YDQvNCwINGD0L/QsNC60L7QstC60Lg6IHt7IHByb2R1Y3QucGFjayB9fVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICBbdHVpSGlnaGxpZ2h0XT1cIihzZWFyY2gkIHwgYXN5bmMpID8/ICcnXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNvZGUgdGV4dC10dWktdGV4dC0wMlwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAg0JDRgNGC0LjQutGD0Ls6IHt7IHByb2R1Y3QuY29kZSB9fVxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIHR1aUxpbmtcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc01vYmlsZSAmJiAoYXV0aFN0YXR1cyQgfCBhc3luYykgJiYgcHJvZHVjdD8uY29zdERhdGVcIlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGFyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImhpc3RvcnlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja1ByaWNlSGlzdG9yeUV2ZW50LmVtaXQoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAg0JTQsNGC0LA6IHt7IHByb2R1Y3QuY29zdERhdGUgfX1cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgPC90dWktZWxhc3RpYy1jb250YWluZXI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwid2FyZWhvdXNlU2VsZWN0JCB8IGFzeW5jIGFzIHdhcmVob3VzZVNlbGVjdFwiXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2xcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICpuZ0lmPVwicHJvZHVjdC5kaXNjb3VudCAmJiAhaXNNb2JpbGVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC10dWktdGV4dC0wMlwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaW5lLXRocm91Z2hcIj57eyBwcm9kdWN0LmRpc2NvdW50Q29zdFN0cmluZyB9fTwvc3Bhbj4gJm5ic3A7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgdGV4dC10dWktc3VjY2Vzcy1maWxsXCI+IC17eyBwcm9kdWN0LmRpc2NvdW50LnBlcmNlbnQgfX0lIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8dHVpLWljb24gXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJAdHVpLmluZm9cIlxuICAgICAgICAgICAgICAgICAgICBbdHVpSGludF09XCJkaXNjb3VudEhpbnRcIlxuICAgICAgICAgICAgICAgICAgICBbdHVpSGludFNob3dEZWxheV09XCIxMDBcIlxuICAgICAgICAgICAgICAgICAgICB0dWlIaW50RGlyZWN0aW9uPVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCIhaC00IHRleHQtYmxhY2tcIlxuICAgICAgICAgICAgICAgID48L3R1aS1pY29uPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzY291bnRIaW50PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgcHJvZHVjdC5kaXNjb3VudC5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9kdWN0LmRpc2NvdW50LmV4cGlyZWRBdCBhcyBleHBpcmVkQXRcIj7QlNCw0YLQsCDQvtC60L7QvdGH0LDQvdC40Y86IHt7IGV4cGlyZWRBdCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXR1aS10ZXh0LTAyXT1cIiFwcm9kdWN0LmlzV2FyZWhvdXNlU3RvY2tFeGlzdCh3YXJlaG91c2VTZWxlY3QuaWQpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNvc3QgZm9udC1ib2xkXCJcbiAgICAgICAgICAgICAgICA+e3sgcHJvZHVjdC5jb3N0UnViU3RyaW5nIH19PC9zcGFuXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIXByb2R1Y3QucHJpY2VJblJ1YlwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW4gZm9udC1ib2xkIHRleHQtdHVpLXRleHQtMDIgZ3JvdXAtaG92ZXI6YmxvY2tcIlxuICAgICAgICAgICAgICAgID57eyBwcm9kdWN0LmNvc3RTdHJpbmcgfX08L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxzYy1wcmljZS13YXJlaG91c2Utc3RvY2sgW3Byb2R1Y3RdPVwicHJvZHVjdFwiPjwvc2MtcHJpY2Utd2FyZWhvdXNlLXN0b2NrPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcnQtYWN0aW9ucyBmbGV4IHNocmluay0wIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIXNob3dRdWFudGl0eUNvbnRyb2xcIlxuICAgICAgICAgICAgICAgIHR1aUJ1dHRvblxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0FkZFRvQ2FydEV2ZW50LmVtaXQocHJvZHVjdClcIlxuICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cInF1YW50aXR5U2hvd0xvYWRlclwiXG4gICAgICAgICAgICAgICAgW3NpemVdPVwic2l6ZSA9PT0gJ3MnID8gJ3hzJyA6ICdzJ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtdC0yIGdyb3dcIlxuICAgICAgICAgICAgICAgIGljb25TdGFydD1cIkB0dWkuc2hvcHBpbmctY2FydFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAg0JIg0LrQvtGA0LfQuNC90YNcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPHNjLWlucHV0LXF1YW50aXR5XG4gICAgICAgICAgICAgICAgI2lucHV0UXVhbnRpdHlcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dRdWFudGl0eUNvbnRyb2xcIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJxdWFudGl0eUNvbnRyb2xcIlxuICAgICAgICAgICAgICAgIFtzaXplXT1cInNpemVcIlxuICAgICAgICAgICAgICAgIFtzdGVwXT1cInVuaXRzSGVscGVyLnByb2R1Y3RNdWx0aXBsaWNpdHkocHJvZHVjdClcIlxuICAgICAgICAgICAgICAgIFtzaG93TG9hZGVyXT1cInF1YW50aXR5U2hvd0xvYWRlclwiXG4gICAgICAgICAgICAgICAgKGNsaWNrQ2xlYXJFdmVudCk9XCJjbGlja0NsZWFyRXZlbnQuZW1pdChjYXJ0SXRlbSlcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtMiB3LWZ1bGxcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImlucHV0UXVhbnRpdHkubmF0aXZlRm9jdXNhYmxlRWxlbWVudD8uYmx1cigpXCJcbiAgICAgICAgICAgID48L3NjLWlucHV0LXF1YW50aXR5PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3NrZWxldG9uPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLXdyYXBwZXIgZmxleCBmbGV4LWNvbCBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC14bCBiZy13aGl0ZSBzaGFkb3ctc2MtMVwiPlxuICAgICAgICA8IS0tINCY0LfQvtCx0YDQsNC20LXQvdC40LUg0YLQvtCy0LDRgNCwIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaC0zLzUgdy1mdWxsIHJvdW5kZWQtdCBiZy10dWktYmFzZS0wMlwiPjwvZGl2PlxuICAgICAgICA8IS0tINCa0YDQsNGC0LrQsNGPINC40L3RhNC+0YDQvNCw0YbQuNGPINC+INGC0L7QstCw0YDQtSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ3JvdyBmbGV4LWNvbCBnYXAtMi41IHJvdW5kZWQtYiBiZy13aGl0ZSBwLTVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLTQgdy1mdWxsIHJvdW5kZWQgYmctdHVpLWJhc2UtMDJcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLTQgdy0zLzUgcm91bmRlZCBiZy10dWktYmFzZS0wMlwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtNCB3LWZ1bGwgcm91bmRlZCBiZy10dWktYmFzZS0wMlwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtcHJpY2UtY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2F0YWxvZy9wcmljZS1jYXJkL3NjLXByaWNlLWNhcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvcHJpY2UtY2FyZC9zYy1wcmljZS1jYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7OztBQUV2RDs7R0FFRztBQVFILE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxtQkFBbUI7SUFjekQ7Ozs7T0FJRztJQUNILFlBQW9DLEdBQXNCO1FBQ3RELEtBQUssRUFBRSxDQUFDO1FBRHdCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBbEIxRDs7V0FFRztRQUdJLFNBQUksR0FBYSxHQUFHLENBQUM7UUFFNUI7O1dBRUc7UUFFZ0IsYUFBUSxHQUFZLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQVM3RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUNJLFFBQVE7UUFDUixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWTtRQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDNUIsQ0FBQzs4R0FwQ1Esb0JBQW9CO2tHQUFwQixvQkFBb0Isa01BSGxCLENBQUMscUJBQXFCLENBQUMsaURDZHRDLHd6TkEySkE7OzJGRDFJYSxvQkFBb0I7a0JBUGhDLFNBQVM7K0JBQ0ksZUFBZSxhQUdkLENBQUMscUJBQXFCLENBQUMsbUJBQ2pCLHVCQUF1QixDQUFDLE1BQU07c0ZBUXhDLElBQUk7c0JBRlYsS0FBSzs7c0JBQ0wsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBT1YsUUFBUTtzQkFEMUIsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBZ0J6QixRQUFRO3NCQURYLFdBQVc7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBpbmplY3QsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTRUFSQ0hfVEVSTV9QUk9WSURFUlMgfSBmcm9tICdAc25hYmNlbnRyL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IFRVSV9JU19NT0JJTEUgfSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7IFR1aVNpemVTIH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdFNjUHJpY2VDYXJkIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcyc7XG5cbi8qKlxuICog0JrQvtC80L/QvtC90LXQvdGCINC60LDRgNGC0L7Rh9C60Lgg0YLQvtCy0LDRgNCwLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3NjLXByaWNlLWNhcmQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zYy1wcmljZS1jYXJkLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zYy1wcmljZS1jYXJkLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbU0VBUkNIX1RFUk1fUFJPVklERVJTXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2NQcmljZUNhcmRDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdFNjUHJpY2VDYXJkIHtcbiAgICAvKipcbiAgICAgKiDQoNCw0LfQvNC10YAg0LrQvtC80L/QvtC90LXQvdGC0LAuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1zaXplJylcbiAgICBwdWJsaWMgc2l6ZTogVHVpU2l6ZVMgPSAnbSc7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiDRgtC+0LPQviwg0YfRgtC+INGN0YLQvtGCINC60L7QvNC/0L7QvdC10L3RgiDQvtGC0L7QsdGA0LDQttCw0LXRgtGB0Y8g0L3QsCDQvNC+0LHQuNC70YzQvdC+0Lwg0YPRgdGC0YDQvtC50YHRgtCy0LUuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlzX21vYmlsZScpXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTW9iaWxlOiBib29sZWFuID0gaW5qZWN0KFRVSV9JU19NT0JJTEUpO1xuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNC40YDRg9C10YIg0Y3QutC30LXQvNC/0LvRj9GAINC60LvQsNGB0YHQsCB7QGxpbmsgU2NQcmljZUNhcmRDb21wb25lbnR9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNkciDQntCx0YrQtdC60YIg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSDQvtCx0L3QsNGA0YPQttC10L3QuNC10Lwg0LjQt9C80LXQvdC10L3QuNC5LlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiDRgtC+0LPQviwg0YfRgtC+INC60L7QvNC/0L7QvdC10L3RgiDQvdCw0YXQvtC00LjRgtGB0Y8g0LIg0LrQvtGA0LfQuNC90LUuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlzX2luX2NhcnQnKVxuICAgIGdldCBpc0luQ2FydCgpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5jYXJ0SXRlbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0LrQvtC80L/QvtC90LXQvdGCINCyINC+0YfQtdGA0LXQtNGMINC90LAg0L7QsdC90L7QstC70LXQvdC40LUuXG4gICAgICovXG4gICAgcHVibGljIG1hcmtGb3JDaGVjaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxufVxuIiwiPGRpdlxuICAgICpuZ0lmPVwicHJvZHVjdDsgZWxzZSBza2VsZXRvblwiXG4gICAgY2xhc3M9XCJjYXJkLXdyYXBwZXIgcmVsYXRpdmUgZmxleCB3LWF1dG8gbWluLXctNDAgZmxleC1jb2wgcm91bmRlZC14bCBzaGFkb3ctbWRcIlxuPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdyb3cgZmxleC1jb2wganVzdGlmeS1jZW50ZXIgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQteGwgcC0yXCI+XG4gICAgICAgIDxpbWdcbiAgICAgICAgICAgIChjbGljayk9XCJjbGlja0NhcmRFdmVudC5lbWl0KClcIlxuICAgICAgICAgICAgW3NyY109XCJnZXRDYXJkSW1hZ2VQcmV2aWV3KClcIlxuICAgICAgICAgICAgW2FsdF09XCJwcm9kdWN0Lm5hbWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJtYXgtaC1mdWxsIHctZnVsbCByb3VuZGVkLXhsIG9iamVjdC1jb3ZlclwiXG4gICAgICAgIC8+XG4gICAgICAgIDxzYy1mYXZvcml0ZS1idG5cbiAgICAgICAgICAgICpuZ0lmPVwiYXV0aFN0YXR1cyQgfCBhc3luY1wiXG4gICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGxlZnQtMiB0b3AtMlwiXG4gICAgICAgICAgICAoY2xpY2tFdmVudCk9XCJjbGlja0Zhdm9yaXRlRXZlbnQuZW1pdCgpXCJcbiAgICAgICAgICAgIFtzaG93TG9hZGVyXT1cImZhdm9yaXRlU2hvd0xvYWRlclwiXG4gICAgICAgICAgICBbaXNGYXZvcml0ZV09XCJwcm9kdWN0LmlzRmF2b3JpdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhcHJvZHVjdC5wcmltYXJ5Q2F0ZWdvcnk/LmlzRmF2b3JpdGVcIlxuICAgICAgICA+PC9zYy1mYXZvcml0ZS1idG4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSByaWdodC0yIHRvcC0yIG0tMSBmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICA8dHVpLWljb24gXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9kdWN0LmlzUHJldmlvdXNseU9yZGVyZWRcIlxuICAgICAgICAgICAgICAgIGljb249XCJAdHVpLnN0YXJcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiIXNpemUtNiByb3VuZGVkLWxnICFmaWxsLXdoaXRlIHRleHQtdHVpLW5lZ2F0aXZlXCJcbiAgICAgICAgICAgID48L3R1aS1pY29uPlxuICAgICAgICAgICAgPHR1aS1pY29uIFxuICAgICAgICAgICAgICAgICpuZ0lmPVwicHJvZHVjdC5jYXJ0SXRlbVwiXG4gICAgICAgICAgICAgICAgaWNvbj1cIkB0dWkuY2hlY2tcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiIXNpemUtNiByb3VuZGVkLWxnIGJnLXR1aS1wcmltYXJ5IHRleHQtd2hpdGVcIlxuICAgICAgICAgICAgPjwvdHVpLWljb24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwLTJcIj5cbiAgICAgICAgPHR1aS1lbGFzdGljLWNvbnRhaW5lciBjbGFzcz1cInNocmluay0wXCI+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIHR1aUxpbmtcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm5hbWVcIlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFt0dWlIaWdobGlnaHRdPVwiKHNlYXJjaCQgfCBhc3luYykgPz8gJydcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0NhcmRFdmVudC5lbWl0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHByb2R1Y3QubmFtZSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICA8L3R1aS1lbGFzdGljLWNvbnRhaW5lcj5cbiAgICAgICAgPHR1aS1lbGFzdGljLWNvbnRhaW5lciBjbGFzcz1cInNocmluay0wXCI+XG4gICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICpuZ0lmPVwicHJvZHVjdD8ucGFja1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXR1aS10ZXh0LTAyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICDQndC+0YDQvNCwINGD0L/QsNC60L7QstC60Lg6IHt7IHByb2R1Y3QucGFjayB9fVxuICAgICAgICAgICAgICAgIDx0dWktc3ZnXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicHJvZHVjdC5pZ25vcmVNaW5Db3VudENoZWNrXCJcbiAgICAgICAgICAgICAgICAgICAgc3JjPVwidHVpSWNvblBhY2thZ2VcIlxuICAgICAgICAgICAgICAgICAgICBbdHVpSGludF09XCJtaW5Db3VudEhpbnRcIlxuICAgICAgICAgICAgICAgICAgICBbdHVpSGludFNob3dEZWxheV09XCIxMDBcIlxuICAgICAgICAgICAgICAgICAgICB0dWlIaW50RGlyZWN0aW9uPVwidG9wXCJcbiAgICAgICAgICAgICAgICA+PC90dWktc3ZnPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbWluQ291bnRIaW50PlxuICAgICAgICAgICAgICAgICAgICDQlNC+0YHRgtGD0L/QtdC9INC30LDQutCw0LcgPGJyIC8+XG4gICAgICAgICAgICAgICAgICAgINC/0YDQvtC40LfQstC+0LvRjNC90L7Qs9C+IDxiciAvPlxuICAgICAgICAgICAgICAgICAgICDQutC+0LvQuNGH0LXRgdGC0LLQsFxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgIFt0dWlIaWdobGlnaHRdPVwiKHNlYXJjaCQgfCBhc3luYykgPz8gJydcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY29kZSB0ZXh0LXR1aS10ZXh0LTAyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICDQkNGA0YLQuNC60YPQuzoge3sgcHJvZHVjdC5jb2RlIH19XG4gICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgdHVpTGlua1xuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlzTW9iaWxlICYmIChhdXRoU3RhdHVzJCB8IGFzeW5jKSAmJiBwcm9kdWN0Py5jb3N0RGF0ZVwiXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgYXJpYS1kaXNhYmxlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaGlzdG9yeVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrUHJpY2VIaXN0b3J5RXZlbnQuZW1pdCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICDQlNCw0YLQsDoge3sgcHJvZHVjdC5jb3N0RGF0ZSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICA8L3R1aS1lbGFzdGljLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJ3YXJlaG91c2VTZWxlY3QkIHwgYXN5bmMgYXMgd2FyZWhvdXNlU2VsZWN0XCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9kdWN0LmRpc2NvdW50ICYmICFpc01vYmlsZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXR1aS10ZXh0LTAyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpbmUtdGhyb3VnaFwiPnt7IHByb2R1Y3QuZGlzY291bnRDb3N0U3RyaW5nIH19PC9zcGFuPiAmbmJzcDtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCB0ZXh0LXR1aS1zdWNjZXNzLWZpbGxcIj4gLXt7IHByb2R1Y3QuZGlzY291bnQucGVyY2VudCB9fSUgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDx0dWktaWNvbiBcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cIkB0dWkuaW5mb1wiXG4gICAgICAgICAgICAgICAgICAgIFt0dWlIaW50XT1cImRpc2NvdW50SGludFwiXG4gICAgICAgICAgICAgICAgICAgIFt0dWlIaW50U2hvd0RlbGF5XT1cIjEwMFwiXG4gICAgICAgICAgICAgICAgICAgIHR1aUhpbnREaXJlY3Rpb249XCJ0b3BcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIiFoLTQgdGV4dC1ibGFja1wiXG4gICAgICAgICAgICAgICAgPjwvdHVpLWljb24+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNjb3VudEhpbnQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJvbGRcIj57eyBwcm9kdWN0LmRpc2NvdW50Lm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb2R1Y3QuZGlzY291bnQuZXhwaXJlZEF0IGFzIGV4cGlyZWRBdFwiPtCU0LDRgtCwINC+0LrQvtC90YfQsNC90LjRjzoge3sgZXhwaXJlZEF0IH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtdHVpLXRleHQtMDJdPVwiIXByb2R1Y3QuaXNXYXJlaG91c2VTdG9ja0V4aXN0KHdhcmVob3VzZVNlbGVjdC5pZClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY29zdCBmb250LWJvbGRcIlxuICAgICAgICAgICAgICAgID57eyBwcm9kdWN0LmNvc3RSdWJTdHJpbmcgfX08L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhcHJvZHVjdC5wcmljZUluUnViXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImhpZGRlbiBmb250LWJvbGQgdGV4dC10dWktdGV4dC0wMiBncm91cC1ob3ZlcjpibG9ja1wiXG4gICAgICAgICAgICAgICAgPnt7IHByb2R1Y3QuY29zdFN0cmluZyB9fTwvc3BhblxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPHNjLXByaWNlLXdhcmVob3VzZS1zdG9jayBbcHJvZHVjdF09XCJwcm9kdWN0XCI+PC9zYy1wcmljZS13YXJlaG91c2Utc3RvY2s+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FydC1hY3Rpb25zIGZsZXggc2hyaW5rLTAgb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhc2hvd1F1YW50aXR5Q29udHJvbFwiXG4gICAgICAgICAgICAgICAgdHVpQnV0dG9uXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrQWRkVG9DYXJ0RXZlbnQuZW1pdChwcm9kdWN0KVwiXG4gICAgICAgICAgICAgICAgW2xvYWRpbmddPVwicXVhbnRpdHlTaG93TG9hZGVyXCJcbiAgICAgICAgICAgICAgICBbc2l6ZV09XCJzaXplID09PSAncycgPyAneHMnIDogJ3MnXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm10LTIgZ3Jvd1wiXG4gICAgICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS5zaG9wcGluZy1jYXJ0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICDQkiDQutC+0YDQt9C40L3Rg1xuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8c2MtaW5wdXQtcXVhbnRpdHlcbiAgICAgICAgICAgICAgICAjaW5wdXRRdWFudGl0eVxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1F1YW50aXR5Q29udHJvbFwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInF1YW50aXR5Q29udHJvbFwiXG4gICAgICAgICAgICAgICAgW3NpemVdPVwic2l6ZVwiXG4gICAgICAgICAgICAgICAgW3N0ZXBdPVwidW5pdHNIZWxwZXIucHJvZHVjdE11bHRpcGxpY2l0eShwcm9kdWN0KVwiXG4gICAgICAgICAgICAgICAgW2lnbm9yZVN0ZXBWYWxpZGF0b3JzXT1cInByb2R1Y3QuaWdub3JlTWluQ291bnRDaGVja1wiXG4gICAgICAgICAgICAgICAgW3Nob3dMb2FkZXJdPVwicXVhbnRpdHlTaG93TG9hZGVyXCJcbiAgICAgICAgICAgICAgICAoY2xpY2tDbGVhckV2ZW50KT1cImNsaWNrQ2xlYXJFdmVudC5lbWl0KGNhcnRJdGVtKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtdC0yIHctZnVsbFwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiaW5wdXRRdWFudGl0eS5uYXRpdmVGb2N1c2FibGVFbGVtZW50Py5ibHVyKClcIlxuICAgICAgICAgICAgPjwvc2MtaW5wdXQtcXVhbnRpdHk+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjc2tlbGV0b24+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtd3JhcHBlciBmbGV4IGZsZXgtY29sIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLXhsIGJnLXdoaXRlIHNoYWRvdy1zYy0xXCI+XG4gICAgICAgIDwhLS0g0JjQt9C+0LHRgNCw0LbQtdC90LjQtSDRgtC+0LLQsNGA0LAgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoLTMvNSB3LWZ1bGwgcm91bmRlZC10IGJnLXR1aS1iYXNlLTAyXCI+PC9kaXY+XG4gICAgICAgIDwhLS0g0JrRgNCw0YLQutCw0Y8g0LjQvdGE0L7RgNC80LDRhtC40Y8g0L4g0YLQvtCy0LDRgNC1IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBncm93IGZsZXgtY29sIGdhcC0yLjUgcm91bmRlZC1iIGJnLXdoaXRlIHAtNVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtNCB3LWZ1bGwgcm91bmRlZCBiZy10dWktYmFzZS0wMlwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtNCB3LTMvNSByb3VuZGVkIGJnLXR1aS1iYXNlLTAyXCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC00IHctZnVsbCByb3VuZGVkIGJnLXR1aS1iYXNlLTAyXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -1,8 +1,8 @@
1
1
  import { __decorate } from "tslib";
2
2
  /* eslint-disable class-methods-use-this,lodash/prefer-lodash-method */
3
- import { ChangeDetectionStrategy, Component, Inject, Input, Optional } from '@angular/core';
3
+ import { ChangeDetectionStrategy, Component, Inject, inject, Input, Optional } from '@angular/core';
4
4
  import { ScUserMetrikaGoalsEnum } from '@snabcentr/client-core';
5
- import { TuiDay, TuiDayRange, tuiIsFalsy, tuiIsPresent, TuiMonth, tuiPure } from '@taiga-ui/cdk';
5
+ import { TUI_IS_MOBILE, TuiDay, TuiDayRange, tuiIsFalsy, tuiIsPresent, TuiMonth, tuiPure } from '@taiga-ui/cdk';
6
6
  import { TUI_MONTHS } from '@taiga-ui/core';
7
7
  import { POLYMORPHEUS_CONTEXT } from '@taiga-ui/polymorpheus';
8
8
  import { filter, map, shareReplay, startWith, tap } from 'rxjs';
@@ -10,8 +10,9 @@ import * as i0 from "@angular/core";
10
10
  import * as i1 from "@snabcentr/client-core";
11
11
  import * as i2 from "@angular/common";
12
12
  import * as i3 from "@taiga-ui/core";
13
- import * as i4 from "@taiga-ui/addon-charts";
14
- import * as i5 from "rxjs";
13
+ import * as i4 from "@taiga-ui/cdk";
14
+ import * as i5 from "@taiga-ui/addon-charts";
15
+ import * as i6 from "rxjs";
15
16
  /**
16
17
  * График истории цен товара или услуги.
17
18
  */
@@ -29,12 +30,20 @@ export class ScPriceHistoryComponent {
29
30
  this.months$ = months$;
30
31
  this.userMetrikaService = userMetrikaService;
31
32
  this.context = context;
33
+ /**
34
+ * Признак того, отображается этот компонент на мобильном устройстве или нет.
35
+ */
36
+ this.isMobile = inject(TUI_IS_MOBILE);
32
37
  /**
33
38
  * {@link Observable} функция для преобразования значения number в строку в подсказке по оси X.
34
39
  */
35
40
  this.xStringify$ = this.months$.pipe(map((months) => ({ month, day }) =>
36
41
  // eslint-disable-next-line security/detect-object-injection
37
42
  `${months[month]}, ${day}`));
43
+ /**
44
+ * Относительные отступы от верхнего и нижнего края в процентах.
45
+ */
46
+ this.paddingPercent = 10;
38
47
  /**
39
48
  * Функция для преобразования значения number в строку в подсказке по оси Y.
40
49
  *
@@ -47,7 +56,7 @@ export class ScPriceHistoryComponent {
47
56
  }
48
57
  /** @inheritDoc */
49
58
  ngOnInit() {
50
- this.history$ = this.catalogService.getPriceHistory$(this.product).pipe(map((history) => Object.keys(history)
59
+ this.history$ = this.catalogService.getPriceHistory$(this.product).pipe(filter(tuiIsPresent), map((history) => Object.keys(history)
51
60
  .map((item) => [TuiDay.normalizeParse(item, 'DMY'), history[String(item)].cost])
52
61
  .sort((a, b) => (a[0] > b[0] ? 1 : -1))), startWith(null), shareReplay({ bufferSize: 1, refCount: true }));
53
62
  this.loadingHistory$ = this.history$.pipe(map(tuiIsFalsy));
@@ -62,9 +71,7 @@ export class ScPriceHistoryComponent {
62
71
  min: Math.min(...values),
63
72
  max: Math.max(...values),
64
73
  })));
65
- this.range$ = this.history$.pipe(filter(tuiIsPresent), filter((history) => history.length > 1), map((value) => ({ from: value.at(0)?.[0], to: value.at(-1)?.[0] })), filter((range) => !!range.from && !!range.to), map((range) => {
66
- return new TuiDayRange(range.from, range.to);
67
- }));
74
+ this.range$ = this.history$.pipe(filter(tuiIsPresent), filter((history) => history.length > 1), map((value) => ({ from: value.at(0)?.[0], to: value.at(-1)?.[0] })), filter((range) => !!range.from && !!range.to), map((range) => new TuiDayRange(range.from, range.to)));
68
75
  }
69
76
  /**
70
77
  * Вычисляет подписи даты к оси X.
@@ -74,7 +81,14 @@ export class ScPriceHistoryComponent {
74
81
  * @param param0.to {@link TuiDay} Дата конца истории цен.
75
82
  */
76
83
  computeLabels$({ from, to }) {
77
- return this.months$.pipe(map((months) => [...Array.from({ length: TuiMonth.lengthBetween(from, to) + 1 }, (_, index) => months[from.append({ month: index }).month]), '']));
84
+ return this.months$.pipe(map((months) => [
85
+ ...Array.from({ length: TuiMonth.lengthBetween(from, to) + 1 }, (_, index) => {
86
+ const previousYear = from.append({ month: index - 1 }).year; // Начальный год
87
+ const currentYear = from.append({ month: index }).year;
88
+ return `${this.isMobile || previousYear === currentYear ? '' : currentYear} ${months[from.append({ month: index }).month]}`;
89
+ }),
90
+ '',
91
+ ]));
78
92
  }
79
93
  /**
80
94
  * Вычисляет данные для отображения на графике.
@@ -100,8 +114,8 @@ export class ScPriceHistoryComponent {
100
114
  ];
101
115
  }, []));
102
116
  }
103
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScPriceHistoryComponent, deps: [{ token: i1.ScCatalogService }, { token: TUI_MONTHS }, { token: i1.ScUserMetrikaService }, { token: POLYMORPHEUS_CONTEXT, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
104
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.3", type: ScPriceHistoryComponent, selector: "sc-price-history", inputs: { product: "product" }, ngImport: i0, template: "<tui-loader [showLoader]=\"!!(loadingHistory$ | async)\"> </tui-loader>\n\n<div\n *ngIf=\"(loadingHistory$ | async) === false\"\n class=\"flex flex-col items-center\"\n>\n <ng-container *ngIf=\"priceInfo$ | async as priceInfo; else isNotExist\">\n <div class=\"w-174 mb-1 text-end text-lg font-bold\">\u043E\u0442 {{ priceInfo.min.toLocaleString() }} \u20BD \u0434\u043E {{ priceInfo.max.toLocaleString() }} \u20BD</div>\n\n <ng-container *ngIf=\"history$ | async as history\">\n <div\n *ngIf=\"range$ | async as range\"\n class=\"relative h-56 w-full p-5 text-tui-primary\"\n >\n <tui-axes\n *ngIf=\"computeLabels$(range) | async as labels\"\n class=\"h-full\"\n [axisXLabels]=\"labels\"\n [horizontalLines]=\"4\"\n [verticalLines]=\"labels.length\"\n >\n <tui-line-days-chart\n class=\"chart\"\n [height]=\"priceInfo.max\"\n [smoothingFactor]=\"10\"\n [y]=\"priceInfo.min - (priceInfo.min * 1) / 4\"\n [value]=\"computeValue(range, history)\"\n [xStringify]=\"xStringify$ | async\"\n [yStringify]=\"yStringify\"\n [hintContent]=\"hint\"\n ></tui-line-days-chart>\n </tui-axes>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #isNotExist>\n <p class=\"text-base font-bold\">\u0426\u0435\u043D\u0430 \u043D\u0430 \u0442\u043E\u0432\u0430\u0440 \u043D\u0435 \u0438\u0437\u043C\u0435\u043D\u044F\u043B\u0430\u0441\u044C</p>\n </ng-template>\n <ng-template\n #hint\n let-data\n >\n <div class=\"font-bold\">{{ data[1].toLocaleString() }} \u20BD</div>\n <div>{{ data[0] }}</div>\n </ng-template>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "component", type: i4.TuiLineDaysChart, selector: "tui-line-days-chart", inputs: ["y", "height", "smoothingFactor", "hintContent", "xStringify", "yStringify", "dots", "value"] }, { kind: "component", type: i4.TuiAxes, selector: "tui-axes", inputs: ["axisX", "axisXLabels", "axisY", "axisYInset", "axisYLabels", "axisYName", "axisYSecondaryInset", "axisYSecondaryLabels", "axisYSecondaryName", "horizontalLines", "horizontalLinesHandler", "verticalLines", "verticalLinesHandler"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
117
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScPriceHistoryComponent, deps: [{ token: i1.ScCatalogService }, { token: TUI_MONTHS }, { token: i1.ScUserMetrikaService }, { token: POLYMORPHEUS_CONTEXT, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
118
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: ScPriceHistoryComponent, selector: "sc-price-history", inputs: { product: "product" }, ngImport: i0, template: "<tui-loader [showLoader]=\"!!(loadingHistory$ | async)\"> </tui-loader>\n\n<div\n *ngIf=\"(loadingHistory$ | async) === false\"\n class=\"flex flex-col items-center\"\n>\n <ng-container *ngIf=\"priceInfo$ | async as priceInfo; else isNotExist\">\n <div class=\"w-174 mb-1 text-end text-lg font-bold\">\u043E\u0442 {{ priceInfo.min.toLocaleString() }} \u20BD \u0434\u043E {{ priceInfo.max.toLocaleString() }} \u20BD</div>\n\n <ng-container *ngIf=\"history$ | async as history\">\n <div\n *ngIf=\"range$ | async as range\"\n class=\"relative h-56 w-full p-5 text-tui-primary\"\n >\n <tui-axes\n *ngIf=\"computeLabels$(range) | async as labels\"\n class=\"h-full\"\n [axisXLabels]=\"labels\"\n [horizontalLines]=\"4\"\n [verticalLines]=\"labels.length\"\n >\n <ng-container *tuiLet=\"priceInfo.max - priceInfo.min as height\">\n <tui-line-days-chart\n *ngIf=\"(height / 100) * paddingPercent as padding\"\n [height]=\"height + (height / 100) * paddingPercent * 2\"\n [smoothingFactor]=\"10\"\n [y]=\"priceInfo.min - (height / 100) * paddingPercent\"\n [value]=\"computeValue(range, history)\"\n [xStringify]=\"xStringify$ | async\"\n [yStringify]=\"yStringify\"\n [hintContent]=\"hint\"\n class=\"chart\"\n ></tui-line-days-chart>\n </ng-container>\n </tui-axes>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #isNotExist>\n <p class=\"text-base font-bold\">\u0426\u0435\u043D\u0430 \u043D\u0430 \u0442\u043E\u0432\u0430\u0440 \u043D\u0435 \u0438\u0437\u043C\u0435\u043D\u044F\u043B\u0430\u0441\u044C</p>\n </ng-template>\n <ng-template\n #hint\n let-data\n >\n <div class=\"font-bold\">{{ data[1].toLocaleString() }} \u20BD</div>\n <div>{{ data[0] }}</div>\n </ng-template>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "directive", type: i4.TuiLet, selector: "[tuiLet]", inputs: ["tuiLet"] }, { kind: "component", type: i5.TuiLineDaysChart, selector: "tui-line-days-chart", inputs: ["y", "height", "smoothingFactor", "hintContent", "xStringify", "yStringify", "dots", "value"] }, { kind: "component", type: i5.TuiAxes, selector: "tui-axes", inputs: ["axisX", "axisXLabels", "axisY", "axisYInset", "axisYLabels", "axisYName", "axisYSecondaryInset", "axisYSecondaryLabels", "axisYSecondaryName", "horizontalLines", "horizontalLinesHandler", "verticalLines", "verticalLinesHandler"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
105
119
  }
106
120
  __decorate([
107
121
  tuiPure
@@ -109,10 +123,10 @@ __decorate([
109
123
  __decorate([
110
124
  tuiPure
111
125
  ], ScPriceHistoryComponent.prototype, "computeValue", null);
112
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScPriceHistoryComponent, decorators: [{
126
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScPriceHistoryComponent, decorators: [{
113
127
  type: Component,
114
- args: [{ selector: 'sc-price-history', changeDetection: ChangeDetectionStrategy.OnPush, template: "<tui-loader [showLoader]=\"!!(loadingHistory$ | async)\"> </tui-loader>\n\n<div\n *ngIf=\"(loadingHistory$ | async) === false\"\n class=\"flex flex-col items-center\"\n>\n <ng-container *ngIf=\"priceInfo$ | async as priceInfo; else isNotExist\">\n <div class=\"w-174 mb-1 text-end text-lg font-bold\">\u043E\u0442 {{ priceInfo.min.toLocaleString() }} \u20BD \u0434\u043E {{ priceInfo.max.toLocaleString() }} \u20BD</div>\n\n <ng-container *ngIf=\"history$ | async as history\">\n <div\n *ngIf=\"range$ | async as range\"\n class=\"relative h-56 w-full p-5 text-tui-primary\"\n >\n <tui-axes\n *ngIf=\"computeLabels$(range) | async as labels\"\n class=\"h-full\"\n [axisXLabels]=\"labels\"\n [horizontalLines]=\"4\"\n [verticalLines]=\"labels.length\"\n >\n <tui-line-days-chart\n class=\"chart\"\n [height]=\"priceInfo.max\"\n [smoothingFactor]=\"10\"\n [y]=\"priceInfo.min - (priceInfo.min * 1) / 4\"\n [value]=\"computeValue(range, history)\"\n [xStringify]=\"xStringify$ | async\"\n [yStringify]=\"yStringify\"\n [hintContent]=\"hint\"\n ></tui-line-days-chart>\n </tui-axes>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #isNotExist>\n <p class=\"text-base font-bold\">\u0426\u0435\u043D\u0430 \u043D\u0430 \u0442\u043E\u0432\u0430\u0440 \u043D\u0435 \u0438\u0437\u043C\u0435\u043D\u044F\u043B\u0430\u0441\u044C</p>\n </ng-template>\n <ng-template\n #hint\n let-data\n >\n <div class=\"font-bold\">{{ data[1].toLocaleString() }} \u20BD</div>\n <div>{{ data[0] }}</div>\n </ng-template>\n</div>\n" }]
115
- }], ctorParameters: () => [{ type: i1.ScCatalogService }, { type: i5.Observable, decorators: [{
128
+ args: [{ selector: 'sc-price-history', changeDetection: ChangeDetectionStrategy.OnPush, template: "<tui-loader [showLoader]=\"!!(loadingHistory$ | async)\"> </tui-loader>\n\n<div\n *ngIf=\"(loadingHistory$ | async) === false\"\n class=\"flex flex-col items-center\"\n>\n <ng-container *ngIf=\"priceInfo$ | async as priceInfo; else isNotExist\">\n <div class=\"w-174 mb-1 text-end text-lg font-bold\">\u043E\u0442 {{ priceInfo.min.toLocaleString() }} \u20BD \u0434\u043E {{ priceInfo.max.toLocaleString() }} \u20BD</div>\n\n <ng-container *ngIf=\"history$ | async as history\">\n <div\n *ngIf=\"range$ | async as range\"\n class=\"relative h-56 w-full p-5 text-tui-primary\"\n >\n <tui-axes\n *ngIf=\"computeLabels$(range) | async as labels\"\n class=\"h-full\"\n [axisXLabels]=\"labels\"\n [horizontalLines]=\"4\"\n [verticalLines]=\"labels.length\"\n >\n <ng-container *tuiLet=\"priceInfo.max - priceInfo.min as height\">\n <tui-line-days-chart\n *ngIf=\"(height / 100) * paddingPercent as padding\"\n [height]=\"height + (height / 100) * paddingPercent * 2\"\n [smoothingFactor]=\"10\"\n [y]=\"priceInfo.min - (height / 100) * paddingPercent\"\n [value]=\"computeValue(range, history)\"\n [xStringify]=\"xStringify$ | async\"\n [yStringify]=\"yStringify\"\n [hintContent]=\"hint\"\n class=\"chart\"\n ></tui-line-days-chart>\n </ng-container>\n </tui-axes>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #isNotExist>\n <p class=\"text-base font-bold\">\u0426\u0435\u043D\u0430 \u043D\u0430 \u0442\u043E\u0432\u0430\u0440 \u043D\u0435 \u0438\u0437\u043C\u0435\u043D\u044F\u043B\u0430\u0441\u044C</p>\n </ng-template>\n <ng-template\n #hint\n let-data\n >\n <div class=\"font-bold\">{{ data[1].toLocaleString() }} \u20BD</div>\n <div>{{ data[0] }}</div>\n </ng-template>\n</div>\n" }]
129
+ }], ctorParameters: () => [{ type: i1.ScCatalogService }, { type: i6.Observable, decorators: [{
116
130
  type: Inject,
117
131
  args: [TUI_MONTHS]
118
132
  }] }, { type: i1.ScUserMetrikaService }, { type: undefined, decorators: [{
@@ -123,4 +137,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImpor
123
137
  }] }], propDecorators: { product: [{
124
138
  type: Input
125
139
  }], computeLabels$: [], computeValue: [] } });
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtcHJpY2UtaGlzdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2F0YWxvZy9wcmljZS1oaXN0b3J5L3NjLXByaWNlLWhpc3RvcnkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvcHJpY2UtaGlzdG9yeS9zYy1wcmljZS1oaXN0b3J5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx1RUFBdUU7QUFFdkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRyxPQUFPLEVBQStCLHNCQUFzQixFQUF3QixNQUFNLHdCQUF3QixDQUFDO0FBQ25ILE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDbkgsT0FBTyxFQUFFLFVBQVUsRUFBb0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYyxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7OztBQUU1RTs7R0FFRztBQU1ILE1BQU0sT0FBTyx1QkFBdUI7SUFnRGhDOzs7Ozs7O09BT0c7SUFDSCxZQUNxQixjQUFnQyxFQUNaLE9BQXNDLEVBQzFELGtCQUF3QyxFQUd4QyxPQUF3RDtRQUx4RCxtQkFBYyxHQUFkLGNBQWMsQ0FBa0I7UUFDWixZQUFPLEdBQVAsT0FBTyxDQUErQjtRQUMxRCx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXNCO1FBR3hDLFlBQU8sR0FBUCxP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QU07MkJBQUMsVUFBVTs7MEJBRWpCLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsb0JBQW9CO3lDQXBEaEIsT0FBTztzQkFBdEIsS0FBSztnQkErR0MsY0FBYyxNQWFkLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzLGxvZGFzaC9wcmVmZXItbG9kYXNoLW1ldGhvZCAqL1xuXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbmplY3QsIElucHV0LCBPbkluaXQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTY0NhdGFsb2dTZXJ2aWNlLCBTY1Byb2R1Y3QsIFNjVXNlck1ldHJpa2FHb2Fsc0VudW0sIFNjVXNlck1ldHJpa2FTZXJ2aWNlIH0gZnJvbSAnQHNuYWJjZW50ci9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBUdWlEYXksIFR1aURheVJhbmdlLCB0dWlJc0ZhbHN5LCB0dWlJc1ByZXNlbnQsIFR1aU1vbnRoLCB0dWlQdXJlLCBUdWlTdHJpbmdIYW5kbGVyIH0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQgeyBUVUlfTU9OVEhTLCBUdWlEaWFsb2dDb250ZXh0IH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHsgUE9MWU1PUlBIRVVTX0NPTlRFWFQgfSBmcm9tICdAdGFpZ2EtdWkvcG9seW1vcnBoZXVzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBPYnNlcnZhYmxlLCBzaGFyZVJlcGxheSwgc3RhcnRXaXRoLCB0YXAgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiDQk9GA0LDRhNC40Log0LjRgdGC0L7RgNC40Lgg0YbQtdC9INGC0L7QstCw0YDQsCDQuNC70Lgg0YPRgdC70YPQs9C4LlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3NjLXByaWNlLWhpc3RvcnknLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zYy1wcmljZS1oaXN0b3J5LmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2NQcmljZUhpc3RvcnlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDQstGA0LXQvNC10L3QvdC+0LPQviDQv9GA0L7QvNC10LbRg9GC0LrQsCDQuNGB0YLQvtGA0LjQuCDRhtC10L0uXG4gICAgICovXG4gICAgcHVibGljIHJhbmdlJDogT2JzZXJ2YWJsZTxUdWlEYXlSYW5nZT47XG5cbiAgICAvKipcbiAgICAgKiDQotC+0LLQsNGAINC40LvQuCDRg9GB0LvRg9Cz0LAsINC00LvRjyDQutC+0YLQvtGA0L7Qs9C+INC90LXQvtCx0YXQvtC00LjQvNC+INC+0YLQvtCx0YDQsNC30LjRgtGMINC40YHRgtC+0YDQuNGOINGG0LXQvS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgcHJvZHVjdDogU2NQcm9kdWN0O1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INC40YHRgtC+0YDQuNC4INGG0LXQvS5cbiAgICAgKi9cbiAgICBwdWJsaWMgaGlzdG9yeSQ/OiBPYnNlcnZhYmxlPFJlYWRvbmx5QXJyYXk8W1R1aURheSwgbnVtYmVyXT4gfCBudWxsPjtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDQuNC30LzQtdC90LXQvdC40Y8g0YHQvtGB0YLQvtGP0L3QuNGPINC30LDQs9GA0YPQt9C60Lgg0LTQsNC90L3Ri9GFINC40YHRgtC+0YDQuNC4INGG0LXQvS5cbiAgICAgKi9cbiAgICBwdWJsaWMgbG9hZGluZ0hpc3RvcnkkPzogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAgIC8qKlxuICAgICAqINCc0LDQutGB0LjQvNCw0LvRjNC90LDRjyDRhtC10L3QsCDRgtC+0LLQsNGA0LAuXG4gICAgICovXG4gICAgcHVibGljIHByaWNlSW5mbyQ/OiBPYnNlcnZhYmxlPHtcbiAgICAgICAgbWluOiBudW1iZXI7XG4gICAgICAgIG1heDogbnVtYmVyO1xuICAgIH0+O1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INGE0YPQvdC60YbQuNGPINC00LvRjyDQv9GA0LXQvtCx0YDQsNC30L7QstCw0L3QuNGPINC30L3QsNGH0LXQvdC40Y8gbnVtYmVyINCyINGB0YLRgNC+0LrRgyDQsiDQv9C+0LTRgdC60LDQt9C60LUg0L/QviDQvtGB0LggWC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgeFN0cmluZ2lmeSQ6IE9ic2VydmFibGU8VHVpU3RyaW5nSGFuZGxlcjxUdWlEYXk+PiA9IHRoaXMubW9udGhzJC5waXBlKFxuICAgICAgICBtYXAoXG4gICAgICAgICAgICAobW9udGhzKSA9PlxuICAgICAgICAgICAgICAgICh7IG1vbnRoLCBkYXkgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNlY3VyaXR5L2RldGVjdC1vYmplY3QtaW5qZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIGAke21vbnRoc1ttb250aF19LCAke2RheX1gXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0KTRg9C90LrRhtC40Y8g0LTQu9GPINC/0YDQtdC+0LHRgNCw0LfQvtCy0LDQvdC40Y8g0LfQvdCw0YfQtdC90LjRjyBudW1iZXIg0LIg0YHRgtGA0L7QutGDINCyINC/0L7QtNGB0LrQsNC30LrQtSDQv9C+INC+0YHQuCBZLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlINCX0L3QsNGH0LXQvdC40LUg0L7RgdC4IFkuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHlTdHJpbmdpZnk6IFR1aVN0cmluZ0hhbmRsZXI8bnVtYmVyPiA9ICh2YWx1ZSkgPT4gYCR7dmFsdWUudG9Mb2NhbGVTdHJpbmcoJ3J1LVJVJyl9IOKCvWA7XG5cbiAgICAvKipcbiAgICAgKiDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdGCINGN0LrQt9C10LzQv9C70Y/RgCDQutC70LDRgdGB0LAge0BsaW5rIFNjUHJpY2VIaXN0b3J5Q29tcG9uZW50fS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXRhbG9nU2VydmljZSDQodC10YDQstC40YEg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSDQutCw0YLQsNC70L7Qs9C+0LwuXG4gICAgICogQHBhcmFtIG1vbnRocyQg0J/QtdGA0LXRh9C40YHQu9C10L3QuNC1INC80LXRgdGP0YbQtdCyLlxuICAgICAqIEBwYXJhbSB1c2VyTWV0cmlrYVNlcnZpY2Ug0KHQtdGA0LLQuNGBINC00LvRjyDRgdCx0L7RgNCwINC80LXRgtGA0LjQuiDQviDQtNC10LnRgdGC0LLQuNGP0YUg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9C10LkuXG4gICAgICogQHBhcmFtIGNvbnRleHQg0JrQvtC90YLQtdC60YHRgiDQtNC40LDQu9C+0LPQvtCy0L7Qs9C+INC+0LrQvdCwLCDQsiDQutC+0YLQvtGA0L7QvCDQvtGC0LrRgNGL0YIg0LrQvtC80L/QvtC90LXQvdGCLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjYXRhbG9nU2VydmljZTogU2NDYXRhbG9nU2VydmljZSxcbiAgICAgICAgQEluamVjdChUVUlfTU9OVEhTKSBwcml2YXRlIHJlYWRvbmx5IG1vbnRocyQ6IE9ic2VydmFibGU8cmVhZG9ubHkgc3RyaW5nW10+LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHVzZXJNZXRyaWthU2VydmljZTogU2NVc2VyTWV0cmlrYVNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIEBJbmplY3QoUE9MWU1PUlBIRVVTX0NPTlRFWFQpXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dD86IFR1aURpYWxvZ0NvbnRleHQ8dm9pZCwgeyBwcm9kdWN0OiBTY1Byb2R1Y3QgfT5cbiAgICApIHtcbiAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdCA9IGNvbnRleHQuZGF0YS5wcm9kdWN0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBpbmhlcml0RG9jICovXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpc3RvcnkkID0gdGhpcy5jYXRhbG9nU2VydmljZS5nZXRQcmljZUhpc3RvcnkkKHRoaXMucHJvZHVjdCkucGlwZShcbiAgICAgICAgICAgIG1hcCgoaGlzdG9yeSkgPT5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhoaXN0b3J5KVxuICAgICAgICAgICAgICAgICAgICAubWFwKChpdGVtKTogW1R1aURheSwgbnVtYmVyXSA9PiBbVHVpRGF5Lm5vcm1hbGl6ZVBhcnNlKGl0ZW0sICdETVknKSwgaGlzdG9yeVtTdHJpbmcoaXRlbSldLmNvc3RdKVxuICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gKGFbMF0gPiBiWzBdID8gMSA6IC0xKSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGFydFdpdGgobnVsbCksXG4gICAgICAgICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nSGlzdG9yeSQgPSB0aGlzLmhpc3RvcnkkLnBpcGUobWFwKHR1aUlzRmFsc3kpKTtcblxuICAgICAgICB0aGlzLnByaWNlSW5mbyQgPSB0aGlzLmhpc3RvcnkkLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIodHVpSXNQcmVzZW50KSxcbiAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VyTWV0cmlrYVNlcnZpY2UuZW1pdFVzZXJNZXRyaWthRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IFNjVXNlck1ldHJpa2FHb2Fsc0VudW0ucHJvZHVjdFByaWNlSGlzdG9yeVNob3csXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9pZDogdGhpcy5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBmaWx0ZXIoKGhpc3RvcnkpID0+IGhpc3RvcnkubGVuZ3RoID4gMSksXG4gICAgICAgICAgICBtYXAoKGhpc3RvcnkpID0+IGhpc3RvcnkubWFwKChpdGVtKSA9PiBpdGVtWzFdKSksXG4gICAgICAgICAgICBtYXAoKHZhbHVlcykgPT4gKHtcbiAgICAgICAgICAgICAgICBtaW46IE1hdGgubWluKC4uLnZhbHVlcyksXG4gICAgICAgICAgICAgICAgbWF4OiBNYXRoLm1heCguLi52YWx1ZXMpLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5yYW5nZSQgPSB0aGlzLmhpc3RvcnkkLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIodHVpSXNQcmVzZW50KSxcbiAgICAgICAgICAgIGZpbHRlcigoaGlzdG9yeSkgPT4gaGlzdG9yeS5sZW5ndGggPiAxKSxcbiAgICAgICAgICAgIG1hcCgodmFsdWU6IFJlYWRvbmx5QXJyYXk8W1R1aURheSwgbnVtYmVyXT4pID0+ICh7IGZyb206IHZhbHVlLmF0KDApPy5bMF0sIHRvOiB2YWx1ZS5hdCgtMSk/LlswXSB9KSksXG4gICAgICAgICAgICBmaWx0ZXIoKHJhbmdlKTogcmFuZ2UgaXMgeyBmcm9tOiBUdWlEYXk7IHRvOiBUdWlEYXkgfSA9PiAhIXJhbmdlLmZyb20gJiYgISFyYW5nZS50byksXG4gICAgICAgICAgICBtYXAoKHJhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUdWlEYXlSYW5nZShyYW5nZS5mcm9tLCByYW5nZS50byk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0YvRh9C40YHQu9GP0LXRgiDQv9C+0LTQv9C40YHQuCDQtNCw0YLRiyDQuiDQvtGB0LggWC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbTAge0BsaW5rIFR1aURheVJhbmdlfSDQktGA0LXQvNC10L3QvdC+0Lkg0L/RgNC+0LzQtdC20YPRgtC+0Log0LjRgdGC0L7RgNC40Lgg0YbQtdC9LlxuICAgICAqIEBwYXJhbSBwYXJhbTAuZnJvbSB7QGxpbmsgVHVpRGF5fSDQlNCw0YLQsCDQvdCw0YfQsNC70LAg0LjRgdGC0L7RgNC40Lgg0YbQtdC9LlxuICAgICAqIEBwYXJhbSBwYXJhbTAudG8ge0BsaW5rIFR1aURheX0g0JTQsNGC0LAg0LrQvtC90YbQsCDQuNGB0YLQvtGA0LjQuCDRhtC10L0uXG4gICAgICovXG4gICAgQHR1aVB1cmVcbiAgICBwdWJsaWMgY29tcHV0ZUxhYmVscyQoeyBmcm9tLCB0byB9OiBUdWlEYXlSYW5nZSk6IE9ic2VydmFibGU8cmVhZG9ubHkgc3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9udGhzJC5waXBlKG1hcCgobW9udGhzKSA9PiBbLi4uQXJyYXkuZnJvbSh7IGxlbmd0aDogVHVpTW9udGgubGVuZ3RoQmV0d2Vlbihmcm9tLCB0bykgKyAxIH0sIChfLCBpbmRleCkgPT4gbW9udGhzW2Zyb20uYXBwZW5kKHsgbW9udGg6IGluZGV4IH0pLm1vbnRoXSksICcnXSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0YvRh9C40YHQu9GP0LXRgiDQtNCw0L3QvdGL0LUg0LTQu9GPINC+0YLQvtCx0YDQsNC20LXQvdC40Y8g0L3QsCDQs9GA0LDRhNC40LrQtS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbTAge0BsaW5rIFR1aURheVJhbmdlfSDQktGA0LXQvNC10L3QvdC+0Lkg0L/RgNC+0LzQtdC20YPRgtC+0Log0LjRgdGC0L7RgNC40Lgg0YbQtdC9LlxuICAgICAqIEBwYXJhbSBwYXJhbTAuZnJvbSB7QGxpbmsgVHVpRGF5fSDQlNCw0YLQsCDQvdCw0YfQsNC70LAg0LjRgdGC0L7RgNC40Lgg0YbQtdC9LlxuICAgICAqIEBwYXJhbSBwYXJhbTAudG8ge0BsaW5rIFR1aURheX0g0JTQsNGC0LAg0LrQvtC90YbQsCDQuNGB0YLQvtGA0LjQuCDRhtC10L0uXG4gICAgICogQHBhcmFtIGhpc3Rvcnkg0JjRgdGC0L7RgNC40Y8g0YbQtdC9LlxuICAgICAqL1xuICAgIEB0dWlQdXJlXG4gICAgcHVibGljIGNvbXB1dGVWYWx1ZSh7IGZyb20sIHRvIH06IFR1aURheVJhbmdlLCBoaXN0b3J5OiBSZWFkb25seUFycmF5PFtUdWlEYXksIG51bWJlcl0+KTogUmVhZG9ubHlBcnJheTxbVHVpRGF5LCBudW1iZXJdPiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiBUdWlEYXkubGVuZ3RoQmV0d2Vlbihmcm9tLCB0bykgKyAxIH0pXG4gICAgICAgICAgICAgICAgLmZpbGwoMClcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1hcnJheS1yZWR1Y2VcbiAgICAgICAgICAgICAgICAucmVkdWNlPFJlYWRvbmx5QXJyYXk8W1R1aURheSwgbnVtYmVyXT4+KChhcnJheSwgXywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGZyb20uYXBwZW5kKHsgZGF5OiBpbmRleCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhpc3RvcnkuZmluZCgodmFsdWVIaXN0b3J5LCBpbmRleEhpc3RvcnksIGFycmF5SGlzdG9yeSkgPT4gZGF0YS5kYXlTYW1lKHZhbHVlSGlzdG9yeVswXSkgfHwgZGF0YS5kYXlCZWZvcmUoYXJyYXlIaXN0b3J5W2luZGV4SGlzdG9yeSArIDFdWzBdKSkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeVswXSlbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0sIFtdKVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsIjx0dWktbG9hZGVyIFtzaG93TG9hZGVyXT1cIiEhKGxvYWRpbmdIaXN0b3J5JCB8IGFzeW5jKVwiPiA8L3R1aS1sb2FkZXI+XG5cbjxkaXZcbiAgICAqbmdJZj1cIihsb2FkaW5nSGlzdG9yeSQgfCBhc3luYykgPT09IGZhbHNlXCJcbiAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyXCJcbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJpY2VJbmZvJCB8IGFzeW5jIGFzIHByaWNlSW5mbzsgZWxzZSBpc05vdEV4aXN0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTE3NCBtYi0xIHRleHQtZW5kIHRleHQtbGcgZm9udC1ib2xkXCI+0L7RgiB7eyBwcmljZUluZm8ubWluLnRvTG9jYWxlU3RyaW5nKCkgfX0g4oK9INC00L4ge3sgcHJpY2VJbmZvLm1heC50b0xvY2FsZVN0cmluZygpIH19IOKCvTwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoaXN0b3J5JCB8IGFzeW5jIGFzIGhpc3RvcnlcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdJZj1cInJhbmdlJCB8IGFzeW5jIGFzIHJhbmdlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGgtNTYgdy1mdWxsIHAtNSB0ZXh0LXR1aS1wcmltYXJ5XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8dHVpLWF4ZXNcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb21wdXRlTGFiZWxzJChyYW5nZSkgfCBhc3luYyBhcyBsYWJlbHNcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFtheGlzWExhYmVsc109XCJsYWJlbHNcIlxuICAgICAgICAgICAgICAgICAgICBbaG9yaXpvbnRhbExpbmVzXT1cIjRcIlxuICAgICAgICAgICAgICAgICAgICBbdmVydGljYWxMaW5lc109XCJsYWJlbHMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDx0dWktbGluZS1kYXlzLWNoYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoYXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwicHJpY2VJbmZvLm1heFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc21vb3RoaW5nRmFjdG9yXT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt5XT1cInByaWNlSW5mby5taW4gLSAocHJpY2VJbmZvLm1pbiAqIDEpIC8gNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29tcHV0ZVZhbHVlKHJhbmdlLCBoaXN0b3J5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbeFN0cmluZ2lmeV09XCJ4U3RyaW5naWZ5JCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt5U3RyaW5naWZ5XT1cInlTdHJpbmdpZnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpbnRDb250ZW50XT1cImhpbnRcIlxuICAgICAgICAgICAgICAgICAgICA+PC90dWktbGluZS1kYXlzLWNoYXJ0PlxuICAgICAgICAgICAgICAgIDwvdHVpLWF4ZXM+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNpc05vdEV4aXN0PlxuICAgICAgICA8cCBjbGFzcz1cInRleHQtYmFzZSBmb250LWJvbGRcIj7QptC10L3QsCDQvdCwINGC0L7QstCw0YAg0L3QtSDQuNC30LzQtdC90Y/Qu9Cw0YHRjDwvcD5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAjaGludFxuICAgICAgICBsZXQtZGF0YVxuICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IGRhdGFbMV0udG9Mb2NhbGVTdHJpbmcoKSB9fSDigr08L2Rpdj5cbiAgICAgICAgPGRpdj57eyBkYXRhWzBdIH19PC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuIl19
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtcHJpY2UtaGlzdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2F0YWxvZy9wcmljZS1oaXN0b3J5L3NjLXByaWNlLWhpc3RvcnkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvcHJpY2UtaGlzdG9yeS9zYy1wcmljZS1oaXN0b3J5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx1RUFBdUU7QUFFdkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUErQixzQkFBc0IsRUFBd0IsTUFBTSx3QkFBd0IsQ0FBQztBQUNuSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUNsSSxPQUFPLEVBQUUsVUFBVSxFQUFvQixNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFjLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQUU1RTs7R0FFRztBQU1ILE1BQU0sT0FBTyx1QkFBdUI7SUEwRGhDOzs7Ozs7O09BT0c7SUFDSCxZQUNxQixjQUFnQyxFQUNaLE9BQXNDLEVBQzFELGtCQUF3QyxFQUd4QyxPQUF3RDtRQUx4RCxtQkFBYyxHQUFkLGNBQWMsQ0FBa0I7UUFDWixZQUFPLEdBQVAsT0FBTyxDQUErQjtRQUMxRCx1QkFBa0IsR0FBbEIsa0JBQWtCLENB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QUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDM0ksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNyQjthQUNKLENBQUM7UUFDTixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQ2IsQ0FBQztJQUNOLENBQUM7OEdBektRLHVCQUF1QixrREFvRXBCLFVBQVUsaURBR1Ysb0JBQW9CO2tHQXZFdkIsdUJBQXVCLHdGQ2pCcEMscXdFQWlEQTs7QURpR1c7SUFETixPQUFPOzZEQWFQO0FBV007SUFETixPQUFPOzJEQWtCUDsyRkF6S1EsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNJLGtCQUFrQixtQkFFWCx1QkFBdUIsQ0FBQyxNQUFNOzswQkFzRTFDLE1BQU07MkJBQUMsVUFBVTs7MEJBRWpCLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsb0JBQW9CO3lDQTlEaEIsT0FBTztzQkFBdEIsS0FBSztnQkF3SEMsY0FBYyxNQXVCZCxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyxsb2Rhc2gvcHJlZmVyLWxvZGFzaC1tZXRob2QgKi9cblxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5qZWN0LCBpbmplY3QsIElucHV0LCBPbkluaXQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTY0NhdGFsb2dTZXJ2aWNlLCBTY1Byb2R1Y3QsIFNjVXNlck1ldHJpa2FHb2Fsc0VudW0sIFNjVXNlck1ldHJpa2FTZXJ2aWNlIH0gZnJvbSAnQHNuYWJjZW50ci9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBUVUlfSVNfTU9CSUxFLCBUdWlEYXksIFR1aURheVJhbmdlLCB0dWlJc0ZhbHN5LCB0dWlJc1ByZXNlbnQsIFR1aU1vbnRoLCB0dWlQdXJlLCBUdWlTdHJpbmdIYW5kbGVyIH0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQgeyBUVUlfTU9OVEhTLCBUdWlEaWFsb2dDb250ZXh0IH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHsgUE9MWU1PUlBIRVVTX0NPTlRFWFQgfSBmcm9tICdAdGFpZ2EtdWkvcG9seW1vcnBoZXVzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBPYnNlcnZhYmxlLCBzaGFyZVJlcGxheSwgc3RhcnRXaXRoLCB0YXAgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiDQk9GA0LDRhNC40Log0LjRgdGC0L7RgNC40Lgg0YbQtdC9INGC0L7QstCw0YDQsCDQuNC70Lgg0YPRgdC70YPQs9C4LlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3NjLXByaWNlLWhpc3RvcnknLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zYy1wcmljZS1oaXN0b3J5LmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2NQcmljZUhpc3RvcnlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDQstGA0LXQvNC10L3QvdC+0LPQviDQv9GA0L7QvNC10LbRg9GC0LrQsCDQuNGB0YLQvtGA0LjQuCDRhtC10L0uXG4gICAgICovXG4gICAgcHVibGljIHJhbmdlJDogT2JzZXJ2YWJsZTxUdWlEYXlSYW5nZT47XG5cbiAgICAvKipcbiAgICAgKiDQotC+0LLQsNGAINC40LvQuCDRg9GB0LvRg9Cz0LAsINC00LvRjyDQutC+0YLQvtGA0L7Qs9C+INC90LXQvtCx0YXQvtC00LjQvNC+INC+0YLQvtCx0YDQsNC30LjRgtGMINC40YHRgtC+0YDQuNGOINGG0LXQvS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgcHJvZHVjdDogU2NQcm9kdWN0O1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INC40YHRgtC+0YDQuNC4INGG0LXQvS5cbiAgICAgKi9cbiAgICBwdWJsaWMgaGlzdG9yeSQ/OiBPYnNlcnZhYmxlPFJlYWRvbmx5QXJyYXk8W1R1aURheSwgbnVtYmVyXT4gfCBudWxsPjtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDQuNC30LzQtdC90LXQvdC40Y8g0YHQvtGB0YLQvtGP0L3QuNGPINC30LDQs9GA0YPQt9C60Lgg0LTQsNC90L3Ri9GFINC40YHRgtC+0YDQuNC4INGG0LXQvS5cbiAgICAgKi9cbiAgICBwdWJsaWMgbG9hZGluZ0hpc3RvcnkkPzogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAgIC8qKlxuICAgICAqINCc0LDQutGB0LjQvNCw0LvRjNC90LDRjyDRhtC10L3QsCDRgtC+0LLQsNGA0LAuXG4gICAgICovXG4gICAgcHVibGljIHByaWNlSW5mbyQ/OiBPYnNlcnZhYmxlPHtcbiAgICAgICAgbWluOiBudW1iZXI7XG4gICAgICAgIG1heDogbnVtYmVyO1xuICAgIH0+O1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0Log0YLQvtCz0L4sINC+0YLQvtCx0YDQsNC20LDQtdGC0YHRjyDRjdGC0L7RgiDQutC+0LzQv9C+0L3QtdC90YIg0L3QsCDQvNC+0LHQuNC70YzQvdC+0Lwg0YPRgdGC0YDQvtC50YHRgtCy0LUg0LjQu9C4INC90LXRgi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGU6IGJvb2xlYW4gPSBpbmplY3QoVFVJX0lTX01PQklMRSk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0YTRg9C90LrRhtC40Y8g0LTQu9GPINC/0YDQtdC+0LHRgNCw0LfQvtCy0LDQvdC40Y8g0LfQvdCw0YfQtdC90LjRjyBudW1iZXIg0LIg0YHRgtGA0L7QutGDINCyINC/0L7QtNGB0LrQsNC30LrQtSDQv9C+INC+0YHQuCBYLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSB4U3RyaW5naWZ5JDogT2JzZXJ2YWJsZTxUdWlTdHJpbmdIYW5kbGVyPFR1aURheT4+ID0gdGhpcy5tb250aHMkLnBpcGUoXG4gICAgICAgIG1hcChcbiAgICAgICAgICAgIChtb250aHMpID0+XG4gICAgICAgICAgICAgICAgKHsgbW9udGgsIGRheSB9KSA9PlxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgYCR7bW9udGhzW21vbnRoXX0sICR7ZGF5fWBcbiAgICAgICAgKVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiDQntGC0L3QvtGB0LjRgtC10LvRjNC90YvQtSDQvtGC0YHRgtGD0L/RiyDQvtGCINCy0LXRgNGF0L3QtdCz0L4g0Lgg0L3QuNC20L3QtdCz0L4g0LrRgNCw0Y8g0LIg0L/RgNC+0YbQtdC90YLQsNGFLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBwYWRkaW5nUGVyY2VudDogbnVtYmVyID0gMTA7XG5cbiAgICAvKipcbiAgICAgKiDQpNGD0L3QutGG0LjRjyDQtNC70Y8g0L/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjRjyDQt9C90LDRh9C10L3QuNGPIG51bWJlciDQsiDRgdGC0YDQvtC60YMg0LIg0L/QvtC00YHQutCw0LfQutC1INC/0L4g0L7RgdC4IFkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUg0JfQvdCw0YfQtdC90LjQtSDQvtGB0LggWS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgeVN0cmluZ2lmeTogVHVpU3RyaW5nSGFuZGxlcjxudW1iZXI+ID0gKHZhbHVlKSA9PiBgJHt2YWx1ZS50b0xvY2FsZVN0cmluZygncnUtUlUnKX0g4oK9YDtcblxuICAgIC8qKlxuICAgICAqINCY0L3QuNGG0LjQsNC70LjQt9C40YDRg9C10YIg0Y3QutC30LXQvNC/0LvRj9GAINC60LvQsNGB0YHQsCB7QGxpbmsgU2NQcmljZUhpc3RvcnlDb21wb25lbnR9LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhdGFsb2dTZXJ2aWNlINCh0LXRgNCy0LjRgSDQtNC70Y8g0YDQsNCx0L7RgtGLINGBINC60LDRgtCw0LvQvtCz0L7QvC5cbiAgICAgKiBAcGFyYW0gbW9udGhzJCDQn9C10YDQtdGH0LjRgdC70LXQvdC40LUg0LzQtdGB0Y/RhtC10LIuXG4gICAgICogQHBhcmFtIHVzZXJNZXRyaWthU2VydmljZSDQodC10YDQstC40YEg0LTQu9GPINGB0LHQvtGA0LAg0LzQtdGC0YDQuNC6INC+INC00LXQudGB0YLQstC40Y/RhSDQv9C+0LvRjNC30L7QstCw0YLQtdC70LXQuS5cbiAgICAgKiBAcGFyYW0gY29udGV4dCDQmtC+0L3RgtC10LrRgdGCINC00LjQsNC70L7Qs9C+0LLQvtCz0L4g0L7QutC90LAsINCyINC60L7RgtC+0YDQvtC8INC+0YLQutGA0YvRgiDQutC+0LzQv9C+0L3QtdC90YIuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNhdGFsb2dTZXJ2aWNlOiBTY0NhdGFsb2dTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KFRVSV9NT05USFMpIHByaXZhdGUgcmVhZG9ubHkgbW9udGhzJDogT2JzZXJ2YWJsZTxyZWFkb25seSBzdHJpbmdbXT4sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdXNlck1ldHJpa2FTZXJ2aWNlOiBTY1VzZXJNZXRyaWthU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgQEluamVjdChQT0xZTU9SUEhFVVNfQ09OVEVYVClcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0PzogVHVpRGlhbG9nQ29udGV4dDx2b2lkLCB7IHByb2R1Y3Q6IFNjUHJvZHVjdCB9PlxuICAgICkge1xuICAgICAgICBpZiAoY29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5wcm9kdWN0ID0gY29udGV4dC5kYXRhLnByb2R1Y3Q7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGluaGVyaXREb2MgKi9cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlzdG9yeSQgPSB0aGlzLmNhdGFsb2dTZXJ2aWNlLmdldFByaWNlSGlzdG9yeSQodGhpcy5wcm9kdWN0KS5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKHR1aUlzUHJlc2VudCksXG4gICAgICAgICAgICBtYXAoKGhpc3RvcnkpID0+XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaGlzdG9yeSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoaXRlbSk6IFtUdWlEYXksIG51bWJlcl0gPT4gW1R1aURheS5ub3JtYWxpemVQYXJzZShpdGVtLCAnRE1ZJyksIGhpc3RvcnlbU3RyaW5nKGl0ZW0pXS5jb3N0XSlcbiAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IChhWzBdID4gYlswXSA/IDEgOiAtMSkpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhcnRXaXRoKG51bGwpLFxuICAgICAgICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMubG9hZGluZ0hpc3RvcnkkID0gdGhpcy5oaXN0b3J5JC5waXBlKG1hcCh0dWlJc0ZhbHN5KSk7XG5cbiAgICAgICAgdGhpcy5wcmljZUluZm8kID0gdGhpcy5oaXN0b3J5JC5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKHR1aUlzUHJlc2VudCksXG4gICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlck1ldHJpa2FTZXJ2aWNlLmVtaXRVc2VyTWV0cmlrYUV2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBTY1VzZXJNZXRyaWthR29hbHNFbnVtLnByb2R1Y3RQcmljZUhpc3RvcnlTaG93LFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RfaWQ6IHRoaXMucHJvZHVjdC5pZCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZmlsdGVyKChoaXN0b3J5KSA9PiBoaXN0b3J5Lmxlbmd0aCA+IDEpLFxuICAgICAgICAgICAgbWFwKChoaXN0b3J5KSA9PiBoaXN0b3J5Lm1hcCgoaXRlbSkgPT4gaXRlbVsxXSkpLFxuICAgICAgICAgICAgbWFwKCh2YWx1ZXMpID0+ICh7XG4gICAgICAgICAgICAgICAgbWluOiBNYXRoLm1pbiguLi52YWx1ZXMpLFxuICAgICAgICAgICAgICAgIG1heDogTWF0aC5tYXgoLi4udmFsdWVzKSxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMucmFuZ2UkID0gdGhpcy5oaXN0b3J5JC5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKHR1aUlzUHJlc2VudCksXG4gICAgICAgICAgICBmaWx0ZXIoKGhpc3RvcnkpID0+IGhpc3RvcnkubGVuZ3RoID4gMSksXG4gICAgICAgICAgICBtYXAoKHZhbHVlOiBSZWFkb25seUFycmF5PFtUdWlEYXksIG51bWJlcl0+KSA9PiAoeyBmcm9tOiB2YWx1ZS5hdCgwKT8uWzBdLCB0bzogdmFsdWUuYXQoLTEpPy5bMF0gfSkpLFxuICAgICAgICAgICAgZmlsdGVyKChyYW5nZSk6IHJhbmdlIGlzIHsgZnJvbTogVHVpRGF5OyB0bzogVHVpRGF5IH0gPT4gISFyYW5nZS5mcm9tICYmICEhcmFuZ2UudG8pLFxuICAgICAgICAgICAgbWFwKChyYW5nZSkgPT4gbmV3IFR1aURheVJhbmdlKHJhbmdlLmZyb20sIHJhbmdlLnRvKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktGL0YfQuNGB0LvRj9C10YIg0L/QvtC00L/QuNGB0Lgg0LTQsNGC0Ysg0Log0L7RgdC4IFguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW0wIHtAbGluayBUdWlEYXlSYW5nZX0g0JLRgNC10LzQtdC90L3QvtC5INC/0YDQvtC80LXQttGD0YLQvtC6INC40YHRgtC+0YDQuNC4INGG0LXQvS5cbiAgICAgKiBAcGFyYW0gcGFyYW0wLmZyb20ge0BsaW5rIFR1aURheX0g0JTQsNGC0LAg0L3QsNGH0LDQu9CwINC40YHRgtC+0YDQuNC4INGG0LXQvS5cbiAgICAgKiBAcGFyYW0gcGFyYW0wLnRvIHtAbGluayBUdWlEYXl9INCU0LDRgtCwINC60L7QvdGG0LAg0LjRgdGC0L7RgNC40Lgg0YbQtdC9LlxuICAgICAqL1xuICAgIEB0dWlQdXJlXG4gICAgcHVibGljIGNvbXB1dGVMYWJlbHMkKHsgZnJvbSwgdG8gfTogVHVpRGF5UmFuZ2UpOiBPYnNlcnZhYmxlPHJlYWRvbmx5IHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vbnRocyQucGlwZShcbiAgICAgICAgICAgIG1hcCgobW9udGhzKSA9PiBbXG4gICAgICAgICAgICAgICAgLi4uQXJyYXkuZnJvbSh7IGxlbmd0aDogVHVpTW9udGgubGVuZ3RoQmV0d2Vlbihmcm9tLCB0bykgKyAxIH0sIChfLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c1llYXIgPSBmcm9tLmFwcGVuZCh7IG1vbnRoOiBpbmRleCAtIDEgfSkueWVhcjsgLy8g0J3QsNGH0LDQu9GM0L3Ri9C5INCz0L7QtFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50WWVhciA9IGZyb20uYXBwZW5kKHsgbW9udGg6IGluZGV4IH0pLnllYXI7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuaXNNb2JpbGUgfHwgcHJldmlvdXNZZWFyID09PSBjdXJyZW50WWVhciA/ICcnIDogY3VycmVudFllYXJ9ICR7bW9udGhzW2Zyb20uYXBwZW5kKHsgbW9udGg6IGluZGV4IH0pLm1vbnRoXX1gO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktGL0YfQuNGB0LvRj9C10YIg0LTQsNC90L3Ri9C1INC00LvRjyDQvtGC0L7QsdGA0LDQttC10L3QuNGPINC90LAg0LPRgNCw0YTQuNC60LUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW0wIHtAbGluayBUdWlEYXlSYW5nZX0g0JLRgNC10LzQtdC90L3QvtC5INC/0YDQvtC80LXQttGD0YLQvtC6INC40YHRgtC+0YDQuNC4INGG0LXQvS5cbiAgICAgKiBAcGFyYW0gcGFyYW0wLmZyb20ge0BsaW5rIFR1aURheX0g0JTQsNGC0LAg0L3QsNGH0LDQu9CwINC40YHRgtC+0YDQuNC4INGG0LXQvS5cbiAgICAgKiBAcGFyYW0gcGFyYW0wLnRvIHtAbGluayBUdWlEYXl9INCU0LDRgtCwINC60L7QvdGG0LAg0LjRgdGC0L7RgNC40Lgg0YbQtdC9LlxuICAgICAqIEBwYXJhbSBoaXN0b3J5INCY0YHRgtC+0YDQuNGPINGG0LXQvS5cbiAgICAgKi9cbiAgICBAdHVpUHVyZVxuICAgIHB1YmxpYyBjb21wdXRlVmFsdWUoeyBmcm9tLCB0byB9OiBUdWlEYXlSYW5nZSwgaGlzdG9yeTogUmVhZG9ubHlBcnJheTxbVHVpRGF5LCBudW1iZXJdPik6IFJlYWRvbmx5QXJyYXk8W1R1aURheSwgbnVtYmVyXT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogVHVpRGF5Lmxlbmd0aEJldHdlZW4oZnJvbSwgdG8pICsgMSB9KVxuICAgICAgICAgICAgICAgIC5maWxsKDApXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tYXJyYXktcmVkdWNlXG4gICAgICAgICAgICAgICAgLnJlZHVjZTxSZWFkb25seUFycmF5PFtUdWlEYXksIG51bWJlcl0+PigoYXJyYXksIF8sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBmcm9tLmFwcGVuZCh7IGRheTogaW5kZXggfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5hcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoaXN0b3J5LmZpbmQoKHZhbHVlSGlzdG9yeSwgaW5kZXhIaXN0b3J5LCBhcnJheUhpc3RvcnkpID0+IGRhdGEuZGF5U2FtZSh2YWx1ZUhpc3RvcnlbMF0pIHx8IGRhdGEuZGF5QmVmb3JlKGFycmF5SGlzdG9yeVtpbmRleEhpc3RvcnkgKyAxXVswXSkpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvcnlbMF0pWzFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9LCBbXSlcbiAgICAgICAgKTtcbiAgICB9XG59XG4iLCI8dHVpLWxvYWRlciBbc2hvd0xvYWRlcl09XCIhIShsb2FkaW5nSGlzdG9yeSQgfCBhc3luYylcIj4gPC90dWktbG9hZGVyPlxuXG48ZGl2XG4gICAgKm5nSWY9XCIobG9hZGluZ0hpc3RvcnkkIHwgYXN5bmMpID09PSBmYWxzZVwiXG4gICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlclwiXG4+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByaWNlSW5mbyQgfCBhc3luYyBhcyBwcmljZUluZm87IGVsc2UgaXNOb3RFeGlzdFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidy0xNzQgbWItMSB0ZXh0LWVuZCB0ZXh0LWxnIGZvbnQtYm9sZFwiPtC+0YIge3sgcHJpY2VJbmZvLm1pbi50b0xvY2FsZVN0cmluZygpIH19IOKCvSDQtNC+IHt7IHByaWNlSW5mby5tYXgudG9Mb2NhbGVTdHJpbmcoKSB9fSDigr08L2Rpdj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGlzdG9yeSQgfCBhc3luYyBhcyBoaXN0b3J5XCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJyYW5nZSQgfCBhc3luYyBhcyByYW5nZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBoLTU2IHctZnVsbCBwLTUgdGV4dC10dWktcHJpbWFyeVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHR1aS1heGVzXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29tcHV0ZUxhYmVscyQocmFuZ2UpIHwgYXN5bmMgYXMgbGFiZWxzXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICBbYXhpc1hMYWJlbHNdPVwibGFiZWxzXCJcbiAgICAgICAgICAgICAgICAgICAgW2hvcml6b250YWxMaW5lc109XCI0XCJcbiAgICAgICAgICAgICAgICAgICAgW3ZlcnRpY2FsTGluZXNdPVwibGFiZWxzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICp0dWlMZXQ9XCJwcmljZUluZm8ubWF4IC0gcHJpY2VJbmZvLm1pbiBhcyBoZWlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0dWktbGluZS1kYXlzLWNoYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoaGVpZ2h0IC8gMTAwKSAqIHBhZGRpbmdQZXJjZW50IGFzIHBhZGRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiaGVpZ2h0ICsgKGhlaWdodCAvIDEwMCkgKiBwYWRkaW5nUGVyY2VudCAqIDJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzbW9vdGhpbmdGYWN0b3JdPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5XT1cInByaWNlSW5mby5taW4gLSAoaGVpZ2h0IC8gMTAwKSAqIHBhZGRpbmdQZXJjZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29tcHV0ZVZhbHVlKHJhbmdlLCBoaXN0b3J5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3hTdHJpbmdpZnldPVwieFN0cmluZ2lmeSQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3lTdHJpbmdpZnldPVwieVN0cmluZ2lmeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpbnRDb250ZW50XT1cImhpbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hhcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvdHVpLWxpbmUtZGF5cy1jaGFydD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC90dWktYXhlcz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2lzTm90RXhpc3Q+XG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1iYXNlIGZvbnQtYm9sZFwiPtCm0LXQvdCwINC90LAg0YLQvtCy0LDRgCDQvdC1INC40LfQvNC10L3Rj9C70LDRgdGMPC9wPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICNoaW50XG4gICAgICAgIGxldC1kYXRhXG4gICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgZGF0YVsxXS50b0xvY2FsZVN0cmluZygpIH19IOKCvTwvZGl2PlxuICAgICAgICA8ZGl2Pnt7IGRhdGFbMF0gfX08L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG4iXX0=
@@ -33,10 +33,10 @@ export class ScPriceListPaginationComponent {
33
33
  */
34
34
  this.disabled$ = this.paginationService.dataAccumulated$.pipe(map(tuiIsFalsy));
35
35
  }
36
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScPriceListPaginationComponent, deps: [{ token: SC_NEXT_PAGE_PAGINATION_CLICK }, { token: SC_PRODUCT_PAGINATION_OPTIONS }], target: i0.ɵɵFactoryTarget.Component }); }
37
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.3", type: ScPriceListPaginationComponent, selector: "sc-price-list-pagination", ngImport: i0, template: "<ng-container *ngIf=\"meta$ | async as meta\">\n <button\n *ngIf=\"meta?.currentPage !== meta?.lastPage\"\n tuiButton\n (click)=\"nextPageClickEvent.emit()\"\n [disabled]=\"!!(disabled$ | async)\"\n appearance=\"secondary\"\n class=\"!font-bold\"\n >\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0435\u0449\u0451 {{ options.perPage }} \u0442\u043E\u0432\u0430\u0440\u043E\u0432\n </button>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScPriceListPaginationComponent, deps: [{ token: SC_NEXT_PAGE_PAGINATION_CLICK }, { token: SC_PRODUCT_PAGINATION_OPTIONS }], target: i0.ɵɵFactoryTarget.Component }); }
37
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: ScPriceListPaginationComponent, selector: "sc-price-list-pagination", ngImport: i0, template: "<ng-container *ngIf=\"meta$ | async as meta\">\n <button\n *ngIf=\"meta?.currentPage !== meta?.lastPage\"\n tuiButton\n (click)=\"nextPageClickEvent.emit()\"\n [disabled]=\"!!(disabled$ | async)\"\n appearance=\"secondary\"\n class=\"!font-bold\"\n >\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0435\u0449\u0451 {{ options.perPage }} \u0442\u043E\u0432\u0430\u0440\u043E\u0432\n </button>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
38
38
  }
39
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScPriceListPaginationComponent, decorators: [{
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScPriceListPaginationComponent, decorators: [{
40
40
  type: Component,
41
41
  args: [{ selector: 'sc-price-list-pagination', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"meta$ | async as meta\">\n <button\n *ngIf=\"meta?.currentPage !== meta?.lastPage\"\n tuiButton\n (click)=\"nextPageClickEvent.emit()\"\n [disabled]=\"!!(disabled$ | async)\"\n appearance=\"secondary\"\n class=\"!font-bold\"\n >\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0435\u0449\u0451 {{ options.perPage }} \u0442\u043E\u0432\u0430\u0440\u043E\u0432\n </button>\n</ng-container>\n" }]
42
42
  }], ctorParameters: () => [{ type: i0.EventEmitter, decorators: [{
@@ -29,10 +29,10 @@ export class ScPriceWarehouseStockComponent {
29
29
  this.selectedWarehouse$ = this.fromMain ? this.warehouseService.getCatalogWarehouseChange$() : this.warehouseService.getWarehouseSelectChange$();
30
30
  this.warehousesList$ = this.selectedWarehouse$.pipe(switchMap((warehouse) => this.warehouseService.getWarehouses$().pipe(map((warehouses) => this.product.stockCount?.map((sc) => ({ w: warehouses.find((w) => w.id === sc.warehouseId), sc: sc }))), map((items) => items?.sort((item) => (item.w?.id === warehouse?.id ? -1 : 1))))));
31
31
  }
32
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScPriceWarehouseStockComponent, deps: [{ token: i1.ScWarehouseService }], target: i0.ɵɵFactoryTarget.Component }); }
33
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.3", type: ScPriceWarehouseStockComponent, selector: "sc-price-warehouse-stock", inputs: { classList: "classList", product: "product", withStockHint: "withStockHint", fromMain: "fromMain" }, ngImport: i0, template: "<ng-container *ngIf=\"product\">\n <ng-container>\n <div *ngIf=\"selectedWarehouse$ | async as warehouseSelect\" class=\"flex items-center gap-1\">\n <span *ngIf=\"product.getNotStockMessage(warehouseSelect) as message\" class=\"text-xs min-w-2/5 text-tui-error-fill\" [ngClass]=\"classList\"> {{ message }} </span>\n <span *ngIf=\"product.isWarehouseStockExist(warehouseSelect.id)\" class=\"text-xs min-w-2/5 text-tui-success-fill\" [ngClass]=\"classList\">\n \u0412 \u043D\u0430\u043B\u0438\u0447\u0438\u0438<ng-container *ngIf=\"product.getWarehouseStockCount(warehouseSelect.id) as count\"\n >:\n <span class=\"whitespace-nowrap\">{{ count }} {{ product.quantityUnit }}</span>\n </ng-container>\n </span>\n <span *ngIf=\"product.onOrder\" class=\"text-xs min-w-2/5 text-sc-yellow\" [ngClass]=\"classList\">\u041F\u043E\u0434 \u0437\u0430\u043A\u0430\u0437</span>\n\n <tui-icon \n *ngIf=\"withStockHint && (warehousesList$ | async)?.length\"\n icon=\"@tui.info\"\n [tuiHint]=\"stockHint\"\n [tuiHintShowDelay]=\"100\"\n tuiHintDirection=\"top\"\n class=\"!text-xs !h-3\"\n ></tui-icon>\n </div>\n </ng-container>\n</ng-container>\n\n<ng-template #stockHint>\n <table *ngIf=\"selectedWarehouse$ | async as warehouseSelect\" class=\"text-xs table-auto\" [ngClass]=\"classList\">\n <tbody>\n <tr *ngFor=\"let item of warehousesList$ | async\" class=\"border-b\">\n <ng-container>\n <td class=\"px-1\">{{ item.w?.name }}:</td>\n <td class=\"px-1\">{{ item.sc.count ? item.sc.count + ' ' + product.quantityUnit : '\u0412 \u043D\u0430\u043B\u0438\u0447\u0438\u0438' }}</td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n</ng-template>\n", styles: ["[tuiIconButton]{--tui-radius-m: .75rem;--tui-height-xs: 1.25rem}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: i3.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHintContext", "tuiHintAppearance", "tuiHint"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScPriceWarehouseStockComponent, deps: [{ token: i1.ScWarehouseService }], target: i0.ɵɵFactoryTarget.Component }); }
33
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: ScPriceWarehouseStockComponent, selector: "sc-price-warehouse-stock", inputs: { classList: "classList", product: "product", withStockHint: "withStockHint", fromMain: "fromMain" }, ngImport: i0, template: "<ng-container *ngIf=\"product\">\n <ng-container>\n <div *ngIf=\"selectedWarehouse$ | async as warehouseSelect\" class=\"flex items-center gap-1\">\n <span *ngIf=\"product.getNotStockMessage(warehouseSelect) as message\" class=\"text-xs min-w-2/5 text-tui-error-fill\" [ngClass]=\"classList\"> {{ message }} </span>\n <span *ngIf=\"product.isWarehouseStockExist(warehouseSelect.id)\" class=\"text-xs min-w-2/5 text-tui-success-fill\" [ngClass]=\"classList\">\n \u0412 \u043D\u0430\u043B\u0438\u0447\u0438\u0438<ng-container *ngIf=\"product.getWarehouseStockCount(warehouseSelect.id) as count\"\n >:\n <span class=\"whitespace-nowrap\">{{ count }} {{ product.quantityUnit }}</span>\n </ng-container>\n </span>\n <span *ngIf=\"product.onOrder\" class=\"text-xs min-w-2/5 text-sc-yellow\" [ngClass]=\"classList\">\u041F\u043E\u0434 \u0437\u0430\u043A\u0430\u0437</span>\n\n <tui-icon \n *ngIf=\"withStockHint && (warehousesList$ | async)?.length\"\n icon=\"@tui.info\"\n [tuiHint]=\"stockHint\"\n [tuiHintShowDelay]=\"100\"\n tuiHintDirection=\"top\"\n class=\"!text-xs !h-3\"\n ></tui-icon>\n </div>\n </ng-container>\n</ng-container>\n\n<ng-template #stockHint>\n <table *ngIf=\"selectedWarehouse$ | async as warehouseSelect\" class=\"text-xs table-auto\" [ngClass]=\"classList\">\n <tbody>\n <tr *ngFor=\"let item of warehousesList$ | async\" class=\"border-b\">\n <ng-container>\n <td class=\"px-1\">{{ item.w?.name }}:</td>\n <td class=\"px-1\">{{ item.sc.count ? item.sc.count + ' ' + product.quantityUnit : '\u0412 \u043D\u0430\u043B\u0438\u0447\u0438\u0438' }}</td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n</ng-template>\n", styles: ["[tuiIconButton]{--tui-radius-m: .75rem;--tui-height-xs: 1.25rem}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: i3.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHintContext", "tuiHintAppearance", "tuiHint"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
34
34
  }
35
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScPriceWarehouseStockComponent, decorators: [{
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScPriceWarehouseStockComponent, decorators: [{
36
36
  type: Component,
37
37
  args: [{ selector: 'sc-price-warehouse-stock', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"product\">\n <ng-container>\n <div *ngIf=\"selectedWarehouse$ | async as warehouseSelect\" class=\"flex items-center gap-1\">\n <span *ngIf=\"product.getNotStockMessage(warehouseSelect) as message\" class=\"text-xs min-w-2/5 text-tui-error-fill\" [ngClass]=\"classList\"> {{ message }} </span>\n <span *ngIf=\"product.isWarehouseStockExist(warehouseSelect.id)\" class=\"text-xs min-w-2/5 text-tui-success-fill\" [ngClass]=\"classList\">\n \u0412 \u043D\u0430\u043B\u0438\u0447\u0438\u0438<ng-container *ngIf=\"product.getWarehouseStockCount(warehouseSelect.id) as count\"\n >:\n <span class=\"whitespace-nowrap\">{{ count }} {{ product.quantityUnit }}</span>\n </ng-container>\n </span>\n <span *ngIf=\"product.onOrder\" class=\"text-xs min-w-2/5 text-sc-yellow\" [ngClass]=\"classList\">\u041F\u043E\u0434 \u0437\u0430\u043A\u0430\u0437</span>\n\n <tui-icon \n *ngIf=\"withStockHint && (warehousesList$ | async)?.length\"\n icon=\"@tui.info\"\n [tuiHint]=\"stockHint\"\n [tuiHintShowDelay]=\"100\"\n tuiHintDirection=\"top\"\n class=\"!text-xs !h-3\"\n ></tui-icon>\n </div>\n </ng-container>\n</ng-container>\n\n<ng-template #stockHint>\n <table *ngIf=\"selectedWarehouse$ | async as warehouseSelect\" class=\"text-xs table-auto\" [ngClass]=\"classList\">\n <tbody>\n <tr *ngFor=\"let item of warehousesList$ | async\" class=\"border-b\">\n <ng-container>\n <td class=\"px-1\">{{ item.w?.name }}:</td>\n <td class=\"px-1\">{{ item.sc.count ? item.sc.count + ' ' + product.quantityUnit : '\u0412 \u043D\u0430\u043B\u0438\u0447\u0438\u0438' }}</td>\n </ng-container>\n </tr>\n </tbody>\n </table>\n</ng-template>\n", styles: ["[tuiIconButton]{--tui-radius-m: .75rem;--tui-height-xs: 1.25rem}\n"] }]
38
38
  }], ctorParameters: () => [{ type: i1.ScWarehouseService }], propDecorators: { classList: [{
@@ -21,8 +21,8 @@ import * as i1 from "@taiga-ui/core";
21
21
  * Модуль каталога.
22
22
  */
23
23
  export class ScCatalogModule {
24
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScCatalogModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.3", ngImport: i0, type: ScCatalogModule, declarations: [ScPriceListPaginationComponent,
24
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScCatalogModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.7", ngImport: i0, type: ScCatalogModule, declarations: [ScPriceListPaginationComponent,
26
26
  ScCategoryCardComponent,
27
27
  ScFavoriteButtonComponent,
28
28
  ScInputQuantityComponent,
@@ -56,7 +56,7 @@ export class ScCatalogModule {
56
56
  ScPriceWarehouseStockComponent,
57
57
  ScPriceHistoryComponent,
58
58
  ScCategoriesListComponent] }); }
59
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScCatalogModule, imports: [CommonModule,
59
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScCatalogModule, imports: [CommonModule,
60
60
  RouterModule,
61
61
  TuiIcon,
62
62
  TuiInputNumberModule,
@@ -68,7 +68,7 @@ export class ScCatalogModule {
68
68
  TuiAxes,
69
69
  TuiButtonLoading] }); }
70
70
  }
71
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScCatalogModule, decorators: [{
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScCatalogModule, decorators: [{
72
72
  type: NgModule,
73
73
  args: [{
74
74
  declarations: [
@@ -24,10 +24,10 @@ export class ScFavoriteBtnComponent {
24
24
  */
25
25
  this.disabled = false;
26
26
  }
27
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScFavoriteBtnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.3", type: ScFavoriteBtnComponent, selector: "sc-favorite-btn", inputs: { isFavorite: "isFavorite", showLoader: "showLoader", disabled: "disabled" }, outputs: { clickEvent: "clickEvent" }, ngImport: i0, template: "<button\n tuiIconButton\n (click)=\"clickEvent.emit()\"\n [disabled]=\"disabled\"\n [loading]=\"showLoader\"\n appearance=\"flat\"\n size=\"s\"\n>\n <tui-icon\n class=\"text-tui-primary\"\n [icon]=\"isFavorite ? '@tui.bookmark-filled' : '@tui.bookmark'\"\n ></tui-icon>\n</button>\n", dependencies: [{ kind: "directive", type: i1.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: i1.TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "component", type: i2.TuiButtonLoading, selector: "[tuiButton][loading],[tuiIconButton][loading]", inputs: ["size", "loading"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScFavoriteBtnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: ScFavoriteBtnComponent, selector: "sc-favorite-btn", inputs: { isFavorite: "isFavorite", showLoader: "showLoader", disabled: "disabled" }, outputs: { clickEvent: "clickEvent" }, ngImport: i0, template: "<button\n tuiIconButton\n (click)=\"clickEvent.emit()\"\n [disabled]=\"disabled\"\n [loading]=\"showLoader\"\n appearance=\"flat\"\n size=\"s\"\n>\n <tui-icon\n class=\"text-tui-primary\"\n [icon]=\"isFavorite ? '@tui.bookmark-filled' : '@tui.bookmark'\"\n ></tui-icon>\n</button>\n", dependencies: [{ kind: "directive", type: i1.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: i1.TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "component", type: i2.TuiButtonLoading, selector: "[tuiButton][loading],[tuiIconButton][loading]", inputs: ["size", "loading"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
29
29
  }
30
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScFavoriteBtnComponent, decorators: [{
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScFavoriteBtnComponent, decorators: [{
31
31
  type: Component,
32
32
  args: [{ selector: 'sc-favorite-btn', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n tuiIconButton\n (click)=\"clickEvent.emit()\"\n [disabled]=\"disabled\"\n [loading]=\"showLoader\"\n appearance=\"flat\"\n size=\"s\"\n>\n <tui-icon\n class=\"text-tui-primary\"\n [icon]=\"isFavorite ? '@tui.bookmark-filled' : '@tui.bookmark'\"\n ></tui-icon>\n</button>\n" }]
33
33
  }], propDecorators: { clickEvent: [{
@@ -76,10 +76,10 @@ export class ScAddContactDialogComponent {
76
76
  target: ScUserMetrikaGoalsEnum.userProfileContactAddShow,
77
77
  });
78
78
  }
79
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScAddContactDialogComponent, deps: [{ token: i1.ScContactsService }, { token: i1.ScConvertersService }, { token: i1.ScUserMetrikaService }, { token: POLYMORPHEUS_CONTEXT }], target: i0.ɵɵFactoryTarget.Component }); }
80
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.3", type: ScAddContactDialogComponent, selector: "sc-add-contact-dialog", ngImport: i0, template: "<form\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit.next()\"\n class=\"flex flex-col gap-3\"\n>\n <sc-new-contact-form [form]=\"form\"></sc-new-contact-form>\n <div class=\"flex justify-center gap-4\">\n <button\n tuiButton\n (click)=\"context.$implicit.complete()\"\n type=\"button\"\n iconStart=\"@tui.x\"\n appearance=\"secondary\"\n >\n \u041E\u0442\u043C\u0435\u043D\u0430\n </button>\n <button\n tuiButton\n [disabled]=\"form.invalid\"\n [loading]=\"!!(loading$ | async)\"\n type=\"submit\"\n iconStart=\"@tui.save\"\n >\n \u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C\n </button>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: i4.TuiButtonLoading, selector: "[tuiButton][loading],[tuiIconButton][loading]", inputs: ["size", "loading"] }, { kind: "component", type: i5.ScNewContactFormComponent, selector: "sc-new-contact-form", inputs: ["form"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
79
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScAddContactDialogComponent, deps: [{ token: i1.ScContactsService }, { token: i1.ScConvertersService }, { token: i1.ScUserMetrikaService }, { token: POLYMORPHEUS_CONTEXT }], target: i0.ɵɵFactoryTarget.Component }); }
80
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: ScAddContactDialogComponent, selector: "sc-add-contact-dialog", ngImport: i0, template: "<form\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit.next()\"\n class=\"flex flex-col gap-3\"\n>\n <sc-new-contact-form [form]=\"form\"></sc-new-contact-form>\n <div class=\"flex justify-center gap-4\">\n <button\n tuiButton\n (click)=\"context.$implicit.complete()\"\n type=\"button\"\n iconStart=\"@tui.x\"\n appearance=\"secondary\"\n >\n \u041E\u0442\u043C\u0435\u043D\u0430\n </button>\n <button\n tuiButton\n [disabled]=\"form.invalid\"\n [loading]=\"!!(loading$ | async)\"\n type=\"submit\"\n iconStart=\"@tui.save\"\n >\n \u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C\n </button>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: i4.TuiButtonLoading, selector: "[tuiButton][loading],[tuiIconButton][loading]", inputs: ["size", "loading"] }, { kind: "component", type: i5.ScNewContactFormComponent, selector: "sc-new-contact-form", inputs: ["form"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
81
81
  }
82
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScAddContactDialogComponent, decorators: [{
82
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScAddContactDialogComponent, decorators: [{
83
83
  type: Component,
84
84
  args: [{ selector: 'sc-add-contact-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<form\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit.next()\"\n class=\"flex flex-col gap-3\"\n>\n <sc-new-contact-form [form]=\"form\"></sc-new-contact-form>\n <div class=\"flex justify-center gap-4\">\n <button\n tuiButton\n (click)=\"context.$implicit.complete()\"\n type=\"button\"\n iconStart=\"@tui.x\"\n appearance=\"secondary\"\n >\n \u041E\u0442\u043C\u0435\u043D\u0430\n </button>\n <button\n tuiButton\n [disabled]=\"form.invalid\"\n [loading]=\"!!(loading$ | async)\"\n type=\"submit\"\n iconStart=\"@tui.save\"\n >\n \u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C\n </button>\n </div>\n</form>\n" }]
85
85
  }], ctorParameters: () => [{ type: i1.ScContactsService }, { type: i1.ScConvertersService }, { type: i1.ScUserMetrikaService }, { type: undefined, decorators: [{
@@ -22,10 +22,10 @@ export class ScContactsAccordionComponent {
22
22
  */
23
23
  this.deleteButtonClick = new EventEmitter();
24
24
  }
25
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScContactsAccordionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.3", type: ScContactsAccordionComponent, selector: "sc-contacts-accordion", inputs: { contacts$: "contacts$" }, outputs: { addContactClick: "addContactClick", deleteButtonClick: "deleteButtonClick" }, ngImport: i0, template: "<sc-accordion (addButtonClick)=\"addContactClick.emit()\">\n \u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B\n <ng-template scAccordionContent>\n <tui-loader\n *tuiLet=\"contacts$ | async as contacts\"\n [overlay]=\"true\"\n [showLoader]=\"contacts === null\"\n >\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"!contacts || contacts.length; else contactsNotExist\">\n <div\n *ngFor=\"let contact of contacts\"\n class=\"flex gap-2 border-b border-tui-base-03\"\n >\n <div class=\"flex grow flex-col gap-2\">\n {{ contact.name }}\n <a\n tuiLink\n [scTelLink]=\"contact.phone\"\n iconStart=\"@tui.phone\"\n \n [pseudo]=\"true\"\n href=\"tel:{{ contact.phone | scFormatePhone }}\"\n >{{ contact.phone | scFormatePhone }}</a\n >\n <a\n tuiLink\n iconStart=\"@tui.mail\"\n \n [pseudo]=\"true\"\n href=\"mailto:{{ contact.email }}\"\n >\n {{ contact.email }}\n </a>\n </div>\n <!-- \u0424\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E. -->\n <!-- <div class=\"flex flex-col md:flex-row gap-1\">\n <button\n tuiIconButton\n size=\"m\"\n type=\"button\"\n icon=\"@tui.trash-2\"\n appearance=\"flat\"\n (click)=\"$event.stopPropagation(); deleteButtonClick.emit(contact)\"\n ></button>\n </div> -->\n </div>\n </ng-container>\n\n <ng-template #contactsNotExist>\n <tui-notification size=\"l\"><div>\n <div class=\"flex flex-wrap gap-2 font-medium\">\u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B.</div>\n </div></tui-notification>\n </ng-template>\n </div>\n </tui-loader>\n </ng-template>\n</sc-accordion>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ScAccordionComponent, selector: "sc-accordion", inputs: ["showAddButton", "showDeleteButton", "showArrow", "open", "size"], outputs: ["addButtonClick", "deleteButtonClick"] }, { kind: "directive", type: i3.ScAccordionContentDirective, selector: "ng-template[scAccordionContent]" }, { kind: "component", type: i4.TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "directive", type: i5.TuiLet, selector: "[tuiLet]", inputs: ["tuiLet"] }, { kind: "directive", type: i4.TuiNotification, selector: "tui-notification,a[tuiNotification],button[tuiNotification]", inputs: ["appearance", "icon", "size"] }, { kind: "directive", type: i4.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type: i6.ScTerminalLinkDirective, selector: "a[href]" }, { kind: "directive", type: i7.ScTelLinkDirective, selector: "[scTelLink]", inputs: ["scTelLink"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.ScFormatePhonePipe, name: "scFormatePhone" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScContactsAccordionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: ScContactsAccordionComponent, selector: "sc-contacts-accordion", inputs: { contacts$: "contacts$" }, outputs: { addContactClick: "addContactClick", deleteButtonClick: "deleteButtonClick" }, ngImport: i0, template: "<sc-accordion (addButtonClick)=\"addContactClick.emit()\">\n \u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B\n <ng-template scAccordionContent>\n <tui-loader\n *tuiLet=\"contacts$ | async as contacts\"\n [overlay]=\"true\"\n [showLoader]=\"contacts === null\"\n >\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"!contacts || contacts.length; else contactsNotExist\">\n <div\n *ngFor=\"let contact of contacts\"\n class=\"flex gap-2 border-b border-tui-base-03\"\n >\n <div class=\"flex grow flex-col gap-2\">\n {{ contact.name }}\n <a\n tuiLink\n [scTelLink]=\"contact.phone\"\n iconStart=\"@tui.phone\"\n \n [pseudo]=\"true\"\n href=\"tel:{{ contact.phone | scFormatePhone }}\"\n >{{ contact.phone | scFormatePhone }}</a\n >\n <a\n tuiLink\n iconStart=\"@tui.mail\"\n \n [pseudo]=\"true\"\n href=\"mailto:{{ contact.email }}\"\n >\n {{ contact.email }}\n </a>\n </div>\n <!-- \u0424\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E. -->\n <!-- <div class=\"flex flex-col md:flex-row gap-1\">\n <button\n tuiIconButton\n size=\"m\"\n type=\"button\"\n icon=\"@tui.trash-2\"\n appearance=\"flat\"\n (click)=\"$event.stopPropagation(); deleteButtonClick.emit(contact)\"\n ></button>\n </div> -->\n </div>\n </ng-container>\n\n <ng-template #contactsNotExist>\n <tui-notification size=\"l\"><div>\n <div class=\"flex flex-wrap gap-2 font-medium\">\u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B.</div>\n </div></tui-notification>\n </ng-template>\n </div>\n </tui-loader>\n </ng-template>\n</sc-accordion>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ScAccordionComponent, selector: "sc-accordion", inputs: ["showAddButton", "showDeleteButton", "showArrow", "open", "size"], outputs: ["addButtonClick", "deleteButtonClick"] }, { kind: "directive", type: i3.ScAccordionContentDirective, selector: "ng-template[scAccordionContent]" }, { kind: "component", type: i4.TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "directive", type: i5.TuiLet, selector: "[tuiLet]", inputs: ["tuiLet"] }, { kind: "directive", type: i4.TuiNotification, selector: "tui-notification,a[tuiNotification],button[tuiNotification]", inputs: ["appearance", "icon", "size"] }, { kind: "directive", type: i4.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type: i6.ScTerminalLinkDirective, selector: "a[href]" }, { kind: "directive", type: i7.ScTelLinkDirective, selector: "[scTelLink]", inputs: ["scTelLink"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.ScFormatePhonePipe, name: "scFormatePhone" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
27
27
  }
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: ScContactsAccordionComponent, decorators: [{
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ScContactsAccordionComponent, decorators: [{
29
29
  type: Component,
30
30
  args: [{ selector: 'sc-contacts-accordion', changeDetection: ChangeDetectionStrategy.OnPush, template: "<sc-accordion (addButtonClick)=\"addContactClick.emit()\">\n \u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B\n <ng-template scAccordionContent>\n <tui-loader\n *tuiLet=\"contacts$ | async as contacts\"\n [overlay]=\"true\"\n [showLoader]=\"contacts === null\"\n >\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"!contacts || contacts.length; else contactsNotExist\">\n <div\n *ngFor=\"let contact of contacts\"\n class=\"flex gap-2 border-b border-tui-base-03\"\n >\n <div class=\"flex grow flex-col gap-2\">\n {{ contact.name }}\n <a\n tuiLink\n [scTelLink]=\"contact.phone\"\n iconStart=\"@tui.phone\"\n \n [pseudo]=\"true\"\n href=\"tel:{{ contact.phone | scFormatePhone }}\"\n >{{ contact.phone | scFormatePhone }}</a\n >\n <a\n tuiLink\n iconStart=\"@tui.mail\"\n \n [pseudo]=\"true\"\n href=\"mailto:{{ contact.email }}\"\n >\n {{ contact.email }}\n </a>\n </div>\n <!-- \u0424\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E. -->\n <!-- <div class=\"flex flex-col md:flex-row gap-1\">\n <button\n tuiIconButton\n size=\"m\"\n type=\"button\"\n icon=\"@tui.trash-2\"\n appearance=\"flat\"\n (click)=\"$event.stopPropagation(); deleteButtonClick.emit(contact)\"\n ></button>\n </div> -->\n </div>\n </ng-container>\n\n <ng-template #contactsNotExist>\n <tui-notification size=\"l\"><div>\n <div class=\"flex flex-wrap gap-2 font-medium\">\u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B.</div>\n </div></tui-notification>\n </ng-template>\n </div>\n </tui-loader>\n </ng-template>\n</sc-accordion>\n" }]
31
31
  }], propDecorators: { contacts$: [{