1<!doctype html> 2<html class="no-js" lang="en"> 3<head> 4 <meta charset="utf-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 6 <meta name="viewport" content="width=device-width,initial-scale=1"> 7 <meta name="theme-color" content="#3a3a3a"> 8 9 <link rel="preconnect" href="https://cdn.shopify.com" crossorigin> 10 <link rel="preconnect" href="https://fonts.shopify.com" crossorigin> 11 <link rel="preconnect" href="https://monorail-edge.shopifysvc.com"><link rel="preload" href="//safetracksgpsshop.ca/cdn/shop/t/4/assets/theme.css?v=123821891045210198441693425564" as="style"> 12 <link rel="preload" as="font" href="//safetracksgpsshop.ca/cdn/fonts/figtree/figtree_n4.3c0838aba1701047e60be6a99a1b0a40ce9b8419.woff2" type="font/woff2" crossorigin> 13 <link rel="preload" as="font" href="//safetracksgpsshop.ca/cdn/fonts/figtree/figtree_n4.3c0838aba1701047e60be6a99a1b0a40ce9b8419.woff2" type="font/woff2" crossorigin> 14 <link rel="preload" as="font" href="//safetracksgpsshop.ca/cdn/fonts/figtree/figtree_n7.2fd9bfe01586148e644724096c9d75e8c7a90e55.woff2" type="font/woff2" crossorigin> 15 <link rel="preload" href="//safetracksgpsshop.ca/cdn/shop/t/4/assets/theme.js?v=73407550851675742171693425564" as="script"> 16 <link rel="preload" href="//safetracksgpsshop.ca/cdn/shop/t/4/assets/lazysizes.js?v=63098554868324070131693425564" as="script"><link rel="canonical" href="https://safetracksgpsshop.ca/cart"><link rel="shortcut icon" href="//safetracksgpsshop.ca/cdn/shop/files/green_favicon_32x32.jpg?v=1656195685" type="image/png"><title>Your Shopping Cart 17– SafeTracksGPS</title><!-- /snippets/social-meta-tags.liquid --> 18 19 20 21 22<meta property="og:site_name" content="SafeTracksGPS"> 23<meta property="og:url" content="https://safetracksgpsshop.ca/cart"> 24<meta property="og:title" content="Your Shopping Cart"> 25<meta property="og:type" content="website"> 26<meta property="og:description" content="SafeTracks GPS Personal Monitoring Solutions are used for both individual and commercial applications including; Lone Workers, Young Adults, Victims of Domestic/Family Violence, Independent Seniors, and those living with Alzheimerâs, 27Dementia, Autism, or PTSD."> 28 29<meta property="og:image" content="http://safetracksgpsshop.ca/cdn/shop/files/Green_Social_Image_1200x1200.jpg?v=1656193357"> 30<meta property="og:image:secure_url" content="https://safetracksgpsshop.ca/cdn/shop/files/Green_Social_Image_1200x1200.jpg?v=1656193357"> 31 32 33<meta name="twitter:card" content="summary_large_image"> 34<meta name="twitter:title" content="Your Shopping Cart"> 35<meta name="twitter:description" content="SafeTracks GPS Personal Monitoring Solutions are used for both individual and commercial applications including; Lone Workers, Young Adults, Victims of Domestic/Family Violence, Independent Seniors, and those living with Alzheimerâs, 36Dementia, Autism, or PTSD."> 37 38 39<style data-shopify> 40:root { 41 --color-text: #3a3a3a; 42 --color-text-rgb: 58, 58, 58; 43 --color-body-text: #333232; 44 --color-sale-text: #ea0606; 45 --color-small-button-text-border: #3a3a3a; 46 --color-text-field: #ffffff; 47 --color-text-field-text: #000000; 48 --color-text-field-text-rgb: 0, 0, 0; 49 50 --color-btn-primary: #3a3a3a; 51 --color-btn-primary-darker: #212121; 52 --color-btn-primary-text: #ffffff; 53 54 --color-blankstate: rgba(51, 50, 50, 0.35); 55 --color-blankstate-border: rgba(51, 50, 50, 0.2); 56 --color-blankstate-background: rgba(51, 50, 50, 0.1); 57 58 --color-text-focus:#606060; 59 --color-overlay-text-focus:#e6e6e6; 60 --color-btn-primary-focus:#606060; 61 --color-btn-social-focus:#d2d2d2; 62 --color-small-button-text-border-focus:#606060; 63 --predictive-search-focus:#f2f2f2; 64 65 --color-body: #ffffff; 66 --color-bg: #ffffff; 67 --color-bg-rgb: 255, 255, 255; 68 --color-bg-alt: rgba(51, 50, 50, 0.05); 69 --color-bg-currency-selector: rgba(51, 50, 50, 0.2); 70 71 --color-overlay-title-text: #ffffff; 72 --color-image-overlay: #685858; 73 --color-image-overlay-rgb: 104, 88, 88;--opacity-image-overlay: 0.4;--hover-overlay-opacity: 0.8; 74 75 --color-border: #ebebeb; 76 --color-border-form: #cccccc; 77 --color-border-form-darker: #b3b3b3; 78 79 --svg-select-icon: url(//safetracksgpsshop.ca/cdn/shop/t/4/assets/ico-select.svg?v=29003672709104678581693425564); 80 --slick-img-url: url(//safetracksgpsshop.ca/cdn/shop/t/4/assets/ajax-loader.gif?v=41356863302472015721693425564); 81 82 --font-weight-body--bold: 700; 83 --font-weight-body--bolder: 700; 84 85 --font-stack-header: Figtree, sans-serif; 86 --font-style-header: normal; 87 --font-weight-header: 400; 88 89 --font-stack-body: Figtree, sans-serif; 90 --font-style-body: normal; 91 --font-weight-body: 400; 92 93 --font-size-header: 20; 94 95 --font-size-base: 15; 96 97 --font-h1-desktop: 27; 98 --font-h1-mobile: 25; 99 --font-h2-desktop: 15; 100 --font-h2-mobile: 14; 101 --font-h3-mobile: 15; 102 --font-h4-desktop: 13; 103 --font-h4-mobile: 12; 104 --font-h5-desktop: 11; 105 --font-h5-mobile: 10; 106 --font-h6-desktop: 10; 107 --font-h6-mobile: 9; 108 109 --font-mega-title-large-desktop: 50; 110 111 --font-rich-text-large: 17; 112 --font-rich-text-small: 13; 113 114 115--color-video-bg: #f2f2f2; 116 117 118 --global-color-image-loader-primary: rgba(58, 58, 58, 0.06); 119 --global-color-image-loader-secondary: rgba(58, 58, 58, 0.12); 120 } 121</style> 122 123 124 <style>*,::after,::before{box-sizing:border-box}body{margin:0}body,html{background-color:var(--color-body)}body,button{font-size:calc(var(--font-size-base) * 1px);font-family:var(--font-stack-body);font-style:var(--font-style-body);font-weight:var(--font-weight-body);color:var(--color-text);line-height:1.5}body,button{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%}.border-bottom{border-bottom:1px solid var(--color-border)}.btn--link{background-color:transparent;border:0;margin:0;color:var(--color-text);text-align:left}.text-right{text-align:right}.icon{display:inline-block;width:20px;height:20px;vertical-align:middle;fill:currentColor}.icon__fallback-text,.visually-hidden{position:absolute!important;overflow:hidden;clip:rect(0 0 0 0);height:1px;width:1px;margin:-1px;padding:0;border:0}svg.icon:not(.icon--full-color) circle,svg.icon:not(.icon--full-color) ellipse,svg.icon:not(.icon--full-color) g,svg.icon:not(.icon--full-color) line,svg.icon:not(.icon--full-color) path,svg.icon:not(.icon--full-color) polygon,svg.icon:not(.icon--full-color) polyline,svg.icon:not(.icon--full-color) rect,symbol.icon:not(.icon--full-color) circle,symbol.icon:not(.icon--full-color) ellipse,symbol.icon:not(.icon--full-color) g,symbol.icon:not(.icon--full-color) line,symbol.icon:not(.icon--full-color) path,symbol.icon:not(.icon--full-color) polygon,symbol.icon:not(.icon--full-color) polyline,symbol.icon:not(.icon--full-color) rect{fill:inherit;stroke:inherit}li{list-style:none}.list--inline{padding:0;margin:0}.list--inline>li{display:inline-block;margin-bottom:0;vertical-align:middle}a{color:var(--color-text);text-decoration:none}.h1,.h2,h1,h2{margin:0 0 17.5px;font-family:var(--font-stack-header);font-style:var(--font-style-header);font-weight:var(--font-weight-header);line-height:1.2;overflow-wrap:break-word;word-wrap:break-word}.h1 a,.h2 a,h1 a,h2 a{color:inherit;text-decoration:none;font-weight:inherit}.h1,h1{font-size:calc(((var(--font-h1-desktop))/ (var(--font-size-base))) * 1em);text-transform:none;letter-spacing:0}@media only screen and (max-width:749px){.h1,h1{font-size:calc(((var(--font-h1-mobile))/ (var(--font-size-base))) * 1em)}}.h2,h2{font-size:calc(((var(--font-h2-desktop))/ (var(--font-size-base))) * 1em);text-transform:uppercase;letter-spacing:.1em}@media only screen and (max-width:749px){.h2,h2{font-size:calc(((var(--font-h2-mobile))/ (var(--font-size-base))) * 1em)}}p{color:var(--color-body-text);margin:0 0 19.44444px}@media only screen and (max-width:749px){p{font-size:calc(((var(--font-size-base) - 1)/ (var(--font-size-base))) * 1em)}}p:last-child{margin-bottom:0}@media only screen and (max-width:749px){.small--hide{display:none!important}}.grid{list-style:none;margin:0;padding:0;margin-left:-30px}.grid::after{content:'';display:table;clear:both}@media only screen and (max-width:749px){.grid{margin-left:-22px}}.grid::after{content:'';display:table;clear:both}.grid--no-gutters{margin-left:0}.grid--no-gutters .grid__item{padding-left:0}.grid--table{display:table;table-layout:fixed;width:100%}.grid--table>.grid__item{float:none;display:table-cell;vertical-align:middle}.grid__item{float:left;padding-left:30px;width:100%}@media only screen and (max-width:749px){.grid__item{padding-left:22px}}.grid__item[class*="--push"]{position:relative}@media only screen and (min-width:750px){.medium-up--one-quarter{width:25%}.medium-up--push-one-third{width:33.33%}.medium-up--one-half{width:50%}.medium-up--push-one-third{left:33.33%;position:relative}}.site-header{position:relative;background-color:var(--color-body)}@media only screen and (max-width:749px){.site-header{border-bottom:1px solid var(--color-border)}}@media only screen and (min-width:750px){.site-header{padding:0 55px}.site-header.logo--center{padding-top:30px}}.site-header__logo{margin:15px 0}.logo-align--center .site-header__logo{text-align:center;margin:0 auto}@media only screen and (max-width:749px){.logo-align--center .site-header__logo{text-align:left;margin:15px 0}}@media only screen and (max-width:749px){.site-header__logo{padding-left:22px;text-align:left}.site-header__logo img{margin:0}}.site-header__logo-link{display:inline-block;word-break:break-word}@media only screen and (min-width:750px){.logo-align--center .site-header__logo-link{margin:0 auto}}.site-header__logo-image{display:block}@media only screen and (min-width:750px){.site-header__logo-image{margin:0 auto}}.site-header__logo-image img{width:100%}.site-header__logo-image--centered img{margin:0 auto}.site-header__logo img{display:block}.site-header__icons{position:relative;white-space:nowrap}@media only screen and (max-width:749px){.site-header__icons{width:auto;padding-right:13px}.site-header__icons .btn--link,.site-header__icons .site-header__cart{font-size:calc(((var(--font-size-base))/ (var(--font-size-base))) * 1em)}}.site-header__icons-wrapper{position:relative;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center;
124-webkit-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end}.site-header__account,.site-header__cart,.site-header__search{position:relative}.site-header__search.site-header__icon{display:none}@media only screen and (min-width:1400px){.site-header__search.site-header__icon{display:block}}.site-header__search-toggle{display:block}@media only screen and (min-width:750px){.site-header__account,.site-header__cart{padding:10px 11px}}.site-header__cart-title,.site-header__search-title{position:absolute!important;overflow:hidden;clip:rect(0 0 0 0);height:1px;width:1px;margin:-1px;padding:0;border:0;display:block;vertical-align:middle}.site-header__cart-title{margin-right:3px}.site-header__cart-count{display:flex;align-items:center;justify-content:center;position:absolute;right:.4rem;top:.2rem;font-weight:700;background-color:var(--color-btn-primary);color:var(--color-btn-primary-text);border-radius:50%;min-width:1em;height:1em}.site-header__cart-count span{font-family:HelveticaNeue,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:calc(11em / 16);line-height:1}@media only screen and (max-width:749px){.site-header__cart-count{top:calc(7em / 16);right:0;border-radius:50%;min-width:calc(19em / 16);height:calc(19em / 16)}}@media only screen and (max-width:749px){.site-header__cart-count span{padding:.25em calc(6em / 16);font-size:12px}}.site-header__menu{display:none}@media only screen and (max-width:749px){.site-header__icon{display:inline-block;vertical-align:middle;padding:10px 11px;margin:0}}@media only screen and (min-width:750px){.site-header__icon .icon-search{margin-right:3px}}.announcement-bar{z-index:10;position:relative;text-align:center;border-bottom:1px solid transparent;padding:2px}.announcement-bar__link{display:block}.announcement-bar__message{display:block;padding:11px 22px;font-size:calc(((16)/ (var(--font-size-base))) * 1em);font-weight:var(--font-weight-header)}@media only screen and (min-width:750px){.announcement-bar__message{padding-left:55px;padding-right:55px}}.site-nav{position:relative;padding:0;text-align:center;margin:25px 0}.site-nav a{padding:3px 10px}.site-nav__link{display:block;white-space:nowrap}.site-nav--centered .site-nav__link{padding-top:0}.site-nav__link .icon-chevron-down{width:calc(8em / 16);height:calc(8em / 16);margin-left:.5rem}.site-nav__label{border-bottom:1px solid transparent}.site-nav__link--active .site-nav__label{border-bottom-color:var(--color-text)}.site-nav__link--button{border:none;background-color:transparent;padding:3px 10px}.site-header__mobile-nav{z-index:11;position:relative;background-color:var(--color-body)}@media only screen and (max-width:749px){.site-header__mobile-nav{display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;align-items:center}}.mobile-nav--open .icon-close{display:none}.main-content{opacity:0}.main-content .shopify-section{display:none}.main-content .shopify-section:first-child{display:inherit}.critical-hidden{display:none}</style> 125 126
126<script> 127 window.performance.mark('debut:theme_stylesheet_loaded.start'); 128 129 function onLoadStylesheet() { 130 performance.mark('debut:theme_stylesheet_loaded.end'); 131 performance.measure('debut:theme_stylesheet_loaded', 'debut:theme_stylesheet_loaded.start', 'debut:theme_stylesheet_loaded.end'); 132 133 var url = "//safetracksgpsshop.ca/cdn/shop/t/4/assets/theme.css?v=123821891045210198441693425564"; 134 var link = document.querySelector('link[href="' + url + '"]'); 135 link.loaded = true; 136 link.dispatchEvent(new Event('load')); 137 } 138 </script>
138 139 140 <link rel="stylesheet" href="//safetracksgpsshop.ca/cdn/shop/t/4/assets/theme.css?v=123821891045210198441693425564" type="text/css" media="print" onload="this.media='all';onLoadStylesheet()"> 141 142 <style> 143 @font-face { 144 font-family: Figtree; 145 font-weight: 400; 146 font-style: normal; 147 font-display: swap; 148 src: url("//safetracksgpsshop.ca/cdn/fonts/figtree/figtree_n4.3c0838aba1701047e60be6a99a1b0a40ce9b8419.woff2") format("woff2"), 149 url("//safetracksgpsshop.ca/cdn/fonts/figtree/figtree_n4.c0575d1db21fc3821f17fd6617d3dee552312137.woff") format("woff"); 150} 151 152 @font-face { 153 font-family: Figtree; 154 font-weight: 400; 155 font-style: normal; 156 font-display: swap; 157 src: url("//safetracksgpsshop.ca/cdn/fonts/figtree/figtree_n4.3c0838aba1701047e60be6a99a1b0a40ce9b8419.woff2") format("woff2"), 158 url("//safetracksgpsshop.ca/cdn/fonts/figtree/figtree_n4.c0575d1db21fc3821f17fd6617d3dee552312137.woff") format("woff"); 159} 160 161 @font-face { 162 font-family: Figtree; 163 font-weight: 700; 164 font-style: normal; 165 font-display: swap; 166 src: url("//safetracksgpsshop.ca/cdn/fonts/figtree/figtree_n7.2fd9bfe01586148e644724096c9d75e8c7a90e55.woff2") format("woff2"), 167 url("//safetracksgpsshop.ca/cdn/fonts/figtree/figtree_n7.ea05de92d862f9594794ab281c4c3a67501ef5fc.woff") format("woff"); 168} 169 170 @font-face { 171 font-family: Figtree; 172 font-weight: 700; 173 font-style: normal; 174 font-display: swap; 175 src: url("//safetracksgpsshop.ca/cdn/fonts/figtree/figtree_n7.2fd9bfe01586148e644724096c9d75e8c7a90e55.woff2") format("woff2"), 176 url("//safetracksgpsshop.ca/cdn/fonts/figtree/figtree_n7.ea05de92d862f9594794ab281c4c3a67501ef5fc.woff") format("woff"); 177} 178 179 @font-face { 180 font-family: Figtree; 181 font-weight: 400; 182 font-style: italic; 183 font-display: swap; 184 src: url("//safetracksgpsshop.ca/cdn/fonts/figtree/figtree_i4.89f7a4275c064845c304a4cf8a4a586060656db2.woff2") format("woff2"), 185 url("//safetracksgpsshop.ca/cdn/fonts/figtree/figtree_i4.6f955aaaafc55a22ffc1f32ecf3756859a5ad3e2.woff") format("woff"); 186} 187 188 @font-face { 189 font-family: Figtree; 190 font-weight: 700; 191 font-style: italic; 192 font-display: swap; 193 src: url("//safetracksgpsshop.ca/cdn/fonts/figtree/figtree_i7.06add7096a6f2ab742e09ec7e498115904eda1fe.woff2") format("woff2"), 194 url("//safetracksgpsshop.ca/cdn/fonts/figtree/figtree_i7.ee584b5fcaccdbb5518c0228158941f8df81b101.woff") format("woff"); 195} 196 197 </style> 198 199
199<script> 200 var theme = { 201 breakpoints: { 202 medium: 750, 203 large: 990, 204 widescreen: 1400 205 }, 206 strings: { 207 addToCart: "Add to cart", 208 soldOut: "Sold out", 209 unavailable: "Unavailable", 210 regularPrice: "Regular price", 211 salePrice: "Sale price", 212 sale: "Sale", 213 fromLowestPrice: "from [price]", 214 vendor: "Vendor", 215 showMore: "Show More", 216 showLess: "Show Less", 217 searchFor: "Search for", 218 addressError: "Error looking up that address", 219 addressNoResults: "No results for that address", 220 addressQueryLimit: "You have exceeded the Google API usage limit. Consider upgrading to a \u003ca href=\"https:\/\/developers.google.com\/maps\/premium\/usage-limits\"\u003ePremium Plan\u003c\/a\u003e.", 221 authError: "There was a problem authenticating your Google Maps account.", 222 newWindow: "Opens in a new window.", 223 external: "Opens external website.", 224 newWindowExternal: "Opens external website in a new window.", 225 removeLabel: "Remove [product]", 226 update: "Update", 227 quantity: "Quantity", 228 discountedTotal: "Discounted total", 229 regularTotal: "Regular total", 230 priceColumn: "See Price column for discount details.", 231 quantityMinimumMessage: "Quantity must be 1 or more", 232 cartError: "There was an error while updating your cart. Please try again.", 233 removedItemMessage: "Removed \u003cspan class=\"cart__removed-product-details\"\u003e([quantity]) [link]\u003c\/span\u003e from your cart.", 234 unitPrice: "Unit price", 235 unitPriceSeparator: "per", 236 oneCartCount: "1 item", 237 otherCartCount: "[count] items", 238 quantityLabel: "Quantity: [count]", 239 products: "Products", 240 loading: "Loading", 241 number_of_results: "[result_number] of [results_count]", 242 number_of_results_found: "[results_count] results found", 243 one_result_found: "1 result found" 244 }, 245 moneyFormat: "${{amount}}", 246 moneyFormatWithCurrency: "${{amount}} CAD", 247 settings: { 248 predictiveSearchEnabled: true, 249 predictiveSearchShowPrice: false, 250 predictiveSearchShowVendor: false 251 }, 252 stylesheet: "//safetracksgpsshop.ca/cdn/shop/t/4/assets/theme.css?v=123821891045210198441693425564" 253 } 254 255 document.documentElement.className = document.documentElement.className.replace('no-js', 'js'); 256 </script>
256<script src="//safetracksgpsshop.ca/cdn/shop/t/4/assets/theme.js?v=73407550851675742171693425564" defer="defer"></script>
256 257
257<script src="//safetracksgpsshop.ca/cdn/shop/t/4/assets/lazysizes.js?v=63098554868324070131693425564" async="async"></script>
257 258 259
259<script type="text/javascript"> 260 if (window.MSInputMethodContext && document.documentMode) { 261 var scripts = document.getElementsByTagName('script')[0]; 262 var polyfill = document.createElement("script"); 263 polyfill.defer = true; 264 polyfill.src = "//safetracksgpsshop.ca/cdn/shop/t/4/assets/ie11CustomProperties.min.js?v=146208399201472936201693425564"; 265 266 scripts.parentNode.insertBefore(polyfill, scripts); 267 } 268 </script>
268 269 270
270<script>window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.start');</script>
270<meta id="shopify-digital-wallet" name="shopify-digital-wallet" content="/26810187954/digital_wallets/dialog"> 271<link rel="ucp" href="/.well-known/ucp" version="2026-08-25">
271<script async="async" src="/checkouts/internal/preloads.js?locale=en-US"></script>
271 272<link rel="preconnect" href="https://shop.app" crossorigin="anonymous">
273<script async="async" src="https://shop.app/checkouts/internal/preloads.js?locale=en-US&shop_id=26810187954" crossorigin="anonymous"></script>
vendor: 1 bytes, line 273
273
274<script id="apple-pay-shop-capabilities" type="application/json">{"shopId":26810187954,"countryCode":"CA","currencyCode":"CAD","merchantCapabilities":["supports3DS"],"merchantId":"gid:\/\/shopify\/Shop\/26810187954","merchantName":"SafeTracksGPS","requiredBillingContactFields":["postalAddress","email"],"requiredShippingContactFields":["postalAddress","email"],"shippingType":"shipping","supportedNetworks":["visa","masterCard","amex","discover","interac","jcb"],"total":{"type":"pending","label":"SafeTracksGPS","amount":"1.00"},"shopifyPaymentsEnabled":true,"supportsSubscriptions":true}</script>
vendor: 1 bytes, line 274
274
275<script id="shopify-features" type="application/json">{"accessToken":"53ef6ab57106ad9d432ff5264afe3be2","betas":["rich-media-storefront-analytics"],"domain":"safetracksgpsshop.ca","predictiveSearch":true,"shopId":26810187954,"locale":"en"}</script>
vendor: 1 bytes, line 275
275
276<script>var Shopify = Shopify || {}; 277Shopify.shop = "safetracksgps.myshopify.com"; 278Shopify.locale = "en"; 279Shopify.currency = {"active":"CAD","rate":"1.0"}; 280Shopify.country = "US"; 281Shopify.theme = {"name":"2023 Edited Debut|Bold","id":132753686706,"schema_name":"Debut","schema_version":"17.5.2","theme_store_id":796,"role":"main"}; 282Shopify.theme.handle = "null"; 283Shopify.theme.style = {"id":null,"handle":null}; 284Shopify.cdnHost = "safetracksgpsshop.ca/cdn"; 285Shopify.routes = Shopify.routes || {}; 286Shopify.routes.root = "/"; 287Shopify.shopJsCdnBaseUrl = "https://cdn.shopify.com/shopifycloud/shop-js"; 288Shopify.SignInWithShop = Shopify.SignInWithShop || {}; 289Shopify.SignInWithShop.User = Shopify.SignInWithShop.User || {}; 290Shopify.SignInWithShop.User.recognized = false;</script>
vendor: 1 bytes, line 290
290
291<script type="module">!function(o){(o.Shopify=o.Shopify||{}).modules=!0}(window);</script>
vendor: 1 bytes, line 291
291
292<script>!function(o){function n(){var o=[];function n(){o.push(Array.prototype.slice.apply(arguments))}return n.q=o,n}var t=o.Shopify=o.Shopify||{};t.loadFeatures=n(),t.autoloadFeatures=n()}(window);</script>
vendor: 1 bytes, line 292
292
293<script> 294 window.ShopifyPay = window.ShopifyPay || {}; 295 window.ShopifyPay.apiHost = "shop.app\/pay"; 296 window.ShopifyPay.redirectState = null; 297</script>
vendor: 1 bytes, line 297
297
298<script> 299 window.Shopify = window.Shopify || {}; 300 window.Shopify.SignInWithShop = window.Shopify.SignInWithShop || {}; 301 window.Shopify.SignInWithShop.assetMetrics = { sampleRate: 0.25 }; 302 window.Shopify.SignInWithShop.eligible = true; 303</script>
vendor: 1 bytes, line 303
303
304<script id="shop-js-analytics" type="application/json">{"pageType":"cart"}</script>
vendor: 1 bytes, line 304
304
305<script defer="defer" async type="module" src="https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"></script>
vendor: 1 bytes, line 305
305
306<script type="module"> 307 await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.init-shop-cart-sync.en.esm.js"); 308 309 window.Shopify.SignInWithShop?.initShopCartSync?.({"fedCMEnabled":true,"windoidEnabled":true}); 310 311</script>
vendor: 1 bytes, line 311
311
312<script> 313 window.Shopify = window.Shopify || {}; 314 if (!window.Shopify.featureAssets) window.Shopify.featureAssets = {}; 315 window.Shopify.featureAssets['shop-js'] = {"avatar":["modules/v2/loader.avatar.en.esm.js"],"checkout-modal":["modules/v2/loader.checkout-modal.en.esm.js"],"init-customer-accounts-sign-up":["modules/v2/loader.init-customer-accounts-sign-up.en.esm.js"],"init-customer-accounts":["modules/v2/loader.init-customer-accounts.en.esm.js"],"init-fed-cm":["modules/v2/loader.init-fed-cm.en.esm.js"],"init-shop-cart-sync":["modules/v2/loader.init-shop-cart-sync.en.esm.js"],"init-shop-email-lookup-coordinator":["modules/v2/loader.init-shop-email-lookup-coordinator.en.esm.js"],"init-shop-for-new-customer-accounts":["modules/v2/loader.init-shop-for-new-customer-accounts.en.esm.js"],"init-shop-user-recognition":["modules/v2/loader.init-shop-user-recognition.en.esm.js"],"init-windoid":["modules/v2/loader.init-windoid.en.esm.js"],"lead-capture":["modules/v2/loader.lead-capture.en.esm.js"],"listener":["modules/v2/loader.listener.en.esm.js"],"pay-button":["modules/v2/loader.pay-button.en.esm.js"],"payment-terms":["modules/v2/loader.payment-terms.en.esm.js"],"shop-button":["modules/v2/loader.shop-button.en.esm.js"],"shop-cart-sync":["modules/v2/loader.shop-cart-sync.en.esm.js"],"shop-cash-offers":["modules/v2/loader.shop-cash-offers.en.esm.js"],"shop-follow-button":["modules/v2/loader.shop-follow-button.en.esm.js"],"shop-login-button":["modules/v2/loader.shop-login-button.en.esm.js"],"shop-login":["modules/v2/loader.shop-login.en.esm.js"],"shop-toast-manager":["modules/v2/loader.shop-toast-manager.en.esm.js"],"shop-user-recognition":["modules/v2/loader.shop-user-recognition.en.esm.js"]}; 316</script>
vendor: 1 bytes, line 316
316
317<script>(function() { 318 var isLoaded = false; 319 function asyncLoad() { 320 if (isLoaded) return; 321 isLoaded = true; 322 var urls = ["https:\/\/upsellproductaddons.com\/main.bundle.5d7b3c7054f5716ec06e.js?shop=safetracksgps.myshopify.com","https:\/\/tnc-app.herokuapp.com\/get_script\/508db1b228a111edb36466ad3c87fb4d.js?v=975563\u0026shop=safetracksgps.myshopify.com","https:\/\/cdn.s3.pop-convert.com\/pcjs.production.min.js?unique_id=safetracksgps.myshopify.com\u0026shop=safetracksgps.myshopify.com","https:\/\/script.pop-convert.com\/new-micro\/production.pc.min.js?unique_id=safetracksgps.myshopify.com\u0026shop=safetracksgps.myshopify.com"]; 323 for (var i = 0; i < urls.length; i++) { 324 var s = document.createElement('script'); 325 s.type = 'text/javascript'; 326 s.async = true; 327 s.src = urls[i]; 328 var x = document.getElementsByTagName('script')[0]; 329 x.parentNode.insertBefore(s, x); 330 } 331 }; 332 if(window.attachEvent) { 333 window.attachEvent('onload', asyncLoad); 334 } else { 335 window.addEventListener('load', asyncLoad, false); 336 } 337})();</script>
vendor: 1 bytes, line 337
337
338<script id="__st">var __st={"a":26810187954,"offset":-21600,"reqid":"df0d4841-ad02-4afd-b351-5af70fa4a03a-1791109901","pageurl":"safetracksgpsshop.ca\/cart","u":"993263a622fa","p":"cart"};</script>
vendor: 1 bytes, line 338
338
339<script>window.ShopifyPaypalV4VisibilityTracking = true;</script>
vendor: 1 bytes, line 339
339
340<script id="captcha-bootstrap">!function(){'use strict';const t='contact',e='account',n='new_comment',o=[[t,t],['blogs',n],['comments',n],[t,'customer']],c=[[e,'customer_login'],[e,'guest_login'],[e,'recover_customer_password'],[e,'create_customer']],r=t=>t.map((([t,e])=>`form[action*='/${t}']:not([data-nocaptcha='true']) input[name='form_type'][value='${e}']`)).join(','),a=t=>()=>t?[...document.querySelectorAll(t)].map((t=>t.form)):[];function s(){const t=[...o],e=r(t);return a(e)}const i='password',u='form_key',d=['recaptcha-v3-token','g-recaptcha-response','h-captcha-response',i],f=()=>{try{return window.sessionStorage}catch{return}},m='__shopify_v',_=t=>t.elements[u];function p(t,e,n=!1){try{const o=window.sessionStorage,c=JSON.parse(o.getItem(e)),{data:r}=function(t){const{data:e,action:n}=t;return t[m]||n?{data:e,action:n}:{data:t,action:n}}(c);for(const[e,n]of Object.entries(r))t.elements[e]&&(t.elements[e].value=n);n&&o.removeItem(e)}catch(o){console.error('form repopulation failed',{error:o})}}const l='form_type',E='cptcha';function T(t){t.dataset[E]=!0}const w=window,h=w.document,L='Shopify',v='ce_forms',y='captcha';let A=!1;((t,e)=>{const n=(g='f06e6c50-85a8-45c8-87d0-21a2b65856fe',I='https://cdn.shopify.com/shopifycloud/storefront-forms-hcaptcha/ce_storefront_forms_captcha_hcaptcha.v1.5.3.iife.js',D={infoText:'Protected by hCaptcha',privacyText:'Privacy',termsText:'Terms'},(t,e,n)=>{const o=w[L][v],c=o.bindForm;if(c)return c(t,g,e,D).then(n);var r;o.q.push([[t,g,e,D],n]),r=I,A||(h.body.append(Object.assign(h.createElement('script'),{id:'captcha-provider',async:!0,src:r})),A=!0)});var g,I,D;w[L]=w[L]||{},w[L][v]=w[L][v]||{},w[L][v].q=[],w[L][y]=w[L][y]||{},w[L][y].protect=function(t,e){n(t,void 0,e),T(t)},Object.freeze(w[L][y]),function(t,e,n,w,h,L){const[v,y,A,g]=function(t,e,n){const i=e?o:[],u=t?c:[],d=[...i,...u],f=r(d),m=r(i),_=r(d.filter((([t,e])=>n.includes(e))));return[a(f),a(m),a(_),s()]}(w,h,L),I=t=>{const e=t.target;return e instanceof HTMLFormElement?e:e&&e.form},D=t=>v().includes(t);t.addEventListener('submit',(t=>{const e=I(t);if(!e)return;const n=D(e)&&!e.dataset.hcaptchaBound&&!e.dataset.recaptchaBound,o=_(e),c=g().includes(e)&&(!o||!o.value);(n||c)&&t.preventDefault(),c&&!n&&(function(t){try{if(!f())return;!function(t){const e=f();if(!e)return;const n=_(t);if(!n)return;const o=n.value;o&&e.removeItem(o)}(t);const e=Array.from(Array(32),(()=>Math.random().toString(36)[2])).join('');!function(t,e){_(t)||t.append(Object.assign(document.createElement('input'),{type:'hidden',name:u})),t.elements[u].value=e}(t,e),function(t,e){const n=f();if(!n)return;const o=[...t.querySelectorAll(`input[type='${i}']`)].map((({name:t})=>t)),c=[...d,...o],r={};for(const[a,s]of new FormData(t).entries())c.includes(a)||(r[a]=s);n.setItem(e,JSON.stringify({[m]:1,action:t.action,data:r}))}(t,e)}catch(e){console.error('failed to persist form',e)}}(e),e.submit())}));const S=(t,e)=>{t&&!t.dataset[E]&&(n(t,e.some((e=>e===t))),T(t))};for(const o of['focusin','change'])t.addEventListener(o,(t=>{const e=I(t);D(e)&&S(e,y())}));const B=e.get('form_key'),M=e.get(l),P=B&&M;t.addEventListener('DOMContentLoaded',(()=>{const t=y();if(P)for(const e of t)e.elements[l].value===M&&p(e,B);[...new Set([...A(),...v().filter((t=>'true'===t.dataset.shopifyCaptcha))])].forEach((e=>S(e,t)))}))}(h,new URLSearchParams(w.location.search),n,t,e,['guest_login'])})(!0,!0)}();</script>
vendor: 1 bytes, line 340
340
341<script integrity="sha256-JjoPp5ZfB1sSAs5SQaol1x1GgvveM+BgmRzyDexInEQ=" data-source-attribution="shopify.loadfeatures" defer="defer" src="//safetracksgpsshop.ca/cdn/shopifycloud/storefront/assets/storefront/load_feature-1bd60354.js" crossorigin="anonymous"></script>
vendor: 1 bytes, line 341
341
342<script>(function () {var userAgent = navigator.userAgent;var platform = navigator.platform;var maxTouchPoints = navigator.maxTouchPoints || 0;var isIOS = /iPad|iPhone|iPod/.test(platform) || (platform === 'MacIntel' && maxTouchPoints > 1);var isMacSafari = platform.indexOf('Mac') === 0 && /Safari/.test(userAgent) && !/Chrome|Chromium|CriOS|FxiOS|Edg|OPR|Android/.test(userAgent);var isAppleSafari = isIOS || isMacSafari;if (isAppleSafari) {fetch('/sf_private_access_tokens' + location.search).catch(function () {});}function browserMajorVersion(pattern) {var match = userAgent.match(pattern);return match ? parseInt(match[1], 10) : null;}function shouldLoadAutosizesPolyfill() {if (!window.PerformanceObserver?.supportedEntryTypes?.includes('paint')) {return false;}var chromeVersion = browserMajorVersion(/Chrome\/(\d+)/);if (chromeVersion !== null) {return chromeVersion < 126;}var firefoxVersion = browserMajorVersion(/Firefox\/(\d+)/);if (firefoxVersion !== null) {return firefoxVersion < 150;}var safariVersion = isAppleSafari ? browserMajorVersion(/Version\/(\d+).*Safari\//) : null;if (safariVersion !== null) {return safariVersion < 27;}return true;}if (shouldLoadAutosizesPolyfill()) {var autosizesScript = document.createElement('script');autosizesScript.async = true;autosizesScript.crossOrigin = 'anonymous';autosizesScript.src = "//safetracksgpsshop.ca/cdn/shopifycloud/storefront/assets/storefront/autosizes-84416378.js";(document.head || document.documentElement).appendChild(autosizesScript);}window.ShopifyAnalytics = window.ShopifyAnalytics || {};window.ShopifyAnalytics.performance = window.ShopifyAnalytics.performance || {};(function () {var LONG_FRAME_THRESHOLD = 50;var longAnimationFrames = [];var activeRafId = null;function collectLongFrames() {var previousTime = null;function rafMonitor(now) {if (activeRafId === null) {return;}var delta = now - previousTime;if (delta > LONG_FRAME_THRESHOLD) {longAnimationFrames.push({startTime: previousTime,endTime: now,});}previousTime = now;activeRafId = requestAnimationFrame(rafMonitor);}previousTime = performance.now();activeRafId = requestAnimationFrame(rafMonitor);}if (!window.PerformanceObserver?.supportedEntryTypes?.includes('long-animation-frame')) {collectLongFrames();var timeoutId = setTimeout(function () {cancelAnimationFrame(activeRafId);}, 10000);window.ShopifyAnalytics.performance.getLongAnimationFrames = function (stopCollection) {if (stopCollection === undefined) {stopCollection = false;}if (stopCollection) {clearTimeout(timeoutId);cancelAnimationFrame(activeRafId);}return longAnimationFrames;};}})();})();</script>
342<script crossorigin="anonymous" defer="defer" src="//safetracksgpsshop.ca/cdn/shopifycloud/storefront/assets/shopify_pay/storefront-616277c7.js?v=20250812"></script>
vendor: 1 bytes, line 342
342
343<script id="shopify-origin-trials" async="async" integrity="sha256-qJbe/jEZBHtr5W/BlA2cKAz3vkXu6vJQyLjgvgCC86g=" src="//cdn.shopify.com/shopifycloud/storefront/assets/storefront/origin_trials-318ab40a.js" crossorigin="anonymous" onload="window.__shopifyOriginTrialsDone = true" onerror="window.__shopifyOriginTrialsDone = true"></script>
vendor: 1 bytes, line 343
343
344<script> 345 window.Shopify = window.Shopify || {}; 346 window.Shopify.MCP = window.Shopify.MCP || {}; 347 window.Shopify.MCP.enabled = true; 348 window.Shopify.MCP.shop = "safetracksgps.myshopify.com"; 349 window.Shopify.MCP.mcpEndpoint = "https:\/\/safetracksgpsshop.ca\/api\/mcp"; 350 window.Shopify.MCP.tools = [{"name":"search_shop_policies_and_faqs","description":"Used to get facts about the stores policies, products, or services.\nSome examples of questions you can ask are:\n - What is your return policy?\n - What is your shipping policy?\n - What is your phone number?\n - What are your hours of operation?\"\n","inputSchema":{"$schema":"https:\/\/json-schema.org\/draft\/2020-12\/schema","type":"object","properties":{"query":{"type":"string","description":"A natural language query."},"context":{"type":"string","description":"Additional information about the request such as user demographics, mood, location, or other relevant details that could help in tailoring the response appropriately."}},"required":["query"]}}]; 351</script>
vendor: 1 bytes, line 351
351
352<script>(()=>{var d="shopify:webmcp_adapter_loaded",n=Symbol.for("shopify.webmcp_adapter_loading");function s(c,a,{win:r=window,doc:o=document}={}){function p(){try{return r.localStorage.getItem(d)==="true"}catch{return!1}}function l(){try{r.localStorage.setItem(d,"true")}catch{}}function u(){return typeof(o.modelContext||r.navigator?.modelContext)?.registerTool=="function"}function f(){if(r[n]||!u())return;let t=o.head||o.getElementsByTagName("head")[0];if(!t)return;let e=o.createElement("script");e.type="module",e.crossOrigin="anonymous",a&&(e.integrity=a),e.src=c,e.addEventListener("load",l,{once:!0}),e.addEventListener("error",()=>{r[n]=!1},{once:!0}),t.appendChild(e),r[n]=!0}function _(t){let e=o.getElementById("shopify-origin-trials");if(!e||r.__shopifyOriginTrialsDone){t();return}e.addEventListener("load",t,{once:!0}),e.addEventListener("error",t,{once:!0})}function i(){_(()=>r.setTimeout(f,0))}function m(){o.addEventListener("DOMContentLoaded",i,{once:!0})}p()?i():m()}s("\/\/safetracksgpsshop.ca\/cdn\/shopifycloud\/storefront\/assets\/storefront\/webmcp-c6b62ece.js","sha256-ke4DDuBjdvea3vxLWxHc9E9nq8zihuG4IfYEGbb77ys=");})(); 353</script>
vendor: 1 bytes, line 353
353
354<script data-source-attribution="shopify.dynamic_checkout.dynamic.init">var Shopify=Shopify||{};Shopify.PaymentButton=Shopify.PaymentButton||{isStorefrontPortableWallets:!0,init:function(){window.Shopify.PaymentButton.init=function(){};var t=document.createElement("script");t.src="https://safetracksgpsshop.ca/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js",t.type="module",document.head.appendChild(t)}}; 355</script>
vendor: 1 bytes, line 355
355
356<script data-source-attribution="shopify.dynamic_checkout.buyer_consent"> 357 function portableWalletsHideBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.add("hidden"),t.setAttribute("aria-hidden","true"),n.removeEventListener("click",e))}function portableWalletsShowBuyerConsent(e){var t=document.getElementById("shopify-buyer-consent"),n=document.getElementById("shopify-subscription-policy-button");t&&n&&(t.classList.remove("hidden"),t.removeAttribute("aria-hidden"),n.addEventListener("click",e))}window.Shopify?.PaymentButton&&(window.Shopify.PaymentButton.hideBuyerConsent=portableWalletsHideBuyerConsent,window.Shopify.PaymentButton.showBuyerConsent=portableWalletsShowBuyerConsent); 358</script>
vendor: 1 bytes, line 358
358
359<script> 360 function portableWalletsCleanup(e){e&&e.src&&console.error("Failed to load portable wallets script "+e.src);var t=document.querySelectorAll("shopify-accelerated-checkout .shopify-payment-button__skeleton, shopify-accelerated-checkout-cart .wallet-cart-button__skeleton"),e=document.getElementById("shopify-buyer-consent");for(let e=0;e<t.length;e++)t[e].remove();e&&e.remove()}function portableWalletsNotLoadedAsModule(e){e instanceof ErrorEvent&&"string"==typeof e.message&&e.message.includes("import.meta")&&"string"==typeof e.filename&&e.filename.includes("portable-wallets")&&(window.removeEventListener("error",portableWalletsNotLoadedAsModule),window.Shopify.PaymentButton.failedToLoad=e,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",window.Shopify.PaymentButton.init):window.Shopify.PaymentButton.init())}window.addEventListener("error",portableWalletsNotLoadedAsModule); 361</script>
361 362
363<script type="module" src="https://safetracksgpsshop.ca/cdn/shopifycloud/portable-wallets/latest/portable-wallets.en.js" onError="portableWalletsCleanup(this)" crossorigin="anonymous"></script>
vendor: 1 bytes, line 363
363
364<script nomodule> 365 document.addEventListener("DOMContentLoaded", portableWalletsCleanup); 366</script>
366 367 368<link id="shopify-accelerated-checkout-styles" rel="stylesheet" media="screen" href="https://safetracksgpsshop.ca/cdn/shopifycloud/portable-wallets/latest/accelerated-checkout-backwards-compat.css" crossorigin="anonymous"> 369<style id="shopify-accelerated-checkout-cart"> 370 #shopify-buyer-consent { 371 margin-top: 1em; 372 display: inline-block; 373 width: 100%; 374} 375 376#shopify-buyer-consent.hidden { 377 display: none; 378} 379 380#shopify-subscription-policy-button { 381 background: none; 382 border: none; 383 padding: 0; 384 text-decoration: underline; 385 font-size: inherit; 386 cursor: pointer; 387} 388 389#shopify-subscription-policy-button::before { 390 box-shadow: none; 391} 392 393 </style> 394
395<script id="shopify-cfh-end">window.performance && window.performance.mark && window.performance.mark('shopify.content_for_header.end');</script>
395 396
396<script src="//safetracksgpsshop.ca/cdn/shop/t/4/assets/bsub.js?v=158520562351594542841693425564" type="text/javascript"></script>
396 397<link href="//safetracksgpsshop.ca/cdn/shop/t/4/assets/bsub.scss.css?v=163461136494486031931693425683" rel="stylesheet" type="text/css" media="all" />
398<script> 399 // empty script tag to work around a platform issue where attributes of first script in file are scrubbed 400</script>
400 401
402<script id="bold-subscriptions-script" type="text/javascript"> 403 window.BOLD = window.BOLD || {}; 404 window.BOLD.subscriptions = window.BOLD.subscriptions || {}; 405 window.BOLD.subscriptions.config = window.BOLD.subscriptions.config || {}; 406 window.BOLD.subscriptions.config.legacyAssetsLoaded = true; 407 408 if (!window.BOLD.subscriptions.config.isAppEmbedEnabled) { 409 window.BOLD.subscriptions.classes = window.BOLD.subscriptions.classes || {}; 410 window.BOLD.subscriptions.patches = window.BOLD.subscriptions.patches || {}; 411 window.BOLD.subscriptions.patches.maxCheckoutRetries = window.BOLD.subscriptions.patches.maxCheckoutRetries || 200; 412 window.BOLD.subscriptions.patches.currentCheckoutRetries = window.BOLD.subscriptions.patches.currentCheckoutRetries || 0; 413 window.BOLD.subscriptions.patches.maxCashierPatchAttempts = window.BOLD.subscriptions.patches.maxCashierPatchAttempts || 200; 414 window.BOLD.subscriptions.patches.currentCashierPatchAttempts = window.BOLD.subscriptions.patches.currentCashierPatchAttempts || 0; 415 window.BOLD.subscriptions.config.platform = 'shopify'; 416 window.BOLD.subscriptions.config.shopDomain = 'safetracksgps.myshopify.com'; 417 window.BOLD.subscriptions.config.customDomain = 'safetracksgpsshop.ca'; 418 window.BOLD.subscriptions.config.shopIdentifier = '26810187954'; 419 window.BOLD.subscriptions.config.appUrl = 'https://sub.boldapps.net'; 420 window.BOLD.subscriptions.config.currencyCode = 'CAD'; 421 window.BOLD.subscriptions.config.checkoutType = 'shopify'; 422 window.BOLD.subscriptions.config.currencyFormat = "$\u0026#123;\u0026#123;amount}}"; 423 window.BOLD.subscriptions.config.shopCurrencies = [{"id":1894,"currency":"CAD","currency_format":"$\u0026#123;\u0026#123;amount}}","created_at":"2021-03-17 20:40:07","updated_at":"2021-03-17 20:40:07"}]; 424 window.BOLD.subscriptions.config.shopSettings = {"allow_msp_cancellation":false,"allow_msp_prepaid_renewal":true,"customer_can_pause_subscription":false,"customer_can_change_next_order_date":false,"customer_can_change_order_frequency":true,"customer_can_create_an_additional_order":false,"customer_can_use_passwordless_login":false,"customer_passwordless_login_redirect":false,"customer_can_add_products_to_existing_subscriptions":false,"show_currency_code":true,"stored_payment_method_policy":"required","customer_portal_path":null}; 425 window.BOLD.subscriptions.config.customerLoginPath = null; 426 427 // TODO: Remove the isset with BS2-4659_improve_large_group_selection 428 window.BOLD.subscriptions.config.loadSubscriptionGroupFrom = 'default'; 429 window.BOLD.subscriptions.config.loadSubscriptionGroupFromTypes = {"DEFAULT":"default","BSUB_API":"bsub_api"}; 430 window.BOLD.subscriptions.config.cashierPluginOnlyMode = window.BOLD.subscriptions.config.cashierPluginOnlyMode || false; 431 if (window.BOLD.subscriptions.config.waitForCheckoutLoader === undefined) { 432 window.BOLD.subscriptions.config.waitForCheckoutLoader = true; 433 } 434 435 window.BOLD.subscriptions.config.addToCartFormSelectors = window.BOLD.subscriptions.config.addToCartFormSelectors || []; 436 window.BOLD.subscriptions.config.addToCartButtonSelectors = window.BOLD.subscriptions.config.addToCartButtonSelectors || []; 437 window.BOLD.subscriptions.config.widgetInsertBeforeSelectors = window.BOLD.subscriptions.config.widgetInsertBeforeSelectors || []; 438 window.BOLD.subscriptions.config.quickAddToCartButtonSelectors = window.BOLD.subscriptions.config.quickAddToCartButtonSelectors || []; 439 window.BOLD.subscriptions.config.cartElementSelectors = window.BOLD.subscriptions.config.cartElementSelectors || []; 440 window.BOLD.subscriptions.config.cartTotalElementSelectors = window.BOLD.subscriptions.config.cartTotalElementSelectors || []; 441 window.BOLD.subscriptions.config.lineItemSelectors = window.BOLD.subscriptions.config.lineItemSelectors || []; 442 window.BOLD.subscriptions.config.lineItemNameSelectors = window.BOLD.subscriptions.config.lineItemNameSelectors || []; 443 window.BOLD.subscriptions.config.checkoutButtonSelectors = window.BOLD.subscriptions.config.checkoutButtonSelectors || []; 444 445 window.BOLD.subscriptions.config.featureFlags = window.BOLD.subscriptions.config.featureFlags || ["BE-1625-create-contract-without-delivery-method","BE-1563-direct-checkout-url","BS2-4293-skip-tx-fee-eq-zero","BE-1393-relocate-prepaid-metadata","BE-1614-use-seletedDate-for-offset","BE-1511-use-bold-platform-prepaid","BE-1642-bold-checkout-line-item-price"]; 446 window.BOLD.subscriptions.config.subscriptionProcessingFrequency = '60'; 447 window.BOLD.subscriptions.config.requireMSPInitialLoadingMessage = true; 448 window.BOLD.subscriptions.data = window.BOLD.subscriptions.data || {}; 449 450 // Interval text markup template 451 window.BOLD.subscriptions.config.lineItemPropertyListSelectors = window.BOLD.subscriptions.config.lineItemPropertyListSelectors || []; 452 window.BOLD.subscriptions.config.lineItemPropertyListSelectors.push('dl.definitionList'); 453 window.BOLD.subscriptions.config.lineItemPropertyListTemplate = window.BOLD.subscriptions.config.lineItemPropertyListTemplate || '<dl class="definitionList"></dl>'; 454 window.BOLD.subscriptions.config.lineItemPropertyTemplate = window.BOLD.subscriptions.config.lineItemPropertyTemplate || '<dt class="definitionList-key">\:</dt><dd class="definitionList-value">\</dd>'; 455 456 // Discount text markup template 457 window.BOLD.subscriptions.config.discountItemTemplate = window.BOLD.subscriptions.config.discountItemTemplate || '<div class="bold-subscriptions-discount"><div class="bold-subscriptions-discount__details">\</div><div class="bold-subscriptions-discount__total">\</div></div>'; 458 459 460 // Constants in XMLHttpRequest are not reliable, so we will create our own 461 // reference: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState 462 window.BOLD.subscriptions.config.XMLHttpRequest = { 463 UNSENT:0, // Client has been created. open() not called yet. 464 OPENED: 1, // open() has been called. 465 HEADERS_RECEIVED: 2, // send() has been called, and headers and status are available. 466 LOADING: 3, // Downloading; responseText holds partial data. 467 DONE: 4 // The operation is complete. 468 }; 469 470 window.BOLD.subscriptions.config.assetBaseUrl = 'https://sub.boldapps.net'; 471 if (window.localStorage && window.localStorage.getItem('boldSubscriptionsAssetBaseUrl')) { 472 window.BOLD.subscriptions.config.assetBaseUrl = window.localStorage.getItem('boldSubscriptionsAssetBaseUrl') 473 } 474 475 window.BOLD.subscriptions.data.subscriptionGroups = []; 476 if (localStorage && localStorage.getItem('boldSubscriptionsSubscriptionGroups')) { 477 window.BOLD.subscriptions.data.subscriptionGroups = JSON.parse(localStorage.getItem('boldSubscriptionsSubscriptionGroups')); 478 } else { 479 window.BOLD.subscriptions.data.subscriptionGroups = [{"id":12314,"billing_rules":[{"id":24826,"subscription_group_id":12314,"interval_name":"Monthly ","billing_rule":"FREQ=MONTHLY","custom_billing_rule":""}],"is_subscription_only":false,"allow_prepaid":false,"is_prepaid_only":false,"should_continue_prepaid":true,"continue_prepaid_type":"as_prepaid","prepaid_durations":[{"id":12255,"subscription_group_id":12314,"total_duration":1,"discount_type":"percentage","discount_value":0}],"selection_options":[{"platform_entity_id":"7274582048946"},{"platform_entity_id":"7274445897906"}],"discount_type":"no_discount","percent_discount":0,"fixed_discount":0,"can_add_to_cart":true},{"id":29902,"billing_rules":[{"id":67129,"subscription_group_id":29902,"interval_name":"Monthly ","billing_rule":"FREQ=MONTHLY","custom_billing_rule":""}],"is_subscription_only":false,"allow_prepaid":false,"is_prepaid_only":false,"should_continue_prepaid":true,"continue_prepaid_type":"as_prepaid","prepaid_durations":[{"id":29848,"subscription_group_id":29902,"total_duration":1,"discount_type":"percentage","discount_value":0}],"selection_options":[{"platform_entity_id":"6573461307570"},{"platform_entity_id":"7274445897906"},{"platform_entity_id":"4773868437682"}],"discount_type":"no_discount","percent_discount":0,"fixed_discount":0,"can_add_to_cart":true}]; 480 } 481 482 window.BOLD.subscriptions.isFeatureFlagEnabled = function (featureFlag) { 483 for (var i = 0; i < window.BOLD.subscriptions.config.featureFlags.length; i++) { 484 if (window.BOLD.subscriptions.config.featureFlags[i] === featureFlag){ 485 return true; 486 } 487 } 488 return false;
489 } 490 491 window.BOLD.subscriptions.logger = { 492 tag: "bold_subscriptions", 493 // the bold subscriptions log level 494 // 0 - errors (default) 495 // 1 - warnings + errors 496 // 2 - info + warnings + errors 497 // use window.localStorage.setItem('boldSubscriptionsLogLevel', x) to set the log level 498 levels: { 499 ERROR: 0, 500 WARN: 1, 501 INFO: 2, 502 }, 503 level: parseInt((window.localStorage && window.localStorage.getItem('boldSubscriptionsLogLevel')) || "0", 10), 504 _log: function(callArgs, level) { 505 if (!window.console) { 506 return null; 507 } 508 509 if (window.BOLD.subscriptions.logger.level < level) { 510 return; 511 } 512 513 var params = Array.prototype.slice.call(callArgs); 514 params.unshift(window.BOLD.subscriptions.logger.tag); 515 516 switch (level) { 517 case window.BOLD.subscriptions.logger.levels.INFO: 518 console.info.apply(null, params); 519 return; 520 case window.BOLD.subscriptions.logger.levels.WARN: 521 console.warn.apply(null, params); 522 return; 523 case window.BOLD.subscriptions.logger.levels.ERROR: 524 console.error.apply(null, params); 525 return; 526 default: 527 console.log.apply(null, params); 528 return; 529 } 530 }, 531 info: function() { 532 window.BOLD.subscriptions.logger._log(arguments, window.BOLD.subscriptions.logger.levels.INFO); 533 }, 534 warn: function() { 535 window.BOLD.subscriptions.logger._log(arguments, window.BOLD.subscriptions.logger.levels.WARN); 536 }, 537 error: function() { 538 window.BOLD.subscriptions.logger._log(arguments, window.BOLD.subscriptions.logger.levels.ERROR); 539 } 540 } 541 542 window.BOLD.subscriptions.shouldLoadSubscriptionGroupFromAPI = function() { 543 return window.BOLD.subscriptions.config.loadSubscriptionGroupFrom === window.BOLD.subscriptions.config.loadSubscriptionGroupFromTypes['BSUB_API']; 544 } 545 546 window.BOLD.subscriptions.getSubscriptionGroupFromProductId = function (productId) { 547 var data = window.BOLD.subscriptions.data; 548 var foundGroup = null; 549 for (var i = 0; i < data.subscriptionGroups.length; i += 1) { 550 var subscriptionGroup = data.subscriptionGroups[i]; 551 for (var j = 0; j < subscriptionGroup.selection_options.length; j += 1) { 552 var selectionOption = subscriptionGroup.selection_options[j]; 553 if (selectionOption.platform_entity_id === productId.toString()) { 554 foundGroup = subscriptionGroup; 555 break; 556 } 557 } 558 if (foundGroup) { 559 break; 560 } 561 } 562 return foundGroup; 563 }; 564 565 window.BOLD.subscriptions.getSubscriptionGroupById = function(subGroupId) { 566 var subscriptionGroups = window.BOLD.subscriptions.data.subscriptionGroups; 567 568 for (var i = 0; i < subscriptionGroups.length; i += 1) { 569 var subGroup = subscriptionGroups[i]; 570 if (subGroup.id === subGroupId) { 571 return subGroup; 572 } 573 } 574 575 return null; 576 }; 577 578 window.BOLD.subscriptions.addSubscriptionGroup = function (subscriptionGroup) { 579 if(!window.BOLD.subscriptions.getSubscriptionGroupById(subscriptionGroup.id)) 580 { 581 window.BOLD.subscriptions.data.subscriptionGroups.push(subscriptionGroup); 582 } 583 } 584 585 window.BOLD.subscriptions.getSubscriptionGroupPrepaidDurationById = function(subscriptionGroupId, prepaidDurationId) { 586 var subscriptionGroup = window.BOLD.subscriptions.getSubscriptionGroupById(subscriptionGroupId); 587 588 if ( 589 !subscriptionGroup 590 || !subscriptionGroup.prepaid_durations 591 || !subscriptionGroup.prepaid_durations.length 592 ) { 593 return null; 594 } 595 596 for (var i = 0; i < subscriptionGroup.prepaid_durations.length; i++) { 597 var prepaidDuration = subscriptionGroup.prepaid_durations[i]; 598 if (prepaidDuration.id === prepaidDurationId) { 599 return prepaidDuration; 600 } 601 } 602 603 return null; 604 } 605 606 window.BOLD.subscriptions.getSubscriptionGroupBillingRuleById = function(subGroup, billingRuleId) { 607 for (var i = 0; i < subGroup.billing_rules.length; i += 1) { 608 var billingRule = subGroup.billing_rules[i]; 609 if (billingRule.id === billingRuleId) { 610 return billingRule; 611 } 612 } 613 614 return null; 615 }; 616 617 window.BOLD.subscriptions.toggleDisabledAddToCartButtons = function(d) { 618 var addToCartForms = document.querySelectorAll(window.BOLD.subscriptions.config.addToCartFormSelectors.join(',')); 619 var disable = !!d; 620 for (var i = 0; i < addToCartForms.length; i++) { 621 var addToCartForm = addToCartForms[i]; 622 var productId = window.BOLD.subscriptions.getProductIdFromAddToCartForm(
622addToCartForm); 623 var subscriptionGroup = window.BOLD.subscriptions.getSubscriptionGroupFromProductId(productId); 624 625 if(window.BOLD.subscriptions.isFeatureFlagEnabled('BS2-4659_improve_large_group_selection') ) { 626 if (subscriptionGroup || window.BOLD.subscriptions.shouldLoadSubscriptionGroupFromAPI()) { 627 var addToCartButtons = addToCartForm.querySelectorAll(window.BOLD.subscriptions.config.addToCartButtonSelectors.join(',')); 628 for (var j = 0; j < addToCartButtons.length; j++) { 629 var addToCartButton = addToCartButtons[j]; 630 var toggleAction = disable ? addToCartButton.setAttribute : addToCartButton.removeAttribute; 631 632 addToCartButton.disabled = disable; 633 toggleAction.call(addToCartButton, 'data-disabled-by-subscriptions', disable); 634 } 635 } 636 } else { 637 if (subscriptionGroup) { 638 var addToCartButtons = addToCartForm.querySelectorAll(window.BOLD.subscriptions.config.addToCartButtonSelectors.join(',')); 639 for (var j = 0; j < addToCartButtons.length; j++) { 640 var addToCartButton = addToCartButtons[j]; 641 var toggleAction = disable ? addToCartButton.setAttribute : addToCartButton.removeAttribute; 642 643 addToCartButton.disabled = disable; 644 toggleAction.call(addToCartButton, 'data-disabled-by-subscriptions', disable); 645 } 646 } 647 } 648 649 } 650 }; 651 652 window.BOLD.subscriptions.disableAddToCartButtons = function () { 653 // only disable the add to cart buttons if the app isn't loaded yet 654 if (!window.BOLD.subscriptions.app) { 655 window.BOLD.subscriptions.toggleDisabledAddToCartButtons(true); 656 } else { 657 window.BOLD.subscriptions.enableAddToCartButtons(); 658 } 659 }; 660 661 window.BOLD.subscriptions.enableAddToCartButtons = function () { 662 document.removeEventListener('click', window.BOLD.subscriptions.preventSubscriptionAddToCart); 663 window.BOLD.subscriptions.toggleDisabledAddToCartButtons(false); 664 }; 665 666 window.BOLD.subscriptions.toggleDisabledCheckoutButtons = function(d) { 667 var checkoutButtons = document.querySelectorAll(window.BOLD.subscriptions.config.checkoutButtonSelectors.join(',')); 668 var disable = !!d; 669 for (var i = 0; i < checkoutButtons.length; i++) { 670 var checkoutButton = checkoutButtons[i]; 671 var toggleAction = disable ? checkoutButton.setAttribute : checkoutButton.removeAttribute; 672 673 checkoutButton.disabled = disable; 674 toggleAction.call(checkoutButton, 'data-disabled-by-subscriptions', disable); 675 } 676 } 677 678 window.BOLD.subscriptions.disableCheckoutButtons = function() { 679 // only disable the checkout buttons if the app isn't loaded yet 680 if (!window.BOLD.subscriptions.app) { 681 window.BOLD.subscriptions.toggleDisabledCheckoutButtons(true); 682 } else { 683 window.BOLD.subscriptions.enableCheckoutButtons(); 684 } 685 } 686 687 window.BOLD.subscriptions.enableCheckoutButtons = function() { 688 document.removeEventListener('click', window.BOLD.subscriptions.preventCheckout); 689 window.BOLD.subscriptions.toggleDisabledCheckoutButtons(false); 690 } 691 692 window.BOLD.subscriptions.hasSuccessfulAddToCarts = function() { 693 if (typeof(Storage) !== "undefined") { 694 var successfulAddToCarts = JSON.parse( 695 window.localStorage.getItem('boldSubscriptionsSuccessfulAddToCarts') || '[]' 696 ); 697 if (successfulAddToCarts.length > 0) { 698 return true; 699 } 700 } 701 702 return false;
703 } 704 705 window.BOLD.subscriptions.hasPendingAddToCarts = function() { 706 if (typeof(Storage) !== "undefined") { 707 var pendingAddToCarts = JSON.parse( 708 window.localStorage.getItem('boldSubscriptionsPendingAddToCarts') || '[]' 709 ); 710 if (pendingAddToCarts.length > 0) { 711 return true; 712 } 713 } 714 715 return false; 716 } 717 718 window.BOLD.subscriptions.addJSAsset = function(src, deferred) { 719 var scriptTag = document.getElementById('bold-subscriptions-script'); 720 var jsElement = document.createElement('script'); 721 jsElement.type = 'text/javascript'; 722 jsElement.src = src; 723 if (deferred) { 724 jsElement.defer = true; 725 } 726 scriptTag.parentNode.insertBefore(jsElement, scriptTag); 727 }; 728 729 window.BOLD.subscriptions.addCSSAsset = function(href) { 730 var scriptTag = document.getElementById('bold-subscriptions-script'); 731 var cssElement = document.createElement('link'); 732 cssElement.href = href; 733 cssElement.rel = 'stylesheet'; 734 scriptTag.parentNode.insertBefore(cssElement, scriptTag); 735 }; 736 737 window.BOLD.subscriptions.loadStorefrontAssets = function loadStorefrontAssets() { 738 var assets = window.BOLD.subscriptions.config.assets; 739 window.BOLD.subscriptions.addCSSAsset(window.BOLD.subscriptions.config.assetBaseUrl + '/static/' + assets['storefront.css']); 740 window.BOLD.subscriptions.addJSAsset(window.BOLD.subscriptions.config.assetBaseUrl + '/static/' + assets['storefront.js'], false); 741 }; 742 743 window.BOLD.subscriptions.loadCustomerPortalAssets = function loadCustomerPortalAssets() { 744 var assets = window.BOLD.subscriptions.config.assets; 745 window.BOLD.subscriptions.addCSSAsset(window.BOLD.subscriptions.config.assetBaseUrl + '/static/' + assets['customer_portal.css']); 746 window.BOLD.subscriptions.addJSAsset(window.BOLD.subscriptions.config.assetBaseUrl + '/static/' + assets['customer_portal.js'], true); 747 }; 748 749 window.BOLD.subscriptions.processManifest = function() { 750 if (!window.BOLD.subscriptions.processedManifest) { 751 window.BOLD.subscriptions.processedManifest = true; 752 window.BOLD.subscriptions.config.assets = JSON.parse(this.responseText); 753 754 window.BOLD.subscriptions.loadCustomerPortalAssets(); 755 } 756 }; 757 758 window.BOLD.subscriptions.addInitialLoadingMessage = function() { 759 var customerPortalNode = document.getElementById('customer-portal-root'); 760 if (customerPortalNode && window.BOLD.subscriptions.config.requireMSPInitialLoadingMessage) { 761 customerPortalNode.innerHTML = '<div class="bold-subscriptions-loader-container"><div class="bold-subscriptions-loader"></div></div>'; 762 } 763 } 764 765 window.BOLD.subscriptions.contentLoaded = function() { 766 window.BOLD.subscriptions.data.contentLoadedEventTriggered = true; 767 window.BOLD.subscriptions.addInitialLoadingMessage(); 768 }; 769 770 window.BOLD.subscriptions.preventSubscriptionAddToCart = function(e) { 771 if (e.target.matches(window.BOLD.subscriptions.config.addToCartButtonSelectors.join(',')) && e.target.form) { 772 var productId = window.BOLD.subscriptions.getProductIdFromAddToCartForm(e.target.form); 773 var subscriptionGroup = window.BOLD.subscriptions.getSubscriptionGroupFromProductId(productId); 774 if(window.BOLD.subscriptions.isFeatureFlagEnabled('BS2-4659_improve_large_group_selection')) 775 { 776 if (subscriptionGroup || window.BOLD.subscriptions.shouldLoadSubscriptionGroupFromAPI()) { 777 // This code prevents products in subscription groups from being added to the cart before the 778 // Subscriptions app fully loads. Once the subscriptions app loads it will re-enable the 779 // buttons. Use window.BOLD.subscriptions.enableAddToCartButtons enable them manually. 780 e.preventDefault(); 781 return false;
782 } 783 } else { 784 if (subscriptionGroup) { 785 // This code prevents products in subscription groups from being added to the cart before the 786 // Subscriptions app fully loads. Once the subscriptions app loads it will re-enable the 787 // buttons. Use window.BOLD.subscriptions.enableAddToCartButtons enable them manually. 788 e.preventDefault(); 789 return false; 790 } 791 } 792 793 } 794 }; 795 796 window.BOLD.subscriptions.preventCheckout = function(e) { 797 if ( 798 e.target.matches(window.BOLD.subscriptions.config.checkoutButtonSelectors.join(',')) 799 && (window.BOLD.subscriptions.hasSuccessfulAddToCarts() || window.BOLD.subscriptions.hasPendingAddToCarts()) 800 ) { 801 // This code prevents checkouts on the shop until the Subscriptions app fully loads. 802 // When the Subscriptions app is ready it will enable the checkout buttons itself. 803 // Use window.BOLD.subscriptions.enableCheckoutButtons to enable them manually. 804 e.preventDefault(); 805 return false; 806 } 807 } 808 809 document.addEventListener('DOMContentLoaded', window.BOLD.subscriptions.contentLoaded); 810 811 if (!Element.prototype.matches) { 812 Element.prototype.matches = 813 Element.prototype.matchesSelector || 814 Element.prototype.mozMatchesSelector || 815 Element.prototype.msMatchesSelector || 816 Element.prototype.oMatchesSelector || 817 Element.prototype.webkitMatchesSelector || 818 function(s) { 819 var matches = (this.document || this.ownerDocument).querySelectorAll(s), 820 i = matches.length; 821 while (--i >= 0 && matches.item(i) !== this) {} 822 return i > -1; 823 }; 824 } 825 826 if (!Element.prototype.closest) { 827 Element.prototype.closest = function(s) { 828 var el = this; 829 830 do { 831 if (Element.prototype.matches.call(el, s)) return el; 832 el = el.parentElement || el.parentNode; 833 } while (el !== null && el.nodeType === 1); 834 return null; 835 }; 836 } 837 838 window.BOLD.subscriptions.setVisibilityOfAdditionalCheckoutButtons = function (isVisible) { 839 if (window.BOLD.subscriptions.config.additionalCheckoutSelectors === undefined) { 840 return; 841 } 842 843 var selectors = window.BOLD.subscriptions.config.additionalCheckoutSelectors; 844 845 for (var i = 0; i < selectors.length; i++) { 846 var elements = document.querySelectorAll(selectors[i]); 847 848 for (var j = 0; j < elements.length; j++) { 849 elements[j].style.display = isVisible ? 'block' : 'none'; 850 } 851 } 852 } 853 854 window.BOLD.subscriptions.hideAdditionalCheckoutButtons = function() { 855 window.BOLD.subscriptions.setVisibilityOfAdditionalCheckoutButtons(false); 856 }; 857 858 window.BOLD.subscriptions.showAdditionalCheckoutButtons = function() { 859 window.BOLD.subscriptions.setVisibilityOfAdditionalCheckoutButtons(true); 860 }; 861 862 window.BOLD.subscriptions.enhanceMspUrls = function(data) { 863 var mspUrl = 'https://sub.boldapps.net/shop/7003/customer_portal'; 864 var elements = document.querySelectorAll("a[href='"+mspUrl+"']"); 865 866 if(!elements.length || !data.success) { 867 return; 868 } 869 870 for (var i = 0; i < elements.length; i++) { 871 elements[i].href = elements[i].href + "?jwt="+data.value.jwt+"&customerId="+data.value.customerId; 872 } 873 }; 874 875 window.addEventListener('load', function () { 876 window.BOLD.subscriptions.getJWT(window.BOLD.subscriptions.enhanceMspUrls); 877 }); 878 879 // This will be called immediately 880 // Use this anonymous function to avoid polluting the global namespace 881 (function() { 882 var xhr = new XMLHttpRequest(); 883 xhr.addEventListener('load', window.BOLD.subscriptions.processManifest); 884 xhr.open('GET', window.BOLD.subscriptions.config.assetBaseUrl + '/static/manifest.json?t=' + (new Date()).getTime()); 885 xhr.send(); 886 })() 887 888 window.BOLD.subscriptions.patches.patchCashier = function() { 889 if (window.BOLD && window.BOLD.checkout) { 890 window.BOLD.checkout.disable(); 891 window.BOLD.checkout.listenerFn = window.BOLD.subscriptions.patches.cashierListenerFn; 892 window.BOLD.checkout.enable(); 893 } else if (window.BOLD.subscriptions.patches.currentCashierPatchAttempts < window.BOLD.subscriptions.patches.maxCashierPatchAttempts) { 894 window.BOLD.subscriptions.patches.currentCashierPatchAttempts++; 895 setTimeout(window.BOLD.subscriptions.patches.patchCashier, 100); 896 } 897 }; 898 899 window.BOLD.subscriptions.patches.finishCheckout = function(event, form, cart) { 900 window.BOLD.subscriptions.patches.currentCheckoutRetries++; 901 902 if (!window.BOLD.subscriptions.app 903 && window.BOLD.subscriptions.patches.currentCheckoutRetries < window.BOLD.subscriptions.patches.maxCheckoutRetries 904 ) { 905 setTimeout(function () { window.BOLD.subscriptions.patches.finishCheckout(event, form, cart); }, 100); 906 return; 907 } else if (window.BOLD.subscriptions.app) { 908 window.BOLD.subscriptions.patches.currentCheckoutRetries = 0; 909 window.BOLD.subscriptions.app.addCartParams(form, cart); 910 } 911 912 var noSubscriptions = false;
913 if ((window.BOLD.subscriptions.app && window.BOLD.subscriptions.app.successfulAddToCarts.length === 0) 914 || !window.BOLD.subscriptions.app 915 ) { 916 noSubscriptions = true; 917 event.target.dataset.cashierConfirmedNoPlugins = true; 918 919 if (window.BOLD.subscriptions.setCashierFeatureToken) { 920 window.BOLD.subscriptions.setCashierFeatureToken(false); 921 } 922 } 923 924 if ((noSubscriptions && window.BOLD.subscriptions.config.cashierPluginOnlyMode) 925 || (typeof BOLD.checkout.isFeatureRequired === 'function' && !BOLD.checkout.isFeatureRequired()) 926 ) { 927 // send them to the original checkout when in plugin only mode 928 // and either BSUB is there but there are no subscription products 929 // or BSUB isn't there at all 930 if (form.dataset.old_form_action) { 931 form.action = form.dataset.old_form_action; 932 } 933 event.target.click(); 934 } else { 935 // sends them to Cashier since BSUB got a chance to add it's stuff 936 // and plugin only mode is not enabled 937 form.submit(); 938 } 939 }; 940 } 941</script>
941 942
943<script id="bold-subscriptions-platform-script" type="text/javascript"> 944 window.BOLD.subscriptions.config.shopPlatformId = '26810187954'; 945 window.BOLD.subscriptions.config.appSlug = 'subscriptions'; 946 947 window.BOLD = window.BOLD || {}; 948 window.BOLD.subscriptions = window.BOLD.subscriptions || {}; 949 window.BOLD.subscriptions.data = window.BOLD.subscriptions.data || {}; 950 window.BOLD.subscriptions.data.platform = window.BOLD.subscriptions.data.platform || {}; 951 window.BOLD.subscriptions.data.platform.customer = { id: '' }; 952 window.BOLD.subscriptions.data.platform.product = null; 953 window.BOLD.subscriptions.data.platform.products = []; 954 window.BOLD.subscriptions.data.platform.variantProductMap = {}; 955 956 window.BOLD.subscriptions.addCachedProductData = function(products) { 957 // ignore [], null, and undefined 958 if (!products) { 959 return 960 } 961 962 if (!Array.isArray(products)) { 963 window.BOLD.subscriptions.logger.warn('products must be an array') 964 return 965 } 966 967 window.BOLD.subscriptions.data.platform.products.concat(products) 968 969 for (var i = 0; i < products.length; i++) { 970 var product = products[i]; 971 for (var j = 0; j < product.variants.length; j++) { 972 var variant = product.variants[j]; 973 window.BOLD.subscriptions.data.platform.variantProductMap[variant.id] = product; 974 } 975 } 976 } 977 978 979 980 981 982 window.BOLD.subscriptions.config.addToCartFormSelectors.push( 983 '.product-form.product-form-product-template:not(.bold-subscriptions-no-widget)' 984 ,'.product-form.product-form--payment-button:not(.bold-subscriptions-no-widget)' 985 ); 986 window.BOLD.subscriptions.config.addToCartButtonSelectors.push('[type="submit"]'); 987 window.BOLD.subscriptions.config.quickAddToCartButtonSelectors.push('a[data-event-type="product-click"]'); 988 window.BOLD.subscriptions.config.widgetInsertBeforeSelectors.push('[type="submit"]'); 989 window.BOLD.subscriptions.config.cartElementSelectors.push('form[action="/cart"]'); 990 window.BOLD.subscriptions.config.cartTotalElementSelectors.push('[data-cart-subtotal]', '.text-right .ajaxcart__subtotal'); 991 window.BOLD.subscriptions.config.checkoutButtonSelectors.push( 992 '[name="checkout"]', 993 '[href*="checkout"]:not([href*="tools/checkout"])', 994 '[onclick*="checkout"]:not([onclick*="tools/checkout"])', 995 ); 996 997 // Discount text markup template 998 // NOTE: @ on double curly, so blade doesn't interpret, and `raw` liquid tags so liquid doesn't interpret. 999 1000 window.BOLD.subscriptions.config.discountItemTemplate = '<div class="bold-subscriptions-discount"><div class="bold-subscriptions-discount__details">{{details}}</div><div class="bold-subscriptions-discount__total">{{total}}</div></div>'; 1001 1002 1003 window.BOLD.subscriptions.getProductIdFromAddToCartForm = function(addToCartForm) { 1004 var idInput = addToCartForm.querySelector('[name="id"]'); 1005 if (idInput === null) { 1006 window.BOLD.subscriptions.logger.error('could not get variant id input from add to cart form â make sure your form has an input with [name="id"]') 1007 return null; 1008 } 1009 1010 var variantId = parseInt(idInput.value, 10); 1011 if (isNaN(variantId)) { 1012 window.BOLD.subscriptions.logger.error('could not parse variant id from [name="id"] input') 1013 return null; 1014 } 1015 1016 var product = window.BOLD.subscriptions.data.platform.variantProductMap[variantId]; 1017 1018 if (product === undefined) { 1019 window.BOLD.subscriptions.logger.error('could not map variant id to cached product data â call window.BOLD.subscriptions.addCachedProductData(products) to add the product to the cache') 1020 return null; 1021 } 1022 1023 return product.id; 1024 }; 1025 1026 window.BOLD.subscriptions.getAddToCartForms = function() { 1027 var forms = []; 1028 var idInputs = document.querySelectorAll('[name="id"]'); 1029 1030 for (var i = 0; i < idInputs.length; i++) { 1031 var idInput = idInputs[i]; 1032 var form = idInput.closest('form:not(.bold-subscriptions-no-widget)'); 1033 if (form) { 1034 forms.push(form); 1035 } 1036 } 1037 1038 return forms; 1039 }; 1040 1041 window.BOLD.subscriptions.getJWT = function (callback) { 1042 if(window.BOLD.subscriptions.data.platform.customer.id !== '') { 1043 var shopPlatformId = '26810187954'; 1044 var appSlug = 'subscriptions'; 1045 var customerPlatformId = window.BOLD.subscriptions.data.platform.customer.id; 1046 var proxyPath = '/apps/app-proxy/customers/v1/shops/'+shopPlatformId+'/apps/'+appSlug+'/customers/pid/'+customerPlatformId+'/jwt'; 1047 1048 var xmlhttp = new XMLHttpRequest(); 1049 1050 xmlhttp.onreadystatechange = function() { 1051 if (xmlhttp.readyState === window.BOLD.subscriptions.config.XMLHttpRequest.DONE) { 1052 if (xmlhttp.status === 200) { 1053 var data = JSON.parse(xmlhttp.responseText); 1054 callback({ 1055 success: true, 1056 value: { 1057 jwt: data.bold_platform_jwt, 1058 customerId: window.BOLD.subscriptions.data.platform.customer.id, 1059 }, 1060 }); 1061 } else if (xmlhttp.status === 404) { 1062 callback({ 1063 success: false, 1064 error: 'not_logged_in', 1065 }); 1066 } else { 1067 callback({ 1068 success: false, 1069 error: 'unknown', 1070 }); 1071 } 1072 } 1073 }; 1074 1075 xmlhttp.open("GET", proxyPath, true); 1076 xmlhttp.setRequestHeader('Accept', 'application/liquid'); 1077 xmlhttp.send(); 1078 } else { 1079 callback({ 1080 success: false, 1081 error: 'not_logged_in', 1082 }); 1083 } 1084 }; 1085 1086 window.BOLD.subscriptions.setCashierFeatureToken = function(value) { 1087 if (window.BOLD.checkout_features_defaults && window.BOLD.subscriptions.config.cashierApplicationUUID) {
1088 window.BOLD.checkout_features_defaults.forEach(function(item) { 1089 if (item.id === window.BOLD.subscriptions.config.cashierApplicationUUID) { 1090 item.require = value; 1091 } 1092 }); 1093 } 1094 }; 1095 1096 // Cashier patches 1097 window.BOLD.subscriptions.patches.cashierListenerFn = function(event) { 1098 if (window.BOLD.checkout.isCheckoutButton(event.target) && window.BOLD.checkout.isEnabled()) { 1099 window.BOLD.subscriptions.patches.pushToCashier(event); 1100 } else if(window.BOLD.checkout.isCheckoutButton(event.target) && typeof window.cashier_installed_on_site === 'undefined') { 1101 var request = new XMLHttpRequest(); 1102 request.open('HEAD', '/apps/checkout/isInstalled', false); 1103 request.send(null); 1104 1105 if(request.status >= 200 && request.status < 400) { 1106 window.BOLD.subscriptions.patches.pushToCashier(event); 1107 } else { 1108 window.cashier_installed_on_site = false; 1109 } 1110 } 1111 }; 1112 1113 window.BOLD.subscriptions.localTime = function() { 1114 var localDate = new Date(); 1115 return localDate.getTime(); 1116 }; 1117 1118 1119 window.BOLD.subscriptions.patches.pushToCashier = function(event) { 1120 event.preventDefault(); 1121 var form = window.BOLD.checkout.getForm(event.target); 1122 var formData = new FormData(form); 1123 var request = new XMLHttpRequest(); 1124 request.open('POST', '/cart/update.js?tmp=' + Date.now(), true); 1125 request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 1126 1127 request.onload = function() { 1128 if (request.status >= 200 && request.status < 400) { 1129 // Success! 1130 var cart = JSON.parse(request.responseText); 1131 1132 // If items are empty redirect back to the cart 1133 if (cart.items.length === 0) { 1134 return window.location.href = '/cart'; 1135 } 1136 1137 cart.items.forEach(function(element) { 1138 delete element.product_description; 1139 }); 1140 1141 if (document.getElementById('CartSpecialInstructions')) { 1142 // If the cart note exists, grab its value 1143 cart.note = document.getElementById('CartSpecialInstructions').value; 1144 } 1145 1146 var cartObj = JSON.stringify(cart); 1147 1148 var form = window.BOLD.checkout.getForm(event.target); 1149 form.dataset.old_form_action = form.action; 1150 form.action = '/apps/checkout/begin-checkout' + googleAnalyticsGetParamString({}); 1151 var cartCookie = window.BOLD.checkout.getCookie('cart'); 1152 var element = document.createElement('INPUT'); 1153 element.type = 'HIDDEN'; 1154 element.name = 'cart_id'; 1155 element.value = cartCookie; 1156 form.appendChild(element); 1157 1158 var dateElement = document.createElement('INPUT'); 1159 dateElement.type = 'HIDDEN'; 1160 dateElement.name = 'checkout_local_time'; 1161 dateElement.value = window.BOLD.subscriptions.localTime(); 1162 form.appendChild(dateElement); 1163 1164 var cartElement = document.createElement('INPUT'); 1165 cartElement.type = 'HIDDEN'; 1166 cartElement.name = 'cart'; 1167 cartElement.value = cartObj; 1168 form.appendChild(cartElement); 1169 form.method = 'POST'; 1170 1171 if(window.BOLD && window.BOLD.checkout && typeof window.BOLD.checkout.languageIsoCode === 'string') { 1172 var langInput = document.createElement('INPUT'); 1173 langInput.type = 'HIDDEN'; 1174 langInput.name = 'language_iso'; 1175 langInput.value = window.BOLD.checkout.languageIsoCode; 1176 form.appendChild(langInput); 1177 } 1178 1179 if (window.BOLD && window.BOLD.common && typeof window.BOLD.common.eventEmitter === 'object' && typeof window.BOLDCURRENCY !== 'undefined') { 1180 window.BOLD.common.eventEmitter.emit('BOLD_CASHIER_checkout', {target: form}); 1181 } 1182 1183 window.BOLD.subscriptions.patches.finishCheckout(event, form, cart); 1184 } 1185 }; 1186 1187 request.send(formData); 1188 }; 1189 1190 </script>
1190 1191
1192<script src='https://cdn.assortion.com/app.js?shop=safetracksgps.myshopify.com' defer></script>
1192 1193 1194
1194<script> 1195 1196 window.upsell = window.upsell || {}; 1197 1198 1199 1200 1201 window.upsell.cart = { products:{}}; 1202 1203 1204 1205 </script>
1205 1206 1207<!-- BEGIN app block: shopify://apps/assortion/blocks/app-embed/5588d7f9-a5bc-4f4a-9c54-39b7e081dd23 --><link rel='stylesheet' href='https://cdn.shopify.com/extensions/01a0f1f1-cb84-7b5e-97d4-e2b79b562973/assortion-114/assets/base.css' media='print' onload="this.media='all'"> 1208<noscript><link rel='stylesheet' href='https://cdn.shopify.com/extensions/01a0f1f1-cb84-7b5e-97d4-e2b79b562973/assortion-114/assets/base.css'></noscript>
1209<script src='https://cdn.shopify.com/extensions/01a0f1f1-cb84-7b5e-97d4-e2b79b562973/assortion-114/assets/app.js' type='module'></script>
vendor: 1 bytes, line 1209
1209
1210<script> 1211 var d = window.__ASSORTION_DATA__ = { 1212 shop: { 1213 domain:"safetracksgps.myshopify.com" 1214 }, 1215 customer: { 1216 isB2B: false 1217 1218 }, 1219 marketId: '2245623986', 1220 currency: "CAD", 1221 moneyFormat: "${{amount}}", 1222 designMode: false 1223 1224 , 1225 cart: { 1226 items: [] 1227 } 1228 1229 }; 1230 d.storefrontToken = "0289dbe0ea0c37fe32da39e771a39661"; 1231 1232 d.offersData = [{"id":"d6b7fda0-e0cc-4bba-976f-38ca5ffb4935","type":"addon","data":{"max":2,"min":1,"name":"Watch Upsell","offer":{"type":"product","limit":1,"value":[{"id":"7926595223730"},{"id":"7925231911090"},{"id":"6573461307570"},{"id":"8545829879986"}]},"texts":{"en":{"title":"Select a Service Subscription"}},"layout":"vertical","trigger":{"type":"product","value":[{"id":"4773868437682"}],"exclude":null},"discount":{"type":"percentage","items":[],"value":null,"enabled":false,"limitOneUnit":false,"mustHaveMainProduct":true},"priority":0,"quantity":{"enabled":false,"selector":false},"atcMethod":"default","removeWithParent":false}},{"id":"b50d43ad-0e3c-4427-896d-87dc8a9080a8","type":"addon","data":{"max":2,"min":1,"name":"PMR4 Upsell","limit":{"value":1,"enabled":false},"offer":{"type":"product","limit":1,"value":[{"id":"6573461307570"},{"id":"7274582048946"},{"id":"4773881774258"}],"exclude":null},"texts":{"en":{"title":"Select a Service Subscription"}},"layout":"vertical","trigger":{"type":"product","value":[{"id":"7274445897906"}],"exclude":null},"discount":{"type":"percentage","items":[],"value":"","enabled":false,"mustHaveMainProduct":true},"atcMethod":"default"}}]; 1233 1234 1235 d.settingsData = {"recommendations":{"showRating":true,"automatic":{"enabled":true},"breakpoints":{"mobile":{"slidesPerView":2,"slidesToScroll":2,"spaceBetween":20},"tablet":{"slidesPerView":3,"slidesToScroll":3,"spaceBetween":15},"desktop":{"slidesPerView":5,"slidesToScroll":3,"spaceBetween":10}},"carousel":{"desktop":5,"mobile":2},"image":{"aspectRatio":"auto"},"quickViewSettings":{"enabled":false,"preventBodyScrolling":true}},"bundles":{"showRating":true,"image":{"aspectRatio":"auto"},"addToCart":{"style":"primary-native"},"productLink":"page","useVariantImage":false},"addons":{"showRating":true,"clickBehavior":"open-quick-view","preselectVariant":true,"useComparePrice":true,"imageAspectRatio":"auto","carousel":{"desktop":{"slidesPerView":3,"spaceBetween":10,"slidesToScroll":3},"mobile":{"slidesPerView":2,"spaceBetween":8,"slidesToScroll":2}},"atcStyle":"primary-native","texts":{"en":{"alertMandatory":"Please Choose Your Subscription"}},"showTotal":true,"allowMultiple":true},"volume":{"priceType":"total","priceTypeActive":"total","atcStyle":"primary-native","splitOptions":true},"postPurchase":{"paymentCheck":{"enabled":true,"wait":10}},"popupCrossSell":{"showRating":true,"showSavings":true,"useComparePrice":true,"atc":{"style":"primary-native"},"style":{"addButton":"primary-native","continueButton":"primary-native","iytBgColor":"#fffbeb","iytColor":"#f59e0b","discountColor":"#ffffff","discountBgColor":"#201E50","timerColor":"#075985","timerBgColor":"#e0f2fe"},"preselectVariant":true,"clickBehavior":"open-quick-view"},"popupUpsell":{"showRating":true,"showSavings":true,"atc":{"style":"primary-native"},"style":{"discountColor":"#ffffff","discountBgColor":"#201E50"}},"checkoutUpsell":{},"bundleBuilder":{},"analytics":{"attribution":{"enabled":true}},"flags":{"disableAutoDarkDetection":false,"addonDelayBeforeMainItem":0,"openCartOnBuyNow":false,"discountFunction":true},"quickView":{"showRating":true,"preventBodyScrolling":true},"other":{"discountName":"Bundle","combinesWith":{"productDiscounts":true,"orderDiscounts":true,"shippingDiscounts":true},"orderTagUpsell":{"enabled":false,"value":"Assortion"},"product":{"atcButton":".product-form__cart-submit"},"hideDynamicCheckoutInCart":true},"cart":{"enabled":false,"general":{"openOnAddToCart":true,"clearAllButtonEnabled":false,"disableCartPage":false,"backgroundColor":"#ffffff","textColor":"#000000","buttonBgColor":"#000000","buttonColor":"#ffffff","buttonRadius":"theme","quantityStyle":"plain","quantityRadius":"md","footerBgColor":"inherit","
1235itemSavingColor":"#16a34a","totalSavingColor":"#16a34a","secondaryCta":"none","checkoutDiscountCode":"","preventBodyScrolling":false,"showItemSavings":false,"showTotalSavings":false,"variantSwitcherEnabled":false,"headerPadding":12,"width":480,"animationDuration":0.25},"announcement":{"minute":"00","seconds":"00","padding":12},"volume":{"radius":4,"padding":4,"borderColor":"#D5F1E2","backgroundColor":"#D5F1E2","enabled":true,"discountCodeColor":"#e37ab1"},"subscription":{"enabled":true},"installments":{"quantity":4,"provider":"sezzle","customProvider":null},"deliveryTime":{"enabled":false,"method":"fixed","fixedValue":2,"unit":"days"},"addons":{"enabled":false,"offerAccepted":true,"bgColor":"#f0fdf4","layout":"detailed"},"discount":{"enabled":true,"buttonVariant":"secondary","showCodes":true,"codeBackgroundColor":"#e5e7eb","codeColor":"#4B5563","collapsedByDefault":false},"note":{"enabled":true,"limit":50,"disableLimit":false,"openDefault":false},"advanced":{"css":"","js":"","theme":""},"empty":{"recommendation":{"title":"You may also like","componentType":"vertical","source":"manual","enabled":true,"products":{"type":"product","value":[]},"trigger":{"type":"product","value":[]}}},"recommendation":{"showRating":true,"limit":4,"disable":false,"componentType":"vertical","viewConfig":"link","variant":"secondary","enabled":true,"carousel":{"desktop":3,"mobile":3},"source":{"ai":true,"addon":false,"pcs":false,"rec":true}},"progressBar":{"enabled":false,"freeShippingForSubscriptions":false,"hideSingleTierIcon":true,"tiers":[{"type":"free-shipping","labelPromote":"\u003cp\u003eSpend \u003cspan data-type=\"mention\" data-id=\"threshold_remaining\"\u003e{{threshold_remaining}}\u003c\/span\u003e to get free shipping!\u003c\/p\u003e","labelSuccess":"\u003cp\u003eFree shipping unlocked\u003c\/p\u003e","label":"\u003cp\u003eFree shipping\u003c\/p\u003e"}]},"trustIcons":{"content":"https:\/\/cdn.assortion.com\/payment-icons.png"},"paymentIcons":{"methods":[{"id":"visa","label":"Visa"},{"id":"master","label":"Mastercard"},{"id":"apple_pay","label":"Apple Pay"},{"id":"google_pay","label":"Google Pay"}],"iconSize":28},"terms":{"enabled":false,"selected":false},"freeGift":{"enabled":true,"format":"vertical","hideProductLinks":false},"expressCheckout":{"enabled":false,"mode":"accelerated-checkout","buttonsPerRow":"auto"}},"store":{"currency":"CAD","moneyFormat":"${{amount}}"},"moneyFormat":"${{amount}}"}; 1236 1237</script>
1237 1238<!-- END app block --><!-- BEGIN app block: shopify://apps/inbox/blocks/chat/841fc607-4181-4ad1-842d-e24d7f8bad6b --><link rel='modulepreload' href='https://cdn.shopify.com/storefront/web-components/chat.js' crossorigin fetchpriority='low'> 1239
1240<script id='shopify-chat-app-embed-data' type='application/json'> 1241 { 1242 "settings": { 1243 "invertActivatorColors": true, 1244 "greetingMessage": "", 1245 "showFeaturedProducts": true, 1246 "featuredProducts": [], 1247 "horizontalPosition": "bottom_right", 1248 "icon": "chat_bubble", 1249 "buttonLabel": "Chat" 1250 } 1251 } 1252</script>
1252 1253 1254<style data-shopify> 1255 1256 1257 /* Shadow DOM content does not prevent theme-wide :empty rules from matching the host. */ 1258 shopify-chat:defined:empty { 1259 display: grid; 1260 } 1261 1262 :root { 1263 --shopify-chat-bg-color: #FFFFFF; 1264 --shopify-chat-text-color: #000000; 1265 --shopify-chat-accent-bg-color: #000000; 1266 --shopify-chat-accent-text-color: #FFFFFF; 1267 --shopify-chat-activator-offset: 20px; 1268 1269 1270 1271 --shopify-chat-activator-font-size: 16px; 1272 --shopify-chat-border-radius: 16px; 1273 } 1274 1275 1276</style> 1277
1278<script src='https://cdn.shopify.com/storefront/web-components/chat.js' type='module' crossorigin fetchpriority='low' async></script>
1278 1279 1280 1281<!-- END app block --><!-- BEGIN app block: shopify://apps/bold-subscriptions/blocks/bsub-embed/9ceb49f0-5fe5-4b5e-943d-f8af8985167d -->
1282<script id="bold-subscriptions-app-embed-script" type="text/javascript" defer> 1283 1284 1285 if (window.location.href.includes('pages/manage-subscriptions')) { 1286 const queryParams = new URLSearchParams(window.location.search); 1287 if(queryParams.has('deep_link') && queryParams.get('deep_link') === 'upsell' && 1288 queryParams.has('type') && queryParams.get('type') === 'upcoming-order-email' 1289 ) { 1290 window.location.href=`https://safetracksgpsshop.ca/customer_authentication/redirect?locale=en®ion_country=US?${queryParams.toString()}&from_msp=true`; 1291 } 1292 } else if (window.location.href.includes('https://safetracksgpsshop.ca/customer_authentication/redirect?locale=en®ion_country=US')) { 1293 document.addEventListener('DOMContentLoaded', function() { 1294 const queryParams = new URLSearchParams(window.location.search); 1295 if(queryParams.has('from_msp')) { 1296 queryParams.delete('from_msp'); 1297 1298 let form = document.querySelector("#customer_login"); 1299 1300 if(form) { 1301 let input = document.createElement('input'); 1302 input.type = 'hidden'; 1303 input.name = 'return_to'; 1304 input.value = `https://safetracksgpsshop.ca/pages/manage-subscriptions?${queryParams.toString()}`; 1305 1306 form.appendChild(input); 1307 } 1308 } 1309 }); 1310 } 1311 1312 1313 1314 window.BOLD = window.BOLD || {}; 1315 window.BOLD.subscriptions = window.BOLD.subscriptions || {}; 1316 window.BOLD.subscriptions.config = window.BOLD.subscriptions.config || {}; 1317 window.BOLD.subscriptions.config.isAppEmbedEnabled = true; 1318 window.BOLD.subscriptions.classes = window.BOLD.subscriptions.classes || {}; 1319 window.BOLD.subscriptions.patches = window.BOLD.subscriptions.patches || {}; 1320 window.BOLD.subscriptions.patches.maxCheckoutRetries = window.BOLD.subscriptions.patches.maxCheckoutRetries || 200; 1321 window.BOLD.subscriptions.patches.currentCheckoutRetries = window.BOLD.subscriptions.patches.currentCheckoutRetries || 0; 1322 window.BOLD.subscriptions.patches.maxCashierPatchAttempts = window.BOLD.subscriptions.patches.maxCashierPatchAttempts || 200; 1323 window.BOLD.subscriptions.patches.currentCashierPatchAttempts = window.BOLD.subscriptions.patches.currentCashierPatchAttempts || 0; 1324 window.BOLD.subscriptions.config.platform = 'shopify'; 1325 window.BOLD.subscriptions.config.shopDomain = 'safetracksgps.myshopify.com'; 1326 window.BOLD.subscriptions.config.customDomain = 'safetracksgpsshop.ca'; 1327 window.BOLD.subscriptions.config.shopIdentifier = '26810187954'; 1328 window.BOLD.subscriptions.config.cashierUrl = 'https://cashier.boldcommerce.com'; 1329 window.BOLD.subscriptions.config.boldAPIBase = 'https://app-api.boldapps.net/'; 1330 window.BOLD.subscriptions.config.cashierApplicationUUID = '2e6a2bbc-b12b-4255-abdf-a02af85c0d4e'; 1331 window.BOLD.subscriptions.config.appUrl = 'https://sub.boldapps.net'; 1332 window.BOLD.subscriptions.config.currencyCode = 'CAD'; 1333 window.BOLD.subscriptions.config.checkoutType = 'shopify'; 1334 window.BOLD.subscriptions.config.currencyFormat = "$\u0026#123;\u0026#123;amount}}"; 1335 window.BOLD.subscriptions.config.shopCurrencies = [{"id":1894,"currency":"CAD","currency_format":"$\u0026#123;\u0026#123;amount}}","created_at":"2021-03-17 20:40:07","updated_at":"2021-03-17 20:40:07"}]; 1336 window.BOLD.subscriptions.config.shopSettings = {"allow_msp_cancellation":false,"allow_msp_prepaid_renewal":true,"customer_can_pause_subscription":false,"customer_can_change_next_order_date":false,"customer_can_change_order_frequency":false,"customer_can_create_an_additional_order":false,"customer_can_use_passwordless_login":false,"customer_passwordless_login_redirect":false,"customer_can_add_products_to_existing_subscriptions":false,"customer_can_reactivate_subscription":true,"customer_can_reactivate_subscription_with_deleted_products":false,"show_currency_code":true,"stored_payment_method_policy":"required","customer_portal_path":"pages\/manage-subscriptions","display_only_subscription_products":false}; 1337 window.BOLD.subscriptions.config.customerLoginPath = null; 1338 window.BOLD.subscriptions.config.isPrepaidEnabled = window.BOLD.subscriptions.config.isPrepaidEnabled || true; 1339 window.BOLD.subscriptions.config.loadSubscriptionGroupFrom = 'default'; 1340 window.BOLD.subscriptions.config.loadSubscriptionGroupFromTypes = "default"; 1341 window.BOLD.subscriptions.config.cashierPluginOnlyMode = window.BOLD.subscriptions.config.cashierPluginOnlyMode || false; 1342 if (window.BOLD.subscriptions.config.waitForCheckoutLoader === undefined) { 1343 window.BOLD.subscriptions.config.waitForCheckoutLoader = true; 1344 } 1345 1346 window.BOLD.subscriptions.config.addToCartFormSelectors = window.BOLD.subscriptions.config.addToCartFormSelectors || []; 1347 window.BOLD.subscriptions.config.addToCartButtonSelectors = window.BOLD.subscriptions.config.addToCartButtonSelectors || []; 1348 window.BOLD.subscriptions.config.widgetInsertBeforeSelectors = window.BOLD.subscriptions.config.widgetInsertBeforeSelectors || []; 1349 window.BOLD.subscriptions.config.quickAddToCartButtonSelectors = window.BOLD.subscriptions.config.quickAddToCartButtonSelectors || []; 1350 window.BOLD.subscriptions.config.cartElementSelectors = window.BOLD.subscriptions.config.cartElementSelectors || []; 1351 window.BOLD.subscriptions.config.cartTotalElementSelectors = window.BOLD.subscriptions.config.cartTotalElementSelectors || []; 1352 window.BOLD.subscriptions.config.lineItemSelectors = window.BOLD.subscriptions.config.lineItemSelectors || []; 1353 window.BOLD.subscriptions.config.lineItemNameSelectors = window.BOLD.subscriptions.config.lineItemNameSelectors || []; 1354 window.BOLD.subscriptions.config.checkoutButtonSelectors = window.BOLD.subscriptions.config.checkoutButtonSelectors || []; 1355 1356 window.BOLD.subscriptions.config.featureFlags = window.BOLD.subscriptions.config.featureFlagOverrides || ["BE-2298-Support-Variant-Selections-In-Sub-Groups","BE-6925-remove-bold-error-code-from-error-message","BE-8664-default-address-source-bold","BE-9502-add-logs-to-investigate-infinite-loop","BE-6695-improve-subs-onboarding","BE-10096-list-deleted-variants","BE-10183-customer-portal-paginates-products","BE-10178-suppress-dup-inventory-failure-emails","BE-9073-reactivate-subscription-setting"]; 1357 window.BOLD.subscriptions.config.subscriptionProcessingFrequency = '60'; 1358 window.BOLD.subscriptions.config.requireMSPInitialLoadingMessage = true; 1359 window.BOLD.subscriptions.data = window.BOLD.subscriptions.data || {}; 1360 1361 // Interval text markup template 1362 window.BOLD.subscriptions.config.lineItemPropertyListSelectors = window.BOLD.subscriptions.config.lineItemPropertyListSelectors || []; 1363 window.BOLD.subscriptions.config.lineItemPropertyListSelectors.push('dl.definitionList'); 1364 window.BOLD.subscriptions.config.lineItemPropertyListTemplate = window.BOLD.subscriptions.config.lineItemPropertyListTemplate || '<dl class="definitionList"></dl>'; 1365 window.BOLD.subscriptions.config.lineItemPropertyTemplate = window.BOLD.subscriptions.config.lineItemPropertyTemplate || '<dt class="definitionList-key">{{key}}:</dt><dd class="definitionList-value">{{value}}</dd>'; 1366 1367 // Discount text markup template 1368 window.BOLD.subscriptions.config.discountItemTemplate = window.BOLD.subscriptions.config.discountItemTemplate || '<div class="bold-subscriptions-discount"><div class="bold-subscriptions-discount__details">{{details}}</div><div class="bold-subscriptions-discount__total">{{total}}</div></div>'; 1369 1370 1371 // Constants in XMLHttpRequest are not reliable, so we will create our own 1372 // reference: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState 1373 window.BOLD.subscriptions.config.XMLHttpRequest = { 1374 UNSENT:0, // Client has been created. open() not called yet. 1375 OPENED: 1, // open() has been called. 1376 HEADERS_RECEIVED: 2, // send() has been called, and headers and status are available. 1377 LOADING: 3, // Downloading; responseText holds partial data. 1378 DONE: 4 // The operation is complete. 1379 }; 1380 1381 window.BOLD.subscriptions.config.assetBaseUrl = 'https://sub.boldapps.net'; 1382 if (window.localStorage && window.localStorage.getItem('boldSubscriptionsAssetBaseUrl')) { 1383 window.BOLD.subscriptions.config.assetBaseUrl = window.localStorage.getItem('boldSubscriptionsAssetBaseUrl') 1384 } 1385 1386 window.BOLD.subscriptions.data.subscriptionGroups = []; 1387 if (localStorage && localStorage.getItem('boldSubscriptionsSubscriptionGroups')) { 1388 window.BOLD.subscriptions.data.subscriptionGroups = JSON.parse(localStorage.getItem('boldSubscriptionsSubscriptionGroups')); 1389 } else { 1390 window.BOLD.subscriptions.data.subscriptionGroups = [{"id":12314,"billing_rules":[{"id":24826,"subscription_group_id":12314,"interval_name":"Monthly ","billing_rule":"FREQ=MONTHLY","custom_billing_rule":""}],"is_subscription_only":false,"allow_prepaid":false,"allow_dynamic_discount":false,"is_prepaid_only":false,"should_continue_prepaid":true,"continue_prepaid_type":"as_prepaid","prepaid_durations":[{"id":12255,"subscription_group_id":12314,"total_duration":1,"discount_type":"percentage","discount_value":0}],"dynamic_discounts":[],"selection_options":[{"platform_entity_id":"7274582048946"}],"discount_type":"no_discount","percent_discount":0,"fixed_discount":0,"can_add_to_cart":true},{"id":29902,"billing_rules":[{"id":67129,"subscription_group_id":29902,"interval_name":"Monthly ","billing_rule":"FREQ=MONTHLY","custom_billing_rule":""}],"is_subscription_only":false,"allow_prepaid":false,"allow_dynamic_discount":false,"is_prepaid_only":false,"should_continue_prepaid":true,"continue_prepaid_type":"as_prepaid","prepaid_durations":[{"id":29848,"subscription_group_id":29902,"total_duration":1,"discount_type":"percentage","discount_value":0}],"dynamic_discounts":[],"selection_options":[{"platform_entity_id":null}],"discount_type":"no_discount","percent_discount":0,"fixed_discount":0,"can_add_to_cart":true},{"id":37818,"billing_rules":[{"id":91621,"subscription_group_id":37818,"interval_name":"Yearly","billing_rule":"FREQ=YEARLY","custom_billing_rule":""}],"is_subscription_only":false,"allow_prepaid":false,"allow_dynamic_discount":false,"is_prepaid_only":false,"should_continue_prepaid":true,"continue_prepaid_type":"as_prepaid","prepaid_durations":[{"id":37015,"subscription_group_id":37818,"total_duration":1,"discount_type":"percentage","discount_value":0}],"dynamic_discounts":[],"selection_options":[{"platform_entity_id":"7925231911090"}],"discount_type":"no_discount","percent_discount":0,"fixed_discount":0,"can_add_to_cart":true},{"id":37819,"billing_rules":[{"id":91622,"subscription_group_id":37819,"interval_name":"Yearly","billing_rule":"FREQ=YEARLY","custom_billing_rule":""}],"is_subscription_only":false,"allow_prepaid":false,"allow_dynamic_discount":false,"is_prepaid_only":false,"should_continue_prepaid":true,"continue_prepaid_type":"as_prepaid","prepaid_durations":[{"id":37016,"subscription_group_id":37819,"total_duration":1,"discount_type":"percentage","discount_value":0}],"dynamic_discounts":[],"selection_options":[{"platform_entity_id":"7925237186738"}],"discount_type":"no_discount","percent_discount":0,"fixed_discount":0,"can_add_to_cart":true},{"id":37843,"billing_rules":[{"id":91669,"subscription_group_id":37843,"interval_name":"Monthly","billing_rule":"FREQ=MONTHLY","custom_billing_rule":""}],"is_subscription_only":false,"allow_prepaid":false,"allow_dynamic_discount":false,"is_prepaid_only":false,"should_continue_prepaid":false,"continue_prepaid_type":"as_standard","prepaid_durations":[],"dynamic_discounts":[],"selection_options":[{"platform_entity_id":"7926595223730"}],"discount_type":"no_discount","percent_discount":0,"fixed_discount":0,"can_add_to_cart":true}]; 1391 } 1392 1393 window.BOLD.subscriptions.isFeatureFlagEnabled = function (featureFlag) { 1394 for (var i = 0; i < window.BOLD.subscriptions.config.featureFlags.length; i++) { 1395 if (window.BOLD.subscriptions.config.featureFlags[i] === featureFlag){ 1396 return true; 1397 } 1398 } 1399 return false;
1400 } 1401 1402 window.BOLD.subscriptions.logger = { 1403 tag: "bold_subscriptions", 1404 // the bold subscriptions log level 1405 // 0 - errors (default) 1406 // 1 - warnings + errors 1407 // 2 - info + warnings + errors 1408 // use window.localStorage.setItem('boldSubscriptionsLogLevel', x) to set the log level 1409 levels: { 1410 ERROR: 0, 1411 WARN: 1, 1412 INFO: 2, 1413 }, 1414 level: parseInt((window.localStorage && window.localStorage.getItem('boldSubscriptionsLogLevel')) || "0", 10), 1415 _log: function(callArgs, level) { 1416 if (!window.console) { 1417 return null; 1418 } 1419 1420 if (window.BOLD.subscriptions.logger.level < level) { 1421 return; 1422 } 1423 1424 var params = Array.prototype.slice.call(callArgs); 1425 params.unshift(window.BOLD.subscriptions.logger.tag); 1426 1427 switch (level) { 1428 case window.BOLD.subscriptions.logger.levels.INFO: 1429 console.info.apply(null, params); 1430 return; 1431 case window.BOLD.subscriptions.logger.levels.WARN: 1432 console.warn.apply(null, params); 1433 return; 1434 case window.BOLD.subscriptions.logger.levels.ERROR: 1435 console.error.apply(null, params); 1436 return; 1437 default: 1438 console.log.apply(null, params); 1439 return; 1440 } 1441 }, 1442 info: function() { 1443 window.BOLD.subscriptions.logger._log(arguments, window.BOLD.subscriptions.logger.levels.INFO); 1444 }, 1445 warn: function() { 1446 window.BOLD.subscriptions.logger._log(arguments, window.BOLD.subscriptions.logger.levels.WARN); 1447 }, 1448 error: function() { 1449 window.BOLD.subscriptions.logger._log(arguments, window.BOLD.subscriptions.logger.levels.ERROR); 1450 } 1451 } 1452 1453 window.BOLD.subscriptions.shouldLoadSubscriptionGroupFromAPI = function() { 1454 return window.BOLD.subscriptions.config.loadSubscriptionGroupFrom === window.BOLD.subscriptions.config.loadSubscriptionGroupFromTypes['BSUB_API']; 1455 } 1456 1457 window.BOLD.subscriptions.getSubscriptionGroupFromProductId = function (productId) { 1458 var data = window.BOLD.subscriptions.data; 1459 var foundGroup = null; 1460 for (var i = 0; i < data.subscriptionGroups.length; i += 1) { 1461 var subscriptionGroup = data.subscriptionGroups[i]; 1462 for (var j = 0; j < subscriptionGroup.selection_options.length; j += 1) { 1463 var selectionOption = subscriptionGroup.selection_options[j]; 1464 if (selectionOption.platform_entity_id === productId.toString()) { 1465 foundGroup = subscriptionGroup; 1466 break; 1467 } 1468 } 1469 if (foundGroup) { 1470 break; 1471 } 1472 } 1473 return foundGroup; 1474 }; 1475 1476 window.BOLD.subscriptions.getSubscriptionGroupById = function(subGroupId) { 1477 var subscriptionGroups = window.BOLD.subscriptions.data.subscriptionGroups; 1478 1479 for (var i = 0; i < subscriptionGroups.length; i += 1) { 1480 var subGroup = subscriptionGroups[i]; 1481 if (subGroup.id === subGroupId) { 1482 return subGroup; 1483 } 1484 } 1485 1486 return null; 1487 }; 1488 1489 window.BOLD.subscriptions.addSubscriptionGroup = function (subscriptionGroup) { 1490 if(!window.BOLD.subscriptions.getSubscriptionGroupById(subscriptionGroup.id)) 1491 { 1492 window.BOLD.subscriptions.data.subscriptionGroups.push(subscriptionGroup); 1493 } 1494 } 1495 1496 window.BOLD.subscriptions.getSubscriptionGroupPrepaidDurationById = function(subscriptionGroupId, prepaidDurationId) { 1497 var subscriptionGroup = window.BOLD.subscriptions.getSubscriptionGroupById(subscriptionGroupId); 1498 1499 if ( 1500 !subscriptionGroup 1501 || !subscriptionGroup.prepaid_durations 1502 || !subscriptionGroup.prepaid_durations.length 1503 ) { 1504 return null; 1505 } 1506 1507 for (var i = 0; i < subscriptionGroup.prepaid_durations.length; i++) { 1508 var prepaidDuration = subscriptionGroup.prepaid_durations[i]; 1509 if (prepaidDuration.id === prepaidDurationId) { 1510 return prepaidDuration; 1511 } 1512 } 1513 1514 return null; 1515 } 1516 1517 window.BOLD.subscriptions.getSubscriptionGroupBillingRuleById = function(subGroup, billingRuleId) { 1518 for (var i = 0; i < subGroup.billing_rules.length; i += 1) { 1519 var billingRule = subGroup.billing_rules[i]; 1520 if (billingRule.id === billingRuleId) { 1521 return billingRule; 1522 } 1523 } 1524 1525 return null; 1526 }; 1527 1528 window.BOLD.subscriptions.toggleDisabledAddToCartButtons = function(d) { 1529 var addToCartForms = document.querySelectorAll(window.BOLD.subscriptions.config.addToCartFormSelectors.join(',')); 1530 var disable = !!d; 1531 for (var i = 0; i < addToCartForms.length; i++) { 1532 var addToCartForm = addToCartForms[i]; 1533 var productId = window.BOLD.subscriptions.getProductIdFromAddToCartForm(
1533addToCartForm); 1534 var subscriptionGroup = window.BOLD.subscriptions.getSubscriptionGroupFromProductId(productId); 1535 1536 if(window.BOLD.subscriptions.isFeatureFlagEnabled('BS2-4659_improve_large_group_selection') ) { 1537 if (subscriptionGroup || window.BOLD.subscriptions.shouldLoadSubscriptionGroupFromAPI()) { 1538 var addToCartButtons = addToCartForm.querySelectorAll(window.BOLD.subscriptions.config.addToCartButtonSelectors.join(',')); 1539 for (var j = 0; j < addToCartButtons.length; j++) { 1540 var addToCartButton = addToCartButtons[j]; 1541 var toggleAction = disable ? addToCartButton.setAttribute : addToCartButton.removeAttribute; 1542 1543 addToCartButton.disabled = disable; 1544 toggleAction.call(addToCartButton, 'data-disabled-by-subscriptions', disable); 1545 } 1546 } 1547 } else { 1548 if (subscriptionGroup) { 1549 var addToCartButtons = addToCartForm.querySelectorAll(window.BOLD.subscriptions.config.addToCartButtonSelectors.join(',')); 1550 for (var j = 0; j < addToCartButtons.length; j++) { 1551 var addToCartButton = addToCartButtons[j]; 1552 var toggleAction = disable ? addToCartButton.setAttribute : addToCartButton.removeAttribute; 1553 1554 addToCartButton.disabled = disable; 1555 toggleAction.call(addToCartButton, 'data-disabled-by-subscriptions', disable); 1556 } 1557 } 1558 } 1559 1560 } 1561 }; 1562 1563 window.BOLD.subscriptions.disableAddToCartButtons = function () { 1564 // only disable the add to cart buttons if the app isn't loaded yet 1565 if (!window.BOLD.subscriptions.app) { 1566 window.BOLD.subscriptions.toggleDisabledAddToCartButtons(true); 1567 } else { 1568 window.BOLD.subscriptions.enableAddToCartButtons(); 1569 } 1570 }; 1571 1572 window.BOLD.subscriptions.enableAddToCartButtons = function () { 1573 document.removeEventListener('click', window.BOLD.subscriptions.preventSubscriptionAddToCart); 1574 window.BOLD.subscriptions.toggleDisabledAddToCartButtons(false); 1575 }; 1576 1577 window.BOLD.subscriptions.toggleDisabledCheckoutButtons = function(d) { 1578 var checkoutButtons = document.querySelectorAll(window.BOLD.subscriptions.config.checkoutButtonSelectors.join(',')); 1579 var disable = !!d; 1580 for (var i = 0; i < checkoutButtons.length; i++) { 1581 var checkoutButton = checkoutButtons[i]; 1582 var toggleAction = disable ? checkoutButton.setAttribute : checkoutButton.removeAttribute; 1583 1584 checkoutButton.disabled = disable; 1585 toggleAction.call(checkoutButton, 'data-disabled-by-subscriptions', disable); 1586 } 1587 } 1588 1589 window.BOLD.subscriptions.disableCheckoutButtons = function() { 1590 // only disable the checkout buttons if the app isn't loaded yet 1591 if (!window.BOLD.subscriptions.app) { 1592 window.BOLD.subscriptions.toggleDisabledCheckoutButtons(true); 1593 } else { 1594 window.BOLD.subscriptions.enableCheckoutButtons(); 1595 } 1596 } 1597 1598 window.BOLD.subscriptions.enableCheckoutButtons = function() { 1599 document.removeEventListener('click', window.BOLD.subscriptions.preventCheckout); 1600 window.BOLD.subscriptions.toggleDisabledCheckoutButtons(false); 1601 } 1602 1603 window.BOLD.subscriptions.hasSuccessfulAddToCarts = function() { 1604 if (typeof(Storage) !== "undefined") { 1605 var successfulAddToCarts = JSON.parse( 1606 window.localStorage.getItem('boldSubscriptionsSuccessfulAddToCarts') || '[]' 1607 ); 1608 if (successfulAddToCarts.length > 0) { 1609 return true; 1610 } 1611 } 1612 1613 return false; 1614 } 1615 1616 window.BOLD.subscriptions.hasPendingAddToCarts = function() { 1617 if (typeof(Storage) !== "undefined") { 1618 var pendingAddToCarts = JSON.parse( 1619 window.localStorage.getItem('boldSubscriptionsPendingAddToCarts') || '[]' 1620 ); 1621 if (pendingAddToCarts.length > 0) { 1622 return true; 1623 } 1624 } 1625 1626 return false;
1627 } 1628 1629 window.BOLD.subscriptions.addJSAsset = function(src, deferred) { 1630 var scriptTag = document.getElementById('bold-subscriptions-app-embed-script'); 1631 var jsElement = document.createElement('script'); 1632 jsElement.type = 'text/javascript'; 1633 jsElement.src = src; 1634 if (deferred) { 1635 jsElement.defer = true; 1636 } 1637 scriptTag.parentNode.insertBefore(jsElement, scriptTag); 1638 }; 1639 1640 window.BOLD.subscriptions.addCSSAsset = function(href) { 1641 var scriptTag = document.getElementById('bold-subscriptions-app-embed-script'); 1642 var cssElement = document.createElement('link'); 1643 cssElement.href = href; 1644 cssElement.rel = 'stylesheet'; 1645 scriptTag.parentNode.insertBefore(cssElement, scriptTag); 1646 }; 1647 1648 window.BOLD.subscriptions.loadStorefrontAssets = function loadStorefrontAssets() { 1649 var assets = window.BOLD.subscriptions.config.assets; 1650 window.BOLD.subscriptions.addCSSAsset(window.BOLD.subscriptions.config.assetBaseUrl + '/static/' + assets['storefront.css']); 1651 window.BOLD.subscriptions.addJSAsset(window.BOLD.subscriptions.config.assetBaseUrl + '/static/' + assets['storefront.js'], false); 1652 }; 1653 1654 window.BOLD.subscriptions.loadCustomerPortalAssets = function loadCustomerPortalAssets() { 1655 if (document.getElementById('customer-portal-root') || document.getElementsByClassName('bsub-express-add-ons-widget')) { 1656 var assets = window.BOLD.subscriptions.config.assets; 1657 window.BOLD.subscriptions.addCSSAsset(window.BOLD.subscriptions.config.assetBaseUrl + '/static/' + assets['customer_portal.css']); 1658 window.BOLD.subscriptions.addJSAsset(window.BOLD.subscriptions.config.assetBaseUrl + '/static/' + assets['customer_portal.js'], true); 1659 } 1660 }; 1661 1662 window.BOLD.subscriptions.processManifest = function() { 1663 if (!window.BOLD.subscriptions.processedManifest) { 1664 window.BOLD.subscriptions.processedManifest = true; 1665 window.BOLD.subscriptions.config.assets = JSON.parse(this.responseText); 1666 1667 1668 window.BOLD.subscriptions.loadCustomerPortalAssets(); 1669 } 1670 }; 1671 1672 window.BOLD.subscriptions.addInitialLoadingMessage = function() { 1673 var customerPortalNode = document.getElementById('customer-portal-root'); 1674 if (customerPortalNode && window.BOLD.subscriptions.config.requireMSPInitialLoadingMessage) { 1675 customerPortalNode.innerHTML = '<div class="bold-subscriptions-loader-container"><div class="bold-subscriptions-loader"></div></div>'; 1676 } 1677 } 1678 1679 window.BOLD.subscriptions.contentLoaded = function() { 1680 window.BOLD.subscriptions.data.contentLoadedEventTriggered = true; 1681 window.BOLD.subscriptions.addInitialLoadingMessage(); 1682 1683 }; 1684 1685 window.BOLD.subscriptions.preventSubscriptionAddToCart = function(e) { 1686 if (e.target.matches(window.BOLD.subscriptions.config.addToCartButtonSelectors.join(',')) && e.target.form) { 1687 var productId = window.BOLD.subscriptions.getProductIdFromAddToCartForm(e.target.form); 1688 var subscriptionGroup = window.BOLD.subscriptions.getSubscriptionGroupFromProductId(productId); 1689 if(window.BOLD.subscriptions.isFeatureFlagEnabled('BS2-4659_improve_large_group_selection')) 1690 { 1691 if (subscriptionGroup || window.BOLD.subscriptions.shouldLoadSubscriptionGroupFromAPI()) { 1692 // This code prevents products in subscription groups from being added to the cart before the 1693 // Subscriptions app fully loads. Once the subscriptions app loads it will re-enable the 1694 // buttons. Use window.BOLD.subscriptions.enableAddToCartButtons enable them manually. 1695 e.preventDefault(); 1696 return false; 1697 } 1698 } else { 1699 if (subscriptionGroup) { 1700 // This code prevents products in subscription groups from being added to the cart before the 1701 // Subscriptions app fully loads. Once the subscriptions app loads it will re-enable the 1702 // buttons. Use window.BOLD.subscriptions.enableAddToCartButtons enable them manually. 1703 e.preventDefault(); 1704 return false;
1705 } 1706 } 1707 1708 } 1709 }; 1710 1711 window.BOLD.subscriptions.preventCheckout = function(e) { 1712 if ( 1713 e.target.matches(window.BOLD.subscriptions.config.checkoutButtonSelectors.join(',')) 1714 && (window.BOLD.subscriptions.hasSuccessfulAddToCarts() || window.BOLD.subscriptions.hasPendingAddToCarts()) 1715 ) { 1716 // This code prevents checkouts on the shop until the Subscriptions app fully loads. 1717 // When the Subscriptions app is ready it will enable the checkout buttons itself. 1718 // Use window.BOLD.subscriptions.enableCheckoutButtons to enable them manually. 1719 e.preventDefault(); 1720 return false; 1721 } 1722 } 1723 1724 if (!window.BOLD.subscriptions.config.legacyAssetsLoaded) { 1725 1726 document.addEventListener('DOMContentLoaded', window.BOLD.subscriptions.contentLoaded); 1727 } 1728 1729 if (!Element.prototype.matches) { 1730 Element.prototype.matches = 1731 Element.prototype.matchesSelector || 1732 Element.prototype.mozMatchesSelector || 1733 Element.prototype.msMatchesSelector || 1734 Element.prototype.oMatchesSelector || 1735 Element.prototype.webkitMatchesSelector || 1736 function(s) { 1737 var matches = (this.document || this.ownerDocument).querySelectorAll(s), 1738 i = matches.length; 1739 while (--i >= 0 && matches.item(i) !== this) {} 1740 return i > -1; 1741 }; 1742 } 1743 1744 if (!Element.prototype.closest) { 1745 Element.prototype.closest = function(s) { 1746 var el = this; 1747 1748 do { 1749 if (Element.prototype.matches.call(el, s)) return el; 1750 el = el.parentElement || el.parentNode; 1751 } while (el !== null && el.nodeType === 1); 1752 return null; 1753 }; 1754 } 1755 1756 window.BOLD.subscriptions.setVisibilityOfAdditionalCheckoutButtons = function (isVisible) { 1757 if (window.BOLD.subscriptions.config.additionalCheckoutSelectors === undefined) { 1758 return; 1759 } 1760 1761 var selectors = window.BOLD.subscriptions.config.additionalCheckoutSelectors; 1762 1763 for (var i = 0; i < selectors.length; i++) { 1764 var elements = document.querySelectorAll(selectors[i]); 1765 1766 for (var j = 0; j < elements.length; j++) { 1767 elements[j].style.display = isVisible ? 'block' : 'none'; 1768 } 1769 } 1770 } 1771 1772 window.BOLD.subscriptions.hideAdditionalCheckoutButtons = function() { 1773 window.BOLD.subscriptions.setVisibilityOfAdditionalCheckoutButtons(false); 1774 }; 1775 1776 window.BOLD.subscriptions.showAdditionalCheckoutButtons = function() { 1777 window.BOLD.subscriptions.setVisibilityOfAdditionalCheckoutButtons(true); 1778 }; 1779 1780 window.BOLD.subscriptions.enhanceMspUrls = function(data) { 1781 var mspUrl = 'https://sub.boldapps.net/shop/7003/customer_portal'; 1782 var elements = document.querySelectorAll("a[href='"+mspUrl+"']"); 1783 1784 if(!elements.length || !data.success) { 1785 return; 1786 } 1787 1788 for (var i = 0; i < elements.length; i++) { 1789 elements[i].href = elements[i].href + "?jwt="+data.value.jwt+"&customerId="+data.value.customerId; 1790 } 1791 }; 1792 1793 if (!window.BOLD.subscriptions.config.legacyAssetsLoaded) { 1794 window.addEventListener('load', function () { 1795 if (document.getElementById('customer-portal-root')) { 1796 window.BOLD.subscriptions.getJWT(window.BOLD.subscriptions.enhanceMspUrls); 1797 } 1798 }); 1799 1800 // This will be called immediately 1801 // Use this anonymous function to avoid polluting the global namespace 1802 (function() { 1803 var xhr = new XMLHttpRequest(); 1804 xhr.addEventListener('load', window.BOLD.subscriptions.processManifest); 1805 xhr.open('GET', window.BOLD.subscriptions.config.assetBaseUrl + '/static/manifest.json?t=' + (new Date()).getTime()); 1806 xhr.send(); 1807 })() 1808 } 1809 1810 window.BOLD.subscriptions.patches.patchCashier = function() { 1811 if (window.BOLD && window.BOLD.checkout) { 1812 window.BOLD.checkout.disable(); 1813 window.BOLD.checkout.listenerFn = window.BOLD.subscriptions.patches.cashierListenerFn; 1814 window.BOLD.checkout.enable(); 1815 } else if (window.BOLD.subscriptions.patches.currentCashierPatchAttempts < window.BOLD.subscriptions.patches.maxCashierPatchAttempts) { 1816 window.BOLD.subscriptions.patches.currentCashierPatchAttempts++; 1817 setTimeout(window.BOLD.subscriptions.patches.patchCashier, 100); 1818 } 1819 }; 1820 1821 window.BOLD.subscriptions.patches.finishCheckout = function(event, form, cart) { 1822 window.BOLD.subscriptions.patches.currentCheckoutRetries++; 1823 1824 if (!window.BOLD.subscriptions.app 1825 && window.BOLD.subscriptions.patches.currentCheckoutRetries < window.BOLD.subscriptions.patches.maxCheckoutRetries 1826 ) { 1827 setTimeout(function () { window.BOLD.subscriptions.patches.finishCheckout(event, form, cart); }, 100); 1828 return; 1829 } else if (window.BOLD.subscriptions.app) { 1830 window.BOLD.subscriptions.patches.currentCheckoutRetries = 0; 1831 window.BOLD.subscriptions.app.addCartParams(form, cart); 1832 } 1833 1834 var noSubscriptions = false;
1835 if ((window.BOLD.subscriptions.app && window.BOLD.subscriptions.app.successfulAddToCarts.length === 0) 1836 || !window.BOLD.subscriptions.app 1837 ) { 1838 noSubscriptions = true; 1839 event.target.dataset.cashierConfirmedNoPlugins = true; 1840 1841 if (window.BOLD.subscriptions.setCashierFeatureToken) { 1842 window.BOLD.subscriptions.setCashierFeatureToken(false); 1843 } 1844 } 1845 1846 if ((noSubscriptions && window.BOLD.subscriptions.config.cashierPluginOnlyMode) 1847 || (typeof BOLD.checkout.isFeatureRequired === 'function' && !BOLD.checkout.isFeatureRequired()) 1848 ) { 1849 // send them to the original checkout when in plugin only mode 1850 // and either BSUB is there but there are no subscription products 1851 // or BSUB isn't there at all 1852 if (form.dataset.old_form_action) { 1853 form.action = form.dataset.old_form_action; 1854 } 1855 event.target.click(); 1856 } else { 1857 // sends them to Cashier since BSUB got a chance to add it's stuff 1858 // and plugin only mode is not enabled 1859 form.submit(); 1860 } 1861 }; 1862</script>
vendor: 1 bytes, line 1862
1862
1863<script id="bold-subscriptions-app-embed-platform-script" type="text/javascript" defer> 1864 window.BOLD.subscriptions.config.shopPlatformId = '26810187954'; 1865 window.BOLD.subscriptions.config.appSlug = 'subscriptions'; 1866 1867 window.BOLD = window.BOLD || {}; 1868 window.BOLD.subscriptions = window.BOLD.subscriptions || {}; 1869 window.BOLD.subscriptions.data = window.BOLD.subscriptions.data || {}; 1870 window.BOLD.subscriptions.data.platform = window.BOLD.subscriptions.data.platform || {}; 1871 window.BOLD.subscriptions.data.platform.customer = { id: '' }; 1872 window.BOLD.subscriptions.data.platform.product = null; 1873 window.BOLD.subscriptions.data.platform.products = []; 1874 window.BOLD.subscriptions.data.platform.variantProductMap = {}; 1875 1876 window.BOLD.subscriptions.getProductByVariantId = function(variantId) { 1877 if (window.BOLD.subscriptions.data.platform.product && 1878 window.BOLD.subscriptions.data.platform.product.variants) { 1879 for (var i = 0; i < window.BOLD.subscriptions.data.platform.product.variants.length; i++) { 1880 if (window.BOLD.subscriptions.data.platform.product.variants[i].id === variantId) { 1881 return window.BOLD.subscriptions.data.platform.product; 1882 } 1883 } 1884 } 1885 1886 if (window.BOLD.subscriptions.data.platform.variantProductMap[variantId]) { 1887 return window.BOLD.subscriptions.data.platform.variantProductMap[variantId]; 1888 } 1889 1890 var productElements = document.querySelectorAll('[data-product-id]'); 1891 for (var i = 0; i < productElements.length; i++) { 1892 var productJsonElement = productElements[i].querySelector('[data-product-json]'); 1893 1894 if (productJsonElement) { 1895 try { 1896 var productData = JSON.parse(productJsonElement.textContent); 1897 if (productData && productData.variants) { 1898 for (var j = 0; j < productData.variants.length; j++) { 1899 if (productData.variants[j].id === variantId) { 1900 return productData; 1901 } 1902 } 1903 } 1904 } catch (e) { 1905 // Continue if parsing fails 1906 } 1907 } 1908 } 1909 1910 return null; 1911 } 1912 1913 window.BOLD.subscriptions.config.addToCartFormSelectors.push( 1914 '.product-form.product-form-product-template:not(.bold-subscriptions-no-widget)' 1915 ,'.product-form.product-form--payment-button:not(.bold-subscriptions-no-widget)' 1916 ); 1917 window.BOLD.subscriptions.config.addToCartButtonSelectors.push('[type="submit"]'); 1918 window.BOLD.subscriptions.config.quickAddToCartButtonSelectors.push('a[data-event-type="product-click"]'); 1919 window.BOLD.subscriptions.config.widgetInsertBeforeSelectors.push('[type="submit"]'); 1920 window.BOLD.subscriptions.config.cartElementSelectors.push('form[action="/cart"]'); 1921 window.BOLD.subscriptions.config.cartTotalElementSelectors.push('[data-cart-subtotal]', '.text-right .ajaxcart__subtotal'); 1922 window.BOLD.subscriptions.config.checkoutButtonSelectors.push( 1923 '[name="checkout"]', 1924 '[href*="checkout"]:not([href*="tools/checkout"])', 1925 '[onclick*="checkout"]:not([onclick*="tools/checkout"])', 1926 ); 1927 1928 // Discount text markup template 1929 1930 window.BOLD.subscriptions.config.discountItemTemplate = '<div class="bold-subscriptions-discount"><div class="bold-subscriptions-discount__details">{{details}}</div><div class="bold-subscriptions-discount__total">{{total}}</div></div>'; 1931 1932 1933 window.BOLD.subscriptions.getProductIdFromAddToCartForm = function(addToCartForm) { 1934 var idInput = addToCartForm.querySelector('[name="id"]'); 1935 if (idInput === null) { 1936 window.BOLD.subscriptions.logger.error('could not get variant id input from add to cart form â make sure your form has an input with [name="id"]') 1937 return null; 1938 } 1939 1940 var variantId = parseInt(idInput.value, 10); 1941 if (isNaN(variantId)) { 1942 window.BOLD.subscriptions.logger.error('could not parse variant id from [name="id"] input') 1943 return null; 1944 } 1945 1946 var product = window.BOLD.subscriptions.getProductByVariantId(variantId); 1947 1948 if (product === undefined || product === null) { 1949 window.BOLD.subscriptions.logger.error('could not find product data for variant id ' + variantId + ' â product data may not be available on this page') 1950 return null; 1951 } 1952 1953 return product.id; 1954 }; 1955 1956 window.BOLD.subscriptions.getAddToCartForms = function() { 1957 var forms = [];
1958 var idInputs = document.querySelectorAll('[name="id"]'); 1959 1960 for (var i = 0; i < idInputs.length; i++) { 1961 var idInput = idInputs[i]; 1962 var form = idInput.closest('form:not(.bold-subscriptions-no-widget)'); 1963 if (form) { 1964 forms.push(form); 1965 } 1966 } 1967 1968 return forms; 1969 }; 1970 1971 window.BOLD.subscriptions.getJWT = function (callback) { 1972 if(window.BOLD.subscriptions.data.platform.customer.id !== '') { 1973 var shopPlatformId = '26810187954'; 1974 var appSlug = 'subscriptions'; 1975 var customerPlatformId = window.BOLD.subscriptions.data.platform.customer.id; 1976 var proxyPath = '/apps/app-proxy/customers/v1/shops/'+shopPlatformId+'/apps/'+appSlug+'/customers/pid/'+customerPlatformId+'/jwt'; 1977 1978 var xmlhttp = new XMLHttpRequest(); 1979 1980 xmlhttp.onreadystatechange = function() { 1981 if (xmlhttp.readyState === window.BOLD.subscriptions.config.XMLHttpRequest.DONE) { 1982 if (xmlhttp.status === 200) { 1983 var data = JSON.parse(xmlhttp.responseText); 1984 callback({ 1985 success: true, 1986 value: { 1987 jwt: data.bold_platform_jwt, 1988 customerId: window.BOLD.subscriptions.data.platform.customer.id, 1989 }, 1990 }); 1991 } else if (xmlhttp.status === 404) { 1992 callback({ 1993 success: false, 1994 error: 'not_logged_in', 1995 }); 1996 } else { 1997 callback({ 1998 success: false, 1999 error: 'unknown', 2000 }); 2001 } 2002 } 2003 }; 2004 2005 xmlhttp.open("GET", proxyPath, true); 2006 xmlhttp.setRequestHeader('Accept', 'application/liquid'); 2007 xmlhttp.send(); 2008 } else { 2009 callback({ 2010 success: false, 2011 error: 'not_logged_in', 2012 }); 2013 } 2014 }; 2015 2016 window.BOLD.subscriptions.setCashierFeatureToken = function(value) { 2017 if (window.BOLD.checkout_features_defaults && window.BOLD.subscriptions.config.cashierApplicationUUID) { 2018 window.BOLD.checkout_features_defaults.forEach(function(item) { 2019 if (item.id === window.BOLD.subscriptions.config.cashierApplicationUUID) { 2020 item.require = value; 2021 } 2022 }); 2023 } 2024 }; 2025 2026 // Cashier patches 2027 window.BOLD.subscriptions.patches.cashierListenerFn = function(event) { 2028 if (window.BOLD.checkout.isCheckoutButton(event.target) && window.BOLD.checkout.isEnabled()) { 2029 window.BOLD.subscriptions.patches.pushToCashier(event); 2030 } else if(window.BOLD.checkout.isCheckoutButton(event.target) && typeof window.cashier_installed_on_site === 'undefined') { 2031 var request = new XMLHttpRequest(); 2032 request.open('HEAD', '/apps/checkout/isInstalled', false); 2033 request.send(null); 2034 2035 if(request.status >= 200 && request.status < 400) { 2036 window.BOLD.subscriptions.patches.pushToCashier(event); 2037 } else { 2038 window.cashier_installed_on_site = false; 2039 } 2040 } 2041 }; 2042 2043 window.BOLD.subscriptions.localTime = function() { 2044 var localDate = new Date(); 2045 return localDate.getTime(); 2046 }; 2047 2048 2049 window.BOLD.subscriptions.patches.pushToCashier = function(event) { 2050 event.preventDefault(); 2051 var form = window.BOLD.checkout.getForm(event.target); 2052 var formData = new FormData(form); 2053 var request = new XMLHttpRequest(); 2054 request.open('POST', '/cart/update.js?tmp=' + Date.now(), true); 2055 request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 2056 2057 request.onload = function() { 2058 if (request.status >= 200 && request.status < 400) { 2059 // Success! 2060 var cart = JSON.parse(request.responseText); 2061 2062 // If items are empty redirect back to the cart 2063 if (cart.items.length === 0) { 2064 return window.location.href = '/cart'; 2065 } 2066
2067 cart.items.forEach(function(element) { 2068 delete element.product_description; 2069 }); 2070 2071 if (document.getElementById('CartSpecialInstructions')) { 2072 // If the cart note exists, grab its value 2073 cart.note = document.getElementById('CartSpecialInstructions').value; 2074 } 2075 2076 var cartObj = JSON.stringify(cart); 2077 2078 var form = window.BOLD.checkout.getForm(event.target); 2079 form.dataset.old_form_action = form.action; 2080 form.action = '/apps/checkout/begin-checkout' + googleAnalyticsGetParamString({}); 2081 var cartCookie = window.BOLD.checkout.getCookie('cart'); 2082 var element = document.createElement('INPUT'); 2083 element.type = 'HIDDEN'; 2084 element.name = 'cart_id'; 2085 element.value = cartCookie; 2086 form.appendChild(element); 2087 2088 var dateElement = document.createElement('INPUT'); 2089 dateElement.type = 'HIDDEN'; 2090 dateElement.name = 'checkout_local_time'; 2091 dateElement.value = window.BOLD.subscriptions.localTime(); 2092 form.appendChild(dateElement); 2093 2094 var cartElement = document.createElement('INPUT'); 2095 cartElement.type = 'HIDDEN'; 2096 cartElement.name = 'cart'; 2097 cartElement.value = cartObj; 2098 form.appendChild(cartElement); 2099 form.method = 'POST'; 2100 2101 if(window.BOLD && window.BOLD.checkout && typeof window.BOLD.checkout.languageIsoCode === 'string') { 2102 var langInput = document.createElement('INPUT'); 2103 langInput.type = 'HIDDEN'; 2104 langInput.name = 'language_iso'; 2105 langInput.value = window.BOLD.checkout.languageIsoCode; 2106 form.appendChild(langInput); 2107 } 2108 2109 if (window.BOLD && window.BOLD.common && typeof window.BOLD.common.eventEmitter === 'object' && typeof window.BOLDCURRENCY !== 'undefined') { 2110 window.BOLD.common.eventEmitter.emit('BOLD_CASHIER_checkout', {target: form}); 2111 } 2112 2113 window.BOLD.subscriptions.patches.finishCheckout(event, form, cart); 2114 } 2115 }; 2116 2117 request.send(formData); 2118 }; 2119 2120 2121</script>
2121 2122 2123 2124<!-- END app block --><link href="https://monorail-edge.shopifysvc.com" rel="dns-prefetch">
2125<script>(function(){if ("sendBeacon" in navigator && "performance" in window) {try {var session_token_from_headers = performance.getEntriesByType('navigation')[0].serverTiming.find(x => x.name == '_s').description;} catch {var session_token_from_headers = undefined;}var session_cookie_matches = document.cookie.match(/_shopify_s=([^;]*)/);var session_token_from_cookie = session_cookie_matches && session_cookie_matches.length === 2 ? session_cookie_matches[1] : "";var session_token = session_token_from_headers || session_token_from_cookie || "";function handle_abandonment_event(e) {var entries = performance.getEntries().filter(function(entry) {return /monorail-edge.shopifysvc.com/.test(entry.name);});if (!window.abandonment_tracked && entries.length === 0) {window.abandonment_tracked = true;var currentMs = Date.now();var navigation_start = performance.timing.navigationStart;var payload = {shop_id: 26810187954,url: window.location.href,navigation_start,duration: currentMs - navigation_start,session_token,page_type: "cart"};window.navigator.sendBeacon("https://monorail-edge.shopifysvc.com/v1/produce", JSON.stringify({schema_id: "online_store_buyer_site_abandonment/1.1",payload: payload,metadata: {event_created_at_ms: currentMs,event_sent_at_ms: currentMs}}));}}window.addEventListener('pagehide', handle_abandonment_event);}}());</script>
vendor: 1 bytes, line 2125
2125
2126<script> 2127 window.__TREKKIE_SHIM_QUEUE = window.__TREKKIE_SHIM_QUEUE || []; 2128</script>
vendor: 1 bytes, line 2128
2128
2129<script>(function(){var wpmLoader=function(){"use strict";var e=/Googlebot|Storebot-Google|bingbot|Baiduspider|YandexBot|DuckDuckBot|Slurp|facebookexternalhit|Twitterbot|LinkedInBot|Applebot|AdsBot-Google|Mediapartners-Google|APIs-Google|PetalBot|SemrushBot|AhrefsBot|MJ12bot|DotBot|Acunetix|PerplexityBot|Perplexity-User/i,t=/bytedance/i;function i(){try{var e=document.cookie;if(!e||"string"!=typeof e)return;for(var t=0,i=e.split(";");t<i.length;t++){var n=i[t],r=n.indexOf("=");if(-1!==r){var o=n.slice(0,r).trim();if(o){var a=void 0;try{a=decodeURIComponent(o)}catch(e){a=o}if("_shopify_s"===a){var d=n.slice(r+1).trim();try{return decodeURIComponent(d)}catch(e){return d}}}}}return}catch(e){return}}function n(e){try{"undefined"!=typeof console&&"function"==typeof console.warn&&console.warn(e)}catch(e){}}function r(e,t){return"string"==typeof e&&e.length>0&&e.length<=t?e:void 0}function o(e){var t;switch(null==(t=null==e?void 0:e.navigation)?void 0:t.type){case 0:return"navigate";case 1:return"reload";case 2:return"back_forward";default:return}}function a(){var e,t,i;try{var n=null==(i=null==(t=null==(e=self.ShopifyAnalytics)?void 0:e.lib)?void 0:t.trekkie)?void 0:i.state;return"awaiting-consent"===n||"initialized"===n?n:void 0}catch(e){return}}return function(d,s,u,l){var c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};try{var p=c.trekkieShim;!0!==p&&"true"!==p||null!=window.__TREKKIE_SHIM_QUEUE||(window.__TREKKIE_SHIM_QUEUE=[])}catch(e){}var f,v,h,y,g=(v=(f={modern:/Edge?\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Firefox\/(1{2}[4-9]|1[2-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Chrom(ium|e)\/(9{2}|\d{3,})\.\d+(\.\d+|)|(Maci|X1{2}).+ Version\/(15\.\d+|(1[6-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(9{2}|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(15[._]\d+|(1[6-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|SamsungBrowser\/([2-9]\d|\d{3,})\.\d+/,legacy:/Edge?\/(1[6-9]|[2-9]\d|\d{3,})\.\d+(\.\d+|)|Firefox\/(5[4-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)|Chrom(ium|e)\/(5[1-9]|[6-9]\d|\d{3,})\.\d+(\.\d+|)([\d.]+$|.*Safari\/(?![\d.]+ Edge\/[\d.]+$))|(Maci|X1{2}).+ Version\/(10\.\d+|(1[1-9]|[2-9]\d|\d{3,})\.\d+)([,.]\d+|)( \(\w+\)|)( Mobile\/\w+|) Safari\/|Chrome.+OPR\/(3[89]|[4-9]\d|\d{3,})\.\d+\.\d+|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(10[._]\d+|(1[1-9]|[2-9]\d|\d{3,})[._]\d+)([._]\d+|)|Android:?[ /-](14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})(\.\d+|)(\.\d+|)|Mobile Safari.+OPR\/([89]\d|\d{3,})\.\d+\.\d+|Android.+Firefox\/(15\d|1[6-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+Chrom(ium|e)\/(14[89]|1[5-9]\d|[2-9]\d{2}|\d{4,})\.\d+(\.\d+|)|Android.+(UC? ?Browser|UCWEB|U3)[ /]?(15\.([5-9]|\d{2,})|(1[6-9]|[2-9]\d|\d{3,})\.\d+)\.\d+|SamsungBrowser\/(5\.\d+|([6-9]|\d{2,})\.\d+)|Android.+MQ{2}Browser\/(14(\.(9|\d{2,})|)|(1[5-9]|[2-9]\d|\d{3,})(\.\d+|))(\.\d+|)|K[Aa][Ii]OS\/(3\.\d+|([4-9]|\d{2,})\.\d+)(\.\d+|)/}).modern,h=f.legacy,(y=navigator.userAgent).match(e)?"bot":y.match(v)?"modern":y.match(h)?"legacy":y.match(t)?"bot":"unknown"),m=function(e){var t,i,n=r(e,128);try{var a=window.performance,d=null==(t=null==a?void 0:a.getEntriesByType)?void 0:t.call(a,"navigation")[0];if(!d)return{requestId:n,navigationType:o(a)};var s="type"in d?r(d.type,64):void 0,u="serverTiming"in d&&Array.isArray(d.serverTiming)?d.serverTiming:[];return{requestId:null!=n?n:r(null==(i=u.find(function(e){return"requestID"===e.name}))?void 0:i.description,128),navigationType:s}}catch(e){return{requestId:n}}}(c.requestId),w=function(e){var t=e.version,r=e.browserTarget,o=e.surface,a=e.shopId,d=e.monorailEndpoint,s=window.location.href;return{emit:function(e){var u=e.status,l=e.errorMsg,c=e.failureReason,p=e.useKeepaliveFallback,f=void 0!==p&&p,v=e.navigationType,h=e.pagehidePersisted,y=e.requestId,g=e.trekkieState;if(d){var m,w;try{var b=(new Date).getTime();m=JSON.stringify({metadata:{event_sent_at_ms:b},events:[{schema_id:"web_pixels_manager_load/3.3",payload:{version:t,bundle_target:r,page_url:s,status:u,surface:o,error_msg:l,failure_reason:c,navigation_type:v,pagehide_persisted:h,request_id:y,trekkie_state:g,shop_id:a,visit_token:i()},metadata:{event_created_at_ms:b}}]})}catch(e){return}try{if("function"==typeof window.navigator.sendBeacon&&-1===(w=window.navigator.userAgent).indexOf("iPhone; CPU iPhone OS 12_")&&-1===w.indexOf("iPad; CPU OS 12_")&&-1===w.indexOf("iPod touch; CPU iPhone OS 12_")&&window.navigator.sendBeacon.bind(window.navigator)(d,m))return}catch(e){}if(f)try{"function"==typeof window.fetch&&window.fetch(d,{method:"POST",headers:{"Content-Type":"text/plain"},body:m,keepalive:!0}
2129).catch(function(){})}catch(e){}else try{var _=new XMLHttpRequest;_.open("POST",d,!0),_.setRequestHeader("Content-Type","text/plain"),_.send(m)}catch(e){n("[Web Pixels Manager] Got an unhandled error while logging to Monorail.")}}else n("[Web Pixels Manager] No Monorail endpoint provided, skipping logging.")}}}({version:u,browserTarget:g,surface:d.surface,shopId:d.shopId,monorailEndpoint:d.monorailEndpoint});if(Boolean(null==(_=null==(b=window.Shopify)?void 0:b.analytics)?void 0:_.replayQueue))w.emit({status:"setup-skipped",errorMsg:"replay queue already initialized."});else{var b,_;w.emit({status:"setup-started"}),window.Shopify=window.Shopify||{};var S=window.Shopify;S.analytics=S.analytics||{};var P=S.analytics;P.replayQueue=[],P.publish=function(e,t,i){return P.replayQueue.push([e,t,i]),!0};try{self.performance.mark("wpm:start")}catch(e){}var k,C="modern"===g?"modern":"legacy",E=(null!=l?l:{modern:"",legacy:""})[C],I=[(k={baseUrl:s,hashVersion:u,buildTarget:C}).baseUrl,"/wpm","/b",k.hashVersion,"modern"===k.buildTarget?"m":"l",".js"].join(""),O=!1,T=!1;try{c.browserTarget=g,function(){O=!0;try{window.addEventListener("pagehide",M)}catch(e){O=!1}}(),R(function(){try{R(x)}catch(e){D(e)}}),w.emit({status:"loading",requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()})}catch(e){D(e)}}function U(){var e;if(q(),!function(){var e,t;return Boolean(null==(t=null==(e=window.Shopify)?void 0:e.analytics)?void 0:t.initialized)}()){var t,i,n;try{if("function"!=typeof(null==(e=window.webPixelsManager)?void 0:e.init))return void A();if(!(null!==(n=i=t=window.webPixelsManager.init(d))&&"function"!=typeof n&&Object(n)===n&&"publish"in i&&"function"==typeof i.publish&&"publishCustomEvent"in i&&"function"==typeof i.publishCustomEvent&&"visitor"in i&&"function"==typeof i.visitor))return void A()}catch(e){return void A(e)}var r=window.Shopify.analytics;r.replayQueue.forEach(function(e){var i=e[0],n=e[1],r=e[2];t.publishCustomEvent(i,n,r)}),r.replayQueue=[],r.publish=t.publishCustomEvent,r.visitor=t.visitor,r.initialized=!0}}function A(e){B("manager_api_unavailable",void 0===e?void 0:Q(e))}function x(){B("script_load_failed","".concat(I," has failed to load"))}function B(e,t){T||(T=!0,q(),w.emit({status:"failed",errorMsg:t,failureReason:e,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function M(e){O&&(q(),w.emit({status:"pagehide-while-loading",useKeepaliveFallback:!0,pagehidePersisted:e.persisted,requestId:m.requestId,navigationType:m.navigationType,trekkieState:a()}))}function q(){O=!1;try{window.removeEventListener("pagehide",M)}catch(e){}}function R(e){var t;!function(e){var t=e.src,i=e.async,n=void 0===i||i,r=e.onload,o=e.onerror,a=e.sri,d=e.scriptDataAttributes,s=void 0===d?{}:d,u=document.createElement("script"),l=document.querySelector("head"),c=document.querySelector("body");if(u.async=n,u.src=t,a&&(u.integrity=a,u.crossOrigin="anonymous"),s)for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))try{u.dataset[p]=String(s[p])}catch(e){}if(r&&u.addEventListener("load",r),o&&u.addEventListener("error",o),l)l.appendChild(u);else{if(!c)throw new Error("Did not find a head or body element to append the script");c.appendChild(u)}}({src:I,async:!0,onload:U,onerror:e,sri:(t=E,"string"==typeof t&&/^sha384-[A-Za-z0-9+/=]+$/.test(t)?E:""),scriptDataAttributes:c})}function D(e){B("script_append_failed",Q(e))}function Q(e){return e instanceof Error?e.message:"Unknown error"}}}();wpmLoader({shopId: 26810187954,storefrontBaseUrl: "https://safetracksgpsshop.ca",extensionsBaseUrl: "https://extensions.shopifycdn.com/cdn/shopifycloud/web-pixels-manager",monorailEndpoint: "https://safetracksgpsshop.ca/.well-known/shopify/monorail/unstable/produce_batch",surface: "storefront-renderer",enabledBetaFlags: ["4c64608a","16072cab","8450a54b","7ee89bf1"],webPixelsConfigList: [{"id":"shopify-app-pixel","configuration":"{}","eventPayloadVersion":"v1","runtimeContext":"STRICT","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"APP","privacyPurposes":["ANALYTICS","MARKETING"]},{"id":"shopify-custom-pixel","eventPayloadVersion":"v1","runtimeContext":"LAX","scriptVersion":"0530","apiClientId":"shopify-pixel","type":"CUSTOM","privacyPurposes":["ANALYTICS","MARKETING"]}],isMerchantRequest: false,initData: {"shop":{"name":"SafeTracksGPS","paymentSettings":{"currencyCode":"CAD"},"myshopifyDomain":"safetracksgps.myshopify.com","countryCode":"CA","storefrontUrl":"https:\/\/safetracksgpsshop.ca"},"customer":null,"cart":null,"checkout":null,"productVariants":[],"products":[],"purchasingCompany":null},},"https://safetracksgpsshop.ca/cdn","5982071ew7ea472e3p69b68784m2150dfea",{"modern":"","legacy":""},{"trekkieShim":true,"agentContext":true,"apiClientId":"580111","facebookCapiEnabled":"true","themeId":"132753686706","themeStoreId":"796","themePublished":"true","eventMetadataId":"28c885ef-9c1f-4aa8-a101-255cd9167449","pageType":"cart","shopId":"26810187954","storefrontBaseUrl":"https:\/\/safetracksgpsshop.ca","extensionBaseUrl":"https:\/\/extensions.shopifycdn.com\/cdn\/shopifycloud\/web-pixels-manager","surface":"storefront-renderer","enabledBetaFlags":"[\"4c64608a\", \"16072cab\", \"8450a54b\", \"7ee89bf1\"]","isMerchantRequest":"false","hashVersion":"5982071ew7ea472e3p69b68784m2150dfea","publish":"custom","events":"[[\"page_viewed\",{}]]"});})();</script>
2129<script> 2130 window.ShopifyAnalytics = window.ShopifyAnalytics || {}; 2131 window.ShopifyAnalytics.meta = window.ShopifyAnalytics.meta || {}; 2132 window.ShopifyAnalytics.meta.currency = 'CAD'; 2133 var meta = {"page":{"pageType":"cart","requestId":"df0d4841-ad02-4afd-b351-5af70fa4a03a-1791109901"}}; 2134 for (var attr in meta) { 2135 window.ShopifyAnalytics.meta[attr] = meta[attr]; 2136 } 2137</script>
vendor: 1 bytes, line 2137
2137
2138<script class="analytics"> 2139 (function () { 2140 var customDocumentWrite = function(content) { 2141 var jquery = null; 2142 2143 if (window.jQuery) { 2144 jquery = window.jQuery; 2145 } else if (window.Checkout && window.Checkout.$) { 2146 jquery = window.Checkout.$; 2147 } 2148 2149 if (jquery) { 2150 jquery('body').append(content); 2151 } 2152 }; 2153 2154 var hasLoggedConversion = function(token) { 2155 if (token) { 2156 return document.cookie.indexOf('loggedConversion=' + token) !== -1; 2157 } 2158 return false; 2159 } 2160 2161 var setCookieIfConversion = function(token) { 2162 if (token) { 2163 var twoMonthsFromNow = new Date(Date.now()); 2164 twoMonthsFromNow.setMonth(twoMonthsFromNow.getMonth() + 2); 2165 2166 document.cookie = 'loggedConversion=' + token + '; expires=' + twoMonthsFromNow; 2167 } 2168 } 2169 2170 var trekkie = window.ShopifyAnalytics.lib = window.trekkie = window.trekkie || []; 2171 window.ShopifyAnalytics.lib.trekkie = window.trekkie; 2172 if (trekkie.integrations) { 2173 return; 2174 } 2175 trekkie.methods = [ 2176 'identify', 2177 'page', 2178 'ready', 2179 'track', 2180 'trackForm', 2181 'trackLink' 2182 ]; 2183 trekkie.factory = function(method) { 2184 return function() { 2185 var args = Array.prototype.slice.call(arguments); 2186 args.unshift(method); 2187 trekkie.push(args); 2188 if (method == 'track' || method == 'page') { 2189 var pageUrl; 2190 try { 2191 pageUrl = window.location.href; 2192 } catch (e) {} 2193 var pageReferrer; 2194 try { 2195 pageReferrer = document.referrer; 2196 } catch (e) {} 2197 try { 2198 if (window.__TREKKIE_SHIM_QUEUE == null) { 2199 window.__TREKKIE_SHIM_QUEUE = []; 2200 } 2201 window.__TREKKIE_SHIM_QUEUE.push({ 2202 from: 'trekkie-stub', 2203 method: method, 2204 args: args.slice(1), 2205 pageContext: { 2206 url: pageUrl, 2207 referrer: pageReferrer 2208 } 2209 }); 2210 } catch (e) { 2211 // no-op 2212 } 2213 } 2214 return trekkie; 2215 }; 2216 }; 2217 for (var i = 0; i < trekkie.methods.length; i++) { 2218 var key = trekkie.methods[i]; 2219 trekkie[key] = trekkie.factory(key); 2220 } 2221 trekkie.load = function(config) { 2222 trekkie.config = config || {}; 2223 trekkie.config.initialDocumentCookie = document.cookie; 2224 var first = document.getElementsByTagName('script')[0]; 2225var script = document.createElement('script'); 2226script.type = 'text/javascript'; 2227script.onerror = function(e) { 2228 var scriptFallback = document.createElement('script'); 2229 scriptFallback.type = 'text/javascript'; 2230 scriptFallback.onerror = function(error) { 2231 var Monorail = { 2232 produce: function produce(monorailDomain, schemaId, payload) { 2233 var currentMs = new Date().getTime(); 2234 var event = { 2235 schema_id: schemaId, 2236 payload: payload, 2237 metadata: { 2238 event_created_at_ms: currentMs, 2239 event_sent_at_ms: currentMs 2240 } 2241 }; 2242 return Monorail.sendRequest("https://" + monorailDomain + "/v1/produce", JSON.stringify(event)); 2243 }, 2244 sendRequest: function sendRequest(endpointUrl, payload) { 2245 // Try the sendBeacon API 2246 if (window && window.navigator && typeof window.navigator.sendBeacon === 'function' && typeof window.Blob === 'function' && !Monorail.isIos12()) { 2247 var blobData = new window.Blob([payload], { 2248 type: 'text/plain' 2249 }); 2250 2251 if (window.navigator.sendBeacon(endpointUrl, blobData)) { 2252 return true; 2253 } // sendBeacon was not successful 2254 2255 } // XHR beacon 2256 2257 var xhr = new XMLHttpRequest(); 2258 2259 try { 2260 xhr.open('POST', endpointUrl); 2261 xhr.setRequestHeader('Content-Type', 'text/plain'); 2262 xhr.send(payload); 2263 } catch (e) { 2264 console.log(e); 2265 } 2266 2267 return false; 2268 }, 2269 isIos12: function isIos12() { 2270 return window.navigator.userAgent.lastIndexOf('iPhone; CPU iPhone OS 12_') !== -1 || window.navigator.userAgent.lastIndexOf('iPad; CPU OS 12_') !== -1; 2271 } 2272 }; 2273 Monorail.produce('monorail-edge.shopifysvc.com', 2274 'trekkie_storefront_load_errors/1.1', 2275 {shop_id: 26810187954, 2276 theme_id: 132753686706, 2277 app_name: "storefront", 2278 context_url: window.location.href, 2279 source_url: "//safetracksgpsshop.ca/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js"}); 2280 2281 }; 2282 scriptFallback.async = true; 2283 scriptFallback.src = '//safetracksgpsshop.ca/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js'; 2284 first.parentNode.insertBefore(scriptFallback, first); 2285}; 2286script.async = true; 2287script.src = '//safetracksgpsshop.ca/cdn/s/trekkie.storefront.2f6d7d7ede7d24234881a9cd5f47e679642fa1f6.min.js'; 2288first.parentNode.insertBefore(script, first); 2289 2290 }; 2291 trekkie.load( 2292 {"Trekkie":{"appName":"storefront","development":false,"defaultAttributes":{"shopId":26810187954,"isMerchantRequest":null,"themeId":132753686706,"themeCityHash":"4667151912421486723","contentLanguage":"en","currency":"CAD","eventMetadataId":"28c885ef-9c1f-4aa8-a101-255cd9167449"},"isServerSideCookieWritingEnabled":true,"monorailRegion":"shop_domain","enabledBetaFlags":["764d78cb","8450a54b","7ee89bf1","4c64608a"]},"Session Attribution":{},"S2S":{"facebookCapiEnabled":true,"source":"trekkie-storefront-renderer","apiClientId":580111}} 2293 ); 2294 2295 var loaded = false;
2296 trekkie.ready(function() { 2297 if (loaded) return; 2298 loaded = true; 2299 2300 window.ShopifyAnalytics.lib = window.trekkie; 2301 2302 var originalDocumentWrite = document.write; 2303 document.write = customDocumentWrite; 2304 try { window.ShopifyAnalytics.merchantGoogleAnalytics.call(this); } catch(error) {}; 2305 document.write = originalDocumentWrite; 2306 2307 var match = window.location.pathname.match(/checkouts\/(.+)\/(thank_you|post_purchase)/) 2308 var token = match? match[1]: undefined; 2309 if (!hasLoggedConversion(token)) { 2310 setCookieIfConversion(token); 2311 2312 } 2313 }); 2314 2315 window.ShopifyAnalytics.lib.page(null,{"pageType":"cart","requestId":"df0d4841-ad02-4afd-b351-5af70fa4a03a-1791109901","shopifyEmitted":true}); 2316 2317 var eventsListenerScript = document.createElement('script'); 2318 eventsListenerScript.async = true; 2319 eventsListenerScript.src = "//safetracksgpsshop.ca/cdn/shopifycloud/storefront/assets/shop_events_listener-4e26a9ce.js"; 2320 document.getElementsByTagName('head')[0].appendChild(eventsListenerScript); 2321})();</script>
vendor: 1 bytes, line 2321
2321
2322<script 2323 defer 2324 src="https://safetracksgpsshop.ca/cdn/shopifycloud/perf-kit/shopify-perf-kit-3.9.4.min.js" 2325 data-application="storefront-renderer" 2326 data-shop-id="26810187954" 2327 data-render-region="gcp-us-central1" 2328 data-page-type="cart" 2329 data-theme-instance-id="132753686706" 2330 data-theme-name="Debut" 2331 data-theme-version="17.5.2" 2332 data-monorail-region="shop_domain" 2333 data-resource-timing-sampling-rate="10" 2334 data-shs="true" 2335 data-shs-beacon="true" 2336 data-shs-export-with-fetch="true" 2337 data-shs-logs-sample-rate="1" 2338 data-shs-beacon-endpoint="https://safetracksgpsshop.ca/api/collect" 2339></script>
vendor: 1 bytes, line 2339
2339
2340<script id="shopify-chat-page-data" type="application/json">{"greetingMessage":"Welcome to SafeTracksGPS. How can I help?","customerServiceEmail":"[email protected]","onlineStorePasswordProtected":false,"continueAsChip":false,"translations":[{"key":"agent_chat.panel.open_chat","value":"Open chat"},{"key":"agent_chat.panel.ask_anything","value":"Ask anything"},{"key":"agent_chat.panel.title","value":"Storekick"},{"key":"agent_chat.panel.unread_replies","value":"Unread replies"},{"key":"agent_chat.panel.back_to_chat","value":"Back to chat"},{"key":"agent_chat.panel.see_history","value":"See chat history"},{"key":"agent_chat.panel.new_chat","value":"Create a new chat"},{"key":"agent_chat.panel.close","value":"Close chat"},{"key":"agent_chat.panel.undock","value":"Undock chat"},{"key":"agent_chat.panel.dock","value":"Dock chat"},{"key":"agent_chat.panel.expand","value":"Expand chat"},{"key":"agent_chat.panel.contract","value":"Contract chat"},{"key":"agent_chat.panel.jump_to_latest","value":"Jump to latest"},{"key":"agent_chat.panel.loading_chat","value":"Loading chat"},{"key":"agent_chat.input.label","value":"Type your message"},{"key":"agent_chat.input.placeholder","value":"Ask anything..."},{"key":"agent_chat.input.send","value":"Send"},{"key":"agent_chat.input.stop","value":"Stop generating"},{"key":"agent_chat.thinking","value":"Thinking..."},{"key":"agent_chat.first_response_delayed","value":"Agent is taking longer to respondâ¦"},{"key":"agent_chat.searching","value":"Searching..."},{"key":"agent_chat.message.sent_timestamp","value":"Sent · {{time}}"},{"key":"agent_chat.message.automated_label","value":"Automated"},{"key":"agent_chat.message.automated_timestamp","value":"Automated · {{time}}"},{"key":"agent_chat.liveAgentHandoff","value":"Someone from our team will be with you shortly"},{"key":"agent_chat.human_handoff.action","value":"Chat with our team"},{"key":"agent_chat.human_handoff.request","value":"Iâd like to talk to someone from your team"},{"key":"agent_chat.human_handoff.ai_assistant","value":"AI assistant"},{"key":"agent_chat.greeting.default","value":"Hi there!"},{"key":"agent_chat.greeting.with_name","value":"Hi {{name}}!"},{"key":"agent_chat.greeting.welcome","value":"You can ask questions about shopping, sizing\/dimensions, shipping, returns, or order status."},{"key":"agent_chat.greeting.welcome_back","value":"Welcome back to %{shop_name}! How can I help?"},{"key":"agent_chat.greeting.welcome_back_no_shop","value":"Welcome back! How can I help?"},{"key":"agent_chat.greeting.welcome_to_shop","value":"Welcome to %{shop_name}. How can I help?"},{"key":"agent_chat.greeting.generic","value":"How can I help?"},{"key":"agent_chat.disclaimer.text","value":"This chat is powered by AI from Shopify and may make mistakes. Your messages are visible to {{shop_name}}. See"},{"key":"agent_chat.disclaimer.text_human","value":"Your messages are visible to {{shop_name}} and to Shopify for the provision and improvement of the services. See"},{"key":"agent_chat.disclaimer.link_text","value":"privacy policy"},{"key":"agent_chat.error.response_unavailable","value":"Response unavailable"},{"key":"agent_chat.error.generic","value":"Something went wrong."},{"key":"agent_chat.error.response_failed","value":"Couldnât load this message"},{"key":"agent_chat.error.message_send_failed","value":"Your message couldnât be sent"},{"key":"agent_chat.error.attachment_upload_failed","value":"Your attachment didnât upload"},{"key":"agent_chat.error.first_response_stalled","value":"Agent couldnât respond"},{"key":"agent_chat.error.try_again","value":"Try again"},{"key":"agent_chat.error.unavailable","value":"Chat isn't available right now - try again later"},{"key":"agent_chat.error.usage_limit","value":"Message limit reached â try again later or email us at {{email}}"},{"key":"agent_chat.error.usage_limit_no_email","value":"Message limit reached â try again later"},{"key":"agent_chat.error.cost_quota_unhandled","value":"Chat isnât available right nowâemail us at {{email}}"},{"key":"agent_chat.error.cost_quota_unhandled_no_email","value":"Chat isnât available right now"},{"key":"agent_chat.error.cost_quota_handover","value":"AI assistant isnât available right now â our team will reply shortly"},{"key":"agent_chat.history.heading","value":"Chat history"},{"key":"agent_chat.history.loading","value":"Loading conversation history"},{"key":"agent_chat.history.aria_label","value":"Conversation history"},{"key":"agent_chat.history.no_conversations","value":"No conversations"},{"key":"agent_chat.history.conversation.one","value":"conversation"},{"key":"agent_chat.history.conversation.other","value":"conversations"},{"key":"agent_chat.history.error_message","value":"Something went wrong."},{"key":"agent_chat.history.try_again","value":"Try again"},{"key":"agent_chat.history.no_past","value":"No past conversations"},{"key":"agent_chat.history.start_new","value":"Start a new chat"},{"key":"agent_chat.history.untitled","value":"Untitled conversation"},{"key":"agent_chat.history.resume","value":"Resume: {{title}}"},{"key":"agent_chat.history.resume_with_time","value":"Resume: {{title}}, {{time}}"},{"key":"agent_chat.history.delete","value":"Delete conversation: {{title}}"},{"key":"agent_chat.history.delete_failed","value":"Could not delete conversation"},{"key":"agent_chat.feedback.group_label","value":"Message feedback"},{"key":"agent_chat.feedback.thumbs_up","value":"Thumbs up"},{"key":"agent_chat.feedback.thumbs_down","value":"Thumbs down"},{"key":"agent_chat.feedback.add_comment","value":"Add comment"},{"key":"agent_chat.feedback.thanks","value":"Thanks for your feedback"},{"key":"agent_chat.feedback.placeholder_up","value":"Tell us what went well"},{"key":"agent_chat.feedback.placeholder_down","value":"Tell us what could have been better"},{"key":"agent_chat.feedback.comment_label","value":"Feedback comment"},{"key":"agent_chat.feedback.cancel","value":"Cancel"},{"key":"agent_chat.feedback.submit","value":"Submit"},{"key":"agent_chat.feedback.character_count","value":"{{current}}\/{{max}}"},{"key":"agent_chat.feedback.character_limit_reached","value":"Maximum length reached. Feedback is limited to {{max}} characters."},{"key":"agent_chat.buyer_profile.button.open","value":"Buyer Profile"},{"key":"agent_chat.buyer_profile.title","value":"Buyer Profile"},{"key":"agent_chat.buyer_profile.empty","value":"No buyer profile available."},{"key":"agent_chat.buyer_profile.close","value":"Close"},{"key":"agent_chat.suggestions.empty_state_label","value":"Suggested questions"},{"key":"agent_chat.suggestions.quick_reply_label","value":"Suggested replies"},{"key":"agent_chat.auth.sign_in_to_continue","value":"Sign in to continue"},{"key":"agent_chat.auth.sign_in","value":"Sign in"},{"key":"agent_chat.auth.skip_and_chat","value":"Skip and start chatting"},{"key":"agent_chat.auth.pre_chat_title","value":"Sign in to personalize and save your chats"},{"key":"agent_chat.auth.pre_chat_subtitle","value":"Sign in or create an account"},{"key":"agent_chat.auth.staff_chat_required_title","value":"Don't miss a reply"},{"key":"agent_chat.auth.staff_chat_required_subtitle","value":"Sign in to chat with our team. We'll email you if you leave the chat."},{"key":"agent_chat.auth.share_disclaimer","value":"By continuing, Shop will share your name and email with this store. See their {{terms_link}} and {{privacy_link}}"},{"key":"agent_chat.auth.terms_link","value":"terms"},{"key":"agent_chat.auth.privacy_link","value":"privacy policy"},{"key":"agent_chat.auth.declined_pre_chat","value":"I canât connect you with the store unless you sign in."},{"key":"agent_chat.reply_by_email.continuation_prompt","value":"If you leave the chat, weâll email you when thereâs a reply."},{"key":"agent_chat.reply_by_email.sign_in_prompt","value":"Sign in to get emailed when thereâs a reply."},{"key":"agent_chat.order_lookup.track_order","value":"Track my order"},{"key":"agent_chat.order_lookup.track_another_order","value":"Track another order"},{"key":"agent_chat.order_lookup.new_conversation","value":"New conversation"},{"key":"agent_chat.order_lookup.follow_up_label","value":"Order lookup actions"},{"key":"agent_chat.order_lookup.enter_order_information","value":"Enter order information"},{"key":"agent_chat.order_lookup.prompt","value":"To see your order status, please provide your order details."},{"key":"agent_chat.order_lookup.form_title","value":"Track my order"},{"key":"agent_chat.order_lookup.form_subtitle","value":"Please provide your information."},{"key":"agent_chat.order_lookup.order_number_label","value":"Order number"},{"key":"agent_chat.order_lookup.email_label","value":"Email address"},{"key":"agent_chat.order_lookup.submit","value":"Track my order"},{"key":"agent_chat.order_lookup.cancel","value":"Cancel"},{"key":"agent_chat.order_lookup.invalid_order_number","value":"Please enter a valid order number with only numbers and letters, no spaces (e.g. 1006)."},{"key":"agent_chat.order_lookup.invalid_order_number_whitespace","value":"Please enter a valid order number with only numbers and letters, no spaces (e.g. 1006)."},{"key":"agent_chat.order_lookup.invalid_email","value":"Please enter a valid email address"},{"key":"agent_chat.order_lookup.generic_error","value":"There was a problem looking up your order. Please try again."},{"key":"agent_chat.order_lookup.rate_limited_error","value":"Too many attempts. Try again later."},{"key":"agent_chat.order_lookup.locked_composer_status","value":"Order lookup is in progress. Start a new conversation to ask something else."},{"key":"agent_chat.legacy_contact.form_title","value":"Before we get started"},{"key":"agent_chat.legacy_contact.form_subtitle","value":"Please provide your information so we can reply to you if you leave the chat."},{"key":"agent_chat.legacy_contact.first_name_label","value":"First name"},{"key":"agent_chat.legacy_contact.last_name_label","value":"Last name"},{"key":"agent_chat.legacy_contact.email_label","value":"Email"},{"key":"agent_chat.legacy_contact.marketing_opt_in","value":"Email me with news and offers"},{"key":"agent_chat.legacy_contact.submit","value":"Start chat"},{"key":"agent_chat.legacy_contact.cancel","value":"Cancel"}
2340,{"key":"agent_chat.legacy_contact.invalid_first_name","value":"Enter a valid first name."},{"key":"agent_chat.legacy_contact.invalid_last_name","value":"Enter a valid last name."},{"key":"agent_chat.legacy_contact.invalid_email","value":"Enter a valid email address."},{"key":"agent_chat.legacy_contact.invalid_email_length","value":"Email address is too long."},{"key":"agent_chat.legacy_contact.generic_error","value":"Something went wrong."},{"key":"agent_chat.legacy_contact.rate_limited_error","value":"Too many attempts. Try again later."},{"key":"agent_chat.discountCard.useDiscount","value":"Use discount"},{"key":"agent_chat.discountCard.discountApplicationContext","value":"Applies automatically at checkout"},{"key":"agent_chat.cart.checkout","value":"Checkout"},{"key":"agent_chat.product.add_to_cart","value":"Add to cart"},{"key":"agent_chat.product.view_details","value":"View details"},{"key":"agent_chat.product.out_of_stock","value":"Out of stock"},{"key":"agent_chat.product.compare_suggestions","value":"Compare suggestions"},{"key":"agent_chat.product.hide_suggestions","value":"Hide suggestions"},{"key":"agent_chat.product.sold_out","value":"Sold out"},{"key":"agent_chat.order.item.one","value":"item"},{"key":"agent_chat.order.item.other","value":"items"},{"key":"agent_chat.order.less_items.one","value":"- hide {{count}} item"},{"key":"agent_chat.order.less_items.other","value":"- hide {{count}} items"},{"key":"agent_chat.order.more_items.one","value":"+ {{count}} more item"},{"key":"agent_chat.order.more_items.other","value":"+ {{count}} more items"},{"key":"agent_chat.order.view_order","value":"View order {{orderId}}"},{"key":"agent_chat.order.track_shipment","value":"Track shipment"},{"key":"agent_chat.order.of_total","value":"{{index}} of {{total}}"},{"key":"agent_chat.order.label","value":"Order {{number}}"},{"key":"agent_chat.order.count.one","value":"{{count}} Order"},{"key":"agent_chat.order.count.other","value":"{{count}} Orders"},{"key":"agent_chat.order.ordered_on","value":"Ordered {{date}}"},{"key":"agent_chat.order.select","value":"Select order {{number}}"},{"key":"agent_chat.return.heading","value":"Select items to return"},{"key":"agent_chat.return.toggle_item","value":"Select {{name}}"},{"key":"agent_chat.return.select_item_non_returnable","value":"{{name}}, not returnable"},{"key":"agent_chat.return.quantity_label","value":"Return quantity"},{"key":"agent_chat.return.reason_label","value":"Reason for return"},{"key":"agent_chat.return.reason_placeholder","value":"Select a reason"},{"key":"agent_chat.return.confirm","value":"Request return"},{"key":"agent_chat.return.confirmed","value":"Return requested"},{"key":"agent_chat.return.reason.size_too_small","value":"Size too small"},{"key":"agent_chat.return.reason.size_too_large","value":"Size too large"},{"key":"agent_chat.return.reason.unwanted","value":"Unwanted"},{"key":"agent_chat.return.reason.not_as_described","value":"Not as described"},{"key":"agent_chat.return.reason.wrong_item","value":"Wrong item"},{"key":"agent_chat.return.reason.defective","value":"Defective"},{"key":"agent_chat.return.reason.style","value":"Style"},{"key":"agent_chat.return.reason.color","value":"Color"},{"key":"agent_chat.return.reason.other_reason","value":"Other"},{"key":"agent_chat.scroll.previous","value":"Previous"},{"key":"agent_chat.scroll.next","value":"Next"}]}</script>
vendor: 1 bytes, line 2340
2340
2341<script id="shopify-customer-account-data" type="application/json">{"customer":null,"shop":{"id":"26810187954","customerAccountTranslations":[{"key":"account_menu.signed_out_state.sheet_title","value":"Sign in or create account"},{"key":"account_menu.signed_out_state.section_divider","value":"More ways to sign in"},{"key":"account_menu.signed_out_state.alternate_divider","value":"OR"},{"key":"account_menu.signed_out_state.email_field_label","value":"Email"},{"key":"account_menu.signed_out_state.orders_button","value":"Orders"},{"key":"account_menu.signed_out_state.profile_button","value":"Profile"},{"key":"account_menu.signed_out_state.shop_login_button","value":"Sign in with Shop"},{"key":"account_menu.signed_out_state.continue_with_google","value":"Continue with Google"},{"key":"account_menu.signed_out_state.continue_with_facebook","value":"Continue with Facebook"},{"key":"account_menu.signed_out_state.marketing_consent_label","value":"Email me with news and offers"},{"key":"account_menu.signed_in_state.greeting_with_name","value":"Hi, {{first_name}}"},{"key":"account_menu.signed_in_state.greeting_without_name","value":"Account"},{"key":"account_menu.signed_in_state.orders_button","value":"Orders"},{"key":"account_menu.signed_in_state.profile_button","value":"Profile"},{"key":"account_menu.location_picker.sheet_title","value":"Locations"},{"key":"account_menu.location_picker.search_field_placeholder","value":"Search"},{"key":"account_menu.aria_labels.close_menu","value":"Close menu"},{"key":"account_menu.aria_labels.back_to_main_menu","value":"Back to main menu from {{title}}"},{"key":"account_menu.aria_labels.open_submenu","value":"{{title}}, opens submenu"},{"key":"account_menu.aria_labels.loading_menu","value":"Loading menu"},{"key":"account_menu.aria_labels.account","value":"Account"},{"key":"account_menu.aria_labels.sign_in_with_email","value":"Sign in with email"},{"key":"account_menu.aria_labels.sign_in","value":"Sign in"}],"socialLoginProviders":[{"handle":"Shop"}],"legacyCustomerAccounts":false,"signInLinksVisible":true,"b2bEnabled":false,"marketingConsentSigninEnabled":true,"marketingConsentPreselected":false},"visitor":{"country":"US","language":"en"}}</script>
2341 2342<meta name="shopify-y" content="e23ae321-de40-489f-be3e-86a12387a396" data-expiration="1822667502000"><meta name="shopify-s" content="346f4a0e-f271-4079-8310-49d74d8fc3a1" data-expiration="1791111702000"><meta name="new-cookie-storage-activated" content="t"> 2343</head> 2344 2345<body class="template-cart"> 2346 2347 <a class="in-page-link visually-hidden skip-link" href="#MainContent">Skip to content</a><style data-shopify> 2348 2349 .cart-popup { 2350 box-shadow: 1px 1px 10px 2px rgba(235, 235, 235, 0.5); 2351 }</style><div class="cart-popup-wrapper cart-popup-wrapper--hidden critical-hidden" role="dialog" aria-modal="true" aria-labelledby="CartPopupHeading" data-cart-popup-wrapper> 2352 <div class="cart-popup" data-cart-popup tabindex="-1"> 2353 <div class="cart-popup__header"> 2354 <h2 id="CartPopupHeading" class="cart-popup__heading">Just added to your cart</h2> 2355 <button class="cart-popup__close" aria-label="Close" data-cart-popup-close><svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 40 40"><path d="M23.868 20.015L39.117 4.78c1.11-1.108 1.11-2.77 0-3.877-1.109-1.108-2.773-1.108-3.882 0L19.986 16.137 4.737.904C3.628-.204 1.965-.204.856.904c-1.11 1.108-1.11 2.77 0 3.877l15.249 15.234L.855 35.248c-1.108 1.108-1.108 2.77 0 3.877.555.554 1.248.831 1.942.831s1.386-.277 1.94-.83l15.25-15.234 15.248 15.233c.555.554 1.248.831 1.941.831s1.387-.277 1.941-.83c1.11-1.109 1.11-2.77 0-3.878L23.868 20.015z" class="layer"/></svg></button> 2356 </div> 2357 <div class="cart-popup-item"> 2358 <div class="cart-popup-item__image-wrapper hide" data-cart-popup-image-wrapper data-image-loading-animation></div> 2359 <div class="cart-popup-item__description"> 2360 <div> 2361 <h3 class="cart-popup-item__title" data-cart-popup-title></h3> 2362 <ul class="product-details" aria-label="Product details" data-cart-popup-product-details></ul> 2363 <span class="selling-plan-details"></span> 2364</div> 2365 <div class="cart-popup-item__quantity"> 2366 <span class="visually-hidden" data-cart-popup-quantity-label></span> 2367 <span aria-hidden="true">Qty:</span> 2368 <span aria-hidden="true" data-cart-popup-quantity></span> 2369 </div> 2370 </div> 2371 </div> 2372 2373 <a href="/cart" class="cart-popup__cta-link btn btn--secondary-accent"> 2374 View cart (<span data-cart-popup-cart-quantity></span>) 2375 </a> 2376 2377 <div class="cart-popup__dismiss"> 2378 <button class="cart-popup__dismiss-button text-link text-link--accent" data-cart-popup-dismiss> 2379 Continue shopping 2380 </button> 2381 </div> 2382 </div> 2383</div> 2384 2385<div id="shopify-section-header" class="shopify-section"> 2386 2387<div id="SearchDrawer" class="search-bar drawer drawer--top critical-hidden" role="dialog" aria-modal="true" aria-label="Search" data-predictive-search-drawer> 2388 <div class="search-bar__interior"> 2389 <div class="search-form__container" data-search-form-container> 2390 <form class="search-form search-bar__form" action="/search" method="get" role="search"> 2391 <div class="search-form__input-wrapper"> 2392 <input 2393 type="text" 2394 name="q" 2395 placeholder="Search" 2396 role="combobox" 2397 aria-autocomplete="list" 2398 aria-owns="predictive-search-results" 2399 aria-expanded="false" 2400 aria-label="Search" 2401 aria-haspopup="listbox" 2402 class="search-form__input search-bar__input" 2403 data-predictive-search-drawer-input 2404 /> 2405 <input type="hidden" name="options[prefix]" value="last" aria-hidden="true" /> 2406 <div class="predictive-search-wrapper predictive-search-wrapper--drawer" data-predictive-search-mount="drawer"></div> 2407 </div> 2408 2409 <button class="search-bar__submit search-form__submit" 2410 type="submit" 2411 data-search-form-submit> 2412 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-search" viewBox="0 0 37 40"><path d="M35.6 36l-9.8-9.8c4.1-5.4 3.6-13.2-1.3-18.1-5.4-5.4-14.2-5.4-19.7 0-5.4 5.4-5.4 14.2 0 19.7 2.6 2.6 6.1 4.1 9.8 4.1 3 0 5.9-1 8.3-2.8l9.8 9.8c.4.4.9.6 1.4.6s1-.2 1.4-.6c.9-.9.9-2.1.1-2.9zm-20.9-8.2c-2.6 0-5.1-1-7-2.9-3.9-3.9-3.9-10.1 0-14C9.6 9 12.2 8 14.7 8s5.1 1 7 2.9c3.9 3.9 3.9 10.1 0 14-1.9 1.9-4.4 2.9-7 2.9z"/></svg>
2413 <span class="icon__fallback-text">Submit</span> 2414 </button> 2415 </form> 2416 2417 <div class="search-bar__actions"> 2418 <button type="button" class="btn--link search-bar__close js-drawer-close"> 2419 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 40 40"><path d="M23.868 20.015L39.117 4.78c1.11-1.108 1.11-2.77 0-3.877-1.109-1.108-2.773-1.108-3.882 0L19.986 16.137 4.737.904C3.628-.204 1.965-.204.856.904c-1.11 1.108-1.11 2.77 0 3.877l15.249 15.234L.855 35.248c-1.108 1.108-1.108 2.77 0 3.877.555.554 1.248.831 1.942.831s1.386-.277 1.94-.83l15.25-15.234 15.248 15.233c.555.554 1.248.831 1.941.831s1.387-.277 1.941-.83c1.11-1.109 1.11-2.77 0-3.878L23.868 20.015z" class="layer"/></svg> 2420 <span class="icon__fallback-text">Close search</span> 2421 </button> 2422 </div> 2423 </div> 2424 </div> 2425</div> 2426 2427 2428<div data-section-id="header" data-section-type="header-section" data-header-section> 2429 2430 2431 <header class="site-header border-bottom logo--left" role="banner"> 2432 <div class="grid grid--no-gutters grid--table site-header__mobile-nav"> 2433 2434 2435 <div class="grid__item medium-up--one-quarter logo-align--left"> 2436 2437 2438 <div class="h2 site-header__logo"> 2439 2440 2441<a href="/" class="site-header__logo-image" data-image-loading-animation> 2442 2443 <img class="lazyload js" 2444 src="//safetracksgpsshop.ca/cdn/shop/files/BB_STGPS_LOGO_1_300x300.png?v=1786554549" 2445 data-src="//safetracksgpsshop.ca/cdn/shop/files/BB_STGPS_LOGO_1_{width}x.png?v=1786554549" 2446 data-widths="[180, 360, 540, 720, 900, 1080, 1296, 1512, 1728, 2048]" 2447 data-aspectratio="1.6292352371732817" 2448 data-sizes="auto" 2449 alt="SafeTracksGPS" 2450 style="max-width: 175px"> 2451 <noscript> 2452 2453 <img src="//safetracksgpsshop.ca/cdn/shop/files/BB_STGPS_LOGO_1_175x.png?v=1786554549" 2454 srcset="//safetracksgpsshop.ca/cdn/shop/files/BB_STGPS_LOGO_1_175x.png?v=1786554549 1x, //safetracksgpsshop.ca/cdn/shop/files/[email protected]?v=1786554549 2x" 2455 alt="SafeTracksGPS" 2456 style="max-width: 175px;"> 2457 </noscript> 2458 </a> 2459 2460 2461 </div> 2462 2463 </div> 2464 2465 2466 <nav class="grid__item medium-up--one-half small--hide" id="AccessibleNav" role="navigation"> 2467 2468<ul class="site-nav list--inline" id="SiteNav"> 2469 2470 2471 2472 2473 2474 <li > 2475 <a href="https://www.safetracksgpswellness.ca/" 2476 class="site-nav__link site-nav__link--main" 2477 2478 > 2479 <span class="site-nav__label">Back to SafeTracks GPS Wellness</span> 2480 </a> 2481 </li> 2482 2483 2484 2485 2486 2487 2488 <li class="site-nav--has-dropdown" data-has-dropdowns> 2489 <button class="site-nav__link site-nav__link--main site-nav__link--button" type="button" aria-expanded="false" aria-controls="SiteNavLabel-all-products"> 2490 <span class="site-nav__label">All Products</span><svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-down" viewBox="0 0 9 9"><path d="M8.542 2.558a.625.625 0 0 1 0 .884l-3.6 3.6a.626.626 0 0 1-.884 0l-3.6-3.6a.625.625 0 1 1 .884-.884L4.5 5.716l3.158-3.158a.625.625 0 0 1 .884 0z" fill="#fff"/></svg> 2491 </button> 2492 2493 <div class="site-nav__dropdown critical-hidden" id="SiteNavLabel-all-products"> 2494 2495 <ul> 2496 2497 <li> 2498 <a href="/products/prime-mobile-r4-pendant" 2499 class="site-nav__link site-nav__child-link" 2500 2501 > 2502 <span class="site-nav__label">Prime Mobile R4</span> 2503 </a> 2504 </li> 2505 2506 <li> 2507 <a href="/products/safetracks%E2%84%A2-theoracare-wrist-watch" 2508 class="site-nav__link site-nav__child-link site-nav__link--last" 2509 2510 >
2511 <span class="site-nav__label">Theora Connect⢠</span> 2512 </a> 2513 </li> 2514 2515 </ul> 2516 2517 </div> 2518 </li> 2519 2520 2521 2522 2523 2524 2525 <li class="site-nav--has-dropdown" data-has-dropdowns> 2526 <button class="site-nav__link site-nav__link--main site-nav__link--button" type="button" aria-expanded="false" aria-controls="SiteNavLabel-accessories"> 2527 <span class="site-nav__label">Accessories</span><svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-down" viewBox="0 0 9 9"><path d="M8.542 2.558a.625.625 0 0 1 0 .884l-3.6 3.6a.626.626 0 0 1-.884 0l-3.6-3.6a.625.625 0 1 1 .884-.884L4.5 5.716l3.158-3.158a.625.625 0 0 1 .884 0z" fill="#fff"/></svg> 2528 </button> 2529 2530 <div class="site-nav__dropdown critical-hidden" id="SiteNavLabel-accessories"> 2531 2532 <ul> 2533 2534 <li> 2535 <a href="/products/blue-beacon" 2536 class="site-nav__link site-nav__child-link" 2537 2538 > 2539 <span class="site-nav__label">SafeTracks Blue Beacon</span> 2540 </a> 2541 </li> 2542 2543 <li> 2544 <a href="/products/prime-mobile-charging-base" 2545 class="site-nav__link site-nav__child-link" 2546 2547 > 2548 <span class="site-nav__label">Prime Mobile Charging Base</span> 2549 </a> 2550 </li> 2551 2552 <li> 2553 <a href="/products/prime-mobile-lanyard" 2554 class="site-nav__link site-nav__child-link" 2555 2556 > 2557 <span class="site-nav__label">Prime Mobile Lanyard</span> 2558 </a> 2559 </li> 2560 2561 <li> 2562 <a href="/products/prime-mobile-belt-clip" 2563 class="site-nav__link site-nav__child-link" 2564 2565 > 2566 <span class="site-nav__label">Prime Mobile Belt Clip</span> 2567 </a> 2568 </li> 2569 2570 <li> 2571 <a href="/products/prime-mobile-wristband" 2572 class="site-nav__link site-nav__child-link" 2573 2574 > 2575 <span class="site-nav__label">Prime Mobile Wristband</span> 2576 </a> 2577 </li> 2578 2579 <li> 2580 <a href="/products/prime-mobile-r4-magnetic-charging-cable" 2581 class="site-nav__link site-nav__child-link" 2582 2583 > 2584 <span class="site-nav__label">Prime Mobile R4 Magnetic Charging Cable</span> 2585 </a> 2586 </li> 2587 2588 <li> 2589 <a href="/products/locking-clasp" 2590 class="site-nav__link site-nav__child-link site-nav__link--last" 2591 2592 > 2593 <span class="site-nav__label">Locking Clasp</span> 2594 </a> 2595 </li> 2596 2597 </ul> 2598 2599 </div> 2600 </li> 2601 2602 2603 2604 2605 2606 2607 <li class="site-nav--has-dropdown" data-has-dropdowns> 2608 <button class="site-nav__link site-nav__link--main site-nav__link--button" type="button" aria-expanded="false" aria-controls="SiteNavLabel-service-subscriptions"> 2609 <span class="site-nav__label">Service Subscriptions</span><svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-down" viewBox="0 0 9 9"><path d="M8.542 2.558a.625.625 0 0 1 0 .884l-3.6 3.6a.626.626 0 0 1-.884 0l-3.6-3.6a.625.625 0 1 1 .884-.884L4.5 5.716l3.158-3.158a.625.625 0 0 1 .884 0z" fill="#fff"/></svg> 2610 </button> 2611 2612 <div class="site-nav__dropdown critical-hidden" id="SiteNavLabel-service-subscriptions"> 2613 2614 <ul> 2615 2616 <li> 2617 <a href="/products/copy-of-monthly-subscription-msf" 2618 class="site-nav__link site-nav__child-link" 2619 2620 >
2621 <span class="site-nav__label">Monthly Family Monitored</span> 2622 </a> 2623 </li> 2624 2625 <li> 2626 <a href="/products/copy-of-monthly-subscription-911-monitored-msf" 2627 class="site-nav__link site-nav__child-link" 2628 2629 > 2630 <span class="site-nav__label">Monthly 911 Monitored</span> 2631 </a> 2632 </li> 2633 2634 <li> 2635 <a href="/products/yearly-subscription-family-monitored-msf" 2636 class="site-nav__link site-nav__child-link" 2637 2638 > 2639 <span class="site-nav__label">Yearly Family Monitored</span> 2640 </a> 2641 </li> 2642 2643 <li> 2644 <a href="/products/yearly-subscription-n911-monitored-msf" 2645 class="site-nav__link site-nav__child-link" 2646 2647 > 2648 <span class="site-nav__label">Yearly N911 Monitored</span> 2649 </a> 2650 </li> 2651 2652 <li> 2653 <a href="/products/theora-smart-fall-detection%E2%84%A2" 2654 class="site-nav__link site-nav__child-link site-nav__link--last" 2655 2656 > 2657 <span class="site-nav__label">Fall Detection (Optional)</span> 2658 </a> 2659 </li> 2660 2661 </ul> 2662 2663 </div> 2664 </li> 2665 2666 2667</ul> 2668 2669 </nav> 2670 2671 2672 <div class="grid__item medium-up--one-quarter text-right site-header__icons site-header__icons--plus"> 2673 <div class="site-header__icons-wrapper"> 2674 2675 <button type="button" class="btn--link site-header__icon site-header__search-toggle js-drawer-open-top" data-predictive-search-open-drawer> 2676 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-search" viewBox="0 0 37 40"><path d="M35.6 36l-9.8-9.8c4.1-5.4 3.6-13.2-1.3-18.1-5.4-5.4-14.2-5.4-19.7 0-5.4 5.4-5.4 14.2 0 19.7 2.6 2.6 6.1 4.1 9.8 4.1 3 0 5.9-1 8.3-2.8l9.8 9.8c.4.4.9.6 1.4.6s1-.2 1.4-.6c.9-.9.9-2.1.1-2.9zm-20.9-8.2c-2.6 0-5.1-1-7-2.9-3.9-3.9-3.9-10.1 0-14C9.6 9 12.2 8 14.7 8s5.1 1 7 2.9c3.9 3.9 3.9 10.1 0 14-1.9 1.9-4.4 2.9-7 2.9z"/></svg> 2677 <span class="icon__fallback-text">Search</span> 2678 </button> 2679 2680 2681 2682 <a href="https://safetracksgpsshop.ca/customer_authentication/redirect?locale=en®ion_country=US" class="site-header__icon site-header__account"> 2683 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-login" viewBox="0 0 28.33 37.68"><path d="M14.17 14.9a7.45 7.45 0 1 0-7.5-7.45 7.46 7.46 0 0 0 7.5 7.45zm0-10.91a3.45 3.45 0 1 1-3.5 3.46A3.46 3.46 0 0 1 14.17 4zM14.17 16.47A14.18 14.18 0 0 0 0 30.68c0 1.41.66 4 5.11 5.66a27.17 27.17 0 0 0 9.06 1.34c6.54 0 14.17-1.84 14.17-7a14.18 14.18 0 0 0-14.17-14.21zm0 17.21c-6.3 0-10.17-1.77-10.17-3a10.17 10.17 0 1 1 20.33 0c.01 1.23-3.86 3-10.16 3z"/></svg> 2684 <span class="icon__fallback-text">Log in</span> 2685 </a> 2686 2687 2688 2689 <a href="/cart" class="site-header__icon site-header__cart"> 2690 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-cart" viewBox="0 0 37 40"><path d="M36.5 34.8L33.3 8h-5.9C26.7 3.9 23 .8 18.5.8S10.3 3.9 9.6 8H3.7L.5 34.8c-.2 1.5.4 2.4.9 3 .5.5 1.4 1.2 3.1 1.2h28c1.3 0 2.4-.4 3.1-1.3.7-.7 1-1.8.9-2.9zm-18-30c2.2 0 4.1 1.4 4.7 3.2h-9.5c.7-1.9 2.6-3.2 4.8-3.2zM4.5 35l2.8-23h2.2v3c0 1.1.9 2 2 2s2-.9 2-2v-3h10v3c0 1.1.9 2 2 2s2-.9 2-2v-3h2.2l2.8 23h-28z"/></svg> 2691 <span class="icon__fallback-text">Cart</span> 2692 <div id="CartCount" class="site-header__cart-count hide critical-hidden" data-cart-count-bubble> 2693 <span data-cart-count>0</span> 2694 <span class="icon__fallback-text medium-up--hide">items</span> 2695 </div> 2696 </a> 2697 2698 2699 <button type="button" class="btn--link site-header__icon site-header__menu js-mobile-nav-toggle mobile-nav--open" aria-controls="MobileNav" aria-expanded="false" aria-label="Menu"> 2700 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-hamburger" viewBox="0 0 37 40"><path d="M33.5 25h-30c-1.1 0-2-.9-2-2s.9-2 2-2h30c1.1 0 2 .9 2 2s-.9 2-2 2zm0-11.5h-30c-1.1 0-2-.9-2-2s.9-2 2-2h30c1.1 0 2 .9 2 2s-.9 2-2 2zm0 23h-30c-1.1 0-2-.9-2-2s.9-2 2-2h30c1.1 0 2 .9 2 2s-.9 2-2 2z"/></svg> 2701 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-close" viewBox="0 0 40 40"><path d="M23.868 20.015L39.117 4.78c1.11-1.108 1.11-2.77 0-3.877-1.109-1.108-2.773
2701-1.108-3.882 0L19.986 16.137 4.737.904C3.628-.204 1.965-.204.856.904c-1.11 1.108-1.11 2.77 0 3.877l15.249 15.234L.855 35.248c-1.108 1.108-1.108 2.77 0 3.877.555.554 1.248.831 1.942.831s1.386-.277 1.94-.83l15.25-15.234 15.248 15.233c.555.554 1.248.831 1.941.831s1.387-.277 1.941-.83c1.11-1.109 1.11-2.77 0-3.878L23.868 20.015z" class="layer"/></svg> 2702 </button> 2703 2704 </div> 2705 2706 </div> 2707 </div> 2708 2709 <nav class="mobile-nav-wrapper medium-up--hide critical-hidden" role="navigation"> 2710 <ul id="MobileNav" class="mobile-nav"> 2711 2712<li class="mobile-nav__item border-bottom"> 2713 2714 <a href="https://www.safetracksgpswellness.ca/" 2715 class="mobile-nav__link" 2716 2717 > 2718 <span class="mobile-nav__label">Back to SafeTracks GPS Wellness</span> 2719 </a> 2720 2721 </li> 2722 2723<li class="mobile-nav__item border-bottom"> 2724 2725 2726 <button type="button" class="btn--link js-toggle-submenu mobile-nav__link" data-target="all-products-2" data-level="1" aria-expanded="false"> 2727 <span class="mobile-nav__label">All Products</span> 2728 <div class="mobile-nav__icon"> 2729 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-right" viewBox="0 0 14 14"><path d="M3.871.604c.44-.439 1.152-.439 1.591 0l5.515 5.515s-.049-.049.003.004l.082.08c.439.44.44 1.153 0 1.592l-5.6 5.6a1.125 1.125 0 0 1-1.59-1.59L8.675 7 3.87 2.195a1.125 1.125 0 0 1 0-1.59z" fill="#fff"/></svg> 2730 </div> 2731 </button> 2732 <ul class="mobile-nav__dropdown" data-parent="all-products-2" data-level="2"> 2733 <li class="visually-hidden" tabindex="-1" data-menu-title="2">All Products Menu</li> 2734 <li class="mobile-nav__item border-bottom"> 2735 <div class="mobile-nav__table"> 2736 <div class="mobile-nav__table-cell mobile-nav__return"> 2737 <button class="btn--link js-toggle-submenu mobile-nav__return-btn" type="button" aria-expanded="true" aria-label="All Products"> 2738 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-left" viewBox="0 0 14 14"><path d="M10.129.604a1.125 1.125 0 0 0-1.591 0L3.023 6.12s.049-.049-.003.004l-.082.08c-.439.44-.44 1.153 0 1.592l5.6 5.6a1.125 1.125 0 0 0 1.59-1.59L5.325 7l4.805-4.805c.44-.439.44-1.151 0-1.59z" fill="#fff"/></svg> 2739 </button> 2740 </div> 2741 <span class="mobile-nav__sublist-link mobile-nav__sublist-header mobile-nav__sublist-header--main-nav-parent"> 2742 <span class="mobile-nav__label">All Products</span> 2743 </span> 2744 </div> 2745 </li> 2746 2747 2748 <li class="mobile-nav__item border-bottom"> 2749 2750 <a href="/products/prime-mobile-r4-pendant" 2751 class="mobile-nav__sublist-link" 2752 2753 > 2754 <span class="mobile-nav__label">Prime Mobile R4</span> 2755 </a> 2756 2757 </li> 2758 2759 <li class="mobile-nav__item"> 2760 2761 <a href="/products/safetracks%E2%84%A2-theoracare-wrist-watch" 2762 class="mobile-nav__sublist-link" 2763 2764 > 2765 <span class="mobile-nav__label">Theora Connect⢠</span> 2766 </a> 2767 2768 </li> 2769 2770 </ul> 2771 2772 </li> 2773 2774<li class="mobile-nav__item border-bottom"> 2775 2776 2777 <button type="button" class="btn--link js-toggle-submenu mobile-nav__link" data-target="accessories-3" data-level="1" aria-expanded="false"> 2778 <span class="mobile-nav__label">Accessories</span> 2779 <div class="mobile-nav__icon"> 2780 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-right" viewBox="0 0 14 14"><path d="M3.871.604c.44-.439 1.152-.439 1.591 0l5.515 5.515s-.049-.049.003.004l.082.08c.439.44.44 1.153 0 1.592l-5.6 5.6a1.125 1.125 0 0 1-1.59-1.59L8.675 7 3.87 2.195a1.125 1.125 0 0 1 0-1.59z" fill="#fff"/></svg> 2781 </div> 2782 </button> 2783 <ul class="mobile-nav__dropdown" data-parent="accessories-3" data-level="2"> 2784 <li class="visually-hidden" tabindex="-1" data-menu-title="2">Accessories Menu</li> 2785 <li class="mobile-nav__item border-bottom"> 2786 <div class="mobile-nav__table"> 2787 <div class="mobile-nav__table-cell mobile-nav__return"> 2788 <button class="btn--link js-toggle-submenu mobile-nav__return-btn" type="button" aria-expanded="true" aria-label="Accessories"> 2789 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-left" viewBox="0 0 14 14"><path d="M10.129.604a1.125 1.125 0 0 0-1.591 0L3.023 6.12s.049-.049-.003.004l-.082.08c-.439.44-.44 1.153 0 1.592l5.6 5.6a1.125 1.125 0 0 0 1.59-1.59L5.325 7l4.805-4.805c.44-.439.44-1.151 0-1.59z" fill="#fff"/></svg> 2790 </button> 2791 </div>
2792 <span class="mobile-nav__sublist-link mobile-nav__sublist-header mobile-nav__sublist-header--main-nav-parent"> 2793 <span class="mobile-nav__label">Accessories</span> 2794 </span> 2795 </div> 2796 </li> 2797 2798 2799 <li class="mobile-nav__item border-bottom"> 2800 2801 <a href="/products/blue-beacon" 2802 class="mobile-nav__sublist-link" 2803 2804 > 2805 <span class="mobile-nav__label">SafeTracks Blue Beacon</span> 2806 </a> 2807 2808 </li> 2809 2810 <li class="mobile-nav__item border-bottom"> 2811 2812 <a href="/products/prime-mobile-charging-base" 2813 class="mobile-nav__sublist-link" 2814 2815 > 2816 <span class="mobile-nav__label">Prime Mobile Charging Base</span> 2817 </a> 2818 2819 </li> 2820 2821 <li class="mobile-nav__item border-bottom"> 2822 2823 <a href="/products/prime-mobile-lanyard" 2824 class="mobile-nav__sublist-link" 2825 2826 > 2827 <span class="mobile-nav__label">Prime Mobile Lanyard</span> 2828 </a> 2829 2830 </li> 2831 2832 <li class="mobile-nav__item border-bottom"> 2833 2834 <a href="/products/prime-mobile-belt-clip" 2835 class="mobile-nav__sublist-link" 2836 2837 > 2838 <span class="mobile-nav__label">Prime Mobile Belt Clip</span> 2839 </a> 2840 2841 </li> 2842 2843 <li class="mobile-nav__item border-bottom"> 2844 2845 <a href="/products/prime-mobile-wristband" 2846 class="mobile-nav__sublist-link" 2847 2848 > 2849 <span class="mobile-nav__label">Prime Mobile Wristband</span> 2850 </a> 2851 2852 </li> 2853 2854 <li class="mobile-nav__item border-bottom"> 2855 2856 <a href="/products/prime-mobile-r4-magnetic-charging-cable" 2857 class="mobile-nav__sublist-link" 2858 2859 > 2860 <span class="mobile-nav__label">Prime Mobile R4 Magnetic Charging Cable</span> 2861 </a> 2862 2863 </li> 2864 2865 <li class="mobile-nav__item"> 2866 2867 <a href="/products/locking-clasp" 2868 class="mobile-nav__sublist-link" 2869 2870 > 2871 <span class="mobile-nav__label">Locking Clasp</span> 2872 </a> 2873 2874 </li> 2875 2876 </ul> 2877 2878 </li> 2879 2880<li class="mobile-nav__item"> 2881 2882 2883 <button type="button" class="btn--link js-toggle-submenu mobile-nav__link" data-target="service-subscriptions-4" data-level="1" aria-expanded="false"> 2884 <span class="mobile-nav__label">Service Subscriptions</span> 2885 <div class="mobile-nav__icon"> 2886 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-right" viewBox="0 0 14 14"><path d="M3.871.604c.44-.439 1.152-.439 1.591 0l5.515 5.515s-.049-.049.003.004l.082.08c.439.44.44 1.153 0 1.592l-5.6 5.6a1.125 1.125 0 0 1-1.59-1.59L8.675 7 3.87 2.195a1.125 1.125 0 0 1 0-1.59z" fill="#fff"/></svg> 2887 </div> 2888 </button> 2889 <ul class="mobile-nav__dropdown" data-parent="service-subscriptions-4" data-level="2"> 2890 <li class="visually-hidden" tabindex="-1" data-menu-title="2">Service Subscriptions Menu</li> 2891 <li class="mobile-nav__item border-bottom"> 2892 <div class="mobile-nav__table"> 2893 <div class="mobile-nav__table-cell mobile-nav__return"> 2894 <button class="btn--link js-toggle-submenu mobile-nav__return-btn" type="button" aria-expanded="true" aria-label="Service Subscriptions"> 2895 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-left" viewBox="0 0 14 14"><path d="M10.129.604a1.125 1.125 0 0 0-1.591 0L3.023 6.12s.049-.049-.003.004l-.082.08c-.439.44-.44 1.153 0 1.592l5.6 5.6a1.125 1.125 0 0 0 1.59-1.59L5.325 7l4.805-4.805c.44-.439.44-1.151 0-1.59z" fill="#fff"/></svg> 2896 </button> 2897 </div>
2898 <span class="mobile-nav__sublist-link mobile-nav__sublist-header mobile-nav__sublist-header--main-nav-parent"> 2899 <span class="mobile-nav__label">Service Subscriptions</span> 2900 </span> 2901 </div> 2902 </li> 2903 2904 2905 <li class="mobile-nav__item border-bottom"> 2906 2907 <a href="/products/copy-of-monthly-subscription-msf" 2908 class="mobile-nav__sublist-link" 2909 2910 > 2911 <span class="mobile-nav__label">Monthly Family Monitored</span> 2912 </a> 2913 2914 </li> 2915 2916 <li class="mobile-nav__item border-bottom"> 2917 2918 <a href="/products/copy-of-monthly-subscription-911-monitored-msf" 2919 class="mobile-nav__sublist-link" 2920 2921 > 2922 <span class="mobile-nav__label">Monthly 911 Monitored</span> 2923 </a> 2924 2925 </li> 2926 2927 <li class="mobile-nav__item border-bottom"> 2928 2929 <a href="/products/yearly-subscription-family-monitored-msf" 2930 class="mobile-nav__sublist-link" 2931 2932 > 2933 <span class="mobile-nav__label">Yearly Family Monitored</span> 2934 </a> 2935 2936 </li> 2937 2938 <li class="mobile-nav__item border-bottom"> 2939 2940 <a href="/products/yearly-subscription-n911-monitored-msf" 2941 class="mobile-nav__sublist-link" 2942 2943 > 2944 <span class="mobile-nav__label">Yearly N911 Monitored</span> 2945 </a> 2946 2947 </li> 2948 2949 <li class="mobile-nav__item"> 2950 2951 <a href="/products/theora-smart-fall-detection%E2%84%A2" 2952 class="mobile-nav__sublist-link" 2953 2954 > 2955 <span class="mobile-nav__label">Fall Detection (Optional)</span> 2956 </a> 2957 2958 </li> 2959 2960 </ul> 2961 2962 </li> 2963 2964 </ul> 2965 </nav> 2966 </header> 2967 2968 2969</div> 2970 2971 2972
2973<script type="application/ld+json"> 2974{ 2975 "@context": "http://schema.org", 2976 "@type": "Organization", 2977 "name": "SafeTracksGPS", 2978 2979 2980 "logo": "https:\/\/safetracksgpsshop.ca\/cdn\/shop\/files\/BB_STGPS_LOGO_1_1683x.png?v=1786554549", 2981 2982 "sameAs": [ 2983 "", 2984 "", 2985 "", 2986 "", 2987 "", 2988 "", 2989 "", 2990 "" 2991 ], 2992 "url": "https:\/\/safetracksgpsshop.ca" 2993} 2994</script>
2994 2995 2996 2997 2998 2999</div> 3000 3001 <div class="page-container drawer-page-content" id="PageContainer"> 3002 3003 <main class="main-content js-focus-hidden" id="MainContent" role="main" tabindex="-1"> 3004 3005 3006<div id="shopify-section-cart-template" class="shopify-section"><div class="page-width" data-section-id="cart-template" data-section-type="cart-template" data-ajax-enabled="true"> 3007 3008 <div class="hide" data-cart-wrapper> 3009 <div class="cart-header"> 3010 <h1 class="cart-header__title">Your cart</h1> 3011 <a href="/collections/all" class="text-link text-link--accent"> 3012 Continue shopping 3013 </a> 3014 </div> 3015 3016 <form action="/cart" method="post" novalidate class="cart"> 3017 <table> 3018 <thead class="cart__row cart__row--heading"> 3019 <th scope="col">Product</th> 3020 <th class="text-right" scope="col">Price</th> 3021 <th class="text-right small--hide" scope="col">Quantity</th> 3022 <th class="text-right small--hide" scope="col">Total</th> 3023 </thead> 3024 <tbody data-cart-line-items></tbody> 3025 </table> 3026 3027 <div class="cart__footer"> 3028 <div class="grid"><div class="grid__item text-right small--text-center"><div class="hide" data-cart-discount-wrapper> 3029 <div class="order-discount-card-wrapper" data-cart-discount><span class="order-discount order-discount--title order-discount--cart"> 3030 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-saletag"><path d="M10 3a1 1 0 1 1 0-2 1 1 0 0 1 0 2zm0-3H7a1 1 0 0 0-.71.29l-6 6a1 1 0 0 0 0 1.42l4 4a1 1 0 0 0 1.42 0c.19-.2 5.8-5.81 6-6A1 1 0 0 0 12 5V2a2 2 0 0 0-2-2z" fill="#231F20"/></svg><span class="visually-hidden">Discount:</span><span data-cart-discount-title></span> 3031 </span> 3032 <span class="order-discount order-discount--cart order-discount--cart-total"> 3033 -<span data-cart-discount-amount></span> 3034 </span></div> 3035 </div> 3036 3037 <div class="cart-subtotal"> 3038 <span class="cart-subtotal__title">Subtotal</span> 3039 <span class="cart-subtotal__price" data-cart-subtotal>$0.00 CAD</span> 3040 </div><div class="cart__shipping rte">Taxes and shipping calculated at checkout 3041</div> 3042 <div class="cart__buttons-container"> 3043 <div class="cart__submit-controls"><input type="submit" name="checkout" 3044 class="cart__submit btn btn--small-wide" 3045 value="Check out"> 3046 </div> 3047 3048 <div class="cart__error-message-wrapper hide" role="alert" data-cart-error-message-wrapper> 3049 <span class="visually-hidden">Error </span> 3050 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-error" viewBox="0 0 14 14"><g fill="none" fill-rule="evenodd"><path d="M7 0a7 7 0 0 1 7 7 7 7 0 1 1-7-7z"/><path class="icon-error__symbol" d="M6.328 8.396l-.252-5.4h1.836l-.24 5.4H6.328zM6.04 10.16c0-.528.432-.972.96-.972s.972.444.972.972c0 .516-.444.96-.972.96a.97.97 0 0 1-.96-.96z"/></g></svg> 3051 <span class="cart__error-message" data-cart-error-message></span> 3052 </div><div class="additional-checkout-buttons"><div class="dynamic-checkout__content" id="dynamic-checkout-cart" data-shopify="dynamic-checkout-cart"> <shopify-accelerated-checkout-cart wallet-configs="[{"supports_subs":true,"supports_def_opts":false,"name":"shop_pay","wallet_params":{"shopId":26810187954,"merchantName":"SafeTracksGPS","personalized":true}}]" access-token="53ef6ab57106ad9d432ff5264afe3be2" buyer-country="US" buyer-locale="en" buyer-currency="CAD" shop-id="26810187954" cart-id="39efafab9bb75a56e1f8883656f98eaf" enabled-flags="["1172c16a","a1d1f9a1","f5afabb3","370070f3"]" > <div class="wallet-button-wrapper"> <ul class='wallet-cart-grid wallet-cart-grid--skeleton' role="list" data-shopify-buttoncontainer="true"> <li data-testid='grid-cell' class='wallet-cart-button-container'><div class='wallet-cart-button wallet-cart-button__skeleton' role='button' disabled aria-hidden='true'> </div></li> </ul> </div> </shopify-accelerated-checkout-cart> </div></div></div> 3053 </div> 3054 </div> 3055 </div> 3056 </form> 3057 3058 <p class="visually-hidden" data-cart-status
3059 aria-live="polite" 3060 role="status" 3061 ></p> 3062 </div> 3063 3064 <div class="empty-page-content text-center" data-empty-page-content> 3065 <h1>Your cart</h1> 3066 <p class="cart--empty-message">Your cart is currently empty.</p> 3067 <div class="cookie-message"> 3068 <p>Enable cookies to use the shopping cart</p> 3069 </div> 3070 <a href="/" class="btn btn--has-icon-after cart__continue-btn">Continue shopping<svg aria-hidden="true" focusable="false" role="presentation" class="icon icon--wide icon-arrow-right" viewBox="0 0 20 8"><path d="M15.186.445c.865.944 1.614 1.662 2.246 2.154.631.491 1.227.857 1.787 1.098v.44a9.933 9.933 0 0 0-1.875 1.196c-.606.485-1.328 1.196-2.168 2.134h-.752c.612-1.309 1.253-2.315 1.924-3.018H.77v-.986h15.577c-.495-.632-.84-1.1-1.035-1.406-.196-.306-.486-.843-.87-1.612h.743z" fill="#000" fill-rule="evenodd"/></svg></a> 3071 </div> 3072</div> 3073 3074 3075 3076 3077</div> 3078 3079 3080 </main> 3081 3082 <div id="shopify-section-footer" class="shopify-section"> 3083<style> 3084 .site-footer__hr { 3085 border-bottom: 1px solid #191919; 3086 } 3087 3088 .site-footer p, 3089 .site-footer__linklist-item a, 3090 .site-footer__rte a, 3091 .site-footer h4, 3092 .site-footer small, 3093 .site-footer__copyright-content a, 3094 .site-footer__newsletter-error, 3095 .site-footer__social-icons .social-icons__link { 3096 color: #ebebeb; 3097 } 3098 3099 .site-footer { 3100 color: #ebebeb; 3101 background-color: #333232; 3102 } 3103 3104 .site-footer__rte a { 3105 border-bottom: 1px solid #ebebeb; 3106 } 3107 3108 .site-footer__rte a:hover, 3109 .site-footer__linklist-item a:hover, 3110 .site-footer__copyright-content a:hover { 3111 color: #d2d2d2; 3112 border-bottom: 1px solid #d2d2d2; 3113 } 3114 3115 .site-footer__social-icons .social-icons__link:hover { 3116 color: #d2d2d2; 3117 } 3118</style><footer class="site-footer critical-hidden" role="contentinfo" data-section-id="footer" data-section-type="footer-section"> 3119 <div class="page-width"> 3120 <div class="site-footer__content"></div> 3121 </div> 3122 3123 <hr class="site-footer__hr"><div class="page-width"> 3124 <div class="grid grid--no-gutters small--text-center grid--footer-float-right"><div class="grid__item small--hide one-half "></div><div class="grid__item small--one-whole site-footer-item-tall"><div class="small--hide site-footer-item-align-right "> 3125 <small class="site-footer__copyright-content">© 2026, <a href="/" title="">SafeTracksGPS</a></small> 3126 <small class="site-footer__copyright-content site-footer__copyright-content-powered-by"><a target="_blank" rel="nofollow" href="https://www.shopify.com?utm_campaign=poweredby&utm_medium=shopify&utm_source=onlinestore">Powered by Shopify</a></small> 3127 </div></div><div class="grid__item medium-up--hide one-half small--one-whole"></div><div class="grid__item small--one-whole medium-up--hide site-footer-item-align-right"> 3128 <small class="site-footer__copyright-content">© 2026, <a href="/" title="">SafeTracksGPS</a></small> 3129 <small class="site-footer__copyright-content site-footer__copyright-content--powered-by"><a target="_blank" rel="nofollow" href="https://www.shopify.com?utm_campaign=poweredby&utm_medium=shopify&utm_source=onlinestore">Powered by Shopify</a></small> 3130 </div> 3131 </div> 3132 </div> 3133</footer> 3134 3135 3136 3137 3138</div> 3139 3140 <div id="slideshow-info" class="visually-hidden" aria-hidden="true">
3140Use left/right arrows to navigate the slideshow or swipe left/right if using a mobile device</div> 3141 3142 </div> 3143 3144 <ul hidden> 3145 <li id="a11y-refresh-page-message">Choosing a selection results in a full page refresh.</li> 3146 <li id="a11y-selection-message">Press the space key then arrow keys to make a selection.</li> 3147 </ul>
3148<script src="https://cdn.shopify.com/storefront/standard-actions.js" type="module" data-source-attribution="shopify.standard_actions"></script>
3148 3149<shopify-store store-domain="https://safetracksgpsshop.ca" country="US" language="en"></shopify-store> 3150<shopify-chat></shopify-chat> 3151</body> 3152</html> 3153 3154.grid-view-item__image-wrapper div { 3155 padding-top: 100% !important; 3156} 3157.grid-view-item__image-wrapper .grid-view-item__image { 3158height: 100%; 3159 object-fit: contain; 3160}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.