@betorigami/game-calculations 4.4.5 → 5.0.0
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 +87 -33
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var G1=Object.create;var{getPrototypeOf:T1,defineProperty:H,getOwnPropertyNames:tE,getOwnPropertyDescriptor:M1}=Object,fE=Object.prototype.hasOwnProperty;var u=(r,E,A)=>{A=r!=null?G1(T1(r)):{};let t=E||!r||!r.__esModule?H(A,"default",{value:r,enumerable:!0}):A;for(let f of tE(r))if(!fE.call(t,f))H(t,f,{get:()=>r[f],enumerable:!0});return t},AE=new WeakMap,b1=(r)=>{var E=AE.get(r),A;if(E)return E;if(E=H({},"__esModule",{value:!0}),r&&typeof r==="object"||typeof r==="function")tE(r).map((t)=>!fE.call(E,t)&&H(E,t,{get:()=>r[t],enumerable:!(A=M1(r,t))||A.enumerable}));return AE.set(r,E),E};var w1=(r,E)=>{for(var A in E)H(r,A,{get:E[A],enumerable:!0,configurable:!0,set:(t)=>E[A]=()=>t})};var f2={};w1(f2,{validateRouletteGameInputs:()=>n1,validateAdvancedDiceInputs:()=>y1,rtp99Multipliers:()=>gE,rtp98Multipliers:()=>lE,rtp97Multipliers:()=>kE,rtp96Multipliers:()=>sE,rtp92Multipliers:()=>aE,plinkoMultipliers:()=>mr,nCr:()=>Gr,kenoMultipliers:()=>Xr,isTileCount:()=>Qr,hasDiceWon:()=>LE,diamondsMultipliers:()=>iE,calculateRouletteBetAmount:()=>a1,calculateDiceWinChance:()=>WE,calculateBaccaratBetAmount:()=>UE,calculateAdvancedDiceWinChance:()=>Vr,bigMin:()=>jr,bigMax:()=>dr,advancedDiceIsWithinBoundsInclusive:()=>BE,advancedDiceIsWithinBoundsExclusive:()=>fr,advancedDiceGetInclusiveBoundsRange:()=>cE,advancedDiceGetExclusiveBoundsRange:()=>Or,WheelSegments:()=>i,WheelRiskLevel:()=>j,Wheel:()=>C1,WIN_MULTIPLIER:()=>ME,VALID_SUITS:()=>SE,VALID_RANKS:()=>NE,VALID_EUROPEAN_STREETS:()=>Kr,VALID_EUROPEAN_STRAIGHTS:()=>Tr,VALID_EUROPEAN_SPLITS:()=>Wr,VALID_EUROPEAN_DOUBLE_STREETS:()=>sr,VALID_EUROPEAN_CORNERS:()=>gr,VALID_AMERICAN_STREETS:()=>vr,VALID_AMERICAN_STRAIGHTS:()=>Hr,VALID_AMERICAN_SPLITS:()=>Lr,VALID_AMERICAN_DOUBLE_STREETS:()=>ar,VALID_AMERICAN_CORNERS:()=>lr,TOP_COLUMN:()=>O1,TILE_COUNTS:()=>vE,SPLIT_BET_SIZE_FACTOR:()=>d,RouletteType:()=>Mr,Roulette:()=>EE,RollType:()=>DE,RandomValuePool:()=>l,RED_NUMBERS:()=>B1,RANDOM_MIN_VALUE:()=>or,RANDOM_MAX_VALUE:()=>xr,PlinkoRiskLevel:()=>ir,Plinko:()=>t1,Parity:()=>J,PUSH_MULTIPLIER:()=>bE,PLINKO_ROW_COUNTS:()=>X1,PAYOUT_MULTIPLIERS:()=>f1,OrigamiGame:()=>T,MultiplierCalculator:()=>Y,Mines:()=>E1,MIN_WIN_CHANCE:()=>oE,MIDDLE_COLUMN:()=>o1,MAX_WIN_CHANCE:()=>xE,MAX_CARDS_PER_ROUND:()=>Sr,Limbo:()=>r1,LOSE_MULTIPLIER:()=>wE,KenoRiskLevel:()=>Ir,Keno:()=>eE,InsuranceOutcome:()=>cr,INSURANCE_WIN_PAYOUT:()=>Yr,INSURANCE_BET_SIZE_FACTOR:()=>X,INSURANCE_BET_MULTIPLIER:()=>z1,Half:()=>q,GameErrorCode:()=>OE,GameError:()=>B,Game:()=>S,FACE_CARD_VALUE:()=>zr,EuropeanRoulette:()=>er,EUROPEAN_HOUSE_EDGE:()=>D1,EFFECTIVE_RANGE:()=>hr,Dozen:()=>Q,DiceDirection:()=>HE,Dice:()=>KE,DiamondsResultType:()=>jE,Diamonds:()=>mE,DOUBLE_DOWN_BET_SIZE_FACTOR:()=>z,DICE_EFFECTIVE_RANGE:()=>Rr,DEALER_STAND_VALUE:()=>yr,Column:()=>I,Color:()=>R,CARDS_PER_SUIT:()=>$1,BlackjackOutcome:()=>Br,BlackjackActionType:()=>Dr,Blackjack:()=>XE,BaccaratOutcome:()=>_E,BaccaratBetType:()=>CE,Baccarat:()=>GE,BUST_VALUE:()=>Zr,BOTTOM_COLUMN:()=>x1,BLACK_NUMBERS:()=>c1,BLACKJACK_VALUE:()=>M,BLACKJACK_MULTIPLIER:()=>TE,BASE_PAYOUT_MULTIPLIERS:()=>W,AmericanRoulette:()=>rE,AdvancedDice:()=>ZE,AMERICAN_HOUSE_EDGE:()=>Z1,AMERICAN_BASKET:()=>kr,ACE_SOFT_BONUS:()=>Nr});module.exports=b1(f2);var OE;((E)=>E.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(OE||={});class B extends Error{static createValidationError(r){return new B("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof B}errorCode;constructor(r,E){super(E);this.errorCode=r}}var T;((D)=>{D.DICE="DICE";D.MINES="MINES";D.KENO="KENO";D.LIMBO="LIMBO";D.ADVANCED_DICE="ADVANCED_DICE";D.BACCARAT="BACCARAT";D.DIAMONDS="DIAMONDS";D.PLINKO="PLINKO";D.ROULETTE="ROULETTE";D.WHEEL="WHEEL";D.BLACKJACK="BLACKJACK"})(T||={});class S{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}var ur=require("big.js");var Ar=u(require("big.js"));class Y{static withMultiplier(r,E){return new Ar.default(r).times(new Ar.default(100-E).div(100))}static withWinChance(r,E){return Ar.default(100-r).div(E)}}var or=0,xr=1e4,hr=10001,oE=0.01,xE=98,h1=(r)=>{if(r<or)throw B.createValidationError(`Lower bound ${r} is below minimum allowed value ${or}`)},u1=(r)=>{if(r>xr)throw B.createValidationError(`Upper bound ${r} is above maximum allowed value ${xr}`)},tr=(r)=>{if(h1(r.lower),u1(r.upper),r.lower>=r.upper)throw B.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},V1=(r,E)=>{let[A,t]=r.lower<=E.lower?[r,E]:[E,r];if(A.upper>t.lower)throw B.createValidationError("Bounds must not overlap")},BE=(r,E)=>E>=r.lower&&E<=r.upper,cE=(r)=>r.upper-r.lower+1,fr=(r,E)=>E>r.lower&&E<r.upper,Or=(r)=>r.upper-r.lower-1,DE;((t)=>{t.ROLL_BETWEEN="ROLL_BETWEEN";t.ROLL_OUTSIDE="ROLL_OUTSIDE";t.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(DE||={});var Vr=(r)=>{let A=(()=>{switch(r.mode){case"ROLL_BETWEEN":return tr(r.bounds),Or(r.bounds);case"ROLL_OUTSIDE":return tr(r.bounds),hr-cE(r.bounds);case"ROLL_BETWEEN_TWO":return tr(r.firstBounds),tr(r.secondBounds),V1(r.firstBounds,r.secondBounds),Or(r.firstBounds)+Or(r.secondBounds)}})(),t=ur.Big(A).div(hr).mul(100);if(t.lt(oE))throw B.createValidationError("Win chance too low");if(t.gt(xE))throw B.createValidationError("Win chance too high");return t},y1=(r)=>{Vr(r)};class ZE extends S{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:E,gameInputs:A}){let t=Vr(A),f=r.getRandomInt({min:or,max:xr}),O=f.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(A.mode){case"ROLL_BETWEEN":return fr(A.bounds,O);case"ROLL_OUTSIDE":return!BE(A.bounds,O);case"ROLL_BETWEEN_TWO":return fr(A.firstBounds,O)||fr(A.secondBounds,O)}})()?Y.withWinChance(E,t):new ur.Big(0),outputs:{result:f.values},randomValues:f}}}var p=u(require("big.js"));var SE=["Clubs","Diamonds","Hearts","Spades"],NE=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],_E;((t)=>{t.PLAYER_WIN="PLAYER_WIN";t.TIE="TIE";t.BANKER_WIN="BANKER_WIN"})(_E||={});var CE;((t)=>{t.PLAYER="PLAYER";t.TIE="TIE";t.BANKER="BANKER"})(CE||={});var Y1={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},UE=(r)=>{return new p.default(0).add(r.bets.reduce((A,t)=>A.add(t.amount),new p.default(0)))};class GE extends S{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:E,edge:A}){if(A!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(E);let t=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),f=t.values,O=f.slice(0,3),o=f.slice(3,6),x=[],c=0;for(let C of O.slice(0,2)){let h=this.mapRandomValueToCard(C),Er=this.mapRandomValueToCardValue(C);x.push(h),c=(c+Er)%10}let Z=[],N=0;for(let C of o.slice(0,2)){let h=this.mapRandomValueToCard(C),Er=this.mapRandomValueToCardValue(C);Z.push(h),N=(N+Er)%10}if(!this.isNaturalWin(c,N)){let C=this.shouldDrawThirdPlayerCard(c),h=null;if(C)h=this.mapRandomValueToCardValue(O[2]),x.push(this.mapRandomValueToCard(O[2])),c=(c+h)%10;if(this.shouldDrawThirdBankerCard(N,h))Z.push(this.mapRandomValueToCard(o[2])),N=(N+this.mapRandomValueToCardValue(o[2]))%10}let D;if(c===N)D="TIE";else D=c>N?"PLAYER_WIN":"BANKER_WIN";let w=UE(E),{betType:rr,multiplier:U1}=Y1[D],m=new p.default(0);if(m=m.add(E.bets.filter((C)=>C.type===rr).reduce((C,h)=>C.add(h.amount.mul(U1)),new p.default(0))),D==="TIE")m=m.add(E.bets.filter((C)=>C.type==="PLAYER"||C.type==="BANKER").reduce((C,h)=>C.add(h.amount),new p.default(0)));return{isFinished:!0,payoutMultiplier:w.gt(0)?m.div(w):new p.default(0),outputs:{playerCards:x,playerHandValue:c,bankerCards:Z,bankerHandValue:N,gameOutcome:D,result:t.values},randomValues:t}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((E)=>E.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let E=SE[Math.floor(r/13)],A=NE[r%13];return{suit:E,rank:A}}isNaturalWin(r,E){let A=[8,9];return A.includes(r)||A.includes(E)}mapRandomValueToCardValue(r){let E=r%13;if(E===0)return 1;if(E>=10)return 10;return E+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,E){if(E===null)return r<=5;if(r<=2)return!0;if(r===3)return E!==8;if(r===4)return[2,3,4,5,6,7].includes(E);if(r===5)return[4,5,6,7].includes(E);if(r===6)return[6,7].includes(E);return!1}}var Br;((f)=>{f.WIN="WIN";f.LOSE="LOSE";f.PUSH="PUSH";f.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(Br||={});var cr;((A)=>{A.WON="WON";A.LOST="LOST"})(cr||={});var Dr;((x)=>{x.START="START";x.HIT="BLACKJACK_HIT";x.STAND="BLACKJACK_STAND";x.BUY_INSURANCE="BLACKJACK_BUY_INSURANCE";x.REJECT_INSURANCE="BLACKJACK_REJECT_INSURANCE";x.DOUBLE_DOWN="BLACKJACK_DOUBLE_DOWN";x.SPLIT="BLACKJACK_SPLIT"})(Dr||={});var TE=2.5,ME=2,bE=1,wE=0,yr=17,Zr=21,M=21,Sr=63,z1=1.5,X=0.5,Yr=1.5,z=1,d=1,$1=13,Nr=10,zr=10,W={PLAYER_BLACKJACK:TE,WIN:ME,PUSH:bE,LOSE:wE};var _=require("@betorigami/guard"),IE=require("@xstate/store");var hE=0,uE=51,_r=Array.from({length:52},(r,E)=>E),VE=["Spades","Hearts","Diamonds","Clubs"],Cr=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],yE=["Jack","Queen","King"];var YE=require("@betorigami/guard");var Ur=require("@betorigami/guard");class $r{value;constructor(r){let E=_r[r];Ur.Guard.againstNullOrUndefined(E,`Invalid card value: ${r}`),this.value=E}get suit(){let r=Math.floor(this.value/13),E=VE[r];return Ur.Guard.againstNullOrUndefined(E,`Invalid suit index: ${r}`),E}get rank(){let r=this.value%13,E=Cr[r];return Ur.Guard.againstNullOrUndefined(E,`Invalid rank index: ${r}`),E}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class V extends $r{get numericRank(){if(yE.includes(this.rank))return zr;return Cr.indexOf(this.rank)+1}static fromValue(r){return YE.Guard.against(!_r.includes(r),`Invalid card value: ${r}`),new V(r)}}class L{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((A,t)=>A+t.numericRank,0),r.some((A)=>A.rank==="Ace")&&this.hardHandValue+Nr<=Zr)this.softHandValue=this.hardHandValue+Nr}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>Zr}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===M}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class K{cards;value;constructor(r){this.cards=r.map((E)=>V.fromValue(E)),this.value=new L(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 v extends K{otherCards;upCard;holeCard;constructor(r,E,A=[]){super([r,E,...A]);this.otherCards=A;this.upCard=V.fromValue(r),this.holeCard=V.fromValue(E)}static withInitialDeal(r){return new v(r.upCard,r.holeCard)}addDrawnCards(r){return new v(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new L([this.upCard]).highestHandValue}}}class P extends K{static withInitialDeal(r){return new P(r)}addDrawnCards(r){return new P([...this.rawValues,...r])}}var g=require("@betorigami/guard");class l{source;index=0;constructor(r){this.source=r}static from(r,E){return g.Guard.against(E<=0,`Count must be positive, got ${E}`),g.Guard.against(r.values.length!==E,`Expected ${E} values, got ${r.values.length}`),new l(r)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return g.Guard.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){g.Guard.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let E=this.source.values.slice(this.index,this.index+r);return this.index+=r,E}}var zE=require("@betorigami/guard"),$E=u(require("fast-deep-equal"));class pr{edge;constructor(r){this.edge=r}play(r,E,A=[]){let t=this.createGameStore(),f=this.generateRandomValues(r),O=f.toMultipleRandomValues();for(let c of A)t.send({...c.playerArgument,randomValuePool:f});let o=A[A.length-1];if(o)zE.Guard.against(!$E.default(o.state,this.toExternalState(t.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");t.send({...E,randomValuePool:f});let x=t.getSnapshot().context;return{playerArgument:x.playerArgument,state:this.toExternalState(x.state),config:x.config,betAmountMultiplier:x.betAmountMultiplier,proof:{proofHash:O.proofHash,proofString:O.proofString}}}}var U=u(require("big.js"));var pE={BLACKJACK_DOUBLE_DOWN:z,BLACKJACK_BUY_INSURANCE:X,BLACKJACK_SPLIT:d},PE=(r)=>r==="WON"?U.default(Yr):U.default(0),FE=(r)=>r!==void 0?U.default(X):U.default(0),JE=(r)=>{let E=r.actionType==="BLACKJACK_DOUBLE_DOWN",A=U.default(1),t=E?U.default(z):U.default(0),f=FE(r.insuranceOutcome),O=A.plus(t).plus(f),o=A.plus(t),x=U.default(W[r.outcome]).mul(o),c=PE(r.insuranceOutcome);return{payoutMultiplier:x.plus(c).div(O).toNumber(),betAmountMultiplier:pE[r.actionType]}},RE=(r)=>{let E=r.mainHandDoubledDown?U.default(1).plus(z):U.default(1),A=r.splitHandDoubledDown?U.default(1).plus(z):U.default(1),t=FE(r.insuranceOutcome),f=E.plus(A).plus(t),O=U.default(W[r.mainOutcome]).mul(E),o=U.default(W[r.splitOutcome]).mul(A),x=PE(r.insuranceOutcome);return{payoutMultiplier:O.plus(o).plus(x).div(f).toNumber(),betAmountMultiplier:pE[r.actionType]}};var p1={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},G=(r)=>V.fromValue(r).value;function P1(r){_.Guard.against(r.phase!=="in-progress","Expected a started, in-progress game state")}function qE(r){_.Guard.against(r.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}function Pr(r){_.Guard.against(r.phase!=="in-progress"&&r.phase!=="playing-main-hand"&&r.phase!=="playing-split-hand","Expected a started, in-progress game state")}var QE=(r,E)=>{let A=E;while(A.highestHandValue<yr)A=A.addDrawnCards([G(r.takeOne())]);return A},Jr=(r,E)=>{if(r.isBusted)return"LOSE";if(E.isBusted)return"WIN";let A=r.highestHandValue,t=E.highestHandValue;if(A>t)return"WIN";if(A<t)return"LOSE";return"PUSH"},b=(r)=>{let{payoutMultiplier:E,betAmountMultiplier:A}=JE({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:E,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome},config:{},playerArgument:{type:r.actionType},betAmountMultiplier:A}},Fr=(r)=>{let E=QE(r.randomValuePool,r.dealerHand),A=Jr(r.playerHand,E);return b({...r,dealerHand:E,outcome:A})},$=(r)=>{let A=r.mainHand.isBusted&&r.splitHand.isBusted?r.dealerHand:QE(r.randomValuePool,r.dealerHand),t=Jr(r.mainHand,A),f=Jr(r.splitHand,A),{payoutMultiplier:O,betAmountMultiplier:o}=RE({hasSplit:!0,mainOutcome:t,splitOutcome:f,insuranceOutcome:r.insuranceOutcome,mainHandDoubledDown:r.mainHandDoubledDown,splitHandDoubledDown:r.splitHandDoubledDown,actionType:r.actionType});return{state:{isFinished:!0,phase:"split-finished",mainHand:r.mainHand,splitHand:r.splitHand,dealerHand:A,mainOutcome:t,splitOutcome:f,multiplier:O,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome},config:{},playerArgument:{type:r.actionType},betAmountMultiplier:o}};class XE extends pr{generateRandomValues(r){return l.from(r.getRandomIntsWithReplacement({min:hE,max:uE,count:Sr}),Sr)}toExternalState(r){let E=r.phase;switch(E){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"playing-main-hand":return{isFinished:!1,phase:"playing-main-hand",multiplier:r.multiplier,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"playing-split-hand":return{isFinished:!1,phase:"playing-split-hand",multiplier:r.multiplier,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.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"split-finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,mainOutcome:r.mainOutcome,splitOutcome:r.splitOutcome,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.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:_.Guard.againstNever(E,"Invalid state received")}}createGameStore(){return IE.createStore({context:p1,on:{START:(r,E)=>{let{state:A}=r;_.Guard.against(A.phase!=="uninitialised","START action requires a fresh game");let t=G(E.randomValuePool.takeOne()),f=G(E.randomValuePool.takeOne()),O=G(E.randomValuePool.takeOne()),o=G(E.randomValuePool.takeOne()),x=P.withInitialDeal([t,f]),c=v.withInitialDeal({upCard:O,holeCard:o});if(c.upCard.rank==="Ace")return{state:{...A,isFinished:!1,phase:"awaiting-insurance",playerHand:x,dealerHand:c},config:{},playerArgument:{type:"START"}};if(x.isBlackjack&&c.isBlackjack)return b({...A,playerHand:x,dealerHand:c,outcome:"PUSH",randomValuePool:E.randomValuePool,actionType:"START"});if(x.isBlackjack)return b({...A,playerHand:x,dealerHand:c,outcome:"PLAYER_BLACKJACK",randomValuePool:E.randomValuePool,actionType:"START"});if(c.isBlackjack)return b({...A,playerHand:x,dealerHand:c,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"START"});return{state:{...A,isFinished:!1,phase:"in-progress",playerHand:x,dealerHand:c,insuranceOutcome:void 0},config:{},playerArgument:{type:"START"}}},BLACKJACK_BUY_INSURANCE:(r,E)=>{let{state:A}=r;qE(A);let{playerHand:t,dealerHand:f}=A,O={...A,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_BUY_INSURANCE"};if(t.isBlackjack&&f.isBlackjack)return b({...O,outcome:"PUSH",insuranceOutcome:"WON"});if(t.isBlackjack)return b({...O,outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST"});if(f.isBlackjack)return b({...O,outcome:"LOSE",insuranceOutcome:"WON"});return{state:{...A,phase:"in-progress",insuranceOutcome:"LOST"},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmountMultiplier:X}},BLACKJACK_REJECT_INSURANCE:(r,E)=>{let{state:A}=r;qE(A);let{playerHand:t,dealerHand:f}=A,O={...A,playerHand:t,dealerHand:f,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_REJECT_INSURANCE",doubledDown:!1};if(t.isBlackjack&&f.isBlackjack)return b({...O,outcome:"PUSH"});if(t.isBlackjack)return b({...O,outcome:"PLAYER_BLACKJACK"});if(f.isBlackjack)return b({...O,outcome:"LOSE"});return{state:{...A,phase:"in-progress",insuranceOutcome:void 0},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(r,E)=>{let{state:A}=r;switch(Pr(A),A.phase){case"playing-main-hand":{let t=A.mainHand.addDrawnCards([G(E.randomValuePool.takeOne())]);if(t.isBusted||t.highestHandValue===M){if(A.splitHand.highestHandValue===M)return $({...A,mainHand:t,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});return{state:{...A,phase:"playing-split-hand",mainHand:t,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}return{state:{...A,mainHand:t},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"playing-split-hand":{let t=A.splitHand.addDrawnCards([G(E.randomValuePool.takeOne())]);if(t.isBusted||t.highestHandValue===M)return $({...A,splitHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});return{state:{...A,splitHand:t},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"in-progress":{let t=A.playerHand.addDrawnCards([G(E.randomValuePool.takeOne())]);if(t.isBusted)return b({...A,playerHand:t,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});if(t.highestHandValue===M)return Fr({...A,playerHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});return{state:{...A,phase:"in-progress",playerHand:t},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}default:_.Guard.againstNever(A,"Invalid phase for HIT action")}},BLACKJACK_STAND:(r,E)=>{let{state:A}=r;switch(Pr(A),A.phase){case"playing-main-hand":{if(A.splitHand.highestHandValue===M)return $({...A,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND"});return{state:{...A,phase:"playing-split-hand",splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_STAND"}}}case"playing-split-hand":return $({...A,splitHandDoubledDown:A.splitHandDoubledDown,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND"});case"in-progress":return Fr({...A,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND"});default:_.Guard.againstNever(A,"Invalid phase for STAND action")}},BLACKJACK_DOUBLE_DOWN:(r,E)=>{let{state:A}=r;switch(Pr(A),A.phase){case"playing-main-hand":{_.Guard.against(A.mainHand.cards.length!==2,"Double down is only allowed as the first action");let t=A.mainHand.addDrawnCards([G(E.randomValuePool.takeOne())]);if(A.splitHand.highestHandValue===M)return $({...A,mainHand:t,mainHandDoubledDown:!0,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN"});return{state:{...A,phase:"playing-split-hand",mainHand:t,mainHandDoubledDown:!0,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},betAmountMultiplier:z}}case"playing-split-hand":{_.Guard.against(A.splitHand.cards.length!==2,"Double down is only allowed as the first action");let t=A.splitHand.addDrawnCards([G(E.randomValuePool.takeOne())]);return $({...A,splitHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",splitHandDoubledDown:!0})}case"in-progress":{_.Guard.against(A.playerHand.cards.length!==2,"Double down is only allowed as the first action");let t=A.playerHand.addDrawnCards([G(E.randomValuePool.takeOne())]);if(t.isBusted)return b({...A,playerHand:t,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN"});return Fr({...A,playerHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN"})}default:_.Guard.againstNever(A,"Invalid phase for DOUBLE_DOWN action")}},BLACKJACK_SPLIT:(r,E)=>{let{state:A}=r;P1(A);let{playerHand:t}=A;_.Guard.against(t.cards.length!==2,"Split is only allowed with exactly 2 cards");let f=t.cards[0],O=t.cards[1];_.Guard.againstUndefined(f,"First card is missing"),_.Guard.againstUndefined(O,"Second card is missing"),_.Guard.against(f.rank!==O.rank,"Split requires two cards of the same rank");let o=G(E.randomValuePool.takeOne()),x=G(E.randomValuePool.takeOne()),c=P.withInitialDeal([f.value,o]),Z=P.withInitialDeal([O.value,x]);if(f.rank==="Ace")return $({...A,mainHand:c,splitHand:Z,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_SPLIT",mainHandDoubledDown:!1,splitHandDoubledDown:!1});let D=c.highestHandValue===M,w=Z.highestHandValue===M;if(D&&w)return $({...A,mainHand:c,splitHand:Z,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_SPLIT",mainHandDoubledDown:!1,splitHandDoubledDown:!1});if(D)return{state:{...A,phase:"playing-split-hand",mainHand:c,splitHand:Z,mainHandDoubledDown:!1,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},betAmountMultiplier:d};return{state:{...A,phase:"playing-main-hand",multiplier:1,mainHand:c,splitHand:Z,mainHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},betAmountMultiplier:d}}}})}getValidNextActionTypes(r){if(r.isFinished)return[];switch(r.phase){case"awaiting-insurance":return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];case"playing-main-hand":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.mainHand.cards.length===2)E.push("BLACKJACK_DOUBLE_DOWN");return E}case"playing-split-hand":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.splitHand.cards.length===2)E.push("BLACKJACK_DOUBLE_DOWN");return E}case"player-turn":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.playerHand.cards.length===2){E.push("BLACKJACK_DOUBLE_DOWN");let A=r.playerHand.cards[0],t=r.playerHand.cards[1];if(_.Guard.againstUndefined(A,"First player card is missing"),_.Guard.againstUndefined(t,"Second player card is missing"),A.rank===t.rank)E.push("BLACKJACK_SPLIT")}return E}default:_.Guard.againstNever(r,"Invalid phase for getting valid actions")}}}var dE=u(require("big.js"));class y{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let E=this.multipliers.get(r);if(E===void 0)throw new Error(`Multipliers for ${r} not found`);return E}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,E])=>({edge:r,multipliers:E}))}}var jE;((o)=>{o.PAIR="PAIR";o.TWO_PAIR="TWO_PAIR";o.THREE_OF_A_KIND="THREE_OF_A_KIND";o.FULL_HOUSE="FULL_HOUSE";o.FOUR_OF_A_KIND="FOUR_OF_A_KIND";o.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(jE||={});var F1={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},J1={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},R1={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},q1={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},I1={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},iE=new y(new Map([[1,F1],[2,J1],[3,R1],[4,q1],[8,I1]])),Q1={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class mE extends S{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:E}){let A=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),t=iE.getMultipliers(E),f=A.values,O=this.calculatePayoutMultiplier(t,f);return{isFinished:!0,payoutMultiplier:dE.default(O),outputs:{result:A.values},randomValues:A}}calculatePayoutMultiplier(r,E){let A=new Map;for(let O of E){let o=A.get(O)||0;A.set(O,o+1)}let t=[...A.values()].filter((O)=>O>1),f=this.classifyResult(t);return f===null?0:r[f]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[E,A]=r;if(E===void 0)return null;if(A===void 0){let t=Q1[E];if(t===void 0)throw new Error(`Unexpected single diamond repeat count: ${E}`);return t}return E===3||A===3?"FULL_HOUSE":"TWO_PAIR"}}var qr=u(require("big.js"));var HE;((A)=>{A.ABOVE="ABOVE";A.BELOW="BELOW"})(HE||={});var Rr=1e4,WE=(r)=>{let E=r.direction==="ABOVE"?Rr-r.selectedValue:r.selectedValue;return new qr.default(E).div(Rr).mul(100)},LE=(r,E)=>r.direction==="ABOVE"?E>r.selectedValue:E<r.selectedValue;class KE extends S{constructor(){super("DICE")}determineGameResult({generator:r,edge:E,gameInputs:A}){let t=r.getRandomInt({min:0,max:1e4}),f=WE(A);return{isFinished:!0,payoutMultiplier:LE(A,t.value)?Y.withWinChance(E,f):new qr.default(0),outputs:{result:t.values},randomValues:t}}}var nE=u(require("big.js"));var k=require("@betorigami/guard");var Ir;((f)=>{f.CLASSIC="CLASSIC";f.LOW_RISK="LOW_RISK";f.MEDIUM_RISK="MEDIUM_RISK";f.HIGH_RISK="HIGH_RISK"})(Ir||={});var vE=[1,2,3,4,5,6,7,8,9,10],Qr=(r)=>{return vE.includes(r)};var gE={[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]}},lE={[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]}},kE={[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]}},sE={[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]}},aE={[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]}},Xr=new y(new Map([[1,gE],[2,lE],[3,kE],[4,sE],[8,aE]]));class eE extends S{constructor(){super("KENO")}determineGameResult({generator:r,edge:E,gameInputs:A}){k.Guard.againstEmptyArray(A.selectedNumbers,()=>B.createValidationError("No numbers selected")),k.Guard.against(A.selectedNumbers.length>10,()=>B.createValidationError("Maximum of 10 numbers can be selected"));for(let D of A.selectedNumbers)k.Guard.againstNonInteger(D,()=>B.createValidationError("Only integers can be selected")),k.Guard.against(D<0||D>39,()=>B.createValidationError("Invalid number selected"));let t=r.getUniqueRandomInts({min:0,max:39,count:10}),f=A.selectedNumbers.filter((D)=>t.values.includes(D)),O=A.selectedNumbers.length;if(!Qr(O))throw new Error(`Invalid tile count: ${O}`);let Z=Xr.getMultipliers(E)[O][A.riskLevel][f.length];if(Z===void 0)throw new Error(`No multiplier found for matching tile count ${f.length}`);return{isFinished:!0,payoutMultiplier:new nE.default(Z),outputs:{result:t.values},randomValues:t}}}var F=u(require("big.js"));var dr=(r,E)=>{return r.gt(E)?r:E};var jr=(r,E)=>{return r.lt(E)?r:E};class r1 extends S{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:E,gameInputs:A}){let t=r.getRandomInt({min:1,max:4294967295}),f=t.max,O=new F.default(16777216),o=new F.default(1),x=new F.default(1e6),c=t.value,Z=new F.default(c-1).div(f),N=(100-E)/100,D=O.div(Z.mul(O).plus(1)).mul(N),w=dr(o,jr(D,x));return{isFinished:!0,payoutMultiplier:w.gte(A.targetMultiplier)?new F.default(A.targetMultiplier):new F.default(0),outputs:{randomMultiplier:w,result:t.values},randomValues:t}}}var s=u(require("big.js"));var Gr=(r,E)=>{if(E<0||r<0||E>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(E>r-E)E=r-E;let A=1;for(let t=1;t<=E;t++)A=A*(r-t+1)/t;return A};class E1 extends S{constructor(){super("MINES")}determineGameResult({generator:r,edge:E,gameInputs:A}){if(A.minesCount<=0||A.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(A.selectedTiles.length>25-A.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let o=r.getUniqueRandomInts({min:1,max:25,count:A.minesCount}),x=o.values.some((rr)=>A.selectedTiles.includes(rr)),c=A.hasCashedOut||x,Z=(100-E)/100,N=new s.default(Gr(25-A.minesCount,A.selectedTiles.length)).div(new s.default(Gr(25,A.selectedTiles.length))),w=A.hasCashedOut&&!x?new s.default(Z).div(N):new s.default(0);return{isFinished:c,payoutMultiplier:w,outputs:{result:o.values},randomValues:o}}}var A1=require("big.js");var ir;((t)=>{t.LOW_RISK="LOW_RISK";t.MEDIUM_RISK="MEDIUM_RISK";t.HIGH_RISK="HIGH_RISK"})(ir||={});var X1=[8,9,10,11,12,13,14,15,16],d1={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]}},j1={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]}},i1={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]}},m1={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]}},H1={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 y(new Map([[1,d1],[2,j1],[3,i1],[4,m1],[8,H1]]));class t1 extends S{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:E,edge:A}){if(E.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(E.numberOfRows<8||E.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let t=E.numberOfRows,o=mr.getMultipliers(A)[E.riskLevel][t],x=r.getRandomIntsWithReplacement({min:0,max:1,count:E.numberOfRows}),Z=x.values.reduce((D,w)=>D+w,0),N=o[Z];if(N===void 0)throw new Error(`No payout found for end position ${Z}`);return{isFinished:!0,payoutMultiplier:A1.Big(N),outputs:{result:x.values},randomValues:x}}}var e=require("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],Hr=[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]],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]],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]],kr=[0,1,2,3,37],sr=[[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]],ar=[[1,2,3,4,5,6],[4,5,6,7,8,9],[7,8,9,10,11,12],[10,11,12,13,14,15],[13,14,15,16,17,18],[16,17,18,19,20,21],[19,20,21,22,23,24],[22,23,24,25,26,27],[25,26,27,28,29,30],[28,29,30,31,32,33],[31,32,33,34,35,36]],J;((A)=>{A.EVEN="EVEN";A.ODD="ODD"})(J||={});var R;((A)=>{A.RED="RED";A.BLACK="BLACK"})(R||={});var q;((A)=>{A.LOW="LOW";A.HIGH="HIGH"})(q||={});var I;((t)=>{t.TOP="TOP";t.MIDDLE="MIDDLE";t.BOTTOM="BOTTOM"})(I||={});var Q;((t)=>{t.FIRST="FIRST";t.SECOND="SECOND";t.THIRD="THIRD"})(Q||={});var Mr;((A)=>{A.AMERICAN="AMERICAN";A.EUROPEAN="EUROPEAN"})(Mr||={});var br=(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 B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((E)=>E.amount.gte(0)&&a(E.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((E)=>E.amount.gte(0)&&W1(E.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&L1(E.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&K1(E.values)))throw B.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((E)=>E.amount.gte(0)&&v1(E.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((E)=>E.amount.gte(0)&&Object.values(J).includes(E.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((E)=>E.amount.gte(0)&&Object.values(R).includes(E.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((E)=>E.amount.gte(0)&&Object.values(q).includes(E.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((E)=>E.amount.gte(0)&&Object.values(I).includes(E.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(Q).includes(E.dozen)))throw B.createValidationError("Invalid dozen bet.")},a=(r)=>{return Tr.includes(r)},W1=(r)=>{if(r.length!==2)return!1;if(!r.every(a))return!1;return Wr.some(([E,A])=>E===r[0]&&A===r[1])},L1=(r)=>{if(r.length!==3)return!1;if(!r.every(a))return!1;return Kr.some(([E,A,t])=>E===r[0]&&A===r[1]&&t===r[2])},K1=(r)=>{if(r.length!==4)return!1;if(!r.every(a))return!1;return gr.some(([E,A,t,f])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3])},v1=(r)=>{if(r.length!==6)return!1;if(!r.every(a))return!1;return sr.some(([E,A,t,f,O,o])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3]&&O===r[4]&&o===r[5])};var wr=(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 B.createValidationError("Must place at least a single bet.");if(!r.straightBets.every((E)=>E.amount.gte(0)&&n(E.value)))throw B.createValidationError("Invalid straight bet.");if(!r.splitBets.every((E)=>E.amount.gte(0)&&g1(E.values)))throw B.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&l1(E.values)))throw B.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&k1(E.values)))throw B.createValidationError("Invalid corner bet.");if(!r.basketBets.every((E)=>E.amount.gte(0)))throw B.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((E)=>E.amount.gte(0)&&s1(E.values)))throw B.createValidationError("Invalid double street bet.");if(!r.parityBets.every((E)=>E.amount.gte(0)&&Object.values(J).includes(E.parity)))throw B.createValidationError("Invalid parity bet.");if(!r.colorBets.every((E)=>E.amount.gte(0)&&Object.values(R).includes(E.color)))throw B.createValidationError("Invalid color bet.");if(!r.halfBets.every((E)=>E.amount.gte(0)&&Object.values(q).includes(E.half)))throw B.createValidationError("Invalid half bet.");if(!r.columnBets.every((E)=>E.amount.gte(0)&&Object.values(I).includes(E.column)))throw B.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(Q).includes(E.dozen)))throw B.createValidationError("Invalid dozen bet.")},n=(r)=>{return Hr.includes(r)};function g1(r){if(r.length!==2)return!1;if(!r.every(n))return!1;return Lr.some(([E,A])=>E===r[0]&&A===r[1])}var l1=(r)=>{if(r.length!==3)return!1;if(!r.every(n))return!1;return vr.some(([E,A,t])=>E===r[0]&&A===r[1]&&t===r[2])},k1=(r)=>{if(r.length!==4)return!1;if(!r.every(n))return!1;return lr.some(([E,A,t,f])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3])},s1=(r)=>{if(r.length!==6)return!1;if(!r.every(n))return!1;return ar.some(([E,A,t,f,O,o])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3]&&O===r[4]&&o===r[5])};var f1={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},O1=[3,6,9,12,15,18,21,24,27,30,33,36],o1=[2,5,8,11,14,17,20,23,26,29,32,35],x1=[1,4,7,10,13,16,19,22,25,28,31,34],B1=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],c1=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],D1=2.7,Z1=5.3;class nr extends S{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:E}){this.validateInputs(E);let A=r.getRandomInt({min:0,max:this.maxNumber}),t=A.value,f=this.determineBetOutcomes(E,t),{payoutMultiplier:O}=this.getPayoutDetails(E,t);return{outputs:{betOutcomes:f,result:A.values},payoutMultiplier:O,isFinished:!0,randomValues:A}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,E){let A=this.determineBetOutcomes(r,E),t=this.getBetTotals(r),f=this.getBetTotals(A.winningBets),O=this.calculateTotalBetAmount(t),o=this.calculateTotalPayout(f);return{payoutMultiplier:O.gt(0)?o.div(O):new e.Big(0),payoutAmount:o}}determineBetOutcomes(r,E){let A={},t={};for(let f of Object.keys(r)){let O=r[f],o=this.betPredicates[f],{winning:x,losing:c}=this.partitionBets(O,o,E);A[f]=x,t[f]=c}return{winningBets:A,losingBets:t}}calculateTotalAmount(r){return r.reduce((E,A)=>E.plus(A.amount),new e.Big(0))}isWinningStraightBet(r,E){return r.value===E}isWinningSplitBet(r,E){return r.values.some((A)=>A===E)}isWinningStreetBet(r,E){return r.values.some((A)=>A===E)}isWinningCornerBet(r,E){return r.values.some((A)=>A===E)}isWinningDoubleStreetBet(r,E){return r.values.some((A)=>A===E)}isWinningColorBet(r,E){let A=r;return B1.includes(E)&&A.color==="RED"||c1.includes(E)&&A.color==="BLACK"}isWinningHalfBet(r,E){let A=r;if(E>0&&E<=18&&A.half==="LOW")return!0;if(E>18&&E<=36&&A.half==="HIGH")return!0;return!1}isWinningColumnBet(r,E){let A=r;return O1.includes(E)&&A.column==="TOP"||o1.includes(E)&&A.column==="MIDDLE"||x1.includes(E)&&A.column==="BOTTOM"}isWinningDozenBet(r,E){let A=r;if(E>0&&E<=12&&A.dozen==="FIRST")return!0;if(E>12&&E<=24&&A.dozen==="SECOND")return!0;if(E>24&&E<=36&&A.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,E){let A=r;if(E===0||E===37)return!1;let t=E%2===0?"EVEN":"ODD";return A.parity===t}getBetTotals(r){let E={};for(let A of Object.keys(r))E[A]=this.calculateTotalAmount(r[A]);return E}calculateTotalBetAmount(r){return Object.values(r).reduce((E,A)=>E.plus(A),new e.Big(0))}partitionBets(r,E,A){return{winning:r.filter((t)=>E(t,A)),losing:r.filter((t)=>!E(t,A))}}calculateTotalPayout(r){return Object.entries(r).reduce((E,[A,t])=>{let O=f1[A];return E.plus(t.mul(O||0))},new e.Big(0))}}class er 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){br(r)}}class rE 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){wr(r)}isWinningBasketBet(r,E){return kr.some((A)=>A===E)}}class EE extends S{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new er,this.americanGame=new rE}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:E,...A}=r;if(r.edge===D1&&E.type==="EUROPEAN"){let t=this.europeanGame.determineGameResult({...A,gameInputs:E.inputs}),{betOutcomes:f}=t.outputs;return{...t,outputs:{type:"european",betOutcomes:f,result:t.outputs.result}}}if(r.edge===Z1&&E.type==="AMERICAN"){let t=this.americanGame.determineGameResult({...A,gameInputs:E.inputs}),{betOutcomes:f}=t.outputs;return{...t,outputs:{type:"american",betOutcomes:f,result:t.outputs.result}}}throw B.createValidationError(`Attempted to play ${E.type} roulette on edge ${r.edge}`)}}var a1=(r)=>{return new EE().getBetAmount(r)};var n1=(r)=>{if(r.type==="EUROPEAN")br(r.inputs);else wr(r.inputs)};var _1=require("big.js");var j;((t)=>{t.LOW_RISK="LOW_RISK";t.MEDIUM_RISK="MEDIUM_RISK";t.HIGH_RISK="HIGH_RISK"})(j||={});var i;((O)=>{O[O.TEN=10]="TEN";O[O.TWENTY=20]="TWENTY";O[O.THIRTY=30]="THIRTY";O[O.FORTY=40]="FORTY";O[O.FIFTY=50]="FIFTY"})(i||={});var e1={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}}},r2={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}}},E2={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}}},A2={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}}},t2={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}}},S1=new y(new Map([[1,e1],[2,r2],[3,E2],[4,A2],[8,t2]]));var N1={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 C1 extends S{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:E,edge:A}){if(!Object.values(i).includes(E.segments))throw new Error("Invalid segments value");if(!Object.values(j).includes(E.riskLevel))throw new Error("Invalid risk level");let f=S1.getMultipliers(A)[E.riskLevel];if(f===void 0)throw new Error(`No multipliers found for risk level ${E.riskLevel}`);let O=f[E.segments];if(O===void 0)throw new Error(`No multipliers found for segment ${E.segments}`);let o=N1[E.riskLevel];if(o===void 0)throw new Error(`No patterns found for risk level ${E.riskLevel}`);let x=o[E.segments];if(x===void 0)throw new Error(`No patterns found for segment ${E.segments}`);let c=r.getRandomInt({min:0,max:x.length-1}),Z=x[c.value];if(Z===void 0)throw new Error(`No pattern found for segment ${E.segments} and value ${c.value}`);let N=O[Z];if(N===void 0)throw new Error(`No payout found for picked segment ${Z}`);return{isFinished:!0,payoutMultiplier:new _1.Big(N),outputs:{result:c.values},randomValues:c}}}
|
|
1
|
+
var br=Object.create;var{getPrototypeOf:jr,defineProperty:$,getOwnPropertyNames:Aa,getOwnPropertyDescriptor:Nr}=Object,Ba=Object.prototype.hasOwnProperty;var H=(t,a,r)=>{r=t!=null?br(jr(t)):{};let e=a||!t||!t.__esModule?$(r,"default",{value:t,enumerable:!0}):r;for(let n of Aa(t))if(!Ba.call(e,n))$(e,n,{get:()=>t[n],enumerable:!0});return e},pa=new WeakMap,Vr=(t)=>{var a=pa.get(t),r;if(a)return a;if(a=$({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")Aa(t).map((e)=>!Ba.call(a,e)&&$(a,e,{get:()=>t[e],enumerable:!(r=Nr(t,e))||r.enumerable}));return pa.set(t,a),a};var wr=(t,a)=>{for(var r in a)$(t,r,{get:a[r],enumerable:!0,configurable:!0,set:(e)=>a[r]=()=>e})};var Oe={};wr(Oe,{validateRouletteGameInputs:()=>Be,validateAdvancedDiceInputs:()=>kr,rtp99Multipliers:()=>lr,rtp98Multipliers:()=>dr,rtp97Multipliers:()=>ur,rtp96Multipliers:()=>sr,rtp92Multipliers:()=>pr,plinkoMultipliers:()=>Lt,nCr:()=>Ht,kenoMultipliers:()=>Xt,isTileCount:()=>zt,hasDiceWon:()=>or,diamondsMultipliers:()=>ar,calculateRouletteBetAmount:()=>Ae,calculateDiceWinChance:()=>nr,calculateBaccaratBetAmount:()=>Ta,calculateAdvancedDiceWinChance:()=>jt,bigMin:()=>Qt,bigMax:()=>qt,advancedDiceIsWithinBoundsInclusive:()=>fa,advancedDiceIsWithinBoundsExclusive:()=>it,advancedDiceGetInclusiveBoundsRange:()=>Sa,advancedDiceGetExclusiveBoundsRange:()=>ct,WheelSegments:()=>J,WheelRiskLevel:()=>Y,Wheel:()=>Ir,WIN_MULTIPLIER:()=>_a,VALID_SUITS:()=>Ca,VALID_RANKS:()=>ha,VALID_EUROPEAN_STREETS:()=>aa,VALID_EUROPEAN_STRAIGHTS:()=>xt,VALID_EUROPEAN_SPLITS:()=>vt,VALID_EUROPEAN_DOUBLE_STREETS:()=>ia,VALID_EUROPEAN_CORNERS:()=>ea,VALID_AMERICAN_STREETS:()=>ra,VALID_AMERICAN_STRAIGHTS:()=>Kt,VALID_AMERICAN_SPLITS:()=>ta,VALID_AMERICAN_DOUBLE_STREETS:()=>ca,VALID_AMERICAN_CORNERS:()=>na,ThreeCardBonusType:()=>Bt,TOP_COLUMN:()=>Or,TILE_COUNTS:()=>cr,THREE_CARD_BONUS_PAYOUTS:()=>Ut,SingleActionGame:()=>A,SPLIT_BET_SIZE_FACTOR:()=>j,RouletteType:()=>Tt,Roulette:()=>sa,RollType:()=>Oa,RandomValuePool:()=>L,RED_NUMBERS:()=>hr,RANDOM_MIN_VALUE:()=>lt,RANDOM_MAX_VALUE:()=>dt,PlinkoRiskLevel:()=>Wt,Plinko:()=>fr,Parity:()=>w,PairBonusType:()=>At,PUSH_MULTIPLIER:()=>Ia,PLINKO_ROW_COUNTS:()=>vr,PAYOUT_MULTIPLIERS:()=>Sr,PAIR_BONUS_PAYOUTS:()=>wt,OrigamiGame:()=>f,MultiplierCalculator:()=>T,MultiActionGame:()=>Ct,Mines:()=>yr,MIN_WIN_CHANCE:()=>ya,MIDDLE_COLUMN:()=>Dr,MAX_WIN_CHANCE:()=>Ea,MAX_CARDS_PER_ROUND:()=>yt,Limbo:()=>mr,LOSE_MULTIPLIER:()=>ba,KenoRiskLevel:()=>$t,Keno:()=>Br,InsuranceOutcome:()=>st,INSURANCE_WIN_PAYOUT:()=>Et,INSURANCE_BET_SIZE_FACTOR:()=>M,INSURANCE_BET_MULTIPLIER:()=>Mr,Half:()=>G,GameErrorCode:()=>ma,GameError:()=>d,Game:()=>F,FACE_CARD_VALUE:()=>Vt,EuropeanRoulette:()=>da,EUROPEAN_HOUSE_EDGE:()=>xr,EFFECTIVE_RANGE:()=>It,Dozen:()=>k,DiceDirection:()=>er,Dice:()=>ir,DiamondsResultType:()=>tr,Diamonds:()=>rr,DOUBLE_DOWN_BET_SIZE_FACTOR:()=>R,DICE_EFFECTIVE_RANGE:()=>Jt,DEALER_STAND_VALUE:()=>Nt,Column:()=>Z,Color:()=>U,CARDS_PER_SUIT:()=>Yr,BlackjackOutcome:()=>ut,BlackjackActionType:()=>pt,Blackjack:()=>Ka,BaccaratOutcome:()=>Ha,BaccaratBetType:()=>xa,Baccarat:()=>Ra,BUST_VALUE:()=>mt,BOTTOM_COLUMN:()=>Cr,BLACK_NUMBERS:()=>Hr,BLACKJACK_VALUE:()=>O,BLACKJACK_MULTIPLIER:()=>Pa,BASE_PAYOUT_MULTIPLIERS:()=>z,AmericanRoulette:()=>ua,AdvancedDice:()=>Da,AMERICAN_HOUSE_EDGE:()=>Tr,AMERICAN_BASKET:()=>oa,ACE_SOFT_BONUS:()=>ft});module.exports=Vr(Oe);var ma;((a)=>a.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(ma||={});class d extends Error{static createValidationError(t){return new d("INPUT_VALIDATION_ERROR",t)}static isGameError(t){return t instanceof d}errorCode;constructor(t,a){super(a);this.errorCode=t}}var f;((l)=>{l.DICE="DICE";l.MINES="MINES";l.KENO="KENO";l.LIMBO="LIMBO";l.ADVANCED_DICE="ADVANCED_DICE";l.BACCARAT="BACCARAT";l.DIAMONDS="DIAMONDS";l.PLINKO="PLINKO";l.ROULETTE="ROULETTE";l.WHEEL="WHEEL";l.BLACKJACK="BLACKJACK"})(f||={});class F{gameId;constructor(t){this.gameId=t}}class A extends F{constructor(t){super(t)}getGameResult(t){return this.determineGameResult(t)}}var bt=require("big.js");var nt=H(require("big.js"));class T{static withMultiplier(t,a){return new nt.default(t).times(new nt.default(100-a).div(100))}static withWinChance(t,a){return nt.default(100-t).div(a)}}var lt=0,dt=1e4,It=10001,ya=0.01,Ea=98,Ur=(t)=>{if(t<lt)throw d.createValidationError(`Lower bound ${t} is below minimum allowed value ${lt}`)},Gr=(t)=>{if(t>dt)throw d.createValidationError(`Upper bound ${t} is above maximum allowed value ${dt}`)},ot=(t)=>{if(Ur(t.lower),Gr(t.upper),t.lower>=t.upper)throw d.createValidationError(`Lower bound ${t.lower} must be less than ${t.upper}`)},Zr=(t,a)=>{let[r,e]=t.lower<=a.lower?[t,a]:[a,t];if(r.upper>e.lower)throw d.createValidationError("Bounds must not overlap")},fa=(t,a)=>a>=t.lower&&a<=t.upper,Sa=(t)=>t.upper-t.lower+1,it=(t,a)=>a>t.lower&&a<t.upper,ct=(t)=>t.upper-t.lower-1,Oa;((e)=>{e.ROLL_BETWEEN="ROLL_BETWEEN";e.ROLL_OUTSIDE="ROLL_OUTSIDE";e.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(Oa||={});var jt=(t)=>{let r=(()=>{switch(t.mode){case"ROLL_BETWEEN":return ot(t.bounds),ct(t.bounds);case"ROLL_OUTSIDE":return ot(t.bounds),It-Sa(t.bounds);case"ROLL_BETWEEN_TWO":return ot(t.firstBounds),ot(t.secondBounds),Zr(t.firstBounds,t.secondBounds),ct(t.firstBounds)+ct(t.secondBounds)}})(),e=bt.Big(r).div(It).mul(100);if(e.lt(ya))throw d.createValidationError("Win chance too low");if(e.gt(Ea))throw d.createValidationError("Win chance too high");return e},kr=(t)=>{jt(t)};class Da extends A{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=jt(r),n=t.getRandomInt({min:lt,max:dt}),o=n.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"ROLL_BETWEEN":return it(r.bounds,o);case"ROLL_OUTSIDE":return!fa(r.bounds,o);case"ROLL_BETWEEN_TWO":return it(r.firstBounds,o)||it(r.secondBounds,o)}})()?T.withWinChance(a,e):new bt.Big(0),outputs:{result:n.values},randomValues:n}}}var b=H(require("big.js"));var Ca=["Clubs","Diamonds","Hearts","Spades"],ha=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],Ha;((e)=>{e.PLAYER_WIN="PLAYER_WIN";e.TIE="TIE";e.BANKER_WIN="BANKER_WIN"})(Ha||={});var xa;((e)=>{e.PLAYER="PLAYER";e.TIE="TIE";e.BANKER="BANKER"})(xa||={});var Fr={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},Ta=(t)=>{return new b.default(0).add(t.bets.reduce((r,e)=>r.add(e.amount),new b.default(0)))};class Ra extends A{constructor(){super("BACCARAT")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(a);let e=t.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=e.values,o=n.slice(0,3),i=n.slice(3,6),c=[],u=0;for(let y of o.slice(0,2)){let h=this.mapRandomValueToCard(y),et=this.mapRandomValueToCardValue(y);c.push(h),u=(u+et)%10}let p=[],s=0;for(let y of i.slice(0,2)){let h=this.mapRandomValueToCard(y),et=this.mapRandomValueToCardValue(y);p.push(h),s=(s+et)%10}if(!this.isNaturalWin(u,s)){let y=this.shouldDrawThirdPlayerCard(u),h=null;if(y)h=this.mapRandomValueToCardValue(o[2]),c.push(this.mapRandomValueToCard(o[2])),u=(u+h)%10;if(this.shouldDrawThirdBankerCard(s,h))p.push(this.mapRandomValueToCard(i[2])),s=(s+this.mapRandomValueToCardValue(i[2]))%10}let l;if(u===s)l="TIE";else l=u>s?"PLAYER_WIN":"BANKER_WIN";let m=Ta(a),{betType:I,multiplier:_t}=Fr[l],g=new b.default(0);if(g=g.add(a.bets.filter((y)=>y.type===I).reduce((y,h)=>y.add(h.amount.mul(_t)),new b.default(0))),l==="TIE")g=g.add(a.bets.filter((y)=>y.type==="PLAYER"||y.type==="BANKER").reduce((y,h)=>y.add(h.amount),new b.default(0)));return{isFinished:!0,payoutMultiplier:m.gt(0)?g.div(m):new b.default(0),outputs:{playerCards:c,playerHandValue:u,bankerCards:p,bankerHandValue:s,gameOutcome:l,result:e.values},randomValues:e}}validateGameInputs(t){if(t.bets.length===0)throw new Error("Must place at least a single bet.");if(!t.bets.every((a)=>a.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(t){let a=Ca[Math.floor(t/13)],r=ha[t%13];return{suit:a,rank:r}}isNaturalWin(t,a){let r=[8,9];return r.includes(t)||r.includes(a)}mapRandomValueToCardValue(t){let a=t%13;if(a===0)return 1;if(a>=10)return 10;return a+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,a){if(a===null)return t<=5;if(t<=2)return!0;if(t===3)return a!==8;if(t===4)return[2,3,4,5,6,7].includes(a);if(t===5)return[4,5,6,7].includes(a);if(t===6)return[6,7].includes(a);return!1}}var ut;((n)=>{n.WIN="WIN";n.LOSE="LOSE";n.PUSH="PUSH";n.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(ut||={});var st;((r)=>{r.WON="WON";r.LOST="LOST"})(st||={});var pt;((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";c.SPLIT="BLACKJACK_SPLIT"})(pt||={});var At;((n)=>{n.EXACT_PAIR="EXACT_PAIR";n.COLORED_PAIR="COLORED_PAIR";n.MIXED_PAIR="MIXED_PAIR";n.LOSS="LOSS"})(At||={});var Bt;((i)=>{i.SUITED_TRIPS="SUITED_TRIPS";i.STRAIGHT_FLUSH="STRAIGHT_FLUSH";i.THREE_OF_A_KIND="THREE_OF_A_KIND";i.STRAIGHT="STRAIGHT";i.FLUSH="FLUSH";i.LOSS="LOSS"})(Bt||={});var Pa=2.5,_a=2,Ia=1,ba=0,Nt=17,mt=21,O=21,yt=63,Mr=1.5,M=0.5,Et=1.5,R=1,j=1,Yr=13,ft=10,Vt=10,z={PLAYER_BLACKJACK:Pa,WIN:_a,PUSH:Ia,LOSE:ba},wt={EXACT_PAIR:26,COLORED_PAIR:11,MIXED_PAIR:7,LOSS:0},Ut={SUITED_TRIPS:101,STRAIGHT_FLUSH:51,THREE_OF_A_KIND:31,STRAIGHT:11,FLUSH:5,LOSS:0};var _=H(require("big.js")),B=require("@betorigami/guard"),Wa=require("@xstate/store");var ja=0,Na=51,St=Array.from({length:52},(t,a)=>a),Va=["Spades","Hearts","Diamonds","Clubs"],Ot=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],wa=["Jack","Queen","King"],Gt={Hearts:"red",Diamonds:"red",Spades:"black",Clubs:"black"};var Ua=require("@betorigami/guard");var Dt=require("@betorigami/guard");class Zt{value;constructor(t){let a=St[t];Dt.Guard.againstNullOrUndefined(a,`Invalid card value: ${t}`),this.value=a}get suit(){let t=Math.floor(this.value/13),a=Va[t];return Dt.Guard.againstNullOrUndefined(a,`Invalid suit index: ${t}`),a}get rank(){let t=this.value%13,a=Ot[t];return Dt.Guard.againstNullOrUndefined(a,`Invalid rank index: ${t}`),a}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class E extends Zt{get numericRank(){if(wa.includes(this.rank))return Vt;return Ot.indexOf(this.rank)+1}static fromValue(t){return Ua.Guard.against(!St.includes(t),`Invalid card value: ${t}`),new E(t)}}class X{cards;hardHandValue;softHandValue=null;constructor(t){this.cards=t;if(this.hardHandValue=t.reduce((r,e)=>r+e.numericRank,0),t.some((r)=>r.rank==="Ace")&&this.hardHandValue+ft<=mt)this.softHandValue=this.hardHandValue+ft}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>mt}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===O}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class q{cards;value;constructor(t){this.cards=t.map((a)=>E.fromValue(a)),this.value=new X(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((t)=>t.value)}toDto(){return{cards:this.cards.map((t)=>t.toDto()),value:this.highestHandValue}}}class Q extends q{otherCards;upCard;holeCard;constructor(t,a,r=[]){super([t,a,...r]);this.otherCards=r;this.upCard=E.fromValue(t),this.holeCard=E.fromValue(a)}static withInitialDeal(t){return new Q(t.upCard,t.holeCard)}addDrawnCards(t){return new Q(this.upCard.value,this.holeCard.value,[...this.otherCards,...t])}toDto(t=!1){if(t)return super.toDto();return{cards:[this.upCard.toDto()],value:new X([this.upCard]).highestHandValue}}}class N extends q{static withInitialDeal(t){return new N(t)}addDrawnCards(t){return new N([...this.rawValues,...t])}}var W=require("@betorigami/guard");class L{source;index=0;constructor(t){this.source=t}static from(t,a){return W.Guard.against(a<=0,`Count must be positive, got ${a}`),W.Guard.against(t.values.length!==a,`Expected ${a} values, got ${t.values.length}`),new L(t)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let t=this.source.values[this.index];return W.Guard.againstUndefined(t,"RandomValuePool exhausted"),this.index+=1,t}take(t){W.Guard.against(this.index+t>this.source.values.length,`RandomValuePool exhausted: requested ${t} but only ${this.source.values.length-this.index} remain`);let a=this.source.values.slice(this.index,this.index+t);return this.index+=t,a}}var Ga=require("@betorigami/guard"),Za=H(require("fast-deep-equal"));class Ct extends F{edge;constructor(t,a){super(t);this.edge=a}play(t,a,r=[]){let e=this.createGameStore(),n=this.generateRandomValues(t),o=n.toMultipleRandomValues();for(let u of r)e.send({...u.playerArgument,randomValuePool:n});let i=r[r.length-1];if(i)Ga.Guard.against(!Za.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({...a,randomValuePool:n});let c=e.getSnapshot().context;return{playerArgument:c.playerArgument,state:this.toExternalState(c.state),config:c.config,additionalBetAmount:c.additionalBetAmount,proof:{proofHash:o.proofHash,proofString:o.proofString}}}}var D=H(require("big.js"));var ht=require("@betorigami/guard");var ka=(t)=>{let a=t.pairBonus!==null?D.default(t.pairBonus.betAmount).mul(t.pairBonus.payoutMultiplier):D.default(0),r=t.threeCardBonus!==null?D.default(t.threeCardBonus.betAmount).mul(t.threeCardBonus.payoutMultiplier):D.default(0);return a.plus(r)},Fa=(t)=>{let a=t.betAmounts.mainBetAmount,e=t.actionType==="BLACKJACK_DOUBLE_DOWN"?a.mul(R):D.default(0),n=t.insuranceOutcome!==void 0?a.mul(M):D.default(0),o=a.plus(e).mul(z[t.outcome]),i=t.insuranceOutcome==="WON"?a.mul(Et):D.default(0),c=ka(t.sideBetResults),u=o.plus(i).plus(c),p=a.plus(n).plus(e).plus(t.betAmounts.pairBonusAmount).plus(t.betAmounts.threeCardBonusAmount);ht.Guard.against(p.eq(0),"Total bet amount cannot be zero");let s=u.div(p);ht.Guard.against(t.actionType==="BLACKJACK_SPLIT","SPLIT action type is not valid for standard multiplier calculation");let l;switch(t.actionType){case"BLACKJACK_DOUBLE_DOWN":l=e;break;case"BLACKJACK_BUY_INSURANCE":l=n;break;case"BLACKJACK_SPLIT":l=a.mul(j);break}return{multiplier:s,additionalBetAmount:l}},Ma=(t)=>{let a=t.betAmounts.mainBetAmount,r=t.mainHandDoubledDown?a.mul(R):D.default(0),e=t.splitHandDoubledDown?a.mul(R):D.default(0),n=t.insuranceOutcome!==void 0?a.mul(M):D.default(0),o=a.plus(r).mul(z[t.mainOutcome]),i=a.plus(e).mul(z[t.splitOutcome]),c=t.insuranceOutcome==="WON"?a.mul(Et):D.default(0),u=ka(t.sideBetResults),p=o.plus(i).plus(c).plus(u),s=a.plus(a).plus(n).plus(r).plus(e).plus(t.betAmounts.pairBonusAmount).plus(t.betAmounts.threeCardBonusAmount);ht.Guard.against(s.eq(0),"Total bet amount cannot be zero");let l=p.div(s),m;switch(t.actionType){case"BLACKJACK_DOUBLE_DOWN":m=a.mul(R);break;case"BLACKJACK_SPLIT":m=a.mul(j);break}return{multiplier:l,additionalBetAmount:m}};var Ja=require("@betorigami/guard"),kt=(t)=>t.every((a)=>a===t[0]),Ya=(t)=>{let a=[...t].sort((r,e)=>r-e);return a.every((r,e)=>{let n=a[e-1];if(e===0)return!0;return Ja.Guard.againstUndefined(n,"Previous value cannot be undefined"),r===n+1})},ga={Ace:1,Two:2,Three:3,Four:4,Five:5,Six:6,Seven:7,Eight:8,Nine:9,Ten:10,Jack:11,Queen:12,King:13},Jr={...ga,Ace:14},gr=(t)=>Ya(t.map((a)=>ga[a]))||Ya(t.map((a)=>Jr[a])),$a=(t,a)=>{let r=E.fromValue(t),e=E.fromValue(a);if(r.rank!==e.rank)return"LOSS";if(t===a)return"EXACT_PAIR";if(Gt[r.suit]===Gt[e.suit])return"COLORED_PAIR";return"MIXED_PAIR"},za=(t,a)=>({betAmount:t,result:a,payoutMultiplier:wt[a]}),Xa=(t,a,r)=>{let e=E.fromValue(t),n=E.fromValue(a),o=E.fromValue(r),i=[e.rank,n.rank,o.rank],c=kt([e.suit,n.suit,o.suit]),u=kt(i),p=gr(i);if(kt([t,a,r]))return"SUITED_TRIPS";if(c&&p)return"STRAIGHT_FLUSH";if(u)return"THREE_OF_A_KIND";if(p)return"STRAIGHT";if(c)return"FLUSH";return"LOSS"},qa=(t,a)=>({betAmount:t,result:a,payoutMultiplier:Ut[a]});var $r={state:{isFinished:!1,phase:"uninitialised",multiplier:_.default(0)},config:{},playerArgument:{type:"START",mainBetAmount:"0",pairBonusAmount:"0",threeCardBonusAmount:"0"}},S=(t)=>E.fromValue(t).value;function zr(t){B.Guard.against(t.phase!=="in-progress","Expected a started, in-progress game state")}function Qa(t){B.Guard.against(t.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}function Ft(t){B.Guard.against(t.phase!=="in-progress"&&t.phase!=="playing-main-hand"&&t.phase!=="playing-split-hand","Expected a started, in-progress game state")}var La=(t,a)=>{let r=a;while(r.highestHandValue<Nt)r=r.addDrawnCards([S(t.takeOne())]);return r},Yt=(t,a)=>{if(t.isBusted)return"LOSE";if(a.isBusted)return"WIN";let r=t.highestHandValue,e=a.highestHandValue;if(r>e)return"WIN";if(r<e)return"LOSE";return"PUSH"},C=(t)=>{let{multiplier:a,additionalBetAmount:r}=Fa({outcome:t.outcome,insuranceOutcome:t.insuranceOutcome,actionType:t.playerArgument.type,betAmounts:t.betAmounts,sideBetResults:t.sideBetResults});return{state:{isFinished:!0,phase:"finished",playerHand:t.playerHand,dealerHand:t.dealerHand,outcome:t.outcome,multiplier:a,randomValues:t.randomValuePool.consumedValues,insuranceOutcome:t.insuranceOutcome,sideBetResults:t.sideBetResults},config:{},playerArgument:t.playerArgument,additionalBetAmount:r}},Mt=(t)=>{let a=La(t.randomValuePool,t.dealerHand),r=Yt(t.playerHand,a);return C({...t,dealerHand:a,outcome:r})},P=(t)=>{let r=t.mainHand.isBusted&&t.splitHand.isBusted?t.dealerHand:La(t.randomValuePool,t.dealerHand),e=Yt(t.mainHand,r),n=Yt(t.splitHand,r),{multiplier:o,additionalBetAmount:i}=Ma({hasSplit:!0,mainOutcome:e,splitOutcome:n,insuranceOutcome:t.insuranceOutcome,mainHandDoubledDown:t.mainHandDoubledDown,splitHandDoubledDown:t.splitHandDoubledDown,actionType:t.playerArgument.type,betAmounts:t.betAmounts,sideBetResults:t.sideBetResults});return{state:{isFinished:!0,phase:"split-finished",mainHand:t.mainHand,splitHand:t.splitHand,dealerHand:r,mainOutcome:e,splitOutcome:n,multiplier:o,randomValues:t.randomValuePool.consumedValues,insuranceOutcome:t.insuranceOutcome,sideBetResults:t.sideBetResults},config:{},playerArgument:t.playerArgument,additionalBetAmount:i}};class Ka extends Ct{constructor(t){super("BLACKJACK",t)}generateRandomValues(t){return L.from(t.getRandomIntsWithReplacement({min:ja,max:Na,count:yt}),yt)}toExternalState(t){let a=t.phase;switch(a){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:t.multiplier,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:t.multiplier,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"playing-main-hand":return{isFinished:!1,phase:"playing-main-hand",multiplier:t.multiplier,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"playing-split-hand":return{isFinished:!1,phase:"playing-split-hand",multiplier:t.multiplier,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"finished":return{isFinished:!0,multiplier:t.multiplier,randomValues:t.randomValues,outcome:t.outcome,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!0),sideBetResults:t.sideBetResults,...t.insuranceOutcome!==void 0&&{insuranceOutcome:t.insuranceOutcome}};case"split-finished":return{isFinished:!0,multiplier:t.multiplier,randomValues:t.randomValues,mainOutcome:t.mainOutcome,splitOutcome:t.splitOutcome,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!0),sideBetResults:t.sideBetResults,...t.insuranceOutcome!==void 0&&{insuranceOutcome:t.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:B.Guard.againstNever(a,"Invalid state received")}}createGameStore(){return Wa.createStore({context:$r,on:{START:(t,a)=>{let{state:r}=t;B.Guard.against(r.phase!=="uninitialised","START action requires a fresh game");let e=S(a.randomValuePool.takeOne()),n=S(a.randomValuePool.takeOne()),o=S(a.randomValuePool.takeOne()),i=S(a.randomValuePool.takeOne()),c=N.withInitialDeal([e,n]),u=Q.withInitialDeal({upCard:o,holeCard:i}),p={mainBetAmount:_.default(a.mainBetAmount),pairBonusAmount:_.default(a.pairBonusAmount),threeCardBonusAmount:_.default(a.threeCardBonusAmount)},s={pairBonus:_.default(a.pairBonusAmount).gt(0)?za(a.pairBonusAmount,$a(e,n)):null,threeCardBonus:_.default(a.threeCardBonusAmount).gt(0)?qa(a.threeCardBonusAmount,Xa(e,n,o)):null},l={type:"START",mainBetAmount:a.mainBetAmount,pairBonusAmount:a.pairBonusAmount,threeCardBonusAmount:a.threeCardBonusAmount};if(u.upCard.rank==="Ace")return{state:{...r,isFinished:!1,phase:"awaiting-insurance",playerHand:c,dealerHand:u,betAmounts:p,sideBetResults:s},config:{},playerArgument:l};let m={playerHand:c,dealerHand:u,randomValuePool:a.randomValuePool,playerArgument:l,betAmounts:p,sideBetResults:s};if(c.isBlackjack&&u.isBlackjack)return C({...m,outcome:"PUSH"});if(c.isBlackjack)return C({...m,outcome:"PLAYER_BLACKJACK"});if(u.isBlackjack)return C({...m,outcome:"LOSE"});return{state:{...r,isFinished:!1,phase:"in-progress",playerHand:c,dealerHand:u,insuranceOutcome:void 0,betAmounts:p,sideBetResults:s},config:{},playerArgument:l}},BLACKJACK_BUY_INSURANCE:(t,a)=>{let{state:r}=t;Qa(r);let{playerHand:e,dealerHand:n,betAmounts:o,sideBetResults:i}=r,c={...r,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmounts:o,sideBetResults:i};if(e.isBlackjack&&n.isBlackjack)return C({...c,outcome:"PUSH",insuranceOutcome:"WON"});if(e.isBlackjack)return C({...c,outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST"});if(n.isBlackjack)return C({...c,outcome:"LOSE",insuranceOutcome:"WON"});return{state:{...r,phase:"in-progress",insuranceOutcome:"LOST"},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},additionalBetAmount:o.mainBetAmount.mul(M)}},BLACKJACK_REJECT_INSURANCE:(t,a)=>{let{state:r}=t;Qa(r);let{playerHand:e,dealerHand:n,betAmounts:o,sideBetResults:i}=r,c={playerHand:e,dealerHand:n,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"},betAmounts:o,sideBetResults:i};if(e.isBlackjack&&n.isBlackjack)return C({...c,outcome:"PUSH"});if(e.isBlackjack)return C({...c,outcome:"PLAYER_BLACKJACK"});if(n.isBlackjack)return C({...c,outcome:"LOSE"});return{state:{...r,phase:"in-progress",insuranceOutcome:void 0},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(t,a)=>{let{state:r}=t;switch(Ft(r),r.phase){case"playing-main-hand":{let e=r.mainHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted||e.highestHandValue===O){if(r.splitHand.highestHandValue===O)return P({...r,mainHand:e,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,phase:"playing-split-hand",mainHand:e,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}return{state:{...r,mainHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"playing-split-hand":{let e=r.splitHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted||e.highestHandValue===O)return P({...r,splitHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,splitHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"in-progress":{let e=r.playerHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted)return C({...r,playerHand:e,outcome:"LOSE",randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});if(e.highestHandValue===O)return Mt({...r,playerHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,phase:"in-progress",playerHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}default:B.Guard.againstNever(r,"Invalid phase for HIT action")}},BLACKJACK_STAND:(t,a)=>{let{state:r}=t;switch(Ft(r),r.phase){case"playing-main-hand":{if(r.splitHand.highestHandValue===O)return P({...r,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});return{state:{...r,phase:"playing-split-hand",splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_STAND"}}}case"playing-split-hand":return P({...r,splitHandDoubledDown:r.splitHandDoubledDown,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});case"in-progress":return Mt({...r,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});default:B.Guard.againstNever(r,"Invalid phase for STAND action")}},BLACKJACK_DOUBLE_DOWN:(t,a)=>{let{state:r}=t;switch(Ft(r),r.phase){case"playing-main-hand":{B.Guard.against(r.mainHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.mainHand.addDrawnCards([S(a.randomValuePool.takeOne())]),{betAmounts:n}=r;if(r.splitHand.highestHandValue===O)return P({...r,mainHand:e,mainHandDoubledDown:!0,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return{state:{...r,phase:"playing-split-hand",mainHand:e,mainHandDoubledDown:!0,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},additionalBetAmount:n.mainBetAmount.mul(R)}}case"playing-split-hand":{B.Guard.against(r.splitHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.splitHand.addDrawnCards([S(a.randomValuePool.takeOne())]);return P({...r,splitHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},splitHandDoubledDown:!0})}case"in-progress":{B.Guard.against(r.playerHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.playerHand.addDrawnCards([S(a.randomValuePool.takeOne())]);if(e.isBusted)return C({...r,playerHand:e,outcome:"LOSE",randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return Mt({...r,playerHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}})}default:B.Guard.againstNever(r,"Invalid phase for DOUBLE_DOWN action")}},BLACKJACK_SPLIT:(t,a)=>{let{state:r}=t;zr(r);let{playerHand:e,betAmounts:n,sideBetResults:o}=r;B.Guard.against(e.cards.length!==2,"Split is only allowed with exactly 2 cards");let i=e.cards[0],c=e.cards[1];B.Guard.againstUndefined(i,"First card is missing"),B.Guard.againstUndefined(c,"Second card is missing"),B.Guard.against(i.rank!==c.rank,"Split requires two cards of the same rank");let u=S(a.randomValuePool.takeOne()),p=S(a.randomValuePool.takeOne()),s=N.withInitialDeal([i.value,u]),l=N.withInitialDeal([c.value,p]);if(i.rank==="Ace")return P({...r,mainHand:s,splitHand:l,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},mainHandDoubledDown:!1,splitHandDoubledDown:!1});let I=s.highestHandValue===O,_t=l.highestHandValue===O;if(I&&_t)return P({mainHand:s,splitHand:l,dealerHand:r.dealerHand,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},insuranceOutcome:r.insuranceOutcome,mainHandDoubledDown:!1,splitHandDoubledDown:!1,betAmounts:n,sideBetResults:o});if(I)return{state:{...r,phase:"playing-split-hand",mainHand:s,splitHand:l,mainHandDoubledDown:!1,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:n.mainBetAmount.mul(j)};return{state:{...r,phase:"playing-main-hand",multiplier:_.default(0),mainHand:s,splitHand:l,mainHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:n.mainBetAmount.mul(j)}}}})}getValidNextActionTypes(t){if(t.isFinished)return[];switch(t.phase){case"awaiting-insurance":return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];case"playing-main-hand":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.mainHand.cards.length===2)a.push("BLACKJACK_DOUBLE_DOWN");return a}case"playing-split-hand":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.splitHand.cards.length===2)a.push("BLACKJACK_DOUBLE_DOWN");return a}case"player-turn":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.playerHand.cards.length===2){a.push("BLACKJACK_DOUBLE_DOWN");let r=t.playerHand.cards[0],e=t.playerHand.cards[1];if(B.Guard.againstUndefined(r,"First player card is missing"),B.Guard.againstUndefined(e,"Second player card is missing"),r.rank===e.rank)a.push("BLACKJACK_SPLIT")}return a}default:B.Guard.againstNever(t,"Invalid phase for getting valid actions")}}}var va=H(require("big.js"));class x{multipliers;constructor(t){this.multipliers=t}getMultipliers(t){let a=this.multipliers.get(t);if(a===void 0)throw new Error(`Multipliers for ${t} not found`);return a}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([t,a])=>({edge:t,multipliers:a}))}}var tr;((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"})(tr||={});var Xr={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},qr={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},Qr={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},Wr={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},Lr={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},ar=new x(new Map([[1,Xr],[2,qr],[3,Qr],[4,Wr],[8,Lr]])),Kr={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class rr extends A{constructor(){super("DIAMONDS")}determineGameResult({generator:t,edge:a}){let r=t.getRandomIntsWithReplacement({min:0,max:6,count:5}),e=ar.getMultipliers(a),n=r.values,o=this.calculatePayoutMultiplier(e,n);return{isFinished:!0,payoutMultiplier:va.default(o),outputs:{result:r.values},randomValues:r}}calculatePayoutMultiplier(t,a){let r=new Map;for(let o of a){let i=r.get(o)||0;r.set(o,i+1)}let e=[...r.values()].filter((o)=>o>1),n=this.classifyResult(e);return n===null?0:t[n]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[a,r]=t;if(a===void 0)return null;if(r===void 0){let e=Kr[a];if(e===void 0)throw new Error(`Unexpected single diamond repeat count: ${a}`);return e}return a===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}var gt=H(require("big.js"));var er;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(er||={});var Jt=1e4,nr=(t)=>{let a=t.direction==="ABOVE"?Jt-t.selectedValue:t.selectedValue;return new gt.default(a).div(Jt).mul(100)},or=(t,a)=>t.direction==="ABOVE"?a>t.selectedValue:a<t.selectedValue;class ir extends A{constructor(){super("DICE")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=t.getRandomInt({min:0,max:1e4}),n=nr(r);return{isFinished:!0,payoutMultiplier:or(r,e.value)?T.withWinChance(a,n):new gt.default(0),outputs:{result:e.values},randomValues:e}}}var Ar=H(require("big.js"));var K=require("@betorigami/guard");var $t;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})($t||={});var cr=[1,2,3,4,5,6,7,8,9,10],zt=(t)=>{return cr.includes(t)};var lr={[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]}},dr={[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]}},ur={[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]}},sr={[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]}},pr={[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]}},Xt=new x(new Map([[1,lr],[2,dr],[3,ur],[4,sr],[8,pr]]));class Br extends A{constructor(){super("KENO")}determineGameResult({generator:t,edge:a,gameInputs:r}){K.Guard.againstEmptyArray(r.selectedNumbers,()=>d.createValidationError("No numbers selected")),K.Guard.against(r.selectedNumbers.length>10,()=>d.createValidationError("Maximum of 10 numbers can be selected"));for(let l of r.selectedNumbers)K.Guard.againstNonInteger(l,()=>d.createValidationError("Only integers can be selected")),K.Guard.against(l<0||l>39,()=>d.createValidationError("Invalid number selected"));let e=t.getUniqueRandomInts({min:0,max:39,count:10}),n=r.selectedNumbers.filter((l)=>e.values.includes(l)),o=r.selectedNumbers.length;if(!zt(o))throw new Error(`Invalid tile count: ${o}`);let p=Xt.getMultipliers(a)[o][r.riskLevel][n.length];if(p===void 0)throw new Error(`No multiplier found for matching tile count ${n.length}`);return{isFinished:!0,payoutMultiplier:new Ar.default(p),outputs:{result:e.values},randomValues:e}}}var V=H(require("big.js"));var qt=(t,a)=>{return t.gt(a)?t:a};var Qt=(t,a)=>{return t.lt(a)?t:a};class mr extends A{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=t.getRandomInt({min:1,max:4294967295}),n=e.max,o=new V.default(16777216),i=new V.default(1),c=new V.default(1e6),u=e.value,p=new V.default(u-1).div(n),s=(100-a)/100,l=o.div(p.mul(o).plus(1)).mul(s),m=qt(i,Qt(l,c));return{isFinished:!0,payoutMultiplier:m.gte(r.targetMultiplier)?new V.default(r.targetMultiplier):new V.default(0),outputs:{randomMultiplier:m,result:e.values},randomValues:e}}}var v=H(require("big.js"));var Ht=(t,a)=>{if(a<0||t<0||a>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(a>t-a)a=t-a;let r=1;for(let e=1;e<=a;e++)r=r*(t-e+1)/e;return r};class yr extends A{constructor(){super("MINES")}determineGameResult({generator:t,edge:a,gameInputs:r}){if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>25-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let i=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),c=i.values.some((I)=>r.selectedTiles.includes(I)),u=r.hasCashedOut||c,p=(100-a)/100,s=new v.default(Ht(25-r.minesCount,r.selectedTiles.length)).div(new v.default(Ht(25,r.selectedTiles.length))),m=r.hasCashedOut&&!c?new v.default(p).div(s):new v.default(0);return{isFinished:u,payoutMultiplier:m,outputs:{result:i.values},randomValues:i}}}var Er=require("big.js");var Wt;((e)=>{e.LOW_RISK="LOW_RISK";e.MEDIUM_RISK="MEDIUM_RISK";e.HIGH_RISK="HIGH_RISK"})(Wt||={});var vr=[8,9,10,11,12,13,14,15,16],te={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]}},ae={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]}},re={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]}},ee={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]}},ne={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]}},Lt=new x(new Map([[1,te],[2,ae],[3,re],[4,ee],[8,ne]]));class fr extends A{constructor(){super("PLINKO")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(a.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(a.numberOfRows<8||a.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let e=a.numberOfRows,i=Lt.getMultipliers(r)[a.riskLevel][e],c=t.getRandomIntsWithReplacement({min:0,max:1,count:a.numberOfRows}),p=c.values.reduce((l,m)=>l+m,0),s=i[p];if(s===void 0)throw new Error(`No payout found for end position ${p}`);return{isFinished:!0,payoutMultiplier:Er.Big(s),outputs:{result:c.values},randomValues:c}}}var rt=require("big.js");var xt=[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],Kt=[37,...xt],vt=[[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]],ta=[[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]],aa=[[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]],ra=[[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]],ea=[[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]],na=[[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]],oa=[0,1,2,3,37],ia=[[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]],ca=[[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;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(w||={});var U;((r)=>{r.RED="RED";r.BLACK="BLACK"})(U||={});var G;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(G||={});var Z;((e)=>{e.TOP="TOP";e.MIDDLE="MIDDLE";e.BOTTOM="BOTTOM"})(Z||={});var k;((e)=>{e.FIRST="FIRST";e.SECOND="SECOND";e.THIRD="THIRD"})(k||={});var Tt;((r)=>{r.AMERICAN="AMERICAN";r.EUROPEAN="EUROPEAN"})(Tt||={});var Rt=(t)=>{if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw d.createValidationError("Must place at least a single bet.");if(!t.straightBets.every((a)=>a.amount.gte(0)&&tt(a.value)))throw d.createValidationError("Invalid straight bet.");if(!t.splitBets.every((a)=>a.amount.gte(0)&&oe(a.values)))throw d.createValidationError("Invalid split bet.");if(!t.streetBets.every((a)=>a.amount.gte(0)&&ie(a.values)))throw d.createValidationError("Invalid street bet.");if(!t.cornerBets.every((a)=>a.amount.gte(0)&&ce(a.values)))throw d.createValidationError("Invalid corner bet.");if(!t.doubleStreetBets.every((a)=>a.amount.gte(0)&&le(a.values)))throw d.createValidationError("Invalid double street bet.");if(!t.parityBets.every((a)=>a.amount.gte(0)&&Object.values(w).includes(a.parity)))throw d.createValidationError("Invalid parity bet.");if(!t.colorBets.every((a)=>a.amount.gte(0)&&Object.values(U).includes(a.color)))throw d.createValidationError("Invalid color bet.");if(!t.halfBets.every((a)=>a.amount.gte(0)&&Object.values(G).includes(a.half)))throw d.createValidationError("Invalid half bet.");if(!t.columnBets.every((a)=>a.amount.gte(0)&&Object.values(Z).includes(a.column)))throw d.createValidationError("Invalid column bet.");if(!t.dozenBets.every((a)=>a.amount.gte(0)&&Object.values(k).includes(a.dozen)))throw d.createValidationError("Invalid dozen bet.")},tt=(t)=>{return xt.includes(t)},oe=(t)=>{if(t.length!==2)return!1;if(!t.every(tt))return!1;return vt.some(([a,r])=>a===t[0]&&r===t[1])},ie=(t)=>{if(t.length!==3)return!1;if(!t.every(tt))return!1;return aa.some(([a,r,e])=>a===t[0]&&r===t[1]&&e===t[2])},ce=(t)=>{if(t.length!==4)return!1;if(!t.every(tt))return!1;return ea.some(([a,r,e,n])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3])},le=(t)=>{if(t.length!==6)return!1;if(!t.every(tt))return!1;return ia.some(([a,r,e,n,o,i])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3]&&o===t[4]&&i===t[5])};var Pt=(t)=>{if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw d.createValidationError("Must place at least a single bet.");if(!t.straightBets.every((a)=>a.amount.gte(0)&&at(a.value)))throw d.createValidationError("Invalid straight bet.");if(!t.splitBets.every((a)=>a.amount.gte(0)&&de(a.values)))throw d.createValidationError("Invalid split bet.");if(!t.streetBets.every((a)=>a.amount.gte(0)&&ue(a.values)))throw d.createValidationError("Invalid street bet.");if(!t.cornerBets.every((a)=>a.amount.gte(0)&&se(a.values)))throw d.createValidationError("Invalid corner bet.");if(!t.basketBets.every((a)=>a.amount.gte(0)))throw d.createValidationError("Invalid basket bet.");if(!t.doubleStreetBets.every((a)=>a.amount.gte(0)&&pe(a.values)))throw d.createValidationError("Invalid double street bet.");if(!t.parityBets.every((a)=>a.amount.gte(0)&&Object.values(w).includes(a.parity)))throw d.createValidationError("Invalid parity bet.");if(!t.colorBets.every((a)=>a.amount.gte(0)&&Object.values(U).includes(a.color)))throw d.createValidationError("Invalid color bet.");if(!t.halfBets.every((a)=>a.amount.gte(0)&&Object.values(G).includes(a.half)))throw d.createValidationError("Invalid half bet.");if(!t.columnBets.every((a)=>a.amount.gte(0)&&Object.values(Z).includes(a.column)))throw d.createValidationError("Invalid column bet.");if(!t.dozenBets.every((a)=>a.amount.gte(0)&&Object.values(k).includes(a.dozen)))throw d.createValidationError("Invalid dozen bet.")},at=(t)=>{return Kt.includes(t)};function de(t){if(t.length!==2)return!1;if(!t.every(at))return!1;return ta.some(([a,r])=>a===t[0]&&r===t[1])}var ue=(t)=>{if(t.length!==3)return!1;if(!t.every(at))return!1;return ra.some(([a,r,e])=>a===t[0]&&r===t[1]&&e===t[2])},se=(t)=>{if(t.length!==4)return!1;if(!t.every(at))return!1;return na.some(([a,r,e,n])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3])},pe=(t)=>{if(t.length!==6)return!1;if(!t.every(at))return!1;return ca.some(([a,r,e,n,o,i])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3]&&o===t[4]&&i===t[5])};var Sr={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},Or=[3,6,9,12,15,18,21,24,27,30,33,36],Dr=[2,5,8,11,14,17,20,23,26,29,32,35],Cr=[1,4,7,10,13,16,19,22,25,28,31,34],hr=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],Hr=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],xr=2.7,Tr=5.3;class la extends A{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:a}){this.validateInputs(a);let r=t.getRandomInt({min:0,max:this.maxNumber}),e=r.value,n=this.determineBetOutcomes(a,e),{payoutMultiplier:o}=this.getPayoutDetails(a,e);return{outputs:{betOutcomes:n,result:r.values},payoutMultiplier:o,isFinished:!0,randomValues:r}}getBetAmount(t){return this.calculateTotalBetAmount(this.getBetTotals(t))}getPayoutDetails(t,a){let r=this.determineBetOutcomes(t,a),e=this.getBetTotals(t),n=this.getBetTotals(r.winningBets),o=this.calculateTotalBetAmount(e),i=this.calculateTotalPayout(n);return{payoutMultiplier:o.gt(0)?i.div(o):new rt.Big(0),payoutAmount:i}}determineBetOutcomes(t,a){let r={},e={};for(let n of Object.keys(t)){let o=t[n],i=this.betPredicates[n],{winning:c,losing:u}=this.partitionBets(o,i,a);r[n]=c,e[n]=u}return{winningBets:r,losingBets:e}}calculateTotalAmount(t){return t.reduce((a,r)=>a.plus(r.amount),new rt.Big(0))}isWinningStraightBet(t,a){return t.value===a}isWinningSplitBet(t,a){return t.values.some((r)=>r===a)}isWinningStreetBet(t,a){return t.values.some((r)=>r===a)}isWinningCornerBet(t,a){return t.values.some((r)=>r===a)}isWinningDoubleStreetBet(t,a){return t.values.some((r)=>r===a)}isWinningColorBet(t,a){let r=t;return hr.includes(a)&&r.color==="RED"||Hr.includes(a)&&r.color==="BLACK"}isWinningHalfBet(t,a){let r=t;if(a>0&&a<=18&&r.half==="LOW")return!0;if(a>18&&a<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(t,a){let r=t;return Or.includes(a)&&r.column==="TOP"||Dr.includes(a)&&r.column==="MIDDLE"||Cr.includes(a)&&r.column==="BOTTOM"}isWinningDozenBet(t,a){let r=t;if(a>0&&a<=12&&r.dozen==="FIRST")return!0;if(a>12&&a<=24&&r.dozen==="SECOND")return!0;if(a>24&&a<=36&&r.dozen==="THIRD")return!0;return!1}isWinningParityBet(t,a){let r=t;if(a===0||a===37)return!1;let e=a%2===0?"EVEN":"ODD";return r.parity===e}getBetTotals(t){let a={};for(let r of Object.keys(t))a[r]=this.calculateTotalAmount(t[r]);return a}calculateTotalBetAmount(t){return Object.values(t).reduce((a,r)=>a.plus(r),new rt.Big(0))}partitionBets(t,a,r){return{winning:t.filter((e)=>a(e,r)),losing:t.filter((e)=>!a(e,r))}}calculateTotalPayout(t){return Object.entries(t).reduce((a,[r,e])=>{let o=Sr[r];return a.plus(e.mul(o||0))},new rt.Big(0))}}class da extends la{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(t){Rt(t)}}class ua extends la{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(t){Pt(t)}isWinningBasketBet(t,a){return oa.some((r)=>r===a)}}class sa extends A{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new da,this.americanGame=new ua}getBetAmount(t){switch(t.type){case"AMERICAN":return this.americanGame.getBetAmount(t.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(t.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(t){let{gameInputs:a,...r}=t;if(t.edge===xr&&a.type==="EUROPEAN"){let e=this.europeanGame.determineGameResult({...r,gameInputs:a.inputs}),{betOutcomes:n}=e.outputs;return{...e,outputs:{type:"european",betOutcomes:n,result:e.outputs.result}}}if(t.edge===Tr&&a.type==="AMERICAN"){let e=this.americanGame.determineGameResult({...r,gameInputs:a.inputs}),{betOutcomes:n}=e.outputs;return{...e,outputs:{type:"american",betOutcomes:n,result:e.outputs.result}}}throw d.createValidationError(`Attempted to play ${a.type} roulette on edge ${t.edge}`)}}var Ae=(t)=>{return new sa().getBetAmount(t)};var Be=(t)=>{if(t.type==="EUROPEAN")Rt(t.inputs);else Pt(t.inputs)};var _r=require("big.js");var Y;((e)=>{e.LOW_RISK="LOW_RISK";e.MEDIUM_RISK="MEDIUM_RISK";e.HIGH_RISK="HIGH_RISK"})(Y||={});var J;((o)=>{o[o.TEN=10]="TEN";o[o.TWENTY=20]="TWENTY";o[o.THIRTY=30]="THIRTY";o[o.FORTY=40]="FORTY";o[o.FIFTY=50]="FIFTY"})(J||={});var me={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}}},ye={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}}},Ee={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}}},fe={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}}},Se={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}}},Rr=new x(new Map([[1,me],[2,ye],[3,Ee],[4,fe],[8,Se]]));var Pr={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 Ir extends A{constructor(){super("WHEEL")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(!Object.values(J).includes(a.segments))throw new Error("Invalid segments value");if(!Object.values(Y).includes(a.riskLevel))throw new Error("Invalid risk level");let n=Rr.getMultipliers(r)[a.riskLevel];if(n===void 0)throw new Error(`No multipliers found for risk level ${a.riskLevel}`);let o=n[a.segments];if(o===void 0)throw new Error(`No multipliers found for segment ${a.segments}`);let i=Pr[a.riskLevel];if(i===void 0)throw new Error(`No patterns found for risk level ${a.riskLevel}`);let c=i[a.segments];if(c===void 0)throw new Error(`No patterns found for segment ${a.segments}`);let u=t.getRandomInt({min:0,max:c.length-1}),p=c[u.value];if(p===void 0)throw new Error(`No pattern found for segment ${a.segments} and value ${u.value}`);let s=o[p];if(s===void 0)throw new Error(`No payout found for picked segment ${p}`);return{isFinished:!0,payoutMultiplier:new _r.Big(s),outputs:{result:u.values},randomValues:u}}}
|
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,23 @@ export declare class GameError extends Error {
|
|
|
13
13
|
errorCode: GameErrorCode;
|
|
14
14
|
constructor(errorCode: GameErrorCode, message?: string);
|
|
15
15
|
}
|
|
16
|
+
export declare enum OrigamiGame {
|
|
17
|
+
DICE = "DICE",
|
|
18
|
+
MINES = "MINES",
|
|
19
|
+
KENO = "KENO",
|
|
20
|
+
LIMBO = "LIMBO",
|
|
21
|
+
ADVANCED_DICE = "ADVANCED_DICE",
|
|
22
|
+
BACCARAT = "BACCARAT",
|
|
23
|
+
DIAMONDS = "DIAMONDS",
|
|
24
|
+
PLINKO = "PLINKO",
|
|
25
|
+
ROULETTE = "ROULETTE",
|
|
26
|
+
WHEEL = "WHEEL",
|
|
27
|
+
BLACKJACK = "BLACKJACK"
|
|
28
|
+
}
|
|
29
|
+
export declare abstract class Game {
|
|
30
|
+
readonly gameId: OrigamiGame;
|
|
31
|
+
protected constructor(gameId: OrigamiGame);
|
|
32
|
+
}
|
|
16
33
|
export type Proof = {
|
|
17
34
|
proofHash: string;
|
|
18
35
|
proofString: string;
|
|
@@ -46,19 +63,6 @@ export interface RandomNumberGenerator {
|
|
|
46
63
|
count: number;
|
|
47
64
|
}): MultipleRandomValues;
|
|
48
65
|
}
|
|
49
|
-
export declare enum OrigamiGame {
|
|
50
|
-
DICE = "DICE",
|
|
51
|
-
MINES = "MINES",
|
|
52
|
-
KENO = "KENO",
|
|
53
|
-
LIMBO = "LIMBO",
|
|
54
|
-
ADVANCED_DICE = "ADVANCED_DICE",
|
|
55
|
-
BACCARAT = "BACCARAT",
|
|
56
|
-
DIAMONDS = "DIAMONDS",
|
|
57
|
-
PLINKO = "PLINKO",
|
|
58
|
-
ROULETTE = "ROULETTE",
|
|
59
|
-
WHEEL = "WHEEL",
|
|
60
|
-
BLACKJACK = "BLACKJACK"
|
|
61
|
-
}
|
|
62
66
|
export type EmptyGameOutput = {};
|
|
63
67
|
export interface GetGameResultRequest<TGameInputs> {
|
|
64
68
|
generator: RandomNumberGenerator;
|
|
@@ -73,8 +77,7 @@ export interface GameResult<TGameOutputs = EmptyGameOutput> {
|
|
|
73
77
|
};
|
|
74
78
|
randomValues: SingleRandomValue | MultipleRandomValues;
|
|
75
79
|
}
|
|
76
|
-
export declare abstract class
|
|
77
|
-
readonly gameId: OrigamiGame;
|
|
80
|
+
export declare abstract class SingleActionGame<TGameInputs, TGameOutputs = EmptyGameOutput> extends Game {
|
|
78
81
|
protected constructor(gameId: OrigamiGame);
|
|
79
82
|
getGameResult(request: GetGameResultRequest<TGameInputs>): GameResult<TGameOutputs>;
|
|
80
83
|
protected abstract determineGameResult(request: GetGameResultRequest<TGameInputs>): GameResult<TGameOutputs>;
|
|
@@ -113,7 +116,7 @@ export type RollBetweenTwo = {
|
|
|
113
116
|
export type AdvancedDiceInputs = RollBetween | RollOutside | RollBetweenTwo;
|
|
114
117
|
export declare const calculateAdvancedDiceWinChance: (gameInputs: AdvancedDiceInputs) => Big$1.Big;
|
|
115
118
|
export declare const validateAdvancedDiceInputs: (gameInputs: AdvancedDiceInputs) => void;
|
|
116
|
-
export declare class AdvancedDice extends
|
|
119
|
+
export declare class AdvancedDice extends SingleActionGame<AdvancedDiceInputs> {
|
|
117
120
|
constructor();
|
|
118
121
|
protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<AdvancedDiceInputs>): GameResult;
|
|
119
122
|
}
|
|
@@ -169,7 +172,7 @@ export interface BaccaratGameOutputs {
|
|
|
169
172
|
gameOutcome: BaccaratOutcome;
|
|
170
173
|
}
|
|
171
174
|
export declare const calculateBaccaratBetAmount: (gameInputs: BaccaratGameInputs) => Big$1;
|
|
172
|
-
export declare class Baccarat extends
|
|
175
|
+
export declare class Baccarat extends SingleActionGame<BaccaratGameInputs, BaccaratGameOutputs> {
|
|
173
176
|
constructor();
|
|
174
177
|
protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<BaccaratGameInputs>): GameResult<BaccaratGameOutputs>;
|
|
175
178
|
private validateGameInputs;
|
|
@@ -232,6 +235,39 @@ export declare enum BlackjackActionType {
|
|
|
232
235
|
DOUBLE_DOWN = "BLACKJACK_DOUBLE_DOWN",
|
|
233
236
|
SPLIT = "BLACKJACK_SPLIT"
|
|
234
237
|
}
|
|
238
|
+
export declare enum PairBonusType {
|
|
239
|
+
EXACT_PAIR = "EXACT_PAIR",
|
|
240
|
+
COLORED_PAIR = "COLORED_PAIR",
|
|
241
|
+
MIXED_PAIR = "MIXED_PAIR",
|
|
242
|
+
LOSS = "LOSS"
|
|
243
|
+
}
|
|
244
|
+
export declare enum ThreeCardBonusType {
|
|
245
|
+
SUITED_TRIPS = "SUITED_TRIPS",
|
|
246
|
+
STRAIGHT_FLUSH = "STRAIGHT_FLUSH",
|
|
247
|
+
THREE_OF_A_KIND = "THREE_OF_A_KIND",
|
|
248
|
+
STRAIGHT = "STRAIGHT",
|
|
249
|
+
FLUSH = "FLUSH",
|
|
250
|
+
LOSS = "LOSS"
|
|
251
|
+
}
|
|
252
|
+
export type BetAmounts = Readonly<{
|
|
253
|
+
mainBetAmount: Big$1;
|
|
254
|
+
pairBonusAmount: Big$1;
|
|
255
|
+
threeCardBonusAmount: Big$1;
|
|
256
|
+
}>;
|
|
257
|
+
export type PairBonusResult = Readonly<{
|
|
258
|
+
betAmount: string;
|
|
259
|
+
payoutMultiplier: number;
|
|
260
|
+
result: PairBonusType;
|
|
261
|
+
}>;
|
|
262
|
+
export type ThreeCardBonusResult = Readonly<{
|
|
263
|
+
betAmount: string;
|
|
264
|
+
payoutMultiplier: number;
|
|
265
|
+
result: ThreeCardBonusType;
|
|
266
|
+
}>;
|
|
267
|
+
export type SideBetResults = Readonly<{
|
|
268
|
+
pairBonus: PairBonusResult | null;
|
|
269
|
+
threeCardBonus: ThreeCardBonusResult | null;
|
|
270
|
+
}>;
|
|
235
271
|
export declare const BLACKJACK_MULTIPLIER = 2.5;
|
|
236
272
|
export declare const WIN_MULTIPLIER = 2;
|
|
237
273
|
export declare const PUSH_MULTIPLIER = 1;
|
|
@@ -249,6 +285,8 @@ export declare const CARDS_PER_SUIT = 13;
|
|
|
249
285
|
export declare const ACE_SOFT_BONUS = 10;
|
|
250
286
|
export declare const FACE_CARD_VALUE = 10;
|
|
251
287
|
export declare const BASE_PAYOUT_MULTIPLIERS: Record<BlackjackOutcome, number>;
|
|
288
|
+
export declare const PAIR_BONUS_PAYOUTS: Record<PairBonusType, number>;
|
|
289
|
+
export declare const THREE_CARD_BONUS_PAYOUTS: Record<ThreeCardBonusType, number>;
|
|
252
290
|
declare class Card$1 {
|
|
253
291
|
readonly value: CardValue;
|
|
254
292
|
constructor(rawValue: number);
|
|
@@ -313,11 +351,11 @@ export declare class RandomValuePool {
|
|
|
313
351
|
}
|
|
314
352
|
export type BaseInProgressState = Readonly<{
|
|
315
353
|
isFinished: false;
|
|
316
|
-
multiplier:
|
|
354
|
+
multiplier: Big$1;
|
|
317
355
|
}>;
|
|
318
356
|
export type BaseFinishedState = Readonly<{
|
|
319
357
|
isFinished: true;
|
|
320
|
-
multiplier:
|
|
358
|
+
multiplier: Big$1;
|
|
321
359
|
randomValues: number[];
|
|
322
360
|
}>;
|
|
323
361
|
export type BaseGameState = BaseInProgressState | BaseFinishedState;
|
|
@@ -325,7 +363,7 @@ export type GameContext<TAction, TState extends BaseGameState, TConfig> = {
|
|
|
325
363
|
readonly playerArgument: TAction;
|
|
326
364
|
readonly state: TState;
|
|
327
365
|
readonly config: TConfig;
|
|
328
|
-
readonly
|
|
366
|
+
readonly additionalBetAmount?: Big$1;
|
|
329
367
|
};
|
|
330
368
|
export type RandomValuePoolEvent = Readonly<{
|
|
331
369
|
randomValuePool: RandomValuePool;
|
|
@@ -344,11 +382,11 @@ export interface GameStore<TInternalState extends BaseGameState, TAction, TConfi
|
|
|
344
382
|
readonly context: GameContext<TAction, TInternalState, TConfig>;
|
|
345
383
|
};
|
|
346
384
|
}
|
|
347
|
-
declare abstract class
|
|
385
|
+
export declare abstract class MultiActionGame<TInternalState extends BaseGameState, TExternalState extends BaseGameState, TAction extends {
|
|
348
386
|
readonly type: string;
|
|
349
|
-
}, TConfig> {
|
|
387
|
+
}, TConfig> extends Game {
|
|
350
388
|
readonly edge: number;
|
|
351
|
-
constructor(edge: number);
|
|
389
|
+
constructor(gameId: OrigamiGame, edge: number);
|
|
352
390
|
abstract getValidNextActionTypes(state: TExternalState): ReadonlyArray<TAction["type"]>;
|
|
353
391
|
protected abstract createGameStore(): GameStore<TInternalState, TAction, TConfig>;
|
|
354
392
|
protected abstract generateRandomValues(generator: RandomNumberGenerator): RandomValuePool;
|
|
@@ -359,6 +397,9 @@ declare abstract class NewGame<TInternalState extends BaseGameState, TExternalSt
|
|
|
359
397
|
}
|
|
360
398
|
export type BlackjackStartAction = Readonly<{
|
|
361
399
|
type: BlackjackActionType.START;
|
|
400
|
+
mainBetAmount: string;
|
|
401
|
+
pairBonusAmount: string;
|
|
402
|
+
threeCardBonusAmount: string;
|
|
362
403
|
}>;
|
|
363
404
|
export type BlackjackHitAction = Readonly<{
|
|
364
405
|
type: BlackjackActionType.HIT;
|
|
@@ -382,6 +423,7 @@ export type BlackjackAction = BlackjackStartAction | BlackjackHitAction | Blackj
|
|
|
382
423
|
export type BlackjackSingleHandStateBase = Readonly<{
|
|
383
424
|
playerHand: BlackjackHandDto;
|
|
384
425
|
dealerHand: BlackjackHandDto;
|
|
426
|
+
sideBetResults: SideBetResults;
|
|
385
427
|
}>;
|
|
386
428
|
export type BlackjackAwaitingInsuranceState = Simplify<BlackjackSingleHandStateBase & BaseInProgressState & {
|
|
387
429
|
phase: "awaiting-insurance";
|
|
@@ -393,6 +435,7 @@ export type BlackjackSplitHandStateBase = Readonly<{
|
|
|
393
435
|
mainHand: BlackjackHandDto;
|
|
394
436
|
splitHand: BlackjackHandDto;
|
|
395
437
|
dealerHand: BlackjackHandDto;
|
|
438
|
+
sideBetResults: SideBetResults;
|
|
396
439
|
}>;
|
|
397
440
|
export type BlackjackPlayingMainHandState = Simplify<BlackjackSplitHandStateBase & BaseInProgressState & {
|
|
398
441
|
phase: "playing-main-hand";
|
|
@@ -418,12 +461,16 @@ export type BlackjackInternalAwaitingInsuranceState = BaseInProgressState & {
|
|
|
418
461
|
readonly phase: "awaiting-insurance";
|
|
419
462
|
readonly playerHand: PlayerHand;
|
|
420
463
|
readonly dealerHand: DealerHand;
|
|
464
|
+
readonly betAmounts: BetAmounts;
|
|
465
|
+
readonly sideBetResults: SideBetResults;
|
|
421
466
|
};
|
|
422
467
|
export type BlackjackInternalInProgressState = BaseInProgressState & {
|
|
423
468
|
readonly phase: "in-progress";
|
|
424
469
|
readonly playerHand: PlayerHand;
|
|
425
470
|
readonly dealerHand: DealerHand;
|
|
426
471
|
readonly insuranceOutcome: InsuranceOutcome | undefined;
|
|
472
|
+
readonly betAmounts: BetAmounts;
|
|
473
|
+
readonly sideBetResults: SideBetResults;
|
|
427
474
|
};
|
|
428
475
|
export type BlackjackInternalPlayingMainHandState = BaseInProgressState & {
|
|
429
476
|
readonly phase: "playing-main-hand";
|
|
@@ -432,6 +479,8 @@ export type BlackjackInternalPlayingMainHandState = BaseInProgressState & {
|
|
|
432
479
|
readonly dealerHand: DealerHand;
|
|
433
480
|
readonly insuranceOutcome: InsuranceOutcome | undefined;
|
|
434
481
|
readonly mainHandDoubledDown: boolean;
|
|
482
|
+
readonly betAmounts: BetAmounts;
|
|
483
|
+
readonly sideBetResults: SideBetResults;
|
|
435
484
|
};
|
|
436
485
|
export type BlackjackInternalPlayingSplitHandState = BaseInProgressState & {
|
|
437
486
|
readonly phase: "playing-split-hand";
|
|
@@ -441,6 +490,8 @@ export type BlackjackInternalPlayingSplitHandState = BaseInProgressState & {
|
|
|
441
490
|
readonly insuranceOutcome: InsuranceOutcome | undefined;
|
|
442
491
|
readonly mainHandDoubledDown: boolean;
|
|
443
492
|
readonly splitHandDoubledDown: boolean;
|
|
493
|
+
readonly betAmounts: BetAmounts;
|
|
494
|
+
readonly sideBetResults: SideBetResults;
|
|
444
495
|
};
|
|
445
496
|
export type BlackjackInternalFinishedState = BaseFinishedState & {
|
|
446
497
|
readonly phase: "finished";
|
|
@@ -448,6 +499,7 @@ export type BlackjackInternalFinishedState = BaseFinishedState & {
|
|
|
448
499
|
readonly dealerHand: DealerHand;
|
|
449
500
|
readonly outcome: BlackjackOutcome;
|
|
450
501
|
readonly insuranceOutcome?: InsuranceOutcome;
|
|
502
|
+
readonly sideBetResults: SideBetResults;
|
|
451
503
|
};
|
|
452
504
|
export type BlackjackInternalSplitFinishedState = BaseFinishedState & {
|
|
453
505
|
readonly phase: "split-finished";
|
|
@@ -457,10 +509,12 @@ export type BlackjackInternalSplitFinishedState = BaseFinishedState & {
|
|
|
457
509
|
readonly mainOutcome: BlackjackOutcome;
|
|
458
510
|
readonly splitOutcome: BlackjackOutcome;
|
|
459
511
|
readonly insuranceOutcome?: InsuranceOutcome;
|
|
512
|
+
readonly sideBetResults: SideBetResults;
|
|
460
513
|
};
|
|
461
514
|
export type BlackjackInternalState = BlackjackInternalUninitialisedState | BlackjackInternalAwaitingInsuranceState | BlackjackInternalInProgressState | BlackjackInternalPlayingMainHandState | BlackjackInternalPlayingSplitHandState | BlackjackInternalFinishedState | BlackjackInternalSplitFinishedState;
|
|
462
515
|
export type BlackjackGameContext = GameContext<BlackjackAction, BlackjackState, BlackjackConfig>;
|
|
463
|
-
export declare class Blackjack extends
|
|
516
|
+
export declare class Blackjack extends MultiActionGame<BlackjackInternalState, BlackjackState, BlackjackAction, BlackjackConfig> {
|
|
517
|
+
constructor(edge: number);
|
|
464
518
|
protected generateRandomValues(generator: RandomNumberGenerator): RandomValuePool;
|
|
465
519
|
protected toExternalState(internal: BlackjackInternalState): BlackjackState;
|
|
466
520
|
protected createGameStore(): GameStore<BlackjackInternalState, BlackjackAction, BlackjackConfig>;
|
|
@@ -487,7 +541,7 @@ export declare enum DiamondsResultType {
|
|
|
487
541
|
}
|
|
488
542
|
export type DiamondsMultipliers = Record<keyof typeof DiamondsResultType, number>;
|
|
489
543
|
export declare const diamondsMultipliers: MultiplierContainer<DiamondsMultipliers>;
|
|
490
|
-
export declare class Diamonds extends
|
|
544
|
+
export declare class Diamonds extends SingleActionGame<DiamondsGameInputs> {
|
|
491
545
|
constructor();
|
|
492
546
|
protected determineGameResult({ generator, edge }: GetGameResultRequest<DiamondsGameInputs>): GameResult;
|
|
493
547
|
private calculatePayoutMultiplier;
|
|
@@ -504,7 +558,7 @@ export interface DiceGameInputs {
|
|
|
504
558
|
export declare const DICE_EFFECTIVE_RANGE = 10000;
|
|
505
559
|
export declare const calculateDiceWinChance: (gameInputs: DiceGameInputs) => Big$1;
|
|
506
560
|
export declare const hasDiceWon: (gameInputs: DiceGameInputs, rolledValue: number) => boolean;
|
|
507
|
-
export declare class Dice extends
|
|
561
|
+
export declare class Dice extends SingleActionGame<DiceGameInputs> {
|
|
508
562
|
constructor();
|
|
509
563
|
protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<DiceGameInputs>): GameResult;
|
|
510
564
|
}
|
|
@@ -532,7 +586,7 @@ export interface KenoGameInputs {
|
|
|
532
586
|
riskLevel: KenoRiskLevel;
|
|
533
587
|
selectedNumbers: number[];
|
|
534
588
|
}
|
|
535
|
-
export declare class Keno extends
|
|
589
|
+
export declare class Keno extends SingleActionGame<KenoGameInputs> {
|
|
536
590
|
constructor();
|
|
537
591
|
protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<KenoGameInputs>): GameResult;
|
|
538
592
|
}
|
|
@@ -549,7 +603,7 @@ export interface LimboGameInputs {
|
|
|
549
603
|
export interface LimboGameOutputs {
|
|
550
604
|
randomMultiplier: Big$1;
|
|
551
605
|
}
|
|
552
|
-
export declare class Limbo extends
|
|
606
|
+
export declare class Limbo extends SingleActionGame<LimboGameInputs, LimboGameOutputs> {
|
|
553
607
|
constructor();
|
|
554
608
|
protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<LimboGameInputs>): GameResult<LimboGameOutputs>;
|
|
555
609
|
}
|
|
@@ -558,7 +612,7 @@ export interface MinesGameInputs {
|
|
|
558
612
|
selectedTiles: number[];
|
|
559
613
|
hasCashedOut: boolean;
|
|
560
614
|
}
|
|
561
|
-
export declare class Mines extends
|
|
615
|
+
export declare class Mines extends SingleActionGame<MinesGameInputs> {
|
|
562
616
|
constructor();
|
|
563
617
|
protected determineGameResult({ generator, edge, gameInputs }: GetGameResultRequest<MinesGameInputs>): GameResult;
|
|
564
618
|
}
|
|
@@ -571,7 +625,7 @@ export interface PlinkoGameInputs {
|
|
|
571
625
|
numberOfRows: number;
|
|
572
626
|
riskLevel: PlinkoRiskLevel;
|
|
573
627
|
}
|
|
574
|
-
export declare class Plinko extends
|
|
628
|
+
export declare class Plinko extends SingleActionGame<PlinkoGameInputs> {
|
|
575
629
|
constructor();
|
|
576
630
|
protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<PlinkoGameInputs>): GameResult;
|
|
577
631
|
}
|
|
@@ -1932,7 +1986,7 @@ declare abstract class BaseRoulette<TInputs extends {
|
|
|
1932
1986
|
losingBets: TInputs;
|
|
1933
1987
|
};
|
|
1934
1988
|
result: number[];
|
|
1935
|
-
}> extends
|
|
1989
|
+
}> extends SingleActionGame<TInputs, TOutputs> {
|
|
1936
1990
|
protected abstract readonly maxNumber: number;
|
|
1937
1991
|
constructor();
|
|
1938
1992
|
determineGameResult({ generator, gameInputs }: GetGameResultRequest<TInputs>): GameResult<TOutputs>;
|
|
@@ -1976,7 +2030,7 @@ export declare class AmericanRoulette extends BaseRoulette<AmericanRouletteGameI
|
|
|
1976
2030
|
protected validateInputs(inputs: AmericanRouletteGameInputs): void;
|
|
1977
2031
|
protected isWinningBasketBet(_bet: BaseBet, gameResult: number): boolean;
|
|
1978
2032
|
}
|
|
1979
|
-
export declare class Roulette extends
|
|
2033
|
+
export declare class Roulette extends SingleActionGame<RouletteGameInputs, RouletteGameOutputs> {
|
|
1980
2034
|
private readonly europeanGame;
|
|
1981
2035
|
private readonly americanGame;
|
|
1982
2036
|
constructor();
|
|
@@ -2001,7 +2055,7 @@ export interface WheelGameInputs {
|
|
|
2001
2055
|
segments: WheelSegments;
|
|
2002
2056
|
riskLevel: WheelRiskLevel;
|
|
2003
2057
|
}
|
|
2004
|
-
export declare class Wheel extends
|
|
2058
|
+
export declare class Wheel extends SingleActionGame<WheelGameInputs> {
|
|
2005
2059
|
constructor();
|
|
2006
2060
|
protected determineGameResult({ generator, gameInputs, edge }: GetGameResultRequest<WheelGameInputs>): GameResult;
|
|
2007
2061
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var _E;((E)=>E.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(_E||={});class c extends Error{static createValidationError(r){return new c("INPUT_VALIDATION_ERROR",r)}static isGameError(r){return r instanceof c}errorCode;constructor(r,E){super(E);this.errorCode=r}}var w;((D)=>{D.DICE="DICE";D.MINES="MINES";D.KENO="KENO";D.LIMBO="LIMBO";D.ADVANCED_DICE="ADVANCED_DICE";D.BACCARAT="BACCARAT";D.DIAMONDS="DIAMONDS";D.PLINKO="PLINKO";D.ROULETTE="ROULETTE";D.WHEEL="WHEEL";D.BLACKJACK="BLACKJACK"})(w||={});class S{gameId;constructor(r){this.gameId=r}getGameResult(r){return this.determineGameResult(r)}}import{Big as zr}from"big.js";import Or from"big.js";class Y{static withMultiplier(r,E){return new Or(r).times(new Or(100-E).div(100))}static withWinChance(r,E){return Or(100-r).div(E)}}var Br=0,cr=1e4,Yr=10001,CE=0.01,UE=98,GE=(r)=>{if(r<Br)throw c.createValidationError(`Lower bound ${r} is below minimum allowed value ${Br}`)},TE=(r)=>{if(r>cr)throw c.createValidationError(`Upper bound ${r} is above maximum allowed value ${cr}`)},l=(r)=>{if(GE(r.lower),TE(r.upper),r.lower>=r.upper)throw c.createValidationError(`Lower bound ${r.lower} must be less than ${r.upper}`)},ME=(r,E)=>{let[A,t]=r.lower<=E.lower?[r,E]:[E,r];if(A.upper>t.lower)throw c.createValidationError("Bounds must not overlap")},bE=(r,E)=>E>=r.lower&&E<=r.upper,wE=(r)=>r.upper-r.lower+1,or=(r,E)=>E>r.lower&&E<r.upper,xr=(r)=>r.upper-r.lower-1,hE;((t)=>{t.ROLL_BETWEEN="ROLL_BETWEEN";t.ROLL_OUTSIDE="ROLL_OUTSIDE";t.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(hE||={});var $r=(r)=>{let A=(()=>{switch(r.mode){case"ROLL_BETWEEN":return l(r.bounds),xr(r.bounds);case"ROLL_OUTSIDE":return l(r.bounds),Yr-wE(r.bounds);case"ROLL_BETWEEN_TWO":return l(r.firstBounds),l(r.secondBounds),ME(r.firstBounds,r.secondBounds),xr(r.firstBounds)+xr(r.secondBounds)}})(),t=zr(A).div(Yr).mul(100);if(t.lt(CE))throw c.createValidationError("Win chance too low");if(t.gt(UE))throw c.createValidationError("Win chance too high");return t},e1=(r)=>{$r(r)};class uE extends S{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:r,edge:E,gameInputs:A}){let t=$r(A),f=r.getRandomInt({min:Br,max:cr}),O=f.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(A.mode){case"ROLL_BETWEEN":return or(A.bounds,O);case"ROLL_OUTSIDE":return!bE(A.bounds,O);case"ROLL_BETWEEN_TWO":return or(A.firstBounds,O)||or(A.secondBounds,O)}})()?Y.withWinChance(E,t):new zr(0),outputs:{result:f.values},randomValues:f}}}import p from"big.js";var VE=["Clubs","Diamonds","Hearts","Spades"],yE=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],YE;((t)=>{t.PLAYER_WIN="PLAYER_WIN";t.TIE="TIE";t.BANKER_WIN="BANKER_WIN"})(YE||={});var zE;((t)=>{t.PLAYER="PLAYER";t.TIE="TIE";t.BANKER="BANKER"})(zE||={});var $E={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},pE=(r)=>{return new p(0).add(r.bets.reduce((A,t)=>A.add(t.amount),new p(0)))};class PE extends S{constructor(){super("BACCARAT")}determineGameResult({generator:r,gameInputs:E,edge:A}){if(A!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(E);let t=r.getRandomIntsWithReplacement({min:0,max:51,count:6}),f=t.values,O=f.slice(0,3),o=f.slice(3,6),x=[],B=0;for(let C of O.slice(0,2)){let b=this.mapRandomValueToCard(C),g=this.mapRandomValueToCardValue(C);x.push(b),B=(B+g)%10}let Z=[],N=0;for(let C of o.slice(0,2)){let b=this.mapRandomValueToCard(C),g=this.mapRandomValueToCardValue(C);Z.push(b),N=(N+g)%10}if(!this.isNaturalWin(B,N)){let C=this.shouldDrawThirdPlayerCard(B),b=null;if(C)b=this.mapRandomValueToCardValue(O[2]),x.push(this.mapRandomValueToCard(O[2])),B=(B+b)%10;if(this.shouldDrawThirdBankerCard(N,b))Z.push(this.mapRandomValueToCard(o[2])),N=(N+this.mapRandomValueToCardValue(o[2]))%10}let D;if(B===N)D="TIE";else D=B>N?"PLAYER_WIN":"BANKER_WIN";let M=pE(E),{betType:v,multiplier:NE}=$E[D],Q=new p(0);if(Q=Q.add(E.bets.filter((C)=>C.type===v).reduce((C,b)=>C.add(b.amount.mul(NE)),new p(0))),D==="TIE")Q=Q.add(E.bets.filter((C)=>C.type==="PLAYER"||C.type==="BANKER").reduce((C,b)=>C.add(b.amount),new p(0)));return{isFinished:!0,payoutMultiplier:M.gt(0)?Q.div(M):new p(0),outputs:{playerCards:x,playerHandValue:B,bankerCards:Z,bankerHandValue:N,gameOutcome:D,result:t.values},randomValues:t}}validateGameInputs(r){if(r.bets.length===0)throw new Error("Must place at least a single bet.");if(!r.bets.every((E)=>E.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(r){let E=VE[Math.floor(r/13)],A=yE[r%13];return{suit:E,rank:A}}isNaturalWin(r,E){let A=[8,9];return A.includes(r)||A.includes(E)}mapRandomValueToCardValue(r){let E=r%13;if(E===0)return 1;if(E>=10)return 10;return E+1}shouldDrawThirdPlayerCard(r){return r<=5}shouldDrawThirdBankerCard(r,E){if(E===null)return r<=5;if(r<=2)return!0;if(r===3)return E!==8;if(r===4)return[2,3,4,5,6,7].includes(E);if(r===5)return[4,5,6,7].includes(E);if(r===6)return[6,7].includes(E);return!1}}var Dr;((f)=>{f.WIN="WIN";f.LOSE="LOSE";f.PUSH="PUSH";f.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(Dr||={});var Zr;((A)=>{A.WON="WON";A.LOST="LOST"})(Zr||={});var Sr;((x)=>{x.START="START";x.HIT="BLACKJACK_HIT";x.STAND="BLACKJACK_STAND";x.BUY_INSURANCE="BLACKJACK_BUY_INSURANCE";x.REJECT_INSURANCE="BLACKJACK_REJECT_INSURANCE";x.DOUBLE_DOWN="BLACKJACK_DOUBLE_DOWN";x.SPLIT="BLACKJACK_SPLIT"})(Sr||={});var FE=2.5,JE=2,RE=1,qE=0,pr=17,Nr=21,h=21,_r=63,o2=1.5,X=0.5,Pr=1.5,z=1,d=1,x2=13,Cr=10,Fr=10,k={PLAYER_BLACKJACK:FE,WIN:JE,PUSH:RE,LOSE:qE};import{Guard as _}from"@betorigami/guard";import{createStore as dE}from"@xstate/store";var Jr=0,Rr=51,s=Array.from({length:52},(r,E)=>E),qr=["Spades","Hearts","Diamonds","Clubs"],a=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],Ir=["Jack","Queen","King"];import{Guard as IE}from"@betorigami/guard";import{Guard as Ur}from"@betorigami/guard";class Gr{value;constructor(r){let E=s[r];Ur.againstNullOrUndefined(E,`Invalid card value: ${r}`),this.value=E}get suit(){let r=Math.floor(this.value/13),E=qr[r];return Ur.againstNullOrUndefined(E,`Invalid suit index: ${r}`),E}get rank(){let r=this.value%13,E=a[r];return Ur.againstNullOrUndefined(E,`Invalid rank index: ${r}`),E}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class u extends Gr{get numericRank(){if(Ir.includes(this.rank))return Fr;return a.indexOf(this.rank)+1}static fromValue(r){return IE.against(!s.includes(r),`Invalid card value: ${r}`),new u(r)}}class j{cards;hardHandValue;softHandValue=null;constructor(r){this.cards=r;if(this.hardHandValue=r.reduce((A,t)=>A+t.numericRank,0),r.some((A)=>A.rank==="Ace")&&this.hardHandValue+Cr<=Nr)this.softHandValue=this.hardHandValue+Cr}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>Nr}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===h}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class i{cards;value;constructor(r){this.cards=r.map((E)=>u.fromValue(E)),this.value=new j(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 m extends i{otherCards;upCard;holeCard;constructor(r,E,A=[]){super([r,E,...A]);this.otherCards=A;this.upCard=u.fromValue(r),this.holeCard=u.fromValue(E)}static withInitialDeal(r){return new m(r.upCard,r.holeCard)}addDrawnCards(r){return new m(this.upCard.value,this.holeCard.value,[...this.otherCards,...r])}toDto(r=!1){if(r)return super.toDto();return{cards:[this.upCard.toDto()],value:new j([this.upCard]).highestHandValue}}}class $ extends i{static withInitialDeal(r){return new $(r)}addDrawnCards(r){return new $([...this.rawValues,...r])}}import{Guard as n}from"@betorigami/guard";class e{source;index=0;constructor(r){this.source=r}static from(r,E){return n.against(E<=0,`Count must be positive, got ${E}`),n.against(r.values.length!==E,`Expected ${E} values, got ${r.values.length}`),new e(r)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let r=this.source.values[this.index];return n.againstUndefined(r,"RandomValuePool exhausted"),this.index+=1,r}take(r){n.against(this.index+r>this.source.values.length,`RandomValuePool exhausted: requested ${r} but only ${this.source.values.length-this.index} remain`);let E=this.source.values.slice(this.index,this.index+r);return this.index+=r,E}}import{Guard as QE}from"@betorigami/guard";import XE from"fast-deep-equal";class Tr{edge;constructor(r){this.edge=r}play(r,E,A=[]){let t=this.createGameStore(),f=this.generateRandomValues(r),O=f.toMultipleRandomValues();for(let B of A)t.send({...B.playerArgument,randomValuePool:f});let o=A[A.length-1];if(o)QE.against(!XE(o.state,this.toExternalState(t.getSnapshot().context.state)),"The final state of the game does not match the expected state based on the previous actions");t.send({...E,randomValuePool:f});let x=t.getSnapshot().context;return{playerArgument:x.playerArgument,state:this.toExternalState(x.state),config:x.config,betAmountMultiplier:x.betAmountMultiplier,proof:{proofHash:O.proofHash,proofString:O.proofString}}}}import U from"big.js";var Qr={BLACKJACK_DOUBLE_DOWN:z,BLACKJACK_BUY_INSURANCE:X,BLACKJACK_SPLIT:d},Xr=(r)=>r==="WON"?U(Pr):U(0),dr=(r)=>r!==void 0?U(X):U(0),jr=(r)=>{let E=r.actionType==="BLACKJACK_DOUBLE_DOWN",A=U(1),t=E?U(z):U(0),f=dr(r.insuranceOutcome),O=A.plus(t).plus(f),o=A.plus(t),x=U(k[r.outcome]).mul(o),B=Xr(r.insuranceOutcome);return{payoutMultiplier:x.plus(B).div(O).toNumber(),betAmountMultiplier:Qr[r.actionType]}},ir=(r)=>{let E=r.mainHandDoubledDown?U(1).plus(z):U(1),A=r.splitHandDoubledDown?U(1).plus(z):U(1),t=dr(r.insuranceOutcome),f=E.plus(A).plus(t),O=U(k[r.mainOutcome]).mul(E),o=U(k[r.splitOutcome]).mul(A),x=Xr(r.insuranceOutcome);return{payoutMultiplier:O.plus(o).plus(x).div(f).toNumber(),betAmountMultiplier:Qr[r.actionType]}};var jE={state:{isFinished:!1,phase:"uninitialised",multiplier:1},config:{},playerArgument:{type:"START"}},G=(r)=>u.fromValue(r).value;function iE(r){_.against(r.phase!=="in-progress","Expected a started, in-progress game state")}function mr(r){_.against(r.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}function Mr(r){_.against(r.phase!=="in-progress"&&r.phase!=="playing-main-hand"&&r.phase!=="playing-split-hand","Expected a started, in-progress game state")}var Hr=(r,E)=>{let A=E;while(A.highestHandValue<pr)A=A.addDrawnCards([G(r.takeOne())]);return A},wr=(r,E)=>{if(r.isBusted)return"LOSE";if(E.isBusted)return"WIN";let A=r.highestHandValue,t=E.highestHandValue;if(A>t)return"WIN";if(A<t)return"LOSE";return"PUSH"},T=(r)=>{let{payoutMultiplier:E,betAmountMultiplier:A}=jr({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:E,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome},config:{},playerArgument:{type:r.actionType},betAmountMultiplier:A}},br=(r)=>{let E=Hr(r.randomValuePool,r.dealerHand),A=wr(r.playerHand,E);return T({...r,dealerHand:E,outcome:A})},y=(r)=>{let A=r.mainHand.isBusted&&r.splitHand.isBusted?r.dealerHand:Hr(r.randomValuePool,r.dealerHand),t=wr(r.mainHand,A),f=wr(r.splitHand,A),{payoutMultiplier:O,betAmountMultiplier:o}=ir({hasSplit:!0,mainOutcome:t,splitOutcome:f,insuranceOutcome:r.insuranceOutcome,mainHandDoubledDown:r.mainHandDoubledDown,splitHandDoubledDown:r.splitHandDoubledDown,actionType:r.actionType});return{state:{isFinished:!0,phase:"split-finished",mainHand:r.mainHand,splitHand:r.splitHand,dealerHand:A,mainOutcome:t,splitOutcome:f,multiplier:O,randomValues:r.randomValuePool.consumedValues,insuranceOutcome:r.insuranceOutcome},config:{},playerArgument:{type:r.actionType},betAmountMultiplier:o}};class mE extends Tr{generateRandomValues(r){return e.from(r.getRandomIntsWithReplacement({min:Jr,max:Rr,count:_r}),_r)}toExternalState(r){let E=r.phase;switch(E){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"playing-main-hand":return{isFinished:!1,phase:"playing-main-hand",multiplier:r.multiplier,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.toDto(),dealerHand:r.dealerHand.toDto(!1)};case"playing-split-hand":return{isFinished:!1,phase:"playing-split-hand",multiplier:r.multiplier,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.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"split-finished":return{isFinished:!0,multiplier:r.multiplier,randomValues:r.randomValues,mainOutcome:r.mainOutcome,splitOutcome:r.splitOutcome,mainHand:r.mainHand.toDto(),splitHand:r.splitHand.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:_.againstNever(E,"Invalid state received")}}createGameStore(){return dE({context:jE,on:{START:(r,E)=>{let{state:A}=r;_.against(A.phase!=="uninitialised","START action requires a fresh game");let t=G(E.randomValuePool.takeOne()),f=G(E.randomValuePool.takeOne()),O=G(E.randomValuePool.takeOne()),o=G(E.randomValuePool.takeOne()),x=$.withInitialDeal([t,f]),B=m.withInitialDeal({upCard:O,holeCard:o});if(B.upCard.rank==="Ace")return{state:{...A,isFinished:!1,phase:"awaiting-insurance",playerHand:x,dealerHand:B},config:{},playerArgument:{type:"START"}};if(x.isBlackjack&&B.isBlackjack)return T({...A,playerHand:x,dealerHand:B,outcome:"PUSH",randomValuePool:E.randomValuePool,actionType:"START"});if(x.isBlackjack)return T({...A,playerHand:x,dealerHand:B,outcome:"PLAYER_BLACKJACK",randomValuePool:E.randomValuePool,actionType:"START"});if(B.isBlackjack)return T({...A,playerHand:x,dealerHand:B,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"START"});return{state:{...A,isFinished:!1,phase:"in-progress",playerHand:x,dealerHand:B,insuranceOutcome:void 0},config:{},playerArgument:{type:"START"}}},BLACKJACK_BUY_INSURANCE:(r,E)=>{let{state:A}=r;mr(A);let{playerHand:t,dealerHand:f}=A,O={...A,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_BUY_INSURANCE"};if(t.isBlackjack&&f.isBlackjack)return T({...O,outcome:"PUSH",insuranceOutcome:"WON"});if(t.isBlackjack)return T({...O,outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST"});if(f.isBlackjack)return T({...O,outcome:"LOSE",insuranceOutcome:"WON"});return{state:{...A,phase:"in-progress",insuranceOutcome:"LOST"},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmountMultiplier:X}},BLACKJACK_REJECT_INSURANCE:(r,E)=>{let{state:A}=r;mr(A);let{playerHand:t,dealerHand:f}=A,O={...A,playerHand:t,dealerHand:f,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_REJECT_INSURANCE",doubledDown:!1};if(t.isBlackjack&&f.isBlackjack)return T({...O,outcome:"PUSH"});if(t.isBlackjack)return T({...O,outcome:"PLAYER_BLACKJACK"});if(f.isBlackjack)return T({...O,outcome:"LOSE"});return{state:{...A,phase:"in-progress",insuranceOutcome:void 0},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(r,E)=>{let{state:A}=r;switch(Mr(A),A.phase){case"playing-main-hand":{let t=A.mainHand.addDrawnCards([G(E.randomValuePool.takeOne())]);if(t.isBusted||t.highestHandValue===h){if(A.splitHand.highestHandValue===h)return y({...A,mainHand:t,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});return{state:{...A,phase:"playing-split-hand",mainHand:t,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}return{state:{...A,mainHand:t},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"playing-split-hand":{let t=A.splitHand.addDrawnCards([G(E.randomValuePool.takeOne())]);if(t.isBusted||t.highestHandValue===h)return y({...A,splitHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});return{state:{...A,splitHand:t},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"in-progress":{let t=A.playerHand.addDrawnCards([G(E.randomValuePool.takeOne())]);if(t.isBusted)return T({...A,playerHand:t,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});if(t.highestHandValue===h)return br({...A,playerHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_HIT"});return{state:{...A,phase:"in-progress",playerHand:t},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}default:_.againstNever(A,"Invalid phase for HIT action")}},BLACKJACK_STAND:(r,E)=>{let{state:A}=r;switch(Mr(A),A.phase){case"playing-main-hand":{if(A.splitHand.highestHandValue===h)return y({...A,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND"});return{state:{...A,phase:"playing-split-hand",splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_STAND"}}}case"playing-split-hand":return y({...A,splitHandDoubledDown:A.splitHandDoubledDown,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND"});case"in-progress":return br({...A,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_STAND"});default:_.againstNever(A,"Invalid phase for STAND action")}},BLACKJACK_DOUBLE_DOWN:(r,E)=>{let{state:A}=r;switch(Mr(A),A.phase){case"playing-main-hand":{_.against(A.mainHand.cards.length!==2,"Double down is only allowed as the first action");let t=A.mainHand.addDrawnCards([G(E.randomValuePool.takeOne())]);if(A.splitHand.highestHandValue===h)return y({...A,mainHand:t,mainHandDoubledDown:!0,splitHandDoubledDown:!1,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN"});return{state:{...A,phase:"playing-split-hand",mainHand:t,mainHandDoubledDown:!0,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},betAmountMultiplier:z}}case"playing-split-hand":{_.against(A.splitHand.cards.length!==2,"Double down is only allowed as the first action");let t=A.splitHand.addDrawnCards([G(E.randomValuePool.takeOne())]);return y({...A,splitHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN",splitHandDoubledDown:!0})}case"in-progress":{_.against(A.playerHand.cards.length!==2,"Double down is only allowed as the first action");let t=A.playerHand.addDrawnCards([G(E.randomValuePool.takeOne())]);if(t.isBusted)return T({...A,playerHand:t,outcome:"LOSE",randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN"});return br({...A,playerHand:t,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_DOUBLE_DOWN"})}default:_.againstNever(A,"Invalid phase for DOUBLE_DOWN action")}},BLACKJACK_SPLIT:(r,E)=>{let{state:A}=r;iE(A);let{playerHand:t}=A;_.against(t.cards.length!==2,"Split is only allowed with exactly 2 cards");let f=t.cards[0],O=t.cards[1];_.againstUndefined(f,"First card is missing"),_.againstUndefined(O,"Second card is missing"),_.against(f.rank!==O.rank,"Split requires two cards of the same rank");let o=G(E.randomValuePool.takeOne()),x=G(E.randomValuePool.takeOne()),B=$.withInitialDeal([f.value,o]),Z=$.withInitialDeal([O.value,x]);if(f.rank==="Ace")return y({...A,mainHand:B,splitHand:Z,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_SPLIT",mainHandDoubledDown:!1,splitHandDoubledDown:!1});let D=B.highestHandValue===h,M=Z.highestHandValue===h;if(D&&M)return y({...A,mainHand:B,splitHand:Z,randomValuePool:E.randomValuePool,actionType:"BLACKJACK_SPLIT",mainHandDoubledDown:!1,splitHandDoubledDown:!1});if(D)return{state:{...A,phase:"playing-split-hand",mainHand:B,splitHand:Z,mainHandDoubledDown:!1,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},betAmountMultiplier:d};return{state:{...A,phase:"playing-main-hand",multiplier:1,mainHand:B,splitHand:Z,mainHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},betAmountMultiplier:d}}}})}getValidNextActionTypes(r){if(r.isFinished)return[];switch(r.phase){case"awaiting-insurance":return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];case"playing-main-hand":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.mainHand.cards.length===2)E.push("BLACKJACK_DOUBLE_DOWN");return E}case"playing-split-hand":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.splitHand.cards.length===2)E.push("BLACKJACK_DOUBLE_DOWN");return E}case"player-turn":{let E=["BLACKJACK_HIT","BLACKJACK_STAND"];if(r.playerHand.cards.length===2){E.push("BLACKJACK_DOUBLE_DOWN");let A=r.playerHand.cards[0],t=r.playerHand.cards[1];if(_.againstUndefined(A,"First player card is missing"),_.againstUndefined(t,"Second player card is missing"),A.rank===t.rank)E.push("BLACKJACK_SPLIT")}return E}default:_.againstNever(r,"Invalid phase for getting valid actions")}}}import HE from"big.js";class V{multipliers;constructor(r){this.multipliers=r}getMultipliers(r){let E=this.multipliers.get(r);if(E===void 0)throw new Error(`Multipliers for ${r} not found`);return E}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([r,E])=>({edge:r,multipliers:E}))}}var WE;((o)=>{o.PAIR="PAIR";o.TWO_PAIR="TWO_PAIR";o.THREE_OF_A_KIND="THREE_OF_A_KIND";o.FULL_HOUSE="FULL_HOUSE";o.FOUR_OF_A_KIND="FOUR_OF_A_KIND";o.FIVE_OF_A_KIND="FIVE_OF_A_KIND"})(WE||={});var LE={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},KE={PAIR:0.1,TWO_PAIR:2,THREE_OF_A_KIND:3,FULL_HOUSE:4,FOUR_OF_A_KIND:4.8,FIVE_OF_A_KIND:50},vE={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},gE={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},lE={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},kE=new V(new Map([[1,LE],[2,KE],[3,vE],[4,gE],[8,lE]])),sE={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class aE extends S{constructor(){super("DIAMONDS")}determineGameResult({generator:r,edge:E}){let A=r.getRandomIntsWithReplacement({min:0,max:6,count:5}),t=kE.getMultipliers(E),f=A.values,O=this.calculatePayoutMultiplier(t,f);return{isFinished:!0,payoutMultiplier:HE(O),outputs:{result:A.values},randomValues:A}}calculatePayoutMultiplier(r,E){let A=new Map;for(let O of E){let o=A.get(O)||0;A.set(O,o+1)}let t=[...A.values()].filter((O)=>O>1),f=this.classifyResult(t);return f===null?0:r[f]}classifyResult(r){if(r.length>2)throw new Error(`Unexpected number of repeats ${r.length}`);let[E,A]=r;if(E===void 0)return null;if(A===void 0){let t=sE[E];if(t===void 0)throw new Error(`Unexpected single diamond repeat count: ${E}`);return t}return E===3||A===3?"FULL_HOUSE":"TWO_PAIR"}}import Lr from"big.js";var nE;((A)=>{A.ABOVE="ABOVE";A.BELOW="BELOW"})(nE||={});var Wr=1e4,eE=(r)=>{let E=r.direction==="ABOVE"?Wr-r.selectedValue:r.selectedValue;return new Lr(E).div(Wr).mul(100)},r1=(r,E)=>r.direction==="ABOVE"?E>r.selectedValue:E<r.selectedValue;class E1 extends S{constructor(){super("DICE")}determineGameResult({generator:r,edge:E,gameInputs:A}){let t=r.getRandomInt({min:0,max:1e4}),f=eE(A);return{isFinished:!0,payoutMultiplier:r1(A,t.value)?Y.withWinChance(E,f):new Lr(0),outputs:{result:t.values},randomValues:t}}}import B1 from"big.js";import{Guard as rr}from"@betorigami/guard";var Kr;((f)=>{f.CLASSIC="CLASSIC";f.LOW_RISK="LOW_RISK";f.MEDIUM_RISK="MEDIUM_RISK";f.HIGH_RISK="HIGH_RISK"})(Kr||={});var A1=[1,2,3,4,5,6,7,8,9,10],vr=(r)=>{return A1.includes(r)};var t1={[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]}},f1={[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]}},O1={[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]}},o1={[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]}},x1={[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]}},gr=new V(new Map([[1,t1],[2,f1],[3,O1],[4,o1],[8,x1]]));class c1 extends S{constructor(){super("KENO")}determineGameResult({generator:r,edge:E,gameInputs:A}){rr.againstEmptyArray(A.selectedNumbers,()=>c.createValidationError("No numbers selected")),rr.against(A.selectedNumbers.length>10,()=>c.createValidationError("Maximum of 10 numbers can be selected"));for(let D of A.selectedNumbers)rr.againstNonInteger(D,()=>c.createValidationError("Only integers can be selected")),rr.against(D<0||D>39,()=>c.createValidationError("Invalid number selected"));let t=r.getUniqueRandomInts({min:0,max:39,count:10}),f=A.selectedNumbers.filter((D)=>t.values.includes(D)),O=A.selectedNumbers.length;if(!vr(O))throw new Error(`Invalid tile count: ${O}`);let Z=gr.getMultipliers(E)[O][A.riskLevel][f.length];if(Z===void 0)throw new Error(`No multiplier found for matching tile count ${f.length}`);return{isFinished:!0,payoutMultiplier:new B1(Z),outputs:{result:t.values},randomValues:t}}}import P from"big.js";var lr=(r,E)=>{return r.gt(E)?r:E};var kr=(r,E)=>{return r.lt(E)?r:E};class D1 extends S{constructor(){super("LIMBO")}determineGameResult({generator:r,edge:E,gameInputs:A}){let t=r.getRandomInt({min:1,max:4294967295}),f=t.max,O=new P(16777216),o=new P(1),x=new P(1e6),B=t.value,Z=new P(B-1).div(f),N=(100-E)/100,D=O.div(Z.mul(O).plus(1)).mul(N),M=lr(o,kr(D,x));return{isFinished:!0,payoutMultiplier:M.gte(A.targetMultiplier)?new P(A.targetMultiplier):new P(0),outputs:{randomMultiplier:M,result:t.values},randomValues:t}}}import Er from"big.js";var hr=(r,E)=>{if(E<0||r<0||E>r)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(E>r-E)E=r-E;let A=1;for(let t=1;t<=E;t++)A=A*(r-t+1)/t;return A};class Z1 extends S{constructor(){super("MINES")}determineGameResult({generator:r,edge:E,gameInputs:A}){if(A.minesCount<=0||A.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(A.selectedTiles.length>25-A.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let o=r.getUniqueRandomInts({min:1,max:25,count:A.minesCount}),x=o.values.some((v)=>A.selectedTiles.includes(v)),B=A.hasCashedOut||x,Z=(100-E)/100,N=new Er(hr(25-A.minesCount,A.selectedTiles.length)).div(new Er(hr(25,A.selectedTiles.length))),M=A.hasCashedOut&&!x?new Er(Z).div(N):new Er(0);return{isFinished:B,payoutMultiplier:M,outputs:{result:o.values},randomValues:o}}}import{Big as G1}from"big.js";var sr;((t)=>{t.LOW_RISK="LOW_RISK";t.MEDIUM_RISK="MEDIUM_RISK";t.HIGH_RISK="HIGH_RISK"})(sr||={});var jA=[8,9,10,11,12,13,14,15,16],S1={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]}},N1={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]}},_1={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]}},C1={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]}},U1={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]}},ar=new V(new Map([[1,S1],[2,N1],[3,_1],[4,C1],[8,U1]]));class T1 extends S{constructor(){super("PLINKO")}determineGameResult({generator:r,gameInputs:E,edge:A}){if(E.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(E.numberOfRows<8||E.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let t=E.numberOfRows,o=ar.getMultipliers(A)[E.riskLevel][t],x=r.getRandomIntsWithReplacement({min:0,max:1,count:E.numberOfRows}),Z=x.values.reduce((D,M)=>D+M,0),N=o[Z];if(N===void 0)throw new Error(`No payout found for end position ${Z}`);return{isFinished:!0,payoutMultiplier:G1(N),outputs:{result:x.values},randomValues:x}}}import{Big as fr}from"big.js";var ur=[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,...ur],er=[[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]],rE=[[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]],EE=[[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]],AE=[[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]],tE=[[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]],fE=[[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]],OE=[0,1,2,3,37],oE=[[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]],xE=[[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]],F;((A)=>{A.EVEN="EVEN";A.ODD="ODD"})(F||={});var J;((A)=>{A.RED="RED";A.BLACK="BLACK"})(J||={});var R;((A)=>{A.LOW="LOW";A.HIGH="HIGH"})(R||={});var q;((t)=>{t.TOP="TOP";t.MIDDLE="MIDDLE";t.BOTTOM="BOTTOM"})(q||={});var I;((t)=>{t.FIRST="FIRST";t.SECOND="SECOND";t.THIRD="THIRD"})(I||={});var Vr;((A)=>{A.AMERICAN="AMERICAN";A.EUROPEAN="EUROPEAN"})(Vr||={});var Ar=(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((E)=>E.amount.gte(0)&&H(E.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((E)=>E.amount.gte(0)&&M1(E.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&b1(E.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&w1(E.values)))throw c.createValidationError("Invalid corner bet.");if(!r.doubleStreetBets.every((E)=>E.amount.gte(0)&&h1(E.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((E)=>E.amount.gte(0)&&Object.values(F).includes(E.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((E)=>E.amount.gte(0)&&Object.values(J).includes(E.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((E)=>E.amount.gte(0)&&Object.values(R).includes(E.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((E)=>E.amount.gte(0)&&Object.values(q).includes(E.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(I).includes(E.dozen)))throw c.createValidationError("Invalid dozen bet.")},H=(r)=>{return ur.includes(r)},M1=(r)=>{if(r.length!==2)return!1;if(!r.every(H))return!1;return er.some(([E,A])=>E===r[0]&&A===r[1])},b1=(r)=>{if(r.length!==3)return!1;if(!r.every(H))return!1;return EE.some(([E,A,t])=>E===r[0]&&A===r[1]&&t===r[2])},w1=(r)=>{if(r.length!==4)return!1;if(!r.every(H))return!1;return tE.some(([E,A,t,f])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3])},h1=(r)=>{if(r.length!==6)return!1;if(!r.every(H))return!1;return oE.some(([E,A,t,f,O,o])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3]&&O===r[4]&&o===r[5])};var tr=(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((E)=>E.amount.gte(0)&&W(E.value)))throw c.createValidationError("Invalid straight bet.");if(!r.splitBets.every((E)=>E.amount.gte(0)&&u1(E.values)))throw c.createValidationError("Invalid split bet.");if(!r.streetBets.every((E)=>E.amount.gte(0)&&V1(E.values)))throw c.createValidationError("Invalid street bet.");if(!r.cornerBets.every((E)=>E.amount.gte(0)&&y1(E.values)))throw c.createValidationError("Invalid corner bet.");if(!r.basketBets.every((E)=>E.amount.gte(0)))throw c.createValidationError("Invalid basket bet.");if(!r.doubleStreetBets.every((E)=>E.amount.gte(0)&&Y1(E.values)))throw c.createValidationError("Invalid double street bet.");if(!r.parityBets.every((E)=>E.amount.gte(0)&&Object.values(F).includes(E.parity)))throw c.createValidationError("Invalid parity bet.");if(!r.colorBets.every((E)=>E.amount.gte(0)&&Object.values(J).includes(E.color)))throw c.createValidationError("Invalid color bet.");if(!r.halfBets.every((E)=>E.amount.gte(0)&&Object.values(R).includes(E.half)))throw c.createValidationError("Invalid half bet.");if(!r.columnBets.every((E)=>E.amount.gte(0)&&Object.values(q).includes(E.column)))throw c.createValidationError("Invalid column bet.");if(!r.dozenBets.every((E)=>E.amount.gte(0)&&Object.values(I).includes(E.dozen)))throw c.createValidationError("Invalid dozen bet.")},W=(r)=>{return nr.includes(r)};function u1(r){if(r.length!==2)return!1;if(!r.every(W))return!1;return rE.some(([E,A])=>E===r[0]&&A===r[1])}var V1=(r)=>{if(r.length!==3)return!1;if(!r.every(W))return!1;return AE.some(([E,A,t])=>E===r[0]&&A===r[1]&&t===r[2])},y1=(r)=>{if(r.length!==4)return!1;if(!r.every(W))return!1;return fE.some(([E,A,t,f])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3])},Y1=(r)=>{if(r.length!==6)return!1;if(!r.every(W))return!1;return xE.some(([E,A,t,f,O,o])=>E===r[0]&&A===r[1]&&t===r[2]&&f===r[3]&&O===r[4]&&o===r[5])};var z1={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},$1=[3,6,9,12,15,18,21,24,27,30,33,36],p1=[2,5,8,11,14,17,20,23,26,29,32,35],P1=[1,4,7,10,13,16,19,22,25,28,31,34],F1=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],J1=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],R1=2.7,q1=5.3;class yr extends S{constructor(){super("ROULETTE")}determineGameResult({generator:r,gameInputs:E}){this.validateInputs(E);let A=r.getRandomInt({min:0,max:this.maxNumber}),t=A.value,f=this.determineBetOutcomes(E,t),{payoutMultiplier:O}=this.getPayoutDetails(E,t);return{outputs:{betOutcomes:f,result:A.values},payoutMultiplier:O,isFinished:!0,randomValues:A}}getBetAmount(r){return this.calculateTotalBetAmount(this.getBetTotals(r))}getPayoutDetails(r,E){let A=this.determineBetOutcomes(r,E),t=this.getBetTotals(r),f=this.getBetTotals(A.winningBets),O=this.calculateTotalBetAmount(t),o=this.calculateTotalPayout(f);return{payoutMultiplier:O.gt(0)?o.div(O):new fr(0),payoutAmount:o}}determineBetOutcomes(r,E){let A={},t={};for(let f of Object.keys(r)){let O=r[f],o=this.betPredicates[f],{winning:x,losing:B}=this.partitionBets(O,o,E);A[f]=x,t[f]=B}return{winningBets:A,losingBets:t}}calculateTotalAmount(r){return r.reduce((E,A)=>E.plus(A.amount),new fr(0))}isWinningStraightBet(r,E){return r.value===E}isWinningSplitBet(r,E){return r.values.some((A)=>A===E)}isWinningStreetBet(r,E){return r.values.some((A)=>A===E)}isWinningCornerBet(r,E){return r.values.some((A)=>A===E)}isWinningDoubleStreetBet(r,E){return r.values.some((A)=>A===E)}isWinningColorBet(r,E){let A=r;return F1.includes(E)&&A.color==="RED"||J1.includes(E)&&A.color==="BLACK"}isWinningHalfBet(r,E){let A=r;if(E>0&&E<=18&&A.half==="LOW")return!0;if(E>18&&E<=36&&A.half==="HIGH")return!0;return!1}isWinningColumnBet(r,E){let A=r;return $1.includes(E)&&A.column==="TOP"||p1.includes(E)&&A.column==="MIDDLE"||P1.includes(E)&&A.column==="BOTTOM"}isWinningDozenBet(r,E){let A=r;if(E>0&&E<=12&&A.dozen==="FIRST")return!0;if(E>12&&E<=24&&A.dozen==="SECOND")return!0;if(E>24&&E<=36&&A.dozen==="THIRD")return!0;return!1}isWinningParityBet(r,E){let A=r;if(E===0||E===37)return!1;let t=E%2===0?"EVEN":"ODD";return A.parity===t}getBetTotals(r){let E={};for(let A of Object.keys(r))E[A]=this.calculateTotalAmount(r[A]);return E}calculateTotalBetAmount(r){return Object.values(r).reduce((E,A)=>E.plus(A),new fr(0))}partitionBets(r,E,A){return{winning:r.filter((t)=>E(t,A)),losing:r.filter((t)=>!E(t,A))}}calculateTotalPayout(r){return Object.entries(r).reduce((E,[A,t])=>{let O=z1[A];return E.plus(t.mul(O||0))},new fr(0))}}class BE extends yr{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){Ar(r)}}class cE extends yr{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){tr(r)}isWinningBasketBet(r,E){return OE.some((A)=>A===E)}}class DE extends S{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new BE,this.americanGame=new cE}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:E,...A}=r;if(r.edge===R1&&E.type==="EUROPEAN"){let t=this.europeanGame.determineGameResult({...A,gameInputs:E.inputs}),{betOutcomes:f}=t.outputs;return{...t,outputs:{type:"european",betOutcomes:f,result:t.outputs.result}}}if(r.edge===q1&&E.type==="AMERICAN"){let t=this.americanGame.determineGameResult({...A,gameInputs:E.inputs}),{betOutcomes:f}=t.outputs;return{...t,outputs:{type:"american",betOutcomes:f,result:t.outputs.result}}}throw c.createValidationError(`Attempted to play ${E.type} roulette on edge ${r.edge}`)}}var Bt=(r)=>{return new DE().getBetAmount(r)};var Nt=(r)=>{if(r.type==="EUROPEAN")Ar(r.inputs);else tr(r.inputs)};import{Big as i1}from"big.js";var L;((t)=>{t.LOW_RISK="LOW_RISK";t.MEDIUM_RISK="MEDIUM_RISK";t.HIGH_RISK="HIGH_RISK"})(L||={});var K;((O)=>{O[O.TEN=10]="TEN";O[O.TWENTY=20]="TWENTY";O[O.THIRTY=30]="THIRTY";O[O.FORTY=40]="FORTY";O[O.FIFTY=50]="FIFTY"})(K||={});var I1={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}}},Q1={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}}},X1={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}}},d1={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}}},j1={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}}},ZE=new V(new Map([[1,I1],[2,Q1],[3,X1],[4,d1],[8,j1]]));var SE={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 m1 extends S{constructor(){super("WHEEL")}determineGameResult({generator:r,gameInputs:E,edge:A}){if(!Object.values(K).includes(E.segments))throw new Error("Invalid segments value");if(!Object.values(L).includes(E.riskLevel))throw new Error("Invalid risk level");let f=ZE.getMultipliers(A)[E.riskLevel];if(f===void 0)throw new Error(`No multipliers found for risk level ${E.riskLevel}`);let O=f[E.segments];if(O===void 0)throw new Error(`No multipliers found for segment ${E.segments}`);let o=SE[E.riskLevel];if(o===void 0)throw new Error(`No patterns found for risk level ${E.riskLevel}`);let x=o[E.segments];if(x===void 0)throw new Error(`No patterns found for segment ${E.segments}`);let B=r.getRandomInt({min:0,max:x.length-1}),Z=x[B.value];if(Z===void 0)throw new Error(`No pattern found for segment ${E.segments} and value ${B.value}`);let N=O[Z];if(N===void 0)throw new Error(`No payout found for picked segment ${Z}`);return{isFinished:!0,payoutMultiplier:new i1(N),outputs:{result:B.values},randomValues:B}}}export{Nt as validateRouletteGameInputs,e1 as validateAdvancedDiceInputs,t1 as rtp99Multipliers,f1 as rtp98Multipliers,O1 as rtp97Multipliers,o1 as rtp96Multipliers,x1 as rtp92Multipliers,ar as plinkoMultipliers,hr as nCr,gr as kenoMultipliers,vr as isTileCount,r1 as hasDiceWon,kE as diamondsMultipliers,Bt as calculateRouletteBetAmount,eE as calculateDiceWinChance,pE as calculateBaccaratBetAmount,$r as calculateAdvancedDiceWinChance,kr as bigMin,lr as bigMax,bE as advancedDiceIsWithinBoundsInclusive,or as advancedDiceIsWithinBoundsExclusive,wE as advancedDiceGetInclusiveBoundsRange,xr as advancedDiceGetExclusiveBoundsRange,K as WheelSegments,L as WheelRiskLevel,m1 as Wheel,JE as WIN_MULTIPLIER,VE as VALID_SUITS,yE as VALID_RANKS,EE as VALID_EUROPEAN_STREETS,ur as VALID_EUROPEAN_STRAIGHTS,er as VALID_EUROPEAN_SPLITS,oE as VALID_EUROPEAN_DOUBLE_STREETS,tE as VALID_EUROPEAN_CORNERS,AE as VALID_AMERICAN_STREETS,nr as VALID_AMERICAN_STRAIGHTS,rE as VALID_AMERICAN_SPLITS,xE as VALID_AMERICAN_DOUBLE_STREETS,fE as VALID_AMERICAN_CORNERS,$1 as TOP_COLUMN,A1 as TILE_COUNTS,d as SPLIT_BET_SIZE_FACTOR,Vr as RouletteType,DE as Roulette,hE as RollType,e as RandomValuePool,F1 as RED_NUMBERS,Br as RANDOM_MIN_VALUE,cr as RANDOM_MAX_VALUE,sr as PlinkoRiskLevel,T1 as Plinko,F as Parity,RE as PUSH_MULTIPLIER,jA as PLINKO_ROW_COUNTS,z1 as PAYOUT_MULTIPLIERS,w as OrigamiGame,Y as MultiplierCalculator,Z1 as Mines,CE as MIN_WIN_CHANCE,p1 as MIDDLE_COLUMN,UE as MAX_WIN_CHANCE,_r as MAX_CARDS_PER_ROUND,D1 as Limbo,qE as LOSE_MULTIPLIER,Kr as KenoRiskLevel,c1 as Keno,Zr as InsuranceOutcome,Pr as INSURANCE_WIN_PAYOUT,X as INSURANCE_BET_SIZE_FACTOR,o2 as INSURANCE_BET_MULTIPLIER,R as Half,_E as GameErrorCode,c as GameError,S as Game,Fr as FACE_CARD_VALUE,BE as EuropeanRoulette,R1 as EUROPEAN_HOUSE_EDGE,Yr as EFFECTIVE_RANGE,I as Dozen,nE as DiceDirection,E1 as Dice,WE as DiamondsResultType,aE as Diamonds,z as DOUBLE_DOWN_BET_SIZE_FACTOR,Wr as DICE_EFFECTIVE_RANGE,pr as DEALER_STAND_VALUE,q as Column,J as Color,x2 as CARDS_PER_SUIT,Dr as BlackjackOutcome,Sr as BlackjackActionType,mE as Blackjack,YE as BaccaratOutcome,zE as BaccaratBetType,PE as Baccarat,Nr as BUST_VALUE,P1 as BOTTOM_COLUMN,J1 as BLACK_NUMBERS,h as BLACKJACK_VALUE,FE as BLACKJACK_MULTIPLIER,k as BASE_PAYOUT_MULTIPLIERS,cE as AmericanRoulette,uE as AdvancedDice,q1 as AMERICAN_HOUSE_EDGE,OE as AMERICAN_BASKET,Cr as ACE_SOFT_BONUS};
|
|
1
|
+
var Ra;((a)=>a.INPUT_VALIDATION_ERROR="INPUT_VALIDATION_ERROR")(Ra||={});class d extends Error{static createValidationError(t){return new d("INPUT_VALIDATION_ERROR",t)}static isGameError(t){return t instanceof d}errorCode;constructor(t,a){super(a);this.errorCode=t}}var S;((l)=>{l.DICE="DICE";l.MINES="MINES";l.KENO="KENO";l.LIMBO="LIMBO";l.ADVANCED_DICE="ADVANCED_DICE";l.BACCARAT="BACCARAT";l.DIAMONDS="DIAMONDS";l.PLINKO="PLINKO";l.ROULETTE="ROULETTE";l.WHEEL="WHEEL";l.BLACKJACK="BLACKJACK"})(S||={});class F{gameId;constructor(t){this.gameId=t}}class A extends F{constructor(t){super(t)}getGameResult(t){return this.determineGameResult(t)}}import{Big as Ut}from"big.js";import lt from"big.js";class R{static withMultiplier(t,a){return new lt(t).times(new lt(100-a).div(100))}static withWinChance(t,a){return lt(100-t).div(a)}}var st=0,pt=1e4,wt=10001,Pa=0.01,_a=98,Ia=(t)=>{if(t<st)throw d.createValidationError(`Lower bound ${t} is below minimum allowed value ${st}`)},ba=(t)=>{if(t>pt)throw d.createValidationError(`Upper bound ${t} is above maximum allowed value ${pt}`)},W=(t)=>{if(Ia(t.lower),ba(t.upper),t.lower>=t.upper)throw d.createValidationError(`Lower bound ${t.lower} must be less than ${t.upper}`)},ja=(t,a)=>{let[r,e]=t.lower<=a.lower?[t,a]:[a,t];if(r.upper>e.lower)throw d.createValidationError("Bounds must not overlap")},Na=(t,a)=>a>=t.lower&&a<=t.upper,Va=(t)=>t.upper-t.lower+1,dt=(t,a)=>a>t.lower&&a<t.upper,ut=(t)=>t.upper-t.lower-1,wa;((e)=>{e.ROLL_BETWEEN="ROLL_BETWEEN";e.ROLL_OUTSIDE="ROLL_OUTSIDE";e.ROLL_BETWEEN_TWO="ROLL_BETWEEN_TWO"})(wa||={});var Gt=(t)=>{let r=(()=>{switch(t.mode){case"ROLL_BETWEEN":return W(t.bounds),ut(t.bounds);case"ROLL_OUTSIDE":return W(t.bounds),wt-Va(t.bounds);case"ROLL_BETWEEN_TWO":return W(t.firstBounds),W(t.secondBounds),ja(t.firstBounds,t.secondBounds),ut(t.firstBounds)+ut(t.secondBounds)}})(),e=Ut(r).div(wt).mul(100);if(e.lt(Pa))throw d.createValidationError("Win chance too low");if(e.gt(_a))throw d.createValidationError("Win chance too high");return e},fe=(t)=>{Gt(t)};class Ua extends A{constructor(){super("ADVANCED_DICE")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=Gt(r),n=t.getRandomInt({min:st,max:pt}),o=n.value;return{isFinished:!0,payoutMultiplier:(()=>{switch(r.mode){case"ROLL_BETWEEN":return dt(r.bounds,o);case"ROLL_OUTSIDE":return!Na(r.bounds,o);case"ROLL_BETWEEN_TWO":return dt(r.firstBounds,o)||dt(r.secondBounds,o)}})()?R.withWinChance(a,e):new Ut(0),outputs:{result:n.values},randomValues:n}}}import b from"big.js";var Ga=["Clubs","Diamonds","Hearts","Spades"],Za=["Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"],ka;((e)=>{e.PLAYER_WIN="PLAYER_WIN";e.TIE="TIE";e.BANKER_WIN="BANKER_WIN"})(ka||={});var Fa;((e)=>{e.PLAYER="PLAYER";e.TIE="TIE";e.BANKER="BANKER"})(Fa||={});var Ma={["PLAYER_WIN"]:{betType:"PLAYER",multiplier:2},["TIE"]:{betType:"TIE",multiplier:9},["BANKER_WIN"]:{betType:"BANKER",multiplier:1.95}},Ya=(t)=>{return new b(0).add(t.bets.reduce((r,e)=>r.add(e.amount),new b(0)))};class Ja extends A{constructor(){super("BACCARAT")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(r!==1)throw new Error("Baccarat is only available at 1% edge.");this.validateGameInputs(a);let e=t.getRandomIntsWithReplacement({min:0,max:51,count:6}),n=e.values,o=n.slice(0,3),i=n.slice(3,6),c=[],u=0;for(let y of o.slice(0,2)){let D=this.mapRandomValueToCard(y),Q=this.mapRandomValueToCardValue(y);c.push(D),u=(u+Q)%10}let p=[],s=0;for(let y of i.slice(0,2)){let D=this.mapRandomValueToCard(y),Q=this.mapRandomValueToCardValue(y);p.push(D),s=(s+Q)%10}if(!this.isNaturalWin(u,s)){let y=this.shouldDrawThirdPlayerCard(u),D=null;if(y)D=this.mapRandomValueToCardValue(o[2]),c.push(this.mapRandomValueToCard(o[2])),u=(u+D)%10;if(this.shouldDrawThirdBankerCard(s,D))p.push(this.mapRandomValueToCard(i[2])),s=(s+this.mapRandomValueToCardValue(i[2]))%10}let l;if(u===s)l="TIE";else l=u>s?"PLAYER_WIN":"BANKER_WIN";let B=Ya(a),{betType:T,multiplier:ct}=Ma[l],k=new b(0);if(k=k.add(a.bets.filter((y)=>y.type===T).reduce((y,D)=>y.add(D.amount.mul(ct)),new b(0))),l==="TIE")k=k.add(a.bets.filter((y)=>y.type==="PLAYER"||y.type==="BANKER").reduce((y,D)=>y.add(D.amount),new b(0)));return{isFinished:!0,payoutMultiplier:B.gt(0)?k.div(B):new b(0),outputs:{playerCards:c,playerHandValue:u,bankerCards:p,bankerHandValue:s,gameOutcome:l,result:e.values},randomValues:e}}validateGameInputs(t){if(t.bets.length===0)throw new Error("Must place at least a single bet.");if(!t.bets.every((a)=>a.amount.gte(0)))throw new Error("Invalid bet.")}mapRandomValueToCard(t){let a=Ga[Math.floor(t/13)],r=Za[t%13];return{suit:a,rank:r}}isNaturalWin(t,a){let r=[8,9];return r.includes(t)||r.includes(a)}mapRandomValueToCardValue(t){let a=t%13;if(a===0)return 1;if(a>=10)return 10;return a+1}shouldDrawThirdPlayerCard(t){return t<=5}shouldDrawThirdBankerCard(t,a){if(a===null)return t<=5;if(t<=2)return!0;if(t===3)return a!==8;if(t===4)return[2,3,4,5,6,7].includes(a);if(t===5)return[4,5,6,7].includes(a);if(t===6)return[6,7].includes(a);return!1}}var At;((n)=>{n.WIN="WIN";n.LOSE="LOSE";n.PUSH="PUSH";n.PLAYER_BLACKJACK="PLAYER_BLACKJACK"})(At||={});var Bt;((r)=>{r.WON="WON";r.LOST="LOST"})(Bt||={});var mt;((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";c.SPLIT="BLACKJACK_SPLIT"})(mt||={});var yt;((n)=>{n.EXACT_PAIR="EXACT_PAIR";n.COLORED_PAIR="COLORED_PAIR";n.MIXED_PAIR="MIXED_PAIR";n.LOSS="LOSS"})(yt||={});var Et;((i)=>{i.SUITED_TRIPS="SUITED_TRIPS";i.STRAIGHT_FLUSH="STRAIGHT_FLUSH";i.THREE_OF_A_KIND="THREE_OF_A_KIND";i.STRAIGHT="STRAIGHT";i.FLUSH="FLUSH";i.LOSS="LOSS"})(Et||={});var ga=2.5,$a=2,za=1,Xa=0,Zt=17,ft=21,C=21,St=63,Ie=1.5,M=0.5,Ot=1.5,P=1,j=1,be=13,Dt=10,kt=10,L={PLAYER_BLACKJACK:ga,WIN:$a,PUSH:za,LOSE:Xa},Ft={EXACT_PAIR:26,COLORED_PAIR:11,MIXED_PAIR:7,LOSS:0},Mt={SUITED_TRIPS:101,STRAIGHT_FLUSH:51,THREE_OF_A_KIND:31,STRAIGHT:11,FLUSH:5,LOSS:0};import I from"big.js";import{Guard as m}from"@betorigami/guard";import{createStore as tr}from"@xstate/store";var Yt=0,Jt=51,K=Array.from({length:52},(t,a)=>a),gt=["Spades","Hearts","Diamonds","Clubs"],v=["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"],$t=["Jack","Queen","King"],Ct={Hearts:"red",Diamonds:"red",Spades:"black",Clubs:"black"};import{Guard as qa}from"@betorigami/guard";import{Guard as ht}from"@betorigami/guard";class Ht{value;constructor(t){let a=K[t];ht.againstNullOrUndefined(a,`Invalid card value: ${t}`),this.value=a}get suit(){let t=Math.floor(this.value/13),a=gt[t];return ht.againstNullOrUndefined(a,`Invalid suit index: ${t}`),a}get rank(){let t=this.value%13,a=v[t];return ht.againstNullOrUndefined(a,`Invalid rank index: ${t}`),a}toDto(){return{rank:this.rank,suit:this.suit,cardValue:this.value}}}class E extends Ht{get numericRank(){if($t.includes(this.rank))return kt;return v.indexOf(this.rank)+1}static fromValue(t){return qa.against(!K.includes(t),`Invalid card value: ${t}`),new E(t)}}class Y{cards;hardHandValue;softHandValue=null;constructor(t){this.cards=t;if(this.hardHandValue=t.reduce((r,e)=>r+e.numericRank,0),t.some((r)=>r.rank==="Ace")&&this.hardHandValue+Dt<=ft)this.softHandValue=this.hardHandValue+Dt}get cardCount(){return this.cards.length}get hasSoftHandValue(){return this.softHandValue!==null}get isBusted(){return this.hardHandValue>ft}get isBlackjack(){return this.cardCount===2&&this.highestHandValue===C}get highestHandValue(){return this.softHandValue!==null?this.softHandValue:this.hardHandValue}}class J{cards;value;constructor(t){this.cards=t.map((a)=>E.fromValue(a)),this.value=new Y(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((t)=>t.value)}toDto(){return{cards:this.cards.map((t)=>t.toDto()),value:this.highestHandValue}}}class g extends J{otherCards;upCard;holeCard;constructor(t,a,r=[]){super([t,a,...r]);this.otherCards=r;this.upCard=E.fromValue(t),this.holeCard=E.fromValue(a)}static withInitialDeal(t){return new g(t.upCard,t.holeCard)}addDrawnCards(t){return new g(this.upCard.value,this.holeCard.value,[...this.otherCards,...t])}toDto(t=!1){if(t)return super.toDto();return{cards:[this.upCard.toDto()],value:new Y([this.upCard]).highestHandValue}}}class _ extends J{static withInitialDeal(t){return new _(t)}addDrawnCards(t){return new _([...this.rawValues,...t])}}import{Guard as tt}from"@betorigami/guard";class at{source;index=0;constructor(t){this.source=t}static from(t,a){return tt.against(a<=0,`Count must be positive, got ${a}`),tt.against(t.values.length!==a,`Expected ${a} values, got ${t.values.length}`),new at(t)}get consumedValues(){return this.source.values.slice(0,this.index)}toMultipleRandomValues(){return this.source}takeOne(){let t=this.source.values[this.index];return tt.againstUndefined(t,"RandomValuePool exhausted"),this.index+=1,t}take(t){tt.against(this.index+t>this.source.values.length,`RandomValuePool exhausted: requested ${t} but only ${this.source.values.length-this.index} remain`);let a=this.source.values.slice(this.index,this.index+t);return this.index+=t,a}}import{Guard as Qa}from"@betorigami/guard";import Wa from"fast-deep-equal";class xt extends F{edge;constructor(t,a){super(t);this.edge=a}play(t,a,r=[]){let e=this.createGameStore(),n=this.generateRandomValues(t),o=n.toMultipleRandomValues();for(let u of r)e.send({...u.playerArgument,randomValuePool:n});let i=r[r.length-1];if(i)Qa.against(!Wa(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({...a,randomValuePool:n});let c=e.getSnapshot().context;return{playerArgument:c.playerArgument,state:this.toExternalState(c.state),config:c.config,additionalBetAmount:c.additionalBetAmount,proof:{proofHash:o.proofHash,proofString:o.proofString}}}}import h from"big.js";import{Guard as Tt}from"@betorigami/guard";var zt=(t)=>{let a=t.pairBonus!==null?h(t.pairBonus.betAmount).mul(t.pairBonus.payoutMultiplier):h(0),r=t.threeCardBonus!==null?h(t.threeCardBonus.betAmount).mul(t.threeCardBonus.payoutMultiplier):h(0);return a.plus(r)},Xt=(t)=>{let a=t.betAmounts.mainBetAmount,e=t.actionType==="BLACKJACK_DOUBLE_DOWN"?a.mul(P):h(0),n=t.insuranceOutcome!==void 0?a.mul(M):h(0),o=a.plus(e).mul(L[t.outcome]),i=t.insuranceOutcome==="WON"?a.mul(Ot):h(0),c=zt(t.sideBetResults),u=o.plus(i).plus(c),p=a.plus(n).plus(e).plus(t.betAmounts.pairBonusAmount).plus(t.betAmounts.threeCardBonusAmount);Tt.against(p.eq(0),"Total bet amount cannot be zero");let s=u.div(p);Tt.against(t.actionType==="BLACKJACK_SPLIT","SPLIT action type is not valid for standard multiplier calculation");let l;switch(t.actionType){case"BLACKJACK_DOUBLE_DOWN":l=e;break;case"BLACKJACK_BUY_INSURANCE":l=n;break;case"BLACKJACK_SPLIT":l=a.mul(j);break}return{multiplier:s,additionalBetAmount:l}},qt=(t)=>{let a=t.betAmounts.mainBetAmount,r=t.mainHandDoubledDown?a.mul(P):h(0),e=t.splitHandDoubledDown?a.mul(P):h(0),n=t.insuranceOutcome!==void 0?a.mul(M):h(0),o=a.plus(r).mul(L[t.mainOutcome]),i=a.plus(e).mul(L[t.splitOutcome]),c=t.insuranceOutcome==="WON"?a.mul(Ot):h(0),u=zt(t.sideBetResults),p=o.plus(i).plus(c).plus(u),s=a.plus(a).plus(n).plus(r).plus(e).plus(t.betAmounts.pairBonusAmount).plus(t.betAmounts.threeCardBonusAmount);Tt.against(s.eq(0),"Total bet amount cannot be zero");let l=p.div(s),B;switch(t.actionType){case"BLACKJACK_DOUBLE_DOWN":B=a.mul(P);break;case"BLACKJACK_SPLIT":B=a.mul(j);break}return{multiplier:l,additionalBetAmount:B}};import{Guard as La}from"@betorigami/guard";var Rt=(t)=>t.every((a)=>a===t[0]),Qt=(t)=>{let a=[...t].sort((r,e)=>r-e);return a.every((r,e)=>{let n=a[e-1];if(e===0)return!0;return La.againstUndefined(n,"Previous value cannot be undefined"),r===n+1})},Wt={Ace:1,Two:2,Three:3,Four:4,Five:5,Six:6,Seven:7,Eight:8,Nine:9,Ten:10,Jack:11,Queen:12,King:13},Ka={...Wt,Ace:14},va=(t)=>Qt(t.map((a)=>Wt[a]))||Qt(t.map((a)=>Ka[a])),Lt=(t,a)=>{let r=E.fromValue(t),e=E.fromValue(a);if(r.rank!==e.rank)return"LOSS";if(t===a)return"EXACT_PAIR";if(Ct[r.suit]===Ct[e.suit])return"COLORED_PAIR";return"MIXED_PAIR"},Kt=(t,a)=>({betAmount:t,result:a,payoutMultiplier:Ft[a]}),vt=(t,a,r)=>{let e=E.fromValue(t),n=E.fromValue(a),o=E.fromValue(r),i=[e.rank,n.rank,o.rank],c=Rt([e.suit,n.suit,o.suit]),u=Rt(i),p=va(i);if(Rt([t,a,r]))return"SUITED_TRIPS";if(c&&p)return"STRAIGHT_FLUSH";if(u)return"THREE_OF_A_KIND";if(p)return"STRAIGHT";if(c)return"FLUSH";return"LOSS"},ta=(t,a)=>({betAmount:t,result:a,payoutMultiplier:Mt[a]});var ar={state:{isFinished:!1,phase:"uninitialised",multiplier:I(0)},config:{},playerArgument:{type:"START",mainBetAmount:"0",pairBonusAmount:"0",threeCardBonusAmount:"0"}},f=(t)=>E.fromValue(t).value;function rr(t){m.against(t.phase!=="in-progress","Expected a started, in-progress game state")}function aa(t){m.against(t.phase!=="awaiting-insurance","Expected game to be awaiting insurance decision")}function Pt(t){m.against(t.phase!=="in-progress"&&t.phase!=="playing-main-hand"&&t.phase!=="playing-split-hand","Expected a started, in-progress game state")}var ra=(t,a)=>{let r=a;while(r.highestHandValue<Zt)r=r.addDrawnCards([f(t.takeOne())]);return r},It=(t,a)=>{if(t.isBusted)return"LOSE";if(a.isBusted)return"WIN";let r=t.highestHandValue,e=a.highestHandValue;if(r>e)return"WIN";if(r<e)return"LOSE";return"PUSH"},O=(t)=>{let{multiplier:a,additionalBetAmount:r}=Xt({outcome:t.outcome,insuranceOutcome:t.insuranceOutcome,actionType:t.playerArgument.type,betAmounts:t.betAmounts,sideBetResults:t.sideBetResults});return{state:{isFinished:!0,phase:"finished",playerHand:t.playerHand,dealerHand:t.dealerHand,outcome:t.outcome,multiplier:a,randomValues:t.randomValuePool.consumedValues,insuranceOutcome:t.insuranceOutcome,sideBetResults:t.sideBetResults},config:{},playerArgument:t.playerArgument,additionalBetAmount:r}},_t=(t)=>{let a=ra(t.randomValuePool,t.dealerHand),r=It(t.playerHand,a);return O({...t,dealerHand:a,outcome:r})},x=(t)=>{let r=t.mainHand.isBusted&&t.splitHand.isBusted?t.dealerHand:ra(t.randomValuePool,t.dealerHand),e=It(t.mainHand,r),n=It(t.splitHand,r),{multiplier:o,additionalBetAmount:i}=qt({hasSplit:!0,mainOutcome:e,splitOutcome:n,insuranceOutcome:t.insuranceOutcome,mainHandDoubledDown:t.mainHandDoubledDown,splitHandDoubledDown:t.splitHandDoubledDown,actionType:t.playerArgument.type,betAmounts:t.betAmounts,sideBetResults:t.sideBetResults});return{state:{isFinished:!0,phase:"split-finished",mainHand:t.mainHand,splitHand:t.splitHand,dealerHand:r,mainOutcome:e,splitOutcome:n,multiplier:o,randomValues:t.randomValuePool.consumedValues,insuranceOutcome:t.insuranceOutcome,sideBetResults:t.sideBetResults},config:{},playerArgument:t.playerArgument,additionalBetAmount:i}};class er extends xt{constructor(t){super("BLACKJACK",t)}generateRandomValues(t){return at.from(t.getRandomIntsWithReplacement({min:Yt,max:Jt,count:St}),St)}toExternalState(t){let a=t.phase;switch(a){case"awaiting-insurance":return{isFinished:!1,phase:"awaiting-insurance",multiplier:t.multiplier,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"in-progress":return{isFinished:!1,phase:"player-turn",multiplier:t.multiplier,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"playing-main-hand":return{isFinished:!1,phase:"playing-main-hand",multiplier:t.multiplier,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"playing-split-hand":return{isFinished:!1,phase:"playing-split-hand",multiplier:t.multiplier,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!1),sideBetResults:t.sideBetResults};case"finished":return{isFinished:!0,multiplier:t.multiplier,randomValues:t.randomValues,outcome:t.outcome,playerHand:t.playerHand.toDto(),dealerHand:t.dealerHand.toDto(!0),sideBetResults:t.sideBetResults,...t.insuranceOutcome!==void 0&&{insuranceOutcome:t.insuranceOutcome}};case"split-finished":return{isFinished:!0,multiplier:t.multiplier,randomValues:t.randomValues,mainOutcome:t.mainOutcome,splitOutcome:t.splitOutcome,mainHand:t.mainHand.toDto(),splitHand:t.splitHand.toDto(),dealerHand:t.dealerHand.toDto(!0),sideBetResults:t.sideBetResults,...t.insuranceOutcome!==void 0&&{insuranceOutcome:t.insuranceOutcome}};case"uninitialised":throw new Error("Cannot convert uninitialised state to external state");default:m.againstNever(a,"Invalid state received")}}createGameStore(){return tr({context:ar,on:{START:(t,a)=>{let{state:r}=t;m.against(r.phase!=="uninitialised","START action requires a fresh game");let e=f(a.randomValuePool.takeOne()),n=f(a.randomValuePool.takeOne()),o=f(a.randomValuePool.takeOne()),i=f(a.randomValuePool.takeOne()),c=_.withInitialDeal([e,n]),u=g.withInitialDeal({upCard:o,holeCard:i}),p={mainBetAmount:I(a.mainBetAmount),pairBonusAmount:I(a.pairBonusAmount),threeCardBonusAmount:I(a.threeCardBonusAmount)},s={pairBonus:I(a.pairBonusAmount).gt(0)?Kt(a.pairBonusAmount,Lt(e,n)):null,threeCardBonus:I(a.threeCardBonusAmount).gt(0)?ta(a.threeCardBonusAmount,vt(e,n,o)):null},l={type:"START",mainBetAmount:a.mainBetAmount,pairBonusAmount:a.pairBonusAmount,threeCardBonusAmount:a.threeCardBonusAmount};if(u.upCard.rank==="Ace")return{state:{...r,isFinished:!1,phase:"awaiting-insurance",playerHand:c,dealerHand:u,betAmounts:p,sideBetResults:s},config:{},playerArgument:l};let B={playerHand:c,dealerHand:u,randomValuePool:a.randomValuePool,playerArgument:l,betAmounts:p,sideBetResults:s};if(c.isBlackjack&&u.isBlackjack)return O({...B,outcome:"PUSH"});if(c.isBlackjack)return O({...B,outcome:"PLAYER_BLACKJACK"});if(u.isBlackjack)return O({...B,outcome:"LOSE"});return{state:{...r,isFinished:!1,phase:"in-progress",playerHand:c,dealerHand:u,insuranceOutcome:void 0,betAmounts:p,sideBetResults:s},config:{},playerArgument:l}},BLACKJACK_BUY_INSURANCE:(t,a)=>{let{state:r}=t;aa(r);let{playerHand:e,dealerHand:n,betAmounts:o,sideBetResults:i}=r,c={...r,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},betAmounts:o,sideBetResults:i};if(e.isBlackjack&&n.isBlackjack)return O({...c,outcome:"PUSH",insuranceOutcome:"WON"});if(e.isBlackjack)return O({...c,outcome:"PLAYER_BLACKJACK",insuranceOutcome:"LOST"});if(n.isBlackjack)return O({...c,outcome:"LOSE",insuranceOutcome:"WON"});return{state:{...r,phase:"in-progress",insuranceOutcome:"LOST"},config:{},playerArgument:{type:"BLACKJACK_BUY_INSURANCE"},additionalBetAmount:o.mainBetAmount.mul(M)}},BLACKJACK_REJECT_INSURANCE:(t,a)=>{let{state:r}=t;aa(r);let{playerHand:e,dealerHand:n,betAmounts:o,sideBetResults:i}=r,c={playerHand:e,dealerHand:n,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"},betAmounts:o,sideBetResults:i};if(e.isBlackjack&&n.isBlackjack)return O({...c,outcome:"PUSH"});if(e.isBlackjack)return O({...c,outcome:"PLAYER_BLACKJACK"});if(n.isBlackjack)return O({...c,outcome:"LOSE"});return{state:{...r,phase:"in-progress",insuranceOutcome:void 0},config:{},playerArgument:{type:"BLACKJACK_REJECT_INSURANCE"}}},BLACKJACK_HIT:(t,a)=>{let{state:r}=t;switch(Pt(r),r.phase){case"playing-main-hand":{let e=r.mainHand.addDrawnCards([f(a.randomValuePool.takeOne())]);if(e.isBusted||e.highestHandValue===C){if(r.splitHand.highestHandValue===C)return x({...r,mainHand:e,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,phase:"playing-split-hand",mainHand:e,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}return{state:{...r,mainHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"playing-split-hand":{let e=r.splitHand.addDrawnCards([f(a.randomValuePool.takeOne())]);if(e.isBusted||e.highestHandValue===C)return x({...r,splitHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,splitHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}case"in-progress":{let e=r.playerHand.addDrawnCards([f(a.randomValuePool.takeOne())]);if(e.isBusted)return O({...r,playerHand:e,outcome:"LOSE",randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});if(e.highestHandValue===C)return _t({...r,playerHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_HIT"}});return{state:{...r,phase:"in-progress",playerHand:e},config:{},playerArgument:{type:"BLACKJACK_HIT"}}}default:m.againstNever(r,"Invalid phase for HIT action")}},BLACKJACK_STAND:(t,a)=>{let{state:r}=t;switch(Pt(r),r.phase){case"playing-main-hand":{if(r.splitHand.highestHandValue===C)return x({...r,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});return{state:{...r,phase:"playing-split-hand",splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_STAND"}}}case"playing-split-hand":return x({...r,splitHandDoubledDown:r.splitHandDoubledDown,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});case"in-progress":return _t({...r,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_STAND"}});default:m.againstNever(r,"Invalid phase for STAND action")}},BLACKJACK_DOUBLE_DOWN:(t,a)=>{let{state:r}=t;switch(Pt(r),r.phase){case"playing-main-hand":{m.against(r.mainHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.mainHand.addDrawnCards([f(a.randomValuePool.takeOne())]),{betAmounts:n}=r;if(r.splitHand.highestHandValue===C)return x({...r,mainHand:e,mainHandDoubledDown:!0,splitHandDoubledDown:!1,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return{state:{...r,phase:"playing-split-hand",mainHand:e,mainHandDoubledDown:!0,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},additionalBetAmount:n.mainBetAmount.mul(P)}}case"playing-split-hand":{m.against(r.splitHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.splitHand.addDrawnCards([f(a.randomValuePool.takeOne())]);return x({...r,splitHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"},splitHandDoubledDown:!0})}case"in-progress":{m.against(r.playerHand.cards.length!==2,"Double down is only allowed as the first action");let e=r.playerHand.addDrawnCards([f(a.randomValuePool.takeOne())]);if(e.isBusted)return O({...r,playerHand:e,outcome:"LOSE",randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}});return _t({...r,playerHand:e,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_DOUBLE_DOWN"}})}default:m.againstNever(r,"Invalid phase for DOUBLE_DOWN action")}},BLACKJACK_SPLIT:(t,a)=>{let{state:r}=t;rr(r);let{playerHand:e,betAmounts:n,sideBetResults:o}=r;m.against(e.cards.length!==2,"Split is only allowed with exactly 2 cards");let i=e.cards[0],c=e.cards[1];m.againstUndefined(i,"First card is missing"),m.againstUndefined(c,"Second card is missing"),m.against(i.rank!==c.rank,"Split requires two cards of the same rank");let u=f(a.randomValuePool.takeOne()),p=f(a.randomValuePool.takeOne()),s=_.withInitialDeal([i.value,u]),l=_.withInitialDeal([c.value,p]);if(i.rank==="Ace")return x({...r,mainHand:s,splitHand:l,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},mainHandDoubledDown:!1,splitHandDoubledDown:!1});let T=s.highestHandValue===C,ct=l.highestHandValue===C;if(T&&ct)return x({mainHand:s,splitHand:l,dealerHand:r.dealerHand,randomValuePool:a.randomValuePool,playerArgument:{type:"BLACKJACK_SPLIT"},insuranceOutcome:r.insuranceOutcome,mainHandDoubledDown:!1,splitHandDoubledDown:!1,betAmounts:n,sideBetResults:o});if(T)return{state:{...r,phase:"playing-split-hand",mainHand:s,splitHand:l,mainHandDoubledDown:!1,splitHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:n.mainBetAmount.mul(j)};return{state:{...r,phase:"playing-main-hand",multiplier:I(0),mainHand:s,splitHand:l,mainHandDoubledDown:!1},config:{},playerArgument:{type:"BLACKJACK_SPLIT"},additionalBetAmount:n.mainBetAmount.mul(j)}}}})}getValidNextActionTypes(t){if(t.isFinished)return[];switch(t.phase){case"awaiting-insurance":return["BLACKJACK_BUY_INSURANCE","BLACKJACK_REJECT_INSURANCE"];case"playing-main-hand":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.mainHand.cards.length===2)a.push("BLACKJACK_DOUBLE_DOWN");return a}case"playing-split-hand":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.splitHand.cards.length===2)a.push("BLACKJACK_DOUBLE_DOWN");return a}case"player-turn":{let a=["BLACKJACK_HIT","BLACKJACK_STAND"];if(t.playerHand.cards.length===2){a.push("BLACKJACK_DOUBLE_DOWN");let r=t.playerHand.cards[0],e=t.playerHand.cards[1];if(m.againstUndefined(r,"First player card is missing"),m.againstUndefined(e,"Second player card is missing"),r.rank===e.rank)a.push("BLACKJACK_SPLIT")}return a}default:m.againstNever(t,"Invalid phase for getting valid actions")}}}import nr from"big.js";class H{multipliers;constructor(t){this.multipliers=t}getMultipliers(t){let a=this.multipliers.get(t);if(a===void 0)throw new Error(`Multipliers for ${t} not found`);return a}getAllMultipliers(){return Array.from(this.multipliers.entries()).map(([t,a])=>({edge:t,multipliers:a}))}}var or;((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"})(or||={});var ir={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},cr={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},lr={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},dr={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},ur={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},sr=new H(new Map([[1,ir],[2,cr],[3,lr],[4,dr],[8,ur]])),pr={2:"PAIR",3:"THREE_OF_A_KIND",4:"FOUR_OF_A_KIND",5:"FIVE_OF_A_KIND"};class Ar extends A{constructor(){super("DIAMONDS")}determineGameResult({generator:t,edge:a}){let r=t.getRandomIntsWithReplacement({min:0,max:6,count:5}),e=sr.getMultipliers(a),n=r.values,o=this.calculatePayoutMultiplier(e,n);return{isFinished:!0,payoutMultiplier:nr(o),outputs:{result:r.values},randomValues:r}}calculatePayoutMultiplier(t,a){let r=new Map;for(let o of a){let i=r.get(o)||0;r.set(o,i+1)}let e=[...r.values()].filter((o)=>o>1),n=this.classifyResult(e);return n===null?0:t[n]}classifyResult(t){if(t.length>2)throw new Error(`Unexpected number of repeats ${t.length}`);let[a,r]=t;if(a===void 0)return null;if(r===void 0){let e=pr[a];if(e===void 0)throw new Error(`Unexpected single diamond repeat count: ${a}`);return e}return a===3||r===3?"FULL_HOUSE":"TWO_PAIR"}}import na from"big.js";var Br;((r)=>{r.ABOVE="ABOVE";r.BELOW="BELOW"})(Br||={});var ea=1e4,mr=(t)=>{let a=t.direction==="ABOVE"?ea-t.selectedValue:t.selectedValue;return new na(a).div(ea).mul(100)},yr=(t,a)=>t.direction==="ABOVE"?a>t.selectedValue:a<t.selectedValue;class Er extends A{constructor(){super("DICE")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=t.getRandomInt({min:0,max:1e4}),n=mr(r);return{isFinished:!0,payoutMultiplier:yr(r,e.value)?R.withWinChance(a,n):new na(0),outputs:{result:e.values},randomValues:e}}}import Hr from"big.js";import{Guard as rt}from"@betorigami/guard";var oa;((n)=>{n.CLASSIC="CLASSIC";n.LOW_RISK="LOW_RISK";n.MEDIUM_RISK="MEDIUM_RISK";n.HIGH_RISK="HIGH_RISK"})(oa||={});var fr=[1,2,3,4,5,6,7,8,9,10],ia=(t)=>{return fr.includes(t)};var Sr={[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]}},Or={[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]}},Dr={[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]}},Cr={[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]}},hr={[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]}},ca=new H(new Map([[1,Sr],[2,Or],[3,Dr],[4,Cr],[8,hr]]));class xr extends A{constructor(){super("KENO")}determineGameResult({generator:t,edge:a,gameInputs:r}){rt.againstEmptyArray(r.selectedNumbers,()=>d.createValidationError("No numbers selected")),rt.against(r.selectedNumbers.length>10,()=>d.createValidationError("Maximum of 10 numbers can be selected"));for(let l of r.selectedNumbers)rt.againstNonInteger(l,()=>d.createValidationError("Only integers can be selected")),rt.against(l<0||l>39,()=>d.createValidationError("Invalid number selected"));let e=t.getUniqueRandomInts({min:0,max:39,count:10}),n=r.selectedNumbers.filter((l)=>e.values.includes(l)),o=r.selectedNumbers.length;if(!ia(o))throw new Error(`Invalid tile count: ${o}`);let p=ca.getMultipliers(a)[o][r.riskLevel][n.length];if(p===void 0)throw new Error(`No multiplier found for matching tile count ${n.length}`);return{isFinished:!0,payoutMultiplier:new Hr(p),outputs:{result:e.values},randomValues:e}}}import N from"big.js";var la=(t,a)=>{return t.gt(a)?t:a};var da=(t,a)=>{return t.lt(a)?t:a};class Tr extends A{constructor(){super("LIMBO")}determineGameResult({generator:t,edge:a,gameInputs:r}){let e=t.getRandomInt({min:1,max:4294967295}),n=e.max,o=new N(16777216),i=new N(1),c=new N(1e6),u=e.value,p=new N(u-1).div(n),s=(100-a)/100,l=o.div(p.mul(o).plus(1)).mul(s),B=la(i,da(l,c));return{isFinished:!0,payoutMultiplier:B.gte(r.targetMultiplier)?new N(r.targetMultiplier):new N(0),outputs:{randomMultiplier:B,result:e.values},randomValues:e}}}import et from"big.js";var bt=(t,a)=>{if(a<0||t<0||a>t)throw new Error("Invalid input: ensure 0 ≤ r ≤ n and n ≥ 0.");if(a>t-a)a=t-a;let r=1;for(let e=1;e<=a;e++)r=r*(t-e+1)/e;return r};class Rr extends A{constructor(){super("MINES")}determineGameResult({generator:t,edge:a,gameInputs:r}){if(r.minesCount<=0||r.minesCount>24)throw new Error("Must select between 1 and 24 mines.");if(r.selectedTiles.length>25-r.minesCount)throw new Error("Cannot select more tiles than available safe tiles (total tiles minus mines).");let i=t.getUniqueRandomInts({min:1,max:25,count:r.minesCount}),c=i.values.some((T)=>r.selectedTiles.includes(T)),u=r.hasCashedOut||c,p=(100-a)/100,s=new et(bt(25-r.minesCount,r.selectedTiles.length)).div(new et(bt(25,r.selectedTiles.length))),B=r.hasCashedOut&&!c?new et(p).div(s):new et(0);return{isFinished:u,payoutMultiplier:B,outputs:{result:i.values},randomValues:i}}}import{Big as Nr}from"big.js";var ua;((e)=>{e.LOW_RISK="LOW_RISK";e.MEDIUM_RISK="MEDIUM_RISK";e.HIGH_RISK="HIGH_RISK"})(ua||={});var wo=[8,9,10,11,12,13,14,15,16],Pr={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]}},_r={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]}},Ir={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]}},br={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]}},jr={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]}},sa=new H(new Map([[1,Pr],[2,_r],[3,Ir],[4,br],[8,jr]]));class Vr extends A{constructor(){super("PLINKO")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(a.numberOfRows%1>0)throw new Error("Number of rows must be an integer");if(a.numberOfRows<8||a.numberOfRows>16)throw new Error("Number of rows must be between 8 and 16");let e=a.numberOfRows,i=sa.getMultipliers(r)[a.riskLevel][e],c=t.getRandomIntsWithReplacement({min:0,max:1,count:a.numberOfRows}),p=c.values.reduce((l,B)=>l+B,0),s=i[p];if(s===void 0)throw new Error(`No payout found for end position ${p}`);return{isFinished:!0,payoutMultiplier:Nr(s),outputs:{result:c.values},randomValues:c}}}import{Big as it}from"big.js";var jt=[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],pa=[37,...jt],Aa=[[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]],Ba=[[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]],ma=[[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]],ya=[[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]],Ea=[[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]],fa=[[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]],Sa=[0,1,2,3,37],Oa=[[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]],Da=[[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;((r)=>{r.EVEN="EVEN";r.ODD="ODD"})(V||={});var w;((r)=>{r.RED="RED";r.BLACK="BLACK"})(w||={});var U;((r)=>{r.LOW="LOW";r.HIGH="HIGH"})(U||={});var G;((e)=>{e.TOP="TOP";e.MIDDLE="MIDDLE";e.BOTTOM="BOTTOM"})(G||={});var Z;((e)=>{e.FIRST="FIRST";e.SECOND="SECOND";e.THIRD="THIRD"})(Z||={});var Nt;((r)=>{r.AMERICAN="AMERICAN";r.EUROPEAN="EUROPEAN"})(Nt||={});var nt=(t)=>{if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw d.createValidationError("Must place at least a single bet.");if(!t.straightBets.every((a)=>a.amount.gte(0)&&$(a.value)))throw d.createValidationError("Invalid straight bet.");if(!t.splitBets.every((a)=>a.amount.gte(0)&&wr(a.values)))throw d.createValidationError("Invalid split bet.");if(!t.streetBets.every((a)=>a.amount.gte(0)&&Ur(a.values)))throw d.createValidationError("Invalid street bet.");if(!t.cornerBets.every((a)=>a.amount.gte(0)&&Gr(a.values)))throw d.createValidationError("Invalid corner bet.");if(!t.doubleStreetBets.every((a)=>a.amount.gte(0)&&Zr(a.values)))throw d.createValidationError("Invalid double street bet.");if(!t.parityBets.every((a)=>a.amount.gte(0)&&Object.values(V).includes(a.parity)))throw d.createValidationError("Invalid parity bet.");if(!t.colorBets.every((a)=>a.amount.gte(0)&&Object.values(w).includes(a.color)))throw d.createValidationError("Invalid color bet.");if(!t.halfBets.every((a)=>a.amount.gte(0)&&Object.values(U).includes(a.half)))throw d.createValidationError("Invalid half bet.");if(!t.columnBets.every((a)=>a.amount.gte(0)&&Object.values(G).includes(a.column)))throw d.createValidationError("Invalid column bet.");if(!t.dozenBets.every((a)=>a.amount.gte(0)&&Object.values(Z).includes(a.dozen)))throw d.createValidationError("Invalid dozen bet.")},$=(t)=>{return jt.includes(t)},wr=(t)=>{if(t.length!==2)return!1;if(!t.every($))return!1;return Aa.some(([a,r])=>a===t[0]&&r===t[1])},Ur=(t)=>{if(t.length!==3)return!1;if(!t.every($))return!1;return ma.some(([a,r,e])=>a===t[0]&&r===t[1]&&e===t[2])},Gr=(t)=>{if(t.length!==4)return!1;if(!t.every($))return!1;return Ea.some(([a,r,e,n])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3])},Zr=(t)=>{if(t.length!==6)return!1;if(!t.every($))return!1;return Oa.some(([a,r,e,n,o,i])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3]&&o===t[4]&&i===t[5])};var ot=(t)=>{if(t.straightBets.length===0&&t.splitBets.length===0&&t.streetBets.length===0&&t.cornerBets.length===0&&t.basketBets.length===0&&t.doubleStreetBets.length===0&&t.parityBets.length===0&&t.colorBets.length===0&&t.halfBets.length===0&&t.columnBets.length===0&&t.dozenBets.length===0)throw d.createValidationError("Must place at least a single bet.");if(!t.straightBets.every((a)=>a.amount.gte(0)&&z(a.value)))throw d.createValidationError("Invalid straight bet.");if(!t.splitBets.every((a)=>a.amount.gte(0)&&kr(a.values)))throw d.createValidationError("Invalid split bet.");if(!t.streetBets.every((a)=>a.amount.gte(0)&&Fr(a.values)))throw d.createValidationError("Invalid street bet.");if(!t.cornerBets.every((a)=>a.amount.gte(0)&&Mr(a.values)))throw d.createValidationError("Invalid corner bet.");if(!t.basketBets.every((a)=>a.amount.gte(0)))throw d.createValidationError("Invalid basket bet.");if(!t.doubleStreetBets.every((a)=>a.amount.gte(0)&&Yr(a.values)))throw d.createValidationError("Invalid double street bet.");if(!t.parityBets.every((a)=>a.amount.gte(0)&&Object.values(V).includes(a.parity)))throw d.createValidationError("Invalid parity bet.");if(!t.colorBets.every((a)=>a.amount.gte(0)&&Object.values(w).includes(a.color)))throw d.createValidationError("Invalid color bet.");if(!t.halfBets.every((a)=>a.amount.gte(0)&&Object.values(U).includes(a.half)))throw d.createValidationError("Invalid half bet.");if(!t.columnBets.every((a)=>a.amount.gte(0)&&Object.values(G).includes(a.column)))throw d.createValidationError("Invalid column bet.");if(!t.dozenBets.every((a)=>a.amount.gte(0)&&Object.values(Z).includes(a.dozen)))throw d.createValidationError("Invalid dozen bet.")},z=(t)=>{return pa.includes(t)};function kr(t){if(t.length!==2)return!1;if(!t.every(z))return!1;return Ba.some(([a,r])=>a===t[0]&&r===t[1])}var Fr=(t)=>{if(t.length!==3)return!1;if(!t.every(z))return!1;return ya.some(([a,r,e])=>a===t[0]&&r===t[1]&&e===t[2])},Mr=(t)=>{if(t.length!==4)return!1;if(!t.every(z))return!1;return fa.some(([a,r,e,n])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3])},Yr=(t)=>{if(t.length!==6)return!1;if(!t.every(z))return!1;return Da.some(([a,r,e,n,o,i])=>a===t[0]&&r===t[1]&&e===t[2]&&n===t[3]&&o===t[4]&&i===t[5])};var Jr={straightBets:36,splitBets:18,streetBets:12,cornerBets:9,basketBets:7,doubleStreetBets:6,parityBets:2,colorBets:2,halfBets:2,columnBets:3,dozenBets:3},gr=[3,6,9,12,15,18,21,24,27,30,33,36],$r=[2,5,8,11,14,17,20,23,26,29,32,35],zr=[1,4,7,10,13,16,19,22,25,28,31,34],Xr=[1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36],qr=[2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35],Qr=2.7,Wr=5.3;class Vt extends A{constructor(){super("ROULETTE")}determineGameResult({generator:t,gameInputs:a}){this.validateInputs(a);let r=t.getRandomInt({min:0,max:this.maxNumber}),e=r.value,n=this.determineBetOutcomes(a,e),{payoutMultiplier:o}=this.getPayoutDetails(a,e);return{outputs:{betOutcomes:n,result:r.values},payoutMultiplier:o,isFinished:!0,randomValues:r}}getBetAmount(t){return this.calculateTotalBetAmount(this.getBetTotals(t))}getPayoutDetails(t,a){let r=this.determineBetOutcomes(t,a),e=this.getBetTotals(t),n=this.getBetTotals(r.winningBets),o=this.calculateTotalBetAmount(e),i=this.calculateTotalPayout(n);return{payoutMultiplier:o.gt(0)?i.div(o):new it(0),payoutAmount:i}}determineBetOutcomes(t,a){let r={},e={};for(let n of Object.keys(t)){let o=t[n],i=this.betPredicates[n],{winning:c,losing:u}=this.partitionBets(o,i,a);r[n]=c,e[n]=u}return{winningBets:r,losingBets:e}}calculateTotalAmount(t){return t.reduce((a,r)=>a.plus(r.amount),new it(0))}isWinningStraightBet(t,a){return t.value===a}isWinningSplitBet(t,a){return t.values.some((r)=>r===a)}isWinningStreetBet(t,a){return t.values.some((r)=>r===a)}isWinningCornerBet(t,a){return t.values.some((r)=>r===a)}isWinningDoubleStreetBet(t,a){return t.values.some((r)=>r===a)}isWinningColorBet(t,a){let r=t;return Xr.includes(a)&&r.color==="RED"||qr.includes(a)&&r.color==="BLACK"}isWinningHalfBet(t,a){let r=t;if(a>0&&a<=18&&r.half==="LOW")return!0;if(a>18&&a<=36&&r.half==="HIGH")return!0;return!1}isWinningColumnBet(t,a){let r=t;return gr.includes(a)&&r.column==="TOP"||$r.includes(a)&&r.column==="MIDDLE"||zr.includes(a)&&r.column==="BOTTOM"}isWinningDozenBet(t,a){let r=t;if(a>0&&a<=12&&r.dozen==="FIRST")return!0;if(a>12&&a<=24&&r.dozen==="SECOND")return!0;if(a>24&&a<=36&&r.dozen==="THIRD")return!0;return!1}isWinningParityBet(t,a){let r=t;if(a===0||a===37)return!1;let e=a%2===0?"EVEN":"ODD";return r.parity===e}getBetTotals(t){let a={};for(let r of Object.keys(t))a[r]=this.calculateTotalAmount(t[r]);return a}calculateTotalBetAmount(t){return Object.values(t).reduce((a,r)=>a.plus(r),new it(0))}partitionBets(t,a,r){return{winning:t.filter((e)=>a(e,r)),losing:t.filter((e)=>!a(e,r))}}calculateTotalPayout(t){return Object.entries(t).reduce((a,[r,e])=>{let o=Jr[r];return a.plus(e.mul(o||0))},new it(0))}}class Ca extends Vt{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(t){nt(t)}}class ha extends Vt{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(t){ot(t)}isWinningBasketBet(t,a){return Sa.some((r)=>r===a)}}class Ha extends A{europeanGame;americanGame;constructor(){super("ROULETTE");this.europeanGame=new Ca,this.americanGame=new ha}getBetAmount(t){switch(t.type){case"AMERICAN":return this.americanGame.getBetAmount(t.inputs);case"EUROPEAN":return this.europeanGame.getBetAmount(t.inputs);default:throw new Error("Unhandled roulette type")}}determineGameResult(t){let{gameInputs:a,...r}=t;if(t.edge===Qr&&a.type==="EUROPEAN"){let e=this.europeanGame.determineGameResult({...r,gameInputs:a.inputs}),{betOutcomes:n}=e.outputs;return{...e,outputs:{type:"european",betOutcomes:n,result:e.outputs.result}}}if(t.edge===Wr&&a.type==="AMERICAN"){let e=this.americanGame.determineGameResult({...r,gameInputs:a.inputs}),{betOutcomes:n}=e.outputs;return{...e,outputs:{type:"american",betOutcomes:n,result:e.outputs.result}}}throw d.createValidationError(`Attempted to play ${a.type} roulette on edge ${t.edge}`)}}var ii=(t)=>{return new Ha().getBetAmount(t)};var si=(t)=>{if(t.type==="EUROPEAN")nt(t.inputs);else ot(t.inputs)};import{Big as re}from"big.js";var X;((e)=>{e.LOW_RISK="LOW_RISK";e.MEDIUM_RISK="MEDIUM_RISK";e.HIGH_RISK="HIGH_RISK"})(X||={});var q;((o)=>{o[o.TEN=10]="TEN";o[o.TWENTY=20]="TWENTY";o[o.THIRTY=30]="THIRTY";o[o.FORTY=40]="FORTY";o[o.FIFTY=50]="FIFTY"})(q||={});var Lr={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}}},Kr={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}}},vr={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}}},te={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}}},ae={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}}},xa=new H(new Map([[1,Lr],[2,Kr],[3,vr],[4,te],[8,ae]]));var Ta={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 ee extends A{constructor(){super("WHEEL")}determineGameResult({generator:t,gameInputs:a,edge:r}){if(!Object.values(q).includes(a.segments))throw new Error("Invalid segments value");if(!Object.values(X).includes(a.riskLevel))throw new Error("Invalid risk level");let n=xa.getMultipliers(r)[a.riskLevel];if(n===void 0)throw new Error(`No multipliers found for risk level ${a.riskLevel}`);let o=n[a.segments];if(o===void 0)throw new Error(`No multipliers found for segment ${a.segments}`);let i=Ta[a.riskLevel];if(i===void 0)throw new Error(`No patterns found for risk level ${a.riskLevel}`);let c=i[a.segments];if(c===void 0)throw new Error(`No patterns found for segment ${a.segments}`);let u=t.getRandomInt({min:0,max:c.length-1}),p=c[u.value];if(p===void 0)throw new Error(`No pattern found for segment ${a.segments} and value ${u.value}`);let s=o[p];if(s===void 0)throw new Error(`No payout found for picked segment ${p}`);return{isFinished:!0,payoutMultiplier:new re(s),outputs:{result:u.values},randomValues:u}}}export{si as validateRouletteGameInputs,fe as validateAdvancedDiceInputs,Sr as rtp99Multipliers,Or as rtp98Multipliers,Dr as rtp97Multipliers,Cr as rtp96Multipliers,hr as rtp92Multipliers,sa as plinkoMultipliers,bt as nCr,ca as kenoMultipliers,ia as isTileCount,yr as hasDiceWon,sr as diamondsMultipliers,ii as calculateRouletteBetAmount,mr as calculateDiceWinChance,Ya as calculateBaccaratBetAmount,Gt as calculateAdvancedDiceWinChance,da as bigMin,la as bigMax,Na as advancedDiceIsWithinBoundsInclusive,dt as advancedDiceIsWithinBoundsExclusive,Va as advancedDiceGetInclusiveBoundsRange,ut as advancedDiceGetExclusiveBoundsRange,q as WheelSegments,X as WheelRiskLevel,ee as Wheel,$a as WIN_MULTIPLIER,Ga as VALID_SUITS,Za as VALID_RANKS,ma as VALID_EUROPEAN_STREETS,jt as VALID_EUROPEAN_STRAIGHTS,Aa as VALID_EUROPEAN_SPLITS,Oa as VALID_EUROPEAN_DOUBLE_STREETS,Ea as VALID_EUROPEAN_CORNERS,ya as VALID_AMERICAN_STREETS,pa as VALID_AMERICAN_STRAIGHTS,Ba as VALID_AMERICAN_SPLITS,Da as VALID_AMERICAN_DOUBLE_STREETS,fa as VALID_AMERICAN_CORNERS,Et as ThreeCardBonusType,gr as TOP_COLUMN,fr as TILE_COUNTS,Mt as THREE_CARD_BONUS_PAYOUTS,A as SingleActionGame,j as SPLIT_BET_SIZE_FACTOR,Nt as RouletteType,Ha as Roulette,wa as RollType,at as RandomValuePool,Xr as RED_NUMBERS,st as RANDOM_MIN_VALUE,pt as RANDOM_MAX_VALUE,ua as PlinkoRiskLevel,Vr as Plinko,V as Parity,yt as PairBonusType,za as PUSH_MULTIPLIER,wo as PLINKO_ROW_COUNTS,Jr as PAYOUT_MULTIPLIERS,Ft as PAIR_BONUS_PAYOUTS,S as OrigamiGame,R as MultiplierCalculator,xt as MultiActionGame,Rr as Mines,Pa as MIN_WIN_CHANCE,$r as MIDDLE_COLUMN,_a as MAX_WIN_CHANCE,St as MAX_CARDS_PER_ROUND,Tr as Limbo,Xa as LOSE_MULTIPLIER,oa as KenoRiskLevel,xr as Keno,Bt as InsuranceOutcome,Ot as INSURANCE_WIN_PAYOUT,M as INSURANCE_BET_SIZE_FACTOR,Ie as INSURANCE_BET_MULTIPLIER,U as Half,Ra as GameErrorCode,d as GameError,F as Game,kt as FACE_CARD_VALUE,Ca as EuropeanRoulette,Qr as EUROPEAN_HOUSE_EDGE,wt as EFFECTIVE_RANGE,Z as Dozen,Br as DiceDirection,Er as Dice,or as DiamondsResultType,Ar as Diamonds,P as DOUBLE_DOWN_BET_SIZE_FACTOR,ea as DICE_EFFECTIVE_RANGE,Zt as DEALER_STAND_VALUE,G as Column,w as Color,be as CARDS_PER_SUIT,At as BlackjackOutcome,mt as BlackjackActionType,er as Blackjack,ka as BaccaratOutcome,Fa as BaccaratBetType,Ja as Baccarat,ft as BUST_VALUE,zr as BOTTOM_COLUMN,qr as BLACK_NUMBERS,C as BLACKJACK_VALUE,ga as BLACKJACK_MULTIPLIER,L as BASE_PAYOUT_MULTIPLIERS,ha as AmericanRoulette,Ua as AdvancedDice,Wr as AMERICAN_HOUSE_EDGE,Sa as AMERICAN_BASKET,Dt as ACE_SOFT_BONUS};
|