ng-easycommerce-v18 0.2.21 → 0.2.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,18 +1,58 @@
1
- import { Component, inject } from '@angular/core';
1
+ import { Component, inject, Input } from '@angular/core';
2
2
  import { ProductDetailService } from '../../ec-services';
3
+ import { ParametersService } from '../../ec-services';
3
4
  import { AsyncPipe } from '@angular/common';
5
+ import { CommonModule } from '@angular/common';
6
+ import { CoreConstantsService } from "../../constants";
4
7
  import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common";
5
9
  export class VariantsEcComponent {
6
10
  _productDetailsService = inject(ProductDetailService);
11
+ _parametersService = inject(ParametersService);
12
+ consts = inject(CoreConstantsService);
13
+ params = {};
14
+ parameters$ = this._parametersService.getParameters();
7
15
  options$ = this._productDetailsService.options$;
16
+ setImages;
17
+ product;
18
+ itemSelected;
19
+ mediaUrl = this.consts.mediaUrl();
20
+ /**
21
+ * Funcion para saber si existen un parametro.
22
+ */
23
+ hasParams = this._parametersService.hasParams;
8
24
  setOption(optionCode, optionValue) {
9
25
  this._productDetailsService.setOption(optionCode, optionValue);
26
+ console.log('Option set:', optionCode, optionValue);
27
+ }
28
+ setValuesImages = (color, optCode) => {
29
+ if (this.setImages) {
30
+ this.setImages(color, optCode);
31
+ }
32
+ return true;
33
+ };
34
+ chosenOption = (option, value) => {
35
+ this.setOption(option, value);
36
+ this.itemSelected = value;
37
+ return true;
38
+ };
39
+ getValueSelect = (options) => {
40
+ let res = options.filter(elem => elem.selected);
41
+ return res && (res.length > 0) ? res[0].name : options[0].name;
42
+ };
43
+ revisarStock(index) {
44
+ let products = this.product.variants;
45
+ return products[index].stock;
10
46
  }
11
47
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: VariantsEcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: VariantsEcComponent, isStandalone: true, selector: "app-variants-ec", ngImport: i0, template: "@if(options$ | async; as options){\r\n@if(options && options.length ){\r\n@for(option of options; track $index){\r\n@switch (option.type) {\r\n@case ('color') {\r\n@if(option.values && option.values.length > 1) {\r\n<h5>Colores disponibles</h5>\r\n<div class=\"row w-100 mx-auto pb-3 mb-3\">\r\n @for(value of option.values; track $index; let x = $index){\r\n <a role=\"button\" [title]=\"value.description\" (click)=\"setOption(option.code, value.name)\"\r\n [class]=\"'item m-1 circle ' + (value.selected ? 'shadow' : '')\" [id]=\"x + value.name\"\r\n [style.background]=\"'#' + value.name\" [style.box-shadow]=\"(value.selected ? '0px 0px 0px 2px #000' : 'none')\">\r\n </a>\r\n }\r\n</div>\r\n}\r\n}\r\n@case ('size') {\r\n@if(option.values && option.values.length > 1) {\r\n<h5>Talles displonibles</h5>\r\n<div class=\"row w-100 mx-auto pb-3\">\r\n @for(value of option.values; track $index; let x = $index){\r\n <a role=\"buttom\" (click)=\"setOption(option.code, value.name)\" [id]=\"x + value.name\"\r\n [class]=\"'btn item m-1 ' + (value.selected ? 'selected-size' : 'unselected-size')\">\r\n {{ value.name }}\r\n </a>\r\n }\r\n\r\n</div>\r\n}\r\n}\r\n@default {\r\n\r\n}\r\n}\r\n}\r\n}\r\n}", styles: [".circle{width:32px;height:32px;border-radius:50%}.shadow{border:1px solid #000}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }] });
48
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: VariantsEcComponent, isStandalone: true, selector: "app-variants-ec", inputs: { setImages: "setImages", product: "product" }, ngImport: i0, template: "@if(options$ | async; as options){\r\n@if(options && options.length ){\r\n@for(option of options; track $index){\r\n\r\n@switch (option.type) {\r\n@case ('color') {\r\n@if(option.values && option.values.length > 1) {\r\n<h5>{{option.name | uppercase}}</h5>\r\n<div class=\"row w-100 mx-auto pb-3 mb-3\">\r\n @for(value of option.values; track $index; let x = $index){\r\n <a role=\"button\" (click)=\"setValuesImages(value.name, option.code) && setOption(option.code, value.name)\"\r\n [class]=\"'rounded-circle color-item m-1 ' + (value.selected ? 'shadow' : '')\" [id]=\"x + value.name\"\r\n [style.border]=\"'1px solid black'\"\r\n [style.background]=\"value.image && (value.image.endsWith('.jpg') || value.image.endsWith('.png') || value.image.endsWith('.svg')) ? 'url(' + this.consts.mediaUrl(value.image) + ')' : '#' + value.name\"\r\n [style.background-size]=\"'cover'\" [style.background-repeat]=\"'no-repeat'\" [style.background-position]=\"'center'\"\r\n [style.box-shadow]=\"(value.selected ? '0px 0px 0px 2px #000' : 'none')\"></a>\r\n }\r\n</div>\r\n}\r\n}\r\n@case ('size') {\r\n@if(option.values && option.values.length > 1) {\r\n<h5>{{option.name | uppercase}}</h5>\r\n<div class=\"row w-100 mx-auto pb-3\">\r\n <div class=\"btn-group ps-0\">\r\n <a class=\"btn btn-light dropdown-toggle cursor-pointer border border-1 d-flex flex-row justify-content-between align-items-center\"\r\n data-bs-toggle=\"dropdown\" aria-expanded=\"false\"> {{ itemSelected ? itemSelected :\r\n getValueSelect(option.values)}}</a>\r\n <ul class=\"dropdown-menu\">\r\n @for(value of option.values; track $index; let x = $index){\r\n <li [class]=\" (value.selected ? 'selected-size' : 'unselected-size')\">\r\n <a [class]=\"'dropdown-item cursor-pointer '+ (value.selected ? 'text-light' : '')\"\r\n (click)=\"chosenOption(option.code, value.name)\">{{ value.name }}</a>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n\r\n</div>\r\n}\r\n}\r\n@default {\r\n\r\n}\r\n}\r\n}\r\n}\r\n}", styles: [".circle{width:32px;height:32px;border-radius:50%}.shadow{border:1px solid #000}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }] });
13
49
  }
14
50
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: VariantsEcComponent, decorators: [{
15
51
  type: Component,
16
- args: [{ selector: 'app-variants-ec', standalone: true, imports: [AsyncPipe], template: "@if(options$ | async; as options){\r\n@if(options && options.length ){\r\n@for(option of options; track $index){\r\n@switch (option.type) {\r\n@case ('color') {\r\n@if(option.values && option.values.length > 1) {\r\n<h5>Colores disponibles</h5>\r\n<div class=\"row w-100 mx-auto pb-3 mb-3\">\r\n @for(value of option.values; track $index; let x = $index){\r\n <a role=\"button\" [title]=\"value.description\" (click)=\"setOption(option.code, value.name)\"\r\n [class]=\"'item m-1 circle ' + (value.selected ? 'shadow' : '')\" [id]=\"x + value.name\"\r\n [style.background]=\"'#' + value.name\" [style.box-shadow]=\"(value.selected ? '0px 0px 0px 2px #000' : 'none')\">\r\n </a>\r\n }\r\n</div>\r\n}\r\n}\r\n@case ('size') {\r\n@if(option.values && option.values.length > 1) {\r\n<h5>Talles displonibles</h5>\r\n<div class=\"row w-100 mx-auto pb-3\">\r\n @for(value of option.values; track $index; let x = $index){\r\n <a role=\"buttom\" (click)=\"setOption(option.code, value.name)\" [id]=\"x + value.name\"\r\n [class]=\"'btn item m-1 ' + (value.selected ? 'selected-size' : 'unselected-size')\">\r\n {{ value.name }}\r\n </a>\r\n }\r\n\r\n</div>\r\n}\r\n}\r\n@default {\r\n\r\n}\r\n}\r\n}\r\n}\r\n}", styles: [".circle{width:32px;height:32px;border-radius:50%}.shadow{border:1px solid #000}\n"] }]
17
- }] });
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFudHMtZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvdmFyaWFudHMtZWMvdmFyaWFudHMtZWMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvdmFyaWFudHMtZWMvdmFyaWFudHMtZWMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQVM1QyxNQUFNLE9BQU8sbUJBQW1CO0lBQ3ZCLHNCQUFzQixHQUF5QixNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM3RSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQztJQUV2RCxTQUFTLENBQUMsVUFBYyxFQUFFLFdBQWU7UUFDdEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDakUsQ0FBQzt3R0FOVSxtQkFBbUI7NEZBQW5CLG1CQUFtQiwyRUNYaEMsc3VDQXFDQyxzSUQ5QlcsU0FBUzs7NEZBSVIsbUJBQW1CO2tCQVAvQixTQUFTOytCQUNFLGlCQUFpQixjQUNmLElBQUksV0FDUCxDQUFDLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQcm9kdWN0RGV0YWlsU2VydmljZSB9IGZyb20gJy4uLy4uL2VjLXNlcnZpY2VzJztcclxuaW1wb3J0IHsgQXN5bmNQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXZhcmlhbnRzLWVjJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtBc3luY1BpcGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi92YXJpYW50cy1lYy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3ZhcmlhbnRzLWVjLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVmFyaWFudHNFY0NvbXBvbmVudCB7XHJcblx0cHJpdmF0ZSBfcHJvZHVjdERldGFpbHNTZXJ2aWNlOiBQcm9kdWN0RGV0YWlsU2VydmljZSA9IGluamVjdChQcm9kdWN0RGV0YWlsU2VydmljZSk7XHJcblx0cHVibGljIG9wdGlvbnMkID0gdGhpcy5fcHJvZHVjdERldGFpbHNTZXJ2aWNlLm9wdGlvbnMkO1xyXG5cdFxyXG5cdHNldE9wdGlvbihvcHRpb25Db2RlOmFueSwgb3B0aW9uVmFsdWU6YW55KSB7XHJcbiAgICB0aGlzLl9wcm9kdWN0RGV0YWlsc1NlcnZpY2Uuc2V0T3B0aW9uKG9wdGlvbkNvZGUsIG9wdGlvblZhbHVlKTtcclxuICB9XHJcblx0XHJcbn1cclxuIiwiQGlmKG9wdGlvbnMkIHwgYXN5bmM7IGFzIG9wdGlvbnMpe1xyXG5AaWYob3B0aW9ucyAmJiBvcHRpb25zLmxlbmd0aCApe1xyXG5AZm9yKG9wdGlvbiBvZiBvcHRpb25zOyB0cmFjayAkaW5kZXgpe1xyXG5Ac3dpdGNoIChvcHRpb24udHlwZSkge1xyXG5AY2FzZSAoJ2NvbG9yJykge1xyXG5AaWYob3B0aW9uLnZhbHVlcyAmJiBvcHRpb24udmFsdWVzLmxlbmd0aCA+IDEpIHtcclxuPGg1PkNvbG9yZXMgZGlzcG9uaWJsZXM8L2g1PlxyXG48ZGl2IGNsYXNzPVwicm93IHctMTAwIG14LWF1dG8gcGItMyBtYi0zXCI+XHJcbiAgICBAZm9yKHZhbHVlIG9mIG9wdGlvbi52YWx1ZXM7IHRyYWNrICRpbmRleDsgbGV0IHggPSAkaW5kZXgpe1xyXG4gICAgPGEgcm9sZT1cImJ1dHRvblwiIFt0aXRsZV09XCJ2YWx1ZS5kZXNjcmlwdGlvblwiIChjbGljayk9XCJzZXRPcHRpb24ob3B0aW9uLmNvZGUsIHZhbHVlLm5hbWUpXCJcclxuICAgICAgICBbY2xhc3NdPVwiJ2l0ZW0gbS0xIGNpcmNsZSAnICsgKHZhbHVlLnNlbGVjdGVkID8gJ3NoYWRvdycgOiAnJylcIiBbaWRdPVwieCArIHZhbHVlLm5hbWVcIlxyXG4gICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cIicjJyArIHZhbHVlLm5hbWVcIiBbc3R5bGUuYm94LXNoYWRvd109XCIodmFsdWUuc2VsZWN0ZWQgPyAnMHB4IDBweCAwcHggMnB4ICMwMDAnIDogJ25vbmUnKVwiPlxyXG4gICAgPC9hPlxyXG4gICAgfVxyXG48L2Rpdj5cclxufVxyXG59XHJcbkBjYXNlICgnc2l6ZScpIHtcclxuQGlmKG9wdGlvbi52YWx1ZXMgJiYgb3B0aW9uLnZhbHVlcy5sZW5ndGggPiAxKSB7XHJcbjxoNT5UYWxsZXMgZGlzcGxvbmlibGVzPC9oNT5cclxuPGRpdiBjbGFzcz1cInJvdyB3LTEwMCBteC1hdXRvIHBiLTNcIj5cclxuICAgIEBmb3IodmFsdWUgb2Ygb3B0aW9uLnZhbHVlczsgdHJhY2sgJGluZGV4OyBsZXQgeCA9ICRpbmRleCl7XHJcbiAgICA8YSByb2xlPVwiYnV0dG9tXCIgKGNsaWNrKT1cInNldE9wdGlvbihvcHRpb24uY29kZSwgdmFsdWUubmFtZSlcIiBbaWRdPVwieCArIHZhbHVlLm5hbWVcIlxyXG4gICAgICAgIFtjbGFzc109XCInYnRuIGl0ZW0gbS0xICcgKyAodmFsdWUuc2VsZWN0ZWQgPyAnc2VsZWN0ZWQtc2l6ZScgOiAndW5zZWxlY3RlZC1zaXplJylcIj5cclxuICAgICAgICB7eyB2YWx1ZS5uYW1lIH19XHJcbiAgICA8L2E+XHJcbiAgICB9XHJcblxyXG48L2Rpdj5cclxufVxyXG59XHJcbkBkZWZhdWx0IHtcclxuXHJcbn1cclxufVxyXG59XHJcbn1cclxufSJdfQ==
52
+ args: [{ selector: 'app-variants-ec', standalone: true, imports: [AsyncPipe, CommonModule], template: "@if(options$ | async; as options){\r\n@if(options && options.length ){\r\n@for(option of options; track $index){\r\n\r\n@switch (option.type) {\r\n@case ('color') {\r\n@if(option.values && option.values.length > 1) {\r\n<h5>{{option.name | uppercase}}</h5>\r\n<div class=\"row w-100 mx-auto pb-3 mb-3\">\r\n @for(value of option.values; track $index; let x = $index){\r\n <a role=\"button\" (click)=\"setValuesImages(value.name, option.code) && setOption(option.code, value.name)\"\r\n [class]=\"'rounded-circle color-item m-1 ' + (value.selected ? 'shadow' : '')\" [id]=\"x + value.name\"\r\n [style.border]=\"'1px solid black'\"\r\n [style.background]=\"value.image && (value.image.endsWith('.jpg') || value.image.endsWith('.png') || value.image.endsWith('.svg')) ? 'url(' + this.consts.mediaUrl(value.image) + ')' : '#' + value.name\"\r\n [style.background-size]=\"'cover'\" [style.background-repeat]=\"'no-repeat'\" [style.background-position]=\"'center'\"\r\n [style.box-shadow]=\"(value.selected ? '0px 0px 0px 2px #000' : 'none')\"></a>\r\n }\r\n</div>\r\n}\r\n}\r\n@case ('size') {\r\n@if(option.values && option.values.length > 1) {\r\n<h5>{{option.name | uppercase}}</h5>\r\n<div class=\"row w-100 mx-auto pb-3\">\r\n <div class=\"btn-group ps-0\">\r\n <a class=\"btn btn-light dropdown-toggle cursor-pointer border border-1 d-flex flex-row justify-content-between align-items-center\"\r\n data-bs-toggle=\"dropdown\" aria-expanded=\"false\"> {{ itemSelected ? itemSelected :\r\n getValueSelect(option.values)}}</a>\r\n <ul class=\"dropdown-menu\">\r\n @for(value of option.values; track $index; let x = $index){\r\n <li [class]=\" (value.selected ? 'selected-size' : 'unselected-size')\">\r\n <a [class]=\"'dropdown-item cursor-pointer '+ (value.selected ? 'text-light' : '')\"\r\n (click)=\"chosenOption(option.code, value.name)\">{{ value.name }}</a>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n\r\n</div>\r\n}\r\n}\r\n@default {\r\n\r\n}\r\n}\r\n}\r\n}\r\n}", styles: [".circle{width:32px;height:32px;border-radius:50%}.shadow{border:1px solid #000}\n"] }]
53
+ }], propDecorators: { setImages: [{
54
+ type: Input
55
+ }], product: [{
56
+ type: Input
57
+ }] } });
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFudHMtZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvdmFyaWFudHMtZWMvdmFyaWFudHMtZWMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvdmFyaWFudHMtZWMvdmFyaWFudHMtZWMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQVl2RCxNQUFNLE9BQU8sbUJBQW1CO0lBQ3RCLHNCQUFzQixHQUF5QixNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM1RSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUUvQyxNQUFNLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUE7SUFDckMsTUFBTSxHQUFRLEVBQUUsQ0FBQztJQUNqQixXQUFXLEdBQW1DLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUdyRixRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQztJQUM5QyxTQUFTLENBQXNDO0lBQy9DLE9BQU8sQ0FBTTtJQUNmLFlBQVksQ0FBTTtJQUNuQixRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUN4Qzs7T0FFRztJQUNJLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFBO0lBR25ELFNBQVMsQ0FBQyxVQUFlLEVBQUUsV0FBZ0I7UUFDekMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDL0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDRCxlQUFlLEdBQUcsQ0FBQyxLQUFVLEVBQUUsT0FBWSxFQUFFLEVBQUU7UUFDN0MsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFBO0lBQ0QsWUFBWSxHQUFHLENBQUMsTUFBVyxFQUFFLEtBQVUsRUFBRSxFQUFFO1FBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFBO1FBQ3pCLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQyxDQUFBO0lBRUQsY0FBYyxHQUFHLENBQUMsT0FBYyxFQUFFLEVBQUU7UUFDbEMsSUFBSSxHQUFHLEdBQVEsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNwRCxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDaEUsQ0FBQyxDQUFBO0lBQ0EsWUFBWSxDQUFDLEtBQWE7UUFFckIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUE7UUFDcEMsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBRWpDLENBQUM7d0dBN0NRLG1CQUFtQjs0RkFBbkIsbUJBQW1CLG1JQ2pCaEMsNGxFQStDQyxzSURsQ1csU0FBUyw2Q0FBRSxZQUFZOzs0RkFJdEIsbUJBQW1CO2tCQVAvQixTQUFTOytCQUNFLGlCQUFpQixjQUNmLElBQUksV0FDUCxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUM7OEJBY3pCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFByb2R1Y3REZXRhaWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZWMtc2VydmljZXMnO1xyXG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uLy4uL2VjLXNlcnZpY2VzJztcclxuaW1wb3J0IHsgQXN5bmNQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29yZUNvbnN0YW50c1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtdmFyaWFudHMtZWMnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0FzeW5jUGlwZSwgQ29tbW9uTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vdmFyaWFudHMtZWMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi92YXJpYW50cy1lYy5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFZhcmlhbnRzRWNDb21wb25lbnQge1xyXG4gIHByaXZhdGUgX3Byb2R1Y3REZXRhaWxzU2VydmljZTogUHJvZHVjdERldGFpbFNlcnZpY2UgPSBpbmplY3QoUHJvZHVjdERldGFpbFNlcnZpY2UpO1xyXG4gIHByaXZhdGUgX3BhcmFtZXRlcnNTZXJ2aWNlID0gaW5qZWN0KFBhcmFtZXRlcnNTZXJ2aWNlKVxyXG5cclxuICBwdWJsaWMgY29uc3RzID0gaW5qZWN0KENvcmVDb25zdGFudHNTZXJ2aWNlKVxyXG4gIHB1YmxpYyBwYXJhbXM6IGFueSA9IHt9O1xyXG4gIHB1YmxpYyBwYXJhbWV0ZXJzJDogT2JzZXJ2YWJsZTxQYXJhbWV0ZXJbXSB8IG51bGw+ID0gdGhpcy5fcGFyYW1ldGVyc1NlcnZpY2UuZ2V0UGFyYW1ldGVycygpXHJcblxyXG4gIFxyXG4gIHB1YmxpYyBvcHRpb25zJCA9IHRoaXMuX3Byb2R1Y3REZXRhaWxzU2VydmljZS5vcHRpb25zJDtcclxuICBASW5wdXQoKSBzZXRJbWFnZXM/OiAoY29sb3I6IGFueSwgb3B0Q29kZTogYW55KSA9PiB2b2lkO1xyXG4gIEBJbnB1dCgpIHByb2R1Y3Q6IGFueTtcclxuICBwdWJsaWMgaXRlbVNlbGVjdGVkOiBhbnk7XHJcblx0cHVibGljIG1lZGlhVXJsID0gdGhpcy5jb25zdHMubWVkaWFVcmwoKVxyXG5cdC8qKlxyXG5cdCAqIEZ1bmNpb24gcGFyYSBzYWJlciBzaSBleGlzdGVuIHVuIHBhcmFtZXRyby4gXHJcblx0ICovXHJcblx0cHVibGljIGhhc1BhcmFtcyA9IHRoaXMuX3BhcmFtZXRlcnNTZXJ2aWNlLmhhc1BhcmFtc1xyXG5cclxuXHJcbiAgc2V0T3B0aW9uKG9wdGlvbkNvZGU6IGFueSwgb3B0aW9uVmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5fcHJvZHVjdERldGFpbHNTZXJ2aWNlLnNldE9wdGlvbihvcHRpb25Db2RlLCBvcHRpb25WYWx1ZSk7XHJcbiAgICBjb25zb2xlLmxvZygnT3B0aW9uIHNldDonLCBvcHRpb25Db2RlLCBvcHRpb25WYWx1ZSk7XHJcbiAgfVxyXG4gIHNldFZhbHVlc0ltYWdlcyA9IChjb2xvcjogYW55LCBvcHRDb2RlOiBhbnkpID0+IHtcclxuICAgIGlmICh0aGlzLnNldEltYWdlcykge1xyXG4gICAgICB0aGlzLnNldEltYWdlcyhjb2xvciwgb3B0Q29kZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgY2hvc2VuT3B0aW9uID0gKG9wdGlvbjogYW55LCB2YWx1ZTogYW55KSA9PiB7XHJcbiAgICB0aGlzLnNldE9wdGlvbihvcHRpb24sIHZhbHVlKVxyXG4gICAgdGhpcy5pdGVtU2VsZWN0ZWQgPSB2YWx1ZVxyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcblxyXG4gIGdldFZhbHVlU2VsZWN0ID0gKG9wdGlvbnM6IGFueVtdKSA9PiB7XHJcbiAgICBsZXQgcmVzOiBhbnkgPSBvcHRpb25zLmZpbHRlcihlbGVtID0+IGVsZW0uc2VsZWN0ZWQpXHJcbiAgICByZXR1cm4gcmVzICYmIChyZXMubGVuZ3RoID4gMCkgPyByZXNbMF0ubmFtZSA6IG9wdGlvbnNbMF0ubmFtZVxyXG4gIH1cclxuICAgcmV2aXNhclN0b2NrKGluZGV4OiBudW1iZXIpIHtcclxuXHJcbiAgICAgICAgbGV0IHByb2R1Y3RzID0gdGhpcy5wcm9kdWN0LnZhcmlhbnRzXHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3RzW2luZGV4XS5zdG9jaztcclxuXHJcbiAgICB9XHJcbn1cclxuIiwiQGlmKG9wdGlvbnMkIHwgYXN5bmM7IGFzIG9wdGlvbnMpe1xyXG5AaWYob3B0aW9ucyAmJiBvcHRpb25zLmxlbmd0aCApe1xyXG5AZm9yKG9wdGlvbiBvZiBvcHRpb25zOyB0cmFjayAkaW5kZXgpe1xyXG5cclxuQHN3aXRjaCAob3B0aW9uLnR5cGUpIHtcclxuQGNhc2UgKCdjb2xvcicpIHtcclxuQGlmKG9wdGlvbi52YWx1ZXMgJiYgb3B0aW9uLnZhbHVlcy5sZW5ndGggPiAxKSB7XHJcbjxoNT57e29wdGlvbi5uYW1lIHwgdXBwZXJjYXNlfX08L2g1PlxyXG48ZGl2IGNsYXNzPVwicm93IHctMTAwIG14LWF1dG8gcGItMyBtYi0zXCI+XHJcbiAgICBAZm9yKHZhbHVlIG9mIG9wdGlvbi52YWx1ZXM7IHRyYWNrICRpbmRleDsgbGV0IHggPSAkaW5kZXgpe1xyXG4gICAgPGEgcm9sZT1cImJ1dHRvblwiIChjbGljayk9XCJzZXRWYWx1ZXNJbWFnZXModmFsdWUubmFtZSwgb3B0aW9uLmNvZGUpICYmIHNldE9wdGlvbihvcHRpb24uY29kZSwgdmFsdWUubmFtZSlcIlxyXG4gICAgICAgIFtjbGFzc109XCIncm91bmRlZC1jaXJjbGUgY29sb3ItaXRlbSBtLTEgJyArICh2YWx1ZS5zZWxlY3RlZCA/ICdzaGFkb3cnIDogJycpXCIgW2lkXT1cInggKyB2YWx1ZS5uYW1lXCJcclxuICAgICAgICBbc3R5bGUuYm9yZGVyXT1cIicxcHggc29saWQgYmxhY2snXCJcclxuICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJ2YWx1ZS5pbWFnZSAmJiAodmFsdWUuaW1hZ2UuZW5kc1dpdGgoJy5qcGcnKSB8fCB2YWx1ZS5pbWFnZS5lbmRzV2l0aCgnLnBuZycpIHx8IHZhbHVlLmltYWdlLmVuZHNXaXRoKCcuc3ZnJykpID8gJ3VybCgnICsgdGhpcy5jb25zdHMubWVkaWFVcmwodmFsdWUuaW1hZ2UpICsgJyknIDogJyMnICsgdmFsdWUubmFtZVwiXHJcbiAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtc2l6ZV09XCInY292ZXInXCIgW3N0eWxlLmJhY2tncm91bmQtcmVwZWF0XT1cIiduby1yZXBlYXQnXCIgW3N0eWxlLmJhY2tncm91bmQtcG9zaXRpb25dPVwiJ2NlbnRlcidcIlxyXG4gICAgICAgIFtzdHlsZS5ib3gtc2hhZG93XT1cIih2YWx1ZS5zZWxlY3RlZCA/ICcwcHggMHB4IDBweCAycHggIzAwMCcgOiAnbm9uZScpXCI+PC9hPlxyXG4gICAgfVxyXG48L2Rpdj5cclxufVxyXG59XHJcbkBjYXNlICgnc2l6ZScpIHtcclxuQGlmKG9wdGlvbi52YWx1ZXMgJiYgb3B0aW9uLnZhbHVlcy5sZW5ndGggPiAxKSB7XHJcbjxoNT57e29wdGlvbi5uYW1lIHwgdXBwZXJjYXNlfX08L2g1PlxyXG48ZGl2IGNsYXNzPVwicm93IHctMTAwIG14LWF1dG8gcGItM1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBwcy0wXCI+XHJcbiAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGRyb3Bkb3duLXRvZ2dsZSBjdXJzb3ItcG9pbnRlciBib3JkZXIgYm9yZGVyLTEgZC1mbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj4ge3sgaXRlbVNlbGVjdGVkID8gaXRlbVNlbGVjdGVkIDpcclxuICAgICAgICAgICAgZ2V0VmFsdWVTZWxlY3Qob3B0aW9uLnZhbHVlcyl9fTwvYT5cclxuICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICAgIEBmb3IodmFsdWUgb2Ygb3B0aW9uLnZhbHVlczsgdHJhY2sgJGluZGV4OyBsZXQgeCA9ICRpbmRleCl7XHJcbiAgICAgICAgICAgIDxsaSBbY2xhc3NdPVwiICh2YWx1ZS5zZWxlY3RlZCA/ICdzZWxlY3RlZC1zaXplJyA6ICd1bnNlbGVjdGVkLXNpemUnKVwiPlxyXG4gICAgICAgICAgICAgICAgPGEgW2NsYXNzXT1cIidkcm9wZG93bi1pdGVtIGN1cnNvci1wb2ludGVyICcrICh2YWx1ZS5zZWxlY3RlZCA/ICd0ZXh0LWxpZ2h0JyA6ICcnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNob3Nlbk9wdGlvbihvcHRpb24uY29kZSwgdmFsdWUubmFtZSlcIj57eyB2YWx1ZS5uYW1lIH19PC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgPC91bD5cclxuICAgIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcbn1cclxufVxyXG5AZGVmYXVsdCB7XHJcblxyXG59XHJcbn1cclxufVxyXG59XHJcbn0iXX0=