@revley/sandbox-checkout-package 0.1.997
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/cjs/index.cjs +1 -0
- package/dist/esm/index.d.ts +126 -0
- package/dist/esm/index.js +1 -0
- package/dist/iife/index.global.js +1 -0
- package/package.json +50 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var R=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var A=(l,a,g,_)=>{if(a&&typeof a=="object"||typeof a=="function")for(let c of U(a))!x.call(l,c)&&c!==g&&R(l,c,{get:()=>a[c],enumerable:!(_=E(a,c))||_.enumerable});return l};var I=l=>A(R({},"__esModule",{value:!0}),l);var T={};module.exports=I(T);window.initRevleyCheckout=(l,a)=>{var v;if(window.__checkoutInterceptInstalled)return;window.__checkoutInterceptInstalled=!0;let g=[/^\/(?:cart\/)?checkout(?:[?#]|$)/i,/^\/checkouts\/[a-z0-9]{32}(?:[\/?#]|$)/i],_=!1,c=(...t)=>_?console.debug("[checkout-intercept]",...t):void 0,k=t=>t.replace(/\/+$/,""),L=t=>t.endsWith(".myshopify.com")||t===location.hostname;function P(t,n=location.origin){try{return t instanceof URL?t:new URL(String(t),n)}catch{return null}}function d(t){let n=P(t);if(!n||!L(n.hostname))return!1;let i=k(n.pathname),e=g.some(r=>r.test(i));return e&&c("detected checkout-like URL:",String(n)),e}async function m(){let n=await(await fetch("/cart.js")).json(),i=n.discount_codes||[],e=(n.items||[]).map(o=>({variantId:o==null?void 0:o.variant_id,quantity:(o==null?void 0:o.quantity)||0,sellingPlanAllocation:(o==null?void 0:o.selling_plan_allocation)||null})).filter(o=>!!o.variantId&&o.quantity>0),r={},u=["_fbp","_fbc","_fbq","_ig_","_igbp","_igshid","_igsh","_ig_visitor_id","_gclid","_gcl_au","_gcl_aw","_gcl_dc","_gcl_gb","_ttp","_tt_enable_cookie","_scid","_sctr","_pin_unauth","_pin_id","_twitter_ads_id","_li_ss","_uetsid","_uetvid","_amzn","_amzn_ads_","_yclid","_ycl_","_rdt_uid","_quora_","_tb_","_ob_","_criteo_","_adobe_","_ttd_","_dv360_","_fbcv","_shopify_pixel_"],f=o=>u.some(p=>o===p||o.startsWith(p)||o.includes(p));document.cookie&&document.cookie.split(";").forEach(o=>{let p=o.trim();if(p){let[b,...S]=p.split("="),w=S.join("=");b&&w&&f(b)&&(r[b]=w)}});let h=await(await fetch(`${a}/checkout`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({discountCodes:i,variants:e,storeId:l,cookies:r})})).text();if(console.log("checkoutUrl",h),h)location.assign(h);else{console.error("No checkout ID received from backend");return}}let y=!1;function s(t){return y||!d(t)?!1:(y=!0,m(),!0)}if(window.__isCheckoutLike=d,window.__maybeRedirect=s,!((v=window.Shopify)!=null&&v.designMode)){{let t=window.location,n=t.assign.bind(t),i=t.replace.bind(t);try{Object.defineProperty(t,"assign",{value:e=>{s(e)||n(e)},writable:!0,configurable:!0}),Object.defineProperty(t,"replace",{value:e=>{s(e)||i(e)},writable:!0,configurable:!0})}catch(e){c("Could not override location methods, relying on Service Worker:",e)}}{let t=window.open;window.open=function(n,i,e){return n&&s(n)?null:t.call(window,n,i,e)}}{let t=history.pushState.bind(history),n=history.replaceState.bind(history);history.pushState=function(i,e,r){if(!(r!=null&&s(r)))return t(i,e,r)},history.replaceState=function(i,e,r){if(!(r!=null&&s(r)))return n(i,e,r)},addEventListener("popstate",()=>void s(location.href),!0)}{let t=n=>n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.button!==0;addEventListener("click",n=>{let i=n;if(i.defaultPrevented||t(i))return;let e=n.target;for(;e&&e.nodeType===1&&e.tagName!=="A";)e=e.parentElement;let r=e;!r||!r.href||d(r.href)&&(i.preventDefault(),i.stopPropagation(),m())},!0)}{let t=HTMLFormElement.prototype.submit;HTMLFormElement.prototype.submit=function(){try{let i=this.getAttribute("action")||"";if(s(i)||Array.from(this.elements).some(r=>(r==null?void 0:r.name)==="checkout")&&s("/checkout"))return}catch{}return t.call(this)},addEventListener("submit",n=>{try{let i=n.target,e=(i==null?void 0:i.getAttribute("action"))||"",r=Array.from((i==null?void 0:i.elements)||[]);(d(e)||r.some(u=>(u==null?void 0:u.name)==="checkout"))&&(n.preventDefault(),n.stopPropagation(),m())}catch{}},!0)}{let t=location.href;setInterval(()=>{location.href!==t&&(t=location.href,s(t))},250)}{let t=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(i,e,r,u,f){try{typeof e=="string"&&d(e)&&s(e)}catch{}return t.call(this,i,e,!!r,u,f)}}{let t=window.fetch.bind(window);window.fetch=function(i,e){try{let r=typeof i=="string"||i instanceof URL?String(i):i.url;r&&d(r)&&s(r)}catch{}return t(i,e)}}}};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
interface Window {
|
|
3
|
+
initRevleyCheckout: (storeId: string, checkoutHost: string) => void;
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
interface Cart {
|
|
8
|
+
token?: string;
|
|
9
|
+
note?: string;
|
|
10
|
+
attributes?: Attributes;
|
|
11
|
+
original_total_price?: number;
|
|
12
|
+
total_price?: number;
|
|
13
|
+
total_discount?: number;
|
|
14
|
+
total_weight?: number;
|
|
15
|
+
item_count?: number;
|
|
16
|
+
items?: Item[];
|
|
17
|
+
requires_shipping?: boolean;
|
|
18
|
+
currency?: string;
|
|
19
|
+
items_subtotal_price?: number;
|
|
20
|
+
cart_level_discount_applications?: any[];
|
|
21
|
+
discount_codes?: any[];
|
|
22
|
+
}
|
|
23
|
+
interface Attributes {
|
|
24
|
+
igId?: string;
|
|
25
|
+
aimPK?: string;
|
|
26
|
+
country?: string;
|
|
27
|
+
fbp?: string;
|
|
28
|
+
host?: string;
|
|
29
|
+
locale?: string;
|
|
30
|
+
sh?: string;
|
|
31
|
+
sw?: string;
|
|
32
|
+
ttp?: string;
|
|
33
|
+
igTestGroups?: string;
|
|
34
|
+
}
|
|
35
|
+
interface Item {
|
|
36
|
+
id?: number;
|
|
37
|
+
properties?: Properties;
|
|
38
|
+
quantity?: number;
|
|
39
|
+
variant_id?: number;
|
|
40
|
+
key?: string;
|
|
41
|
+
title?: string;
|
|
42
|
+
price?: number;
|
|
43
|
+
original_price?: number;
|
|
44
|
+
presentment_price?: number;
|
|
45
|
+
discounted_price?: number;
|
|
46
|
+
line_price?: number;
|
|
47
|
+
original_line_price?: number;
|
|
48
|
+
total_discount?: number;
|
|
49
|
+
discounts?: any[];
|
|
50
|
+
sku?: string;
|
|
51
|
+
grams?: number;
|
|
52
|
+
vendor?: string;
|
|
53
|
+
taxable?: boolean;
|
|
54
|
+
product_id?: number;
|
|
55
|
+
product_has_only_default_variant?: boolean;
|
|
56
|
+
gift_card?: boolean;
|
|
57
|
+
final_price?: number;
|
|
58
|
+
final_line_price?: number;
|
|
59
|
+
url?: string;
|
|
60
|
+
featured_image?: FeaturedImage;
|
|
61
|
+
image?: string;
|
|
62
|
+
handle?: string;
|
|
63
|
+
requires_shipping?: boolean;
|
|
64
|
+
product_type?: string;
|
|
65
|
+
product_title?: string;
|
|
66
|
+
product_description?: string;
|
|
67
|
+
variant_title?: string;
|
|
68
|
+
variant_options?: string[];
|
|
69
|
+
options_with_values?: OptionsWithValue[];
|
|
70
|
+
line_level_discount_allocations?: any[];
|
|
71
|
+
line_level_total_discount?: number;
|
|
72
|
+
quantity_rule?: QuantityRule;
|
|
73
|
+
has_components?: boolean;
|
|
74
|
+
selling_plan_allocation?: SellingPlanAllocation;
|
|
75
|
+
}
|
|
76
|
+
interface Properties {
|
|
77
|
+
}
|
|
78
|
+
interface FeaturedImage {
|
|
79
|
+
aspect_ratio?: number;
|
|
80
|
+
alt?: string;
|
|
81
|
+
height?: number;
|
|
82
|
+
url?: string;
|
|
83
|
+
width?: number;
|
|
84
|
+
}
|
|
85
|
+
interface OptionsWithValue {
|
|
86
|
+
name?: string;
|
|
87
|
+
value?: string;
|
|
88
|
+
}
|
|
89
|
+
interface QuantityRule {
|
|
90
|
+
min?: number;
|
|
91
|
+
max?: any;
|
|
92
|
+
increment?: number;
|
|
93
|
+
}
|
|
94
|
+
interface SellingPlanAllocation {
|
|
95
|
+
price_adjustments?: PriceAdjustment[];
|
|
96
|
+
price?: number;
|
|
97
|
+
compare_at_price?: number;
|
|
98
|
+
per_delivery_price?: number;
|
|
99
|
+
selling_plan?: SellingPlan;
|
|
100
|
+
}
|
|
101
|
+
interface PriceAdjustment {
|
|
102
|
+
position?: number;
|
|
103
|
+
price?: number;
|
|
104
|
+
}
|
|
105
|
+
interface SellingPlan {
|
|
106
|
+
id?: number;
|
|
107
|
+
name?: string;
|
|
108
|
+
description?: string;
|
|
109
|
+
options?: Option[];
|
|
110
|
+
recurring_deliveries?: boolean;
|
|
111
|
+
fixed_selling_plan?: boolean;
|
|
112
|
+
price_adjustments?: PriceAdjustment2[];
|
|
113
|
+
}
|
|
114
|
+
interface Option {
|
|
115
|
+
name?: string;
|
|
116
|
+
position?: number;
|
|
117
|
+
value?: string;
|
|
118
|
+
}
|
|
119
|
+
interface PriceAdjustment2 {
|
|
120
|
+
order_count?: number;
|
|
121
|
+
position?: number;
|
|
122
|
+
value_type?: string;
|
|
123
|
+
value?: number;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export type { Attributes, Cart, FeaturedImage, Item, Option, OptionsWithValue, PriceAdjustment, PriceAdjustment2, Properties, QuantityRule, SellingPlan, SellingPlanAllocation };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
window.initRevleyCheckout=(h,b)=>{if(window.__checkoutInterceptInstalled)return;window.__checkoutInterceptInstalled=!0;let y=[/^\/(?:cart\/)?checkout(?:[?#]|$)/i,/^\/checkouts\/[a-z0-9]{32}(?:[\/?#]|$)/i],v=!1,g=(...t)=>v?console.debug("[checkout-intercept]",...t):void 0,w=t=>t.replace(/\/+$/,""),R=t=>t.endsWith(".myshopify.com")||t===location.hostname;function k(t,n=location.origin){try{return t instanceof URL?t:new URL(String(t),n)}catch{return null}}function a(t){let n=k(t);if(!n||!R(n.hostname))return!1;let i=w(n.pathname),e=y.some(r=>r.test(i));return e&&g("detected checkout-like URL:",String(n)),e}async function u(){let n=await(await fetch("/cart.js")).json(),i=n.discount_codes||[],e=(n.items||[]).map(s=>({variantId:s?.variant_id,quantity:s?.quantity||0,sellingPlanAllocation:s?.selling_plan_allocation||null})).filter(s=>!!s.variantId&&s.quantity>0),r={},l=["_fbp","_fbc","_fbq","_ig_","_igbp","_igshid","_igsh","_ig_visitor_id","_gclid","_gcl_au","_gcl_aw","_gcl_dc","_gcl_gb","_ttp","_tt_enable_cookie","_scid","_sctr","_pin_unauth","_pin_id","_twitter_ads_id","_li_ss","_uetsid","_uetvid","_amzn","_amzn_ads_","_yclid","_ycl_","_rdt_uid","_quora_","_tb_","_ob_","_criteo_","_adobe_","_ttd_","_dv360_","_fbcv","_shopify_pixel_"],d=s=>l.some(c=>s===c||s.startsWith(c)||s.includes(c));document.cookie&&document.cookie.split(";").forEach(s=>{let c=s.trim();if(c){let[_,...L]=c.split("="),f=L.join("=");_&&f&&d(_)&&(r[_]=f)}});let p=await(await fetch(`${b}/checkout`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({discountCodes:i,variants:e,storeId:h,cookies:r})})).text();if(console.log("checkoutUrl",p),p)location.assign(p);else{console.error("No checkout ID received from backend");return}}let m=!1;function o(t){return m||!a(t)?!1:(m=!0,u(),!0)}if(window.__isCheckoutLike=a,window.__maybeRedirect=o,!window.Shopify?.designMode){{let t=window.location,n=t.assign.bind(t),i=t.replace.bind(t);try{Object.defineProperty(t,"assign",{value:e=>{o(e)||n(e)},writable:!0,configurable:!0}),Object.defineProperty(t,"replace",{value:e=>{o(e)||i(e)},writable:!0,configurable:!0})}catch(e){g("Could not override location methods, relying on Service Worker:",e)}}{let t=window.open;window.open=function(n,i,e){return n&&o(n)?null:t.call(window,n,i,e)}}{let t=history.pushState.bind(history),n=history.replaceState.bind(history);history.pushState=function(i,e,r){if(!(r!=null&&o(r)))return t(i,e,r)},history.replaceState=function(i,e,r){if(!(r!=null&&o(r)))return n(i,e,r)},addEventListener("popstate",()=>void o(location.href),!0)}{let t=n=>n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.button!==0;addEventListener("click",n=>{let i=n;if(i.defaultPrevented||t(i))return;let e=n.target;for(;e&&e.nodeType===1&&e.tagName!=="A";)e=e.parentElement;let r=e;!r||!r.href||a(r.href)&&(i.preventDefault(),i.stopPropagation(),u())},!0)}{let t=HTMLFormElement.prototype.submit;HTMLFormElement.prototype.submit=function(){try{let i=this.getAttribute("action")||"";if(o(i)||Array.from(this.elements).some(r=>r?.name==="checkout")&&o("/checkout"))return}catch{}return t.call(this)},addEventListener("submit",n=>{try{let i=n.target,e=i?.getAttribute("action")||"",r=Array.from(i?.elements||[]);(a(e)||r.some(l=>l?.name==="checkout"))&&(n.preventDefault(),n.stopPropagation(),u())}catch{}},!0)}{let t=location.href;setInterval(()=>{location.href!==t&&(t=location.href,o(t))},250)}{let t=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(i,e,r,l,d){try{typeof e=="string"&&a(e)&&o(e)}catch{}return t.call(this,i,e,!!r,l,d)}}{let t=window.fetch.bind(window);window.fetch=function(i,e){try{let r=typeof i=="string"||i instanceof URL?String(i):i.url;r&&a(r)&&o(r)}catch{}return t(i,e)}}}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var SandboxCheckoutPkg=(()=>{var R=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var I=(l,a,g,_)=>{if(a&&typeof a=="object"||typeof a=="function")for(let c of x(a))!A.call(l,c)&&c!==g&&R(l,c,{get:()=>a[c],enumerable:!(_=U(a,c))||_.enumerable});return l};var T=l=>I(R({},"__esModule",{value:!0}),l);var C={};window.initRevleyCheckout=(l,a)=>{var v;if(window.__checkoutInterceptInstalled)return;window.__checkoutInterceptInstalled=!0;let g=[/^\/(?:cart\/)?checkout(?:[?#]|$)/i,/^\/checkouts\/[a-z0-9]{32}(?:[\/?#]|$)/i],_=!1,c=(...t)=>_?console.debug("[checkout-intercept]",...t):void 0,k=t=>t.replace(/\/+$/,""),L=t=>t.endsWith(".myshopify.com")||t===location.hostname;function P(t,i=location.origin){try{return t instanceof URL?t:new URL(String(t),i)}catch(e){return null}}function d(t){let i=P(t);if(!i||!L(i.hostname))return!1;let e=k(i.pathname),n=g.some(r=>r.test(e));return n&&c("detected checkout-like URL:",String(i)),n}async function m(){let i=await(await fetch("/cart.js")).json(),e=i.discount_codes||[],n=(i.items||[]).map(o=>({variantId:o==null?void 0:o.variant_id,quantity:(o==null?void 0:o.quantity)||0,sellingPlanAllocation:(o==null?void 0:o.selling_plan_allocation)||null})).filter(o=>!!o.variantId&&o.quantity>0),r={},u=["_fbp","_fbc","_fbq","_ig_","_igbp","_igshid","_igsh","_ig_visitor_id","_gclid","_gcl_au","_gcl_aw","_gcl_dc","_gcl_gb","_ttp","_tt_enable_cookie","_scid","_sctr","_pin_unauth","_pin_id","_twitter_ads_id","_li_ss","_uetsid","_uetvid","_amzn","_amzn_ads_","_yclid","_ycl_","_rdt_uid","_quora_","_tb_","_ob_","_criteo_","_adobe_","_ttd_","_dv360_","_fbcv","_shopify_pixel_"],f=o=>u.some(p=>o===p||o.startsWith(p)||o.includes(p));document.cookie&&document.cookie.split(";").forEach(o=>{let p=o.trim();if(p){let[b,...E]=p.split("="),w=E.join("=");b&&w&&f(b)&&(r[b]=w)}});let h=await(await fetch(`${a}/checkout`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({discountCodes:e,variants:n,storeId:l,cookies:r})})).text();if(console.log("checkoutUrl",h),h)location.assign(h);else{console.error("No checkout ID received from backend");return}}let y=!1;function s(t){return y||!d(t)?!1:(y=!0,m(),!0)}if(window.__isCheckoutLike=d,window.__maybeRedirect=s,!((v=window.Shopify)!=null&&v.designMode)){{let t=window.location,i=t.assign.bind(t),e=t.replace.bind(t);try{Object.defineProperty(t,"assign",{value:n=>{s(n)||i(n)},writable:!0,configurable:!0}),Object.defineProperty(t,"replace",{value:n=>{s(n)||e(n)},writable:!0,configurable:!0})}catch(n){c("Could not override location methods, relying on Service Worker:",n)}}{let t=window.open;window.open=function(i,e,n){return i&&s(i)?null:t.call(window,i,e,n)}}{let t=history.pushState.bind(history),i=history.replaceState.bind(history);history.pushState=function(e,n,r){if(!(r!=null&&s(r)))return t(e,n,r)},history.replaceState=function(e,n,r){if(!(r!=null&&s(r)))return i(e,n,r)},addEventListener("popstate",()=>void s(location.href),!0)}{let t=i=>i.metaKey||i.ctrlKey||i.shiftKey||i.altKey||i.button!==0;addEventListener("click",i=>{let e=i;if(e.defaultPrevented||t(e))return;let n=i.target;for(;n&&n.nodeType===1&&n.tagName!=="A";)n=n.parentElement;let r=n;!r||!r.href||d(r.href)&&(e.preventDefault(),e.stopPropagation(),m())},!0)}{let t=HTMLFormElement.prototype.submit;HTMLFormElement.prototype.submit=function(){try{let e=this.getAttribute("action")||"";if(s(e)||Array.from(this.elements).some(r=>(r==null?void 0:r.name)==="checkout")&&s("/checkout"))return}catch(e){}return t.call(this)},addEventListener("submit",i=>{try{let e=i.target,n=(e==null?void 0:e.getAttribute("action"))||"",r=Array.from((e==null?void 0:e.elements)||[]);(d(n)||r.some(u=>(u==null?void 0:u.name)==="checkout"))&&(i.preventDefault(),i.stopPropagation(),m())}catch(e){}},!0)}{let t=location.href;setInterval(()=>{location.href!==t&&(t=location.href,s(t))},250)}{let t=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(e,n,r,u,f){try{typeof n=="string"&&d(n)&&s(n)}catch(S){}return t.call(this,e,n,!!r,u,f)}}{let t=window.fetch.bind(window);window.fetch=function(e,n){try{let r=typeof e=="string"||e instanceof URL?String(e):e.url;r&&d(r)&&s(r)}catch(r){}return t(e,n)}}}};return T(C);})();
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@revley/sandbox-checkout-package",
|
|
3
|
+
"version": "0.1.997",
|
|
4
|
+
"description": "Tiny TS package optimized for browsers with modern & legacy outputs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/cjs/index.cjs",
|
|
7
|
+
"module": "./dist/esm/index.js",
|
|
8
|
+
"types": "./dist/esm/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/esm/index.d.ts",
|
|
12
|
+
"import": "./dist/esm/index.js",
|
|
13
|
+
"require": "./dist/cjs/index.cjs",
|
|
14
|
+
"browser": "./dist/esm/index.js",
|
|
15
|
+
"default": "./dist/esm/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./iife": {
|
|
18
|
+
"default": "./dist/iife/index.global.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"sideEffects": false,
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsup",
|
|
24
|
+
"clean": "git clean -fdX dist || true",
|
|
25
|
+
"prepublishOnly": "npm run build"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"typescript",
|
|
29
|
+
"browser",
|
|
30
|
+
"vite",
|
|
31
|
+
"tsup",
|
|
32
|
+
"checkout"
|
|
33
|
+
],
|
|
34
|
+
"author": "You",
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18.0.0"
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"dist"
|
|
41
|
+
],
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^22.0.0",
|
|
47
|
+
"tsup": "^8.0.0",
|
|
48
|
+
"typescript": "^5.6.0"
|
|
49
|
+
}
|
|
50
|
+
}
|