<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" href="https://cdn.revcent.com/img/securehost/favicon.png">
  <title>Stimuscalp Secure Checkout</title>
  <meta name="description" content="Stimuscalp Secure Checkout" />
  

  <link rel="stylesheet" href="https://cdn.revcent.com/css/plugins/bootstrap-4/bootstrap.min.css" type="text/css" />
  <link rel="stylesheet" href="https://cdn.revcent.com/css/revcent.css" type="text/css" />
  <link rel="stylesheet" href="https://cdn.revcent.com/css/plugins/sweetalert/sweetalert.css" type="text/css" />
  <link rel="stylesheet" href="https://cdn.revcent.com/css/plugins/bootstrap-select-4/bootstrap-select.min.css" type="text/css" />

  <link rel="stylesheet" href="https://cdn.revcent.com/css/plugins/fontawesome-5/css/all.css">
  <link rel="stylesheet" href="https://cdn.revcent.com/css/plugins/fontawesome-5/css/v4-shims.css"><style>
    .hidden {
        display: none;
    }

    .table-responsive {
        margin-top: 0px;
        border: 0px;
        padding-top: 0px;
    }

    .wrapper {
        padding: 0px;
    }

    .item-product-quantity-input {
        max-width: 60px;
        min-width: 30px;
        text-align: center;
        margin-left: auto;
        margin-right: auto;
    }

    .item-product-name-span {
        font-weight: 600;
    }

    .item-grand-total-tr {
        margin-bottom: 10px;
    }

    @media (max-width: 768px) {
        .checkout-form-items-tbody .col-xs-12 {
            text-align: left;
        }

        div.item-product-price-td,
        div.item-product-price-thead-td {
            display: none;
        }

        .item-product-quantity-input-no-table {
            max-width: 70px;
            text-align: center;
            margin-left: 0;
            margin-right: 0;
        }
    }

    div.dataTables_wrapper div.dataTables_paginate {
        float: right;
    }

    div.dataTables_wrapper div.dataTables_info {
        float: left;
        color: #777777;
        padding-top: 0px;
    }

    .customer-account-card-right .customer-account-card-email-wrap {
        text-align: center;
    }

    span.customer-account-card-email {
        font-size: 12px;
    }

    @media (min-width: 1600px) {
        .customer-account-card-top {
            display: none;
        }

        .customer-account-card-right {
            max-width: 240px;



            margin-top: 15px;


            z-index: 99999;
            position: fixed;
            right: 1%;
        }

        .customer-account-card-right .customer-account-view-account-btn-wrap {
            margin: 10px 0px;
        }

        .customer-account-card-right .customer-account-create-account-btn-wrap {
            margin: 10px 0px;
        }
    }

    @media (max-width: 1599px) {
        .customer-account-card-right {
            display: none;
        }
    }

    @media (max-width: 576px) {
        .customer-account-create-account-btn-wrap {
            margin: 10px 0px;
        }

        .customer-account-view-account-btn-wrap {
            margin: 10px 0px;
        }
    }
</style>


<style>
    * { box-sizing: border-box; } body {margin: 0;}*{box-sizing:border-box;}body{margin:0;}.shopping-cart .content{box-shadow:0px 2px 10px rgba(0, 0, 0, 0.075);background-color:white;}.shopping-cart .block-heading{padding-top:50px;margin-bottom:40px;text-align:center;}.shopping-cart .block-heading p{text-align:center;max-width:420px;margin:auto;opacity:0.7;}.shopping-cart .dark .block-heading p{opacity:0.8;}.shopping-cart .block-heading h1, .shopping-cart .block-heading h2, .shopping-cart .block-heading h3{margin-bottom:1.2rem;color:#3b99e0;}.shopping-cart .items{margin:auto;}.shopping-cart .items .product{margin-bottom:20px;padding-top:20px;padding-bottom:20px;}.shopping-cart .items .product .info{padding-top:0px;text-align:center;}.shopping-cart .items .product .info .product-name{font-weight:600;}.shopping-cart .items .product .info .product-name .product-info{font-size:14px;margin-top:15px;}.shopping-cart .items .product .info .product-name .product-info .value{font-weight:400;}.shopping-cart .items .product .info .quantity .quantity-input{margin:auto;width:80px;}.shopping-cart .items .product .info .price{margin-top:15px;font-weight:bold;font-size:22px;}.shopping-cart .summary{border-top:2px solid #5ea4f3;background-color:#f7fbff;height:100%;padding:30px;}.shopping-cart .summary h3{text-align:center;font-size:1.3em;font-weight:600;padding-top:20px;padding-bottom:20px;}.shopping-cart .summary .summary-item:not(:last-of-type){padding-bottom:10px;padding-top:10px;border-bottom:1px solid rgba(0, 0, 0, 0.1);}.shopping-cart .summary .text{font-size:1em;font-weight:600;}.shopping-cart .summary .price{font-size:1em;float:right;}.shopping-cart .summary button{margin-top:20px;}.col.col-sm-6{padding:30px 30px 30px 30px;}.btn.btn-primary.btn-lg.btn-block{font-family:Montserrat, Helvetica, sans-serif;color:#ffffff;}.col-md-3.price{top:0;bottom:0;margin:0 0 0 0;position:static;}.btn.btn-primary.btn-block.btn-lg.text-white{font-family:Source Sans Pro, Helvetica, sans-serif;}.product-price-display{font-size:14px;font-family:Source Sans Pro, Helvetica, sans-serif;font-weight:400;margin:5px 0 0 0;width:20%;text-align:right;}.product-name-display{font-family:Source Sans Pro, Helvetica, sans-serif;position:static;margin:5px 0 0 0;font-size:14px;font-weight:400;width:60%;}.form-control.quantity-input.product-quantity-input.form-control-sm{margin:0 29.4375px 0 29.4375px;position:static;padding:4px 10px 4px 10px;text-align:center;width:20%;}.summary-item.summary-total-wrap{top:0;padding:10px 0 0 0;}.mb-4{margin:10px 0 10px 0;line-height:20px;margin-bottom:10px !important;}.list-group-item.d-flex.justify-content-between{font-weight:300;}.list-group-item:last-child{margin-bottom:-1px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;border-top-right-radius:0px;border-top-left-radius:0px;}.collapse{margin:0 0 0 0;}.col-md-7.order-md-1{margin:10px 0 0 0;}.paypal-button-container{top:10px;margin-top:10px;}.paypal-smart-button-row{margin-top:10px;}.list-inline.d-flex{text-align:center;margin:0 0  0;padding:0 0 0 5px;}.col{height:100px;font-family:Arial, Helvetica, sans-serif;font-size:medium;font-weight:700;color:#ffffff;max-width:auto;}.btn.btn-primary.btn-block.btn-lg.text-white.checkout-page-cc-payment-btn{background-color:#1fa71c;border:1px solid rgb(0, 100, 189);font-weight:700;max-width:auto;float:none;position:static;left:0;margin:0 0 0 0;}.py-5{float:none;padding:14px 10px 48px 10px;}.fa-2x.fa.fa-cc-amex{font-size:50px;color:#4559ef;text-align:left;margin:0 0 0 10px;}.fa-2x.fa.fa-cc-discover{color:#4559ef;font-size:50px;margin:0 0 0 10px;}.fa-2x.fa.fa-cc-mastercard{color:#4559ef;font-size:50px;margin:0 0 0 10px;}.fa-2x.fa.fa-cc-visa{font-size:50px;color:#4559ef;}.summary-subtotal{float:right;}.summary-final-total{font-weight:600;}.gjs-comp-selected{text-align:center;margin:0 0 8px 0;color:#d30808;}.form-check-label{color:#0c0101;font-weight:600;font-size:17px;}.form-check-input{line-height:23px;}.mb-3{color:#0a0101;text-align:left;font-weight:700;}#iavip{margin-top:10px;font-weight:400;}#ismk18{margin-top:20px;font-weight:400;}#iyscc{font-weight:400;}#il49{font-weight:400;}#main-container-header-row{padding-top:20px;text-align:center;padding-bottom:20px;background-color:#4c57d0;margin:0 0 0 0;}#main-forms-row-container{padding-left:10px;padding-right:10px;}#i1frbj{color:black;width:auto;height:100px;margin:0 0 0 0;min-height:auto;float:left;}#idadff{font-weight:700;font-size:30px;clear:both;color:rgb(55, 58, 60);font-family:Helvetica, Verdana, Arial, sans-serif;caret-color:rgb(55, 58, 60);text-size-adjust:auto;margin-right:0px !important;margin-bottom:0px !important;margin-left:0px !important;padding:0px !important;}#ibcj4e{color:rgb(255, 255, 255);}#i4j0l{right:90px;position:absolute;}#icz18{position:absolute;right:90px;}#ig49y{position:absolute;right:90px;}#ij2fe{right:90px;position:absolute;font-weight:600;}#in85k{position:absolute;right:90px;margin:4px 0 0 0;}#i7i0m{font-weight:600;}#i2kw0c{color:black;float:none;display:block;position:static;margin:20px 0 0 100px;max-width:300px;left:100px;}#io128g{font-size:23px;font-weight:700;margin:13px 0 0 0;}#ijsk8p{font-size:18px;letter-spacing:-1px;line-height:37px;margin:15px 0 0 0;color:#0f0101;text-align:left;}#ixqd5p{margin:20px 0 0 0;}@media (max-width: 992px){.form-control.quantity-input.product-quantity-input.form-control-sm{text-align:center;}}@media (min-width: 768px){.shopping-cart .items .product .info{padding-top:25px;text-align:left;}.shopping-cart .items .product .info .price{font-weight:bold;font-size:22px;top:17px;}.shopping-cart .items .product .info .quantity{text-align:center;}.shopping-cart .items .product .info .quantity .quantity-input{padding:4px 10px;text-align:center;}}@media (max-width: 480px){.form-control.quantity-input.product-quantity-input.form-control-sm{text-align:center;}}@media (min-width: 480px){#main-container{box-shadow:0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);transition:all 0.3s cubic-bezier(.25,.8,.25,1);border-radius:4px;margin-top:20px;margin-bottom:20px;}#main-container-header-row{border:1px solid #d7faff;border-top-right-radius:4px;border-top-left-radius:4px;}}
</style>
<style>
    body.white-bg {
        background-color: #ffffff;
    }
</style>


<link rel="stylesheet" href="https://cdn.revcent.com/css/cart.css">


</head>

<body class="white-bg">


    <div class="wrapper wrapper-content hosted-page-wrapper hidden" id="hosted-page-wrapper" data-isprint="false" data-adwordsclick="" data-visitid="LNVAnWd00VSvqgdKZazp" data-pageid="7rgk9qzRW5Hm8woP0paX" data-submissiontype="sale" data-displaytype="page" data-paypalaccountid="" data-trackid="" data-entryid="" data-endpointcustomeraccountenabled="false" data-customeremail="" data-islogged="false" data-iscustomer="" data-accountcreateurl="" data-accountloginurl="" data-accountoverviewurl="">



        <div id="hosted-page-html-wrap">
            <div id="main-container" class="container-fluid"><div id="main-container-header-row" class="row"><div class="col"><a href="https://stimuscalp.com/"><img src="https://stimuscalp.com/wp-content/uploads/2019/08/stimuscalp-logo-1.png" id="i1frbj" /></a></div><div class="col"><div id="i1kqoi"><h2 id="idadff" class="fl-heading"><span id="ibcj4e" class="fl-heading-text">1-800-243-0955</span></h2></div></div></div><div id="main-forms-row-container" class="row py-5"><div class="col-md-5 order-md-2 mb-4"><h3 id="il49" class="d-flex justify-content-between align-items-center mb-3"><span id="icru">Your cart</span><span class="badge badge-secondary badge-pill product-count">0</span></h3><ul class="list-group mb-3"><span data-appendtype="li" class="items"><li class="list-group-item d-flex justify-content-between lh-condensed product-item-li"><span class="product-name-display">Name</span><input type="number" value="0" class="form-control quantity-input product-quantity-input form-control-sm" /><span id="in85k">$ </span><span class="product-price-display">0</span></li></span><li class="list-group-item d-flex justify-content-between summary-item summary-subtotal-wrap"><span id="i58m3">Subtotal</span><span id="ig49y">$ </span><span class="summary-subtotal">0</span></li><li class="list-group-item d-flex justify-content-between summary-item summary-shipping-wrap"><span>Shipping</span><span id="i4j0l">$ </span><span class="summary-shipping-total">0</span></li><li class="list-group-item d-flex justify-content-between summary-item summary-tax-wrap"><span>Tax</span><span id="icz18">$ </span><span class="summary-tax-total">0</span></li><li class="list-group-item d-flex justify-content-between summary-item"><span id="i7i0m">Total</span><span id="ij2fe">$ </span><span class="summary-final-total">0</span></li></ul><div id="io128g">You Get ALL This:
	  </div><div id="ijsk8p">-  30 Day Supply of Follicle Revitalizing Serum
		<div id="ity8w-2">- 
		  <strike>$24.99
		  </strike><b>FREE
		  </b> full sized bottle of Volume Activated Cleanser
		</div><div id="i74ti-2">- 
		  <strike>$24.99
		  </strike><b>FREE
		  </b> full sized bottle of Fortifying Creme-Rinse
		</div></div><img src="https://userimg.revcent.com/k6orq1j5JdUaYaak8Qlg.png" id="i2kw0c" /><div id="ixqd5p"><h1 id="i3hh0k-2-2" class="gjs-comp-selected"><b>FREE PRIORITY SHIPPING
		  </b></h1><div><br /></div><div><br /></div>You also get a FREE membership into our Replenish and Save plan, which ensures you never run out of our Serum.   It will come every 30 days for the cost of just $59.99 with Free Shipping.   You can cancel any time by calling us at 800-243-0955.
	  </div></div><div class="col-md-7 order-md-1 form-content-col"><h3 id="iyscc" class="mb-3">Bill To
	  </h3><form class="revcent-bill-to-form"><div class="row"><div class="col-md-6 mb-3"><label for="bill-to-first-name">First name</label><input type="text" placeholder="First Name" value required name="bill-to-first-name" class="form-control" /><div class="invalid-feedback">
			  Valid first name is required.
			</div></div><div class="col-md-6 mb-3"><label for="bill-to-last-name">Last name</label><input type="text" placeholder="Last Name" value required name="bill-to-last-name" class="form-control" /><div class="invalid-feedback">
			  Valid last name is required.
			</div></div></div><div class="mb-3"><label for="bill-to-address-line-1">Address Line 1</label><input type="text" placeholder="Address LIne 1" name="bill-to-address-line-1" class="form-control" /></div><div class="mb-3"><label for="bill-to-address-line-2">Address Line 2</label><input type="text" placeholder="Address Line 2" name="bill-to-address-line-2" class="form-control" /></div><div class="mb-3"><label for="bill-to-city">City</label><input type="text" placeholder="City" name="bill-to-city" class="form-control" /></div><div class="row"><div class="mb-3 col-sm-5"><label for="bill-to-state">State</label><input type="text" placeholder="State" name="bill-to-state" class="form-control" /></div><div class="mb-3 col-sm-4"><label for="bill-to-zip">Postal Code</label><input type="text" placeholder="Postal Code" name="bill-to-zip" required class="form-control" /></div><div class="col-md-3 mb-3"><label for="bill-to-country">Country</label><input type="text" placeholder="Country" name="bill-to-country" required class="form-control" /></div></div><div class="mb-3"><label for="bill-to-email">Email</label><input type="email" placeholder="Email" name="bill-to-email" class="form-control" /></div><div class="mb-3"><label for="bill-to-phone">Phone</label><input type="text" placeholder="Phone" name="bill-to-phone" class="form-control" /></div><hr class="mb-4" /><div class="custom-control custom-checkbox"><input type="checkbox" role="button" data-target=".ship-to-collapse" data-toggle="collapse" class="form-check-input" /><label class="form-check-label">Ship to different address?</label></div></form><div class="collapse ship-to-collapse"><h3 id="iavip" class="mb-3">Ship To
		</h3><form class="revcent-ship-to-form"><div class="row"><div class="col-md-6 mb-3"><label for="ship-to-first-name">First name</label><input type="text" placeholder="First Name" value name="ship-to-first-name" class="form-control" /></div><div class="col-md-6 mb-3"><label for="ship-to-last-name">Last name</label><input type="text" placeholder="Last Name" value name="ship-to-last-name" class="form-control" /></div></div><div class="mb-3"><label for="ship-to-address-line-1">Address Line 1</label><input type="text" placeholder="Address Line 1" name="ship-to-address-line-1" class="form-control" /></div><div class="mb-3"><label for="ship-to-address-line-2">Address Line 2</label><input type="text" placeholder="Address Line 2" name="ship-to-address-line-2" class="form-control" /></div><div class="mb-3"><label for="ship-to-city">City</label><input type="text" placeholder="City" name="ship-to-city" class="form-control" /></div><div class="row"><div class="mb-3 col-sm-5"><label for="ship-to-state">State</label><input type="text" placeholder="State" name="ship-to-state" class="form-control" /></div><div class="mb-3 col-sm-4"><label for="ship-to-zip">Postal Code</label><input type="text" placeholder="Postal Code" name="ship-to-zip" class="form-control" /></div><div class="col-md-3 mb-3"><label for="ship-to-country">Country</label><input type="text" placeholder="Country" name="ship-to-country" class="form-control" /></div></div><div class="mb-3"><label for="ship-to-email">Email</label><input type="email" placeholder="Email" name="ship-to-email" class="form-control" /></div><div class="mb-3"><label for="ship-to-phone">Phone</label><input type="text" placeholder="Phone" name="ship-to-phone" class="form-control" /></div></form></div><hr class="mb-4" /><h3 id="ismk18" class="mb-3">Payment Method
	  </h3><div class="d-block my-3"><div class="custom-control custom-radio"><input type="radio" id="payment-method-radio-credit" value="credit_card" name="payment-method-radio" checked class="custom-control-input" /><label for="payment-method-radio-credit" class="custom-control-label">Credit Card</label></div><i class="fa-2x fa fa-cc-visa">
		</i><i class="fa-2x fa fa-cc-mastercard">
		</i><i class="fa-2x fa fa-cc-discover">
		</i><i class="fa-2x fa fa-cc-amex">
		</i></div><div id="payment-tabs" class="tab-content"><div id="credit-card-tab" class="tab-pane active"><form class="revcent-credit-card-form"><div class="row"><div class="col-sm-12"><div class="form-group"><label>Card Number</label><input type="text" name="card-number" placeholder="Card Number" value required class="form-control" /></div></div><div class="col-sm-4"><div class="form-group"><label>Exp Month</label><select name="expiry-month" class="form-control"> <option>Month</option> <option value="01">01</option><option value="02">02</option><option value="03">03</option><option value="04">04</option><option value="05">05</option><option value="06">06</option><option value="07">07</option><option value="08">08</option><option value="09">09</option><option value="10">10</option><option value="11">11</option><option value="12">12</option></select></div></div><div class="col-sm-4"><div class="form-group"><label>Exp Year</label><select name="expiry-year" class="form-control"> <option>Year</option> <option value="19">2019</option><option value="20">2020</option><option value="21">2021</option><option value="22">2022</option><option value="23">2023</option><option value="24">2024</option><option value="25">2025</option><option value="26">2026</option><option value="27">2027</option><option value="28">2028</option><option value="29">2029</option><option value="30">2030</option><option value="31">2031</option><option value="32">2032</option><option value="33">2033</option></select></div></div><div class="col-sm-4"><div class="form-group"><label>Code</label><input type="text" name="cvv" placeholder="Card CVV" value required class="form-control" /></div></div></div></form><div id="i38skg" class="row"><div class="col"><a role="button" class="btn btn-primary btn-block btn-lg text-white hosted-page-submission-btn">Submit Your Order</a></div></div></div><div id="paypal-tab" class="tab-pane"><div id="i8g9oe" class="row paypal-smart-button-row"><div class="col paypal-smart-button-col"><div class="paypal-button-container"><a role="button" href="#" class="btn btn-default btn-block btn-lg">PayPal Smart Payments Button</a></div></div></div></div></div></div></div></div>
        </div>
        <textarea style="display:none" class="hidden" name="checkout-request" id="checkout-request" rows="3">{"request":{"product":[]}}</textarea>


        <div id="sale-account-sign-up-modal" class="modal fade">

        </div>




        <div id="customer-account-cart-modal" data-backdrop="false" class="modal fade">
            <div class="modal-dialog ">
                <div class="modal-content">
                    <span><button type="button" data-dismiss="modal" class="close"> <span><i class="fad fa-times-circle"></i></span> </button></span>
                    <div id="customer-account-cart-modal-wrapper" class="modal-body">

                    </div>
                </div>
            </div>
        </div>




    </div>
    <script src="https://cdn.revcent.com/js/jquery.min.js"></script>


    
    <script src="https://cdn.revcent.com/js/plugins/bootstrap-4/bootstrap.bundle.min.js"></script>
    
    <script src="https://cdn.revcent.com/js/plugins/validation/jquery.validate.min.js"></script>
    <script src="https://cdn.revcent.com/js/plugins/validation/additional-methods.min.js"></script>
    <script src="https://cdn.revcent.com/js/plugins/bootstrap-select-4/bootstrap-select.js"></script>
    <script src="https://cdn.revcent.com/js/plugins/moment/moment.js"></script>
    <script src="https://cdn.revcent.com/js/plugins/moment/moment-timezone.js"></script>
    <script src="https://cdn.revcent.com/js/plugins/sweetalert/sweetalert.min.js"></script>

    <script>
      $(document).ready(function() {
        
        $(function() {
          $('[data-toggle="popover"]').popover()
        })
        $(function() {
          $('[data-toggle="tooltip"]').tooltip()
        })
      });
    </script>



    <script>
      var hosted_page_id = '7rgk9qzRW5Hm8woP0paX';
      var hosted_page_wrapper = 'hosted-page-wrapper';
      var hosted_page_html_wrap = 'hosted-page-html-wrap';
      var hosted_page_actions = {"code_1":{"redirect":{"url":"https://stimuscalp.com/conversion/","fixed_parameters":"","dynamic_parameters":"","include_parent_parameters":"true","include_iframe_parameters":"true"},"action":"redirect","html":"<table style=\"width: 600px; margin-left: auto; margin-right: auto;\"><tbody>\n<tr>\n<td align=\"center\"><p><br></p></td>\n</tr>\n<tr>\n<td align=\"center\">\n<h2>Order Confirmation from Stimuscalp</h2>\n</td>\n</tr>\n<tr>\n<td><hr>\n<p><span style=\"font-size: x-large;\">Thank you for your order on {{sale_date}} !</span><br> <span style=\"font-size: x-large;\">Your Order ID is {{sale_id}}</span>.</p>\n<p>If you need support or help, you can contact us by <a href=\"https://stimuscalp.com/customer-support/\" target=\"_blank\">clicking here</a> or by calling us to 888-403-1905&nbsp; Monday through Friday, 9am to 6pm.</p><p><span style=\"font-size: x-large; color: rgb(255, 0, 0); background-color: rgb(255, 255, 255);\">Important:&nbsp; Your card will be billed by \"Vitamin Sales Online\" or \"M2 Products Group\".&nbsp; Please make a note.</span><br></p>\n<p>&nbsp;</p>\n</td>\n</tr>\n<tr>\n<td><hr></td>\n</tr>\n</tbody>\n</table>\n<p>&nbsp;</p>\n<table style=\"width: 600px; margin-left: auto; margin-right: auto;\">\n<tbody>\n<tr>\n<td><strong>Billing Info</strong></td>\n<td><strong>Shipping Info</strong></td>\n</tr>\n<tr>\n<td>\n<p>{{customer_first_name}}&nbsp;{{customer_last_name}}<br> {{customer_address_line_1}}&nbsp;{{customer_address_line_2}}<br> {{customer_city}},&nbsp;{{customer_state}}<br> {{customer_zip}}<br> {{customer_country}}</p>\n</td>\n<td>\n<p>{{ship_to_first_name}}&nbsp;{{ship_to_last_name}}<br> {{ship_to_address_line_1}}&nbsp;{{ship_to_address_line_2}}<br> {{ship_to_city}},&nbsp;{{ship_to_state}}<br> {{ship_to_zip}}<br> {{ship_to_country}}</p>\n</td>\n</tr>\n</tbody>\n</table>\n<p>&nbsp;</p>\n<table style=\"width: 600px; margin-left: auto; margin-right: auto;\">\n<tbody>\n<tr>\n<td><strong>Products in Order:</strong><br><hr></td>\n</tr>\n<tr>\n<td>{{product_list}}</td>\n</tr>\n<tr>\n<td><hr></td>\n</tr>\n</tbody>\n</table>\n<p>&nbsp;</p>\n<table style=\"width: 600px; margin-left: auto; margin-right: auto;\">\n<tbody>\n<tr>\n<td style=\"width: 300px;\">&nbsp;</td>\n<td style=\"width: 300px;\"><span style=\"font-size: 16px;\">Subtotal: ${{products_amount}}<br> <span style=\"font-size: 16px;\">Tax: ${{tax_amount}}<br> <span style=\"font-size: 16px;\">Shipping: ${{shipping_amount}}</span></span></span></td>\n</tr><tr><td style=\"width: 300px;\"><br></td><td style=\"width: 300px;\"><p><span style=\"font-size: 16px;\">Discount:&nbsp; $({{discount_amount}})</span></p></td></tr>\n<tr>\n<td style=\"width: 300px;\">&nbsp;</td>\n<td style=\"width: 300px;\">\n<p><strong><span style=\"font-size: 16px;\">Amount Paid Today: ${{amount_captured}}</span></strong></p>\n</td>\n</tr>\n<tr>\n<td style=\"width: 300px;\">&nbsp;</td>\n<td style=\"width: 300px;\">&nbsp;</td>\n</tr>\n</tbody>\n</table>\n<table style=\"background-color: black; width: 600px; height: 60px; margin-left: auto; margin-right: auto;\">\n<tbody>\n\n</tbody>\n</table>"},"code_2":{"redirect":{"url":"https://securehost.revcent.com/stimuscalp/stimuscalperror","fixed_parameters":"","dynamic_parameters":"","include_parent_parameters":"true","include_iframe_parameters":"true"},"action":"redirect","html":""},"code_3":{"redirect":{"url":"","fixed_parameters":"","dynamic_parameters":"","include_parent_parameters":"true","include_iframe_parameters":"true"},"action":"nothing","html":""},"code_0":{"redirect":{"url":"","fixed_parameters":"","dynamic_parameters":"","include_parent_parameters":"true","include_iframe_parameters":"true"},"action":"nothing","html":""}};
      var hosted_page_submission_type = 'sale';

      var $jscomp = $jscomp || {};
      $jscomp.scope = {};
      $jscomp.arrayIteratorImpl = function (b) {
        var a = 0;
        return function () {
          return a < b.length ? {
            done: !1,
            value: b[a++]
          } : {
            done: !0
          };
        };
      };
      $jscomp.arrayIterator = function (b) {
        return {
          next: $jscomp.arrayIteratorImpl(b)
        };
      };
      $jscomp.makeIterator = function (b) {
        var a = "undefined" != typeof Symbol && Symbol.iterator && b[Symbol.iterator];
        return a ? a.call(b) : $jscomp.arrayIterator(b);
      };
      $jscomp.arrayFromIterator = function (b) {
        for (var a, f = []; !(a = b.next()).done;) {
          f.push(a.value);
        }
        return f;
      };
      $jscomp.arrayFromIterable = function (b) {
        return b instanceof Array ? b : $jscomp.arrayFromIterator($jscomp.makeIterator(b));
      };

      function processRevCentResponse(b) {
        function a() {
          document.getElementById(hosted_page_wrapper).scrollIntoView();
        }
        var submission_btn = document.querySelectorAll('.hosted-page-submission-btn');
        

        function toggleSubmissionBtn(show) {
          if (typeof submission_btn !== 'undefined') {
            if (show === false) {
              submission_btn.forEach(a => a.classList.add('disabled'));
            }else{
              submission_btn.forEach(a => a.classList.remove('disabled'));
            }
          }
        }

        function f(a, c) {
          function f(a) {
            var b = [];
            a = new URL(a);
            a = new URLSearchParams(a.search);
            a = $jscomp.makeIterator(a);
            for (var d = a.next(); !d.done; d = a.next()) {
              d = d.value, "" !== d[0] && "" !== d[1] && b.push(m(d[0] + "=" + d[1]));
            }
            return b;
          }

          function m(a) {
            var b = "";
            null !== a && "undefined" !== typeof a && (a = a.split("="), 2 === a.length && "" !== a[0] && "undefined" !== typeof a[0] && "" !== a[1] && "undefined" !== typeof a[1] && (b = encodeURIComponent(a[0]) + "=" + encodeURIComponent(a[1])));
            return b;
          }
          var h = a.url.split("?")[0],
            g = [];
          if ("" !== a.fixed_parameters) {
            for (var k = a.fixed_parameters.split(","), e = 0; e < k.length; e++) {
              g.push(m(k[e]));
            }
          }
          if ("" !== a.dynamic_parameters) {
            for (k = a.dynamic_parameters.replace(/\{\{(.+?)\}\}/g, function (a, c) {
                return b[c] || "";
              }).split(","), e = 0; e < k.length; e++) {
              var l = k[e].split("=");
              2 === l.length && "undefined" !== typeof l[0] && "" !== l[0] && "undefined" !== typeof l[1] && "" !== l[1] && g.push(m(k[e]));
            }
          }
          "true" === a.include_parent_parameters && g.push.apply(g, $jscomp.arrayFromIterable(f(window.location.href)));
          h = h + "?" + g.join("&");
          c(null, h);
        }
        var n = document.getElementById(hosted_page_html_wrap);
        var swal_header = '';
        var swal_type = '';
        var swal_message = '';

        if ("code" in b && null !== b.code && "" !== b.code) {
          var c = b.code;
          if ("code_" + c in hosted_page_actions) {
            if (c !== 1) {
              toggleSubmissionBtn(true)
            }
            if ("redirect" === hosted_page_actions["code_" + c].action) {
              "redirect" in hosted_page_actions["code_" + c] && "url" in hosted_page_actions["code_" + c].redirect ? f(hosted_page_actions["code_" + c].redirect, function (b, c) {
                b ? a() : (n.style.display = "none", window.location.href = c);
              }) : a();
            } else if ("html" === hosted_page_actions["code_" + c].action) {
              n.style.display = "none";
              var h = document.createElement("div");
              h.id = "REVCENT_RESULT_HTML";
              c = hosted_page_actions["code_" + c].html.replace(/\{\{(.+?)\}\}/g, function (a, c) {
                return b[c] || "";
              });
              h.innerHTML = c;
              document.getElementById(hosted_page_wrapper).appendChild(h);
              document.getElementById("REVCENT_RESULT_HTML").scrollIntoView();
            } else if ("popup" === hosted_page_actions["code_" + c].action && typeof swal === "function") {
              if (c === 1) {
                swal_header = 'Success';
                swal_type = 'success';
                if (hosted_page_submission_type === 'sale') {
                  swal_message = 'Payment successfully processed!';
                } else if (hosted_page_submission_type === 'lead_only') {
                  swal_message = 'Thanks for signing up!';
                } else {
                  swal_message = 'Thanks for submission!';
                }
              } else {
                swal_header = 'Error';
                swal_type = 'error';
                if ('message' in b && b.message !== '') {
                  swal_message = b.message;
                } else {
                  swal_message = 'Unknown error occurred. Please contact support.';
                }
              }
              swal(swal_header, swal_message, swal_type);
            } else {
              a();
            }
          } else {
            a();
          }
        } else {
          processUnknownResult();
        }

        function processUnknownResult() {
          toggleSubmissionBtn(true)
          if (typeof swal === "function") {
            swal('Error', 'Unknown error occurred. Please contact support.', 'error');
          } else {
            a();
          }
        }
      };
    </script>
    
    

    <script src="https://cdn.revcent.com/js/plugins/jquery-ui/jquery-ui.min.js">
    </script>
    <script src="https://cdn.revcent.com/js/plugins/formbuilder/form-builder.min.js"></script>
    <script src="https://cdn.revcent.com/js/plugins/formbuilder/form-render.min.js"></script>
    

    <script>
      window.addEventListener('message',function(event) {
        if('data' in event&&event.data!==null&&typeof event.data==='object'&&'event_id' in event.data&&'revcent_response' in event.data&&event.data.revcent_response!==null&&typeof event.data.revcent_response==='object') {
          if(event.data.event_id==='revcent_tracking'&&'revcent_track_id' in event.data.revcent_response&&event.data.revcent_response.revcent_track_id!==''&&'revcent_entry_id' in event.data.revcent_response&&event.data.revcent_response.revcent_entry_id!=='') {
            $('#hosted-page-wrapper').attr('data-trackid',event.data.revcent_response.revcent_track_id);
            $('#hosted-page-wrapper').attr('data-entryid',event.data.revcent_response.revcent_entry_id);
            updateVisitTrackEntry();
          }
        }
      });

      function updateVisitTrackEntry() {
        $.ajax({
          type: 'POST',
          url: 'https://securehost.revcent.com/securehost-tracking',
          dataType: "json",
          data: {
            visit_id: $('#hosted-page-wrapper').attr('data-visitid'),
            track_id: $('#hosted-page-wrapper').attr('data-trackid'),
            entry_id: $('#hosted-page-wrapper').attr('data-entryid')
          },
          success: function(x) {}
        });
      }

      function rlp(x) {
        window.setTimeout(function() {
          window.location.reload();
        },x);
      }

      function startPageLoader() {
        $('<div class="loading-page-wrapper revcent-page-loader"></div>').insertBefore('.wrapper.wrapper-content');
      }

      function stopPageLoader() {
        var uri=window.location.toString();
        if(uri.indexOf("?")>0&&uri.indexOf("invoice_id")===-1) {
          var clean_uri=uri.substring(0,uri.indexOf("?"));
          window.history.replaceState({},document.title,clean_uri);
        }
        if(uri.indexOf("?")>0&&uri.indexOf("invoice_id")>-1) {
          if($('#hosted-page-wrapper').attr('data-isprint')==='true') {
            $('.main-checkout-row').remove();
            $('section.shopping-cart').removeClass().addClass('print-view');
            try {
              var invoice_details=JSON.parse($('#invoice-details').text());
              if(typeof invoice_details.paid!=='undefined'&&invoice_details.paid===false&&typeof invoice_details.void!=='undefined'&&invoice_details.void===false) {
                $('section.print-view').append('<div class="text-center" target="_blank" id="invoice-footer-payment-link"><a href="'+uri+'">Pay Invoice</a></div>');
              }
            } catch(ex) {
              console.log(ex);
            }
          }
        }

        $('.wrapper.wrapper-content.hidden').removeClass('hidden');
        $('.loading-page-wrapper').addClass('hidden');
      }

      function setRevCentCartCookieValue(cookie_name,cookie_sub_value,is_json,is_uri,new_value,callback) {
        var cookie_val=new_value;
        if(cookie_sub_value&&cookie_sub_value!==null) {
          cookie_val=getCookieValue(cookie_name,null,is_json,is_uri);
          cookie_val[cookie_sub_value]=new_value;
        }

        if(is_json&&is_json===true) {
          cookie_val=JSON.stringify(cookie_val);
        }
        if(is_uri&&is_uri===true) {
          cookie_val=encodeURIComponent(cookie_val);
        }

        createLocalCookie(cookie_name,cookie_val,30,function(err,res) {
          if(err) {
            callback(err);
          } else {
            callback(null,'OK');
          }
        });
      }

      function createLocalCookie(name,value,days,callback) {
        if(create_revcent_cookie===true) {
          var expires='';
          if(days) {
            var date=new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            expires='; expires='+date.toUTCString();
          }
          document.cookie=name+'='+value+expires+'; path=/; SameSite=None; Secure';
        }
        callback(null,null);
      }

      function findLocalCookie(name) {
        var nameEQ=name+'=';
        var ca=document.cookie.split(';');
        for(var i=0;i<ca.length;i++) {
          var c=ca[i];
          while(c.charAt(0)===' ') c=c.substring(1,c.length);
          if(c.indexOf(nameEQ)===0) return c.substring(nameEQ.length,c.length);
        }
        return null;
      }
      
      function getCookieValue(cookie_name,cookie_sub_value,is_json,is_uri) {
        var cart_cookie=findLocalCookie(cookie_name);
        if(cart_cookie!==null&&cart_cookie!==''&&typeof cart_cookie!=='undefined') {
          if(is_json&&is_json===true) {
            var cookie_json;
            try {
              if(is_uri&&is_uri===true) {
                cookie_json=JSON.parse(decodeURIComponent(cart_cookie));
              } else {
                cookie_json=JSON.parse(cart_cookie);
              }
              if(cookie_sub_value&&cookie_sub_value!==null) {
                return cookie_json[cookie_sub_value];
              } else {
                return cookie_json;
              }
            } catch(ex) {
              console.log(ex);
              return null;
            }
          } else {
            return cart_cookie;
          }
        } else {
          return null;
        }
      }


      function fwp(x,y) {
        window.setTimeout(function() {
          window.location.replace(y);
        },x);
      }
    </script>

    <script>
      var updateCartProduct;
    </script>
    
    <style>
      .formbuilder-select .form-control.bootstrap-select {
        padding: 0;
      }

      .product-option-form {
        padding: 20px;
      }
    </style>
    <script>
      function propagateProductOption(product_id,option_id,product_option_submitted,form_json_string,callback) {
        var form_json=null;
        try {
          form_json=JSON.parse(form_json_string);
        } catch(ex) {
          console.log(ex);
          callback();
          return;
        }
        if(product_option_submitted!==null&&typeof product_option_submitted==='object'&&'id' in product_option_submitted&&product_option_submitted.id===option_id&&'options' in product_option_submitted&&product_option_submitted.options!==null&&typeof product_option_submitted.options==='object'&&Object.keys(product_option_submitted.options).length>0&&Array.isArray(form_json)&&form_json.length>0) {
          let options=product_option_submitted.options;
          let form_json_ctr=0;
          for(let i=0,len=form_json.length;i<len;i++) {
            if('name' in form_json[i]&&form_json[i].name in options) {
              let form_option=form_json[i];
              let submitted_option=options[form_json[i].name];
              if(form_option.type==='radio-group') {
                $('#product-option-form-'+option_id+' input[name="'+form_json[i].name+'"][type="radio"]').each(function() {
                  if($(this).val()===submitted_option) {
                    $(this).attr('checked','checked');
                  } else {
                    $(this).attr('checked',false);
                  }
                });
              } else if(form_option.type==='select') {
                let append_name='';
                if(form_option.multiple===true) {
                  append_name='[]'
                }
                $('#product-option-form-'+option_id+' select[name="'+form_json[i].name+append_name+'"] option').each(function() {
                  if(Array.isArray(submitted_option)) {
                    if(submitted_option.includes($(this).val())) {
                      $(this).attr("selected","selected");
                    }
                  } else if(typeof submitted_option==='string') {
                    if($(this).val()===submitted_option) {
                      $(this).attr("selected","selected");
                    }
                  }
                });
              } else if(form_option.type==='checkbox-group') {
                let append_name='[]';
                $('#product-option-form-'+option_id+' input[name="'+form_json[i].name+append_name+'"][type="checkbox"]').each(function() {
                  if(Array.isArray(submitted_option)) {
                    if(submitted_option.includes($(this).val())) {
                      $(this).attr("checked","checked");
                    } else {
                      $(this).attr('checked',false);
                    }
                  } else if(typeof submitted_option==='string') {
                    if($(this).val()===submitted_option) {
                      $(this).attr("checked","checked");
                    } else {
                      $(this).attr('checked',false);
                    }
                  }
                });
              } else if(form_option.type==='text') {
                $('#product-option-form-'+option_id+' input[name="'+form_json[i].name+'"][type="text"]').val(submitted_option);
              } else if(form_option.type==='textarea') {
                $('#product-option-form-'+option_id+' textarea[name="'+form_json[i].name+'"][type="textarea"]').val(submitted_option);
              } else if(form_option.type==='number') {
                $('#product-option-form-'+option_id+' input[name="'+form_json[i].name+'"][type="number"]').val(submitted_option);
              } else if(form_option.type==='date') {
                $('#product-option-form-'+option_id+' input[name="'+form_json[i].name+'"][type="date"]').val(submitted_option);
              } else if(form_option.type==='hidden') {
                $('#product-option-form-'+option_id+' input[name="'+form_json[i].name+'"][type="hidden"]').val(form_option.value);
              }
              checkPropagateCtr();
            } else {
              checkPropagateCtr();
            }

            function checkPropagateCtr() {
              form_json_ctr++;
              if(form_json_ctr===form_json.length) {
                sendBack();
              }
            }
          }

        } else {
          sendBack();
        }

        function sendBack() {
          callback();
        }
      }

      function productOptionChange(product_id,option_id,callback) {

        $.fn.serializeObject=function() {
          var o={};
          var a=this.serializeArray();
          $.each(a,function() {
            if(o[this.name.replace('[]','')]) {
              if(!o[this.name.replace('[]','')].push) {
                o[this.name.replace('[]','')]=[o[this.name.replace('[]','')]];
              }
              o[this.name.replace('[]','')].push(this.value||'');
            } else {
              o[this.name.replace('[]','')]=this.value||'';
            }
          });
          return o;
        };
        var form_object=$('form#product-option-form-'+option_id).serializeObject();
        var product_option_object={};
        product_option_object.id=option_id;
        product_option_object.options=form_object;
        updateCartProduct(product_id,null,product_option_object,function(err,res) {
          callback(null,res);
        });
      }


      function buildItemsDisplay(x,item_html,callback) {
        var append_type=null;
        var append_wrap='div';
        var append_class='';
        if(item_html===null&&$('.items').length>0) {
          item_html=$('.items')[0].innerHTML;
          if($('.items').attr('data-appendtype')) {
            append_type=$('.items').attr('data-appendtype');
          }
          if(append_type!==null) {
            if(append_type==='li') {
              append_wrap='span';
              append_class='';
            }
          }
        }
        $('.coupon-code-wrap').removeClass('hidden');
        $('.items').empty();
        $.each(x.products,function(a,b) {
          var append_item='<'+append_wrap+' class="product-wrap '+append_class+' product-wrap-'+b.id+'" data-productid="'+b.id+'" data-pos="'+a+'">'+item_html+'</'+append_wrap+'>';
          $('.items').append(append_item);
          $('.product-wrap-'+b.id).find('.product-quantity-input').attr('value',b.quantity).attr('data-productid',b.id);
          $('.product-wrap-'+b.id).find('.product-name-display').html(b.name);
          if('is_trial' in b&&b.is_trial===true) {
            $('.product-wrap-'+b.id).find('.product-price-display').html(0);
          } else {
            $('.product-wrap-'+b.id).find('.product-price-display').html(b.price);
          }
          $('.product-wrap-'+b.id).find('.product-remove-wrap').empty().html('<a class="product-remove-btn" data-productid="'+b.id+'">remove</a>');
          if('max_quantity_allowed' in b&&b.max_quantity_allowed!==null&&!isNaN(parseInt(b.max_quantity_allowed))&&parseInt(b.max_quantity_allowed)>0) {
            $('.product-wrap-'+b.id).find('.product-quantity-input').attr('max',b.max_quantity_allowed);
            if(b.quantity>b.max_quantity_allowed) {
              $('.product-wrap-'+b.id).find('.product-quantity-input').attr('value',b.max_quantity_allowed);
            }
          }
          if('product_option' in b&&Array.isArray(b.product_option)&&b.product_option.length>0) {
            $('.product-wrap-'+b.id).append('<div class="product-options-wrap" id="product-options-wrap-'+b.id+'" data-productid="'+b.id+'"></div>');
            $.each(b.product_option,function(c,d) {
              if('form_json' in d&&d.enabled===true) {
                $('#product-options-wrap-'+b.id).append('<form class="product-option-form" id="product-option-form-'+d.id+'" data-productid="'+b.id+'" data-optionid="'+d.id+'"></form>');
                var form_wrap=$('#product-option-form-'+d.id);
                var form_options={
                  container: form_wrap,
                  formData: d.form_json,
                  dataType: 'json',
                  i18n: {
                    locale: 'en-US',
                    location: 'https://cdn.revcent.com/js/plugins/formbuilder/',
                    extension: '.lang'
                  },
                };
                $(form_wrap).formRender(form_options);
                $('.formbuilder-select select[multiple=false]').removeAttr('multiple');
                $('.formbuilder-select select').addClass('selectpicker');

                if('product_option_validated' in d&&d.product_option_validated!==null&&typeof d.product_option_validated==='object') {
                  var product_id=$('form#product-option-form-'+d.id).attr('data-productid');
                  var option_id=$('form#product-option-form-'+d.id).attr('data-optionid');
                  propagateProductOption(product_id,option_id,d.product_option_validated,d.form_json,function(err,res) {
                    $('.selectpicker').selectpicker('refresh');
                  });
                }

                $('.selectpicker').selectpicker('refresh');

                $('form#product-option-form-'+d.id+' :input').change(function() {
                  var product_id=$('form#product-option-form-'+d.id).attr('data-productid');
                  var option_id=$('form#product-option-form-'+d.id).attr('data-optionid');
                  productOptionChange(product_id,option_id,function(err,res) {
                    $('.selectpicker').selectpicker('refresh');
                  });
                });
              }
            });
          }
        });

        processProductCount();
        updateSummary();

        function processProductCount() {
          $('.product-count').text(x.products.length);
          if(x.products.length===0) {
            $('.form-content-col,.main-checkout-row').addClass('d-none');
            $('.product-count').removeClass('badge-primary');
            $('.product-count').addClass('badge-secondary');
          } else {
            $('.form-content-col,.main-checkout-row').removeClass('d-none');
            $('.product-count').addClass('badge-primary');
            $('.product-count').removeClass('badge-secondary');
          }
        }

        function updateSummary() {
          $('.summary-subtotal').html(x.totals.products.amount_bill_now.toFixed(2));
          $('.summary-discount-total').html(x.totals.discount.amount_total.toFixed(2));
          $('.summary-shipping-total').html(x.totals.shipping.amount_bill_now.toFixed(2));
          $('.summary-tax-total').html(x.totals.tax.amount_bill_now.toFixed(2));
          $('.summary-final-total').html(x.totals.amount_bill_now.toFixed(2));
          if(x.totals.discount.amount_total===0) {
            $('.summary-discount-wrap').attr('style','display: none !important');
          } else {
            $('.summary-discount-wrap').attr('style','display: block !important');
            $('.summary-discount-wrap').addClass('text-success');
            $('.summary-discount-total').html('- '+x.totals.discount.amount_total.toFixed(2));
          }
          if(x.totals.tax.amount_bill_now===0) {
            $('.summary-tax-wrap').attr('style','display: none !important');
          } else {
            $('.summary-tax-wrap').attr('style','display: block !important');
          }
          if(x.totals.shipping.amount_bill_now===0) {
            $('.summary-shipping-total').html('FREE');
          }
        }
        callback(null,item_html);
      }
    </script>
    

    

    <script>
      $(document).ready(function() {
        var visit_id=$('#hosted-page-wrapper').attr('data-visitid');
        var page_id=$('#hosted-page-wrapper').attr('data-pageid');
        var adwords_click=$('#hosted-page-wrapper').attr('data-adwordsclick');
        var display_type=$('#hosted-page-wrapper').attr('data-displaytype');
        var submission_type=$('#hosted-page-wrapper').attr('data-submissiontype');
        var submission_url='https://securehost.revcent.com/securehost-submission';
        var cart_url='https://securehost.revcent.com/securehost-cart';
        var currency_symbol='$';
        var checkout_request=null;
        var unique_request_id=null;
        var item_html=null;
        var amount_bill_now=null;
        var estimate_object=null;
        var sale_id=null;
        var pending_sale=null;
        var new_card=false;


        var submission_btn=document.querySelectorAll('.hosted-page-submission-btn');

        function checkSubmissionType() {
          checkLocalCookie();
        }

        function checkLocalCookie() {
          var cart_check=findLocalCookie('revcent_cart');
          if(cart_check!==null&&cart_check!==''&&typeof cart_check!=='undefined') {
            parseCookie();
          } else {
            loadBlankRequest();
          }
        }


        $(document).on('input','input.product-quantity-input',function() {
          updateCartProduct($(this).attr('data-productid'),$(this).val(),null,function(err,res) {});
        });


        $(document).on('click','.coupon-code-apply-btn',function(a) {
          validateCartCoupon($('#coupon-code-input').val(),function(err,res) {});
        });

        function validateCartCoupon(coupon_code,callback) {
          $.ajax({
            type: 'POST',
            url: cart_url,
            dataType: "json",
            data: {
              sub_type: 'validate_cart_coupon',
              page_id: page_id,
              visit_id: visit_id,
              coupon_code: coupon_code
            },
            success: function(x) {
              if('code' in x&&x.code===1) {
                updateCartCoupon(coupon_code,function(err,res) {});
              } else {
                swal('Error',x.message,'error');
              }
            }
          });
        }

        function updateCartCoupon(coupon_code,callback) {
          $.ajax({
            type: 'POST',
            url: cart_url,
            dataType: "json",
            data: {
              sub_type: 'update_cart_coupon',
              page_id: page_id,
              visit_id: visit_id,
              coupon_code: coupon_code
            },
            success: function(x) {
              if('code' in x&&x.code===1) {
                parseCookie();
              } else {
                swal('Error',x.message,'error');
              }
            }
          });
        }


        $(document).on('click','.product-remove-btn',function(a) {
          updateCartProduct($(this).attr('data-productid'),0,null,function(err,res) {});
        });

        updateCartProduct=function(product_id,product_quantity,product_option_object,callback) {

          var data_object={
            sub_type: 'update_cart_product',
            page_id: page_id,
            visit_id: visit_id,
            product_id: product_id,
          };

          if(product_option_object!==null&&typeof product_option_object==='object'&&'id' in product_option_object) {
            data_object.product_option=JSON.stringify(product_option_object);
          }
          if(product_quantity!==null) {
            data_object.product_quantity=product_quantity;
          }

          $.ajax({
            type: 'POST',
            url: cart_url,
            dataType: "json",
            data: data_object,
            success: function(x) {
              if('code' in x&&x.code===1) {
                parseCookie();
              } else {
                swal('Error',x.message,'error');
              }
              callback(null,'OK');
            }
          });
        }

        function emptyCart(callback) {
          $.ajax({
            type: 'POST',
            url: cart_url,
            dataType: "json",
            data: {
              sub_type: 'empty_cart',
              page_id: page_id,
              visit_id: visit_id
            },
            success: function(x) {
              $('#checkout-request').val('');
              callback(null,'OK');
            }
          });
        }


        function parseCookie() {
          $.ajax({
            type: 'POST',
            url: cart_url,
            dataType: "json",
            data: {
              sub_type: 'parse_cart_cookie',
              page_id: page_id,
              visit_id: visit_id
            },
            success: function(x) {
              if('code' in x&&x.code===1) {
                parseUserCart(x.user_cart);
              } else if('code' in x&&x.code===4) {
                $('#checkout-request').val('');
                loadBlankRequest();
              } else {
                if('message' in x) {
                  swal('Error',x.message,'error');
                }
              }
            }
          });
        }

        function parseUserCart(user_cart) {
          if('unique_request_id' in user_cart) {
            unique_request_id=user_cart.unique_request_id;
          }
          if('request_object' in user_cart) {
            checkout_request=user_cart.request_object;
          }
          if(checkout_request!==null) {
            setCheckoutRequestValue();
            $('.main-checkout-row').show();
          } else {
            $('#checkout-request').val('');
            loadBlankRequest();
          }
        }


        function setCheckoutRequestValue() {
          $('#checkout-request').val(JSON.stringify(checkout_request));
          loadEstimate();
        }



        function loadBlankRequest() {
          $('.items').empty();
          $('.product-count').text('0');
          $('.product-count').removeClass('badge-primary');
          $('.product-count').addClass('badge-secondary');
          $('.summary-subtotal').html('0');
          $('.summary-shipping-total').html('0');
          $('.summary-discount-total').html('0');
          $('.summary-tax-total').html('0');
          $('.summary-final-total').html('0');
          $('.form-content-col,.main-checkout-row').addClass('d-none');
          $('.summary-discount-wrap').attr('style','display: none !important');
          $('.coupon-code-wrap').addClass('hidden');
          stopPageLoader();
        }

        function loadEstimate() {
          if(checkout_request===null) {
            if($('#checkout-request').val()&&$('#checkout-request').val().length>30) {
              try {
                checkout_request=JSON.parse($('#checkout-request').val());
                validateProducts();
              } catch(ex) {
                console.log(ex);
              }
            } else {
              loadBlankRequest();
            }
          } else {
            validateProducts();
          }

          function validateProducts() {
            if('request' in checkout_request&&'product' in checkout_request.request&&Array.isArray(checkout_request.request.product)&&checkout_request.request.product.length>0) {
              sendRequest();
            } else {
              loadBlankRequest();
            }
          }

          function sendRequest() {
            $('.summary-subtotal,.summary-discount-total,.summary-shipping-total,.summary-tax-total,.summary-final-total').html('<i class="fas fa-circle-notch fa-spin"></i>');
            $.ajax({
              type: 'POST',
              url: submission_url,
              dataType: "json",
              data: {
                request_type: 'estimate',
                page_id: page_id,
                visit_id: visit_id,
                adwords_click: $('#hosted-page-wrapper').attr('data-adwordsclick'),
                form_data: JSON.stringify(getFormData()),
                checkout_request: JSON.stringify(checkout_request)
              },
              success: function(x) {
                if(x&&x!==null&&typeof x==='object'&&'code' in x) {
                  if(x.code===1&&'products' in x&&Array.isArray(x.products)) {
                    estimate_object=x;
                    buildItemsDisplay(x,item_html,function(err,res) {
                      item_html=res;
                      // processProductCount(x.products.length);
                      // updateSummary(x);
                      amount_bill_now=x.totals.amount_bill_now;
                      stopPageLoader();
                    });
                  } else {
                    if('message' in x) {
                      swal('Error',x.message,'error');
                    }
                    emptyCart(function(err,res) {});
                    loadBlankRequest();
                  }
                } else {
                  loadBlankRequest();
                }
              }
            });
          }
        }


        $(document).on('change','input[name=customer-zip]',function() {
          buildCustomerObject(function(a) {
            if(a.code===1) {
              loadEstimate();
            }
          });
        });
        $(document).on('change','input[name=bill-to-zip]',function() {
          buildBillToObject(function(a) {
            if(a.code===1) {
              loadEstimate();
            }
          });
        });
        $(document).on('change','input[name=ship-to-zip]',function() {
          buildShipToObject(function(a) {
            if(a.code===1) {
              loadEstimate();
            }
          });
        });
        $(document).on('change','input[name=card-number]',function() {
          if($('input[name=card-number]').val().length>5) {
            new_card=true;
          }
        });

        $('[name="payment-method-radio"]').on('change',function() {
          if($(this).val()==="credit_card") {
            $('#credit-card-tab').show();
            $('#paypal-tab').hide();
          } else if($(this).val()==="paypal") {
            $('#credit-card-tab').hide();
            $('#paypal-tab').show();
          }
        });

        function buildCustomerObject(callback) {
          var res={};
          res.code=0;
          if($('input[name=customer-first-name]').val()!==''&&$('input[name=customer-last-name]').val()!=='') {
            res.code=1;
          }
          callback(res);
        }

        function buildBillToObject(callback) {
          var res={};
          res.code=0;
          if($('input[name=bill-to-first-name]').val()!==''&&$('input[name=bill-to-last-name]').val()!=='') {
            res.code=1;
          }
          callback(res);
        }

        function buildShipToObject(callback) {
          var res={};
          res.code=0;
          if($('input[name=ship-to-first-name]').val()!==''&&$('input[name=ship-to-last-name]').val()!=='') {
            res.code=1;
          }
          callback(res);
        }


        function getFormData() {
          var cc_form_data=$('.revcent-credit-card-form').serializeArray();
          var customer_form_data=$('.revcent-customer-form').serializeArray();
          var bill_to_form_data=$('.revcent-bill-to-form').serializeArray();
          var ship_to_form_data=$('.revcent-ship-to-form').serializeArray();
          var form_data=[].concat(cc_form_data,bill_to_form_data,ship_to_form_data,customer_form_data);
          return form_data;
        }

        function getCheckoutRequest() {
          try {
            return checkout_request=JSON.parse($('#checkout-request').val());
          } catch(ex) {
            console.log(ex);
            return null;
          }
        }

        function getPayPalOrderObject(pending_sale) {
          var paypal_order_obj={
            purchase_units: []
          };

          var purchase_unit_obj={
            custom_id: 'revcent_'+pending_sale.sale_id,
            amount: {
              value: estimate_object.totals.amount_bill_now,
              currency_code: 'USD',
              breakdown: {
                item_total: {
                  currency_code: 'USD',
                  value: estimate_object.totals.products.amount_bill_now
                },
                shipping: {
                  currency_code: 'USD',
                  value: estimate_object.totals.shipping.amount_bill_now
                },
                tax_total: {
                  currency_code: 'USD',
                  value: estimate_object.totals.tax.amount_bill_now
                }
              }
            }
          };

          if('products' in estimate_object&&Array.isArray(estimate_object.products)&&estimate_object.products.length>0) {
            purchase_unit_obj.items=[];
            for(var i=0,len=estimate_object.products.length;i<len;i++) {
              var item_obj={};
              item_obj.name=estimate_object.products[i].name;
              item_obj.sku=estimate_object.products[i].id;
              item_obj.unit_amount={
                currency_code: 'USD',
                value: estimate_object.products[i].price
              };
              item_obj.quantity=estimate_object.products[i].quantity;
              purchase_unit_obj.items.push(item_obj);
            }
          }

          if('shipping' in estimate_object&&Array.isArray(estimate_object.shipping)&&estimate_object.shipping.length>0) {
            purchase_unit_obj.shipping={};
            purchase_unit_obj.shipping.method=estimate_object.shipping[0].provider+' '+estimate_object.shipping[0].provider_method;
          }
          paypal_order_obj.purchase_units.push(purchase_unit_obj);

          return paypal_order_obj;
        }

        function validatePurchaseFields(is_paypal) {
          if(is_paypal&&is_paypal===true) {
            if($('.revcent-customer-form').length>0&&$('.revcent-customer-form').valid()) {
              return true
            } else if($('.revcent-bill-to-form').length>0&&$('.revcent-bill-to-form').valid()) {
              return true;
            } else {
              return false;
            }
          } else {
            if($('#hosted-page-wrapper').attr('data-iscustomer')===true||$('#hosted-page-wrapper').attr('data-iscustomer')==='true') {
              return true;
            } else {
              if($('.revcent-credit-card-form').valid()) {
                if($('.revcent-customer-form').length>0&&$('.revcent-customer-form').valid()) {
                  return true
                } else if($('.revcent-bill-to-form').length>0&&$('.revcent-bill-to-form').valid()) {
                  return true;
                } else {
                  return false;
                }
              } else {
                return false;
              }
            }
          }
        }


        $(document).on('click','.hosted-page-submission-btn',function(a) {
          if(validatePurchaseFields()===true) {
            submitSaleForm();
          } else {
            swal('Error','Please complete all required fields.','error');
          }
        });


        function toggleSubmissionBtn(show) {
          if(typeof submission_btn!=='undefined') {
            if(show===false) {
              submission_btn.forEach(a => a.classList.add('disabled'));
            } else {
              submission_btn.forEach(a => a.classList.remove('disabled'));
            }
          }
        }



        function submitSaleForm() {
          $('#checkout-form-payment-result-fieldset-result-wrap').empty();
          $('#checkout-form-payment-result-fieldset').addClass('hidden');
          toggleSubmissionBtn(false);
          $.ajax({
            type: 'POST',
            url: submission_url,
            dataType: "json",
            data: {
              request_type: 'create',
              page_id: page_id,
              visit_id: visit_id,
              adwords_click: $('#hosted-page-wrapper').attr('data-adwordsclick'),
              is_customer: $('#hosted-page-wrapper').attr('data-iscustomer'),
              form_data: JSON.stringify(getFormData()),
              checkout_request: JSON.stringify(getCheckoutRequest()),
              new_card: new_card
            },
            success: function(x) {
              if(x.code===1) {
                emptyCart(function(err,res) {});
              }
              if(typeof processRevCentResponse==="function") {
                processRevCentResponse(x);
              } else {
                processGenericResult(x);
              }
            }
          });
        }



        function processGenericResult(x) {
          var alert_class='warning';
          var payment_result='Unknown Error Occurred';
          var response_p='<p>Please contact customer support.</p>';
          var payment_icon='';
          if('code' in x) {
            response_p='';
            if('amount' in x) {
              response_p+='<p>Amount: $'+x.amount+' </p>';
            }
            if('transaction_id' in x) {
              response_p+='<p>Transaction ID: <strong>'+x.transaction_id+'</strong></p>';
            }
            if('sale_id' in x) {
              response_p+='<p>Sale ID: <strong>'+x.sale_id+'</strong></p>';
            }
            if('error_code' in x) {
              response_p+='<p>Error Code: '+x.error_code+' </p><p>Please contact customer support.</p>';
            }
            if('message' in x) {
              response_p+='<p>Message: '+x.message+' </p>';
            }

            if(x.code===1) {
              alert_class='success';
              payment_result='Payment Successful';
            } else if(x.code===0) {
              payment_result='Error';
            } else if(x.code===2) {
              alert_class='danger';
              payment_result='Payment Declined';
            } else if(x.code===3) {
              payment_result='Merchant Error';
            } else if(x.code===4) {
              payment_result='Merchant Hold';
              payment_icon='exclamation-triangle';
            }
          }

          if([0,2,3].includes(x.code)) {
            toggleSubmissionBtn(true);
            swal(payment_result,x.message,'warning');
          } else {
            $('#checkout-forms-row,.product-list-col').empty();
            if(x.code===1) {
              swal('Payment Success','Your payment was successfully processed.','success');
            } else if(x.code===4) {
              swal('Merchant Hold','The merchant placed a hold on the transaction.','warning');
            }
            var payment_result_html='<div class="col-12" style="margin-top:25px"><div class="alert alert-'+alert_class+'" style="text-align:center" role="alert"><p><strong><i class="fa fa-'+payment_icon+'"></i> '+payment_result+'</strong></p>'+response_p+'</div></div>';
            $('#checkout-forms-row').append(payment_result_html);
            document.getElementById("checkout-forms-row").scrollIntoView();
          }

          window.parent.postMessage({
            event_id: 'revcent_response',
            revcent_response: x
          },
            '*'
          );
        }



        if($('.paypal-button-container').length>0&&typeof $('#hosted-page-wrapper').attr('data-paypalaccountid')!=='undefined'&&$('#hosted-page-wrapper').attr('data-paypalaccountid')!==null&&$('#hosted-page-wrapper').attr('data-paypalaccountid')!=='') {
          $('.paypal-button-container').empty();
          paypal.Buttons({
            createOrder: function(data,actions) {
              try {
                if(validatePurchaseFields(true)) {
                  return fetch(submission_url,{
                    method: 'post',
                    headers: {
                      'content-type': 'application/json',
                      'accept': 'application/json, text/javascript, text/plain, */*; q=0.01'
                    },
                    body: JSON.stringify({
                      request_type: 'paypal_pending',
                      page_id: page_id,
                      visit_id: visit_id,
                      paypal_account_id: $('#hosted-page-wrapper').attr('data-paypalaccountid'),
                      adwords_click: $('#hosted-page-wrapper').attr('data-adwordsclick'),
                      form_data: JSON.stringify(getFormData()),
                      checkout_request: JSON.stringify(getCheckoutRequest())
                    })
                  })
                    .then(function(res) {
                      return res.json();
                    })
                    .then(function(sale_response) {
                      if('code' in sale_response&&sale_response.code===1&&'amount' in sale_response) {
                        pending_sale=sale_response;
                        sale_id=sale_response.sale_id;
                        return actions.order.create(getPayPalOrderObject(pending_sale));
                      } else {
                        throw sale_response.message;
                      }
                    }).catch(function(e) {
                      throw e;
                    });
                } else {
                  throw 'Please complete all required fields.';
                }
              } catch(ex) {
                swal('Error',ex,'error');
                //throw ex;
              }
            },
            onApprove: function(data,actions) {
              return actions.order.capture().then(function(details) {
                return fetch(submission_url,{
                  method: 'post',
                  headers: {
                    'content-type': 'application/json',
                    'accept': 'application/json, text/javascript, text/plain, */*; q=0.01'
                  },
                  body: JSON.stringify({
                    request_type: 'paypal_validate',
                    paypal_account_id: $('#hosted-page-wrapper').attr('data-paypalaccountid'),
                    paypal_transaction_id: data.orderID,
                    paypal_transaction_details: details,
                    sale_id: sale_id,
                    page_id: page_id,
                    visit_id: visit_id,
                    adwords_click: adwords_click,
                    form_data: JSON.stringify(getFormData()),
                    checkout_request: JSON.stringify(getCheckoutRequest())
                  })
                })
                  .then(function(res) {
                    return res.json();
                  })
                  .then(function(validate_response) {
                    if('code' in validate_response&&validate_response.code===1) {
                      emptyCart(function(err,res) {});
                      var main_response=null;
                      if('message' in validate_response&&validate_response.message==='paid') {
                        main_response=pending_sale;
                      } else {
                        main_response=validate_response;
                      }
                      main_response.amount=pending_sale.amount;
                      main_response.transaction_id=data.orderID;
                      if(typeof processRevCentResponse==="function") {
                        processRevCentResponse(main_response);
                      } else {
                        processGenericResult(main_response);
                      }
                    } else {
                      throw validate_response.message;
                    }
                  }).catch(function(e) {
                    throw e;
                  });
              });
            },
            onError: function(err) {
              //console.log(err);
            }
          }).render('.paypal-button-container');
        } else {
          $('.payment-method-radio-paypal-wrap').remove();
        }
        startPageLoader();
        checkSubmissionType();
      });
    </script>
    






    


    
    <script>!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)}; if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t,s)}(window, document,'script', 'https://connect.facebook.net/en_US/fbevents.js'); fbq('init', '173731334046348'); fbq('track', 'PageView');</script><noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=173731334046348&ev=PageView&noscript=1"/></noscript>
</body>

</html>