@betorigami/game-calculations 4.4.1 → 4.4.3
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 +1 -1
- package/dist/index.d.ts +16 -15
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var co=Object.create;var{getPrototypeOf:Oo,defineProperty:J,getOwnPropertyNames:ot,getOwnPropertyDescriptor:xo}=Object,Et=Object.prototype.hasOwnProperty;var _=(r,t,o)=>{o=r!=null?co(Oo(r)):{};let E=t||!r||!r.__esModule?J(o,"default",{value:r,enumerable:!0}):o;for(let A of ot(r))if(!Et.call(E,A))J(E,A,{get:()=>r[A],enumerable:!0});return E},tt=new WeakMap,Bo=(r)=>{var t=tt.get(r),o;if(t)return t;if(t=J({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")ot(r).map((E)=>!Et.call(t,E)&&J(t,E,{get:()=>r[E],enumerable:!(o=xo(r,E))||o.enumerable}));return tt.set(r,t),t};var Co=(r,t)=>{for(var o in t)J(r,o,{get:t[o],enumerable:!0,configurable:!0,set:(E)=>t[o]=()=>E})};var Ko={};Co(Ko,{validateRouletteGameInputs:()=>Ho,validateAdvancedDiceInputs:()=>Do,rtp99Multipliers:()=>qt,rtp98Multipliers:()=>Qt,rtp97Multipliers:()=>Xt,rtp96Multipliers:()=>It,rtp92Multipliers:()=>jt,plinkoMultipliers:()=>Ir,nCr:()=>Cr,kenoMultipliers:()=>zr,isTileCount:()=>Jr,hasDiceWon:()=>$t,diamondsMultipliers:()=>Ft,calculateRouletteBetAmount:()=>mo,calculateDiceWinChance:()=>Yt,calculateBaccaratBetAmount:()=>Zt,calculateAdvancedDiceWinChance:()=>Nr,bigMin:()=>Qr,bigMax:()=>qr,advancedDiceIsWithinBoundsInclusive:()=>ct,advancedDiceIsWithinBoundsExclusive:()=>rr,advancedDiceGetInclusiveBoundsRange:()=>Ot,advancedDiceGetExclusiveBoundsRange:()=>tr,WheelSegments:()=>Y,WheelRiskLevel:()=>R,Wheel:()=>fo,WIN_MULTIPLIER:()=>Gr,VALID_SUITS:()=>Ct,VALID_RANKS:()=>St,VALID_EUROPEAN_STREETS:()=>Wr,VALID_EUROPEAN_STRAIGHTS:()=>Sr,VALID_EUROPEAN_SPLITS:()=>mr,VALID_EUROPEAN_DOUBLE_STREETS:()=>Kr,VALID_EUROPEAN_CORNERS:()=>sr,VALID_AMERICAN_STREETS:()=>nr,VALID_AMERICAN_STRAIGHTS:()=>jr,VALID_AMERICAN_SPLITS:()=>Hr,VALID_AMERICAN_DOUBLE_STREETS:()=>vr,VALID_AMERICAN_CORNERS:()=>Lr,TOP_COLUMN:()=>Kt,TILE_COUNTS:()=>zt,RouletteType:()=>dr,Roulette:()=>rt,RollType:()=>xt,RandomValuePool:()=>W,RED_NUMBERS:()=>et,RANDOM_MIN_VALUE:()=>or,RANDOM_MAX_VALUE:()=>Er,PlinkoRiskLevel:()=>Xr,Plinko:()=>Lt,Parity:()=>w,PUSH_MULTIPLIER:()=>Tr,PLINKO_ROW_COUNTS:()=>ao,PAYOUT_MULTIPLIERS:()=>lt,OrigamiGame:()=>Z,MultiplierCalculator:()=>y,Mines:()=>nt,MIN_WIN_CHANCE:()=>ft,MIDDLE_COLUMN:()=>vt,MAX_WIN_CHANCE:()=>it,MAX_CARDS_PER_ROUND:()=>fr,Limbo:()=>Wt,LOSE_MULTIPLIER:()=>yr,KenoRiskLevel:()=>$r,Keno:()=>Ht,InsuranceOutcome:()=>wr,INSURANCE_BET_MULTIPLIER:()=>q,Half:()=>a,GameErrorCode:()=>At,GameError:()=>c,Game:()=>C,FACE_CARD_VALUE:()=>Ur,EuropeanRoulette:()=>er,EUROPEAN_HOUSE_EDGE:()=>ro,EFFECTIVE_RANGE:()=>Dr,Dozen:()=>F,DiceDirection:()=>Rt,Dice:()=>Jt,DiamondsResultType:()=>ut,Diamonds:()=>Pt,DOUBLE_DOWN_ADDITIONAL_MULTIPLIER:()=>Vr,DICE_EFFECTIVE_RANGE:()=>Rr,DEALER_STAND_VALUE:()=>br,Column:()=>u,Color:()=>M,CARDS_PER_SUIT:()=>No,BlackjackOutcome:()=>xr,BlackjackActionType:()=>Mr,Blackjack:()=>Mt,BaccaratOutcome:()=>dt,BaccaratBetType:()=>pt,Baccarat:()=>Dt,BUST_VALUE:()=>Ar,BOTTOM_COLUMN:()=>gt,BLACK_NUMBERS:()=>kt,BLACKJACK_VALUE:()=>z,BLACKJACK_MULTIPLIER:()=>_r,AmericanRoulette:()=>kr,AdvancedDice:()=>Bt,AMERICAN_HOUSE_EDGE:()=>to,AMERICAN_BASKET:()=>lr,ACE_SOFT_BONUS:()=>ir});module.exports=Bo(Ko);var At;((t)=>t.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(At||={});class c extends Error{static createValidationError(r){return new c("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof c}errorCode;constructor(r,t){super(t);this.errorCode=r}}var Z;((x)=>{x.DICE="DICE";x.MINES="MINES";x.KENO="KENO";x.LIMBO="LIMBO";x.ADVANCED_DICE="ADVANCED_DICE";x.BACCARAT="BACCARAT";x.DIAMONDS="DIAMONDS";x.PLINKO="PLINKO";x.ROULETTE="ROULETTE";x.WHEEL="WHEEL";x.BLACKJACK="BLACKJACK"})(Z||={});class C{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}var hr=require("big.js");var e=_(require("big.js"));class y{static withMultiplier(r,t){return new e.default(r).times(new e.default(100-t).div(100))}static withWinChance(r,t){return e.default(100-r).div(t)}}var or=0,Er=1e4,Dr=10001,ft=0.01,it=98,So=(r)=>{if(r<or)throw c.createValidationError(`Lower bound ${r} is below minimum allowed value ${or}`)},po=(r)=>{if(r>Er)throw c.createValidationError(`Upper bound ${r} is above maximum allowed value ${Er}`)},k=(r)=>{if(So(r.lower),po(r.upper),r.lower>=r.upper)throw c.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},Zo=(r,t)=>{let[o,E]=r.lower<=t.lower?[r,t]:[t,r];if(o.upper>E.lower)throw c.createValidationError("Bounds must not overlap")},ct=(r,t)=>t>=r.lower&&t<=r.upper,Ot=(r)=>r.upper-r.lower+1,rr=(r,t)=>t>r.lower&&t<r.upper,tr=(r)=>r.upper-r.lower-1,xt;((E)=>{E.ROLL_BETWEEN="ROLL_BETWEEN";E.ROLL_OUTSIDE="ROLL_OUTSIDE";E.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(xt||={});var Nr=(r)=>{let o=(()=>{switch(r.mode){case"ROLL_BETWEEN":return k(r.bounds),tr(r.bounds);case"ROLL_OUTSIDE":return k(r.bounds),Dr-Ot(r.bounds);case"ROLL_BETWEEN_TWO":return k(r.firstBounds),k(r.secondBounds),Zo(r.firstBounds,r.secondBounds),tr(r.firstBounds)+tr(r.secondBounds)}})(),E=hr.Big(o).div(Dr).mul(100);if(E.lt(ft))throw c.createValidationError("Win chance too low");if(E.gt(it))throw c.createValidationError("Win chance too high");return E},Do=(r)=>{Nr(r)};class Bt extends C{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=Nr(o),A=r.getRandomInt({min:or,max:Er}),f=A.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return rr(o.bounds,f);case"ROLL_OUTSIDE":return!ct(o.bounds,f);case"ROLL_BETWEEN_TWO":return rr(o.firstBounds,f)||rr(o.secondBounds,f)}})()?y.withWinChance(t,E):new hr.Big(0),outputs:{result:A.values},randomValues:A}}}var b=_(require("big.js"));var Ct=["Clubs","Diamonds","Hearts","Spades"],St=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],dt;((E)=>{E.PLAYER_WIN="PLAYER_WIN";E.TIE="TIE";E.BANKER_WIN="BANKER_WIN"})(dt||={});var pt;((E)=>{E.PLAYER="PLAYER";E.TIE="TIE";E.BANKER="BANKER"})(pt||={});var ho={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},Zt=(r)=>{return new b.default(0).add(r.bets.reduce((o,E)=>o.add(E.amount),new b.default(0)))};class Dt extends C{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(t);let E=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),A=E.values,f=A.slice(0,3),i=A.slice(3,6),O=[],B=0;for(let p of f.slice(0,2)){let h=this.mapRandomValueToCard(p),g=this.mapRandomValueToCardValue(p);O.push(h),B=(B+g)%10}let d=[],S=0;for(let p of i.slice(0,2)){let h=this.mapRandomValueToCard(p),g=this.mapRandomValueToCardValue(p);d.push(h),S=(S+g)%10}if(!this.isNaturalWin(B,S)){let p=this.shouldDrawThirdPlayerCard(B),h=null;if(p)h=this.mapRandomValueToCardValue(f[2]),O.push(this.mapRandomValueToCard(f[2])),B=(B+h)%10;if(this.shouldDrawThirdBankerCard(S,h))d.push(this.mapRandomValueToCard(i[2])),S=(S+this.mapRandomValueToCardValue(i[2]))%10}let x;if(B===S)x="TIE";else x=B>S?"PLAYER_WIN":"BANKER_WIN";let N=Zt(t),{betType:v,multiplier:io}=ho[x],$=new b.default(0);if($=$.add(t.bets.filter((p)=>p.type===v).reduce((p,h)=>p.add(h.amount.mul(io)),new b.default(0))),x==="TIE")$=$.add(t.bets.filter((p)=>p.type==="PLAYER"||p.type==="BANKER").reduce((p,h)=>p.add(h.amount),new b.default(0)));return{isFinished:!0,payoutMultiplier:N.gt(0)?$.div(N):new b.default(0),outputs:{playerCards:O,playerHandValue:B,bankerCards:d,bankerHandValue:S,gameOutcome:x,result:E.values},randomValues:E}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((t)=>t.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let t=Ct[Math.floor(r/13)],o=St[r%13];return{suit:t,rank:o}}isNaturalWin(r,t){let o=[8,9];return o.includes(r)||o.includes(t)}mapRandomValueToCardValue(r){let t=r%13;if(t===0)return 1;if(t>=10)return 10;return t+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,t){if(t===null)return r<=5;if(r<=2)return!0;if(r===3)return t!==8;if(r===4)return[2,3,4,5,6,7].includes(t);if(r===5)return[4,5,6,7].includes(t);if(r===6)return[6,7].includes(t);return!1}}var _r=2.5,Gr=2,Tr=1,yr=0,br=17,Ar=21,z=21,fr=63,q=1.5,Vr=1,No=13,ir=10,Ur=10;var P=require("@betorigami/guard"),wt=require("@xstate/store");var ht=0,Nt=51,cr=Array.from({length:52},(r,t)=>t),_t=["Spades","Hearts","Diamonds","Clubs"],Or=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],Gt=["Jack","Queen","King"];var xr;((A)=>{A.WIN="WIN";A.LOSE="LOSE";A.PUSH="PUSH";A.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(xr||={});var wr;((o)=>{o.WON="WON";o.LOST="LOST"})(wr||={});var Mr;((i)=>{i.START="START";i.HIT="BLACKJACK_HIT";i.STAND="BLACKJACK_STAND";i.BUY_INSURANCE="BLACKJACK_BUY_INSURANCE";i.REJECT_INSURANCE="BLACKJACK_REJECT_INSURANCE";i.DOUBLE_DOWN="BLACKJACK_DOUBLE_DOWN"})(Mr||={});var Tt=require("@betorigami/guard");var Br=require("@betorigami/guard");class ar{value;constructor(r){let t=cr[r];Br.Guard.againstNullOrUndefined(t,`Invalid card value: ${r}`),this.value=t}get suit(){let r=Math.floor(this.value/13),t=_t[r];return Br.Guard.againstNullOrUndefined(t,`Invalid suit index: ${r}`),t}get rank(){let r=this.value%13,t=Or[r];return Br.Guard.againstNullOrUndefined(t,`Invalid rank index: ${r}`),t}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class G extends ar{get numericRank(){if(Gt.includes(this.rank))return Ur;return Or.indexOf(this.rank)+1}static fromValue(r){return Tt.Guard.against(!cr.includes(r),`Invalid card value: ${r}`),new G(r)}}class Q{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((o,E)=>o+E.numericRank,0),r.some((o)=>o.rank==="Ace")&&this.hardHandValue+ir<=Ar)this.softHandValue=this.hardHandValue+ir}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>Ar}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===z}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class X{cards;value;constructor(r){this.cards=r.map((t)=>G.fromValue(t)),this.value=new Q(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.toDto()),value:this.highestHandValue}}}class I extends X{otherCards;upCard;holeCard;constructor(r,t,o=[]){super([r,t,...o]);this.otherCards=o;this.upCard=G.fromValue(r),this.holeCard=G.fromValue(t)}static withInitialDeal(r){return new I(r.upCard,r.holeCard)}addDrawnCards(r){return new I(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new Q([this.upCard]).highestHandValue}}}class j extends X{static withInitialDeal(r){return new j(r)}addDrawnCards(r){return new j([...this.rawValues,...r])}}var m=_(require("big.js"));var yt={PLAYER_BLACKJACK:m.default(_r),WIN:m.default(Gr),PUSH:m.default(Tr),LOSE:m.default(yr)};var H=require("@betorigami/guard");class W{source;index=0;constructor(r){this.source=r}static from(r,t){return H.Guard.against(t<=0,`Count must be positive, got ${t}`),H.Guard.against(r.values.length!==t,`Expected ${t} values, got ${r.values.length}`),new W(r)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return H.Guard.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){H.Guard.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let t=this.source.values.slice(this.index,this.index+r);return this.index+=r,t}}var bt=require("@betorigami/guard"),Vt=_(require("fast-deep-equal"));class ur{edge;constructor(r){this.edge=r}play(r,t,o=[]){let E=this.createGameStore(),A=this.generateRandomValues(r),f=A.toMultipleRandomValues();for(let B of o)E.send({...B.playerArgument,randomValuePool:A});let i=o[o.length-1];if(i)bt.Guard.against(!Vt.default(i.state,this.toExternalState(E.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");E.send({...t,randomValuePool:A});let O=E.getSnapshot().context;return{playerArgument:O.playerArgument,state:this.toExternalState(O.state),config:O.config,betAmountMultiplier:O.betAmountMultiplier,proof:{proofHash:f.proofHash,proofString:f.proofString}}}}var _o={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},V=(r)=>G.fromValue(r).value;function Fr(r){P.Guard.against(r.phase!=="in-progress","Expected a started, in-progress game state")}function Ut(r){P.Guard.against(r.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}var Go=(r,t)=>{let o=t;while(o.highestHandValue<br)o=o.addDrawnCards([V(r.takeOne())]);return o},To=(r,t)=>{if(r.isBusted)return"LOSE";if(t.isBusted)return"WIN";let o=r.highestHandValue,E=t.highestHandValue;if(o>E)return"WIN";if(o<E)return"LOSE";return"PUSH"},D=(r)=>({state:{isFinished:!0,phase:"finished",playerHand:r.playerHand,dealerHand:r.dealerHand,outcome:r.outcome,multiplier:yt[r.outcome].toNumber(),randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome},config:{},playerArgument:{type:r.actionType},betAmountMultiplier:r.betAmountMultiplier}),Pr=(r)=>{let t=Go(r.randomValuePool,r.dealerHand),o=To(r.playerHand,t);return D({...r,dealerHand:t,outcome:o})};class Mt extends ur{generateRandomValues(r){return W.from(r.getRandomIntsWithReplacement({min:ht,max:Nt,count:fr}),fr)}toExternalState(r){let t=r.phase;switch(t){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:r.multiplier,betAmountMultiplier:r.betAmountMultiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,outcome:r.outcome,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!0),...r.insuranceOutcome!==void 0&&{insuranceOutcome:r.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:P.Guard.againstNever(t,"Invalid state received")}}createGameStore(){return wt.createStore({context:_o,on:{START:(r,t)=>{P.Guard.against(r.state.phase!=="uninitialised","START action requires a fresh game");let o=V(t.randomValuePool.takeOne()),E=V(t.randomValuePool.takeOne()),A=V(t.randomValuePool.takeOne()),f=V(t.randomValuePool.takeOne()),i=j.withInitialDeal([o,E]),O=I.withInitialDeal({upCard:A,holeCard:f});if(O.upCard.rank==="Ace")return{state:{isFinished:!1,phase:"awaiting-insurance",multiplier:1,playerHand:i,dealerHand:O},config:{},playerArgument:{type:"START"}};if(i.isBlackjack&&O.isBlackjack)return D({playerHand:i,dealerHand:O,outcome:"PUSH",randomValuePool:t.randomValuePool,actionType:"START",betAmountMultiplier:1});if(i.isBlackjack)return D({playerHand:i,dealerHand:O,outcome:"PLAYER_BLACKJACK",randomValuePool:t.randomValuePool,actionType:"START",betAmountMultiplier:1});if(O.isBlackjack)return D({playerHand:i,dealerHand:O,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"START",betAmountMultiplier:1});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:i,dealerHand:O,insuranceBought:!1,betAmountMultiplier:1},config:{},playerArgument:{type:"START"}}},BLACKJACK_BUY_INSURANCE:(r,t)=>{Ut(r.state);let{playerHand:o,dealerHand:E}=r.state,A={randomValuePool:t.randomValuePool,actionType:"BLACKJACK_BUY_INSURANCE",betAmountMultiplier:q,dealerHand:E,playerHand:o};if(o.isBlackjack&&E.isBlackjack)return D({outcome:"PUSH",insuranceOutcome:"WON",...A});if(o.isBlackjack)return D({outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST",...A});if(E.isBlackjack)return D({outcome:"LOSE",insuranceOutcome:"WON",...A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:E,insuranceBought:!0,betAmountMultiplier:q},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmountMultiplier:q}},BLACKJACK_REJECT_INSURANCE:(r,t)=>{Ut(r.state);let{playerHand:o,dealerHand:E}=r.state,A={playerHand:o,dealerHand:E,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_REJECT_INSURANCE",betAmountMultiplier:1};if(o.isBlackjack&&E.isBlackjack)return D({outcome:"PUSH",...A});if(o.isBlackjack)return D({outcome:"PLAYER_BLACKJACK",...A});if(E.isBlackjack)return D({outcome:"LOSE",...A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:E,insuranceBought:!1,betAmountMultiplier:1},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(r,t)=>{Fr(r.state);let{insuranceBought:o,betAmountMultiplier:E}=r.state,A=o?"LOST":void 0,f=r.state.playerHand.addDrawnCards([V(t.randomValuePool.takeOne())]);if(f.isBusted)return D({playerHand:f,dealerHand:r.state.dealerHand,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"BLACKJACK_HIT",betAmountMultiplier:E,insuranceOutcome:A});if(f.highestHandValue===z)return Pr({playerHand:f,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_HIT",betAmountMultiplier:E,insuranceOutcome:A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:f,dealerHand:r.state.dealerHand,insuranceBought:o,betAmountMultiplier:E},config:{},playerArgument:{type:"BLACKJACK_HIT"},betAmountMultiplier:E}},BLACKJACK_STAND:(r,t)=>{Fr(r.state);let{insuranceBought:o,betAmountMultiplier:E}=r.state,A=o?"LOST":void 0;return Pr({playerHand:r.state.playerHand,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_STAND",betAmountMultiplier:E,insuranceOutcome:A})},BLACKJACK_DOUBLE_DOWN:(r,t)=>{Fr(r.state),P.Guard.against(r.state.playerHand.cards.length!==2,"Double down is only allowed as the first action");let{insuranceBought:o}=r.state,E=r.state.betAmountMultiplier+Vr,A=o?"LOST":void 0,f=r.state.playerHand.addDrawnCards([V(t.randomValuePool.takeOne())]);if(f.isBusted)return D({playerHand:f,dealerHand:r.state.dealerHand,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",betAmountMultiplier:E,insuranceOutcome:A});return Pr({playerHand:f,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",betAmountMultiplier:E,insuranceOutcome:A})}}})}getValidNextActionTypes(r){if(r.isFinished)return[];if(r.phase==="awaiting-insurance")return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];if(r.playerHand.cards.length===2)return["BLACKJACK_HIT","BLACKJACK_STAND","BLACKJACK_DOUBLE_DOWN"];return["BLACKJACK_HIT","BLACKJACK_STAND"]}}var at=_(require("big.js"));class T{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let t=this.multipliers.get(r);if(t===void 0)throw new Error(`Multipliers for ${r} not found`);return t}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,t])=>({edge:r,multipliers:t}))}}var ut;((i)=>{i.PAIR="PAIR";i.TWO_PAIR="TWO_PAIR";i.THREE_OF_A_KIND="THREE_OF_A_KIND";i.FULL_HOUSE="FULL_HOUSE";i.FOUR_OF_A_KIND="FOUR_OF_A_KIND";i.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(ut||={});var yo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},bo={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},Vo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},Uo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},wo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},Ft=new T(new Map([[1,yo],[2,bo],[3,Vo],[4,Uo],[8,wo]])),Mo={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Pt extends C{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:t}){let o=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),E=Ft.getMultipliers(t),A=o.values,f=this.calculatePayoutMultiplier(E,A);return{isFinished:!0,payoutMultiplier:at.default(f),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(r,t){let o=new Map;for(let f of t){let i=o.get(f)||0;o.set(f,i+1)}let E=[...o.values()].filter((f)=>f>1),A=this.classifyResult(E);return A===null?0:r[A]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[t,o]=r;if(t===void 0)return null;if(o===void 0){let E=Mo[t];if(E===void 0)throw new Error(`Unexpected single diamond repeat count: ${t}`);return E}return t===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}var Yr=_(require("big.js"));var Rt;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(Rt||={});var Rr=1e4,Yt=(r)=>{let t=r.direction==="ABOVE"?Rr-r.selectedValue:r.selectedValue;return new Yr.default(t).div(Rr).mul(100)},$t=(r,t)=>r.direction==="ABOVE"?t>r.selectedValue:t<r.selectedValue;class Jt extends C{constructor(){super("DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=r.getRandomInt({min:0,max:1e4}),A=Yt(o);return{isFinished:!0,payoutMultiplier:$t(o,E.value)?y.withWinChance(t,A):new Yr.default(0),outputs:{result:E.values},randomValues:E}}}var mt=_(require("big.js"));var n=require("@betorigami/guard");var $r;((A)=>{A.CLASSIC="CLASSIC";A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})($r||={});var zt=[1,2,3,4,5,6,7,8,9,10],Jr=(r)=>{return zt.includes(r)};var qt={[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]}},Qt={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},Xt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},It={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},jt={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},zr=new T(new Map([[1,qt],[2,Qt],[3,Xt],[4,It],[8,jt]]));class Ht extends C{constructor(){super("KENO")}determineGameResult({generator:r,edge:t,gameInputs:o}){n.Guard.againstEmptyArray(o.selectedNumbers,()=>c.createValidationError("No numbers selected")),n.Guard.against(o.selectedNumbers.length>10,()=>c.createValidationError("Maximum of 10 numbers can be selected"));for(let x of o.selectedNumbers)n.Guard.againstNonInteger(x,()=>c.createValidationError("Only integers can be selected")),n.Guard.against(x<0||x>39,()=>c.createValidationError("Invalid number selected"));let E=r.getUniqueRandomInts({min:0,max:39,count:10}),A=o.selectedNumbers.filter((x)=>E.values.includes(x)),f=o.selectedNumbers.length;if(!Jr(f))throw new Error(`Invalid tile count: ${f}`);let d=zr.getMultipliers(t)[f][o.riskLevel][A.length];if(d===void 0)throw new Error(`No multiplier found for matching tile count ${A.length}`);return{isFinished:!0,payoutMultiplier:new mt.default(d),outputs:{result:E.values},randomValues:E}}}var U=_(require("big.js"));var qr=(r,t)=>{return r.gt(t)?r:t};var Qr=(r,t)=>{return r.lt(t)?r:t};class Wt extends C{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=r.getRandomInt({min:1,max:4294967295}),A=E.max,f=new U.default(16777216),i=new U.default(1),O=new U.default(1e6),B=E.value,d=new U.default(B-1).div(A),S=(100-t)/100,x=f.div(d.mul(f).plus(1)).mul(S),N=qr(i,Qr(x,O));return{isFinished:!0,payoutMultiplier:N.gte(o.targetMultiplier)?new U.default(o.targetMultiplier):new U.default(0),outputs:{randomMultiplier:N,result:E.values},randomValues:E}}}var s=_(require("big.js"));var Cr=(r,t)=>{if(t<0||r<0||t>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(t>r-t)t=r-t;let o=1;for(let E=1;E<=t;E++)o=o*(r-E+1)/E;return o};class nt extends C{constructor(){super("MINES")}determineGameResult({generator:r,edge:t,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 i=r.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),O=i.values.some((v)=>o.selectedTiles.includes(v)),B=o.hasCashedOut||O,d=(100-t)/100,S=new s.default(Cr(25-o.minesCount,o.selectedTiles.length)).div(new s.default(Cr(25,o.selectedTiles.length))),N=o.hasCashedOut&&!O?new s.default(d).div(S):new s.default(0);return{isFinished:B,payoutMultiplier:N,outputs:{result:i.values},randomValues:i}}}var st=require("big.js");var Xr;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(Xr||={});var ao=[8,9,10,11,12,13,14,15,16],uo={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[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:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},Fo={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},Po={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},Ro={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},Yo={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},Ir=new T(new Map([[1,uo],[2,Fo],[3,Po],[4,Ro],[8,Yo]]));class Lt extends C{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(t.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(t.numberOfRows<8||t.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let E=t.numberOfRows,i=Ir.getMultipliers(o)[t.riskLevel][E],O=r.getRandomIntsWithReplacement({min:0,max:1,count:t.numberOfRows}),d=O.values.reduce((x,N)=>x+N,0),S=i[d];if(S===void 0)throw new Error(`No payout found for end position ${d}`);return{isFinished:!0,payoutMultiplier:st.Big(S),outputs:{result:O.values},randomValues:O}}}var K=require("big.js");var Sr=[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],jr=[37,...Sr],mr=[[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]],Hr=[[0,1],[0,37],[3,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]],Wr=[[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]],nr=[[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]],sr=[[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]],Lr=[[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]],lr=[0,1,2,3,37],Kr=[[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]],vr=[[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]],w;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(w||={});var M;((o)=>{o.RED="RED";o.BLACK="BLACK"})(M||={});var a;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(a||={});var u;((E)=>{E.TOP="TOP";E.MIDDLE="MIDDLE";E.BOTTOM="BOTTOM"})(u||={});var F;((E)=>{E.FIRST="FIRST";E.SECOND="SECOND";E.THIRD="THIRD"})(F||={});var dr;((o)=>{o.AMERICAN="AMERICAN";o.EUROPEAN="EUROPEAN"})(dr||={});var pr=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw c.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&L(t.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&$o(t.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&Jo(t.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&zo(t.values)))throw c.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&qo(t.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(w).includes(t.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(M).includes(t.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(a).includes(t.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(u).includes(t.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(F).includes(t.dozen)))throw c.createValidationError("Invalid dozen bet.")},L=(r)=>{return Sr.includes(r)},$o=(r)=>{if(r.length!==2)return!1;if(!r.every(L))return!1;return mr.some(([t,o])=>t===r[0]&&o===r[1])},Jo=(r)=>{if(r.length!==3)return!1;if(!r.every(L))return!1;return Wr.some(([t,o,E])=>t===r[0]&&o===r[1]&&E===r[2])},zo=(r)=>{if(r.length!==4)return!1;if(!r.every(L))return!1;return sr.some(([t,o,E,A])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3])},qo=(r)=>{if(r.length!==6)return!1;if(!r.every(L))return!1;return Kr.some(([t,o,E,A,f,i])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3]&&f===r[4]&&i===r[5])};var Zr=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw c.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&l(t.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&Qo(t.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&Xo(t.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&Io(t.values)))throw c.createValidationError("Invalid corner bet.");if(!r.basketBets.every((t)=>t.amount.gte(0)))throw c.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&jo(t.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(w).includes(t.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(M).includes(t.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(a).includes(t.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(u).includes(t.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(F).includes(t.dozen)))throw c.createValidationError("Invalid dozen bet.")},l=(r)=>{return jr.includes(r)};function Qo(r){if(r.length!==2)return!1;if(!r.every(l))return!1;return Hr.some(([t,o])=>t===r[0]&&o===r[1])}var Xo=(r)=>{if(r.length!==3)return!1;if(!r.every(l))return!1;return nr.some(([t,o,E])=>t===r[0]&&o===r[1]&&E===r[2])},Io=(r)=>{if(r.length!==4)return!1;if(!r.every(l))return!1;return Lr.some(([t,o,E,A])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3])},jo=(r)=>{if(r.length!==6)return!1;if(!r.every(l))return!1;return vr.some(([t,o,E,A,f,i])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3]&&f===r[4]&&i===r[5])};var lt={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},Kt=[3,6,9,12,15,18,21,24,27,30,33,36],vt=[2,5,8,11,14,17,20,23,26,29,32,35],gt=[1,4,7,10,13,16,19,22,25,28,31,34],et=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],kt=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],ro=2.7,to=5.3;class gr extends C{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:t}){this.validateInputs(t);let o=r.getRandomInt({min:0,max:this.maxNumber}),E=o.value,A=this.determineBetOutcomes(t,E),{payoutMultiplier:f}=this.getPayoutDetails(t,E);return{outputs:{betOutcomes:A,result:o.values},payoutMultiplier:f,isFinished:!0,randomValues:o}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,t){let o=this.determineBetOutcomes(r,t),E=this.getBetTotals(r),A=this.getBetTotals(o.winningBets),f=this.calculateTotalBetAmount(E),i=this.calculateTotalPayout(A);return{payoutMultiplier:f.gt(0)?i.div(f):new K.Big(0),payoutAmount:i}}determineBetOutcomes(r,t){let o={},E={};for(let A of Object.keys(r)){let f=r[A],i=this.betPredicates[A],{winning:O,losing:B}=this.partitionBets(f,i,t);o[A]=O,E[A]=B}return{winningBets:o,losingBets:E}}calculateTotalAmount(r){return r.reduce((t,o)=>t.plus(o.amount),new K.Big(0))}isWinningStraightBet(r,t){return r.value===t}isWinningSplitBet(r,t){return r.values.some((o)=>o===t)}isWinningStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningCornerBet(r,t){return r.values.some((o)=>o===t)}isWinningDoubleStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningColorBet(r,t){let o=r;return et.includes(t)&&o.color==="RED"||kt.includes(t)&&o.color==="BLACK"}isWinningHalfBet(r,t){let o=r;if(t>0&&t<=18&&o.half==="LOW")return!0;if(t>18&&t<=36&&o.half==="HIGH")return!0;return!1}isWinningColumnBet(r,t){let o=r;return Kt.includes(t)&&o.column==="TOP"||vt.includes(t)&&o.column==="MIDDLE"||gt.includes(t)&&o.column==="BOTTOM"}isWinningDozenBet(r,t){let o=r;if(t>0&&t<=12&&o.dozen==="FIRST")return!0;if(t>12&&t<=24&&o.dozen==="SECOND")return!0;if(t>24&&t<=36&&o.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,t){let o=r;if(t===0||t===37)return!1;let E=t%2===0?"EVEN":"ODD";return o.parity===E}getBetTotals(r){let t={};for(let o of Object.keys(r))t[o]=this.calculateTotalAmount(r[o]);return t}calculateTotalBetAmount(r){return Object.values(r).reduce((t,o)=>t.plus(o),new K.Big(0))}partitionBets(r,t,o){return{winning:r.filter((E)=>t(E,o)),losing:r.filter((E)=>!t(E,o))}}calculateTotalPayout(r){return Object.entries(r).reduce((t,[o,E])=>{let f=lt[o];return t.plus(E.mul(f||0))},new K.Big(0))}}class er extends gr{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){pr(r)}}class kr extends gr{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){Zr(r)}isWinningBasketBet(r,t){return lr.some((o)=>o===t)}}class rt extends C{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new er,this.americanGame=new kr}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:t,...o}=r;if(r.edge===ro&&t.type==="EUROPEAN"){let E=this.europeanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"european",betOutcomes:A,result:E.outputs.result}}}if(r.edge===to&&t.type==="AMERICAN"){let E=this.americanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"american",betOutcomes:A,result:E.outputs.result}}}throw c.createValidationError(`Attempted to play ${t.type} roulette on edge ${r.edge}`)}}var mo=(r)=>{return new rt().getBetAmount(r)};var Ho=(r)=>{if(r.type==="EUROPEAN")pr(r.inputs);else Zr(r.inputs)};var Ao=require("big.js");var R;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(R||={});var Y;((f)=>{f[f.TEN=10]="TEN";f[f.TWENTY=20]="TWENTY";f[f.THIRTY=30]="THIRTY";f[f.FORTY=40]="FORTY";f[f.FIFTY=50]="FIFTY"})(Y||={});var Wo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},no={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},so={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},Lo={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},lo={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},oo=new T(new Map([[1,Wo],[2,no],[3,so],[4,Lo],[8,lo]]));var Eo={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class fo extends C{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(!Object.values(Y).includes(t.segments))throw new Error("Invalid segments value");if(!Object.values(R).includes(t.riskLevel))throw new Error("Invalid risk level");let A=oo.getMultipliers(o)[t.riskLevel];if(A===void 0)throw new Error(`No multipliers found for risk level ${t.riskLevel}`);let f=A[t.segments];if(f===void 0)throw new Error(`No multipliers found for segment ${t.segments}`);let i=Eo[t.riskLevel];if(i===void 0)throw new Error(`No patterns found for risk level ${t.riskLevel}`);let O=i[t.segments];if(O===void 0)throw new Error(`No patterns found for segment ${t.segments}`);let B=r.getRandomInt({min:0,max:O.length-1}),d=O[B.value];if(d===void 0)throw new Error(`No pattern found for segment ${t.segments} and value ${B.value}`);let S=f[d];if(S===void 0)throw new Error(`No payout found for picked segment ${d}`);return{isFinished:!0,payoutMultiplier:new Ao.Big(S),outputs:{result:B.values},randomValues:B}}}
|
|
1
|
+
var Bo=Object.create;var{getPrototypeOf:xo,defineProperty:q,getOwnPropertyNames:rt,getOwnPropertyDescriptor:So}=Object,tt=Object.prototype.hasOwnProperty;var T=(r,t,o)=>{o=r!=null?Bo(xo(r)):{};let E=t||!r||!r.__esModule?q(o,"default",{value:r,enumerable:!0}):o;for(let A of rt(r))if(!tt.call(E,A))q(E,A,{get:()=>r[A],enumerable:!0});return E},kr=new WeakMap,po=(r)=>{var t=kr.get(r),o;if(t)return t;if(t=q({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")rt(r).map((E)=>!tt.call(t,E)&&q(t,E,{get:()=>r[E],enumerable:!(o=So(r,E))||o.enumerable}));return kr.set(r,t),t};var Co=(r,t)=>{for(var o in t)q(r,o,{get:t[o],enumerable:!0,configurable:!0,set:(E)=>t[o]=()=>E})};var ko={};Co(ko,{validateRouletteGameInputs:()=>lo,validateAdvancedDiceInputs:()=>_o,rtp99Multipliers:()=>Qt,rtp98Multipliers:()=>It,rtp97Multipliers:()=>Xt,rtp96Multipliers:()=>jt,rtp92Multipliers:()=>Ht,plinkoMultipliers:()=>mr,nCr:()=>dr,kenoMultipliers:()=>$r,isTileCount:()=>Fr,hasDiceWon:()=>Jt,diamondsMultipliers:()=>Yt,calculateRouletteBetAmount:()=>so,calculateDiceWinChance:()=>zt,calculateBaccaratBetAmount:()=>Ct,calculateAdvancedDiceWinChance:()=>Gr,bigMin:()=>Jr,bigMax:()=>zr,advancedDiceIsWithinBoundsInclusive:()=>ft,advancedDiceIsWithinBoundsExclusive:()=>rr,advancedDiceGetInclusiveBoundsRange:()=>ct,advancedDiceGetExclusiveBoundsRange:()=>tr,WheelSegments:()=>z,WheelRiskLevel:()=>$,Wheel:()=>Oo,WIN_MULTIPLIER:()=>Dt,VALID_SUITS:()=>Bt,VALID_RANKS:()=>xt,VALID_EUROPEAN_STREETS:()=>jr,VALID_EUROPEAN_STRAIGHTS:()=>Zr,VALID_EUROPEAN_SPLITS:()=>Ir,VALID_EUROPEAN_DOUBLE_STREETS:()=>lr,VALID_EUROPEAN_CORNERS:()=>nr,VALID_AMERICAN_STREETS:()=>Hr,VALID_AMERICAN_STRAIGHTS:()=>Qr,VALID_AMERICAN_SPLITS:()=>Xr,VALID_AMERICAN_DOUBLE_STREETS:()=>Lr,VALID_AMERICAN_CORNERS:()=>Wr,TOP_COLUMN:()=>gt,TILE_COUNTS:()=>mt,RouletteType:()=>Dr,Roulette:()=>er,RollType:()=>Ot,RandomValuePool:()=>n,RED_NUMBERS:()=>ro,RANDOM_MIN_VALUE:()=>or,RANDOM_MAX_VALUE:()=>Er,PlinkoRiskLevel:()=>qr,Plinko:()=>Kt,Parity:()=>w,PUSH_MULTIPLIER:()=>Nt,PLINKO_ROW_COUNTS:()=>Yo,PAYOUT_MULTIPLIERS:()=>vt,OrigamiGame:()=>Z,MultiplierCalculator:()=>u,Mines:()=>lt,MIN_WIN_CHANCE:()=>Et,MIDDLE_COLUMN:()=>et,MAX_WIN_CHANCE:()=>At,MAX_CARDS_PER_ROUND:()=>ir,Limbo:()=>st,LOSE_MULTIPLIER:()=>_t,KenoRiskLevel:()=>Yr,Keno:()=>Wt,InsuranceOutcome:()=>fr,INSURANCE_WIN_PAYOUT:()=>ur,INSURANCE_BET_SIZE_FACTOR:()=>Y,INSURANCE_BET_MULTIPLIER:()=>yo,Half:()=>a,GameErrorCode:()=>ot,GameError:()=>O,Game:()=>S,FACE_CARD_VALUE:()=>br,EuropeanRoulette:()=>vr,EUROPEAN_HOUSE_EDGE:()=>oo,EFFECTIVE_RANGE:()=>Tr,Dozen:()=>R,DiceDirection:()=>$t,Dice:()=>qt,DiamondsResultType:()=>Rt,Diamonds:()=>Ft,DOUBLE_DOWN_BET_SIZE_FACTOR:()=>Br,DICE_EFFECTIVE_RANGE:()=>Pr,DEALER_STAND_VALUE:()=>hr,Column:()=>P,Color:()=>M,CARDS_PER_SUIT:()=>Go,BlackjackOutcome:()=>Ar,BlackjackActionType:()=>cr,Blackjack:()=>at,BaccaratOutcome:()=>St,BaccaratBetType:()=>pt,Baccarat:()=>dt,BUST_VALUE:()=>Or,BOTTOM_COLUMN:()=>kt,BLACK_NUMBERS:()=>to,BLACKJACK_VALUE:()=>m,BLACKJACK_MULTIPLIER:()=>Zt,BASE_PAYOUT_MULTIPLIERS:()=>Ur,AmericanRoulette:()=>gr,AdvancedDice:()=>it,AMERICAN_HOUSE_EDGE:()=>Eo,AMERICAN_BASKET:()=>sr,ACE_SOFT_BONUS:()=>xr});module.exports=po(ko);var ot;((t)=>t.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(ot||={});class O extends Error{static createValidationError(r){return new O("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof O}errorCode;constructor(r,t){super(t);this.errorCode=r}}var Z;((B)=>{B.DICE="DICE";B.MINES="MINES";B.KENO="KENO";B.LIMBO="LIMBO";B.ADVANCED_DICE="ADVANCED_DICE";B.BACCARAT="BACCARAT";B.DIAMONDS="DIAMONDS";B.PLINKO="PLINKO";B.ROULETTE="ROULETTE";B.WHEEL="WHEEL";B.BLACKJACK="BLACKJACK"})(Z||={});class S{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}var yr=require("big.js");var e=T(require("big.js"));class u{static withMultiplier(r,t){return new e.default(r).times(new e.default(100-t).div(100))}static withWinChance(r,t){return e.default(100-r).div(t)}}var or=0,Er=1e4,Tr=10001,Et=0.01,At=98,Zo=(r)=>{if(r<or)throw O.createValidationError(`Lower bound ${r} is below minimum allowed value ${or}`)},Do=(r)=>{if(r>Er)throw O.createValidationError(`Upper bound ${r} is above maximum allowed value ${Er}`)},k=(r)=>{if(Zo(r.lower),Do(r.upper),r.lower>=r.upper)throw O.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},No=(r,t)=>{let[o,E]=r.lower<=t.lower?[r,t]:[t,r];if(o.upper>E.lower)throw O.createValidationError("Bounds must not overlap")},ft=(r,t)=>t>=r.lower&&t<=r.upper,ct=(r)=>r.upper-r.lower+1,rr=(r,t)=>t>r.lower&&t<r.upper,tr=(r)=>r.upper-r.lower-1,Ot;((E)=>{E.ROLL_BETWEEN="ROLL_BETWEEN";E.ROLL_OUTSIDE="ROLL_OUTSIDE";E.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(Ot||={});var Gr=(r)=>{let o=(()=>{switch(r.mode){case"ROLL_BETWEEN":return k(r.bounds),tr(r.bounds);case"ROLL_OUTSIDE":return k(r.bounds),Tr-ct(r.bounds);case"ROLL_BETWEEN_TWO":return k(r.firstBounds),k(r.secondBounds),No(r.firstBounds,r.secondBounds),tr(r.firstBounds)+tr(r.secondBounds)}})(),E=yr.Big(o).div(Tr).mul(100);if(E.lt(Et))throw O.createValidationError("Win chance too low");if(E.gt(At))throw O.createValidationError("Win chance too high");return E},_o=(r)=>{Gr(r)};class it extends S{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=Gr(o),A=r.getRandomInt({min:or,max:Er}),f=A.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return rr(o.bounds,f);case"ROLL_OUTSIDE":return!ft(o.bounds,f);case"ROLL_BETWEEN_TWO":return rr(o.firstBounds,f)||rr(o.secondBounds,f)}})()?u.withWinChance(t,E):new yr.Big(0),outputs:{result:A.values},randomValues:A}}}var b=T(require("big.js"));var Bt=["Clubs","Diamonds","Hearts","Spades"],xt=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],St;((E)=>{E.PLAYER_WIN="PLAYER_WIN";E.TIE="TIE";E.BANKER_WIN="BANKER_WIN"})(St||={});var pt;((E)=>{E.PLAYER="PLAYER";E.TIE="TIE";E.BANKER="BANKER"})(pt||={});var To={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},Ct=(r)=>{return new b.default(0).add(r.bets.reduce((o,E)=>o.add(E.amount),new b.default(0)))};class dt extends S{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(t);let E=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),A=E.values,f=A.slice(0,3),c=A.slice(3,6),i=[],x=0;for(let d of f.slice(0,2)){let N=this.mapRandomValueToCard(d),g=this.mapRandomValueToCardValue(d);i.push(N),x=(x+g)%10}let C=[],p=0;for(let d of c.slice(0,2)){let N=this.mapRandomValueToCard(d),g=this.mapRandomValueToCardValue(d);C.push(N),p=(p+g)%10}if(!this.isNaturalWin(x,p)){let d=this.shouldDrawThirdPlayerCard(x),N=null;if(d)N=this.mapRandomValueToCardValue(f[2]),i.push(this.mapRandomValueToCard(f[2])),x=(x+N)%10;if(this.shouldDrawThirdBankerCard(p,N))C.push(this.mapRandomValueToCard(c[2])),p=(p+this.mapRandomValueToCardValue(c[2]))%10}let B;if(x===p)B="TIE";else B=x>p?"PLAYER_WIN":"BANKER_WIN";let _=Ct(t),{betType:v,multiplier:io}=To[B],J=new b.default(0);if(J=J.add(t.bets.filter((d)=>d.type===v).reduce((d,N)=>d.add(N.amount.mul(io)),new b.default(0))),B==="TIE")J=J.add(t.bets.filter((d)=>d.type==="PLAYER"||d.type==="BANKER").reduce((d,N)=>d.add(N.amount),new b.default(0)));return{isFinished:!0,payoutMultiplier:_.gt(0)?J.div(_):new b.default(0),outputs:{playerCards:i,playerHandValue:x,bankerCards:C,bankerHandValue:p,gameOutcome:B,result:E.values},randomValues:E}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((t)=>t.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let t=Bt[Math.floor(r/13)],o=xt[r%13];return{suit:t,rank:o}}isNaturalWin(r,t){let o=[8,9];return o.includes(r)||o.includes(t)}mapRandomValueToCardValue(r){let t=r%13;if(t===0)return 1;if(t>=10)return 10;return t+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,t){if(t===null)return r<=5;if(r<=2)return!0;if(r===3)return t!==8;if(r===4)return[2,3,4,5,6,7].includes(t);if(r===5)return[4,5,6,7].includes(t);if(r===6)return[6,7].includes(t);return!1}}var Ar;((A)=>{A.WIN="WIN";A.LOSE="LOSE";A.PUSH="PUSH";A.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(Ar||={});var fr;((o)=>{o.WON="WON";o.LOST="LOST"})(fr||={});var cr;((c)=>{c.START="START";c.HIT="BLACKJACK_HIT";c.STAND="BLACKJACK_STAND";c.BUY_INSURANCE="BLACKJACK_BUY_INSURANCE";c.REJECT_INSURANCE="BLACKJACK_REJECT_INSURANCE";c.DOUBLE_DOWN="BLACKJACK_DOUBLE_DOWN"})(cr||={});var Zt=2.5,Dt=2,Nt=1,_t=0,hr=17,Or=21,m=21,ir=63,yo=1.5,Y=0.5,ur=1.5,Br=1,Go=13,xr=10,br=10,Ur={PLAYER_BLACKJACK:Zt,WIN:Dt,PUSH:Nt,LOSE:_t};var F=require("@betorigami/guard"),Mt=require("@xstate/store");var Tt=0,yt=51,Sr=Array.from({length:52},(r,t)=>t),Gt=["Spades","Hearts","Diamonds","Clubs"],pr=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],ht=["Jack","Queen","King"];var ut=require("@betorigami/guard");var Cr=require("@betorigami/guard");class Vr{value;constructor(r){let t=Sr[r];Cr.Guard.againstNullOrUndefined(t,`Invalid card value: ${r}`),this.value=t}get suit(){let r=Math.floor(this.value/13),t=Gt[r];return Cr.Guard.againstNullOrUndefined(t,`Invalid suit index: ${r}`),t}get rank(){let r=this.value%13,t=pr[r];return Cr.Guard.againstNullOrUndefined(t,`Invalid rank index: ${r}`),t}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class y extends Vr{get numericRank(){if(ht.includes(this.rank))return br;return pr.indexOf(this.rank)+1}static fromValue(r){return ut.Guard.against(!Sr.includes(r),`Invalid card value: ${r}`),new y(r)}}class Q{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((o,E)=>o+E.numericRank,0),r.some((o)=>o.rank==="Ace")&&this.hardHandValue+xr<=Or)this.softHandValue=this.hardHandValue+xr}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>Or}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===m}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class I{cards;value;constructor(r){this.cards=r.map((t)=>y.fromValue(t)),this.value=new Q(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.toDto()),value:this.highestHandValue}}}class X extends I{otherCards;upCard;holeCard;constructor(r,t,o=[]){super([r,t,...o]);this.otherCards=o;this.upCard=y.fromValue(r),this.holeCard=y.fromValue(t)}static withInitialDeal(r){return new X(r.upCard,r.holeCard)}addDrawnCards(r){return new X(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new Q([this.upCard]).highestHandValue}}}class j extends I{static withInitialDeal(r){return new j(r)}addDrawnCards(r){return new j([...this.rawValues,...r])}}var H=require("@betorigami/guard");class n{source;index=0;constructor(r){this.source=r}static from(r,t){return H.Guard.against(t<=0,`Count must be positive, got ${t}`),H.Guard.against(r.values.length!==t,`Expected ${t} values, got ${r.values.length}`),new n(r)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return H.Guard.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){H.Guard.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let t=this.source.values.slice(this.index,this.index+r);return this.index+=r,t}}var bt=require("@betorigami/guard"),Ut=T(require("fast-deep-equal"));class wr{edge;constructor(r){this.edge=r}play(r,t,o=[]){let E=this.createGameStore(),A=this.generateRandomValues(r),f=A.toMultipleRandomValues();for(let x of o)E.send({...x.playerArgument,randomValuePool:A});let c=o[o.length-1];if(c)bt.Guard.against(!Ut.default(c.state,this.toExternalState(E.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");E.send({...t,randomValuePool:A});let i=E.getSnapshot().context;return{playerArgument:i.playerArgument,state:this.toExternalState(i.state),config:i.config,betAmountMultiplier:i.betAmountMultiplier,proof:{proofHash:f.proofHash,proofString:f.proofString}}}}var G=T(require("big.js"));var ho={BLACKJACK_DOUBLE_DOWN:Br,BLACKJACK_BUY_INSURANCE:Y},Vt=(r)=>{let t=r.insuranceOutcome!==void 0,o=r.actionType==="BLACKJACK_DOUBLE_DOWN",E=G.default(1),A=o?G.default(Br):G.default(0),f=t?G.default(Y):G.default(0),c=E.plus(A).plus(f),i=E.plus(A),x=G.default(Ur[r.outcome]).mul(i),C=r.insuranceOutcome==="WON"?G.default(ur):G.default(0);return{payoutMultiplier:x.plus(C).div(c).toNumber(),betAmountMultiplier:ho[r.actionType]}};var uo={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},U=(r)=>y.fromValue(r).value;function Mr(r){F.Guard.against(r.phase!=="in-progress","Expected a started, in-progress game state")}function wt(r){F.Guard.against(r.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}var bo=(r,t)=>{let o=t;while(o.highestHandValue<hr)o=o.addDrawnCards([U(r.takeOne())]);return o},Uo=(r,t)=>{if(r.isBusted)return"LOSE";if(t.isBusted)return"WIN";let o=r.highestHandValue,E=t.highestHandValue;if(o>E)return"WIN";if(o<E)return"LOSE";return"PUSH"},D=(r)=>{let{payoutMultiplier:t,betAmountMultiplier:o}=Vt({outcome:r.outcome,insuranceOutcome:r.insuranceOutcome,actionType:r.actionType});return{state:{isFinished:!0,phase:"finished",playerHand:r.playerHand,dealerHand:r.dealerHand,outcome:r.outcome,multiplier:t,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome},config:{},playerArgument:{type:r.actionType},betAmountMultiplier:o}},ar=(r)=>{let t=bo(r.randomValuePool,r.dealerHand),o=Uo(r.playerHand,t);return D({...r,dealerHand:t,outcome:o})};class at extends wr{generateRandomValues(r){return n.from(r.getRandomIntsWithReplacement({min:Tt,max:yt,count:ir}),ir)}toExternalState(r){let t=r.phase;switch(t){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,outcome:r.outcome,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!0),...r.insuranceOutcome!==void 0&&{insuranceOutcome:r.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:F.Guard.againstNever(t,"Invalid state received")}}createGameStore(){return Mt.createStore({context:uo,on:{START:(r,t)=>{F.Guard.against(r.state.phase!=="uninitialised","START action requires a fresh game");let o=U(t.randomValuePool.takeOne()),E=U(t.randomValuePool.takeOne()),A=U(t.randomValuePool.takeOne()),f=U(t.randomValuePool.takeOne()),c=j.withInitialDeal([o,E]),i=X.withInitialDeal({upCard:A,holeCard:f});if(i.upCard.rank==="Ace")return{state:{isFinished:!1,phase:"awaiting-insurance",multiplier:1,playerHand:c,dealerHand:i},config:{},playerArgument:{type:"START"}};if(c.isBlackjack&&i.isBlackjack)return D({playerHand:c,dealerHand:i,outcome:"PUSH",randomValuePool:t.randomValuePool,actionType:"START"});if(c.isBlackjack)return D({playerHand:c,dealerHand:i,outcome:"PLAYER_BLACKJACK",randomValuePool:t.randomValuePool,actionType:"START"});if(i.isBlackjack)return D({playerHand:c,dealerHand:i,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"START"});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:c,dealerHand:i,insuranceBought:!1},config:{},playerArgument:{type:"START"}}},BLACKJACK_BUY_INSURANCE:(r,t)=>{wt(r.state);let{playerHand:o,dealerHand:E}=r.state,A={randomValuePool:t.randomValuePool,actionType:"BLACKJACK_BUY_INSURANCE",dealerHand:E,playerHand:o};if(o.isBlackjack&&E.isBlackjack)return D({outcome:"PUSH",insuranceOutcome:"WON",...A});if(o.isBlackjack)return D({outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST",...A});if(E.isBlackjack)return D({outcome:"LOSE",insuranceOutcome:"WON",...A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:E,insuranceBought:!0},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmountMultiplier:Y}},BLACKJACK_REJECT_INSURANCE:(r,t)=>{wt(r.state);let{playerHand:o,dealerHand:E}=r.state,A={playerHand:o,dealerHand:E,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_REJECT_INSURANCE",doubledDown:!1};if(o.isBlackjack&&E.isBlackjack)return D({outcome:"PUSH",...A});if(o.isBlackjack)return D({outcome:"PLAYER_BLACKJACK",...A});if(E.isBlackjack)return D({outcome:"LOSE",...A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:E,insuranceBought:!1},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(r,t)=>{Mr(r.state);let{insuranceBought:o}=r.state,E=o?"LOST":void 0,A=r.state.playerHand.addDrawnCards([U(t.randomValuePool.takeOne())]);if(A.isBusted)return D({playerHand:A,dealerHand:r.state.dealerHand,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"BLACKJACK_HIT",insuranceOutcome:E});if(A.highestHandValue===m)return ar({playerHand:A,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_HIT",insuranceOutcome:E});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:A,dealerHand:r.state.dealerHand,insuranceBought:o},config:{},playerArgument:{type:"BLACKJACK_HIT"}}},BLACKJACK_STAND:(r,t)=>{Mr(r.state);let{insuranceBought:o}=r.state,E=o?"LOST":void 0;return ar({playerHand:r.state.playerHand,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_STAND",insuranceOutcome:E})},BLACKJACK_DOUBLE_DOWN:(r,t)=>{Mr(r.state),F.Guard.against(r.state.playerHand.cards.length!==2,"Double down is only allowed as the first action");let{insuranceBought:o}=r.state,E=o?"LOST":void 0,A=r.state.playerHand.addDrawnCards([U(t.randomValuePool.takeOne())]);if(A.isBusted)return D({playerHand:A,dealerHand:r.state.dealerHand,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",insuranceOutcome:E});return ar({playerHand:A,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",insuranceOutcome:E})}}})}getValidNextActionTypes(r){if(r.isFinished)return[];if(r.phase==="awaiting-insurance")return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];if(r.playerHand.cards.length===2)return["BLACKJACK_HIT","BLACKJACK_STAND","BLACKJACK_DOUBLE_DOWN"];return["BLACKJACK_HIT","BLACKJACK_STAND"]}}var Pt=T(require("big.js"));class h{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let t=this.multipliers.get(r);if(t===void 0)throw new Error(`Multipliers for ${r} not found`);return t}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,t])=>({edge:r,multipliers:t}))}}var Rt;((c)=>{c.PAIR="PAIR";c.TWO_PAIR="TWO_PAIR";c.THREE_OF_A_KIND="THREE_OF_A_KIND";c.FULL_HOUSE="FULL_HOUSE";c.FOUR_OF_A_KIND="FOUR_OF_A_KIND";c.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(Rt||={});var Vo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},wo={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},Mo={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},ao={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},Po={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},Yt=new h(new Map([[1,Vo],[2,wo],[3,Mo],[4,ao],[8,Po]])),Ro={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Ft extends S{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:t}){let o=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),E=Yt.getMultipliers(t),A=o.values,f=this.calculatePayoutMultiplier(E,A);return{isFinished:!0,payoutMultiplier:Pt.default(f),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(r,t){let o=new Map;for(let f of t){let c=o.get(f)||0;o.set(f,c+1)}let E=[...o.values()].filter((f)=>f>1),A=this.classifyResult(E);return A===null?0:r[A]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[t,o]=r;if(t===void 0)return null;if(o===void 0){let E=Ro[t];if(E===void 0)throw new Error(`Unexpected single diamond repeat count: ${t}`);return E}return t===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}var Rr=T(require("big.js"));var $t;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})($t||={});var Pr=1e4,zt=(r)=>{let t=r.direction==="ABOVE"?Pr-r.selectedValue:r.selectedValue;return new Rr.default(t).div(Pr).mul(100)},Jt=(r,t)=>r.direction==="ABOVE"?t>r.selectedValue:t<r.selectedValue;class qt extends S{constructor(){super("DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=r.getRandomInt({min:0,max:1e4}),A=zt(o);return{isFinished:!0,payoutMultiplier:Jt(o,E.value)?u.withWinChance(t,A):new Rr.default(0),outputs:{result:E.values},randomValues:E}}}var nt=T(require("big.js"));var W=require("@betorigami/guard");var Yr;((A)=>{A.CLASSIC="CLASSIC";A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(Yr||={});var mt=[1,2,3,4,5,6,7,8,9,10],Fr=(r)=>{return mt.includes(r)};var Qt={[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]}},It={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},Xt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},jt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},Ht={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},$r=new h(new Map([[1,Qt],[2,It],[3,Xt],[4,jt],[8,Ht]]));class Wt extends S{constructor(){super("KENO")}determineGameResult({generator:r,edge:t,gameInputs:o}){W.Guard.againstEmptyArray(o.selectedNumbers,()=>O.createValidationError("No numbers selected")),W.Guard.against(o.selectedNumbers.length>10,()=>O.createValidationError("Maximum of 10 numbers can be selected"));for(let B of o.selectedNumbers)W.Guard.againstNonInteger(B,()=>O.createValidationError("Only integers can be selected")),W.Guard.against(B<0||B>39,()=>O.createValidationError("Invalid number selected"));let E=r.getUniqueRandomInts({min:0,max:39,count:10}),A=o.selectedNumbers.filter((B)=>E.values.includes(B)),f=o.selectedNumbers.length;if(!Fr(f))throw new Error(`Invalid tile count: ${f}`);let C=$r.getMultipliers(t)[f][o.riskLevel][A.length];if(C===void 0)throw new Error(`No multiplier found for matching tile count ${A.length}`);return{isFinished:!0,payoutMultiplier:new nt.default(C),outputs:{result:E.values},randomValues:E}}}var V=T(require("big.js"));var zr=(r,t)=>{return r.gt(t)?r:t};var Jr=(r,t)=>{return r.lt(t)?r:t};class st extends S{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=r.getRandomInt({min:1,max:4294967295}),A=E.max,f=new V.default(16777216),c=new V.default(1),i=new V.default(1e6),x=E.value,C=new V.default(x-1).div(A),p=(100-t)/100,B=f.div(C.mul(f).plus(1)).mul(p),_=zr(c,Jr(B,i));return{isFinished:!0,payoutMultiplier:_.gte(o.targetMultiplier)?new V.default(o.targetMultiplier):new V.default(0),outputs:{randomMultiplier:_,result:E.values},randomValues:E}}}var s=T(require("big.js"));var dr=(r,t)=>{if(t<0||r<0||t>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(t>r-t)t=r-t;let o=1;for(let E=1;E<=t;E++)o=o*(r-E+1)/E;return o};class lt extends S{constructor(){super("MINES")}determineGameResult({generator:r,edge:t,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 c=r.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),i=c.values.some((v)=>o.selectedTiles.includes(v)),x=o.hasCashedOut||i,C=(100-t)/100,p=new s.default(dr(25-o.minesCount,o.selectedTiles.length)).div(new s.default(dr(25,o.selectedTiles.length))),_=o.hasCashedOut&&!i?new s.default(C).div(p):new s.default(0);return{isFinished:x,payoutMultiplier:_,outputs:{result:c.values},randomValues:c}}}var Lt=require("big.js");var qr;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(qr||={});var Yo=[8,9,10,11,12,13,14,15,16],Fo={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[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:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},$o={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},zo={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},Jo={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},qo={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},mr=new h(new Map([[1,Fo],[2,$o],[3,zo],[4,Jo],[8,qo]]));class Kt extends S{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(t.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(t.numberOfRows<8||t.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let E=t.numberOfRows,c=mr.getMultipliers(o)[t.riskLevel][E],i=r.getRandomIntsWithReplacement({min:0,max:1,count:t.numberOfRows}),C=i.values.reduce((B,_)=>B+_,0),p=c[C];if(p===void 0)throw new Error(`No payout found for end position ${C}`);return{isFinished:!0,payoutMultiplier:Lt.Big(p),outputs:{result:i.values},randomValues:i}}}var K=require("big.js");var Zr=[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],Qr=[37,...Zr],Ir=[[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]],Xr=[[0,1],[0,37],[3,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]],jr=[[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]],Hr=[[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]],nr=[[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]],Wr=[[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]],sr=[0,1,2,3,37],lr=[[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]],Lr=[[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]],w;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(w||={});var M;((o)=>{o.RED="RED";o.BLACK="BLACK"})(M||={});var a;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(a||={});var P;((E)=>{E.TOP="TOP";E.MIDDLE="MIDDLE";E.BOTTOM="BOTTOM"})(P||={});var R;((E)=>{E.FIRST="FIRST";E.SECOND="SECOND";E.THIRD="THIRD"})(R||={});var Dr;((o)=>{o.AMERICAN="AMERICAN";o.EUROPEAN="EUROPEAN"})(Dr||={});var Nr=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw O.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&l(t.value)))throw O.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&mo(t.values)))throw O.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&Qo(t.values)))throw O.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&Io(t.values)))throw O.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&Xo(t.values)))throw O.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(w).includes(t.parity)))throw O.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(M).includes(t.color)))throw O.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(a).includes(t.half)))throw O.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.column)))throw O.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(R).includes(t.dozen)))throw O.createValidationError("Invalid dozen bet.")},l=(r)=>{return Zr.includes(r)},mo=(r)=>{if(r.length!==2)return!1;if(!r.every(l))return!1;return Ir.some(([t,o])=>t===r[0]&&o===r[1])},Qo=(r)=>{if(r.length!==3)return!1;if(!r.every(l))return!1;return jr.some(([t,o,E])=>t===r[0]&&o===r[1]&&E===r[2])},Io=(r)=>{if(r.length!==4)return!1;if(!r.every(l))return!1;return nr.some(([t,o,E,A])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3])},Xo=(r)=>{if(r.length!==6)return!1;if(!r.every(l))return!1;return lr.some(([t,o,E,A,f,c])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3]&&f===r[4]&&c===r[5])};var _r=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw O.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&L(t.value)))throw O.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&jo(t.values)))throw O.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&Ho(t.values)))throw O.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&no(t.values)))throw O.createValidationError("Invalid corner bet.");if(!r.basketBets.every((t)=>t.amount.gte(0)))throw O.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&Wo(t.values)))throw O.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(w).includes(t.parity)))throw O.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(M).includes(t.color)))throw O.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(a).includes(t.half)))throw O.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.column)))throw O.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(R).includes(t.dozen)))throw O.createValidationError("Invalid dozen bet.")},L=(r)=>{return Qr.includes(r)};function jo(r){if(r.length!==2)return!1;if(!r.every(L))return!1;return Xr.some(([t,o])=>t===r[0]&&o===r[1])}var Ho=(r)=>{if(r.length!==3)return!1;if(!r.every(L))return!1;return Hr.some(([t,o,E])=>t===r[0]&&o===r[1]&&E===r[2])},no=(r)=>{if(r.length!==4)return!1;if(!r.every(L))return!1;return Wr.some(([t,o,E,A])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3])},Wo=(r)=>{if(r.length!==6)return!1;if(!r.every(L))return!1;return Lr.some(([t,o,E,A,f,c])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3]&&f===r[4]&&c===r[5])};var vt={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},gt=[3,6,9,12,15,18,21,24,27,30,33,36],et=[2,5,8,11,14,17,20,23,26,29,32,35],kt=[1,4,7,10,13,16,19,22,25,28,31,34],ro=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],to=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],oo=2.7,Eo=5.3;class Kr extends S{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:t}){this.validateInputs(t);let o=r.getRandomInt({min:0,max:this.maxNumber}),E=o.value,A=this.determineBetOutcomes(t,E),{payoutMultiplier:f}=this.getPayoutDetails(t,E);return{outputs:{betOutcomes:A,result:o.values},payoutMultiplier:f,isFinished:!0,randomValues:o}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,t){let o=this.determineBetOutcomes(r,t),E=this.getBetTotals(r),A=this.getBetTotals(o.winningBets),f=this.calculateTotalBetAmount(E),c=this.calculateTotalPayout(A);return{payoutMultiplier:f.gt(0)?c.div(f):new K.Big(0),payoutAmount:c}}determineBetOutcomes(r,t){let o={},E={};for(let A of Object.keys(r)){let f=r[A],c=this.betPredicates[A],{winning:i,losing:x}=this.partitionBets(f,c,t);o[A]=i,E[A]=x}return{winningBets:o,losingBets:E}}calculateTotalAmount(r){return r.reduce((t,o)=>t.plus(o.amount),new K.Big(0))}isWinningStraightBet(r,t){return r.value===t}isWinningSplitBet(r,t){return r.values.some((o)=>o===t)}isWinningStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningCornerBet(r,t){return r.values.some((o)=>o===t)}isWinningDoubleStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningColorBet(r,t){let o=r;return ro.includes(t)&&o.color==="RED"||to.includes(t)&&o.color==="BLACK"}isWinningHalfBet(r,t){let o=r;if(t>0&&t<=18&&o.half==="LOW")return!0;if(t>18&&t<=36&&o.half==="HIGH")return!0;return!1}isWinningColumnBet(r,t){let o=r;return gt.includes(t)&&o.column==="TOP"||et.includes(t)&&o.column==="MIDDLE"||kt.includes(t)&&o.column==="BOTTOM"}isWinningDozenBet(r,t){let o=r;if(t>0&&t<=12&&o.dozen==="FIRST")return!0;if(t>12&&t<=24&&o.dozen==="SECOND")return!0;if(t>24&&t<=36&&o.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,t){let o=r;if(t===0||t===37)return!1;let E=t%2===0?"EVEN":"ODD";return o.parity===E}getBetTotals(r){let t={};for(let o of Object.keys(r))t[o]=this.calculateTotalAmount(r[o]);return t}calculateTotalBetAmount(r){return Object.values(r).reduce((t,o)=>t.plus(o),new K.Big(0))}partitionBets(r,t,o){return{winning:r.filter((E)=>t(E,o)),losing:r.filter((E)=>!t(E,o))}}calculateTotalPayout(r){return Object.entries(r).reduce((t,[o,E])=>{let f=vt[o];return t.plus(E.mul(f||0))},new K.Big(0))}}class vr extends Kr{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){Nr(r)}}class gr extends Kr{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){_r(r)}isWinningBasketBet(r,t){return sr.some((o)=>o===t)}}class er extends S{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new vr,this.americanGame=new gr}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:t,...o}=r;if(r.edge===oo&&t.type==="EUROPEAN"){let E=this.europeanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"european",betOutcomes:A,result:E.outputs.result}}}if(r.edge===Eo&&t.type==="AMERICAN"){let E=this.americanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"american",betOutcomes:A,result:E.outputs.result}}}throw O.createValidationError(`Attempted to play ${t.type} roulette on edge ${r.edge}`)}}var so=(r)=>{return new er().getBetAmount(r)};var lo=(r)=>{if(r.type==="EUROPEAN")Nr(r.inputs);else _r(r.inputs)};var co=require("big.js");var $;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})($||={});var z;((f)=>{f[f.TEN=10]="TEN";f[f.TWENTY=20]="TWENTY";f[f.THIRTY=30]="THIRTY";f[f.FORTY=40]="FORTY";f[f.FIFTY=50]="FIFTY"})(z||={});var Lo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},Ko={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},vo={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},go={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},eo={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},Ao=new h(new Map([[1,Lo],[2,Ko],[3,vo],[4,go],[8,eo]]));var fo={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class Oo extends S{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(!Object.values(z).includes(t.segments))throw new Error("Invalid segments value");if(!Object.values($).includes(t.riskLevel))throw new Error("Invalid risk level");let A=Ao.getMultipliers(o)[t.riskLevel];if(A===void 0)throw new Error(`No multipliers found for risk level ${t.riskLevel}`);let f=A[t.segments];if(f===void 0)throw new Error(`No multipliers found for segment ${t.segments}`);let c=fo[t.riskLevel];if(c===void 0)throw new Error(`No patterns found for risk level ${t.riskLevel}`);let i=c[t.segments];if(i===void 0)throw new Error(`No patterns found for segment ${t.segments}`);let x=r.getRandomInt({min:0,max:i.length-1}),C=i[x.value];if(C===void 0)throw new Error(`No pattern found for segment ${t.segments} and value ${x.value}`);let p=f[C];if(p===void 0)throw new Error(`No payout found for picked segment ${C}`);return{isFinished:!0,payoutMultiplier:new co.Big(p),outputs:{result:x.values},randomValues:x}}}
|
package/dist/index.d.ts
CHANGED
|
@@ -179,19 +179,6 @@ export declare class Baccarat extends Game<BaccaratGameInputs, BaccaratGameOutpu
|
|
|
179
179
|
private shouldDrawThirdPlayerCard;
|
|
180
180
|
private shouldDrawThirdBankerCard;
|
|
181
181
|
}
|
|
182
|
-
export declare const BLACKJACK_MULTIPLIER = 2.5;
|
|
183
|
-
export declare const WIN_MULTIPLIER = 2;
|
|
184
|
-
export declare const PUSH_MULTIPLIER = 1;
|
|
185
|
-
export declare const LOSE_MULTIPLIER = 0;
|
|
186
|
-
export declare const DEALER_STAND_VALUE = 17;
|
|
187
|
-
export declare const BUST_VALUE = 21;
|
|
188
|
-
export declare const BLACKJACK_VALUE = 21;
|
|
189
|
-
export declare const MAX_CARDS_PER_ROUND = 63;
|
|
190
|
-
export declare const INSURANCE_BET_MULTIPLIER = 1.5;
|
|
191
|
-
export declare const DOUBLE_DOWN_ADDITIONAL_MULTIPLIER = 1;
|
|
192
|
-
export declare const CARDS_PER_SUIT = 13;
|
|
193
|
-
export declare const ACE_SOFT_BONUS = 10;
|
|
194
|
-
export declare const FACE_CARD_VALUE = 10;
|
|
195
182
|
declare const CARD_VALUES: number[];
|
|
196
183
|
declare const CARD_SUITS: readonly [
|
|
197
184
|
"Spades",
|
|
@@ -244,6 +231,22 @@ export declare enum BlackjackActionType {
|
|
|
244
231
|
REJECT_INSURANCE = "BLACKJACK_REJECT_INSURANCE",
|
|
245
232
|
DOUBLE_DOWN = "BLACKJACK_DOUBLE_DOWN"
|
|
246
233
|
}
|
|
234
|
+
export declare const BLACKJACK_MULTIPLIER = 2.5;
|
|
235
|
+
export declare const WIN_MULTIPLIER = 2;
|
|
236
|
+
export declare const PUSH_MULTIPLIER = 1;
|
|
237
|
+
export declare const LOSE_MULTIPLIER = 0;
|
|
238
|
+
export declare const DEALER_STAND_VALUE = 17;
|
|
239
|
+
export declare const BUST_VALUE = 21;
|
|
240
|
+
export declare const BLACKJACK_VALUE = 21;
|
|
241
|
+
export declare const MAX_CARDS_PER_ROUND = 63;
|
|
242
|
+
export declare const INSURANCE_BET_MULTIPLIER = 1.5;
|
|
243
|
+
export declare const INSURANCE_BET_SIZE_FACTOR = 0.5;
|
|
244
|
+
export declare const INSURANCE_WIN_PAYOUT = 1.5;
|
|
245
|
+
export declare const DOUBLE_DOWN_BET_SIZE_FACTOR = 1;
|
|
246
|
+
export declare const CARDS_PER_SUIT = 13;
|
|
247
|
+
export declare const ACE_SOFT_BONUS = 10;
|
|
248
|
+
export declare const FACE_CARD_VALUE = 10;
|
|
249
|
+
export declare const BASE_PAYOUT_MULTIPLIERS: Record<BlackjackOutcome, number>;
|
|
247
250
|
declare class Card$1 {
|
|
248
251
|
readonly value: CardValue;
|
|
249
252
|
constructor(rawValue: number);
|
|
@@ -380,7 +383,6 @@ export type BlackjackAwaitingInsuranceState = Simplify<BlackjackStateBase & Base
|
|
|
380
383
|
}>;
|
|
381
384
|
export type BlackjackPlayerTurnState = Simplify<BlackjackStateBase & BaseInProgressState & {
|
|
382
385
|
phase: "player-turn";
|
|
383
|
-
betAmountMultiplier: number;
|
|
384
386
|
}>;
|
|
385
387
|
export type BlackjackFinishedState = Simplify<BlackjackStateBase & BaseFinishedState & {
|
|
386
388
|
outcome: BlackjackOutcome;
|
|
@@ -401,7 +403,6 @@ export type BlackjackInternalInProgressState = BaseInProgressState & {
|
|
|
401
403
|
readonly playerHand: PlayerHand;
|
|
402
404
|
readonly dealerHand: DealerHand;
|
|
403
405
|
readonly insuranceBought: boolean;
|
|
404
|
-
readonly betAmountMultiplier: number;
|
|
405
406
|
};
|
|
406
407
|
export type BlackjackInternalFinishedState = BaseFinishedState & {
|
|
407
408
|
readonly phase: "finished";
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var Ot;((t)=>t.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Ot||={});class c extends Error{static createValidationError(r){return new c("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof c}errorCode;constructor(r,t){super(t);this.errorCode=r}}var h;((x)=>{x.DICE="DICE";x.MINES="MINES";x.KENO="KENO";x.LIMBO="LIMBO";x.ADVANCED_DICE="ADVANCED_DICE";x.BACCARAT="BACCARAT";x.DIAMONDS="DIAMONDS";x.PLINKO="PLINKO";x.ROULETTE="ROULETTE";x.WHEEL="WHEEL";x.BLACKJACK="BLACKJACK"})(h||={});class C{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}import{Big as Gr}from"big.js";import tr from"big.js";class T{static withMultiplier(r,t){return new tr(r).times(new tr(100-t).div(100))}static withWinChance(r,t){return tr(100-r).div(t)}}var Ar=0,fr=1e4,_r=10001,xt=0.01,Bt=98,Ct=(r)=>{if(r<Ar)throw c.createValidationError(`Lower bound ${r} is below minimum allowed value ${Ar}`)},St=(r)=>{if(r>fr)throw c.createValidationError(`Upper bound ${r} is above maximum allowed value ${fr}`)},m=(r)=>{if(Ct(r.lower),St(r.upper),r.lower>=r.upper)throw c.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},dt=(r,t)=>{let[o,E]=r.lower<=t.lower?[r,t]:[t,r];if(o.upper>E.lower)throw c.createValidationError("Bounds must not overlap")},pt=(r,t)=>t>=r.lower&&t<=r.upper,Zt=(r)=>r.upper-r.lower+1,or=(r,t)=>t>r.lower&&t<r.upper,Er=(r)=>r.upper-r.lower-1,Dt;((E)=>{E.ROLL_BETWEEN="ROLL_BETWEEN";E.ROLL_OUTSIDE="ROLL_OUTSIDE";E.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(Dt||={});var Tr=(r)=>{let o=(()=>{switch(r.mode){case"ROLL_BETWEEN":return m(r.bounds),Er(r.bounds);case"ROLL_OUTSIDE":return m(r.bounds),_r-Zt(r.bounds);case"ROLL_BETWEEN_TWO":return m(r.firstBounds),m(r.secondBounds),dt(r.firstBounds,r.secondBounds),Er(r.firstBounds)+Er(r.secondBounds)}})(),E=Gr(o).div(_r).mul(100);if(E.lt(xt))throw c.createValidationError("Win chance too low");if(E.gt(Bt))throw c.createValidationError("Win chance too high");return E},no=(r)=>{Tr(r)};class ht extends C{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=Tr(o),A=r.getRandomInt({min:Ar,max:fr}),f=A.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return or(o.bounds,f);case"ROLL_OUTSIDE":return!pt(o.bounds,f);case"ROLL_BETWEEN_TWO":return or(o.firstBounds,f)||or(o.secondBounds,f)}})()?T.withWinChance(t,E):new Gr(0),outputs:{result:A.values},randomValues:A}}}import b from"big.js";var Nt=["Clubs","Diamonds","Hearts","Spades"],_t=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],Gt;((E)=>{E.PLAYER_WIN="PLAYER_WIN";E.TIE="TIE";E.BANKER_WIN="BANKER_WIN"})(Gt||={});var Tt;((E)=>{E.PLAYER="PLAYER";E.TIE="TIE";E.BANKER="BANKER"})(Tt||={});var yt={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},bt=(r)=>{return new b(0).add(r.bets.reduce((o,E)=>o.add(E.amount),new b(0)))};class Vt extends C{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(t);let E=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),A=E.values,f=A.slice(0,3),i=A.slice(3,6),O=[],B=0;for(let p of f.slice(0,2)){let D=this.mapRandomValueToCard(p),j=this.mapRandomValueToCardValue(p);O.push(D),B=(B+j)%10}let d=[],S=0;for(let p of i.slice(0,2)){let D=this.mapRandomValueToCard(p),j=this.mapRandomValueToCardValue(p);d.push(D),S=(S+j)%10}if(!this.isNaturalWin(B,S)){let p=this.shouldDrawThirdPlayerCard(B),D=null;if(p)D=this.mapRandomValueToCardValue(f[2]),O.push(this.mapRandomValueToCard(f[2])),B=(B+D)%10;if(this.shouldDrawThirdBankerCard(S,D))d.push(this.mapRandomValueToCard(i[2])),S=(S+this.mapRandomValueToCardValue(i[2]))%10}let x;if(B===S)x="TIE";else x=B>S?"PLAYER_WIN":"BANKER_WIN";let N=bt(t),{betType:I,multiplier:ct}=yt[x],F=new b(0);if(F=F.add(t.bets.filter((p)=>p.type===I).reduce((p,D)=>p.add(D.amount.mul(ct)),new b(0))),x==="TIE")F=F.add(t.bets.filter((p)=>p.type==="PLAYER"||p.type==="BANKER").reduce((p,D)=>p.add(D.amount),new b(0)));return{isFinished:!0,payoutMultiplier:N.gt(0)?F.div(N):new b(0),outputs:{playerCards:O,playerHandValue:B,bankerCards:d,bankerHandValue:S,gameOutcome:x,result:E.values},randomValues:E}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((t)=>t.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let t=Nt[Math.floor(r/13)],o=_t[r%13];return{suit:t,rank:o}}isNaturalWin(r,t){let o=[8,9];return o.includes(r)||o.includes(t)}mapRandomValueToCardValue(r){let t=r%13;if(t===0)return 1;if(t>=10)return 10;return t+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,t){if(t===null)return r<=5;if(r<=2)return!0;if(r===3)return t!==8;if(r===4)return[2,3,4,5,6,7].includes(t);if(r===5)return[4,5,6,7].includes(t);if(r===6)return[6,7].includes(t);return!1}}var yr=2.5,br=2,Vr=1,Ur=0,wr=17,ir=21,H=21,cr=63,W=1.5,Mr=1,vo=13,Or=10,ar=10;import{Guard as J}from"@betorigami/guard";import{createStore as at}from"@xstate/store";var ur=0,Fr=51,n=Array.from({length:52},(r,t)=>t),Pr=["Spades","Hearts","Diamonds","Clubs"],s=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],Rr=["Jack","Queen","King"];var xr;((A)=>{A.WIN="WIN";A.LOSE="LOSE";A.PUSH="PUSH";A.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(xr||={});var Yr;((o)=>{o.WON="WON";o.LOST="LOST"})(Yr||={});var $r;((i)=>{i.START="START";i.HIT="BLACKJACK_HIT";i.STAND="BLACKJACK_STAND";i.BUY_INSURANCE="BLACKJACK_BUY_INSURANCE";i.REJECT_INSURANCE="BLACKJACK_REJECT_INSURANCE";i.DOUBLE_DOWN="BLACKJACK_DOUBLE_DOWN"})($r||={});import{Guard as Ut}from"@betorigami/guard";import{Guard as Br}from"@betorigami/guard";class Cr{value;constructor(r){let t=n[r];Br.againstNullOrUndefined(t,`Invalid card value: ${r}`),this.value=t}get suit(){let r=Math.floor(this.value/13),t=Pr[r];return Br.againstNullOrUndefined(t,`Invalid suit index: ${r}`),t}get rank(){let r=this.value%13,t=s[r];return Br.againstNullOrUndefined(t,`Invalid rank index: ${r}`),t}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class _ extends Cr{get numericRank(){if(Rr.includes(this.rank))return ar;return s.indexOf(this.rank)+1}static fromValue(r){return Ut.against(!n.includes(r),`Invalid card value: ${r}`),new _(r)}}class P{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((o,E)=>o+E.numericRank,0),r.some((o)=>o.rank==="Ace")&&this.hardHandValue+Or<=ir)this.softHandValue=this.hardHandValue+Or}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>ir}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===H}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class R{cards;value;constructor(r){this.cards=r.map((t)=>_.fromValue(t)),this.value=new P(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.toDto()),value:this.highestHandValue}}}class Y extends R{otherCards;upCard;holeCard;constructor(r,t,o=[]){super([r,t,...o]);this.otherCards=o;this.upCard=_.fromValue(r),this.holeCard=_.fromValue(t)}static withInitialDeal(r){return new Y(r.upCard,r.holeCard)}addDrawnCards(r){return new Y(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new P([this.upCard]).highestHandValue}}}class $ extends R{static withInitialDeal(r){return new $(r)}addDrawnCards(r){return new $([...this.rawValues,...r])}}import L from"big.js";var Jr={PLAYER_BLACKJACK:L(yr),WIN:L(br),PUSH:L(Vr),LOSE:L(Ur)};import{Guard as l}from"@betorigami/guard";class K{source;index=0;constructor(r){this.source=r}static from(r,t){return l.against(t<=0,`Count must be positive, got ${t}`),l.against(r.values.length!==t,`Expected ${t} values, got ${r.values.length}`),new K(r)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return l.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){l.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let t=this.source.values.slice(this.index,this.index+r);return this.index+=r,t}}import{Guard as wt}from"@betorigami/guard";import Mt from"fast-deep-equal";class Sr{edge;constructor(r){this.edge=r}play(r,t,o=[]){let E=this.createGameStore(),A=this.generateRandomValues(r),f=A.toMultipleRandomValues();for(let B of o)E.send({...B.playerArgument,randomValuePool:A});let i=o[o.length-1];if(i)wt.against(!Mt(i.state,this.toExternalState(E.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");E.send({...t,randomValuePool:A});let O=E.getSnapshot().context;return{playerArgument:O.playerArgument,state:this.toExternalState(O.state),config:O.config,betAmountMultiplier:O.betAmountMultiplier,proof:{proofHash:f.proofHash,proofString:f.proofString}}}}var ut={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},y=(r)=>_.fromValue(r).value;function dr(r){J.against(r.phase!=="in-progress","Expected a started, in-progress game state")}function zr(r){J.against(r.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}var Ft=(r,t)=>{let o=t;while(o.highestHandValue<wr)o=o.addDrawnCards([y(r.takeOne())]);return o},Pt=(r,t)=>{if(r.isBusted)return"LOSE";if(t.isBusted)return"WIN";let o=r.highestHandValue,E=t.highestHandValue;if(o>E)return"WIN";if(o<E)return"LOSE";return"PUSH"},Z=(r)=>({state:{isFinished:!0,phase:"finished",playerHand:r.playerHand,dealerHand:r.dealerHand,outcome:r.outcome,multiplier:Jr[r.outcome].toNumber(),randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome},config:{},playerArgument:{type:r.actionType},betAmountMultiplier:r.betAmountMultiplier}),pr=(r)=>{let t=Ft(r.randomValuePool,r.dealerHand),o=Pt(r.playerHand,t);return Z({...r,dealerHand:t,outcome:o})};class Rt extends Sr{generateRandomValues(r){return K.from(r.getRandomIntsWithReplacement({min:ur,max:Fr,count:cr}),cr)}toExternalState(r){let t=r.phase;switch(t){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:r.multiplier,betAmountMultiplier:r.betAmountMultiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,outcome:r.outcome,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!0),...r.insuranceOutcome!==void 0&&{insuranceOutcome:r.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:J.againstNever(t,"Invalid state received")}}createGameStore(){return at({context:ut,on:{START:(r,t)=>{J.against(r.state.phase!=="uninitialised","START action requires a fresh game");let o=y(t.randomValuePool.takeOne()),E=y(t.randomValuePool.takeOne()),A=y(t.randomValuePool.takeOne()),f=y(t.randomValuePool.takeOne()),i=$.withInitialDeal([o,E]),O=Y.withInitialDeal({upCard:A,holeCard:f});if(O.upCard.rank==="Ace")return{state:{isFinished:!1,phase:"awaiting-insurance",multiplier:1,playerHand:i,dealerHand:O},config:{},playerArgument:{type:"START"}};if(i.isBlackjack&&O.isBlackjack)return Z({playerHand:i,dealerHand:O,outcome:"PUSH",randomValuePool:t.randomValuePool,actionType:"START",betAmountMultiplier:1});if(i.isBlackjack)return Z({playerHand:i,dealerHand:O,outcome:"PLAYER_BLACKJACK",randomValuePool:t.randomValuePool,actionType:"START",betAmountMultiplier:1});if(O.isBlackjack)return Z({playerHand:i,dealerHand:O,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"START",betAmountMultiplier:1});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:i,dealerHand:O,insuranceBought:!1,betAmountMultiplier:1},config:{},playerArgument:{type:"START"}}},BLACKJACK_BUY_INSURANCE:(r,t)=>{zr(r.state);let{playerHand:o,dealerHand:E}=r.state,A={randomValuePool:t.randomValuePool,actionType:"BLACKJACK_BUY_INSURANCE",betAmountMultiplier:W,dealerHand:E,playerHand:o};if(o.isBlackjack&&E.isBlackjack)return Z({outcome:"PUSH",insuranceOutcome:"WON",...A});if(o.isBlackjack)return Z({outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST",...A});if(E.isBlackjack)return Z({outcome:"LOSE",insuranceOutcome:"WON",...A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:E,insuranceBought:!0,betAmountMultiplier:W},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmountMultiplier:W}},BLACKJACK_REJECT_INSURANCE:(r,t)=>{zr(r.state);let{playerHand:o,dealerHand:E}=r.state,A={playerHand:o,dealerHand:E,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_REJECT_INSURANCE",betAmountMultiplier:1};if(o.isBlackjack&&E.isBlackjack)return Z({outcome:"PUSH",...A});if(o.isBlackjack)return Z({outcome:"PLAYER_BLACKJACK",...A});if(E.isBlackjack)return Z({outcome:"LOSE",...A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:E,insuranceBought:!1,betAmountMultiplier:1},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(r,t)=>{dr(r.state);let{insuranceBought:o,betAmountMultiplier:E}=r.state,A=o?"LOST":void 0,f=r.state.playerHand.addDrawnCards([y(t.randomValuePool.takeOne())]);if(f.isBusted)return Z({playerHand:f,dealerHand:r.state.dealerHand,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"BLACKJACK_HIT",betAmountMultiplier:E,insuranceOutcome:A});if(f.highestHandValue===H)return pr({playerHand:f,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_HIT",betAmountMultiplier:E,insuranceOutcome:A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:f,dealerHand:r.state.dealerHand,insuranceBought:o,betAmountMultiplier:E},config:{},playerArgument:{type:"BLACKJACK_HIT"},betAmountMultiplier:E}},BLACKJACK_STAND:(r,t)=>{dr(r.state);let{insuranceBought:o,betAmountMultiplier:E}=r.state,A=o?"LOST":void 0;return pr({playerHand:r.state.playerHand,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_STAND",betAmountMultiplier:E,insuranceOutcome:A})},BLACKJACK_DOUBLE_DOWN:(r,t)=>{dr(r.state),J.against(r.state.playerHand.cards.length!==2,"Double down is only allowed as the first action");let{insuranceBought:o}=r.state,E=r.state.betAmountMultiplier+Mr,A=o?"LOST":void 0,f=r.state.playerHand.addDrawnCards([y(t.randomValuePool.takeOne())]);if(f.isBusted)return Z({playerHand:f,dealerHand:r.state.dealerHand,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",betAmountMultiplier:E,insuranceOutcome:A});return pr({playerHand:f,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",betAmountMultiplier:E,insuranceOutcome:A})}}})}getValidNextActionTypes(r){if(r.isFinished)return[];if(r.phase==="awaiting-insurance")return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];if(r.playerHand.cards.length===2)return["BLACKJACK_HIT","BLACKJACK_STAND","BLACKJACK_DOUBLE_DOWN"];return["BLACKJACK_HIT","BLACKJACK_STAND"]}}import Yt from"big.js";class G{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let t=this.multipliers.get(r);if(t===void 0)throw new Error(`Multipliers for ${r} not found`);return t}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,t])=>({edge:r,multipliers:t}))}}var $t;((i)=>{i.PAIR="PAIR";i.TWO_PAIR="TWO_PAIR";i.THREE_OF_A_KIND="THREE_OF_A_KIND";i.FULL_HOUSE="FULL_HOUSE";i.FOUR_OF_A_KIND="FOUR_OF_A_KIND";i.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})($t||={});var Jt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},zt={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},qt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},Qt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},Xt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},It=new G(new Map([[1,Jt],[2,zt],[3,qt],[4,Qt],[8,Xt]])),jt={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class mt extends C{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:t}){let o=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),E=It.getMultipliers(t),A=o.values,f=this.calculatePayoutMultiplier(E,A);return{isFinished:!0,payoutMultiplier:Yt(f),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(r,t){let o=new Map;for(let f of t){let i=o.get(f)||0;o.set(f,i+1)}let E=[...o.values()].filter((f)=>f>1),A=this.classifyResult(E);return A===null?0:r[A]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[t,o]=r;if(t===void 0)return null;if(o===void 0){let E=jt[t];if(E===void 0)throw new Error(`Unexpected single diamond repeat count: ${t}`);return E}return t===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}import Qr from"big.js";var Ht;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(Ht||={});var qr=1e4,Wt=(r)=>{let t=r.direction==="ABOVE"?qr-r.selectedValue:r.selectedValue;return new Qr(t).div(qr).mul(100)},nt=(r,t)=>r.direction==="ABOVE"?t>r.selectedValue:t<r.selectedValue;class st extends C{constructor(){super("DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=r.getRandomInt({min:0,max:1e4}),A=Wt(o);return{isFinished:!0,payoutMultiplier:nt(o,E.value)?T.withWinChance(t,A):new Qr(0),outputs:{result:E.values},randomValues:E}}}import kt from"big.js";import{Guard as v}from"@betorigami/guard";var Xr;((A)=>{A.CLASSIC="CLASSIC";A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(Xr||={});var Lt=[1,2,3,4,5,6,7,8,9,10],Ir=(r)=>{return Lt.includes(r)};var lt={[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]}},Kt={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},vt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},gt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},et={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},jr=new G(new Map([[1,lt],[2,Kt],[3,vt],[4,gt],[8,et]]));class ro extends C{constructor(){super("KENO")}determineGameResult({generator:r,edge:t,gameInputs:o}){v.againstEmptyArray(o.selectedNumbers,()=>c.createValidationError("No numbers selected")),v.against(o.selectedNumbers.length>10,()=>c.createValidationError("Maximum of 10 numbers can be selected"));for(let x of o.selectedNumbers)v.againstNonInteger(x,()=>c.createValidationError("Only integers can be selected")),v.against(x<0||x>39,()=>c.createValidationError("Invalid number selected"));let E=r.getUniqueRandomInts({min:0,max:39,count:10}),A=o.selectedNumbers.filter((x)=>E.values.includes(x)),f=o.selectedNumbers.length;if(!Ir(f))throw new Error(`Invalid tile count: ${f}`);let d=jr.getMultipliers(t)[f][o.riskLevel][A.length];if(d===void 0)throw new Error(`No multiplier found for matching tile count ${A.length}`);return{isFinished:!0,payoutMultiplier:new kt(d),outputs:{result:E.values},randomValues:E}}}import V from"big.js";var mr=(r,t)=>{return r.gt(t)?r:t};var Hr=(r,t)=>{return r.lt(t)?r:t};class to extends C{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=r.getRandomInt({min:1,max:4294967295}),A=E.max,f=new V(16777216),i=new V(1),O=new V(1e6),B=E.value,d=new V(B-1).div(A),S=(100-t)/100,x=f.div(d.mul(f).plus(1)).mul(S),N=mr(i,Hr(x,O));return{isFinished:!0,payoutMultiplier:N.gte(o.targetMultiplier)?new V(o.targetMultiplier):new V(0),outputs:{randomMultiplier:N,result:E.values},randomValues:E}}}import g from"big.js";var Zr=(r,t)=>{if(t<0||r<0||t>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(t>r-t)t=r-t;let o=1;for(let E=1;E<=t;E++)o=o*(r-E+1)/E;return o};class oo extends C{constructor(){super("MINES")}determineGameResult({generator:r,edge:t,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 i=r.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),O=i.values.some((I)=>o.selectedTiles.includes(I)),B=o.hasCashedOut||O,d=(100-t)/100,S=new g(Zr(25-o.minesCount,o.selectedTiles.length)).div(new g(Zr(25,o.selectedTiles.length))),N=o.hasCashedOut&&!O?new g(d).div(S):new g(0);return{isFinished:B,payoutMultiplier:N,outputs:{result:i.values},randomValues:i}}}import{Big as Oo}from"big.js";var Wr;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(Wr||={});var uA=[8,9,10,11,12,13,14,15,16],Eo={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[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:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},Ao={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},fo={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},io={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},co={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},nr=new G(new Map([[1,Eo],[2,Ao],[3,fo],[4,io],[8,co]]));class xo extends C{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(t.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(t.numberOfRows<8||t.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let E=t.numberOfRows,i=nr.getMultipliers(o)[t.riskLevel][E],O=r.getRandomIntsWithReplacement({min:0,max:1,count:t.numberOfRows}),d=O.values.reduce((x,N)=>x+N,0),S=i[d];if(S===void 0)throw new Error(`No payout found for end position ${d}`);return{isFinished:!0,payoutMultiplier:Oo(S),outputs:{result:O.values},randomValues:O}}}import{Big as rr}from"big.js";var Dr=[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],sr=[37,...Dr],Lr=[[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]],lr=[[0,1],[0,37],[3,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]],Kr=[[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]],vr=[[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]],gr=[[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]],er=[[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]],kr=[0,1,2,3,37],rt=[[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]],tt=[[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]],U;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(U||={});var w;((o)=>{o.RED="RED";o.BLACK="BLACK"})(w||={});var M;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(M||={});var a;((E)=>{E.TOP="TOP";E.MIDDLE="MIDDLE";E.BOTTOM="BOTTOM"})(a||={});var u;((E)=>{E.FIRST="FIRST";E.SECOND="SECOND";E.THIRD="THIRD"})(u||={});var hr;((o)=>{o.AMERICAN="AMERICAN";o.EUROPEAN="EUROPEAN"})(hr||={});var e=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw c.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&z(t.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&Bo(t.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&Co(t.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&So(t.values)))throw c.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&po(t.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(U).includes(t.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(w).includes(t.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(M).includes(t.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(a).includes(t.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(u).includes(t.dozen)))throw c.createValidationError("Invalid dozen bet.")},z=(r)=>{return Dr.includes(r)},Bo=(r)=>{if(r.length!==2)return!1;if(!r.every(z))return!1;return Lr.some(([t,o])=>t===r[0]&&o===r[1])},Co=(r)=>{if(r.length!==3)return!1;if(!r.every(z))return!1;return Kr.some(([t,o,E])=>t===r[0]&&o===r[1]&&E===r[2])},So=(r)=>{if(r.length!==4)return!1;if(!r.every(z))return!1;return gr.some(([t,o,E,A])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3])},po=(r)=>{if(r.length!==6)return!1;if(!r.every(z))return!1;return rt.some(([t,o,E,A,f,i])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3]&&f===r[4]&&i===r[5])};var k=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw c.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&q(t.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&Zo(t.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&Do(t.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&ho(t.values)))throw c.createValidationError("Invalid corner bet.");if(!r.basketBets.every((t)=>t.amount.gte(0)))throw c.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&No(t.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(U).includes(t.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(w).includes(t.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(M).includes(t.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(a).includes(t.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(u).includes(t.dozen)))throw c.createValidationError("Invalid dozen bet.")},q=(r)=>{return sr.includes(r)};function Zo(r){if(r.length!==2)return!1;if(!r.every(q))return!1;return lr.some(([t,o])=>t===r[0]&&o===r[1])}var Do=(r)=>{if(r.length!==3)return!1;if(!r.every(q))return!1;return vr.some(([t,o,E])=>t===r[0]&&o===r[1]&&E===r[2])},ho=(r)=>{if(r.length!==4)return!1;if(!r.every(q))return!1;return er.some(([t,o,E,A])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3])},No=(r)=>{if(r.length!==6)return!1;if(!r.every(q))return!1;return tt.some(([t,o,E,A,f,i])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3]&&f===r[4]&&i===r[5])};var _o={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},Go=[3,6,9,12,15,18,21,24,27,30,33,36],To=[2,5,8,11,14,17,20,23,26,29,32,35],yo=[1,4,7,10,13,16,19,22,25,28,31,34],bo=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],Vo=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],Uo=2.7,wo=5.3;class Nr extends C{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:t}){this.validateInputs(t);let o=r.getRandomInt({min:0,max:this.maxNumber}),E=o.value,A=this.determineBetOutcomes(t,E),{payoutMultiplier:f}=this.getPayoutDetails(t,E);return{outputs:{betOutcomes:A,result:o.values},payoutMultiplier:f,isFinished:!0,randomValues:o}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,t){let o=this.determineBetOutcomes(r,t),E=this.getBetTotals(r),A=this.getBetTotals(o.winningBets),f=this.calculateTotalBetAmount(E),i=this.calculateTotalPayout(A);return{payoutMultiplier:f.gt(0)?i.div(f):new rr(0),payoutAmount:i}}determineBetOutcomes(r,t){let o={},E={};for(let A of Object.keys(r)){let f=r[A],i=this.betPredicates[A],{winning:O,losing:B}=this.partitionBets(f,i,t);o[A]=O,E[A]=B}return{winningBets:o,losingBets:E}}calculateTotalAmount(r){return r.reduce((t,o)=>t.plus(o.amount),new rr(0))}isWinningStraightBet(r,t){return r.value===t}isWinningSplitBet(r,t){return r.values.some((o)=>o===t)}isWinningStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningCornerBet(r,t){return r.values.some((o)=>o===t)}isWinningDoubleStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningColorBet(r,t){let o=r;return bo.includes(t)&&o.color==="RED"||Vo.includes(t)&&o.color==="BLACK"}isWinningHalfBet(r,t){let o=r;if(t>0&&t<=18&&o.half==="LOW")return!0;if(t>18&&t<=36&&o.half==="HIGH")return!0;return!1}isWinningColumnBet(r,t){let o=r;return Go.includes(t)&&o.column==="TOP"||To.includes(t)&&o.column==="MIDDLE"||yo.includes(t)&&o.column==="BOTTOM"}isWinningDozenBet(r,t){let o=r;if(t>0&&t<=12&&o.dozen==="FIRST")return!0;if(t>12&&t<=24&&o.dozen==="SECOND")return!0;if(t>24&&t<=36&&o.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,t){let o=r;if(t===0||t===37)return!1;let E=t%2===0?"EVEN":"ODD";return o.parity===E}getBetTotals(r){let t={};for(let o of Object.keys(r))t[o]=this.calculateTotalAmount(r[o]);return t}calculateTotalBetAmount(r){return Object.values(r).reduce((t,o)=>t.plus(o),new rr(0))}partitionBets(r,t,o){return{winning:r.filter((E)=>t(E,o)),losing:r.filter((E)=>!t(E,o))}}calculateTotalPayout(r){return Object.entries(r).reduce((t,[o,E])=>{let f=_o[o];return t.plus(E.mul(f||0))},new rr(0))}}class ot extends Nr{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){e(r)}}class Et extends Nr{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){k(r)}isWinningBasketBet(r,t){return kr.some((o)=>o===t)}}class At extends C{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new ot,this.americanGame=new Et}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:t,...o}=r;if(r.edge===Uo&&t.type==="EUROPEAN"){let E=this.europeanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"european",betOutcomes:A,result:E.outputs.result}}}if(r.edge===wo&&t.type==="AMERICAN"){let E=this.americanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"american",betOutcomes:A,result:E.outputs.result}}}throw c.createValidationError(`Attempted to play ${t.type} roulette on edge ${r.edge}`)}}var eA=(r)=>{return new At().getBetAmount(r)};var E1=(r)=>{if(r.type==="EUROPEAN")e(r.inputs);else k(r.inputs)};import{Big as Ro}from"big.js";var Q;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(Q||={});var X;((f)=>{f[f.TEN=10]="TEN";f[f.TWENTY=20]="TWENTY";f[f.THIRTY=30]="THIRTY";f[f.FORTY=40]="FORTY";f[f.FIFTY=50]="FIFTY"})(X||={});var Mo={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},ao={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},uo={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},Fo={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},Po={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},ft=new G(new Map([[1,Mo],[2,ao],[3,uo],[4,Fo],[8,Po]]));var it={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class Yo extends C{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(!Object.values(X).includes(t.segments))throw new Error("Invalid segments value");if(!Object.values(Q).includes(t.riskLevel))throw new Error("Invalid risk level");let A=ft.getMultipliers(o)[t.riskLevel];if(A===void 0)throw new Error(`No multipliers found for risk level ${t.riskLevel}`);let f=A[t.segments];if(f===void 0)throw new Error(`No multipliers found for segment ${t.segments}`);let i=it[t.riskLevel];if(i===void 0)throw new Error(`No patterns found for risk level ${t.riskLevel}`);let O=i[t.segments];if(O===void 0)throw new Error(`No patterns found for segment ${t.segments}`);let B=r.getRandomInt({min:0,max:O.length-1}),d=O[B.value];if(d===void 0)throw new Error(`No pattern found for segment ${t.segments} and value ${B.value}`);let S=f[d];if(S===void 0)throw new Error(`No payout found for picked segment ${d}`);return{isFinished:!0,payoutMultiplier:new Ro(S),outputs:{result:B.values},randomValues:B}}}export{E1 as validateRouletteGameInputs,no as validateAdvancedDiceInputs,lt as rtp99Multipliers,Kt as rtp98Multipliers,vt as rtp97Multipliers,gt as rtp96Multipliers,et as rtp92Multipliers,nr as plinkoMultipliers,Zr as nCr,jr as kenoMultipliers,Ir as isTileCount,nt as hasDiceWon,It as diamondsMultipliers,eA as calculateRouletteBetAmount,Wt as calculateDiceWinChance,bt as calculateBaccaratBetAmount,Tr as calculateAdvancedDiceWinChance,Hr as bigMin,mr as bigMax,pt as advancedDiceIsWithinBoundsInclusive,or as advancedDiceIsWithinBoundsExclusive,Zt as advancedDiceGetInclusiveBoundsRange,Er as advancedDiceGetExclusiveBoundsRange,X as WheelSegments,Q as WheelRiskLevel,Yo as Wheel,br as WIN_MULTIPLIER,Nt as VALID_SUITS,_t as VALID_RANKS,Kr as VALID_EUROPEAN_STREETS,Dr as VALID_EUROPEAN_STRAIGHTS,Lr as VALID_EUROPEAN_SPLITS,rt as VALID_EUROPEAN_DOUBLE_STREETS,gr as VALID_EUROPEAN_CORNERS,vr as VALID_AMERICAN_STREETS,sr as VALID_AMERICAN_STRAIGHTS,lr as VALID_AMERICAN_SPLITS,tt as VALID_AMERICAN_DOUBLE_STREETS,er as VALID_AMERICAN_CORNERS,Go as TOP_COLUMN,Lt as TILE_COUNTS,hr as RouletteType,At as Roulette,Dt as RollType,K as RandomValuePool,bo as RED_NUMBERS,Ar as RANDOM_MIN_VALUE,fr as RANDOM_MAX_VALUE,Wr as PlinkoRiskLevel,xo as Plinko,U as Parity,Vr as PUSH_MULTIPLIER,uA as PLINKO_ROW_COUNTS,_o as PAYOUT_MULTIPLIERS,h as OrigamiGame,T as MultiplierCalculator,oo as Mines,xt as MIN_WIN_CHANCE,To as MIDDLE_COLUMN,Bt as MAX_WIN_CHANCE,cr as MAX_CARDS_PER_ROUND,to as Limbo,Ur as LOSE_MULTIPLIER,Xr as KenoRiskLevel,ro as Keno,Yr as InsuranceOutcome,W as INSURANCE_BET_MULTIPLIER,M as Half,Ot as GameErrorCode,c as GameError,C as Game,ar as FACE_CARD_VALUE,ot as EuropeanRoulette,Uo as EUROPEAN_HOUSE_EDGE,_r as EFFECTIVE_RANGE,u as Dozen,Ht as DiceDirection,st as Dice,$t as DiamondsResultType,mt as Diamonds,Mr as DOUBLE_DOWN_ADDITIONAL_MULTIPLIER,qr as DICE_EFFECTIVE_RANGE,wr as DEALER_STAND_VALUE,a as Column,w as Color,vo as CARDS_PER_SUIT,xr as BlackjackOutcome,$r as BlackjackActionType,Rt as Blackjack,Gt as BaccaratOutcome,Tt as BaccaratBetType,Vt as Baccarat,ir as BUST_VALUE,yo as BOTTOM_COLUMN,Vo as BLACK_NUMBERS,H as BLACKJACK_VALUE,yr as BLACKJACK_MULTIPLIER,Et as AmericanRoulette,ht as AdvancedDice,wo as AMERICAN_HOUSE_EDGE,kr as AMERICAN_BASKET,Or as ACE_SOFT_BONUS};
|
|
1
|
+
var ct;((t)=>t.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(ct||={});class O extends Error{static createValidationError(r){return new O("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof O}errorCode;constructor(r,t){super(t);this.errorCode=r}}var N;((B)=>{B.DICE="DICE";B.MINES="MINES";B.KENO="KENO";B.LIMBO="LIMBO";B.ADVANCED_DICE="ADVANCED_DICE";B.BACCARAT="BACCARAT";B.DIAMONDS="DIAMONDS";B.PLINKO="PLINKO";B.ROULETTE="ROULETTE";B.WHEEL="WHEEL";B.BLACKJACK="BLACKJACK"})(N||={});class S{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}import{Big as ur}from"big.js";import tr from"big.js";class h{static withMultiplier(r,t){return new tr(r).times(new tr(100-t).div(100))}static withWinChance(r,t){return tr(100-r).div(t)}}var Ar=0,fr=1e4,hr=10001,Ot=0.01,it=98,Bt=(r)=>{if(r<Ar)throw O.createValidationError(`Lower bound ${r} is below minimum allowed value ${Ar}`)},xt=(r)=>{if(r>fr)throw O.createValidationError(`Upper bound ${r} is above maximum allowed value ${fr}`)},n=(r)=>{if(Bt(r.lower),xt(r.upper),r.lower>=r.upper)throw O.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},St=(r,t)=>{let[o,E]=r.lower<=t.lower?[r,t]:[t,r];if(o.upper>E.lower)throw O.createValidationError("Bounds must not overlap")},pt=(r,t)=>t>=r.lower&&t<=r.upper,Ct=(r)=>r.upper-r.lower+1,or=(r,t)=>t>r.lower&&t<r.upper,Er=(r)=>r.upper-r.lower-1,dt;((E)=>{E.ROLL_BETWEEN="ROLL_BETWEEN";E.ROLL_OUTSIDE="ROLL_OUTSIDE";E.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(dt||={});var br=(r)=>{let o=(()=>{switch(r.mode){case"ROLL_BETWEEN":return n(r.bounds),Er(r.bounds);case"ROLL_OUTSIDE":return n(r.bounds),hr-Ct(r.bounds);case"ROLL_BETWEEN_TWO":return n(r.firstBounds),n(r.secondBounds),St(r.firstBounds,r.secondBounds),Er(r.firstBounds)+Er(r.secondBounds)}})(),E=ur(o).div(hr).mul(100);if(E.lt(Ot))throw O.createValidationError("Win chance too low");if(E.gt(it))throw O.createValidationError("Win chance too high");return E},Lo=(r)=>{br(r)};class Zt extends S{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=br(o),A=r.getRandomInt({min:Ar,max:fr}),f=A.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(o.mode){case"ROLL_BETWEEN":return or(o.bounds,f);case"ROLL_OUTSIDE":return!pt(o.bounds,f);case"ROLL_BETWEEN_TWO":return or(o.firstBounds,f)||or(o.secondBounds,f)}})()?h.withWinChance(t,E):new ur(0),outputs:{result:A.values},randomValues:A}}}import b from"big.js";var Dt=["Clubs","Diamonds","Hearts","Spades"],Nt=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],_t;((E)=>{E.PLAYER_WIN="PLAYER_WIN";E.TIE="TIE";E.BANKER_WIN="BANKER_WIN"})(_t||={});var Tt;((E)=>{E.PLAYER="PLAYER";E.TIE="TIE";E.BANKER="BANKER"})(Tt||={});var yt={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},Gt=(r)=>{return new b(0).add(r.bets.reduce((o,E)=>o.add(E.amount),new b(0)))};class ht extends S{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(o!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(t);let E=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),A=E.values,f=A.slice(0,3),c=A.slice(3,6),i=[],x=0;for(let d of f.slice(0,2)){let D=this.mapRandomValueToCard(d),H=this.mapRandomValueToCardValue(d);i.push(D),x=(x+H)%10}let C=[],p=0;for(let d of c.slice(0,2)){let D=this.mapRandomValueToCard(d),H=this.mapRandomValueToCardValue(d);C.push(D),p=(p+H)%10}if(!this.isNaturalWin(x,p)){let d=this.shouldDrawThirdPlayerCard(x),D=null;if(d)D=this.mapRandomValueToCardValue(f[2]),i.push(this.mapRandomValueToCard(f[2])),x=(x+D)%10;if(this.shouldDrawThirdBankerCard(p,D))C.push(this.mapRandomValueToCard(c[2])),p=(p+this.mapRandomValueToCardValue(c[2]))%10}let B;if(x===p)B="TIE";else B=x>p?"PLAYER_WIN":"BANKER_WIN";let _=Gt(t),{betType:j,multiplier:ft}=yt[B],R=new b(0);if(R=R.add(t.bets.filter((d)=>d.type===j).reduce((d,D)=>d.add(D.amount.mul(ft)),new b(0))),B==="TIE")R=R.add(t.bets.filter((d)=>d.type==="PLAYER"||d.type==="BANKER").reduce((d,D)=>d.add(D.amount),new b(0)));return{isFinished:!0,payoutMultiplier:_.gt(0)?R.div(_):new b(0),outputs:{playerCards:i,playerHandValue:x,bankerCards:C,bankerHandValue:p,gameOutcome:B,result:E.values},randomValues:E}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((t)=>t.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let t=Dt[Math.floor(r/13)],o=Nt[r%13];return{suit:t,rank:o}}isNaturalWin(r,t){let o=[8,9];return o.includes(r)||o.includes(t)}mapRandomValueToCardValue(r){let t=r%13;if(t===0)return 1;if(t>=10)return 10;return t+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,t){if(t===null)return r<=5;if(r<=2)return!0;if(r===3)return t!==8;if(r===4)return[2,3,4,5,6,7].includes(t);if(r===5)return[4,5,6,7].includes(t);if(r===6)return[6,7].includes(t);return!1}}var cr;((A)=>{A.WIN="WIN";A.LOSE="LOSE";A.PUSH="PUSH";A.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(cr||={});var Or;((o)=>{o.WON="WON";o.LOST="LOST"})(Or||={});var ir;((c)=>{c.START="START";c.HIT="BLACKJACK_HIT";c.STAND="BLACKJACK_STAND";c.BUY_INSURANCE="BLACKJACK_BUY_INSURANCE";c.REJECT_INSURANCE="BLACKJACK_REJECT_INSURANCE";c.DOUBLE_DOWN="BLACKJACK_DOUBLE_DOWN"})(ir||={});var ut=2.5,bt=2,Ut=1,Vt=0,Ur=17,Br=21,W=21,xr=63,tE=1.5,Y=0.5,Vr=1.5,Sr=1,oE=13,pr=10,wr=10,Mr={PLAYER_BLACKJACK:ut,WIN:bt,PUSH:Ut,LOSE:Vt};import{Guard as q}from"@betorigami/guard";import{createStore as Rt}from"@xstate/store";var ar=0,Pr=51,s=Array.from({length:52},(r,t)=>t),Rr=["Spades","Hearts","Diamonds","Clubs"],l=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],Yr=["Jack","Queen","King"];import{Guard as wt}from"@betorigami/guard";import{Guard as Cr}from"@betorigami/guard";class dr{value;constructor(r){let t=s[r];Cr.againstNullOrUndefined(t,`Invalid card value: ${r}`),this.value=t}get suit(){let r=Math.floor(this.value/13),t=Rr[r];return Cr.againstNullOrUndefined(t,`Invalid suit index: ${r}`),t}get rank(){let r=this.value%13,t=l[r];return Cr.againstNullOrUndefined(t,`Invalid rank index: ${r}`),t}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class T extends dr{get numericRank(){if(Yr.includes(this.rank))return wr;return l.indexOf(this.rank)+1}static fromValue(r){return wt.against(!s.includes(r),`Invalid card value: ${r}`),new T(r)}}class F{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((o,E)=>o+E.numericRank,0),r.some((o)=>o.rank==="Ace")&&this.hardHandValue+pr<=Br)this.softHandValue=this.hardHandValue+pr}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>Br}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===W}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class ${cards;value;constructor(r){this.cards=r.map((t)=>T.fromValue(t)),this.value=new F(this.cards)}get isBusted(){return this.value.isBusted}get isBlackjack(){return this.value.isBlackjack}get highestHandValue(){return this.value.highestHandValue}get rawValues(){return this.cards.map((r)=>r.value)}toDto(){return{cards:this.cards.map((r)=>r.toDto()),value:this.highestHandValue}}}class z extends ${otherCards;upCard;holeCard;constructor(r,t,o=[]){super([r,t,...o]);this.otherCards=o;this.upCard=T.fromValue(r),this.holeCard=T.fromValue(t)}static withInitialDeal(r){return new z(r.upCard,r.holeCard)}addDrawnCards(r){return new z(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new F([this.upCard]).highestHandValue}}}class J extends ${static withInitialDeal(r){return new J(r)}addDrawnCards(r){return new J([...this.rawValues,...r])}}import{Guard as L}from"@betorigami/guard";class K{source;index=0;constructor(r){this.source=r}static from(r,t){return L.against(t<=0,`Count must be positive, got ${t}`),L.against(r.values.length!==t,`Expected ${t} values, got ${r.values.length}`),new K(r)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return L.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){L.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let t=this.source.values.slice(this.index,this.index+r);return this.index+=r,t}}import{Guard as Mt}from"@betorigami/guard";import at from"fast-deep-equal";class Zr{edge;constructor(r){this.edge=r}play(r,t,o=[]){let E=this.createGameStore(),A=this.generateRandomValues(r),f=A.toMultipleRandomValues();for(let x of o)E.send({...x.playerArgument,randomValuePool:A});let c=o[o.length-1];if(c)Mt.against(!at(c.state,this.toExternalState(E.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");E.send({...t,randomValuePool:A});let i=E.getSnapshot().context;return{playerArgument:i.playerArgument,state:this.toExternalState(i.state),config:i.config,betAmountMultiplier:i.betAmountMultiplier,proof:{proofHash:f.proofHash,proofString:f.proofString}}}}import G from"big.js";var Pt={BLACKJACK_DOUBLE_DOWN:Sr,BLACKJACK_BUY_INSURANCE:Y},Fr=(r)=>{let t=r.insuranceOutcome!==void 0,o=r.actionType==="BLACKJACK_DOUBLE_DOWN",E=G(1),A=o?G(Sr):G(0),f=t?G(Y):G(0),c=E.plus(A).plus(f),i=E.plus(A),x=G(Mr[r.outcome]).mul(i),C=r.insuranceOutcome==="WON"?G(Vr):G(0);return{payoutMultiplier:x.plus(C).div(c).toNumber(),betAmountMultiplier:Pt[r.actionType]}};var Yt={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},u=(r)=>T.fromValue(r).value;function Dr(r){q.against(r.phase!=="in-progress","Expected a started, in-progress game state")}function $r(r){q.against(r.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}var Ft=(r,t)=>{let o=t;while(o.highestHandValue<Ur)o=o.addDrawnCards([u(r.takeOne())]);return o},$t=(r,t)=>{if(r.isBusted)return"LOSE";if(t.isBusted)return"WIN";let o=r.highestHandValue,E=t.highestHandValue;if(o>E)return"WIN";if(o<E)return"LOSE";return"PUSH"},Z=(r)=>{let{payoutMultiplier:t,betAmountMultiplier:o}=Fr({outcome:r.outcome,insuranceOutcome:r.insuranceOutcome,actionType:r.actionType});return{state:{isFinished:!0,phase:"finished",playerHand:r.playerHand,dealerHand:r.dealerHand,outcome:r.outcome,multiplier:t,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome},config:{},playerArgument:{type:r.actionType},betAmountMultiplier:o}},Nr=(r)=>{let t=Ft(r.randomValuePool,r.dealerHand),o=$t(r.playerHand,t);return Z({...r,dealerHand:t,outcome:o})};class zt extends Zr{generateRandomValues(r){return K.from(r.getRandomIntsWithReplacement({min:ar,max:Pr,count:xr}),xr)}toExternalState(r){let t=r.phase;switch(t){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:r.multiplier,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,outcome:r.outcome,playerHand:r.playerHand.toDto(),dealerHand:r.dealerHand.toDto(!0),...r.insuranceOutcome!==void 0&&{insuranceOutcome:r.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:q.againstNever(t,"Invalid state received")}}createGameStore(){return Rt({context:Yt,on:{START:(r,t)=>{q.against(r.state.phase!=="uninitialised","START action requires a fresh game");let o=u(t.randomValuePool.takeOne()),E=u(t.randomValuePool.takeOne()),A=u(t.randomValuePool.takeOne()),f=u(t.randomValuePool.takeOne()),c=J.withInitialDeal([o,E]),i=z.withInitialDeal({upCard:A,holeCard:f});if(i.upCard.rank==="Ace")return{state:{isFinished:!1,phase:"awaiting-insurance",multiplier:1,playerHand:c,dealerHand:i},config:{},playerArgument:{type:"START"}};if(c.isBlackjack&&i.isBlackjack)return Z({playerHand:c,dealerHand:i,outcome:"PUSH",randomValuePool:t.randomValuePool,actionType:"START"});if(c.isBlackjack)return Z({playerHand:c,dealerHand:i,outcome:"PLAYER_BLACKJACK",randomValuePool:t.randomValuePool,actionType:"START"});if(i.isBlackjack)return Z({playerHand:c,dealerHand:i,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"START"});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:c,dealerHand:i,insuranceBought:!1},config:{},playerArgument:{type:"START"}}},BLACKJACK_BUY_INSURANCE:(r,t)=>{$r(r.state);let{playerHand:o,dealerHand:E}=r.state,A={randomValuePool:t.randomValuePool,actionType:"BLACKJACK_BUY_INSURANCE",dealerHand:E,playerHand:o};if(o.isBlackjack&&E.isBlackjack)return Z({outcome:"PUSH",insuranceOutcome:"WON",...A});if(o.isBlackjack)return Z({outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST",...A});if(E.isBlackjack)return Z({outcome:"LOSE",insuranceOutcome:"WON",...A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:E,insuranceBought:!0},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmountMultiplier:Y}},BLACKJACK_REJECT_INSURANCE:(r,t)=>{$r(r.state);let{playerHand:o,dealerHand:E}=r.state,A={playerHand:o,dealerHand:E,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_REJECT_INSURANCE",doubledDown:!1};if(o.isBlackjack&&E.isBlackjack)return Z({outcome:"PUSH",...A});if(o.isBlackjack)return Z({outcome:"PLAYER_BLACKJACK",...A});if(E.isBlackjack)return Z({outcome:"LOSE",...A});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:o,dealerHand:E,insuranceBought:!1},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(r,t)=>{Dr(r.state);let{insuranceBought:o}=r.state,E=o?"LOST":void 0,A=r.state.playerHand.addDrawnCards([u(t.randomValuePool.takeOne())]);if(A.isBusted)return Z({playerHand:A,dealerHand:r.state.dealerHand,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"BLACKJACK_HIT",insuranceOutcome:E});if(A.highestHandValue===W)return Nr({playerHand:A,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_HIT",insuranceOutcome:E});return{state:{isFinished:!1,phase:"in-progress",multiplier:1,playerHand:A,dealerHand:r.state.dealerHand,insuranceBought:o},config:{},playerArgument:{type:"BLACKJACK_HIT"}}},BLACKJACK_STAND:(r,t)=>{Dr(r.state);let{insuranceBought:o}=r.state,E=o?"LOST":void 0;return Nr({playerHand:r.state.playerHand,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_STAND",insuranceOutcome:E})},BLACKJACK_DOUBLE_DOWN:(r,t)=>{Dr(r.state),q.against(r.state.playerHand.cards.length!==2,"Double down is only allowed as the first action");let{insuranceBought:o}=r.state,E=o?"LOST":void 0,A=r.state.playerHand.addDrawnCards([u(t.randomValuePool.takeOne())]);if(A.isBusted)return Z({playerHand:A,dealerHand:r.state.dealerHand,outcome:"LOSE",randomValuePool:t.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",insuranceOutcome:E});return Nr({playerHand:A,dealerHand:r.state.dealerHand,randomValuePool:t.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",insuranceOutcome:E})}}})}getValidNextActionTypes(r){if(r.isFinished)return[];if(r.phase==="awaiting-insurance")return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];if(r.playerHand.cards.length===2)return["BLACKJACK_HIT","BLACKJACK_STAND","BLACKJACK_DOUBLE_DOWN"];return["BLACKJACK_HIT","BLACKJACK_STAND"]}}import Jt from"big.js";class y{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let t=this.multipliers.get(r);if(t===void 0)throw new Error(`Multipliers for ${r} not found`);return t}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,t])=>({edge:r,multipliers:t}))}}var qt;((c)=>{c.PAIR="PAIR";c.TWO_PAIR="TWO_PAIR";c.THREE_OF_A_KIND="THREE_OF_A_KIND";c.FULL_HOUSE="FULL_HOUSE";c.FOUR_OF_A_KIND="FOUR_OF_A_KIND";c.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(qt||={});var mt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4.3,FOUR_OF_A_KIND:5,FIVE_OF_A_KIND:50},Qt={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},It={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.7,FOUR_OF_A_KIND:4.6,FIVE_OF_A_KIND:50},Xt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:3.4,FOUR_OF_A_KIND:4.4,FIVE_OF_A_KIND:50},jt={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:2.8,FULL_HOUSE:3.2,FOUR_OF_A_KIND:3.6,FIVE_OF_A_KIND:50},Ht=new y(new Map([[1,mt],[2,Qt],[3,It],[4,Xt],[8,jt]])),nt={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Wt extends S{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:t}){let o=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),E=Ht.getMultipliers(t),A=o.values,f=this.calculatePayoutMultiplier(E,A);return{isFinished:!0,payoutMultiplier:Jt(f),outputs:{result:o.values},randomValues:o}}calculatePayoutMultiplier(r,t){let o=new Map;for(let f of t){let c=o.get(f)||0;o.set(f,c+1)}let E=[...o.values()].filter((f)=>f>1),A=this.classifyResult(E);return A===null?0:r[A]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[t,o]=r;if(t===void 0)return null;if(o===void 0){let E=nt[t];if(E===void 0)throw new Error(`Unexpected single diamond repeat count: ${t}`);return E}return t===3||o===3?"FULL_HOUSE":"TWO_PAIR"}}import Jr from"big.js";var st;((o)=>{o.ABOVE="ABOVE";o.BELOW="BELOW"})(st||={});var zr=1e4,lt=(r)=>{let t=r.direction==="ABOVE"?zr-r.selectedValue:r.selectedValue;return new Jr(t).div(zr).mul(100)},Lt=(r,t)=>r.direction==="ABOVE"?t>r.selectedValue:t<r.selectedValue;class Kt extends S{constructor(){super("DICE")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=r.getRandomInt({min:0,max:1e4}),A=lt(o);return{isFinished:!0,payoutMultiplier:Lt(o,E.value)?h.withWinChance(t,A):new Jr(0),outputs:{result:E.values},randomValues:E}}}import oo from"big.js";import{Guard as v}from"@betorigami/guard";var qr;((A)=>{A.CLASSIC="CLASSIC";A.LOW_RISK="LOW_RISK";A.MEDIUM_RISK="MEDIUM_RISK";A.HIGH_RISK="HIGH_RISK"})(qr||={});var vt=[1,2,3,4,5,6,7,8,9,10],mr=(r)=>{return vt.includes(r)};var gt={[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]}},et={[1]:{CLASSIC:[0,3.92],LOW_RISK:[0.7,1.82],MEDIUM_RISK:[0.4,2.72],HIGH_RISK:[0,3.92]},[2]:{CLASSIC:[0,1.9,4.32],LOW_RISK:[0,2,3.65],MEDIUM_RISK:[0,1.8,5],HIGH_RISK:[0,0,17]},[3]:{CLASSIC:[0,1,3,10.7],LOW_RISK:[0,1.1,1.3,26.2],MEDIUM_RISK:[0,0,2.7,50.3],HIGH_RISK:[0,0,0,80.7]},[4]:{CLASSIC:[0,0.8,1.8,4.75,22.5],LOW_RISK:[0,0,2.2,7.65,90],MEDIUM_RISK:[0,0,1.7,9.8,100],HIGH_RISK:[0,0,0,9.75,259]},[5]:{CLASSIC:[0,0.2,1.4,4.25,16.4,36],LOW_RISK:[0,0,1.5,4.1,12.9,300],MEDIUM_RISK:[0,0,1.4,3.9,13.9,390],HIGH_RISK:[0,0,0,4.5,47,450]},[6]:{CLASSIC:[0,0,1,3.6,7,17,40],LOW_RISK:[0,0,1.1,2,5.8,100,700],MEDIUM_RISK:[0,0,0,3,8.6,180,710],HIGH_RISK:[0,0,0,0,10.6,350,710]},[7]:{CLASSIC:[0,0,0.5,3,4.1,13.7,31,60],LOW_RISK:[0,0,1.1,1.6,3.5,13.5,225,700],MEDIUM_RISK:[0,0,0,2,6.9,29.2,400,800],HIGH_RISK:[0,0,0,0,6.9,89.1,400,800]},[8]:{CLASSIC:[0,0,0,2.2,4,12.2,22,55,70],LOW_RISK:[0,0,1.1,1.5,2,4.8,38,100,800],MEDIUM_RISK:[0,0,0,2,4,10.4,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.8,270,600,900]},[9]:{CLASSIC:[0,0,0,1.5,3,8.1,15,45,60,85],LOW_RISK:[0,0,1.1,1.3,1.7,2.1,7.4,50,250,1000],MEDIUM_RISK:[0,0,0,2,2.5,4.6,15.2,100,500,1000],HIGH_RISK:[0,0,0,0,4,10.7,55.4,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.5,7.6,16,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.6,3.7,13,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.8,6.8,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.5,7.8,12.8,63,500,800,1000]}},kt={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.7,1.78],MEDIUM_RISK:[0.4,2.68],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,2,3.48],MEDIUM_RISK:[0,1.8,4.8],HIGH_RISK:[0,0,16.8]},[3]:{CLASSIC:[0,1,3,9.9],LOW_RISK:[0,1.1,1.2,26.5],MEDIUM_RISK:[0,0,2.65,50],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.7,5,23],LOW_RISK:[0,0,2.1,7.95,90],MEDIUM_RISK:[0,0,1.7,9.55,100],HIGH_RISK:[0,0,0,9.5,259]},[5]:{CLASSIC:[0,0.2,1.4,4.1,16.6,36],LOW_RISK:[0,0,1.5,4,12.7,300],MEDIUM_RISK:[0,0,1.4,3.8,13.7,390],HIGH_RISK:[0,0,0,4.4,46.9,450]},[6]:{CLASSIC:[0,0,1,3.6,6.6,16.5,40],LOW_RISK:[0,0,1.1,1.9,5.9,100,700],MEDIUM_RISK:[0,0,0,2.9,8.7,180,710],HIGH_RISK:[0,0,0,0,10.8,342,710]},[7]:{CLASSIC:[0,0,0.5,2.9,4.3,13.5,30.4,60],LOW_RISK:[0,0,1.1,1.6,3.1,14.8,225,700],MEDIUM_RISK:[0,0,0,2,6.7,29,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.2,3.8,12.7,21,54,70],LOW_RISK:[0,0,1.1,1.5,1.8,5.2,38,100,800],MEDIUM_RISK:[0,0,0,2,3.8,10.8,66,400,900],HIGH_RISK:[0,0,0,0,4.9,19.5,265,600,900]},[9]:{CLASSIC:[0,0,0,1.5,2.9,8.2,15,43,60,85],LOW_RISK:[0,0,1.1,1.3,1.6,2.1,7.7,49,250,1000],MEDIUM_RISK:[0,0,0,2,2.4,4.7,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.9,10.8,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.4,2.2,4.2,8,16.7,50,80,100],LOW_RISK:[0,0,1.1,1.2,1.3,1.5,2.9,12,50,250,1000],MEDIUM_RISK:[0,0,0,1.6,2,3.6,6.6,26,100,500,1000],HIGH_RISK:[0,0,0,0,3.4,7.9,12.9,62,500,800,1000]}},ro={[1]:{CLASSIC:[0,3.88],LOW_RISK:[0.68,1.84],MEDIUM_RISK:[0.38,2.74],HIGH_RISK:[0,3.88]},[2]:{CLASSIC:[0,1.85,4.48],LOW_RISK:[0,1.96,3.75],MEDIUM_RISK:[0,1.77,5],HIGH_RISK:[0,0,16.82]},[3]:{CLASSIC:[0,1,3.05,9.35],LOW_RISK:[0,1.07,1.37,25.7],MEDIUM_RISK:[0,0,2.74,49],HIGH_RISK:[0,0,0,79.9]},[4]:{CLASSIC:[0,0.8,1.72,4.95,22.3],LOW_RISK:[0,0,2.15,7.86,87],MEDIUM_RISK:[0,0,1.67,9.7,100],HIGH_RISK:[0,0,0,9.7,256]},[5]:{CLASSIC:[0,0.24,1.38,4,16.3,35.5],LOW_RISK:[0,0,1.48,4.1,12.43,300],MEDIUM_RISK:[0,0,1.35,3.96,13.8,389],HIGH_RISK:[0,0,0,4.4,47,444]},[6]:{CLASSIC:[0,0,1,3.57,6.8,16.2,37],LOW_RISK:[0,0,1.06,1.96,6.16,99,700],MEDIUM_RISK:[0,0,0,2.9,8.9,178,709],HIGH_RISK:[0,0,0,0,10.4,347,709]},[7]:{CLASSIC:[0,0,0.45,2.95,4.44,13.85,30,60],LOW_RISK:[0,0,1.07,1.57,3.47,14.57,225,700],MEDIUM_RISK:[0,0,0,1.95,6.8,29.8,400,800],HIGH_RISK:[0,0,0,0,6.8,88.2,400,800]},[8]:{CLASSIC:[0,0,0,2.15,3.9,12.9,21.9,55,70],LOW_RISK:[0,0,1.08,1.45,1.98,5.48,38.8,100,800],MEDIUM_RISK:[0,0,0,1.95,3.96,10.6,66.9,396,896],HIGH_RISK:[0,0,0,0,4.9,19.2,269,599,896]},[9]:{CLASSIC:[0,0,0,1.5,2.95,7.96,14.96,44,60,85],LOW_RISK:[0,0,1.05,1.29,1.69,2.49,7.49,49,250,1000],MEDIUM_RISK:[0,0,0,1.95,2.47,4.9,14.9,99,500,1000],HIGH_RISK:[0,0,0,0,3.96,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.37,2.2,4.45,7.7,16.7,50,80,100],LOW_RISK:[0,0,1.08,1.18,1.28,1.76,3.4,12.9,50,250,1000],MEDIUM_RISK:[0,0,0,1.57,1.95,3.96,6.9,25.5,100,500,1000],HIGH_RISK:[0,0,0,0,3.43,7.9,12.5,60,500,800,1000]}},to={[1]:{CLASSIC:[0,3.68],LOW_RISK:[0.7,1.58],MEDIUM_RISK:[0.4,2.48],HIGH_RISK:[0,3.68]},[2]:{CLASSIC:[0,1.72,4.48],LOW_RISK:[0,1.9,3.28],MEDIUM_RISK:[0,1.7,4.62],HIGH_RISK:[0,0,15.95]},[3]:{CLASSIC:[0,0.9,2.95,9.9],LOW_RISK:[0,1,1.2,26],MEDIUM_RISK:[0,0,2.29,50],HIGH_RISK:[0,0,0,75.7]},[4]:{CLASSIC:[0,0.8,1.6,4.4,21],LOW_RISK:[0,0,2,7.5,86],MEDIUM_RISK:[0,0,1.5,9.5,98],HIGH_RISK:[0,0,0,9,246]},[5]:{CLASSIC:[0,0.2,1.2,4.2,16.3,37],LOW_RISK:[0,0,1.4,3.8,12,300],MEDIUM_RISK:[0,0,1.3,3.5,14,385],HIGH_RISK:[0,0,0,4,45,450]},[6]:{CLASSIC:[0,0,1,3.3,6.2,15,40],LOW_RISK:[0,0,1.1,1.7,4.9,99,700],MEDIUM_RISK:[0,0,0,2.6,8.5,177,705],HIGH_RISK:[0,0,0,0,10,327,710]},[7]:{CLASSIC:[0,0,0.4,2.8,4.2,14.5,30,60],LOW_RISK:[0,0,1.1,1.4,3,14,210,700],MEDIUM_RISK:[0,0,0,1.8,6.4,29,400,800],HIGH_RISK:[0,0,0,0,6.1,85,400,800]},[8]:{CLASSIC:[0,0,0,2,3.7,13,20,50,70],LOW_RISK:[0,0,1.1,1.4,1.6,4.6,35,90,800],MEDIUM_RISK:[0,0,0,1.9,3.5,10.5,65,400,900],HIGH_RISK:[0,0,0,0,4.5,18,265,600,900]},[9]:{CLASSIC:[0,0,0,1.4,2.6,9,11.5,40,60,85],LOW_RISK:[0,0,1,1.3,1.5,2,7,45,250,1000],MEDIUM_RISK:[0,0,0,2,2.1,4,15,98,500,1000],HIGH_RISK:[0,0,0,0,3.5,10.5,55,500,800,1000]},[10]:{CLASSIC:[0,0,0,1.3,2,4.4,8,16.7,50,80,100],LOW_RISK:[0,0,1,1.2,1.25,1.4,2,10,50,250,1000],MEDIUM_RISK:[0,0,0,1.5,1.9,3.5,6.2,26,100,500,1000],HIGH_RISK:[0,0,0,0,3,8,14,57,500,800,1000]}},Qr=new y(new Map([[1,gt],[2,et],[3,kt],[4,ro],[8,to]]));class Eo extends S{constructor(){super("KENO")}determineGameResult({generator:r,edge:t,gameInputs:o}){v.againstEmptyArray(o.selectedNumbers,()=>O.createValidationError("No numbers selected")),v.against(o.selectedNumbers.length>10,()=>O.createValidationError("Maximum of 10 numbers can be selected"));for(let B of o.selectedNumbers)v.againstNonInteger(B,()=>O.createValidationError("Only integers can be selected")),v.against(B<0||B>39,()=>O.createValidationError("Invalid number selected"));let E=r.getUniqueRandomInts({min:0,max:39,count:10}),A=o.selectedNumbers.filter((B)=>E.values.includes(B)),f=o.selectedNumbers.length;if(!mr(f))throw new Error(`Invalid tile count: ${f}`);let C=Qr.getMultipliers(t)[f][o.riskLevel][A.length];if(C===void 0)throw new Error(`No multiplier found for matching tile count ${A.length}`);return{isFinished:!0,payoutMultiplier:new oo(C),outputs:{result:E.values},randomValues:E}}}import U from"big.js";var Ir=(r,t)=>{return r.gt(t)?r:t};var Xr=(r,t)=>{return r.lt(t)?r:t};class Ao extends S{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:t,gameInputs:o}){let E=r.getRandomInt({min:1,max:4294967295}),A=E.max,f=new U(16777216),c=new U(1),i=new U(1e6),x=E.value,C=new U(x-1).div(A),p=(100-t)/100,B=f.div(C.mul(f).plus(1)).mul(p),_=Ir(c,Xr(B,i));return{isFinished:!0,payoutMultiplier:_.gte(o.targetMultiplier)?new U(o.targetMultiplier):new U(0),outputs:{randomMultiplier:_,result:E.values},randomValues:E}}}import g from"big.js";var _r=(r,t)=>{if(t<0||r<0||t>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(t>r-t)t=r-t;let o=1;for(let E=1;E<=t;E++)o=o*(r-E+1)/E;return o};class fo extends S{constructor(){super("MINES")}determineGameResult({generator:r,edge:t,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 c=r.getUniqueRandomInts({min:1,max:25,count:o.minesCount}),i=c.values.some((j)=>o.selectedTiles.includes(j)),x=o.hasCashedOut||i,C=(100-t)/100,p=new g(_r(25-o.minesCount,o.selectedTiles.length)).div(new g(_r(25,o.selectedTiles.length))),_=o.hasCashedOut&&!i?new g(C).div(p):new g(0);return{isFinished:x,payoutMultiplier:_,outputs:{result:c.values},randomValues:c}}}import{Big as So}from"big.js";var jr;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(jr||={});var $A=[8,9,10,11,12,13,14,15,16],co={LOW_RISK:{8:[6,2.1,1.1,1,0.5,1,1.1,2.1,6],9:[6,2,1.6,1,0.7,0.7,1,1.6,2,6],10:[9,3,1.4,1.1,1,0.5,1,1.1,1.4,3,9],11:[8,3,1.9,1.3,1,0.7,0.7,1,1.3,1.9,3,8],12:[10,3,1.6,1.4,1.1,1,0.5,1,1.1,1.4,1.6,3,10],13:[8,4,3,1.9,1.2,0.9,0.7,0.7,0.9,1.2,1.9,3,4,8],14:[7,4,1.9,1.4,1.3,1.1,1,0.5,1,1.1,1.3,1.4,1.9,4,7],15:[15,8,3,2,1.5,1.1,1,0.7,0.7,1,1.1,1.5,2,3,8,15],16:[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:{8:[13,3,1.3,0.7,0.4,0.7,1.3,3,13],9:[18,4,1.7,0.9,0.5,0.5,0.9,1.7,4,18],10:[22,5,2,1.4,0.6,0.4,0.6,1.4,2,5,22],11:[24,6,3,1.8,0.7,0.5,0.5,0.7,1.8,3,6,24],12:[33,11,4,2,1.1,0.6,0.3,0.6,1.1,2,4,11,33],13:[43,13,6,3,1.3,0.7,0.4,0.4,0.7,1.3,3,6,13,43],14:[58,15,7,4,1.9,1,0.5,0.2,0.5,1,1.9,4,7,15,58],15:[88,18,11,5,3,1.3,0.5,0.3,0.3,0.5,1.3,3,5,11,18,88],16:[110,41.1,10,5,3,1.5,1,0.5,0.3,0.5,1,1.5,3,5,10,41.1,110]},HIGH_RISK:{8:[29,4,1.5,0.3,0.2,0.3,1.5,4,29],9:[43,7,2,0.6,0.2,0.2,0.6,2,7,43],10:[76,10,3,0.9,0.3,0.2,0.3,0.9,3,10,76],11:[120,13.9,5.2,1.4,0.4,0.2,0.2,0.4,1.4,5.2,13.9,120],12:[170,23.8,8.1,2,0.7,0.2,0.2,0.2,0.7,2,8.1,23.8,170],13:[260,36.7,11,4,1,0.2,0.2,0.2,0.2,1,4,11,36.7,260],14:[420,56.1,18,5,1.9,0.3,0.2,0.2,0.2,0.3,1.9,5,18,56.1,420],15:[620,82.8,27,8,3,0.5,0.2,0.2,0.2,0.2,0.5,3,8,27,82.8,620],16:[1000,129.9,26.1,9,4,2,0.2,0.2,0.2,0.2,0.2,2,4,9,26.1,129.9,1000]}},Oo={LOW_RISK:{8:[6,1.9,1.1,1,0.5,1,1.1,1.9,6],9:[6,1.7,1.6,1,0.7,0.7,1,1.6,1.7,6],10:[9,2.5,1.4,1.1,1,0.5,1,1.1,1.4,2.5,9],11:[9,2.5,1.8,1.3,1,0.7,0.7,1,1.3,1.8,2.5,9],12:[10,3.2,1.6,1.3,1.1,1,0.5,1,1.1,1.3,1.6,3.2,10],13:[8,3.7,2.9,1.8,1.2,0.9,0.7,0.7,0.9,1.2,1.8,2.9,3.7,8],14:[7,4,1.8,1.2,1.3,1.1,1,0.5,1,1.1,1.3,1.2,1.8,4,7],15:[15,7.6,2.8,2,1.4,1.1,1,0.7,0.7,1,1.1,1.4,2,2.8,7.6,15],16:[16,9,1.7,1.2,1.3,1.2,1.1,1,0.5,1,1.1,1.2,1.3,1.2,1.7,9,16]},MEDIUM_RISK:{8:[13,3.2,1.4,0.6,0.4,0.6,1.4,3.2,13],9:[18,3.7,1.7,0.9,0.5,0.5,0.9,1.7,3.7,18],10:[22,5,1.9,1.4,0.6,0.4,0.6,1.4,1.9,5,22],11:[24,6,2.8,1.8,0.7,0.5,0.5,0.7,1.8,2.8,6,24],12:[33,11.1,4,1.9,1.1,0.6,0.3,0.6,1.1,1.9,4,11.1,33],13:[43,13.7,6.1,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,6.1,13.7,43],14:[58,13.7,6.7,3.9,1.9,1,0.5,0.2,0.5,1,1.9,3.9,6.7,13.7,58],15:[88,17.7,10.8,5,2.9,1.3,0.5,0.3,0.3,0.5,1.3,2.9,5,10.8,17.7,88],16:[110,40.5,9.8,4.8,2.9,1.5,1,0.5,0.3,0.5,1,1.5,2.9,4.8,9.8,40.5,110]},HIGH_RISK:{8:[29,3.8,1.5,0.3,0.2,0.3,1.5,3.8,29],9:[43,7.1,1.9,0.6,0.2,0.2,0.6,1.9,7.1,43],10:[76,9.9,2.9,0.9,0.3,0.2,0.3,0.9,2.9,9.9,76],11:[120,13.4,5.1,1.4,0.4,0.2,0.2,0.4,1.4,5.1,13.4,120],12:[170,23.2,7.9,2,0.7,0.2,0.2,0.2,0.7,2,7.9,23.2,170],13:[260,36.6,10.5,4,1,0.2,0.2,0.2,0.2,1,4,10.5,36.6,260],14:[420,55.5,17.6,4.9,1.9,0.3,0.2,0.2,0.2,0.3,1.9,4.9,17.6,55.5,420],15:[620,82.3,26.8,7.7,3,0.5,0.2,0.2,0.2,0.2,0.5,3,7.7,26.8,82.3,620],16:[1000,129.8,25.2,8.6,4,2,0.2,0.2,0.2,0.2,0.2,2,4,8.6,25.2,129.8,1000]}},io={LOW_RISK:{8:[6,2.2,1.1,1,0.4,1,1.1,2.2,6],9:[6,1.8,1.5,1,0.7,0.7,1,1.5,1.8,6],10:[9,2.4,1.3,1.1,1,0.5,1,1.1,1.3,2.4,9],11:[8,2.7,1.9,1.2,1,0.7,0.7,1,1.2,1.9,2.7,8],12:[10,3.3,1.6,1.2,1.1,1,0.5,1,1.1,1.2,1.6,3.3,10],13:[8,3.8,2.9,1.9,1.1,0.9,0.7,0.7,0.9,1.1,1.9,2.9,3.8,8],14:[7,3.9,2,1.4,1.3,1.1,1,0.4,1,1.1,1.3,1.4,2,3.9,7],15:[15,7.9,2.5,2,1.3,1.1,1,0.7,0.7,1,1.1,1.3,2,2.5,7.9,15],16:[16,8.9,1.9,1.4,1.4,1.2,1.1,1,0.4,1,1.1,1.2,1.4,1.4,1.9,8.9,16]},MEDIUM_RISK:{8:[13,3.5,1.2,0.7,0.3,0.7,1.2,3.5,13],9:[18,3.8,1.6,0.9,0.5,0.5,0.9,1.6,3.8,18],10:[22,5.2,2,1.3,0.6,0.4,0.6,1.3,2,5.2,22],11:[24,5.6,2.7,1.8,0.7,0.5,0.5,0.7,1.8,2.7,5.6,24],12:[33,11.3,4,1.8,1.1,0.6,0.3,0.6,1.1,1.8,4,11.3,33],13:[43,12.9,5.7,2.8,1.3,0.7,0.4,0.4,0.7,1.3,2.8,5.7,12.9,43],14:[58,13.7,6.9,3.9,1.8,1,0.5,0.2,0.5,1,1.8,3.9,6.9,13.7,58],15:[88,18,10.9,4.9,2.8,1.3,0.5,0.3,0.3,0.5,1.3,2.8,4.9,10.9,18,88],16:[110,39.9,9.9,5,2.9,1.4,1,0.5,0.3,0.5,1,1.4,2.9,5,9.9,39.9,110]},HIGH_RISK:{8:[29,4,1.4,0.3,0.2,0.3,1.4,4,29],9:[43,7.3,2,0.5,0.2,0.2,0.5,2,7.3,43],10:[76,9.8,2.8,0.9,0.3,0.2,0.3,0.9,2.8,9.8,76],11:[120,13.5,4.9,1.4,0.4,0.2,0.2,0.4,1.4,4.9,13.5,120],12:[170,23.3,7.9,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.9,23.3,170],13:[260,36.2,10.4,3.9,1,0.2,0.2,0.2,0.2,1,3.9,10.4,36.2,260],14:[420,54.8,17.9,4.9,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.9,17.9,54.8,420],15:[620,81.9,26.6,7.7,2.9,0.5,0.2,0.2,0.2,0.2,0.5,2.9,7.7,26.6,81.9,620],16:[1000,130,24.9,8.4,3.9,2,0.2,0.2,0.2,0.2,0.2,2,3.9,8.4,24.9,130,1000]}},Bo={LOW_RISK:{8:[6,2,1.1,1,0.4,1,1.1,2,6],9:[6,1.9,1.4,1,0.7,0.7,1,1.4,1.9,6],10:[9,2.8,1.1,1.1,1,0.5,1,1.1,1.1,2.8,9],11:[8,2.7,1.7,1.2,1,0.7,0.7,1,1.2,1.7,2.7,8],12:[10,2.7,1.4,1.2,1.1,1,0.5,1,1.1,1.2,1.4,2.7,10],13:[8,3.5,2.8,1.9,1.3,0.9,0.6,0.6,0.9,1.3,1.9,2.8,3.5,8],14:[7,3.3,1.6,1.3,1.3,1.1,1,0.4,1,1.1,1.3,1.3,1.6,3.3,7],15:[15,8,2.9,2,1.4,1.2,1,0.6,0.6,1,1.2,1.4,2,2.9,8,15],16:[16,9.1,2.2,1.4,1.2,1.2,1.1,1,0.4,1,1.1,1.2,1.2,1.4,2.2,9.1,16]},MEDIUM_RISK:{8:[13,2.9,1.2,0.7,0.4,0.7,1.2,2.9,13],9:[18,3.5,1.6,0.9,0.5,0.5,0.9,1.6,3.5,18],10:[22,4.7,2,1.3,0.6,0.4,0.6,1.3,2,4.7,22],11:[24,5.7,2.5,1.8,0.7,0.5,0.5,0.7,1.8,2.5,5.7,24],12:[33,10.7,3.8,1.8,1.1,0.6,0.3,0.6,1.1,1.8,3.8,10.7,33],13:[43,12.6,5.6,2.7,1.3,0.7,0.4,0.4,0.7,1.3,2.7,5.6,12.6,43],14:[58,13.7,6.4,3.8,1.8,1,0.5,0.2,0.5,1,1.8,3.8,6.4,13.7,58],15:[88,17.7,10.7,4.9,2.7,1.3,0.5,0.3,0.3,0.5,1.3,2.7,4.9,10.7,17.7,88],16:[110,39.7,9.6,4.8,2.8,1.4,1,0.5,0.3,0.5,1,1.4,2.8,4.8,9.6,39.7,110]},HIGH_RISK:{8:[29,3.9,1.4,0.3,0.2,0.3,1.4,3.9,29],9:[43,6.9,1.8,0.6,0.2,0.2,0.6,1.8,6.9,43],10:[76,9.8,2.7,0.9,0.3,0.2,0.3,0.9,2.7,9.8,76],11:[120,13.1,5.1,1.3,0.4,0.2,0.2,0.4,1.3,5.1,13.1,120],12:[170,22.7,7.7,1.9,0.7,0.2,0.2,0.2,0.7,1.9,7.7,22.7,170],13:[260,35.9,10.3,3.8,1,0.2,0.2,0.2,0.2,1,3.8,10.3,35.9,260],14:[420,54.2,17.5,4.8,1.8,0.3,0.2,0.2,0.2,0.3,1.8,4.8,17.5,54.2,420],15:[620,80.6,26.1,7.8,2.8,0.5,0.2,0.2,0.2,0.2,0.5,2.8,7.8,26.1,80.6,620],16:[1000,129.7,24.7,8.2,3.8,2,0.2,0.2,0.2,0.2,0.2,2,3.8,8.2,24.7,129.7,1000]}},xo={LOW_RISK:{8:[5,1.8,1,1,0.4,1,1,1.8,5],9:[5,1.7,1.2,1,0.7,0.7,1,1.2,1.7,5],10:[9,2.8,1.2,1,1,0.4,1,1,1.2,2.8,9],11:[8,2.5,1.6,1,1,0.7,0.7,1,1,1.6,2.5,8],12:[10,2.5,1.3,1.3,1,1,0.4,1,1,1.3,1.3,2.5,10],13:[8,4.1,2.8,1.8,1.1,0.9,0.6,0.6,0.9,1.1,1.8,2.8,4.1,8],14:[7,3.3,1.7,1.2,1.2,1,1,0.4,1,1,1.2,1.2,1.7,3.3,7],15:[15,7.3,2.9,1.9,1.4,1,1,0.6,0.6,1,1,1.4,1.9,2.9,7.3,15],16:[16,8.7,2,1.5,1.3,1,1.1,1,0.3,1,1.1,1,1.3,1.5,2,8.7,16]},MEDIUM_RISK:{8:[13,2.6,1.1,0.7,0.4,0.7,1.1,2.6,13],9:[17,3.3,1.4,0.9,0.5,0.5,0.9,1.4,3.3,17],10:[21,4.1,1.7,1.3,0.6,0.4,0.6,1.3,1.7,4.1,21],11:[23,5.6,2.4,1.6,0.7,0.5,0.5,0.7,1.6,2.4,5.6,23],12:[32,10.2,3.7,1.7,1.1,0.6,0.2,0.6,1.1,1.7,3.7,10.2,32],13:[42,11.7,5.3,2.5,1.2,0.7,0.4,0.4,0.7,1.2,2.5,5.3,11.7,42],14:[56,13.2,5.9,3.6,1.6,1,0.5,0.2,0.5,1,1.6,3.6,5.9,13.2,56],15:[86,17.3,10,4.6,2.6,1.2,0.5,0.3,0.3,0.5,1.2,2.6,4.6,10,17.3,86],16:[107,39,9.9,4.5,2.4,1.3,1,0.5,0.3,0.5,1,1.3,2.4,4.5,9.9,39,107]},HIGH_RISK:{8:[28,3.3,1.4,0.3,0.2,0.3,1.4,3.3,28],9:[42,6.7,1.6,0.6,0.2,0.2,0.6,1.6,6.7,42],10:[74,9.6,2.6,0.9,0.3,0.1,0.3,0.9,2.6,9.6,74],11:[116,12.7,4.8,1.2,0.4,0.2,0.2,0.4,1.2,4.8,12.7,116],12:[165,20.9,7.2,1.8,0.7,0.2,0.2,0.2,0.7,1.8,7.2,20.9,165],13:[252,33.9,10.1,3.4,1,0.2,0.2,0.2,0.2,1,3.4,10.1,33.9,252],14:[407,51.9,16.3,4.6,1.7,0.3,0.2,0.2,0.2,0.3,1.7,4.6,16.3,51.9,407],15:[600,76.9,24.9,7.4,2.6,0.5,0.2,0.2,0.2,0.2,0.5,2.6,7.4,24.9,76.9,600],16:[1000,122,24.5,8,3.7,1.8,0.2,0.2,0.2,0.2,0.2,1.8,3.7,8,24.5,122,1000]}},Hr=new y(new Map([[1,co],[2,Oo],[3,io],[4,Bo],[8,xo]]));class po extends S{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(t.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(t.numberOfRows<8||t.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let E=t.numberOfRows,c=Hr.getMultipliers(o)[t.riskLevel][E],i=r.getRandomIntsWithReplacement({min:0,max:1,count:t.numberOfRows}),C=i.values.reduce((B,_)=>B+_,0),p=c[C];if(p===void 0)throw new Error(`No payout found for end position ${C}`);return{isFinished:!0,payoutMultiplier:So(p),outputs:{result:i.values},randomValues:i}}}import{Big as rr}from"big.js";var Tr=[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],nr=[37,...Tr],Wr=[[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]],sr=[[0,1],[0,37],[3,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]],lr=[[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]],Lr=[[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]],Kr=[[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]],vr=[[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]],gr=[0,1,2,3,37],er=[[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]],kr=[[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]],V;((o)=>{o.EVEN="EVEN";o.ODD="ODD"})(V||={});var w;((o)=>{o.RED="RED";o.BLACK="BLACK"})(w||={});var M;((o)=>{o.LOW="LOW";o.HIGH="HIGH"})(M||={});var a;((E)=>{E.TOP="TOP";E.MIDDLE="MIDDLE";E.BOTTOM="BOTTOM"})(a||={});var P;((E)=>{E.FIRST="FIRST";E.SECOND="SECOND";E.THIRD="THIRD"})(P||={});var yr;((o)=>{o.AMERICAN="AMERICAN";o.EUROPEAN="EUROPEAN"})(yr||={});var e=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw O.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&m(t.value)))throw O.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&Co(t.values)))throw O.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&Zo(t.values)))throw O.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&Do(t.values)))throw O.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&No(t.values)))throw O.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(V).includes(t.parity)))throw O.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(w).includes(t.color)))throw O.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(M).includes(t.half)))throw O.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(a).includes(t.column)))throw O.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.dozen)))throw O.createValidationError("Invalid dozen bet.")},m=(r)=>{return Tr.includes(r)},Co=(r)=>{if(r.length!==2)return!1;if(!r.every(m))return!1;return Wr.some(([t,o])=>t===r[0]&&o===r[1])},Zo=(r)=>{if(r.length!==3)return!1;if(!r.every(m))return!1;return lr.some(([t,o,E])=>t===r[0]&&o===r[1]&&E===r[2])},Do=(r)=>{if(r.length!==4)return!1;if(!r.every(m))return!1;return Kr.some(([t,o,E,A])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3])},No=(r)=>{if(r.length!==6)return!1;if(!r.every(m))return!1;return er.some(([t,o,E,A,f,c])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3]&&f===r[4]&&c===r[5])};var k=(r)=>{if(r.straightBets.length===0&&r.splitBets.length===0&&r.streetBets.length===0&&r.cornerBets.length===0&&r.basketBets.length===0&&r.doubleStreetBets.length===0&&r.parityBets.length===0&&r.colorBets.length===0&&r.halfBets.length===0&&r.columnBets.length===0&&r.dozenBets.length===0)throw O.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((t)=>t.amount.gte(0)&&Q(t.value)))throw O.createValidationError("Invalid straight bet.");if(!r.splitBets.every((t)=>t.amount.gte(0)&&_o(t.values)))throw O.createValidationError("Invalid split bet.");if(!r.streetBets.every((t)=>t.amount.gte(0)&&To(t.values)))throw O.createValidationError("Invalid street bet.");if(!r.cornerBets.every((t)=>t.amount.gte(0)&&yo(t.values)))throw O.createValidationError("Invalid corner bet.");if(!r.basketBets.every((t)=>t.amount.gte(0)))throw O.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((t)=>t.amount.gte(0)&&Go(t.values)))throw O.createValidationError("Invalid double street bet.");if(!r.parityBets.every((t)=>t.amount.gte(0)&&Object.values(V).includes(t.parity)))throw O.createValidationError("Invalid parity bet.");if(!r.colorBets.every((t)=>t.amount.gte(0)&&Object.values(w).includes(t.color)))throw O.createValidationError("Invalid color bet.");if(!r.halfBets.every((t)=>t.amount.gte(0)&&Object.values(M).includes(t.half)))throw O.createValidationError("Invalid half bet.");if(!r.columnBets.every((t)=>t.amount.gte(0)&&Object.values(a).includes(t.column)))throw O.createValidationError("Invalid column bet.");if(!r.dozenBets.every((t)=>t.amount.gte(0)&&Object.values(P).includes(t.dozen)))throw O.createValidationError("Invalid dozen bet.")},Q=(r)=>{return nr.includes(r)};function _o(r){if(r.length!==2)return!1;if(!r.every(Q))return!1;return sr.some(([t,o])=>t===r[0]&&o===r[1])}var To=(r)=>{if(r.length!==3)return!1;if(!r.every(Q))return!1;return Lr.some(([t,o,E])=>t===r[0]&&o===r[1]&&E===r[2])},yo=(r)=>{if(r.length!==4)return!1;if(!r.every(Q))return!1;return vr.some(([t,o,E,A])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3])},Go=(r)=>{if(r.length!==6)return!1;if(!r.every(Q))return!1;return kr.some(([t,o,E,A,f,c])=>t===r[0]&&o===r[1]&&E===r[2]&&A===r[3]&&f===r[4]&&c===r[5])};var ho={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},uo=[3,6,9,12,15,18,21,24,27,30,33,36],bo=[2,5,8,11,14,17,20,23,26,29,32,35],Uo=[1,4,7,10,13,16,19,22,25,28,31,34],Vo=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],wo=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],Mo=2.7,ao=5.3;class Gr extends S{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:t}){this.validateInputs(t);let o=r.getRandomInt({min:0,max:this.maxNumber}),E=o.value,A=this.determineBetOutcomes(t,E),{payoutMultiplier:f}=this.getPayoutDetails(t,E);return{outputs:{betOutcomes:A,result:o.values},payoutMultiplier:f,isFinished:!0,randomValues:o}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,t){let o=this.determineBetOutcomes(r,t),E=this.getBetTotals(r),A=this.getBetTotals(o.winningBets),f=this.calculateTotalBetAmount(E),c=this.calculateTotalPayout(A);return{payoutMultiplier:f.gt(0)?c.div(f):new rr(0),payoutAmount:c}}determineBetOutcomes(r,t){let o={},E={};for(let A of Object.keys(r)){let f=r[A],c=this.betPredicates[A],{winning:i,losing:x}=this.partitionBets(f,c,t);o[A]=i,E[A]=x}return{winningBets:o,losingBets:E}}calculateTotalAmount(r){return r.reduce((t,o)=>t.plus(o.amount),new rr(0))}isWinningStraightBet(r,t){return r.value===t}isWinningSplitBet(r,t){return r.values.some((o)=>o===t)}isWinningStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningCornerBet(r,t){return r.values.some((o)=>o===t)}isWinningDoubleStreetBet(r,t){return r.values.some((o)=>o===t)}isWinningColorBet(r,t){let o=r;return Vo.includes(t)&&o.color==="RED"||wo.includes(t)&&o.color==="BLACK"}isWinningHalfBet(r,t){let o=r;if(t>0&&t<=18&&o.half==="LOW")return!0;if(t>18&&t<=36&&o.half==="HIGH")return!0;return!1}isWinningColumnBet(r,t){let o=r;return uo.includes(t)&&o.column==="TOP"||bo.includes(t)&&o.column==="MIDDLE"||Uo.includes(t)&&o.column==="BOTTOM"}isWinningDozenBet(r,t){let o=r;if(t>0&&t<=12&&o.dozen==="FIRST")return!0;if(t>12&&t<=24&&o.dozen==="SECOND")return!0;if(t>24&&t<=36&&o.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,t){let o=r;if(t===0||t===37)return!1;let E=t%2===0?"EVEN":"ODD";return o.parity===E}getBetTotals(r){let t={};for(let o of Object.keys(r))t[o]=this.calculateTotalAmount(r[o]);return t}calculateTotalBetAmount(r){return Object.values(r).reduce((t,o)=>t.plus(o),new rr(0))}partitionBets(r,t,o){return{winning:r.filter((E)=>t(E,o)),losing:r.filter((E)=>!t(E,o))}}calculateTotalPayout(r){return Object.entries(r).reduce((t,[o,E])=>{let f=ho[o];return t.plus(E.mul(f||0))},new rr(0))}}class rt extends Gr{maxNumber=36;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){e(r)}}class tt extends Gr{maxNumber=37;betPredicates={straightBets:this.isWinningStraightBet,splitBets:this.isWinningSplitBet,streetBets:this.isWinningStreetBet,cornerBets:this.isWinningCornerBet,basketBets:this.isWinningBasketBet,doubleStreetBets:this.isWinningDoubleStreetBet,parityBets:this.isWinningParityBet,colorBets:this.isWinningColorBet,halfBets:this.isWinningHalfBet,columnBets:this.isWinningColumnBet,dozenBets:this.isWinningDozenBet};validateInputs(r){k(r)}isWinningBasketBet(r,t){return gr.some((o)=>o===t)}}class ot extends S{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new rt,this.americanGame=new tt}getBetAmount(r){switch(r.type){case"AMERICAN":return this.americanGame.getBetAmount(r.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(r.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(r){let{gameInputs:t,...o}=r;if(r.edge===Mo&&t.type==="EUROPEAN"){let E=this.europeanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"european",betOutcomes:A,result:E.outputs.result}}}if(r.edge===ao&&t.type==="AMERICAN"){let E=this.americanGame.determineGameResult({...o,gameInputs:t.inputs}),{betOutcomes:A}=E.outputs;return{...E,outputs:{type:"american",betOutcomes:A,result:E.outputs.result}}}throw O.createValidationError(`Attempted to play ${t.type} roulette on edge ${r.edge}`)}}var E1=(r)=>{return new ot().getBetAmount(r)};var i1=(r)=>{if(r.type==="EUROPEAN")e(r.inputs);else k(r.inputs)};import{Big as zo}from"big.js";var I;((E)=>{E.LOW_RISK="LOW_RISK";E.MEDIUM_RISK="MEDIUM_RISK";E.HIGH_RISK="HIGH_RISK"})(I||={});var X;((f)=>{f[f.TEN=10]="TEN";f[f.TWENTY=20]="TWENTY";f[f.THIRTY=30]="THIRTY";f[f.FORTY=40]="FORTY";f[f.FIFTY=50]="FIFTY"})(X||={});var Po={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.5},20:{ZERO:0,A:1.2,B:1.5},30:{ZERO:0,A:1.2,B:1.5},40:{ZERO:0,A:1.2,B:1.5},50:{ZERO:0,A:1.2,B:1.5}},MEDIUM_RISK:{10:{ZERO:0,A:1.5,B:1.9,C:2,D:3},20:{ZERO:0,A:1.5,B:1.8,C:2,D:3},30:{ZERO:0,A:1.5,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:3},50:{ZERO:0,A:1.5,B:2,C:3,D:5}},HIGH_RISK:{10:{ZERO:0,A:9.9},20:{ZERO:0,A:19.8},30:{ZERO:0,A:29.7},40:{ZERO:0,A:39.6},50:{ZERO:0,A:49.5}}},Ro={LOW_RISK:{10:{ZERO:0,A:1.2,B:1.4},20:{ZERO:0,A:1.2,B:1.4},30:{ZERO:0,A:1.2,B:1.4},40:{ZERO:0,A:1.2,B:1.4},50:{ZERO:0,A:1.2,B:1.4}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3.1},20:{ZERO:0,A:1.5,B:1.8,C:1.9,D:3.4},30:{ZERO:0,A:1.5,B:1.7,C:1.9,D:3,E:4.3},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.9},50:{ZERO:0,A:1.5,B:2,C:3,D:4.5}},HIGH_RISK:{10:{ZERO:0,A:9.8},20:{ZERO:0,A:19.6},30:{ZERO:0,A:29.4},40:{ZERO:0,A:39.2},50:{ZERO:0,A:49}}},Yo={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.65},20:{ZERO:0,A:1.15,B:1.65},30:{ZERO:0,A:1.15,B:1.65},40:{ZERO:0,A:1.15,B:1.65},50:{ZERO:0,A:1.15,B:1.65}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.9,C:2,D:3},20:{ZERO:0,A:1.4,B:1.6,C:2,D:3},30:{ZERO:0,A:1.4,B:1.7,C:2,D:3,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.8},50:{ZERO:0,A:1.5,B:2,C:2.7,D:4.9}},HIGH_RISK:{10:{ZERO:0,A:9.7},20:{ZERO:0,A:19.4},30:{ZERO:0,A:29.1},40:{ZERO:0,A:38.8},50:{ZERO:0,A:48.5}}},Fo={LOW_RISK:{10:{ZERO:0,A:1.15,B:1.55},20:{ZERO:0,A:1.15,B:1.55},30:{ZERO:0,A:1.15,B:1.55},40:{ZERO:0,A:1.15,B:1.55},50:{ZERO:0,A:1.15,B:1.55}},MEDIUM_RISK:{10:{ZERO:0,A:1.4,B:1.8,C:2,D:3},20:{ZERO:0,A:1.3,B:1.5,C:2,D:3},30:{ZERO:0,A:1.4,B:1.6,C:2,D:2.9,E:4},40:{ZERO:0,A:1.5,B:1.6,C:2,D:2.7},50:{ZERO:0,A:1.5,B:2,C:2.6,D:4.8}},HIGH_RISK:{10:{ZERO:0,A:9.6},20:{ZERO:0,A:19.2},30:{ZERO:0,A:28.8},40:{ZERO:0,A:38.4},50:{ZERO:0,A:48}}},$o={LOW_RISK:{10:{ZERO:0,A:1.1,B:1.5},20:{ZERO:0,A:1.1,B:1.5},30:{ZERO:0,A:1.1,B:1.45},40:{ZERO:0,A:1.1,B:1.45},50:{ZERO:0,A:1.1,B:1.45}},MEDIUM_RISK:{10:{ZERO:0,A:1.3,B:1.7,C:1.9,D:3},20:{ZERO:0,A:1.3,B:1.4,C:1.9,D:3},30:{ZERO:0,A:1.3,B:1.7,C:1.9,D:2.8,E:3.8},40:{ZERO:0,A:1.4,B:1.8,C:1.9,D:2.6},50:{ZERO:0,A:1.4,B:1.9,C:2.6,D:4.6}},HIGH_RISK:{10:{ZERO:0,A:9.2},20:{ZERO:0,A:18.4},30:{ZERO:0,A:27.6},40:{ZERO:0,A:36.8},50:{ZERO:0,A:46}}},Et=new y(new Map([[1,Po],[2,Ro],[3,Yo],[4,Fo],[8,$o]]));var At={LOW_RISK:{10:["B","A","A","A","ZERO","A","A","A","A","ZERO"],20:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],30:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],40:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"],50:["B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO","B","A","A","A","ZERO","A","A","A","A","ZERO"]},MEDIUM_RISK:{10:["ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","D"],20:["A","ZERO","C","ZERO","B","ZERO","C","ZERO","C","ZERO","A","ZERO","C","ZERO","C","ZERO","D","ZERO","C","ZERO"],30:["A","ZERO","C","ZERO","A","ZERO","C","ZERO","D","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","C","ZERO","E","ZERO","A","ZERO","C","ZERO"],40:["C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO","C","ZERO","A","ZERO","D","ZERO","C","ZERO","A","ZERO"],50:["A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","C","ZERO","A","ZERO","B","ZERO","A","ZERO","B","ZERO","A","ZERO","D","ZERO","A","ZERO","B","ZERO","A","ZERO"]},HIGH_RISK:{10:[...Array(9).fill("ZERO"),"A"],20:[...Array(19).fill("ZERO"),"A"],30:[...Array(29).fill("ZERO"),"A"],40:[...Array(39).fill("ZERO"),"A"],50:[...Array(49).fill("ZERO"),"A"]}};class Jo extends S{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:t,edge:o}){if(!Object.values(X).includes(t.segments))throw new Error("Invalid segments value");if(!Object.values(I).includes(t.riskLevel))throw new Error("Invalid risk level");let A=Et.getMultipliers(o)[t.riskLevel];if(A===void 0)throw new Error(`No multipliers found for risk level ${t.riskLevel}`);let f=A[t.segments];if(f===void 0)throw new Error(`No multipliers found for segment ${t.segments}`);let c=At[t.riskLevel];if(c===void 0)throw new Error(`No patterns found for risk level ${t.riskLevel}`);let i=c[t.segments];if(i===void 0)throw new Error(`No patterns found for segment ${t.segments}`);let x=r.getRandomInt({min:0,max:i.length-1}),C=i[x.value];if(C===void 0)throw new Error(`No pattern found for segment ${t.segments} and value ${x.value}`);let p=f[C];if(p===void 0)throw new Error(`No payout found for picked segment ${C}`);return{isFinished:!0,payoutMultiplier:new zo(p),outputs:{result:x.values},randomValues:x}}}export{i1 as validateRouletteGameInputs,Lo as validateAdvancedDiceInputs,gt as rtp99Multipliers,et as rtp98Multipliers,kt as rtp97Multipliers,ro as rtp96Multipliers,to as rtp92Multipliers,Hr as plinkoMultipliers,_r as nCr,Qr as kenoMultipliers,mr as isTileCount,Lt as hasDiceWon,Ht as diamondsMultipliers,E1 as calculateRouletteBetAmount,lt as calculateDiceWinChance,Gt as calculateBaccaratBetAmount,br as calculateAdvancedDiceWinChance,Xr as bigMin,Ir as bigMax,pt as advancedDiceIsWithinBoundsInclusive,or as advancedDiceIsWithinBoundsExclusive,Ct as advancedDiceGetInclusiveBoundsRange,Er as advancedDiceGetExclusiveBoundsRange,X as WheelSegments,I as WheelRiskLevel,Jo as Wheel,bt as WIN_MULTIPLIER,Dt as VALID_SUITS,Nt as VALID_RANKS,lr as VALID_EUROPEAN_STREETS,Tr as VALID_EUROPEAN_STRAIGHTS,Wr as VALID_EUROPEAN_SPLITS,er as VALID_EUROPEAN_DOUBLE_STREETS,Kr as VALID_EUROPEAN_CORNERS,Lr as VALID_AMERICAN_STREETS,nr as VALID_AMERICAN_STRAIGHTS,sr as VALID_AMERICAN_SPLITS,kr as VALID_AMERICAN_DOUBLE_STREETS,vr as VALID_AMERICAN_CORNERS,uo as TOP_COLUMN,vt as TILE_COUNTS,yr as RouletteType,ot as Roulette,dt as RollType,K as RandomValuePool,Vo as RED_NUMBERS,Ar as RANDOM_MIN_VALUE,fr as RANDOM_MAX_VALUE,jr as PlinkoRiskLevel,po as Plinko,V as Parity,Ut as PUSH_MULTIPLIER,$A as PLINKO_ROW_COUNTS,ho as PAYOUT_MULTIPLIERS,N as OrigamiGame,h as MultiplierCalculator,fo as Mines,Ot as MIN_WIN_CHANCE,bo as MIDDLE_COLUMN,it as MAX_WIN_CHANCE,xr as MAX_CARDS_PER_ROUND,Ao as Limbo,Vt as LOSE_MULTIPLIER,qr as KenoRiskLevel,Eo as Keno,Or as InsuranceOutcome,Vr as INSURANCE_WIN_PAYOUT,Y as INSURANCE_BET_SIZE_FACTOR,tE as INSURANCE_BET_MULTIPLIER,M as Half,ct as GameErrorCode,O as GameError,S as Game,wr as FACE_CARD_VALUE,rt as EuropeanRoulette,Mo as EUROPEAN_HOUSE_EDGE,hr as EFFECTIVE_RANGE,P as Dozen,st as DiceDirection,Kt as Dice,qt as DiamondsResultType,Wt as Diamonds,Sr as DOUBLE_DOWN_BET_SIZE_FACTOR,zr as DICE_EFFECTIVE_RANGE,Ur as DEALER_STAND_VALUE,a as Column,w as Color,oE as CARDS_PER_SUIT,cr as BlackjackOutcome,ir as BlackjackActionType,zt as Blackjack,_t as BaccaratOutcome,Tt as BaccaratBetType,ht as Baccarat,Br as BUST_VALUE,Uo as BOTTOM_COLUMN,wo as BLACK_NUMBERS,W as BLACKJACK_VALUE,ut as BLACKJACK_MULTIPLIER,Mr as BASE_PAYOUT_MULTIPLIERS,tt as AmericanRoulette,Zt as AdvancedDice,ao as AMERICAN_HOUSE_EDGE,gr as AMERICAN_BASKET,pr as ACE_SOFT_BONUS};
|