Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@skava/graphql / dist / graphql-modules / oms / stream / endpoints / transformOrder.js
Size: Mime:
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/* eslint max-statements: "OFF" */
const date_fns_1 = require("date-fns");
const composition_1 = require("composition");
const exotic_1 = require("exotic");
/**
 * @todo - add getImmutableTyped, or getFrozenTyped, or array.frozen()
 */
const utils_1 = require("@skava/utils");
const ORDER_STATUS_LABEL = {
    NONE: 'None',
    ONHOLD: 'On hold',
    SUBMITTED: 'Submitted',
    READYTOEDIT: 'Ready to edit',
    FREEZEEDIT: 'Freeze edit',
    SUBMITTEDTOFULFILMENT: 'Submitted to fulfillment',
    READYTOSHIP: 'Ready to ship',
    SHIPPED: 'Shipped',
    RETURNSUBMITTED: 'Return submitted',
    UNABLETOSHIP: 'Unable to ship',
    // Cancelled in India/British english
    CANCELED: 'Canceled',
    DELIVERED: 'Delivered',
    STANDARD_DELIVERY: 'Standard Delivery',
};
function formatOrderStatus(status) {
    /**
     * @todo @fixme @invalid
     * @note @ganesh
     * this is bad performance
     * obviously was copied from formatPrice which is @deprecated
     * this is not a reusable util, this is a domain specific data
     */
    if (exotic_1.isString(status)) {
        return ORDER_STATUS_LABEL[status] || exotic_1.EMPTY_STRING;
    }
    else {
        return 'N/A';
    }
}
function fixStringyBooleans(x) {
    switch (x) {
        case 'true':
            return true;
            break;
        case 'TRUE':
            return true;
        case 'false':
            return false;
        case 'FALSE':
            return false;
        default:
            return x;
            break;
    }
}
// @todo use the util from deps (once this kinda util moved to deps ;p)
function toPrettyDate(date, dateFormat = 'MMM DD, YYYY') {
    if (date) {
        const ms = parseInt(date);
        const actualDate = date_fns_1.getTime(ms);
        return date_fns_1.format(actualDate, dateFormat);
    }
    return Date.now();
}
/**
 * @todo @fixme @james @unsafe
 */
function parseInvalidJSON(x) {
    if (exotic_1.isString(x) === false) {
        return x;
    }
    const value = x.replace(/\\/g, '');
    return JSON.parse(value);
}
const isLabelCreatedAt = item => item.label === 'createdtime';
const isLabelName = data => data.label === 'name';
const getMath = math => {
    const { string } = composition_1.getTyped(math);
    const getPrice = path => {
        // number
        const value = string(path);
        return utils_1.formatPrice(value, '$');
    };
    const grandTotal = () => {
        const total = string('totalSale');
        const tax = string('tax');
        const grandTotal = exotic_1.toNumber(total) + exotic_1.toNumber(tax);
        return utils_1.formatPrice(grandTotal, '$');
    };
    /**
     * @todo - this is unclear
     */
    const transformedMath = {
        subTotal: getPrice('sale'),
        giftSale: getPrice('giftsale'),
        tax: getPrice('tax'),
        shippingCharge: getPrice('fulfilsale'),
        shippingTax: getPrice('fulfiltax'),
        discount: getPrice('discount'),
        total: getPrice('totalSale'),
        grandTotal: grandTotal(),
        // all numbers...
        // There is no coupontotal coming from the API...?
        couponTotal: getPrice('coupontotal') || 0,
    };
    return transformedMath;
};
const toPaymentDetails = payment => {
    const { obj } = composition_1.getTyped(payment);
    // this seems like an invalid invariant
    const cardDetails = obj('properties.paymentcardinfo.additionalinfo[0]');
    const additionalInfo = obj('properties.creditcardinfo[0].cards[0].additionalinfo');
    const transformed = {
        carddetails: parseInvalidJSON(cardDetails.value),
        name: additionalInfo.find(isLabelName),
    };
    return transformed;
};
exports.toPaymentDetails = toPaymentDetails;
const filterProductType = product => {
    return product.type === 'SKU';
};
const filterShippingType = product => {
    return product.type === 'SHIPPING';
};
const findHasShipped = flags => {
    const found = flags.find(flag => {
        return flag.label === 'shipped';
    });
    return fixStringyBooleans(found.value);
};
const toShippingDetail = detail => {
    const { array, obj, string } = composition_1.getTyped(detail);
    const price = string('properties.cartinfo.total');
    const hasShipped = findHasShipped(array('properties.iteminfo.flags'));
    const shippingaddress = array('properties.userinfo');
    return {
        price: utils_1.formatPrice(price, '$'),
        shippingaddress,
        hasShipped,
    };
};
const toProductDetail = product => {
    const { array, string, number, obj } = composition_1.getTyped(product);
    const price = string('properties.cartinfo.total');
    const shippingmethod = string('properties.cartinfo.shippingmethods.0.name');
    const shippingaddress = array('properties.userinfo');
    return {
        identifier: string('properties.iteminfo.psvid'),
        skuid: string('identifier'),
        name: string('name'),
        image: string('image'),
        quantity: number('properties.iteminfo.cartinfo.quantity'),
        // @todo - money
        price: utils_1.formatPrice(price, '$'),
        skuinfo: obj('properties.skuinfo'),
        shippingmethod,
        shippingaddress,
    };
};
exports.toProductDetail = toProductDetail;
const toPackage = pkg => {
    const { array, string, number, obj } = composition_1.getTyped(pkg);
    const getPrice = path => {
        const value = string(path);
        return utils_1.formatPrice(value, '$');
    };
    const getStatus = path => {
        const status = string('properties.state.status');
        return formatOrderStatus(status);
    };
    const orderPlacedOnLabelValue = array('properties.state.additionalinfo').find(isLabelCreatedAt) || exotic_1.EMPTY_OBJ;
    /**
     * @todo @invalid @fixme unsafe
     */
    const properties = {
        buyinfo: obj('properties.buyinfo'),
        cartinfo: obj('properties.cartinfo'),
        iteminfo: obj('properties.iteminfo'),
        state: obj('properties.state'),
        math: obj('properties.math'),
        orderinfo: obj('properties.orderinfo'),
        userinfo: obj('properties.userinfo[0]'),
    };
    const products = array('children.products')
        .filter(filterProductType)
        .map(toProductDetail);
    const shipping = array('children.products')
        .filter(filterShippingType)
        .map(toShippingDetail);
    return {
        orderTotalAmount: getPrice('properties.math.totalSale'),
        orderTotalItems: number('properties.state.count') || products.length,
        orderId: string('properties.orderinfo.orderId'),
        orderCreatedTime: toPrettyDate(orderPlacedOnLabelValue.value),
        status: getStatus('properties.state.status'),
        products,
        shipping,
        math: getMath(obj('properties.math')),
        properties,
    };
};
exports.toPackage = toPackage;
const transformDetailOrders = response => {
    const { array, number, string } = composition_1.getTyped(response);
    const ordersResponse = {
        state: {
            // autofix(properties.state)
            statuscode: number('properties.state.statuscode'),
            offset: number('properties.state.offset'),
            count: number('properties.state.count'),
            status: number('properties.state.status'),
        },
        packages: array('children.packages').map(toPackage),
        payments: array('children.payments'),
        paymentcardinfo: array('children.payments').map(toPaymentDetails),
    };
    return ordersResponse;
};
exports.transformDetailOrders = transformDetailOrders;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtT3JkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZ3JhcGhxbC1tb2R1bGVzL29tcy9zdHJlYW0vZW5kcG9pbnRzL3RyYW5zZm9ybU9yZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsa0NBQWtDO0FBQ2xDLHVDQUEwQztBQUMxQyw2Q0FBMkM7QUFDM0MsbUNBQW9FO0FBQ3BFOztHQUVHO0FBQ0gsd0NBQTBDO0FBRTFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDekIsSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsU0FBUztJQUNqQixTQUFTLEVBQUUsV0FBVztJQUN0QixXQUFXLEVBQUUsZUFBZTtJQUM1QixVQUFVLEVBQUUsYUFBYTtJQUN6QixxQkFBcUIsRUFBRSwwQkFBMEI7SUFDakQsV0FBVyxFQUFFLGVBQWU7SUFDNUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsZUFBZSxFQUFFLGtCQUFrQjtJQUNuQyxZQUFZLEVBQUUsZ0JBQWdCO0lBQzlCLHFDQUFxQztJQUNyQyxRQUFRLEVBQUUsVUFBVTtJQUNwQixTQUFTLEVBQUUsV0FBVztJQUN0QixpQkFBaUIsRUFBRSxtQkFBbUI7Q0FDdkMsQ0FBQTtBQUNELFNBQVMsaUJBQWlCLENBQUMsTUFBdUM7SUFDaEU7Ozs7OztPQU1HO0lBQ0gsSUFBSSxpQkFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUkscUJBQVksQ0FBQTtLQUNsRDtTQUFNO1FBQ0wsT0FBTyxLQUFLLENBQUE7S0FDYjtBQUNILENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLENBQTRDO0lBQ3RFLFFBQVEsQ0FBQyxFQUFFO1FBQ1QsS0FBSyxNQUFNO1lBQ1QsT0FBTyxJQUFJLENBQUE7WUFDWCxNQUFLO1FBQ1AsS0FBSyxNQUFNO1lBQ1QsT0FBTyxJQUFJLENBQUE7UUFDYixLQUFLLE9BQU87WUFDVixPQUFPLEtBQUssQ0FBQTtRQUNkLEtBQUssT0FBTztZQUNWLE9BQU8sS0FBSyxDQUFBO1FBQ2Q7WUFDRSxPQUFPLENBQUMsQ0FBQTtZQUNSLE1BQUs7S0FDUjtBQUNILENBQUM7QUFFRCx1RUFBdUU7QUFDdkUsU0FBUyxZQUFZLENBQ25CLElBQTRCLEVBQzVCLFVBQVUsR0FBRyxjQUFjO0lBRTNCLElBQUksSUFBSSxFQUFFO1FBQ1IsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3pCLE1BQU0sVUFBVSxHQUFHLGtCQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDOUIsT0FBTyxpQkFBTSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQTtLQUN0QztJQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO0FBQ25CLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6QixJQUFJLGlCQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFO1FBQ3pCLE9BQU8sQ0FBQyxDQUFBO0tBQ1Q7SUFDRCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNsQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDMUIsQ0FBQztBQUVELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLGFBQWEsQ0FBQTtBQUM3RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFBO0FBRWpELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFO0lBQ3JCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxzQkFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFO1FBQ3RCLFNBQVM7UUFDVCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDMUIsT0FBTyxtQkFBVyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUNoQyxDQUFDLENBQUE7SUFDRCxNQUFNLFVBQVUsR0FBRyxHQUFHLEVBQUU7UUFDdEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ2pDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN6QixNQUFNLFVBQVUsR0FBRyxpQkFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLGlCQUFRLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDbEQsT0FBTyxtQkFBVyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUNyQyxDQUFDLENBQUE7SUFDRDs7T0FFRztJQUNILE1BQU0sZUFBZSxHQUFHO1FBQ3RCLFFBQVEsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQzFCLFFBQVEsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQzlCLEdBQUcsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3BCLGNBQWMsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQ3RDLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ2xDLFFBQVEsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQzlCLEtBQUssRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQzVCLFVBQVUsRUFBRSxVQUFVLEVBQUU7UUFDeEIsaUJBQWlCO1FBQ2pCLGtEQUFrRDtRQUNsRCxXQUFXLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7S0FDMUMsQ0FBQTtJQUVELE9BQU8sZUFBZSxDQUFBO0FBQ3hCLENBQUMsQ0FBQTtBQUNELE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEVBQUU7SUFDakMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDakMsdUNBQXVDO0lBQ3ZDLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFBO0lBQ3ZFLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FDeEIsc0RBQXNELENBQ3ZELENBQUE7SUFFRCxNQUFNLFdBQVcsR0FBRztRQUNsQixXQUFXLEVBQUUsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUNoRCxJQUFJLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7S0FDdkMsQ0FBQTtJQUVELE9BQU8sV0FBVyxDQUFBO0FBQ3BCLENBQUMsQ0FBQTtBQW1IUSw0Q0FBZ0I7QUFqSHpCLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLEVBQUU7SUFDbEMsT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQTtBQUMvQixDQUFDLENBQUE7QUFFRCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxFQUFFO0lBQ25DLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUE7QUFDcEMsQ0FBQyxDQUFBO0FBRUQsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLEVBQUU7SUFDN0IsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM5QixPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFBO0lBQ2pDLENBQUMsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDeEMsQ0FBQyxDQUFBO0FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsRUFBRTtJQUNoQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxzQkFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQy9DLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO0lBQ2pELE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFBO0lBQ3JFLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0lBQ3BELE9BQU87UUFDTCxLQUFLLEVBQUUsbUJBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO1FBQzlCLGVBQWU7UUFDZixVQUFVO0tBQ1gsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQUVELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxFQUFFO0lBQ2hDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO0lBQ2pELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFBO0lBQzNFLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0lBQ3BELE9BQU87UUFDTCxVQUFVLEVBQUUsTUFBTSxDQUFDLDJCQUEyQixDQUFDO1FBQy9DLEtBQUssRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQzNCLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3BCLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3RCLFFBQVEsRUFBRSxNQUFNLENBQUMsdUNBQXVDLENBQUM7UUFDekQsZ0JBQWdCO1FBQ2hCLEtBQUssRUFBRSxtQkFBVyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDOUIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQztRQUNsQyxjQUFjO1FBQ2QsZUFBZTtLQUNoQixDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBcUUwQiwwQ0FBZTtBQW5FMUMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEVBQUU7SUFDdEIsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLHNCQUFRLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUU7UUFDdEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzFCLE9BQU8sbUJBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDaEMsQ0FBQyxDQUFBO0lBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUU7UUFDdkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUE7UUFDaEQsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsQyxDQUFDLENBQUE7SUFFRCxNQUFNLHVCQUF1QixHQUMzQixLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxrQkFBUyxDQUFBO0lBRTlFOztPQUVHO0lBQ0gsTUFBTSxVQUFVLEdBQUc7UUFDakIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQztRQUNsQyxRQUFRLEVBQUUsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1FBQ3BDLFFBQVEsRUFBRSxHQUFHLENBQUMscUJBQXFCLENBQUM7UUFDcEMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztRQUM5QixJQUFJLEVBQUUsR0FBRyxDQUFDLGlCQUFpQixDQUFDO1FBQzVCLFNBQVMsRUFBRSxHQUFHLENBQUMsc0JBQXNCLENBQUM7UUFDdEMsUUFBUSxFQUFFLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQztLQUN4QyxDQUFBO0lBRUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1NBQ3hDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztTQUN6QixHQUFHLENBQUMsZUFBZSxDQUFDLENBQUE7SUFFdkIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1NBQ3hDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztTQUMxQixHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUV4QixPQUFPO1FBQ0wsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLDJCQUEyQixDQUFDO1FBQ3ZELGVBQWUsRUFBRSxNQUFNLENBQUMsd0JBQXdCLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTTtRQUNwRSxPQUFPLEVBQUUsTUFBTSxDQUFDLDhCQUE4QixDQUFDO1FBQy9DLGdCQUFnQixFQUFFLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUM7UUFDN0QsTUFBTSxFQUFFLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQztRQUM1QyxRQUFRO1FBQ1IsUUFBUTtRQUNSLElBQUksRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDckMsVUFBVTtLQUNYLENBQUE7QUFDSCxDQUFDLENBQUE7QUFxQjJDLDhCQUFTO0FBbkJyRCxNQUFNLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxFQUFFO0lBQ3ZDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLHNCQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFcEQsTUFBTSxjQUFjLEdBQUc7UUFDckIsS0FBSyxFQUFFO1lBQ0wsNEJBQTRCO1lBQzVCLFVBQVUsRUFBRSxNQUFNLENBQUMsNkJBQTZCLENBQUM7WUFDakQsTUFBTSxFQUFFLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQztZQUN6QyxLQUFLLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxNQUFNLENBQUMseUJBQXlCLENBQUM7U0FDMUM7UUFDRCxRQUFRLEVBQUUsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUNuRCxRQUFRLEVBQUUsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1FBQ3BDLGVBQWUsRUFBRSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7S0FDbEUsQ0FBQTtJQUVELE9BQU8sY0FBYyxDQUFBO0FBQ3ZCLENBQUMsQ0FBQTtBQUVzRCxzREFBcUIifQ==