ng-easycommerce 0.0.681 → 0.0.682

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +14 -0
  2. package/bundles/ng-easycommerce.umd.js +870 -57
  3. package/bundles/ng-easycommerce.umd.js.map +1 -1
  4. package/bundles/ng-easycommerce.umd.min.js +1 -1
  5. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  6. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +230 -2
  7. package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +6 -3
  8. package/esm2015/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +13 -4
  9. package/esm2015/lib/ec-component/index.js +4 -1
  10. package/esm2015/lib/ec-component/sidebar-ec/sidebar-ec.component.js +61 -1
  11. package/esm2015/lib/ec-component/widgets-ec/unit-promotion-price-ec/unit-promotion-price-ec.component.js +268 -0
  12. package/esm2015/lib/interfaces/cart-item.js +1 -1
  13. package/esm2015/lib/services/cart.service.js +186 -14
  14. package/esm2015/lib/services/checkout/checkout.service.js +2 -2
  15. package/esm2015/lib/utils/order-util.service.js +87 -1
  16. package/esm2015/public-api.js +2 -1
  17. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +236 -2
  18. package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +6 -3
  19. package/esm5/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +13 -4
  20. package/esm5/lib/ec-component/index.js +4 -1
  21. package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +61 -1
  22. package/esm5/lib/ec-component/widgets-ec/unit-promotion-price-ec/unit-promotion-price-ec.component.js +248 -0
  23. package/esm5/lib/interfaces/cart-item.js +1 -1
  24. package/esm5/lib/services/cart.service.js +188 -14
  25. package/esm5/lib/services/checkout/checkout.service.js +2 -2
  26. package/esm5/lib/utils/order-util.service.js +88 -1
  27. package/esm5/public-api.js +2 -1
  28. package/fesm2015/ng-easycommerce.js +882 -59
  29. package/fesm2015/ng-easycommerce.js.map +1 -1
  30. package/fesm5/ng-easycommerce.js +871 -59
  31. package/fesm5/ng-easycommerce.js.map +1 -1
  32. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +139 -0
  33. package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +3 -1
  34. package/lib/ec-component/index.d.ts +1 -0
  35. package/lib/ec-component/sidebar-ec/sidebar-ec.component.d.ts +52 -0
  36. package/lib/ec-component/widgets-ec/unit-promotion-price-ec/unit-promotion-price-ec.component.d.ts +117 -0
  37. package/lib/interfaces/cart-item.d.ts +54 -0
  38. package/lib/services/cart.service.d.ts +98 -1
  39. package/lib/utils/order-util.service.d.ts +58 -0
  40. package/ng-easycommerce.metadata.json +1 -1
  41. package/package.json +1 -1
  42. package/public-api.d.ts +1 -0
@@ -0,0 +1,268 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Component, HostListener, Input } from '@angular/core';
8
+ import { CartService } from '../../../services/cart.service';
9
+ let UnitPromotionPriceEcComponent =
10
+ /**
11
+ * Renderiza el precio unitario final de un ítem con soporte para promociones unitarias.
12
+ *
13
+ * @remarks
14
+ * Este componente resuelve la UX del precio neto con promociones unitarias:
15
+ * - precio final unitario visible
16
+ * - icono de información
17
+ * - popover desktop/mobile con el desglose de descuentos
18
+ *
19
+ * El badge `% OFF` y el precio tachado legacy quedan fuera del componente
20
+ * para que cada frontend pueda ubicarlos donde quiera.
21
+ *
22
+ * @example
23
+ * ```html
24
+ * <div class="price-block">
25
+ * <div class="discount-badge" *ngIf="getItemDiscount(item) as discount">{{ discount }}% OFF</div>
26
+ * <del *ngIf="shouldShowLegacyPriceOrigin(item)">{{ getStrikeThroughUnitPrice(item) | ecCurrencySymbol }}</del>
27
+ * <app-unit-promotion-price-ec [item]="item" [mobile]="true"></app-unit-promotion-price-ec>
28
+ * </div>
29
+ * ```
30
+ */
31
+ class UnitPromotionPriceEcComponent {
32
+ constructor(cartService) {
33
+ this.cartService = cartService;
34
+ /** Indica si el componente se está usando en un layout mobile. */
35
+ this.mobile = false;
36
+ this.summaryOpen = false;
37
+ this.summaryStyles = {};
38
+ this.supportsHover = false;
39
+ /** @returns `true` cuando el ítem tiene promociones unitarias informadas por backend. */
40
+ this.hasUnitPromotions = () => { var _a; return Boolean((_a = this.cartService.getItemPricing(this.item)) === null || _a === void 0 ? void 0 : _a.hasUnitPromotions); };
41
+ /** @returns `true` cuando el popover/resumen está abierto. */
42
+ this.isSummaryOpen = () => this.summaryOpen;
43
+ /** @returns El precio base histórico del ítem (`saleprice` si existe, si no `price`). */
44
+ this.getOriginalUnitPrice = () => { var _a; return Number(((_a = this.cartService.getItemPricing(this.item)) === null || _a === void 0 ? void 0 : _a.basePrice) || 0); };
45
+ /** @returns La suma de los descuentos/promociones unitarios aplicados al ítem. */
46
+ this.getUnitPromotionTotal = () => { var _a; return Number(((_a = this.cartService.getItemPricing(this.item)) === null || _a === void 0 ? void 0 : _a.unitPromotionTotal) || 0); };
47
+ /** @returns El precio unitario final luego de aplicar promociones unitarias. */
48
+ this.getFinalUnitPrice = () => { var _a; return Number(((_a = this.cartService.getItemPricing(this.item)) === null || _a === void 0 ? void 0 : _a.finalPrice) || 0); };
49
+ /** @returns El precio principal que se renderiza junto al icono de ayuda. */
50
+ this.getDisplayedUnitPrice = () => { var _a; return Number(((_a = this.cartService.getItemPricing(this.item)) === null || _a === void 0 ? void 0 : _a.finalPrice) || 0); };
51
+ /** @returns Etiqueta del bloque final dentro del popover. */
52
+ this.getUnitPromotionFinalPriceLabel = () => this.hasUnitPromotions() ? 'Precio final' : 'Precio unitario';
53
+ /** @returns Lista cruda de promociones unitarias a mostrar en el detalle. */
54
+ this.getUnitPromotions = () => { var _a; return Array.isArray((_a = this.item) === null || _a === void 0 ? void 0 : _a.unitPromotions) ? this.item.unitPromotions : []; };
55
+ /**
56
+ * Abre el popover al pasar el mouse en dispositivos con hover real.
57
+ *
58
+ * @param anchor Elemento usado como referencia visual del popover.
59
+ * @returns `void`
60
+ */
61
+ this.handleMouseEnter = (anchor) => {
62
+ if (!this.supportsHover) {
63
+ return;
64
+ }
65
+ this.openSummary(anchor);
66
+ };
67
+ /**
68
+ * Cierra el popover al salir con el mouse en desktop.
69
+ *
70
+ * @returns `void`
71
+ */
72
+ this.handleMouseLeave = () => {
73
+ if (!this.supportsHover) {
74
+ return;
75
+ }
76
+ this.closeSummary();
77
+ };
78
+ /**
79
+ * Alterna la apertura del popover con click/tap en dispositivos sin hover.
80
+ *
81
+ * @param anchor Elemento usado como ancla para posicionar el detalle.
82
+ * @param event Evento del click/tap sobre el bloque de precio.
83
+ * @returns `void`
84
+ */
85
+ this.handlePriceClick = (anchor, event) => {
86
+ if (this.supportsHover) {
87
+ return;
88
+ }
89
+ this.toggleSummary(anchor, event);
90
+ };
91
+ /**
92
+ * Alterna manualmente el estado del resumen.
93
+ *
94
+ * @param anchor Elemento usado como ancla visual del popover.
95
+ * @param event Evento que dispara la interacción.
96
+ * @returns `void`
97
+ */
98
+ this.toggleSummary = (anchor, event) => {
99
+ event.preventDefault();
100
+ event.stopPropagation();
101
+ if (!this.hasUnitPromotions()) {
102
+ return;
103
+ }
104
+ if (this.isSummaryOpen()) {
105
+ this.closeSummary();
106
+ return;
107
+ }
108
+ this.openSummary(anchor);
109
+ };
110
+ /**
111
+ * Cierra el popover y limpia los estilos calculados para mobile.
112
+ *
113
+ * @returns `void`
114
+ */
115
+ this.closeSummary = () => {
116
+ this.summaryOpen = false;
117
+ this.summaryStyles = {};
118
+ };
119
+ /**
120
+ * Evita que un click dentro del popover se propague y lo cierre.
121
+ *
122
+ * @param event Evento del puntero.
123
+ * @returns `void`
124
+ */
125
+ this.stopSummaryEvent = (event) => {
126
+ event.stopPropagation();
127
+ };
128
+ /**
129
+ * Abre el resumen y recalcula su posición.
130
+ *
131
+ * @param anchor Elemento de referencia para el posicionamiento.
132
+ * @returns `void`
133
+ */
134
+ this.openSummary = (anchor) => {
135
+ if (!this.hasUnitPromotions()) {
136
+ return;
137
+ }
138
+ this.summaryOpen = true;
139
+ this.updateSummaryStyles(anchor);
140
+ };
141
+ /**
142
+ * Detecta si la interacción debe comportarse como desktop (`hover`) o mobile (`click`).
143
+ *
144
+ * @returns `void`
145
+ */
146
+ this.updateViewportMode = () => {
147
+ this.supportsHover = typeof window !== 'undefined'
148
+ && typeof window.matchMedia === 'function'
149
+ && window.matchMedia('(hover: hover) and (pointer: fine)').matches
150
+ && window.innerWidth >= 768;
151
+ };
152
+ /**
153
+ * Calcula estilos inline para que el resumen mobile quede dentro del viewport.
154
+ *
155
+ * @param anchor Elemento tocado por el usuario.
156
+ * @returns `void`
157
+ */
158
+ this.updateSummaryStyles = (anchor) => {
159
+ if (this.supportsHover || !anchor || typeof window === 'undefined') {
160
+ this.summaryStyles = {};
161
+ return;
162
+ }
163
+ const viewportPadding = 12;
164
+ const rect = anchor.getBoundingClientRect();
165
+ const estimatedPopupHeight = 260;
166
+ const nextTop = rect.bottom + 8;
167
+ const maxTop = window.innerHeight - estimatedPopupHeight - viewportPadding;
168
+ const top = Math.max(viewportPadding, Math.min(nextTop, maxTop));
169
+ this.summaryStyles = {
170
+ left: `${viewportPadding}px`,
171
+ right: `${viewportPadding}px`,
172
+ top: `${top}px`,
173
+ width: 'auto',
174
+ 'max-width': 'none',
175
+ 'max-height': `calc(100vh - ${top + viewportPadding}px)`,
176
+ overflow: 'auto',
177
+ position: 'fixed'
178
+ };
179
+ };
180
+ }
181
+ /**
182
+ * Inicializa el modo de interacción según el dispositivo actual.
183
+ *
184
+ * @returns `void`
185
+ */
186
+ ngOnInit() {
187
+ this.updateViewportMode();
188
+ }
189
+ /**
190
+ * Cierra el resumen cuando se hace click fuera del componente en desktop.
191
+ *
192
+ * @returns `void`
193
+ */
194
+ handleDocumentClick() {
195
+ if (!this.supportsHover) {
196
+ return;
197
+ }
198
+ this.closeSummary();
199
+ }
200
+ /**
201
+ * Recalcula el modo de interacción al cambiar el viewport.
202
+ *
203
+ * @returns `void`
204
+ */
205
+ handleWindowResize() {
206
+ this.updateViewportMode();
207
+ this.closeSummary();
208
+ }
209
+ /**
210
+ * Cierra el resumen en mobile al hacer scroll para evitar que quede desacoplado del trigger.
211
+ *
212
+ * @returns `void`
213
+ */
214
+ handleWindowScroll() {
215
+ if (this.supportsHover) {
216
+ return;
217
+ }
218
+ this.closeSummary();
219
+ }
220
+ };
221
+ UnitPromotionPriceEcComponent.ctorParameters = () => [
222
+ { type: CartService }
223
+ ];
224
+ __decorate([
225
+ Input()
226
+ ], UnitPromotionPriceEcComponent.prototype, "item", void 0);
227
+ __decorate([
228
+ Input()
229
+ ], UnitPromotionPriceEcComponent.prototype, "mobile", void 0);
230
+ __decorate([
231
+ HostListener('document:click')
232
+ ], UnitPromotionPriceEcComponent.prototype, "handleDocumentClick", null);
233
+ __decorate([
234
+ HostListener('window:resize')
235
+ ], UnitPromotionPriceEcComponent.prototype, "handleWindowResize", null);
236
+ __decorate([
237
+ HostListener('window:scroll')
238
+ ], UnitPromotionPriceEcComponent.prototype, "handleWindowScroll", null);
239
+ UnitPromotionPriceEcComponent = __decorate([
240
+ Component({
241
+ selector: 'app-unit-promotion-price-ec',
242
+ template: "<div\n class=\"ec-unit-promotion-price\"\n [class.ec-unit-promotion-price--mobile]=\"mobile\"\n [class.ec-unit-promotion-price--desktop]=\"!mobile\"\n>\n <div class=\"ec-unit-promotion-price__detail\">\n <div\n class=\"ec-unit-promotion-price__current-wrapper\"\n #priceAnchor\n (mouseenter)=\"handleMouseEnter(priceAnchor)\"\n (mouseleave)=\"handleMouseLeave()\"\n (click)=\"handlePriceClick(priceAnchor, $event)\"\n >\n <span\n class=\"ec-unit-promotion-price__current\"\n [class.ec-unit-promotion-price__current--clickable]=\"hasUnitPromotions() && !supportsHover\"\n >\n <strong class=\"ec-unit-promotion-price__value\">{{ getDisplayedUnitPrice() | ecCurrencySymbol }}</strong>\n\n <button\n *ngIf=\"hasUnitPromotions()\"\n type=\"button\"\n class=\"ec-unit-promotion-price__trigger\"\n [attr.aria-expanded]=\"isSummaryOpen()\"\n aria-label=\"Ver detalle de promociones unitarias\"\n (click)=\"toggleSummary(priceAnchor, $event)\"\n >\n <i class=\"bi bi-info-circle ec-unit-promotion-price__icon\"></i>\n </button>\n </span>\n\n <ng-container *ngIf=\"supportsHover && isSummaryOpen()\">\n <ng-container *ngTemplateOutlet=\"summaryTemplate\"></ng-container>\n </ng-container>\n </div>\n </div>\n\n <ng-container *ngIf=\"mobile && !supportsHover && isSummaryOpen()\">\n <button\n type=\"button\"\n class=\"ec-unit-promotion-price__backdrop\"\n aria-label=\"Cerrar detalle de promociones unitarias\"\n (click)=\"closeSummary()\"\n ></button>\n\n <ng-container *ngTemplateOutlet=\"summaryTemplate\"></ng-container>\n </ng-container>\n</div>\n\n<ng-template #summaryTemplate>\n <div\n class=\"ec-unit-promotion-price__summary\"\n [class.ec-unit-promotion-price__summary--mobile]=\"mobile\"\n [ngStyle]=\"summaryStyles\"\n (click)=\"stopSummaryEvent($event)\"\n >\n <div class=\"ec-unit-promotion-price__row ec-unit-promotion-price__row--original\">\n <span>Precio original</span>\n <span>{{ getOriginalUnitPrice() | ecCurrencySymbol }}</span>\n </div>\n\n <div class=\"ec-unit-promotion-price__row\" *ngFor=\"let promotion of getUnitPromotions()\">\n <span>{{ promotion.name }}</span>\n <span>{{ promotion.amount | ecCurrencySymbol }}</span>\n </div>\n\n <div class=\"ec-unit-promotion-price__divider\"></div>\n\n <div class=\"ec-unit-promotion-price__row ec-unit-promotion-price__row--total\">\n <span>Total descuentos</span>\n <span>{{ getUnitPromotionTotal() | ecCurrencySymbol }}</span>\n </div>\n\n <div class=\"ec-unit-promotion-price__row ec-unit-promotion-price__row--final\">\n <span>{{ getUnitPromotionFinalPriceLabel() }}</span>\n <span>{{ getFinalUnitPrice() | ecCurrencySymbol }}</span>\n </div>\n </div>\n</ng-template>\n",
243
+ styles: [":host{display:inline-block;--ec-unit-promotion-current-gap:0.35rem;--ec-unit-promotion-current-font-size:1.25rem;--ec-unit-promotion-current-font-weight:700;--ec-unit-promotion-current-color:inherit;--ec-unit-promotion-icon-color:#6c757d;--ec-unit-promotion-icon-size:0.95rem;--ec-unit-promotion-summary-bg:#ffffff;--ec-unit-promotion-summary-shadow:0 12px 28px rgba(0, 0, 0, 0.18);--ec-unit-promotion-summary-padding:1rem 1.1rem;--ec-unit-promotion-summary-min-width:18rem;--ec-unit-promotion-summary-width:22rem;--ec-unit-promotion-summary-max-width:84vw;--ec-unit-promotion-summary-z-index:20;--ec-unit-promotion-row-color:#333333;--ec-unit-promotion-row-font-size:0.95rem;--ec-unit-promotion-row-line-height:1.35;--ec-unit-promotion-original-color:#c24a2a;--ec-unit-promotion-total-color:#16347a;--ec-unit-promotion-divider-color:#d9d9d9}.ec-unit-promotion-price{display:inline-flex;align-items:center}.ec-unit-promotion-price__detail{position:relative;display:inline-flex;flex-direction:column;align-items:flex-start}.ec-unit-promotion-price__current-wrapper{position:relative}.ec-unit-promotion-price__current{display:inline-flex;align-items:center;gap:var(--ec-unit-promotion-current-gap);color:var(--ec-unit-promotion-current-color);font-size:var(--ec-unit-promotion-current-font-size)}.ec-unit-promotion-price__current--clickable{cursor:pointer}.ec-unit-promotion-price__value{display:inline-flex}.ec-unit-promotion-price__current strong{font-weight:var(--ec-unit-promotion-current-font-weight)}.ec-unit-promotion-price__trigger{align-items:center;background:0 0;border:0;cursor:pointer;display:inline-flex;justify-content:center;padding:0}.ec-unit-promotion-price__icon{color:var(--ec-unit-promotion-icon-color);cursor:pointer;font-size:var(--ec-unit-promotion-icon-size);line-height:1}.ec-unit-promotion-price__summary{background:var(--ec-unit-promotion-summary-bg);box-shadow:var(--ec-unit-promotion-summary-shadow);min-width:var(--ec-unit-promotion-summary-min-width);padding:var(--ec-unit-promotion-summary-padding);position:absolute;right:0;top:calc(100% + .35rem);width:var(--ec-unit-promotion-summary-width);max-width:var(--ec-unit-promotion-summary-max-width);z-index:var(--ec-unit-promotion-summary-z-index)}.ec-unit-promotion-price__summary::before{background:var(--ec-unit-promotion-summary-bg);content:'';height:.9rem;position:absolute;right:.9rem;top:-.35rem;transform:rotate(45deg);width:.9rem}.ec-unit-promotion-price__summary--mobile{position:fixed;max-width:none;min-width:0;width:auto}.ec-unit-promotion-price__summary--mobile::before{display:none}.ec-unit-promotion-price__backdrop{background:0 0;border:0;inset:0;padding:0;position:fixed;z-index:calc(var(--ec-unit-promotion-summary-z-index) - 1)}.ec-unit-promotion-price__row{align-items:flex-start;color:var(--ec-unit-promotion-row-color);-moz-column-gap:.75rem;column-gap:.75rem;display:flex;font-size:var(--ec-unit-promotion-row-font-size);justify-content:space-between;line-height:var(--ec-unit-promotion-row-line-height)}.ec-unit-promotion-price__row+.ec-unit-promotion-price__row{margin-top:.65rem}.ec-unit-promotion-price__row span:first-child{flex:1 1 auto;font-weight:500}.ec-unit-promotion-price__row span:last-child{flex:0 0 auto;text-align:right;white-space:nowrap}.ec-unit-promotion-price__row--original{color:var(--ec-unit-promotion-original-color)}.ec-unit-promotion-price__row--final,.ec-unit-promotion-price__row--total{color:var(--ec-unit-promotion-total-color);font-weight:700}.ec-unit-promotion-price__divider{border-top:1px solid var(--ec-unit-promotion-divider-color);margin:.85rem 0}"]
244
+ })
245
+ /**
246
+ * Renderiza el precio unitario final de un ítem con soporte para promociones unitarias.
247
+ *
248
+ * @remarks
249
+ * Este componente resuelve la UX del precio neto con promociones unitarias:
250
+ * - precio final unitario visible
251
+ * - icono de información
252
+ * - popover desktop/mobile con el desglose de descuentos
253
+ *
254
+ * El badge `% OFF` y el precio tachado legacy quedan fuera del componente
255
+ * para que cada frontend pueda ubicarlos donde quiera.
256
+ *
257
+ * @example
258
+ * ```html
259
+ * <div class="price-block">
260
+ * <div class="discount-badge" *ngIf="getItemDiscount(item) as discount">{{ discount }}% OFF</div>
261
+ * <del *ngIf="shouldShowLegacyPriceOrigin(item)">{{ getStrikeThroughUnitPrice(item) | ecCurrencySymbol }}</del>
262
+ * <app-unit-promotion-price-ec [item]="item" [mobile]="true"></app-unit-promotion-price-ec>
263
+ * </div>
264
+ * ```
265
+ */
266
+ ], UnitPromotionPriceEcComponent);
267
+ export { UnitPromotionPriceEcComponent };
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC1wcm9tb3Rpb24tcHJpY2UtZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC93aWRnZXRzLWVjL3VuaXQtcHJvbW90aW9uLXByaWNlLWVjL3VuaXQtcHJvbW90aW9uLXByaWNlLWVjLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBNEI3RCxJQUFhLDZCQUE2QjtBQXJCMUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBYSw2QkFBNkI7SUFXdEMsWUFBbUIsV0FBd0I7UUFBeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFQM0Msa0VBQWtFO1FBQ3pELFdBQU0sR0FBWSxLQUFLLENBQUM7UUFFMUIsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDN0Isa0JBQWEsR0FBOEIsRUFBRSxDQUFDO1FBQzlDLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBYXRDLHlGQUF5RjtRQUN6RixzQkFBaUIsR0FBRyxHQUFZLEVBQUUsV0FBQyxPQUFBLE9BQU8sT0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDBDQUFFLGlCQUFpQixDQUFDLENBQUEsRUFBQSxDQUFDO1FBRTFHLDhEQUE4RDtRQUM5RCxrQkFBYSxHQUFHLEdBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFFaEQseUZBQXlGO1FBQ3pGLHlCQUFvQixHQUFHLEdBQVcsRUFBRSxXQUFDLE9BQUEsTUFBTSxDQUFDLE9BQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywwQ0FBRSxTQUFT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QUFRRDtJQURDLFlBQVksQ0FBQyxlQUFlLENBQUM7dUVBTzdCO0FBeEtRLDZCQUE2QjtJQTFCekMsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLDZCQUE2QjtRQUN2Qyx5dEdBQXVEOztLQUUxRCxDQUFDO0lBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bb0JHO0dBQ1UsNkJBQTZCLENBbU96QztTQW5PWSw2QkFBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC11bml0LXByb21vdGlvbi1wcmljZS1lYycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3VuaXQtcHJvbW90aW9uLXByaWNlLWVjLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi91bml0LXByb21vdGlvbi1wcmljZS1lYy5jb21wb25lbnQuc2NzcyddXG59KVxuLyoqXG4gKiBSZW5kZXJpemEgZWwgcHJlY2lvIHVuaXRhcmlvIGZpbmFsIGRlIHVuIMOtdGVtIGNvbiBzb3BvcnRlIHBhcmEgcHJvbW9jaW9uZXMgdW5pdGFyaWFzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBFc3RlIGNvbXBvbmVudGUgcmVzdWVsdmUgbGEgVVggZGVsIHByZWNpbyBuZXRvIGNvbiBwcm9tb2Npb25lcyB1bml0YXJpYXM6XG4gKiAtIHByZWNpbyBmaW5hbCB1bml0YXJpbyB2aXNpYmxlXG4gKiAtIGljb25vIGRlIGluZm9ybWFjacOzblxuICogLSBwb3BvdmVyIGRlc2t0b3AvbW9iaWxlIGNvbiBlbCBkZXNnbG9zZSBkZSBkZXNjdWVudG9zXG4gKlxuICogRWwgYmFkZ2UgYCUgT0ZGYCB5IGVsIHByZWNpbyB0YWNoYWRvIGxlZ2FjeSBxdWVkYW4gZnVlcmEgZGVsIGNvbXBvbmVudGVcbiAqIHBhcmEgcXVlIGNhZGEgZnJvbnRlbmQgcHVlZGEgdWJpY2FybG9zIGRvbmRlIHF1aWVyYS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPGRpdiBjbGFzcz1cInByaWNlLWJsb2NrXCI+XG4gKiAgIDxkaXYgY2xhc3M9XCJkaXNjb3VudC1iYWRnZVwiICpuZ0lmPVwiZ2V0SXRlbURpc2NvdW50KGl0ZW0pIGFzIGRpc2NvdW50XCI+e3sgZGlzY291bnQgfX0lIE9GRjwvZGl2PlxuICogICA8ZGVsICpuZ0lmPVwic2hvdWxkU2hvd0xlZ2FjeVByaWNlT3JpZ2luKGl0ZW0pXCI+e3sgZ2V0U3RyaWtlVGhyb3VnaFVuaXRQcmljZShpdGVtKSB8IGVjQ3VycmVuY3lTeW1ib2wgfX08L2RlbD5cbiAqICAgPGFwcC11bml0LXByb21vdGlvbi1wcmljZS1lYyBbaXRlbV09XCJpdGVtXCIgW21vYmlsZV09XCJ0cnVlXCI+PC9hcHAtdW5pdC1wcm9tb3Rpb24tcHJpY2UtZWM+XG4gKiA8L2Rpdj5cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVW5pdFByb21vdGlvblByaWNlRWNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgLyoqIMONdGVtIGRlbCBjYXJyaXRvIG5vcm1hbGl6YWRvIHF1ZSBzZSB2YSBhIHJlbmRlcml6YXIuICovXG4gICAgQElucHV0KCkgaXRlbTogYW55O1xuICAgIC8qKiBJbmRpY2Egc2kgZWwgY29tcG9uZW50ZSBzZSBlc3TDoSB1c2FuZG8gZW4gdW4gbGF5b3V0IG1vYmlsZS4gKi9cbiAgICBASW5wdXQoKSBtb2JpbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyBzdW1tYXJ5T3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBzdW1tYXJ5U3R5bGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgcHVibGljIHN1cHBvcnRzSG92ZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UpIHsgfVxuXG4gICAgLyoqXG4gICAgICogSW5pY2lhbGl6YSBlbCBtb2RvIGRlIGludGVyYWNjacOzbiBzZWfDum4gZWwgZGlzcG9zaXRpdm8gYWN0dWFsLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYHZvaWRgXG4gICAgICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnRNb2RlKCk7XG4gICAgfVxuXG4gICAgLyoqIEByZXR1cm5zIGB0cnVlYCBjdWFuZG8gZWwgw610ZW0gdGllbmUgcHJvbW9jaW9uZXMgdW5pdGFyaWFzIGluZm9ybWFkYXMgcG9yIGJhY2tlbmQuICovXG4gICAgaGFzVW5pdFByb21vdGlvbnMgPSAoKTogYm9vbGVhbiA9PiBCb29sZWFuKHRoaXMuY2FydFNlcnZpY2UuZ2V0SXRlbVByaWNpbmcodGhpcy5pdGVtKT8uaGFzVW5pdFByb21vdGlvbnMpO1xuXG4gICAgLyoqIEByZXR1cm5zIGB0cnVlYCBjdWFuZG8gZWwgcG9wb3Zlci9yZXN1bWVuIGVzdMOhIGFiaWVydG8uICovXG4gICAgaXNTdW1tYXJ5T3BlbiA9ICgpOiBib29sZWFuID0+IHRoaXMuc3VtbWFyeU9wZW47XG5cbiAgICAvKiogQHJldHVybnMgRWwgcHJlY2lvIGJhc2UgaGlzdMOzcmljbyBkZWwgw610ZW0gKGBzYWxlcHJpY2VgIHNpIGV4aXN0ZSwgc2kgbm8gYHByaWNlYCkuICovXG4gICAgZ2V0T3JpZ2luYWxVbml0UHJpY2UgPSAoKTogbnVtYmVyID0+IE51bWJlcih0aGlzLmNhcnRTZXJ2aWNlLmdldEl0ZW1QcmljaW5nKHRoaXMuaXRlbSk/LmJhc2VQcmljZSB8fCAwKTtcblxuICAgIC8qKiBAcmV0dXJucyBMYSBzdW1hIGRlIGxvcyBkZXNjdWVudG9zL3Byb21vY2lvbmVzIHVuaXRhcmlvcyBhcGxpY2Fkb3MgYWwgw610ZW0uICovXG4gICAgZ2V0VW5pdFByb21vdGlvblRvdGFsID0gKCk6IG51bWJlciA9PiBOdW1iZXIodGhpcy5jYXJ0U2VydmljZS5nZXRJdGVtUHJpY2luZyh0aGlzLml0ZW0pPy51bml0UHJvbW90aW9uVG90YWwgfHwgMCk7XG5cbiAgICAvKiogQHJldHVybnMgRWwgcHJlY2lvIHVuaXRhcmlvIGZpbmFsIGx1ZWdvIGRlIGFwbGljYXIgcHJvbW9jaW9uZXMgdW5pdGFyaWFzLiAqL1xuICAgIGdldEZpbmFsVW5pdFByaWNlID0gKCk6IG51bWJlciA9PiBOdW1iZXIodGhpcy5jYXJ0U2VydmljZS5nZXRJdGVtUHJpY2luZyh0aGlzLml0ZW0pPy5maW5hbFByaWNlIHx8IDApO1xuXG4gICAgLyoqIEByZXR1cm5zIEVsIHByZWNpbyBwcmluY2lwYWwgcXVlIHNlIHJlbmRlcml6YSBqdW50byBhbCBpY29ubyBkZSBheXVkYS4gKi9cbiAgICBnZXREaXNwbGF5ZWRVbml0UHJpY2UgPSAoKTogbnVtYmVyID0+IE51bWJlcih0aGlzLmNhcnRTZXJ2aWNlLmdldEl0ZW1QcmljaW5nKHRoaXMuaXRlbSk/LmZpbmFsUHJpY2UgfHwgMCk7XG5cbiAgICAvKiogQHJldHVybnMgRXRpcXVldGEgZGVsIGJsb3F1ZSBmaW5hbCBkZW50cm8gZGVsIHBvcG92ZXIuICovXG4gICAgZ2V0VW5pdFByb21vdGlvbkZpbmFsUHJpY2VMYWJlbCA9ICgpOiBzdHJpbmcgPT4gdGhpcy5oYXNVbml0UHJvbW90aW9ucygpID8gJ1ByZWNpbyBmaW5hbCcgOiAnUHJlY2lvIHVuaXRhcmlvJztcblxuICAgIC8qKiBAcmV0dXJucyBMaXN0YSBjcnVkYSBkZSBwcm9tb2Npb25lcyB1bml0YXJpYXMgYSBtb3N0cmFyIGVuIGVsIGRldGFsbGUuICovXG4gICAgZ2V0VW5pdFByb21vdGlvbnMgPSAoKTogYW55W10gPT4gQXJyYXkuaXNBcnJheSh0aGlzLml0ZW0/LnVuaXRQcm9tb3Rpb25zKSA/IHRoaXMuaXRlbS51bml0UHJvbW90aW9ucyA6IFtdO1xuXG4gICAgLyoqXG4gICAgICogQWJyZSBlbCBwb3BvdmVyIGFsIHBhc2FyIGVsIG1vdXNlIGVuIGRpc3Bvc2l0aXZvcyBjb24gaG92ZXIgcmVhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhbmNob3IgRWxlbWVudG8gdXNhZG8gY29tbyByZWZlcmVuY2lhIHZpc3VhbCBkZWwgcG9wb3Zlci5cbiAgICAgKiBAcmV0dXJucyBgdm9pZGBcbiAgICAgKi9cbiAgICBoYW5kbGVNb3VzZUVudGVyID0gKGFuY2hvcjogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN1cHBvcnRzSG92ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3BlblN1bW1hcnkoYW5jaG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaWVycmEgZWwgcG9wb3ZlciBhbCBzYWxpciBjb24gZWwgbW91c2UgZW4gZGVza3RvcC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB2b2lkYFxuICAgICAqL1xuICAgIGhhbmRsZU1vdXNlTGVhdmUgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zdXBwb3J0c0hvdmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsb3NlU3VtbWFyeSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsdGVybmEgbGEgYXBlcnR1cmEgZGVsIHBvcG92ZXIgY29uIGNsaWNrL3RhcCBlbiBkaXNwb3NpdGl2b3Mgc2luIGhvdmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFuY2hvciBFbGVtZW50byB1c2FkbyBjb21vIGFuY2xhIHBhcmEgcG9zaWNpb25hciBlbCBkZXRhbGxlLlxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZGVsIGNsaWNrL3RhcCBzb2JyZSBlbCBibG9xdWUgZGUgcHJlY2lvLlxuICAgICAqIEByZXR1cm5zIGB2b2lkYFxuICAgICAqL1xuICAgIGhhbmRsZVByaWNlQ2xpY2sgPSAoYW5jaG9yOiBIVE1MRWxlbWVudCwgZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzSG92ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG9nZ2xlU3VtbWFyeShhbmNob3IsIGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbHRlcm5hIG1hbnVhbG1lbnRlIGVsIGVzdGFkbyBkZWwgcmVzdW1lbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhbmNob3IgRWxlbWVudG8gdXNhZG8gY29tbyBhbmNsYSB2aXN1YWwgZGVsIHBvcG92ZXIuXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50byBxdWUgZGlzcGFyYSBsYSBpbnRlcmFjY2nDs24uXG4gICAgICogQHJldHVybnMgYHZvaWRgXG4gICAgICovXG4gICAgdG9nZ2xlU3VtbWFyeSA9IChhbmNob3I6IEhUTUxFbGVtZW50LCBldmVudDogRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc1VuaXRQcm9tb3Rpb25zKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzU3VtbWFyeU9wZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVN1bW1hcnkoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3BlblN1bW1hcnkoYW5jaG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaWVycmEgZWwgcG9wb3ZlciB5IGxpbXBpYSBsb3MgZXN0aWxvcyBjYWxjdWxhZG9zIHBhcmEgbW9iaWxlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYHZvaWRgXG4gICAgICovXG4gICAgY2xvc2VTdW1tYXJ5ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnN1bW1hcnlPcGVuID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3VtbWFyeVN0eWxlcyA9IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2aXRhIHF1ZSB1biBjbGljayBkZW50cm8gZGVsIHBvcG92ZXIgc2UgcHJvcGFndWUgeSBsbyBjaWVycmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXZlbnQgRXZlbnRvIGRlbCBwdW50ZXJvLlxuICAgICAqIEByZXR1cm5zIGB2b2lkYFxuICAgICAqL1xuICAgIHN0b3BTdW1tYXJ5RXZlbnQgPSAoZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENpZXJyYSBlbCByZXN1bWVuIGN1YW5kbyBzZSBoYWNlIGNsaWNrIGZ1ZXJhIGRlbCBjb21wb25lbnRlIGVuIGRlc2t0b3AuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdm9pZGBcbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycpXG4gICAgaGFuZGxlRG9jdW1lbnRDbGljaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnN1cHBvcnRzSG92ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xvc2VTdW1tYXJ5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjYWxjdWxhIGVsIG1vZG8gZGUgaW50ZXJhY2Npw7NuIGFsIGNhbWJpYXIgZWwgdmlld3BvcnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdm9pZGBcbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgICBoYW5kbGVXaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlVmlld3BvcnRNb2RlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VTdW1tYXJ5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2llcnJhIGVsIHJlc3VtZW4gZW4gbW9iaWxlIGFsIGhhY2VyIHNjcm9sbCBwYXJhIGV2aXRhciBxdWUgcXVlZGUgZGVzYWNvcGxhZG8gZGVsIHRyaWdnZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdm9pZGBcbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJylcbiAgICBoYW5kbGVXaW5kb3dTY3JvbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN1cHBvcnRzSG92ZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xvc2VTdW1tYXJ5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWJyZSBlbCByZXN1bWVuIHkgcmVjYWxjdWxhIHN1IHBvc2ljacOzbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhbmNob3IgRWxlbWVudG8gZGUgcmVmZXJlbmNpYSBwYXJhIGVsIHBvc2ljaW9uYW1pZW50by5cbiAgICAgKiBAcmV0dXJucyBgdm9pZGBcbiAgICAgKi9cbiAgICBwcml2YXRlIG9wZW5TdW1tYXJ5ID0gKGFuY2hvcj86IEhUTUxFbGVtZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghdGhpcy5oYXNVbml0UHJvbW90aW9ucygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN1bW1hcnlPcGVuID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5U3R5bGVzKGFuY2hvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZWN0YSBzaSBsYSBpbnRlcmFjY2nDs24gZGViZSBjb21wb3J0YXJzZSBjb21vIGRlc2t0b3AgKGBob3ZlcmApIG8gbW9iaWxlIChgY2xpY2tgKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB2b2lkYFxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlVmlld3BvcnRNb2RlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnN1cHBvcnRzSG92ZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgJiYgdHlwZW9mIHdpbmRvdy5tYXRjaE1lZGlhID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnKGhvdmVyOiBob3ZlcikgYW5kIChwb2ludGVyOiBmaW5lKScpLm1hdGNoZXNcbiAgICAgICAgICAgICYmIHdpbmRvdy5pbm5lcldpZHRoID49IDc2ODtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhIGVzdGlsb3MgaW5saW5lIHBhcmEgcXVlIGVsIHJlc3VtZW4gbW9iaWxlIHF1ZWRlIGRlbnRybyBkZWwgdmlld3BvcnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYW5jaG9yIEVsZW1lbnRvIHRvY2FkbyBwb3IgZWwgdXN1YXJpby5cbiAgICAgKiBAcmV0dXJucyBgdm9pZGBcbiAgICAgKi9cbiAgICBwcml2YXRlIHVwZGF0ZVN1bW1hcnlTdHlsZXMgPSAoYW5jaG9yPzogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNIb3ZlciB8fCAhYW5jaG9yIHx8IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTdHlsZXMgPSB7fTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0UGFkZGluZyA9IDEyO1xuICAgICAgICBjb25zdCByZWN0ID0gYW5jaG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBlc3RpbWF0ZWRQb3B1cEhlaWdodCA9IDI2MDtcbiAgICAgICAgY29uc3QgbmV4dFRvcCA9IHJlY3QuYm90dG9tICsgODtcbiAgICAgICAgY29uc3QgbWF4VG9wID0gd2luZG93LmlubmVySGVpZ2h0IC0gZXN0aW1hdGVkUG9wdXBIZWlnaHQgLSB2aWV3cG9ydFBhZGRpbmc7XG4gICAgICAgIGNvbnN0IHRvcCA9IE1hdGgubWF4KHZpZXdwb3J0UGFkZGluZywgTWF0aC5taW4obmV4dFRvcCwgbWF4VG9wKSk7XG5cbiAgICAgICAgdGhpcy5zdW1tYXJ5U3R5bGVzID0ge1xuICAgICAgICAgICAgbGVmdDogYCR7dmlld3BvcnRQYWRkaW5nfXB4YCxcbiAgICAgICAgICAgIHJpZ2h0OiBgJHt2aWV3cG9ydFBhZGRpbmd9cHhgLFxuICAgICAgICAgICAgdG9wOiBgJHt0b3B9cHhgLFxuICAgICAgICAgICAgd2lkdGg6ICdhdXRvJyxcbiAgICAgICAgICAgICdtYXgtd2lkdGgnOiAnbm9uZScsXG4gICAgICAgICAgICAnbWF4LWhlaWdodCc6IGBjYWxjKDEwMHZoIC0gJHt0b3AgKyB2aWV3cG9ydFBhZGRpbmd9cHgpYCxcbiAgICAgICAgICAgIG92ZXJmbG93OiAnYXV0bycsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJ1xuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==
@@ -1 +1 @@
1
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC1pdGVtLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2ludGVyZmFjZXMvY2FydC1pdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgeyBMb3QgfSBmcm9tICcuL2xvdCc7XHJcbmltcG9ydCB7IFByb2R1Y3QgfSBmcm9tICcuL3Byb2R1Y3QnO1xyXG5cclxuLy8gY2FydCBpdGVtc1xyXG5leHBvcnQgaW50ZXJmYWNlIENhcnRJdGVtIHtcclxuICAgIHByb2R1Y3RDb2RlOiBhbnksXHJcbiAgICBwcm9kdWN0PzogUHJvZHVjdDtcclxuICAgIHF1YW50aXR5OiBudW1iZXI7XHJcbiAgICB2YXJpYW50X2lkOiBudW1iZXI7XHJcbiAgICB0b3RhbDogbnVtYmVyO1xyXG59XHJcbiJdfQ==
1
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC1pdGVtLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2ludGVyZmFjZXMvY2FydC1pdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgeyBMb3QgfSBmcm9tICcuL2xvdCc7XG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi9wcm9kdWN0JztcblxuLyoqXG4gKiBQcm9tb2Npw7NuIGFwbGljYWRhIGEgdW5hIHVuaWRhZCBkZWwgcHJvZHVjdG8uXG4gKlxuICogQHJlbWFya3NcbiAqIEVsIGJhY2tlbmQgbnVldm8gaW5mb3JtYSBlc3RhcyBwcm9tb2Npb25lcyBlbiBgaXRlbXNbXS51bml0UHJvbW90aW9uc2AuXG4gKiBTdXMgbW9udG9zIHNvbiBuZWdhdGl2b3MgY3VhbmRvIHJlcHJlc2VudGFuIGRlc2N1ZW50b3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FydEl0ZW1Qcm9tb3Rpb24ge1xuICAgIC8qKiBNb250byBmaXJtYWRvIGFwbGljYWRvIHNvYnJlIHVuYSB1bmlkYWQgZGVsIHByb2R1Y3RvLiAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKiBUaXBvIHTDqWNuaWNvIGRlIHByb21vY2nDs24gaW5mb3JtYWRvIHBvciBiYWNrZW5kLiAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKiogTm9tYnJlIGxlZ2libGUgZGUgbGEgcHJvbW9jacOzbiBvIGRlc2N1ZW50by4gKi9cbiAgICBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJlY2lvcyBkZWwgw610ZW0gbm9ybWFsaXphZG9zIHBvciBlbCBjb3JlIHBhcmEgZXZpdGFyIGR1cGxpY2FyIGzDs2dpY2EgZW4gY2FkYSBmcm9udGVuZC5cbiAqXG4gKiBAcmVtYXJrc1xuICogRXN0YSBlc3RydWN0dXJhIHNlcGFyYSB0cmVzIGNvbmNlcHRvcyBkaXN0aW50b3M6XG4gKiAtIGBiYXNlUHJpY2VgOiBwcmVjaW8gdW5pdGFyaW8gaGlzdMOzcmljbyBkZSBsYSB0YWJsYSAoYHNhbGVwcmljZWAgc2kgZXhpc3RlLCBzaSBubyBgcHJpY2VgKVxuICogLSBgc3RyaWtlUHJpY2VgOiBwcmVjaW8gdGFjaGFkbyBkZSBsYSBsw7NnaWNhIGxlZ2FjeSBgcHJpY2Uvc2FsZXByaWNlYFxuICogLSBgZmluYWxQcmljZWA6IHByZWNpbyB1bml0YXJpbyBuZXRvIGx1ZWdvIGRlIGFwbGljYXIgYHVuaXRQcm9tb3Rpb25zYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhcnRJdGVtUHJpY2luZyB7XG4gICAgLyoqIFByZWNpbyB1bml0YXJpbyBiYXNlIHF1ZSB5YSB1c2FiYSBlbCBmcm9udGVuZCBhbnRlcyBkZSBzb3BvcnRhciBwcm9tb2Npb25lcyB1bml0YXJpYXMuICovXG4gICAgYmFzZVByaWNlOiBudW1iZXI7XG4gICAgLyoqIFByZWNpbyB1bml0YXJpbyB0YWNoYWRvLCBvIGBudWxsYCBjdWFuZG8gbm8gY29ycmVzcG9uZGUgbW9zdHJhcmxvLiAqL1xuICAgIHN0cmlrZVByaWNlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKiBQcmVjaW8gdW5pdGFyaW8gZmluYWwgbHVlZ28gZGUgYXBsaWNhciBwcm9tb2Npb25lcyBwb3IgdW5pZGFkLiAqL1xuICAgIGZpbmFsUHJpY2U6IG51bWJlcjtcbiAgICAvKiogU3VtYSBkZSB0b2RvcyBsb3MgZGVzY3VlbnRvcy9wcm9tb2Npb25lcyB1bml0YXJpb3MuICovXG4gICAgdW5pdFByb21vdGlvblRvdGFsOiBudW1iZXI7XG4gICAgLyoqIEluZGljYSBzaSBlbCDDrXRlbSB0aWVuZSBwcmVjaW8gdGFjaGFkbyBsZWdhY3kuICovXG4gICAgaGFzU3RyaWtlUHJpY2U6IGJvb2xlYW47XG4gICAgLyoqIEluZGljYSBzaSBlbCDDrXRlbSByZWNpYmnDsyBwcm9tb2Npb25lcyB1bml0YXJpYXMgZGVzZGUgYmFja2VuZC4gKi9cbiAgICBoYXNVbml0UHJvbW90aW9uczogYm9vbGVhbjtcbiAgICAvKiogUG9yY2VudGFqZSBkZSBkZXNjdWVudG8gbGVnYWN5IGEgbW9zdHJhciBlbiBiYWRnZSAoYHByaWNlYCB2cyBgc2FsZXByaWNlYCkuICovXG4gICAgZGlzY291bnRQZXJjZW50OiBudW1iZXI7XG4gICAgLyoqIFBvcmNlbnRhamUgZWZlY3Rpdm8gdXNhbmRvIGNvbW8gcmVmZXJlbmNpYSBlbCBwcmVjaW8gZmluYWwgdW5pdGFyaW8gbHVlZ28gZGUgcHJvbW9jaW9uZXMuICovXG4gICAgZWZmZWN0aXZlRGlzY291bnRQZXJjZW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogw410ZW0gZGVsIGNhcnJpdG8gbm9ybWFsaXphZG8gcG9yIGVsIGNvcmUuXG4gKlxuICogQHJlbWFya3NcbiAqIEVzdGUgY29udHJhdG8gZXMgZWwgcXVlIGNvbnN1bWVuIGxvcyBjb21wb25lbnRlcyBkZSBjYXJyaXRvLCBzaWRlYmFyIHkgY2hlY2tvdXQuXG4gKiBTZSBtYW50aWVuZSBjb21wYXRpYmxlIGNvbiBiYWNrZW5kcyB2aWVqb3M6IGN1YW5kbyBubyBleGlzdGUgYHVuaXRQcm9tb3Rpb25zYCxcbiAqIGVsIGNvcmUgY29tcGxldGEgYHByaWNpbmdgIHNpbiBhbHRlcmFyIGxhIHNlbcOhbnRpY2EgbGVnYWN5IGRlIGBwcm9kdWN0LnByaWNlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXJ0SXRlbSB7XG4gICAgcHJvZHVjdENvZGU6IGFueSxcbiAgICBwcm9kdWN0PzogUHJvZHVjdDtcbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIHZhcmlhbnRfaWQ6IG51bWJlcjtcbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIC8qKiBQcm9tb2Npb25lcyB1bml0YXJpYXMgY3J1ZGFzIGRldnVlbHRhcyBwb3IgYmFja2VuZC4gKi9cbiAgICB1bml0UHJvbW90aW9ucz86IENhcnRJdGVtUHJvbW90aW9uW107XG4gICAgLyoqIFByZWNpb3MgZGVyaXZhZG9zIGxpc3RvcyBwYXJhIHVzYXIgZW4gbGEgVUkuICovXG4gICAgcHJpY2luZz86IENhcnRJdGVtUHJpY2luZztcbn1cbiJdfQ==