@betorigami/game-calculations 0.0.0-sha-13931c3-20251102233803 → 0.0.0-sha-0123787-20251113225519

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/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- var Le=Object.create;var{getPrototypeOf:be,defineProperty:y,getOwnPropertyNames:X,getOwnPropertyDescriptor:Ae}=Object,Z=Object.prototype.hasOwnProperty;var w=(t,e,r)=>{r=t!=null?Le(be(t)):{};let i=e||!t||!t.__esModule?y(r,"default",{value:t,enumerable:!0}):r;for(let o of X(t))if(!Z.call(i,o))y(i,o,{get:()=>t[o],enumerable:!0});return i},Q=new WeakMap,Ie=(t)=>{var e=Q.get(t),r;if(e)return e;if(e=y({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")X(t).map((i)=>!Z.call(e,i)&&y(e,i,{get:()=>t[i],enumerable:!(r=Ae(t,i))||r.enumerable}));return Q.set(t,e),e};var _e=(t,e)=>{for(var r in e)y(t,r,{get:e[r],enumerable:!0,configurable:!0,set:(i)=>e[r]=()=>i})};var De={};_e(De,{WheelSegments:()=>T,WheelRiskLevel:()=>D,Wheel:()=>ye,VALID_SUITS:()=>te,VALID_RANKS:()=>re,VALID_EUROPEAN_STREETS:()=>F,VALID_EUROPEAN_STRAIGHTS:()=>x,VALID_EUROPEAN_SPLITS:()=>U,VALID_EUROPEAN_DOUBLE_STREETS:()=>Y,VALID_EUROPEAN_CORNERS:()=>q,VALID_AMERICAN_STREETS:()=>$,VALID_AMERICAN_STRAIGHTS:()=>g,VALID_AMERICAN_SPLITS:()=>z,VALID_AMERICAN_DOUBLE_STREETS:()=>J,VALID_AMERICAN_CORNERS:()=>j,Roulette:()=>Ee,PlinkoRiskLevel:()=>V,Plinko:()=>he,Parity:()=>A,OrigamiGame:()=>B,Mines:()=>fe,Limbo:()=>Be,KenoRiskLevel:()=>ce,Keno:()=>de,Half:()=>_,Game:()=>u,Dozen:()=>M,DiceDirection:()=>ae,Dice:()=>ue,DiamondsResultType:()=>le,Diamonds:()=>se,Column:()=>G,Color:()=>I,BaccaratOutcome:()=>ie,Baccarat:()=>oe,AdvancedDice:()=>ee,AMERICAN_BASKET:()=>C});module.exports=Ie(De);var B;((a)=>{a.DICE="DICE";a.MINES="MINES";a.KENO="KENO";a.LIMBO="LIMBO";a.ADVANCED_DICE="ADVANCED_DICE";a.BACCARAT="BACCARAT";a.DIAMONDS="DIAMONDS";a.PLINKO="PLINKO";a.ROULETTE="ROULETTE";a.WHEEL="WHEEL"})(B||={});class u{gameId;constructor(t){this.gameId=t}getGameResult(t){return this.determineGameResult(t)}}var R=require("big.js"),Ge=(t,e)=>e>=t.lower&&e<=t.upper,Me=(t)=>t.upper-t.lower+1,W=(t,e)=>e>t.lower&&e<t.upper,P=(t)=>t.upper-t.lower-1,L={min:0,max:1e4,effectiveRange:10001};class ee extends u{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt(L),o=i.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"roll-between":return this.calculateRollBetweenPayoutMultiplier(r.bounds,o,e);case"roll-outside":return this.calculateRollOutsidePayoutMultiplier(r.bounds,o,e);case"roll-between-two":return this.calculateRollBetweenTwoPayoutMultiplier(r.firstBounds,r.secondBounds,o,e)}})(),outputs:{result:i.values},randomValues:i}}calculateRollBetweenPayoutMultiplier(t,e,r){if(!W(t,e))return R.Big(0);let i=P(t),o=R.Big(i).div(L.effectiveRange).mul(100);return R.Big(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(Ge(t,e))return R.Big(0);let i=L.effectiveRange-Me(t),o=R.Big(i).div(L.effectiveRange).mul(100);return R.Big(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!W(t,r)&&!W(e,r))return R.Big(0);let o=P(t)+P(e),n=R.Big(o).div(L.effectiveRange).mul(100);return R.Big(100-i).div(n)}}var h=w(require("big.js"));var te=["Clubs","Diamonds","Hearts","Spades"],re=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],ie;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(ie||={});class oe extends u{constructor(){super("BACCARAT")}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(e);let i=t.getRandomIntsWithReplacement({min:0,max:51,count:6}),o=i.values,n=o.slice(0,3),s=o.slice(3,6),d=[],m=0;for(let c of n.slice(0,2)){let p=this.mapRandomValueToCard(c),O=this.mapRandomValueToCardValue(c);d.push(p),m=(m+O)%10}let v=[],a=0;for(let c of s.slice(0,2)){let p=this.mapRandomValueToCard(c),O=this.mapRandomValueToCardValue(c);v.push(p),a=(a+O)%10}if(!this.isNaturalWin(m,a)){let c=this.shouldDrawThirdPlayerCard(m),p=null;if(c)p=this.mapRandomValueToCardValue(n[2]),d.push(this.mapRandomValueToCard(n[2])),m=(m+p)%10;if(this.shouldDrawThirdBankerCard(a,p))v.push(this.mapRandomValueToCard(s[2])),a=(a+this.mapRandomValueToCardValue(s[2]))%10}let f;if(m===a)f="TIE";else f=m>a?"PLAYER_WIN":"BANKER_WIN";let S=new h.default(0).add(e.playerBets.reduce((c,p)=>c.add(p.amount),new h.default(0))).add(e.tieBets.reduce((c,p)=>c.add(p.amount),new h.default(0))).add(e.bankerBets.reduce((c,p)=>c.add(p.amount),new h.default(0))),k=new h.default(0).add(e.playerBets.filter((c)=>f==="PLAYER_WIN").reduce((c,p)=>c.add(p.amount.mul(2)),new h.default(0))).add(e.tieBets.filter((c)=>f==="TIE").reduce((c,p)=>c.add(p.amount.mul(8)),new h.default(0))).add(e.bankerBets.filter((c)=>f==="BANKER_WIN").reduce((c,p)=>c.add(p.amount.mul(1.95)),new h.default(0)));return{isFinished:!0,payoutMultiplier:S.gt(0)?k.div(S):new h.default(0),outputs:{playerCards:d,playerHandValue:m,bankerCards:v,bankerHandValue:a,gameOutcome:f,result:i.values},randomValues:i}}validateGameInputs(t){if(t.playerBets.length===0&&t.tieBets.length===0&&t.bankerBets.length===0)throw new Error("Must place at least a single bet.");if(!t.playerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid player bet.");if(!t.tieBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid tie bet.");if(!t.bankerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid banker bet.")}mapRandomValueToCard(t){let e=te[Math.floor(t/13)],r=re[t%13];return{suit:e,rank:r}}isNaturalWin(t,e){let r=[8,9];return r.includes(t)||r.includes(e)}mapRandomValueToCardValue(t){let e=t%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,e){if(e===null)return t<=5;if(t<=2)return!0;if(t===3)return e!==8;if(t===4)return[2,3,4,5,6,7].includes(e);if(t===5)return[4,5,6,7].includes(e);if(t===6)return[6,7].includes(e);return!1}}var ne=w(require("big.js")),le;((s)=>{s.PAIR="PAIR";s.TWO_PAIR="TWO_PAIR";s.THREE_OF_A_KIND="THREE_OF_A_KIND";s.FULL_HOUSE="FULL_HOUSE";s.FOUR_OF_A_KIND="FOUR_OF_A_KIND";s.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(le||={});var ke={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},Oe={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class se extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ke}constructor(t){super("DIAMONDS");this.multiplierOverrides=t}determineGameResult({generator:t,edge:e}){let r=t.getRandomIntsWithReplacement({min:0,max:6,count:5});if(e!==1&&!this.multiplierOverrides)throw new Error("Use multiplier overrides if an edge of 1% is not desirable");let i=r.values,o=this.calculatePayoutMultiplier(i);return{isFinished:!0,payoutMultiplier:ne.default(o),outputs:{result:r.values},randomValues:r}}calculatePayoutMultiplier(t){let e=new Map;for(let o of t){let n=e.get(o)||0;e.set(o,n+1)}let r=[...e.values()].filter((o)=>o>1),i=this.classifyResult(r);return i===null?0:this.multipliers[i]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[e,r]=t;if(e===void 0)return null;if(r===void 0){let i=Oe[e];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return i}return e===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}var K=w(require("big.js"));var ae;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(ae||={});class ue extends u{constructor(){super("DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:0,max:1e4}),o=i.min,d=i.max-o+1-1,m=r.direction==="ABOVE"?d-r.selectedValue:r.selectedValue,v=new K.default(m).div(d).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?i.value>r.selectedValue:i.value<r.selectedValue)?new K.default(100-e).div(v):new K.default(0),outputs:{result:i.values},randomValues:i}}}var H=w(require("big.js"));var ce;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(ce||={});var Ke={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class de extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ke}constructor(t){super("KENO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,edge:e,gameInputs:r}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(r.selectedNumbers.length===0)throw new Error("No numbers selected");if(r.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let s of r.selectedNumbers){if(s%1!==0)throw new Error("Only integers can be selected");if(s<0||s>39)throw new Error("Invalid number selected")}let i=t.getUniqueRandomInts({min:0,max:39,count:10}),o=r.selectedNumbers.filter((s)=>i.values.includes(s));return{isFinished:!0,payoutMultiplier:o.length>0?new H.default(this.multipliers[r.selectedNumbers.length][r.riskLevel][o.length]??0):new H.default(0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let[e,r]of Object.entries(t)){let i=Number(e);for(let[o,n]of Object.entries(r))if(n.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${o}. Expected ${i+1}, but got ${n.length}`)}}}var E=w(require("big.js"));var pe=(t,e)=>{return t.gt(e)?t:e};var me=(t,e)=>{return t.lt(e)?t:e};class Be extends u{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:1,max:4294967295}),o=i.max,n=new E.default(16777216),s=new E.default(1),d=new E.default(1e6),m=i.value,v=new E.default(m-1).div(o),a=(100-e)/100,f=n.div(v.mul(n).plus(1)).mul(a),S=pe(s,me(f,d));return{isFinished:!0,payoutMultiplier:S.gte(r.targetMultiplier)?new E.default(r.targetMultiplier):new E.default(0),outputs:{randomMultiplier:S,result:i.values},randomValues:i}}}var b=w(require("big.js"));var N=(t,e)=>{if(e<0||t<0||e>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>t-e)e=t-e;let r=1;for(let i=1;i<=e;i++)r=r*(t-i+1)/i;return r};class fe extends u{constructor(){super("MINES")}determineGameResult({generator:t,edge:e,gameInputs:r}){if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>25-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),d=s.values.some((k)=>r.selectedTiles.includes(k)),m=r.hasCashedOut||d,v=(100-e)/100,a=new b.default(N(25-r.minesCount,r.selectedTiles.length)).div(new b.default(N(25,r.selectedTiles.length))),S=r.hasCashedOut&&!d?new b.default(v).div(a):new b.default(0);return{isFinished:m,payoutMultiplier:S,outputs:{result:s.values},randomValues:s}}}var Re=require("big.js");var V;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(V||={});var xe=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16],["MEDIUM_RISK"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}];class he extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??xe}constructor(t){super("PLINKO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(e.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(e.numberOfRows<8||e.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let i=t.getRandomIntsWithReplacement({min:0,max:1,count:e.numberOfRows}),n=i.values.reduce((d,m)=>d+m,0);return{isFinished:!0,payoutMultiplier:new Re.Big(this.multipliers.find((d)=>d.rows===e.numberOfRows)?.payout[e.riskLevel][n]??0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let e of Array.from({length:9},(r,i)=>i+8)){if(!t.some((i)=>i.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let r=Object.values(V);for(let i of r){let o=t.find((n)=>n.rows===e&&n.payout[i]);if(!o)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level is missing.`);if(o.payout[i].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level has an invalid length.`)}}}}var l=require("big.js");var x=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],g=[37,...x],U=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],z=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],F=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],$=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],q=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],j=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],C=[0,1,2,3,37],Y=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],J=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],A;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(A||={});var I;((r)=>{r.RED="RED";r.BLACK="BLACK"})(I||={});var _;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(_||={});var G;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(G||={});var M;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(M||={});class ve extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:36}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),d=n.gt(0)?s.div(n):new l.Big(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:d,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(I).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return x.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return U.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return F.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return q.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return Y.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0)))}calculateTotalPayoutAmount(t){return new l.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0)))}}class Se extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:37}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),d=n.gt(0)?s.div(n):new l.Big(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:d,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.basketBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid basket bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(I).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return g.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return z.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return $.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return j.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return J.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>C.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>!C.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0||e===37)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l.Big(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l.Big(0)))}calculateTotalPayoutAmount(t){return new l.Big(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l.Big(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l.Big(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l.Big(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l.Big(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new l.Big(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l.Big(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l.Big(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l.Big(0)))}}class Ee extends u{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new ve,this.americanGame=new Se}determineGameResult(t){let{gameInputs:e,...r}=t;if(t.edge===2.7&&e.type==="european"){let i=this.europeanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:o,result:i.outputs.result}}}if(t.edge===5.3&&e.type==="american"){let i=this.americanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:o,result:i.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var we=require("big.js");var D;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(D||={});var T;((n)=>{n[n.TEN=10]="TEN";n[n.TWENTY=20]="TWENTY";n[n.THIRTY=30]="THIRTY";n[n.FORTY=40]="FORTY";n[n.FIFTY=50]="FIFTY"})(T||={});var Ce=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}];class ye extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Ce}constructor(t){super("WHEEL");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(!Object.values(T).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(D).includes(e.riskLevel))throw new Error("Invalid risk level");let i=t.getRandomInt({min:0,max:e.segments-1}),o=this.multipliers.find((d)=>d.segments===e.segments);if(o===void 0)throw new Error(`Multiplier not found for segment ${e.segments}`);let n=o.payout[e.riskLevel][i.value];if(n===void 0)throw new Error(`Payout not found for risk ${e.riskLevel} and value ${i.value}`);return{isFinished:!0,payoutMultiplier:new we.Big(n),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){let e=Object.values(T).filter((r)=>typeof r==="number");for(let r of e){if(!t.some((o)=>o.segments===r))throw new Error(`Multiplier overrides for ${r} segments is missing.`);let i=Object.values(D);for(let o of i){let n=t.find((s)=>s.segments===r&&s.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level is missing.`);if(n.payout[o].length!==r)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level has an invalid length.`)}}}}
1
+ var Wr=Object.create;var{getPrototypeOf:jr,defineProperty:K,getOwnPropertyNames:ir,getOwnPropertyDescriptor:qr}=Object,nr=Object.prototype.hasOwnProperty;var C=(e,r,o)=>{o=e!=null?Wr(jr(e)):{};let i=r||!e||!e.__esModule?K(o,"default",{value:e,enumerable:!0}):o;for(let n of ir(e))if(!nr.call(i,n))K(i,n,{get:()=>e[n],enumerable:!0});return i},or=new WeakMap,Fr=(e)=>{var r=or.get(e),o;if(r)return r;if(r=K({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function")ir(e).map((i)=>!nr.call(r,i)&&K(r,i,{get:()=>e[i],enumerable:!(o=qr(e,i))||o.enumerable}));return or.set(e,r),r};var Yr=(e,r)=>{for(var o in r)K(e,o,{get:r[o],enumerable:!0,configurable:!0,set:(i)=>r[o]=()=>i})};var de={};Yr(de,{wheelMultipliers:()=>Pr,validateRouletteGameInputs:()=>le,plinkoMultipliers:()=>Mr,calculateRouletteBetAmount:()=>ce,calculateBaccaratBetAmount:()=>ar,WheelSegments:()=>er,WheelRiskLevel:()=>rr,Wheel:()=>Ur,VALID_SUITS:()=>lr,VALID_RANKS:()=>Er,VALID_EUROPEAN_STREETS:()=>Q,VALID_EUROPEAN_STRAIGHTS:()=>k,VALID_EUROPEAN_SPLITS:()=>z,VALID_EUROPEAN_DOUBLE_STREETS:()=>m,VALID_EUROPEAN_CORNERS:()=>Z,VALID_AMERICAN_STREETS:()=>X,VALID_AMERICAN_STRAIGHTS:()=>$,VALID_AMERICAN_SPLITS:()=>J,VALID_AMERICAN_DOUBLE_STREETS:()=>g,VALID_AMERICAN_CORNERS:()=>b,Roulette:()=>Or,RollType:()=>tr,PlinkoRiskLevel:()=>Rr,Plinko:()=>Cr,Parity:()=>s,OrigamiGame:()=>S,Mines:()=>Gr,Limbo:()=>sr,KenoRiskLevel:()=>hr,Keno:()=>yr,Half:()=>u,GameErrorCode:()=>Dr,GameError:()=>E,Game:()=>f,Dozen:()=>M,DiceDirection:()=>Lr,Dice:()=>_r,DiamondsResultType:()=>pr,Diamonds:()=>Ar,Column:()=>R,Color:()=>G,BaccaratOutcome:()=>dr,BaccaratBetType:()=>fr,Baccarat:()=>Br,AdvancedDice:()=>cr,AMERICAN_BASKET:()=>H});module.exports=Fr(de);var S;((d)=>{d.DICE="DICE";d.MINES="MINES";d.KENO="KENO";d.LIMBO="LIMBO";d.ADVANCED_DICE="ADVANCED_DICE";d.BACCARAT="BACCARAT";d.DIAMONDS="DIAMONDS";d.PLINKO="PLINKO";d.ROULETTE="ROULETTE";d.WHEEL="WHEEL"})(S||={});class f{gameId;constructor(e){this.gameId=e}getGameResult(e){return this.determineGameResult(e)}}var L=require("big.js"),Ir=(e,r)=>r>=e.lower&&r<=e.upper,$r=(e)=>e.upper-e.lower+1,q=(e,r)=>r>e.lower&&r<e.upper,F=(e)=>e.upper-e.lower-1,tr;((i)=>{i.ROLL_BETWEEN="ROLL_BETWEEN";i.ROLL_OUTSIDE="ROLL_OUTSIDE";i.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(tr||={});var v={min:0,max:1e4,effectiveRange:10001};class cr extends f{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt(v),n=i.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return this.calculateRollBetweenPayoutMultiplier(o.bounds,n,r);case"ROLL_OUTSIDE":return this.calculateRollOutsidePayoutMultiplier(o.bounds,n,r);case"ROLL_BETWEEN_TWO":return this.calculateRollBetweenTwoPayoutMultiplier(o.firstBounds,o.secondBounds,n,r)}})(),outputs:{result:i.values},randomValues:i}}calculateRollBetweenPayoutMultiplier(e,r,o){if(!q(e,r))return L.Big(0);let i=F(e),n=L.Big(i).div(v.effectiveRange).mul(100);return L.Big(100-o).div(n)}calculateRollOutsidePayoutMultiplier(e,r,o){if(Ir(e,r))return L.Big(0);let i=v.effectiveRange-$r(e),n=L.Big(i).div(v.effectiveRange).mul(100);return L.Big(100-o).div(n)}calculateRollBetweenTwoPayoutMultiplier(e,r,o,i){if(!q(e,o)&&!q(r,o))return L.Big(0);let n=F(e)+F(r),t=L.Big(n).div(v.effectiveRange).mul(100);return L.Big(100-i).div(t)}}var D=C(require("big.js"));var lr=["Clubs","Diamonds","Hearts","Spades"],Er=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],dr;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(dr||={});var fr;((i)=>{i.PLAYER="PLAYER";i.TIE="TIE";i.BANKER="BANKER"})(fr||={});var zr={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},ar=(e)=>{return new D.default(0).add(e.bets.reduce((o,i)=>o.add(i.amount),new D.default(0)))};class Br extends f{constructor(){super("BACCARAT")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(r);let i=e.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=i.values,t=n.slice(0,3),l=n.slice(3,6),B=[],a=0;for(let A of t.slice(0,2)){let _=this.mapRandomValueToCard(A),P=this.mapRandomValueToCardValue(A);B.push(_),a=(a+P)%10}let p=[],d=0;for(let A of l.slice(0,2)){let _=this.mapRandomValueToCard(A),P=this.mapRandomValueToCardValue(A);p.push(_),d=(d+P)%10}if(!this.isNaturalWin(a,d)){let A=this.shouldDrawThirdPlayerCard(a),_=null;if(A)_=this.mapRandomValueToCardValue(t[2]),B.push(this.mapRandomValueToCard(t[2])),a=(a+_)%10;if(this.shouldDrawThirdBankerCard(d,_))p.push(this.mapRandomValueToCard(l[2])),d=(d+this.mapRandomValueToCardValue(l[2]))%10}let h;if(a===d)h="TIE";else h=a>d?"PLAYER_WIN":"BANKER_WIN";let y=ar(r),{betType:V,multiplier:kr}=zr[h],Hr=new D.default(0).add(r.bets.filter((A)=>A.type===V).reduce((A,_)=>A.add(_.amount.mul(kr)),new D.default(0)));return{isFinished:!0,payoutMultiplier:y.gt(0)?Hr.div(y):new D.default(0),outputs:{playerCards:B,playerHandValue:a,bankerCards:p,bankerHandValue:d,gameOutcome:h,result:i.values},randomValues:i}}validateGameInputs(e){if(e.bets.length===0)throw new Error("Must place at least a single bet.");if(!e.bets.every((r)=>r.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(e){let r=lr[Math.floor(e/13)],o=Er[e%13];return{suit:r,rank:o}}isNaturalWin(e,r){let o=[8,9];return o.includes(e)||o.includes(r)}mapRandomValueToCardValue(e){let r=e%13;if(r===0)return 1;if(r>=10)return 10;return r+1}shouldDrawThirdPlayerCard(e){return e<=5}shouldDrawThirdBankerCard(e,r){if(r===null)return e<=5;if(e<=2)return!0;if(e===3)return r!==8;if(e===4)return[2,3,4,5,6,7].includes(r);if(e===5)return[4,5,6,7].includes(r);if(e===6)return[6,7].includes(r);return!1}}var Sr=C(require("big.js"));class T{multipliers;constructor(e){this.multipliers=e}getMultipliers(e){let r=this.multipliers.get(e);if(r===void 0)throw new Error(`Multipliers for ${e} not found`);return r}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([e,r])=>({edge:e,multipliers:r}))}}var pr;((l)=>{l.PAIR="PAIR";l.TWO_PAIR="TWO_PAIR";l.THREE_OF_A_KIND="THREE_OF_A_KIND";l.FULL_HOUSE="FULL_HOUSE";l.FOUR_OF_A_KIND="FOUR_OF_A_KIND";l.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(pr||={});var Jr={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},Qr=new T(new Map([[2,Jr]])),Xr={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Ar extends f{constructor(){super("DIAMONDS")}determineGameResult({generator:e,edge:r}){let o=e.getRandomIntsWithReplacement({min:0,max:6,count:5}),i=Qr.getMultipliers(r),n=o.values,t=this.calculatePayoutMultiplier(i,n);return{isFinished:!0,payoutMultiplier:Sr.default(t),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(e,r){let o=new Map;for(let t of r){let l=o.get(t)||0;o.set(t,l+1)}let i=[...o.values()].filter((t)=>t>1),n=this.classifyResult(i);return n===null?0:e[n]}classifyResult(e){if(e.length>2)throw new Error(`Unexpected number of repeats ${e.length}`);let[r,o]=e;if(r===void 0)return null;if(o===void 0){let i=Xr[r];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${r}`);return i}return r===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}var U=C(require("big.js"));var Lr;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(Lr||={});class _r extends f{constructor(){super("DICE")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt({min:0,max:1e4}),n=i.min,B=i.max-n+1-1,a=o.direction==="ABOVE"?B-o.selectedValue:o.selectedValue,p=new U.default(a).div(B).mul(100);return{isFinished:!0,payoutMultiplier:(o.direction==="ABOVE"?i.value>o.selectedValue:i.value<o.selectedValue)?new U.default(100-r).div(p):new U.default(0),outputs:{result:i.values},randomValues:i}}}var Y=C(require("big.js"));var hr;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})(hr||={});var Zr={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class yr extends f{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Zr}constructor(e){super("KENO");this.multiplierOverrides=e;if(e)this.validateMultiplierOverrides(e)}determineGameResult({generator:e,edge:r,gameInputs:o}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(o.selectedNumbers.length===0)throw new Error("No numbers selected");if(o.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let l of o.selectedNumbers){if(l%1!==0)throw new Error("Only integers can be selected");if(l<0||l>39)throw new Error("Invalid number selected")}let i=e.getUniqueRandomInts({min:0,max:39,count:10}),n=o.selectedNumbers.filter((l)=>i.values.includes(l));return{isFinished:!0,payoutMultiplier:n.length>0?new Y.default(this.multipliers[o.selectedNumbers.length][o.riskLevel][n.length]??0):new Y.default(0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(e){for(let[r,o]of Object.entries(e)){let i=Number(r);for(let[n,t]of Object.entries(o))if(t.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${n}. Expected ${i+1}, but got ${t.length}`)}}}var x=C(require("big.js"));var Tr=(e,r)=>{return e.gt(r)?e:r};var xr=(e,r)=>{return e.lt(r)?e:r};class sr extends f{constructor(){super("LIMBO")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt({min:1,max:4294967295}),n=i.max,t=new x.default(16777216),l=new x.default(1),B=new x.default(1e6),a=i.value,p=new x.default(a-1).div(n),d=(100-r)/100,h=t.div(p.mul(t).plus(1)).mul(d),y=Tr(l,xr(h,B));return{isFinished:!0,payoutMultiplier:y.gte(o.targetMultiplier)?new x.default(o.targetMultiplier):new x.default(0),outputs:{randomMultiplier:y,result:i.values},randomValues:i}}}var w=C(require("big.js"));var I=(e,r)=>{if(r<0||e<0||r>e)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(r>e-r)r=e-r;let o=1;for(let i=1;i<=r;i++)o=o*(e-i+1)/i;return o};class Gr extends f{constructor(){super("MINES")}determineGameResult({generator:e,edge:r,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let l=e.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),B=l.values.some((V)=>o.selectedTiles.includes(V)),a=o.hasCashedOut||B,p=(100-r)/100,d=new w.default(I(25-o.minesCount,o.selectedTiles.length)).div(new w.default(I(25,o.selectedTiles.length))),y=o.hasCashedOut&&!B?new w.default(p).div(d):new w.default(0);return{isFinished:a,payoutMultiplier:y,outputs:{result:l.values},randomValues:l}}}var ur=require("big.js");var Rr;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(Rr||={});var br=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16],["MEDIUM_RISK"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}],Mr=new T(new Map([[1,br]]));class Cr extends f{constructor(){super("PLINKO")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(r.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(r.numberOfRows<8||r.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let i=Mr.getMultipliers(o),n=e.getRandomIntsWithReplacement({min:0,max:1,count:r.numberOfRows}),l=n.values.reduce((a,p)=>a+p,0);return{isFinished:!0,payoutMultiplier:new ur.Big(i.find((a)=>a.rows===r.numberOfRows)?.payout[r.riskLevel][l]??0),outputs:{result:n.values},randomValues:n}}}var c=require("big.js");var k=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],$=[37,...k],z=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],J=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Q=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],X=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],Z=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],b=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],H=[0,1,2,3,37],m=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],g=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],s;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(s||={});var G;((o)=>{o.RED="RED";o.BLACK="BLACK"})(G||={});var u;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(u||={});var R;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(R||={});var M;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(M||={});var Dr;((r)=>r.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Dr||={});class E extends Error{static createValidationError(e){return new E("INPUT_VALIDATION_ERROR",e)}static isGameError(e){return e instanceof E}errorCode;constructor(e,r){super(r);this.errorCode=e}}var W=(e)=>{if(e.straightBets.length===0&&e.splitBets.length===0&&e.streetBets.length===0&&e.cornerBets.length===0&&e.doubleStreetBets.length===0&&e.parityBets.length===0&&e.colorBets.length===0&&e.halfBets.length===0&&e.columnBets.length===0&&e.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!e.straightBets.every((r)=>r.amount.gte(0)&&N(r.value)))throw E.createValidationError("Invalid straight bet.");if(!e.splitBets.every((r)=>r.amount.gte(0)&&mr(r.values)))throw E.createValidationError("Invalid split bet.");if(!e.streetBets.every((r)=>r.amount.gte(0)&&gr(r.values)))throw E.createValidationError("Invalid street bet.");if(!e.cornerBets.every((r)=>r.amount.gte(0)&&re(r.values)))throw E.createValidationError("Invalid corner bet.");if(!e.doubleStreetBets.every((r)=>r.amount.gte(0)&&ee(r.values)))throw E.createValidationError("Invalid double street bet.");if(!e.parityBets.every((r)=>r.amount.gte(0)&&Object.values(s).includes(r.parity)))throw E.createValidationError("Invalid parity bet.");if(!e.colorBets.every((r)=>r.amount.gte(0)&&Object.values(G).includes(r.color)))throw E.createValidationError("Invalid color bet.");if(!e.halfBets.every((r)=>r.amount.gte(0)&&Object.values(u).includes(r.half)))throw E.createValidationError("Invalid half bet.");if(!e.columnBets.every((r)=>r.amount.gte(0)&&Object.values(R).includes(r.column)))throw E.createValidationError("Invalid column bet.");if(!e.dozenBets.every((r)=>r.amount.gte(0)&&Object.values(M).includes(r.dozen)))throw E.createValidationError("Invalid dozen bet.")},N=(e)=>{return k.includes(e)},mr=(e)=>{if(e.length!==2)return!1;if(!e.every(N))return!1;return z.some(([r,o])=>r===e[0]&&o===e[1])},gr=(e)=>{if(e.length!==3)return!1;if(!e.every(N))return!1;return Q.some(([r,o,i])=>r===e[0]&&o===e[1]&&i===e[2])},re=(e)=>{if(e.length!==4)return!1;if(!e.every(N))return!1;return Z.some(([r,o,i,n])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3])},ee=(e)=>{if(e.length!==6)return!1;if(!e.every(N))return!1;return m.some(([r,o,i,n,t,l])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3]&&t===e[4]&&l===e[5])};var j=(e)=>{if(e.straightBets.length===0&&e.splitBets.length===0&&e.streetBets.length===0&&e.cornerBets.length===0&&e.basketBets.length===0&&e.doubleStreetBets.length===0&&e.parityBets.length===0&&e.colorBets.length===0&&e.halfBets.length===0&&e.columnBets.length===0&&e.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!e.straightBets.every((r)=>r.amount.gte(0)&&O(r.value)))throw E.createValidationError("Invalid straight bet.");if(!e.splitBets.every((r)=>r.amount.gte(0)&&oe(r.values)))throw E.createValidationError("Invalid split bet.");if(!e.streetBets.every((r)=>r.amount.gte(0)&&ie(r.values)))throw E.createValidationError("Invalid street bet.");if(!e.cornerBets.every((r)=>r.amount.gte(0)&&ne(r.values)))throw E.createValidationError("Invalid corner bet.");if(!e.basketBets.every((r)=>r.amount.gte(0)))throw E.createValidationError("Invalid basket bet.");if(!e.doubleStreetBets.every((r)=>r.amount.gte(0)&&te(r.values)))throw E.createValidationError("Invalid double street bet.");if(!e.parityBets.every((r)=>r.amount.gte(0)&&Object.values(s).includes(r.parity)))throw E.createValidationError("Invalid parity bet.");if(!e.colorBets.every((r)=>r.amount.gte(0)&&Object.values(G).includes(r.color)))throw E.createValidationError("Invalid color bet.");if(!e.halfBets.every((r)=>r.amount.gte(0)&&Object.values(u).includes(r.half)))throw E.createValidationError("Invalid half bet.");if(!e.columnBets.every((r)=>r.amount.gte(0)&&Object.values(R).includes(r.column)))throw E.createValidationError("Invalid column bet.");if(!e.dozenBets.every((r)=>r.amount.gte(0)&&Object.values(M).includes(r.dozen)))throw E.createValidationError("Invalid dozen bet.")},O=(e)=>{return $.includes(e)};function oe(e){if(e.length!==2)return!1;if(!e.every(O))return!1;return J.some(([r,o])=>r===e[0]&&o===e[1])}var ie=(e)=>{if(e.length!==3)return!1;if(!e.every(O))return!1;return X.some(([r,o,i])=>r===e[0]&&o===e[1]&&i===e[2])},ne=(e)=>{if(e.length!==4)return!1;if(!e.every(O))return!1;return b.some(([r,o,i,n])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3])},te=(e)=>{if(e.length!==6)return!1;if(!e.every(O))return!1;return g.some(([r,o,i,n,t,l])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3]&&t===e[4]&&l===e[5])};var Kr=(e)=>{return new c.Big(0).add(e.straightBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.splitBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.streetBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.cornerBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.doubleStreetBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.parityBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.colorBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.halfBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.columnBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.dozenBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0)))},vr=(e)=>{return new c.Big(0).add(e.straightBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.splitBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.streetBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.cornerBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.basketBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.doubleStreetBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.parityBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.colorBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.halfBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.columnBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0))).add(e.dozenBets.reduce((r,o)=>r.plus(o.amount),new c.Big(0)))},ce=(e)=>{return e.type==="european"?Kr(e.inputs):vr(e.inputs)};class wr extends f{constructor(){super("ROULETTE")}determineGameResult({generator:e,gameInputs:r}){W(r);let o=e.getRandomInt({min:0,max:36}),i=o.value,n=this.determineBetOutcomes(r,i),t=Kr(r),l=this.calculateTotalPayoutAmount(n),B=t.gt(0)?l.div(t):new c.Big(0);return{outputs:{betOutcomes:n,result:o.values},payoutMultiplier:B,isFinished:!0,randomValues:o}}determineBetOutcomes(e,r){return{winningBets:{straightBets:e.straightBets.filter((o)=>o.value===r),splitBets:e.splitBets.filter((o)=>o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>o.values.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>this.isWinningDozenBet(o,r))},losingBets:{straightBets:e.straightBets.filter((o)=>o.value!==r),splitBets:e.splitBets.filter((o)=>!o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>!o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>!o.values.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>!o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>!this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>!this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>!this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>!this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>!this.isWinningDozenBet(o,r))}}}isWinningParityBet(e,r){if(r===0)return!1;let o=r%2===0?"EVEN":"ODD";return e.parity===o}isWinningColorBet(e,r){let o=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(o.includes(r)&&e.color==="RED")return!0;if(i.includes(r)&&e.color==="BLACK")return!0;return!1}isWinningHalfBet(e,r){if(r>0&&r<=18&&e.half==="LOW")return!0;if(r>18&&r<=36&&e.half==="HIGH")return!0;return!1}isWinningColumnBet(e,r){let o=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(o.includes(r)&&e.column==="TOP")return!0;if(i.includes(r)&&e.column==="MIDDLE")return!0;if(n.includes(r)&&e.column==="BOTTOM")return!0;return!1}isWinningDozenBet(e,r){if(r>0&&r<=12&&e.dozen==="FIRST")return!0;if(r>12&&r<=24&&e.dozen==="SECOND")return!0;if(r>24&&r<=36&&e.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(e){return new c.Big(0).add(e.winningBets.straightBets.reduce((r,o)=>r.plus(o.amount.mul(36)),new c.Big(0))).add(e.winningBets.splitBets.reduce((r,o)=>r.plus(o.amount.mul(18)),new c.Big(0))).add(e.winningBets.streetBets.reduce((r,o)=>r.plus(o.amount.mul(12)),new c.Big(0))).add(e.winningBets.cornerBets.reduce((r,o)=>r.plus(o.amount.mul(9)),new c.Big(0))).add(e.winningBets.doubleStreetBets.reduce((r,o)=>r.plus(o.amount.mul(6)),new c.Big(0))).add(e.winningBets.parityBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.colorBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.halfBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.columnBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c.Big(0))).add(e.winningBets.dozenBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c.Big(0)))}}class Nr extends f{constructor(){super("ROULETTE")}determineGameResult({generator:e,gameInputs:r}){j(r);let o=e.getRandomInt({min:0,max:37}),i=o.value,n=this.determineBetOutcomes(r,i),t=vr(r),l=this.calculateTotalPayoutAmount(n),B=t.gt(0)?l.div(t):new c.Big(0);return{outputs:{betOutcomes:n,result:o.values},payoutMultiplier:B,isFinished:!0,randomValues:o}}determineBetOutcomes(e,r){return{winningBets:{straightBets:e.straightBets.filter((o)=>o.value===r),splitBets:e.splitBets.filter((o)=>o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>o.values.some((i)=>i===r)),basketBets:e.basketBets.filter((o)=>H.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>this.isWinningDozenBet(o,r))},losingBets:{straightBets:e.straightBets.filter((o)=>o.value!==r),splitBets:e.splitBets.filter((o)=>!o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>!o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>!o.values.some((i)=>i===r)),basketBets:e.basketBets.filter((o)=>!H.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>!o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>!this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>!this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>!this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>!this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>!this.isWinningDozenBet(o,r))}}}isWinningParityBet(e,r){if(r===0||r===37)return!1;let o=r%2===0?"EVEN":"ODD";return e.parity===o}isWinningColorBet(e,r){let o=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(o.includes(r)&&e.color==="RED")return!0;if(i.includes(r)&&e.color==="BLACK")return!0;return!1}isWinningHalfBet(e,r){if(r>0&&r<=18&&e.half==="LOW")return!0;if(r>18&&r<=36&&e.half==="HIGH")return!0;return!1}isWinningColumnBet(e,r){let o=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(o.includes(r)&&e.column==="TOP")return!0;if(i.includes(r)&&e.column==="MIDDLE")return!0;if(n.includes(r)&&e.column==="BOTTOM")return!0;return!1}isWinningDozenBet(e,r){if(r>0&&r<=12&&e.dozen==="FIRST")return!0;if(r>12&&r<=24&&e.dozen==="SECOND")return!0;if(r>24&&r<=36&&e.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(e){return new c.Big(0).add(e.winningBets.straightBets.reduce((r,o)=>r.plus(o.amount.mul(36)),new c.Big(0))).add(e.winningBets.splitBets.reduce((r,o)=>r.plus(o.amount.mul(18)),new c.Big(0))).add(e.winningBets.streetBets.reduce((r,o)=>r.plus(o.amount.mul(12)),new c.Big(0))).add(e.winningBets.cornerBets.reduce((r,o)=>r.plus(o.amount.mul(9)),new c.Big(0))).add(e.winningBets.basketBets.reduce((r,o)=>r.plus(o.amount.mul(7)),new c.Big(0))).add(e.winningBets.doubleStreetBets.reduce((r,o)=>r.plus(o.amount.mul(6)),new c.Big(0))).add(e.winningBets.parityBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.colorBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.halfBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c.Big(0))).add(e.winningBets.columnBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c.Big(0))).add(e.winningBets.dozenBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c.Big(0)))}}class Or extends f{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new wr,this.americanGame=new Nr}determineGameResult(e){let{gameInputs:r,...o}=e;if(e.edge===2.7&&r.type==="european"){let i=this.europeanGame.determineGameResult({...o,gameInputs:r.inputs}),{betOutcomes:n}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:n,result:i.outputs.result}}}if(e.edge===5.3&&r.type==="american"){let i=this.americanGame.determineGameResult({...o,gameInputs:r.inputs}),{betOutcomes:n}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:n,result:i.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var le=(e)=>{if(e.type==="european")W(e.inputs);else j(e.inputs)};var Vr=require("big.js");var rr;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(rr||={});var er;((t)=>{t[t.TEN=10]="TEN";t[t.TWENTY=20]="TWENTY";t[t.THIRTY=30]="THIRTY";t[t.FORTY=40]="FORTY";t[t.FIFTY=50]="FIFTY"})(er||={});var Ee=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}],Pr=new T(new Map([[1,Ee]]));class Ur extends f{constructor(){super("WHEEL")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(!Object.values(er).includes(r.segments))throw new Error("Invalid segments value");if(!Object.values(rr).includes(r.riskLevel))throw new Error("Invalid risk level");let i=Pr.getMultipliers(o).find((B)=>B.segments===r.segments);if(i===void 0)throw new Error(`Multiplier not found for segment ${r.segments}`);let n=e.getRandomInt({min:0,max:r.segments-1}),t=i.payout[r.riskLevel][n.value];if(t===void 0)throw new Error(`Payout not found for risk ${r.riskLevel} and value ${n.value}`);return{isFinished:!0,payoutMultiplier:new Vr.Big(t),outputs:{result:n.values},randomValues:n}}}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  // Generated by dts-bundle-generator v9.5.1
2
2
 
3
3
  import Big$1 from 'big.js';
4
- import { Big as Big$1 } from 'big.js';
4
+ import { Big as Big$1, Big as Big$2 } from 'big.js';
5
5
 
6
6
  export type Proof = {
7
7
  proofHash: string;
@@ -10,13 +10,11 @@ export type Proof = {
10
10
  export type SingleRandomValue = {
11
11
  value: number;
12
12
  values: number[];
13
- count: 1;
14
13
  min: number;
15
14
  max: number;
16
15
  } & Proof;
17
16
  export type MultipleRandomValues = {
18
17
  values: number[];
19
- count: number;
20
18
  min: number;
21
19
  max: number;
22
20
  } & Proof;
@@ -72,16 +70,21 @@ export type Bounds = {
72
70
  lower: number;
73
71
  upper: number;
74
72
  };
73
+ export declare enum RollType {
74
+ ROLL_BETWEEN = "ROLL_BETWEEN",
75
+ ROLL_OUTSIDE = "ROLL_OUTSIDE",
76
+ ROLL_BETWEEN_TWO = "ROLL_BETWEEN_TWO"
77
+ }
75
78
  export type RollBetween = {
76
- mode: "roll-between";
79
+ mode: RollType.ROLL_BETWEEN;
77
80
  bounds: Bounds;
78
81
  };
79
82
  export type RollOutside = {
80
- mode: "roll-outside";
83
+ mode: RollType.ROLL_OUTSIDE;
81
84
  bounds: Bounds;
82
85
  };
83
86
  export type RollBetweenTwo = {
84
- mode: "roll-between-two";
87
+ mode: RollType.ROLL_BETWEEN_TWO;
85
88
  firstBounds: Bounds;
86
89
  secondBounds: Bounds;
87
90
  };
@@ -93,19 +96,12 @@ export declare class AdvancedDice extends Game<AdvancedDiceInputs> {
93
96
  private calculateRollOutsidePayoutMultiplier;
94
97
  private calculateRollBetweenTwoPayoutMultiplier;
95
98
  }
96
- export interface PlayerBet {
97
- amount: Big$1;
98
- }
99
- export interface TieBet {
100
- amount: Big$1;
101
- }
102
- export interface BankerBet {
99
+ export interface Bet {
103
100
  amount: Big$1;
101
+ type: BaccaratBetType;
104
102
  }
105
103
  export interface BaccaratGameInputs {
106
- playerBets: PlayerBet[];
107
- tieBets: TieBet[];
108
- bankerBets: BankerBet[];
104
+ bets: Bet[];
109
105
  }
110
106
  export declare const VALID_SUITS: readonly [
111
107
  "Clubs",
@@ -139,6 +135,11 @@ export declare enum BaccaratOutcome {
139
135
  TIE = "TIE",
140
136
  BANKER_WIN = "BANKER_WIN"
141
137
  }
138
+ export declare enum BaccaratBetType {
139
+ PLAYER = "PLAYER",
140
+ TIE = "TIE",
141
+ BANKER = "BANKER"
142
+ }
142
143
  export interface BaccaratGameOutputs {
143
144
  playerCards: Card[];
144
145
  playerHandValue: number;
@@ -146,6 +147,7 @@ export interface BaccaratGameOutputs {
146
147
  bankerHandValue: number;
147
148
  gameOutcome: BaccaratOutcome;
148
149
  }
150
+ export declare const calculateBaccaratBetAmount: (gameInputs: BaccaratGameInputs) => Big$1;
149
151
  export declare class Baccarat extends Game<BaccaratGameInputs, BaccaratGameOutputs> {
150
152
  constructor();
151
153
  protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<BaccaratGameInputs>): GameResult<BaccaratGameOutputs>;
@@ -168,9 +170,7 @@ export declare enum DiamondsResultType {
168
170
  }
169
171
  export type DiamondsMultipliers = Record<keyof typeof DiamondsResultType, number>;
170
172
  export declare class Diamonds extends Game<DiamondsGameInputs> {
171
- readonly multiplierOverrides?: DiamondsMultipliers | undefined;
172
- private get multipliers();
173
- constructor(multiplierOverrides?: DiamondsMultipliers | undefined);
173
+ constructor();
174
174
  protected determineGameResult({ generator, edge }: GetGameResultRequest<DiamondsGameInputs>): GameResult;
175
175
  private calculatePayoutMultiplier;
176
176
  private classifyResult;
@@ -225,6 +225,15 @@ export declare class Mines extends Game<MinesGameInputs> {
225
225
  constructor();
226
226
  protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<MinesGameInputs>): GameResult;
227
227
  }
228
+ declare class MultiplierContainer<TMultipliers> {
229
+ readonly multipliers: Map<number, TMultipliers>;
230
+ constructor(multipliers: Map<number, TMultipliers>);
231
+ getMultipliers(edge: number): TMultipliers;
232
+ getAllMultipliers(): {
233
+ edge: number;
234
+ multipliers: TMultipliers;
235
+ }[];
236
+ }
228
237
  export declare enum PlinkoRiskLevel {
229
238
  LOW_RISK = "LOW_RISK",
230
239
  MEDIUM_RISK = "MEDIUM_RISK",
@@ -238,12 +247,10 @@ export interface PlinkoMultipliers {
238
247
  rows: number;
239
248
  payout: Record<PlinkoRiskLevel, number[]>;
240
249
  }
250
+ export declare const plinkoMultipliers: MultiplierContainer<PlinkoMultipliers[]>;
241
251
  export declare class Plinko extends Game<PlinkoGameInputs> {
242
- readonly multiplierOverrides?: PlinkoMultipliers[] | undefined;
243
- private get multipliers();
244
- constructor(multiplierOverrides?: PlinkoMultipliers[] | undefined);
252
+ constructor();
245
253
  protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<PlinkoGameInputs>): GameResult;
246
- private validateMultiplierOverrides;
247
254
  }
248
255
  export declare const VALID_EUROPEAN_STRAIGHTS: readonly [
249
256
  0,
@@ -1566,12 +1573,14 @@ export type RouletteGameOutputs = {
1566
1573
  type: "american";
1567
1574
  betOutcomes: AmericanRouletteBetOutcomes;
1568
1575
  };
1576
+ export declare const calculateRouletteBetAmount: (inputs: RouletteGameInputs) => Big$1.Big;
1569
1577
  export declare class Roulette extends Game<RouletteGameInputs, RouletteGameOutputs> {
1570
1578
  private readonly europeanGame;
1571
1579
  private readonly americanGame;
1572
1580
  constructor();
1573
1581
  protected determineGameResult(request: GetGameResultRequest<RouletteGameInputs>): GameResult<RouletteGameOutputs>;
1574
1582
  }
1583
+ export declare const validateRouletteGameInputs: (gameInputs: RouletteGameInputs) => void;
1575
1584
  export declare enum WheelRiskLevel {
1576
1585
  LOW_RISK = "LOW_RISK",
1577
1586
  MEDIUM_RISK = "MEDIUM_RISK",
@@ -1592,12 +1601,19 @@ export interface WheelMultipliers {
1592
1601
  segments: WheelSegments;
1593
1602
  payout: Record<WheelRiskLevel, number[]>;
1594
1603
  }
1604
+ export declare const wheelMultipliers: MultiplierContainer<WheelMultipliers[]>;
1595
1605
  export declare class Wheel extends Game<WheelGameInputs> {
1596
- readonly multiplierOverrides?: WheelMultipliers[] | undefined;
1597
- private get multipliers();
1598
- constructor(multiplierOverrides?: WheelMultipliers[] | undefined);
1606
+ constructor();
1599
1607
  protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<WheelGameInputs>): GameResult;
1600
- private validateMultiplierOverrides;
1608
+ }
1609
+ export declare enum GameErrorCode {
1610
+ INPUT_VALIDATION_ERROR = "INPUT_VALIDATION_ERROR"
1611
+ }
1612
+ export declare class GameError extends Error {
1613
+ static createValidationError(message: string): GameError;
1614
+ static isGameError(error: unknown): error is GameError;
1615
+ errorCode: GameErrorCode;
1616
+ constructor(errorCode: GameErrorCode, message?: string);
1601
1617
  }
1602
1618
 
1603
1619
  export {};
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var B;((a)=>{a.DICE="DICE";a.MINES="MINES";a.KENO="KENO";a.LIMBO="LIMBO";a.ADVANCED_DICE="ADVANCED_DICE";a.BACCARAT="BACCARAT";a.DIAMONDS="DIAMONDS";a.PLINKO="PLINKO";a.ROULETTE="ROULETTE";a.WHEEL="WHEEL"})(B||={});class u{gameId;constructor(t){this.gameId=t}getGameResult(t){return this.determineGameResult(t)}}import{Big as h}from"big.js";var Z=(t,e)=>e>=t.lower&&e<=t.upper,ee=(t)=>t.upper-t.lower+1,k=(t,e)=>e>t.lower&&e<t.upper,O=(t)=>t.upper-t.lower-1,w={min:0,max:1e4,effectiveRange:10001};class te extends u{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt(w),o=i.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"roll-between":return this.calculateRollBetweenPayoutMultiplier(r.bounds,o,e);case"roll-outside":return this.calculateRollOutsidePayoutMultiplier(r.bounds,o,e);case"roll-between-two":return this.calculateRollBetweenTwoPayoutMultiplier(r.firstBounds,r.secondBounds,o,e)}})(),outputs:{result:i.values},randomValues:i}}calculateRollBetweenPayoutMultiplier(t,e,r){if(!k(t,e))return h(0);let i=O(t),o=h(i).div(w.effectiveRange).mul(100);return h(100-r).div(o)}calculateRollOutsidePayoutMultiplier(t,e,r){if(Z(t,e))return h(0);let i=w.effectiveRange-ee(t),o=h(i).div(w.effectiveRange).mul(100);return h(100-r).div(o)}calculateRollBetweenTwoPayoutMultiplier(t,e,r,i){if(!k(t,r)&&!k(e,r))return h(0);let o=O(t)+O(e),n=h(o).div(w.effectiveRange).mul(100);return h(100-i).div(n)}}import v from"big.js";var re=["Clubs","Diamonds","Hearts","Spades"],ie=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],oe;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(oe||={});class ne extends u{constructor(){super("BACCARAT")}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(e);let i=t.getRandomIntsWithReplacement({min:0,max:51,count:6}),o=i.values,n=o.slice(0,3),s=o.slice(3,6),d=[],m=0;for(let c of n.slice(0,2)){let p=this.mapRandomValueToCard(c),L=this.mapRandomValueToCardValue(c);d.push(p),m=(m+L)%10}let R=[],a=0;for(let c of s.slice(0,2)){let p=this.mapRandomValueToCard(c),L=this.mapRandomValueToCardValue(c);R.push(p),a=(a+L)%10}if(!this.isNaturalWin(m,a)){let c=this.shouldDrawThirdPlayerCard(m),p=null;if(c)p=this.mapRandomValueToCardValue(n[2]),d.push(this.mapRandomValueToCard(n[2])),m=(m+p)%10;if(this.shouldDrawThirdBankerCard(a,p))R.push(this.mapRandomValueToCard(s[2])),a=(a+this.mapRandomValueToCardValue(s[2]))%10}let f;if(m===a)f="TIE";else f=m>a?"PLAYER_WIN":"BANKER_WIN";let S=new v(0).add(e.playerBets.reduce((c,p)=>c.add(p.amount),new v(0))).add(e.tieBets.reduce((c,p)=>c.add(p.amount),new v(0))).add(e.bankerBets.reduce((c,p)=>c.add(p.amount),new v(0))),y=new v(0).add(e.playerBets.filter((c)=>f==="PLAYER_WIN").reduce((c,p)=>c.add(p.amount.mul(2)),new v(0))).add(e.tieBets.filter((c)=>f==="TIE").reduce((c,p)=>c.add(p.amount.mul(8)),new v(0))).add(e.bankerBets.filter((c)=>f==="BANKER_WIN").reduce((c,p)=>c.add(p.amount.mul(1.95)),new v(0)));return{isFinished:!0,payoutMultiplier:S.gt(0)?y.div(S):new v(0),outputs:{playerCards:d,playerHandValue:m,bankerCards:R,bankerHandValue:a,gameOutcome:f,result:i.values},randomValues:i}}validateGameInputs(t){if(t.playerBets.length===0&&t.tieBets.length===0&&t.bankerBets.length===0)throw new Error("Must place at least a single bet.");if(!t.playerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid player bet.");if(!t.tieBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid tie bet.");if(!t.bankerBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid banker bet.")}mapRandomValueToCard(t){let e=re[Math.floor(t/13)],r=ie[t%13];return{suit:e,rank:r}}isNaturalWin(t,e){let r=[8,9];return r.includes(t)||r.includes(e)}mapRandomValueToCardValue(t){let e=t%13;if(e===0)return 1;if(e>=10)return 10;return e+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,e){if(e===null)return t<=5;if(t<=2)return!0;if(t===3)return e!==8;if(t===4)return[2,3,4,5,6,7].includes(e);if(t===5)return[4,5,6,7].includes(e);if(t===6)return[6,7].includes(e);return!1}}import le from"big.js";var se;((s)=>{s.PAIR="PAIR";s.TWO_PAIR="TWO_PAIR";s.THREE_OF_A_KIND="THREE_OF_A_KIND";s.FULL_HOUSE="FULL_HOUSE";s.FOUR_OF_A_KIND="FOUR_OF_A_KIND";s.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(se||={});var ae={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},ue={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class ce extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??ae}constructor(t){super("DIAMONDS");this.multiplierOverrides=t}determineGameResult({generator:t,edge:e}){let r=t.getRandomIntsWithReplacement({min:0,max:6,count:5});if(e!==1&&!this.multiplierOverrides)throw new Error("Use multiplier overrides if an edge of 1% is not desirable");let i=r.values,o=this.calculatePayoutMultiplier(i);return{isFinished:!0,payoutMultiplier:le(o),outputs:{result:r.values},randomValues:r}}calculatePayoutMultiplier(t){let e=new Map;for(let o of t){let n=e.get(o)||0;e.set(o,n+1)}let r=[...e.values()].filter((o)=>o>1),i=this.classifyResult(r);return i===null?0:this.multipliers[i]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[e,r]=t;if(e===void 0)return null;if(r===void 0){let i=ue[e];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${e}`);return i}return e===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}import K from"big.js";var de;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(de||={});class pe extends u{constructor(){super("DICE")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:0,max:1e4}),o=i.min,d=i.max-o+1-1,m=r.direction==="ABOVE"?d-r.selectedValue:r.selectedValue,R=new K(m).div(d).mul(100);return{isFinished:!0,payoutMultiplier:(r.direction==="ABOVE"?i.value>r.selectedValue:i.value<r.selectedValue)?new K(100-e).div(R):new K(0),outputs:{result:i.values},randomValues:i}}}import P from"big.js";var me;((o)=>{o.CLASSIC="CLASSIC";o.LOW_RISK="LOW_RISK";o.MEDIUM_RISK="MEDIUM_RISK";o.HIGH_RISK="HIGH_RISK"})(me||={});var Be={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class fe extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Be}constructor(t){super("KENO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,edge:e,gameInputs:r}){if(e!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(r.selectedNumbers.length===0)throw new Error("No numbers selected");if(r.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let s of r.selectedNumbers){if(s%1!==0)throw new Error("Only integers can be selected");if(s<0||s>39)throw new Error("Invalid number selected")}let i=t.getUniqueRandomInts({min:0,max:39,count:10}),o=r.selectedNumbers.filter((s)=>i.values.includes(s));return{isFinished:!0,payoutMultiplier:o.length>0?new P(this.multipliers[r.selectedNumbers.length][r.riskLevel][o.length]??0):new P(0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let[e,r]of Object.entries(t)){let i=Number(e);for(let[o,n]of Object.entries(r))if(n.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${o}. Expected ${i+1}, but got ${n.length}`)}}}import E from"big.js";var H=(t,e)=>{return t.gt(e)?t:e};var N=(t,e)=>{return t.lt(e)?t:e};class Re extends u{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:e,gameInputs:r}){let i=t.getRandomInt({min:1,max:4294967295}),o=i.max,n=new E(16777216),s=new E(1),d=new E(1e6),m=i.value,R=new E(m-1).div(o),a=(100-e)/100,f=n.div(R.mul(n).plus(1)).mul(a),S=H(s,N(f,d));return{isFinished:!0,payoutMultiplier:S.gte(r.targetMultiplier)?new E(r.targetMultiplier):new E(0),outputs:{randomMultiplier:S,result:i.values},randomValues:i}}}import b from"big.js";var x=(t,e)=>{if(e<0||t<0||e>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(e>t-e)e=t-e;let r=1;for(let i=1;i<=e;i++)r=r*(t-i+1)/i;return r};class he extends u{constructor(){super("MINES")}determineGameResult({generator:t,edge:e,gameInputs:r}){if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>25-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let s=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),d=s.values.some((y)=>r.selectedTiles.includes(y)),m=r.hasCashedOut||d,R=(100-e)/100,a=new b(x(25-r.minesCount,r.selectedTiles.length)).div(new b(x(25,r.selectedTiles.length))),S=r.hasCashedOut&&!d?new b(R).div(a):new b(0);return{isFinished:m,payoutMultiplier:S,outputs:{result:s.values},randomValues:s}}}import{Big as ve}from"big.js";var V;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(V||={});var Se=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16],["MEDIUM_RISK"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}];class Ee extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Se}constructor(t){super("PLINKO");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(e.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(e.numberOfRows<8||e.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let i=t.getRandomIntsWithReplacement({min:0,max:1,count:e.numberOfRows}),n=i.values.reduce((d,m)=>d+m,0);return{isFinished:!0,payoutMultiplier:new ve(this.multipliers.find((d)=>d.rows===e.numberOfRows)?.payout[e.riskLevel][n]??0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){for(let e of Array.from({length:9},(r,i)=>i+8)){if(!t.some((i)=>i.rows===e))throw new Error(`Multiplier overrides for ${e} rows is missing.`);let r=Object.values(V);for(let i of r){let o=t.find((n)=>n.rows===e&&n.payout[i]);if(!o)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level is missing.`);if(o.payout[i].length!==e+1)throw new Error(`Multiplier overrides for ${e} rows and ${i} risk level has an invalid length.`)}}}}import{Big as l}from"big.js";var C=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],g=[37,...C],U=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],z=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],F=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],$=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],q=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],j=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],D=[0,1,2,3,37],Y=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],J=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],A;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(A||={});var I;((r)=>{r.RED="RED";r.BLACK="BLACK"})(I||={});var _;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(_||={});var G;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(G||={});var M;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(M||={});class Q extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:36}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),d=n.gt(0)?s.div(n):new l(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:d,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(I).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return C.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return U.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return F.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return q.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return Y.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l(0)))}calculateTotalPayoutAmount(t){return new l(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0)))}}class X extends u{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:e}){this.validateGameInputs(e);let r=t.getRandomInt({min:0,max:37}),i=r.value,o=this.determineBetOutcomes(e,i),n=this.calculateTotalBetAmount(e),s=this.calculateTotalPayoutAmount(o),d=n.gt(0)?s.div(n):new l(0);return{outputs:{betOutcomes:o,result:r.values},payoutMultiplier:d,isFinished:!0,randomValues:r}}validateGameInputs(t){if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw new Error("Must place at least a single bet.");if(!t.straightBets.every((e)=>e.amount.gte(0)&&this.isValidStraight(e.value)))throw new Error("Invalid straight bet.");if(!t.splitBets.every((e)=>e.amount.gte(0)&&this.isValidSplit(e.values)))throw new Error("Invalid split bet.");if(!t.streetBets.every((e)=>e.amount.gte(0)&&this.isValidStreet(e.values)))throw new Error("Invalid street bet.");if(!t.cornerBets.every((e)=>e.amount.gte(0)&&this.isValidCorner(e.values)))throw new Error("Invalid corner bet.");if(!t.basketBets.every((e)=>e.amount.gte(0)))throw new Error("Invalid basket bet.");if(!t.doubleStreetBets.every((e)=>e.amount.gte(0)&&this.isValidDoubleStreet(e.values)))throw new Error("Invalid double street bet.");if(!t.parityBets.every((e)=>e.amount.gte(0)&&Object.values(A).includes(e.parity)))throw new Error("Invalid parity bet.");if(!t.colorBets.every((e)=>e.amount.gte(0)&&Object.values(I).includes(e.color)))throw new Error("Invalid color bet.");if(!t.halfBets.every((e)=>e.amount.gte(0)&&Object.values(_).includes(e.half)))throw new Error("Invalid half bet.");if(!t.columnBets.every((e)=>e.amount.gte(0)&&Object.values(G).includes(e.column)))throw new Error("Invalid column bet.");if(!t.dozenBets.every((e)=>e.amount.gte(0)&&Object.values(M).includes(e.dozen)))throw new Error("Invalid dozen bet.")}isValidStraight(t){return g.includes(t)}isValidSplit(t){if(t.length!==2)return!1;if(!t.every(this.isValidStraight))return!1;return z.some(([e,r])=>e===t[0]&&r===t[1])}isValidStreet(t){if(t.length!==3)return!1;if(!t.every(this.isValidStraight))return!1;return $.some(([e,r,i])=>e===t[0]&&r===t[1]&&i===t[2])}isValidCorner(t){if(t.length!==4)return!1;if(!t.every(this.isValidStraight))return!1;return j.some(([e,r,i,o])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3])}isValidDoubleStreet(t){if(t.length!==6)return!1;if(!t.every(this.isValidStraight))return!1;return J.some(([e,r,i,o,n,s])=>e===t[0]&&r===t[1]&&i===t[2]&&o===t[3]&&n===t[4]&&s===t[5])}determineBetOutcomes(t,e){return{winningBets:{straightBets:t.straightBets.filter((r)=>r.value===e),splitBets:t.splitBets.filter((r)=>r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>D.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>this.isWinningDozenBet(r,e))},losingBets:{straightBets:t.straightBets.filter((r)=>r.value!==e),splitBets:t.splitBets.filter((r)=>!r.values.some((i)=>i===e)),streetBets:t.streetBets.filter((r)=>!r.values.some((i)=>i===e)),cornerBets:t.cornerBets.filter((r)=>!r.values.some((i)=>i===e)),basketBets:t.basketBets.filter((r)=>!D.some((i)=>i===e)),doubleStreetBets:t.doubleStreetBets.filter((r)=>!r.values.some((i)=>i===e)),parityBets:t.parityBets.filter((r)=>!this.isWinningParityBet(r,e)),colorBets:t.colorBets.filter((r)=>!this.isWinningColorBet(r,e)),halfBets:t.halfBets.filter((r)=>!this.isWinningHalfBet(r,e)),columnBets:t.columnBets.filter((r)=>!this.isWinningColumnBet(r,e)),dozenBets:t.dozenBets.filter((r)=>!this.isWinningDozenBet(r,e))}}}isWinningParityBet(t,e){if(e===0||e===37)return!1;let r=e%2===0?"EVEN":"ODD";return t.parity===r}isWinningColorBet(t,e){let r=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(r.includes(e)&&t.color==="RED")return!0;if(i.includes(e)&&t.color==="BLACK")return!0;return!1}isWinningHalfBet(t,e){if(e>0&&e<=18&&t.half==="LOW")return!0;if(e>18&&e<=36&&t.half==="HIGH")return!0;return!1}isWinningColumnBet(t,e){let r=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],o=[1,4,7,10,13,16,19,22,25,28,31,34];if(r.includes(e)&&t.column==="TOP")return!0;if(i.includes(e)&&t.column==="MIDDLE")return!0;if(o.includes(e)&&t.column==="BOTTOM")return!0;return!1}isWinningDozenBet(t,e){if(e>0&&e<=12&&t.dozen==="FIRST")return!0;if(e>12&&e<=24&&t.dozen==="SECOND")return!0;if(e>24&&e<=36&&t.dozen==="THIRD")return!0;return!1}calculateTotalBetAmount(t){return new l(0).add(t.straightBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.splitBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.streetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.cornerBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.basketBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.doubleStreetBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.parityBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.colorBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.halfBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.columnBets.reduce((e,r)=>e.plus(r.amount),new l(0))).add(t.dozenBets.reduce((e,r)=>e.plus(r.amount),new l(0)))}calculateTotalPayoutAmount(t){return new l(0).add(t.winningBets.straightBets.reduce((e,r)=>e.plus(r.amount.mul(36)),new l(0))).add(t.winningBets.splitBets.reduce((e,r)=>e.plus(r.amount.mul(18)),new l(0))).add(t.winningBets.streetBets.reduce((e,r)=>e.plus(r.amount.mul(12)),new l(0))).add(t.winningBets.cornerBets.reduce((e,r)=>e.plus(r.amount.mul(9)),new l(0))).add(t.winningBets.basketBets.reduce((e,r)=>e.plus(r.amount.mul(7)),new l(0))).add(t.winningBets.doubleStreetBets.reduce((e,r)=>e.plus(r.amount.mul(6)),new l(0))).add(t.winningBets.parityBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.colorBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.halfBets.reduce((e,r)=>e.plus(r.amount.mul(2)),new l(0))).add(t.winningBets.columnBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0))).add(t.winningBets.dozenBets.reduce((e,r)=>e.plus(r.amount.mul(3)),new l(0)))}}class we extends u{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Q,this.americanGame=new X}determineGameResult(t){let{gameInputs:e,...r}=t;if(t.edge===2.7&&e.type==="european"){let i=this.europeanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:o,result:i.outputs.result}}}if(t.edge===5.3&&e.type==="american"){let i=this.americanGame.determineGameResult({...r,gameInputs:e.inputs}),{betOutcomes:o}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:o,result:i.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}import{Big as ye}from"big.js";var T;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(T||={});var W;((n)=>{n[n.TEN=10]="TEN";n[n.TWENTY=20]="TWENTY";n[n.THIRTY=30]="THIRTY";n[n.FORTY=40]="FORTY";n[n.FIFTY=50]="FIFTY"})(W||={});var Le=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}];class be extends u{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Le}constructor(t){super("WHEEL");this.multiplierOverrides=t;if(t)this.validateMultiplierOverrides(t)}determineGameResult({generator:t,gameInputs:e,edge:r}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(!Object.values(W).includes(e.segments))throw new Error("Invalid segments value");if(!Object.values(T).includes(e.riskLevel))throw new Error("Invalid risk level");let i=t.getRandomInt({min:0,max:e.segments-1}),o=this.multipliers.find((d)=>d.segments===e.segments);if(o===void 0)throw new Error(`Multiplier not found for segment ${e.segments}`);let n=o.payout[e.riskLevel][i.value];if(n===void 0)throw new Error(`Payout not found for risk ${e.riskLevel} and value ${i.value}`);return{isFinished:!0,payoutMultiplier:new ye(n),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(t){let e=Object.values(W).filter((r)=>typeof r==="number");for(let r of e){if(!t.some((o)=>o.segments===r))throw new Error(`Multiplier overrides for ${r} segments is missing.`);let i=Object.values(T);for(let o of i){let n=t.find((s)=>s.segments===r&&s.payout[o]);if(!n)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level is missing.`);if(n.payout[o].length!==r)throw new Error(`Multiplier overrides for ${r} segments and ${o} risk level has an invalid length.`)}}}}export{W as WheelSegments,T as WheelRiskLevel,be as Wheel,re as VALID_SUITS,ie as VALID_RANKS,F as VALID_EUROPEAN_STREETS,C as VALID_EUROPEAN_STRAIGHTS,U as VALID_EUROPEAN_SPLITS,Y as VALID_EUROPEAN_DOUBLE_STREETS,q as VALID_EUROPEAN_CORNERS,$ as VALID_AMERICAN_STREETS,g as VALID_AMERICAN_STRAIGHTS,z as VALID_AMERICAN_SPLITS,J as VALID_AMERICAN_DOUBLE_STREETS,j as VALID_AMERICAN_CORNERS,we as Roulette,V as PlinkoRiskLevel,Ee as Plinko,A as Parity,B as OrigamiGame,he as Mines,Re as Limbo,me as KenoRiskLevel,fe as Keno,_ as Half,u as Game,M as Dozen,de as DiceDirection,pe as Dice,se as DiamondsResultType,ce as Diamonds,G as Column,I as Color,oe as BaccaratOutcome,ne as Baccarat,te as AdvancedDice,D as AMERICAN_BASKET};
1
+ var A;((d)=>{d.DICE="DICE";d.MINES="MINES";d.KENO="KENO";d.LIMBO="LIMBO";d.ADVANCED_DICE="ADVANCED_DICE";d.BACCARAT="BACCARAT";d.DIAMONDS="DIAMONDS";d.PLINKO="PLINKO";d.ROULETTE="ROULETTE";d.WHEEL="WHEEL"})(A||={});class f{gameId;constructor(e){this.gameId=e}getGameResult(e){return this.determineGameResult(e)}}import{Big as _}from"big.js";var Er=(e,r)=>r>=e.lower&&r<=e.upper,dr=(e)=>e.upper-e.lower+1,U=(e,r)=>r>e.lower&&r<e.upper,k=(e)=>e.upper-e.lower-1,fr;((i)=>{i.ROLL_BETWEEN="ROLL_BETWEEN";i.ROLL_OUTSIDE="ROLL_OUTSIDE";i.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(fr||={});var C={min:0,max:1e4,effectiveRange:10001};class ar extends f{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt(C),n=i.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return this.calculateRollBetweenPayoutMultiplier(o.bounds,n,r);case"ROLL_OUTSIDE":return this.calculateRollOutsidePayoutMultiplier(o.bounds,n,r);case"ROLL_BETWEEN_TWO":return this.calculateRollBetweenTwoPayoutMultiplier(o.firstBounds,o.secondBounds,n,r)}})(),outputs:{result:i.values},randomValues:i}}calculateRollBetweenPayoutMultiplier(e,r,o){if(!U(e,r))return _(0);let i=k(e),n=_(i).div(C.effectiveRange).mul(100);return _(100-o).div(n)}calculateRollOutsidePayoutMultiplier(e,r,o){if(Er(e,r))return _(0);let i=C.effectiveRange-dr(e),n=_(i).div(C.effectiveRange).mul(100);return _(100-o).div(n)}calculateRollBetweenTwoPayoutMultiplier(e,r,o,i){if(!U(e,o)&&!U(r,o))return _(0);let n=k(e)+k(r),t=_(n).div(C.effectiveRange).mul(100);return _(100-i).div(t)}}import D from"big.js";var Br=["Clubs","Diamonds","Hearts","Spades"],Sr=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],pr;((i)=>{i.PLAYER_WIN="PLAYER_WIN";i.TIE="TIE";i.BANKER_WIN="BANKER_WIN"})(pr||={});var Ar;((i)=>{i.PLAYER="PLAYER";i.TIE="TIE";i.BANKER="BANKER"})(Ar||={});var Lr={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:8},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},_r=(e)=>{return new D(0).add(e.bets.reduce((o,i)=>o.add(i.amount),new D(0)))};class hr extends f{constructor(){super("BACCARAT")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(r);let i=e.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=i.values,t=n.slice(0,3),l=n.slice(3,6),B=[],a=0;for(let p of t.slice(0,2)){let L=this.mapRandomValueToCard(p),N=this.mapRandomValueToCardValue(p);B.push(L),a=(a+N)%10}let S=[],d=0;for(let p of l.slice(0,2)){let L=this.mapRandomValueToCard(p),N=this.mapRandomValueToCardValue(p);S.push(L),d=(d+N)%10}if(!this.isNaturalWin(a,d)){let p=this.shouldDrawThirdPlayerCard(a),L=null;if(p)L=this.mapRandomValueToCardValue(t[2]),B.push(this.mapRandomValueToCard(t[2])),a=(a+L)%10;if(this.shouldDrawThirdBankerCard(d,L))S.push(this.mapRandomValueToCard(l[2])),d=(d+this.mapRandomValueToCardValue(l[2]))%10}let h;if(a===d)h="TIE";else h=a>d?"PLAYER_WIN":"BANKER_WIN";let y=_r(r),{betType:w,multiplier:cr}=Lr[h],lr=new D(0).add(r.bets.filter((p)=>p.type===w).reduce((p,L)=>p.add(L.amount.mul(cr)),new D(0)));return{isFinished:!0,payoutMultiplier:y.gt(0)?lr.div(y):new D(0),outputs:{playerCards:B,playerHandValue:a,bankerCards:S,bankerHandValue:d,gameOutcome:h,result:i.values},randomValues:i}}validateGameInputs(e){if(e.bets.length===0)throw new Error("Must place at least a single bet.");if(!e.bets.every((r)=>r.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(e){let r=Br[Math.floor(e/13)],o=Sr[e%13];return{suit:r,rank:o}}isNaturalWin(e,r){let o=[8,9];return o.includes(e)||o.includes(r)}mapRandomValueToCardValue(e){let r=e%13;if(r===0)return 1;if(r>=10)return 10;return r+1}shouldDrawThirdPlayerCard(e){return e<=5}shouldDrawThirdBankerCard(e,r){if(r===null)return e<=5;if(e<=2)return!0;if(e===3)return r!==8;if(e===4)return[2,3,4,5,6,7].includes(r);if(e===5)return[4,5,6,7].includes(r);if(e===6)return[6,7].includes(r);return!1}}import yr from"big.js";class T{multipliers;constructor(e){this.multipliers=e}getMultipliers(e){let r=this.multipliers.get(e);if(r===void 0)throw new Error(`Multipliers for ${e} not found`);return r}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([e,r])=>({edge:e,multipliers:r}))}}var Tr;((l)=>{l.PAIR="PAIR";l.TWO_PAIR="TWO_PAIR";l.THREE_OF_A_KIND="THREE_OF_A_KIND";l.FULL_HOUSE="FULL_HOUSE";l.FOUR_OF_A_KIND="FOUR_OF_A_KIND";l.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(Tr||={});var xr={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},sr=new T(new Map([[2,xr]])),Gr={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class ur extends f{constructor(){super("DIAMONDS")}determineGameResult({generator:e,edge:r}){let o=e.getRandomIntsWithReplacement({min:0,max:6,count:5}),i=sr.getMultipliers(r),n=o.values,t=this.calculatePayoutMultiplier(i,n);return{isFinished:!0,payoutMultiplier:yr(t),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(e,r){let o=new Map;for(let t of r){let l=o.get(t)||0;o.set(t,l+1)}let i=[...o.values()].filter((t)=>t>1),n=this.classifyResult(i);return n===null?0:e[n]}classifyResult(e){if(e.length>2)throw new Error(`Unexpected number of repeats ${e.length}`);let[r,o]=e;if(r===void 0)return null;if(o===void 0){let i=Gr[r];if(i===void 0)throw new Error(`Unexpected single diamond repeat count: ${r}`);return i}return r===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}import H from"big.js";var Rr;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(Rr||={});class Mr extends f{constructor(){super("DICE")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt({min:0,max:1e4}),n=i.min,B=i.max-n+1-1,a=o.direction==="ABOVE"?B-o.selectedValue:o.selectedValue,S=new H(a).div(B).mul(100);return{isFinished:!0,payoutMultiplier:(o.direction==="ABOVE"?i.value>o.selectedValue:i.value<o.selectedValue)?new H(100-r).div(S):new H(0),outputs:{result:i.values},randomValues:i}}}import F from"big.js";var Cr;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})(Cr||={});var Dr={[1]:{["CLASSIC"]:[0,3.96],["LOW_RISK"]:[0.7,1.85],["MEDIUM_RISK"]:[0.4,2.75],["HIGH_RISK"]:[0,3.96]},[2]:{["CLASSIC"]:[0,1.9,4.5],["LOW_RISK"]:[0,2,3.8],["MEDIUM_RISK"]:[0,1.8,5.1],["HIGH_RISK"]:[0,0,17.1]},[3]:{["CLASSIC"]:[0,1,3.1,10.4],["LOW_RISK"]:[0,1.1,1.38,26],["MEDIUM_RISK"]:[0,0,2.8,50],["HIGH_RISK"]:[0,0,0,81.5]},[4]:{["CLASSIC"]:[0,0.8,1.8,5,22.5],["LOW_RISK"]:[0,0,2.2,7.9,90],["MEDIUM_RISK"]:[0,0,1.7,10,100],["HIGH_RISK"]:[0,0,0,10,259]},[5]:{["CLASSIC"]:[0,0.25,1.4,4.1,16.5,36],["LOW_RISK"]:[0,0,1.5,4.2,13,300],["MEDIUM_RISK"]:[0,0,1.4,4,14,390],["HIGH_RISK"]:[0,0,0,4.5,48,450]},[6]:{["CLASSIC"]:[0,0,1,3.68,7,16.5,40],["LOW_RISK"]:[0,0,1.1,2,6.2,100,700],["MEDIUM_RISK"]:[0,0,0,3,9,180,710],["HIGH_RISK"]:[0,0,0,0,11,350,710]},[7]:{["CLASSIC"]:[0,0,0.47,3,4.5,14,31,60],["LOW_RISK"]:[0,0,1.1,1.6,3.5,15,225,700],["MEDIUM_RISK"]:[0,0,0,2,7,30,400,800],["HIGH_RISK"]:[0,0,0,0,7,90,400,800]},[8]:{["CLASSIC"]:[0,0,0,2.2,4,13,22,55,70],["LOW_RISK"]:[0,0,1.1,1.5,2,5.5,39,100,800],["MEDIUM_RISK"]:[0,0,0,2,4,11,67,400,900],["HIGH_RISK"]:[0,0,0,0,5,20,270,600,900]},[9]:{["CLASSIC"]:[0,0,0,1.55,3,8,15,44,60,85],["LOW_RISK"]:[0,0,1.1,1.3,1.7,2.5,7.5,50,250,1000],["MEDIUM_RISK"]:[0,0,0,2,2.5,5,15,100,500,1000],["HIGH_RISK"]:[0,0,0,0,4,11,56,500,800,1000]},[10]:{["CLASSIC"]:[0,0,0,1.4,2.25,4.5,8,17,50,80,100],["LOW_RISK"]:[0,0,1.1,1.2,1.3,1.8,3.5,13,50,250,1000],["MEDIUM_RISK"]:[0,0,0,1.6,2,4,7,26,100,500,1000],["HIGH_RISK"]:[0,0,0,0,3.5,8,13,63,500,800,1000]}};class Kr extends f{multiplierOverrides;get multipliers(){return this.multiplierOverrides??Dr}constructor(e){super("KENO");this.multiplierOverrides=e;if(e)this.validateMultiplierOverrides(e)}determineGameResult({generator:e,edge:r,gameInputs:o}){if(r!==1&&!this.multiplierOverrides)throw new Error("Multiplier overrides must be specified if an edge of 1% is not desirable");if(o.selectedNumbers.length===0)throw new Error("No numbers selected");if(o.selectedNumbers.length>10)throw new Error("Maximum of 10 numbers can be selected");for(let l of o.selectedNumbers){if(l%1!==0)throw new Error("Only integers can be selected");if(l<0||l>39)throw new Error("Invalid number selected")}let i=e.getUniqueRandomInts({min:0,max:39,count:10}),n=o.selectedNumbers.filter((l)=>i.values.includes(l));return{isFinished:!0,payoutMultiplier:n.length>0?new F(this.multipliers[o.selectedNumbers.length][o.riskLevel][n.length]??0):new F(0),outputs:{result:i.values},randomValues:i}}validateMultiplierOverrides(e){for(let[r,o]of Object.entries(e)){let i=Number(r);for(let[n,t]of Object.entries(o))if(t.length!==i+1)throw new Error(`Invalid count of multipliers for tiles ${i} and risk level ${n}. Expected ${i+1}, but got ${t.length}`)}}}import x from"big.js";var Y=(e,r)=>{return e.gt(r)?e:r};var I=(e,r)=>{return e.lt(r)?e:r};class vr extends f{constructor(){super("LIMBO")}determineGameResult({generator:e,edge:r,gameInputs:o}){let i=e.getRandomInt({min:1,max:4294967295}),n=i.max,t=new x(16777216),l=new x(1),B=new x(1e6),a=i.value,S=new x(a-1).div(n),d=(100-r)/100,h=t.div(S.mul(t).plus(1)).mul(d),y=Y(l,I(h,B));return{isFinished:!0,payoutMultiplier:y.gte(o.targetMultiplier)?new x(o.targetMultiplier):new x(0),outputs:{randomMultiplier:y,result:i.values},randomValues:i}}}import O from"big.js";var W=(e,r)=>{if(r<0||e<0||r>e)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(r>e-r)r=e-r;let o=1;for(let i=1;i<=r;i++)o=o*(e-i+1)/i;return o};class wr extends f{constructor(){super("MINES")}determineGameResult({generator:e,edge:r,gameInputs:o}){if(o.minesCount<=0||o.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(o.selectedTiles.length>25-o.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let l=e.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),B=l.values.some((w)=>o.selectedTiles.includes(w)),a=o.hasCashedOut||B,S=(100-r)/100,d=new O(W(25-o.minesCount,o.selectedTiles.length)).div(new O(W(25,o.selectedTiles.length))),y=o.hasCashedOut&&!B?new O(S).div(d):new O(0);return{isFinished:a,payoutMultiplier:y,outputs:{result:l.values},randomValues:l}}}import{Big as Nr}from"big.js";var Or;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(Or||={});var Vr=[{rows:8,payout:{["LOW_RISK"]:[5.6,2.1,1.1,1,0.5,1,1.1,2.1,5.6],["MEDIUM_RISK"]:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],["HIGH_RISK"]:[29,4,1.5,0.3,0.2,0.3,1.5,4,29]}},{rows:9,payout:{["LOW_RISK"]:[5.6,2,1.6,1,0.7,0.7,1,1.6,2,5.6],["MEDIUM_RISK"]:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],["HIGH_RISK"]:[43,7,2,0.6,0.2,0.2,0.6,2,7,43]}},{rows:10,payout:{["LOW_RISK"]:[8.9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,8.9],["MEDIUM_RISK"]:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],["HIGH_RISK"]:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76]}},{rows:11,payout:{["LOW_RISK"]:[8.4,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8.4],["MEDIUM_RISK"]:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],["HIGH_RISK"]:[120,14,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,14,120]}},{rows:12,payout:{["LOW_RISK"]:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],["MEDIUM_RISK"]:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],["HIGH_RISK"]:[170,24,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,24,170]}},{rows:13,payout:{["LOW_RISK"]:[8.1,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8.1],["MEDIUM_RISK"]:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],["HIGH_RISK"]:[260,37,11,4,1,0.2,0.2,0.2,0.2,1,4,11,37,260]}},{rows:14,payout:{["LOW_RISK"]:[7.1,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7.1],["MEDIUM_RISK"]:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],["HIGH_RISK"]:[420,56,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56,420]}},{rows:15,payout:{["LOW_RISK"]:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],["MEDIUM_RISK"]:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],["HIGH_RISK"]:[620,83,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,83,620]}},{rows:16,payout:{["LOW_RISK"]:[16,9,2,1.4,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,1.4,2,9,16],["MEDIUM_RISK"]:[110,41,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41,110],["HIGH_RISK"]:[1000,130,26,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26,130,1000]}}],Pr=new T(new Map([[1,Vr]]));class Ur extends f{constructor(){super("PLINKO")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(r.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(r.numberOfRows<8||r.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let i=Pr.getMultipliers(o),n=e.getRandomIntsWithReplacement({min:0,max:1,count:r.numberOfRows}),l=n.values.reduce((a,S)=>a+S,0);return{isFinished:!0,payoutMultiplier:new Nr(i.find((a)=>a.rows===r.numberOfRows)?.payout[r.riskLevel][l]??0),outputs:{result:n.values},randomValues:n}}}import{Big as c}from"big.js";var j=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],$=[37,...j],z=[[0,1],[0,2],[0,3],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],J=[[0,1],[0,3],[0,37],[1,2],[1,4],[2,3],[2,5],[3,6],[4,5],[4,7],[5,6],[5,8],[6,9],[7,8],[7,10],[8,9],[8,11],[9,12],[10,11],[10,13],[11,12],[11,14],[12,15],[13,14],[13,16],[14,15],[14,17],[15,18],[16,17],[16,19],[17,18],[17,20],[18,21],[19,20],[19,22],[20,21],[20,23],[21,24],[22,23],[22,25],[23,24],[23,26],[24,27],[25,26],[25,28],[26,27],[26,29],[27,30],[28,29],[28,31],[29,30],[29,32],[30,33],[31,32],[31,34],[32,33],[32,35],[33,36],[34,35],[35,36]],Q=[[0,1,2],[0,2,3],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],X=[[0,1,2],[0,2,37],[1,2,3],[2,3,37],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20,21],[22,23,24],[25,26,27],[28,29,30],[31,32,33],[34,35,36]],Z=[[0,1,2,3],[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],b=[[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9],[7,8,10,11],[8,9,11,12],[10,11,13,14],[11,12,14,15],[13,14,16,17],[14,15,17,18],[16,17,19,20],[17,18,20,21],[19,20,22,23],[20,21,23,24],[22,23,25,26],[23,24,26,27],[25,26,28,29],[26,27,29,30],[28,29,31,32],[29,30,32,33],[31,32,34,35],[32,33,35,36]],q=[0,1,2,3,37],m=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],g=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],s;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(s||={});var G;((o)=>{o.RED="RED";o.BLACK="BLACK"})(G||={});var u;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(u||={});var R;((i)=>{i.TOP="TOP";i.MIDDLE="MIDDLE";i.BOTTOM="BOTTOM"})(R||={});var M;((i)=>{i.FIRST="FIRST";i.SECOND="SECOND";i.THIRD="THIRD"})(M||={});var kr;((r)=>r.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(kr||={});class E extends Error{static createValidationError(e){return new E("INPUT_VALIDATION_ERROR",e)}static isGameError(e){return e instanceof E}errorCode;constructor(e,r){super(r);this.errorCode=e}}var V=(e)=>{if(e.straightBets.length===0&&e.splitBets.length===0&&e.streetBets.length===0&&e.cornerBets.length===0&&e.doubleStreetBets.length===0&&e.parityBets.length===0&&e.colorBets.length===0&&e.halfBets.length===0&&e.columnBets.length===0&&e.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!e.straightBets.every((r)=>r.amount.gte(0)&&K(r.value)))throw E.createValidationError("Invalid straight bet.");if(!e.splitBets.every((r)=>r.amount.gte(0)&&Hr(r.values)))throw E.createValidationError("Invalid split bet.");if(!e.streetBets.every((r)=>r.amount.gte(0)&&Wr(r.values)))throw E.createValidationError("Invalid street bet.");if(!e.cornerBets.every((r)=>r.amount.gte(0)&&jr(r.values)))throw E.createValidationError("Invalid corner bet.");if(!e.doubleStreetBets.every((r)=>r.amount.gte(0)&&qr(r.values)))throw E.createValidationError("Invalid double street bet.");if(!e.parityBets.every((r)=>r.amount.gte(0)&&Object.values(s).includes(r.parity)))throw E.createValidationError("Invalid parity bet.");if(!e.colorBets.every((r)=>r.amount.gte(0)&&Object.values(G).includes(r.color)))throw E.createValidationError("Invalid color bet.");if(!e.halfBets.every((r)=>r.amount.gte(0)&&Object.values(u).includes(r.half)))throw E.createValidationError("Invalid half bet.");if(!e.columnBets.every((r)=>r.amount.gte(0)&&Object.values(R).includes(r.column)))throw E.createValidationError("Invalid column bet.");if(!e.dozenBets.every((r)=>r.amount.gte(0)&&Object.values(M).includes(r.dozen)))throw E.createValidationError("Invalid dozen bet.")},K=(e)=>{return j.includes(e)},Hr=(e)=>{if(e.length!==2)return!1;if(!e.every(K))return!1;return z.some(([r,o])=>r===e[0]&&o===e[1])},Wr=(e)=>{if(e.length!==3)return!1;if(!e.every(K))return!1;return Q.some(([r,o,i])=>r===e[0]&&o===e[1]&&i===e[2])},jr=(e)=>{if(e.length!==4)return!1;if(!e.every(K))return!1;return Z.some(([r,o,i,n])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3])},qr=(e)=>{if(e.length!==6)return!1;if(!e.every(K))return!1;return m.some(([r,o,i,n,t,l])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3]&&t===e[4]&&l===e[5])};var P=(e)=>{if(e.straightBets.length===0&&e.splitBets.length===0&&e.streetBets.length===0&&e.cornerBets.length===0&&e.basketBets.length===0&&e.doubleStreetBets.length===0&&e.parityBets.length===0&&e.colorBets.length===0&&e.halfBets.length===0&&e.columnBets.length===0&&e.dozenBets.length===0)throw E.createValidationError("Must place at least a single bet.");if(!e.straightBets.every((r)=>r.amount.gte(0)&&v(r.value)))throw E.createValidationError("Invalid straight bet.");if(!e.splitBets.every((r)=>r.amount.gte(0)&&Fr(r.values)))throw E.createValidationError("Invalid split bet.");if(!e.streetBets.every((r)=>r.amount.gte(0)&&Yr(r.values)))throw E.createValidationError("Invalid street bet.");if(!e.cornerBets.every((r)=>r.amount.gte(0)&&Ir(r.values)))throw E.createValidationError("Invalid corner bet.");if(!e.basketBets.every((r)=>r.amount.gte(0)))throw E.createValidationError("Invalid basket bet.");if(!e.doubleStreetBets.every((r)=>r.amount.gte(0)&&$r(r.values)))throw E.createValidationError("Invalid double street bet.");if(!e.parityBets.every((r)=>r.amount.gte(0)&&Object.values(s).includes(r.parity)))throw E.createValidationError("Invalid parity bet.");if(!e.colorBets.every((r)=>r.amount.gte(0)&&Object.values(G).includes(r.color)))throw E.createValidationError("Invalid color bet.");if(!e.halfBets.every((r)=>r.amount.gte(0)&&Object.values(u).includes(r.half)))throw E.createValidationError("Invalid half bet.");if(!e.columnBets.every((r)=>r.amount.gte(0)&&Object.values(R).includes(r.column)))throw E.createValidationError("Invalid column bet.");if(!e.dozenBets.every((r)=>r.amount.gte(0)&&Object.values(M).includes(r.dozen)))throw E.createValidationError("Invalid dozen bet.")},v=(e)=>{return $.includes(e)};function Fr(e){if(e.length!==2)return!1;if(!e.every(v))return!1;return J.some(([r,o])=>r===e[0]&&o===e[1])}var Yr=(e)=>{if(e.length!==3)return!1;if(!e.every(v))return!1;return X.some(([r,o,i])=>r===e[0]&&o===e[1]&&i===e[2])},Ir=(e)=>{if(e.length!==4)return!1;if(!e.every(v))return!1;return b.some(([r,o,i,n])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3])},$r=(e)=>{if(e.length!==6)return!1;if(!e.every(v))return!1;return g.some(([r,o,i,n,t,l])=>r===e[0]&&o===e[1]&&i===e[2]&&n===e[3]&&t===e[4]&&l===e[5])};var rr=(e)=>{return new c(0).add(e.straightBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.splitBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.streetBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.cornerBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.doubleStreetBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.parityBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.colorBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.halfBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.columnBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.dozenBets.reduce((r,o)=>r.plus(o.amount),new c(0)))},er=(e)=>{return new c(0).add(e.straightBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.splitBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.streetBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.cornerBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.basketBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.doubleStreetBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.parityBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.colorBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.halfBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.columnBets.reduce((r,o)=>r.plus(o.amount),new c(0))).add(e.dozenBets.reduce((r,o)=>r.plus(o.amount),new c(0)))},$e=(e)=>{return e.type==="european"?rr(e.inputs):er(e.inputs)};class or extends f{constructor(){super("ROULETTE")}determineGameResult({generator:e,gameInputs:r}){V(r);let o=e.getRandomInt({min:0,max:36}),i=o.value,n=this.determineBetOutcomes(r,i),t=rr(r),l=this.calculateTotalPayoutAmount(n),B=t.gt(0)?l.div(t):new c(0);return{outputs:{betOutcomes:n,result:o.values},payoutMultiplier:B,isFinished:!0,randomValues:o}}determineBetOutcomes(e,r){return{winningBets:{straightBets:e.straightBets.filter((o)=>o.value===r),splitBets:e.splitBets.filter((o)=>o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>o.values.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>this.isWinningDozenBet(o,r))},losingBets:{straightBets:e.straightBets.filter((o)=>o.value!==r),splitBets:e.splitBets.filter((o)=>!o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>!o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>!o.values.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>!o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>!this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>!this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>!this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>!this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>!this.isWinningDozenBet(o,r))}}}isWinningParityBet(e,r){if(r===0)return!1;let o=r%2===0?"EVEN":"ODD";return e.parity===o}isWinningColorBet(e,r){let o=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(o.includes(r)&&e.color==="RED")return!0;if(i.includes(r)&&e.color==="BLACK")return!0;return!1}isWinningHalfBet(e,r){if(r>0&&r<=18&&e.half==="LOW")return!0;if(r>18&&r<=36&&e.half==="HIGH")return!0;return!1}isWinningColumnBet(e,r){let o=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(o.includes(r)&&e.column==="TOP")return!0;if(i.includes(r)&&e.column==="MIDDLE")return!0;if(n.includes(r)&&e.column==="BOTTOM")return!0;return!1}isWinningDozenBet(e,r){if(r>0&&r<=12&&e.dozen==="FIRST")return!0;if(r>12&&r<=24&&e.dozen==="SECOND")return!0;if(r>24&&r<=36&&e.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(e){return new c(0).add(e.winningBets.straightBets.reduce((r,o)=>r.plus(o.amount.mul(36)),new c(0))).add(e.winningBets.splitBets.reduce((r,o)=>r.plus(o.amount.mul(18)),new c(0))).add(e.winningBets.streetBets.reduce((r,o)=>r.plus(o.amount.mul(12)),new c(0))).add(e.winningBets.cornerBets.reduce((r,o)=>r.plus(o.amount.mul(9)),new c(0))).add(e.winningBets.doubleStreetBets.reduce((r,o)=>r.plus(o.amount.mul(6)),new c(0))).add(e.winningBets.parityBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.colorBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.halfBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.columnBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c(0))).add(e.winningBets.dozenBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c(0)))}}class ir extends f{constructor(){super("ROULETTE")}determineGameResult({generator:e,gameInputs:r}){P(r);let o=e.getRandomInt({min:0,max:37}),i=o.value,n=this.determineBetOutcomes(r,i),t=er(r),l=this.calculateTotalPayoutAmount(n),B=t.gt(0)?l.div(t):new c(0);return{outputs:{betOutcomes:n,result:o.values},payoutMultiplier:B,isFinished:!0,randomValues:o}}determineBetOutcomes(e,r){return{winningBets:{straightBets:e.straightBets.filter((o)=>o.value===r),splitBets:e.splitBets.filter((o)=>o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>o.values.some((i)=>i===r)),basketBets:e.basketBets.filter((o)=>q.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>this.isWinningDozenBet(o,r))},losingBets:{straightBets:e.straightBets.filter((o)=>o.value!==r),splitBets:e.splitBets.filter((o)=>!o.values.some((i)=>i===r)),streetBets:e.streetBets.filter((o)=>!o.values.some((i)=>i===r)),cornerBets:e.cornerBets.filter((o)=>!o.values.some((i)=>i===r)),basketBets:e.basketBets.filter((o)=>!q.some((i)=>i===r)),doubleStreetBets:e.doubleStreetBets.filter((o)=>!o.values.some((i)=>i===r)),parityBets:e.parityBets.filter((o)=>!this.isWinningParityBet(o,r)),colorBets:e.colorBets.filter((o)=>!this.isWinningColorBet(o,r)),halfBets:e.halfBets.filter((o)=>!this.isWinningHalfBet(o,r)),columnBets:e.columnBets.filter((o)=>!this.isWinningColumnBet(o,r)),dozenBets:e.dozenBets.filter((o)=>!this.isWinningDozenBet(o,r))}}}isWinningParityBet(e,r){if(r===0||r===37)return!1;let o=r%2===0?"EVEN":"ODD";return e.parity===o}isWinningColorBet(e,r){let o=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],i=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35];if(o.includes(r)&&e.color==="RED")return!0;if(i.includes(r)&&e.color==="BLACK")return!0;return!1}isWinningHalfBet(e,r){if(r>0&&r<=18&&e.half==="LOW")return!0;if(r>18&&r<=36&&e.half==="HIGH")return!0;return!1}isWinningColumnBet(e,r){let o=[3,6,9,12,15,18,21,24,27,30,33,36],i=[2,5,8,11,14,17,20,23,26,29,32,35],n=[1,4,7,10,13,16,19,22,25,28,31,34];if(o.includes(r)&&e.column==="TOP")return!0;if(i.includes(r)&&e.column==="MIDDLE")return!0;if(n.includes(r)&&e.column==="BOTTOM")return!0;return!1}isWinningDozenBet(e,r){if(r>0&&r<=12&&e.dozen==="FIRST")return!0;if(r>12&&r<=24&&e.dozen==="SECOND")return!0;if(r>24&&r<=36&&e.dozen==="THIRD")return!0;return!1}calculateTotalPayoutAmount(e){return new c(0).add(e.winningBets.straightBets.reduce((r,o)=>r.plus(o.amount.mul(36)),new c(0))).add(e.winningBets.splitBets.reduce((r,o)=>r.plus(o.amount.mul(18)),new c(0))).add(e.winningBets.streetBets.reduce((r,o)=>r.plus(o.amount.mul(12)),new c(0))).add(e.winningBets.cornerBets.reduce((r,o)=>r.plus(o.amount.mul(9)),new c(0))).add(e.winningBets.basketBets.reduce((r,o)=>r.plus(o.amount.mul(7)),new c(0))).add(e.winningBets.doubleStreetBets.reduce((r,o)=>r.plus(o.amount.mul(6)),new c(0))).add(e.winningBets.parityBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.colorBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.halfBets.reduce((r,o)=>r.plus(o.amount.mul(2)),new c(0))).add(e.winningBets.columnBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c(0))).add(e.winningBets.dozenBets.reduce((r,o)=>r.plus(o.amount.mul(3)),new c(0)))}}class zr extends f{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new or,this.americanGame=new ir}determineGameResult(e){let{gameInputs:r,...o}=e;if(e.edge===2.7&&r.type==="european"){let i=this.europeanGame.determineGameResult({...o,gameInputs:r.inputs}),{betOutcomes:n}=i.outputs;return{...i,outputs:{type:"european",betOutcomes:n,result:i.outputs.result}}}if(e.edge===5.3&&r.type==="american"){let i=this.americanGame.determineGameResult({...o,gameInputs:r.inputs}),{betOutcomes:n}=i.outputs;return{...i,outputs:{type:"american",betOutcomes:n,result:i.outputs.result}}}throw new Error("Only European & American Roulette games are supported")}}var Xe=(e)=>{if(e.type==="european")V(e.inputs);else P(e.inputs)};import{Big as Jr}from"big.js";var nr;((i)=>{i.LOW_RISK="LOW_RISK";i.MEDIUM_RISK="MEDIUM_RISK";i.HIGH_RISK="HIGH_RISK"})(nr||={});var tr;((t)=>{t[t.TEN=10]="TEN";t[t.TWENTY=20]="TWENTY";t[t.THIRTY=30]="THIRTY";t[t.FORTY=40]="FORTY";t[t.FIFTY=50]="FIFTY"})(tr||={});var Qr=[{segments:10,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[0,1.9,0,1.5,0,2,0,1.5,0,3],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,9.9]}},{segments:20,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.8,0,2,0,2,0,1.5,0,2,0,2,0,3,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.8]}},{segments:30,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,2,0,3,0,1.7,0,1.5,0,2,0,1.5,0,2,0,1.5,0,2,0,4,0,1.5,0,2,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29.7]}},{segments:40,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[2,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0,1.6,0,1.5,0,3,0,2,0,1.5,0,2,0,1.5,0,3,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39.6]}},{segments:50,payout:{["LOW_RISK"]:[1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0,1.5,1.2,1.2,1.2,0,1.2,1.2,1.2,1.2,0],["MEDIUM_RISK"]:[1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,3,0,1.5,0,2,0,1.5,0,2,0,1.5,0,5,0,1.5,0,2,0,1.5,0],["HIGH_RISK"]:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49.5]}}],Xr=new T(new Map([[1,Qr]]));class Zr extends f{constructor(){super("WHEEL")}determineGameResult({generator:e,gameInputs:r,edge:o}){if(!Object.values(tr).includes(r.segments))throw new Error("Invalid segments value");if(!Object.values(nr).includes(r.riskLevel))throw new Error("Invalid risk level");let i=Xr.getMultipliers(o).find((B)=>B.segments===r.segments);if(i===void 0)throw new Error(`Multiplier not found for segment ${r.segments}`);let n=e.getRandomInt({min:0,max:r.segments-1}),t=i.payout[r.riskLevel][n.value];if(t===void 0)throw new Error(`Payout not found for risk ${r.riskLevel} and value ${n.value}`);return{isFinished:!0,payoutMultiplier:new Jr(t),outputs:{result:n.values},randomValues:n}}}export{Xr as wheelMultipliers,Xe as validateRouletteGameInputs,Pr as plinkoMultipliers,$e as calculateRouletteBetAmount,_r as calculateBaccaratBetAmount,tr as WheelSegments,nr as WheelRiskLevel,Zr as Wheel,Br as VALID_SUITS,Sr as VALID_RANKS,Q as VALID_EUROPEAN_STREETS,j as VALID_EUROPEAN_STRAIGHTS,z as VALID_EUROPEAN_SPLITS,m as VALID_EUROPEAN_DOUBLE_STREETS,Z as VALID_EUROPEAN_CORNERS,X as VALID_AMERICAN_STREETS,$ as VALID_AMERICAN_STRAIGHTS,J as VALID_AMERICAN_SPLITS,g as VALID_AMERICAN_DOUBLE_STREETS,b as VALID_AMERICAN_CORNERS,zr as Roulette,fr as RollType,Or as PlinkoRiskLevel,Ur as Plinko,s as Parity,A as OrigamiGame,wr as Mines,vr as Limbo,Cr as KenoRiskLevel,Kr as Keno,u as Half,kr as GameErrorCode,E as GameError,f as Game,M as Dozen,Rr as DiceDirection,Mr as Dice,Tr as DiamondsResultType,ur as Diamonds,R as Column,G as Color,pr as BaccaratOutcome,Ar as BaccaratBetType,hr as Baccarat,ar as AdvancedDice,q as AMERICAN_BASKET};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@betorigami/game-calculations",
3
- "version": "0.0.0-sha-13931c3-20251102233803",
3
+ "version": "0.0.0-sha-0123787-20251113225519",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",