ng-easycommerce-v18 0.6.41 → 0.6.42
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.
- package/README.md +31 -0
- package/assets/ec-i18n/ct.json +38 -1
- package/assets/ec-i18n/en.json +38 -1
- package/assets/ec-i18n/es.json +10 -1
- package/assets/ec-i18n/fr.json +38 -1
- package/assets/ec-i18n/gl.json +38 -1
- package/assets/ec-i18n/pr.json +38 -1
- package/esm2022/lib/constants/core.constants.service.mjs +7 -9
- package/esm2022/lib/ec-components/account-ec/address-book-ec/address-book-ec.component.mjs +32 -4
- package/esm2022/lib/ec-components/account-ec/order-ec/order-ec.component.mjs +105 -21
- package/esm2022/lib/ec-components/account-ec/orders-list-ec/orders-list-ec.component.mjs +36 -6
- package/esm2022/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.mjs +54 -29
- package/esm2022/lib/ec-components/cart-ec/cart-ec.component.mjs +12 -3
- package/esm2022/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.mjs +50 -11
- package/esm2022/lib/ec-components/checkout-ec/checkout-ec.component.mjs +90 -39
- package/esm2022/lib/ec-components/checkout-ec/dataform-ec/dataform-ec.component.mjs +23 -5
- package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-ec.component.mjs +3 -1
- package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-methods/mp-redirect-ec/mp-redirect-ec.component.mjs +3 -1
- package/esm2022/lib/ec-components/collection-ec/collection-ec.component.mjs +30 -6
- package/esm2022/lib/ec-components/product-detail-ec/product-detail-ec.component.mjs +67 -41
- package/esm2022/lib/ec-components/product-ec/product-ec.component.mjs +73 -24
- package/esm2022/lib/ec-components/sidebar-ec/sidebar-ec.component.mjs +7 -3
- package/esm2022/lib/ec-components/user-portal-ec/user-addresses-ec/user-addresses-ec.component.mjs +31 -2
- package/esm2022/lib/ec-components/user-portal-ec/user-documents-ec/user-documents-ec.component.mjs +87 -25
- package/esm2022/lib/ec-components/user-portal-ec/user-portal-ec.component.mjs +23 -10
- package/esm2022/lib/ec-components/user-portal-ec/user-profile-ec/user-profile-ec.component.mjs +30 -4
- package/esm2022/lib/ec-components/user-portal-ec/user-security-ec/user-security-ec.component.mjs +18 -3
- package/esm2022/lib/ec-components/wishlist-ec/wishlist-ec.component.mjs +89 -7
- package/esm2022/lib/ec-components/wishlist-ec/wishlist-item-ec/wishlist-item-ec.component.mjs +11 -4
- package/esm2022/lib/ec-components/wishlist-modal-ec/wishlist-modal-ec.component.mjs +3 -3
- package/esm2022/lib/ec-guards/access-policy.guard.mjs +22 -0
- package/esm2022/lib/ec-guards/guest-only.guard.mjs +22 -0
- package/esm2022/lib/ec-guards/index.mjs +3 -1
- package/esm2022/lib/ec-services/access-policy-navigation.service.mjs +57 -0
- package/esm2022/lib/ec-services/access-policy.service.mjs +74 -0
- package/esm2022/lib/ec-services/address-book.service.mjs +27 -3
- package/esm2022/lib/ec-services/addressing.service.mjs +10 -1
- package/esm2022/lib/ec-services/auth.service.mjs +2 -6
- package/esm2022/lib/ec-services/capabilities.service.mjs +28 -0
- package/esm2022/lib/ec-services/cart.service.mjs +237 -64
- package/esm2022/lib/ec-services/checkout.service.mjs +83 -47
- package/esm2022/lib/ec-services/commerce-access.service.mjs +38 -0
- package/esm2022/lib/ec-services/file-security-validator.service.mjs +8 -1
- package/esm2022/lib/ec-services/index.mjs +5 -1
- package/esm2022/lib/ec-services/order-documents-visibility.service.mjs +6 -4
- package/esm2022/lib/ec-services/orders.service.mjs +73 -5
- package/esm2022/lib/ec-services/payment.service.mjs +19 -4
- package/esm2022/lib/ec-services/product-detail.service.mjs +27 -10
- package/esm2022/lib/ec-services/profile.service.mjs +23 -5
- package/esm2022/lib/ec-services/quantity-rules.service.mjs +82 -21
- package/esm2022/lib/ec-services/shipment.service.mjs +81 -33
- package/esm2022/lib/ec-services/wishlist.service.mjs +95 -18
- package/esm2022/lib/interceptors/auth.interceptor.mjs +23 -29
- package/esm2022/lib/interfaces/access-policy.mjs +2 -0
- package/esm2022/lib/interfaces/capabilities.mjs +2 -0
- package/esm2022/lib/interfaces/cart-session-state.mjs +2 -0
- package/esm2022/lib/interfaces/channel.mjs +2 -0
- package/esm2022/lib/interfaces/checkout.mjs +1 -1
- package/esm2022/lib/interfaces/index.mjs +5 -1
- package/esm2022/lib/interfaces/product.mjs +1 -1
- package/esm2022/lib/providers/access-policy-internal.mjs +7 -0
- package/esm2022/lib/providers/checkout-access-denied.mjs +34 -0
- package/esm2022/lib/providers/index.mjs +4 -1
- package/esm2022/lib/providers/provideAccessPolicy.mjs +44 -0
- package/esm2022/lib/providers/provideCapabilities.mjs +25 -0
- package/esm2022/lib/utils/index.mjs +4 -1
- package/esm2022/lib/utils/price-presentation.service.mjs +352 -0
- package/esm2022/lib/utils/product-image-resolver.mjs +18 -0
- package/esm2022/lib/utils/product-variant-resolver.mjs +57 -0
- package/fesm2022/ng-easycommerce-v18.mjs +2393 -508
- package/fesm2022/ng-easycommerce-v18.mjs.map +1 -1
- package/lib/constants/core.constants.service.d.ts +1 -2
- package/lib/ec-components/account-ec/address-book-ec/address-book-ec.component.d.ts +3 -0
- package/lib/ec-components/account-ec/order-ec/order-ec.component.d.ts +10 -0
- package/lib/ec-components/account-ec/orders-list-ec/orders-list-ec.component.d.ts +4 -0
- package/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.d.ts +11 -5
- package/lib/ec-components/cart-ec/cart-ec.component.d.ts +3 -0
- package/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.d.ts +12 -1
- package/lib/ec-components/checkout-ec/checkout-ec.component.d.ts +16 -1
- package/lib/ec-components/collection-ec/collection-ec.component.d.ts +4 -0
- package/lib/ec-components/product-detail-ec/product-detail-ec.component.d.ts +13 -0
- package/lib/ec-components/product-ec/product-ec.component.d.ts +12 -1
- package/lib/ec-components/sidebar-ec/sidebar-ec.component.d.ts +2 -0
- package/lib/ec-components/user-portal-ec/user-addresses-ec/user-addresses-ec.component.d.ts +1 -0
- package/lib/ec-components/user-portal-ec/user-documents-ec/user-documents-ec.component.d.ts +9 -1
- package/lib/ec-components/user-portal-ec/user-portal-ec.component.d.ts +1 -0
- package/lib/ec-components/user-portal-ec/user-profile-ec/user-profile-ec.component.d.ts +2 -0
- package/lib/ec-components/user-portal-ec/user-security-ec/user-security-ec.component.d.ts +2 -0
- package/lib/ec-components/wishlist-ec/wishlist-ec.component.d.ts +19 -0
- package/lib/ec-components/wishlist-ec/wishlist-item-ec/wishlist-item-ec.component.d.ts +3 -0
- package/lib/ec-guards/access-policy.guard.d.ts +6 -0
- package/lib/ec-guards/guest-only.guard.d.ts +6 -0
- package/lib/ec-guards/index.d.ts +2 -0
- package/lib/ec-services/access-policy-navigation.service.d.ts +23 -0
- package/lib/ec-services/access-policy.service.d.ts +39 -0
- package/lib/ec-services/address-book.service.d.ts +4 -0
- package/lib/ec-services/analytics/google-analytics.service.d.ts +1 -1
- package/lib/ec-services/analytics/gtm.service.d.ts +1 -1
- package/lib/ec-services/capabilities.service.d.ts +16 -0
- package/lib/ec-services/cart.service.d.ts +18 -5
- package/lib/ec-services/checkout.service.d.ts +11 -5
- package/lib/ec-services/commerce-access.service.d.ts +20 -0
- package/lib/ec-services/file-security-validator.service.d.ts +1 -1
- package/lib/ec-services/index.d.ts +4 -0
- package/lib/ec-services/order-documents-visibility.service.d.ts +2 -1
- package/lib/ec-services/orders.service.d.ts +8 -0
- package/lib/ec-services/payment.service.d.ts +1 -1
- package/lib/ec-services/product-detail.service.d.ts +1 -0
- package/lib/ec-services/profile.service.d.ts +3 -0
- package/lib/ec-services/quantity-rules.service.d.ts +14 -6
- package/lib/ec-services/shipment.service.d.ts +4 -1
- package/lib/ec-services/wishlist.service.d.ts +5 -0
- package/lib/interfaces/access-policy.d.ts +22 -0
- package/lib/interfaces/capabilities.d.ts +11 -0
- package/lib/interfaces/cart-session-state.d.ts +1 -0
- package/lib/interfaces/channel.d.ts +8 -0
- package/lib/interfaces/checkout.d.ts +14 -1
- package/lib/interfaces/index.d.ts +4 -0
- package/lib/interfaces/product.d.ts +52 -1
- package/lib/providers/access-policy-internal.d.ts +4 -0
- package/lib/providers/checkout-access-denied.d.ts +17 -0
- package/lib/providers/index.d.ts +3 -0
- package/lib/providers/provideAccessPolicy.d.ts +14 -0
- package/lib/providers/provideCapabilities.d.ts +9 -0
- package/lib/utils/index.d.ts +3 -0
- package/lib/utils/price-presentation.service.d.ts +84 -0
- package/lib/utils/product-image-resolver.d.ts +7 -0
- package/lib/utils/product-variant-resolver.d.ts +7 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,3 +1,34 @@
|
|
|
1
|
+
# Version 0.6.42
|
|
2
|
+
- Capabilities locales: se agrega `provideEasyCommerceCapabilities(...)` para configurar de forma declarativa `documents`, `bulkAdd` y `cartPreprint` desde el bootstrap del frontend.
|
|
3
|
+
- Compatibilidad: `CapabilitiesService` utiliza defaults deshabilitados y mantiene sincronizados los setters/getters legacy de documentos, agregado masivo y preimpresión de carrito.
|
|
4
|
+
- SSR: la configuración de capabilities es sincrónica, determinista y no depende de APIs del navegador.
|
|
5
|
+
- Wishlist: `WishlistEcComponent`, `WishlistItemEcComponent` y `WishlistModalEcComponent` consumen variables CSS semánticas con fallback al theme genérico del frontend.
|
|
6
|
+
- Wishlist: el agregado masivo al carrito informa los productos sin stock y permite continuar sólo con los productos disponibles.
|
|
7
|
+
- Portal de usuario: la ausencia o invalidez de `section` restablece la sección activa a `profile`.
|
|
8
|
+
- Precios y promociones: se centraliza la presentación de precios de productos, variantes, líneas de carrito y resúmenes mediante contratos normalizados, preservando compatibilidad legacy y sin recalcular importes en los templates.
|
|
9
|
+
- Precios sin impuesto: se aceptan contratos de pricing con `hasTax=false` aunque `rate` e `includedInPrice` estén omitidos, preservando `current`, `previous` y el fallback legacy.
|
|
10
|
+
- Precios y promociones: se corrige la presentación visual de `previous`/`current` y el descuento sólo se muestra cuando `previous` es mayor que el precio actual.
|
|
11
|
+
- Variantes y precios: se centraliza la resolución de la variante concreta y se preserva la semántica de rango, precio exacto y `previous` para productos simples, únicos y multivariantes.
|
|
12
|
+
- Productos: se agrega `resolveProductImages(...)` para resolver imágenes de variante con fallback seguro a `picturesdefault`, sin mutar el payload.
|
|
13
|
+
- Product Detail: se mantiene la restauración de variantes mediante `?variant=<variant.code>` y `ProductDetailService.setOption()`, preservando enlaces legacy sin query param.
|
|
14
|
+
- Carrito y sidebar: el fallback de precios legacy, la mutación de precios y la presentación de subtotales, descuentos, impuestos, cupones, shipping y totales utilizan la variante real del item, sin depender ambiguamente de `variants[0]` ni recalcular importes en los templates.
|
|
15
|
+
- Checkout y pedidos: se preservan los contratos históricos y la presentación de precios persistidos, incluyendo compatibilidad con respuestas legacy.
|
|
16
|
+
- Auth: una restauración de sesión fallida ejecuta la misma limpieza completa que un logout, notificando el estado deslogueado a los servicios dependientes.
|
|
17
|
+
- Documentos de usuario y pedido: se diferencian los estados de carga, error y lista vacía, con feedback traducible para fallos de listado, upload y eliminación.
|
|
18
|
+
- Documentos: se bloquean uploads concurrentes, se rechazan archivos vacíos, se agregan confirmaciones traducibles para eliminar documentos de usuario y se codifican los nombres en las URLs de descarga.
|
|
19
|
+
- Documentos: se mejora la accesibilidad y la presentación responsive mediante estilos neutros y variables CSS semánticas tematizables por cada frontend.
|
|
20
|
+
- Cantidades: `QuantityRulesService`, Product, Product Detail, Cart Item y CartService centralizan y consumen las reglas de mínimo, múltiplo absoluto, máximo y stock de la variante efectiva, incluyendo normalización, incremento/decremento, compatibilidad legacy y validación segura cuando no existe una variante válida.
|
|
21
|
+
- Créditos: la validación de saldo utiliza la variante resuelta y falla de forma segura cuando un producto multivariante no tiene identidad válida.
|
|
22
|
+
- Agregado masivo: `CollectionEcComponent` utiliza la variante indicada por `productToCartItem` y aplica el stock, la cantidad y las reglas de la variante seleccionada.
|
|
23
|
+
- Access Policy: se agregan `EasyCommerceAccessPolicy`, guards configurables por dimensión, navegación segura con `returnUrl` y compatibilidad legacy para frontends que no configuran la policy.
|
|
24
|
+
- Carrito anónimo: `CommerceAccessService` centraliza el acceso a las operaciones de carrito y permite mantenimiento seguro de carritos guest preexistentes sin acoplar `CartService` a la policy.
|
|
25
|
+
- Checkout guest: se agrega compatibilidad explícita para `allowGuestCheckout`, enforcement en `CheckoutEcComponent` y `CheckoutAccessDeniedHandler` configurable mediante provider o factory con DI.
|
|
26
|
+
- Ciclo de sesión: `CartSessionState` y generaciones internas protegen la sincronización del carrito, descartan respuestas stale y hacen que Checkout espere el carrito final de la sesión actual.
|
|
27
|
+
- Checkout: se invalidan contextos ante cambios de sesión y se protegen respuestas de addressing, shipping y payment para evitar publicar estados, costos, preferencias o URLs de contextos anteriores.
|
|
28
|
+
- Auth: las requests concurrentes comparten el refresh token en curso y finalizan de forma determinista cuando el refresh falla, evitando esperas indefinidas y loops de retry.
|
|
29
|
+
- Estado privado: Account, Profile, Orders, Address Book, Documents, Security y Wishlist limpian estado al perder la sesión y descartan respuestas async de usuarios anteriores.
|
|
30
|
+
- Tests: se amplía la cobertura de capabilities, pricing, variantes, cantidades, créditos, agregado masivo, Wishlist, portal, documentos y regresiones de carrito.
|
|
31
|
+
|
|
1
32
|
# Version 0.6.41
|
|
2
33
|
- Checkout y carrito: se soportan descuentos y recargos por método de pago desde `totals.paymentMethodAdjustment`, preservando el signo y separándolos de las promociones normales.
|
|
3
34
|
- Métodos de pago: se muestra el preview de ajustes porcentuales y fijos, incluyendo el signo explícito para recargos.
|
package/assets/ec-i18n/ct.json
CHANGED
|
@@ -457,5 +457,42 @@
|
|
|
457
457
|
"user-portal.addresses.cancel": "Cancel\u00b7lar",
|
|
458
458
|
"user-portal.addresses.save": "Desar",
|
|
459
459
|
"user-portal.addresses.success-saved": "Adreça desada correctament.",
|
|
460
|
-
"user-portal.addresses.error-save": "No s'ha pogut desar l'adreça."
|
|
460
|
+
"user-portal.addresses.error-save": "No s'ha pogut desar l'adreça.",
|
|
461
|
+
"user-portal.documents.empty": "No tens documents pujats.",
|
|
462
|
+
"user-portal.documents.upload-title": "Pujar document",
|
|
463
|
+
"user-portal.documents.file": "Fitxer",
|
|
464
|
+
"user-portal.documents.type": "Tipus de document",
|
|
465
|
+
"user-portal.documents.type-none": "Sense especificar",
|
|
466
|
+
"user-portal.documents.type-dni": "DNI",
|
|
467
|
+
"user-portal.documents.type-nif": "NIF",
|
|
468
|
+
"user-portal.documents.type-contract": "Contracte",
|
|
469
|
+
"user-portal.documents.type-other": "Altre",
|
|
470
|
+
"user-portal.documents.upload": "Pujar",
|
|
471
|
+
"user-portal.documents.download": "Descarregar",
|
|
472
|
+
"user-portal.documents.delete": "Eliminar",
|
|
473
|
+
"user-portal.documents.upload-success": "Document pujat correctament.",
|
|
474
|
+
"user-portal.documents.upload-error": "No s'ha pogut pujar el document.",
|
|
475
|
+
"user-portal.documents.delete-success": "Document eliminat correctament.",
|
|
476
|
+
"user-portal.documents.allowed-formats": "Formats permesos",
|
|
477
|
+
"user-portal.documents.loading": "Carregant documents",
|
|
478
|
+
"user-portal.documents.load-error": "No s'han pogut carregar els documents.",
|
|
479
|
+
"user-portal.documents.delete-error": "No s'ha pogut eliminar el document.",
|
|
480
|
+
"user-portal.documents.delete-confirm": "Vols eliminar aquest document?",
|
|
481
|
+
"order.documents.title": "Documents de la comanda",
|
|
482
|
+
"order.documents.empty": "No hi ha documents adjunts a aquesta comanda.",
|
|
483
|
+
"order.documents.file": "Fitxer",
|
|
484
|
+
"order.documents.type": "Tipus",
|
|
485
|
+
"order.documents.type-order-note": "Nota de comanda",
|
|
486
|
+
"order.documents.type-payment-receipt": "Comprovant de pagament",
|
|
487
|
+
"order.documents.type-other": "Altre",
|
|
488
|
+
"order.documents.upload": "Adjuntar",
|
|
489
|
+
"order.documents.loading": "Carregant documents de la comanda",
|
|
490
|
+
"order.documents.load-error": "No s'han pogut carregar els documents de la comanda.",
|
|
491
|
+
"order.documents.upload-error": "No s'ha pogut adjuntar el document.",
|
|
492
|
+
"order.documents.download": "Descarregar document",
|
|
493
|
+
"upload.error.size": "El fitxer supera la mida màxima permesa (10 MB).",
|
|
494
|
+
"upload.error.mime-mismatch": "El tipus declarat del fitxer no coincideix amb el seu contingut real.",
|
|
495
|
+
"upload.error.malicious-name": "El nom del fitxer conté caràcters no permesos.",
|
|
496
|
+
"upload.error.forged-file": "El format del fitxer no està permès. Només s'accepten PDF, PNG i JPEG.",
|
|
497
|
+
"upload.error.empty": "El fitxer està buit."
|
|
461
498
|
}
|
package/assets/ec-i18n/en.json
CHANGED
|
@@ -593,5 +593,42 @@
|
|
|
593
593
|
"user-portal.addresses.save": "Save",
|
|
594
594
|
"user-portal.addresses.success-added": "Address added successfully.",
|
|
595
595
|
"user-portal.addresses.error-required": "Street and city are required.",
|
|
596
|
-
"user-portal.addresses.error-save": "Could not save the address."
|
|
596
|
+
"user-portal.addresses.error-save": "Could not save the address.",
|
|
597
|
+
"user-portal.documents.empty": "You have no uploaded documents.",
|
|
598
|
+
"user-portal.documents.upload-title": "Upload document",
|
|
599
|
+
"user-portal.documents.file": "File",
|
|
600
|
+
"user-portal.documents.type": "Document type",
|
|
601
|
+
"user-portal.documents.type-none": "Not specified",
|
|
602
|
+
"user-portal.documents.type-dni": "DNI",
|
|
603
|
+
"user-portal.documents.type-nif": "NIF",
|
|
604
|
+
"user-portal.documents.type-contract": "Contract",
|
|
605
|
+
"user-portal.documents.type-other": "Other",
|
|
606
|
+
"user-portal.documents.upload": "Upload",
|
|
607
|
+
"user-portal.documents.download": "Download",
|
|
608
|
+
"user-portal.documents.delete": "Delete",
|
|
609
|
+
"user-portal.documents.upload-success": "Document uploaded successfully.",
|
|
610
|
+
"user-portal.documents.upload-error": "The document could not be uploaded.",
|
|
611
|
+
"user-portal.documents.delete-success": "Document deleted successfully.",
|
|
612
|
+
"user-portal.documents.allowed-formats": "Allowed formats",
|
|
613
|
+
"user-portal.documents.loading": "Loading documents",
|
|
614
|
+
"user-portal.documents.load-error": "The documents could not be loaded.",
|
|
615
|
+
"user-portal.documents.delete-error": "The document could not be deleted.",
|
|
616
|
+
"user-portal.documents.delete-confirm": "Do you want to delete this document?",
|
|
617
|
+
"order.documents.title": "Order documents",
|
|
618
|
+
"order.documents.empty": "There are no documents attached to this order.",
|
|
619
|
+
"order.documents.file": "File",
|
|
620
|
+
"order.documents.type": "Type",
|
|
621
|
+
"order.documents.type-order-note": "Order note",
|
|
622
|
+
"order.documents.type-payment-receipt": "Payment receipt",
|
|
623
|
+
"order.documents.type-other": "Other",
|
|
624
|
+
"order.documents.upload": "Attach",
|
|
625
|
+
"order.documents.loading": "Loading order documents",
|
|
626
|
+
"order.documents.load-error": "The order documents could not be loaded.",
|
|
627
|
+
"order.documents.upload-error": "The document could not be attached.",
|
|
628
|
+
"order.documents.download": "Download document",
|
|
629
|
+
"upload.error.size": "The file exceeds the maximum allowed size (10 MB).",
|
|
630
|
+
"upload.error.mime-mismatch": "The declared file type does not match its actual content.",
|
|
631
|
+
"upload.error.malicious-name": "The file name contains invalid characters.",
|
|
632
|
+
"upload.error.forged-file": "The file format is not allowed. Only PDF, PNG and JPEG are accepted.",
|
|
633
|
+
"upload.error.empty": "The file is empty."
|
|
597
634
|
}
|
package/assets/ec-i18n/es.json
CHANGED
|
@@ -669,5 +669,14 @@
|
|
|
669
669
|
"upload.error.size": "El archivo supera el tamaño máximo permitido (10 MB).",
|
|
670
670
|
"upload.error.mime-mismatch": "El tipo declarado del archivo no coincide con su contenido real.",
|
|
671
671
|
"upload.error.malicious-name": "El nombre del archivo contiene caracteres no permitidos.",
|
|
672
|
-
"upload.error.forged-file": "El formato del archivo no está permitido. Solo se aceptan PDF, PNG y JPEG."
|
|
672
|
+
"upload.error.forged-file": "El formato del archivo no está permitido. Solo se aceptan PDF, PNG y JPEG.",
|
|
673
|
+
"upload.error.empty": "El archivo está vacío.",
|
|
674
|
+
"user-portal.documents.loading": "Cargando documentos",
|
|
675
|
+
"user-portal.documents.load-error": "No se pudieron cargar los documentos.",
|
|
676
|
+
"user-portal.documents.delete-error": "No se pudo eliminar el documento.",
|
|
677
|
+
"user-portal.documents.delete-confirm": "¿Querés eliminar este documento?",
|
|
678
|
+
"order.documents.loading": "Cargando documentos del pedido",
|
|
679
|
+
"order.documents.load-error": "No se pudieron cargar los documentos del pedido.",
|
|
680
|
+
"order.documents.upload-error": "No se pudo adjuntar el documento.",
|
|
681
|
+
"order.documents.download": "Descargar documento"
|
|
673
682
|
}
|
package/assets/ec-i18n/fr.json
CHANGED
|
@@ -449,5 +449,42 @@
|
|
|
449
449
|
"user-portal.addresses.cancel": "Annuler",
|
|
450
450
|
"user-portal.addresses.save": "Enregistrer",
|
|
451
451
|
"user-portal.addresses.success-saved": "Adresse enregistrée.",
|
|
452
|
-
"user-portal.addresses.error-save": "Impossible d'enregistrer l'adresse."
|
|
452
|
+
"user-portal.addresses.error-save": "Impossible d'enregistrer l'adresse.",
|
|
453
|
+
"user-portal.documents.empty": "Vous n'avez aucun document envoyé.",
|
|
454
|
+
"user-portal.documents.upload-title": "Envoyer un document",
|
|
455
|
+
"user-portal.documents.file": "Fichier",
|
|
456
|
+
"user-portal.documents.type": "Type de document",
|
|
457
|
+
"user-portal.documents.type-none": "Non spécifié",
|
|
458
|
+
"user-portal.documents.type-dni": "DNI",
|
|
459
|
+
"user-portal.documents.type-nif": "NIF",
|
|
460
|
+
"user-portal.documents.type-contract": "Contrat",
|
|
461
|
+
"user-portal.documents.type-other": "Autre",
|
|
462
|
+
"user-portal.documents.upload": "Envoyer",
|
|
463
|
+
"user-portal.documents.download": "Télécharger",
|
|
464
|
+
"user-portal.documents.delete": "Supprimer",
|
|
465
|
+
"user-portal.documents.upload-success": "Document envoyé avec succès.",
|
|
466
|
+
"user-portal.documents.upload-error": "Impossible d'envoyer le document.",
|
|
467
|
+
"user-portal.documents.delete-success": "Document supprimé avec succès.",
|
|
468
|
+
"user-portal.documents.allowed-formats": "Formats autorisés",
|
|
469
|
+
"user-portal.documents.loading": "Chargement des documents",
|
|
470
|
+
"user-portal.documents.load-error": "Impossible de charger les documents.",
|
|
471
|
+
"user-portal.documents.delete-error": "Impossible de supprimer le document.",
|
|
472
|
+
"user-portal.documents.delete-confirm": "Voulez-vous supprimer ce document ?",
|
|
473
|
+
"order.documents.title": "Documents de la commande",
|
|
474
|
+
"order.documents.empty": "Aucun document n'est joint à cette commande.",
|
|
475
|
+
"order.documents.file": "Fichier",
|
|
476
|
+
"order.documents.type": "Type",
|
|
477
|
+
"order.documents.type-order-note": "Note de commande",
|
|
478
|
+
"order.documents.type-payment-receipt": "Justificatif de paiement",
|
|
479
|
+
"order.documents.type-other": "Autre",
|
|
480
|
+
"order.documents.upload": "Joindre",
|
|
481
|
+
"order.documents.loading": "Chargement des documents de la commande",
|
|
482
|
+
"order.documents.load-error": "Impossible de charger les documents de la commande.",
|
|
483
|
+
"order.documents.upload-error": "Impossible de joindre le document.",
|
|
484
|
+
"order.documents.download": "Télécharger le document",
|
|
485
|
+
"upload.error.size": "Le fichier dépasse la taille maximale autorisée (10 Mo).",
|
|
486
|
+
"upload.error.mime-mismatch": "Le type déclaré du fichier ne correspond pas à son contenu réel.",
|
|
487
|
+
"upload.error.malicious-name": "Le nom du fichier contient des caractères interdits.",
|
|
488
|
+
"upload.error.forged-file": "Le format du fichier n'est pas autorisé. Seuls les PDF, PNG et JPEG sont acceptés.",
|
|
489
|
+
"upload.error.empty": "Le fichier est vide."
|
|
453
490
|
}
|
package/assets/ec-i18n/gl.json
CHANGED
|
@@ -457,5 +457,42 @@
|
|
|
457
457
|
"user-portal.addresses.cancel": "Cancelar",
|
|
458
458
|
"user-portal.addresses.save": "Gardar",
|
|
459
459
|
"user-portal.addresses.success-saved": "Enderezo gardado correctamente.",
|
|
460
|
-
"user-portal.addresses.error-save": "Non se puido gardar o enderezo."
|
|
460
|
+
"user-portal.addresses.error-save": "Non se puido gardar o enderezo.",
|
|
461
|
+
"user-portal.documents.empty": "Non tes documentos subidos.",
|
|
462
|
+
"user-portal.documents.upload-title": "Subir documento",
|
|
463
|
+
"user-portal.documents.file": "Ficheiro",
|
|
464
|
+
"user-portal.documents.type": "Tipo de documento",
|
|
465
|
+
"user-portal.documents.type-none": "Sen especificar",
|
|
466
|
+
"user-portal.documents.type-dni": "DNI",
|
|
467
|
+
"user-portal.documents.type-nif": "NIF",
|
|
468
|
+
"user-portal.documents.type-contract": "Contrato",
|
|
469
|
+
"user-portal.documents.type-other": "Outro",
|
|
470
|
+
"user-portal.documents.upload": "Subir",
|
|
471
|
+
"user-portal.documents.download": "Descargar",
|
|
472
|
+
"user-portal.documents.delete": "Eliminar",
|
|
473
|
+
"user-portal.documents.upload-success": "Documento subido correctamente.",
|
|
474
|
+
"user-portal.documents.upload-error": "Non se puido subir o documento.",
|
|
475
|
+
"user-portal.documents.delete-success": "Documento eliminado correctamente.",
|
|
476
|
+
"user-portal.documents.allowed-formats": "Formatos permitidos",
|
|
477
|
+
"user-portal.documents.loading": "Cargando documentos",
|
|
478
|
+
"user-portal.documents.load-error": "Non se puideron cargar os documentos.",
|
|
479
|
+
"user-portal.documents.delete-error": "Non se puido eliminar o documento.",
|
|
480
|
+
"user-portal.documents.delete-confirm": "Queres eliminar este documento?",
|
|
481
|
+
"order.documents.title": "Documentos do pedido",
|
|
482
|
+
"order.documents.empty": "Non hai documentos adxuntos a este pedido.",
|
|
483
|
+
"order.documents.file": "Ficheiro",
|
|
484
|
+
"order.documents.type": "Tipo",
|
|
485
|
+
"order.documents.type-order-note": "Nota do pedido",
|
|
486
|
+
"order.documents.type-payment-receipt": "Xustificante de pagamento",
|
|
487
|
+
"order.documents.type-other": "Outro",
|
|
488
|
+
"order.documents.upload": "Adxuntar",
|
|
489
|
+
"order.documents.loading": "Cargando documentos do pedido",
|
|
490
|
+
"order.documents.load-error": "Non se puideron cargar os documentos do pedido.",
|
|
491
|
+
"order.documents.upload-error": "Non se puido adxuntar o documento.",
|
|
492
|
+
"order.documents.download": "Descargar documento",
|
|
493
|
+
"upload.error.size": "O ficheiro supera o tamaño máximo permitido (10 MB).",
|
|
494
|
+
"upload.error.mime-mismatch": "O tipo declarado do ficheiro non coincide co seu contido real.",
|
|
495
|
+
"upload.error.malicious-name": "O nome do ficheiro contén caracteres non permitidos.",
|
|
496
|
+
"upload.error.forged-file": "O formato do ficheiro non está permitido. Só se aceptan PDF, PNG e JPEG.",
|
|
497
|
+
"upload.error.empty": "O ficheiro está baleiro."
|
|
461
498
|
}
|
package/assets/ec-i18n/pr.json
CHANGED
|
@@ -457,5 +457,42 @@
|
|
|
457
457
|
"user-portal.addresses.cancel": "Cancelar",
|
|
458
458
|
"user-portal.addresses.save": "Salvar",
|
|
459
459
|
"user-portal.addresses.success-saved": "Endereço salvo com sucesso.",
|
|
460
|
-
"user-portal.addresses.error-save": "Não foi possível salvar o endereço."
|
|
460
|
+
"user-portal.addresses.error-save": "Não foi possível salvar o endereço.",
|
|
461
|
+
"user-portal.documents.empty": "Você não tem documentos enviados.",
|
|
462
|
+
"user-portal.documents.upload-title": "Enviar documento",
|
|
463
|
+
"user-portal.documents.file": "Arquivo",
|
|
464
|
+
"user-portal.documents.type": "Tipo de documento",
|
|
465
|
+
"user-portal.documents.type-none": "Não especificado",
|
|
466
|
+
"user-portal.documents.type-dni": "DNI",
|
|
467
|
+
"user-portal.documents.type-nif": "NIF",
|
|
468
|
+
"user-portal.documents.type-contract": "Contrato",
|
|
469
|
+
"user-portal.documents.type-other": "Outro",
|
|
470
|
+
"user-portal.documents.upload": "Enviar",
|
|
471
|
+
"user-portal.documents.download": "Baixar",
|
|
472
|
+
"user-portal.documents.delete": "Excluir",
|
|
473
|
+
"user-portal.documents.upload-success": "Documento enviado com sucesso.",
|
|
474
|
+
"user-portal.documents.upload-error": "Não foi possível enviar o documento.",
|
|
475
|
+
"user-portal.documents.delete-success": "Documento excluído com sucesso.",
|
|
476
|
+
"user-portal.documents.allowed-formats": "Formatos permitidos",
|
|
477
|
+
"user-portal.documents.loading": "Carregando documentos",
|
|
478
|
+
"user-portal.documents.load-error": "Não foi possível carregar os documentos.",
|
|
479
|
+
"user-portal.documents.delete-error": "Não foi possível excluir o documento.",
|
|
480
|
+
"user-portal.documents.delete-confirm": "Deseja excluir este documento?",
|
|
481
|
+
"order.documents.title": "Documentos do pedido",
|
|
482
|
+
"order.documents.empty": "Não há documentos anexados a este pedido.",
|
|
483
|
+
"order.documents.file": "Arquivo",
|
|
484
|
+
"order.documents.type": "Tipo",
|
|
485
|
+
"order.documents.type-order-note": "Nota do pedido",
|
|
486
|
+
"order.documents.type-payment-receipt": "Comprovante de pagamento",
|
|
487
|
+
"order.documents.type-other": "Outro",
|
|
488
|
+
"order.documents.upload": "Anexar",
|
|
489
|
+
"order.documents.loading": "Carregando documentos do pedido",
|
|
490
|
+
"order.documents.load-error": "Não foi possível carregar os documentos do pedido.",
|
|
491
|
+
"order.documents.upload-error": "Não foi possível anexar o documento.",
|
|
492
|
+
"order.documents.download": "Baixar documento",
|
|
493
|
+
"upload.error.size": "O arquivo excede o tamanho máximo permitido (10 MB).",
|
|
494
|
+
"upload.error.mime-mismatch": "O tipo declarado do arquivo não corresponde ao seu conteúdo real.",
|
|
495
|
+
"upload.error.malicious-name": "O nome do arquivo contém caracteres não permitidos.",
|
|
496
|
+
"upload.error.forged-file": "O formato do arquivo não é permitido. Somente PDF, PNG e JPEG são aceitos.",
|
|
497
|
+
"upload.error.empty": "O arquivo está vazio."
|
|
461
498
|
}
|
|
@@ -4,6 +4,7 @@ import { isPlatformBrowser, DOCUMENT } from '@angular/common';
|
|
|
4
4
|
import { ENVIRONMENT_TOKEN } from '../providers';
|
|
5
5
|
import { BehaviorSubject } from 'rxjs';
|
|
6
6
|
import { WishlistVisibilityService } from '../ec-services/wishlist-visibility.service';
|
|
7
|
+
import { CapabilitiesService } from '../ec-services/capabilities.service';
|
|
7
8
|
import * as i0 from "@angular/core";
|
|
8
9
|
/**
|
|
9
10
|
* Servicio que provee las constantes necesarias que se utilizan por toda la aplicación.
|
|
@@ -27,6 +28,7 @@ export class CoreConstantsService {
|
|
|
27
28
|
*/
|
|
28
29
|
_document = inject(DOCUMENT);
|
|
29
30
|
_wishlistVisibility = inject(WishlistVisibilityService);
|
|
31
|
+
_capabilities = inject(CapabilitiesService);
|
|
30
32
|
/**
|
|
31
33
|
* Contiene los datos provisto por el frontend en el archivo environment.ts
|
|
32
34
|
*/
|
|
@@ -336,18 +338,14 @@ export class CoreConstantsService {
|
|
|
336
338
|
productsWithUniqueVariant = false;
|
|
337
339
|
setProductWithUniqueVariant(value) { this.productsWithUniqueVariant = value; }
|
|
338
340
|
getProductWithUniqueVariant() { return this.productsWithUniqueVariant; }
|
|
339
|
-
// Habilita el flujo de agregado masivo en collection/product.
|
|
340
|
-
bulkAddEnabled = false;
|
|
341
341
|
// Habilita rutas de producto por slug de forma opt-in por frontend/canal.
|
|
342
342
|
useProductSlugRoute = false;
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
setBulkAddEnabled(value) { this.bulkAddEnabled = value; }
|
|
346
|
-
getBulkAddEnabled() { return this.bulkAddEnabled; }
|
|
343
|
+
setBulkAddEnabled(value) { this._capabilities.setBulkAdd(value); }
|
|
344
|
+
getBulkAddEnabled() { return this._capabilities.bulkAdd(); }
|
|
347
345
|
setUseProductSlugRoute(value) { this.useProductSlugRoute = !!value; }
|
|
348
346
|
getUseProductSlugRoute() { return this.useProductSlugRoute; }
|
|
349
|
-
setCartPreprintEnabled(value) { this.
|
|
350
|
-
getCartPreprintEnabled() { return this.
|
|
347
|
+
setCartPreprintEnabled(value) { this._capabilities.setCartPreprint(value); }
|
|
348
|
+
getCartPreprintEnabled() { return this._capabilities.cartPreprint(); }
|
|
351
349
|
/**
|
|
352
350
|
* @description esta variable se utiliza para configurar los parametros cuando se desea mostrar
|
|
353
351
|
* variantes el listado de productos.
|
|
@@ -411,4 +409,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
411
409
|
providedIn: 'root'
|
|
412
410
|
}]
|
|
413
411
|
}], ctorParameters: () => [] });
|
|
414
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5jb25zdGFudHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWVhc3ljb21tZXJjZS12MTgvc3JjL2xpYi9jb25zdGFudHMvY29yZS5jb25zdGFudHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOztBQUN2Rjs7OztHQUlHO0FBSUgsTUFBTSxPQUFPLG9CQUFvQjtJQUV6QixXQUFXLEdBQVcsRUFBRSxDQUFDO0lBQ3hCLG1CQUFtQixHQUFHLElBQUksZUFBZSxDQUFtQixRQUFRLENBQUMsQ0FBQztJQUN2RSxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQy9EOztPQUVHO0lBQ0ssWUFBWSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBQ2xEOztPQUVHO0lBQ08sVUFBVSxHQUFRLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMvQzs7T0FFRztJQUNLLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDaEU7O09BRUc7SUFDSyxXQUFXLEdBQWdCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFB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amVjdCwgSW5qZWN0YWJsZSwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwaUNvbnN0YW50c1NlcnZpY2UgfSBmcm9tICcuL2FwaS5jb25zdGFudHMuc2VydmljZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciwgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ3VycmVuY3lDb25maWcsIGN1cnJlbmN5VHlwZSwgUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCwgRW52aXJvbm1lbnQsIENoZWNrb3V0Vmlld1R5cGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEVOVklST05NRU5UX1RPS0VOIH0gZnJvbSAnLi4vcHJvdmlkZXJzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgV2lzaGxpc3RWaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL2VjLXNlcnZpY2VzL3dpc2hsaXN0LXZpc2liaWxpdHkuc2VydmljZSc7XG4vKipcbiAqIFNlcnZpY2lvIHF1ZSBwcm92ZWUgbGFzIGNvbnN0YW50ZXMgbmVjZXNhcmlhcyBxdWUgc2UgdXRpbGl6YW4gcG9yIHRvZGEgbGEgYXBsaWNhY2nDs24uXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgQ29yZUNvbnN0YW50c1NlcnZpY2VcbiAqL1xuQEluamVjdGFibGUoe1xuXHRwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ29yZUNvbnN0YW50c1NlcnZpY2Uge1xuXG5cdHB1YmxpYyBzZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG5cdHByaXZhdGUgY2hlY2tvdXRWaWV3U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hlY2tvdXRWaWV3VHlwZT4oJ2xlZ2FjeScpO1xuXHRwdWJsaWMgY2hlY2tvdXRWaWV3JCA9IHRoaXMuY2hlY2tvdXRWaWV3U3ViamVjdC5hc09ic2VydmFibGUoKTtcblx0LyoqXG5cdCAqIFNlcnZpY2lvIHF1ZSBjb250aWVuZSBsYXMgY29uc3RhbnRlcyB1c2FkYXMgcGFyYSBsYSBBUElcblx0ICovXG5cdHByaXZhdGUgYXBpQ29uc3RhbnRzID0gaW5qZWN0KEFwaUNvbnN0YW50c1NlcnZpY2UpXG5cdC8qKlxuXHQgKiBQcm92ZWUgZWwgSUQgZGUgbGEgcGxhdGFmb3JtYSBlbiBkb25kZSBzZSBlc3RhIGVqZWN1dGFuZG8gZWwgY29kaWdvLCBlc3RvIHNpcnZlIHBhcmEgcG9kZXIgZGlmZXJlbmNpYXIgc2kgZXMgZGUgdW4gc2Vydmlkb3IgbyB1biBuYXZlZ2Fkb3Igd2ViLlxuXHQgKi9cblx0cHJvdGVjdGVkIHBsYXRmb3JtSWQ6IGFueSA9IGluamVjdChQTEFURk9STV9JRClcblx0LyoqXG5cdCAqIERvY3VtZW50IHRva2VuIHBhcmEgYWNjZXNvIFNTUi1jb21wYXRpYmxlIGFsIGRvY3VtZW50b1xuXHQgKi9cblx0cHJpdmF0ZSBfZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXHRwcml2YXRlIF93aXNobGlzdFZpc2liaWxpdHkgPSBpbmplY3QoV2lzaGxpc3RWaXNpYmlsaXR5U2VydmljZSk7XG5cdC8qKlxuXHQgKiBDb250aWVuZSBsb3MgZGF0b3MgcHJvdmlzdG8gcG9yIGVsIGZyb250ZW5kIGVuIGVsIGFyY2hpdm8gZW52aXJvbm1lbnQudHNcblx0ICovXG5cdHByaXZhdGUgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50ID0gaW5qZWN0KEVOVklST05NRU5UX1RPS0VOKVxuXHQvKipcblx0ICogR3VhcmRhIGxhIHZhcmlhYmxlIHdpbmRvdyBkZWwgd2ViIGJyb3dzZXIuXG5cdCAqL1xuXHRwcml2YXRlIHdpbmRvdz86V2luZG93O1xuXG5cdC8qKlxuXHQgKiBUaXBvIGRlIHJ1dGEgYWN0dWFsIChlajogJ2NhdGVnb3JpZXMnLCAnYXR0cmlidXRlcycsIGV0YykuXG5cdCAqIExvIHVzYW1vcyBwYXJhIHF1ZSBQYWdpbmF0aW9uU2VydmljZSBzZXBhIHF1w6kgZmlsdHJvIGVzcGVyYXIuXG5cdCAqL1xuXHRwdWJsaWMgY3VycmVudFJvdXRlVHlwZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cdFxuXHQvKipcblx0ICogR2V0dGVyIHNlZ3VybyBwYXJhIGRvY3VtZW50IHF1ZSB2ZXJpZmljYSBsYSBwbGF0YWZvcm1hXG5cdCAqL1xuXHRwcml2YXRlIGdldCBkb2N1bWVudCgpOiBEb2N1bWVudCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgPyB0aGlzLl9kb2N1bWVudCA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHR0aGlzLndpbmRvdyA9IHdpbmRvdztcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIFBhdGggdXNhZG8gZW4gbGFzIGNvbGVjY2lvbmVzIGRlIHByb2R1Y3Rvcy5cblx0ICovXG5cdHB1YmxpYyBQUk9EVUNUX0xJU1RfUk9VVEU6IHN0cmluZyA9ICdjb2xsZWN0aW9uLyc7XG5cdC8qKlxuXHQgKiBQYXRoIHVzYWRvIHBhcmEgYWNjZWRlciBhIGxhcyBzZWNjaW9uZXMuXG5cdCAqL1xuXHRwdWJsaWMgU0VDVElPTlNfUk9VVEU6IHN0cmluZyA9ICdzZWN0aW9ucy8nO1xuXHQvKipcblx0ICogUGF0aCBxdWUgYWxvamEgbGEgY2FycGV0YSBkZSBsb3MgYXNzZXRzLlxuXHQgKi9cblx0cHVibGljIHJlYWRvbmx5IEFTU0VUU19VUkw6IHN0cmluZyA9IHRoaXMuYXBpQ29uc3RhbnRzLkFQSV9VUkw7XG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIHVybCBkb25kZSBzZSBndWFyZGEgbGFzIGltYWdlbmVzLlxuXHQgKiBAcGFyYW0gcG9zdE1lZGlhIFxuXHQgKiBAcmV0dXJucyBcblx0ICovXG5cdHB1YmxpYyBtZWRpYVVybCA9IChwb3N0TWVkaWE/OiBzdHJpbmcpID0+IHRoaXMuQVNTRVRTX1VSTCArICh0aGlzLkFTU0VUU19VUkwgPT0gdGhpcy5hcGlDb25zdGFudHMuQVBJX1VSTCA/ICdtZWRpYS8nIDogJycpICsgKHBvc3RNZWRpYSA/IHBvc3RNZWRpYSA6IFwiaW1hZ2UvXCIpO1xuXHQvKipcblx0ICogUmV0b3JuYSBsYSB1cmwgZG9uZGUgc2UgZ3VhcmRhIGxhcyBpbWFnZW5lcy5cblx0ICogQHBhcmFtIHBvc3RNZWRpYSBcblx0ICogQHJldHVybnMgXG5cdCAqL1xuXHRwdWJsaWMgbWVkaWFJbWFnZVVybCA9IChwb3N0TWVkaWE/OiBzdHJpbmcpID0+IHRoaXMuQVNTRVRTX1VSTCArICh0aGlzLkFTU0VUU19VUkwgPT0gdGhpcy5hcGlDb25zdGFudHMuQVBJX1VSTCA/ICdtZWRpYS9pbWFnZS8nIDogJycpICsgKHBvc3RNZWRpYSA/IHBvc3RNZWRpYSA6IFwiaW1hZ2UvXCIpO1xuXHQvKipcblx0ICogUmV0b3JuYSBsYSB1cmwgZGVsIHNpdGlvLlxuXHQgKiBAcGFyYW0gcG9zdE1lZGlhIFxuXHQgKiBAcmV0dXJucyBcblx0ICovXG5cdHB1YmxpYyB1cmwgPSAoKSA9PiB0aGlzLmFwaUNvbnN0YW50cy5BUElfVVJMLnJlcGxhY2UoL1xcLyQvLCAnJyk7IC8vIHJlbW92ZSBsYXN0IHNsYXNoXHRcblxuXHQvKipcblx0ICogVVJMIGRlbCBzaXRpbyBmcm9udGVuZCAtIENvbXBhdGlibGUgY29uIEFuZ3VsYXIgU1NSXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IEZST05URU5EX1VSTCgpOiBzdHJpbmcge1xuXHRcdC8vIFZlcmlmaWNhciBzaSBlc3RhbW9zIGVuIGVsIG5hdmVnYWRvclxuXHRcdGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG5cdFx0XHQvLyBQcmltZXJvIGludGVudGEgbGVlciBkZSB3aW5kb3cuX19lbnYgKGNvbmZpZ3VyYWRvIHBvciBEb2NrZXIvQ0kpXG5cdFx0XHRjb25zdCB3aW5kb3dFbnYgPSAodGhpcy53aW5kb3cgYXMgYW55KT8uX19lbnY7XG5cdFx0XHRpZiAod2luZG93RW52Py5mcm9udGVuZFVybCkge1xuXHRcdFx0XHQvLyBMb2cgcGFyYSBkZWJ1Z2dpbmcgZW4gZGVzYXJyb2xsb1xuXHRcdFx0XHRpZiAoIXdpbmRvd0Vudi5mcm9udGVuZFVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oJ1tGUk9OVEVORF9VUkxdIEludmFsaWQgZnJvbnRlbmRVcmwgZm9ybWF0OicsIHdpbmRvd0Vudi5mcm9udGVuZFVybCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHdpbmRvd0Vudi5mcm9udGVuZFVybDtcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0Ly8gU2kgbm8gaGF5IGNvbmZpZ3VyYWNpw7NuIGVzcGVjw61maWNhLCBjb25zdHJ1aXIgZGVzZGUgd2luZG93LmxvY2F0aW9uXG5cdFx0XHRpZiAodGhpcy53aW5kb3c/LmxvY2F0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IHVybCA9IGAke3RoaXMud2luZG93LmxvY2F0aW9uLnByb3RvY29sfS8vJHt0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0fWA7XG5cdFx0XHRcdC8vIFZlcmlmaWNhciBxdWUgbm8gc2VhIGxvY2FsaG9zdCBvIDEyNy4wLjAuMSBlbiBwcm9kdWNjacOzblxuXHRcdFx0XHRpZiAodXJsLmluY2x1ZGVzKCcxMjcuMC4wLjEnKSB8fCB1cmwuaW5jbHVkZXMoJ2xvY2FsaG9zdCcpKSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCdbRlJPTlRFTkRfVVJMXSBVc2luZyBsb2NhbGhvc3QgVVJMIGluIHByb2R1Y3Rpb24sIGNvbnNpZGVyIHNldHRpbmcgd2luZG93Ll9fZW52LmZyb250ZW5kVXJsJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHVybDtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0Ly8gUGFyYSBTU1IsIGludGVudGFyIGNvbnN0cnVpciBkZXNkZSBlbCBkb2N1bWVudCBzaSBlc3TDoSBkaXNwb25pYmxlXG5cdFx0aWYgKHRoaXMuZG9jdW1lbnQ/LmxvY2F0aW9uKSB7XG5cdFx0XHRyZXR1cm4gYCR7dGhpcy5kb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbH0vLyR7dGhpcy5kb2N1bWVudC5sb2NhdGlvbi5ob3N0fWA7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIEludGVudGFyIG9idGVuZXIgZGVzZGUgZW52aXJvbm1lbnRcblx0XHRpZiAodGhpcy5lbnZpcm9ubWVudC5mcm9udGVuZFVybCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQuZnJvbnRlbmRVcmw7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIMOabHRpbW8gZmFsbGJhY2sgLSB1c2FyIGxhIFVSTCBkZWwgQVBJIHNpIGVzdMOhIGNvbmZpZ3VyYWRhIHkgZXMgYWJzb2x1dGFcblx0XHRjb25zdCBhcGlVcmwgPSB0aGlzLmFwaUNvbnN0YW50cy5BUElfVVJMO1xuXHRcdGlmIChhcGlVcmwgJiYgKGFwaVVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgYXBpVXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCB1cmwgPSBuZXcgVVJMKGFwaVVybCk7XG5cdFx0XHRcdHJldHVybiBgJHt1cmwucHJvdG9jb2x9Ly8ke3VybC5ob3N0fWA7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGNvbnNvbGUud2FybignW0ZST05URU5EX1VSTF0gQ291bGQgbm90IHBhcnNlIEFQSSBVUkwgYXMgZmFsbGJhY2s6JywgYXBpVXJsKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0Ly8gRmFsbGJhY2sgZmluYWwgLSByZXRvcm5hciBVUkwgdmFjw61hXG5cdFx0Y29uc29sZS53YXJuKCdbRlJPTlRFTkRfVVJMXSBObyB2YWxpZCBmcm9udGVuZCBVUkwgZm91bmQsIHRoaXMgbWF5IGNhdXNlIGlzc3VlcyB3aXRoIG1ldGEgdGFncycpO1xuXHRcdHJldHVybiAnJztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIFVSTCBjb21wbGV0YSBkZWwgZnJvbnRlbmQgY29uIHVuYSBydXRhIG9wY2lvbmFsXG5cdCAqIEBwYXJhbSBwYXRoIC0gUnV0YSBvcGNpb25hbCBwYXJhIGFncmVnYXIgYSBsYSBVUkwgYmFzZVxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBVUkwgY29tcGxldGEgZGVsIGZyb250ZW5kXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RnJvbnRlbmRVcmwgPSAocGF0aD86IHN0cmluZyk6IHN0cmluZyA9PiB7XG5cdFx0Y29uc3QgYmFzZVVybCA9IHRoaXMuRlJPTlRFTkRfVVJMO1xuXHRcdGlmICghcGF0aCkge1xuXHRcdFx0cmV0dXJuIGJhc2VVcmw7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIEFzZWd1cmFyIHF1ZSBsYSBydXRhIGNvbWllbmNlIGNvbiAnLycgeSBubyB0ZW5nYSBkb2JsZSBzbGFzaFxuXHRcdGNvbnN0IGNsZWFuUGF0aCA9IHBhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6IGAvJHtwYXRofWA7XG5cdFx0Y29uc3QgY2xlYW5CYXNlVXJsID0gYmFzZVVybC5lbmRzV2l0aCgnLycpID8gYmFzZVVybC5zbGljZSgwLCAtMSkgOiBiYXNlVXJsO1xuXHRcdFxuXHRcdHJldHVybiBgJHtjbGVhbkJhc2VVcmx9JHtjbGVhblBhdGh9YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIFVSTCBhYnNvbHV0YSBkZSB1bmEgaW1hZ2VuIHBhcmEgbWV0YSB0YWdzIChjb21wYXRpYmxlIGNvbiBTU1IpXG5cdCAqIEBwYXJhbSBwb3N0TWVkaWEgLSBSdXRhIGRlIGxhIGltYWdlblxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBVUkwgYWJzb2x1dGEgZGUgbGEgaW1hZ2VuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0QWJzb2x1dGVJbWFnZVVybCA9IChwb3N0TWVkaWE/OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuXHRcdC8vIFNpIGxhIFVSTCB5YSBlcyBhYnNvbHV0YSwgZGV2b2x2ZXJsYSB0YWwgY29tbyBlc3TDoVxuXHRcdGlmIChwb3N0TWVkaWEgJiYgKHBvc3RNZWRpYS5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgcG9zdE1lZGlhLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpKSB7XG5cdFx0XHRyZXR1cm4gcG9zdE1lZGlhO1xuXHRcdH1cblxuXHRcdC8vIENvbnN0cnVpciBsYSBVUkwgZGUgbGEgaW1hZ2VuIHVzYW5kbyBsYSBVUkwgZGVsIEFQSVxuXHRcdGNvbnN0IGltYWdlVXJsID0gdGhpcy5tZWRpYUltYWdlVXJsKHBvc3RNZWRpYSk7XG5cdFx0XG5cdFx0Ly8gU2kgbGEgVVJMIGRlIGxhIGltYWdlbiB5YSBlcyBhYnNvbHV0YSwgZGV2b2x2ZXJsYVxuXHRcdGlmIChpbWFnZVVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgaW1hZ2VVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuXHRcdFx0cmV0dXJuIGltYWdlVXJsO1xuXHRcdH1cblx0XHRcblx0XHQvLyBTaSBlcyB1bmEgVVJMIHJlbGF0aXZhLCBjb252ZXJ0aXJsYSBhIGFic29sdXRhIHVzYW5kbyBsYSBVUkwgYmFzZSBkZWwgQVBJXG5cdFx0Y29uc3QgYXBpQmFzZVVybCA9IHRoaXMuYXBpQ29uc3RhbnRzLkFQSV9VUkw7XG5cdFx0aWYgKGFwaUJhc2VVcmwuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IGFwaUJhc2VVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuXHRcdFx0Ly8gQVBJX1VSTCB5YSBlcyBhYnNvbHV0YVxuXHRcdFx0cmV0dXJuIGltYWdlVXJsO1xuXHRcdH1cblx0XHRcblx0XHQvLyBTaSBBUElfVVJMIGVzIHJlbGF0aXZhLCB1c2FyIGxhIFVSTCBkZWwgZnJvbnRlbmQgY29tbyBiYXNlXG5cdFx0Y29uc3QgZnJvbnRlbmRVcmwgPSB0aGlzLkZST05URU5EX1VSTDtcblx0XHRpZiAoIWZyb250ZW5kVXJsKSB7XG5cdFx0XHRyZXR1cm4gaW1hZ2VVcmw7IC8vIEZhbGxiYWNrIHNpIG5vIHBvZGVtb3MgZGV0ZXJtaW5hciBsYSBVUkwgZGVsIGZyb250ZW5kXG5cdFx0fVxuXHRcdFxuXHRcdC8vIENvbnN0cnVpciBVUkwgYWJzb2x1dGFcblx0XHRjb25zdCBjbGVhbkFwaVVybCA9IGFwaUJhc2VVcmwuc3RhcnRzV2l0aCgnLycpID8gYXBpQmFzZVVybC5zdWJzdHJpbmcoMSkgOiBhcGlCYXNlVXJsO1xuXHRcdGNvbnN0IGNsZWFuRnJvbnRlbmRVcmwgPSBmcm9udGVuZFVybC5lbmRzV2l0aCgnLycpID8gZnJvbnRlbmRVcmwuc2xpY2UoMCwgLTEpIDogZnJvbnRlbmRVcmw7XG5cdFx0Y29uc3QgY2xlYW5JbWFnZVVybCA9IGltYWdlVXJsLnN0YXJ0c1dpdGgoJy8nKSA/IGltYWdlVXJsLnN1YnN0cmluZygxKSA6IGltYWdlVXJsO1xuXHRcdFxuXHRcdHJldHVybiBgJHtjbGVhbkZyb250ZW5kVXJsfS8ke2NsZWFuQXBpVXJsfSR7Y2xlYW5JbWFnZVVybH1gO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnN0cnV5ZSBtZXRhIGluZm9ybWFjacOzbiBwYXJhIHVuYSB3aXNobGlzdCBjb21wYXJ0aWRhLlxuXHQgKiBTZSB1c2EgcGFyYSBPcGVuR3JhcGgvVHdpdHRlciBjYXJkcyBlbiBTU1IgeSBicm93c2VyLlxuXHQgKi9cblx0cHVibGljIGdldFNoYXJlZFdpc2hsaXN0TWV0YSA9IChcblx0XHR3aXNobGlzdDogYW55LFxuXHRcdHRva2VuOiBzdHJpbmcsXG5cdFx0ZmFsbGJhY2tJbWFnZVBhdGggPSAnL2Fzc2V0cy9pbWcvZmF2L2Zhdmljb24uaWNvJ1xuXHQpOiB7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IHVybDogc3RyaW5nOyBpbWFnZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHR3aXR0ZXJDYXJkOiBzdHJpbmcgfSA9PiB7XG5cdFx0Y29uc3QgbGlzdE5hbWUgPSAod2lzaGxpc3Q/Lm5hbWUgfHwgJ1NoYXJlZCB3aXNobGlzdCcpLnRvU3RyaW5nKCkudHJpbSgpO1xuXHRcdGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheSh3aXNobGlzdD8uaXRlbXMpID8gd2lzaGxpc3QuaXRlbXMgOiBbXTtcblx0XHRjb25zdCBpdGVtQ291bnQgPSBpdGVtcy5sZW5ndGg7XG5cdFx0Y29uc3QgZmlyc3RJdGVtID0gaXRlbXNbMF07XG5cdFx0Y29uc3QgZmlyc3RQcm9kdWN0TmFtZSA9IGZpcnN0SXRlbT8ucHJvZHVjdF9uYW1lID8gZmlyc3RJdGVtLnByb2R1Y3RfbmFtZS50b1N0cmluZygpLnRyaW0oKSA6ICcnO1xuXHRcdGNvbnN0IGRlc2NyaXB0aW9uID0gaXRlbUNvdW50XG5cdFx0XHQ/IGAke2xpc3ROYW1lfSAoJHtpdGVtQ291bnR9KSR7Zmlyc3RQcm9kdWN0TmFtZSA/IGAgLSAke2ZpcnN0UHJvZHVjdE5hbWV9YCA6ICcnfWBcblx0XHRcdDogYCR7bGlzdE5hbWV9IC0gc2hhcmVkIHdpc2hsaXN0YDtcblxuXHRcdGNvbnN0IHVybCA9IHRoaXMuZ2V0RnJvbnRlbmRVcmwoYC93aXNobGlzdC9zaGFyZWQvJHt0b2tlbn1gKTtcblx0XHRjb25zdCBpbWFnZSA9IGZpcnN0SXRlbT8ucGljdHVyZV9kZWZhdWx0XG5cdFx0XHQ/IHRoaXMuZ2V0QWJzb2x1dGVJbWFnZVVybChmaXJzdEl0ZW0ucGljdHVyZV9kZWZhdWx0KVxuXHRcdFx0OiB0aGlzLmdldEZyb250ZW5kVXJsKGZhbGxiYWNrSW1hZ2VQYXRoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR0aXRsZTogbGlzdE5hbWUsXG5cdFx0XHRkZXNjcmlwdGlvbixcblx0XHRcdHVybCxcblx0XHRcdGltYWdlLFxuXHRcdFx0dHlwZTogJ3dlYnNpdGUnLFxuXHRcdFx0dHdpdHRlckNhcmQ6ICdzdW1tYXJ5X2xhcmdlX2ltYWdlJ1xuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogTWV0YSBpbmZvcm1hY2nDs24gZmFsbGJhY2sgcGFyYSB3aXNobGlzdCBjb21wYXJ0aWRhIGN1YW5kbyBubyBleGlzdGUgbyBubyBjYXJnYS5cblx0ICovXG5cdHB1YmxpYyBnZXRTaGFyZWRXaXNobGlzdEZhbGxiYWNrTWV0YSA9ICgpOiB7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9ID0+ICh7XG5cdFx0dGl0bGU6ICdTaGFyZWQgd2lzaGxpc3QnLFxuXHRcdGRlc2NyaXB0aW9uOiAnVmlldyB0aGlzIHNoYXJlZCB3aXNobGlzdC4nLFxuXHRcdHR5cGU6ICd3ZWJzaXRlJ1xuXHR9KVxuXG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIHVybCBkZSBsYXMgaW1hZ2VuZXMgZGUgbG9zIGJhbm5lcnNcblx0ICogQHJldHVybnMgXG5cdCAqL1xuXHRwdWJsaWMgbWVkaWFCYW5uZXJVcmwgPSAoKSA9PiB0aGlzLkFTU0VUU19VUkwgKyAodGhpcy5BU1NFVFNfVVJMID09IHRoaXMuYXBpQ29uc3RhbnRzLkFQSV9VUkwgPyAnbWVkaWEvJyA6ICcnKSArIFwiYmFubmVyLWltYWdlL1wiO1xuXHRcblx0bWVkaWFTdG9yZVVybCA9ICgpID0+IHRoaXMuQVNTRVRTX1VSTCArICh0aGlzLkFTU0VUU19VUkwgPT0gdGhpcy5hcGlDb25zdGFudHMuQVBJX1VSTCA/ICdtZWRpYS8nIDogJycpICsgXCJzdG9yZS1pbWFnZS9cIjtcblx0XG5cdC8qKlxuXHQgKiBSZXRvcm5hIGB0cnVlYCBzaSBsYSB2aXN0YSBlcyBtb2JpbGUsIGBmYWxzZWAgY2FzbyBjb250cmFyaW8uXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0cHVibGljIG1vYmlsZVNjcmVlbiA9ICgpOiBib29sZWFuID0+IHRoaXMud2luZG93ICYmIHRoaXMud2luZG93Py5pbm5lcldpZHRoIDwgNzUwIHx8IGZhbHNlO1xuXHQvKipcblx0ICogQ29udGllbmUgbG9zIHZhbG9yZXMgcGFyYSBsYSBtb25lZGEgYWN0dWFsXG5cdCAqL1xuXHRwdWJsaWMgY3VycmVuY3k6IEN1cnJlbmN5Q29uZmlnID0ge1xuXHRcdGNvZGU6ICdBUkcnLFxuXHRcdHN5bWJvbDogJyQnLFxuXHRcdHBvc2l0aW9uOiAnTGVmdCcsXG5cdFx0d2l0aG91dERlY2ltYWw6IGZhbHNlXG5cdH07XG5cblx0LyoqXG5cdCAqIEFycmVnbG8gZGUgdmFsb3JlcyB1c2Fkb3MgcGFyYSBlbCBwaXBlIGN1cnJlbmN5UHJpY2Vcblx0ICovXG5cdHB1YmxpYyBjdXJyZW5jeVR5cGVDb25maWc6IEN1cnJlbmN5Q29uZmlnW10gPSBbXG5cdFx0e1xuXHRcdFx0Y29kZTogJ0VVUicsXG5cdFx0XHRzeW1ib2w6ICfigqwnLFxuXHRcdFx0cG9zaXRpb246ICdSaWdodCcsXG5cdFx0XHR3aXRob3V0RGVjaW1hbDogZmFsc2VcblxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Y29kZTogJ0FSRycsXG5cdFx0XHRzeW1ib2w6ICckJyxcblx0XHRcdHBvc2l0aW9uOiAnTGVmdCcsXG5cdFx0XHR3aXRob3V0RGVjaW1hbDogZmFsc2Vcblx0XHR9LFxuXHRcdHtcblx0XHRcdGNvZGU6ICdBUlMnLFxuXHRcdFx0c3ltYm9sOiAnJCcsXG5cdFx0XHRwb3NpdGlvbjogJ0xlZnQnLFxuXHRcdFx0d2l0aG91dERlY2ltYWw6IGZhbHNlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRjb2RlOiAnVVNEJyxcblx0XHRcdHN5bWJvbDogJyQnLFxuXHRcdFx0cG9zaXRpb246ICdMZWZ0Jyxcblx0XHRcdHdpdGhvdXREZWNpbWFsOiBmYWxzZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Y29kZTogJ1BZRycsXG5cdFx0XHRzeW1ib2w6ICdHcy4nLFxuXHRcdFx0cG9zaXRpb246ICdMZWZ0Jyxcblx0XHRcdHdpdGhvdXREZWNpbWFsOiBmYWxzZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Y29kZTogJ1BFTicsXG5cdFx0XHRzeW1ib2w6ICdTLycsXG5cdFx0XHRwb3NpdGlvbjogJ0xlZnQnLFxuXHRcdFx0d2l0aG91dERlY2ltYWw6IGZhbHNlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRjb2RlOiAnU0VLJyxcblx0XHRcdHN5bWJvbDogJ1NFSycsXG5cdFx0XHRwb3NpdGlvbjogJ1JpZ2h0Jyxcblx0XHRcdHdpdGhvdXREZWNpbWFsOiB0cnVlXG5cdFx0fSxcblx0XVxuXHQvKipcblx0ICogQ2FtYmlhIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIGxhIG1vbmVkYS5cblx0ICogQHBhcmFtIGN1cnJlbmN5VHlwZUNvbmZpZyBBcnJlZ2xvIGNvbiBsYXMgZGlzdGludGFzIG1vbmVkYXMuXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q3VycmVuY3lUeXBlQ29uZmlnKGN1cnJlbmN5VHlwZUNvbmZpZzogQ3VycmVuY3lDb25maWdbXSkge1xuXHRcdHRoaXMuY3VycmVuY3lUeXBlQ29uZmlnID0gY3VycmVuY3lUeXBlQ29uZmlnO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBjdXJyZW5jeVR5cGVGaW5kIERlZmluaXIgZWwgY29kZSBkZWwgdGlwbyBkZSBtb25lZGEgcXVlIHNlIHF1aWVyYSB1dGlsaXphci5cblx0ICogU2kgZWwgdGlwbyBlcyBDVVNUT00gc2UgdG9tYW4gbG9zIHZhbG9yZXMgZGVsIHNlZ3VuZG8gcGFyYW1ldHJvIGRvbmRlIHNlIHB1ZWRlIGRlZmluaXIgbGEgc2ltYm9sb2fDrWEgeSBwb3Nlc2nDs24gcXVlIHNlIHF1aWVyYS5cblx0ICogQHBhcmFtIGN1c3RvbVR5cGUgRm9ybWF0byBkZWwgcGFyw6FtZXRybyBlamVtcGxvIHsgY29kZTogJ0FSRycsIHN5bWJvbDogJyQnLCBwb3NpdGlvbjogJ0wnICwgd2l0aG91dERlY2ltYWxzOiBmYWxzZSB9ICxcblx0ICogdG9kYXMgbGFzIGtleSBzb24gb3BjaW9uYWxlcyB5IHBvciBkZWZlY3RvIHNlIHRvbWFuIGxvcyB2YWxvcmVzIGRlbCBlamVtcGxvLlxuXHQgKiBAcmV0dXJucyBzZSByZXRvcm5hIGxhIGNvbmZpZ3VyYWNpw7NuIHF1ZSBzZSBzZXRlbyBhIGxhIHByb3BpZWRhZCBjdXJyZW5jeSBkZWwgc2VydmljaW8uXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q3VycmVuY3koY3VycmVuY3lUeXBlRmluZDogY3VycmVuY3lUeXBlLCBjdXN0b21UeXBlPzogQ3VycmVuY3lDb25maWcpOiBDdXJyZW5jeUNvbmZpZyB7XG5cdFx0dGhpcy5jdXJyZW5jeSA9IHRoaXMuY3VycmVuY3lUeXBlQ29uZmlnLmZpbmQoKGN0OiBDdXJyZW5jeUNvbmZpZykgPT4gY3QuY29kZSA9PSBjdXJyZW5jeVR5cGVGaW5kLnRvVXBwZXJDYXNlKCkpIHx8IHRoaXMuY3VycmVuY3lcblx0XHRjdXN0b21UeXBlICYmICh0aGlzLmN1cnJlbmN5ID0geyAuLi50aGlzLmN1cnJlbmN5LCAuLi5jdXN0b21UeXBlIH0pXG5cdFx0cmV0dXJuIHRoaXMuY3VycmVuY3k7XG5cdH07XG5cblxuXHRwdWJsaWMgbW9kaWZ5Q2hhbm5lbENvbmZpZyhjaGFubmVsQ29uZmlnOiBhbnkpIHtcblx0XHR0aGlzLl93aXNobGlzdFZpc2liaWxpdHkuc2V0U2hvd1dpc2hsaXN0KFxuXHRcdFx0dHlwZW9mIGNoYW5uZWxDb25maWc/Lndpc2hsaXN0RW5hYmxlZCA9PT0gJ2Jvb2xlYW4nXG5cdFx0XHRcdD8gY2hhbm5lbENvbmZpZy53aXNobGlzdEVuYWJsZWRcblx0XHRcdFx0OiB0eXBlb2YgY2hhbm5lbENvbmZpZz8uc2hvd1dpc2hsaXN0ID09PSAnYm9vbGVhbidcblx0XHRcdFx0XHQ/IGNoYW5uZWxDb25maWcuc2hvd1dpc2hsaXN0XG5cdFx0XHRcdFx0OiBmYWxzZVxuXHRcdCk7XG5cblx0XHRpZiAoY2hhbm5lbENvbmZpZy5jaGFubmVsIHx8IGNoYW5uZWxDb25maWcuY29kZSlcblx0XHRcdHRoaXMuYXBpQ29uc3RhbnRzLnNldENoYW5uZWwoY2hhbm5lbENvbmZpZy5jaGFubmVsIHx8IGNoYW5uZWxDb25maWcuY29kZSlcblxuXHRcdGlmIChjaGFubmVsQ29uZmlnLmxvY2FsZSB8fCAoY2hhbm5lbENvbmZpZy5sb2NhbGVzICYmIGNoYW5uZWxDb25maWcubG9jYWxlcy5jb2RlKSlcblx0XHRcdHRoaXMuYXBpQ29uc3RhbnRzLnNldExvY2FsZShjaGFubmVsQ29uZmlnLmxvY2FsZSB8fCBjaGFubmVsQ29uZmlnLmxvY2FsZXMuY29kZSlcblxuXHRcdGlmIChjaGFubmVsQ29uZmlnLmN1cnJlbmN5IHx8IGNoYW5uZWxDb25maWcuYmFzZUN1cnJlbmN5KVxuXHRcdFx0dGhpcy5zZXRDdXJyZW5jeShjaGFubmVsQ29uZmlnLmN1cnJlbmN5IHx8IGNoYW5uZWxDb25maWcuYmFzZUN1cnJlbmN5KVxuXG5cdFx0aWYgKGNoYW5uZWxDb25maWcuY2hlY2tvdXRWaWV3ICE9IG51bGwpIHtcblx0XHRcdHRoaXMuc2V0Q2hlY2tvdXRWaWV3KGNoYW5uZWxDb25maWcuY2hlY2tvdXRWaWV3IGFzIENoZWNrb3V0Vmlld1R5cGUpO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgY2hhbm5lbENvbmZpZy51c2VQcm9kdWN0U2x1Z1JvdXRlID09PSAnYm9vbGVhbicpIHtcblx0XHRcdHRoaXMuc2V0VXNlUHJvZHVjdFNsdWdSb3V0ZShjaGFubmVsQ29uZmlnLnVzZVByb2R1Y3RTbHVnUm91dGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjaGFubmVsQ29uZmlnO1xuXHR9XG5cblx0LyoqXG5cdCogQGRlc2NyaXB0aW9uIHNlIHV0aWxpemEgcGFyYSBjb25maWd1cmFyIHF1ZSBmaWx0cm9zIGRlbCB0aXBvIGBTb3J0RmlsdGVyYCBzZSBxdWllcmUgbW9zdHJhciBlbiBsYSB2aXN0YS5cblx0KiBTZSB1c2FuIGxvcyBjb2RpZ28gZGUgbG9zIGZpbHRyb3MgcGFyYSBpbmRpY2FyIGN1YWxlcyBzZSBkZWJlbiBtb3N0cmFyLlxuXHQqL1xuXHRwcml2YXRlIHNvcnRGaWx0ZXJzOiBzdHJpbmdbXSA9IFsncHJpY2UnLCAnb3JkZXItYWxwaCcsICdyZWNlbnQnXVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gZmlsdGVyc0NvZGUgYXJyZWdsbyBkZSBzdHJpbmdzIGNvbiBsb3MgY29kaWdvcyBkZSBsb3MgZmlsdHJvcy5cblx0ICogU2kgc2UgbGUgcGFzYSBlbCBwYXJhbWV0cm8gKiphbGwqKiBlc3RlIG1vc3RyYXJhIHRvZG9zLlxuXHQgKiBAZXhhbXBsZSBwcmljZSB8IG9yZGVyLWFscGggfCByZWNlbnQgfCB1cGRhdGUgfCBhbGxcblx0ICogQHJldHVybnNcblx0ICovXG5cdHNldFNvcnRGaWx0ZXJzID0gKGZpbHRlcnNDb2RlOiBzdHJpbmdbXSA9IFsnYWxsJ10pID0+IHRoaXMuc29ydEZpbHRlcnMgPSBmaWx0ZXJzQ29kZTtcblxuXHRnZXRTb3J0RmlsdGVycyA9ICgpID0+IHRoaXMuc29ydEZpbHRlcnM7XG5cblx0Ly8gQUJPVVQgUFJPRFVDVFMgXG5cdHByaXZhdGUgcHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudDogYm9vbGVhbiA9IGZhbHNlO1xuXHRzZXRQcm9kdWN0V2l0aFVuaXF1ZVZhcmlhbnQodmFsdWU6IGJvb2xlYW4pIHsgdGhpcy5wcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50ID0gdmFsdWU7IH1cblx0Z2V0UHJvZHVjdFdpdGhVbmlxdWVWYXJpYW50KCkgeyByZXR1cm4gdGhpcy5wcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50IH1cblxuXHQvLyBIYWJpbGl0YSBlbCBmbHVqbyBkZSBhZ3JlZ2FkbyBtYXNpdm8gZW4gY29sbGVjdGlvbi9wcm9kdWN0LlxuXHRwcml2YXRlIGJ1bGtBZGRFbmFibGVkOiBib29sZWFuID0gZmFsc2U7XG5cdC8vIEhhYmlsaXRhIHJ1dGFzIGRlIHByb2R1Y3RvIHBvciBzbHVnIGRlIGZvcm1hIG9wdC1pbiBwb3IgZnJvbnRlbmQvY2FuYWwuXG5cdHByaXZhdGUgdXNlUHJvZHVjdFNsdWdSb3V0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXHQvLyBIYWJpbGl0YSBsYSBwcmVpbXByZXNpw7NuIGRlIGNhcnJpdG8vcHJlc3VwdWVzdG8gZGUgZm9ybWEgb3B0LWluIHBvciBmcm9udGVuZC5cblx0cHJpdmF0ZSBjYXJ0UHJlcHJpbnRFbmFibGVkOiBib29sZWFuID0gZmFsc2U7XG5cdHNldEJ1bGtBZGRFbmFibGVkKHZhbHVlOiBib29sZWFuKSB7IHRoaXMuYnVsa0FkZEVuYWJsZWQgPSB2YWx1ZTsgfVxuXHRnZXRCdWxrQWRkRW5hYmxlZCgpIHsgcmV0dXJuIHRoaXMuYnVsa0FkZEVuYWJsZWQgfVxuXG5cdHNldFVzZVByb2R1Y3RTbHVnUm91dGUodmFsdWU6IGJvb2xlYW4pIHsgdGhpcy51c2VQcm9kdWN0U2x1Z1JvdXRlID0gISF2YWx1ZTsgfVxuXHRnZXRVc2VQcm9kdWN0U2x1Z1JvdXRlKCkgeyByZXR1cm4gdGhpcy51c2VQcm9kdWN0U2x1Z1JvdXRlOyB9XG5cblx0c2V0Q2FydFByZXByaW50RW5hYmxlZCh2YWx1ZTogYm9vbGVhbikgeyB0aGlzLmNhcnRQcmVwcmludEVuYWJsZWQgPSAhIXZhbHVlOyB9XG5cdGdldENhcnRQcmVwcmludEVuYWJsZWQoKSB7IHJldHVybiB0aGlzLmNhcnRQcmVwcmludEVuYWJsZWQ7IH1cblxuXHQvKipcblx0KiBAZGVzY3JpcHRpb24gZXN0YSB2YXJpYWJsZSBzZSB1dGlsaXphIHBhcmEgY29uZmlndXJhciBsb3MgcGFyYW1ldHJvcyBjdWFuZG8gc2UgZGVzZWEgbW9zdHJhclxuXHQqIHZhcmlhbnRlcyBlbCBsaXN0YWRvIGRlIHByb2R1Y3Rvcy5cblx0KiBAcGFyYW0ge3N0cmluZ310eXBlIHRpcG8gZGUgb3B0aW9uc1xuXHQqIEBwYXJhbSB7c3RyaW5nfWNvZGUgY29kaWdvIGRlIG9wdGlvbnNcblx0KiBAcGFyYW0ge2Jvb2xlYW59ZGVmYXVsdEZpcnN0T3B0aW9uIGB0cnVlYCB0b21hIGVsIHByaW1lciBvcHRpb24gZGVsIHByb2R1Y3RvIGVuIGdlbmVyYWxcblx0KiBAcGFyYW0ge2Jvb2xlYW59Y2hlY2tJZlN0b2NrIGB0cnVlYCBzZSByZWFsaXphIHVuIGNoZXF1ZW8gZGUgc2kgbGEgdmFyaWFudGUgdGllbmUgc3RvY2sgcGFyYSBtb3N0cmFybGFcblx0KiBAZXhhbXBsZSAgYGBgamF2YXNjcmlwdFxuXHQqIHtcblx0ICAgdHlwZTogJ2NvbG9yJyxcblx0ICAgY29kZTogJ2NvbG9yJyxcblx0ICAgZGVmYXVsdEZpcnN0T3B0aW9uOiBmYWxzZSAsXG5cdCAgIGNoZWNrSWZTdG9jazp0cnVlXG5cdCAgIH0gYGBgXG5cdCovXG5cdHByaXZhdGUgcGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudDogUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9IHtcblx0XHR0eXBlOiAnY29sb3InLFxuXHRcdGNvZGU6ICdjb2xvcicsXG5cdFx0ZGVmYXVsdEZpcnN0T3B0aW9uOiBmYWxzZSxcblx0XHRjaGVja0lmU3RvY2s6IHRydWVcblx0fVxuXG5cdHNldFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSAodmFsdWU6IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQpID0+IHtcblx0XHR0aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSB7XG5cdFx0XHQuLi50aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQsXG5cdFx0XHQuLi52YWx1ZVxuXHRcdH1cblx0fVxuXG5cdGdldFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSAoKSA9PiB0aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnRcblx0XG5cdHB1YmxpYyBnZXRDaGFubmVsKCl7XG5cdFx0cmV0dXJuIHRoaXMuYXBpQ29uc3RhbnRzLkNIQU5ORUw7XG5cdH1cblxuXHRwdWJsaWMgZm9ybV9zZW5kZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRzZXRDdXJyZW50Um91dGVUeXBlKHR5cGU6IHN0cmluZyB8IG51bGwpIHtcblx0XHR0aGlzLmN1cnJlbnRSb3V0ZVR5cGUgPSB0eXBlO1xuXHR9XG5cblx0Z2V0Q3VycmVudFJvdXRlVHlwZSgpOiBzdHJpbmcgfCBudWxsIHtcblx0XHRyZXR1cm4gdGhpcy5jdXJyZW50Um91dGVUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIE9idGllbmUgbGEgdmlzdGEgZGUgY2hlY2tvdXQgY29uZmlndXJhZGEgKGxlZ2FjeSBvIHNpbmdsZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2hlY2tvdXRWaWV3KCk6IENoZWNrb3V0Vmlld1R5cGUge1xuXHRcdHJldHVybiB0aGlzLmNoZWNrb3V0Vmlld1N1YmplY3QudmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogQ2FtYmlhIGxhIHZpc3RhIGRlIGNoZWNrb3V0IChzaW4gcGVyc2lzdGVuY2lhIGVuIHN0b3JhZ2UpLlxuXHQgKi9cblx0cHJpdmF0ZSBzZXRDaGVja291dFZpZXcodmlldzogQ2hlY2tvdXRWaWV3VHlwZSk6IHZvaWQge1xuXHRcdGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZUNoZWNrb3V0Vmlldyh2aWV3KTtcblx0XHR0aGlzLmNoZWNrb3V0Vmlld1N1YmplY3QubmV4dChub3JtYWxpemVkKTtcblx0fVxuXG5cdHByaXZhdGUgbm9ybWFsaXplQ2hlY2tvdXRWaWV3KHZpZXc6IHN0cmluZyB8IENoZWNrb3V0Vmlld1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkKTogQ2hlY2tvdXRWaWV3VHlwZSB7XG5cdFx0cmV0dXJuIHZpZXcgPT09ICdzaW5nbGUnID8gJ3NpbmdsZScgOiAnbGVnYWN5Jztcblx0fVxufVxuIl19
|
|
412
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5jb25zdGFudHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWVhc3ljb21tZXJjZS12MTgvc3JjL2xpYi9jb25zdGFudHMvY29yZS5jb25zdGFudHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOztBQUMxRTs7OztHQUlHO0FBSUgsTUFBTSxPQUFPLG9CQUFvQjtJQUV6QixXQUFXLEdBQVcsRUFBRSxDQUFDO0lBQ3hCLG1CQUFtQixHQUFHLElBQUksZUFBZSxDQUFtQixRQUFRLENBQUMsQ0FBQztJQUN2RSxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQy9EOztPQUVHO0lBQ0ssWUFBWSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBQ2xEOztPQUVHO0lBQ08sVUFBVSxHQUFRLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMvQzs7T0FFRztJQUNLLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDeEQsYUFBYSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3BEOztPQUVHO0lBQ0ssV0FBVyxHQUFnQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUM1RDs7T0FFRztJQUNLLE1BQU0sQ0FBUztJQUV2Qjs7O09BR0c7SUFDSSxnQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO0lBRTlDOztPQUVHO0lBQ0gsSUFBWSxRQUFRO1FBQ25CLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEUsQ0FBQztJQUVEO1FBQ0MsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDekUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDdEIsQ0FBQztJQUNGLENBQUM7SUFDRDs7T0FFRztJQUNJLGtCQUFrQixHQUFXLGFBQWEsQ0FBQztJQUNsRDs7T0FFRztJQUNJLGNBQWMsR0FBVyxXQUFXLENBQUM7SUFDNUM7O09BRUc7SUFDYSxVQUFVLEdBQVcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7SUFDL0Q7Ozs7T0FJRztJQUNJLFFBQVEsR0FBRyxDQUFDLFNBQWtCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hLOzs7O09BSUc7SUFDSSxhQUFhLEdBQUcsQ0FBQyxTQUFrQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzSzs7OztPQUlHO0lBQ0ksR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxxQkFBcUI7SUFFdEY7O09BRUc7SUFDSCxJQUFXLFlBQVk7UUFDdEIsdUNBQXVDO1FBQ3ZDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDeEMsbUVBQW1FO1lBQ25FLE1BQU0sU0FBUyxHQUFJLElBQUksQ0FBQyxNQUFjLEVBQUUsS0FBSyxDQUFDO1lBQzlDLElBQUksU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUM1QixtQ0FBbUM7Z0JBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUMvQyxPQUFPLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkYsQ0FBQztnQkFDRCxPQUFPLFNBQVMsQ0FBQyxXQUFXLENBQUM7WUFDOUIsQ0FBQztZQUVELHNFQUFzRTtZQUN0RSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM3RSwyREFBMkQ7Z0JBQzNELElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7b0JBQzVELE9BQU8sQ0FBQyxJQUFJLENBQUMsNkZBQTZGLENBQUMsQ0FBQztnQkFDN0csQ0FBQztnQkFDRCxPQUFPLEdBQUcsQ0FBQztZQUNaLENBQUM7UUFDRixDQUFDO1FBRUQsb0VBQW9FO1FBQ3BFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUM3QixPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdFLENBQUM7UUFFRCxxQ0FBcUM7UUFDckMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7UUFDckMsQ0FBQztRQUVELDBFQUEwRTtRQUMxRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztRQUN6QyxJQUFJLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0UsSUFBSSxDQUFDO2dCQUNKLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM1QixPQUFPLEdBQUcsR0FBRyxDQUFDLFFBQVEsS0FBSyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkMsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxxREFBcUQsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBQ0YsQ0FBQztRQUVELHNDQUFzQztRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLGtGQUFrRixDQUFDLENBQUM7UUFDakcsT0FBTyxFQUFFLENBQUM7SUFDWCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGNBQWMsR0FBRyxDQUFDLElBQWEsRUFBVSxFQUFFO1FBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDbEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1gsT0FBTyxPQUFPLENBQUM7UUFDaEIsQ0FBQztRQUVELCtEQUErRDtRQUMvRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDM0QsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBRTVFLE9BQU8sR0FBRyxZQUFZLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDdEMsQ0FBQyxDQUFBO0lBRUQ7Ozs7T0FJRztJQUNJLG1CQUFtQixHQUFHLENBQUMsU0FBa0IsRUFBVSxFQUFFO1FBQzNELHFEQUFxRDtRQUNyRCxJQUFJLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEYsT0FBTyxTQUFTLENBQUM7UUFDbEIsQ0FBQztRQUVELHNEQUFzRDtRQUN0RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRS9DLG9EQUFvRDtRQUNwRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLE9BQU8sUUFBUSxDQUFDO1FBQ2pCLENBQUM7UUFFRCw0RUFBNEU7UUFDNUUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFDN0MsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUMzRSx5QkFBeUI7WUFDekIsT0FBTyxRQUFRLENBQUM7UUFDakIsQ0FBQztRQUVELDZEQUE2RDtRQUM3RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNsQixPQUFPLFFBQVEsQ0FBQyxDQUFDLHdEQUF3RDtRQUMxRSxDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUN0RixNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUM1RixNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFFbEYsT0FBTyxHQUFHLGdCQUFnQixJQUFJLFdBQVcsR0FBRyxhQUFhLEVBQUUsQ0FBQztJQUM3RCxDQUFDLENBQUE7SUFFRDs7O09BR0c7SUFDSSxxQkFBcUIsR0FBRyxDQUM5QixRQUFhLEVBQ2IsS0FBYSxFQUNiLGlCQUFpQixHQUFHLDZCQUE2QixFQUN1RCxFQUFFO1FBQzFHLE1BQU0sUUFBUSxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkUsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakcsTUFBTSxXQUFXLEdBQUcsU0FBUztZQUM1QixDQUFDLENBQUMsR0FBRyxRQUFRLEtBQUssU0FBUyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNqRixDQUFDLENBQUMsR0FBRyxRQUFRLG9CQUFvQixDQUFDO1FBRW5DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0QsTUFBTSxLQUFLLEdBQUcsU0FBUyxFQUFFLGVBQWU7WUFDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO1lBQ3JELENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFMUMsT0FBTztZQUNOLEtBQUssRUFBRSxRQUFRO1lBQ2YsV0FBVztZQUNYLEdBQUc7WUFDSCxLQUFLO1lBQ0wsSUFBSSxFQUFFLFNBQVM7WUFDZixXQUFXLEVBQUUscUJBQXFCO1NBQ2xDLENBQUM7SUFDSCxDQUFDLENBQUE7SUFFRDs7T0FFRztJQUNJLDZCQUE2QixHQUFHLEdBQXlELEVBQUUsQ0FBQyxDQUFDO1FBQ25HLEtBQUssRUFBRSxpQkFBaUI7UUFDeEIsV0FBVyxFQUFFLDRCQUE0QjtRQUN6QyxJQUFJLEVBQUUsU0FBUztLQUNmLENBQUMsQ0FBQTtJQUVGOzs7T0FHRztJQUNJLGNBQWMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUM7SUFFakksYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQztJQUV4SDs7O09BR0c7SUFDSSxZQUFZLEdBQUcsR0FBWSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDO0lBQzNGOztPQUVHO0lBQ0ksUUFBUSxHQUFtQjtRQUNqQyxJQUFJLEVBQUUsS0FBSztRQUNYLE1BQU0sRUFBRSxHQUFHO1FBQ1gsUUFBUSxFQUFFLE1BQU07UUFDaEIsY0FBYyxFQUFFLEtBQUs7S0FDckIsQ0FBQztJQUVGOztPQUVHO0lBQ0ksa0JBQWtCLEdBQXFCO1FBQzdDO1lBQ0MsSUFBSSxFQUFFLEtBQUs7WUFDWCxNQUFNLEVBQUUsR0FBRztZQUNYLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLGNBQWMsRUFBRSxLQUFLO1NBRXJCO1FBQ0Q7WUFDQyxJQUFJLEVBQUUsS0FBSztZQUNYLE1BQU0sRUFBRSxHQUFHO1lBQ1gsUUFBUSxFQUFFLE1BQU07WUFDaEIsY0FBYyxFQUFFLEtBQUs7U0FDckI7UUFDRDtZQUNDLElBQUksRUFBRSxLQUFLO1lBQ1gsTUFBTSxFQUFFLEdBQUc7WUFDWCxRQUFRLEVBQUUsTUFBTTtZQUNoQixjQUFjLEVBQUUsS0FBSztTQUNyQjtRQUNEO1lBQ0MsSUFBSSxFQUFFLEtBQUs7WUFDWCxNQUFNLEVBQUUsR0FBRztZQUNYLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLGNBQWMsRUFBRSxLQUFLO1NBQ3JCO1FBQ0Q7WUFDQyxJQUFJLEVBQUUsS0FBSztZQUNYLE1BQU0sRUFBRSxLQUFLO1lBQ2IsUUFBUSxFQUFFLE1BQU07WUFDaEIsY0FBYyxFQUFFLEtBQUs7U0FDckI7UUFDRDtZQUNDLElBQUksRUFBRSxLQUFLO1lBQ1gsTUFBTSxFQUFFLElBQUk7WUFDWixRQUFRLEVBQUUsTUFBTTtZQUNoQixjQUFjLEVBQUUsS0FBSztTQUNyQjtRQUNEO1lBQ0MsSUFBSSxFQUFFLEtBQUs7WUFDWCxNQUFNLEVBQUUsS0FBSztZQUNiLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLGNBQWMsRUFBRSxJQUFJO1NBQ3BCO0tBQ0QsQ0FBQTtJQUNEOzs7T0FHRztJQUNJLHFCQUFxQixDQUFDLGtCQUFvQztRQUNoRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFdBQVcsQ0FBQyxnQkFBOEIsRUFBRSxVQUEyQjtRQUM3RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFrQixFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUNoSSxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsVUFBVSxFQUFFLENBQUMsQ0FBQTtRQUNuRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdEIsQ0FBQztJQUFBLENBQUM7SUFHSyxtQkFBbUIsQ0FBQyxhQUFrQjtRQUM1QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUN2QyxPQUFPLGFBQWEsRUFBRSxlQUFlLEtBQUssU0FBUztZQUNsRCxDQUFDLENBQUMsYUFBYSxDQUFDLGVBQWU7WUFDL0IsQ0FBQyxDQUFDLE9BQU8sYUFBYSxFQUFFLFlBQVksS0FBSyxTQUFTO2dCQUNqRCxDQUFDLENBQUMsYUFBYSxDQUFDLFlBQVk7Z0JBQzVCLENBQUMsQ0FBQyxLQUFLLENBQ1QsQ0FBQztRQUVGLElBQUksYUFBYSxDQUFDLE9BQU8sSUFBSSxhQUFhLENBQUMsSUFBSTtZQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUUxRSxJQUFJLGFBQWEsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ2hGLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVoRixJQUFJLGFBQWEsQ0FBQyxRQUFRLElBQUksYUFBYSxDQUFDLFlBQVk7WUFDdkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxJQUFJLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUV2RSxJQUFJLGFBQWEsQ0FBQyxZQUFZLElBQUksSUFBSSxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsWUFBZ0MsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRCxJQUFJLE9BQU8sYUFBYSxDQUFDLG1CQUFtQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsT0FBTyxhQUFhLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7TUFHRTtJQUNNLFdBQVcsR0FBYSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFFakU7Ozs7OztPQU1HO0lBQ0gsY0FBYyxHQUFHLENBQUMsY0FBd0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFFckYsY0FBYyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFFeEMsa0JBQWtCO0lBQ1YseUJBQXlCLEdBQVksS0FBSyxDQUFDO0lBQ25ELDJCQUEyQixDQUFDLEtBQWMsSUFBSSxJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN2RiwyQkFBMkIsS0FBSyxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQSxDQUFDLENBQUM7SUFFdkUsMEVBQTBFO0lBQ2xFLG1CQUFtQixHQUFZLEtBQUssQ0FBQztJQUM3QyxpQkFBaUIsQ0FBQyxLQUFjLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNFLGlCQUFpQixLQUFLLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQSxDQUFDLENBQUM7SUFFM0Qsc0JBQXNCLENBQUMsS0FBYyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5RSxzQkFBc0IsS0FBSyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFFN0Qsc0JBQXNCLENBQUMsS0FBYyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixzQkFBc0IsS0FBSyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXRFOzs7Ozs7Ozs7Ozs7OztNQWNFO0lBQ00sK0JBQStCLEdBQW9DO1FBQzFFLElBQUksRUFBRSxPQUFPO1FBQ2IsSUFBSSxFQUFFLE9BQU87UUFDYixrQkFBa0IsRUFBRSxLQUFLO1FBQ3pCLFlBQVksRUFBRSxJQUFJO0tBQ2xCLENBQUE7SUFFRCxrQ0FBa0MsR0FBRyxDQUFDLEtBQXNDLEVBQUUsRUFBRTtRQUMvRSxJQUFJLENBQUMsK0JBQStCLEdBQUc7WUFDdEMsR0FBRyxJQUFJLENBQUMsK0JBQStCO1lBQ3ZDLEdBQUcsS0FBSztTQUNSLENBQUE7SUFDRixDQUFDLENBQUE7SUFFRCxrQ0FBa0MsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUE7SUFFeEUsVUFBVTtRQUNoQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO0lBQ2xDLENBQUM7SUFFTSxXQUFXLEdBQVksS0FBSyxDQUFDO0lBRXBDLG1CQUFtQixDQUFDLElBQW1CO1FBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVELG1CQUFtQjtRQUNsQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsSUFBc0I7UUFDN0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVPLHFCQUFxQixDQUFDLElBQWtEO1FBQy9FLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDaEQsQ0FBQzt3R0EvYlcsb0JBQW9COzRHQUFwQixvQkFBb0IsY0FGcEIsTUFBTTs7NEZBRU4sb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNYLFVBQVUsRUFBRSxNQUFNO2lCQUNsQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwaUNvbnN0YW50c1NlcnZpY2UgfSBmcm9tICcuL2FwaS5jb25zdGFudHMuc2VydmljZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciwgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ3VycmVuY3lDb25maWcsIGN1cnJlbmN5VHlwZSwgUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCwgRW52aXJvbm1lbnQsIENoZWNrb3V0Vmlld1R5cGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEVOVklST05NRU5UX1RPS0VOIH0gZnJvbSAnLi4vcHJvdmlkZXJzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgV2lzaGxpc3RWaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL2VjLXNlcnZpY2VzL3dpc2hsaXN0LXZpc2liaWxpdHkuc2VydmljZSc7XG5pbXBvcnQgeyBDYXBhYmlsaXRpZXNTZXJ2aWNlIH0gZnJvbSAnLi4vZWMtc2VydmljZXMvY2FwYWJpbGl0aWVzLnNlcnZpY2UnO1xuLyoqXG4gKiBTZXJ2aWNpbyBxdWUgcHJvdmVlIGxhcyBjb25zdGFudGVzIG5lY2VzYXJpYXMgcXVlIHNlIHV0aWxpemFuIHBvciB0b2RhIGxhIGFwbGljYWNpw7NuLlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvcmVDb25zdGFudHNTZXJ2aWNlXG4gKi9cbkBJbmplY3RhYmxlKHtcblx0cHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENvcmVDb25zdGFudHNTZXJ2aWNlIHtcblxuXHRwdWJsaWMgc2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuXHRwcml2YXRlIGNoZWNrb3V0Vmlld1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENoZWNrb3V0Vmlld1R5cGU+KCdsZWdhY3knKTtcblx0cHVibGljIGNoZWNrb3V0VmlldyQgPSB0aGlzLmNoZWNrb3V0Vmlld1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cdC8qKlxuXHQgKiBTZXJ2aWNpbyBxdWUgY29udGllbmUgbGFzIGNvbnN0YW50ZXMgdXNhZGFzIHBhcmEgbGEgQVBJXG5cdCAqL1xuXHRwcml2YXRlIGFwaUNvbnN0YW50cyA9IGluamVjdChBcGlDb25zdGFudHNTZXJ2aWNlKVxuXHQvKipcblx0ICogUHJvdmVlIGVsIElEIGRlIGxhIHBsYXRhZm9ybWEgZW4gZG9uZGUgc2UgZXN0YSBlamVjdXRhbmRvIGVsIGNvZGlnbywgZXN0byBzaXJ2ZSBwYXJhIHBvZGVyIGRpZmVyZW5jaWFyIHNpIGVzIGRlIHVuIHNlcnZpZG9yIG8gdW4gbmF2ZWdhZG9yIHdlYi5cblx0ICovXG5cdHByb3RlY3RlZCBwbGF0Zm9ybUlkOiBhbnkgPSBpbmplY3QoUExBVEZPUk1fSUQpXG5cdC8qKlxuXHQgKiBEb2N1bWVudCB0b2tlbiBwYXJhIGFjY2VzbyBTU1ItY29tcGF0aWJsZSBhbCBkb2N1bWVudG9cblx0ICovXG5cdHByaXZhdGUgX2RvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblx0cHJpdmF0ZSBfd2lzaGxpc3RWaXNpYmlsaXR5ID0gaW5qZWN0KFdpc2hsaXN0VmlzaWJpbGl0eVNlcnZpY2UpO1xuXHRwcml2YXRlIF9jYXBhYmlsaXRpZXMgPSBpbmplY3QoQ2FwYWJpbGl0aWVzU2VydmljZSk7XG5cdC8qKlxuXHQgKiBDb250aWVuZSBsb3MgZGF0b3MgcHJvdmlzdG8gcG9yIGVsIGZyb250ZW5kIGVuIGVsIGFyY2hpdm8gZW52aXJvbm1lbnQudHNcblx0ICovXG5cdHByaXZhdGUgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50ID0gaW5qZWN0KEVOVklST05NRU5UX1RPS0VOKVxuXHQvKipcblx0ICogR3VhcmRhIGxhIHZhcmlhYmxlIHdpbmRvdyBkZWwgd2ViIGJyb3dzZXIuXG5cdCAqL1xuXHRwcml2YXRlIHdpbmRvdz86V2luZG93O1xuXG5cdC8qKlxuXHQgKiBUaXBvIGRlIHJ1dGEgYWN0dWFsIChlajogJ2NhdGVnb3JpZXMnLCAnYXR0cmlidXRlcycsIGV0YykuXG5cdCAqIExvIHVzYW1vcyBwYXJhIHF1ZSBQYWdpbmF0aW9uU2VydmljZSBzZXBhIHF1w6kgZmlsdHJvIGVzcGVyYXIuXG5cdCAqL1xuXHRwdWJsaWMgY3VycmVudFJvdXRlVHlwZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cdFxuXHQvKipcblx0ICogR2V0dGVyIHNlZ3VybyBwYXJhIGRvY3VtZW50IHF1ZSB2ZXJpZmljYSBsYSBwbGF0YWZvcm1hXG5cdCAqL1xuXHRwcml2YXRlIGdldCBkb2N1bWVudCgpOiBEb2N1bWVudCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgPyB0aGlzLl9kb2N1bWVudCA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHR0aGlzLndpbmRvdyA9IHdpbmRvdztcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIFBhdGggdXNhZG8gZW4gbGFzIGNvbGVjY2lvbmVzIGRlIHByb2R1Y3Rvcy5cblx0ICovXG5cdHB1YmxpYyBQUk9EVUNUX0xJU1RfUk9VVEU6IHN0cmluZyA9ICdjb2xsZWN0aW9uLyc7XG5cdC8qKlxuXHQgKiBQYXRoIHVzYWRvIHBhcmEgYWNjZWRlciBhIGxhcyBzZWNjaW9uZXMuXG5cdCAqL1xuXHRwdWJsaWMgU0VDVElPTlNfUk9VVEU6IHN0cmluZyA9ICdzZWN0aW9ucy8nO1xuXHQvKipcblx0ICogUGF0aCBxdWUgYWxvamEgbGEgY2FycGV0YSBkZSBsb3MgYXNzZXRzLlxuXHQgKi9cblx0cHVibGljIHJlYWRvbmx5IEFTU0VUU19VUkw6IHN0cmluZyA9IHRoaXMuYXBpQ29uc3RhbnRzLkFQSV9VUkw7XG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIHVybCBkb25kZSBzZSBndWFyZGEgbGFzIGltYWdlbmVzLlxuXHQgKiBAcGFyYW0gcG9zdE1lZGlhIFxuXHQgKiBAcmV0dXJucyBcblx0ICovXG5cdHB1YmxpYyBtZWRpYVVybCA9IChwb3N0TWVkaWE/OiBzdHJpbmcpID0+IHRoaXMuQVNTRVRTX1VSTCArICh0aGlzLkFTU0VUU19VUkwgPT0gdGhpcy5hcGlDb25zdGFudHMuQVBJX1VSTCA/ICdtZWRpYS8nIDogJycpICsgKHBvc3RNZWRpYSA/IHBvc3RNZWRpYSA6IFwiaW1hZ2UvXCIpO1xuXHQvKipcblx0ICogUmV0b3JuYSBsYSB1cmwgZG9uZGUgc2UgZ3VhcmRhIGxhcyBpbWFnZW5lcy5cblx0ICogQHBhcmFtIHBvc3RNZWRpYSBcblx0ICogQHJldHVybnMgXG5cdCAqL1xuXHRwdWJsaWMgbWVkaWFJbWFnZVVybCA9IChwb3N0TWVkaWE/OiBzdHJpbmcpID0+IHRoaXMuQVNTRVRTX1VSTCArICh0aGlzLkFTU0VUU19VUkwgPT0gdGhpcy5hcGlDb25zdGFudHMuQVBJX1VSTCA/ICdtZWRpYS9pbWFnZS8nIDogJycpICsgKHBvc3RNZWRpYSA/IHBvc3RNZWRpYSA6IFwiaW1hZ2UvXCIpO1xuXHQvKipcblx0ICogUmV0b3JuYSBsYSB1cmwgZGVsIHNpdGlvLlxuXHQgKiBAcGFyYW0gcG9zdE1lZGlhIFxuXHQgKiBAcmV0dXJucyBcblx0ICovXG5cdHB1YmxpYyB1cmwgPSAoKSA9PiB0aGlzLmFwaUNvbnN0YW50cy5BUElfVVJMLnJlcGxhY2UoL1xcLyQvLCAnJyk7IC8vIHJlbW92ZSBsYXN0IHNsYXNoXHRcblxuXHQvKipcblx0ICogVVJMIGRlbCBzaXRpbyBmcm9udGVuZCAtIENvbXBhdGlibGUgY29uIEFuZ3VsYXIgU1NSXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IEZST05URU5EX1VSTCgpOiBzdHJpbmcge1xuXHRcdC8vIFZlcmlmaWNhciBzaSBlc3RhbW9zIGVuIGVsIG5hdmVnYWRvclxuXHRcdGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG5cdFx0XHQvLyBQcmltZXJvIGludGVudGEgbGVlciBkZSB3aW5kb3cuX19lbnYgKGNvbmZpZ3VyYWRvIHBvciBEb2NrZXIvQ0kpXG5cdFx0XHRjb25zdCB3aW5kb3dFbnYgPSAodGhpcy53aW5kb3cgYXMgYW55KT8uX19lbnY7XG5cdFx0XHRpZiAod2luZG93RW52Py5mcm9udGVuZFVybCkge1xuXHRcdFx0XHQvLyBMb2cgcGFyYSBkZWJ1Z2dpbmcgZW4gZGVzYXJyb2xsb1xuXHRcdFx0XHRpZiAoIXdpbmRvd0Vudi5mcm9udGVuZFVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oJ1tGUk9OVEVORF9VUkxdIEludmFsaWQgZnJvbnRlbmRVcmwgZm9ybWF0OicsIHdpbmRvd0Vudi5mcm9udGVuZFVybCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHdpbmRvd0Vudi5mcm9udGVuZFVybDtcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0Ly8gU2kgbm8gaGF5IGNvbmZpZ3VyYWNpw7NuIGVzcGVjw61maWNhLCBjb25zdHJ1aXIgZGVzZGUgd2luZG93LmxvY2F0aW9uXG5cdFx0XHRpZiAodGhpcy53aW5kb3c/LmxvY2F0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IHVybCA9IGAke3RoaXMud2luZG93LmxvY2F0aW9uLnByb3RvY29sfS8vJHt0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0fWA7XG5cdFx0XHRcdC8vIFZlcmlmaWNhciBxdWUgbm8gc2VhIGxvY2FsaG9zdCBvIDEyNy4wLjAuMSBlbiBwcm9kdWNjacOzblxuXHRcdFx0XHRpZiAodXJsLmluY2x1ZGVzKCcxMjcuMC4wLjEnKSB8fCB1cmwuaW5jbHVkZXMoJ2xvY2FsaG9zdCcpKSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCdbRlJPTlRFTkRfVVJMXSBVc2luZyBsb2NhbGhvc3QgVVJMIGluIHByb2R1Y3Rpb24sIGNvbnNpZGVyIHNldHRpbmcgd2luZG93Ll9fZW52LmZyb250ZW5kVXJsJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHVybDtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0Ly8gUGFyYSBTU1IsIGludGVudGFyIGNvbnN0cnVpciBkZXNkZSBlbCBkb2N1bWVudCBzaSBlc3TDoSBkaXNwb25pYmxlXG5cdFx0aWYgKHRoaXMuZG9jdW1lbnQ/LmxvY2F0aW9uKSB7XG5cdFx0XHRyZXR1cm4gYCR7dGhpcy5kb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbH0vLyR7dGhpcy5kb2N1bWVudC5sb2NhdGlvbi5ob3N0fWA7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIEludGVudGFyIG9idGVuZXIgZGVzZGUgZW52aXJvbm1lbnRcblx0XHRpZiAodGhpcy5lbnZpcm9ubWVudC5mcm9udGVuZFVybCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQuZnJvbnRlbmRVcmw7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIMOabHRpbW8gZmFsbGJhY2sgLSB1c2FyIGxhIFVSTCBkZWwgQVBJIHNpIGVzdMOhIGNvbmZpZ3VyYWRhIHkgZXMgYWJzb2x1dGFcblx0XHRjb25zdCBhcGlVcmwgPSB0aGlzLmFwaUNvbnN0YW50cy5BUElfVVJMO1xuXHRcdGlmIChhcGlVcmwgJiYgKGFwaVVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgYXBpVXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCB1cmwgPSBuZXcgVVJMKGFwaVVybCk7XG5cdFx0XHRcdHJldHVybiBgJHt1cmwucHJvdG9jb2x9Ly8ke3VybC5ob3N0fWA7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGNvbnNvbGUud2FybignW0ZST05URU5EX1VSTF0gQ291bGQgbm90IHBhcnNlIEFQSSBVUkwgYXMgZmFsbGJhY2s6JywgYXBpVXJsKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0Ly8gRmFsbGJhY2sgZmluYWwgLSByZXRvcm5hciBVUkwgdmFjw61hXG5cdFx0Y29uc29sZS53YXJuKCdbRlJPTlRFTkRfVVJMXSBObyB2YWxpZCBmcm9udGVuZCBVUkwgZm91bmQsIHRoaXMgbWF5IGNhdXNlIGlzc3VlcyB3aXRoIG1ldGEgdGFncycpO1xuXHRcdHJldHVybiAnJztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIFVSTCBjb21wbGV0YSBkZWwgZnJvbnRlbmQgY29uIHVuYSBydXRhIG9wY2lvbmFsXG5cdCAqIEBwYXJhbSBwYXRoIC0gUnV0YSBvcGNpb25hbCBwYXJhIGFncmVnYXIgYSBsYSBVUkwgYmFzZVxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBVUkwgY29tcGxldGEgZGVsIGZyb250ZW5kXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RnJvbnRlbmRVcmwgPSAocGF0aD86IHN0cmluZyk6IHN0cmluZyA9PiB7XG5cdFx0Y29uc3QgYmFzZVVybCA9IHRoaXMuRlJPTlRFTkRfVVJMO1xuXHRcdGlmICghcGF0aCkge1xuXHRcdFx0cmV0dXJuIGJhc2VVcmw7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIEFzZWd1cmFyIHF1ZSBsYSBydXRhIGNvbWllbmNlIGNvbiAnLycgeSBubyB0ZW5nYSBkb2JsZSBzbGFzaFxuXHRcdGNvbnN0IGNsZWFuUGF0aCA9IHBhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6IGAvJHtwYXRofWA7XG5cdFx0Y29uc3QgY2xlYW5CYXNlVXJsID0gYmFzZVVybC5lbmRzV2l0aCgnLycpID8gYmFzZVVybC5zbGljZSgwLCAtMSkgOiBiYXNlVXJsO1xuXHRcdFxuXHRcdHJldHVybiBgJHtjbGVhbkJhc2VVcmx9JHtjbGVhblBhdGh9YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIFVSTCBhYnNvbHV0YSBkZSB1bmEgaW1hZ2VuIHBhcmEgbWV0YSB0YWdzIChjb21wYXRpYmxlIGNvbiBTU1IpXG5cdCAqIEBwYXJhbSBwb3N0TWVkaWEgLSBSdXRhIGRlIGxhIGltYWdlblxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBVUkwgYWJzb2x1dGEgZGUgbGEgaW1hZ2VuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0QWJzb2x1dGVJbWFnZVVybCA9IChwb3N0TWVkaWE/OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuXHRcdC8vIFNpIGxhIFVSTCB5YSBlcyBhYnNvbHV0YSwgZGV2b2x2ZXJsYSB0YWwgY29tbyBlc3TDoVxuXHRcdGlmIChwb3N0TWVkaWEgJiYgKHBvc3RNZWRpYS5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgcG9zdE1lZGlhLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpKSB7XG5cdFx0XHRyZXR1cm4gcG9zdE1lZGlhO1xuXHRcdH1cblxuXHRcdC8vIENvbnN0cnVpciBsYSBVUkwgZGUgbGEgaW1hZ2VuIHVzYW5kbyBsYSBVUkwgZGVsIEFQSVxuXHRcdGNvbnN0IGltYWdlVXJsID0gdGhpcy5tZWRpYUltYWdlVXJsKHBvc3RNZWRpYSk7XG5cdFx0XG5cdFx0Ly8gU2kgbGEgVVJMIGRlIGxhIGltYWdlbiB5YSBlcyBhYnNvbHV0YSwgZGV2b2x2ZXJsYVxuXHRcdGlmIChpbWFnZVVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgaW1hZ2VVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuXHRcdFx0cmV0dXJuIGltYWdlVXJsO1xuXHRcdH1cblx0XHRcblx0XHQvLyBTaSBlcyB1bmEgVVJMIHJlbGF0aXZhLCBjb252ZXJ0aXJsYSBhIGFic29sdXRhIHVzYW5kbyBsYSBVUkwgYmFzZSBkZWwgQVBJXG5cdFx0Y29uc3QgYXBpQmFzZVVybCA9IHRoaXMuYXBpQ29uc3RhbnRzLkFQSV9VUkw7XG5cdFx0aWYgKGFwaUJhc2VVcmwuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IGFwaUJhc2VVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuXHRcdFx0Ly8gQVBJX1VSTCB5YSBlcyBhYnNvbHV0YVxuXHRcdFx0cmV0dXJuIGltYWdlVXJsO1xuXHRcdH1cblx0XHRcblx0XHQvLyBTaSBBUElfVVJMIGVzIHJlbGF0aXZhLCB1c2FyIGxhIFVSTCBkZWwgZnJvbnRlbmQgY29tbyBiYXNlXG5cdFx0Y29uc3QgZnJvbnRlbmRVcmwgPSB0aGlzLkZST05URU5EX1VSTDtcblx0XHRpZiAoIWZyb250ZW5kVXJsKSB7XG5cdFx0XHRyZXR1cm4gaW1hZ2VVcmw7IC8vIEZhbGxiYWNrIHNpIG5vIHBvZGVtb3MgZGV0ZXJtaW5hciBsYSBVUkwgZGVsIGZyb250ZW5kXG5cdFx0fVxuXHRcdFxuXHRcdC8vIENvbnN0cnVpciBVUkwgYWJzb2x1dGFcblx0XHRjb25zdCBjbGVhbkFwaVVybCA9IGFwaUJhc2VVcmwuc3RhcnRzV2l0aCgnLycpID8gYXBpQmFzZVVybC5zdWJzdHJpbmcoMSkgOiBhcGlCYXNlVXJsO1xuXHRcdGNvbnN0IGNsZWFuRnJvbnRlbmRVcmwgPSBmcm9udGVuZFVybC5lbmRzV2l0aCgnLycpID8gZnJvbnRlbmRVcmwuc2xpY2UoMCwgLTEpIDogZnJvbnRlbmRVcmw7XG5cdFx0Y29uc3QgY2xlYW5JbWFnZVVybCA9IGltYWdlVXJsLnN0YXJ0c1dpdGgoJy8nKSA/IGltYWdlVXJsLnN1YnN0cmluZygxKSA6IGltYWdlVXJsO1xuXHRcdFxuXHRcdHJldHVybiBgJHtjbGVhbkZyb250ZW5kVXJsfS8ke2NsZWFuQXBpVXJsfSR7Y2xlYW5JbWFnZVVybH1gO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnN0cnV5ZSBtZXRhIGluZm9ybWFjacOzbiBwYXJhIHVuYSB3aXNobGlzdCBjb21wYXJ0aWRhLlxuXHQgKiBTZSB1c2EgcGFyYSBPcGVuR3JhcGgvVHdpdHRlciBjYXJkcyBlbiBTU1IgeSBicm93c2VyLlxuXHQgKi9cblx0cHVibGljIGdldFNoYXJlZFdpc2hsaXN0TWV0YSA9IChcblx0XHR3aXNobGlzdDogYW55LFxuXHRcdHRva2VuOiBzdHJpbmcsXG5cdFx0ZmFsbGJhY2tJbWFnZVBhdGggPSAnL2Fzc2V0cy9pbWcvZmF2L2Zhdmljb24uaWNvJ1xuXHQpOiB7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IHVybDogc3RyaW5nOyBpbWFnZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHR3aXR0ZXJDYXJkOiBzdHJpbmcgfSA9PiB7XG5cdFx0Y29uc3QgbGlzdE5hbWUgPSAod2lzaGxpc3Q/Lm5hbWUgfHwgJ1NoYXJlZCB3aXNobGlzdCcpLnRvU3RyaW5nKCkudHJpbSgpO1xuXHRcdGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheSh3aXNobGlzdD8uaXRlbXMpID8gd2lzaGxpc3QuaXRlbXMgOiBbXTtcblx0XHRjb25zdCBpdGVtQ291bnQgPSBpdGVtcy5sZW5ndGg7XG5cdFx0Y29uc3QgZmlyc3RJdGVtID0gaXRlbXNbMF07XG5cdFx0Y29uc3QgZmlyc3RQcm9kdWN0TmFtZSA9IGZpcnN0SXRlbT8ucHJvZHVjdF9uYW1lID8gZmlyc3RJdGVtLnByb2R1Y3RfbmFtZS50b1N0cmluZygpLnRyaW0oKSA6ICcnO1xuXHRcdGNvbnN0IGRlc2NyaXB0aW9uID0gaXRlbUNvdW50XG5cdFx0XHQ/IGAke2xpc3ROYW1lfSAoJHtpdGVtQ291bnR9KSR7Zmlyc3RQcm9kdWN0TmFtZSA/IGAgLSAke2ZpcnN0UHJvZHVjdE5hbWV9YCA6ICcnfWBcblx0XHRcdDogYCR7bGlzdE5hbWV9IC0gc2hhcmVkIHdpc2hsaXN0YDtcblxuXHRcdGNvbnN0IHVybCA9IHRoaXMuZ2V0RnJvbnRlbmRVcmwoYC93aXNobGlzdC9zaGFyZWQvJHt0b2tlbn1gKTtcblx0XHRjb25zdCBpbWFnZSA9IGZpcnN0SXRlbT8ucGljdHVyZV9kZWZhdWx0XG5cdFx0XHQ/IHRoaXMuZ2V0QWJzb2x1dGVJbWFnZVVybChmaXJzdEl0ZW0ucGljdHVyZV9kZWZhdWx0KVxuXHRcdFx0OiB0aGlzLmdldEZyb250ZW5kVXJsKGZhbGxiYWNrSW1hZ2VQYXRoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR0aXRsZTogbGlzdE5hbWUsXG5cdFx0XHRkZXNjcmlwdGlvbixcblx0XHRcdHVybCxcblx0XHRcdGltYWdlLFxuXHRcdFx0dHlwZTogJ3dlYnNpdGUnLFxuXHRcdFx0dHdpdHRlckNhcmQ6ICdzdW1tYXJ5X2xhcmdlX2ltYWdlJ1xuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogTWV0YSBpbmZvcm1hY2nDs24gZmFsbGJhY2sgcGFyYSB3aXNobGlzdCBjb21wYXJ0aWRhIGN1YW5kbyBubyBleGlzdGUgbyBubyBjYXJnYS5cblx0ICovXG5cdHB1YmxpYyBnZXRTaGFyZWRXaXNobGlzdEZhbGxiYWNrTWV0YSA9ICgpOiB7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9ID0+ICh7XG5cdFx0dGl0bGU6ICdTaGFyZWQgd2lzaGxpc3QnLFxuXHRcdGRlc2NyaXB0aW9uOiAnVmlldyB0aGlzIHNoYXJlZCB3aXNobGlzdC4nLFxuXHRcdHR5cGU6ICd3ZWJzaXRlJ1xuXHR9KVxuXG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIHVybCBkZSBsYXMgaW1hZ2VuZXMgZGUgbG9zIGJhbm5lcnNcblx0ICogQHJldHVybnMgXG5cdCAqL1xuXHRwdWJsaWMgbWVkaWFCYW5uZXJVcmwgPSAoKSA9PiB0aGlzLkFTU0VUU19VUkwgKyAodGhpcy5BU1NFVFNfVVJMID09IHRoaXMuYXBpQ29uc3RhbnRzLkFQSV9VUkwgPyAnbWVkaWEvJyA6ICcnKSArIFwiYmFubmVyLWltYWdlL1wiO1xuXHRcblx0bWVkaWFTdG9yZVVybCA9ICgpID0+IHRoaXMuQVNTRVRTX1VSTCArICh0aGlzLkFTU0VUU19VUkwgPT0gdGhpcy5hcGlDb25zdGFudHMuQVBJX1VSTCA/ICdtZWRpYS8nIDogJycpICsgXCJzdG9yZS1pbWFnZS9cIjtcblx0XG5cdC8qKlxuXHQgKiBSZXRvcm5hIGB0cnVlYCBzaSBsYSB2aXN0YSBlcyBtb2JpbGUsIGBmYWxzZWAgY2FzbyBjb250cmFyaW8uXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0cHVibGljIG1vYmlsZVNjcmVlbiA9ICgpOiBib29sZWFuID0+IHRoaXMud2luZG93ICYmIHRoaXMud2luZG93Py5pbm5lcldpZHRoIDwgNzUwIHx8IGZhbHNlO1xuXHQvKipcblx0ICogQ29udGllbmUgbG9zIHZhbG9yZXMgcGFyYSBsYSBtb25lZGEgYWN0dWFsXG5cdCAqL1xuXHRwdWJsaWMgY3VycmVuY3k6IEN1cnJlbmN5Q29uZmlnID0ge1xuXHRcdGNvZGU6ICdBUkcnLFxuXHRcdHN5bWJvbDogJyQnLFxuXHRcdHBvc2l0aW9uOiAnTGVmdCcsXG5cdFx0d2l0aG91dERlY2ltYWw6IGZhbHNlXG5cdH07XG5cblx0LyoqXG5cdCAqIEFycmVnbG8gZGUgdmFsb3JlcyB1c2Fkb3MgcGFyYSBlbCBwaXBlIGN1cnJlbmN5UHJpY2Vcblx0ICovXG5cdHB1YmxpYyBjdXJyZW5jeVR5cGVDb25maWc6IEN1cnJlbmN5Q29uZmlnW10gPSBbXG5cdFx0e1xuXHRcdFx0Y29kZTogJ0VVUicsXG5cdFx0XHRzeW1ib2w6ICfigqwnLFxuXHRcdFx0cG9zaXRpb246ICdSaWdodCcsXG5cdFx0XHR3aXRob3V0RGVjaW1hbDogZmFsc2VcblxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Y29kZTogJ0FSRycsXG5cdFx0XHRzeW1ib2w6ICckJyxcblx0XHRcdHBvc2l0aW9uOiAnTGVmdCcsXG5cdFx0XHR3aXRob3V0RGVjaW1hbDogZmFsc2Vcblx0XHR9LFxuXHRcdHtcblx0XHRcdGNvZGU6ICdBUlMnLFxuXHRcdFx0c3ltYm9sOiAnJCcsXG5cdFx0XHRwb3NpdGlvbjogJ0xlZnQnLFxuXHRcdFx0d2l0aG91dERlY2ltYWw6IGZhbHNlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRjb2RlOiAnVVNEJyxcblx0XHRcdHN5bWJvbDogJyQnLFxuXHRcdFx0cG9zaXRpb246ICdMZWZ0Jyxcblx0XHRcdHdpdGhvdXREZWNpbWFsOiBmYWxzZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Y29kZTogJ1BZRycsXG5cdFx0XHRzeW1ib2w6ICdHcy4nLFxuXHRcdFx0cG9zaXRpb246ICdMZWZ0Jyxcblx0XHRcdHdpdGhvdXREZWNpbWFsOiBmYWxzZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Y29kZTogJ1BFTicsXG5cdFx0XHRzeW1ib2w6ICdTLycsXG5cdFx0XHRwb3NpdGlvbjogJ0xlZnQnLFxuXHRcdFx0d2l0aG91dERlY2ltYWw6IGZhbHNlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRjb2RlOiAnU0VLJyxcblx0XHRcdHN5bWJvbDogJ1NFSycsXG5cdFx0XHRwb3NpdGlvbjogJ1JpZ2h0Jyxcblx0XHRcdHdpdGhvdXREZWNpbWFsOiB0cnVlXG5cdFx0fSxcblx0XVxuXHQvKipcblx0ICogQ2FtYmlhIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIGxhIG1vbmVkYS5cblx0ICogQHBhcmFtIGN1cnJlbmN5VHlwZUNvbmZpZyBBcnJlZ2xvIGNvbiBsYXMgZGlzdGludGFzIG1vbmVkYXMuXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q3VycmVuY3lUeXBlQ29uZmlnKGN1cnJlbmN5VHlwZUNvbmZpZzogQ3VycmVuY3lDb25maWdbXSkge1xuXHRcdHRoaXMuY3VycmVuY3lUeXBlQ29uZmlnID0gY3VycmVuY3lUeXBlQ29uZmlnO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBjdXJyZW5jeVR5cGVGaW5kIERlZmluaXIgZWwgY29kZSBkZWwgdGlwbyBkZSBtb25lZGEgcXVlIHNlIHF1aWVyYSB1dGlsaXphci5cblx0ICogU2kgZWwgdGlwbyBlcyBDVVNUT00gc2UgdG9tYW4gbG9zIHZhbG9yZXMgZGVsIHNlZ3VuZG8gcGFyYW1ldHJvIGRvbmRlIHNlIHB1ZWRlIGRlZmluaXIgbGEgc2ltYm9sb2fDrWEgeSBwb3Nlc2nDs24gcXVlIHNlIHF1aWVyYS5cblx0ICogQHBhcmFtIGN1c3RvbVR5cGUgRm9ybWF0byBkZWwgcGFyw6FtZXRybyBlamVtcGxvIHsgY29kZTogJ0FSRycsIHN5bWJvbDogJyQnLCBwb3NpdGlvbjogJ0wnICwgd2l0aG91dERlY2ltYWxzOiBmYWxzZSB9ICxcblx0ICogdG9kYXMgbGFzIGtleSBzb24gb3BjaW9uYWxlcyB5IHBvciBkZWZlY3RvIHNlIHRvbWFuIGxvcyB2YWxvcmVzIGRlbCBlamVtcGxvLlxuXHQgKiBAcmV0dXJucyBzZSByZXRvcm5hIGxhIGNvbmZpZ3VyYWNpw7NuIHF1ZSBzZSBzZXRlbyBhIGxhIHByb3BpZWRhZCBjdXJyZW5jeSBkZWwgc2VydmljaW8uXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q3VycmVuY3koY3VycmVuY3lUeXBlRmluZDogY3VycmVuY3lUeXBlLCBjdXN0b21UeXBlPzogQ3VycmVuY3lDb25maWcpOiBDdXJyZW5jeUNvbmZpZyB7XG5cdFx0dGhpcy5jdXJyZW5jeSA9IHRoaXMuY3VycmVuY3lUeXBlQ29uZmlnLmZpbmQoKGN0OiBDdXJyZW5jeUNvbmZpZykgPT4gY3QuY29kZSA9PSBjdXJyZW5jeVR5cGVGaW5kLnRvVXBwZXJDYXNlKCkpIHx8IHRoaXMuY3VycmVuY3lcblx0XHRjdXN0b21UeXBlICYmICh0aGlzLmN1cnJlbmN5ID0geyAuLi50aGlzLmN1cnJlbmN5LCAuLi5jdXN0b21UeXBlIH0pXG5cdFx0cmV0dXJuIHRoaXMuY3VycmVuY3k7XG5cdH07XG5cblxuXHRwdWJsaWMgbW9kaWZ5Q2hhbm5lbENvbmZpZyhjaGFubmVsQ29uZmlnOiBhbnkpIHtcblx0XHR0aGlzLl93aXNobGlzdFZpc2liaWxpdHkuc2V0U2hvd1dpc2hsaXN0KFxuXHRcdFx0dHlwZW9mIGNoYW5uZWxDb25maWc/Lndpc2hsaXN0RW5hYmxlZCA9PT0gJ2Jvb2xlYW4nXG5cdFx0XHRcdD8gY2hhbm5lbENvbmZpZy53aXNobGlzdEVuYWJsZWRcblx0XHRcdFx0OiB0eXBlb2YgY2hhbm5lbENvbmZpZz8uc2hvd1dpc2hsaXN0ID09PSAnYm9vbGVhbidcblx0XHRcdFx0XHQ/IGNoYW5uZWxDb25maWcuc2hvd1dpc2hsaXN0XG5cdFx0XHRcdFx0OiBmYWxzZVxuXHRcdCk7XG5cblx0XHRpZiAoY2hhbm5lbENvbmZpZy5jaGFubmVsIHx8IGNoYW5uZWxDb25maWcuY29kZSlcblx0XHRcdHRoaXMuYXBpQ29uc3RhbnRzLnNldENoYW5uZWwoY2hhbm5lbENvbmZpZy5jaGFubmVsIHx8IGNoYW5uZWxDb25maWcuY29kZSlcblxuXHRcdGlmIChjaGFubmVsQ29uZmlnLmxvY2FsZSB8fCAoY2hhbm5lbENvbmZpZy5sb2NhbGVzICYmIGNoYW5uZWxDb25maWcubG9jYWxlcy5jb2RlKSlcblx0XHRcdHRoaXMuYXBpQ29uc3RhbnRzLnNldExvY2FsZShjaGFubmVsQ29uZmlnLmxvY2FsZSB8fCBjaGFubmVsQ29uZmlnLmxvY2FsZXMuY29kZSlcblxuXHRcdGlmIChjaGFubmVsQ29uZmlnLmN1cnJlbmN5IHx8IGNoYW5uZWxDb25maWcuYmFzZUN1cnJlbmN5KVxuXHRcdFx0dGhpcy5zZXRDdXJyZW5jeShjaGFubmVsQ29uZmlnLmN1cnJlbmN5IHx8IGNoYW5uZWxDb25maWcuYmFzZUN1cnJlbmN5KVxuXG5cdFx0aWYgKGNoYW5uZWxDb25maWcuY2hlY2tvdXRWaWV3ICE9IG51bGwpIHtcblx0XHRcdHRoaXMuc2V0Q2hlY2tvdXRWaWV3KGNoYW5uZWxDb25maWcuY2hlY2tvdXRWaWV3IGFzIENoZWNrb3V0Vmlld1R5cGUpO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgY2hhbm5lbENvbmZpZy51c2VQcm9kdWN0U2x1Z1JvdXRlID09PSAnYm9vbGVhbicpIHtcblx0XHRcdHRoaXMuc2V0VXNlUHJvZHVjdFNsdWdSb3V0ZShjaGFubmVsQ29uZmlnLnVzZVByb2R1Y3RTbHVnUm91dGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjaGFubmVsQ29uZmlnO1xuXHR9XG5cblx0LyoqXG5cdCogQGRlc2NyaXB0aW9uIHNlIHV0aWxpemEgcGFyYSBjb25maWd1cmFyIHF1ZSBmaWx0cm9zIGRlbCB0aXBvIGBTb3J0RmlsdGVyYCBzZSBxdWllcmUgbW9zdHJhciBlbiBsYSB2aXN0YS5cblx0KiBTZSB1c2FuIGxvcyBjb2RpZ28gZGUgbG9zIGZpbHRyb3MgcGFyYSBpbmRpY2FyIGN1YWxlcyBzZSBkZWJlbiBtb3N0cmFyLlxuXHQqL1xuXHRwcml2YXRlIHNvcnRGaWx0ZXJzOiBzdHJpbmdbXSA9IFsncHJpY2UnLCAnb3JkZXItYWxwaCcsICdyZWNlbnQnXVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gZmlsdGVyc0NvZGUgYXJyZWdsbyBkZSBzdHJpbmdzIGNvbiBsb3MgY29kaWdvcyBkZSBsb3MgZmlsdHJvcy5cblx0ICogU2kgc2UgbGUgcGFzYSBlbCBwYXJhbWV0cm8gKiphbGwqKiBlc3RlIG1vc3RyYXJhIHRvZG9zLlxuXHQgKiBAZXhhbXBsZSBwcmljZSB8IG9yZGVyLWFscGggfCByZWNlbnQgfCB1cGRhdGUgfCBhbGxcblx0ICogQHJldHVybnNcblx0ICovXG5cdHNldFNvcnRGaWx0ZXJzID0gKGZpbHRlcnNDb2RlOiBzdHJpbmdbXSA9IFsnYWxsJ10pID0+IHRoaXMuc29ydEZpbHRlcnMgPSBmaWx0ZXJzQ29kZTtcblxuXHRnZXRTb3J0RmlsdGVycyA9ICgpID0+IHRoaXMuc29ydEZpbHRlcnM7XG5cblx0Ly8gQUJPVVQgUFJPRFVDVFMgXG5cdHByaXZhdGUgcHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudDogYm9vbGVhbiA9IGZhbHNlO1xuXHRzZXRQcm9kdWN0V2l0aFVuaXF1ZVZhcmlhbnQodmFsdWU6IGJvb2xlYW4pIHsgdGhpcy5wcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50ID0gdmFsdWU7IH1cblx0Z2V0UHJvZHVjdFdpdGhVbmlxdWVWYXJpYW50KCkgeyByZXR1cm4gdGhpcy5wcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50IH1cblxuXHQvLyBIYWJpbGl0YSBydXRhcyBkZSBwcm9kdWN0byBwb3Igc2x1ZyBkZSBmb3JtYSBvcHQtaW4gcG9yIGZyb250ZW5kL2NhbmFsLlxuXHRwcml2YXRlIHVzZVByb2R1Y3RTbHVnUm91dGU6IGJvb2xlYW4gPSBmYWxzZTtcblx0c2V0QnVsa0FkZEVuYWJsZWQodmFsdWU6IGJvb2xlYW4pIHsgdGhpcy5fY2FwYWJpbGl0aWVzLnNldEJ1bGtBZGQodmFsdWUpOyB9XG5cdGdldEJ1bGtBZGRFbmFibGVkKCkgeyByZXR1cm4gdGhpcy5fY2FwYWJpbGl0aWVzLmJ1bGtBZGQoKSB9XG5cblx0c2V0VXNlUHJvZHVjdFNsdWdSb3V0ZSh2YWx1ZTogYm9vbGVhbikgeyB0aGlzLnVzZVByb2R1Y3RTbHVnUm91dGUgPSAhIXZhbHVlOyB9XG5cdGdldFVzZVByb2R1Y3RTbHVnUm91dGUoKSB7IHJldHVybiB0aGlzLnVzZVByb2R1Y3RTbHVnUm91dGU7IH1cblxuXHRzZXRDYXJ0UHJlcHJpbnRFbmFibGVkKHZhbHVlOiBib29sZWFuKSB7IHRoaXMuX2NhcGFiaWxpdGllcy5zZXRDYXJ0UHJlcHJpbnQodmFsdWUpOyB9XG5cdGdldENhcnRQcmVwcmludEVuYWJsZWQoKSB7IHJldHVybiB0aGlzLl9jYXBhYmlsaXRpZXMuY2FydFByZXByaW50KCk7IH1cblxuXHQvKipcblx0KiBAZGVzY3JpcHRpb24gZXN0YSB2YXJpYWJsZSBzZSB1dGlsaXphIHBhcmEgY29uZmlndXJhciBsb3MgcGFyYW1ldHJvcyBjdWFuZG8gc2UgZGVzZWEgbW9zdHJhclxuXHQqIHZhcmlhbnRlcyBlbCBsaXN0YWRvIGRlIHByb2R1Y3Rvcy5cblx0KiBAcGFyYW0ge3N0cmluZ310eXBlIHRpcG8gZGUgb3B0aW9uc1xuXHQqIEBwYXJhbSB7c3RyaW5nfWNvZGUgY29kaWdvIGRlIG9wdGlvbnNcblx0KiBAcGFyYW0ge2Jvb2xlYW59ZGVmYXVsdEZpcnN0T3B0aW9uIGB0cnVlYCB0b21hIGVsIHByaW1lciBvcHRpb24gZGVsIHByb2R1Y3RvIGVuIGdlbmVyYWxcblx0KiBAcGFyYW0ge2Jvb2xlYW59Y2hlY2tJZlN0b2NrIGB0cnVlYCBzZSByZWFsaXphIHVuIGNoZXF1ZW8gZGUgc2kgbGEgdmFyaWFudGUgdGllbmUgc3RvY2sgcGFyYSBtb3N0cmFybGFcblx0KiBAZXhhbXBsZSAgYGBgamF2YXNjcmlwdFxuXHQqIHtcblx0ICAgdHlwZTogJ2NvbG9yJyxcblx0ICAgY29kZTogJ2NvbG9yJyxcblx0ICAgZGVmYXVsdEZpcnN0T3B0aW9uOiBmYWxzZSAsXG5cdCAgIGNoZWNrSWZTdG9jazp0cnVlXG5cdCAgIH0gYGBgXG5cdCovXG5cdHByaXZhdGUgcGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudDogUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9IHtcblx0XHR0eXBlOiAnY29sb3InLFxuXHRcdGNvZGU6ICdjb2xvcicsXG5cdFx0ZGVmYXVsdEZpcnN0T3B0aW9uOiBmYWxzZSxcblx0XHRjaGVja0lmU3RvY2s6IHRydWVcblx0fVxuXG5cdHNldFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSAodmFsdWU6IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQpID0+IHtcblx0XHR0aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSB7XG5cdFx0XHQuLi50aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQsXG5cdFx0XHQuLi52YWx1ZVxuXHRcdH1cblx0fVxuXG5cdGdldFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSAoKSA9PiB0aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnRcblx0XG5cdHB1YmxpYyBnZXRDaGFubmVsKCl7XG5cdFx0cmV0dXJuIHRoaXMuYXBpQ29uc3RhbnRzLkNIQU5ORUw7XG5cdH1cblxuXHRwdWJsaWMgZm9ybV9zZW5kZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRzZXRDdXJyZW50Um91dGVUeXBlKHR5cGU6IHN0cmluZyB8IG51bGwpIHtcblx0XHR0aGlzLmN1cnJlbnRSb3V0ZVR5cGUgPSB0eXBlO1xuXHR9XG5cblx0Z2V0Q3VycmVudFJvdXRlVHlwZSgpOiBzdHJpbmcgfCBudWxsIHtcblx0XHRyZXR1cm4gdGhpcy5jdXJyZW50Um91dGVUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIE9idGllbmUgbGEgdmlzdGEgZGUgY2hlY2tvdXQgY29uZmlndXJhZGEgKGxlZ2FjeSBvIHNpbmdsZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2hlY2tvdXRWaWV3KCk6IENoZWNrb3V0Vmlld1R5cGUge1xuXHRcdHJldHVybiB0aGlzLmNoZWNrb3V0Vmlld1N1YmplY3QudmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogQ2FtYmlhIGxhIHZpc3RhIGRlIGNoZWNrb3V0IChzaW4gcGVyc2lzdGVuY2lhIGVuIHN0b3JhZ2UpLlxuXHQgKi9cblx0cHJpdmF0ZSBzZXRDaGVja291dFZpZXcodmlldzogQ2hlY2tvdXRWaWV3VHlwZSk6IHZvaWQge1xuXHRcdGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZUNoZWNrb3V0Vmlldyh2aWV3KTtcblx0XHR0aGlzLmNoZWNrb3V0Vmlld1N1YmplY3QubmV4dChub3JtYWxpemVkKTtcblx0fVxuXG5cdHByaXZhdGUgbm9ybWFsaXplQ2hlY2tvdXRWaWV3KHZpZXc6IHN0cmluZyB8IENoZWNrb3V0Vmlld1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkKTogQ2hlY2tvdXRWaWV3VHlwZSB7XG5cdFx0cmV0dXJuIHZpZXcgPT09ICdzaW5nbGUnID8gJ3NpbmdsZScgOiAnbGVnYWN5Jztcblx0fVxufVxuIl19
|