@cristian.aragao/milharis-core 1.30.48 → 1.30.49

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants/EXTRACAO.ts","../src/constants/GAMES.ts","../src/constants/GRUPOS_BICHOS.ts","../src/constants/MESSAGES.ts","../src/constants/ROLES.ts","../src/constants/STATUS_PULE.ts","../src/constants/TIPO_VISUALIZACAO.ts","../src/constants/VISUALIZACAO.ts","../src/constants/PREFIX_NUMBER.ts","../src/constants/PREFIX_ENVIO_OLD.ts","../src/constants/PREFIX_ENVIO.ts","../src/constants/STATUS_DESCARGA.ts","../src/constants/KEYBOARD.ts","../src/constants/STATUS_DEVICE.ts","../src/constants/PREMIOS.ts","../src/constants/COMISSOES_PADRAO.ts","../src/functions/numbers/getCreatedBySystem.ts","../src/utils/index.ts","../src/utils/clone.ts","../src/utils/dateToNumber.ts","../src/utils/numberToDate.ts","../src/utils/pegarHorarioSaoPaulo.ts","../src/utils/combineDateTime.ts","../src/utils/getDataInicioFim.ts","../src/utils/formatBRL.ts","../src/utils/getAllCombinations.ts","../src/utils/showFormatDate.ts","../src/utils/numbersSelectedFormated.ts","../src/utils/generateId.ts","../src/utils/getCodigoAuth.ts","../src/utils/dividirArray.ts","../src/utils/delay.ts","../src/utils/normalize.ts","../src/utils/matchNormalized.ts","../src/utils/getInitials.ts","../src/utils/formatterPercentage.ts","../src/utils/parserPercentage.ts","../src/utils/formatterPercentageDecimal.ts","../src/utils/removerLetters.ts","../src/models/ExtracaoModel.ts","../src/functions/numbers/index.ts","../src/functions/numbers/formatarNumero.ts","../src/functions/descarga/generateDescarga.ts","../src/functions/descarga/getDescargaIdPeloNumero.ts","../src/functions/descarga/generateDescargas.ts","../src/functions/numbers/gerarDezenas.ts","../src/functions/numbers/getSomaEnvio.ts","../src/functions/numbers/getSomaVP.ts","../src/functions/numbers/getNumeroId.ts","../src/functions/numbers/getTiposJogos.ts","../src/functions/numbers/calcularValorDeNumero.ts","../src/functions/numbers/getPremioFormato.ts","../src/functions/numbers/calculaValoresDosNumeros.ts","../src/functions/numbers/getNumerosAcimaDoLimite.ts","../src/functions/numbers/arrendondarParaCima.ts","../src/functions/numbers/sortNumeros.ts","../src/functions/numbers/getPropsEnvioId.ts","../src/functions/numbers/getPropsEnvioIdOld.ts","../src/functions/numbers/getPropsVP.ts","../src/functions/numbers/getPropsPrefix.ts","../src/functions/numbers/getSomaProps.ts","../src/functions/limite_jogos/getLimiteJogoPeloTipoJogo.ts","../src/functions/limite_jogos/index.ts","../src/functions/limite_jogos/calcularValorJogoPeloLimite.ts","../src/functions/limite_jogos/getValorJogoPeloTipoJogo.ts","../src/functions/numbers/getLimiteSimulado.ts","../src/functions/extracao/index.ts","../src/functions/extracao/getAvailableTimes.ts","../src/functions/games/index.ts","../src/functions/games/calculateAmount.ts","../src/functions/games/calculateAmountGame.ts","../src/functions/games/getBetDateToNumber.ts","../src/functions/games/formatPuleId.ts","../src/functions/games/getFormattedPuleId.ts","../src/functions/games/invertGame.ts","../src/functions/games/fazerJogo.ts","../src/functions/games/getGamesUnicos.ts","../src/functions/extracao/pegarExtracoes.ts","../src/functions/extracao/extracaoEstaAtivaTryCatch.ts","../src/functions/extracao/extracaoEstaAtivaBoolean.ts","../src/functions/users/index.ts","../src/functions/users/permissions.ts","../src/functions/users/getLimitsRest.ts","../src/functions/descarga/index.ts","../src/functions/descarga/sortDescargas.ts","../src/functions/descarga/getDescargasAcimaDoLimite.ts","../src/functions/descarga/getPropsVPDescarga.ts","../src/functions/descarga/getPropsEnvioIdDescarga.ts","../src/functions/descarga/getPropsEnvioIdOldDescarga.ts","../src/functions/descarga/getDescargaIdPeloEnvio.ts","../src/functions/descarga/getTotalGeralDescarga.ts","../src/functions/index.ts","../src/models/MessageModel.ts","../src/models/ResultadoModel.ts","../src/models/RouteModel.ts","../src/models/UserModel.ts","../src/models/ValueGameModel.ts","../src/models/GameModel.ts","../src/models/NumberModel.ts","../src/models/BetModel.ts","../src/models/PremiacaoModel.ts","../src/models/PDFModel.ts","../src/models/BancaModel.ts","../src/models/AuditLogModel.ts","../src/models/LimitGameModel.ts","../src/models/EnvioDescargaModel.ts","../src/models/DescargaModel.ts","../src/models/DeviceModel.ts","../src/models/PremiacaoAssociacaoModel.ts","../src/models/ComissaoDescargaModel.ts","../src/repo/collections.ts","../src/repo/generic.ts","../src/repo/createRepoFactory.ts"],"sourcesContent":["export const EXTRACAO = [13, 16, 19] as const","// \"nome_jogo1-nome_jogo2\" -> 2 jogos\r\n// \"nome_jogo1-nome_jogo2\" -> 2 jogos\r\n\r\nexport const GAMES = {\r\n \"milhar\": {\r\n id: \"milhar\",\r\n label: \"Milhar\",\r\n sigla: \"M\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 1,\r\n showPerLine: 6,\r\n },\r\n \"centena\": {\r\n id: \"centena\",\r\n label: \"Centena\",\r\n sigla: \"C\",\r\n format: \"###\",\r\n formatDigitar: \"###\",\r\n markAll: false,\r\n max: 0,\r\n order: 2,\r\n showPerLine: 7,\r\n },\r\n \"dezena\": {\r\n id: \"dezena\",\r\n label: \"Dezena\",\r\n sigla: \"D\",\r\n format: \"##\",\r\n formatDigitar: \"##\",\r\n markAll: false,\r\n max: 0,\r\n order: 3,\r\n showPerLine: 0,\r\n },\r\n \"grupo\": {\r\n id: \"grupo\",\r\n label: \"Grupo\",\r\n sigla: \"G\",\r\n max: 25, // 0 a 25\r\n format: \"##\",\r\n formatDigitar: \"##\",\r\n markAll: false,\r\n order: 4,\r\n showPerLine: 0\r\n },\r\n \"terno.dezena\": {\r\n id: \"terno.dezena\",\r\n label: \"Terno de Dezena\",\r\n sigla: \"TD\",\r\n format: \"##-##-##\",\r\n formatDigitar: \"######\",\r\n markAll: true,\r\n max: 0,\r\n order: 5,\r\n showPerLine: 3,\r\n },\r\n \"terno.grupo\": {\r\n id: \"terno.grupo\",\r\n label: \"Terno de Grupo\",\r\n sigla: \"TG\",\r\n max: 25, // (0-25)-(0-25)-(0-25)\r\n format: \"##-##-##\",\r\n formatDigitar: \"######\",\r\n markAll: true,\r\n order: 6,\r\n showPerLine: 3\r\n },\r\n \"duque.dezena\": {\r\n id: \"duque.dezena\",\r\n label: \"Duque de Dezena\",\r\n sigla: \"DD\",\r\n format: \"##-##\",\r\n formatDigitar: \"####\",\r\n markAll: true,\r\n max: 0,\r\n order: 7,\r\n showPerLine: 5\r\n },\r\n \"duque.grupo\": {\r\n id: \"duque.grupo\",\r\n label: \"Duque de Grupo\",\r\n sigla: \"DG\",\r\n max: 25, // (0-25)-(0-25)\r\n format: \"##-##\",\r\n formatDigitar: \"####\",\r\n markAll: true,\r\n order: 8,\r\n showPerLine: 5\r\n },\r\n \"milhar.invertida\": {\r\n id: \"milhar.invertida\",\r\n label: \"Milhar Invertida\",\r\n sigla: \"MI\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"centena.invertida\": {\r\n id: \"centena.invertida\",\r\n label: \"Centena Invertida\",\r\n sigla: \"CI\",\r\n format: \"###\",\r\n formatDigitar: \"###\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 7\r\n },\r\n \"milhar@centena\": {\r\n id: \"milhar@centena\",\r\n label: \"Milhar Centena\",\r\n sigla: \"MC\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"milhar.invertida@centena.invertida\": {\r\n id: \"milhar.invertida@centena.invertida\",\r\n label: \"Milhar e Centena Invertidas\",\r\n sigla: \"MCI\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"milhar@dezena\": {\r\n id: \"milhar@dezena\",\r\n label: \"Milhar e Dezena\",\r\n sigla: \"MD\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"milhar@centena@dezena\": {\r\n id: \"milhar@centena@dezena\",\r\n label: \"Milhar, Centena e Dezena\",\r\n sigla: \"MCD\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"centena@dezena\": {\r\n id: \"centena@dezena\",\r\n label: \"Centena Dezena\",\r\n sigla: \"CD\",\r\n format: \"###\",\r\n formatDigitar: \"###\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 7\r\n },\r\n} as const;","const BICHOS = {\r\n '01': 'Avestruz',\r\n '02': 'Águia',\r\n '03': 'Burro',\r\n '04': 'Borboleta',\r\n '05': 'Cachorro',\r\n '06': 'Cabra',\r\n '07': 'Carneiro',\r\n '08': 'Camelo',\r\n '09': 'Cobra',\r\n '10': 'Coelho',\r\n '11': 'Cavalo',\r\n '12': 'Elefante',\r\n '13': 'Galo',\r\n '14': 'Gato',\r\n '15': 'Jacaré',\r\n '16': 'Leão',\r\n '17': 'Macaco',\r\n '18': 'Porco',\r\n '19': 'Pavão',\r\n '20': 'Peru',\r\n '21': 'Touro',\r\n '22': 'Tigre',\r\n '23': 'Urso',\r\n '24': 'Veado',\r\n '25': 'Vaca'\r\n} as const;\r\n\r\nexport const GRUPOS_BICHOS = {\r\n '01': { grupo: '01', bicho: BICHOS['01'] },\r\n '02': { grupo: '01', bicho: BICHOS['01'] },\r\n '03': { grupo: '01', bicho: BICHOS['01'] },\r\n '04': { grupo: '01', bicho: BICHOS['01'] },\r\n '05': { grupo: '02', bicho: BICHOS['02'] },\r\n '06': { grupo: '02', bicho: BICHOS['02'] },\r\n '07': { grupo: '02', bicho: BICHOS['02'] },\r\n '08': { grupo: '02', bicho: BICHOS['02'] },\r\n '09': { grupo: '03', bicho: BICHOS['03'] },\r\n '10': { grupo: '03', bicho: BICHOS['03'] },\r\n '11': { grupo: '03', bicho: BICHOS['03'] },\r\n '12': { grupo: '03', bicho: BICHOS['03'] },\r\n '13': { grupo: '04', bicho: BICHOS['04'] },\r\n '14': { grupo: '04', bicho: BICHOS['04'] },\r\n '15': { grupo: '04', bicho: BICHOS['04'] },\r\n '16': { grupo: '04', bicho: BICHOS['04'] },\r\n '17': { grupo: '05', bicho: BICHOS['05'] },\r\n '18': { grupo: '05', bicho: BICHOS['05'] },\r\n '19': { grupo: '05', bicho: BICHOS['05'] },\r\n '20': { grupo: '05', bicho: BICHOS['05'] },\r\n '21': { grupo: '06', bicho: BICHOS['06'] },\r\n '22': { grupo: '06', bicho: BICHOS['06'] },\r\n '23': { grupo: '06', bicho: BICHOS['06'] },\r\n '24': { grupo: '06', bicho: BICHOS['06'] },\r\n '25': { grupo: '07', bicho: BICHOS['07'] },\r\n '26': { grupo: '07', bicho: BICHOS['07'] },\r\n '27': { grupo: '07', bicho: BICHOS['07'] },\r\n '28': { grupo: '07', bicho: BICHOS['07'] },\r\n '29': { grupo: '08', bicho: BICHOS['08'] },\r\n '30': { grupo: '08', bicho: BICHOS['08'] },\r\n '31': { grupo: '08', bicho: BICHOS['08'] },\r\n '32': { grupo: '08', bicho: BICHOS['08'] },\r\n '33': { grupo: '09', bicho: BICHOS['09'] },\r\n '34': { grupo: '09', bicho: BICHOS['09'] },\r\n '35': { grupo: '09', bicho: BICHOS['09'] },\r\n '36': { grupo: '09', bicho: BICHOS['09'] },\r\n '37': { grupo: '10', bicho: BICHOS['10'] },\r\n '38': { grupo: '10', bicho: BICHOS['10'] },\r\n '39': { grupo: '10', bicho: BICHOS['10'] },\r\n '40': { grupo: '10', bicho: BICHOS['10'] },\r\n '41': { grupo: '11', bicho: BICHOS['11'] },\r\n '42': { grupo: '11', bicho: BICHOS['11'] },\r\n '43': { grupo: '11', bicho: BICHOS['11'] },\r\n '44': { grupo: '11', bicho: BICHOS['11'] },\r\n '45': { grupo: '12', bicho: BICHOS['12'] },\r\n '46': { grupo: '12', bicho: BICHOS['12'] },\r\n '47': { grupo: '12', bicho: BICHOS['12'] },\r\n '48': { grupo: '12', bicho: BICHOS['12'] },\r\n '49': { grupo: '13', bicho: BICHOS['13'] },\r\n '50': { grupo: '13', bicho: BICHOS['13'] },\r\n '51': { grupo: '13', bicho: BICHOS['13'] },\r\n '52': { grupo: '13', bicho: BICHOS['13'] },\r\n '53': { grupo: '14', bicho: BICHOS['14'] },\r\n '54': { grupo: '14', bicho: BICHOS['14'] },\r\n '55': { grupo: '14', bicho: BICHOS['14'] },\r\n '56': { grupo: '14', bicho: BICHOS['14'] },\r\n '57': { grupo: '15', bicho: BICHOS['15'] },\r\n '58': { grupo: '15', bicho: BICHOS['15'] },\r\n '59': { grupo: '15', bicho: BICHOS['15'] },\r\n '60': { grupo: '15', bicho: BICHOS['15'] },\r\n '61': { grupo: '16', bicho: BICHOS['16'] },\r\n '62': { grupo: '16', bicho: BICHOS['16'] },\r\n '63': { grupo: '16', bicho: BICHOS['16'] },\r\n '64': { grupo: '16', bicho: BICHOS['16'] },\r\n '65': { grupo: '17', bicho: BICHOS['17'] },\r\n '66': { grupo: '17', bicho: BICHOS['17'] },\r\n '67': { grupo: '17', bicho: BICHOS['17'] },\r\n '68': { grupo: '17', bicho: BICHOS['17'] },\r\n '69': { grupo: '18', bicho: BICHOS['18'] },\r\n '70': { grupo: '18', bicho: BICHOS['18'] },\r\n '71': { grupo: '18', bicho: BICHOS['18'] },\r\n '72': { grupo: '18', bicho: BICHOS['18'] },\r\n '73': { grupo: '19', bicho: BICHOS['19'] },\r\n '74': { grupo: '19', bicho: BICHOS['19'] },\r\n '75': { grupo: '19', bicho: BICHOS['19'] },\r\n '76': { grupo: '19', bicho: BICHOS['19'] },\r\n '77': { grupo: '20', bicho: BICHOS['20'] },\r\n '78': { grupo: '20', bicho: BICHOS['20'] },\r\n '79': { grupo: '20', bicho: BICHOS['20'] },\r\n '80': { grupo: '20', bicho: BICHOS['20'] },\r\n '81': { grupo: '21', bicho: BICHOS['21'] },\r\n '82': { grupo: '21', bicho: BICHOS['21'] },\r\n '83': { grupo: '21', bicho: BICHOS['21'] },\r\n '84': { grupo: '21', bicho: BICHOS['21'] },\r\n '85': { grupo: '22', bicho: BICHOS['22'] },\r\n '86': { grupo: '22', bicho: BICHOS['22'] },\r\n '87': { grupo: '22', bicho: BICHOS['22'] },\r\n '88': { grupo: '22', bicho: BICHOS['22'] },\r\n '89': { grupo: '23', bicho: BICHOS['23'] },\r\n '90': { grupo: '23', bicho: BICHOS['23'] },\r\n '91': { grupo: '23', bicho: BICHOS['23'] },\r\n '92': { grupo: '23', bicho: BICHOS['23'] },\r\n '93': { grupo: '24', bicho: BICHOS['24'] },\r\n '94': { grupo: '24', bicho: BICHOS['24'] },\r\n '95': { grupo: '24', bicho: BICHOS['24'] },\r\n '96': { grupo: '24', bicho: BICHOS['24'] },\r\n '97': { grupo: '25', bicho: BICHOS['25'] },\r\n '98': { grupo: '25', bicho: BICHOS['25'] },\r\n '99': { grupo: '25', bicho: BICHOS['25'] },\r\n '00': { grupo: '25', bicho: BICHOS['25'] }\r\n} as const;\r\n\r\n","export const MESSAGES = {\r\n required: \"Obrigatório.\",\r\n list_length_zero: \"Selecione pelo menos um item.\",\r\n incorrect_login: \"Usuário e/ou senha incorretos!\",\r\n incorrect_password: \"Senha incorreta.\",\r\n email_already_in_use: \"Este login já está sendo usado!\",\r\n invalid_device: \"Este login já está sendo usado em outro dispositivo!\",\r\n} as const;\r\n","export const ROLES = {\r\n \"super_admin\": {\r\n \"id\": \"super_admin\",\r\n \"label\": \"Super Administrador\",\r\n },\r\n \"associacao\": {\r\n \"id\": \"associacao\",\r\n \"label\": \"Associação\",\r\n },\r\n \"admin\": { // Banca\r\n \"id\": \"admin\",\r\n \"label\": \"Administrador\",\r\n },\r\n \"sub_admin\": { // Banca sub-admin\r\n \"id\": \"sub_admin\",\r\n \"label\": \"Sub-administrador\",\r\n },\r\n \"digitador_adm\": { // pertence à banca\r\n \"id\": \"digitador_adm\",\r\n \"label\": \"Digitador Administrador\",\r\n },\r\n \"digitador\": { // pertence à banca\r\n \"id\": \"digitador\",\r\n \"label\": \"Digitador\",\r\n },\r\n \"cambista_talao\": { // pertence à banca // que usa talão\r\n \"id\": \"cambista_talao\",\r\n \"label\": \"Cambista de talão\",\r\n },\r\n \"cambista\": { // pertence à banca // que usa maquininha\r\n \"id\": \"cambista\",\r\n \"label\": \"Cambista\",\r\n },\r\n} as const","export const STATUS_PULE = {\r\n PROCESSANDO: {\r\n id: \"PROCESSANDO\",\r\n label: \"PROCESSANDO\",\r\n color: \"green\",\r\n showSite: false,\r\n ordem: 0,\r\n },\r\n JOGADA: {\r\n id: \"JOGADA\",\r\n label: \"PULES JOGADAS\",\r\n color: \"green\",\r\n showSite: true,\r\n ordem: 1,\r\n },\r\n AGUARDANDO_CANCELAMENTO: {\r\n id: \"AGUARDANDO_CANCELAMENTO\",\r\n label: \"AGUARDANDO CANCELAMENTO\",\r\n color: \"yellow\",\r\n showSite: true,\r\n ordem: 3,\r\n },\r\n CANCELADA: {\r\n id: \"CANCELADA\",\r\n label: \"CANCELADAS\",\r\n color: \"red\",\r\n showSite: true,\r\n ordem: 4,\r\n },\r\n} as const;\r\n","export const TIPO_VISUALIZACAO = {\r\n \"notificacao\": {\r\n id: \"notificacao\",\r\n label: \"Notificação\"\r\n },\r\n \"impressao\": {\r\n id: \"impressao\",\r\n label: \"Impressão\"\r\n },\r\n} as const","export const VISUALIZACAO = {\r\n \"agora\": {\r\n id: \"agora\",\r\n label: \"Agora\"\r\n },\r\n \"jogo_hoje\": {\r\n id: \"jogo_hoje\",\r\n label: \"Jogo Hoje\"\r\n },\r\n \"jogo_pre_datado\": {\r\n id: \"jogo_pre_datado\",\r\n label: \"Jogo Pré-Datado\"\r\n },\r\n \"resultado\": {\r\n id: \"resultado\",\r\n label: \"Resultado\"\r\n }\r\n} as const","export const PREFIX_NUMBER = \"vp_\" as const;","export const PREFIX_ENVIO_OLD = \"envio_old_\" as const;","export const PREFIX_ENVIO = \"envio_\" as const;","export const STATUS_DESCARGA = {\r\n \"ENVIANDO\": {\r\n id: \"ENVIANDO\",\r\n labelBanca: \"ENVIANDO\",\r\n labelAssociacao: \"RECEBENDO\",\r\n color: \"blue\",\r\n showSiteBanca: true,\r\n showSiteAssociacao: false,\r\n order: 1\r\n },\r\n \"DEVOLVENDO\": {\r\n id: \"DEVOLVENDO\",\r\n labelBanca: \"RECEBENDO\",\r\n labelAssociacao: \"DEVOLVENDO\",\r\n color: \"blue\",\r\n showSiteBanca: false,\r\n showSiteAssociacao: false,\r\n order: 1\r\n },\r\n \"ENVIADA\": {\r\n id: \"ENVIADA\",\r\n labelBanca: \"ENVIADA\",\r\n labelAssociacao: \"RECEBIDA\",\r\n color: \"green\",\r\n showSiteBanca: true,\r\n showSiteAssociacao: true,\r\n order: 2\r\n },\r\n \"DEVOLVIDA\": {\r\n id: \"DEVOLVIDA\",\r\n labelBanca: \"DEVOLVIDA\",\r\n labelAssociacao: \"DEVOLVIDA\",\r\n color: \"orange\",\r\n showSiteBanca: true,\r\n showSiteAssociacao: true,\r\n order: 3\r\n },\r\n \"ERRO\": {\r\n id: \"ERRO\",\r\n labelBanca: \"ERRO\",\r\n labelAssociacao: \"ERRO\",\r\n color: \"red\",\r\n showSiteBanca: false,\r\n showSiteAssociacao: false,\r\n order: 4\r\n }\r\n} as const","export const KEYBOARD = {\r\n\r\n Enter: { label: \"Enter\", value: \"enter\" },\r\n Ctrl: { label: \"Ctrl\", value: \"ctrl\" },\r\n Tab: { label: \"Tab\", value: \"tab\" },\r\n Space: { label: \"\\u23b5\", value: \"space\" },\r\n Backspace: { label: \"Backspace\", value: \"backspace\" },\r\n Escape: { label: \"Esc\", value: \"escape\" },\r\n Delete: { label: \"Del\", value: \"delete\" },\r\n Backslash: { label: \"\\\\\", value: \"backslash\" },\r\n Semicolon: { label: \";\", value: \"semicolon\" },\r\n CapsLock: { label: \"CapsLock\", value: \"capslock\" },\r\n Quote: { label: \"'\", value: \"quote\" },\r\n Comma: { label: \",\", value: \"decimal,comma\" },\r\n\r\n Insert: { label: \"Insert\", value: \"insert\" },\r\n Home: { label: \"Home\", value: \"home\" },\r\n End: { label: \"End\", value: \"end\" },\r\n PageUp: { label: \"Page Up\", value: \"pageup\" },\r\n PageDown: { label: \"Page Down\", value: \"pagedown\" },\r\n\r\n ArrowUp: { label: \"↑\", value: \"arrowup\" },\r\n ArrowDown: { label: \"↓\", value: \"arrowdown\" },\r\n ArrowLeft: { label: \"←\", value: \"arrowleft\" },\r\n ArrowRight: { label: \"→\", value: \"arrowright\" },\r\n\r\n \r\n NumLock: { label: \"Num Lock\", value: \"numlock\" },\r\n /**\r\n * @description The decimal point key (typically . or\r\n * , depending on the region).\r\n * In newer browsers, this value to be the character generated by the\r\n * decimal key (one of those two characters). [1]\r\n */\r\n Dot: { label: \".\", value: \"period,comma\" },\r\n\r\n /** The numeric keypad's multiplication key, /. */\r\n Divide: { label: \"/\", value: \"slash,divide\" },\r\n\r\n /** @description The numeric keypad's addition key, -. */\r\n Subtract: { label: \"-\", value: \"minus,subtract\" },\r\n\r\n /** The numeric keypad's multiplication key, *. */\r\n Multiply: { label: '*', value: 'multiply,shift+8' },\r\n\r\n /** The numeric keypad's addition key, +. */\r\n Add: { label: \"+\", value: \"add,shift+equal\" },\r\n\r\n Equal: { id: \"Equal\", label: \"=\", value: \"equal\" },\r\n\r\n // -------\r\n // FNs\r\n\r\n F1: { label: \"F1\", value: \"f1\" },\r\n F2: { label: \"F2\", value: \"f2\" },\r\n F3: { label: \"F3\", value: \"f3\" },\r\n F4: { label: \"F4\", value: \"f4\" },\r\n F5: { label: \"F5\", value: \"f5\" },\r\n F6: { label: \"F6\", value: \"f6\" },\r\n F7: { label: \"F7\", value: \"f7\" },\r\n F8: { label: \"F8\", value: \"f8\" },\r\n F9: { label: \"F9\", value: \"f9\" },\r\n F10: { label: \"F10\", value: \"f10\" },\r\n F11: { label: \"F11\", value: \"f11\" },\r\n F12: { label: \"F12\", value: \"f12\" },\r\n\r\n // -------\r\n // numbers\r\n\r\n 0: { label: \"0\", value: \"0\" },\r\n 1: { label: \"1\", value: \"1\" },\r\n 2: { label: \"2\", value: \"2\" },\r\n 3: { label: \"3\", value: \"3\" },\r\n 4: { label: \"4\", value: \"4\" },\r\n 5: { label: \"5\", value: \"5\" },\r\n 6: { label: \"6\", value: \"6\" },\r\n 7: { label: \"7\", value: \"7\" },\r\n 8: { label: \"8\", value: \"8\" },\r\n 9: { label: \"9\", value: \"9\" },\r\n\r\n // -------\r\n // letters\r\n\r\n A: { label: \"A\", value: \"a\" },\r\n B: { label: \"B\", value: \"b\" },\r\n C: { label: \"C\", value: \"c\" },\r\n D: { label: \"D\", value: \"d\" },\r\n E: { label: \"E\", value: \"e\" },\r\n F: { label: \"F\", value: \"f\" },\r\n G: { label: \"G\", value: \"g\" },\r\n H: { label: \"H\", value: \"h\" },\r\n I: { label: \"I\", value: \"i\" },\r\n J: { label: \"J\", value: \"j\" },\r\n K: { label: \"K\", value: \"k\" },\r\n L: { label: \"L\", value: \"l\" },\r\n M: { label: \"M\", value: \"m\" },\r\n N: { label: \"N\", value: \"n\" },\r\n O: { label: \"O\", value: \"o\" },\r\n P: { label: \"P\", value: \"p\" },\r\n Q: { label: \"Q\", value: \"q\" },\r\n R: { label: \"R\", value: \"r\" },\r\n S: { label: \"S\", value: \"s\" },\r\n T: { label: \"T\", value: \"t\" },\r\n U: { label: \"U\", value: \"u\" },\r\n V: { label: \"V\", value: \"v\" },\r\n W: { label: \"W\", value: \"w\" },\r\n X: { label: \"X\", value: \"x\" },\r\n Y: { label: \"Y\", value: \"y\" },\r\n Z: { label: \"Z\", value: \"z\" },\r\n\r\n} as const;\r\n","export const STATUS_DEVICE = {\r\n \"EM_ESPERA\": {\r\n \"id\": \"EM_ESPERA\",\r\n \"label\": \"Esperando aprovação\",\r\n \"color\": \"orange\"\r\n },\r\n \"APROVADO\": {\r\n \"id\": \"APROVADO\",\r\n \"label\": \"Aprovado\",\r\n \"color\": \"green\"\r\n },\r\n \"BLOQUEADO\": {\r\n \"id\": \"BLOQUEADO\",\r\n \"label\": \"Bloqueado\",\r\n \"color\": \"red\"\r\n }\r\n} as const","export const PREMIOS = {\r\n \"1\": {\r\n id: \"1\",\r\n order: 1,\r\n label: \"1º Prêmio\",\r\n labelShort: \"1º\",\r\n },\r\n \"2\": {\r\n id: \"2\",\r\n order: 2,\r\n label: \"2º Prêmio\",\r\n labelShort: \"2º\",\r\n },\r\n \"3\": {\r\n id: \"3\",\r\n order: 3,\r\n label: \"3º Prêmio\",\r\n labelShort: \"3º\",\r\n },\r\n \"4\": {\r\n id: \"4\",\r\n order: 4,\r\n label: \"4º Prêmio\",\r\n labelShort: \"4º\",\r\n },\r\n \"5\": {\r\n id: \"5\",\r\n order: 5,\r\n label: \"5º Prêmio\",\r\n labelShort: \"5º\",\r\n },\r\n \"1-5\": {\r\n id: \"1-5\",\r\n order: 6,\r\n label: \"1º ao 5º Prêmio\",\r\n labelShort: \"1º ao 5º\",\r\n }\r\n} as const","import { GAMES } from \"./GAMES\";\r\n\r\nexport const COMISSOES_PADRAO = {\r\n [GAMES.milhar.id]: {\r\n id: GAMES.milhar.id,\r\n label: GAMES.milhar.label,\r\n order: 1,\r\n },\r\n [GAMES.centena.id]: {\r\n id: GAMES.centena.id,\r\n label: GAMES.centena.label,\r\n order: 2,\r\n },\r\n [GAMES.dezena.id]: {\r\n id: GAMES.dezena.id,\r\n label: GAMES.dezena.label,\r\n order: 3,\r\n },\r\n [GAMES.grupo.id]: {\r\n id: GAMES.grupo.id,\r\n label: GAMES.grupo.label,\r\n order: 4,\r\n },\r\n [GAMES[\"terno.dezena\"].id]: {\r\n id: GAMES[\"terno.dezena\"].id,\r\n label: GAMES[\"terno.dezena\"].label,\r\n order: 5,\r\n },\r\n [GAMES[\"terno.grupo\"].id]: {\r\n id: GAMES[\"terno.grupo\"].id,\r\n label: GAMES[\"terno.grupo\"].label,\r\n order: 6,\r\n },\r\n [GAMES[\"duque.dezena\"].id]: {\r\n id: GAMES[\"duque.dezena\"].id,\r\n label: GAMES[\"duque.dezena\"].label,\r\n order: 7,\r\n },\r\n [GAMES[\"duque.grupo\"].id]: {\r\n id: GAMES[\"duque.grupo\"].id,\r\n label: GAMES[\"duque.grupo\"].label,\r\n order: 8,\r\n },\r\n restante: {\r\n id: \"restante\",\r\n label: \"Restante\",\r\n order: 9,\r\n },\r\n} as const;\r\n","import { TypeMetaData } from \"../../types\";\r\n\r\n/**\r\n * @description\r\n * Gera um objeto `createdBy` com informações de criação, usando dados fornecidos ou,\r\n * caso estejam ausentes, valores padrão definidos pelo sistema.\r\n * \r\n * Essa função é útil para garantir que todos os campos de autoria estejam preenchidos\r\n * corretamente mesmo quando não houver um usuário autenticado no contexto.\r\n * \r\n * Campos padrão utilizados:\r\n * - `id`: \"system\"\r\n * - `role`: \"super_admin\"\r\n * - `name`: \"Gerado automaticamente pelo sistema\"\r\n * - `login`: \"system\"\r\n */\r\nexport const getCreatedBySystem = (\r\n obj?: Partial<TypeMetaData[\"createdBy\"]>\r\n): TypeMetaData[\"createdBy\"] => ({\r\n id: obj?.id || \"system\",\r\n id_integer: obj?.id_integer || \"system\",\r\n role: obj?.role || \"super_admin\",\r\n name: obj?.name || \"Gerado automaticamente pelo sistema\",\r\n login: obj?.login || \"system\",\r\n});\r\n","export { clone } from \"./clone\";\r\nexport { combineDateTime } from \"./combineDateTime\";\r\nexport { dateToNumber } from \"./dateToNumber\";\r\nexport { numberToDate } from \"./numberToDate\";\r\nexport { getDataInicioFim } from \"./getDataInicioFim\";\r\nexport { formatterBRL, parserBRL } from \"./formatBRL\";\r\nexport { getAllCombinations } from \"./getAllCombinations\";\r\nexport { showFormatDate } from \"./showFormatDate\";\r\nexport { numbersSelectedFormated } from \"./numbersSelectedFormated\";\r\nexport { generateId } from \"./generateId\";\r\nexport { getCodigoAuth } from \"./getCodigoAuth\";\r\nexport { pegarHorarioSaoPaulo } from \"./pegarHorarioSaoPaulo\";\r\nexport { dividirArray } from \"./dividirArray\";\r\nexport { delay } from \"./delay\";\r\nexport { matchNormalized } from \"./matchNormalized\";\r\nexport { normalize } from \"./normalize\";\r\nexport { getInitials } from \"./getInitials\";\r\nexport { formatterPercentage } from \"./formatterPercentage\";\r\nexport { parserPercentage } from \"./parserPercentage\";\r\nexport { formatterPercentageDecimal, parserPercentageDecimal } from \"./formatterPercentageDecimal\";\r\nexport { removerLetters } from \"./removerLetters\";","import cloneDeep from 'clone-deep'\r\n\r\n/**\r\n*\t@description Função que clona um objeto, array ou data\r\n*\t@param {T} item - item a ser clonado\r\n*\t@returns {T} item clonado\r\n*\t@example\r\n*\tclone([1, 3, 4]) // [1, 3, 4]\r\n*/\r\nexport const clone = <T>(item: T): T =>\r\n\tcloneDeep(item)\r\n","import { isValid } from \"date-fns\";\r\n\r\n/**\r\n * Converte um objeto `Date` para um número no formato `yyyyMMddHHmmss`.\r\n * Se a data for inválida ou não informada, retorna 0.\r\n *\r\n * @param {Date} [date] - Objeto `Date` a ser convertido.\r\n * @returns {number} Representação numérica da data no formato `yyyyMMddHHmmss`.\r\n */\r\nexport const dateToNumber = (date?: Date): number => {\r\n if (!date || !isValid(date)) return 0;\r\n\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hour = String(date.getHours()).padStart(2, '0');\r\n const minute = String(date.getMinutes()).padStart(2, '0');\r\n const second = String(date.getSeconds()).padStart(2, '0');\r\n\r\n return Number(`${year}${month}${day}${hour}${minute}${second}`);\r\n};\r\n","import { parse, isValid } from \"date-fns\";\r\nimport { pegarHorarioSaoPaulo } from \"./pegarHorarioSaoPaulo\";\r\n\r\n/**\r\n * Converte um número no formato `yyyyMMddHHmmss` para um objeto `Date`.\r\n * Se o número for inválido ou não informado, retorna a data atual.\r\n *\r\n * @param {number} [number] - Número representando a data no formato `yyyyMMddHHmmss`.\r\n * @returns {Date} Objeto `Date` correspondente ao número informado.\r\n */\r\nexport const numberToDate = (number?: number): Date | undefined => {\r\n if (!number) return undefined;\r\n\r\n const str = number.toString();\r\n\r\n const year = str.slice(0, 4);\r\n const month = str.slice(4, 6);\r\n const day = str.slice(6, 8);\r\n const hour = str.slice(8, 10);\r\n const minute = str.slice(10, 12);\r\n const second = str.slice(12, 14);\r\n\r\n const dateString = `${year}-${month}-${day} ${hour}:${minute}:${second}`;\r\n\r\n const dateNow = pegarHorarioSaoPaulo();\r\n\r\n const date = parse(dateString, \"yyyy-MM-dd HH:mm:ss\", dateNow);\r\n\r\n return isValid(date) ? date : undefined;\r\n};\r\n","import moment from \"moment-timezone\";\r\n\r\nexport const pegarHorarioSaoPaulo = (): Date => {\r\n \r\n const string = moment\r\n .tz(new Date(), \"America/Sao_Paulo\")\r\n .format(\"DD_MM_YYYY_HH_mm_ss_SSS\");\r\n\r\n const [day, month, year, hour, minutes, seconds, milliseconds] =\r\n string.split(\"_\");\r\n\r\n return new Date(\r\n Number(year),\r\n Number(month) - 1,\r\n Number(day),\r\n Number(hour),\r\n Number(minutes),\r\n Number(seconds),\r\n Number(milliseconds)\r\n );\r\n};\r\n","import { dateToNumber } from \"./dateToNumber\";\r\nimport { numberToDate } from \"./numberToDate\";\r\n\r\n/**\r\n * Combina a data (ano, mês, dia) de um timestamp (`dateA`)\r\n * com o horário (hora, minuto, segundo) de outro timestamp (`dateB`).\r\n * Ambos os timestamps devem estar no formato `yyyyMMddHHmmss`.\r\n *\r\n * @param {number} dateA - Número no formato `yyyyMMddHHmmss` contendo a data base (ano, mês e dia).\r\n * @param {number} dateB - Número no formato `yyyyMMddHHmmss` contendo o horário base (hora, minuto e segundo).\r\n * @returns {number} Um novo número no formato `yyyyMMddHHmmss` combinando a data de `dateA` com a hora de `dateB`.\r\n *\r\n * @example\r\n * // Combina 2023-12-25 com 14:30:00\r\n * const result = combineDateTime(20231225000000, 20230101143000);\r\n * 20231225143000\r\n */\r\nexport const combineDateTime = (dateA: number, dateB: number): number => {\r\n const dateAParts = numberToDate(dateA);\r\n const dateBParts = numberToDate(dateB);\r\n\r\n if (!dateAParts || !dateBParts) return 0;\r\n\r\n const year = dateAParts.getFullYear();\r\n const month = dateAParts.getMonth(); // zero-based\r\n const day = dateAParts.getDate();\r\n\r\n const hours = dateBParts.getHours();\r\n const minutes = dateBParts.getMinutes();\r\n const seconds = dateBParts.getSeconds();\r\n\r\n const combinedDate = new Date(year, month, day, hours, minutes, seconds, 0);\r\n\r\n return dateToNumber(combinedDate);\r\n};\r\n","import { setHours, setMinutes, setSeconds } from \"date-fns\";\r\nimport { numberToDate } from \"./numberToDate\";\r\nimport { dateToNumber } from \"./dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"./pegarHorarioSaoPaulo\";\r\n\r\n/**\r\n * A partir de uma data no formato numérico (`yyyyMMddHHmmss`),\r\n * retorna o início e fim do dia dessa data no mesmo formato numérico.\r\n *\r\n * @param {Object} params - Parâmetro contendo a data.\r\n * @param {number} params.dataAposta - Data no formato `yyyyMMddHHmmss`.\r\n * @returns {{ dataInicio: number, dataFim: number }} Datas de início (00:00:00) e fim (23:59:59) do dia.\r\n */\r\nexport const getDataInicioFim = ({ dataAposta }: { dataAposta: number }) => {\r\n const dataInicio = setSeconds(\r\n setMinutes(setHours(numberToDate(dataAposta) || pegarHorarioSaoPaulo(), 0), 0),\r\n 0\r\n );\r\n\r\n const dataFim = setSeconds(\r\n setMinutes(setHours(numberToDate(dataAposta) || pegarHorarioSaoPaulo(), 23), 59),\r\n 59\r\n );\r\n\r\n return {\r\n dataInicio: dateToNumber(dataInicio),\r\n dataFim: dateToNumber(dataFim),\r\n };\r\n};\r\n","export const formatterBRL = (value: number) => {\r\n\r\n\tconst cloneValue = value\r\n\r\n\tconst valueS = new Intl.NumberFormat('pt-BR', {\r\n\t\tstyle: 'currency',\r\n\t\tcurrency: 'BRL',\r\n\t}).format(cloneValue || 0)\r\n\treturn valueS\r\n}\r\n\r\nexport const parserBRL = (value: string) => {\r\n\r\n\tlet cloneValue = value\r\n\r\n\tcloneValue = cloneValue.replace(/\\D/g, '')\r\n\tlet valueN = parseFloat(cloneValue || '0')\r\n\tvalueN /= 100\r\n\treturn valueN\r\n}\r\n","/**\r\n * Função para gerar todas as permutações de um array, sem duplicações.\r\n * @param arr - O array de números ou caracteres.\r\n * @returns Um array com todas as permutações possíveis, sem duplicações.\r\n */\r\nconst generatePermutations = (arr: string[]): string[][] => {\r\n if (arr.length === 0) return [[]];\r\n\r\n const result: Set<string[]> = new Set();\r\n\r\n for (let i = 0; i < arr.length; i++) {\r\n const current = arr[i];\r\n const remaining = [...arr.slice(0, i), ...arr.slice(i + 1)];\r\n const remainingPermutations = generatePermutations(remaining);\r\n\r\n for (const perm of remainingPermutations) {\r\n result.add([current, ...perm]);\r\n }\r\n }\r\n\r\n return Array.from(result);\r\n};\r\n\r\n/**\r\n * Função para pegar um número e gerar todas as suas combinações únicas.\r\n * @param num - O número como string ou número.\r\n * @returns Um array de strings com todas as combinações possíveis, sem duplicações.\r\n */\r\nexport const getAllCombinations = (num: number | string): string[] => {\r\n const numArr = num.toString().split(\"\");\r\n const permutations = generatePermutations(numArr);\r\n\r\n // Usar um Set para garantir combinações únicas\r\n const uniqueCombinations = new Set(permutations.map((perm) => perm.join(\"\")));\r\n\r\n return Array.from(uniqueCombinations);\r\n};\r\n","import { numberToDate } from \"./numberToDate\";\r\nimport { format } from \"date-fns\";\r\n\r\nexport const showFormatDate = (number: number, formatString?: string) => {\r\n if (!number) return \"N/A\";\r\n\r\n const date = numberToDate(number);\r\n\r\n if (!date) return \"N/A\";\r\n\r\n return format(date, formatString || \"dd/MM/yyyy\");\r\n};\r\n","export const numbersSelectedFormated = (numbersString: number[]): string => {\r\n const numbers = numbersString.map(Number);\r\n if (numbers.length === 0) return \"\";\r\n // Ordena os números para garantir que estejam em ordem crescente\r\n numbers.sort((a, b) => a - b);\r\n let result = \"\";\r\n let start = numbers[0]; // Início do intervalo\r\n let end = start; // Fim do intervalo\r\n for (let i = 1; i <= numbers.length; i++) {\r\n if (i < numbers.length && numbers[i] === end + 1) {\r\n // Se o próximo número for consecutivo, expande o intervalo\r\n end = numbers[i];\r\n } else {\r\n // Se o próximo número não for consecutivo, finaliza o intervalo\r\n if (start === end) {\r\n // Se o intervalo tem um único número\r\n result += start;\r\n } else {\r\n // Se o intervalo tem mais de um número\r\n result += `${start} ao ${end}`;\r\n }\r\n if (i < numbers.length) {\r\n // Adiciona uma vírgula se não for o último intervalo\r\n result += \", \";\r\n // Inicia um novo intervalo\r\n start = numbers[i];\r\n end = start;\r\n }\r\n }\r\n }\r\n return result;\r\n };","/**\r\n * Generate a unique id\r\n * @returns {string} - A unique id\r\n * @example\r\n * generateUniqueId('user')\r\n * => user-19a2c5db-23eb-9b2b-c764-695249595f59\r\n * @example\r\n * generateUniqueId()\r\n * => 19a2c5db-23eb-9b2b-c764-695249595f59\r\n **/\r\n\r\nexport const generateId = (prefix?: string) => {\r\n\tconst s4 = () => Math.floor((1 + Math.random()) * 0x10000)\r\n\t\t.toString(16)\r\n\t\t.substring(1)\r\n\treturn `${prefix ? `${prefix}-` : ''}${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`\r\n}","/**\r\n * @description Gera um código de autenticação aleatório entre os valores mínimo e máximo fornecidos.\r\n * @example getCodigoAuth(100000, 999999) -> 435231\r\n*/\r\nexport const getCodigoAuth = (min: number, max: number) => {\r\n min = Math.ceil(min);\r\n max = Math.floor(max);\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n};\r\n","export const dividirArray = <T>(arrayGrande: T[], tamanho = 1000): T[][] => {\r\n const resultado: T[][] = [];\r\n\r\n // Percorre o array grande e divide em subarrays de tamanho especificado\r\n for (let i = 0; i < arrayGrande.length; i += tamanho) {\r\n const subarray = arrayGrande.slice(i, i + tamanho); // Cria um subarray de 500 elementos\r\n resultado.push(subarray); // Adiciona o subarray ao array de resultado\r\n }\r\n\r\n return resultado;\r\n};\r\n","/**\r\n * @description Retorna uma Promise que resolve após um determinado tempo (em milissegundos).\r\n *\r\n * Útil para simular atrasos ou criar efeitos assíncronos como \"sleep\".\r\n *\r\n * @param {number} ms - A quantidade de milissegundos para esperar.\r\n * @returns {Promise<void>} Uma Promise que resolve após o tempo especificado.\r\n *\r\n * @example\r\n * await delay(1000); // espera 1 segundo\r\n */\r\nexport const delay = (ms: number): Promise<void> => {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n};\r\n","/**\r\n * @description Normaliza uma string para facilitar comparações e buscas textuais.\r\n * A normalização remove:\r\n * - Espaços extras nas extremidades\r\n * - Diferenças entre maiúsculas e minúsculas\r\n * - Acentos e caracteres diacríticos (como ç, á, é, ñ etc.)\r\n *\r\n * @param {string} str - A string que será normalizada.\r\n * @returns {string} A string normalizada, em minúsculas e sem acentos.\r\n *\r\n * @example\r\n * normalize('Árvore') // 'arvore'\r\n * normalize(' Café ') // 'cafe'\r\n * normalize('JoÃO') // 'joao'\r\n */\r\nexport const normalize = (str: string): string =>\r\n str\r\n .trim()\r\n .toLowerCase()\r\n .normalize(\"NFD\")\r\n .replace(/[\\u0300-\\u036f]/g, \"\");\r\n","import { normalize } from \"./normalize\";\r\n\r\n/**\r\n * @description Verifica se o texto contém a palavra de busca,\r\n * desconsiderando acentuação, letras maiúsculas/minúsculas e caracteres especiais.\r\n *\r\n * @param {string} text - O texto base no qual a busca será realizada.\r\n * @param {string} search - A string de busca a ser procurada dentro do texto.\r\n * @returns {boolean} Retorna `true` se a string de busca for encontrada dentro do texto normalizado, senão `false`.\r\n *\r\n * @example\r\n * matchNormalized('Retropolis', 'retro'); // true\r\n * matchNormalized('Café com Leite', 'cafe'); // true\r\n * matchNormalized('Firewall', 'blinding'); // false\r\n */\r\nexport const matchNormalized = (text: string, search: string): boolean => {\r\n return normalize(text).includes(normalize(search));\r\n};\r\n","/**\r\n * Retorna as iniciais de um nome completo.\r\n * \r\n * A função extrai as primeiras letras maiúsculas dos dois primeiros nomes\r\n * válidos (com ao menos 2 caracteres) de uma string representando o nome completo.\r\n *\r\n * @param nomeCompleto - Uma string contendo o nome completo.\r\n * @returns As iniciais maiúsculas dos dois primeiros nomes válidos, ou uma string vazia se não houver nomes válidos.\r\n *\r\n * @example\r\n * getInitials(\"Maria Joaquina Silva\") // retorna \"MJ\"\r\n * getInitials(\"Jo\") // retorna \"J\"\r\n * getInitials(\"A B\") // retorna \"\" (nomes com menos de 2 letras são ignorados)\r\n */\r\nexport const getInitials = (nomeCompleto: string): string => {\r\n if (!nomeCompleto) return '';\r\n\r\n const nomesValidos = nomeCompleto\r\n .trim()\r\n .split(/\\s+/)\r\n .filter((nome) => nome.length >= 2);\r\n\r\n const iniciais = nomesValidos\r\n .slice(0, 2)\r\n .map((nome) => nome[0].toUpperCase());\r\n\r\n return iniciais.join('');\r\n};\r\n","/**\r\n * Formata um número decimal (entre 0 e 1) como porcentagem inteira.\r\n *\r\n * @param {number} value - Um valor decimal (ex: 0.25) que será convertido em porcentagem (25 %).\r\n * @returns {string} A string formatada como porcentagem com base no locale \"pt-BR\".\r\n *\r\n * @example\r\n * formatterPercentage(0.25); // \"25 %\"\r\n * formatterPercentage(1); // \"100 %\"\r\n */\r\nexport const formatterPercentage = (value: number): string => {\r\n value;\r\n\r\n const valueS = new Intl.NumberFormat(\"pt-BR\", {\r\n style: \"decimal\",\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: 0,\r\n }).format(value || 0);\r\n\r\n return `${valueS} %`;\r\n};","export const parserPercentage = (value: string, newValue?: string): number => {\r\n\tvalue = value.replace(/\\D/g, \"\");\r\n\tnewValue = newValue?.replace(/\\D/g, \"\");\r\n\r\n\tif (newValue) {\r\n\t\tif (Number(newValue) === Number(value))\r\n\t\t\tnewValue = newValue.slice(0, -1);\r\n\r\n\t\tlet newValueN = Number(Number(newValue || \"0\").toFixed(2));\r\n\t\treturn newValueN;\r\n\t}\r\n\r\n\tlet valueN = Number(Number(value || \"0\").toFixed(2));\r\n\treturn valueN;\r\n};\r\n","/**\r\n * Formata um número decimal (entre 0 e 1) como porcentagem inteira.\r\n *\r\n * @param {number} value - Um valor decimal (ex: 0.25) que será convertido em porcentagem (25 %).\r\n * @returns {string} A string formatada como porcentagem com base no locale \"pt-BR\".\r\n *\r\n * @example\r\n * formatterPercentage(0.25); // \"25 %\"\r\n * formatterPercentage(1); // \"100 %\"\r\n */\r\nexport const formatterPercentageDecimal = (value: number): string => {\r\n value *= 100;\r\n\r\n const valueS = new Intl.NumberFormat(\"pt-BR\", {\r\n style: \"decimal\",\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: 0,\r\n }).format(value || 0);\r\n\r\n return `${valueS} %`;\r\n};\r\n\r\n/**\r\n * Converte uma string de porcentagem digitada pelo usuário em um valor decimal (0–1).\r\n * \r\n * - Remove todos os caracteres não numéricos (mantém apenas dígitos).\r\n * - Caso `newValue` seja passado, ele é usado como base para lidar com digitação interativa,\r\n * permitindo apagar o último dígito corretamente.\r\n * - O resultado final sempre será um número decimal entre `0` e `1`.\r\n *\r\n * @param {string} value - String contendo dígitos de porcentagem (ex: \"25\", \"25 %\", \"100%\").\r\n * @param {string} [newValue] - Novo valor bruto digitado (opcional, usado para edição em tempo real).\r\n * @returns {number} Valor decimal correspondente (ex: \"25\" → 0.25, \"100\" → 1).\r\n *\r\n * @example\r\n * parserPercentage(\"25\"); // 0.25\r\n * parserPercentage(\"100%\"); // 1\r\n * parserPercentage(\"25\", \"2\"); // 0.02 (simula digitação interativa)\r\n */\r\nexport const parserPercentageDecimal = (value: string, newValue?: string): number => {\r\n value = value.replace(/\\D/g, \"\");\r\n newValue = newValue?.replace(/\\D/g, \"\");\r\n\r\n if (newValue) {\r\n if (Number(newValue) === Number(value))\r\n newValue = newValue.slice(0, -1);\r\n\r\n let newValueN = Number(Number(newValue || \"0\").toFixed(2)) / 100;\r\n return newValueN;\r\n }\r\n\r\n let valueN = Number(Number(value || \"0\").toFixed(2)) / 100;\r\n return valueN;\r\n};\r\n","/**\r\n * Remove todos os caracteres não numéricos de uma string\r\n * \r\n * Esta função usa uma expressão regular para filtrar qualquer caractere que não seja dígito (0-9),\r\n * mantendo apenas os caracteres numéricos na string.\r\n * \r\n * @param value - A string de entrada que pode conter letras, números e caracteres especiais\r\n * @returns Uma nova string contendo apenas os caracteres numéricos da entrada\r\n * \r\n * @example\r\n * ```typescript\r\n * removerLetters(\"abc123def456\") // retorna \"123456\"\r\n * removerLetters(\"telefone: (11) 99999-9999\") // retorna \"11999999999\"\r\n * removerLetters(\"sem números aqui\") // retorna \"\"\r\n * removerLetters(\"123\") // retorna \"123\"\r\n * ```\r\n */\r\nexport const removerLetters = (value: string): string => {\r\n\treturn value.replace(/[^0-9]/g, \"\");\r\n};","import { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\nimport { TypeExtracao } from \"../types/extracao.type\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\n\r\nexport const ExtracaoModel = (obj?: Partial<TypeExtracao>): TypeExtracao => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n horario: obj?.horario || 0,\r\n bloqueio: obj?.bloqueio || 0,\r\n bancaId: obj?.bancaId || \"\",\r\n ativo: obj?.ativo ?? true,\r\n inativo_no_dia: obj?.inativo_no_dia || [],\r\n description: obj?.description || \"\",\r\n somente_no_feriado: obj?.somente_no_feriado || 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n days: {\r\n 0: obj?.days?.[0] ?? false, // domingo\r\n 1: obj?.days?.[1] ?? false,\r\n 2: obj?.days?.[2] ?? false,\r\n 3: obj?.days?.[3] ?? false,\r\n 4: obj?.days?.[4] ?? false,\r\n 5: obj?.days?.[5] ?? false,\r\n 6: obj?.days?.[6] ?? false, // sabado\r\n },\r\n});\r\n","export { formatarNumero } from './formatarNumero';\r\nexport { generateDescargas } from '../descarga/generateDescargas';\r\nexport { gerarDezenas } from './gerarDezenas';\r\nexport { getSomaEnvio } from './getSomaEnvio';\r\nexport { getSomaVP } from './getSomaVP';\r\nexport { getCreatedBySystem } from './getCreatedBySystem';\r\nexport { getNumeroId } from './getNumeroId';\r\nexport { calculaValoresDosNumeros } from './calculaValoresDosNumeros';\r\nexport { getNumerosAcimaDoLimite } from './getNumerosAcimaDoLimite';\r\nexport { arredondarParaCima } from './arrendondarParaCima';\r\nexport { sortNumeros } from './sortNumeros';\r\nexport { getPropsPrefix } from './getPropsPrefix';\r\nexport { getPropsEnvioId } from './getPropsEnvioId';\r\nexport { getPropsEnvioIdOld } from './getPropsEnvioIdOld';\r\nexport { getPropsVP } from './getPropsVP';\r\nexport { getTiposJogos } from './getTiposJogos';\r\nexport { calcularValorDeNumero } from './calcularValorDeNumero';\r\nexport { getPremioFormato } from './getPremioFormato';\r\nexport { getSomaProps } from \"./getSomaProps\"\r\nexport { getLimiteSimulado } from './getLimiteSimulado';\r\n","// Função que formata automaticamente a partir de um padrão\r\n\r\n/**\r\n * @description Esta função formata o numero para o formato de jogo passado\r\n * \r\n * @example formatarNumero(\"1234\", \"###\") // \"234\"\r\n * @example formatarNumero(\"1234\", \"##-##\") // \"12-34\"\r\n * @example formatarNumero(\"123456\", \"##-##-##\") // \"12-34-56\"\r\n*/\r\nexport const formatarNumero = (numero: string, formato: string) => {\r\n let resultado = '';\r\n let indiceNumero = numero.length - 1; // Começa do final do número\r\n let indiceFormato = formato.length - 1; // Começa do final do formato\r\n\r\n // Percorre o formato de trás para frente e substitui os dígitos conforme o padrão\r\n while (indiceFormato >= 0) {\r\n if (formato[indiceFormato] === '#') {\r\n resultado = numero[indiceNumero] + resultado; // Adiciona dígito do número\r\n indiceNumero--;\r\n } else if (formato[indiceFormato] === '-') {\r\n resultado = '-' + resultado; // Adiciona hífen no resultado\r\n }\r\n indiceFormato--; // Anda para o próximo caractere do formato\r\n }\r\n\r\n return resultado;\r\n \r\n};","import { DescargaModel } from \"../../models\";\r\nimport { TypeNumero } from \"../../types\";\r\nimport { TypeDescarga } from \"../../types/descarga.type\";\r\n\r\n/**\r\n * Gera uma descarga a partir de um número de aposta\r\n *\r\n * Esta função cria uma nova descarga (representação de uma aposta) baseada em um número específico.\r\n * Ela copia todas as propriedades do número para a descarga e adiciona propriedades adicionais\r\n * baseadas em prefixos específicos para diferentes tipos de dados.\r\n *\r\n * @param numero - O número de aposta que será usado para gerar a descarga\r\n * @param id - ID único da descarga que será usado\r\n * @returns Uma descarga completa com todas as propriedades necessárias\r\n *\r\n * @example\r\n * ```typescript\r\n * const numero = { numero: \"1234\", tipo_jogo: \"mega\", amount: 100, ... };\r\n * const descargaId = \"banca1_20240627140000_milhar_1_15\";\r\n * const descarga = generateDescarga(numero, descargaId);\r\n * ```\r\n */\r\nexport const generateDescarga = (\r\n numero: TypeNumero,\r\n id: string\r\n): TypeDescarga => {\r\n // Usa o ID fornecido como parâmetro para a descarga\r\n const descargaId = id;\r\n\r\n const lastEnvioId =\r\n numero?.envioIds?.length > 0\r\n ? numero.envioIds[numero.envioIds.length - 1]\r\n : \"\";\r\n\r\n // Cria uma nova instância de descarga usando o modelo, copiando todas as propriedades do número\r\n const descarga = DescargaModel({\r\n ...numero,\r\n id: descargaId, // ID único da descarga\r\n premio: numero.premio, // Valor do prêmio\r\n amount: numero.amount,\r\n numeros: [numero.numero], // Valor total da aposta\r\n amountEnviadoParaAssociacao: numero.amountEnviadoParaAssociacao, // Valor enviado para a banca\r\n valorAEnviarParaAssociacao: numero.valorAEnviarParaAssociacao, // Valor enviado para a banca\r\n envioId: lastEnvioId, // IDs dos envios relacionados\r\n dataAposta: numero.dataAposta, // Data em que a aposta foi feita\r\n bancaId: numero.bancaId, // ID da banca responsável\r\n valorArredondado: numero.valorArredondado, // Valor arredondado da aposta\r\n limiteJogoReal: numero.limiteJogoReal, // Limite para jogos reais\r\n limiteJogoSimulado: numero.limiteJogoSimulado, // Limite para jogos simulados\r\n valorJogo: numero.valorJogo, // Valor específico do jogo\r\n });\r\n\r\n // Retorna a descarga completa com todas as propriedades\r\n return descarga;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\nimport { arredondarParaCima } from \"../numbers\";\r\n\r\n/**\r\n * Gera um ID de descarga único baseado nas propriedades do número fornecido\r\n * \r\n * Esta função cria um identificador único para uma descarga combinando várias propriedades\r\n * do número de aposta. O ID é formado pela concatenação de: bancaId (opcional), dataAposta,\r\n * tipo_jogo, premio e o amount arredondado (valor total da aposta).\r\n * \r\n * IMPORTANTE: Usa o 'amount' (valor total) em vez da soma dos VPs para garantir que\r\n * números com o mesmo valor total sejam agrupados na mesma descarga, evitando\r\n * descargas duplicadas quando apostas são feitas rapidamente.\r\n * \r\n * @param numero - O número de aposta que será usado para gerar o ID\r\n * @param getByProperty - Propriedade opcional para usar um valor específico em vez do amount padrão\r\n * @returns Uma string única identificando a descarga\r\n * \r\n * @example\r\n * ```ts\r\n * const numero = {\r\n * bancaId: 'banca1',\r\n * dataAposta: '20240627140000',\r\n * tipo_jogo: 'milhar',\r\n * premio: \"1\",\r\n * amount: 30\r\n * };\r\n * const descargaId = getDescargaIdPeloNumero(numero);\r\n * // Resultado: \"banca1_20240627140000_milhar_1_30\"\r\n * ```\r\n */\r\nexport const getDescargaIdPeloNumero = (\r\n numero: TypeNumero,\r\n getByProperty?: string\r\n) => {\r\n // Usa o amount (valor total da aposta) em vez da soma dos VPs para gerar o ID\r\n const valorParaId = getByProperty \r\n ? arredondarParaCima(Number(numero[getByProperty as keyof TypeNumero])) \r\n : arredondarParaCima(numero.amount);\r\n\r\n const descargaId =\r\n `${numero?.bancaId ? `${numero?.bancaId}_` : \"\"}` +\r\n `${numero.dataAposta}_${numero.tipo_jogo}_${numero.premio}_${valorParaId}`;\r\n\r\n return descargaId;\r\n};\r\n","import { TypeNumeros } from \"../../types\";\r\nimport { TypeDescargas } from \"../../types/descarga.type\";\r\nimport { generateDescarga } from \"./generateDescarga\";\r\nimport { getDescargaIdPeloNumero } from \"./getDescargaIdPeloNumero\";\r\n\r\n/**\r\n * Gera múltiplas descargas a partir de uma coleção de números de apostas\r\n * \r\n * Esta função agrupa números de apostas em descargas baseado em um ID único gerado\r\n * pelas propriedades de cada número. Números com o mesmo ID são agrupados na mesma\r\n * descarga, consolidando seus valores e arrays de números/envios.\r\n * \r\n * @param numeros - Coleção de números de apostas a serem processados\r\n * @param getByProperty - Propriedade opcional para usar no cálculo do ID da descarga\r\n * @returns Objeto com descargas agrupadas por ID único\r\n * \r\n * @example\r\n * ```typescript\r\n * const numeros = { \"1\": numero1, \"2\": numero2, ... };\r\n * const descargas = generateDescargas(numeros);\r\n * // Resultado: { \"descargaId1\": descarga1, \"descargaId2\": descarga2, ... }\r\n * ```\r\n */\r\nexport const generateDescargas = (\r\n numeros: TypeNumeros,\r\n getByProperty?: string\r\n): TypeDescargas => {\r\n const descargas: TypeDescargas = {};\r\n\r\n Object.entries(numeros).forEach(([, numero]) => {\r\n const descargaId = getDescargaIdPeloNumero(numero, getByProperty);\r\n\r\n if (!descargas[descargaId]) {\r\n // Se não existe, cria uma nova descarga usando o primeiro número como base e passa o ID gerado\r\n descargas[descargaId] = generateDescarga(numero, descargaId);\r\n } else {\r\n descargas[descargaId].numeros.push(numero.numero);\r\n }\r\n });\r\n\r\n return descargas;\r\n};\r\n","import { GAMES } from '../../constants/GAMES';\r\nimport { TypeBet } from '../../types/bet.type';\r\nimport { formatarNumero } from './formatarNumero';\r\n\r\n/**\r\n * @description Gera as dezenas a partir das apostas\r\n *\r\n * @example gerarDezenas( [ { name: \"milhar\", numbers: [\"1234\", \"5678\"] } ] ) \r\n * -> [\"34\", \"78\"]\r\n * @example gerarDezenas( [ { name: \"milhar\", numbers: [\"12-34\", \"56-78\"] } ] )\r\n * -> [\"12\", \"34\",\"56\", \"78\"]\r\n */\r\nexport const gerarDezenas = (bets: TypeBet[]): string[] => {\r\n const newNumbers: string[] = [];\r\n bets.forEach((bet) => {\r\n const TYPE_GAME = GAMES[bet.name];\r\n bet.numbers.forEach((number) => {\r\n if (TYPE_GAME.id === 'dezena') {\r\n const nums = number.split('-');\r\n for (const num of nums) {\r\n if (num.length < TYPE_GAME.format.length) continue;\r\n const n = formatarNumero(num, TYPE_GAME.format);\r\n newNumbers.push(n);\r\n }\r\n return;\r\n }\r\n const num = number.replaceAll('-', '');\r\n if (num.length < TYPE_GAME.format.replaceAll('-', '').length) return;\r\n const n = formatarNumero(num, TYPE_GAME.format);\r\n newNumbers.push(n);\r\n });\r\n });\r\n\r\n const uniqueCombinations = new Set(newNumbers);\r\n\r\n const nums = Array.from(uniqueCombinations);\r\n\r\n return nums;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\n\r\n/**\r\n * @description Retorna a soma dos todos os valores do\r\n * número enviado em cada envio\r\n *\r\n * @example getSomaVP({ envio_23: 10, envio_24: 5 }) -> 15\r\n */\r\nexport const getSomaEnvio = (numero: TypeNumero): number => {\r\n let soma = 0;\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n !array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n soma += value;\r\n }\r\n });\r\n\r\n return soma;\r\n};\r\n","import { PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeNumero } from \"../../types\";\r\nimport { getSomaEnvio } from \"./getSomaEnvio\";\r\n\r\n/**\r\n * @description Retorna a soma dos todos os valores de pule\r\n * e a quantidade de pules que possuem valor maior que 0\r\n *\r\n * @example getSomaVP({ vp_15-0023: 10, vp_15-0024: 0 }) -> { soma: 10, quantidadeDePules: 1 }\r\n * @example getSomaVP({ vp_15-0023: 10, vp_15-0024: 5 }) -> { soma: 15, quantidadeDePules: 2 }\r\n */\r\nexport const getSomaVP = (\r\n numero: TypeNumero\r\n): {\r\n soma: number;\r\n quantidadeDePulesMaiorQueZero: number;\r\n somaEnviadoParaAssociacao: number;\r\n} => {\r\n let soma = 0;\r\n let quantidadeDePulesMaiorQueZero = 0;\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n \r\n if (key.startsWith(PREFIX_NUMBER) && typeof value === \"number\") {\r\n soma += value;\r\n if (value > 0) {\r\n quantidadeDePulesMaiorQueZero += 1;\r\n }\r\n }\r\n \r\n });\r\n\r\n const somaEnviadoParaAssociacao = getSomaEnvio(numero)\r\n\r\n soma -= somaEnviadoParaAssociacao;\r\n\r\n return { soma, quantidadeDePulesMaiorQueZero, somaEnviadoParaAssociacao };\r\n};\r\n","import { GAMES } from \"../../constants\";\r\nimport { formatarNumero } from \"./formatarNumero\";\r\n\r\nexport const getNumeroId = (props: {\r\n dataAposta: number;\r\n jogo: keyof typeof GAMES;\r\n premio: string;\r\n numero: string;\r\n bancaId: string;\r\n descarregado?: boolean;\r\n}) => {\r\n const { dataAposta, jogo, numero, bancaId, premio, descarregado } = props;\r\n\r\n const TYPE_GAME = GAMES[jogo];\r\n\r\n const numeroFormatado = TYPE_GAME.markAll\r\n ? numero\r\n : formatarNumero(numero, TYPE_GAME.format);\r\n\r\n let descarregadoFormatado = descarregado ? \"true\" : \"false\";\r\n\r\n const numberId =\r\n (bancaId ? `${bancaId}_` : \"\") +\r\n `${dataAposta}_${jogo}_${premio}_${numeroFormatado}_${descarregadoFormatado}`;\r\n\r\n return numberId;\r\n};\r\n","import { GAMES } from \"../../constants\";\r\n\r\nexport const getTiposJogos = (tipos: string) => {\r\n const jogos = tipos.replaceAll(\".invertida\", \"\").split(\"@\");\r\n return jogos as (keyof typeof GAMES)[];\r\n};","// calcularValorDeNumero.ts\r\n\r\nimport { GAMES } from \"../../constants\";\r\nimport { getTiposJogos } from \"./getTiposJogos\";\r\n\r\n/**\r\n * Calcula o valor atribuído a cada número apostado, com base nos parâmetros do jogo.\r\n *\r\n * O cálculo segue três etapas:\r\n * 1. Divide o prêmio total (`valorPremio`) pelo número de tipos de jogos (determinado por `getTiposJogos`).\r\n * 2. Divide o resultado pela quantidade de números apostados (`quantidadeDeNumeros`).\r\n * 3. Se `markAll` for falso, divide ainda pela quantidade de prêmios (`quantidadeDePremios`).\r\n *\r\n * @param {Object} options — Parâmetros de entrada.\r\n * @param {number} options.quantidadeDeNumeros — Quantidade de números apostados.\r\n * @param {keyof typeof GAMES} options.tipoJogo — Tipo de jogo conforme chave de `GAMES`.\r\n * @param {number} options.valorPremio — Valor total do prêmio a ser distribuído.\r\n * @param {number} options.quantidadeDePremios — Quantidade de prêmios, se aplicável (usa 1 como fallback se zero).\r\n * @returns {number} — Valor calculado por número apostado.\r\n */\r\nexport const calcularValorDeNumero = ({\r\n quantidadeDeNumeros,\r\n tipoJogo,\r\n valorPremio,\r\n quantidadeDePremios,\r\n}: {\r\n quantidadeDeNumeros: number;\r\n tipoJogo: keyof typeof GAMES;\r\n valorPremio: number;\r\n quantidadeDePremios: number;\r\n}): number => {\r\n const TYPE_GAME = GAMES[tipoJogo];\r\n\r\n const jogos = getTiposJogos(tipoJogo);\r\n\r\n //* 1. Divide o prêmio total (`valorPremio`) pelo número de tipos de jogos (determinado por `getTiposJogos`).\r\n let valorDoNumero = valorPremio / (jogos.length || 1);\r\n\r\n //* 2. Divide o resultado pela quantidade de números apostados (`quantidadeDeNumeros`).\r\n valorDoNumero /= quantidadeDeNumeros;\r\n\r\n //* 3. Se `markAll` for falso, divide ainda pela quantidade de prêmios (`quantidadeDePremios`).\r\n if (!TYPE_GAME.markAll) {\r\n valorDoNumero /= (quantidadeDePremios || 1);\r\n }\r\n\r\n if(quantidadeDePremios === 0) valorDoNumero = 0\r\n\r\n return valorDoNumero;\r\n};\r\n","import { PREMIOS } from \"../../constants\";\r\n\r\n/**\r\n * @description Retorna o formato do prêmio\r\n * @param premio - Prêmio a ser formatado\r\n * @returns Formato do prêmio\r\n * @example getPremioFormato(1) // \"1\"\r\n * @example getPremioFormato(2) // \"2\"\r\n * @example getPremioFormato(3) // \"3\"\r\n * @example getPremioFormato(4) // \"4\"\r\n * @example getPremioFormato(5) // \"5\"\r\n */\r\nexport const getPremioFormato = (premio: number) => {\r\n if (premio === 1) return PREMIOS[\"1\"].id;\r\n if (premio === 2) return PREMIOS[\"2\"].id;\r\n if (premio === 3) return PREMIOS[\"3\"].id;\r\n if (premio === 4) return PREMIOS[\"4\"].id;\r\n if (premio === 5) return PREMIOS[\"5\"].id;\r\n return PREMIOS[\"1-5\"].id;\r\n};\r\n","import { formatarNumero } from \"./formatarNumero\";\r\nimport { pegarHorarioSaoPaulo } from \"../../utils/pegarHorarioSaoPaulo\";\r\nimport { TypeGame, TypeNumeros } from \"../../types\";\r\nimport { GAMES, PREFIX_NUMBER } from \"../../constants\";\r\nimport { dateToNumber } from \"../../utils\";\r\nimport { NumberModel } from \"../../models\";\r\nimport { getNumeroId } from \"./getNumeroId\";\r\nimport { getTiposJogos } from \"./getTiposJogos\";\r\nimport { calcularValorDeNumero } from \"./calcularValorDeNumero\";\r\nimport { getPremioFormato } from \"./getPremioFormato\";\r\n\r\nexport const calculaValoresDosNumeros = (game: TypeGame) => {\r\n const numeros: TypeNumeros = {};\r\n\r\n const date = pegarHorarioSaoPaulo();\r\n\r\n const created = dateToNumber(date);\r\n\r\n for (const bet of game.bets) {\r\n const jogos = getTiposJogos(bet.name);\r\n\r\n const qtd_numeros = bet.numbers.length;\r\n\r\n for (const jogo of jogos) {\r\n for (const number of bet.numbers) {\r\n for (const prize of bet.prizes) {\r\n for (const premio of prize.prizes) {\r\n const TYPE_GAME = GAMES[jogo];\r\n\r\n // Cálculo do valor do número\r\n const valorDoNumero = calcularValorDeNumero({\r\n valorPremio: prize.value,\r\n tipoJogo: bet.name,\r\n quantidadeDeNumeros: qtd_numeros,\r\n quantidadeDePremios: prize.prizes.length,\r\n });\r\n\r\n let premioFormato = getPremioFormato(premio);\r\n let numeroFormatado = number;\r\n\r\n if (TYPE_GAME.markAll) {\r\n premioFormato = \"1-5\";\r\n } else {\r\n numeroFormatado = formatarNumero(number, TYPE_GAME.format);\r\n }\r\n\r\n // Criando a ID única e o objeto TypeNumero\r\n const numberId = getNumeroId({\r\n numero: number,\r\n bancaId: game.bancaId,\r\n dataAposta: game.dateBet,\r\n jogo: jogo,\r\n premio: premioFormato,\r\n });\r\n\r\n if (!numeros?.[numberId]) {\r\n numeros[numberId] = NumberModel({\r\n id: numberId,\r\n numero: numeroFormatado,\r\n premio: premioFormato,\r\n created: created,\r\n bancaId: game.bancaId,\r\n amount: 0,\r\n dataAposta: game.dateBet,\r\n tipo_jogo: jogo,\r\n [`${PREFIX_NUMBER}${game.id}` as any]: 0,\r\n });\r\n }\r\n\r\n //* Se o jogo for markAll, adicionar o valor e não soma;\r\n if (TYPE_GAME.markAll) {\r\n numeros[numberId][`${PREFIX_NUMBER}${game.id}`] = Number(valorDoNumero.toFixed(3));\r\n } else {\r\n numeros[numberId][`${PREFIX_NUMBER}${game.id}`] += Number(valorDoNumero.toFixed(3));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { numeros };\r\n};\r\n","import { functionsCore } from \"..\";\r\nimport { TypeLimitGames, TypeNumero, TypeValueGames } from \"../../types\";\r\n\r\nexport type ResultadoNumeroComDiferenca = {\r\n numero: TypeNumero;\r\n diferenca: number;\r\n};\r\n\r\nconst CASAS_DECIMAIS = 2;\r\n\r\nexport const getNumerosAcimaDoLimite = (\r\n numeros: TypeNumero[],\r\n valoresJogos: TypeValueGames,\r\n limitesJogos: TypeLimitGames\r\n): ResultadoNumeroComDiferenca[] => {\r\n return numeros\r\n .map((numero) => {\r\n const valorJogo = functionsCore.limite_jogos.getValorJogoPeloTipoJogo(\r\n valoresJogos,\r\n numero.tipo_jogo\r\n );\r\n\r\n const limiteJogo = Object.values(limitesJogos).find(\r\n (v) => v.type_game === numero.tipo_jogo\r\n );\r\n\r\n const limiteAtingido =\r\n functionsCore.limite_jogos.calcularValorJogoPeloLimite(\r\n limiteJogo?.limit || 0,\r\n valorJogo?.value || 0\r\n );\r\n\r\n const amountArredondado = Number(numero.amount.toFixed(CASAS_DECIMAIS));\r\n const limiteAtingidoArredondado = Number(limiteAtingido.toFixed(CASAS_DECIMAIS));\r\n\r\n const diferenca = amountArredondado - limiteAtingidoArredondado;\r\n\r\n if (amountArredondado > limiteAtingidoArredondado) {\r\n return {\r\n numero,\r\n diferenca,\r\n };\r\n }\r\n\r\n return null;\r\n })\r\n .filter(Boolean) as ResultadoNumeroComDiferenca[];\r\n};\r\n","export const arredondarParaCima = (valor: number): number => {\r\n // Trabalha com centavos de forma mais segura (com Math.round)\r\n let emCentavos = Math.round(valor * 100);\r\n\r\n // Se não for múltiplo de 5, arredonda para cima\r\n const resto = emCentavos % 5;\r\n if (resto !== 0) {\r\n emCentavos += 5 - resto;\r\n }\r\n\r\n const valorFinal = emCentavos / 100\r\n\r\n return valorFinal;\r\n}","import { GAMES } from \"../../constants\";\r\nimport { TypeNumeros } from \"../../types\";\r\n\r\n// Função de ordenação\r\nexport const sortNumeros = (numeros: TypeNumeros): TypeNumeros => {\r\n const sortedDescargas = Object.values(numeros).sort((a, b) => {\r\n // Ordena por tipo de jogo (ordem alfabética)\r\n\r\n const ORDER_GAME_A = GAMES[a.tipo_jogo].order\r\n const ORDER_GAME_B = GAMES[b.tipo_jogo].order\r\n\r\n if (ORDER_GAME_A < ORDER_GAME_B) return -1;\r\n if (ORDER_GAME_A > ORDER_GAME_B) return 1;\r\n\r\n // Ordena por prêmio (ordem numérica)\r\n if (a.premio < b.premio) return -1;\r\n if (a.premio > b.premio) return 1;\r\n\r\n // Ordena por valor da aposta (amount) (ordem numérica)\r\n return a.amount > b.amount ? -1 : 1;\r\n });\r\n\r\n // Retorna o objeto ordenado com a estrutura de TypeDescargas\r\n return Object.fromEntries(\r\n sortedDescargas.map((item) => [item.id, item])\r\n ) as TypeNumeros;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\n\r\nexport const getPropsEnvioId = (\r\n numero: Partial<TypeNumero>\r\n): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n !array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\n\r\nexport const getPropsEnvioIdOld = (numero: Partial<TypeNumero>): { [props: string]: number } => {\r\n\r\n const objeto: { [props: string]: number } = {}\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};","import { PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeNumero } from \"../../types\";\r\n\r\nexport const getPropsVP = (numero: Partial<TypeNumero>): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n if (key.startsWith(PREFIX_NUMBER) && typeof value === \"number\") {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { PREFIX_ENVIO, PREFIX_ENVIO_OLD, PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeNumero } from \"../../types\";\r\nimport { clone } from \"../../utils\";\r\nimport { getPropsEnvioId } from \"./getPropsEnvioId\";\r\nimport { getPropsEnvioIdOld } from \"./getPropsEnvioIdOld\";\r\nimport { getPropsVP } from \"./getPropsVP\";\r\n\r\nexport type TypeProps = {\r\n [prop: string]: number;\r\n};\r\n\r\nexport type TypePropsPrefix = {\r\n [PREFIX_NUMBER]: TypeProps;\r\n [PREFIX_ENVIO]: TypeProps;\r\n [PREFIX_ENVIO_OLD]: TypeProps;\r\n};\r\n\r\nexport const getPropsPrefix = (numero: Partial<TypeNumero>): TypePropsPrefix => {\r\n const props: TypePropsPrefix = {\r\n [PREFIX_NUMBER]: {},\r\n [PREFIX_ENVIO]: {},\r\n [PREFIX_ENVIO_OLD]: {},\r\n };\r\n\r\n const vps = clone(getPropsVP(numero));\r\n const envio_ids = clone(getPropsEnvioId(numero));\r\n const envio_ids_old = clone(getPropsEnvioIdOld(numero));\r\n\r\n props[PREFIX_NUMBER] = clone(vps);\r\n props[PREFIX_ENVIO] = clone(envio_ids);\r\n props[PREFIX_ENVIO_OLD] = clone(envio_ids_old);\r\n\r\n return props;\r\n};\r\n","/**\r\n * @description Retorna a soma dos todos os valores do\r\n * número enviado em cada envio\r\n *\r\n * @example getSomaVP({ envio_23: 10, envio_24: 5 }) -> 15\r\n */\r\nexport const getSomaProps = (objeto: Record<string, number>): number => {\r\n let soma = 0;\r\n\r\n Object.values(objeto).forEach((value) => {\r\n soma += value;\r\n });\r\n\r\n return soma;\r\n};\r\n","import { GAMES } from \"../../constants\";\r\nimport { TypeLimitGame, TypeLimitGames } from \"../../types\";\r\n\r\n/**\r\n * Retorna o limite associado a um tipo de jogo específico a partir de um conjunto de jogos.\r\n *\r\n * A função percorre os valores do objeto `limitsGames` e retorna o primeiro item cujo campo `type_game`\r\n * seja igual ao tipo de jogo fornecido (`type_game`).\r\n *\r\n * @param {TypeLimitGames} limitsGames - Objeto contendo os valores de todos os jogos, indexados por chave.\r\n * @param {keyof typeof GAMES} type_game - Tipo de jogo a ser buscado (deve ser uma chave válida de `GAMES`).\r\n * @returns {TypeValueGame | undefined} O limite correspondente ao tipo de jogo informado ou `undefined` se não for encontrado.\r\n *\r\n * @example\r\n * const limitsGames = {\r\n * \"1\": { type_game: 'milhar', limit: 10 },\r\n * \"2\": { type_game: 'centena', limit: 20 }\r\n * };\r\n * const resultado = getLimiteTipoJogo(limitsGames, 'milhar');\r\n * resultado = { type_game: 'milhar', limit: 10 }\r\n */\r\nexport const getLimiteJogoPeloTipoJogo = (\r\n limitsGames: TypeLimitGames,\r\n type_game: keyof typeof GAMES\r\n): TypeLimitGame | undefined => {\r\n return Object.values(limitsGames).find((v) => v.type_game === type_game);\r\n};\r\n","export { calcularValorJogoPeloLimite } from \"./calcularValorJogoPeloLimite\"\r\nexport { getValorJogoPeloTipoJogo } from \"./getValorJogoPeloTipoJogo\"\r\nexport { getLimiteJogoPeloTipoJogo } from \"./getLimiteJogoPeloTipoJogo\"","/**\r\n * Calcula o valor unitário de uma jogada com base no limite total disponível.\r\n *\r\n * A função divide o limite (`limiteJogo.limit`) pelo valor fornecido em `valorJogo.value`.\r\n * Se `valorJogo.value` for `0`, será usado o valor padrão `1` para evitar divisão por zero.\r\n * \r\n * @param {number} limiteJogo - valor do limite de jogo.\r\n * @param {TypeValueGame} valorJogo - Objeto que contém o valor do jogo.\r\n * @returns {number} O valor resultante da divisão do limite pelo valor, representando o valor unitário por jogada.\r\n *\r\n * @example\r\n * const limiteJogo = { type_game: \"milhar\", limit: 40000 };\r\n * const valorJogo = { type_game: \"milhar\", value: 4000 };\r\n * const resultado = calcularValorJogoPeloLimite(limiteJogo, valorJogo);\r\n * resultado = 10\r\n */\r\nexport const calcularValorJogoPeloLimite = (\r\n limiteJogo: number,\r\n valorJogo: number\r\n) => {\r\n return limiteJogo / (valorJogo || 1);\r\n};\r\n","import { GAMES } from \"../../constants\";\r\nimport { TypeValueGame, TypeValueGames } from \"../../types\";\r\n\r\n/**\r\n * Retorna o valor associado a um tipo de jogo específico a partir de um conjunto de jogos.\r\n *\r\n * A função percorre os valores do objeto `valuesGames` e retorna o primeiro item cujo campo `type_game`\r\n * seja igual ao tipo de jogo fornecido (`type_game`).\r\n *\r\n * @param {TypeValueGames} valuesGames - Objeto contendo os valores de todos os jogos, indexados por chave.\r\n * @param {keyof typeof GAMES} type_game - Tipo de jogo a ser buscado (deve ser uma chave válida de `GAMES`).\r\n * @returns {TypeValueGame | undefined} O valor correspondente ao tipo de jogo informado ou `undefined` se não for encontrado.\r\n *\r\n * @example\r\n * const valuesGames = {\r\n * \"1\": { type_game: 'milhar', value: 10 },\r\n * \"2\": { type_game: 'centena', value: 20 }\r\n * };\r\n * const resultado = getLimiteTipoJogo(valuesGames, 'milhar');\r\n * resultado = { type_game: 'milhar', value: 10 }\r\n */\r\nexport const getValorJogoPeloTipoJogo = (\r\n valuesGames: TypeValueGames,\r\n type_game: keyof typeof GAMES\r\n): TypeValueGame | undefined => {\r\n return Object.values(valuesGames).find((v) => v.type_game === type_game);\r\n};\r\n","import { TypeLimitGames } from \"../../types/limit_value_type_game.type\";\r\nimport { TypeValueGames } from \"../../types/value_type_game.type\";\r\nimport { getLimiteJogoPeloTipoJogo } from \"../limite_jogos/getLimiteJogoPeloTipoJogo\";\r\nimport { getValorJogoPeloTipoJogo } from \"../limite_jogos\";\r\nimport { GAMES } from \"../../constants\";\r\n\r\nexport const getLimiteSimulado = (\r\n tipo_jogo: keyof typeof GAMES,\r\n valores: TypeValueGames,\r\n limites: TypeLimitGames,\r\n) => {\r\n const valorJogo = getValorJogoPeloTipoJogo(valores, tipo_jogo);\r\n\r\n const limiteJogo = getLimiteJogoPeloTipoJogo(limites, tipo_jogo);\r\n\r\n const limiteSimulado = (limiteJogo?.limit || 0) / (valorJogo?.value || 1);\r\n\r\n return limiteSimulado;\r\n};\r\n","export { getAvailableTimes } from \"./getAvailableTimes\"\r\nexport { pegarExtracoes } from \"./pegarExtracoes\"\r\nexport { extracaoEstaAtivaTryCatch } from \"./extracaoEstaAtivaTryCatch\"\r\nexport { extracaoEstaAtivaBoolean } from \"./extracaoEstaAtivaBoolean\"","import { format, getDay } from 'date-fns';\r\nimport { getBetDateToNumber } from '../../functions/games';\r\nimport { TypeExtracao } from '../../types';\r\nimport { numberToDate, showFormatDate } from '../../utils';\r\n\r\n/**\r\n * @description\r\n * Retorna a lista de extrações válidas (horários disponíveis) para uma data de aposta específica,\r\n * levando em conta regras como feriados, dias da semana, bloqueios por horário e status de atividade.\r\n * \r\n * Regras aplicadas:\r\n * - Ignora extrações marcadas como **inativas para o dia da aposta** (`inativo_no_dia`).\r\n * - Se houver extrações exclusivas para feriados (`somente_no_feriado` === data da aposta),\r\n * retorna apenas essas extrações.\r\n * - Caso contrário, retorna extrações ativas e recorrentes para o **dia da semana da aposta**\r\n * (ex: segunda-feira), desde que não sejam exclusivas de feriado.\r\n * - Se `showAll` for `true`, ignora as regras acima e retorna todas as extrações ativas.\r\n * - Se `mobile` for `true` e `dateBet` for o dia atual (`dateNow`), filtra ainda mais: remove as extrações\r\n * cujo horário de **bloqueio já passou**, baseado na hora atual do dispositivo.\r\n * \r\n * A lista final é sempre ordenada do menor para o maior horário (`ext.horario`).\r\n *\r\n * @param extracoes - Lista de todas as extrações disponíveis no sistema.\r\n * @param dateBet - Data da aposta em formato numérico (ex: 20241001000000).\r\n * @param showAll - Se `true`, ignora filtros e retorna todas as extrações ativas.\r\n * @param mobile - Se `true`, aplica lógica de bloqueio com base na hora atual (`dateNow`).\r\n * @param dateNow - Data/hora atual usada para comparação, especialmente quando `mobile` estiver ativado.\r\n * \r\n * @returns Lista de extrações válidas, ordenadas por horário.\r\n */\r\nexport const getAvailableTimes = (\r\n extracoes: TypeExtracao[],\r\n dateBet: number,\r\n showAll?: boolean,\r\n mobile?: boolean,\r\n dateNow?: Date\r\n) => {\r\n // converte a data com horas,minutos e segundos com zero\r\n const data = getBetDateToNumber(dateBet, 20241001000000);1\r\n\r\n const extracoesAtivas = extracoes.filter(\r\n (ext) => ext.ativo && !ext.inativo_no_dia.includes(data)\r\n );\r\n\r\n const DateBet = numberToDate(data);\r\n\r\n let validTimes: TypeExtracao[] = [];\r\n\r\n // verifica se no dia selecionado tem alguma extração com aquela data exata e se nao está inativa no dia\r\n const extracoesFeriado = extracoesAtivas.filter(\r\n (ext) => ext.somente_no_feriado === data\r\n );\r\n\r\n // se tiver, mostra somente a extracao da data selecionada\r\n if (extracoesFeriado.length > 0) {\r\n validTimes = [...extracoesFeriado];\r\n } else {\r\n // se nao, mostra todas menos a com a data selecionada\r\n validTimes = extracoesAtivas.filter(\r\n (ext) =>\r\n DateBet &&\r\n ext.days[getDay(DateBet) as keyof typeof ext.days] &&\r\n ext.somente_no_feriado === 0\r\n );\r\n }\r\n\r\n if (showAll) {\r\n validTimes = [...extracoesAtivas];\r\n }\r\n\r\n if (mobile && DateBet && dateNow) {\r\n if (format(dateNow, 'dd/MM/yyyy') === format(DateBet, 'dd/MM/yyyy')) {\r\n validTimes = validTimes.filter(\r\n (ext) =>\r\n Number(format(dateNow, 'HHmm')) <\r\n Number(showFormatDate(ext.bloqueio, 'HHmm'))\r\n );\r\n }\r\n }\r\n\r\n return validTimes.sort((extA, extB) =>\r\n Number(showFormatDate(extA.horario, 'HHmm')) <\r\n Number(showFormatDate(extB.horario, 'HHmm'))\r\n ? -1\r\n : 1\r\n );\r\n};\r\n","export { calculateAmount } from './calculateAmount';\r\nexport { calculateAmountGame } from './calculateAmountGame';\r\nexport { getBetDateToNumber } from './getBetDateToNumber';\r\nexport { formatPuleId } from './formatPuleId';\r\nexport { getFormattedPuleId } from './getFormattedPuleId';\r\nexport { fazerJogo } from './fazerJogo';\r\nexport { invertGame } from './invertGame';\r\nexport { getGamesUnicosList, getGamesUnicosObjeto } from './getGamesUnicos';\t","import { TypePrize } from \"../../types/bet.type\";\r\n\r\nexport const calculateAmount = (betValues: TypePrize[]) => {\r\n let total = 0;\r\n betValues.forEach((item) => {\r\n total += item.value;\r\n });\r\n return total;\r\n};\r\n","import { TypeBet } from \"../../types/bet.type\";\r\nimport { calculateAmount } from \"./calculateAmount\";\r\n\r\nexport const calculateAmountGame = (games: TypeBet[]) => {\r\n let total = 0;\r\n\r\n games.forEach((bet) => {\r\n total += calculateAmount(bet.prizes);\r\n });\r\n\r\n return total;\r\n};\r\n","import { setHours, setMinutes, setSeconds } from \"date-fns\";\r\nimport { TypeExtracao } from \"../../types\";\r\nimport { dateToNumber, numberToDate } from \"../../utils\";\r\n\r\nexport const getBetDateToNumber = (\r\n date: number,\r\n extracaoDate: TypeExtracao[\"horario\"]\r\n): number => {\r\n const extDate = extracaoDate;\r\n\r\n const dateExtracao = numberToDate(extDate);\r\n\r\n let newDateBet = numberToDate(date);\r\n\r\n if(!newDateBet || !dateExtracao) return 0;\r\n\r\n newDateBet = setHours(newDateBet, dateExtracao.getHours());\r\n newDateBet = setMinutes(newDateBet, dateExtracao.getMinutes());\r\n newDateBet = setSeconds(newDateBet, 0);\r\n\r\n const number = dateToNumber(newDateBet);\r\n\r\n return number;\r\n};\r\n","/**\r\n * @description Formata o ID do pule na criação\r\n*/\r\nexport const formatPuleId = (n: number): string => {\r\n if (n < 1000) {\r\n return n.toString().padStart(4, '0');\r\n } else {\r\n return n.toString();\r\n }\r\n};\r\n","/**\r\n * @description Formata o ID do pule para exibir em tela, extraindo a última parte após o último hífen\r\n * \r\n * @param {string} id - O ID completo do pule que pode conter múltiplos hífens\r\n * @returns {string} A última parte do ID após o último hífen\r\n * \r\n * @example\r\n * getFormattedPuleId(\"1-0001\") // \"0001\"\r\n * @example\r\n * getFormattedPuleId(\"102-2344301\") // \"2344301\"\r\n * @example\r\n * getFormattedPuleId(\"df29e917-d922-afce-257b-7e766411ef79-0541\") // \"0541\"\r\n */\r\nexport const getFormattedPuleId = (id: string): string => {\r\n const parts = id.split('-');\r\n return parts[parts.length - 1];\r\n};\r\n","import { TypeGame } from \"../../types\";\r\nimport { clone, getAllCombinations } from \"../../utils\";\r\n\r\nexport const invertGame = (game: TypeGame): TypeGame => {\r\n const newGame = clone(game);\r\n\r\n for (let index = 0; index < newGame.bets.length; index++) {\r\n let aposta = newGame.bets[index];\r\n\r\n if (\r\n aposta.name === \"milhar.invertida\" ||\r\n aposta.name === \"centena.invertida\" ||\r\n aposta.name === \"milhar.invertida@centena.invertida\"\r\n ) {\r\n const nums = aposta.numbers;\r\n const result: string[] = [];\r\n\r\n for (const num of nums) {\r\n const n = getAllCombinations(num);\r\n result.push(...n);\r\n }\r\n\r\n aposta = { ...aposta, numbers: clone(result) };\r\n newGame.bets[index] = aposta;\r\n }\r\n }\r\n\r\n return newGame;\r\n};\r\n","import { GameModel } from \"../../models\";\r\nimport { TypeExtracao, TypeGame, TypeUser } from \"../../types\";\r\nimport { calculaValoresDosNumeros } from \"../numbers/calculaValoresDosNumeros\";\r\nimport { calculateAmountGame } from \"./calculateAmountGame\";\r\nimport { getBetDateToNumber } from \"./getBetDateToNumber\";\r\nimport { invertGame } from \"./invertGame\";\r\n\r\nexport const fazerJogo = (\r\n cart: TypeGame,\r\n profile: TypeUser,\r\n dateBet: number,\r\n extracao: TypeExtracao,\r\n puleId: string\r\n) => {\r\n\r\n const game = GameModel({\r\n ...cart,\r\n id: puleId,\r\n creator: profile,\r\n dateBet: getBetDateToNumber(dateBet, extracao.horario),\r\n totalAmount: calculateAmountGame(cart.bets),\r\n extracao: extracao,\r\n });\r\n\r\n const gameWIthInvertedNumbers = invertGame(game);\r\n\r\n const { numeros } = calculaValoresDosNumeros(\r\n gameWIthInvertedNumbers\r\n );\r\n\r\n return { numeros, game };\r\n};\r\n","import { GAMES } from \"../../constants\";\r\n\r\nexport const getGamesUnicosList = () =>\r\n Object.values(GAMES).filter(\r\n (visu) => !visu.id.includes(\"@\") && !visu.id.includes(\"invertida\")\r\n );\r\n\r\nexport const getGamesUnicosObjeto = () => {\r\n const filtrados = Object.values(GAMES).filter(\r\n (visu) => !visu.id.includes(\"@\") && !visu.id.includes(\"invertida\")\r\n );\r\n\r\n const obj = filtrados.reduce((acc, item) => {\r\n acc[item.id] = item;\r\n return acc;\r\n }, {} as Record<string, (typeof GAMES)[keyof typeof GAMES]>);\r\n\r\n return obj;\r\n};\r\n","import { format, getDay } from \"date-fns\";\r\nimport {\r\n dateToNumber,\r\n numberToDate,\r\n pegarHorarioSaoPaulo,\r\n showFormatDate,\r\n} from \"../../utils\";\r\nimport { TypeExtracao } from \"../../types\";\r\nimport { getBetDateToNumber } from \"../games\";\r\n\r\n/**\r\n * @description\r\n * Retorna uma lista de extrações válidas para uma data de aposta, aplicando regras de negócio:\r\n * \r\n * Regras aplicadas:\r\n * 1. Se houver extrações exclusivas para feriado (`somente_no_feriado`), retorna apenas essas.\r\n * 2. Caso contrário, retorna extrações ativas que funcionam no dia da semana da aposta (`days`) e não são exclusivas de feriado.\r\n * 3. Se `retornar === \"do_dia\"`, retorna todas as extrações válidas para a data da aposta.\r\n * 4. Se `retornar === \"proximas\"` e a aposta for no mesmo dia de `dataAgora`, retorna apenas extrações cujo horário de bloqueio ainda não passou.\r\n * 5. Se `retornar === \"anteriores\"` e a aposta for no mesmo dia de `dataAgora`, retorna apenas extrações cujo horário já passou.\r\n * 6. A lista final é sempre ordenada do menor para o maior horário (`horario`).\r\n *\r\n * @param params.extracoes - Lista completa de extrações disponíveis.\r\n * @param params.dataAposta - Data da aposta em formato numérico (ex: 20241001000000). Default: hora atual em São Paulo.\r\n * @param params.dataAgora - Data/hora atual usada para comparação de próximas/anteriores. Default: hora atual em São Paulo.\r\n * @param params.retornar - Define o filtro de retorno:\r\n * - `\"do_dia\"`: retorna todas as extrações válidas para a data da aposta.\r\n * - `\"proximas\"`: retorna apenas extrações que ainda não passaram no dia da aposta.\r\n * - `\"anteriores\"`: retorna apenas extrações que já passaram no dia da aposta.\r\n *\r\n * @returns Lista de extrações válidas, ordenadas por horário crescente.\r\n */\r\nexport const pegarExtracoes = ({\r\n extracoes,\r\n dataAposta = dateToNumber(pegarHorarioSaoPaulo()), // Data da aposta padrão: hora atual SP\r\n dataAgora = dateToNumber(pegarHorarioSaoPaulo()), // Data/hora atual padrão: hora atual SP\r\n retornar = \"do_dia\", // Tipo de filtro padrão\r\n pegar = \"bloqueio\",\r\n}: {\r\n extracoes: TypeExtracao[];\r\n dataAposta?: number;\r\n dataAgora?: number;\r\n retornar?: \"do_dia\" | \"anteriores\" | \"proximas\";\r\n pegar?: \"horario\" | \"bloqueio\";\r\n}): TypeExtracao[] => {\r\n\r\n /**\r\n * @description Retorna o horário apropriado da extração baseado no parâmetro 'pegar'\r\n * \r\n * @param {TypeExtracao} extracao - A extração da qual se deseja obter o horário\r\n * @returns {number} O horário da extração (horario ou bloqueio) ou 0 se não especificado\r\n * \r\n * @example\r\n * // Retorna o horário da extração\r\n * getHorario(extracao) // quando pegar === \"horario\" -> retorna extracao.horario\r\n * \r\n * @example \r\n * // Retorna o horário de bloqueio da extração\r\n * getHorario(extracao) // quando pegar === \"bloqueio\" -> retorna extracao.bloqueio\r\n */\r\n const getHorario = (extracao: TypeExtracao) => {\r\n if (pegar === \"horario\") return extracao.horario;\r\n if (pegar === \"bloqueio\") return extracao.bloqueio;\r\n return 0;\r\n };\r\n\r\n // Converte a data da aposta para remover horas, minutos e segundos\r\n const dataApostaNumerica = getBetDateToNumber(dataAposta, 20241001000000);\r\n\r\n // Converte a data agora para o mesmo formato de aposta (apenas data)\r\n const dataAgoraNumerica = getBetDateToNumber(dataAgora, 20241001000000);\r\n\r\n // Converte a data da aposta para objeto Date\r\n const dataApostaDate = numberToDate(dataApostaNumerica);\r\n\r\n if (!dataApostaDate) throw new Error(\"dataApostaDate é obrigatória!\");\r\n\r\n // Filtra apenas extrações ativas e que não estão inativas no dia da aposta\r\n const extracoesAtivas = extracoes.filter(\r\n (ext) => ext.ativo && !ext.inativo_no_dia.includes(dataApostaNumerica)\r\n );\r\n\r\n // Filtra extrações que são exclusivas para feriado na data da aposta\r\n const extracoesDeFeriado = extracoesAtivas.filter(\r\n (ext) => ext.somente_no_feriado === dataApostaNumerica\r\n );\r\n\r\n // Determina as extrações válidas iniciais\r\n const extracoesValidas =\r\n // Se houver feriados, retorna apenas essas extrações\r\n extracoesDeFeriado.length > 0\r\n ? extracoesDeFeriado\r\n : // Caso contrário, retorna extrações do dia da semana ativo e não exclusivas de feriado\r\n extracoesAtivas.filter(\r\n (ext) =>\r\n ext.days[getDay(dataApostaDate) as keyof typeof ext.days] &&\r\n ext.somente_no_feriado === 0\r\n );\r\n\r\n // Retorna todas as extrações válidas do dia, ordenadas\r\n if (retornar === \"do_dia\") {\r\n return extracoesValidas.sort(sortExtracoes);\r\n }\r\n\r\n // Converte dataAgora para Date\r\n const dataAgoraDate = numberToDate(dataAgora);\r\n\r\n if (!dataAgoraDate) throw new Error(\"dataAgoraDate é obrigatória!\");\r\n\r\n // Extrai a hora atual no formato HHmm\r\n const horaAgora = Number(format(dataAgoraDate, \"HHmm\"));\r\n\r\n // Filtra extrações com base no tipo de retorno (\"proximas\" ou \"anteriores\")\r\n const extracoesFiltradas =\r\n retornar === \"proximas\"\r\n ? extracoesValidas.filter((ext) =>\r\n dataApostaNumerica === dataAgoraNumerica\r\n ? horaAgora < Number(showFormatDate(getHorario(ext), \"HHmm\"))\r\n : dataApostaNumerica > dataAgoraNumerica\r\n )\r\n : retornar === \"anteriores\"\r\n ? extracoesValidas.filter((ext) =>\r\n dataAgoraNumerica === dataApostaNumerica\r\n ? horaAgora >= Number(showFormatDate(getHorario(ext), \"HHmm\"))\r\n : dataApostaNumerica < dataAgoraNumerica\r\n )\r\n : [];\r\n\r\n // Ordena o resultado final por horário crescente\r\n return extracoesFiltradas.sort(sortExtracoes);\r\n};\r\n\r\n/**\r\n * @description Ordena as extrações do menor para o maior horário\r\n */\r\nconst sortExtracoes = (a: TypeExtracao, b: TypeExtracao) =>\r\n Number(showFormatDate(a.horario, \"HHmm\")) - Number(showFormatDate(b.horario, \"HHmm\"));","import { getDay } from \"date-fns\";\r\nimport { TypeExtracao } from \"../../types\";\r\nimport { numberToDate } from \"../../utils\";\r\n\r\n/**\r\n * Verifica se a extração está ativa e lança exceção com mensagem específica caso não esteja.\r\n * Use esta função quando precisar saber o motivo específico do erro (ex: Cloud Functions).\r\n * @throws {Error} Lança erro com mensagem específica do problema\r\n * \r\n * @example \"Extração não está ativa.\"\r\n * @example \"Extração está inativa no dia da aposta.\"\r\n * @example \"Extração não funciona neste feriado.\"\r\n * @example \"Data da aposta inválida.\"\r\n * @example \"Extração não funciona neste dia da semana.\"\r\n */\r\nexport const extracaoEstaAtivaTryCatch = (\r\n dataAposta: number,\r\n extracao: TypeExtracao\r\n): void => {\r\n // Filtra apenas extrações ativas e que não estão inativas no dia da aposta\r\n\r\n if (!extracao.ativo) {\r\n throw new Error(\"Extração não está ativa.\");\r\n }\r\n\r\n if (extracao.inativo_no_dia.includes(dataAposta)) {\r\n throw new Error(\"Extração está inativa no dia da aposta.\");\r\n }\r\n\r\n if (\r\n extracao.somente_no_feriado !== 0 &&\r\n extracao.somente_no_feriado !== dataAposta\r\n ) {\r\n throw new Error(\"Extração não funciona neste feriado.\");\r\n }\r\n\r\n const dataApostaDate = numberToDate(dataAposta);\r\n\r\n if (!dataApostaDate) {\r\n throw new Error(\"Data da aposta inválida.\");\r\n }\r\n\r\n if (!extracao.days[getDay(dataApostaDate) as keyof typeof extracao.days]) {\r\n const diasSemana = ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'];\r\n const diaDaSemana = diasSemana[getDay(dataApostaDate)];\r\n throw new Error(\r\n `Extração não funciona neste dia da semana (${diaDaSemana}).`\r\n );\r\n }\r\n};\r\n","import { TypeExtracao } from \"../../types\";\r\nimport { extracaoEstaAtivaTryCatch } from \"./extracaoEstaAtivaTryCatch\";\r\n\r\n/**\r\n * Versão helper que retorna boolean sem lançar exceção.\r\n * Use esta função para validações simples no frontend (ex: desabilitar botões).\r\n * @returns {boolean} true se ativa, false se inativa (sem detalhes do motivo)\r\n */\r\nexport const extracaoEstaAtivaBoolean = (dataAposta: number, extracao: TypeExtracao): boolean => {\r\n try {\r\n extracaoEstaAtivaTryCatch(dataAposta, extracao);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n};","export {\r\n isAdm,\r\n isAdmOrSubAdm,\r\n isAssociacao,\r\n isCambista,\r\n isCambistaTalao,\r\n isDigitador,\r\n isDigitadorAdm,\r\n isSuperAdm,\r\n isDigitadorOrDigitadorAdm\r\n} from \"./permissions\";\r\nexport { getPermission } from \"./permissions\";\r\nexport { getLimitsRest } from \"./getLimitsRest\";\r\n","import { TypeUser } from \"../../types\";\r\n\r\nconst IS_ADM = [\"admin\"] as TypeUser[\"role\"][];\r\nconst IS_ADM_OR_SUBADM = [\"admin\", \"sub_admin\"] as TypeUser[\"role\"][];\r\nconst IS_ASSOCIACAO = [\"associacao\"] as TypeUser[\"role\"][];\r\nconst IS_SUPER_ADMIN = [\"super_admin\"] as TypeUser[\"role\"][];\r\nconst IS_CAMBISTA_TALAO = [\"cambista_talao\"] as TypeUser[\"role\"][];\r\nconst IS_CAMBISTA = [\"cambista\"] as TypeUser[\"role\"][];\r\nconst IS_DIGITADOR_ADM = [\"digitador_adm\"] as TypeUser[\"role\"][];\r\nconst IS_DIGITADOR = [\"digitador\"] as TypeUser[\"role\"][];\r\nconst IS_DIGITADOR_AND_ADM = [\"digitador\", \"digitador_adm\"] as TypeUser[\"role\"][];\r\n\r\nexport const isAdm = (user: TypeUser) => IS_ADM.includes(user.role);\r\nexport const isAssociacao = (user: TypeUser) => IS_ASSOCIACAO.includes(user.role);\r\nexport const isSuperAdm = (user: TypeUser) => IS_SUPER_ADMIN.includes(user.role);\r\nexport const isAdmOrSubAdm = (user: TypeUser) => IS_ADM_OR_SUBADM.includes(user.role);\r\nexport const isCambistaTalao = (user: TypeUser) =>\r\n IS_CAMBISTA_TALAO.includes(user.role);\r\nexport const isCambista = (user: TypeUser) => IS_CAMBISTA.includes(user.role);\r\nexport const isDigitadorAdm = (user: TypeUser) => IS_DIGITADOR_ADM.includes(user.role);\r\nexport const isDigitador = (user: TypeUser) => IS_DIGITADOR.includes(user.role);\r\nexport const isDigitadorOrDigitadorAdm = (user: TypeUser) => IS_DIGITADOR_AND_ADM.includes(user.role);\r\n\r\n/**\r\n * @deprecated Depreciado pois o uso antigo era \"functionsCore.users.getPermission.isAdm()\"\r\n *\r\n * @description Agora deve-se usar \"functionsCore.users.isAdm()\"\r\n */\r\nexport const getPermission = {\r\n isAdm,\r\n isAssociacao,\r\n isSuperAdm,\r\n isAdmOrSubAdm,\r\n isCambistaTalao,\r\n isCambista,\r\n isDigitadorAdm,\r\n isDigitador,\r\n isDigitadorOrDigitadorAdm\r\n};\r\n","import { TypeUser } from \"../../types\";\r\n\r\nexport const getLimitsRest = (user: TypeUser) => {\r\n\r\n let hoje = 0;\r\n let pre = 0;\r\n \r\n Object.values(user.jogos.hoje).forEach((value) => hoje += value);\r\n Object.values(user.jogos.pre).forEach((value) => pre += value);\r\n\r\n return {\r\n hoje,\r\n pre\r\n }\r\n}","export * from \"./generateDescarga\";\r\nexport * from \"./generateDescargas\";\r\nexport * from \"./getDescargaIdPeloNumero\";\r\nexport * from \"./sortDescargas\";\r\nexport * from \"./getDescargasAcimaDoLimite\";\r\nexport * from \"./getPropsVPDescarga\";\r\nexport * from \"./getPropsEnvioIdDescarga\";\r\nexport * from \"./getPropsEnvioIdOldDescarga\";\r\nexport * from \"./getDescargaIdPeloEnvio\"\r\nexport * from \"./getTotalGeralDescarga\";","import { GAMES } from \"../../constants\";\r\nimport { TypeDescargas } from \"../../types\";\r\n\r\n// Função de ordenação\r\nexport const sortDescargas = (descargas: TypeDescargas): TypeDescargas => {\r\n const sortedDescargas = Object.values(descargas).sort((a, b) => {\r\n // Ordena por tipo de jogo (ordem alfabética)\r\n\r\n const ORDER_GAME_A = GAMES[a.tipo_jogo].order\r\n const ORDER_GAME_B = GAMES[b.tipo_jogo].order\r\n\r\n if (ORDER_GAME_A < ORDER_GAME_B) return -1;\r\n if (ORDER_GAME_A > ORDER_GAME_B) return 1;\r\n \r\n // Ordena por prêmio (ordem numérica)\r\n if (a.premio < b.premio) return -1;\r\n if (a.premio > b.premio) return 1;\r\n \r\n // Ordena por valor da aposta (amount) (ordem numérica)\r\n return b.amount - a.amount;\r\n });\r\n \r\n // Retorna o objeto ordenado com a estrutura de TypeDescargas\r\n return Object.fromEntries(\r\n sortedDescargas.map((item) => [item.id, item])\r\n ) as TypeDescargas;\r\n };\r\n ","import { functionsCore } from \"..\";\r\nimport { TypeDescarga, TypeLimitGames, TypeValueGames } from \"../../types\";\r\n\r\nexport type ResultadoDescargaComDiferenca = {\r\n descarga: TypeDescarga;\r\n diferenca: number;\r\n};\r\n\r\nconst CASAS_DECIMAIS = 2;\r\n\r\nexport const getDescargasAcimaDoLimite = (\r\n descargas: TypeDescarga[],\r\n valoresJogos: TypeValueGames,\r\n limitesJogos: TypeLimitGames\r\n): ResultadoDescargaComDiferenca[] => {\r\n return descargas\r\n .map((descarga) => {\r\n const valorJogo = functionsCore.limite_jogos.getValorJogoPeloTipoJogo(\r\n valoresJogos,\r\n descarga.tipo_jogo\r\n );\r\n\r\n const limiteJogo = Object.values(limitesJogos).find(\r\n (v) => v.type_game === descarga.tipo_jogo\r\n );\r\n\r\n const limiteAtingido =\r\n functionsCore.limite_jogos.calcularValorJogoPeloLimite(\r\n limiteJogo?.limit || 0,\r\n valorJogo?.value || 0\r\n );\r\n\r\n const amountArredondado = Number(descarga.amount.toFixed(CASAS_DECIMAIS));\r\n const limiteAtingidoArredondado = Number(limiteAtingido.toFixed(CASAS_DECIMAIS));\r\n\r\n const diferenca = amountArredondado - limiteAtingidoArredondado;\r\n\r\n if (amountArredondado > limiteAtingidoArredondado) {\r\n return {\r\n descarga,\r\n diferenca,\r\n };\r\n }\r\n\r\n return null;\r\n })\r\n .filter(Boolean) as ResultadoDescargaComDiferenca[];\r\n};\r\n","import { PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeDescarga } from \"../../types\";\r\n\r\nexport const getPropsVPDescarga = (descarga: Partial<TypeDescarga>): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(descarga).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (array.includes(PREFIX_NUMBER) && typeof value === \"number\") {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { TypeDescarga } from \"../../types\";\r\n\r\nexport const getPropsEnvioId = (\r\n descarga: Partial<TypeDescarga>\r\n): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(descarga).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n !array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { TypeDescarga } from \"../../types\";\r\n\r\nexport const getPropsEnvioIdOldDescarga = (descarga: Partial<TypeDescarga>): { [props: string]: number } => {\r\n\r\n const objeto: { [props: string]: number } = {}\r\n\r\n Object.entries(descarga).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};","import { PREFIX_ENVIO_OLD } from \"../../constants\";\r\nimport { TypeNumero } from \"../../types\";\r\nimport { arredondarParaCima } from \"../numbers\";\r\n\r\n/**\r\n * Gera um ID de descarga único baseado no envio do número fornecido\r\n * \r\n * Esta função cria um identificador único para uma descarga combinando várias propriedades\r\n * do número de aposta e o ID do envio. O ID é formado pela concatenação de: bancaId (opcional),\r\n * dataAposta, tipo_jogo, premio, valor arredondado do envio e envioId.\r\n * \r\n * @param numero - O número de aposta que será usado para gerar o ID\r\n * @param envioId - ID do envio para buscar o valor específico\r\n * @returns Uma string única identificando a descarga\r\n * @throws {Error} Se o valor do envio não existir ou for inválido\r\n * \r\n * @example\r\n * ```ts\r\n * const numero = {\r\n * bancaId: 'banca1',\r\n * dataAposta: 20240627140000,\r\n * tipo_jogo: 'milhar',\r\n * premio: \"1\",\r\n * envio_old_123: 15.50\r\n * };\r\n * const descargaId = getDescargaIdPeloEnvio(numero, '123');\r\n * // Resultado: \"banca1_20240627140000_milhar_1_15.5_envio_123\"\r\n * ```\r\n */\r\nexport const getDescargaIdPeloEnvio = (\r\n numero: TypeNumero,\r\n envioId: string\r\n): string => {\r\n const envioKey = `${PREFIX_ENVIO_OLD}${envioId}` as keyof TypeNumero;\r\n const envioValue = numero[envioKey];\r\n\r\n if (envioValue === undefined || envioValue === null) {\r\n throw new Error(`Valor do envio '${envioId}' não encontrado no número.`);\r\n }\r\n\r\n if (typeof envioValue !== \"number\") {\r\n throw new Error(`Valor do envio '${envioId}' deve ser um número.`);\r\n }\r\n\r\n const somaArredondada = arredondarParaCima(envioValue);\r\n\r\n const descargaId =\r\n `${numero?.bancaId ? `${numero?.bancaId}_` : \"\"}` +\r\n `${numero.dataAposta}_${numero.tipo_jogo}_${numero.premio}_${somaArredondada}_envio_${envioId}`;\r\n\r\n return descargaId;\r\n};\r\n","import { COMISSOES_PADRAO } from \"../../constants\";\r\nimport { TypeComissoesDescarga, TypeEnvioDescarga } from \"../../types\";\r\n\r\nexport type TypeTotalGeral = {\r\n jogos: Record<string, {\r\n totalEnviado: number;\r\n ordem: number;\r\n tipo: keyof typeof COMISSOES_PADRAO;\r\n label: string\r\n }>\r\n\r\n totalBruto: number;\r\n totalLiquido: number;\r\n totalComissao: number;\r\n \r\n}\r\n\r\n/**\r\n * @description Calcula o total geral de uma descarga\r\n * @param totalBrutoJogos - Total bruto dos jogos\r\n * @param comissoes - Comissões das bancas\r\n * @returns Total geral da descarga\r\n */\r\nexport const getTotalGeralDescarga = (totalBrutoJogos: TypeEnvioDescarga[\"totalGeralJogos\"], comissoes: TypeComissoesDescarga) => {\r\n\r\n const totalGeral: TypeTotalGeral = {\r\n jogos: {},\r\n totalBruto: 0,\r\n totalLiquido: 0,\r\n totalComissao: 0,\r\n }\r\n\r\n const totalBrutoJogosArray = Object.entries(totalBrutoJogos);\r\n\r\n const listaComissoes = Object.values(comissoes);\r\n\r\n const comissaoRestante = listaComissoes.find(comissao => comissao.type_game === \"restante\");\r\n\r\n for (const [type_game, totalBrutoJogo] of totalBrutoJogosArray) {\r\n \r\n // Operador Nullish Coalescing\r\n // Converter undefined/null para 0 para evitar erros\r\n const valorJogo = totalBrutoJogo ?? 0;\r\n \r\n const comissaoEncontrada = listaComissoes.find(comissao => type_game === comissao.type_game);\r\n \r\n // Sempre soma o total bruto\r\n totalGeral.totalBruto += valorJogo;\r\n \r\n if (comissaoEncontrada) {\r\n\r\n const comissaoPadrao = COMISSOES_PADRAO[type_game as keyof typeof COMISSOES_PADRAO];\r\n\r\n totalGeral.jogos[type_game] = {\r\n totalEnviado: valorJogo,\r\n ordem: comissaoPadrao?.order || 0,\r\n tipo: type_game as keyof typeof COMISSOES_PADRAO,\r\n label: comissaoPadrao?.label || type_game\r\n };\r\n \r\n // Cálculos com comissão\r\n\r\n const comissao = valorJogo * (comissaoEncontrada.porcentagem / 100);\r\n\r\n totalGeral.totalLiquido += valorJogo - comissao;\r\n totalGeral.totalComissao += comissao;\r\n\r\n } else {\r\n // Lógica do restante\r\n if (!totalGeral.jogos[\"restante\"]) {\r\n totalGeral.jogos[\"restante\"] = {\r\n totalEnviado: 0,\r\n ordem: 9,\r\n tipo: \"restante\",\r\n label: \"Restante\",\r\n };\r\n }\r\n\r\n totalGeral.jogos[\"restante\"].totalEnviado += valorJogo;\r\n \r\n if (comissaoRestante) {\r\n const comissao = valorJogo * (comissaoRestante.porcentagem / 100);\r\n totalGeral.totalLiquido += valorJogo - comissao;\r\n totalGeral.totalComissao += comissao;\r\n } else {\r\n // Sem comissão -> valor líquido = valor bruto\r\n totalGeral.totalLiquido += valorJogo;\r\n }\r\n }\r\n }\r\n\r\n return totalGeral;\r\n}","import * as numbers from './numbers';\r\nimport * as extracao from './extracao';\r\nimport * as games from './games';\r\nimport * as users from './users';\r\nimport * as limite_jogos from './limite_jogos';\r\nimport * as descarga from './descarga';\r\nimport * as utils from '../utils';\r\n\r\nexport * from './numbers';\r\nexport * from './extracao';\r\nexport * from './games';\r\nexport * from './users';\r\nexport * from './limite_jogos';\r\n\r\n/**\r\n * @description Objeto que contém todas as funções do core, facilitando a importação e organização do código.\r\n*/\r\nexport const functionsCore = {\r\n numbers,\r\n extracao,\r\n descarga,\r\n games,\r\n users,\r\n limite_jogos,\r\n utils\r\n};\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeMessage } from \"../types/message.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const MessageModel = (obj?: Partial<TypeMessage>): TypeMessage => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n extracaoIds: obj?.extracaoIds || [],\r\n content: obj?.content || \"\",\r\n visualizacao: obj?.visualizacao || \"jogo_hoje\",\r\n bancaId: obj?.bancaId || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n date: {\r\n from: obj?.date?.from || 0,\r\n to: obj?.date?.to || 0,\r\n },\r\n fixa: obj?.date?.to === 0 || obj?.date?.from === 0,\r\n tipo: obj?.tipo || [],\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeResultado } from \"../types/resultado.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const ResultadoModel = (\r\n obj?: Partial<TypeResultado>\r\n): TypeResultado => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n bancaId: obj?.bancaId || \"\",\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n horario: obj?.extracao?.horario || 0,\r\n description: obj?.extracao?.description || \"\",\r\n },\r\n milhares: {\r\n 1: obj?.milhares?.[1] ?? \"\",\r\n 2: obj?.milhares?.[2] ?? \"\",\r\n 3: obj?.milhares?.[3] ?? \"\",\r\n 4: obj?.milhares?.[4] ?? \"\",\r\n 5: obj?.milhares?.[5] ?? \"\",\r\n },\r\n grupos: {\r\n 1: obj?.grupos?.[1] ?? \"\",\r\n 2: obj?.grupos?.[2] ?? \"\",\r\n 3: obj?.grupos?.[3] ?? \"\",\r\n 4: obj?.grupos?.[4] ?? \"\",\r\n 5: obj?.grupos?.[5] ?? \"\",\r\n },\r\n bichos: {\r\n 1: obj?.bichos?.[1] ?? \"\",\r\n 2: obj?.bichos?.[2] ?? \"\",\r\n 3: obj?.bichos?.[3] ?? \"\",\r\n 4: obj?.bichos?.[4] ?? \"\",\r\n 5: obj?.bichos?.[5] ?? \"\",\r\n },\r\n liberado: obj?.liberado ?? false,\r\n dataSorteio: obj?.dataSorteio || 0,\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeRoute } from \"../types/rota.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const RouteModel = (obj?: Partial<TypeRoute>): TypeRoute => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n comission: obj?.comission ?? 0,\r\n name: obj?.name || \"\",\r\n responsible: obj?.responsible || \"\",\r\n codigo_rota: obj?.codigo_rota || \"\",\r\n tipo: obj?.tipo || \"cambista\",\r\n bancaId: obj?.bancaId || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { GAMES } from \"../constants/GAMES\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { TypeUser } from \"../types/user.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const UserModel = (obj?: Partial<TypeUser>): TypeUser => ({\r\n id: obj?.id ?? \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n active: obj?.active ?? true,\r\n bet_limit: obj?.bet_limit ?? 0,\r\n comission: obj?.comission ?? 0,\r\n bancaId: obj?.bancaId || \"\",\r\n photoURL: obj?.photoURL || \"\",\r\n name: obj?.name || \"\",\r\n sessionId: obj?.sessionId || \"\",\r\n codigo_cambista: obj?.codigo_cambista || \"\",\r\n deviceId: obj?.deviceId || \"\",\r\n role: obj?.role || \"cambista\",\r\n pre_date_limit: obj?.pre_date_limit || 0,\r\n dispositivos: {\r\n dispositivoIdAtual: obj?.dispositivos?.dispositivoIdAtual || \"\",\r\n listaDispositivosConectados:\r\n obj?.dispositivos?.listaDispositivosConectados || [],\r\n },\r\n route: {\r\n id: obj?.route?.id || \"\",\r\n name: obj?.route?.name || \"\",\r\n tipo: obj?.route?.tipo || \"cambista\",\r\n },\r\n type_games: obj?.type_games\r\n ? obj?.type_games.filter((type) => GAMES?.[type]?.id)\r\n : [],\r\n login: obj?.login || \"\",\r\n jogos: {\r\n hoje: obj?.jogos?.hoje || {},\r\n pre: obj?.jogos?.pre || {},\r\n },\r\n preferences: {\r\n pdfLegado: obj?.preferences?.pdfLegado ?? false,\r\n },\r\n permissoes: {\r\n podeCancelarPule: obj?.permissoes?.podeCancelarPule ?? false,\r\n podeReservar: obj?.permissoes?.podeReservar ?? false,\r\n podeJogarSurpresinha: obj?.permissoes?.podeJogarSurpresinha ?? true,\r\n },\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeValueGame } from \"../types/value_type_game.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const ValueGameModel = (\r\n obj?: Partial<TypeValueGame>\r\n): TypeValueGame => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n type_game: obj?.type_game || \"milhar\",\r\n bancaId: obj?.bancaId || \"\",\r\n value: obj?.value ?? 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { STATUS_PULE } from \"../constants/STATUS_PULE\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { TypeGame } from \"../types\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { getCodigoAuth } from \"../utils/getCodigoAuth\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const GameModel = (obj: Partial<TypeGame> = {}): TypeGame => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n origem_pule_id: obj?.origem_pule_id || \"\",\r\n bets: obj.bets || [], // Array de TypeGameValues\r\n creator: {\r\n id: obj?.creator?.id || \"\",\r\n id_integer: obj?.creator?.id_integer || \"\",\r\n codigo_cambista: obj?.creator?.codigo_cambista || \"\",\r\n name: obj?.creator?.name || \"\",\r\n role: obj?.creator?.role || \"cambista\",\r\n login: obj?.creator?.login || \"\",\r\n comission: obj?.creator?.comission || 0,\r\n route: {\r\n id: obj?.creator?.route?.id || \"\",\r\n name: obj?.creator?.route?.name || \"\",\r\n tipo: obj?.creator?.route?.tipo || \"cambista\",\r\n }\r\n },\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n totalAmount: obj?.totalAmount || 0,\r\n bancaId: obj?.bancaId || \"\",\r\n codigoAuth: obj?.codigoAuth || getCodigoAuth(100000, 999999).toString(),\r\n cancel: {\r\n canceled: obj?.cancel?.canceled ?? false,\r\n canceledAt: obj?.cancel?.canceledAt || 0,\r\n reason: obj?.cancel?.reason || \"\",\r\n },\r\n valorNumerosNaPule: obj?.valorNumerosNaPule || {},\r\n infoJogos: obj?.infoJogos || [],\r\n tiposJogos: obj?.tiposJogos || {},\r\n reservada: obj?.reservada || false,\r\n dias_disponiveis: obj?.dias_disponiveis || [],\r\n dateBet: obj?.dateBet || 0,\r\n status: obj.status || STATUS_PULE.JOGADA.id, // Pega um valor padrão de STATUS_PULE\r\n statusReason: obj?.statusReason || \"\",\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n description: obj?.extracao?.description || \"\",\r\n bloqueio: obj?.extracao?.bloqueio || 0,\r\n horario: obj?.extracao?.horario || 0,\r\n },\r\n});\r\n","import { GAMES, PREFIX_ENVIO, PREFIX_ENVIO_OLD, PREFIX_NUMBER, PREMIOS } from \"../constants\";\r\nimport { TypeNumero } from \"../types/numero.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { getCreatedBySystem, getPropsPrefix } from \"../functions\";\r\n\r\nexport const NumberModel = (obj: Partial<TypeNumero> = {}): TypeNumero => {\r\n\r\n const ordemPremioExibicao = PREMIOS[obj?.premio as keyof typeof PREMIOS || \"1\"].order;\r\n const ordemJogoExibicao = GAMES[obj?.tipo_jogo as keyof typeof GAMES || \"milhar\"].order;\r\n \r\n let baseModel: TypeNumero = {\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n envioIds: obj?.envioIds || [],\r\n ordemPremioExibicao: ordemPremioExibicao,\r\n ordemJogoExibicao: ordemJogoExibicao,\r\n numero: obj?.numero || \"\",\r\n amount: obj?.amount || 0,\r\n premio: obj?.premio || \"1\",\r\n bancaId: obj?.bancaId || \"\",\r\n valorArredondado: obj?.valorArredondado || 0,\r\n limiteJogoReal: obj?.limiteJogoReal || 0,\r\n limiteJogoSimulado: obj?.limiteJogoSimulado || 0,\r\n valorJogo: obj?.valorJogo || 0,\r\n amountEnviadoParaAssociacao: obj?.amountEnviadoParaAssociacao || 0,\r\n valorAEnviarParaAssociacao: obj?.valorAEnviarParaAssociacao || 0,\r\n tipo_jogo: obj?.tipo_jogo || \"milhar\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n descarregado: obj?.descarregado ?? false,\r\n dataAposta: obj?.dataAposta || 0,\r\n };\r\n\r\n const propsPrefix = getPropsPrefix(obj);\r\n\r\n baseModel = {\r\n ...baseModel,\r\n ...propsPrefix[PREFIX_NUMBER],\r\n ...propsPrefix[PREFIX_ENVIO],\r\n ...propsPrefix[PREFIX_ENVIO_OLD],\r\n };\r\n\r\n return baseModel;\r\n};\r\n","import { TypeBet } from \"../types/bet.type\";\r\n\r\nexport const BetModel = (obj: Partial<TypeBet> = {}): TypeBet => ({\r\n name: obj?.name || \"milhar\",\r\n numbers: obj?.numbers || [],\r\n prizes: obj?.prizes || [],\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypePremiacao } from \"../types\";\r\nimport { dateToNumber } from \"../utils\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\n/**\r\n * Cria uma instância de premiação com valores padrão\r\n * \r\n * Esta função gera um objeto de premiação completo, preenchendo campos opcionais\r\n * com valores padrão apropriados. É usada para criar novas premiações ou\r\n * normalizar dados de premiação existentes.\r\n * \r\n * @param obj - Objeto parcial com dados da premiação (opcional)\r\n * @returns Objeto de premiação completo com todos os campos preenchidos\r\n * \r\n * @example\r\n * ```typescript\r\n * // Criar premiação vazia\r\n * const premiacao = PremiacaoModel();\r\n * \r\n * // Criar premiação com dados parciais\r\n * const premiacao = PremiacaoModel({\r\n * id: \"premio_123\",\r\n * bancaId: \"banca_456\",\r\n * valorTotalPremio: 10000\r\n * });\r\n * ```\r\n */\r\nexport const PremiacaoModel = (\r\n obj: Partial<TypePremiacao> = {}\r\n): TypePremiacao => ({\r\n // ID único da premiação\r\n id: obj?.id || \"\",\r\n \r\n // ID incremental por banca\r\n id_integer: obj?.id_integer || \"\",\r\n \r\n // Data da aposta em formato numérico\r\n dataAposta: obj?.dataAposta || 0,\r\n \r\n // ID da banca responsável\r\n bancaId: obj?.bancaId || \"\",\r\n \r\n // Informações da pule relacionada\r\n pule: {\r\n // ID da pule\r\n id: obj?.pule?.id || \"\",\r\n\r\n // ID incremental da pule\r\n id_integer: obj?.pule?.id_integer || \"\",\r\n \r\n // Data de criação da pule\r\n created: obj?.pule?.created || 0,\r\n \r\n // Informações de cancelamento da pule\r\n cancel: {\r\n // Se a pule foi cancelada\r\n canceled: obj?.pule?.cancel?.canceled || false,\r\n \r\n // Data do cancelamento\r\n canceledAt: obj?.pule?.cancel?.canceledAt || 0,\r\n \r\n // Motivo do cancelamento\r\n reason: obj?.pule?.cancel?.reason || \"\",\r\n },\r\n \r\n createdBy: {\r\n id: obj?.pule?.createdBy?.id || \"\",\r\n id_integer: obj?.pule?.createdBy?.id_integer || \"\",\r\n role: obj?.pule?.createdBy?.role || \"cambista\",\r\n name: obj?.pule?.createdBy?.name || \"\",\r\n login: obj?.pule?.createdBy?.login || \"\",\r\n },\r\n \r\n // Informações do criador da pule\r\n creator: {\r\n // ID do criador\r\n id: obj?.pule?.creator?.id || \"\",\r\n \r\n // ID incremental do criador\r\n id_integer: obj?.pule?.creator?.id_integer || \"\",\r\n \r\n // Código do cambista\r\n codigo_cambista: obj?.pule?.creator?.codigo_cambista || \"\",\r\n \r\n // Login do criador\r\n login: obj?.pule?.creator?.login || \"\",\r\n \r\n // Nome do criador\r\n name: obj?.pule?.creator?.name || \"\",\r\n \r\n // Papel/função do criador\r\n role: obj?.pule?.creator?.role || \"cambista\",\r\n \r\n // Comissão do criador\r\n comission: obj?.pule?.creator?.comission || 0,\r\n \r\n // Informações da rota do criador\r\n route: {\r\n // ID da rota\r\n id: obj?.pule?.creator?.route?.id || \"\",\r\n \r\n // Nome da rota\r\n name: obj?.pule?.creator?.route?.name || \"\",\r\n \r\n // Tipo da rota\r\n tipo: obj?.pule?.creator?.route?.tipo || \"cambista\",\r\n },\r\n },\r\n },\r\n \r\n // Lista de itens premiados\r\n premiosItems: obj?.premiosItems || [],\r\n \r\n // Total que o cambista recebe\r\n valorTotalPremio: obj?.valorTotalPremio || 0,\r\n \r\n // Total que a banca recebe\r\n valorTotalPremioBanca: obj?.valorTotalPremioBanca || 0,\r\n \r\n // Total que a associação recebe\r\n valorTotalPremioAssociacao: obj?.valorTotalPremioAssociacao || 0,\r\n \r\n // Informações de quem criou o registro\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n \r\n // Data de criação do registro\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n \r\n // Data de última atualização do registro\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypePDFDescargas } from \"../types\";\r\n\r\nexport const PDFModel = (\r\n obj: Partial<TypePDFDescargas> = {}\r\n): TypePDFDescargas => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n dataAposta: obj?.dataAposta || 0,\r\n descargas: obj?.descargas || {},\r\n link_pdf: obj?.link_pdf || \"\",\r\n bancaId: obj.bancaId || \"\",\r\n visualizado: obj?.visualizado || false,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || 0,\r\n updated: obj?.updated || 0,\r\n});\r\n","import { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\nimport { TypeBanca } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const BancaModel = (obj: Partial<TypeBanca> = {}): TypeBanca => ({\r\n id: obj?.id || \"\",\r\n nome: obj?.nome || \"\",\r\n settings: {\r\n urlLogo: obj?.settings?.urlLogo || \"\",\r\n urlLogoImpressao: obj?.settings?.urlLogoImpressao || \"\",\r\n urlBackground: obj?.settings?.urlBackground || \"\",\r\n backgroundColor: obj?.settings?.backgroundColor || \"\",\r\n },\r\n endereco: {\r\n cep: obj?.endereco?.cep || \"\",\r\n logradouro: obj?.endereco?.logradouro || \"\",\r\n numero: obj?.endereco?.numero || \"\",\r\n bairro: obj?.endereco?.bairro || \"\",\r\n cidade: obj?.endereco?.cidade || \"\",\r\n estado: obj?.endereco?.estado || \"\",\r\n },\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\nimport { TypeAuditLog } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const AuditLogModel = (obj: Partial<TypeAuditLog> = {}): TypeAuditLog => ({\r\n id: obj?.id || '',\r\n tipo: obj?.tipo || 'add',\r\n bancaId: obj?.bancaId || '',\r\n message: obj?.message || '',\r\n colecao: obj?.colecao || '',\r\n documentId: obj?.documentId || '',\r\n author: getCreatedBySystem(obj?.author),\r\n document: obj?.document || {},\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeLimitGame } from \"../types/limit_value_type_game.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const LimitGameModel = (\r\n obj?: Partial<TypeLimitGame>\r\n): TypeLimitGame => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n type_game: obj?.type_game || \"milhar\",\r\n bancaId: obj?.bancaId || \"\",\r\n limit: obj?.limit ?? 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { STATUS_DESCARGA } from \"../constants\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { TypeEnvioDescarga } from \"../types\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\n\r\nexport const EnvioDescargaModel = (\r\n obj?: Partial<TypeEnvioDescarga>\r\n): TypeEnvioDescarga => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n visualizado: obj?.visualizado || false,\r\n banca: {\r\n id: obj?.banca?.id || \"\",\r\n nome: obj?.banca?.nome || \"\",\r\n },\r\n dataAposta: obj?.dataAposta || 0,\r\n totalGeralJogos: {\r\n [\"milhar\"]: obj?.totalGeralJogos?.[\"milhar\"] || 0,\r\n [\"centena\"]: obj?.totalGeralJogos?.[\"centena\"] || 0,\r\n [\"dezena\"]: obj?.totalGeralJogos?.[\"dezena\"] || 0,\r\n [\"grupo\"]: obj?.totalGeralJogos?.[\"grupo\"] || 0,\r\n [\"terno.dezena\"]: obj?.totalGeralJogos?.[\"terno.dezena\"] || 0,\r\n [\"terno.grupo\"]: obj?.totalGeralJogos?.[\"terno.grupo\"] || 0,\r\n [\"duque.dezena\"]: obj?.totalGeralJogos?.[\"duque.dezena\"] || 0,\r\n [\"duque.grupo\"]: obj?.totalGeralJogos?.[\"duque.grupo\"] || 0,\r\n },\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n description: obj?.extracao?.description || \"\",\r\n bloqueio: obj?.extracao?.bloqueio || 0,\r\n horario: obj?.extracao?.horario || 0,\r\n },\r\n devolvidoPor: {\r\n id: obj?.devolvidoPor?.id || \"\",\r\n id_integer: obj?.devolvidoPor?.id_integer || \"\",\r\n name: obj?.devolvidoPor?.name || \"\",\r\n login: obj?.devolvidoPor?.login || \"\",\r\n },\r\n bancaId: obj?.bancaId || \"\",\r\n description: obj?.description || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n status: obj?.status || STATUS_DESCARGA.ENVIANDO.id,\r\n totalEnviados: obj?.totalEnviados || 0,\r\n totalRegistros: obj?.totalRegistros || 0,\r\n progresso: obj?.progresso || 0,\r\n mensagem: obj?.mensagem || \"\", \r\n concluidoEm: obj?.concluidoEm || 0,\r\n ultimaAtualizacao: obj?.ultimaAtualizacao || 0,\r\n metricas: {\r\n tempoMinimo: obj?.metricas?.tempoMinimo || 0,\r\n tempoMaximo: obj?.metricas?.tempoMaximo || 0,\r\n tempoMedio: obj?.metricas?.tempoMedio || 0,\r\n duracaoTotal: obj?.metricas?.duracaoTotal || 0,\r\n tempoEstimado: obj?.metricas?.tempoEstimado || 0,\r\n velocidadeProcessamento: obj?.metricas?.velocidadeProcessamento || 0,\r\n textosFormatados: {\r\n duracaoTotalText: obj?.metricas?.textosFormatados?.duracaoTotalText || \"\",\r\n tempoMinimoText: obj?.metricas?.textosFormatados?.tempoMinimoText || \"\",\r\n tempoMaximoText: obj?.metricas?.textosFormatados?.tempoMaximoText || \"\",\r\n tempoMedioText: obj?.metricas?.textosFormatados?.tempoMedioText || \"\",\r\n tempoEstimadoText: obj?.metricas?.textosFormatados?.tempoEstimadoText || \"\",\r\n },\r\n },\r\n atualizadoEm: obj?.atualizadoEm || 0,\r\n erro: obj?.erro || \"\",\r\n iniciadoEm: obj?.iniciadoEm || 0,\r\n user: {\r\n id: obj?.user?.id || \"\",\r\n id_integer: obj?.user?.id_integer || \"\",\r\n name: obj?.user?.name || \"\",\r\n login: obj?.user?.login || \"\",\r\n },\r\n valoresJogos: obj?.valoresJogos || [],\r\n limitesJogos: obj?.limitesJogos || [],\r\n comissoesDescarga: obj?.comissoesDescarga || [],\r\n});\r\n","import { GAMES, PREFIX_ENVIO, PREFIX_ENVIO_OLD, PREFIX_NUMBER, PREMIOS } from \"../constants\";\r\nimport { getPropsPrefix } from \"../functions\";\r\nimport { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\n\r\nimport { TypeDescarga } from \"../types\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\n\r\nexport const DescargaModel = (\r\n descarga: Partial<TypeDescarga> = {}\r\n): TypeDescarga => {\r\n const ordemPremioExibicao =\r\n PREMIOS[(descarga?.premio as keyof typeof PREMIOS) || \"1\"].order;\r\n const ordemJogoExibicao =\r\n GAMES[(descarga?.tipo_jogo as keyof typeof GAMES) || \"milhar\"].order;\r\n\r\n let baseDescarga: TypeDescarga = {\r\n id: descarga?.id || \"\",\r\n ordemJogoExibicao: ordemJogoExibicao,\r\n ordemPremioExibicao: ordemPremioExibicao,\r\n numeros: descarga?.numeros || [],\r\n quantidadeDeNumeros: descarga?.quantidadeDeNumeros || 0,\r\n bancaId: descarga?.bancaId || \"\",\r\n amountEnviadoParaAssociacao: descarga?.amountEnviadoParaAssociacao || 0,\r\n valorAEnviarParaAssociacao: descarga?.valorAEnviarParaAssociacao || 0,\r\n envioId: descarga?.envioId || \"\",\r\n amount: descarga?.amount || 0,\r\n limiteJogoReal: descarga?.limiteJogoReal || 0,\r\n limiteJogoSimulado: descarga?.limiteJogoSimulado || 0,\r\n valorJogo: descarga?.valorJogo || 0,\r\n valorArredondado: descarga?.valorArredondado || 0,\r\n dataAposta: descarga?.dataAposta || 0,\r\n premio: descarga?.premio || \"1\",\r\n tipo_jogo: descarga?.tipo_jogo || \"milhar\",\r\n createdBy: getCreatedBySystem(descarga?.createdBy),\r\n updated: descarga?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: descarga?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n };\r\n\r\n const propsPrefix = getPropsPrefix(descarga);\r\n\r\n baseDescarga = {\r\n ...baseDescarga,\r\n ...propsPrefix[PREFIX_NUMBER],\r\n ...propsPrefix[PREFIX_ENVIO],\r\n ...propsPrefix[PREFIX_ENVIO_OLD],\r\n };\r\n\r\n return baseDescarga;\r\n};\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeDevice } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const DeviceModel = (obj: Partial<TypeDevice> = {}): TypeDevice => ({\r\n id: obj?.id || \"\",\r\n userId: obj?.userId || \"\",\r\n createdBy: obj?.createdBy || getCreatedBySystem(),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n deviceId: obj?.deviceId || \"\",\r\n deviceName: obj?.deviceName || \"\",\r\n status: obj?.status || \"EM_ESPERA\",\r\n ultimoLogin: obj?.ultimoLogin || 0,\r\n plataforma: obj?.plataforma || \"mobile\",\r\n ip: obj?.ip || \"\",\r\n versaoApp: obj?.versaoApp || \"\",\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypePremiacaoAssociacao } from \"../types\";\r\nimport { dateToNumber } from \"../utils\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\n/**\r\n * Cria uma instância de premiação com valores padrão\r\n * \r\n * Esta função gera um objeto de premiação completo, preenchendo campos opcionais\r\n * com valores padrão apropriados. É usada para criar novas premiações ou\r\n * normalizar dados de premiação existentes.\r\n * \r\n * @param obj - Objeto parcial com dados da premiação (opcional)\r\n * @returns Objeto de premiação completo com todos os campos preenchidos\r\n * \r\n * @example\r\n * ```typescript\r\n * // Criar premiação vazia\r\n * const premiacao = PremiacaoModel();\r\n * \r\n * // Criar premiação com dados parciais\r\n * const premiacao = PremiacaoModel({\r\n * id: \"premio_123\",\r\n * bancaId: \"banca_456\",\r\n * valorTotalPremio: 10000\r\n * });\r\n * ```\r\n */\r\nexport const PremiacaoAssociacaoModel = (\r\n obj: Partial<TypePremiacaoAssociacao> = {}\r\n): TypePremiacaoAssociacao => ({\r\n // ID único da premiação\r\n id: obj?.id || \"\",\r\n \r\n // ID incremental por banca\r\n id_integer: obj?.id_integer || \"\",\r\n \r\n // Data da aposta em formato numérico\r\n dataAposta: obj?.dataAposta || 0,\r\n \r\n // ID da banca responsável\r\n bancaId: obj?.bancaId || \"\",\r\n\r\n numero: obj?.numero || \"\",\r\n\r\n premio: obj?.premio || \"\",\r\n\r\n tipo_jogo: obj?.tipo_jogo || \"milhar\",\r\n\r\n valorPremioAReceber: obj?.valorPremioAReceber || 0,\r\n\r\n valorEnviadoParaAssociacao: obj?.valorEnviadoParaAssociacao || 0,\r\n\r\n limiteTipoJogo: obj?.limiteTipoJogo || 0,\r\n\r\n valorTipoJogo: obj?.valorTipoJogo || 0,\r\n\r\n pulesGanhadoras: obj?.pulesGanhadoras || {},\r\n\r\n // Informações de quem criou o registro\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n \r\n // Data de criação do registro\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n \r\n // Data de última atualização do registro\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeComissaoDescarga } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const ComissaoDescargaModel = (\r\n obj: Partial<TypeComissaoDescarga> = {}\r\n): TypeComissaoDescarga => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n type_game: obj?.type_game || \"milhar\",\r\n bancaId: obj?.bancaId || \"\",\r\n porcentagem: obj?.porcentagem || 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import {\r\n AuditLogModel,\r\n BancaModel,\r\n DescargaModel,\r\n ExtracaoModel,\r\n GameModel,\r\n MessageModel,\r\n NumberModel,\r\n PDFModel,\r\n PremiacaoModel,\r\n ResultadoModel,\r\n RouteModel,\r\n UserModel,\r\n ValueGameModel,\r\n LimitGameModel,\r\n EnvioDescargaModel,\r\n DeviceModel,\r\n PremiacaoAssociacaoModel,\r\n ComissaoDescargaModel\r\n} from \"../models\";\r\n\r\n/**\r\n * @description Objeto que contem todas as coleções do banco de dados, com seus respectivos modelos.\r\n * Serve para facilitar para facilitar a criação de novos documentos no banco de dados e para facilitar a leitura do código.\r\n*/\r\nexport const collections = {\r\n mensagens: MessageModel,\r\n users: UserModel,\r\n valores_jogos: ValueGameModel,\r\n limites_jogos: LimitGameModel,\r\n pules: GameModel,\r\n extracoes: ExtracaoModel,\r\n resultados: ResultadoModel,\r\n rotas: RouteModel,\r\n envios_descarga: EnvioDescargaModel,\r\n numeros: NumberModel,\r\n numeros_enviados: NumberModel,\r\n descargas: DescargaModel,\r\n descargas_associacao: DescargaModel,\r\n premiacoes: PremiacaoModel,\r\n premiacoes_associacao: PremiacaoAssociacaoModel,\r\n pdf_descargas: PDFModel,\r\n pdf_descargas_associacao: PDFModel,\r\n bancas: BancaModel,\r\n auditLogs: AuditLogModel,\r\n dispositivos: DeviceModel,\r\n comissoes_descarga: ComissaoDescargaModel\r\n} as const;","import { ROLES } from \"../constants\";\r\nimport { generateId } from \"../utils\";\r\nimport { collections } from \"./collections\";\r\n\r\n// Types para compatibilidade entre plataformas\r\nexport type FirebaseApp<T = any> = T;\r\nexport type Firestore<T = any> = T;\r\nexport type CollectionReference<T = any> = T;\r\nexport type DocumentReference<T = any> = T;\r\nexport type Query<T = any> = T;\r\nexport type QuerySnapshot<T = any> = T;\r\nexport type DocumentSnapshot<T = any> = T;\r\nexport type WriteBatch<T = any> = T;\r\nexport type QueryConstraint<T = any> = T;\r\n\r\n// Interfaces para adaptadores de plataforma\r\nexport interface FirebaseAdapter<T = any> {\r\n // Collection operations\r\n collection: (db: Firestore, path: string) => CollectionReference<T>;\r\n doc: (db: Firestore, path: string, ...segments: string[]) => DocumentReference<T>;\r\n \r\n // Query operations\r\n query: (collection: CollectionReference<T>, ...constraints: QueryConstraint[]) => Query<T>;\r\n where: (field: string, operator: string, value: any) => QueryConstraint;\r\n orderBy: (field: string, direction?: \"asc\" | \"desc\") => QueryConstraint;\r\n limit: (count: number) => QueryConstraint;\r\n startAfter: (...fieldValues: any[]) => QueryConstraint;\r\n startAt: (...fieldValues: any[]) => QueryConstraint;\r\n endBefore: (...fieldValues: any[]) => QueryConstraint;\r\n endAt: (...fieldValues: any[]) => QueryConstraint;\r\n \r\n // Document operations\r\n getDocs: (query: Query<T>) => Promise<QuerySnapshot<T>>;\r\n getDoc: (docRef: DocumentReference<T>) => Promise<DocumentSnapshot<T>>;\r\n setDoc: (docRef: DocumentReference<T>, data: T, options?: any) => Promise<void>;\r\n updateDoc: (docRef: DocumentReference<T>, data: Partial<T>) => Promise<void>;\r\n deleteDoc: (docRef: DocumentReference<T>) => Promise<void>;\r\n \r\n // Batch operations\r\n writeBatch: (db: Firestore) => WriteBatch;\r\n batchSet: (batch: WriteBatch, docRef: DocumentReference<T>, data: T) => void;\r\n batchUpdate: (batch: WriteBatch, docRef: DocumentReference<T>, data: Partial<T>) => void;\r\n batchDelete: (batch: WriteBatch, docRef: DocumentReference<T>) => void;\r\n batchCommit: (batch: WriteBatch) => Promise<void>;\r\n \r\n // Real-time listeners\r\n onSnapshot: (query: Query<T>, callback: (snapshot: QuerySnapshot<T>) => void) => () => void;\r\n \r\n // ID generation\r\n generateId: () => string;\r\n}\r\n\r\n// Helper types para extrair valores válidos de um tipo\r\ntype WhereOperator = \"==\" | \"!=\" | \"<\" | \"<=\" | \">\" | \">=\" | \"in\" | \"not-in\" | \"array-contains\" | \"array-contains-any\";\r\n\r\n// Helper para gerar campos encadeados até 5 níveis\r\ntype NestedPaths<T, Depth extends number = 5> = Depth extends 0\r\n ? never\r\n : T extends object\r\n ? {\r\n [K in keyof T & string]: T[K] extends object\r\n ? T[K] extends any[]\r\n ? K | `${K}.${number}` | `${K}.${NestedPaths<T[K][number], Prev<Depth>>}`\r\n : K | `${K}.${NestedPaths<T[K], Prev<Depth>>}`\r\n : K;\r\n }[keyof T & string]\r\n : never;\r\n\r\n// Helper para decrementar profundidade\r\ntype Prev<T extends number> = T extends 5 ? 4 : T extends 4 ? 3 : T extends 3 ? 2 : T extends 2 ? 1 : 0;\r\n\r\n// WhereCondition com suporte a chaves encadeadas até 5 níveis\r\nexport type WhereCondition<T = any> = {\r\n field: NestedPaths<T> | string; // Suporta campos encadeados, campos simples ou string customizada\r\n operator: WhereOperator;\r\n value: any;\r\n};\r\n\r\n// OrderByCondition com suporte a chaves encadeadas até 5 níveis\r\nexport type OrderByCondition<T = any> = {\r\n field: NestedPaths<T> | string; // Suporta campos encadeados, campos simples ou string customizada\r\n direction: \"asc\" | \"desc\";\r\n};\r\n\r\n// RepoQueryOptions com type-safety baseado no modelo\r\nexport type RepoQueryOptions<T = any> = {\r\n where?: WhereCondition<T>[];\r\n orderBy?: OrderByCondition<T>[];\r\n limit?: number;\r\n startAfter?: any; // Cursor para paginação (pode ser um documento ou valor)\r\n startAt?: any; // Inicia a partir de (inclusive)\r\n endBefore?: any; // Termina antes de (exclusive)\r\n endAt?: any; // Termina em (inclusive)\r\n};\r\n\r\n// Estratégias de busca por ID com type-safety\r\nexport type IdSearchStrategy<T> = \r\n | { type: \"field\"; fieldName: NestedPaths<T> } // Busca por campo específico (ex: \"id\", \"numero\")\r\n | { type: \"documentId\" } // Usa o ID do documento diretamente\r\n | { type: \"custom\"; resolver: (id: string) => Promise<DocumentReference<T>> }; // Resolver customizado\r\n\r\n// Configurações de isolamento (para bancaId, etc.) com type-safety\r\nexport type IsolationConfig<T> = {\r\n enabled: boolean;\r\n fieldName: keyof T; // ex: \"bancaId\" - deve ser um campo válido do modelo\r\n getValue: () => T[keyof T] | undefined; // Função para obter o valor de isolamento\r\n};\r\n\r\n// Configurações de cache\r\nexport type CacheConfig = {\r\n enabled: boolean;\r\n ttl?: number; // Time to live em ms\r\n maxSize?: number; // Tamanho máximo do cache\r\n};\r\n\r\n// Tipos de operações\r\nexport type OperationType = \"read\" | \"write\" | \"delete\";\r\n\r\n// Configurações de autorização por role\r\nexport type AuthorizationConfig = {\r\n enabled: boolean;\r\n allowedRoles: {\r\n read?: (keyof typeof ROLES)[]; // Roles permitidas para leitura (get, getAll, listen)\r\n write?: (keyof typeof ROLES)[]; // Roles permitidas para escrita (add, update)\r\n delete?: (keyof typeof ROLES)[]; // Roles permitidas para deletar (remove)\r\n };\r\n getUserRole: () => keyof typeof ROLES | undefined; // Função para obter o role do usuário atual\r\n onUnauthorized?: (operation: OperationType, userRole?: keyof typeof ROLES) => void; // Callback quando não autorizado\r\n};\r\n\r\nexport type RepoConfig<T extends { id: string }> = {\r\n collectionName: keyof typeof collections;\r\n model: (data: any) => T;\r\n idSearchStrategy: IdSearchStrategy<T>;\r\n isolation?: IsolationConfig<T>;\r\n cache?: CacheConfig;\r\n authorization?: AuthorizationConfig; // ✨ Nova configuração de autorização\r\n generateId?: () => string;\r\n};\r\n\r\n// Cache simples em memória\r\nclass MemoryCache {\r\n public cache = new Map<string, { data: any; timestamp: number }>();\r\n private ttl: number;\r\n private maxSize: number;\r\n\r\n constructor(ttl: number = 300000, maxSize: number = 1000) { // 5min default\r\n this.ttl = ttl;\r\n this.maxSize = maxSize;\r\n }\r\n\r\n get(key: string): any | null {\r\n const item = this.cache.get(key);\r\n if (!item) return null;\r\n \r\n if (Date.now() - item.timestamp > this.ttl) {\r\n this.cache.delete(key);\r\n return null;\r\n }\r\n \r\n return item.data;\r\n }\r\n\r\n set(key: string, data: any): void {\r\n // Limpa cache se exceder tamanho máximo\r\n if (this.cache.size >= this.maxSize) {\r\n const firstKey = this.cache.keys().next().value;\r\n if (firstKey) {\r\n this.cache.delete(firstKey);\r\n }\r\n }\r\n \r\n this.cache.set(key, { data, timestamp: Date.now() });\r\n }\r\n\r\n delete(key: string): void {\r\n this.cache.delete(key);\r\n }\r\n\r\n clear(): void {\r\n this.cache.clear();\r\n }\r\n}\r\n\r\n// Interface do repositório retornado\r\nexport interface GenericRepo<T extends { id: string }> {\r\n get: (id: string) => Promise<T | null>;\r\n getAll: (options?: RepoQueryOptions<T>) => Promise<{ [id: string]: T }>;\r\n listen: (options: RepoQueryOptions<T>, callback: (data: { [id: string]: T }) => void) => () => void;\r\n add: (docData: Partial<T> & { id?: string }) => Promise<string>;\r\n update: (id: string, docData: Partial<T>) => Promise<void>;\r\n remove: (id: string) => Promise<void>;\r\n batch: (docs: { id?: string; data: T; operation: \"add\" | \"update\" | \"delete\" }[]) => Promise<void>;\r\n clearCache: () => void;\r\n getCacheSize: () => number;\r\n}\r\n\r\nexport function createGenericRepo<T extends { id: string }>(\r\n db: Firestore,\r\n adapter: FirebaseAdapter<T>,\r\n config: RepoConfig<T>\r\n): GenericRepo<T> {\r\n const { collectionName, model, idSearchStrategy, isolation, cache, authorization, generateId } = config;\r\n const memoryCache = cache?.enabled ? new MemoryCache(cache.ttl, cache.maxSize) : null;\r\n\r\n // Função para verificar autorização\r\n const checkAuthorization = (operation: OperationType): void => {\r\n if (!authorization?.enabled) return;\r\n \r\n const userRole = authorization.getUserRole();\r\n const allowedRoles = authorization.allowedRoles[operation];\r\n \r\n // Se não há roles definidas para a operação, permite tudo\r\n if (!allowedRoles || allowedRoles.length === 0) return;\r\n \r\n // Se usuário não está logado ou não tem role, bloqueia\r\n if (!userRole) {\r\n authorization.onUnauthorized?.(operation, userRole);\r\n throw new Error(`❌ Não autorizado: Operação '${operation}' requer autenticação na coleção '${collectionName}'`);\r\n }\r\n \r\n // Verifica se o role do usuário está na lista de permitidos\r\n if (!allowedRoles.includes(userRole)) {\r\n authorization.onUnauthorized?.(operation, userRole);\r\n throw new Error(`❌ Não autorizado: Role '${userRole}' não tem permissão para '${operation}' na coleção '${collectionName}'. Roles permitidas: ${allowedRoles.join(\", \")}`);\r\n }\r\n };\r\n\r\n // Função para obter constraints de isolamento\r\n const getIsolationConstraints = (): WhereCondition<T>[] => {\r\n if (!isolation?.enabled) return [];\r\n \r\n const value = isolation.getValue();\r\n if (!value) return [];\r\n \r\n return [{ field: isolation.fieldName as any, operator: \"==\", value }];\r\n };\r\n\r\n // Função para construir query\r\n const buildQuery = (options?: RepoQueryOptions<T>): Query<T> => {\r\n const constraints: QueryConstraint[] = [];\r\n \r\n // Adiciona constraints de isolamento primeiro\r\n const isolationConstraints = getIsolationConstraints();\r\n isolationConstraints.forEach(({ field, operator, value }) => {\r\n constraints.push(adapter.where(field.toString(), operator, value));\r\n });\r\n \r\n // Adiciona constraints da query\r\n options?.where?.forEach(({ field, operator, value }) => {\r\n constraints.push(adapter.where(field.toString(), operator, value));\r\n });\r\n \r\n options?.orderBy?.forEach(({ field, direction }) => {\r\n constraints.push(adapter.orderBy(field.toString(), direction));\r\n });\r\n \r\n if (options?.limit) {\r\n constraints.push(adapter.limit(options.limit));\r\n }\r\n \r\n // Adiciona cursores de paginação\r\n if (options?.startAfter !== undefined) {\r\n constraints.push(adapter.startAfter(options.startAfter));\r\n }\r\n \r\n if (options?.startAt !== undefined) {\r\n constraints.push(adapter.startAt(options.startAt));\r\n }\r\n \r\n if (options?.endBefore !== undefined) {\r\n constraints.push(adapter.endBefore(options.endBefore));\r\n }\r\n \r\n if (options?.endAt !== undefined) {\r\n constraints.push(adapter.endAt(options.endAt));\r\n }\r\n \r\n const collection = adapter.collection(db, collectionName);\r\n return adapter.query(collection, ...constraints);\r\n };\r\n\r\n // Função para resolver documento por ID\r\n const resolveDocument = async (id: string): Promise<DocumentReference<T>> => {\r\n switch (idSearchStrategy.type) {\r\n case \"documentId\":\r\n return adapter.doc(db, collectionName, id);\r\n \r\n case \"field\":\r\n // Para busca por campo, precisamos fazer uma query\r\n const query = buildQuery({\r\n where: [{ field: idSearchStrategy.fieldName, operator: \"==\", value: id }],\r\n limit: 1\r\n });\r\n const snapshot = await adapter.getDocs(query);\r\n if ((snapshot as any).empty) throw new Error(`Document not found with ${String(idSearchStrategy.fieldName)}: ${id}`);\r\n return (snapshot as any).docs[0].ref;\r\n \r\n case \"custom\":\r\n return idSearchStrategy.resolver(id);\r\n \r\n default:\r\n throw new Error(`Unknown idSearchStrategy: ${(idSearchStrategy as any).type}`);\r\n }\r\n };\r\n\r\n // Função para gerar chave de cache\r\n const getCacheKey = (operation: string, ...params: any[]): string => {\r\n const isolationKey = isolation?.enabled ? `_${isolation.getValue()}` : '';\r\n return `${collectionName}${isolationKey}_${operation}_${JSON.stringify(params)}`;\r\n };\r\n\r\n const get = async (id: string): Promise<T | null> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"read\");\r\n \r\n // Verifica cache primeiro\r\n if (memoryCache) {\r\n const cacheKey = getCacheKey('get', id);\r\n const cached = memoryCache.get(cacheKey);\r\n if (cached) return cached;\r\n }\r\n\r\n let docSnap: DocumentSnapshot<T>;\r\n \r\n if (idSearchStrategy.type === \"documentId\") {\r\n const docRef = adapter.doc(db, collectionName, id);\r\n docSnap = await adapter.getDoc(docRef);\r\n } else if (idSearchStrategy.type === \"field\") {\r\n // Para outros tipos, usa query\r\n const query = buildQuery({\r\n where: [{ field: idSearchStrategy.fieldName, operator: \"==\", value: id }],\r\n limit: 1\r\n });\r\n const snapshot = await adapter.getDocs(query);\r\n docSnap = (snapshot as any).docs[0] || null;\r\n } else {\r\n const docRef = await resolveDocument(id);\r\n docSnap = await adapter.getDoc(docRef);\r\n }\r\n\r\n if (!(docSnap as any)?.exists()) return null;\r\n\r\n const result = model((docSnap as any).data());\r\n \r\n // Armazena no cache\r\n if (memoryCache) {\r\n const cacheKey = getCacheKey('get', id);\r\n memoryCache.set(cacheKey, result);\r\n }\r\n \r\n return result;\r\n } catch (error) {\r\n console.error(`Error getting document ${id}:`, error);\r\n return null;\r\n }\r\n };\r\n\r\n const getAll = async (options?: RepoQueryOptions<T>): Promise<{ [id: string]: T }> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"read\");\r\n \r\n const query = buildQuery(options);\r\n const snapshot = await adapter.getDocs(query);\r\n \r\n const result: { [id: string]: T } = {};\r\n (snapshot as any).forEach((docSnap: any) => {\r\n const data = model(docSnap.data());\r\n result[data.id] = data;\r\n });\r\n \r\n return result;\r\n } catch (error) {\r\n console.error(`Error getting all documents:`, error);\r\n return {};\r\n }\r\n };\r\n\r\n const listen = (\r\n options: RepoQueryOptions<T>,\r\n callback: (data: { [id: string]: T }) => void\r\n ): (() => void) => {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"read\");\r\n \r\n const query = buildQuery(options);\r\n \r\n return adapter.onSnapshot(query, (snapshot: any) => {\r\n const result: { [id: string]: T } = {};\r\n snapshot.forEach((docSnap: any) => {\r\n const data = model(docSnap.data());\r\n result[data.id] = data;\r\n });\r\n callback(result);\r\n });\r\n };\r\n\r\n const add = async (docData: Partial<T> & { id?: string }): Promise<string> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"write\");\r\n \r\n const id = docData.id || generateId?.() || adapter.generateId();\r\n \r\n // Adiciona dados de isolamento se necessário\r\n const completeData = { ...docData, id };\r\n if (isolation?.enabled && isolation.getValue()) {\r\n (completeData as any)[isolation.fieldName] = isolation.getValue();\r\n }\r\n \r\n const docRef = adapter.doc(db, collectionName, id);\r\n const modelData = model(completeData);\r\n \r\n await adapter.setDoc(docRef, modelData);\r\n \r\n // Limpa cache relacionado\r\n if (memoryCache) {\r\n memoryCache.delete(getCacheKey('get', id));\r\n }\r\n \r\n return id;\r\n } catch (error) {\r\n console.error(`Error adding document:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n const update = async (id: string, docData: Partial<T>): Promise<void> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"write\");\r\n \r\n const docRef = await resolveDocument(id);\r\n \r\n // Adiciona dados de isolamento se necessário\r\n const completeData = { ...docData };\r\n if (isolation?.enabled && isolation.getValue()) {\r\n (completeData as any)[isolation.fieldName] = isolation.getValue();\r\n }\r\n \r\n await adapter.updateDoc(docRef, completeData);\r\n \r\n // Limpa cache relacionado\r\n if (memoryCache) {\r\n memoryCache.delete(getCacheKey('get', id));\r\n }\r\n } catch (error) {\r\n console.error(`Error updating document ${id}:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n const remove = async (id: string): Promise<void> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"delete\");\r\n \r\n const docRef = await resolveDocument(id);\r\n await adapter.deleteDoc(docRef);\r\n \r\n // Limpa cache relacionado\r\n if (memoryCache) {\r\n memoryCache.delete(getCacheKey('get', id));\r\n }\r\n } catch (error) {\r\n console.error(`Error removing document ${id}:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n const batch = async (\r\n docs: { id?: string; data: T; operation: \"add\" | \"update\" | \"delete\" }[]\r\n ): Promise<void> => {\r\n try {\r\n // ✨ Verifica autorização para cada operação\r\n const operations = new Set(docs.map(d => d.operation));\r\n operations.forEach(op => {\r\n if (op === \"delete\") checkAuthorization(\"delete\");\r\n else checkAuthorization(\"write\");\r\n });\r\n \r\n const batch = adapter.writeBatch(db);\r\n \r\n for (const { id, data, operation } of docs) {\r\n const docId = id || generateId?.() || adapter.generateId();\r\n const docRef = adapter.doc(db, collectionName, docId);\r\n \r\n // Adiciona dados de isolamento se necessário\r\n const completeData = { ...data, id: docId };\r\n if (isolation?.enabled && isolation.getValue()) {\r\n (completeData as any)[isolation.fieldName] = isolation.getValue();\r\n }\r\n \r\n const modelData = model(completeData);\r\n \r\n switch (operation) {\r\n case \"add\":\r\n adapter.batchSet(batch, docRef, modelData);\r\n break;\r\n case \"update\":\r\n adapter.batchUpdate(batch, docRef, completeData);\r\n break;\r\n case \"delete\":\r\n adapter.batchDelete(batch, docRef);\r\n break;\r\n }\r\n }\r\n \r\n await adapter.batchCommit(batch);\r\n \r\n // Limpa cache\r\n if (memoryCache) {\r\n memoryCache.clear();\r\n }\r\n } catch (error) {\r\n console.error(`Error in batch operation:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n return {\r\n get,\r\n getAll,\r\n listen,\r\n add,\r\n update,\r\n remove,\r\n batch,\r\n // Utilitários\r\n clearCache: () => memoryCache?.clear(),\r\n getCacheSize: () => memoryCache?.cache.size || 0,\r\n };\r\n}\r\n\r\n// Detecção automática de versão do Firebase\r\nexport type FirebaseVersion = 'v8' | 'v9-modular' | 'unknown';\r\n\r\nexport const detectFirebaseVersion = (firebaseInstance: any): FirebaseVersion => {\r\n try {\r\n // Caso 1: Firebase v9+ modular - instância com funções como getFirestore\r\n if (firebaseInstance && typeof firebaseInstance.getFirestore === 'function') {\r\n return 'v9-modular';\r\n }\r\n \r\n // Caso 2: Firebase v9+ modular - objeto com funções do Firestore v9\r\n if (firebaseInstance && \r\n typeof firebaseInstance.collection === 'function' && \r\n typeof firebaseInstance.doc === 'function' &&\r\n typeof firebaseInstance.query === 'function' &&\r\n typeof firebaseInstance.where === 'function') {\r\n return 'v9-modular';\r\n }\r\n \r\n // Caso 3: Firebase v8 - instância principal com firestore()\r\n if (firebaseInstance && typeof firebaseInstance.firestore === 'function') {\r\n return 'v8';\r\n }\r\n \r\n // Caso 4: Firebase v8 - instância direta do Firestore v8\r\n if (firebaseInstance && \r\n typeof firebaseInstance.collection === 'function' && \r\n typeof firebaseInstance.doc === 'function' &&\r\n typeof firebaseInstance.batch === 'function') {\r\n return 'v8';\r\n }\r\n \r\n // Caso 5: Verifica se é um namespace v9+ (ex: firebase/app)\r\n if (firebaseInstance && \r\n firebaseInstance.initializeApp && \r\n typeof firebaseInstance.initializeApp === 'function') {\r\n // Se tem initializeApp, provavelmente é v9+\r\n return 'v9-modular';\r\n }\r\n \r\n return 'unknown';\r\n } catch (error) {\r\n console.warn('Erro ao detectar versão do Firebase:', error);\r\n return 'unknown';\r\n }\r\n};\r\n\r\n// Adaptador para Firebase v9+ modular\r\nexport const createV9ModularAdapter = <T = any>(firebaseModular: any): FirebaseAdapter<T> => {\r\n return {\r\n collection: (db, path) => firebaseModular.collection(db, path),\r\n doc: (db, path, ...segments) => firebaseModular.doc(db, path, ...segments),\r\n query: (collection, ...constraints) => firebaseModular.query(collection, ...constraints),\r\n where: (field, operator, value) => firebaseModular.where(field, operator, value),\r\n orderBy: (field, direction = 'asc') => firebaseModular.orderBy(field, direction),\r\n limit: (count) => firebaseModular.limit(count),\r\n startAfter: (...fieldValues) => firebaseModular.startAfter(...fieldValues),\r\n startAt: (...fieldValues) => firebaseModular.startAt(...fieldValues),\r\n endBefore: (...fieldValues) => firebaseModular.endBefore(...fieldValues),\r\n endAt: (...fieldValues) => firebaseModular.endAt(...fieldValues),\r\n getDocs: firebaseModular.getDocs,\r\n getDoc: firebaseModular.getDoc,\r\n setDoc: firebaseModular.setDoc,\r\n updateDoc: firebaseModular.updateDoc,\r\n deleteDoc: firebaseModular.deleteDoc,\r\n writeBatch: firebaseModular.writeBatch,\r\n batchSet: (batch, docRef, data) => batch.set(docRef, data),\r\n batchUpdate: (batch, docRef, data) => batch.update(docRef, data),\r\n batchDelete: (batch, docRef) => batch.delete(docRef),\r\n batchCommit: (batch) => batch.commit(),\r\n onSnapshot: firebaseModular.onSnapshot,\r\n generateId: () => generateId(),\r\n };\r\n};\r\n\r\n// Adaptador para Firebase v8 legacy\r\nexport const createV8Adapter = <T = any>(): FirebaseAdapter<T> => {\r\n return {\r\n collection: (db, path) => (db as any).collection(path),\r\n doc: (db, path, ...segments) => (db as any).collection(path).doc(segments.join('/')),\r\n query: (collection, ...constraints) => {\r\n let query = collection;\r\n constraints.forEach(constraint => {\r\n if (constraint.type === 'where') {\r\n query = (query as any).where(constraint.field, constraint.opStr, constraint.value);\r\n } else if (constraint.type === 'orderBy') {\r\n query = (query as any).orderBy(constraint.field, constraint.direction);\r\n } else if (constraint.type === 'limit') {\r\n query = (query as any).limit(constraint.limit);\r\n } else if (constraint.type === 'startAfter') {\r\n query = (query as any).startAfter(...constraint.values);\r\n } else if (constraint.type === 'startAt') {\r\n query = (query as any).startAt(...constraint.values);\r\n } else if (constraint.type === 'endBefore') {\r\n query = (query as any).endBefore(...constraint.values);\r\n } else if (constraint.type === 'endAt') {\r\n query = (query as any).endAt(...constraint.values);\r\n }\r\n });\r\n return query;\r\n },\r\n where: (field, operator, value) => ({ type: 'where', field, opStr: operator, value }),\r\n orderBy: (field, direction = 'asc') => ({ type: 'orderBy', field, direction }),\r\n limit: (count) => ({ type: 'limit', limit: count }),\r\n startAfter: (...fieldValues) => ({ type: 'startAfter', values: fieldValues }),\r\n startAt: (...fieldValues) => ({ type: 'startAt', values: fieldValues }),\r\n endBefore: (...fieldValues) => ({ type: 'endBefore', values: fieldValues }),\r\n endAt: (...fieldValues) => ({ type: 'endAt', values: fieldValues }),\r\n getDocs: (query) => (query as any).get(),\r\n getDoc: (docRef) => (docRef as any).get(),\r\n setDoc: (docRef, data, options) => (docRef as any).set(data, options),\r\n updateDoc: (docRef, data) => (docRef as any).update(data),\r\n deleteDoc: (docRef) => (docRef as any).delete(),\r\n writeBatch: (db) => (db as any).batch(),\r\n batchSet: (batch, docRef, data) => (batch as any).set(docRef, data),\r\n batchUpdate: (batch, docRef, data) => (batch as any).update(docRef, data),\r\n batchDelete: (batch, docRef) => (batch as any).delete(docRef),\r\n batchCommit: (batch) => (batch as any).commit(),\r\n onSnapshot: (query, callback) => (query as any).onSnapshot(callback),\r\n generateId: () => generateId(),\r\n };\r\n};\r\n\r\n// Função principal que detecta automaticamente a versão e cria o adaptador apropriado\r\nexport const createWebAdapter = <T = any>(firebaseInstance: any): FirebaseAdapter<T> => {\r\n const version = detectFirebaseVersion(firebaseInstance);\r\n \r\n console.log(`🔥 Firebase version detected: ${version}`);\r\n \r\n switch (version) {\r\n case 'v9-modular':\r\n return createV9ModularAdapter(firebaseInstance);\r\n \r\n case 'v8':\r\n return createV8Adapter();\r\n \r\n default:\r\n console.warn('⚠️ Firebase version not detected, falling back to v8 adapter');\r\n return createV8Adapter();\r\n }\r\n};\r\n\r\n// Função utilitária para criar repositório com detecção automática de versão\r\nexport const createAutoRepo = <T extends { id: string }>(\r\n firebaseInstance: any,\r\n db: Firestore,\r\n config: RepoConfig<T>\r\n): GenericRepo<T> => {\r\n const adapter = createWebAdapter(firebaseInstance);\r\n return createGenericRepo(db, adapter, config);\r\n};\r\n\r\nexport const createReactNativeAdapter = (): FirebaseAdapter => {\r\n // Implementação para React Native Firebase\r\n \r\n return {\r\n collection: (db, path) => db.collection(path),\r\n doc: (db, path, ...segments) => db.collection(path).doc(segments.join('/')),\r\n query: (collection, ...constraints) => {\r\n let query = collection;\r\n constraints.forEach(constraint => {\r\n // Adaptar constraints para React Native Firebase\r\n if (constraint.type === 'where') {\r\n query = query.where(constraint.field, constraint.opStr, constraint.value);\r\n } else if (constraint.type === 'orderBy') {\r\n query = query.orderBy(constraint.field, constraint.direction);\r\n } else if (constraint.type === 'limit') {\r\n query = query.limit(constraint.limit);\r\n } else if (constraint.type === 'startAfter') {\r\n query = query.startAfter(...constraint.values);\r\n } else if (constraint.type === 'startAt') {\r\n query = query.startAt(...constraint.values);\r\n } else if (constraint.type === 'endBefore') {\r\n query = query.endBefore(...constraint.values);\r\n } else if (constraint.type === 'endAt') {\r\n query = query.endAt(...constraint.values);\r\n }\r\n });\r\n return query;\r\n },\r\n where: (field, operator, value) => ({ type: 'where', field, opStr: operator, value }),\r\n orderBy: (field, direction = 'asc') => ({ type: 'orderBy', field, direction }),\r\n limit: (count) => ({ type: 'limit', limit: count }),\r\n startAfter: (...fieldValues) => ({ type: 'startAfter', values: fieldValues }),\r\n startAt: (...fieldValues) => ({ type: 'startAt', values: fieldValues }),\r\n endBefore: (...fieldValues) => ({ type: 'endBefore', values: fieldValues }),\r\n endAt: (...fieldValues) => ({ type: 'endAt', values: fieldValues }),\r\n getDocs: (query) => query.get(),\r\n getDoc: (docRef) => docRef.get(),\r\n setDoc: (docRef, data, options) => docRef.set(data, options),\r\n updateDoc: (docRef, data) => docRef.update(data),\r\n deleteDoc: (docRef) => docRef.delete(),\r\n writeBatch: (db) => db.batch(),\r\n batchSet: (batch, docRef, data) => batch.set(docRef, data),\r\n batchUpdate: (batch, docRef, data) => batch.update(docRef, data),\r\n batchDelete: (batch, docRef) => batch.delete(docRef),\r\n batchCommit: (batch) => batch.commit(),\r\n onSnapshot: (query, callback) => query.onSnapshot(callback),\r\n generateId: () => generateId(),\r\n };\r\n};\r\n","/**\r\n * FACTORY PARA CRIAR TODOS OS REPOSITÓRIOS\r\n *\r\n * Este arquivo cria automaticamente todos os repositórios configurados\r\n * com type-safety completo, cache, isolamento por bancaId, etc.\r\n */\r\n\r\nimport {\r\n createGenericRepo,\r\n createWebAdapter,\r\n createReactNativeAdapter,\r\n type FirebaseAdapter,\r\n type Firestore,\r\n type GenericRepo,\r\n type RepoConfig,\r\n type AuthorizationConfig,\r\n type OperationType,\r\n} from \"./generic\";\r\n\r\nimport {\r\n UserModel,\r\n BancaModel,\r\n ExtracaoModel,\r\n ResultadoModel,\r\n MessageModel,\r\n RouteModel,\r\n ValueGameModel,\r\n LimitGameModel,\r\n GameModel,\r\n NumberModel,\r\n DescargaModel,\r\n PremiacaoModel,\r\n PremiacaoAssociacaoModel,\r\n PDFModel,\r\n AuditLogModel,\r\n EnvioDescargaModel,\r\n DeviceModel,\r\n} from \"../models\";\r\n\r\nimport type {\r\n TypeUser,\r\n TypeBanca,\r\n TypeExtracao,\r\n TypeResultado,\r\n TypeMessage,\r\n TypeRoute,\r\n TypeValueGame,\r\n TypeLimitGame,\r\n TypeGame,\r\n TypeNumero,\r\n TypeDescarga,\r\n TypePremiacao,\r\n TypePremiacaoAssociacao,\r\n TypePDFDescargas,\r\n TypeAuditLog,\r\n TypeEnvioDescarga,\r\n TypeDevice,\r\n} from \"../types\";\r\nimport { collections } from \"./collections\";\r\n\r\n// ============================================================================\r\n// TIPOS PARA CONFIGURAÇÃO\r\n// ============================================================================\r\n\r\nexport type RepoFactoryConfig = {\r\n db: Firestore;\r\n adapter: FirebaseAdapter;\r\n getBancaId?: () => string | undefined; // Função para obter bancaId atual\r\n getUserRole?: () => string | undefined; // ✨ Função para obter role do usuário atual\r\n cacheConfig?: {\r\n enabled: boolean;\r\n ttl?: number;\r\n maxSize?: number;\r\n };\r\n authorizationConfigs?: { // ✨ Configurações de autorização por coleção\r\n [collectionName in keyof typeof collections]: AuthorizationConfig;\r\n };\r\n onUnauthorized?: (operation: OperationType, userRole?: string, collection?: string) => void; // ✨ Callback global para não autorizado\r\n};\r\n\r\nexport type RepoCollections = {\r\n users_associacao: GenericRepo<TypeUser>;\r\n users: GenericRepo<TypeUser>;\r\n bancas: GenericRepo<TypeBanca>;\r\n extracoes: GenericRepo<TypeExtracao>;\r\n resultados: GenericRepo<TypeResultado>;\r\n mensagens: GenericRepo<TypeMessage>;\r\n rotas: GenericRepo<TypeRoute>;\r\n valores_jogos: GenericRepo<TypeValueGame>;\r\n limites_jogos: GenericRepo<TypeLimitGame>;\r\n pules: GenericRepo<TypeGame>;\r\n numeros: GenericRepo<TypeNumero>;\r\n numeros_enviados: GenericRepo<TypeNumero>;\r\n descargas: GenericRepo<TypeDescarga>;\r\n descargas_associacao: GenericRepo<TypeDescarga>;\r\n premiacoes: GenericRepo<TypePremiacao>;\r\n premiacoes_associacao: GenericRepo<TypePremiacaoAssociacao>;\r\n pdf_descargas: GenericRepo<TypePDFDescargas>;\r\n pdf_descargas_associacao: GenericRepo<TypePDFDescargas>;\r\n auditLogs: GenericRepo<TypeAuditLog>;\r\n envios_descarga: GenericRepo<TypeEnvioDescarga>;\r\n dispositivos: GenericRepo<TypeDevice>;\r\n};\r\n\r\n// ============================================================================\r\n// CONFIGURAÇÕES DE CADA COLEÇÃO\r\n// ============================================================================\r\n\r\nconst createConfigs = (\r\n getBancaId?: () => string | undefined,\r\n cacheConfig: {\r\n enabled: boolean;\r\n ttl?: number;\r\n maxSize?: number;\r\n } = { enabled: true, ttl: 300000, maxSize: 1000 },\r\n authorizationConfigs?: { [collectionName in keyof typeof collections]: AuthorizationConfig }\r\n) => {\r\n // Helper para isolamento por bancaId\r\n const withBancaIsolation = <T extends { id: string; bancaId?: string }>(\r\n config: Omit<RepoConfig<T>, \"isolation\" | \"cache\" | \"authorization\">\r\n ): RepoConfig<T> => ({\r\n ...config,\r\n isolation: getBancaId\r\n ? {\r\n enabled: true,\r\n fieldName: \"bancaId\" as keyof T,\r\n getValue: getBancaId as any,\r\n }\r\n : undefined,\r\n cache: cacheConfig,\r\n authorization: authorizationConfigs?.[config.collectionName],\r\n });\r\n\r\n // Helper para coleções sem isolamento\r\n const withoutIsolation = <T extends { id: string }>(\r\n config: Omit<RepoConfig<T>, \"isolation\" | \"cache\" | \"authorization\">\r\n ): RepoConfig<T> => ({\r\n ...config,\r\n cache: cacheConfig,\r\n authorization: authorizationConfigs?.[config.collectionName as keyof typeof collections],\r\n });\r\n\r\n return {\r\n\r\n // ========================================================================\r\n // USUÁRIOS - Com isolamento por bancaId\r\n // ========================================================================\r\n users_associacao: withoutIsolation<TypeUser>({\r\n collectionName: \"users\",\r\n model: UserModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // USUÁRIOS da banca - Com isolamento por bancaId\r\n // ========================================================================\r\n users: withBancaIsolation<TypeUser>({\r\n collectionName: \"users\",\r\n model: UserModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // BANCAS - Sem isolamento (dados globais)\r\n // ========================================================================\r\n bancas: withoutIsolation<TypeBanca>({\r\n collectionName: \"bancas\",\r\n model: BancaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // EXTRAÇÕES - Com isolamento por bancaId\r\n // ========================================================================\r\n extracoes: withBancaIsolation<TypeExtracao>({\r\n collectionName: \"extracoes\",\r\n model: ExtracaoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // RESULTADOS - Com isolamento por bancaId\r\n // ========================================================================\r\n resultados: withBancaIsolation<TypeResultado>({\r\n collectionName: \"resultados\",\r\n model: ResultadoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // MENSAGENS - Com isolamento por bancaId\r\n // ========================================================================\r\n mensagens: withBancaIsolation<TypeMessage>({\r\n collectionName: \"mensagens\",\r\n model: MessageModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // ROTAS - Com isolamento por bancaId\r\n // ========================================================================\r\n rotas: withBancaIsolation<TypeRoute>({\r\n collectionName: \"rotas\",\r\n model: RouteModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // VALORES DE JOGOS - Com isolamento por bancaId\r\n // ========================================================================\r\n valores_jogos: withBancaIsolation<TypeValueGame>({\r\n collectionName: \"valores_jogos\",\r\n model: ValueGameModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // LIMITES DE JOGOS - Com isolamento por bancaId\r\n // ========================================================================\r\n limites_jogos: withBancaIsolation<TypeLimitGame>({\r\n collectionName: \"limites_jogos\",\r\n model: LimitGameModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PULES (JOGOS) - Com isolamento por bancaId\r\n // ========================================================================\r\n pules: withBancaIsolation<TypeGame>({\r\n collectionName: \"pules\",\r\n model: GameModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // NÚMEROS - Com isolamento por bancaId\r\n // ========================================================================\r\n numeros: withBancaIsolation<TypeNumero>({\r\n collectionName: \"numeros\",\r\n model: NumberModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // NÚMEROS ENVIADOS - Com isolamento por bancaId\r\n // ========================================================================\r\n numeros_enviados: withBancaIsolation<TypeNumero>({\r\n collectionName: \"numeros_enviados\",\r\n model: NumberModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // DESCARGAS - Com isolamento por bancaId\r\n // ========================================================================\r\n descargas: withBancaIsolation<TypeDescarga>({\r\n collectionName: \"descargas\",\r\n model: DescargaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // DESCARGAS ASSOCIAÇÃO - Com isolamento por bancaId\r\n // ========================================================================\r\n descargas_associacao: withBancaIsolation<TypeDescarga>({\r\n collectionName: \"descargas_associacao\",\r\n model: DescargaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PREMIAÇÕES - Com isolamento por bancaId\r\n // ========================================================================\r\n premiacoes: withBancaIsolation<TypePremiacao>({\r\n collectionName: \"premiacoes\",\r\n model: PremiacaoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PREMIAÇÕES ASSOCIAÇÃO - Com isolamento por bancaId\r\n // ========================================================================\r\n premiacoes_associacao: withBancaIsolation<TypePremiacaoAssociacao>({\r\n collectionName: \"premiacoes_associacao\",\r\n model: PremiacaoAssociacaoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PDF DESCARGAS - Com isolamento por bancaId\r\n // ========================================================================\r\n pdf_descargas: withBancaIsolation<TypePDFDescargas>({\r\n collectionName: \"pdf_descargas\",\r\n model: PDFModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PDF DESCARGAS ASSOCIAÇÃO - Com isolamento por bancaId\r\n // ========================================================================\r\n pdf_descargas_associacao: withBancaIsolation<TypePDFDescargas>({\r\n collectionName: \"pdf_descargas_associacao\",\r\n model: PDFModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // AUDIT LOGS - Com isolamento por bancaId\r\n // ========================================================================\r\n auditLogs: withBancaIsolation<TypeAuditLog>({\r\n collectionName: \"auditLogs\",\r\n model: AuditLogModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // ENVIOS DESCARGA - Com isolamento por bancaId\r\n // ========================================================================\r\n envios_descarga: withBancaIsolation<TypeEnvioDescarga>({\r\n collectionName: \"envios_descarga\",\r\n model: EnvioDescargaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // DISPOSITIVOS - Com isolamento por bancaId\r\n // ========================================================================\r\n dispositivos: withBancaIsolation<TypeDevice>({\r\n collectionName: \"dispositivos\",\r\n model: DeviceModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// FACTORY PRINCIPAL\r\n// ============================================================================\r\n\r\nexport function createRepoFactory(config: RepoFactoryConfig): RepoCollections {\r\n const { db, adapter, getBancaId, cacheConfig, authorizationConfigs } = config;\r\n const configs = createConfigs(getBancaId, cacheConfig, authorizationConfigs);\r\n\r\n return {\r\n users_associacao: createGenericRepo(db, adapter, configs.users_associacao),\r\n users: createGenericRepo(db, adapter, configs.users),\r\n bancas: createGenericRepo(db, adapter, configs.bancas),\r\n extracoes: createGenericRepo(db, adapter, configs.extracoes),\r\n resultados: createGenericRepo(db, adapter, configs.resultados),\r\n mensagens: createGenericRepo(db, adapter, configs.mensagens),\r\n rotas: createGenericRepo(db, adapter, configs.rotas),\r\n valores_jogos: createGenericRepo(db, adapter, configs.valores_jogos),\r\n limites_jogos: createGenericRepo(db, adapter, configs.limites_jogos),\r\n pules: createGenericRepo(db, adapter, configs.pules),\r\n numeros: createGenericRepo(db, adapter, configs.numeros),\r\n numeros_enviados: createGenericRepo(db, adapter, configs.numeros_enviados),\r\n descargas: createGenericRepo(db, adapter, configs.descargas),\r\n descargas_associacao: createGenericRepo(\r\n db,\r\n adapter,\r\n configs.descargas_associacao\r\n ),\r\n premiacoes: createGenericRepo(db, adapter, configs.premiacoes),\r\n premiacoes_associacao: createGenericRepo(\r\n db,\r\n adapter,\r\n configs.premiacoes_associacao\r\n ),\r\n pdf_descargas: createGenericRepo(db, adapter, configs.pdf_descargas),\r\n pdf_descargas_associacao: createGenericRepo(\r\n db,\r\n adapter,\r\n configs.pdf_descargas_associacao\r\n ),\r\n auditLogs: createGenericRepo(db, adapter, configs.auditLogs),\r\n envios_descarga: createGenericRepo(db, adapter, configs.envios_descarga),\r\n dispositivos: createGenericRepo(db, adapter, configs.dispositivos),\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS ESPECÍFICOS PARA WEB E REACT NATIVE\r\n// ============================================================================\r\n\r\n/**\r\n * Cria todos os repositórios para Firebase Web SDK\r\n *\r\n * @example\r\n * import { getFirestore, collection, doc, query, where } from 'firebase/firestore';\r\n * import { createWebRepoFactory } from '@cristian.aragao/milharis-core';\r\n *\r\n * const db = getFirestore();\r\n * const firebaseInstance = { collection, doc, query, where, getDocs, getDoc, setDoc, updateDoc, deleteDoc, writeBatch, onSnapshot };\r\n * const repo = createWebRepoFactory({\r\n * db,\r\n * firebaseInstance,\r\n * getBancaId: () => getCurrentUser()?.bancaId\r\n * });\r\n *\r\n * // Usar com type-safety completo!\r\n * const users = await repo.users.getAll({\r\n * where: [{ field: \"role\", operator: \"==\", value: \"admin\" }]\r\n * });\r\n */\r\nexport function createWebRepoFactory(\r\n config: Omit<RepoFactoryConfig, \"adapter\"> & { firebaseInstance: any }\r\n): RepoCollections {\r\n return createRepoFactory({\r\n ...config,\r\n adapter: createWebAdapter(config.firebaseInstance),\r\n });\r\n}\r\n\r\n/**\r\n * Cria todos os repositórios para React Native Firebase\r\n *\r\n * @example\r\n * import firestore from '@react-native-firebase/firestore';\r\n * import { createReactNativeRepoFactory } from '@cristian.aragao/milharis-core';\r\n *\r\n * const repo = createReactNativeRepoFactory({\r\n * db: firestore(),\r\n * getBancaId: () => getCurrentUser()?.bancaId\r\n * });\r\n *\r\n * // Usar com type-safety completo!\r\n * const numeros = await repo.numeros.getAll({\r\n * where: [{ field: \"tipo_jogo\", operator: \"==\", value: \"milhar\" }]\r\n * });\r\n */\r\nexport function createReactNativeRepoFactory(\r\n config: Omit<RepoFactoryConfig, \"adapter\">\r\n): RepoCollections {\r\n return createRepoFactory({\r\n ...config,\r\n adapter: createReactNativeAdapter(),\r\n });\r\n}\r\n"],"mappings":"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AO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE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AClC,IAAK,CAAE,MAAO,MAAO,MAAO,KAAM,EAKlC,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAK5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CA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","names":["EXTRACAO","GAMES","BICHOS","GRUPOS_BICHOS","MESSAGES","ROLES","STATUS_PULE","TIPO_VISUALIZACAO","VISUALIZACAO","PREFIX_NUMBER","PREFIX_ENVIO_OLD","PREFIX_ENVIO","STATUS_DESCARGA","KEYBOARD","STATUS_DEVICE","PREMIOS","COMISSOES_PADRAO","GAMES","getCreatedBySystem","obj","utils_exports","__export","clone","combineDateTime","dateToNumber","delay","dividirArray","formatterBRL","formatterPercentage","formatterPercentageDecimal","generateId","getAllCombinations","getCodigoAuth","getDataInicioFim","getInitials","matchNormalized","normalize","numberToDate","numbersSelectedFormated","parserBRL","parserPercentage","parserPercentageDecimal","pegarHorarioSaoPaulo","removerLetters","showFormatDate","cloneDeep","clone","item","isValid","dateToNumber","date","year","month","day","hour","minute","second","parse","isValid","moment","pegarHorarioSaoPaulo","string","day","month","year","hour","minutes","seconds","milliseconds","numberToDate","number","str","year","month","day","hour","minute","second","dateString","dateNow","pegarHorarioSaoPaulo","date","parse","isValid","combineDateTime","dateA","dateB","dateAParts","numberToDate","dateBParts","year","month","day","hours","minutes","seconds","combinedDate","dateToNumber","setHours","setMinutes","setSeconds","getDataInicioFim","dataAposta","dataInicio","setSeconds","setMinutes","setHours","numberToDate","pegarHorarioSaoPaulo","dataFim","dateToNumber","formatterBRL","value","cloneValue","parserBRL","valueN","generatePermutations","arr","result","i","current","remaining","remainingPermutations","perm","getAllCombinations","num","numArr","permutations","uniqueCombinations","format","showFormatDate","number","formatString","date","numberToDate","numbersSelectedFormated","numbersString","numbers","a","b","result","start","end","i","generateId","prefix","s4","getCodigoAuth","min","max","dividirArray","arrayGrande","tamanho","resultado","i","subarray","delay","ms","resolve","normalize","str","matchNormalized","text","search","normalize","getInitials","nomeCompleto","nome","formatterPercentage","value","parserPercentage","value","newValue","formatterPercentageDecimal","value","parserPercentageDecimal","newValue","removerLetters","value","ExtracaoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","numbers_exports","__export","arredondarParaCima","calculaValoresDosNumeros","calcularValorDeNumero","formatarNumero","generateDescargas","gerarDezenas","getCreatedBySystem","getLimiteSimulado","getNumeroId","getNumerosAcimaDoLimite","getPremioFormato","getPropsEnvioId","getPropsEnvioIdOld","getPropsPrefix","getPropsVP","getSomaEnvio","getSomaProps","getSomaVP","getTiposJogos","sortNumeros","formatarNumero","numero","formato","resultado","indiceNumero","indiceFormato","generateDescarga","numero","id","descargaId","lastEnvioId","DescargaModel","getDescargaIdPeloNumero","numero","getByProperty","valorParaId","arredondarParaCima","generateDescargas","numeros","getByProperty","descargas","numero","descargaId","getDescargaIdPeloNumero","generateDescarga","gerarDezenas","bets","newNumbers","bet","TYPE_GAME","GAMES","number","nums","num","n","formatarNumero","uniqueCombinations","getSomaEnvio","numero","soma","key","value","array","getSomaVP","numero","soma","quantidadeDePulesMaiorQueZero","key","value","somaEnviadoParaAssociacao","getSomaEnvio","getNumeroId","props","dataAposta","jogo","numero","bancaId","premio","descarregado","TYPE_GAME","GAMES","numeroFormatado","formatarNumero","descarregadoFormatado","getTiposJogos","tipos","calcularValorDeNumero","quantidadeDeNumeros","tipoJogo","valorPremio","quantidadeDePremios","TYPE_GAME","GAMES","jogos","getTiposJogos","valorDoNumero","getPremioFormato","premio","PREMIOS","calculaValoresDosNumeros","game","numeros","date","pegarHorarioSaoPaulo","created","dateToNumber","bet","jogos","getTiposJogos","qtd_numeros","jogo","number","prize","premio","TYPE_GAME","GAMES","valorDoNumero","calcularValorDeNumero","premioFormato","getPremioFormato","numeroFormatado","formatarNumero","numberId","getNumeroId","NumberModel","CASAS_DECIMAIS","getNumerosAcimaDoLimite","numeros","valoresJogos","limitesJogos","numero","valorJogo","functionsCore","limiteJogo","v","limiteAtingido","amountArredondado","limiteAtingidoArredondado","diferenca","arredondarParaCima","valor","emCentavos","resto","sortNumeros","numeros","sortedDescargas","a","b","ORDER_GAME_A","GAMES","ORDER_GAME_B","item","getPropsEnvioId","numero","objeto","key","value","array","getPropsEnvioIdOld","numero","objeto","key","value","array","getPropsVP","numero","objeto","key","value","getPropsPrefix","numero","props","PREFIX_ENVIO","PREFIX_ENVIO_OLD","vps","clone","getPropsVP","envio_ids","getPropsEnvioId","envio_ids_old","getPropsEnvioIdOld","getSomaProps","objeto","soma","value","getLimiteJogoPeloTipoJogo","limitsGames","type_game","v","limite_jogos_exports","__export","calcularValorJogoPeloLimite","getLimiteJogoPeloTipoJogo","getValorJogoPeloTipoJogo","calcularValorJogoPeloLimite","limiteJogo","valorJogo","getValorJogoPeloTipoJogo","valuesGames","type_game","v","getLimiteSimulado","tipo_jogo","valores","limites","valorJogo","getValorJogoPeloTipoJogo","getLimiteJogoPeloTipoJogo","extracao_exports","__export","extracaoEstaAtivaBoolean","extracaoEstaAtivaTryCatch","getAvailableTimes","pegarExtracoes","format","getDay","games_exports","__export","calculateAmount","calculateAmountGame","fazerJogo","formatPuleId","getBetDateToNumber","getFormattedPuleId","getGamesUnicosList","getGamesUnicosObjeto","invertGame","calculateAmount","betValues","total","item","calculateAmountGame","games","total","bet","calculateAmount","setHours","setMinutes","setSeconds","getBetDateToNumber","date","extracaoDate","dateExtracao","numberToDate","newDateBet","setHours","setMinutes","setSeconds","dateToNumber","formatPuleId","n","getFormattedPuleId","id","parts","invertGame","game","newGame","clone","index","aposta","nums","result","num","n","getAllCombinations","fazerJogo","cart","profile","dateBet","extracao","puleId","game","GameModel","getBetDateToNumber","calculateAmountGame","gameWIthInvertedNumbers","invertGame","numeros","calculaValoresDosNumeros","getGamesUnicosList","GAMES","visu","getGamesUnicosObjeto","acc","item","getAvailableTimes","extracoes","dateBet","showAll","mobile","dateNow","data","getBetDateToNumber","extracoesAtivas","ext","DateBet","numberToDate","validTimes","extracoesFeriado","getDay","format","showFormatDate","extA","extB","format","getDay","pegarExtracoes","extracoes","dataAposta","dateToNumber","pegarHorarioSaoPaulo","dataAgora","retornar","pegar","getHorario","extracao","dataApostaNumerica","getBetDateToNumber","dataAgoraNumerica","dataApostaDate","numberToDate","extracoesAtivas","ext","extracoesDeFeriado","extracoesValidas","getDay","sortExtracoes","dataAgoraDate","horaAgora","format","showFormatDate","a","b","getDay","extracaoEstaAtivaTryCatch","dataAposta","extracao","dataApostaDate","numberToDate","getDay","diaDaSemana","extracaoEstaAtivaBoolean","dataAposta","extracao","extracaoEstaAtivaTryCatch","users_exports","__export","getLimitsRest","getPermission","isAdm","isAdmOrSubAdm","isAssociacao","isCambista","isCambistaTalao","isDigitador","isDigitadorAdm","isDigitadorOrDigitadorAdm","isSuperAdm","IS_ADM","IS_ADM_OR_SUBADM","IS_ASSOCIACAO","IS_SUPER_ADMIN","IS_CAMBISTA_TALAO","IS_CAMBISTA","IS_DIGITADOR_ADM","IS_DIGITADOR","IS_DIGITADOR_AND_ADM","isAdm","user","isAssociacao","isSuperAdm","isAdmOrSubAdm","isCambistaTalao","isCambista","isDigitadorAdm","isDigitador","isDigitadorOrDigitadorAdm","getPermission","getLimitsRest","user","hoje","pre","value","descarga_exports","__export","generateDescarga","generateDescargas","getDescargaIdPeloEnvio","getDescargaIdPeloNumero","getDescargasAcimaDoLimite","getPropsEnvioId","getPropsEnvioIdOldDescarga","getPropsVPDescarga","getTotalGeralDescarga","sortDescargas","sortDescargas","descargas","sortedDescargas","a","b","ORDER_GAME_A","GAMES","ORDER_GAME_B","item","CASAS_DECIMAIS","getDescargasAcimaDoLimite","descargas","valoresJogos","limitesJogos","descarga","valorJogo","functionsCore","limiteJogo","v","limiteAtingido","amountArredondado","limiteAtingidoArredondado","diferenca","getPropsVPDescarga","descarga","objeto","key","value","getPropsEnvioId","descarga","objeto","key","value","array","getPropsEnvioIdOldDescarga","descarga","objeto","key","value","array","getDescargaIdPeloEnvio","numero","envioId","envioKey","PREFIX_ENVIO_OLD","envioValue","somaArredondada","arredondarParaCima","getTotalGeralDescarga","totalBrutoJogos","comissoes","totalGeral","totalBrutoJogosArray","listaComissoes","comissaoRestante","comissao","type_game","totalBrutoJogo","valorJogo","comissaoEncontrada","comissaoPadrao","COMISSOES_PADRAO","functionsCore","numbers_exports","extracao_exports","descarga_exports","games_exports","users_exports","limite_jogos_exports","utils_exports","MessageModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","ResultadoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","RouteModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","UserModel","obj","type","GAMES","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","ValueGameModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","GameModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","getCodigoAuth","STATUS_PULE","NumberModel","obj","ordemPremioExibicao","PREMIOS","ordemJogoExibicao","GAMES","baseModel","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","propsPrefix","getPropsPrefix","PREFIX_ENVIO","PREFIX_ENVIO_OLD","BetModel","obj","PremiacaoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","PDFModel","obj","getCreatedBySystem","BancaModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","AuditLogModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","LimitGameModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","EnvioDescargaModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","STATUS_DESCARGA","DescargaModel","descarga","ordemPremioExibicao","PREMIOS","ordemJogoExibicao","GAMES","baseDescarga","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","propsPrefix","getPropsPrefix","PREFIX_ENVIO","PREFIX_ENVIO_OLD","DeviceModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","PremiacaoAssociacaoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","ComissaoDescargaModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","collections","MessageModel","UserModel","ValueGameModel","LimitGameModel","GameModel","ExtracaoModel","ResultadoModel","RouteModel","EnvioDescargaModel","NumberModel","DescargaModel","PremiacaoModel","PremiacaoAssociacaoModel","PDFModel","BancaModel","AuditLogModel","DeviceModel","ComissaoDescargaModel","MemoryCache","ttl","maxSize","key","item","data","firstKey","createGenericRepo","db","adapter","config","collectionName","model","idSearchStrategy","isolation","cache","authorization","generateId","memoryCache","checkAuthorization","operation","userRole","allowedRoles","getIsolationConstraints","value","buildQuery","options","constraints","field","operator","direction","collection","resolveDocument","id","query","snapshot","getCacheKey","params","isolationKey","cacheKey","cached","docSnap","docRef","result","error","callback","docData","completeData","modelData","docs","d","op","batch","docId","detectFirebaseVersion","firebaseInstance","createV9ModularAdapter","firebaseModular","path","segments","count","fieldValues","createV8Adapter","constraint","createWebAdapter","version","createAutoRepo","createReactNativeAdapter","createConfigs","getBancaId","cacheConfig","authorizationConfigs","withBancaIsolation","config","withoutIsolation","UserModel","BancaModel","ExtracaoModel","ResultadoModel","MessageModel","RouteModel","ValueGameModel","LimitGameModel","GameModel","NumberModel","DescargaModel","PremiacaoModel","PremiacaoAssociacaoModel","PDFModel","AuditLogModel","EnvioDescargaModel","DeviceModel","createRepoFactory","db","adapter","configs","createGenericRepo","createWebRepoFactory","createWebAdapter","createReactNativeRepoFactory","createReactNativeAdapter"]}
1
+ {"version":3,"sources":["../src/constants/EXTRACAO.ts","../src/constants/GAMES.ts","../src/constants/GRUPOS_BICHOS.ts","../src/constants/MESSAGES.ts","../src/constants/ROLES.ts","../src/constants/STATUS_PULE.ts","../src/constants/TIPO_VISUALIZACAO.ts","../src/constants/VISUALIZACAO.ts","../src/constants/PREFIX_NUMBER.ts","../src/constants/PREFIX_ENVIO_OLD.ts","../src/constants/PREFIX_ENVIO.ts","../src/constants/STATUS_DESCARGA.ts","../src/constants/KEYBOARD.ts","../src/constants/STATUS_DEVICE.ts","../src/constants/PREMIOS.ts","../src/constants/COMISSOES_PADRAO.ts","../src/functions/numbers/getCreatedBySystem.ts","../src/utils/index.ts","../src/utils/clone.ts","../src/utils/dateToNumber.ts","../src/utils/numberToDate.ts","../src/utils/pegarHorarioSaoPaulo.ts","../src/utils/combineDateTime.ts","../src/utils/getDataInicioFim.ts","../src/utils/formatBRL.ts","../src/utils/getAllCombinations.ts","../src/utils/showFormatDate.ts","../src/utils/numbersSelectedFormated.ts","../src/utils/generateId.ts","../src/utils/getCodigoAuth.ts","../src/utils/dividirArray.ts","../src/utils/delay.ts","../src/utils/normalize.ts","../src/utils/matchNormalized.ts","../src/utils/getInitials.ts","../src/utils/formatterPercentage.ts","../src/utils/parserPercentage.ts","../src/utils/formatterPercentageDecimal.ts","../src/utils/removerLetters.ts","../src/models/ExtracaoModel.ts","../src/functions/numbers/index.ts","../src/functions/numbers/formatarNumero.ts","../src/functions/descarga/generateDescarga.ts","../src/functions/descarga/getDescargaIdPeloNumero.ts","../src/functions/descarga/generateDescargas.ts","../src/functions/numbers/gerarDezenas.ts","../src/functions/numbers/getSomaEnvio.ts","../src/functions/numbers/getSomaVP.ts","../src/functions/numbers/getNumeroId.ts","../src/functions/numbers/getTiposJogos.ts","../src/functions/numbers/calcularValorDeNumero.ts","../src/functions/numbers/getPremioFormato.ts","../src/functions/numbers/calculaValoresDosNumeros.ts","../src/functions/numbers/getNumerosAcimaDoLimite.ts","../src/functions/numbers/arrendondarParaCima.ts","../src/functions/numbers/sortNumeros.ts","../src/functions/numbers/getPropsEnvioId.ts","../src/functions/numbers/getPropsEnvioIdOld.ts","../src/functions/numbers/getPropsVP.ts","../src/functions/numbers/getPropsPrefix.ts","../src/functions/numbers/getSomaProps.ts","../src/functions/limite_jogos/getLimiteJogoPeloTipoJogo.ts","../src/functions/limite_jogos/index.ts","../src/functions/limite_jogos/calcularValorJogoPeloLimite.ts","../src/functions/limite_jogos/getValorJogoPeloTipoJogo.ts","../src/functions/numbers/getLimiteSimulado.ts","../src/functions/extracao/index.ts","../src/functions/extracao/getAvailableTimes.ts","../src/functions/games/index.ts","../src/functions/games/calculateAmount.ts","../src/functions/games/calculateAmountGame.ts","../src/functions/games/getBetDateToNumber.ts","../src/functions/games/formatPuleId.ts","../src/functions/games/getFormattedPuleId.ts","../src/functions/games/invertGame.ts","../src/functions/games/fazerJogo.ts","../src/functions/games/getGamesUnicos.ts","../src/functions/extracao/pegarExtracoes.ts","../src/functions/extracao/extracaoEstaAtivaTryCatch.ts","../src/functions/extracao/extracaoEstaAtivaBoolean.ts","../src/functions/users/index.ts","../src/functions/users/permissions.ts","../src/functions/users/getLimitsRest.ts","../src/functions/descarga/index.ts","../src/functions/descarga/sortDescargas.ts","../src/functions/descarga/getDescargasAcimaDoLimite.ts","../src/functions/descarga/getPropsVPDescarga.ts","../src/functions/descarga/getPropsEnvioIdDescarga.ts","../src/functions/descarga/getPropsEnvioIdOldDescarga.ts","../src/functions/descarga/getDescargaIdPeloEnvio.ts","../src/functions/descarga/getTotalGeralDescarga.ts","../src/functions/index.ts","../src/models/MessageModel.ts","../src/models/ResultadoModel.ts","../src/models/RouteModel.ts","../src/models/UserModel.ts","../src/models/ValueGameModel.ts","../src/models/GameModel.ts","../src/models/NumberModel.ts","../src/models/BetModel.ts","../src/models/PremiacaoModel.ts","../src/models/PDFModel.ts","../src/models/BancaModel.ts","../src/models/AuditLogModel.ts","../src/models/LimitGameModel.ts","../src/models/EnvioDescargaModel.ts","../src/models/DescargaModel.ts","../src/models/DeviceModel.ts","../src/models/PremiacaoAssociacaoModel.ts","../src/models/ComissaoDescargaModel.ts","../src/repo/collections.ts","../src/repo/generic.ts","../src/repo/createRepoFactory.ts"],"sourcesContent":["export const EXTRACAO = [13, 16, 19] as const","// \"nome_jogo1-nome_jogo2\" -> 2 jogos\r\n// \"nome_jogo1-nome_jogo2\" -> 2 jogos\r\n\r\nexport const GAMES = {\r\n \"milhar\": {\r\n id: \"milhar\",\r\n label: \"Milhar\",\r\n sigla: \"M\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 1,\r\n showPerLine: 6,\r\n },\r\n \"centena\": {\r\n id: \"centena\",\r\n label: \"Centena\",\r\n sigla: \"C\",\r\n format: \"###\",\r\n formatDigitar: \"###\",\r\n markAll: false,\r\n max: 0,\r\n order: 2,\r\n showPerLine: 7,\r\n },\r\n \"dezena\": {\r\n id: \"dezena\",\r\n label: \"Dezena\",\r\n sigla: \"D\",\r\n format: \"##\",\r\n formatDigitar: \"##\",\r\n markAll: false,\r\n max: 0,\r\n order: 3,\r\n showPerLine: 0,\r\n },\r\n \"grupo\": {\r\n id: \"grupo\",\r\n label: \"Grupo\",\r\n sigla: \"G\",\r\n max: 25, // 0 a 25\r\n format: \"##\",\r\n formatDigitar: \"##\",\r\n markAll: false,\r\n order: 4,\r\n showPerLine: 0\r\n },\r\n \"terno.dezena\": {\r\n id: \"terno.dezena\",\r\n label: \"Terno de Dezena\",\r\n sigla: \"TD\",\r\n format: \"##-##-##\",\r\n formatDigitar: \"######\",\r\n markAll: true,\r\n max: 0,\r\n order: 5,\r\n showPerLine: 3,\r\n },\r\n \"terno.grupo\": {\r\n id: \"terno.grupo\",\r\n label: \"Terno de Grupo\",\r\n sigla: \"TG\",\r\n max: 25, // (0-25)-(0-25)-(0-25)\r\n format: \"##-##-##\",\r\n formatDigitar: \"######\",\r\n markAll: true,\r\n order: 6,\r\n showPerLine: 3\r\n },\r\n \"duque.dezena\": {\r\n id: \"duque.dezena\",\r\n label: \"Duque de Dezena\",\r\n sigla: \"DD\",\r\n format: \"##-##\",\r\n formatDigitar: \"####\",\r\n markAll: true,\r\n max: 0,\r\n order: 7,\r\n showPerLine: 5\r\n },\r\n \"duque.grupo\": {\r\n id: \"duque.grupo\",\r\n label: \"Duque de Grupo\",\r\n sigla: \"DG\",\r\n max: 25, // (0-25)-(0-25)\r\n format: \"##-##\",\r\n formatDigitar: \"####\",\r\n markAll: true,\r\n order: 8,\r\n showPerLine: 5\r\n },\r\n \"milhar.invertida\": {\r\n id: \"milhar.invertida\",\r\n label: \"Milhar Invertida\",\r\n sigla: \"MI\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"centena.invertida\": {\r\n id: \"centena.invertida\",\r\n label: \"Centena Invertida\",\r\n sigla: \"CI\",\r\n format: \"###\",\r\n formatDigitar: \"###\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 7\r\n },\r\n \"milhar@centena\": {\r\n id: \"milhar@centena\",\r\n label: \"Milhar Centena\",\r\n sigla: \"MC\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"milhar.invertida@centena.invertida\": {\r\n id: \"milhar.invertida@centena.invertida\",\r\n label: \"Milhar e Centena Invertidas\",\r\n sigla: \"MCI\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"milhar@dezena\": {\r\n id: \"milhar@dezena\",\r\n label: \"Milhar e Dezena\",\r\n sigla: \"MD\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"milhar@centena@dezena\": {\r\n id: \"milhar@centena@dezena\",\r\n label: \"Milhar, Centena e Dezena\",\r\n sigla: \"MCD\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"centena@dezena\": {\r\n id: \"centena@dezena\",\r\n label: \"Centena Dezena\",\r\n sigla: \"CD\",\r\n format: \"###\",\r\n formatDigitar: \"###\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 7\r\n },\r\n} as const;","const BICHOS = {\r\n '01': 'Avestruz',\r\n '02': 'Águia',\r\n '03': 'Burro',\r\n '04': 'Borboleta',\r\n '05': 'Cachorro',\r\n '06': 'Cabra',\r\n '07': 'Carneiro',\r\n '08': 'Camelo',\r\n '09': 'Cobra',\r\n '10': 'Coelho',\r\n '11': 'Cavalo',\r\n '12': 'Elefante',\r\n '13': 'Galo',\r\n '14': 'Gato',\r\n '15': 'Jacaré',\r\n '16': 'Leão',\r\n '17': 'Macaco',\r\n '18': 'Porco',\r\n '19': 'Pavão',\r\n '20': 'Peru',\r\n '21': 'Touro',\r\n '22': 'Tigre',\r\n '23': 'Urso',\r\n '24': 'Veado',\r\n '25': 'Vaca'\r\n} as const;\r\n\r\nexport const GRUPOS_BICHOS = {\r\n '01': { grupo: '01', bicho: BICHOS['01'] },\r\n '02': { grupo: '01', bicho: BICHOS['01'] },\r\n '03': { grupo: '01', bicho: BICHOS['01'] },\r\n '04': { grupo: '01', bicho: BICHOS['01'] },\r\n '05': { grupo: '02', bicho: BICHOS['02'] },\r\n '06': { grupo: '02', bicho: BICHOS['02'] },\r\n '07': { grupo: '02', bicho: BICHOS['02'] },\r\n '08': { grupo: '02', bicho: BICHOS['02'] },\r\n '09': { grupo: '03', bicho: BICHOS['03'] },\r\n '10': { grupo: '03', bicho: BICHOS['03'] },\r\n '11': { grupo: '03', bicho: BICHOS['03'] },\r\n '12': { grupo: '03', bicho: BICHOS['03'] },\r\n '13': { grupo: '04', bicho: BICHOS['04'] },\r\n '14': { grupo: '04', bicho: BICHOS['04'] },\r\n '15': { grupo: '04', bicho: BICHOS['04'] },\r\n '16': { grupo: '04', bicho: BICHOS['04'] },\r\n '17': { grupo: '05', bicho: BICHOS['05'] },\r\n '18': { grupo: '05', bicho: BICHOS['05'] },\r\n '19': { grupo: '05', bicho: BICHOS['05'] },\r\n '20': { grupo: '05', bicho: BICHOS['05'] },\r\n '21': { grupo: '06', bicho: BICHOS['06'] },\r\n '22': { grupo: '06', bicho: BICHOS['06'] },\r\n '23': { grupo: '06', bicho: BICHOS['06'] },\r\n '24': { grupo: '06', bicho: BICHOS['06'] },\r\n '25': { grupo: '07', bicho: BICHOS['07'] },\r\n '26': { grupo: '07', bicho: BICHOS['07'] },\r\n '27': { grupo: '07', bicho: BICHOS['07'] },\r\n '28': { grupo: '07', bicho: BICHOS['07'] },\r\n '29': { grupo: '08', bicho: BICHOS['08'] },\r\n '30': { grupo: '08', bicho: BICHOS['08'] },\r\n '31': { grupo: '08', bicho: BICHOS['08'] },\r\n '32': { grupo: '08', bicho: BICHOS['08'] },\r\n '33': { grupo: '09', bicho: BICHOS['09'] },\r\n '34': { grupo: '09', bicho: BICHOS['09'] },\r\n '35': { grupo: '09', bicho: BICHOS['09'] },\r\n '36': { grupo: '09', bicho: BICHOS['09'] },\r\n '37': { grupo: '10', bicho: BICHOS['10'] },\r\n '38': { grupo: '10', bicho: BICHOS['10'] },\r\n '39': { grupo: '10', bicho: BICHOS['10'] },\r\n '40': { grupo: '10', bicho: BICHOS['10'] },\r\n '41': { grupo: '11', bicho: BICHOS['11'] },\r\n '42': { grupo: '11', bicho: BICHOS['11'] },\r\n '43': { grupo: '11', bicho: BICHOS['11'] },\r\n '44': { grupo: '11', bicho: BICHOS['11'] },\r\n '45': { grupo: '12', bicho: BICHOS['12'] },\r\n '46': { grupo: '12', bicho: BICHOS['12'] },\r\n '47': { grupo: '12', bicho: BICHOS['12'] },\r\n '48': { grupo: '12', bicho: BICHOS['12'] },\r\n '49': { grupo: '13', bicho: BICHOS['13'] },\r\n '50': { grupo: '13', bicho: BICHOS['13'] },\r\n '51': { grupo: '13', bicho: BICHOS['13'] },\r\n '52': { grupo: '13', bicho: BICHOS['13'] },\r\n '53': { grupo: '14', bicho: BICHOS['14'] },\r\n '54': { grupo: '14', bicho: BICHOS['14'] },\r\n '55': { grupo: '14', bicho: BICHOS['14'] },\r\n '56': { grupo: '14', bicho: BICHOS['14'] },\r\n '57': { grupo: '15', bicho: BICHOS['15'] },\r\n '58': { grupo: '15', bicho: BICHOS['15'] },\r\n '59': { grupo: '15', bicho: BICHOS['15'] },\r\n '60': { grupo: '15', bicho: BICHOS['15'] },\r\n '61': { grupo: '16', bicho: BICHOS['16'] },\r\n '62': { grupo: '16', bicho: BICHOS['16'] },\r\n '63': { grupo: '16', bicho: BICHOS['16'] },\r\n '64': { grupo: '16', bicho: BICHOS['16'] },\r\n '65': { grupo: '17', bicho: BICHOS['17'] },\r\n '66': { grupo: '17', bicho: BICHOS['17'] },\r\n '67': { grupo: '17', bicho: BICHOS['17'] },\r\n '68': { grupo: '17', bicho: BICHOS['17'] },\r\n '69': { grupo: '18', bicho: BICHOS['18'] },\r\n '70': { grupo: '18', bicho: BICHOS['18'] },\r\n '71': { grupo: '18', bicho: BICHOS['18'] },\r\n '72': { grupo: '18', bicho: BICHOS['18'] },\r\n '73': { grupo: '19', bicho: BICHOS['19'] },\r\n '74': { grupo: '19', bicho: BICHOS['19'] },\r\n '75': { grupo: '19', bicho: BICHOS['19'] },\r\n '76': { grupo: '19', bicho: BICHOS['19'] },\r\n '77': { grupo: '20', bicho: BICHOS['20'] },\r\n '78': { grupo: '20', bicho: BICHOS['20'] },\r\n '79': { grupo: '20', bicho: BICHOS['20'] },\r\n '80': { grupo: '20', bicho: BICHOS['20'] },\r\n '81': { grupo: '21', bicho: BICHOS['21'] },\r\n '82': { grupo: '21', bicho: BICHOS['21'] },\r\n '83': { grupo: '21', bicho: BICHOS['21'] },\r\n '84': { grupo: '21', bicho: BICHOS['21'] },\r\n '85': { grupo: '22', bicho: BICHOS['22'] },\r\n '86': { grupo: '22', bicho: BICHOS['22'] },\r\n '87': { grupo: '22', bicho: BICHOS['22'] },\r\n '88': { grupo: '22', bicho: BICHOS['22'] },\r\n '89': { grupo: '23', bicho: BICHOS['23'] },\r\n '90': { grupo: '23', bicho: BICHOS['23'] },\r\n '91': { grupo: '23', bicho: BICHOS['23'] },\r\n '92': { grupo: '23', bicho: BICHOS['23'] },\r\n '93': { grupo: '24', bicho: BICHOS['24'] },\r\n '94': { grupo: '24', bicho: BICHOS['24'] },\r\n '95': { grupo: '24', bicho: BICHOS['24'] },\r\n '96': { grupo: '24', bicho: BICHOS['24'] },\r\n '97': { grupo: '25', bicho: BICHOS['25'] },\r\n '98': { grupo: '25', bicho: BICHOS['25'] },\r\n '99': { grupo: '25', bicho: BICHOS['25'] },\r\n '00': { grupo: '25', bicho: BICHOS['25'] }\r\n} as const;\r\n\r\n","export const MESSAGES = {\r\n required: \"Obrigatório.\",\r\n list_length_zero: \"Selecione pelo menos um item.\",\r\n incorrect_login: \"Usuário e/ou senha incorretos!\",\r\n incorrect_password: \"Senha incorreta.\",\r\n email_already_in_use: \"Este login já está sendo usado!\",\r\n invalid_device: \"Este login já está sendo usado em outro dispositivo!\",\r\n} as const;\r\n","export const ROLES = {\r\n \"super_admin\": {\r\n \"id\": \"super_admin\",\r\n \"label\": \"Super Administrador\",\r\n },\r\n \"associacao\": {\r\n \"id\": \"associacao\",\r\n \"label\": \"Associação\",\r\n },\r\n \"admin\": { // Banca\r\n \"id\": \"admin\",\r\n \"label\": \"Administrador\",\r\n },\r\n \"sub_admin\": { // Banca sub-admin\r\n \"id\": \"sub_admin\",\r\n \"label\": \"Sub-administrador\",\r\n },\r\n \"digitador_adm\": { // pertence à banca\r\n \"id\": \"digitador_adm\",\r\n \"label\": \"Digitador Administrador\",\r\n },\r\n \"digitador\": { // pertence à banca\r\n \"id\": \"digitador\",\r\n \"label\": \"Digitador\",\r\n },\r\n \"cambista_talao\": { // pertence à banca // que usa talão\r\n \"id\": \"cambista_talao\",\r\n \"label\": \"Cambista de talão\",\r\n },\r\n \"cambista\": { // pertence à banca // que usa maquininha\r\n \"id\": \"cambista\",\r\n \"label\": \"Cambista\",\r\n },\r\n} as const","export const STATUS_PULE = {\r\n PROCESSANDO: {\r\n id: \"PROCESSANDO\",\r\n label: \"PROCESSANDO\",\r\n color: \"green\",\r\n showSite: false,\r\n ordem: 0,\r\n },\r\n JOGADA: {\r\n id: \"JOGADA\",\r\n label: \"PULES JOGADAS\",\r\n color: \"green\",\r\n showSite: true,\r\n ordem: 1,\r\n },\r\n AGUARDANDO_CANCELAMENTO: {\r\n id: \"AGUARDANDO_CANCELAMENTO\",\r\n label: \"AGUARDANDO CANCELAMENTO\",\r\n color: \"yellow\",\r\n showSite: true,\r\n ordem: 3,\r\n },\r\n CANCELADA: {\r\n id: \"CANCELADA\",\r\n label: \"CANCELADAS\",\r\n color: \"red\",\r\n showSite: true,\r\n ordem: 4,\r\n },\r\n} as const;\r\n","export const TIPO_VISUALIZACAO = {\r\n \"notificacao\": {\r\n id: \"notificacao\",\r\n label: \"Notificação\"\r\n },\r\n \"impressao\": {\r\n id: \"impressao\",\r\n label: \"Impressão\"\r\n },\r\n} as const","export const VISUALIZACAO = {\r\n \"agora\": {\r\n id: \"agora\",\r\n label: \"Agora\"\r\n },\r\n \"jogo_hoje\": {\r\n id: \"jogo_hoje\",\r\n label: \"Jogo Hoje\"\r\n },\r\n \"jogo_pre_datado\": {\r\n id: \"jogo_pre_datado\",\r\n label: \"Jogo Pré-Datado\"\r\n },\r\n \"resultado\": {\r\n id: \"resultado\",\r\n label: \"Resultado\"\r\n }\r\n} as const","export const PREFIX_NUMBER = \"vp_\" as const;","export const PREFIX_ENVIO_OLD = \"envio_old_\" as const;","export const PREFIX_ENVIO = \"envio_\" as const;","export const STATUS_DESCARGA = {\r\n \"ENVIANDO\": {\r\n id: \"ENVIANDO\",\r\n labelBanca: \"ENVIANDO\",\r\n labelAssociacao: \"RECEBENDO\",\r\n color: \"blue\",\r\n showSiteBanca: true,\r\n showSiteAssociacao: false,\r\n order: 1\r\n },\r\n \"DEVOLVENDO\": {\r\n id: \"DEVOLVENDO\",\r\n labelBanca: \"RECEBENDO\",\r\n labelAssociacao: \"DEVOLVENDO\",\r\n color: \"blue\",\r\n showSiteBanca: false,\r\n showSiteAssociacao: false,\r\n order: 1\r\n },\r\n \"ENVIADA\": {\r\n id: \"ENVIADA\",\r\n labelBanca: \"ENVIADA\",\r\n labelAssociacao: \"RECEBIDA\",\r\n color: \"green\",\r\n showSiteBanca: true,\r\n showSiteAssociacao: true,\r\n order: 2\r\n },\r\n \"DEVOLVIDA\": {\r\n id: \"DEVOLVIDA\",\r\n labelBanca: \"DEVOLVIDA\",\r\n labelAssociacao: \"DEVOLVIDA\",\r\n color: \"orange\",\r\n showSiteBanca: true,\r\n showSiteAssociacao: true,\r\n order: 3\r\n },\r\n \"ERRO\": {\r\n id: \"ERRO\",\r\n labelBanca: \"ERRO\",\r\n labelAssociacao: \"ERRO\",\r\n color: \"red\",\r\n showSiteBanca: false,\r\n showSiteAssociacao: false,\r\n order: 4\r\n }\r\n} as const","export const KEYBOARD = {\r\n\r\n Enter: { label: \"Enter\", value: \"enter\" },\r\n Ctrl: { label: \"Ctrl\", value: \"ctrl\" },\r\n Tab: { label: \"Tab\", value: \"tab\" },\r\n Space: { label: \"\\u23b5\", value: \"space\" },\r\n Backspace: { label: \"Backspace\", value: \"backspace\" },\r\n Escape: { label: \"Esc\", value: \"escape\" },\r\n Delete: { label: \"Del\", value: \"delete\" },\r\n Backslash: { label: \"\\\\\", value: \"backslash\" },\r\n Semicolon: { label: \";\", value: \"semicolon\" },\r\n CapsLock: { label: \"CapsLock\", value: \"capslock\" },\r\n Quote: { label: \"'\", value: \"quote\" },\r\n Comma: { label: \",\", value: \"decimal,comma\" },\r\n\r\n Insert: { label: \"Insert\", value: \"insert\" },\r\n Home: { label: \"Home\", value: \"home\" },\r\n End: { label: \"End\", value: \"end\" },\r\n PageUp: { label: \"Page Up\", value: \"pageup\" },\r\n PageDown: { label: \"Page Down\", value: \"pagedown\" },\r\n\r\n ArrowUp: { label: \"↑\", value: \"arrowup\" },\r\n ArrowDown: { label: \"↓\", value: \"arrowdown\" },\r\n ArrowLeft: { label: \"←\", value: \"arrowleft\" },\r\n ArrowRight: { label: \"→\", value: \"arrowright\" },\r\n\r\n \r\n NumLock: { label: \"Num Lock\", value: \"numlock\" },\r\n /**\r\n * @description The decimal point key (typically . or\r\n * , depending on the region).\r\n * In newer browsers, this value to be the character generated by the\r\n * decimal key (one of those two characters). [1]\r\n */\r\n Dot: { label: \".\", value: \"period,comma\" },\r\n\r\n /** The numeric keypad's multiplication key, /. */\r\n Divide: { label: \"/\", value: \"slash,divide\" },\r\n\r\n /** @description The numeric keypad's addition key, -. */\r\n Subtract: { label: \"-\", value: \"minus,subtract\" },\r\n\r\n /** The numeric keypad's multiplication key, *. */\r\n Multiply: { label: '*', value: 'multiply,shift+8' },\r\n\r\n /** The numeric keypad's addition key, +. */\r\n Add: { label: \"+\", value: \"add,shift+equal\" },\r\n\r\n Equal: { id: \"Equal\", label: \"=\", value: \"equal\" },\r\n\r\n // -------\r\n // FNs\r\n\r\n F1: { label: \"F1\", value: \"f1\" },\r\n F2: { label: \"F2\", value: \"f2\" },\r\n F3: { label: \"F3\", value: \"f3\" },\r\n F4: { label: \"F4\", value: \"f4\" },\r\n F5: { label: \"F5\", value: \"f5\" },\r\n F6: { label: \"F6\", value: \"f6\" },\r\n F7: { label: \"F7\", value: \"f7\" },\r\n F8: { label: \"F8\", value: \"f8\" },\r\n F9: { label: \"F9\", value: \"f9\" },\r\n F10: { label: \"F10\", value: \"f10\" },\r\n F11: { label: \"F11\", value: \"f11\" },\r\n F12: { label: \"F12\", value: \"f12\" },\r\n\r\n // -------\r\n // numbers\r\n\r\n 0: { label: \"0\", value: \"0\" },\r\n 1: { label: \"1\", value: \"1\" },\r\n 2: { label: \"2\", value: \"2\" },\r\n 3: { label: \"3\", value: \"3\" },\r\n 4: { label: \"4\", value: \"4\" },\r\n 5: { label: \"5\", value: \"5\" },\r\n 6: { label: \"6\", value: \"6\" },\r\n 7: { label: \"7\", value: \"7\" },\r\n 8: { label: \"8\", value: \"8\" },\r\n 9: { label: \"9\", value: \"9\" },\r\n\r\n // -------\r\n // letters\r\n\r\n A: { label: \"A\", value: \"a\" },\r\n B: { label: \"B\", value: \"b\" },\r\n C: { label: \"C\", value: \"c\" },\r\n D: { label: \"D\", value: \"d\" },\r\n E: { label: \"E\", value: \"e\" },\r\n F: { label: \"F\", value: \"f\" },\r\n G: { label: \"G\", value: \"g\" },\r\n H: { label: \"H\", value: \"h\" },\r\n I: { label: \"I\", value: \"i\" },\r\n J: { label: \"J\", value: \"j\" },\r\n K: { label: \"K\", value: \"k\" },\r\n L: { label: \"L\", value: \"l\" },\r\n M: { label: \"M\", value: \"m\" },\r\n N: { label: \"N\", value: \"n\" },\r\n O: { label: \"O\", value: \"o\" },\r\n P: { label: \"P\", value: \"p\" },\r\n Q: { label: \"Q\", value: \"q\" },\r\n R: { label: \"R\", value: \"r\" },\r\n S: { label: \"S\", value: \"s\" },\r\n T: { label: \"T\", value: \"t\" },\r\n U: { label: \"U\", value: \"u\" },\r\n V: { label: \"V\", value: \"v\" },\r\n W: { label: \"W\", value: \"w\" },\r\n X: { label: \"X\", value: \"x\" },\r\n Y: { label: \"Y\", value: \"y\" },\r\n Z: { label: \"Z\", value: \"z\" },\r\n\r\n} as const;\r\n","export const STATUS_DEVICE = {\r\n \"EM_ESPERA\": {\r\n \"id\": \"EM_ESPERA\",\r\n \"label\": \"Esperando aprovação\",\r\n \"color\": \"orange\"\r\n },\r\n \"APROVADO\": {\r\n \"id\": \"APROVADO\",\r\n \"label\": \"Aprovado\",\r\n \"color\": \"green\"\r\n },\r\n \"BLOQUEADO\": {\r\n \"id\": \"BLOQUEADO\",\r\n \"label\": \"Bloqueado\",\r\n \"color\": \"red\"\r\n }\r\n} as const","export const PREMIOS = {\r\n \"1\": {\r\n id: \"1\",\r\n order: 1,\r\n label: \"1º Prêmio\",\r\n labelShort: \"1º\",\r\n },\r\n \"2\": {\r\n id: \"2\",\r\n order: 2,\r\n label: \"2º Prêmio\",\r\n labelShort: \"2º\",\r\n },\r\n \"3\": {\r\n id: \"3\",\r\n order: 3,\r\n label: \"3º Prêmio\",\r\n labelShort: \"3º\",\r\n },\r\n \"4\": {\r\n id: \"4\",\r\n order: 4,\r\n label: \"4º Prêmio\",\r\n labelShort: \"4º\",\r\n },\r\n \"5\": {\r\n id: \"5\",\r\n order: 5,\r\n label: \"5º Prêmio\",\r\n labelShort: \"5º\",\r\n },\r\n \"1-5\": {\r\n id: \"1-5\",\r\n order: 6,\r\n label: \"1º ao 5º Prêmio\",\r\n labelShort: \"1º ao 5º\",\r\n }\r\n} as const","import { GAMES } from \"./GAMES\";\r\n\r\nexport const COMISSOES_PADRAO = {\r\n [GAMES.milhar.id]: {\r\n id: GAMES.milhar.id,\r\n label: GAMES.milhar.label,\r\n order: 1,\r\n },\r\n [GAMES.centena.id]: {\r\n id: GAMES.centena.id,\r\n label: GAMES.centena.label,\r\n order: 2,\r\n },\r\n [GAMES.dezena.id]: {\r\n id: GAMES.dezena.id,\r\n label: GAMES.dezena.label,\r\n order: 3,\r\n },\r\n [GAMES.grupo.id]: {\r\n id: GAMES.grupo.id,\r\n label: GAMES.grupo.label,\r\n order: 4,\r\n },\r\n [GAMES[\"terno.dezena\"].id]: {\r\n id: GAMES[\"terno.dezena\"].id,\r\n label: GAMES[\"terno.dezena\"].label,\r\n order: 5,\r\n },\r\n [GAMES[\"terno.grupo\"].id]: {\r\n id: GAMES[\"terno.grupo\"].id,\r\n label: GAMES[\"terno.grupo\"].label,\r\n order: 6,\r\n },\r\n [GAMES[\"duque.dezena\"].id]: {\r\n id: GAMES[\"duque.dezena\"].id,\r\n label: GAMES[\"duque.dezena\"].label,\r\n order: 7,\r\n },\r\n [GAMES[\"duque.grupo\"].id]: {\r\n id: GAMES[\"duque.grupo\"].id,\r\n label: GAMES[\"duque.grupo\"].label,\r\n order: 8,\r\n },\r\n restante: {\r\n id: \"restante\",\r\n label: \"Restante\",\r\n order: 9,\r\n },\r\n} as const;\r\n","import { TypeMetaData } from \"../../types\";\r\n\r\n/**\r\n * @description\r\n * Gera um objeto `createdBy` com informações de criação, usando dados fornecidos ou,\r\n * caso estejam ausentes, valores padrão definidos pelo sistema.\r\n * \r\n * Essa função é útil para garantir que todos os campos de autoria estejam preenchidos\r\n * corretamente mesmo quando não houver um usuário autenticado no contexto.\r\n * \r\n * Campos padrão utilizados:\r\n * - `id`: \"system\"\r\n * - `role`: \"super_admin\"\r\n * - `name`: \"Gerado automaticamente pelo sistema\"\r\n * - `login`: \"system\"\r\n */\r\nexport const getCreatedBySystem = (\r\n obj?: Partial<TypeMetaData[\"createdBy\"]>\r\n): TypeMetaData[\"createdBy\"] => ({\r\n id: obj?.id || \"system\",\r\n id_integer: obj?.id_integer || \"system\",\r\n role: obj?.role || \"super_admin\",\r\n name: obj?.name || \"Gerado automaticamente pelo sistema\",\r\n login: obj?.login || \"system\",\r\n});\r\n","export { clone } from \"./clone\";\r\nexport { combineDateTime } from \"./combineDateTime\";\r\nexport { dateToNumber } from \"./dateToNumber\";\r\nexport { numberToDate } from \"./numberToDate\";\r\nexport { getDataInicioFim } from \"./getDataInicioFim\";\r\nexport { formatterBRL, parserBRL } from \"./formatBRL\";\r\nexport { getAllCombinations } from \"./getAllCombinations\";\r\nexport { showFormatDate } from \"./showFormatDate\";\r\nexport { numbersSelectedFormated } from \"./numbersSelectedFormated\";\r\nexport { generateId } from \"./generateId\";\r\nexport { getCodigoAuth } from \"./getCodigoAuth\";\r\nexport { pegarHorarioSaoPaulo } from \"./pegarHorarioSaoPaulo\";\r\nexport { dividirArray } from \"./dividirArray\";\r\nexport { delay } from \"./delay\";\r\nexport { matchNormalized } from \"./matchNormalized\";\r\nexport { normalize } from \"./normalize\";\r\nexport { getInitials } from \"./getInitials\";\r\nexport { formatterPercentage } from \"./formatterPercentage\";\r\nexport { parserPercentage } from \"./parserPercentage\";\r\nexport { formatterPercentageDecimal, parserPercentageDecimal } from \"./formatterPercentageDecimal\";\r\nexport { removerLetters } from \"./removerLetters\";","import cloneDeep from 'clone-deep'\r\n\r\n/**\r\n*\t@description Função que clona um objeto, array ou data\r\n*\t@param {T} item - item a ser clonado\r\n*\t@returns {T} item clonado\r\n*\t@example\r\n*\tclone([1, 3, 4]) // [1, 3, 4]\r\n*/\r\nexport const clone = <T>(item: T): T =>\r\n\tcloneDeep(item)\r\n","import { isValid } from \"date-fns\";\r\n\r\n/**\r\n * Converte um objeto `Date` para um número no formato `yyyyMMddHHmmss`.\r\n * Se a data for inválida ou não informada, retorna 0.\r\n *\r\n * @param {Date} [date] - Objeto `Date` a ser convertido.\r\n * @returns {number} Representação numérica da data no formato `yyyyMMddHHmmss`.\r\n */\r\nexport const dateToNumber = (date?: Date): number => {\r\n if (!date || !isValid(date)) return 0;\r\n\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hour = String(date.getHours()).padStart(2, '0');\r\n const minute = String(date.getMinutes()).padStart(2, '0');\r\n const second = String(date.getSeconds()).padStart(2, '0');\r\n\r\n return Number(`${year}${month}${day}${hour}${minute}${second}`);\r\n};\r\n","import { parse, isValid } from \"date-fns\";\r\nimport { pegarHorarioSaoPaulo } from \"./pegarHorarioSaoPaulo\";\r\n\r\n/**\r\n * Converte um número no formato `yyyyMMddHHmmss` para um objeto `Date`.\r\n * Se o número for inválido ou não informado, retorna a data atual.\r\n *\r\n * @param {number} [number] - Número representando a data no formato `yyyyMMddHHmmss`.\r\n * @returns {Date} Objeto `Date` correspondente ao número informado.\r\n */\r\nexport const numberToDate = (number?: number): Date | undefined => {\r\n if (!number) return undefined;\r\n\r\n const str = number.toString();\r\n\r\n const year = str.slice(0, 4);\r\n const month = str.slice(4, 6);\r\n const day = str.slice(6, 8);\r\n const hour = str.slice(8, 10);\r\n const minute = str.slice(10, 12);\r\n const second = str.slice(12, 14);\r\n\r\n const dateString = `${year}-${month}-${day} ${hour}:${minute}:${second}`;\r\n\r\n const dateNow = pegarHorarioSaoPaulo();\r\n\r\n const date = parse(dateString, \"yyyy-MM-dd HH:mm:ss\", dateNow);\r\n\r\n return isValid(date) ? date : undefined;\r\n};\r\n","import moment from \"moment-timezone\";\r\n\r\nexport const pegarHorarioSaoPaulo = (): Date => {\r\n \r\n const string = moment\r\n .tz(new Date(), \"America/Sao_Paulo\")\r\n .format(\"DD_MM_YYYY_HH_mm_ss_SSS\");\r\n\r\n const [day, month, year, hour, minutes, seconds, milliseconds] =\r\n string.split(\"_\");\r\n\r\n return new Date(\r\n Number(year),\r\n Number(month) - 1,\r\n Number(day),\r\n Number(hour),\r\n Number(minutes),\r\n Number(seconds),\r\n Number(milliseconds)\r\n );\r\n};\r\n","import { dateToNumber } from \"./dateToNumber\";\r\nimport { numberToDate } from \"./numberToDate\";\r\n\r\n/**\r\n * Combina a data (ano, mês, dia) de um timestamp (`dateA`)\r\n * com o horário (hora, minuto, segundo) de outro timestamp (`dateB`).\r\n * Ambos os timestamps devem estar no formato `yyyyMMddHHmmss`.\r\n *\r\n * @param {number} dateA - Número no formato `yyyyMMddHHmmss` contendo a data base (ano, mês e dia).\r\n * @param {number} dateB - Número no formato `yyyyMMddHHmmss` contendo o horário base (hora, minuto e segundo).\r\n * @returns {number} Um novo número no formato `yyyyMMddHHmmss` combinando a data de `dateA` com a hora de `dateB`.\r\n *\r\n * @example\r\n * // Combina 2023-12-25 com 14:30:00\r\n * const result = combineDateTime(20231225000000, 20230101143000);\r\n * 20231225143000\r\n */\r\nexport const combineDateTime = (dateA: number, dateB: number): number => {\r\n const dateAParts = numberToDate(dateA);\r\n const dateBParts = numberToDate(dateB);\r\n\r\n if (!dateAParts || !dateBParts) return 0;\r\n\r\n const year = dateAParts.getFullYear();\r\n const month = dateAParts.getMonth(); // zero-based\r\n const day = dateAParts.getDate();\r\n\r\n const hours = dateBParts.getHours();\r\n const minutes = dateBParts.getMinutes();\r\n const seconds = dateBParts.getSeconds();\r\n\r\n const combinedDate = new Date(year, month, day, hours, minutes, seconds, 0);\r\n\r\n return dateToNumber(combinedDate);\r\n};\r\n","import { setHours, setMinutes, setSeconds } from \"date-fns\";\r\nimport { numberToDate } from \"./numberToDate\";\r\nimport { dateToNumber } from \"./dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"./pegarHorarioSaoPaulo\";\r\n\r\n/**\r\n * A partir de uma data no formato numérico (`yyyyMMddHHmmss`),\r\n * retorna o início e fim do dia dessa data no mesmo formato numérico.\r\n *\r\n * @param {Object} params - Parâmetro contendo a data.\r\n * @param {number} params.dataAposta - Data no formato `yyyyMMddHHmmss`.\r\n * @returns {{ dataInicio: number, dataFim: number }} Datas de início (00:00:00) e fim (23:59:59) do dia.\r\n */\r\nexport const getDataInicioFim = ({ dataAposta }: { dataAposta: number }) => {\r\n const dataInicio = setSeconds(\r\n setMinutes(setHours(numberToDate(dataAposta) || pegarHorarioSaoPaulo(), 0), 0),\r\n 0\r\n );\r\n\r\n const dataFim = setSeconds(\r\n setMinutes(setHours(numberToDate(dataAposta) || pegarHorarioSaoPaulo(), 23), 59),\r\n 59\r\n );\r\n\r\n return {\r\n dataInicio: dateToNumber(dataInicio),\r\n dataFim: dateToNumber(dataFim),\r\n };\r\n};\r\n","export const formatterBRL = (value: number) => {\r\n\r\n\tconst cloneValue = value\r\n\r\n\tconst valueS = new Intl.NumberFormat('pt-BR', {\r\n\t\tstyle: 'currency',\r\n\t\tcurrency: 'BRL',\r\n\t}).format(cloneValue || 0)\r\n\treturn valueS\r\n}\r\n\r\nexport const parserBRL = (value: string) => {\r\n\r\n\tlet cloneValue = value\r\n\r\n\tcloneValue = cloneValue.replace(/\\D/g, '')\r\n\tlet valueN = parseFloat(cloneValue || '0')\r\n\tvalueN /= 100\r\n\treturn valueN\r\n}\r\n","/**\r\n * Função para gerar todas as permutações de um array, sem duplicações.\r\n * @param arr - O array de números ou caracteres.\r\n * @returns Um array com todas as permutações possíveis, sem duplicações.\r\n */\r\nconst generatePermutations = (arr: string[]): string[][] => {\r\n if (arr.length === 0) return [[]];\r\n\r\n const result: Set<string[]> = new Set();\r\n\r\n for (let i = 0; i < arr.length; i++) {\r\n const current = arr[i];\r\n const remaining = [...arr.slice(0, i), ...arr.slice(i + 1)];\r\n const remainingPermutations = generatePermutations(remaining);\r\n\r\n for (const perm of remainingPermutations) {\r\n result.add([current, ...perm]);\r\n }\r\n }\r\n\r\n return Array.from(result);\r\n};\r\n\r\n/**\r\n * Função para pegar um número e gerar todas as suas combinações únicas.\r\n * @param num - O número como string ou número.\r\n * @returns Um array de strings com todas as combinações possíveis, sem duplicações.\r\n */\r\nexport const getAllCombinations = (num: number | string): string[] => {\r\n const numArr = num.toString().split(\"\");\r\n const permutations = generatePermutations(numArr);\r\n\r\n // Usar um Set para garantir combinações únicas\r\n const uniqueCombinations = new Set(permutations.map((perm) => perm.join(\"\")));\r\n\r\n return Array.from(uniqueCombinations);\r\n};\r\n","import { numberToDate } from \"./numberToDate\";\r\nimport { format } from \"date-fns\";\r\n\r\nexport const showFormatDate = (number: number, formatString?: string) => {\r\n if (!number) return \"N/A\";\r\n\r\n const date = numberToDate(number);\r\n\r\n if (!date) return \"N/A\";\r\n\r\n return format(date, formatString || \"dd/MM/yyyy\");\r\n};\r\n","export const numbersSelectedFormated = (numbersString: number[]): string => {\r\n const numbers = numbersString.map(Number);\r\n if (numbers.length === 0) return \"\";\r\n // Ordena os números para garantir que estejam em ordem crescente\r\n numbers.sort((a, b) => a - b);\r\n let result = \"\";\r\n let start = numbers[0]; // Início do intervalo\r\n let end = start; // Fim do intervalo\r\n for (let i = 1; i <= numbers.length; i++) {\r\n if (i < numbers.length && numbers[i] === end + 1) {\r\n // Se o próximo número for consecutivo, expande o intervalo\r\n end = numbers[i];\r\n } else {\r\n // Se o próximo número não for consecutivo, finaliza o intervalo\r\n if (start === end) {\r\n // Se o intervalo tem um único número\r\n result += start;\r\n } else {\r\n // Se o intervalo tem mais de um número\r\n result += `${start} ao ${end}`;\r\n }\r\n if (i < numbers.length) {\r\n // Adiciona uma vírgula se não for o último intervalo\r\n result += \", \";\r\n // Inicia um novo intervalo\r\n start = numbers[i];\r\n end = start;\r\n }\r\n }\r\n }\r\n return result;\r\n };","/**\r\n * Generate a unique id\r\n * @returns {string} - A unique id\r\n * @example\r\n * generateUniqueId('user')\r\n * => user-19a2c5db-23eb-9b2b-c764-695249595f59\r\n * @example\r\n * generateUniqueId()\r\n * => 19a2c5db-23eb-9b2b-c764-695249595f59\r\n **/\r\n\r\nexport const generateId = (prefix?: string) => {\r\n\tconst s4 = () => Math.floor((1 + Math.random()) * 0x10000)\r\n\t\t.toString(16)\r\n\t\t.substring(1)\r\n\treturn `${prefix ? `${prefix}-` : ''}${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`\r\n}","/**\r\n * @description Gera um código de autenticação aleatório entre os valores mínimo e máximo fornecidos.\r\n * @example getCodigoAuth(100000, 999999) -> 435231\r\n*/\r\nexport const getCodigoAuth = (min: number, max: number) => {\r\n min = Math.ceil(min);\r\n max = Math.floor(max);\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n};\r\n","export const dividirArray = <T>(arrayGrande: T[], tamanho = 1000): T[][] => {\r\n const resultado: T[][] = [];\r\n\r\n // Percorre o array grande e divide em subarrays de tamanho especificado\r\n for (let i = 0; i < arrayGrande.length; i += tamanho) {\r\n const subarray = arrayGrande.slice(i, i + tamanho); // Cria um subarray de 500 elementos\r\n resultado.push(subarray); // Adiciona o subarray ao array de resultado\r\n }\r\n\r\n return resultado;\r\n};\r\n","/**\r\n * @description Retorna uma Promise que resolve após um determinado tempo (em milissegundos).\r\n *\r\n * Útil para simular atrasos ou criar efeitos assíncronos como \"sleep\".\r\n *\r\n * @param {number} ms - A quantidade de milissegundos para esperar.\r\n * @returns {Promise<void>} Uma Promise que resolve após o tempo especificado.\r\n *\r\n * @example\r\n * await delay(1000); // espera 1 segundo\r\n */\r\nexport const delay = (ms: number): Promise<void> => {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n};\r\n","/**\r\n * @description Normaliza uma string para facilitar comparações e buscas textuais.\r\n * A normalização remove:\r\n * - Espaços extras nas extremidades\r\n * - Diferenças entre maiúsculas e minúsculas\r\n * - Acentos e caracteres diacríticos (como ç, á, é, ñ etc.)\r\n *\r\n * @param {string} str - A string que será normalizada.\r\n * @returns {string} A string normalizada, em minúsculas e sem acentos.\r\n *\r\n * @example\r\n * normalize('Árvore') // 'arvore'\r\n * normalize(' Café ') // 'cafe'\r\n * normalize('JoÃO') // 'joao'\r\n */\r\nexport const normalize = (str: string): string =>\r\n str\r\n .trim()\r\n .toLowerCase()\r\n .normalize(\"NFD\")\r\n .replace(/[\\u0300-\\u036f]/g, \"\");\r\n","import { normalize } from \"./normalize\";\r\n\r\n/**\r\n * @description Verifica se o texto contém a palavra de busca,\r\n * desconsiderando acentuação, letras maiúsculas/minúsculas e caracteres especiais.\r\n *\r\n * @param {string} text - O texto base no qual a busca será realizada.\r\n * @param {string} search - A string de busca a ser procurada dentro do texto.\r\n * @returns {boolean} Retorna `true` se a string de busca for encontrada dentro do texto normalizado, senão `false`.\r\n *\r\n * @example\r\n * matchNormalized('Retropolis', 'retro'); // true\r\n * matchNormalized('Café com Leite', 'cafe'); // true\r\n * matchNormalized('Firewall', 'blinding'); // false\r\n */\r\nexport const matchNormalized = (text: string, search: string): boolean => {\r\n return normalize(text).includes(normalize(search));\r\n};\r\n","/**\r\n * Retorna as iniciais de um nome completo.\r\n * \r\n * A função extrai as primeiras letras maiúsculas dos dois primeiros nomes\r\n * válidos (com ao menos 2 caracteres) de uma string representando o nome completo.\r\n *\r\n * @param nomeCompleto - Uma string contendo o nome completo.\r\n * @returns As iniciais maiúsculas dos dois primeiros nomes válidos, ou uma string vazia se não houver nomes válidos.\r\n *\r\n * @example\r\n * getInitials(\"Maria Joaquina Silva\") // retorna \"MJ\"\r\n * getInitials(\"Jo\") // retorna \"J\"\r\n * getInitials(\"A B\") // retorna \"\" (nomes com menos de 2 letras são ignorados)\r\n */\r\nexport const getInitials = (nomeCompleto: string): string => {\r\n if (!nomeCompleto) return '';\r\n\r\n const nomesValidos = nomeCompleto\r\n .trim()\r\n .split(/\\s+/)\r\n .filter((nome) => nome.length >= 2);\r\n\r\n const iniciais = nomesValidos\r\n .slice(0, 2)\r\n .map((nome) => nome[0].toUpperCase());\r\n\r\n return iniciais.join('');\r\n};\r\n","/**\r\n * Formata um número decimal (entre 0 e 1) como porcentagem inteira.\r\n *\r\n * @param {number} value - Um valor decimal (ex: 0.25) que será convertido em porcentagem (25 %).\r\n * @returns {string} A string formatada como porcentagem com base no locale \"pt-BR\".\r\n *\r\n * @example\r\n * formatterPercentage(0.25); // \"25 %\"\r\n * formatterPercentage(1); // \"100 %\"\r\n */\r\nexport const formatterPercentage = (value: number): string => {\r\n value;\r\n\r\n const valueS = new Intl.NumberFormat(\"pt-BR\", {\r\n style: \"decimal\",\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: 0,\r\n }).format(value || 0);\r\n\r\n return `${valueS} %`;\r\n};","export const parserPercentage = (value: string, newValue?: string): number => {\r\n\tvalue = value.replace(/\\D/g, \"\");\r\n\tnewValue = newValue?.replace(/\\D/g, \"\");\r\n\r\n\tif (newValue) {\r\n\t\tif (Number(newValue) === Number(value))\r\n\t\t\tnewValue = newValue.slice(0, -1);\r\n\r\n\t\tlet newValueN = Number(Number(newValue || \"0\").toFixed(2));\r\n\t\treturn newValueN;\r\n\t}\r\n\r\n\tlet valueN = Number(Number(value || \"0\").toFixed(2));\r\n\treturn valueN;\r\n};\r\n","/**\r\n * Formata um número decimal (entre 0 e 1) como porcentagem inteira.\r\n *\r\n * @param {number} value - Um valor decimal (ex: 0.25) que será convertido em porcentagem (25 %).\r\n * @returns {string} A string formatada como porcentagem com base no locale \"pt-BR\".\r\n *\r\n * @example\r\n * formatterPercentage(0.25); // \"25 %\"\r\n * formatterPercentage(1); // \"100 %\"\r\n */\r\nexport const formatterPercentageDecimal = (value: number): string => {\r\n value *= 100;\r\n\r\n const valueS = new Intl.NumberFormat(\"pt-BR\", {\r\n style: \"decimal\",\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: 0,\r\n }).format(value || 0);\r\n\r\n return `${valueS} %`;\r\n};\r\n\r\n/**\r\n * Converte uma string de porcentagem digitada pelo usuário em um valor decimal (0–1).\r\n * \r\n * - Remove todos os caracteres não numéricos (mantém apenas dígitos).\r\n * - Caso `newValue` seja passado, ele é usado como base para lidar com digitação interativa,\r\n * permitindo apagar o último dígito corretamente.\r\n * - O resultado final sempre será um número decimal entre `0` e `1`.\r\n *\r\n * @param {string} value - String contendo dígitos de porcentagem (ex: \"25\", \"25 %\", \"100%\").\r\n * @param {string} [newValue] - Novo valor bruto digitado (opcional, usado para edição em tempo real).\r\n * @returns {number} Valor decimal correspondente (ex: \"25\" → 0.25, \"100\" → 1).\r\n *\r\n * @example\r\n * parserPercentage(\"25\"); // 0.25\r\n * parserPercentage(\"100%\"); // 1\r\n * parserPercentage(\"25\", \"2\"); // 0.02 (simula digitação interativa)\r\n */\r\nexport const parserPercentageDecimal = (value: string, newValue?: string): number => {\r\n value = value.replace(/\\D/g, \"\");\r\n newValue = newValue?.replace(/\\D/g, \"\");\r\n\r\n if (newValue) {\r\n if (Number(newValue) === Number(value))\r\n newValue = newValue.slice(0, -1);\r\n\r\n let newValueN = Number(Number(newValue || \"0\").toFixed(2)) / 100;\r\n return newValueN;\r\n }\r\n\r\n let valueN = Number(Number(value || \"0\").toFixed(2)) / 100;\r\n return valueN;\r\n};\r\n","/**\r\n * Remove todos os caracteres não numéricos de uma string\r\n * \r\n * Esta função usa uma expressão regular para filtrar qualquer caractere que não seja dígito (0-9),\r\n * mantendo apenas os caracteres numéricos na string.\r\n * \r\n * @param value - A string de entrada que pode conter letras, números e caracteres especiais\r\n * @returns Uma nova string contendo apenas os caracteres numéricos da entrada\r\n * \r\n * @example\r\n * ```typescript\r\n * removerLetters(\"abc123def456\") // retorna \"123456\"\r\n * removerLetters(\"telefone: (11) 99999-9999\") // retorna \"11999999999\"\r\n * removerLetters(\"sem números aqui\") // retorna \"\"\r\n * removerLetters(\"123\") // retorna \"123\"\r\n * ```\r\n */\r\nexport const removerLetters = (value: string): string => {\r\n\treturn value.replace(/[^0-9]/g, \"\");\r\n};","import { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\nimport { TypeExtracao } from \"../types/extracao.type\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\n\r\nexport const ExtracaoModel = (obj?: Partial<TypeExtracao>): TypeExtracao => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n horario: obj?.horario || 0,\r\n bloqueio: obj?.bloqueio || 0,\r\n bancaId: obj?.bancaId || \"\",\r\n ativo: obj?.ativo ?? true,\r\n inativo_no_dia: obj?.inativo_no_dia || [],\r\n description: obj?.description || \"\",\r\n somente_no_feriado: obj?.somente_no_feriado || 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n days: {\r\n 0: obj?.days?.[0] ?? false, // domingo\r\n 1: obj?.days?.[1] ?? false,\r\n 2: obj?.days?.[2] ?? false,\r\n 3: obj?.days?.[3] ?? false,\r\n 4: obj?.days?.[4] ?? false,\r\n 5: obj?.days?.[5] ?? false,\r\n 6: obj?.days?.[6] ?? false, // sabado\r\n },\r\n});\r\n","export { formatarNumero } from './formatarNumero';\r\nexport { generateDescargas } from '../descarga/generateDescargas';\r\nexport { gerarDezenas } from './gerarDezenas';\r\nexport { getSomaEnvio } from './getSomaEnvio';\r\nexport { getSomaVP } from './getSomaVP';\r\nexport { getCreatedBySystem } from './getCreatedBySystem';\r\nexport { getNumeroId } from './getNumeroId';\r\nexport { calculaValoresDosNumeros } from './calculaValoresDosNumeros';\r\nexport { getNumerosAcimaDoLimite } from './getNumerosAcimaDoLimite';\r\nexport { arredondarParaCima } from './arrendondarParaCima';\r\nexport { sortNumeros } from './sortNumeros';\r\nexport { getPropsPrefix } from './getPropsPrefix';\r\nexport { getPropsEnvioId } from './getPropsEnvioId';\r\nexport { getPropsEnvioIdOld } from './getPropsEnvioIdOld';\r\nexport { getPropsVP } from './getPropsVP';\r\nexport { getTiposJogos } from './getTiposJogos';\r\nexport { calcularValorDeNumero } from './calcularValorDeNumero';\r\nexport { getPremioFormato } from './getPremioFormato';\r\nexport { getSomaProps } from \"./getSomaProps\"\r\nexport { getLimiteSimulado } from './getLimiteSimulado';\r\n","// Função que formata automaticamente a partir de um padrão\r\n\r\n/**\r\n * @description Esta função formata o numero para o formato de jogo passado\r\n * \r\n * @example formatarNumero(\"1234\", \"###\") // \"234\"\r\n * @example formatarNumero(\"1234\", \"##-##\") // \"12-34\"\r\n * @example formatarNumero(\"123456\", \"##-##-##\") // \"12-34-56\"\r\n*/\r\nexport const formatarNumero = (numero: string, formato: string) => {\r\n let resultado = '';\r\n let indiceNumero = numero.length - 1; // Começa do final do número\r\n let indiceFormato = formato.length - 1; // Começa do final do formato\r\n\r\n // Percorre o formato de trás para frente e substitui os dígitos conforme o padrão\r\n while (indiceFormato >= 0) {\r\n if (formato[indiceFormato] === '#') {\r\n resultado = numero[indiceNumero] + resultado; // Adiciona dígito do número\r\n indiceNumero--;\r\n } else if (formato[indiceFormato] === '-') {\r\n resultado = '-' + resultado; // Adiciona hífen no resultado\r\n }\r\n indiceFormato--; // Anda para o próximo caractere do formato\r\n }\r\n\r\n return resultado;\r\n \r\n};","import { DescargaModel } from \"../../models\";\r\nimport { TypeNumero } from \"../../types\";\r\nimport { TypeDescarga } from \"../../types/descarga.type\";\r\n\r\n/**\r\n * Gera uma descarga a partir de um número de aposta\r\n *\r\n * Esta função cria uma nova descarga (representação de uma aposta) baseada em um número específico.\r\n * Ela copia todas as propriedades do número para a descarga e adiciona propriedades adicionais\r\n * baseadas em prefixos específicos para diferentes tipos de dados.\r\n *\r\n * @param numero - O número de aposta que será usado para gerar a descarga\r\n * @param id - ID único da descarga que será usado\r\n * @returns Uma descarga completa com todas as propriedades necessárias\r\n *\r\n * @example\r\n * ```typescript\r\n * const numero = { numero: \"1234\", tipo_jogo: \"mega\", amount: 100, ... };\r\n * const descargaId = \"banca1_20240627140000_milhar_1_15\";\r\n * const descarga = generateDescarga(numero, descargaId);\r\n * ```\r\n */\r\nexport const generateDescarga = (\r\n numero: TypeNumero,\r\n id: string\r\n): TypeDescarga => {\r\n // Usa o ID fornecido como parâmetro para a descarga\r\n const descargaId = id;\r\n\r\n const lastEnvioId =\r\n numero?.envioIds?.length > 0\r\n ? numero.envioIds[numero.envioIds.length - 1]\r\n : \"\";\r\n\r\n // Cria uma nova instância de descarga usando o modelo, copiando todas as propriedades do número\r\n const descarga = DescargaModel({\r\n ...numero,\r\n id: descargaId, // ID único da descarga\r\n premio: numero.premio, // Valor do prêmio\r\n amount: numero.amount,\r\n numeros: [numero.numero], // Valor total da aposta\r\n amountEnviadoParaAssociacao: numero.amountEnviadoParaAssociacao, // Valor enviado para a banca\r\n valorAEnviarParaAssociacao: numero.valorAEnviarParaAssociacao, // Valor enviado para a banca\r\n envioId: lastEnvioId, // IDs dos envios relacionados\r\n dataAposta: numero.dataAposta, // Data em que a aposta foi feita\r\n bancaId: numero.bancaId, // ID da banca responsável\r\n valorArredondado: numero.valorArredondado, // Valor arredondado da aposta\r\n limiteJogoReal: numero.limiteJogoReal, // Limite para jogos reais\r\n limiteJogoSimulado: numero.limiteJogoSimulado, // Limite para jogos simulados\r\n valorJogo: numero.valorJogo, // Valor específico do jogo\r\n });\r\n\r\n // Retorna a descarga completa com todas as propriedades\r\n return descarga;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\nimport { arredondarParaCima } from \"../numbers\";\r\n\r\n/**\r\n * Gera um ID de descarga único baseado nas propriedades do número fornecido\r\n * \r\n * Esta função cria um identificador único para uma descarga combinando várias propriedades\r\n * do número de aposta. O ID é formado pela concatenação de: bancaId (opcional), dataAposta,\r\n * tipo_jogo, premio e o amount arredondado (valor total da aposta).\r\n * \r\n * IMPORTANTE: Usa o 'amount' (valor total) em vez da soma dos VPs para garantir que\r\n * números com o mesmo valor total sejam agrupados na mesma descarga, evitando\r\n * descargas duplicadas quando apostas são feitas rapidamente.\r\n * \r\n * @param numero - O número de aposta que será usado para gerar o ID\r\n * @param getByProperty - Propriedade opcional para usar um valor específico em vez do amount padrão\r\n * @returns Uma string única identificando a descarga\r\n * \r\n * @example\r\n * ```ts\r\n * const numero = {\r\n * bancaId: 'banca1',\r\n * dataAposta: '20240627140000',\r\n * tipo_jogo: 'milhar',\r\n * premio: \"1\",\r\n * amount: 30\r\n * };\r\n * const descargaId = getDescargaIdPeloNumero(numero);\r\n * // Resultado: \"banca1_20240627140000_milhar_1_30\"\r\n * ```\r\n */\r\nexport const getDescargaIdPeloNumero = (\r\n numero: TypeNumero,\r\n getByProperty?: string\r\n) => {\r\n // Usa o amount (valor total da aposta) em vez da soma dos VPs para gerar o ID\r\n const valorParaId = getByProperty \r\n ? arredondarParaCima(Number(numero[getByProperty as keyof TypeNumero])) \r\n : arredondarParaCima(numero.amount);\r\n\r\n const descargaId =\r\n `${numero?.bancaId ? `${numero?.bancaId}_` : \"\"}` +\r\n `${numero.dataAposta}_${numero.tipo_jogo}_${numero.premio}_${valorParaId}`;\r\n\r\n return descargaId;\r\n};\r\n","import { TypeNumeros } from \"../../types\";\r\nimport { TypeDescargas } from \"../../types/descarga.type\";\r\nimport { generateDescarga } from \"./generateDescarga\";\r\nimport { getDescargaIdPeloNumero } from \"./getDescargaIdPeloNumero\";\r\n\r\n/**\r\n * Gera múltiplas descargas a partir de uma coleção de números de apostas\r\n * \r\n * Esta função agrupa números de apostas em descargas baseado em um ID único gerado\r\n * pelas propriedades de cada número. Números com o mesmo ID são agrupados na mesma\r\n * descarga, consolidando seus valores e arrays de números/envios.\r\n * \r\n * @param numeros - Coleção de números de apostas a serem processados\r\n * @param getByProperty - Propriedade opcional para usar no cálculo do ID da descarga\r\n * @returns Objeto com descargas agrupadas por ID único\r\n * \r\n * @example\r\n * ```typescript\r\n * const numeros = { \"1\": numero1, \"2\": numero2, ... };\r\n * const descargas = generateDescargas(numeros);\r\n * // Resultado: { \"descargaId1\": descarga1, \"descargaId2\": descarga2, ... }\r\n * ```\r\n */\r\nexport const generateDescargas = (\r\n numeros: TypeNumeros,\r\n getByProperty?: string\r\n): TypeDescargas => {\r\n const descargas: TypeDescargas = {};\r\n\r\n Object.entries(numeros).forEach(([, numero]) => {\r\n const descargaId = getDescargaIdPeloNumero(numero, getByProperty);\r\n\r\n if (!descargas[descargaId]) {\r\n // Se não existe, cria uma nova descarga usando o primeiro número como base e passa o ID gerado\r\n descargas[descargaId] = generateDescarga(numero, descargaId);\r\n } else {\r\n descargas[descargaId].numeros.push(numero.numero);\r\n }\r\n });\r\n\r\n return descargas;\r\n};\r\n","import { GAMES } from '../../constants/GAMES';\r\nimport { TypeBet } from '../../types/bet.type';\r\nimport { formatarNumero } from './formatarNumero';\r\n\r\n/**\r\n * @description Gera as dezenas a partir das apostas\r\n *\r\n * @example gerarDezenas( [ { name: \"milhar\", numbers: [\"1234\", \"5678\"] } ] ) \r\n * -> [\"34\", \"78\"]\r\n * @example gerarDezenas( [ { name: \"milhar\", numbers: [\"12-34\", \"56-78\"] } ] )\r\n * -> [\"12\", \"34\",\"56\", \"78\"]\r\n */\r\nexport const gerarDezenas = (bets: TypeBet[]): string[] => {\r\n const newNumbers: string[] = [];\r\n bets.forEach((bet) => {\r\n const TYPE_GAME = GAMES[bet.name];\r\n bet.numbers.forEach((number) => {\r\n if (TYPE_GAME.id === 'dezena') {\r\n const nums = number.split('-');\r\n for (const num of nums) {\r\n if (num.length < TYPE_GAME.format.length) continue;\r\n const n = formatarNumero(num, TYPE_GAME.format);\r\n newNumbers.push(n);\r\n }\r\n return;\r\n }\r\n const num = number.replaceAll('-', '');\r\n if (num.length < TYPE_GAME.format.replaceAll('-', '').length) return;\r\n const n = formatarNumero(num, TYPE_GAME.format);\r\n newNumbers.push(n);\r\n });\r\n });\r\n\r\n const uniqueCombinations = new Set(newNumbers);\r\n\r\n const nums = Array.from(uniqueCombinations);\r\n\r\n return nums;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\n\r\n/**\r\n * @description Retorna a soma dos todos os valores do\r\n * número enviado em cada envio\r\n *\r\n * @example getSomaVP({ envio_23: 10, envio_24: 5 }) -> 15\r\n */\r\nexport const getSomaEnvio = (numero: TypeNumero): number => {\r\n let soma = 0;\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n !array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n soma += value;\r\n }\r\n });\r\n\r\n return soma;\r\n};\r\n","import { PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeNumero } from \"../../types\";\r\nimport { getSomaEnvio } from \"./getSomaEnvio\";\r\n\r\n/**\r\n * @description Retorna a soma dos todos os valores de pule\r\n * e a quantidade de pules que possuem valor maior que 0\r\n *\r\n * @example getSomaVP({ vp_15-0023: 10, vp_15-0024: 0 }) -> { soma: 10, quantidadeDePules: 1 }\r\n * @example getSomaVP({ vp_15-0023: 10, vp_15-0024: 5 }) -> { soma: 15, quantidadeDePules: 2 }\r\n */\r\nexport const getSomaVP = (\r\n numero: TypeNumero\r\n): {\r\n soma: number;\r\n quantidadeDePulesMaiorQueZero: number;\r\n somaEnviadoParaAssociacao: number;\r\n} => {\r\n let soma = 0;\r\n let quantidadeDePulesMaiorQueZero = 0;\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n \r\n if (key.startsWith(PREFIX_NUMBER) && typeof value === \"number\") {\r\n soma += value;\r\n if (value > 0) {\r\n quantidadeDePulesMaiorQueZero += 1;\r\n }\r\n }\r\n \r\n });\r\n\r\n const somaEnviadoParaAssociacao = getSomaEnvio(numero)\r\n\r\n soma -= somaEnviadoParaAssociacao;\r\n\r\n return { soma, quantidadeDePulesMaiorQueZero, somaEnviadoParaAssociacao };\r\n};\r\n","import { GAMES } from \"../../constants\";\r\nimport { formatarNumero } from \"./formatarNumero\";\r\n\r\nexport const getNumeroId = (props: {\r\n dataAposta: number;\r\n jogo: keyof typeof GAMES;\r\n premio: string;\r\n numero: string;\r\n bancaId: string;\r\n descarregado?: boolean;\r\n}) => {\r\n const { dataAposta, jogo, numero, bancaId, premio, descarregado } = props;\r\n\r\n const TYPE_GAME = GAMES[jogo];\r\n\r\n const numeroFormatado = TYPE_GAME.markAll\r\n ? numero\r\n : formatarNumero(numero, TYPE_GAME.format);\r\n\r\n let descarregadoFormatado = descarregado ? \"true\" : \"false\";\r\n\r\n const numberId =\r\n (bancaId ? `${bancaId}_` : \"\") +\r\n `${dataAposta}_${jogo}_${premio}_${numeroFormatado}_${descarregadoFormatado}`;\r\n\r\n return numberId;\r\n};\r\n","import { GAMES } from \"../../constants\";\r\n\r\nexport const getTiposJogos = (tipos: string) => {\r\n const jogos = tipos.replaceAll(\".invertida\", \"\").split(\"@\");\r\n return jogos as (keyof typeof GAMES)[];\r\n};","// calcularValorDeNumero.ts\r\n\r\nimport { GAMES } from \"../../constants\";\r\nimport { getTiposJogos } from \"./getTiposJogos\";\r\n\r\n/**\r\n * Calcula o valor atribuído a cada número apostado, com base nos parâmetros do jogo.\r\n *\r\n * O cálculo segue três etapas:\r\n * 1. Divide o prêmio total (`valorPremio`) pelo número de tipos de jogos (determinado por `getTiposJogos`).\r\n * 2. Divide o resultado pela quantidade de números apostados (`quantidadeDeNumeros`).\r\n * 3. Se `markAll` for falso, divide ainda pela quantidade de prêmios (`quantidadeDePremios`).\r\n *\r\n * @param {Object} options — Parâmetros de entrada.\r\n * @param {number} options.quantidadeDeNumeros — Quantidade de números apostados.\r\n * @param {keyof typeof GAMES} options.tipoJogo — Tipo de jogo conforme chave de `GAMES`.\r\n * @param {number} options.valorPremio — Valor total do prêmio a ser distribuído.\r\n * @param {number} options.quantidadeDePremios — Quantidade de prêmios, se aplicável (usa 1 como fallback se zero).\r\n * @returns {number} — Valor calculado por número apostado.\r\n */\r\nexport const calcularValorDeNumero = ({\r\n quantidadeDeNumeros,\r\n tipoJogo,\r\n valorPremio,\r\n quantidadeDePremios,\r\n}: {\r\n quantidadeDeNumeros: number;\r\n tipoJogo: keyof typeof GAMES;\r\n valorPremio: number;\r\n quantidadeDePremios: number;\r\n}): number => {\r\n const TYPE_GAME = GAMES[tipoJogo];\r\n\r\n const jogos = getTiposJogos(tipoJogo);\r\n\r\n //* 1. Divide o prêmio total (`valorPremio`) pelo número de tipos de jogos (determinado por `getTiposJogos`).\r\n let valorDoNumero = valorPremio / (jogos.length || 1);\r\n\r\n //* 2. Divide o resultado pela quantidade de números apostados (`quantidadeDeNumeros`).\r\n valorDoNumero /= quantidadeDeNumeros;\r\n\r\n //* 3. Se `markAll` for falso, divide ainda pela quantidade de prêmios (`quantidadeDePremios`).\r\n if (!TYPE_GAME.markAll) {\r\n valorDoNumero /= (quantidadeDePremios || 1);\r\n }\r\n\r\n if(quantidadeDePremios === 0) valorDoNumero = 0\r\n\r\n return valorDoNumero;\r\n};\r\n","import { PREMIOS } from \"../../constants\";\r\n\r\n/**\r\n * @description Retorna o formato do prêmio\r\n * @param premio - Prêmio a ser formatado\r\n * @returns Formato do prêmio\r\n * @example getPremioFormato(1) // \"1\"\r\n * @example getPremioFormato(2) // \"2\"\r\n * @example getPremioFormato(3) // \"3\"\r\n * @example getPremioFormato(4) // \"4\"\r\n * @example getPremioFormato(5) // \"5\"\r\n */\r\nexport const getPremioFormato = (premio: number) => {\r\n if (premio === 1) return PREMIOS[\"1\"].id;\r\n if (premio === 2) return PREMIOS[\"2\"].id;\r\n if (premio === 3) return PREMIOS[\"3\"].id;\r\n if (premio === 4) return PREMIOS[\"4\"].id;\r\n if (premio === 5) return PREMIOS[\"5\"].id;\r\n return PREMIOS[\"1-5\"].id;\r\n};\r\n","import { formatarNumero } from \"./formatarNumero\";\r\nimport { pegarHorarioSaoPaulo } from \"../../utils/pegarHorarioSaoPaulo\";\r\nimport { TypeGame, TypeNumeros } from \"../../types\";\r\nimport { GAMES, PREFIX_NUMBER } from \"../../constants\";\r\nimport { dateToNumber } from \"../../utils\";\r\nimport { NumberModel } from \"../../models\";\r\nimport { getNumeroId } from \"./getNumeroId\";\r\nimport { getTiposJogos } from \"./getTiposJogos\";\r\nimport { calcularValorDeNumero } from \"./calcularValorDeNumero\";\r\nimport { getPremioFormato } from \"./getPremioFormato\";\r\n\r\nexport const calculaValoresDosNumeros = (game: TypeGame) => {\r\n const numeros: TypeNumeros = {};\r\n\r\n const date = pegarHorarioSaoPaulo();\r\n\r\n const created = dateToNumber(date);\r\n\r\n for (const bet of game.bets) {\r\n const jogos = getTiposJogos(bet.name);\r\n\r\n const qtd_numeros = bet.numbers.length;\r\n\r\n for (const jogo of jogos) {\r\n for (const number of bet.numbers) {\r\n for (const prize of bet.prizes) {\r\n for (const premio of prize.prizes) {\r\n const TYPE_GAME = GAMES[jogo];\r\n\r\n // Cálculo do valor do número\r\n const valorDoNumero = calcularValorDeNumero({\r\n valorPremio: prize.value,\r\n tipoJogo: bet.name,\r\n quantidadeDeNumeros: qtd_numeros,\r\n quantidadeDePremios: prize.prizes.length,\r\n });\r\n\r\n let premioFormato = getPremioFormato(premio);\r\n let numeroFormatado = number;\r\n\r\n if (TYPE_GAME.markAll) {\r\n premioFormato = \"1-5\";\r\n } else {\r\n numeroFormatado = formatarNumero(number, TYPE_GAME.format);\r\n }\r\n\r\n // Criando a ID única e o objeto TypeNumero\r\n const numberId = getNumeroId({\r\n numero: number,\r\n bancaId: game.bancaId,\r\n dataAposta: game.dateBet,\r\n jogo: jogo,\r\n premio: premioFormato,\r\n });\r\n\r\n if (!numeros?.[numberId]) {\r\n numeros[numberId] = NumberModel({\r\n id: numberId,\r\n numero: numeroFormatado,\r\n premio: premioFormato,\r\n created: created,\r\n bancaId: game.bancaId,\r\n amount: 0,\r\n dataAposta: game.dateBet,\r\n tipo_jogo: jogo,\r\n [`${PREFIX_NUMBER}${game.id}` as any]: 0,\r\n });\r\n }\r\n\r\n //* Se o jogo for markAll, adicionar o valor e não soma;\r\n if (TYPE_GAME.markAll) {\r\n numeros[numberId][`${PREFIX_NUMBER}${game.id}`] = Number(valorDoNumero.toFixed(3));\r\n } else {\r\n numeros[numberId][`${PREFIX_NUMBER}${game.id}`] += Number(valorDoNumero.toFixed(3));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { numeros };\r\n};\r\n","import { functionsCore } from \"..\";\r\nimport { TypeLimitGames, TypeNumero, TypeValueGames } from \"../../types\";\r\n\r\nexport type ResultadoNumeroComDiferenca = {\r\n numero: TypeNumero;\r\n diferenca: number;\r\n};\r\n\r\nconst CASAS_DECIMAIS = 2;\r\n\r\nexport const getNumerosAcimaDoLimite = (\r\n numeros: TypeNumero[],\r\n valoresJogos: TypeValueGames,\r\n limitesJogos: TypeLimitGames\r\n): ResultadoNumeroComDiferenca[] => {\r\n return numeros\r\n .map((numero) => {\r\n const valorJogo = functionsCore.limite_jogos.getValorJogoPeloTipoJogo(\r\n valoresJogos,\r\n numero.tipo_jogo\r\n );\r\n\r\n const limiteJogo = Object.values(limitesJogos).find(\r\n (v) => v.type_game === numero.tipo_jogo\r\n );\r\n\r\n const limiteAtingido =\r\n functionsCore.limite_jogos.calcularValorJogoPeloLimite(\r\n limiteJogo?.limit || 0,\r\n valorJogo?.value || 0\r\n );\r\n\r\n const amountArredondado = Number(numero.amount.toFixed(CASAS_DECIMAIS));\r\n const limiteAtingidoArredondado = Number(limiteAtingido.toFixed(CASAS_DECIMAIS));\r\n\r\n const diferenca = amountArredondado - limiteAtingidoArredondado;\r\n\r\n if (amountArredondado > limiteAtingidoArredondado) {\r\n return {\r\n numero,\r\n diferenca,\r\n };\r\n }\r\n\r\n return null;\r\n })\r\n .filter(Boolean) as ResultadoNumeroComDiferenca[];\r\n};\r\n","export const arredondarParaCima = (valor: number): number => {\r\n // Trabalha com centavos de forma mais segura (com Math.round)\r\n let emCentavos = Math.round(valor * 100);\r\n\r\n // Se não for múltiplo de 5, arredonda para cima\r\n const resto = emCentavos % 5;\r\n if (resto !== 0) {\r\n emCentavos += 5 - resto;\r\n }\r\n\r\n const valorFinal = emCentavos / 100\r\n\r\n return valorFinal;\r\n}","import { GAMES } from \"../../constants\";\r\nimport { TypeNumeros } from \"../../types\";\r\n\r\n// Função de ordenação\r\nexport const sortNumeros = (numeros: TypeNumeros): TypeNumeros => {\r\n const sortedDescargas = Object.values(numeros).sort((a, b) => {\r\n // Ordena por tipo de jogo (ordem alfabética)\r\n\r\n const ORDER_GAME_A = GAMES[a.tipo_jogo].order\r\n const ORDER_GAME_B = GAMES[b.tipo_jogo].order\r\n\r\n if (ORDER_GAME_A < ORDER_GAME_B) return -1;\r\n if (ORDER_GAME_A > ORDER_GAME_B) return 1;\r\n\r\n // Ordena por prêmio (ordem numérica)\r\n if (a.premio < b.premio) return -1;\r\n if (a.premio > b.premio) return 1;\r\n\r\n // Ordena por valor da aposta (amount) (ordem numérica)\r\n return a.amount > b.amount ? -1 : 1;\r\n });\r\n\r\n // Retorna o objeto ordenado com a estrutura de TypeDescargas\r\n return Object.fromEntries(\r\n sortedDescargas.map((item) => [item.id, item])\r\n ) as TypeNumeros;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\n\r\nexport const getPropsEnvioId = (\r\n numero: Partial<TypeNumero>\r\n): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n !array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\n\r\nexport const getPropsEnvioIdOld = (numero: Partial<TypeNumero>): { [props: string]: number } => {\r\n\r\n const objeto: { [props: string]: number } = {}\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};","import { PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeNumero } from \"../../types\";\r\n\r\nexport const getPropsVP = (numero: Partial<TypeNumero>): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n if (key.startsWith(PREFIX_NUMBER) && typeof value === \"number\") {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { PREFIX_ENVIO, PREFIX_ENVIO_OLD, PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeNumero } from \"../../types\";\r\nimport { clone } from \"../../utils\";\r\nimport { getPropsEnvioId } from \"./getPropsEnvioId\";\r\nimport { getPropsEnvioIdOld } from \"./getPropsEnvioIdOld\";\r\nimport { getPropsVP } from \"./getPropsVP\";\r\n\r\nexport type TypeProps = {\r\n [prop: string]: number;\r\n};\r\n\r\nexport type TypePropsPrefix = {\r\n [PREFIX_NUMBER]: TypeProps;\r\n [PREFIX_ENVIO]: TypeProps;\r\n [PREFIX_ENVIO_OLD]: TypeProps;\r\n};\r\n\r\nexport const getPropsPrefix = (numero: Partial<TypeNumero>): TypePropsPrefix => {\r\n const props: TypePropsPrefix = {\r\n [PREFIX_NUMBER]: {},\r\n [PREFIX_ENVIO]: {},\r\n [PREFIX_ENVIO_OLD]: {},\r\n };\r\n\r\n const vps = clone(getPropsVP(numero));\r\n const envio_ids = clone(getPropsEnvioId(numero));\r\n const envio_ids_old = clone(getPropsEnvioIdOld(numero));\r\n\r\n props[PREFIX_NUMBER] = clone(vps);\r\n props[PREFIX_ENVIO] = clone(envio_ids);\r\n props[PREFIX_ENVIO_OLD] = clone(envio_ids_old);\r\n\r\n return props;\r\n};\r\n","/**\r\n * @description Retorna a soma dos todos os valores do\r\n * número enviado em cada envio\r\n *\r\n * @example getSomaVP({ envio_23: 10, envio_24: 5 }) -> 15\r\n */\r\nexport const getSomaProps = (objeto: Record<string, number>): number => {\r\n let soma = 0;\r\n\r\n Object.values(objeto).forEach((value) => {\r\n soma += value;\r\n });\r\n\r\n return soma;\r\n};\r\n","import { GAMES } from \"../../constants\";\r\nimport { TypeLimitGame, TypeLimitGames } from \"../../types\";\r\n\r\n/**\r\n * Retorna o limite associado a um tipo de jogo específico a partir de um conjunto de jogos.\r\n *\r\n * A função percorre os valores do objeto `limitsGames` e retorna o primeiro item cujo campo `type_game`\r\n * seja igual ao tipo de jogo fornecido (`type_game`).\r\n *\r\n * @param {TypeLimitGames} limitsGames - Objeto contendo os valores de todos os jogos, indexados por chave.\r\n * @param {keyof typeof GAMES} type_game - Tipo de jogo a ser buscado (deve ser uma chave válida de `GAMES`).\r\n * @returns {TypeValueGame | undefined} O limite correspondente ao tipo de jogo informado ou `undefined` se não for encontrado.\r\n *\r\n * @example\r\n * const limitsGames = {\r\n * \"1\": { type_game: 'milhar', limit: 10 },\r\n * \"2\": { type_game: 'centena', limit: 20 }\r\n * };\r\n * const resultado = getLimiteTipoJogo(limitsGames, 'milhar');\r\n * resultado = { type_game: 'milhar', limit: 10 }\r\n */\r\nexport const getLimiteJogoPeloTipoJogo = (\r\n limitsGames: TypeLimitGames,\r\n type_game: keyof typeof GAMES\r\n): TypeLimitGame | undefined => {\r\n return Object.values(limitsGames).find((v) => v.type_game === type_game);\r\n};\r\n","export { calcularValorJogoPeloLimite } from \"./calcularValorJogoPeloLimite\"\r\nexport { getValorJogoPeloTipoJogo } from \"./getValorJogoPeloTipoJogo\"\r\nexport { getLimiteJogoPeloTipoJogo } from \"./getLimiteJogoPeloTipoJogo\"","/**\r\n * Calcula o valor unitário de uma jogada com base no limite total disponível.\r\n *\r\n * A função divide o limite (`limiteJogo.limit`) pelo valor fornecido em `valorJogo.value`.\r\n * Se `valorJogo.value` for `0`, será usado o valor padrão `1` para evitar divisão por zero.\r\n * \r\n * @param {number} limiteJogo - valor do limite de jogo.\r\n * @param {TypeValueGame} valorJogo - Objeto que contém o valor do jogo.\r\n * @returns {number} O valor resultante da divisão do limite pelo valor, representando o valor unitário por jogada.\r\n *\r\n * @example\r\n * const limiteJogo = { type_game: \"milhar\", limit: 40000 };\r\n * const valorJogo = { type_game: \"milhar\", value: 4000 };\r\n * const resultado = calcularValorJogoPeloLimite(limiteJogo, valorJogo);\r\n * resultado = 10\r\n */\r\nexport const calcularValorJogoPeloLimite = (\r\n limiteJogo: number,\r\n valorJogo: number\r\n) => {\r\n return limiteJogo / (valorJogo || 1);\r\n};\r\n","import { GAMES } from \"../../constants\";\r\nimport { TypeValueGame, TypeValueGames } from \"../../types\";\r\n\r\n/**\r\n * Retorna o valor associado a um tipo de jogo específico a partir de um conjunto de jogos.\r\n *\r\n * A função percorre os valores do objeto `valuesGames` e retorna o primeiro item cujo campo `type_game`\r\n * seja igual ao tipo de jogo fornecido (`type_game`).\r\n *\r\n * @param {TypeValueGames} valuesGames - Objeto contendo os valores de todos os jogos, indexados por chave.\r\n * @param {keyof typeof GAMES} type_game - Tipo de jogo a ser buscado (deve ser uma chave válida de `GAMES`).\r\n * @returns {TypeValueGame | undefined} O valor correspondente ao tipo de jogo informado ou `undefined` se não for encontrado.\r\n *\r\n * @example\r\n * const valuesGames = {\r\n * \"1\": { type_game: 'milhar', value: 10 },\r\n * \"2\": { type_game: 'centena', value: 20 }\r\n * };\r\n * const resultado = getLimiteTipoJogo(valuesGames, 'milhar');\r\n * resultado = { type_game: 'milhar', value: 10 }\r\n */\r\nexport const getValorJogoPeloTipoJogo = (\r\n valuesGames: TypeValueGames,\r\n type_game: keyof typeof GAMES\r\n): TypeValueGame | undefined => {\r\n return Object.values(valuesGames).find((v) => v.type_game === type_game);\r\n};\r\n","import { TypeLimitGames } from \"../../types/limit_value_type_game.type\";\r\nimport { TypeValueGames } from \"../../types/value_type_game.type\";\r\nimport { getLimiteJogoPeloTipoJogo } from \"../limite_jogos/getLimiteJogoPeloTipoJogo\";\r\nimport { getValorJogoPeloTipoJogo } from \"../limite_jogos\";\r\nimport { GAMES } from \"../../constants\";\r\n\r\nexport const getLimiteSimulado = (\r\n tipo_jogo: keyof typeof GAMES,\r\n valores: TypeValueGames,\r\n limites: TypeLimitGames,\r\n): number => {\r\n const valorJogo = getValorJogoPeloTipoJogo(valores, tipo_jogo);\r\n\r\n const limiteJogo = getLimiteJogoPeloTipoJogo(limites, tipo_jogo);\r\n\r\n const limiteSimulado = (limiteJogo?.limit || 0) / (valorJogo?.value || 1);\r\n\r\n return Number(limiteSimulado.toFixed(2));\r\n};\r\n","export { getAvailableTimes } from \"./getAvailableTimes\"\r\nexport { pegarExtracoes } from \"./pegarExtracoes\"\r\nexport { extracaoEstaAtivaTryCatch } from \"./extracaoEstaAtivaTryCatch\"\r\nexport { extracaoEstaAtivaBoolean } from \"./extracaoEstaAtivaBoolean\"","import { format, getDay } from 'date-fns';\r\nimport { getBetDateToNumber } from '../../functions/games';\r\nimport { TypeExtracao } from '../../types';\r\nimport { numberToDate, showFormatDate } from '../../utils';\r\n\r\n/**\r\n * @description\r\n * Retorna a lista de extrações válidas (horários disponíveis) para uma data de aposta específica,\r\n * levando em conta regras como feriados, dias da semana, bloqueios por horário e status de atividade.\r\n * \r\n * Regras aplicadas:\r\n * - Ignora extrações marcadas como **inativas para o dia da aposta** (`inativo_no_dia`).\r\n * - Se houver extrações exclusivas para feriados (`somente_no_feriado` === data da aposta),\r\n * retorna apenas essas extrações.\r\n * - Caso contrário, retorna extrações ativas e recorrentes para o **dia da semana da aposta**\r\n * (ex: segunda-feira), desde que não sejam exclusivas de feriado.\r\n * - Se `showAll` for `true`, ignora as regras acima e retorna todas as extrações ativas.\r\n * - Se `mobile` for `true` e `dateBet` for o dia atual (`dateNow`), filtra ainda mais: remove as extrações\r\n * cujo horário de **bloqueio já passou**, baseado na hora atual do dispositivo.\r\n * \r\n * A lista final é sempre ordenada do menor para o maior horário (`ext.horario`).\r\n *\r\n * @param extracoes - Lista de todas as extrações disponíveis no sistema.\r\n * @param dateBet - Data da aposta em formato numérico (ex: 20241001000000).\r\n * @param showAll - Se `true`, ignora filtros e retorna todas as extrações ativas.\r\n * @param mobile - Se `true`, aplica lógica de bloqueio com base na hora atual (`dateNow`).\r\n * @param dateNow - Data/hora atual usada para comparação, especialmente quando `mobile` estiver ativado.\r\n * \r\n * @returns Lista de extrações válidas, ordenadas por horário.\r\n */\r\nexport const getAvailableTimes = (\r\n extracoes: TypeExtracao[],\r\n dateBet: number,\r\n showAll?: boolean,\r\n mobile?: boolean,\r\n dateNow?: Date\r\n) => {\r\n // converte a data com horas,minutos e segundos com zero\r\n const data = getBetDateToNumber(dateBet, 20241001000000);1\r\n\r\n const extracoesAtivas = extracoes.filter(\r\n (ext) => ext.ativo && !ext.inativo_no_dia.includes(data)\r\n );\r\n\r\n const DateBet = numberToDate(data);\r\n\r\n let validTimes: TypeExtracao[] = [];\r\n\r\n // verifica se no dia selecionado tem alguma extração com aquela data exata e se nao está inativa no dia\r\n const extracoesFeriado = extracoesAtivas.filter(\r\n (ext) => ext.somente_no_feriado === data\r\n );\r\n\r\n // se tiver, mostra somente a extracao da data selecionada\r\n if (extracoesFeriado.length > 0) {\r\n validTimes = [...extracoesFeriado];\r\n } else {\r\n // se nao, mostra todas menos a com a data selecionada\r\n validTimes = extracoesAtivas.filter(\r\n (ext) =>\r\n DateBet &&\r\n ext.days[getDay(DateBet) as keyof typeof ext.days] &&\r\n ext.somente_no_feriado === 0\r\n );\r\n }\r\n\r\n if (showAll) {\r\n validTimes = [...extracoesAtivas];\r\n }\r\n\r\n if (mobile && DateBet && dateNow) {\r\n if (format(dateNow, 'dd/MM/yyyy') === format(DateBet, 'dd/MM/yyyy')) {\r\n validTimes = validTimes.filter(\r\n (ext) =>\r\n Number(format(dateNow, 'HHmm')) <\r\n Number(showFormatDate(ext.bloqueio, 'HHmm'))\r\n );\r\n }\r\n }\r\n\r\n return validTimes.sort((extA, extB) =>\r\n Number(showFormatDate(extA.horario, 'HHmm')) <\r\n Number(showFormatDate(extB.horario, 'HHmm'))\r\n ? -1\r\n : 1\r\n );\r\n};\r\n","export { calculateAmount } from './calculateAmount';\r\nexport { calculateAmountGame } from './calculateAmountGame';\r\nexport { getBetDateToNumber } from './getBetDateToNumber';\r\nexport { formatPuleId } from './formatPuleId';\r\nexport { getFormattedPuleId } from './getFormattedPuleId';\r\nexport { fazerJogo } from './fazerJogo';\r\nexport { invertGame } from './invertGame';\r\nexport { getGamesUnicosList, getGamesUnicosObjeto } from './getGamesUnicos';\t","import { TypePrize } from \"../../types/bet.type\";\r\n\r\nexport const calculateAmount = (betValues: TypePrize[]) => {\r\n let total = 0;\r\n betValues.forEach((item) => {\r\n total += item.value;\r\n });\r\n return total;\r\n};\r\n","import { TypeBet } from \"../../types/bet.type\";\r\nimport { calculateAmount } from \"./calculateAmount\";\r\n\r\nexport const calculateAmountGame = (games: TypeBet[]) => {\r\n let total = 0;\r\n\r\n games.forEach((bet) => {\r\n total += calculateAmount(bet.prizes);\r\n });\r\n\r\n return total;\r\n};\r\n","import { setHours, setMinutes, setSeconds } from \"date-fns\";\r\nimport { TypeExtracao } from \"../../types\";\r\nimport { dateToNumber, numberToDate } from \"../../utils\";\r\n\r\nexport const getBetDateToNumber = (\r\n date: number,\r\n extracaoDate: TypeExtracao[\"horario\"]\r\n): number => {\r\n const extDate = extracaoDate;\r\n\r\n const dateExtracao = numberToDate(extDate);\r\n\r\n let newDateBet = numberToDate(date);\r\n\r\n if(!newDateBet || !dateExtracao) return 0;\r\n\r\n newDateBet = setHours(newDateBet, dateExtracao.getHours());\r\n newDateBet = setMinutes(newDateBet, dateExtracao.getMinutes());\r\n newDateBet = setSeconds(newDateBet, 0);\r\n\r\n const number = dateToNumber(newDateBet);\r\n\r\n return number;\r\n};\r\n","/**\r\n * @description Formata o ID do pule na criação\r\n*/\r\nexport const formatPuleId = (n: number): string => {\r\n if (n < 1000) {\r\n return n.toString().padStart(4, '0');\r\n } else {\r\n return n.toString();\r\n }\r\n};\r\n","/**\r\n * @description Formata o ID do pule para exibir em tela, extraindo a última parte após o último hífen\r\n * \r\n * @param {string} id - O ID completo do pule que pode conter múltiplos hífens\r\n * @returns {string} A última parte do ID após o último hífen\r\n * \r\n * @example\r\n * getFormattedPuleId(\"1-0001\") // \"0001\"\r\n * @example\r\n * getFormattedPuleId(\"102-2344301\") // \"2344301\"\r\n * @example\r\n * getFormattedPuleId(\"df29e917-d922-afce-257b-7e766411ef79-0541\") // \"0541\"\r\n */\r\nexport const getFormattedPuleId = (id: string): string => {\r\n const parts = id.split('-');\r\n return parts[parts.length - 1];\r\n};\r\n","import { TypeGame } from \"../../types\";\r\nimport { clone, getAllCombinations } from \"../../utils\";\r\n\r\nexport const invertGame = (game: TypeGame): TypeGame => {\r\n const newGame = clone(game);\r\n\r\n for (let index = 0; index < newGame.bets.length; index++) {\r\n let aposta = newGame.bets[index];\r\n\r\n if (\r\n aposta.name === \"milhar.invertida\" ||\r\n aposta.name === \"centena.invertida\" ||\r\n aposta.name === \"milhar.invertida@centena.invertida\"\r\n ) {\r\n const nums = aposta.numbers;\r\n const result: string[] = [];\r\n\r\n for (const num of nums) {\r\n const n = getAllCombinations(num);\r\n result.push(...n);\r\n }\r\n\r\n aposta = { ...aposta, numbers: clone(result) };\r\n newGame.bets[index] = aposta;\r\n }\r\n }\r\n\r\n return newGame;\r\n};\r\n","import { GameModel } from \"../../models\";\r\nimport { TypeExtracao, TypeGame, TypeUser } from \"../../types\";\r\nimport { calculaValoresDosNumeros } from \"../numbers/calculaValoresDosNumeros\";\r\nimport { calculateAmountGame } from \"./calculateAmountGame\";\r\nimport { getBetDateToNumber } from \"./getBetDateToNumber\";\r\nimport { invertGame } from \"./invertGame\";\r\n\r\nexport const fazerJogo = (\r\n cart: TypeGame,\r\n profile: TypeUser,\r\n dateBet: number,\r\n extracao: TypeExtracao,\r\n puleId: string\r\n) => {\r\n\r\n const game = GameModel({\r\n ...cart,\r\n id: puleId,\r\n creator: profile,\r\n dateBet: getBetDateToNumber(dateBet, extracao.horario),\r\n totalAmount: calculateAmountGame(cart.bets),\r\n extracao: extracao,\r\n });\r\n\r\n const gameWIthInvertedNumbers = invertGame(game);\r\n\r\n const { numeros } = calculaValoresDosNumeros(\r\n gameWIthInvertedNumbers\r\n );\r\n\r\n return { numeros, game };\r\n};\r\n","import { GAMES } from \"../../constants\";\r\n\r\nexport const getGamesUnicosList = () =>\r\n Object.values(GAMES).filter(\r\n (visu) => !visu.id.includes(\"@\") && !visu.id.includes(\"invertida\")\r\n );\r\n\r\nexport const getGamesUnicosObjeto = () => {\r\n const filtrados = Object.values(GAMES).filter(\r\n (visu) => !visu.id.includes(\"@\") && !visu.id.includes(\"invertida\")\r\n );\r\n\r\n const obj = filtrados.reduce((acc, item) => {\r\n acc[item.id] = item;\r\n return acc;\r\n }, {} as Record<string, (typeof GAMES)[keyof typeof GAMES]>);\r\n\r\n return obj;\r\n};\r\n","import { format, getDay } from \"date-fns\";\r\nimport {\r\n dateToNumber,\r\n numberToDate,\r\n pegarHorarioSaoPaulo,\r\n showFormatDate,\r\n} from \"../../utils\";\r\nimport { TypeExtracao } from \"../../types\";\r\nimport { getBetDateToNumber } from \"../games\";\r\n\r\n/**\r\n * @description\r\n * Retorna uma lista de extrações válidas para uma data de aposta, aplicando regras de negócio:\r\n * \r\n * Regras aplicadas:\r\n * 1. Se houver extrações exclusivas para feriado (`somente_no_feriado`), retorna apenas essas.\r\n * 2. Caso contrário, retorna extrações ativas que funcionam no dia da semana da aposta (`days`) e não são exclusivas de feriado.\r\n * 3. Se `retornar === \"do_dia\"`, retorna todas as extrações válidas para a data da aposta.\r\n * 4. Se `retornar === \"proximas\"` e a aposta for no mesmo dia de `dataAgora`, retorna apenas extrações cujo horário de bloqueio ainda não passou.\r\n * 5. Se `retornar === \"anteriores\"` e a aposta for no mesmo dia de `dataAgora`, retorna apenas extrações cujo horário já passou.\r\n * 6. A lista final é sempre ordenada do menor para o maior horário (`horario`).\r\n *\r\n * @param params.extracoes - Lista completa de extrações disponíveis.\r\n * @param params.dataAposta - Data da aposta em formato numérico (ex: 20241001000000). Default: hora atual em São Paulo.\r\n * @param params.dataAgora - Data/hora atual usada para comparação de próximas/anteriores. Default: hora atual em São Paulo.\r\n * @param params.retornar - Define o filtro de retorno:\r\n * - `\"do_dia\"`: retorna todas as extrações válidas para a data da aposta.\r\n * - `\"proximas\"`: retorna apenas extrações que ainda não passaram no dia da aposta.\r\n * - `\"anteriores\"`: retorna apenas extrações que já passaram no dia da aposta.\r\n *\r\n * @returns Lista de extrações válidas, ordenadas por horário crescente.\r\n */\r\nexport const pegarExtracoes = ({\r\n extracoes,\r\n dataAposta = dateToNumber(pegarHorarioSaoPaulo()), // Data da aposta padrão: hora atual SP\r\n dataAgora = dateToNumber(pegarHorarioSaoPaulo()), // Data/hora atual padrão: hora atual SP\r\n retornar = \"do_dia\", // Tipo de filtro padrão\r\n pegar = \"bloqueio\",\r\n}: {\r\n extracoes: TypeExtracao[];\r\n dataAposta?: number;\r\n dataAgora?: number;\r\n retornar?: \"do_dia\" | \"anteriores\" | \"proximas\";\r\n pegar?: \"horario\" | \"bloqueio\";\r\n}): TypeExtracao[] => {\r\n\r\n /**\r\n * @description Retorna o horário apropriado da extração baseado no parâmetro 'pegar'\r\n * \r\n * @param {TypeExtracao} extracao - A extração da qual se deseja obter o horário\r\n * @returns {number} O horário da extração (horario ou bloqueio) ou 0 se não especificado\r\n * \r\n * @example\r\n * // Retorna o horário da extração\r\n * getHorario(extracao) // quando pegar === \"horario\" -> retorna extracao.horario\r\n * \r\n * @example \r\n * // Retorna o horário de bloqueio da extração\r\n * getHorario(extracao) // quando pegar === \"bloqueio\" -> retorna extracao.bloqueio\r\n */\r\n const getHorario = (extracao: TypeExtracao) => {\r\n if (pegar === \"horario\") return extracao.horario;\r\n if (pegar === \"bloqueio\") return extracao.bloqueio;\r\n return 0;\r\n };\r\n\r\n // Converte a data da aposta para remover horas, minutos e segundos\r\n const dataApostaNumerica = getBetDateToNumber(dataAposta, 20241001000000);\r\n\r\n // Converte a data agora para o mesmo formato de aposta (apenas data)\r\n const dataAgoraNumerica = getBetDateToNumber(dataAgora, 20241001000000);\r\n\r\n // Converte a data da aposta para objeto Date\r\n const dataApostaDate = numberToDate(dataApostaNumerica);\r\n\r\n if (!dataApostaDate) throw new Error(\"dataApostaDate é obrigatória!\");\r\n\r\n // Filtra apenas extrações ativas e que não estão inativas no dia da aposta\r\n const extracoesAtivas = extracoes.filter(\r\n (ext) => ext.ativo && !ext.inativo_no_dia.includes(dataApostaNumerica)\r\n );\r\n\r\n // Filtra extrações que são exclusivas para feriado na data da aposta\r\n const extracoesDeFeriado = extracoesAtivas.filter(\r\n (ext) => ext.somente_no_feriado === dataApostaNumerica\r\n );\r\n\r\n // Determina as extrações válidas iniciais\r\n const extracoesValidas =\r\n // Se houver feriados, retorna apenas essas extrações\r\n extracoesDeFeriado.length > 0\r\n ? extracoesDeFeriado\r\n : // Caso contrário, retorna extrações do dia da semana ativo e não exclusivas de feriado\r\n extracoesAtivas.filter(\r\n (ext) =>\r\n ext.days[getDay(dataApostaDate) as keyof typeof ext.days] &&\r\n ext.somente_no_feriado === 0\r\n );\r\n\r\n // Retorna todas as extrações válidas do dia, ordenadas\r\n if (retornar === \"do_dia\") {\r\n return extracoesValidas.sort(sortExtracoes);\r\n }\r\n\r\n // Converte dataAgora para Date\r\n const dataAgoraDate = numberToDate(dataAgora);\r\n\r\n if (!dataAgoraDate) throw new Error(\"dataAgoraDate é obrigatória!\");\r\n\r\n // Extrai a hora atual no formato HHmm\r\n const horaAgora = Number(format(dataAgoraDate, \"HHmm\"));\r\n\r\n // Filtra extrações com base no tipo de retorno (\"proximas\" ou \"anteriores\")\r\n const extracoesFiltradas =\r\n retornar === \"proximas\"\r\n ? extracoesValidas.filter((ext) =>\r\n dataApostaNumerica === dataAgoraNumerica\r\n ? horaAgora < Number(showFormatDate(getHorario(ext), \"HHmm\"))\r\n : dataApostaNumerica > dataAgoraNumerica\r\n )\r\n : retornar === \"anteriores\"\r\n ? extracoesValidas.filter((ext) =>\r\n dataAgoraNumerica === dataApostaNumerica\r\n ? horaAgora >= Number(showFormatDate(getHorario(ext), \"HHmm\"))\r\n : dataApostaNumerica < dataAgoraNumerica\r\n )\r\n : [];\r\n\r\n // Ordena o resultado final por horário crescente\r\n return extracoesFiltradas.sort(sortExtracoes);\r\n};\r\n\r\n/**\r\n * @description Ordena as extrações do menor para o maior horário\r\n */\r\nconst sortExtracoes = (a: TypeExtracao, b: TypeExtracao) =>\r\n Number(showFormatDate(a.horario, \"HHmm\")) - Number(showFormatDate(b.horario, \"HHmm\"));","import { getDay } from \"date-fns\";\r\nimport { TypeExtracao } from \"../../types\";\r\nimport { numberToDate } from \"../../utils\";\r\n\r\n/**\r\n * Verifica se a extração está ativa e lança exceção com mensagem específica caso não esteja.\r\n * Use esta função quando precisar saber o motivo específico do erro (ex: Cloud Functions).\r\n * @throws {Error} Lança erro com mensagem específica do problema\r\n * \r\n * @example \"Extração não está ativa.\"\r\n * @example \"Extração está inativa no dia da aposta.\"\r\n * @example \"Extração não funciona neste feriado.\"\r\n * @example \"Data da aposta inválida.\"\r\n * @example \"Extração não funciona neste dia da semana.\"\r\n */\r\nexport const extracaoEstaAtivaTryCatch = (\r\n dataAposta: number,\r\n extracao: TypeExtracao\r\n): void => {\r\n // Filtra apenas extrações ativas e que não estão inativas no dia da aposta\r\n\r\n if (!extracao.ativo) {\r\n throw new Error(\"Extração não está ativa.\");\r\n }\r\n\r\n if (extracao.inativo_no_dia.includes(dataAposta)) {\r\n throw new Error(\"Extração está inativa no dia da aposta.\");\r\n }\r\n\r\n if (\r\n extracao.somente_no_feriado !== 0 &&\r\n extracao.somente_no_feriado !== dataAposta\r\n ) {\r\n throw new Error(\"Extração não funciona neste feriado.\");\r\n }\r\n\r\n const dataApostaDate = numberToDate(dataAposta);\r\n\r\n if (!dataApostaDate) {\r\n throw new Error(\"Data da aposta inválida.\");\r\n }\r\n\r\n if (!extracao.days[getDay(dataApostaDate) as keyof typeof extracao.days]) {\r\n const diasSemana = ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'];\r\n const diaDaSemana = diasSemana[getDay(dataApostaDate)];\r\n throw new Error(\r\n `Extração não funciona neste dia da semana (${diaDaSemana}).`\r\n );\r\n }\r\n};\r\n","import { TypeExtracao } from \"../../types\";\r\nimport { extracaoEstaAtivaTryCatch } from \"./extracaoEstaAtivaTryCatch\";\r\n\r\n/**\r\n * Versão helper que retorna boolean sem lançar exceção.\r\n * Use esta função para validações simples no frontend (ex: desabilitar botões).\r\n * @returns {boolean} true se ativa, false se inativa (sem detalhes do motivo)\r\n */\r\nexport const extracaoEstaAtivaBoolean = (dataAposta: number, extracao: TypeExtracao): boolean => {\r\n try {\r\n extracaoEstaAtivaTryCatch(dataAposta, extracao);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n};","export {\r\n isAdm,\r\n isAdmOrSubAdm,\r\n isAssociacao,\r\n isCambista,\r\n isCambistaTalao,\r\n isDigitador,\r\n isDigitadorAdm,\r\n isSuperAdm,\r\n isDigitadorOrDigitadorAdm\r\n} from \"./permissions\";\r\nexport { getPermission } from \"./permissions\";\r\nexport { getLimitsRest } from \"./getLimitsRest\";\r\n","import { TypeUser } from \"../../types\";\r\n\r\nconst IS_ADM = [\"admin\"] as TypeUser[\"role\"][];\r\nconst IS_ADM_OR_SUBADM = [\"admin\", \"sub_admin\"] as TypeUser[\"role\"][];\r\nconst IS_ASSOCIACAO = [\"associacao\"] as TypeUser[\"role\"][];\r\nconst IS_SUPER_ADMIN = [\"super_admin\"] as TypeUser[\"role\"][];\r\nconst IS_CAMBISTA_TALAO = [\"cambista_talao\"] as TypeUser[\"role\"][];\r\nconst IS_CAMBISTA = [\"cambista\"] as TypeUser[\"role\"][];\r\nconst IS_DIGITADOR_ADM = [\"digitador_adm\"] as TypeUser[\"role\"][];\r\nconst IS_DIGITADOR = [\"digitador\"] as TypeUser[\"role\"][];\r\nconst IS_DIGITADOR_AND_ADM = [\"digitador\", \"digitador_adm\"] as TypeUser[\"role\"][];\r\n\r\nexport const isAdm = (user: TypeUser) => IS_ADM.includes(user.role);\r\nexport const isAssociacao = (user: TypeUser) => IS_ASSOCIACAO.includes(user.role);\r\nexport const isSuperAdm = (user: TypeUser) => IS_SUPER_ADMIN.includes(user.role);\r\nexport const isAdmOrSubAdm = (user: TypeUser) => IS_ADM_OR_SUBADM.includes(user.role);\r\nexport const isCambistaTalao = (user: TypeUser) =>\r\n IS_CAMBISTA_TALAO.includes(user.role);\r\nexport const isCambista = (user: TypeUser) => IS_CAMBISTA.includes(user.role);\r\nexport const isDigitadorAdm = (user: TypeUser) => IS_DIGITADOR_ADM.includes(user.role);\r\nexport const isDigitador = (user: TypeUser) => IS_DIGITADOR.includes(user.role);\r\nexport const isDigitadorOrDigitadorAdm = (user: TypeUser) => IS_DIGITADOR_AND_ADM.includes(user.role);\r\n\r\n/**\r\n * @deprecated Depreciado pois o uso antigo era \"functionsCore.users.getPermission.isAdm()\"\r\n *\r\n * @description Agora deve-se usar \"functionsCore.users.isAdm()\"\r\n */\r\nexport const getPermission = {\r\n isAdm,\r\n isAssociacao,\r\n isSuperAdm,\r\n isAdmOrSubAdm,\r\n isCambistaTalao,\r\n isCambista,\r\n isDigitadorAdm,\r\n isDigitador,\r\n isDigitadorOrDigitadorAdm\r\n};\r\n","import { TypeUser } from \"../../types\";\r\n\r\nexport const getLimitsRest = (user: TypeUser) => {\r\n\r\n let hoje = 0;\r\n let pre = 0;\r\n \r\n Object.values(user.jogos.hoje).forEach((value) => hoje += value);\r\n Object.values(user.jogos.pre).forEach((value) => pre += value);\r\n\r\n return {\r\n hoje,\r\n pre\r\n }\r\n}","export * from \"./generateDescarga\";\r\nexport * from \"./generateDescargas\";\r\nexport * from \"./getDescargaIdPeloNumero\";\r\nexport * from \"./sortDescargas\";\r\nexport * from \"./getDescargasAcimaDoLimite\";\r\nexport * from \"./getPropsVPDescarga\";\r\nexport * from \"./getPropsEnvioIdDescarga\";\r\nexport * from \"./getPropsEnvioIdOldDescarga\";\r\nexport * from \"./getDescargaIdPeloEnvio\"\r\nexport * from \"./getTotalGeralDescarga\";","import { GAMES } from \"../../constants\";\r\nimport { TypeDescargas } from \"../../types\";\r\n\r\n// Função de ordenação\r\nexport const sortDescargas = (descargas: TypeDescargas): TypeDescargas => {\r\n const sortedDescargas = Object.values(descargas).sort((a, b) => {\r\n // Ordena por tipo de jogo (ordem alfabética)\r\n\r\n const ORDER_GAME_A = GAMES[a.tipo_jogo].order\r\n const ORDER_GAME_B = GAMES[b.tipo_jogo].order\r\n\r\n if (ORDER_GAME_A < ORDER_GAME_B) return -1;\r\n if (ORDER_GAME_A > ORDER_GAME_B) return 1;\r\n \r\n // Ordena por prêmio (ordem numérica)\r\n if (a.premio < b.premio) return -1;\r\n if (a.premio > b.premio) return 1;\r\n \r\n // Ordena por valor da aposta (amount) (ordem numérica)\r\n return b.amount - a.amount;\r\n });\r\n \r\n // Retorna o objeto ordenado com a estrutura de TypeDescargas\r\n return Object.fromEntries(\r\n sortedDescargas.map((item) => [item.id, item])\r\n ) as TypeDescargas;\r\n };\r\n ","import { functionsCore } from \"..\";\r\nimport { TypeDescarga, TypeLimitGames, TypeValueGames } from \"../../types\";\r\n\r\nexport type ResultadoDescargaComDiferenca = {\r\n descarga: TypeDescarga;\r\n diferenca: number;\r\n};\r\n\r\nconst CASAS_DECIMAIS = 2;\r\n\r\nexport const getDescargasAcimaDoLimite = (\r\n descargas: TypeDescarga[],\r\n valoresJogos: TypeValueGames,\r\n limitesJogos: TypeLimitGames\r\n): ResultadoDescargaComDiferenca[] => {\r\n return descargas\r\n .map((descarga) => {\r\n const valorJogo = functionsCore.limite_jogos.getValorJogoPeloTipoJogo(\r\n valoresJogos,\r\n descarga.tipo_jogo\r\n );\r\n\r\n const limiteJogo = Object.values(limitesJogos).find(\r\n (v) => v.type_game === descarga.tipo_jogo\r\n );\r\n\r\n const limiteAtingido =\r\n functionsCore.limite_jogos.calcularValorJogoPeloLimite(\r\n limiteJogo?.limit || 0,\r\n valorJogo?.value || 0\r\n );\r\n\r\n const amountArredondado = Number(descarga.amount.toFixed(CASAS_DECIMAIS));\r\n const limiteAtingidoArredondado = Number(limiteAtingido.toFixed(CASAS_DECIMAIS));\r\n\r\n const diferenca = amountArredondado - limiteAtingidoArredondado;\r\n\r\n if (amountArredondado > limiteAtingidoArredondado) {\r\n return {\r\n descarga,\r\n diferenca,\r\n };\r\n }\r\n\r\n return null;\r\n })\r\n .filter(Boolean) as ResultadoDescargaComDiferenca[];\r\n};\r\n","import { PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeDescarga } from \"../../types\";\r\n\r\nexport const getPropsVPDescarga = (descarga: Partial<TypeDescarga>): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(descarga).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (array.includes(PREFIX_NUMBER) && typeof value === \"number\") {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { TypeDescarga } from \"../../types\";\r\n\r\nexport const getPropsEnvioId = (\r\n descarga: Partial<TypeDescarga>\r\n): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(descarga).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n !array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { TypeDescarga } from \"../../types\";\r\n\r\nexport const getPropsEnvioIdOldDescarga = (descarga: Partial<TypeDescarga>): { [props: string]: number } => {\r\n\r\n const objeto: { [props: string]: number } = {}\r\n\r\n Object.entries(descarga).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};","import { PREFIX_ENVIO_OLD } from \"../../constants\";\r\nimport { TypeNumero } from \"../../types\";\r\nimport { arredondarParaCima } from \"../numbers\";\r\n\r\n/**\r\n * Gera um ID de descarga único baseado no envio do número fornecido\r\n * \r\n * Esta função cria um identificador único para uma descarga combinando várias propriedades\r\n * do número de aposta e o ID do envio. O ID é formado pela concatenação de: bancaId (opcional),\r\n * dataAposta, tipo_jogo, premio, valor arredondado do envio e envioId.\r\n * \r\n * @param numero - O número de aposta que será usado para gerar o ID\r\n * @param envioId - ID do envio para buscar o valor específico\r\n * @returns Uma string única identificando a descarga\r\n * @throws {Error} Se o valor do envio não existir ou for inválido\r\n * \r\n * @example\r\n * ```ts\r\n * const numero = {\r\n * bancaId: 'banca1',\r\n * dataAposta: 20240627140000,\r\n * tipo_jogo: 'milhar',\r\n * premio: \"1\",\r\n * envio_old_123: 15.50\r\n * };\r\n * const descargaId = getDescargaIdPeloEnvio(numero, '123');\r\n * // Resultado: \"banca1_20240627140000_milhar_1_15.5_envio_123\"\r\n * ```\r\n */\r\nexport const getDescargaIdPeloEnvio = (\r\n numero: TypeNumero,\r\n envioId: string\r\n): string => {\r\n const envioKey = `${PREFIX_ENVIO_OLD}${envioId}` as keyof TypeNumero;\r\n const envioValue = numero[envioKey];\r\n\r\n if (envioValue === undefined || envioValue === null) {\r\n throw new Error(`Valor do envio '${envioId}' não encontrado no número.`);\r\n }\r\n\r\n if (typeof envioValue !== \"number\") {\r\n throw new Error(`Valor do envio '${envioId}' deve ser um número.`);\r\n }\r\n\r\n const somaArredondada = arredondarParaCima(envioValue);\r\n\r\n const descargaId =\r\n `${numero?.bancaId ? `${numero?.bancaId}_` : \"\"}` +\r\n `${numero.dataAposta}_${numero.tipo_jogo}_${numero.premio}_${somaArredondada}_envio_${envioId}`;\r\n\r\n return descargaId;\r\n};\r\n","import { COMISSOES_PADRAO } from \"../../constants\";\r\nimport { TypeComissoesDescarga, TypeEnvioDescarga } from \"../../types\";\r\n\r\nexport type TypeTotalGeral = {\r\n jogos: Record<string, {\r\n totalEnviado: number;\r\n ordem: number;\r\n tipo: keyof typeof COMISSOES_PADRAO;\r\n label: string\r\n }>\r\n\r\n totalBruto: number;\r\n totalLiquido: number;\r\n totalComissao: number;\r\n \r\n}\r\n\r\n/**\r\n * @description Calcula o total geral de uma descarga\r\n * @param totalBrutoJogos - Total bruto dos jogos\r\n * @param comissoes - Comissões das bancas\r\n * @returns Total geral da descarga\r\n */\r\nexport const getTotalGeralDescarga = (totalBrutoJogos: TypeEnvioDescarga[\"totalGeralJogos\"], comissoes: TypeComissoesDescarga) => {\r\n\r\n const totalGeral: TypeTotalGeral = {\r\n jogos: {},\r\n totalBruto: 0,\r\n totalLiquido: 0,\r\n totalComissao: 0,\r\n }\r\n\r\n const totalBrutoJogosArray = Object.entries(totalBrutoJogos);\r\n\r\n const listaComissoes = Object.values(comissoes);\r\n\r\n const comissaoRestante = listaComissoes.find(comissao => comissao.type_game === \"restante\");\r\n\r\n for (const [type_game, totalBrutoJogo] of totalBrutoJogosArray) {\r\n \r\n // Operador Nullish Coalescing\r\n // Converter undefined/null para 0 para evitar erros\r\n const valorJogo = totalBrutoJogo ?? 0;\r\n \r\n const comissaoEncontrada = listaComissoes.find(comissao => type_game === comissao.type_game);\r\n \r\n // Sempre soma o total bruto\r\n totalGeral.totalBruto += valorJogo;\r\n \r\n if (comissaoEncontrada) {\r\n\r\n const comissaoPadrao = COMISSOES_PADRAO[type_game as keyof typeof COMISSOES_PADRAO];\r\n\r\n totalGeral.jogos[type_game] = {\r\n totalEnviado: valorJogo,\r\n ordem: comissaoPadrao?.order || 0,\r\n tipo: type_game as keyof typeof COMISSOES_PADRAO,\r\n label: comissaoPadrao?.label || type_game\r\n };\r\n \r\n // Cálculos com comissão\r\n\r\n const comissao = valorJogo * (comissaoEncontrada.porcentagem / 100);\r\n\r\n totalGeral.totalLiquido += valorJogo - comissao;\r\n totalGeral.totalComissao += comissao;\r\n\r\n } else {\r\n // Lógica do restante\r\n if (!totalGeral.jogos[\"restante\"]) {\r\n totalGeral.jogos[\"restante\"] = {\r\n totalEnviado: 0,\r\n ordem: 9,\r\n tipo: \"restante\",\r\n label: \"Restante\",\r\n };\r\n }\r\n\r\n totalGeral.jogos[\"restante\"].totalEnviado += valorJogo;\r\n \r\n if (comissaoRestante) {\r\n const comissao = valorJogo * (comissaoRestante.porcentagem / 100);\r\n totalGeral.totalLiquido += valorJogo - comissao;\r\n totalGeral.totalComissao += comissao;\r\n } else {\r\n // Sem comissão -> valor líquido = valor bruto\r\n totalGeral.totalLiquido += valorJogo;\r\n }\r\n }\r\n }\r\n\r\n return totalGeral;\r\n}","import * as numbers from './numbers';\r\nimport * as extracao from './extracao';\r\nimport * as games from './games';\r\nimport * as users from './users';\r\nimport * as limite_jogos from './limite_jogos';\r\nimport * as descarga from './descarga';\r\nimport * as utils from '../utils';\r\n\r\nexport * from './numbers';\r\nexport * from './extracao';\r\nexport * from './games';\r\nexport * from './users';\r\nexport * from './limite_jogos';\r\n\r\n/**\r\n * @description Objeto que contém todas as funções do core, facilitando a importação e organização do código.\r\n*/\r\nexport const functionsCore = {\r\n numbers,\r\n extracao,\r\n descarga,\r\n games,\r\n users,\r\n limite_jogos,\r\n utils\r\n};\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeMessage } from \"../types/message.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const MessageModel = (obj?: Partial<TypeMessage>): TypeMessage => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n extracaoIds: obj?.extracaoIds || [],\r\n content: obj?.content || \"\",\r\n visualizacao: obj?.visualizacao || \"jogo_hoje\",\r\n bancaId: obj?.bancaId || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n date: {\r\n from: obj?.date?.from || 0,\r\n to: obj?.date?.to || 0,\r\n },\r\n fixa: obj?.date?.to === 0 || obj?.date?.from === 0,\r\n tipo: obj?.tipo || [],\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeResultado } from \"../types/resultado.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const ResultadoModel = (\r\n obj?: Partial<TypeResultado>\r\n): TypeResultado => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n bancaId: obj?.bancaId || \"\",\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n horario: obj?.extracao?.horario || 0,\r\n description: obj?.extracao?.description || \"\",\r\n },\r\n milhares: {\r\n 1: obj?.milhares?.[1] ?? \"\",\r\n 2: obj?.milhares?.[2] ?? \"\",\r\n 3: obj?.milhares?.[3] ?? \"\",\r\n 4: obj?.milhares?.[4] ?? \"\",\r\n 5: obj?.milhares?.[5] ?? \"\",\r\n },\r\n grupos: {\r\n 1: obj?.grupos?.[1] ?? \"\",\r\n 2: obj?.grupos?.[2] ?? \"\",\r\n 3: obj?.grupos?.[3] ?? \"\",\r\n 4: obj?.grupos?.[4] ?? \"\",\r\n 5: obj?.grupos?.[5] ?? \"\",\r\n },\r\n bichos: {\r\n 1: obj?.bichos?.[1] ?? \"\",\r\n 2: obj?.bichos?.[2] ?? \"\",\r\n 3: obj?.bichos?.[3] ?? \"\",\r\n 4: obj?.bichos?.[4] ?? \"\",\r\n 5: obj?.bichos?.[5] ?? \"\",\r\n },\r\n liberado: obj?.liberado ?? false,\r\n dataSorteio: obj?.dataSorteio || 0,\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeRoute } from \"../types/rota.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const RouteModel = (obj?: Partial<TypeRoute>): TypeRoute => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n comission: obj?.comission ?? 0,\r\n name: obj?.name || \"\",\r\n responsible: obj?.responsible || \"\",\r\n codigo_rota: obj?.codigo_rota || \"\",\r\n tipo: obj?.tipo || \"cambista\",\r\n bancaId: obj?.bancaId || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { GAMES } from \"../constants/GAMES\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { TypeUser } from \"../types/user.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const UserModel = (obj?: Partial<TypeUser>): TypeUser => ({\r\n id: obj?.id ?? \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n active: obj?.active ?? true,\r\n bet_limit: obj?.bet_limit ?? 0,\r\n comission: obj?.comission ?? 0,\r\n bancaId: obj?.bancaId || \"\",\r\n photoURL: obj?.photoURL || \"\",\r\n name: obj?.name || \"\",\r\n sessionId: obj?.sessionId || \"\",\r\n codigo_cambista: obj?.codigo_cambista || \"\",\r\n deviceId: obj?.deviceId || \"\",\r\n role: obj?.role || \"cambista\",\r\n pre_date_limit: obj?.pre_date_limit || 0,\r\n dispositivos: {\r\n dispositivoIdAtual: obj?.dispositivos?.dispositivoIdAtual || \"\",\r\n listaDispositivosConectados:\r\n obj?.dispositivos?.listaDispositivosConectados || [],\r\n },\r\n route: {\r\n id: obj?.route?.id || \"\",\r\n name: obj?.route?.name || \"\",\r\n tipo: obj?.route?.tipo || \"cambista\",\r\n },\r\n type_games: obj?.type_games\r\n ? obj?.type_games.filter((type) => GAMES?.[type]?.id)\r\n : [],\r\n login: obj?.login || \"\",\r\n jogos: {\r\n hoje: obj?.jogos?.hoje || {},\r\n pre: obj?.jogos?.pre || {},\r\n },\r\n preferences: {\r\n pdfLegado: obj?.preferences?.pdfLegado ?? false,\r\n },\r\n permissoes: {\r\n podeCancelarPule: obj?.permissoes?.podeCancelarPule ?? false,\r\n podeReservar: obj?.permissoes?.podeReservar ?? false,\r\n podeJogarSurpresinha: obj?.permissoes?.podeJogarSurpresinha ?? true,\r\n },\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeValueGame } from \"../types/value_type_game.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const ValueGameModel = (\r\n obj?: Partial<TypeValueGame>\r\n): TypeValueGame => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n type_game: obj?.type_game || \"milhar\",\r\n bancaId: obj?.bancaId || \"\",\r\n value: obj?.value ?? 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { STATUS_PULE } from \"../constants/STATUS_PULE\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { TypeGame } from \"../types\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { getCodigoAuth } from \"../utils/getCodigoAuth\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const GameModel = (obj: Partial<TypeGame> = {}): TypeGame => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n origem_pule_id: obj?.origem_pule_id || \"\",\r\n bets: obj.bets || [], // Array de TypeGameValues\r\n creator: {\r\n id: obj?.creator?.id || \"\",\r\n id_integer: obj?.creator?.id_integer || \"\",\r\n codigo_cambista: obj?.creator?.codigo_cambista || \"\",\r\n name: obj?.creator?.name || \"\",\r\n role: obj?.creator?.role || \"cambista\",\r\n login: obj?.creator?.login || \"\",\r\n comission: obj?.creator?.comission || 0,\r\n route: {\r\n id: obj?.creator?.route?.id || \"\",\r\n name: obj?.creator?.route?.name || \"\",\r\n tipo: obj?.creator?.route?.tipo || \"cambista\",\r\n }\r\n },\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n totalAmount: obj?.totalAmount || 0,\r\n bancaId: obj?.bancaId || \"\",\r\n codigoAuth: obj?.codigoAuth || getCodigoAuth(100000, 999999).toString(),\r\n cancel: {\r\n canceled: obj?.cancel?.canceled ?? false,\r\n canceledAt: obj?.cancel?.canceledAt || 0,\r\n reason: obj?.cancel?.reason || \"\",\r\n },\r\n valorNumerosNaPule: obj?.valorNumerosNaPule || {},\r\n infoJogos: obj?.infoJogos || [],\r\n tiposJogos: obj?.tiposJogos || {},\r\n reservada: obj?.reservada || false,\r\n dias_disponiveis: obj?.dias_disponiveis || [],\r\n dateBet: obj?.dateBet || 0,\r\n status: obj.status || STATUS_PULE.JOGADA.id, // Pega um valor padrão de STATUS_PULE\r\n statusReason: obj?.statusReason || \"\",\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n description: obj?.extracao?.description || \"\",\r\n bloqueio: obj?.extracao?.bloqueio || 0,\r\n horario: obj?.extracao?.horario || 0,\r\n },\r\n});\r\n","import { GAMES, PREFIX_ENVIO, PREFIX_ENVIO_OLD, PREFIX_NUMBER, PREMIOS } from \"../constants\";\r\nimport { TypeNumero } from \"../types/numero.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { getCreatedBySystem, getPropsPrefix } from \"../functions\";\r\n\r\nexport const NumberModel = (obj: Partial<TypeNumero> = {}): TypeNumero => {\r\n\r\n const ordemPremioExibicao = PREMIOS[obj?.premio as keyof typeof PREMIOS || \"1\"].order;\r\n const ordemJogoExibicao = GAMES[obj?.tipo_jogo as keyof typeof GAMES || \"milhar\"].order;\r\n \r\n let baseModel: TypeNumero = {\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n envioIds: obj?.envioIds || [],\r\n ordemPremioExibicao: ordemPremioExibicao,\r\n ordemJogoExibicao: ordemJogoExibicao,\r\n numero: obj?.numero || \"\",\r\n amount: obj?.amount || 0,\r\n premio: obj?.premio || \"1\",\r\n bancaId: obj?.bancaId || \"\",\r\n valorArredondado: obj?.valorArredondado || 0,\r\n limiteJogoReal: obj?.limiteJogoReal || 0,\r\n limiteJogoSimulado: obj?.limiteJogoSimulado || 0,\r\n valorJogo: obj?.valorJogo || 0,\r\n amountEnviadoParaAssociacao: obj?.amountEnviadoParaAssociacao || 0,\r\n valorAEnviarParaAssociacao: obj?.valorAEnviarParaAssociacao || 0,\r\n tipo_jogo: obj?.tipo_jogo || \"milhar\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n descarregado: obj?.descarregado ?? false,\r\n dataAposta: obj?.dataAposta || 0,\r\n };\r\n\r\n const propsPrefix = getPropsPrefix(obj);\r\n\r\n baseModel = {\r\n ...baseModel,\r\n ...propsPrefix[PREFIX_NUMBER],\r\n ...propsPrefix[PREFIX_ENVIO],\r\n ...propsPrefix[PREFIX_ENVIO_OLD],\r\n };\r\n\r\n return baseModel;\r\n};\r\n","import { TypeBet } from \"../types/bet.type\";\r\n\r\nexport const BetModel = (obj: Partial<TypeBet> = {}): TypeBet => ({\r\n name: obj?.name || \"milhar\",\r\n numbers: obj?.numbers || [],\r\n prizes: obj?.prizes || [],\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypePremiacao } from \"../types\";\r\nimport { dateToNumber } from \"../utils\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\n/**\r\n * Cria uma instância de premiação com valores padrão\r\n * \r\n * Esta função gera um objeto de premiação completo, preenchendo campos opcionais\r\n * com valores padrão apropriados. É usada para criar novas premiações ou\r\n * normalizar dados de premiação existentes.\r\n * \r\n * @param obj - Objeto parcial com dados da premiação (opcional)\r\n * @returns Objeto de premiação completo com todos os campos preenchidos\r\n * \r\n * @example\r\n * ```typescript\r\n * // Criar premiação vazia\r\n * const premiacao = PremiacaoModel();\r\n * \r\n * // Criar premiação com dados parciais\r\n * const premiacao = PremiacaoModel({\r\n * id: \"premio_123\",\r\n * bancaId: \"banca_456\",\r\n * valorTotalPremio: 10000\r\n * });\r\n * ```\r\n */\r\nexport const PremiacaoModel = (\r\n obj: Partial<TypePremiacao> = {}\r\n): TypePremiacao => ({\r\n // ID único da premiação\r\n id: obj?.id || \"\",\r\n \r\n // ID incremental por banca\r\n id_integer: obj?.id_integer || \"\",\r\n \r\n // Data da aposta em formato numérico\r\n dataAposta: obj?.dataAposta || 0,\r\n \r\n // ID da banca responsável\r\n bancaId: obj?.bancaId || \"\",\r\n \r\n // Informações da pule relacionada\r\n pule: {\r\n // ID da pule\r\n id: obj?.pule?.id || \"\",\r\n\r\n // ID incremental da pule\r\n id_integer: obj?.pule?.id_integer || \"\",\r\n \r\n // Data de criação da pule\r\n created: obj?.pule?.created || 0,\r\n \r\n // Informações de cancelamento da pule\r\n cancel: {\r\n // Se a pule foi cancelada\r\n canceled: obj?.pule?.cancel?.canceled || false,\r\n \r\n // Data do cancelamento\r\n canceledAt: obj?.pule?.cancel?.canceledAt || 0,\r\n \r\n // Motivo do cancelamento\r\n reason: obj?.pule?.cancel?.reason || \"\",\r\n },\r\n \r\n createdBy: {\r\n id: obj?.pule?.createdBy?.id || \"\",\r\n id_integer: obj?.pule?.createdBy?.id_integer || \"\",\r\n role: obj?.pule?.createdBy?.role || \"cambista\",\r\n name: obj?.pule?.createdBy?.name || \"\",\r\n login: obj?.pule?.createdBy?.login || \"\",\r\n },\r\n \r\n // Informações do criador da pule\r\n creator: {\r\n // ID do criador\r\n id: obj?.pule?.creator?.id || \"\",\r\n \r\n // ID incremental do criador\r\n id_integer: obj?.pule?.creator?.id_integer || \"\",\r\n \r\n // Código do cambista\r\n codigo_cambista: obj?.pule?.creator?.codigo_cambista || \"\",\r\n \r\n // Login do criador\r\n login: obj?.pule?.creator?.login || \"\",\r\n \r\n // Nome do criador\r\n name: obj?.pule?.creator?.name || \"\",\r\n \r\n // Papel/função do criador\r\n role: obj?.pule?.creator?.role || \"cambista\",\r\n \r\n // Comissão do criador\r\n comission: obj?.pule?.creator?.comission || 0,\r\n \r\n // Informações da rota do criador\r\n route: {\r\n // ID da rota\r\n id: obj?.pule?.creator?.route?.id || \"\",\r\n \r\n // Nome da rota\r\n name: obj?.pule?.creator?.route?.name || \"\",\r\n \r\n // Tipo da rota\r\n tipo: obj?.pule?.creator?.route?.tipo || \"cambista\",\r\n },\r\n },\r\n },\r\n \r\n // Lista de itens premiados\r\n premiosItems: obj?.premiosItems || [],\r\n \r\n // Total que o cambista recebe\r\n valorTotalPremio: obj?.valorTotalPremio || 0,\r\n \r\n // Total que a banca recebe\r\n valorTotalPremioBanca: obj?.valorTotalPremioBanca || 0,\r\n \r\n // Total que a associação recebe\r\n valorTotalPremioAssociacao: obj?.valorTotalPremioAssociacao || 0,\r\n \r\n // Informações de quem criou o registro\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n \r\n // Data de criação do registro\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n \r\n // Data de última atualização do registro\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypePDFDescargas } from \"../types\";\r\n\r\nexport const PDFModel = (\r\n obj: Partial<TypePDFDescargas> = {}\r\n): TypePDFDescargas => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n dataAposta: obj?.dataAposta || 0,\r\n descargas: obj?.descargas || {},\r\n link_pdf: obj?.link_pdf || \"\",\r\n bancaId: obj.bancaId || \"\",\r\n visualizado: obj?.visualizado || false,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || 0,\r\n updated: obj?.updated || 0,\r\n});\r\n","import { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\nimport { TypeBanca } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const BancaModel = (obj: Partial<TypeBanca> = {}): TypeBanca => ({\r\n id: obj?.id || \"\",\r\n nome: obj?.nome || \"\",\r\n settings: {\r\n urlLogo: obj?.settings?.urlLogo || \"\",\r\n urlLogoImpressao: obj?.settings?.urlLogoImpressao || \"\",\r\n urlBackground: obj?.settings?.urlBackground || \"\",\r\n backgroundColor: obj?.settings?.backgroundColor || \"\",\r\n },\r\n endereco: {\r\n cep: obj?.endereco?.cep || \"\",\r\n logradouro: obj?.endereco?.logradouro || \"\",\r\n numero: obj?.endereco?.numero || \"\",\r\n bairro: obj?.endereco?.bairro || \"\",\r\n cidade: obj?.endereco?.cidade || \"\",\r\n estado: obj?.endereco?.estado || \"\",\r\n },\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\nimport { TypeAuditLog } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const AuditLogModel = (obj: Partial<TypeAuditLog> = {}): TypeAuditLog => ({\r\n id: obj?.id || '',\r\n tipo: obj?.tipo || 'add',\r\n bancaId: obj?.bancaId || '',\r\n message: obj?.message || '',\r\n colecao: obj?.colecao || '',\r\n documentId: obj?.documentId || '',\r\n author: getCreatedBySystem(obj?.author),\r\n document: obj?.document || {},\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeLimitGame } from \"../types/limit_value_type_game.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const LimitGameModel = (\r\n obj?: Partial<TypeLimitGame>\r\n): TypeLimitGame => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n type_game: obj?.type_game || \"milhar\",\r\n bancaId: obj?.bancaId || \"\",\r\n limit: obj?.limit ?? 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { STATUS_DESCARGA } from \"../constants\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { TypeEnvioDescarga } from \"../types\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\n\r\nexport const EnvioDescargaModel = (\r\n obj?: Partial<TypeEnvioDescarga>\r\n): TypeEnvioDescarga => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n visualizado: obj?.visualizado || false,\r\n banca: {\r\n id: obj?.banca?.id || \"\",\r\n nome: obj?.banca?.nome || \"\",\r\n },\r\n dataAposta: obj?.dataAposta || 0,\r\n totalGeralJogos: {\r\n [\"milhar\"]: obj?.totalGeralJogos?.[\"milhar\"] || 0,\r\n [\"centena\"]: obj?.totalGeralJogos?.[\"centena\"] || 0,\r\n [\"dezena\"]: obj?.totalGeralJogos?.[\"dezena\"] || 0,\r\n [\"grupo\"]: obj?.totalGeralJogos?.[\"grupo\"] || 0,\r\n [\"terno.dezena\"]: obj?.totalGeralJogos?.[\"terno.dezena\"] || 0,\r\n [\"terno.grupo\"]: obj?.totalGeralJogos?.[\"terno.grupo\"] || 0,\r\n [\"duque.dezena\"]: obj?.totalGeralJogos?.[\"duque.dezena\"] || 0,\r\n [\"duque.grupo\"]: obj?.totalGeralJogos?.[\"duque.grupo\"] || 0,\r\n },\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n description: obj?.extracao?.description || \"\",\r\n bloqueio: obj?.extracao?.bloqueio || 0,\r\n horario: obj?.extracao?.horario || 0,\r\n },\r\n devolvidoPor: {\r\n id: obj?.devolvidoPor?.id || \"\",\r\n id_integer: obj?.devolvidoPor?.id_integer || \"\",\r\n name: obj?.devolvidoPor?.name || \"\",\r\n login: obj?.devolvidoPor?.login || \"\",\r\n },\r\n bancaId: obj?.bancaId || \"\",\r\n description: obj?.description || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n status: obj?.status || STATUS_DESCARGA.ENVIANDO.id,\r\n totalEnviados: obj?.totalEnviados || 0,\r\n totalRegistros: obj?.totalRegistros || 0,\r\n progresso: obj?.progresso || 0,\r\n mensagem: obj?.mensagem || \"\", \r\n concluidoEm: obj?.concluidoEm || 0,\r\n ultimaAtualizacao: obj?.ultimaAtualizacao || 0,\r\n metricas: {\r\n tempoMinimo: obj?.metricas?.tempoMinimo || 0,\r\n tempoMaximo: obj?.metricas?.tempoMaximo || 0,\r\n tempoMedio: obj?.metricas?.tempoMedio || 0,\r\n duracaoTotal: obj?.metricas?.duracaoTotal || 0,\r\n tempoEstimado: obj?.metricas?.tempoEstimado || 0,\r\n velocidadeProcessamento: obj?.metricas?.velocidadeProcessamento || 0,\r\n textosFormatados: {\r\n duracaoTotalText: obj?.metricas?.textosFormatados?.duracaoTotalText || \"\",\r\n tempoMinimoText: obj?.metricas?.textosFormatados?.tempoMinimoText || \"\",\r\n tempoMaximoText: obj?.metricas?.textosFormatados?.tempoMaximoText || \"\",\r\n tempoMedioText: obj?.metricas?.textosFormatados?.tempoMedioText || \"\",\r\n tempoEstimadoText: obj?.metricas?.textosFormatados?.tempoEstimadoText || \"\",\r\n },\r\n },\r\n atualizadoEm: obj?.atualizadoEm || 0,\r\n erro: obj?.erro || \"\",\r\n iniciadoEm: obj?.iniciadoEm || 0,\r\n user: {\r\n id: obj?.user?.id || \"\",\r\n id_integer: obj?.user?.id_integer || \"\",\r\n name: obj?.user?.name || \"\",\r\n login: obj?.user?.login || \"\",\r\n },\r\n valoresJogos: obj?.valoresJogos || [],\r\n limitesJogos: obj?.limitesJogos || [],\r\n comissoesDescarga: obj?.comissoesDescarga || [],\r\n});\r\n","import { GAMES, PREFIX_ENVIO, PREFIX_ENVIO_OLD, PREFIX_NUMBER, PREMIOS } from \"../constants\";\r\nimport { getPropsPrefix } from \"../functions\";\r\nimport { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\n\r\nimport { TypeDescarga } from \"../types\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\n\r\nexport const DescargaModel = (\r\n descarga: Partial<TypeDescarga> = {}\r\n): TypeDescarga => {\r\n const ordemPremioExibicao =\r\n PREMIOS[(descarga?.premio as keyof typeof PREMIOS) || \"1\"].order;\r\n const ordemJogoExibicao =\r\n GAMES[(descarga?.tipo_jogo as keyof typeof GAMES) || \"milhar\"].order;\r\n\r\n let baseDescarga: TypeDescarga = {\r\n id: descarga?.id || \"\",\r\n ordemJogoExibicao: ordemJogoExibicao,\r\n ordemPremioExibicao: ordemPremioExibicao,\r\n numeros: descarga?.numeros || [],\r\n quantidadeDeNumeros: descarga?.quantidadeDeNumeros || 0,\r\n bancaId: descarga?.bancaId || \"\",\r\n amountEnviadoParaAssociacao: descarga?.amountEnviadoParaAssociacao || 0,\r\n valorAEnviarParaAssociacao: descarga?.valorAEnviarParaAssociacao || 0,\r\n envioId: descarga?.envioId || \"\",\r\n amount: descarga?.amount || 0,\r\n limiteJogoReal: descarga?.limiteJogoReal || 0,\r\n limiteJogoSimulado: descarga?.limiteJogoSimulado || 0,\r\n valorJogo: descarga?.valorJogo || 0,\r\n valorArredondado: descarga?.valorArredondado || 0,\r\n dataAposta: descarga?.dataAposta || 0,\r\n premio: descarga?.premio || \"1\",\r\n tipo_jogo: descarga?.tipo_jogo || \"milhar\",\r\n createdBy: getCreatedBySystem(descarga?.createdBy),\r\n updated: descarga?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: descarga?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n };\r\n\r\n const propsPrefix = getPropsPrefix(descarga);\r\n\r\n baseDescarga = {\r\n ...baseDescarga,\r\n ...propsPrefix[PREFIX_NUMBER],\r\n ...propsPrefix[PREFIX_ENVIO],\r\n ...propsPrefix[PREFIX_ENVIO_OLD],\r\n };\r\n\r\n return baseDescarga;\r\n};\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeDevice } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const DeviceModel = (obj: Partial<TypeDevice> = {}): TypeDevice => ({\r\n id: obj?.id || \"\",\r\n userId: obj?.userId || \"\",\r\n createdBy: obj?.createdBy || getCreatedBySystem(),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n deviceId: obj?.deviceId || \"\",\r\n deviceName: obj?.deviceName || \"\",\r\n status: obj?.status || \"EM_ESPERA\",\r\n ultimoLogin: obj?.ultimoLogin || 0,\r\n plataforma: obj?.plataforma || \"mobile\",\r\n ip: obj?.ip || \"\",\r\n versaoApp: obj?.versaoApp || \"\",\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypePremiacaoAssociacao } from \"../types\";\r\nimport { dateToNumber } from \"../utils\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\n/**\r\n * Cria uma instância de premiação com valores padrão\r\n * \r\n * Esta função gera um objeto de premiação completo, preenchendo campos opcionais\r\n * com valores padrão apropriados. É usada para criar novas premiações ou\r\n * normalizar dados de premiação existentes.\r\n * \r\n * @param obj - Objeto parcial com dados da premiação (opcional)\r\n * @returns Objeto de premiação completo com todos os campos preenchidos\r\n * \r\n * @example\r\n * ```typescript\r\n * // Criar premiação vazia\r\n * const premiacao = PremiacaoModel();\r\n * \r\n * // Criar premiação com dados parciais\r\n * const premiacao = PremiacaoModel({\r\n * id: \"premio_123\",\r\n * bancaId: \"banca_456\",\r\n * valorTotalPremio: 10000\r\n * });\r\n * ```\r\n */\r\nexport const PremiacaoAssociacaoModel = (\r\n obj: Partial<TypePremiacaoAssociacao> = {}\r\n): TypePremiacaoAssociacao => ({\r\n // ID único da premiação\r\n id: obj?.id || \"\",\r\n \r\n // ID incremental por banca\r\n id_integer: obj?.id_integer || \"\",\r\n \r\n // Data da aposta em formato numérico\r\n dataAposta: obj?.dataAposta || 0,\r\n \r\n // ID da banca responsável\r\n bancaId: obj?.bancaId || \"\",\r\n\r\n numero: obj?.numero || \"\",\r\n\r\n premio: obj?.premio || \"\",\r\n\r\n tipo_jogo: obj?.tipo_jogo || \"milhar\",\r\n\r\n valorPremioAReceber: obj?.valorPremioAReceber || 0,\r\n\r\n valorEnviadoParaAssociacao: obj?.valorEnviadoParaAssociacao || 0,\r\n\r\n limiteTipoJogo: obj?.limiteTipoJogo || 0,\r\n\r\n valorTipoJogo: obj?.valorTipoJogo || 0,\r\n\r\n pulesGanhadoras: obj?.pulesGanhadoras || {},\r\n\r\n // Informações de quem criou o registro\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n \r\n // Data de criação do registro\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n \r\n // Data de última atualização do registro\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeComissaoDescarga } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const ComissaoDescargaModel = (\r\n obj: Partial<TypeComissaoDescarga> = {}\r\n): TypeComissaoDescarga => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n type_game: obj?.type_game || \"milhar\",\r\n bancaId: obj?.bancaId || \"\",\r\n porcentagem: obj?.porcentagem || 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import {\r\n AuditLogModel,\r\n BancaModel,\r\n DescargaModel,\r\n ExtracaoModel,\r\n GameModel,\r\n MessageModel,\r\n NumberModel,\r\n PDFModel,\r\n PremiacaoModel,\r\n ResultadoModel,\r\n RouteModel,\r\n UserModel,\r\n ValueGameModel,\r\n LimitGameModel,\r\n EnvioDescargaModel,\r\n DeviceModel,\r\n PremiacaoAssociacaoModel,\r\n ComissaoDescargaModel\r\n} from \"../models\";\r\n\r\n/**\r\n * @description Objeto que contem todas as coleções do banco de dados, com seus respectivos modelos.\r\n * Serve para facilitar para facilitar a criação de novos documentos no banco de dados e para facilitar a leitura do código.\r\n*/\r\nexport const collections = {\r\n mensagens: MessageModel,\r\n users: UserModel,\r\n valores_jogos: ValueGameModel,\r\n limites_jogos: LimitGameModel,\r\n pules: GameModel,\r\n extracoes: ExtracaoModel,\r\n resultados: ResultadoModel,\r\n rotas: RouteModel,\r\n envios_descarga: EnvioDescargaModel,\r\n numeros: NumberModel,\r\n numeros_enviados: NumberModel,\r\n descargas: DescargaModel,\r\n descargas_associacao: DescargaModel,\r\n premiacoes: PremiacaoModel,\r\n premiacoes_associacao: PremiacaoAssociacaoModel,\r\n pdf_descargas: PDFModel,\r\n pdf_descargas_associacao: PDFModel,\r\n bancas: BancaModel,\r\n auditLogs: AuditLogModel,\r\n dispositivos: DeviceModel,\r\n comissoes_descarga: ComissaoDescargaModel\r\n} as const;","import { ROLES } from \"../constants\";\r\nimport { generateId } from \"../utils\";\r\nimport { collections } from \"./collections\";\r\n\r\n// Types para compatibilidade entre plataformas\r\nexport type FirebaseApp<T = any> = T;\r\nexport type Firestore<T = any> = T;\r\nexport type CollectionReference<T = any> = T;\r\nexport type DocumentReference<T = any> = T;\r\nexport type Query<T = any> = T;\r\nexport type QuerySnapshot<T = any> = T;\r\nexport type DocumentSnapshot<T = any> = T;\r\nexport type WriteBatch<T = any> = T;\r\nexport type QueryConstraint<T = any> = T;\r\n\r\n// Interfaces para adaptadores de plataforma\r\nexport interface FirebaseAdapter<T = any> {\r\n // Collection operations\r\n collection: (db: Firestore, path: string) => CollectionReference<T>;\r\n doc: (db: Firestore, path: string, ...segments: string[]) => DocumentReference<T>;\r\n \r\n // Query operations\r\n query: (collection: CollectionReference<T>, ...constraints: QueryConstraint[]) => Query<T>;\r\n where: (field: string, operator: string, value: any) => QueryConstraint;\r\n orderBy: (field: string, direction?: \"asc\" | \"desc\") => QueryConstraint;\r\n limit: (count: number) => QueryConstraint;\r\n startAfter: (...fieldValues: any[]) => QueryConstraint;\r\n startAt: (...fieldValues: any[]) => QueryConstraint;\r\n endBefore: (...fieldValues: any[]) => QueryConstraint;\r\n endAt: (...fieldValues: any[]) => QueryConstraint;\r\n \r\n // Document operations\r\n getDocs: (query: Query<T>) => Promise<QuerySnapshot<T>>;\r\n getDoc: (docRef: DocumentReference<T>) => Promise<DocumentSnapshot<T>>;\r\n setDoc: (docRef: DocumentReference<T>, data: T, options?: any) => Promise<void>;\r\n updateDoc: (docRef: DocumentReference<T>, data: Partial<T>) => Promise<void>;\r\n deleteDoc: (docRef: DocumentReference<T>) => Promise<void>;\r\n \r\n // Batch operations\r\n writeBatch: (db: Firestore) => WriteBatch;\r\n batchSet: (batch: WriteBatch, docRef: DocumentReference<T>, data: T) => void;\r\n batchUpdate: (batch: WriteBatch, docRef: DocumentReference<T>, data: Partial<T>) => void;\r\n batchDelete: (batch: WriteBatch, docRef: DocumentReference<T>) => void;\r\n batchCommit: (batch: WriteBatch) => Promise<void>;\r\n \r\n // Real-time listeners\r\n onSnapshot: (query: Query<T>, callback: (snapshot: QuerySnapshot<T>) => void) => () => void;\r\n \r\n // ID generation\r\n generateId: () => string;\r\n}\r\n\r\n// Helper types para extrair valores válidos de um tipo\r\ntype WhereOperator = \"==\" | \"!=\" | \"<\" | \"<=\" | \">\" | \">=\" | \"in\" | \"not-in\" | \"array-contains\" | \"array-contains-any\";\r\n\r\n// Helper para gerar campos encadeados até 5 níveis\r\ntype NestedPaths<T, Depth extends number = 5> = Depth extends 0\r\n ? never\r\n : T extends object\r\n ? {\r\n [K in keyof T & string]: T[K] extends object\r\n ? T[K] extends any[]\r\n ? K | `${K}.${number}` | `${K}.${NestedPaths<T[K][number], Prev<Depth>>}`\r\n : K | `${K}.${NestedPaths<T[K], Prev<Depth>>}`\r\n : K;\r\n }[keyof T & string]\r\n : never;\r\n\r\n// Helper para decrementar profundidade\r\ntype Prev<T extends number> = T extends 5 ? 4 : T extends 4 ? 3 : T extends 3 ? 2 : T extends 2 ? 1 : 0;\r\n\r\n// WhereCondition com suporte a chaves encadeadas até 5 níveis\r\nexport type WhereCondition<T = any> = {\r\n field: NestedPaths<T> | string; // Suporta campos encadeados, campos simples ou string customizada\r\n operator: WhereOperator;\r\n value: any;\r\n};\r\n\r\n// OrderByCondition com suporte a chaves encadeadas até 5 níveis\r\nexport type OrderByCondition<T = any> = {\r\n field: NestedPaths<T> | string; // Suporta campos encadeados, campos simples ou string customizada\r\n direction: \"asc\" | \"desc\";\r\n};\r\n\r\n// RepoQueryOptions com type-safety baseado no modelo\r\nexport type RepoQueryOptions<T = any> = {\r\n where?: WhereCondition<T>[];\r\n orderBy?: OrderByCondition<T>[];\r\n limit?: number;\r\n startAfter?: any; // Cursor para paginação (pode ser um documento ou valor)\r\n startAt?: any; // Inicia a partir de (inclusive)\r\n endBefore?: any; // Termina antes de (exclusive)\r\n endAt?: any; // Termina em (inclusive)\r\n};\r\n\r\n// Estratégias de busca por ID com type-safety\r\nexport type IdSearchStrategy<T> = \r\n | { type: \"field\"; fieldName: NestedPaths<T> } // Busca por campo específico (ex: \"id\", \"numero\")\r\n | { type: \"documentId\" } // Usa o ID do documento diretamente\r\n | { type: \"custom\"; resolver: (id: string) => Promise<DocumentReference<T>> }; // Resolver customizado\r\n\r\n// Configurações de isolamento (para bancaId, etc.) com type-safety\r\nexport type IsolationConfig<T> = {\r\n enabled: boolean;\r\n fieldName: keyof T; // ex: \"bancaId\" - deve ser um campo válido do modelo\r\n getValue: () => T[keyof T] | undefined; // Função para obter o valor de isolamento\r\n};\r\n\r\n// Configurações de cache\r\nexport type CacheConfig = {\r\n enabled: boolean;\r\n ttl?: number; // Time to live em ms\r\n maxSize?: number; // Tamanho máximo do cache\r\n};\r\n\r\n// Tipos de operações\r\nexport type OperationType = \"read\" | \"write\" | \"delete\";\r\n\r\n// Configurações de autorização por role\r\nexport type AuthorizationConfig = {\r\n enabled: boolean;\r\n allowedRoles: {\r\n read?: (keyof typeof ROLES)[]; // Roles permitidas para leitura (get, getAll, listen)\r\n write?: (keyof typeof ROLES)[]; // Roles permitidas para escrita (add, update)\r\n delete?: (keyof typeof ROLES)[]; // Roles permitidas para deletar (remove)\r\n };\r\n getUserRole: () => keyof typeof ROLES | undefined; // Função para obter o role do usuário atual\r\n onUnauthorized?: (operation: OperationType, userRole?: keyof typeof ROLES) => void; // Callback quando não autorizado\r\n};\r\n\r\nexport type RepoConfig<T extends { id: string }> = {\r\n collectionName: keyof typeof collections;\r\n model: (data: any) => T;\r\n idSearchStrategy: IdSearchStrategy<T>;\r\n isolation?: IsolationConfig<T>;\r\n cache?: CacheConfig;\r\n authorization?: AuthorizationConfig; // ✨ Nova configuração de autorização\r\n generateId?: () => string;\r\n};\r\n\r\n// Cache simples em memória\r\nclass MemoryCache {\r\n public cache = new Map<string, { data: any; timestamp: number }>();\r\n private ttl: number;\r\n private maxSize: number;\r\n\r\n constructor(ttl: number = 300000, maxSize: number = 1000) { // 5min default\r\n this.ttl = ttl;\r\n this.maxSize = maxSize;\r\n }\r\n\r\n get(key: string): any | null {\r\n const item = this.cache.get(key);\r\n if (!item) return null;\r\n \r\n if (Date.now() - item.timestamp > this.ttl) {\r\n this.cache.delete(key);\r\n return null;\r\n }\r\n \r\n return item.data;\r\n }\r\n\r\n set(key: string, data: any): void {\r\n // Limpa cache se exceder tamanho máximo\r\n if (this.cache.size >= this.maxSize) {\r\n const firstKey = this.cache.keys().next().value;\r\n if (firstKey) {\r\n this.cache.delete(firstKey);\r\n }\r\n }\r\n \r\n this.cache.set(key, { data, timestamp: Date.now() });\r\n }\r\n\r\n delete(key: string): void {\r\n this.cache.delete(key);\r\n }\r\n\r\n clear(): void {\r\n this.cache.clear();\r\n }\r\n}\r\n\r\n// Interface do repositório retornado\r\nexport interface GenericRepo<T extends { id: string }> {\r\n get: (id: string) => Promise<T | null>;\r\n getAll: (options?: RepoQueryOptions<T>) => Promise<{ [id: string]: T }>;\r\n listen: (options: RepoQueryOptions<T>, callback: (data: { [id: string]: T }) => void) => () => void;\r\n add: (docData: Partial<T> & { id?: string }) => Promise<string>;\r\n update: (id: string, docData: Partial<T>) => Promise<void>;\r\n remove: (id: string) => Promise<void>;\r\n batch: (docs: { id?: string; data: T; operation: \"add\" | \"update\" | \"delete\" }[]) => Promise<void>;\r\n clearCache: () => void;\r\n getCacheSize: () => number;\r\n}\r\n\r\nexport function createGenericRepo<T extends { id: string }>(\r\n db: Firestore,\r\n adapter: FirebaseAdapter<T>,\r\n config: RepoConfig<T>\r\n): GenericRepo<T> {\r\n const { collectionName, model, idSearchStrategy, isolation, cache, authorization, generateId } = config;\r\n const memoryCache = cache?.enabled ? new MemoryCache(cache.ttl, cache.maxSize) : null;\r\n\r\n // Função para verificar autorização\r\n const checkAuthorization = (operation: OperationType): void => {\r\n if (!authorization?.enabled) return;\r\n \r\n const userRole = authorization.getUserRole();\r\n const allowedRoles = authorization.allowedRoles[operation];\r\n \r\n // Se não há roles definidas para a operação, permite tudo\r\n if (!allowedRoles || allowedRoles.length === 0) return;\r\n \r\n // Se usuário não está logado ou não tem role, bloqueia\r\n if (!userRole) {\r\n authorization.onUnauthorized?.(operation, userRole);\r\n throw new Error(`❌ Não autorizado: Operação '${operation}' requer autenticação na coleção '${collectionName}'`);\r\n }\r\n \r\n // Verifica se o role do usuário está na lista de permitidos\r\n if (!allowedRoles.includes(userRole)) {\r\n authorization.onUnauthorized?.(operation, userRole);\r\n throw new Error(`❌ Não autorizado: Role '${userRole}' não tem permissão para '${operation}' na coleção '${collectionName}'. Roles permitidas: ${allowedRoles.join(\", \")}`);\r\n }\r\n };\r\n\r\n // Função para obter constraints de isolamento\r\n const getIsolationConstraints = (): WhereCondition<T>[] => {\r\n if (!isolation?.enabled) return [];\r\n \r\n const value = isolation.getValue();\r\n if (!value) return [];\r\n \r\n return [{ field: isolation.fieldName as any, operator: \"==\", value }];\r\n };\r\n\r\n // Função para construir query\r\n const buildQuery = (options?: RepoQueryOptions<T>): Query<T> => {\r\n const constraints: QueryConstraint[] = [];\r\n \r\n // Adiciona constraints de isolamento primeiro\r\n const isolationConstraints = getIsolationConstraints();\r\n isolationConstraints.forEach(({ field, operator, value }) => {\r\n constraints.push(adapter.where(field.toString(), operator, value));\r\n });\r\n \r\n // Adiciona constraints da query\r\n options?.where?.forEach(({ field, operator, value }) => {\r\n constraints.push(adapter.where(field.toString(), operator, value));\r\n });\r\n \r\n options?.orderBy?.forEach(({ field, direction }) => {\r\n constraints.push(adapter.orderBy(field.toString(), direction));\r\n });\r\n \r\n if (options?.limit) {\r\n constraints.push(adapter.limit(options.limit));\r\n }\r\n \r\n // Adiciona cursores de paginação\r\n if (options?.startAfter !== undefined) {\r\n constraints.push(adapter.startAfter(options.startAfter));\r\n }\r\n \r\n if (options?.startAt !== undefined) {\r\n constraints.push(adapter.startAt(options.startAt));\r\n }\r\n \r\n if (options?.endBefore !== undefined) {\r\n constraints.push(adapter.endBefore(options.endBefore));\r\n }\r\n \r\n if (options?.endAt !== undefined) {\r\n constraints.push(adapter.endAt(options.endAt));\r\n }\r\n \r\n const collection = adapter.collection(db, collectionName);\r\n return adapter.query(collection, ...constraints);\r\n };\r\n\r\n // Função para resolver documento por ID\r\n const resolveDocument = async (id: string): Promise<DocumentReference<T>> => {\r\n switch (idSearchStrategy.type) {\r\n case \"documentId\":\r\n return adapter.doc(db, collectionName, id);\r\n \r\n case \"field\":\r\n // Para busca por campo, precisamos fazer uma query\r\n const query = buildQuery({\r\n where: [{ field: idSearchStrategy.fieldName, operator: \"==\", value: id }],\r\n limit: 1\r\n });\r\n const snapshot = await adapter.getDocs(query);\r\n if ((snapshot as any).empty) throw new Error(`Document not found with ${String(idSearchStrategy.fieldName)}: ${id}`);\r\n return (snapshot as any).docs[0].ref;\r\n \r\n case \"custom\":\r\n return idSearchStrategy.resolver(id);\r\n \r\n default:\r\n throw new Error(`Unknown idSearchStrategy: ${(idSearchStrategy as any).type}`);\r\n }\r\n };\r\n\r\n // Função para gerar chave de cache\r\n const getCacheKey = (operation: string, ...params: any[]): string => {\r\n const isolationKey = isolation?.enabled ? `_${isolation.getValue()}` : '';\r\n return `${collectionName}${isolationKey}_${operation}_${JSON.stringify(params)}`;\r\n };\r\n\r\n const get = async (id: string): Promise<T | null> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"read\");\r\n \r\n // Verifica cache primeiro\r\n if (memoryCache) {\r\n const cacheKey = getCacheKey('get', id);\r\n const cached = memoryCache.get(cacheKey);\r\n if (cached) return cached;\r\n }\r\n\r\n let docSnap: DocumentSnapshot<T>;\r\n \r\n if (idSearchStrategy.type === \"documentId\") {\r\n const docRef = adapter.doc(db, collectionName, id);\r\n docSnap = await adapter.getDoc(docRef);\r\n } else if (idSearchStrategy.type === \"field\") {\r\n // Para outros tipos, usa query\r\n const query = buildQuery({\r\n where: [{ field: idSearchStrategy.fieldName, operator: \"==\", value: id }],\r\n limit: 1\r\n });\r\n const snapshot = await adapter.getDocs(query);\r\n docSnap = (snapshot as any).docs[0] || null;\r\n } else {\r\n const docRef = await resolveDocument(id);\r\n docSnap = await adapter.getDoc(docRef);\r\n }\r\n\r\n if (!(docSnap as any)?.exists()) return null;\r\n\r\n const result = model((docSnap as any).data());\r\n \r\n // Armazena no cache\r\n if (memoryCache) {\r\n const cacheKey = getCacheKey('get', id);\r\n memoryCache.set(cacheKey, result);\r\n }\r\n \r\n return result;\r\n } catch (error) {\r\n console.error(`Error getting document ${id}:`, error);\r\n return null;\r\n }\r\n };\r\n\r\n const getAll = async (options?: RepoQueryOptions<T>): Promise<{ [id: string]: T }> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"read\");\r\n \r\n const query = buildQuery(options);\r\n const snapshot = await adapter.getDocs(query);\r\n \r\n const result: { [id: string]: T } = {};\r\n (snapshot as any).forEach((docSnap: any) => {\r\n const data = model(docSnap.data());\r\n result[data.id] = data;\r\n });\r\n \r\n return result;\r\n } catch (error) {\r\n console.error(`Error getting all documents:`, error);\r\n return {};\r\n }\r\n };\r\n\r\n const listen = (\r\n options: RepoQueryOptions<T>,\r\n callback: (data: { [id: string]: T }) => void\r\n ): (() => void) => {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"read\");\r\n \r\n const query = buildQuery(options);\r\n \r\n return adapter.onSnapshot(query, (snapshot: any) => {\r\n const result: { [id: string]: T } = {};\r\n snapshot.forEach((docSnap: any) => {\r\n const data = model(docSnap.data());\r\n result[data.id] = data;\r\n });\r\n callback(result);\r\n });\r\n };\r\n\r\n const add = async (docData: Partial<T> & { id?: string }): Promise<string> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"write\");\r\n \r\n const id = docData.id || generateId?.() || adapter.generateId();\r\n \r\n // Adiciona dados de isolamento se necessário\r\n const completeData = { ...docData, id };\r\n if (isolation?.enabled && isolation.getValue()) {\r\n (completeData as any)[isolation.fieldName] = isolation.getValue();\r\n }\r\n \r\n const docRef = adapter.doc(db, collectionName, id);\r\n const modelData = model(completeData);\r\n \r\n await adapter.setDoc(docRef, modelData);\r\n \r\n // Limpa cache relacionado\r\n if (memoryCache) {\r\n memoryCache.delete(getCacheKey('get', id));\r\n }\r\n \r\n return id;\r\n } catch (error) {\r\n console.error(`Error adding document:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n const update = async (id: string, docData: Partial<T>): Promise<void> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"write\");\r\n \r\n const docRef = await resolveDocument(id);\r\n \r\n // Adiciona dados de isolamento se necessário\r\n const completeData = { ...docData };\r\n if (isolation?.enabled && isolation.getValue()) {\r\n (completeData as any)[isolation.fieldName] = isolation.getValue();\r\n }\r\n \r\n await adapter.updateDoc(docRef, completeData);\r\n \r\n // Limpa cache relacionado\r\n if (memoryCache) {\r\n memoryCache.delete(getCacheKey('get', id));\r\n }\r\n } catch (error) {\r\n console.error(`Error updating document ${id}:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n const remove = async (id: string): Promise<void> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"delete\");\r\n \r\n const docRef = await resolveDocument(id);\r\n await adapter.deleteDoc(docRef);\r\n \r\n // Limpa cache relacionado\r\n if (memoryCache) {\r\n memoryCache.delete(getCacheKey('get', id));\r\n }\r\n } catch (error) {\r\n console.error(`Error removing document ${id}:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n const batch = async (\r\n docs: { id?: string; data: T; operation: \"add\" | \"update\" | \"delete\" }[]\r\n ): Promise<void> => {\r\n try {\r\n // ✨ Verifica autorização para cada operação\r\n const operations = new Set(docs.map(d => d.operation));\r\n operations.forEach(op => {\r\n if (op === \"delete\") checkAuthorization(\"delete\");\r\n else checkAuthorization(\"write\");\r\n });\r\n \r\n const batch = adapter.writeBatch(db);\r\n \r\n for (const { id, data, operation } of docs) {\r\n const docId = id || generateId?.() || adapter.generateId();\r\n const docRef = adapter.doc(db, collectionName, docId);\r\n \r\n // Adiciona dados de isolamento se necessário\r\n const completeData = { ...data, id: docId };\r\n if (isolation?.enabled && isolation.getValue()) {\r\n (completeData as any)[isolation.fieldName] = isolation.getValue();\r\n }\r\n \r\n const modelData = model(completeData);\r\n \r\n switch (operation) {\r\n case \"add\":\r\n adapter.batchSet(batch, docRef, modelData);\r\n break;\r\n case \"update\":\r\n adapter.batchUpdate(batch, docRef, completeData);\r\n break;\r\n case \"delete\":\r\n adapter.batchDelete(batch, docRef);\r\n break;\r\n }\r\n }\r\n \r\n await adapter.batchCommit(batch);\r\n \r\n // Limpa cache\r\n if (memoryCache) {\r\n memoryCache.clear();\r\n }\r\n } catch (error) {\r\n console.error(`Error in batch operation:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n return {\r\n get,\r\n getAll,\r\n listen,\r\n add,\r\n update,\r\n remove,\r\n batch,\r\n // Utilitários\r\n clearCache: () => memoryCache?.clear(),\r\n getCacheSize: () => memoryCache?.cache.size || 0,\r\n };\r\n}\r\n\r\n// Detecção automática de versão do Firebase\r\nexport type FirebaseVersion = 'v8' | 'v9-modular' | 'unknown';\r\n\r\nexport const detectFirebaseVersion = (firebaseInstance: any): FirebaseVersion => {\r\n try {\r\n // Caso 1: Firebase v9+ modular - instância com funções como getFirestore\r\n if (firebaseInstance && typeof firebaseInstance.getFirestore === 'function') {\r\n return 'v9-modular';\r\n }\r\n \r\n // Caso 2: Firebase v9+ modular - objeto com funções do Firestore v9\r\n if (firebaseInstance && \r\n typeof firebaseInstance.collection === 'function' && \r\n typeof firebaseInstance.doc === 'function' &&\r\n typeof firebaseInstance.query === 'function' &&\r\n typeof firebaseInstance.where === 'function') {\r\n return 'v9-modular';\r\n }\r\n \r\n // Caso 3: Firebase v8 - instância principal com firestore()\r\n if (firebaseInstance && typeof firebaseInstance.firestore === 'function') {\r\n return 'v8';\r\n }\r\n \r\n // Caso 4: Firebase v8 - instância direta do Firestore v8\r\n if (firebaseInstance && \r\n typeof firebaseInstance.collection === 'function' && \r\n typeof firebaseInstance.doc === 'function' &&\r\n typeof firebaseInstance.batch === 'function') {\r\n return 'v8';\r\n }\r\n \r\n // Caso 5: Verifica se é um namespace v9+ (ex: firebase/app)\r\n if (firebaseInstance && \r\n firebaseInstance.initializeApp && \r\n typeof firebaseInstance.initializeApp === 'function') {\r\n // Se tem initializeApp, provavelmente é v9+\r\n return 'v9-modular';\r\n }\r\n \r\n return 'unknown';\r\n } catch (error) {\r\n console.warn('Erro ao detectar versão do Firebase:', error);\r\n return 'unknown';\r\n }\r\n};\r\n\r\n// Adaptador para Firebase v9+ modular\r\nexport const createV9ModularAdapter = <T = any>(firebaseModular: any): FirebaseAdapter<T> => {\r\n return {\r\n collection: (db, path) => firebaseModular.collection(db, path),\r\n doc: (db, path, ...segments) => firebaseModular.doc(db, path, ...segments),\r\n query: (collection, ...constraints) => firebaseModular.query(collection, ...constraints),\r\n where: (field, operator, value) => firebaseModular.where(field, operator, value),\r\n orderBy: (field, direction = 'asc') => firebaseModular.orderBy(field, direction),\r\n limit: (count) => firebaseModular.limit(count),\r\n startAfter: (...fieldValues) => firebaseModular.startAfter(...fieldValues),\r\n startAt: (...fieldValues) => firebaseModular.startAt(...fieldValues),\r\n endBefore: (...fieldValues) => firebaseModular.endBefore(...fieldValues),\r\n endAt: (...fieldValues) => firebaseModular.endAt(...fieldValues),\r\n getDocs: firebaseModular.getDocs,\r\n getDoc: firebaseModular.getDoc,\r\n setDoc: firebaseModular.setDoc,\r\n updateDoc: firebaseModular.updateDoc,\r\n deleteDoc: firebaseModular.deleteDoc,\r\n writeBatch: firebaseModular.writeBatch,\r\n batchSet: (batch, docRef, data) => batch.set(docRef, data),\r\n batchUpdate: (batch, docRef, data) => batch.update(docRef, data),\r\n batchDelete: (batch, docRef) => batch.delete(docRef),\r\n batchCommit: (batch) => batch.commit(),\r\n onSnapshot: firebaseModular.onSnapshot,\r\n generateId: () => generateId(),\r\n };\r\n};\r\n\r\n// Adaptador para Firebase v8 legacy\r\nexport const createV8Adapter = <T = any>(): FirebaseAdapter<T> => {\r\n return {\r\n collection: (db, path) => (db as any).collection(path),\r\n doc: (db, path, ...segments) => (db as any).collection(path).doc(segments.join('/')),\r\n query: (collection, ...constraints) => {\r\n let query = collection;\r\n constraints.forEach(constraint => {\r\n if (constraint.type === 'where') {\r\n query = (query as any).where(constraint.field, constraint.opStr, constraint.value);\r\n } else if (constraint.type === 'orderBy') {\r\n query = (query as any).orderBy(constraint.field, constraint.direction);\r\n } else if (constraint.type === 'limit') {\r\n query = (query as any).limit(constraint.limit);\r\n } else if (constraint.type === 'startAfter') {\r\n query = (query as any).startAfter(...constraint.values);\r\n } else if (constraint.type === 'startAt') {\r\n query = (query as any).startAt(...constraint.values);\r\n } else if (constraint.type === 'endBefore') {\r\n query = (query as any).endBefore(...constraint.values);\r\n } else if (constraint.type === 'endAt') {\r\n query = (query as any).endAt(...constraint.values);\r\n }\r\n });\r\n return query;\r\n },\r\n where: (field, operator, value) => ({ type: 'where', field, opStr: operator, value }),\r\n orderBy: (field, direction = 'asc') => ({ type: 'orderBy', field, direction }),\r\n limit: (count) => ({ type: 'limit', limit: count }),\r\n startAfter: (...fieldValues) => ({ type: 'startAfter', values: fieldValues }),\r\n startAt: (...fieldValues) => ({ type: 'startAt', values: fieldValues }),\r\n endBefore: (...fieldValues) => ({ type: 'endBefore', values: fieldValues }),\r\n endAt: (...fieldValues) => ({ type: 'endAt', values: fieldValues }),\r\n getDocs: (query) => (query as any).get(),\r\n getDoc: (docRef) => (docRef as any).get(),\r\n setDoc: (docRef, data, options) => (docRef as any).set(data, options),\r\n updateDoc: (docRef, data) => (docRef as any).update(data),\r\n deleteDoc: (docRef) => (docRef as any).delete(),\r\n writeBatch: (db) => (db as any).batch(),\r\n batchSet: (batch, docRef, data) => (batch as any).set(docRef, data),\r\n batchUpdate: (batch, docRef, data) => (batch as any).update(docRef, data),\r\n batchDelete: (batch, docRef) => (batch as any).delete(docRef),\r\n batchCommit: (batch) => (batch as any).commit(),\r\n onSnapshot: (query, callback) => (query as any).onSnapshot(callback),\r\n generateId: () => generateId(),\r\n };\r\n};\r\n\r\n// Função principal que detecta automaticamente a versão e cria o adaptador apropriado\r\nexport const createWebAdapter = <T = any>(firebaseInstance: any): FirebaseAdapter<T> => {\r\n const version = detectFirebaseVersion(firebaseInstance);\r\n \r\n console.log(`🔥 Firebase version detected: ${version}`);\r\n \r\n switch (version) {\r\n case 'v9-modular':\r\n return createV9ModularAdapter(firebaseInstance);\r\n \r\n case 'v8':\r\n return createV8Adapter();\r\n \r\n default:\r\n console.warn('⚠️ Firebase version not detected, falling back to v8 adapter');\r\n return createV8Adapter();\r\n }\r\n};\r\n\r\n// Função utilitária para criar repositório com detecção automática de versão\r\nexport const createAutoRepo = <T extends { id: string }>(\r\n firebaseInstance: any,\r\n db: Firestore,\r\n config: RepoConfig<T>\r\n): GenericRepo<T> => {\r\n const adapter = createWebAdapter(firebaseInstance);\r\n return createGenericRepo(db, adapter, config);\r\n};\r\n\r\nexport const createReactNativeAdapter = (): FirebaseAdapter => {\r\n // Implementação para React Native Firebase\r\n \r\n return {\r\n collection: (db, path) => db.collection(path),\r\n doc: (db, path, ...segments) => db.collection(path).doc(segments.join('/')),\r\n query: (collection, ...constraints) => {\r\n let query = collection;\r\n constraints.forEach(constraint => {\r\n // Adaptar constraints para React Native Firebase\r\n if (constraint.type === 'where') {\r\n query = query.where(constraint.field, constraint.opStr, constraint.value);\r\n } else if (constraint.type === 'orderBy') {\r\n query = query.orderBy(constraint.field, constraint.direction);\r\n } else if (constraint.type === 'limit') {\r\n query = query.limit(constraint.limit);\r\n } else if (constraint.type === 'startAfter') {\r\n query = query.startAfter(...constraint.values);\r\n } else if (constraint.type === 'startAt') {\r\n query = query.startAt(...constraint.values);\r\n } else if (constraint.type === 'endBefore') {\r\n query = query.endBefore(...constraint.values);\r\n } else if (constraint.type === 'endAt') {\r\n query = query.endAt(...constraint.values);\r\n }\r\n });\r\n return query;\r\n },\r\n where: (field, operator, value) => ({ type: 'where', field, opStr: operator, value }),\r\n orderBy: (field, direction = 'asc') => ({ type: 'orderBy', field, direction }),\r\n limit: (count) => ({ type: 'limit', limit: count }),\r\n startAfter: (...fieldValues) => ({ type: 'startAfter', values: fieldValues }),\r\n startAt: (...fieldValues) => ({ type: 'startAt', values: fieldValues }),\r\n endBefore: (...fieldValues) => ({ type: 'endBefore', values: fieldValues }),\r\n endAt: (...fieldValues) => ({ type: 'endAt', values: fieldValues }),\r\n getDocs: (query) => query.get(),\r\n getDoc: (docRef) => docRef.get(),\r\n setDoc: (docRef, data, options) => docRef.set(data, options),\r\n updateDoc: (docRef, data) => docRef.update(data),\r\n deleteDoc: (docRef) => docRef.delete(),\r\n writeBatch: (db) => db.batch(),\r\n batchSet: (batch, docRef, data) => batch.set(docRef, data),\r\n batchUpdate: (batch, docRef, data) => batch.update(docRef, data),\r\n batchDelete: (batch, docRef) => batch.delete(docRef),\r\n batchCommit: (batch) => batch.commit(),\r\n onSnapshot: (query, callback) => query.onSnapshot(callback),\r\n generateId: () => generateId(),\r\n };\r\n};\r\n","/**\r\n * FACTORY PARA CRIAR TODOS OS REPOSITÓRIOS\r\n *\r\n * Este arquivo cria automaticamente todos os repositórios configurados\r\n * com type-safety completo, cache, isolamento por bancaId, etc.\r\n */\r\n\r\nimport {\r\n createGenericRepo,\r\n createWebAdapter,\r\n createReactNativeAdapter,\r\n type FirebaseAdapter,\r\n type Firestore,\r\n type GenericRepo,\r\n type RepoConfig,\r\n type AuthorizationConfig,\r\n type OperationType,\r\n} from \"./generic\";\r\n\r\nimport {\r\n UserModel,\r\n BancaModel,\r\n ExtracaoModel,\r\n ResultadoModel,\r\n MessageModel,\r\n RouteModel,\r\n ValueGameModel,\r\n LimitGameModel,\r\n GameModel,\r\n NumberModel,\r\n DescargaModel,\r\n PremiacaoModel,\r\n PremiacaoAssociacaoModel,\r\n PDFModel,\r\n AuditLogModel,\r\n EnvioDescargaModel,\r\n DeviceModel,\r\n} from \"../models\";\r\n\r\nimport type {\r\n TypeUser,\r\n TypeBanca,\r\n TypeExtracao,\r\n TypeResultado,\r\n TypeMessage,\r\n TypeRoute,\r\n TypeValueGame,\r\n TypeLimitGame,\r\n TypeGame,\r\n TypeNumero,\r\n TypeDescarga,\r\n TypePremiacao,\r\n TypePremiacaoAssociacao,\r\n TypePDFDescargas,\r\n TypeAuditLog,\r\n TypeEnvioDescarga,\r\n TypeDevice,\r\n} from \"../types\";\r\nimport { collections } from \"./collections\";\r\n\r\n// ============================================================================\r\n// TIPOS PARA CONFIGURAÇÃO\r\n// ============================================================================\r\n\r\nexport type RepoFactoryConfig = {\r\n db: Firestore;\r\n adapter: FirebaseAdapter;\r\n getBancaId?: () => string | undefined; // Função para obter bancaId atual\r\n getUserRole?: () => string | undefined; // ✨ Função para obter role do usuário atual\r\n cacheConfig?: {\r\n enabled: boolean;\r\n ttl?: number;\r\n maxSize?: number;\r\n };\r\n authorizationConfigs?: { // ✨ Configurações de autorização por coleção\r\n [collectionName in keyof typeof collections]: AuthorizationConfig;\r\n };\r\n onUnauthorized?: (operation: OperationType, userRole?: string, collection?: string) => void; // ✨ Callback global para não autorizado\r\n};\r\n\r\nexport type RepoCollections = {\r\n users_associacao: GenericRepo<TypeUser>;\r\n users: GenericRepo<TypeUser>;\r\n bancas: GenericRepo<TypeBanca>;\r\n extracoes: GenericRepo<TypeExtracao>;\r\n resultados: GenericRepo<TypeResultado>;\r\n mensagens: GenericRepo<TypeMessage>;\r\n rotas: GenericRepo<TypeRoute>;\r\n valores_jogos: GenericRepo<TypeValueGame>;\r\n limites_jogos: GenericRepo<TypeLimitGame>;\r\n pules: GenericRepo<TypeGame>;\r\n numeros: GenericRepo<TypeNumero>;\r\n numeros_enviados: GenericRepo<TypeNumero>;\r\n descargas: GenericRepo<TypeDescarga>;\r\n descargas_associacao: GenericRepo<TypeDescarga>;\r\n premiacoes: GenericRepo<TypePremiacao>;\r\n premiacoes_associacao: GenericRepo<TypePremiacaoAssociacao>;\r\n pdf_descargas: GenericRepo<TypePDFDescargas>;\r\n pdf_descargas_associacao: GenericRepo<TypePDFDescargas>;\r\n auditLogs: GenericRepo<TypeAuditLog>;\r\n envios_descarga: GenericRepo<TypeEnvioDescarga>;\r\n dispositivos: GenericRepo<TypeDevice>;\r\n};\r\n\r\n// ============================================================================\r\n// CONFIGURAÇÕES DE CADA COLEÇÃO\r\n// ============================================================================\r\n\r\nconst createConfigs = (\r\n getBancaId?: () => string | undefined,\r\n cacheConfig: {\r\n enabled: boolean;\r\n ttl?: number;\r\n maxSize?: number;\r\n } = { enabled: true, ttl: 300000, maxSize: 1000 },\r\n authorizationConfigs?: { [collectionName in keyof typeof collections]: AuthorizationConfig }\r\n) => {\r\n // Helper para isolamento por bancaId\r\n const withBancaIsolation = <T extends { id: string; bancaId?: string }>(\r\n config: Omit<RepoConfig<T>, \"isolation\" | \"cache\" | \"authorization\">\r\n ): RepoConfig<T> => ({\r\n ...config,\r\n isolation: getBancaId\r\n ? {\r\n enabled: true,\r\n fieldName: \"bancaId\" as keyof T,\r\n getValue: getBancaId as any,\r\n }\r\n : undefined,\r\n cache: cacheConfig,\r\n authorization: authorizationConfigs?.[config.collectionName],\r\n });\r\n\r\n // Helper para coleções sem isolamento\r\n const withoutIsolation = <T extends { id: string }>(\r\n config: Omit<RepoConfig<T>, \"isolation\" | \"cache\" | \"authorization\">\r\n ): RepoConfig<T> => ({\r\n ...config,\r\n cache: cacheConfig,\r\n authorization: authorizationConfigs?.[config.collectionName as keyof typeof collections],\r\n });\r\n\r\n return {\r\n\r\n // ========================================================================\r\n // USUÁRIOS - Com isolamento por bancaId\r\n // ========================================================================\r\n users_associacao: withoutIsolation<TypeUser>({\r\n collectionName: \"users\",\r\n model: UserModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // USUÁRIOS da banca - Com isolamento por bancaId\r\n // ========================================================================\r\n users: withBancaIsolation<TypeUser>({\r\n collectionName: \"users\",\r\n model: UserModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // BANCAS - Sem isolamento (dados globais)\r\n // ========================================================================\r\n bancas: withoutIsolation<TypeBanca>({\r\n collectionName: \"bancas\",\r\n model: BancaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // EXTRAÇÕES - Com isolamento por bancaId\r\n // ========================================================================\r\n extracoes: withBancaIsolation<TypeExtracao>({\r\n collectionName: \"extracoes\",\r\n model: ExtracaoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // RESULTADOS - Com isolamento por bancaId\r\n // ========================================================================\r\n resultados: withBancaIsolation<TypeResultado>({\r\n collectionName: \"resultados\",\r\n model: ResultadoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // MENSAGENS - Com isolamento por bancaId\r\n // ========================================================================\r\n mensagens: withBancaIsolation<TypeMessage>({\r\n collectionName: \"mensagens\",\r\n model: MessageModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // ROTAS - Com isolamento por bancaId\r\n // ========================================================================\r\n rotas: withBancaIsolation<TypeRoute>({\r\n collectionName: \"rotas\",\r\n model: RouteModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // VALORES DE JOGOS - Com isolamento por bancaId\r\n // ========================================================================\r\n valores_jogos: withBancaIsolation<TypeValueGame>({\r\n collectionName: \"valores_jogos\",\r\n model: ValueGameModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // LIMITES DE JOGOS - Com isolamento por bancaId\r\n // ========================================================================\r\n limites_jogos: withBancaIsolation<TypeLimitGame>({\r\n collectionName: \"limites_jogos\",\r\n model: LimitGameModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PULES (JOGOS) - Com isolamento por bancaId\r\n // ========================================================================\r\n pules: withBancaIsolation<TypeGame>({\r\n collectionName: \"pules\",\r\n model: GameModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // NÚMEROS - Com isolamento por bancaId\r\n // ========================================================================\r\n numeros: withBancaIsolation<TypeNumero>({\r\n collectionName: \"numeros\",\r\n model: NumberModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // NÚMEROS ENVIADOS - Com isolamento por bancaId\r\n // ========================================================================\r\n numeros_enviados: withBancaIsolation<TypeNumero>({\r\n collectionName: \"numeros_enviados\",\r\n model: NumberModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // DESCARGAS - Com isolamento por bancaId\r\n // ========================================================================\r\n descargas: withBancaIsolation<TypeDescarga>({\r\n collectionName: \"descargas\",\r\n model: DescargaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // DESCARGAS ASSOCIAÇÃO - Com isolamento por bancaId\r\n // ========================================================================\r\n descargas_associacao: withBancaIsolation<TypeDescarga>({\r\n collectionName: \"descargas_associacao\",\r\n model: DescargaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PREMIAÇÕES - Com isolamento por bancaId\r\n // ========================================================================\r\n premiacoes: withBancaIsolation<TypePremiacao>({\r\n collectionName: \"premiacoes\",\r\n model: PremiacaoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PREMIAÇÕES ASSOCIAÇÃO - Com isolamento por bancaId\r\n // ========================================================================\r\n premiacoes_associacao: withBancaIsolation<TypePremiacaoAssociacao>({\r\n collectionName: \"premiacoes_associacao\",\r\n model: PremiacaoAssociacaoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PDF DESCARGAS - Com isolamento por bancaId\r\n // ========================================================================\r\n pdf_descargas: withBancaIsolation<TypePDFDescargas>({\r\n collectionName: \"pdf_descargas\",\r\n model: PDFModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PDF DESCARGAS ASSOCIAÇÃO - Com isolamento por bancaId\r\n // ========================================================================\r\n pdf_descargas_associacao: withBancaIsolation<TypePDFDescargas>({\r\n collectionName: \"pdf_descargas_associacao\",\r\n model: PDFModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // AUDIT LOGS - Com isolamento por bancaId\r\n // ========================================================================\r\n auditLogs: withBancaIsolation<TypeAuditLog>({\r\n collectionName: \"auditLogs\",\r\n model: AuditLogModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // ENVIOS DESCARGA - Com isolamento por bancaId\r\n // ========================================================================\r\n envios_descarga: withBancaIsolation<TypeEnvioDescarga>({\r\n collectionName: \"envios_descarga\",\r\n model: EnvioDescargaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // DISPOSITIVOS - Com isolamento por bancaId\r\n // ========================================================================\r\n dispositivos: withBancaIsolation<TypeDevice>({\r\n collectionName: \"dispositivos\",\r\n model: DeviceModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// FACTORY PRINCIPAL\r\n// ============================================================================\r\n\r\nexport function createRepoFactory(config: RepoFactoryConfig): RepoCollections {\r\n const { db, adapter, getBancaId, cacheConfig, authorizationConfigs } = config;\r\n const configs = createConfigs(getBancaId, cacheConfig, authorizationConfigs);\r\n\r\n return {\r\n users_associacao: createGenericRepo(db, adapter, configs.users_associacao),\r\n users: createGenericRepo(db, adapter, configs.users),\r\n bancas: createGenericRepo(db, adapter, configs.bancas),\r\n extracoes: createGenericRepo(db, adapter, configs.extracoes),\r\n resultados: createGenericRepo(db, adapter, configs.resultados),\r\n mensagens: createGenericRepo(db, adapter, configs.mensagens),\r\n rotas: createGenericRepo(db, adapter, configs.rotas),\r\n valores_jogos: createGenericRepo(db, adapter, configs.valores_jogos),\r\n limites_jogos: createGenericRepo(db, adapter, configs.limites_jogos),\r\n pules: createGenericRepo(db, adapter, configs.pules),\r\n numeros: createGenericRepo(db, adapter, configs.numeros),\r\n numeros_enviados: createGenericRepo(db, adapter, configs.numeros_enviados),\r\n descargas: createGenericRepo(db, adapter, configs.descargas),\r\n descargas_associacao: createGenericRepo(\r\n db,\r\n adapter,\r\n configs.descargas_associacao\r\n ),\r\n premiacoes: createGenericRepo(db, adapter, configs.premiacoes),\r\n premiacoes_associacao: createGenericRepo(\r\n db,\r\n adapter,\r\n configs.premiacoes_associacao\r\n ),\r\n pdf_descargas: createGenericRepo(db, adapter, configs.pdf_descargas),\r\n pdf_descargas_associacao: createGenericRepo(\r\n db,\r\n adapter,\r\n configs.pdf_descargas_associacao\r\n ),\r\n auditLogs: createGenericRepo(db, adapter, configs.auditLogs),\r\n envios_descarga: createGenericRepo(db, adapter, configs.envios_descarga),\r\n dispositivos: createGenericRepo(db, adapter, configs.dispositivos),\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS ESPECÍFICOS PARA WEB E REACT NATIVE\r\n// ============================================================================\r\n\r\n/**\r\n * Cria todos os repositórios para Firebase Web SDK\r\n *\r\n * @example\r\n * import { getFirestore, collection, doc, query, where } from 'firebase/firestore';\r\n * import { createWebRepoFactory } from '@cristian.aragao/milharis-core';\r\n *\r\n * const db = getFirestore();\r\n * const firebaseInstance = { collection, doc, query, where, getDocs, getDoc, setDoc, updateDoc, deleteDoc, writeBatch, onSnapshot };\r\n * const repo = createWebRepoFactory({\r\n * db,\r\n * firebaseInstance,\r\n * getBancaId: () => getCurrentUser()?.bancaId\r\n * });\r\n *\r\n * // Usar com type-safety completo!\r\n * const users = await repo.users.getAll({\r\n * where: [{ field: \"role\", operator: \"==\", value: \"admin\" }]\r\n * });\r\n */\r\nexport function createWebRepoFactory(\r\n config: Omit<RepoFactoryConfig, \"adapter\"> & { firebaseInstance: any }\r\n): RepoCollections {\r\n return createRepoFactory({\r\n ...config,\r\n adapter: createWebAdapter(config.firebaseInstance),\r\n });\r\n}\r\n\r\n/**\r\n * Cria todos os repositórios para React Native Firebase\r\n *\r\n * @example\r\n * import firestore from '@react-native-firebase/firestore';\r\n * import { createReactNativeRepoFactory } from '@cristian.aragao/milharis-core';\r\n *\r\n * const repo = createReactNativeRepoFactory({\r\n * db: firestore(),\r\n * getBancaId: () => getCurrentUser()?.bancaId\r\n * });\r\n *\r\n * // Usar com type-safety completo!\r\n * const numeros = await repo.numeros.getAll({\r\n * where: [{ field: \"tipo_jogo\", operator: \"==\", value: \"milhar\" }]\r\n * });\r\n */\r\nexport function createReactNativeRepoFactory(\r\n config: Omit<RepoFactoryConfig, \"adapter\">\r\n): RepoCollections {\r\n return createRepoFactory({\r\n ...config,\r\n adapter: createReactNativeAdapter(),\r\n });\r\n}\r\n"],"mappings":"4FAAO,IAAMA,GAAY,CAAC,GAAI,GAAI,EAAE,ECG7B,IAAMC,EAAQ,CACnB,OAAU,CACR,GAAI,SACJ,MAAO,SACP,MAAO,IACP,OAAQ,OACR,cAAe,OACf,QAAS,GACT,IAAK,EACL,MAAO,EACP,YAAa,CACf,EACA,QAAW,CACT,GAAI,UACJ,MAAO,UACP,MAAO,IACP,OAAQ,MACR,cAAe,MACf,QAAS,GACT,IAAK,EACL,MAAO,EACP,YAAa,CACf,EACA,OAAU,CACR,GAAI,SACJ,MAAO,SACP,MAAO,IACP,OAAQ,KACR,cAAe,KACf,QAAS,GACT,IAAK,EACL,MAAO,EACP,YAAa,CACf,EACA,MAAS,CACP,GAAI,QACJ,MAAO,QACP,MAAO,IACP,IAAK,GACL,OAAQ,KACR,cAAe,KACf,QAAS,GACT,MAAO,EACP,YAAa,CACf,EACA,eAAgB,CACd,GAAI,eACJ,MAAO,kBACP,MAAO,KACP,OAAQ,WACR,cAAe,SACf,QAAS,GACT,IAAK,EACL,MAAO,EACP,YAAa,CACf,EACA,cAAe,CACb,GAAI,cACJ,MAAO,iBACP,MAAO,KACP,IAAK,GACL,OAAQ,WACR,cAAe,SACf,QAAS,GACT,MAAO,EACP,YAAa,CACf,EACA,eAAgB,CACd,GAAI,eACJ,MAAO,kBACP,MAAO,KACP,OAAQ,QACR,cAAe,OACf,QAAS,GACT,IAAK,EACL,MAAO,EACP,YAAa,CACf,EACA,cAAe,CACb,GAAI,cACJ,MAAO,iBACP,MAAO,KACP,IAAK,GACL,OAAQ,QACR,cAAe,OACf,QAAS,GACT,MAAO,EACP,YAAa,CACf,EACA,mBAAoB,CAClB,GAAI,mBACJ,MAAO,mBACP,MAAO,KACP,OAAQ,OACR,cAAe,OACf,QAAS,GACT,IAAK,EACL,MAAO,EACP,YAAa,CACf,EACA,oBAAqB,CACnB,GAAI,oBACJ,MAAO,oBACP,MAAO,KACP,OAAQ,MACR,cAAe,MACf,QAAS,GACT,IAAK,EACL,MAAO,EACP,YAAa,CACf,EACA,iBAAkB,CAChB,GAAI,iBACJ,MAAO,iBACP,MAAO,KACP,OAAQ,OACR,cAAe,OACf,QAAS,GACT,IAAK,EACL,MAAO,EACP,YAAa,CACf,EACA,qCAAsC,CACpC,GAAI,qCACJ,MAAO,8BACP,MAAO,MACP,OAAQ,OACR,cAAe,OACf,QAAS,GACT,IAAK,EACL,MAAO,EACP,YAAa,CACf,EACA,gBAAiB,CACf,GAAI,gBACJ,MAAO,kBACP,MAAO,KACP,OAAQ,OACR,cAAe,OACf,QAAS,GACT,IAAK,EACL,MAAO,EACP,YAAa,CACf,EACA,wBAAyB,CACvB,GAAI,wBACJ,MAAO,2BACP,MAAO,MACP,OAAQ,OACR,cAAe,OACf,QAAS,GACT,IAAK,EACL,MAAO,EACP,YAAa,CACf,EACA,iBAAkB,CAChB,GAAI,iBACJ,MAAO,iBACP,MAAO,KACP,OAAQ,MACR,cAAe,MACf,QAAS,GACT,IAAK,EACL,MAAO,EACP,YAAa,CACf,CACF,ECzKA,IAAMC,EAAS,CACb,KAAM,WACN,KAAM,WACN,KAAM,QACN,KAAM,YACN,KAAM,WACN,KAAM,QACN,KAAM,WACN,KAAM,SACN,KAAM,QACN,GAAM,SACN,GAAM,SACN,GAAM,WACN,GAAM,OACN,GAAM,OACN,GAAM,YACN,GAAM,UACN,GAAM,SACN,GAAM,QACN,GAAM,WACN,GAAM,OACN,GAAM,QACN,GAAM,QACN,GAAM,OACN,GAAM,QACN,GAAM,MACR,EAEaC,GAAgB,CAC3B,KAAM,CAAE,MAAO,KAAM,MAAOD,EAAO,IAAI,CAAE,EACzC,KAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,KAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,KAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,KAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,KAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,KAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,KAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,KAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE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AClC,IAAK,CAAE,MAAO,MAAO,MAAO,KAAM,EAKlC,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAK5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,CAE9B,EC9GO,IAAMC,GAAgB,CACzB,UAAa,CACT,GAAM,YACN,MAAS,4BACT,MAAS,QACb,EACA,SAAY,CACR,GAAM,WACN,MAAS,WACT,MAAS,OACb,EACA,UAAa,CACT,GAAM,YACN,MAAS,YACT,MAAS,KACb,CACJ,EChBO,IAAMC,EAAU,CACnB,EAAK,CACD,GAAI,IACJ,MAAO,EACP,MAAO,kBACP,WAAY,OAChB,EACA,EAAK,CACD,GAAI,IACJ,MAAO,EACP,MAAO,kBACP,WAAY,OAChB,EACA,EAAK,CACD,GAAI,IACJ,MAAO,EACP,MAAO,kBACP,WAAY,OAChB,EACA,EAAK,CACD,GAAI,IACJ,MAAO,EACP,MAAO,kBACP,WAAY,OAChB,EACA,EAAK,CACD,GAAI,IACJ,MAAO,EACP,MAAO,kBACP,WAAY,OAChB,EACA,MAAO,CACH,GAAI,MACJ,MAAO,EACP,MAAO,2BACP,WAAY,gBAChB,CACJ,ECnCO,IAAMC,GAAmB,CAC9B,CAACC,EAAM,OAAO,EAAE,EAAG,CACjB,GAAIA,EAAM,OAAO,GACjB,MAAOA,EAAM,OAAO,MACpB,MAAO,CACT,EACA,CAACA,EAAM,QAAQ,EAAE,EAAG,CAClB,GAAIA,EAAM,QAAQ,GAClB,MAAOA,EAAM,QAAQ,MACrB,MAAO,CACT,EACA,CAACA,EAAM,OAAO,EAAE,EAAG,CACjB,GAAIA,EAAM,OAAO,GACjB,MAAOA,EAAM,OAAO,MACpB,MAAO,CACT,EACA,CAACA,EAAM,MAAM,EAAE,EAAG,CAChB,GAAIA,EAAM,MAAM,GAChB,MAAOA,EAAM,MAAM,MACnB,MAAO,CACT,EACA,CAACA,EAAM,cAAc,EAAE,EAAE,EAAG,CAC1B,GAAIA,EAAM,cAAc,EAAE,GAC1B,MAAOA,EAAM,cAAc,EAAE,MAC7B,MAAO,CACT,EACA,CAACA,EAAM,aAAa,EAAE,EAAE,EAAG,CACzB,GAAIA,EAAM,aAAa,EAAE,GACzB,MAAOA,EAAM,aAAa,EAAE,MAC5B,MAAO,CACT,EACA,CAACA,EAAM,cAAc,EAAE,EAAE,EAAG,CAC1B,GAAIA,EAAM,cAAc,EAAE,GAC1B,MAAOA,EAAM,cAAc,EAAE,MAC7B,MAAO,CACT,EACA,CAACA,EAAM,aAAa,EAAE,EAAE,EAAG,CACzB,GAAIA,EAAM,aAAa,EAAE,GACzB,MAAOA,EAAM,aAAa,EAAE,MAC5B,MAAO,CACT,EACA,SAAU,CACR,GAAI,WACJ,MAAO,WACP,MAAO,CACT,CACF,EChCO,IAAMC,EACXC,IAC+B,CAC/B,GAAIA,GAAK,IAAM,SACf,WAAYA,GAAK,YAAc,SAC/B,KAAMA,GAAK,MAAQ,cACnB,KAAMA,GAAK,MAAQ,sCACnB,MAAOA,GAAK,OAAS,QACvB,GCxBA,IAAAC,GAAA,GAAAC,EAAAD,GAAA,WAAAE,EAAA,oBAAAC,GAAA,iBAAAC,EAAA,UAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,wBAAAC,GAAA,+BAAAC,GAAA,eAAAC,EAAA,uBAAAC,GAAA,kBAAAC,GAAA,qBAAAC,GAAA,gBAAAC,GAAA,oBAAAC,GAAA,cAAAC,EAAA,iBAAAC,EAAA,4BAAAC,GAAA,cAAAC,GAAA,qBAAAC,GAAA,4BAAAC,GAAA,yBAAAC,EAAA,mBAAAC,GAAA,mBAAAC,ICAA,OAAOC,OAAe,aASf,IAAMC,EAAYC,GACxBF,GAAUE,CAAI,ECVf,OAAS,WAAAC,OAAe,WASjB,IAAMC,EAAgBC,GAAwB,CACnD,GAAI,CAACA,GAAQ,CAACF,GAAQE,CAAI,EAAG,MAAO,GAEpC,IAAMC,EAAOD,EAAK,YAAY,EACxBE,EAAQ,OAAOF,EAAK,SAAS,EAAI,CAAC,EAAE,SAAS,EAAG,GAAG,EACnDG,EAAM,OAAOH,EAAK,QAAQ,CAAC,EAAE,SAAS,EAAG,GAAG,EAC5CI,EAAO,OAAOJ,EAAK,SAAS,CAAC,EAAE,SAAS,EAAG,GAAG,EAC9CK,EAAS,OAAOL,EAAK,WAAW,CAAC,EAAE,SAAS,EAAG,GAAG,EAClDM,EAAS,OAAON,EAAK,WAAW,CAAC,EAAE,SAAS,EAAG,GAAG,EAExD,MAAO,CAAO,GAAGC,CAAI,GAAGC,CAAK,GAAGC,CAAG,GAAGC,CAAI,GAAGC,CAAM,GAAGC,CAAM,EAC9D,ECpBA,OAAS,SAAAC,GAAO,WAAAC,OAAe,WCA/B,OAAOC,OAAY,kBAEZ,IAAMC,EAAuB,IAAY,CAE9C,IAAMC,EAASF,GACZ,GAAG,IAAI,KAAQ,mBAAmB,EAClC,OAAO,yBAAyB,EAE7B,CAACG,EAAKC,EAAOC,EAAMC,EAAMC,EAASC,EAASC,CAAY,EAC3DP,EAAO,MAAM,GAAG,EAElB,OAAO,IAAI,KACT,OAAOG,CAAI,EACX,OAAOD,CAAK,EAAI,EAChB,OAAOD,CAAG,EACV,OAAOG,CAAI,EACX,OAAOC,CAAO,EACd,OAAOC,CAAO,EACd,OAAOC,CAAY,CACrB,CACF,EDVO,IAAMC,EAAgBC,GAAsC,CACjE,GAAI,CAACA,EAAQ,OAEb,IAAMC,EAAMD,EAAO,SAAS,EAEtBE,EAAOD,EAAI,MAAM,EAAG,CAAC,EACrBE,EAAQF,EAAI,MAAM,EAAG,CAAC,EACtBG,EAAMH,EAAI,MAAM,EAAG,CAAC,EACpBI,EAAOJ,EAAI,MAAM,EAAG,EAAE,EACtBK,EAASL,EAAI,MAAM,GAAI,EAAE,EACzBM,EAASN,EAAI,MAAM,GAAI,EAAE,EAEzBO,EAAa,GAAGN,CAAI,IAAIC,CAAK,IAAIC,CAAG,IAAIC,CAAI,IAAIC,CAAM,IAAIC,CAAM,GAEhEE,EAAUC,EAAqB,EAE/BC,EAAOC,GAAMJ,EAAY,sBAAuBC,CAAO,EAE7D,OAAOI,GAAQF,CAAI,EAAIA,EAAO,MAChC,EEZO,IAAMG,GAAkB,CAACC,EAAeC,IAA0B,CACvE,IAAMC,EAAaC,EAAaH,CAAK,EAC/BI,EAAaD,EAAaF,CAAK,EAErC,GAAI,CAACC,GAAc,CAACE,EAAY,MAAO,GAEvC,IAAMC,EAAOH,EAAW,YAAY,EAC9BI,EAAQJ,EAAW,SAAS,EAC5BK,EAAML,EAAW,QAAQ,EAEzBM,EAAQJ,EAAW,SAAS,EAC5BK,EAAUL,EAAW,WAAW,EAChCM,EAAUN,EAAW,WAAW,EAEhCO,EAAe,IAAI,KAAKN,EAAMC,EAAOC,EAAKC,EAAOC,EAASC,EAAS,CAAC,EAE1E,OAAOE,EAAaD,CAAY,CAClC,EClCA,OAAS,YAAAE,GAAU,cAAAC,GAAY,cAAAC,OAAkB,WAa1C,IAAMC,GAAmB,CAAC,CAAE,WAAAC,CAAW,IAA8B,CAC1E,IAAMC,EAAaC,GACjBC,GAAWC,GAASC,EAAaL,CAAU,GAAKM,EAAqB,EAAG,CAAC,EAAG,CAAC,EAC7E,CACF,EAEMC,EAAUL,GACdC,GAAWC,GAASC,EAAaL,CAAU,GAAKM,EAAqB,EAAG,EAAE,EAAG,EAAE,EAC/E,EACF,EAEA,MAAO,CACL,WAAYE,EAAaP,CAAU,EACnC,QAASO,EAAaD,CAAO,CAC/B,CACF,EC5BO,IAAME,GAAgBC,GAAkB,CAE9C,IAAMC,EAAaD,EAMnB,OAJe,IAAI,KAAK,aAAa,QAAS,CAC7C,MAAO,WACP,SAAU,KACX,CAAC,EAAE,OAAOC,GAAc,CAAC,CAE1B,EAEaC,GAAaF,GAAkB,CAE3C,IAAIC,EAAaD,EAEjBC,EAAaA,EAAW,QAAQ,MAAO,EAAE,EACzC,IAAIE,EAAS,WAAWF,GAAc,GAAG,EACzC,OAAAE,GAAU,IACHA,CACR,ECdA,IAAMC,GAAwBC,GAA8B,CAC1D,GAAIA,EAAI,SAAW,EAAG,MAAO,CAAC,CAAC,CAAC,EAEhC,IAAMC,EAAwB,IAAI,IAElC,QAASC,EAAI,EAAGA,EAAIF,EAAI,OAAQE,IAAK,CACnC,IAAMC,EAAUH,EAAIE,CAAC,EACfE,EAAY,CAAC,GAAGJ,EAAI,MAAM,EAAGE,CAAC,EAAG,GAAGF,EAAI,MAAME,EAAI,CAAC,CAAC,EACpDG,EAAwBN,GAAqBK,CAAS,EAE5D,QAAWE,KAAQD,EACjBJ,EAAO,IAAI,CAACE,EAAS,GAAGG,CAAI,CAAC,CAEjC,CAEA,OAAO,MAAM,KAAKL,CAAM,CAC1B,EAOaM,GAAsBC,GAAmC,CACpE,IAAMC,EAASD,EAAI,SAAS,EAAE,MAAM,EAAE,EAChCE,EAAeX,GAAqBU,CAAM,EAG1CE,EAAqB,IAAI,IAAID,EAAa,IAAKJ,GAASA,EAAK,KAAK,EAAE,CAAC,CAAC,EAE5E,OAAO,MAAM,KAAKK,CAAkB,CACtC,ECnCA,OAAS,UAAAC,OAAc,WAEhB,IAAMC,EAAiB,CAACC,EAAgBC,IAA0B,CACvE,GAAI,CAACD,EAAQ,MAAO,MAEpB,IAAME,EAAOC,EAAaH,CAAM,EAEhC,OAAKE,EAEEJ,GAAOI,EAAMD,GAAgB,YAAY,EAF9B,KAGpB,ECXO,IAAMG,GAA2BC,GAAoC,CACxE,IAAMC,EAAUD,EAAc,IAAI,MAAM,EACxC,GAAIC,EAAQ,SAAW,EAAG,MAAO,GAEjCA,EAAQ,KAAK,CAACC,EAAGC,IAAMD,EAAIC,CAAC,EAC5B,IAAIC,EAAS,GACTC,EAAQJ,EAAQ,CAAC,EACjBK,EAAMD,EACV,QAASE,EAAI,EAAGA,GAAKN,EAAQ,OAAQM,IAC/BA,EAAIN,EAAQ,QAAUA,EAAQM,CAAC,IAAMD,EAAM,EAE7CA,EAAML,EAAQM,CAAC,GAGXF,IAAUC,EAEZF,GAAUC,EAGVD,GAAU,GAAGC,CAAK,OAAOC,CAAG,GAE1BC,EAAIN,EAAQ,SAEdG,GAAU,KAEVC,EAAQJ,EAAQM,CAAC,EACjBD,EAAMD,IAIZ,OAAOD,CACT,ECpBK,IAAMI,EAAcC,GAAoB,CAC9C,IAAMC,EAAK,IAAM,KAAK,OAAO,EAAI,KAAK,OAAO,GAAK,KAAO,EACvD,SAAS,EAAE,EACX,UAAU,CAAC,EACb,MAAO,GAAGD,EAAS,GAAGA,CAAM,IAAM,EAAE,GAAGC,EAAG,EAAIA,EAAG,CAAC,IAAIA,EAAG,CAAC,IAAIA,EAAG,CAAC,IAAIA,EAAG,CAAC,IAAIA,EAAG,CAAC,GAAGA,EAAG,CAAC,GAAGA,EAAG,CAAC,EACjG,ECZO,IAAMC,GAAgB,CAACC,EAAaC,KACzCD,EAAM,KAAK,KAAKA,CAAG,EACnBC,EAAM,KAAK,MAAMA,CAAG,EACb,KAAK,MAAM,KAAK,OAAO,GAAKA,EAAMD,EAAM,EAAE,EAAIA,GCPhD,IAAME,GAAe,CAAIC,EAAkBC,EAAU,MAAgB,CAC1E,IAAMC,EAAmB,CAAC,EAG1B,QAASC,EAAI,EAAGA,EAAIH,EAAY,OAAQG,GAAKF,EAAS,CACpD,IAAMG,EAAWJ,EAAY,MAAMG,EAAGA,EAAIF,CAAO,EACjDC,EAAU,KAAKE,CAAQ,CACzB,CAEA,OAAOF,CACT,ECCO,IAAMG,GAASC,GACb,IAAI,QAASC,GAAY,WAAWA,EAASD,CAAE,CAAC,ECGlD,IAAME,EAAaC,GACxBA,EACG,KAAK,EACL,YAAY,EACZ,UAAU,KAAK,EACf,QAAQ,mBAAoB,EAAE,ECL5B,IAAMC,GAAkB,CAACC,EAAcC,IACrCC,EAAUF,CAAI,EAAE,SAASE,EAAUD,CAAM,CAAC,ECF5C,IAAME,GAAeC,GACrBA,EAEgBA,EAClB,KAAK,EACL,MAAM,KAAK,EACX,OAAQC,GAASA,EAAK,QAAU,CAAC,EAGjC,MAAM,EAAG,CAAC,EACV,IAAKA,GAASA,EAAK,CAAC,EAAE,YAAY,CAAC,EAEtB,KAAK,EAAE,EAXG,GCLrB,IAAMC,GAAuBC,GAS3B,GANQ,IAAI,KAAK,aAAa,QAAS,CAC5C,MAAO,UACP,sBAAuB,EACvB,sBAAuB,CACzB,CAAC,EAAE,OAAOA,GAAS,CAAC,CAEJ,KCnBX,IAAMC,GAAmB,CAACC,EAAeC,KAC/CD,EAAQA,EAAM,QAAQ,MAAO,EAAE,EAC/BC,EAAWA,GAAU,QAAQ,MAAO,EAAE,EAElCA,GACC,OAAOA,CAAQ,IAAM,OAAOD,CAAK,IACpCC,EAAWA,EAAS,MAAM,EAAG,EAAE,GAEhB,OAAO,OAAOA,GAAY,GAAG,EAAE,QAAQ,CAAC,CAAC,GAI7C,OAAO,OAAOD,GAAS,GAAG,EAAE,QAAQ,CAAC,CAAC,GCF7C,IAAME,GAA8BC,IACzCA,GAAS,IAQF,GANQ,IAAI,KAAK,aAAa,QAAS,CAC5C,MAAO,UACP,sBAAuB,EACvB,sBAAuB,CACzB,CAAC,EAAE,OAAOA,GAAS,CAAC,CAEJ,MAoBLC,GAA0B,CAACD,EAAeE,KACrDF,EAAQA,EAAM,QAAQ,MAAO,EAAE,EAC/BE,EAAWA,GAAU,QAAQ,MAAO,EAAE,EAElCA,GACE,OAAOA,CAAQ,IAAM,OAAOF,CAAK,IACnCE,EAAWA,EAAS,MAAM,EAAG,EAAE,GAEjB,OAAO,OAAOA,GAAY,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAI,KAIlD,OAAO,OAAOF,GAAS,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAI,KClClD,IAAMG,GAAkBC,GACvBA,EAAM,QAAQ,UAAW,EAAE,ECb5B,IAAMC,EAAiBC,IAA+C,CAC3E,GAAIA,GAAK,IAAM,GACf,WAAYA,GAAK,YAAc,GAC/B,QAASA,GAAK,SAAW,EACzB,SAAUA,GAAK,UAAY,EAC3B,QAASA,GAAK,SAAW,GACzB,MAAOA,GAAK,OAAS,GACrB,eAAgBA,GAAK,gBAAkB,CAAC,EACxC,YAAaA,GAAK,aAAe,GACjC,mBAAoBA,GAAK,oBAAsB,EAC/C,UAAWC,EAAmBD,GAAK,SAAS,EAC5C,QAASA,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,QAASH,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,KAAM,CACJ,EAAGH,GAAK,OAAO,CAAC,GAAK,GACrB,EAAGA,GAAK,OAAO,CAAC,GAAK,GACrB,EAAGA,GAAK,OAAO,CAAC,GAAK,GACrB,EAAGA,GAAK,OAAO,CAAC,GAAK,GACrB,EAAGA,GAAK,OAAO,CAAC,GAAK,GACrB,EAAGA,GAAK,OAAO,CAAC,GAAK,GACrB,EAAGA,GAAK,OAAO,CAAC,GAAK,EACvB,CACF,GC3BA,IAAAI,GAAA,GAAAC,EAAAD,GAAA,wBAAAE,EAAA,6BAAAC,GAAA,0BAAAC,GAAA,mBAAAC,EAAA,sBAAAC,GAAA,iBAAAC,GAAA,uBAAAC,EAAA,sBAAAC,GAAA,gBAAAC,GAAA,4BAAAC,GAAA,qBAAAC,GAAA,oBAAAC,GAAA,uBAAAC,GAAA,mBAAAC,EAAA,eAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,cAAAC,GAAA,kBAAAC,EAAA,gBAAAC,KCSO,IAAMC,EAAiB,CAACC,EAAgBC,IAAoB,CAC/D,IAAIC,EAAY,GACZC,EAAeH,EAAO,OAAS,EAC/BI,EAAgBH,EAAQ,OAAS,EAGrC,KAAOG,GAAiB,GAClBH,EAAQG,CAAa,IAAM,KAC7BF,EAAYF,EAAOG,CAAY,EAAID,EACnCC,KACSF,EAAQG,CAAa,IAAM,MACpCF,EAAY,IAAMA,GAEpBE,IAGF,OAAOF,CAEX,ECLO,IAAMG,GAAmB,CAC9BC,EACAC,IACiB,CAEjB,IAAMC,EAAaD,EAEbE,EACJH,GAAQ,UAAU,OAAS,EACvBA,EAAO,SAASA,EAAO,SAAS,OAAS,CAAC,EAC1C,GAqBN,OAlBiBI,EAAc,CAC7B,GAAGJ,EACH,GAAIE,EACJ,OAAQF,EAAO,OACf,OAAQA,EAAO,OACf,QAAS,CAACA,EAAO,MAAM,EACvB,4BAA6BA,EAAO,4BACpC,2BAA4BA,EAAO,2BACnC,QAASG,EACT,WAAYH,EAAO,WACnB,QAASA,EAAO,QAChB,iBAAkBA,EAAO,iBACzB,eAAgBA,EAAO,eACvB,mBAAoBA,EAAO,mBAC3B,UAAWA,EAAO,SACpB,CAAC,CAIH,ECvBO,IAAMK,GAA0B,CACrCC,EACAC,IACG,CAEH,IAAMC,EAAcD,EAChBE,EAAmB,OAAOH,EAAOC,CAAiC,CAAC,CAAC,EACpEE,EAAmBH,EAAO,MAAM,EAMpC,MAHE,GAAGA,GAAQ,QAAU,GAAGA,GAAQ,OAAO,IAAM,EAAE,GAC5CA,EAAO,UAAU,IAAIA,EAAO,SAAS,IAAIA,EAAO,MAAM,IAAIE,CAAW,EAG5E,ECtBO,IAAME,GAAoB,CAC/BC,EACAC,IACkB,CAClB,IAAMC,EAA2B,CAAC,EAElC,cAAO,QAAQF,CAAO,EAAE,QAAQ,CAAC,CAAC,CAAEG,CAAM,IAAM,CAC9C,IAAMC,EAAaC,GAAwBF,EAAQF,CAAa,EAE3DC,EAAUE,CAAU,EAIvBF,EAAUE,CAAU,EAAE,QAAQ,KAAKD,EAAO,MAAM,EAFhDD,EAAUE,CAAU,EAAIE,GAAiBH,EAAQC,CAAU,CAI/D,CAAC,EAEMF,CACT,EC7BO,IAAMK,GAAgBC,GAA8B,CACzD,IAAMC,EAAuB,CAAC,EAC9BD,EAAK,QAASE,GAAQ,CACpB,IAAMC,EAAYC,EAAMF,EAAI,IAAI,EAChCA,EAAI,QAAQ,QAASG,GAAW,CAC9B,GAAIF,EAAU,KAAO,SAAU,CAC7B,IAAMG,EAAOD,EAAO,MAAM,GAAG,EAC7B,QAAWE,KAAOD,EAAM,CACtB,GAAIC,EAAI,OAASJ,EAAU,OAAO,OAAQ,SAC1C,IAAMK,EAAIC,EAAeF,EAAKJ,EAAU,MAAM,EAC9CF,EAAW,KAAKO,CAAC,CACnB,CACA,MACF,CACA,IAAMD,EAAMF,EAAO,WAAW,IAAK,EAAE,EACrC,GAAIE,EAAI,OAASJ,EAAU,OAAO,WAAW,IAAK,EAAE,EAAE,OAAQ,OAC9D,IAAMK,EAAIC,EAAeF,EAAKJ,EAAU,MAAM,EAC9CF,EAAW,KAAKO,CAAC,CACnB,CAAC,CACH,CAAC,EAED,IAAME,EAAqB,IAAI,IAAIT,CAAU,EAI7C,OAFa,MAAM,KAAKS,CAAkB,CAG5C,EC9BO,IAAMC,GAAgBC,GAA+B,CAC1D,IAAIC,EAAO,EAEX,cAAO,QAAQD,CAAM,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAK,IAAM,CAC/C,IAAMC,EAAQF,EAAI,MAAM,GAAG,EAGzBE,EAAM,SAAS,OAAO,GACtB,CAACA,EAAM,SAAS,KAAK,GACrB,OAAOD,GAAU,WAEjBF,GAAQE,EAEZ,CAAC,EAEMF,CACT,ECbO,IAAMI,GACXC,GAKG,CACH,IAAIC,EAAO,EACPC,EAAgC,EAEpC,OAAO,QAAQF,CAAM,EAAE,QAAQ,CAAC,CAACG,EAAKC,CAAK,IAAM,CAE3CD,EAAI,WAAW,KAAa,GAAK,OAAOC,GAAU,WACpDH,GAAQG,EACJA,EAAQ,IACVF,GAAiC,GAIvC,CAAC,EAED,IAAMG,EAA4BC,GAAaN,CAAM,EAErD,OAAAC,GAAQI,EAED,CAAE,KAAAJ,EAAM,8BAAAC,EAA+B,0BAAAG,CAA0B,CAC1E,EClCO,IAAME,GAAeC,GAOtB,CACJ,GAAM,CAAE,WAAAC,EAAY,KAAAC,EAAM,OAAAC,EAAQ,QAAAC,EAAS,OAAAC,EAAQ,aAAAC,CAAa,EAAIN,EAE9DO,EAAYC,EAAMN,CAAI,EAEtBO,EAAkBF,EAAU,QAC9BJ,EACAO,EAAeP,EAAQI,EAAU,MAAM,EAEvCI,EAAwBL,EAAe,OAAS,QAMpD,OAHGF,EAAU,GAAGA,CAAO,IAAM,IAC3B,GAAGH,CAAU,IAAIC,CAAI,IAAIG,CAAM,IAAII,CAAe,IAAIE,CAAqB,EAG/E,ECxBO,IAAMC,EAAiBC,GACdA,EAAM,WAAW,aAAc,EAAE,EAAE,MAAM,GAAG,ECiBrD,IAAMC,GAAwB,CAAC,CACpC,oBAAAC,EACA,SAAAC,EACA,YAAAC,EACA,oBAAAC,CACF,IAKc,CACZ,IAAMC,EAAYC,EAAMJ,CAAQ,EAE1BK,EAAQC,EAAcN,CAAQ,EAGhCO,EAAgBN,GAAeI,EAAM,QAAU,GAGnD,OAAAE,GAAiBR,EAGZI,EAAU,UACbI,GAAkBL,GAAuB,GAGxCA,IAAwB,IAAGK,EAAgB,GAEvCA,CACT,ECrCO,IAAMC,GAAoBC,GAC3BA,IAAW,EAAUC,EAAQ,CAAG,EAAE,GAClCD,IAAW,EAAUC,EAAQ,CAAG,EAAE,GAClCD,IAAW,EAAUC,EAAQ,CAAG,EAAE,GAClCD,IAAW,EAAUC,EAAQ,CAAG,EAAE,GAClCD,IAAW,EAAUC,EAAQ,CAAG,EAAE,GAC/BA,EAAQ,KAAK,EAAE,GCPjB,IAAMC,GAA4BC,GAAmB,CAC1D,IAAMC,EAAuB,CAAC,EAExBC,EAAOC,EAAqB,EAE5BC,EAAUC,EAAaH,CAAI,EAEjC,QAAWI,KAAON,EAAK,KAAM,CAC3B,IAAMO,EAAQC,EAAcF,EAAI,IAAI,EAE9BG,EAAcH,EAAI,QAAQ,OAEhC,QAAWI,KAAQH,EACjB,QAAWI,KAAUL,EAAI,QACvB,QAAWM,KAASN,EAAI,OACtB,QAAWO,KAAUD,EAAM,OAAQ,CACjC,IAAME,EAAYC,EAAML,CAAI,EAGtBM,EAAgBC,GAAsB,CAC1C,YAAaL,EAAM,MACnB,SAAUN,EAAI,KACd,oBAAqBG,EACrB,oBAAqBG,EAAM,OAAO,MACpC,CAAC,EAEGM,EAAgBC,GAAiBN,CAAM,EACvCO,EAAkBT,EAElBG,EAAU,QACZI,EAAgB,MAEhBE,EAAkBC,EAAeV,EAAQG,EAAU,MAAM,EAI3D,IAAMQ,EAAWC,GAAY,CAC3B,OAAQZ,EACR,QAASX,EAAK,QACd,WAAYA,EAAK,QACjB,KAAMU,EACN,OAAQQ,CACV,CAAC,EAEIjB,IAAUqB,CAAQ,IACrBrB,EAAQqB,CAAQ,EAAIE,EAAY,CAC9B,GAAIF,EACJ,OAAQF,EACR,OAAQF,EACR,QAASd,EACT,QAASJ,EAAK,QACd,OAAQ,EACR,WAAYA,EAAK,QACjB,UAAWU,EACX,CAAC,GAAG,KAAa,GAAGV,EAAK,EAAE,EAAS,EAAG,CACzC,CAAC,GAICc,EAAU,QACZb,EAAQqB,CAAQ,EAAE,GAAG,KAAa,GAAGtB,EAAK,EAAE,EAAE,EAAI,OAAOgB,EAAc,QAAQ,CAAC,CAAC,EAEjFf,EAAQqB,CAAQ,EAAE,GAAG,KAAa,GAAGtB,EAAK,EAAE,EAAE,GAAK,OAAOgB,EAAc,QAAQ,CAAC,CAAC,CAEtF,CAIR,CAEA,MAAO,CAAE,QAAAf,CAAQ,CACnB,EC1EA,IAAMwB,GAAiB,EAEVC,GAA0B,CACrCC,EACAC,EACAC,IAEOF,EACJ,IAAKG,GAAW,CACf,IAAMC,EAAYC,EAAc,aAAa,yBAC3CJ,EACAE,EAAO,SACT,EAEMG,EAAa,OAAO,OAAOJ,CAAY,EAAE,KAC5CK,GAAMA,EAAE,YAAcJ,EAAO,SAChC,EAEMK,EACJH,EAAc,aAAa,4BACzBC,GAAY,OAAS,EACrBF,GAAW,OAAS,CACtB,EAEIK,EAAoB,OAAON,EAAO,OAAO,QAAQL,EAAc,CAAC,EAChEY,EAA4B,OAAOF,EAAe,QAAQV,EAAc,CAAC,EAEzEa,EAAYF,EAAoBC,EAEtC,OAAID,EAAoBC,EACf,CACL,OAAAP,EACA,UAAAQ,CACF,EAGK,IACT,CAAC,EACA,OAAO,OAAO,EC9CZ,IAAMC,EAAsBC,GAA0B,CAE3D,IAAIC,EAAa,KAAK,MAAMD,EAAQ,GAAG,EAGjCE,EAAQD,EAAa,EAC3B,OAAIC,IAAU,IACZD,GAAc,EAAIC,GAGDD,EAAa,GAGlC,ECTO,IAAME,GAAeC,GAAsC,CAChE,IAAMC,EAAkB,OAAO,OAAOD,CAAO,EAAE,KAAK,CAACE,EAAGC,IAAM,CAG5D,IAAMC,EAAeC,EAAMH,EAAE,SAAS,EAAE,MAClCI,EAAeD,EAAMF,EAAE,SAAS,EAAE,MAExC,OAAIC,EAAeE,EAAqB,GACpCF,EAAeE,EAAqB,EAGpCJ,EAAE,OAASC,EAAE,OAAe,GAC5BD,EAAE,OAASC,EAAE,OAAe,EAGzBD,EAAE,OAASC,EAAE,OAAS,GAAK,CACpC,CAAC,EAGD,OAAO,OAAO,YACZF,EAAgB,IAAKM,GAAS,CAACA,EAAK,GAAIA,CAAI,CAAC,CAC/C,CACF,ECxBO,IAAMC,GACXC,GACgC,CAChC,IAAMC,EAAsC,CAAC,EAE7C,cAAO,QAAQD,CAAM,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAK,IAAM,CAC/C,IAAMC,EAAQF,EAAI,MAAM,GAAG,EAGzBE,EAAM,SAAS,OAAO,GACtB,CAACA,EAAM,SAAS,KAAK,GACrB,OAAOD,GAAU,WAEjBF,EAAOC,CAAG,EAAIC,EAElB,CAAC,EAEMF,CACT,EClBO,IAAMI,GAAsBC,GAA6D,CAE5F,IAAMC,EAAsC,CAAC,EAE7C,cAAO,QAAQD,CAAM,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAK,IAAM,CACjD,IAAMC,EAAQF,EAAI,MAAM,GAAG,EAGzBE,EAAM,SAAS,OAAO,GACtBA,EAAM,SAAS,KAAK,GACpB,OAAOD,GAAU,WAEjBF,EAAOC,CAAG,EAAIC,EAElB,CAAC,EAEQF,CACX,EChBO,IAAMI,GAAcC,GAA6D,CACtF,IAAMC,EAAsC,CAAC,EAE7C,cAAO,QAAQD,CAAM,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAK,IAAM,CAC3CD,EAAI,WAAW,KAAa,GAAK,OAAOC,GAAU,WACpDF,EAAOC,CAAG,EAAIC,EAElB,CAAC,EAEMF,CACT,ECIO,IAAMG,EAAkBC,GAAiD,CAC9E,IAAMC,EAAyB,CAC5B,IAAgB,CAAC,EAClB,CAACC,CAAY,EAAG,CAAC,EACjB,CAACC,CAAgB,EAAG,CAAC,CACvB,EAEMC,EAAMC,EAAMC,GAAWN,CAAM,CAAC,EAC9BO,EAAYF,EAAMG,GAAgBR,CAAM,CAAC,EACzCS,EAAgBJ,EAAMK,GAAmBV,CAAM,CAAC,EAEtD,OAAAC,EAAM,KAAa,EAAII,EAAMD,CAAG,EAChCH,EAAMC,CAAY,EAAIG,EAAME,CAAS,EACrCN,EAAME,CAAgB,EAAIE,EAAMI,CAAa,EAEtCR,CACT,EC3BO,IAAMU,GAAgBC,GAA2C,CACtE,IAAIC,EAAO,EAEX,cAAO,OAAOD,CAAM,EAAE,QAASE,GAAU,CACvCD,GAAQC,CACV,CAAC,EAEMD,CACT,ECOO,IAAME,GAA4B,CACvCC,EACAC,IAEO,OAAO,OAAOD,CAAW,EAAE,KAAME,GAAMA,EAAE,YAAcD,CAAS,ECzBzE,IAAAE,GAAA,GAAAC,EAAAD,GAAA,iCAAAE,GAAA,8BAAAC,GAAA,6BAAAC,KCgBO,IAAMC,GAA8B,CACzCC,EACAC,IAEOD,GAAcC,GAAa,GCC7B,IAAMC,GAA2B,CACtCC,EACAC,IAEO,OAAO,OAAOD,CAAW,EAAE,KAAME,GAAMA,EAAE,YAAcD,CAAS,ECnBlE,IAAME,GAAoB,CAC/BC,EACAC,EACAC,IACW,CACX,IAAMC,EAAYC,GAAyBH,EAASD,CAAS,EAIvDK,GAFaC,GAA0BJ,EAASF,CAAS,GAE3B,OAAS,IAAMG,GAAW,OAAS,GAEvE,OAAO,OAAOE,EAAe,QAAQ,CAAC,CAAC,CACzC,EClBA,IAAAE,GAAA,GAAAC,EAAAD,GAAA,8BAAAE,GAAA,8BAAAC,GAAA,sBAAAC,GAAA,mBAAAC,KCAA,OAAS,UAAAC,GAAQ,UAAAC,OAAc,WCA/B,IAAAC,GAAA,GAAAC,EAAAD,GAAA,qBAAAE,GAAA,wBAAAC,GAAA,cAAAC,GAAA,iBAAAC,GAAA,uBAAAC,EAAA,uBAAAC,GAAA,uBAAAC,GAAA,yBAAAC,GAAA,eAAAC,KCEO,IAAMC,GAAmBC,GAA2B,CACzD,IAAIC,EAAQ,EACZ,OAAAD,EAAU,QAASE,GAAS,CAC1BD,GAASC,EAAK,KAChB,CAAC,EACMD,CACT,ECLO,IAAME,GAAuBC,GAAqB,CACvD,IAAIC,EAAQ,EAEZ,OAAAD,EAAM,QAASE,GAAQ,CACrBD,GAASE,GAAgBD,EAAI,MAAM,CACrC,CAAC,EAEMD,CACT,ECXA,OAAS,YAAAG,GAAU,cAAAC,GAAY,cAAAC,OAAkB,WAI1C,IAAMC,EAAqB,CAChCC,EACAC,IACW,CAGX,IAAMC,EAAeC,EAFLF,CAEyB,EAErCG,EAAaD,EAAaH,CAAI,EAElC,MAAG,CAACI,GAAc,CAACF,EAAqB,GAExCE,EAAaC,GAASD,EAAYF,EAAa,SAAS,CAAC,EACzDE,EAAaE,GAAWF,EAAYF,EAAa,WAAW,CAAC,EAC7DE,EAAaG,GAAWH,EAAY,CAAC,EAEtBI,EAAaJ,CAAU,EAGxC,ECpBO,IAAMK,GAAgBC,GACvBA,EAAI,IACCA,EAAE,SAAS,EAAE,SAAS,EAAG,GAAG,EAE5BA,EAAE,SAAS,ECMf,IAAMC,GAAsBC,GAAuB,CACxD,IAAMC,EAAQD,EAAG,MAAM,GAAG,EAC1B,OAAOC,EAAMA,EAAM,OAAS,CAAC,CAC/B,ECbO,IAAMC,GAAcC,GAA6B,CACtD,IAAMC,EAAUC,EAAMF,CAAI,EAE1B,QAASG,EAAQ,EAAGA,EAAQF,EAAQ,KAAK,OAAQE,IAAS,CACxD,IAAIC,EAASH,EAAQ,KAAKE,CAAK,EAE/B,GACEC,EAAO,OAAS,oBAChBA,EAAO,OAAS,qBAChBA,EAAO,OAAS,qCAChB,CACA,IAAMC,EAAOD,EAAO,QACdE,EAAmB,CAAC,EAE1B,QAAWC,KAAOF,EAAM,CACtB,IAAMG,EAAIC,GAAmBF,CAAG,EAChCD,EAAO,KAAK,GAAGE,CAAC,CAClB,CAEAJ,EAAS,CAAE,GAAGA,EAAQ,QAASF,EAAMI,CAAM,CAAE,EAC7CL,EAAQ,KAAKE,CAAK,EAAIC,CACxB,CACF,CAEA,OAAOH,CACT,ECrBO,IAAMS,GAAY,CACvBC,EACAC,EACAC,EACAC,EACAC,IACG,CAEH,IAAMC,EAAOC,EAAU,CACrB,GAAGN,EACH,GAAII,EACJ,QAASH,EACT,QAASM,EAAmBL,EAASC,EAAS,OAAO,EACrD,YAAaK,GAAoBR,EAAK,IAAI,EAC1C,SAAUG,CACZ,CAAC,EAEKM,EAA0BC,GAAWL,CAAI,EAEzC,CAAE,QAAAM,CAAQ,EAAIC,GAClBH,CACF,EAEA,MAAO,CAAE,QAAAE,EAAS,KAAAN,CAAK,CACzB,EC7BO,IAAMQ,GAAqB,IAChC,OAAO,OAAOC,CAAK,EAAE,OAClBC,GAAS,CAACA,EAAK,GAAG,SAAS,GAAG,GAAK,CAACA,EAAK,GAAG,SAAS,WAAW,CACnE,EAEWC,GAAuB,IAChB,OAAO,OAAOF,CAAK,EAAE,OACpCC,GAAS,CAACA,EAAK,GAAG,SAAS,GAAG,GAAK,CAACA,EAAK,GAAG,SAAS,WAAW,CACnE,EAEsB,OAAO,CAACE,EAAKC,KACjCD,EAAIC,EAAK,EAAE,EAAIA,EACRD,GACN,CAAC,CAAuD,ETetD,IAAME,GAAoB,CAC/BC,EACAC,EACAC,EACAC,EACAC,IACG,CAEH,IAAMC,EAAOC,EAAmBL,EAAS,UAAc,EAEjDM,EAAkBP,EAAU,OAC/BQ,GAAQA,EAAI,OAAS,CAACA,EAAI,eAAe,SAASH,CAAI,CACzD,EAEMI,EAAUC,EAAaL,CAAI,EAE7BM,EAA6B,CAAC,EAG5BC,EAAmBL,EAAgB,OACtCC,GAAQA,EAAI,qBAAuBH,CACtC,EAGA,OAAIO,EAAiB,OAAS,EAC5BD,EAAa,CAAC,GAAGC,CAAgB,EAGjCD,EAAaJ,EAAgB,OAC1BC,GACCC,GACAD,EAAI,KAAKK,GAAOJ,CAAO,CAA0B,GACjDD,EAAI,qBAAuB,CAC/B,EAGEN,IACFS,EAAa,CAAC,GAAGJ,CAAe,GAG9BJ,GAAUM,GAAWL,GACnBU,GAAOV,EAAS,YAAY,IAAMU,GAAOL,EAAS,YAAY,IAChEE,EAAaA,EAAW,OACrBH,GACC,OAAOM,GAAOV,EAAS,MAAM,CAAC,EAC9B,OAAOW,EAAeP,EAAI,SAAU,MAAM,CAAC,CAC/C,GAIGG,EAAW,KAAK,CAACK,EAAMC,IAC5B,OAAOF,EAAeC,EAAK,QAAS,MAAM,CAAC,EAC3C,OAAOD,EAAeE,EAAK,QAAS,MAAM,CAAC,EACvC,GACA,CACN,CACF,EUtFA,OAAS,UAAAC,GAAQ,UAAAC,OAAc,WAgCxB,IAAMC,GAAiB,CAAC,CAC7B,UAAAC,EACA,WAAAC,EAAaC,EAAaC,EAAqB,CAAC,EAChD,UAAAC,EAAYF,EAAaC,EAAqB,CAAC,EAC/C,SAAAE,EAAW,SACX,MAAAC,EAAQ,UACV,IAMsB,CAgBpB,IAAMC,EAAcC,GACdF,IAAU,UAAkBE,EAAS,QACrCF,IAAU,WAAmBE,EAAS,SACnC,EAIHC,EAAqBC,EAAmBT,EAAY,UAAc,EAGlEU,EAAoBD,EAAmBN,EAAW,UAAc,EAGhEQ,EAAiBC,EAAaJ,CAAkB,EAEtD,GAAI,CAACG,EAAgB,MAAM,IAAI,MAAM,qCAA+B,EAGpE,IAAME,EAAkBd,EAAU,OAC/Be,GAAQA,EAAI,OAAS,CAACA,EAAI,eAAe,SAASN,CAAkB,CACvE,EAGMO,EAAqBF,EAAgB,OACxCC,GAAQA,EAAI,qBAAuBN,CACtC,EAGMQ,EAEJD,EAAmB,OAAS,EACxBA,EAEAF,EAAgB,OACbC,GACCA,EAAI,KAAKG,GAAON,CAAc,CAA0B,GACxDG,EAAI,qBAAuB,CAC/B,EAGN,GAAIV,IAAa,SACf,OAAOY,EAAiB,KAAKE,EAAa,EAI5C,IAAMC,EAAgBP,EAAaT,CAAS,EAE5C,GAAI,CAACgB,EAAe,MAAM,IAAI,MAAM,oCAA8B,EAGlE,IAAMC,EAAY,OAAOC,GAAOF,EAAe,MAAM,CAAC,EAmBtD,OAfEf,IAAa,WACTY,EAAiB,OAAQF,GACvBN,IAAuBE,EACnBU,EAAY,OAAOE,EAAehB,EAAWQ,CAAG,EAAG,MAAM,CAAC,EAC1DN,EAAqBE,CAC3B,EACAN,IAAa,aACbY,EAAiB,OAAQF,GACvBJ,IAAsBF,EAClBY,GAAa,OAAOE,EAAehB,EAAWQ,CAAG,EAAG,MAAM,CAAC,EAC3DN,EAAqBE,CAC3B,EACA,CAAC,GAGmB,KAAKQ,EAAa,CAC9C,EAKMA,GAAgB,CAACK,EAAiBC,IACtC,OAAOF,EAAeC,EAAE,QAAS,MAAM,CAAC,EAAI,OAAOD,EAAeE,EAAE,QAAS,MAAM,CAAC,ECxItF,OAAS,UAAAC,OAAc,WAehB,IAAMC,GAA4B,CACvCC,EACAC,IACS,CAGT,GAAI,CAACA,EAAS,MACZ,MAAM,IAAI,MAAM,sCAA0B,EAG5C,GAAIA,EAAS,eAAe,SAASD,CAAU,EAC7C,MAAM,IAAI,MAAM,kDAAyC,EAG3D,GACEC,EAAS,qBAAuB,GAChCA,EAAS,qBAAuBD,EAEhC,MAAM,IAAI,MAAM,+CAAsC,EAGxD,IAAME,EAAiBC,EAAaH,CAAU,EAE9C,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,6BAA0B,EAG5C,GAAI,CAACD,EAAS,KAAKG,GAAOF,CAAc,CAA+B,EAAG,CAExE,IAAMG,EADa,CAAC,UAAW,gBAAiB,iBAAe,eAAgB,eAAgB,cAAe,WAAQ,EACvFD,GAAOF,CAAc,CAAC,EACrD,MAAM,IAAI,MACR,uDAA8CG,CAAW,IAC3D,CACF,CACF,ECzCO,IAAMC,GAA2B,CAACC,EAAoBC,IAAoC,CAC7F,GAAI,CACA,OAAAC,GAA0BF,EAAYC,CAAQ,EACvC,EACX,MAAQ,CACJ,MAAO,EACX,CACJ,ECfA,IAAAE,GAAA,GAAAC,EAAAD,GAAA,mBAAAE,GAAA,kBAAAC,GAAA,UAAAC,GAAA,kBAAAC,GAAA,iBAAAC,GAAA,eAAAC,GAAA,oBAAAC,GAAA,gBAAAC,GAAA,mBAAAC,GAAA,8BAAAC,GAAA,eAAAC,KCEA,IAAMC,GAAS,CAAC,OAAO,EACjBC,GAAmB,CAAC,QAAS,WAAW,EACxCC,GAAgB,CAAC,YAAY,EAC7BC,GAAiB,CAAC,aAAa,EAC/BC,GAAoB,CAAC,gBAAgB,EACrCC,GAAc,CAAC,UAAU,EACzBC,GAAmB,CAAC,eAAe,EACnCC,GAAe,CAAC,WAAW,EAC3BC,GAAuB,CAAC,YAAa,eAAe,EAE7CC,GAASC,GAAmBV,GAAO,SAASU,EAAK,IAAI,EACrDC,GAAgBD,GAAmBR,GAAc,SAASQ,EAAK,IAAI,EACnEE,GAAcF,GAAmBP,GAAe,SAASO,EAAK,IAAI,EAClEG,GAAiBH,GAAmBT,GAAiB,SAASS,EAAK,IAAI,EACvEI,GAAmBJ,GAC9BN,GAAkB,SAASM,EAAK,IAAI,EACzBK,GAAcL,GAAmBL,GAAY,SAASK,EAAK,IAAI,EAC/DM,GAAkBN,GAAmBJ,GAAiB,SAASI,EAAK,IAAI,EACxEO,GAAeP,GAAmBH,GAAa,SAASG,EAAK,IAAI,EACjEQ,GAA6BR,GAAmBF,GAAqB,SAASE,EAAK,IAAI,EAOvFS,GAAgB,CAC3B,MAAAV,GACA,aAAAE,GACA,WAAAC,GACA,cAAAC,GACA,gBAAAC,GACA,WAAAC,GACA,eAAAC,GACA,YAAAC,GACA,0BAAAC,EACF,ECpCO,IAAME,GAAiBC,GAAmB,CAE7C,IAAIC,EAAO,EACPC,EAAM,EAEV,cAAO,OAAOF,EAAK,MAAM,IAAI,EAAE,QAASG,GAAUF,GAAQE,CAAK,EAC/D,OAAO,OAAOH,EAAK,MAAM,GAAG,EAAE,QAASG,GAAUD,GAAOC,CAAK,EAEtD,CACH,KAAAF,EACA,IAAAC,CACJ,CACJ,ECdA,IAAAE,GAAA,GAAAC,EAAAD,GAAA,sBAAAE,GAAA,sBAAAC,GAAA,2BAAAC,GAAA,4BAAAC,GAAA,8BAAAC,GAAA,oBAAAC,GAAA,+BAAAC,GAAA,uBAAAC,GAAA,0BAAAC,GAAA,kBAAAC,KCIO,IAAMC,GAAiBC,GAA4C,CACtE,IAAMC,EAAkB,OAAO,OAAOD,CAAS,EAAE,KAAK,CAACE,EAAGC,IAAM,CAG9D,IAAMC,EAAeC,EAAMH,EAAE,SAAS,EAAE,MAClCI,EAAeD,EAAMF,EAAE,SAAS,EAAE,MAExC,OAAIC,EAAeE,EAAqB,GACpCF,EAAeE,EAAqB,EAGpCJ,EAAE,OAASC,EAAE,OAAe,GAC5BD,EAAE,OAASC,EAAE,OAAe,EAGzBA,EAAE,OAASD,EAAE,MACtB,CAAC,EAGD,OAAO,OAAO,YACZD,EAAgB,IAAKM,GAAS,CAACA,EAAK,GAAIA,CAAI,CAAC,CAC/C,CACF,EClBF,IAAMC,GAAiB,EAEVC,GAA4B,CACvCC,EACAC,EACAC,IAEOF,EACJ,IAAKG,GAAa,CACjB,IAAMC,EAAYC,EAAc,aAAa,yBAC3CJ,EACAE,EAAS,SACX,EAEMG,EAAa,OAAO,OAAOJ,CAAY,EAAE,KAC5CK,GAAMA,EAAE,YAAcJ,EAAS,SAClC,EAEMK,EACJH,EAAc,aAAa,4BACzBC,GAAY,OAAS,EACrBF,GAAW,OAAS,CACtB,EAEIK,EAAoB,OAAON,EAAS,OAAO,QAAQL,EAAc,CAAC,EAClEY,EAA4B,OAAOF,EAAe,QAAQV,EAAc,CAAC,EAEzEa,EAAYF,EAAoBC,EAEtC,OAAID,EAAoBC,EACf,CACL,SAAAP,EACA,UAAAQ,CACF,EAGK,IACT,CAAC,EACA,OAAO,OAAO,EC3CZ,IAAMC,GAAsBC,GAAiE,CAClG,IAAMC,EAAsC,CAAC,EAE7C,cAAO,QAAQD,CAAQ,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAK,IAAM,CACnCD,EAAI,MAAM,GAAG,EAEjB,SAAS,KAAa,GAAK,OAAOC,GAAU,WACpDF,EAAOC,CAAG,EAAIC,EAElB,CAAC,EAEMF,CACT,ECbO,IAAMG,GACXC,GACgC,CAChC,IAAMC,EAAsC,CAAC,EAE7C,cAAO,QAAQD,CAAQ,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAK,IAAM,CACjD,IAAMC,EAAQF,EAAI,MAAM,GAAG,EAGzBE,EAAM,SAAS,OAAO,GACtB,CAACA,EAAM,SAAS,KAAK,GACrB,OAAOD,GAAU,WAEjBF,EAAOC,CAAG,EAAIC,EAElB,CAAC,EAEMF,CACT,EClBO,IAAMI,GAA8BC,GAAiE,CAExG,IAAMC,EAAsC,CAAC,EAE7C,cAAO,QAAQD,CAAQ,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAK,IAAM,CACnD,IAAMC,EAAQF,EAAI,MAAM,GAAG,EAGzBE,EAAM,SAAS,OAAO,GACtBA,EAAM,SAAS,KAAK,GACpB,OAAOD,GAAU,WAEjBF,EAAOC,CAAG,EAAIC,EAElB,CAAC,EAEQF,CACX,ECUO,IAAMI,GAAyB,CACpCC,EACAC,IACW,CACX,IAAMC,EAAW,GAAGC,CAAgB,GAAGF,CAAO,GACxCG,EAAaJ,EAAOE,CAAQ,EAElC,GAAgCE,GAAe,KAC7C,MAAM,IAAI,MAAM,mBAAmBH,CAAO,mCAA6B,EAGzE,GAAI,OAAOG,GAAe,SACxB,MAAM,IAAI,MAAM,mBAAmBH,CAAO,0BAAuB,EAGnE,IAAMI,EAAkBC,EAAmBF,CAAU,EAMrD,MAHE,GAAGJ,GAAQ,QAAU,GAAGA,GAAQ,OAAO,IAAM,EAAE,GAC5CA,EAAO,UAAU,IAAIA,EAAO,SAAS,IAAIA,EAAO,MAAM,IAAIK,CAAe,UAAUJ,CAAO,EAGjG,EC5BO,IAAMM,GAAwB,CAACC,EAAuDC,IAAqC,CAE9H,IAAMC,EAA6B,CAC/B,MAAO,CAAC,EACR,WAAY,EACZ,aAAc,EACd,cAAe,CACnB,EAEMC,EAAuB,OAAO,QAAQH,CAAe,EAErDI,EAAiB,OAAO,OAAOH,CAAS,EAExCI,EAAmBD,EAAe,KAAKE,GAAYA,EAAS,YAAc,UAAU,EAE1F,OAAW,CAACC,EAAWC,CAAc,IAAKL,EAAsB,CAI5D,IAAMM,EAAYD,GAAkB,EAE9BE,EAAqBN,EAAe,KAAKE,GAAYC,IAAcD,EAAS,SAAS,EAK3F,GAFAJ,EAAW,YAAcO,EAErBC,EAAoB,CAEpB,IAAMC,EAAiBC,GAAiBL,CAA0C,EAElFL,EAAW,MAAMK,CAAS,EAAI,CAC1B,aAAcE,EACd,MAAOE,GAAgB,OAAS,EAChC,KAAMJ,EACN,MAAOI,GAAgB,OAASJ,CACpC,EAIA,IAAMD,EAAWG,GAAaC,EAAmB,YAAc,KAE/DR,EAAW,cAAgBO,EAAYH,EACvCJ,EAAW,eAAiBI,CAEhC,SAESJ,EAAW,MAAM,WAClBA,EAAW,MAAM,SAAc,CAC3B,aAAc,EACd,MAAO,EACP,KAAM,WACN,MAAO,UACX,GAGJA,EAAW,MAAM,SAAY,cAAgBO,EAEzCJ,EAAkB,CAClB,IAAMC,EAAWG,GAAaJ,EAAiB,YAAc,KAC7DH,EAAW,cAAgBO,EAAYH,EACvCJ,EAAW,eAAiBI,CAChC,MAEIJ,EAAW,cAAgBO,CAGvC,CAEA,OAAOP,CACX,EC3EO,IAAMW,EAAgB,CAC3B,QAAAC,GACA,SAAAC,GACA,SAAAC,GACA,MAAAC,GACA,MAAAC,GACA,aAAAC,GACA,MAAAC,EACF,ECpBO,IAAMC,EAAgBC,IAA6C,CACxE,GAAIA,GAAK,IAAM,GACf,WAAYA,GAAK,YAAc,GAC/B,YAAaA,GAAK,aAAe,CAAC,EAClC,QAASA,GAAK,SAAW,GACzB,aAAcA,GAAK,cAAgB,YACnC,QAASA,GAAK,SAAW,GACzB,UAAWC,EAAmBD,GAAK,SAAS,EAC5C,KAAM,CACJ,KAAMA,GAAK,MAAM,MAAQ,EACzB,GAAIA,GAAK,MAAM,IAAM,CACvB,EACA,KAAMA,GAAK,MAAM,KAAO,GAAKA,GAAK,MAAM,OAAS,EACjD,KAAMA,GAAK,MAAQ,CAAC,EACpB,QAASA,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,QAASH,GAAK,SAAWE,EAAaC,EAAqB,CAAC,CAC9D,GChBO,IAAMC,EACXC,IACmB,CACnB,GAAIA,GAAK,IAAM,GACf,WAAYA,GAAK,YAAc,GAC/B,UAAWC,EAAmBD,GAAK,SAAS,EAC5C,QAASA,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,QAASH,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,QAASH,GAAK,SAAW,GACzB,SAAU,CACR,GAAIA,GAAK,UAAU,IAAM,GACzB,WAAYA,GAAK,UAAU,YAAc,GACzC,QAASA,GAAK,UAAU,SAAW,EACnC,YAAaA,GAAK,UAAU,aAAe,EAC7C,EACA,SAAU,CACR,EAAGA,GAAK,WAAW,CAAC,GAAK,GACzB,EAAGA,GAAK,WAAW,CAAC,GAAK,GACzB,EAAGA,GAAK,WAAW,CAAC,GAAK,GACzB,EAAGA,GAAK,WAAW,CAAC,GAAK,GACzB,EAAGA,GAAK,WAAW,CAAC,GAAK,EAC3B,EACA,OAAQ,CACN,EAAGA,GAAK,SAAS,CAAC,GAAK,GACvB,EAAGA,GAAK,SAAS,CAAC,GAAK,GACvB,EAAGA,GAAK,SAAS,CAAC,GAAK,GACvB,EAAGA,GAAK,SAAS,CAAC,GAAK,GACvB,EAAGA,GAAK,SAAS,CAAC,GAAK,EACzB,EACA,OAAQ,CACN,EAAGA,GAAK,SAAS,CAAC,GAAK,GACvB,EAAGA,GAAK,SAAS,CAAC,GAAK,GACvB,EAAGA,GAAK,SAAS,CAAC,GAAK,GACvB,EAAGA,GAAK,SAAS,CAAC,GAAK,GACvB,EAAGA,GAAK,SAAS,CAAC,GAAK,EACzB,EACA,SAAUA,GAAK,UAAY,GAC3B,YAAaA,GAAK,aAAe,CACnC,GCtCO,IAAMI,EAAcC,IAAyC,CAClE,GAAIA,GAAK,IAAM,GACf,WAAYA,GAAK,YAAc,GAC/B,UAAWA,GAAK,WAAa,EAC7B,KAAMA,GAAK,MAAQ,GACnB,YAAaA,GAAK,aAAe,GACjC,YAAaA,GAAK,aAAe,GACjC,KAAMA,GAAK,MAAQ,WACnB,QAASA,GAAK,SAAW,GACzB,UAAWC,EAAmBD,GAAK,SAAS,EAC5C,QAASA,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,QAASH,GAAK,SAAWE,EAAaC,EAAqB,CAAC,CAC9D,GCXO,IAAMC,EAAaC,IAAuC,CAC/D,GAAIA,GAAK,IAAM,GACf,WAAYA,GAAK,YAAc,GAC/B,OAAQA,GAAK,QAAU,GACvB,UAAWA,GAAK,WAAa,EAC7B,UAAWA,GAAK,WAAa,EAC7B,QAASA,GAAK,SAAW,GACzB,SAAUA,GAAK,UAAY,GAC3B,KAAMA,GAAK,MAAQ,GACnB,UAAWA,GAAK,WAAa,GAC7B,gBAAiBA,GAAK,iBAAmB,GACzC,SAAUA,GAAK,UAAY,GAC3B,KAAMA,GAAK,MAAQ,WACnB,eAAgBA,GAAK,gBAAkB,EACvC,aAAc,CACZ,mBAAoBA,GAAK,cAAc,oBAAsB,GAC7D,4BACEA,GAAK,cAAc,6BAA+B,CAAC,CACvD,EACA,MAAO,CACL,GAAIA,GAAK,OAAO,IAAM,GACtB,KAAMA,GAAK,OAAO,MAAQ,GAC1B,KAAMA,GAAK,OAAO,MAAQ,UAC5B,EACA,WAAYA,GAAK,WACbA,GAAK,WAAW,OAAQC,GAASC,IAAQD,CAAI,GAAG,EAAE,EAClD,CAAC,EACL,MAAOD,GAAK,OAAS,GACrB,MAAO,CACL,KAAMA,GAAK,OAAO,MAAQ,CAAC,EAC3B,IAAKA,GAAK,OAAO,KAAO,CAAC,CAC3B,EACA,YAAa,CACX,UAAWA,GAAK,aAAa,WAAa,EAC5C,EACA,WAAY,CACV,iBAAkBA,GAAK,YAAY,kBAAoB,GACvD,aAAcA,GAAK,YAAY,cAAgB,GAC/C,qBAAsBA,GAAK,YAAY,sBAAwB,EACjE,EACA,UAAWG,EAAmBH,GAAK,SAAS,EAC5C,QAASA,GAAK,SAAWI,EAAaC,EAAqB,CAAC,EAC5D,QAASL,GAAK,SAAWI,EAAaC,EAAqB,CAAC,CAC9D,GC5CO,IAAMC,GACXC,IACmB,CACnB,GAAIA,GAAK,IAAM,GACf,WAAYA,GAAK,YAAc,GAC/B,UAAWA,GAAK,WAAa,SAC7B,QAASA,GAAK,SAAW,GACzB,MAAOA,GAAK,OAAS,EACrB,UAAWC,EAAmBD,GAAK,SAAS,EAC5C,QAASA,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,QAASH,GAAK,SAAWE,EAAaC,EAAqB,CAAC,CAC9D,GCTO,IAAMC,EAAY,CAACC,EAAyB,CAAC,KAAiB,CACnE,GAAIA,GAAK,IAAM,GACf,WAAYA,GAAK,YAAc,GAC/B,eAAgBA,GAAK,gBAAkB,GACvC,KAAMA,EAAI,MAAQ,CAAC,EACnB,QAAS,CACP,GAAIA,GAAK,SAAS,IAAM,GACxB,WAAYA,GAAK,SAAS,YAAc,GACxC,gBAAiBA,GAAK,SAAS,iBAAmB,GAClD,KAAMA,GAAK,SAAS,MAAQ,GAC5B,KAAMA,GAAK,SAAS,MAAQ,WAC5B,MAAOA,GAAK,SAAS,OAAS,GAC9B,UAAWA,GAAK,SAAS,WAAa,EACtC,MAAO,CACL,GAAIA,GAAK,SAAS,OAAO,IAAM,GAC/B,KAAMA,GAAK,SAAS,OAAO,MAAQ,GACnC,KAAMA,GAAK,SAAS,OAAO,MAAQ,UACrC,CACF,EACA,UAAWC,EAAmBD,GAAK,SAAS,EAC5C,QAASA,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,QAASH,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,YAAaH,GAAK,aAAe,EACjC,QAASA,GAAK,SAAW,GACzB,WAAYA,GAAK,YAAcI,GAAc,IAAQ,MAAM,EAAE,SAAS,EACtE,OAAQ,CACN,SAAUJ,GAAK,QAAQ,UAAY,GACnC,WAAYA,GAAK,QAAQ,YAAc,EACvC,OAAQA,GAAK,QAAQ,QAAU,EACjC,EACA,mBAAoBA,GAAK,oBAAsB,CAAC,EAChD,UAAWA,GAAK,WAAa,CAAC,EAC9B,WAAYA,GAAK,YAAc,CAAC,EAChC,UAAWA,GAAK,WAAa,GAC7B,iBAAkBA,GAAK,kBAAoB,CAAC,EAC5C,QAASA,GAAK,SAAW,EACzB,OAAQA,EAAI,QAAUK,GAAY,OAAO,GACzC,aAAcL,GAAK,cAAgB,GACnC,SAAU,CACR,GAAIA,GAAK,UAAU,IAAM,GACzB,WAAYA,GAAK,UAAU,YAAc,GACzC,YAAaA,GAAK,UAAU,aAAe,GAC3C,SAAUA,GAAK,UAAU,UAAY,EACrC,QAASA,GAAK,UAAU,SAAW,CACrC,CACF,GC9CO,IAAMM,EAAc,CAACC,EAA2B,CAAC,IAAkB,CAExE,IAAMC,EAAsBC,EAAQF,GAAK,QAAkC,GAAG,EAAE,MAC1EG,EAAoBC,EAAMJ,GAAK,WAAmC,QAAQ,EAAE,MAE9EK,EAAwB,CAC1B,GAAIL,GAAK,IAAM,GACf,WAAYA,GAAK,YAAc,GAC/B,SAAUA,GAAK,UAAY,CAAC,EAC5B,oBAAqBC,EACrB,kBAAmBE,EACnB,OAAQH,GAAK,QAAU,GACvB,OAAQA,GAAK,QAAU,EACvB,OAAQA,GAAK,QAAU,IACvB,QAASA,GAAK,SAAW,GACzB,iBAAkBA,GAAK,kBAAoB,EAC3C,eAAgBA,GAAK,gBAAkB,EACvC,mBAAoBA,GAAK,oBAAsB,EAC/C,UAAWA,GAAK,WAAa,EAC7B,4BAA6BA,GAAK,6BAA+B,EACjE,2BAA4BA,GAAK,4BAA8B,EAC/D,UAAWA,GAAK,WAAa,SAC7B,UAAWM,EAAmBN,GAAK,SAAS,EAC5C,QAASA,GAAK,SAAWO,EAAaC,EAAqB,CAAC,EAC5D,QAASR,GAAK,SAAWO,EAAaC,EAAqB,CAAC,EAC5D,aAAcR,GAAK,cAAgB,GACnC,WAAYA,GAAK,YAAc,CACjC,EAEMS,EAAcC,EAAeV,CAAG,EAEtC,OAAAK,EAAY,CACV,GAAGA,EACH,GAAGI,EAAY,KAAa,EAC5B,GAAGA,EAAYE,CAAY,EAC3B,GAAGF,EAAYG,CAAgB,CACjC,EAEOP,CACT,EC3CO,IAAMQ,GAAW,CAACC,EAAwB,CAAC,KAAgB,CAChE,KAAMA,GAAK,MAAQ,SACnB,QAASA,GAAK,SAAW,CAAC,EAC1B,OAAQA,GAAK,QAAU,CAAC,CAC1B,GCsBO,IAAMC,GAAiB,CAC5BC,EAA8B,CAAC,KACZ,CAEnB,GAAIA,GAAK,IAAM,GAGf,WAAYA,GAAK,YAAc,GAG/B,WAAYA,GAAK,YAAc,EAG/B,QAASA,GAAK,SAAW,GAGzB,KAAM,CAEJ,GAAIA,GAAK,MAAM,IAAM,GAGrB,WAAYA,GAAK,MAAM,YAAc,GAGrC,QAASA,GAAK,MAAM,SAAW,EAG/B,OAAQ,CAEN,SAAUA,GAAK,MAAM,QAAQ,UAAY,GAGzC,WAAYA,GAAK,MAAM,QAAQ,YAAc,EAG7C,OAAQA,GAAK,MAAM,QAAQ,QAAU,EACvC,EAEA,UAAW,CACT,GAAIA,GAAK,MAAM,WAAW,IAAM,GAChC,WAAYA,GAAK,MAAM,WAAW,YAAc,GAChD,KAAMA,GAAK,MAAM,WAAW,MAAQ,WACpC,KAAMA,GAAK,MAAM,WAAW,MAAQ,GACpC,MAAOA,GAAK,MAAM,WAAW,OAAS,EACxC,EAGA,QAAS,CAEP,GAAIA,GAAK,MAAM,SAAS,IAAM,GAG9B,WAAYA,GAAK,MAAM,SAAS,YAAc,GAG9C,gBAAiBA,GAAK,MAAM,SAAS,iBAAmB,GAGxD,MAAOA,GAAK,MAAM,SAAS,OAAS,GAGpC,KAAMA,GAAK,MAAM,SAAS,MAAQ,GAGlC,KAAMA,GAAK,MAAM,SAAS,MAAQ,WAGlC,UAAWA,GAAK,MAAM,SAAS,WAAa,EAG5C,MAAO,CAEL,GAAIA,GAAK,MAAM,SAAS,OAAO,IAAM,GAGrC,KAAMA,GAAK,MAAM,SAAS,OAAO,MAAQ,GAGzC,KAAMA,GAAK,MAAM,SAAS,OAAO,MAAQ,UAC3C,CACF,CACF,EAGA,aAAcA,GAAK,cAAgB,CAAC,EAGpC,iBAAkBA,GAAK,kBAAoB,EAG3C,sBAAuBA,GAAK,uBAAyB,EAGrD,2BAA4BA,GAAK,4BAA8B,EAG/D,UAAWC,EAAmBD,GAAK,SAAS,EAG5C,QAASA,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAG5D,QAASH,GAAK,SAAWE,EAAaC,EAAqB,CAAC,CAC9D,GChIO,IAAMC,EAAW,CACtBC,EAAiC,CAAC,KACZ,CACtB,GAAIA,GAAK,IAAM,GACf,WAAYA,GAAK,YAAc,GAC/B,WAAYA,GAAK,YAAc,EAC/B,UAAWA,GAAK,WAAa,CAAC,EAC9B,SAAUA,GAAK,UAAY,GAC3B,QAASA,EAAI,SAAW,GACxB,YAAaA,GAAK,aAAe,GACjC,UAAWC,EAAmBD,GAAK,SAAS,EAC5C,QAASA,GAAK,SAAW,EACzB,QAASA,GAAK,SAAW,CAC3B,GCZO,IAAME,GAAa,CAACC,EAA0B,CAAC,KAAkB,CACtE,GAAIA,GAAK,IAAM,GACf,KAAMA,GAAK,MAAQ,GACnB,SAAU,CACR,QAASA,GAAK,UAAU,SAAW,GACnC,iBAAkBA,GAAK,UAAU,kBAAoB,GACrD,cAAeA,GAAK,UAAU,eAAiB,GAC/C,gBAAiBA,GAAK,UAAU,iBAAmB,EACrD,EACA,SAAU,CACR,IAAKA,GAAK,UAAU,KAAO,GAC3B,WAAYA,GAAK,UAAU,YAAc,GACzC,OAAQA,GAAK,UAAU,QAAU,GACjC,OAAQA,GAAK,UAAU,QAAU,GACjC,OAAQA,GAAK,UAAU,QAAU,GACjC,OAAQA,GAAK,UAAU,QAAU,EACnC,EACA,UAAWC,EAAmBD,GAAK,SAAS,EAC5C,QAASA,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,QAASH,GAAK,SAAWE,EAAaC,EAAqB,CAAC,CAC9D,GCpBO,IAAMC,GAAgB,CAACC,EAA6B,CAAC,KAAqB,CAC/E,GAAIA,GAAK,IAAM,GACf,KAAMA,GAAK,MAAQ,MACnB,QAASA,GAAK,SAAW,GACzB,QAASA,GAAK,SAAW,GACzB,QAASA,GAAK,SAAW,GACzB,WAAYA,GAAK,YAAc,GAC/B,OAAQC,EAAmBD,GAAK,MAAM,EACtC,SAAUA,GAAK,UAAY,CAAC,EAC5B,QAASA,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,QAASH,GAAK,SAAWE,EAAaC,EAAqB,CAAC,CAC9D,GCVO,IAAMC,GACXC,IACmB,CACnB,GAAIA,GAAK,IAAM,GACf,WAAYA,GAAK,YAAc,GAC/B,UAAWA,GAAK,WAAa,SAC7B,QAASA,GAAK,SAAW,GACzB,MAAOA,GAAK,OAAS,EACrB,UAAWC,EAAmBD,GAAK,SAAS,EAC5C,QAASA,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,QAASH,GAAK,SAAWE,EAAaC,EAAqB,CAAC,CAC9D,GCVO,IAAMC,GACXC,IACuB,CACvB,GAAIA,GAAK,IAAM,GACf,WAAYA,GAAK,YAAc,GAC/B,YAAaA,GAAK,aAAe,GACjC,MAAO,CACL,GAAIA,GAAK,OAAO,IAAM,GACtB,KAAMA,GAAK,OAAO,MAAQ,EAC5B,EACA,WAAYA,GAAK,YAAc,EAC/B,gBAAiB,CACd,OAAWA,GAAK,iBAAkB,QAAa,EAC/C,QAAYA,GAAK,iBAAkB,SAAc,EACjD,OAAWA,GAAK,iBAAkB,QAAa,EAC/C,MAAUA,GAAK,iBAAkB,OAAY,EAC7C,eAAiBA,GAAK,kBAAkB,cAAc,GAAK,EAC3D,cAAgBA,GAAK,kBAAkB,aAAa,GAAK,EACzD,eAAiBA,GAAK,kBAAkB,cAAc,GAAK,EAC3D,cAAgBA,GAAK,kBAAkB,aAAa,GAAK,CAC5D,EACA,SAAU,CACR,GAAIA,GAAK,UAAU,IAAM,GACzB,WAAYA,GAAK,UAAU,YAAc,GACzC,YAAaA,GAAK,UAAU,aAAe,GAC3C,SAAUA,GAAK,UAAU,UAAY,EACrC,QAASA,GAAK,UAAU,SAAW,CACrC,EACA,aAAc,CACZ,GAAIA,GAAK,cAAc,IAAM,GAC7B,WAAYA,GAAK,cAAc,YAAc,GAC7C,KAAMA,GAAK,cAAc,MAAQ,GACjC,MAAOA,GAAK,cAAc,OAAS,EACrC,EACA,QAASA,GAAK,SAAW,GACzB,YAAaA,GAAK,aAAe,GACjC,UAAWC,EAAmBD,GAAK,SAAS,EAC5C,QAASA,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,QAASH,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,OAAQH,GAAK,QAAUI,GAAgB,SAAS,GAChD,cAAeJ,GAAK,eAAiB,EACrC,eAAgBA,GAAK,gBAAkB,EACvC,UAAWA,GAAK,WAAa,EAC7B,SAAUA,GAAK,UAAY,GAC3B,YAAaA,GAAK,aAAe,EACjC,kBAAmBA,GAAK,mBAAqB,EAC7C,SAAU,CACR,YAAaA,GAAK,UAAU,aAAe,EAC3C,YAAaA,GAAK,UAAU,aAAe,EAC3C,WAAYA,GAAK,UAAU,YAAc,EACzC,aAAcA,GAAK,UAAU,cAAgB,EAC7C,cAAeA,GAAK,UAAU,eAAiB,EAC/C,wBAAyBA,GAAK,UAAU,yBAA4B,EACpE,iBAAkB,CAChB,iBAAkBA,GAAK,UAAU,kBAAkB,kBAAoB,GACvE,gBAAiBA,GAAK,UAAU,kBAAkB,iBAAmB,GACrE,gBAAiBA,GAAK,UAAU,kBAAkB,iBAAmB,GACrE,eAAgBA,GAAK,UAAU,kBAAkB,gBAAkB,GACnE,kBAAmBA,GAAK,UAAU,kBAAkB,mBAAqB,EAC3E,CACF,EACA,aAAcA,GAAK,cAAgB,EACnC,KAAMA,GAAK,MAAQ,GACnB,WAAYA,GAAK,YAAc,EAC/B,KAAM,CACJ,GAAIA,GAAK,MAAM,IAAM,GACrB,WAAYA,GAAK,MAAM,YAAc,GACrC,KAAMA,GAAK,MAAM,MAAQ,GACzB,MAAOA,GAAK,MAAM,OAAS,EAC7B,EACA,aAAcA,GAAK,cAAgB,CAAC,EACpC,aAAcA,GAAK,cAAgB,CAAC,EACpC,kBAAmBA,GAAK,mBAAqB,CAAC,CAChD,GCvEO,IAAMK,EAAgB,CAC3BC,EAAkC,CAAC,IAClB,CACjB,IAAMC,EACJC,EAASF,GAAU,QAAmC,GAAG,EAAE,MACvDG,EACJC,EAAOJ,GAAU,WAAoC,QAAQ,EAAE,MAE7DK,EAA6B,CAC/B,GAAIL,GAAU,IAAM,GACpB,kBAAmBG,EACnB,oBAAqBF,EACrB,QAASD,GAAU,SAAW,CAAC,EAC/B,oBAAqBA,GAAU,qBAAuB,EACtD,QAASA,GAAU,SAAW,GAC9B,4BAA6BA,GAAU,6BAA+B,EACtE,2BAA4BA,GAAU,4BAA8B,EACpE,QAASA,GAAU,SAAW,GAC9B,OAAQA,GAAU,QAAU,EAC5B,eAAgBA,GAAU,gBAAkB,EAC5C,mBAAoBA,GAAU,oBAAsB,EACpD,UAAWA,GAAU,WAAa,EAClC,iBAAkBA,GAAU,kBAAoB,EAChD,WAAYA,GAAU,YAAc,EACpC,OAAQA,GAAU,QAAU,IAC5B,UAAWA,GAAU,WAAa,SAClC,UAAWM,EAAmBN,GAAU,SAAS,EACjD,QAASA,GAAU,SAAWO,EAAaC,EAAqB,CAAC,EACjE,QAASR,GAAU,SAAWO,EAAaC,EAAqB,CAAC,CACnE,EAEMC,EAAcC,EAAeV,CAAQ,EAE3C,OAAAK,EAAe,CACb,GAAGA,EACH,GAAGI,EAAY,KAAa,EAC5B,GAAGA,EAAYE,CAAY,EAC3B,GAAGF,EAAYG,CAAgB,CACjC,EAEOP,CACT,EC7CO,IAAMQ,GAAc,CAACC,EAA2B,CAAC,KAAmB,CACzE,GAAIA,GAAK,IAAM,GACf,OAAQA,GAAK,QAAU,GACvB,UAAWA,GAAK,WAAaC,EAAmB,EAChD,QAASD,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,QAASH,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,SAAUH,GAAK,UAAY,GAC3B,WAAYA,GAAK,YAAc,GAC/B,OAAQA,GAAK,QAAU,YACvB,YAAaA,GAAK,aAAe,EACjC,WAAYA,GAAK,YAAc,SAC/B,GAAIA,GAAK,IAAM,GACf,UAAWA,GAAK,WAAa,EAC/B,GCWO,IAAMI,GAA2B,CACtCC,EAAwC,CAAC,KACZ,CAE7B,GAAIA,GAAK,IAAM,GAGf,WAAYA,GAAK,YAAc,GAG/B,WAAYA,GAAK,YAAc,EAG/B,QAASA,GAAK,SAAW,GAEzB,OAAQA,GAAK,QAAU,GAEvB,OAAQA,GAAK,QAAU,GAEvB,UAAWA,GAAK,WAAa,SAE7B,oBAAqBA,GAAK,qBAAuB,EAEjD,2BAA4BA,GAAK,4BAA8B,EAE/D,eAAgBA,GAAK,gBAAkB,EAEvC,cAAeA,GAAK,eAAiB,EAErC,gBAAiBA,GAAK,iBAAmB,CAAC,EAG1C,UAAWC,EAAmBD,GAAK,SAAS,EAG5C,QAASA,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAG5D,QAASH,GAAK,SAAWE,EAAaC,EAAqB,CAAC,CAC9D,GC/DO,IAAMC,GAAwB,CACnCC,EAAqC,CAAC,KACZ,CAC1B,GAAIA,GAAK,IAAM,GACf,WAAYA,GAAK,YAAc,GAC/B,UAAWA,GAAK,WAAa,SAC7B,QAASA,GAAK,SAAW,GACzB,YAAaA,GAAK,aAAe,EACjC,UAAWC,EAAmBD,GAAK,SAAS,EAC5C,QAASA,GAAK,SAAWE,EAAaC,EAAqB,CAAC,EAC5D,QAASH,GAAK,SAAWE,EAAaC,EAAqB,CAAC,CAC9D,GCUO,IAAMC,GAAc,CACzB,UAAWC,EACX,MAAOC,EACP,cAAeC,GACf,cAAeC,GACf,MAAOC,EACP,UAAWC,EACX,WAAYC,EACZ,MAAOC,EACP,gBAAiBC,GACjB,QAASC,EACT,iBAAkBA,EAClB,UAAWC,EACX,qBAAsBA,EACtB,WAAYC,GACZ,sBAAuBC,GACvB,cAAeC,EACf,yBAA0BA,EAC1B,OAAQC,GACR,UAAWC,GACX,aAAcC,GACd,mBAAoBC,EACtB,EC8FA,IAAMC,GAAN,KAAkB,CACT,MAAQ,IAAI,IACX,IACA,QAER,YAAYC,EAAc,IAAQC,EAAkB,IAAM,CACxD,KAAK,IAAMD,EACX,KAAK,QAAUC,CACjB,CAEA,IAAIC,EAAyB,CAC3B,IAAMC,EAAO,KAAK,MAAM,IAAID,CAAG,EAC/B,OAAKC,EAED,KAAK,IAAI,EAAIA,EAAK,UAAY,KAAK,KACrC,KAAK,MAAM,OAAOD,CAAG,EACd,MAGFC,EAAK,KAPM,IAQpB,CAEA,IAAID,EAAaE,EAAiB,CAEhC,GAAI,KAAK,MAAM,MAAQ,KAAK,QAAS,CACnC,IAAMC,EAAW,KAAK,MAAM,KAAK,EAAE,KAAK,EAAE,MACtCA,GACF,KAAK,MAAM,OAAOA,CAAQ,CAE9B,CAEA,KAAK,MAAM,IAAIH,EAAK,CAAE,KAAAE,EAAM,UAAW,KAAK,IAAI,CAAE,CAAC,CACrD,CAEA,OAAOF,EAAmB,CACxB,KAAK,MAAM,OAAOA,CAAG,CACvB,CAEA,OAAc,CACZ,KAAK,MAAM,MAAM,CACnB,CACF,EAeO,SAASI,EACdC,EACAC,EACAC,EACgB,CAChB,GAAM,CAAE,eAAAC,EAAgB,MAAAC,EAAO,iBAAAC,EAAkB,UAAAC,EAAW,MAAAC,EAAO,cAAAC,EAAe,WAAAC,CAAW,EAAIP,EAC3FQ,EAAcH,GAAO,QAAU,IAAIf,GAAYe,EAAM,IAAKA,EAAM,OAAO,EAAI,KAG3EI,EAAsBC,GAAmC,CAC7D,GAAI,CAACJ,GAAe,QAAS,OAE7B,IAAMK,EAAWL,EAAc,YAAY,EACrCM,EAAeN,EAAc,aAAaI,CAAS,EAGzD,GAAI,GAACE,GAAgBA,EAAa,SAAW,GAG7C,IAAI,CAACD,EACH,MAAAL,EAAc,iBAAiBI,EAAWC,CAAQ,EAC5C,IAAI,MAAM,6CAA+BD,CAAS,iDAAqCT,CAAc,GAAG,EAIhH,GAAI,CAACW,EAAa,SAASD,CAAQ,EACjC,MAAAL,EAAc,iBAAiBI,EAAWC,CAAQ,EAC5C,IAAI,MAAM,mCAA2BA,CAAQ,mCAA6BD,CAAS,uBAAiBT,CAAc,wBAAwBW,EAAa,KAAK,IAAI,CAAC,EAAE,EAE7K,EAGMC,EAA0B,IAA2B,CACzD,GAAI,CAACT,GAAW,QAAS,MAAO,CAAC,EAEjC,IAAMU,EAAQV,EAAU,SAAS,EACjC,OAAKU,EAEE,CAAC,CAAE,MAAOV,EAAU,UAAkB,SAAU,KAAM,MAAAU,CAAM,CAAC,EAFjD,CAAC,CAGtB,EAGMC,EAAcC,GAA4C,CAC9D,IAAMC,EAAiC,CAAC,EAGXJ,EAAwB,EAChC,QAAQ,CAAC,CAAE,MAAAK,EAAO,SAAAC,EAAU,MAAAL,CAAM,IAAM,CAC3DG,EAAY,KAAKlB,EAAQ,MAAMmB,EAAM,SAAS,EAAGC,EAAUL,CAAK,CAAC,CACnE,CAAC,EAGDE,GAAS,OAAO,QAAQ,CAAC,CAAE,MAAAE,EAAO,SAAAC,EAAU,MAAAL,CAAM,IAAM,CACtDG,EAAY,KAAKlB,EAAQ,MAAMmB,EAAM,SAAS,EAAGC,EAAUL,CAAK,CAAC,CACnE,CAAC,EAEDE,GAAS,SAAS,QAAQ,CAAC,CAAE,MAAAE,EAAO,UAAAE,CAAU,IAAM,CAClDH,EAAY,KAAKlB,EAAQ,QAAQmB,EAAM,SAAS,EAAGE,CAAS,CAAC,CAC/D,CAAC,EAEGJ,GAAS,OACXC,EAAY,KAAKlB,EAAQ,MAAMiB,EAAQ,KAAK,CAAC,EAI3CA,GAAS,aAAe,QAC1BC,EAAY,KAAKlB,EAAQ,WAAWiB,EAAQ,UAAU,CAAC,EAGrDA,GAAS,UAAY,QACvBC,EAAY,KAAKlB,EAAQ,QAAQiB,EAAQ,OAAO,CAAC,EAG/CA,GAAS,YAAc,QACzBC,EAAY,KAAKlB,EAAQ,UAAUiB,EAAQ,SAAS,CAAC,EAGnDA,GAAS,QAAU,QACrBC,EAAY,KAAKlB,EAAQ,MAAMiB,EAAQ,KAAK,CAAC,EAG/C,IAAMK,EAAatB,EAAQ,WAAWD,EAAIG,CAAc,EACxD,OAAOF,EAAQ,MAAMsB,EAAY,GAAGJ,CAAW,CACjD,EAGMK,EAAkB,MAAOC,GAA8C,CAC3E,OAAQpB,EAAiB,KAAM,CAC7B,IAAK,aACH,OAAOJ,EAAQ,IAAID,EAAIG,EAAgBsB,CAAE,EAE3C,IAAK,QAEH,IAAMC,EAAQT,EAAW,CACvB,MAAO,CAAC,CAAE,MAAOZ,EAAiB,UAAW,SAAU,KAAM,MAAOoB,CAAG,CAAC,EACxE,MAAO,CACT,CAAC,EACKE,EAAW,MAAM1B,EAAQ,QAAQyB,CAAK,EAC5C,GAAKC,EAAiB,MAAO,MAAM,IAAI,MAAM,2BAA2B,OAAOtB,EAAiB,SAAS,CAAC,KAAKoB,CAAE,EAAE,EACnH,OAAQE,EAAiB,KAAK,CAAC,EAAE,IAEnC,IAAK,SACH,OAAOtB,EAAiB,SAASoB,CAAE,EAErC,QACE,MAAM,IAAI,MAAM,6BAA8BpB,EAAyB,IAAI,EAAE,CACjF,CACF,EAGMuB,EAAc,CAAChB,KAAsBiB,IAA0B,CACnE,IAAMC,EAAexB,GAAW,QAAU,IAAIA,EAAU,SAAS,CAAC,GAAK,GACvE,MAAO,GAAGH,CAAc,GAAG2B,CAAY,IAAIlB,CAAS,IAAI,KAAK,UAAUiB,CAAM,CAAC,EAChF,EAoNA,MAAO,CACL,IAnNU,MAAOJ,GAAkC,CACnD,GAAI,CAKF,GAHAd,EAAmB,MAAM,EAGrBD,EAAa,CACf,IAAMqB,EAAWH,EAAY,MAAOH,CAAE,EAChCO,EAAStB,EAAY,IAAIqB,CAAQ,EACvC,GAAIC,EAAQ,OAAOA,CACrB,CAEA,IAAIC,EAEJ,GAAI5B,EAAiB,OAAS,aAAc,CAC1C,IAAM6B,EAASjC,EAAQ,IAAID,EAAIG,EAAgBsB,CAAE,EACjDQ,EAAU,MAAMhC,EAAQ,OAAOiC,CAAM,CACvC,SAAW7B,EAAiB,OAAS,QAAS,CAE5C,IAAMqB,EAAQT,EAAW,CACvB,MAAO,CAAC,CAAE,MAAOZ,EAAiB,UAAW,SAAU,KAAM,MAAOoB,CAAG,CAAC,EACxE,MAAO,CACT,CAAC,EAEDQ,GADiB,MAAMhC,EAAQ,QAAQyB,CAAK,GAChB,KAAK,CAAC,GAAK,IACzC,KAAO,CACL,IAAMQ,EAAS,MAAMV,EAAgBC,CAAE,EACvCQ,EAAU,MAAMhC,EAAQ,OAAOiC,CAAM,CACvC,CAEA,GAAI,CAAED,GAAiB,OAAO,EAAG,OAAO,KAExC,IAAME,EAAS/B,EAAO6B,EAAgB,KAAK,CAAC,EAG5C,GAAIvB,EAAa,CACf,IAAMqB,EAAWH,EAAY,MAAOH,CAAE,EACtCf,EAAY,IAAIqB,EAAUI,CAAM,CAClC,CAEA,OAAOA,CACT,OAASC,EAAO,CACd,eAAQ,MAAM,0BAA0BX,CAAE,IAAKW,CAAK,EAC7C,IACT,CACF,EAuKE,OArKa,MAAOlB,GAAgE,CACpF,GAAI,CAEFP,EAAmB,MAAM,EAEzB,IAAMe,EAAQT,EAAWC,CAAO,EAC1BS,EAAW,MAAM1B,EAAQ,QAAQyB,CAAK,EAEtCS,EAA8B,CAAC,EACrC,OAACR,EAAiB,QAASM,GAAiB,CAC1C,IAAMpC,EAAOO,EAAM6B,EAAQ,KAAK,CAAC,EACjCE,EAAOtC,EAAK,EAAE,EAAIA,CACpB,CAAC,EAEMsC,CACT,OAASC,EAAO,CACd,eAAQ,MAAM,+BAAgCA,CAAK,EAC5C,CAAC,CACV,CACF,EAmJE,OAjJa,CACblB,EACAmB,IACiB,CAEjB1B,EAAmB,MAAM,EAEzB,IAAMe,EAAQT,EAAWC,CAAO,EAEhC,OAAOjB,EAAQ,WAAWyB,EAAQC,GAAkB,CAClD,IAAMQ,EAA8B,CAAC,EACrCR,EAAS,QAASM,GAAiB,CACjC,IAAMpC,EAAOO,EAAM6B,EAAQ,KAAK,CAAC,EACjCE,EAAOtC,EAAK,EAAE,EAAIA,CACpB,CAAC,EACDwC,EAASF,CAAM,CACjB,CAAC,CACH,EAiIE,IA/HU,MAAOG,GAA2D,CAC5E,GAAI,CAEF3B,EAAmB,OAAO,EAE1B,IAAMc,EAAKa,EAAQ,IAAM7B,IAAa,GAAKR,EAAQ,WAAW,EAGxDsC,EAAe,CAAE,GAAGD,EAAS,GAAAb,CAAG,EAClCnB,GAAW,SAAWA,EAAU,SAAS,IAC1CiC,EAAqBjC,EAAU,SAAS,EAAIA,EAAU,SAAS,GAGlE,IAAM4B,EAASjC,EAAQ,IAAID,EAAIG,EAAgBsB,CAAE,EAC3Ce,EAAYpC,EAAMmC,CAAY,EAEpC,aAAMtC,EAAQ,OAAOiC,EAAQM,CAAS,EAGlC9B,GACFA,EAAY,OAAOkB,EAAY,MAAOH,CAAE,CAAC,EAGpCA,CACT,OAASW,EAAO,CACd,cAAQ,MAAM,yBAA0BA,CAAK,EACvCA,CACR,CACF,EAoGE,OAlGa,MAAOX,EAAYa,IAAuC,CACvE,GAAI,CAEF3B,EAAmB,OAAO,EAE1B,IAAMuB,EAAS,MAAMV,EAAgBC,CAAE,EAGjCc,EAAe,CAAE,GAAGD,CAAQ,EAC9BhC,GAAW,SAAWA,EAAU,SAAS,IAC1CiC,EAAqBjC,EAAU,SAAS,EAAIA,EAAU,SAAS,GAGlE,MAAML,EAAQ,UAAUiC,EAAQK,CAAY,EAGxC7B,GACFA,EAAY,OAAOkB,EAAY,MAAOH,CAAE,CAAC,CAE7C,OAASW,EAAO,CACd,cAAQ,MAAM,2BAA2BX,CAAE,IAAKW,CAAK,EAC/CA,CACR,CACF,EA4EE,OA1Ea,MAAOX,GAA8B,CAClD,GAAI,CAEFd,EAAmB,QAAQ,EAE3B,IAAMuB,EAAS,MAAMV,EAAgBC,CAAE,EACvC,MAAMxB,EAAQ,UAAUiC,CAAM,EAG1BxB,GACFA,EAAY,OAAOkB,EAAY,MAAOH,CAAE,CAAC,CAE7C,OAASW,EAAO,CACd,cAAQ,MAAM,2BAA2BX,CAAE,IAAKW,CAAK,EAC/CA,CACR,CACF,EA2DE,MAzDY,MACZK,GACkB,CAClB,GAAI,CAEiB,IAAI,IAAIA,EAAK,IAAIC,GAAKA,EAAE,SAAS,CAAC,EAC1C,QAAQC,GAAM,CACFhC,EAAjBgC,IAAO,SAA6B,SAChB,OADwB,CAElD,CAAC,EAED,IAAMC,EAAQ3C,EAAQ,WAAWD,CAAE,EAEnC,OAAW,CAAE,GAAAyB,EAAI,KAAA5B,EAAM,UAAAe,CAAU,IAAK6B,EAAM,CAC1C,IAAMI,EAAQpB,GAAMhB,IAAa,GAAKR,EAAQ,WAAW,EACnDiC,GAASjC,EAAQ,IAAID,EAAIG,EAAgB0C,CAAK,EAG9CN,GAAe,CAAE,GAAG1C,EAAM,GAAIgD,CAAM,EACtCvC,GAAW,SAAWA,EAAU,SAAS,IAC1CiC,GAAqBjC,EAAU,SAAS,EAAIA,EAAU,SAAS,GAGlE,IAAMkC,GAAYpC,EAAMmC,EAAY,EAEpC,OAAQ3B,EAAW,CACjB,IAAK,MACHX,EAAQ,SAAS2C,EAAOV,GAAQM,EAAS,EACzC,MACF,IAAK,SACHvC,EAAQ,YAAY2C,EAAOV,GAAQK,EAAY,EAC/C,MACF,IAAK,SACHtC,EAAQ,YAAY2C,EAAOV,EAAM,EACjC,KACJ,CACF,CAEA,MAAMjC,EAAQ,YAAY2C,CAAK,EAG3BlC,GACFA,EAAY,MAAM,CAEtB,OAAS0B,EAAO,CACd,cAAQ,MAAM,4BAA6BA,CAAK,EAC1CA,CACR,CACF,EAWE,WAAY,IAAM1B,GAAa,MAAM,EACrC,aAAc,IAAMA,GAAa,MAAM,MAAQ,CACjD,CACF,CAKO,IAAMoC,GAAyBC,GAA2C,CAC/E,GAAI,CAOF,OALIA,GAAoB,OAAOA,EAAiB,cAAiB,YAK7DA,GACA,OAAOA,EAAiB,YAAe,YACvC,OAAOA,EAAiB,KAAQ,YAChC,OAAOA,EAAiB,OAAU,YAClC,OAAOA,EAAiB,OAAU,WAC7B,aAILA,GAAoB,OAAOA,EAAiB,WAAc,YAK1DA,GACA,OAAOA,EAAiB,YAAe,YACvC,OAAOA,EAAiB,KAAQ,YAChC,OAAOA,EAAiB,OAAU,WAC7B,KAILA,GACAA,EAAiB,eACjB,OAAOA,EAAiB,eAAkB,WAErC,aAGF,SACT,OAASX,EAAO,CACd,eAAQ,KAAK,0CAAwCA,CAAK,EACnD,SACT,CACF,EAGaY,GAAmCC,IACvC,CACL,WAAY,CAACjD,EAAIkD,IAASD,EAAgB,WAAWjD,EAAIkD,CAAI,EAC7D,IAAK,CAAClD,EAAIkD,KAASC,IAAaF,EAAgB,IAAIjD,EAAIkD,EAAM,GAAGC,CAAQ,EACzE,MAAO,CAAC5B,KAAeJ,IAAgB8B,EAAgB,MAAM1B,EAAY,GAAGJ,CAAW,EACvF,MAAO,CAACC,EAAOC,EAAUL,IAAUiC,EAAgB,MAAM7B,EAAOC,EAAUL,CAAK,EAC/E,QAAS,CAACI,EAAOE,EAAY,QAAU2B,EAAgB,QAAQ7B,EAAOE,CAAS,EAC/E,MAAQ8B,GAAUH,EAAgB,MAAMG,CAAK,EAC7C,WAAY,IAAIC,IAAgBJ,EAAgB,WAAW,GAAGI,CAAW,EACzE,QAAS,IAAIA,IAAgBJ,EAAgB,QAAQ,GAAGI,CAAW,EACnE,UAAW,IAAIA,IAAgBJ,EAAgB,UAAU,GAAGI,CAAW,EACvE,MAAO,IAAIA,IAAgBJ,EAAgB,MAAM,GAAGI,CAAW,EAC/D,QAASJ,EAAgB,QACzB,OAAQA,EAAgB,OACxB,OAAQA,EAAgB,OACxB,UAAWA,EAAgB,UAC3B,UAAWA,EAAgB,UAC3B,WAAYA,EAAgB,WAC5B,SAAU,CAACL,EAAOV,EAAQrC,IAAS+C,EAAM,IAAIV,EAAQrC,CAAI,EACzD,YAAa,CAAC+C,EAAOV,EAAQrC,IAAS+C,EAAM,OAAOV,EAAQrC,CAAI,EAC/D,YAAa,CAAC+C,EAAOV,IAAWU,EAAM,OAAOV,CAAM,EACnD,YAAcU,GAAUA,EAAM,OAAO,EACrC,WAAYK,EAAgB,WAC5B,WAAY,IAAMxC,EAAW,CAC/B,GAIW6C,GAAkB,KACtB,CACL,WAAY,CAACtD,EAAIkD,IAAUlD,EAAW,WAAWkD,CAAI,EACrD,IAAK,CAAClD,EAAIkD,KAASC,IAAcnD,EAAW,WAAWkD,CAAI,EAAE,IAAIC,EAAS,KAAK,GAAG,CAAC,EACnF,MAAO,CAAC5B,KAAeJ,IAAgB,CACrC,IAAIO,EAAQH,EACZ,OAAAJ,EAAY,QAAQoC,GAAc,CAC5BA,EAAW,OAAS,QACtB7B,EAASA,EAAc,MAAM6B,EAAW,MAAOA,EAAW,MAAOA,EAAW,KAAK,EACxEA,EAAW,OAAS,UAC7B7B,EAASA,EAAc,QAAQ6B,EAAW,MAAOA,EAAW,SAAS,EAC5DA,EAAW,OAAS,QAC7B7B,EAASA,EAAc,MAAM6B,EAAW,KAAK,EACpCA,EAAW,OAAS,aAC7B7B,EAASA,EAAc,WAAW,GAAG6B,EAAW,MAAM,EAC7CA,EAAW,OAAS,UAC7B7B,EAASA,EAAc,QAAQ,GAAG6B,EAAW,MAAM,EAC1CA,EAAW,OAAS,YAC7B7B,EAASA,EAAc,UAAU,GAAG6B,EAAW,MAAM,EAC5CA,EAAW,OAAS,UAC7B7B,EAASA,EAAc,MAAM,GAAG6B,EAAW,MAAM,EAErD,CAAC,EACM7B,CACT,EACA,MAAO,CAACN,EAAOC,EAAUL,KAAW,CAAE,KAAM,QAAS,MAAAI,EAAO,MAAOC,EAAU,MAAAL,CAAM,GACnF,QAAS,CAACI,EAAOE,EAAY,SAAW,CAAE,KAAM,UAAW,MAAAF,EAAO,UAAAE,CAAU,GAC5E,MAAQ8B,IAAW,CAAE,KAAM,QAAS,MAAOA,CAAM,GACjD,WAAY,IAAIC,KAAiB,CAAE,KAAM,aAAc,OAAQA,CAAY,GAC3E,QAAS,IAAIA,KAAiB,CAAE,KAAM,UAAW,OAAQA,CAAY,GACrE,UAAW,IAAIA,KAAiB,CAAE,KAAM,YAAa,OAAQA,CAAY,GACzE,MAAO,IAAIA,KAAiB,CAAE,KAAM,QAAS,OAAQA,CAAY,GACjE,QAAU3B,GAAWA,EAAc,IAAI,EACvC,OAASQ,GAAYA,EAAe,IAAI,EACxC,OAAQ,CAACA,EAAQrC,EAAMqB,IAAagB,EAAe,IAAIrC,EAAMqB,CAAO,EACpE,UAAW,CAACgB,EAAQrC,IAAUqC,EAAe,OAAOrC,CAAI,EACxD,UAAYqC,GAAYA,EAAe,OAAO,EAC9C,WAAalC,GAAQA,EAAW,MAAM,EACtC,SAAU,CAAC4C,EAAOV,EAAQrC,IAAU+C,EAAc,IAAIV,EAAQrC,CAAI,EAClE,YAAa,CAAC+C,EAAOV,EAAQrC,IAAU+C,EAAc,OAAOV,EAAQrC,CAAI,EACxE,YAAa,CAAC+C,EAAOV,IAAYU,EAAc,OAAOV,CAAM,EAC5D,YAAcU,GAAWA,EAAc,OAAO,EAC9C,WAAY,CAAClB,EAAOW,IAAcX,EAAc,WAAWW,CAAQ,EACnE,WAAY,IAAM5B,EAAW,CAC/B,GAIW+C,GAA6BT,GAA8C,CACtF,IAAMU,EAAUX,GAAsBC,CAAgB,EAItD,OAFA,QAAQ,IAAI,wCAAiCU,CAAO,EAAE,EAE9CA,EAAS,CACf,IAAK,aACH,OAAOT,GAAuBD,CAAgB,EAEhD,IAAK,KACH,OAAOO,GAAgB,EAEzB,QACE,eAAQ,KAAK,wEAA8D,EACpEA,GAAgB,CAC3B,CACF,EAGaI,GAAiB,CAC5BX,EACA/C,EACAE,IACmB,CACnB,IAAMD,EAAUuD,GAAiBT,CAAgB,EACjD,OAAOhD,EAAkBC,EAAIC,EAASC,CAAM,CAC9C,EAEayD,GAA2B,KAG/B,CACL,WAAY,CAAC3D,EAAIkD,IAASlD,EAAG,WAAWkD,CAAI,EAC5C,IAAK,CAAClD,EAAIkD,KAASC,IAAanD,EAAG,WAAWkD,CAAI,EAAE,IAAIC,EAAS,KAAK,GAAG,CAAC,EAC1E,MAAO,CAAC5B,KAAeJ,IAAgB,CACrC,IAAIO,EAAQH,EACZ,OAAAJ,EAAY,QAAQoC,GAAc,CAE5BA,EAAW,OAAS,QACtB7B,EAAQA,EAAM,MAAM6B,EAAW,MAAOA,EAAW,MAAOA,EAAW,KAAK,EAC/DA,EAAW,OAAS,UAC7B7B,EAAQA,EAAM,QAAQ6B,EAAW,MAAOA,EAAW,SAAS,EACnDA,EAAW,OAAS,QAC7B7B,EAAQA,EAAM,MAAM6B,EAAW,KAAK,EAC3BA,EAAW,OAAS,aAC7B7B,EAAQA,EAAM,WAAW,GAAG6B,EAAW,MAAM,EACpCA,EAAW,OAAS,UAC7B7B,EAAQA,EAAM,QAAQ,GAAG6B,EAAW,MAAM,EACjCA,EAAW,OAAS,YAC7B7B,EAAQA,EAAM,UAAU,GAAG6B,EAAW,MAAM,EACnCA,EAAW,OAAS,UAC7B7B,EAAQA,EAAM,MAAM,GAAG6B,EAAW,MAAM,EAE5C,CAAC,EACM7B,CACT,EACA,MAAO,CAACN,EAAOC,EAAUL,KAAW,CAAE,KAAM,QAAS,MAAAI,EAAO,MAAOC,EAAU,MAAAL,CAAM,GACnF,QAAS,CAACI,EAAOE,EAAY,SAAW,CAAE,KAAM,UAAW,MAAAF,EAAO,UAAAE,CAAU,GAC5E,MAAQ8B,IAAW,CAAE,KAAM,QAAS,MAAOA,CAAM,GACjD,WAAY,IAAIC,KAAiB,CAAE,KAAM,aAAc,OAAQA,CAAY,GAC3E,QAAS,IAAIA,KAAiB,CAAE,KAAM,UAAW,OAAQA,CAAY,GACrE,UAAW,IAAIA,KAAiB,CAAE,KAAM,YAAa,OAAQA,CAAY,GACzE,MAAO,IAAIA,KAAiB,CAAE,KAAM,QAAS,OAAQA,CAAY,GACjE,QAAU3B,GAAUA,EAAM,IAAI,EAC9B,OAASQ,GAAWA,EAAO,IAAI,EAC/B,OAAQ,CAACA,EAAQrC,EAAMqB,IAAYgB,EAAO,IAAIrC,EAAMqB,CAAO,EAC3D,UAAW,CAACgB,EAAQrC,IAASqC,EAAO,OAAOrC,CAAI,EAC/C,UAAYqC,GAAWA,EAAO,OAAO,EACrC,WAAalC,GAAOA,EAAG,MAAM,EAC7B,SAAU,CAAC4C,EAAOV,EAAQrC,IAAS+C,EAAM,IAAIV,EAAQrC,CAAI,EACzD,YAAa,CAAC+C,EAAOV,EAAQrC,IAAS+C,EAAM,OAAOV,EAAQrC,CAAI,EAC/D,YAAa,CAAC+C,EAAOV,IAAWU,EAAM,OAAOV,CAAM,EACnD,YAAcU,GAAUA,EAAM,OAAO,EACrC,WAAY,CAAClB,EAAOW,IAAaX,EAAM,WAAWW,CAAQ,EAC1D,WAAY,IAAM5B,EAAW,CAC/B,GCnnBF,IAAMmD,GAAgB,CACpBC,EACAC,EAII,CAAE,QAAS,GAAM,IAAK,IAAQ,QAAS,GAAK,EAChDC,IACG,CAEH,IAAMC,EACJC,IACmB,CACnB,GAAGA,EACH,UAAWJ,EACP,CACE,QAAS,GACT,UAAW,UACX,SAAUA,CACZ,EACA,OACJ,MAAOC,EACP,cAAeC,IAAuBE,EAAO,cAAc,CAC7D,GAGMC,EACJD,IACmB,CACnB,GAAGA,EACH,MAAOH,EACP,cAAeC,IAAuBE,EAAO,cAA0C,CACzF,GAEA,MAAO,CAKL,iBAAkBC,EAA2B,CAC3C,eAAgB,QAChB,MAAOC,EACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,MAAOH,EAA6B,CAClC,eAAgB,QAChB,MAAOG,EACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,OAAQD,EAA4B,CAClC,eAAgB,SAChB,MAAOE,GACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,UAAWJ,EAAiC,CAC1C,eAAgB,YAChB,MAAOK,EACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,WAAYL,EAAkC,CAC5C,eAAgB,aAChB,MAAOM,EACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,UAAWN,EAAgC,CACzC,eAAgB,YAChB,MAAOO,EACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,MAAOP,EAA8B,CACnC,eAAgB,QAChB,MAAOQ,EACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,cAAeR,EAAkC,CAC/C,eAAgB,gBAChB,MAAOS,GACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,cAAeT,EAAkC,CAC/C,eAAgB,gBAChB,MAAOU,GACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,MAAOV,EAA6B,CAClC,eAAgB,QAChB,MAAOW,EACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,QAASX,EAA+B,CACtC,eAAgB,UAChB,MAAOY,EACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,iBAAkBZ,EAA+B,CAC/C,eAAgB,mBAChB,MAAOY,EACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,UAAWZ,EAAiC,CAC1C,eAAgB,YAChB,MAAOa,EACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,qBAAsBb,EAAiC,CACrD,eAAgB,uBAChB,MAAOa,EACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,WAAYb,EAAkC,CAC5C,eAAgB,aAChB,MAAOc,GACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,sBAAuBd,EAA4C,CACjE,eAAgB,wBAChB,MAAOe,GACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,cAAef,EAAqC,CAClD,eAAgB,gBAChB,MAAOgB,EACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,yBAA0BhB,EAAqC,CAC7D,eAAgB,2BAChB,MAAOgB,EACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,UAAWhB,EAAiC,CAC1C,eAAgB,YAChB,MAAOiB,GACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,gBAAiBjB,EAAsC,CACrD,eAAgB,kBAChB,MAAOkB,GACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,EAKD,aAAclB,EAA+B,CAC3C,eAAgB,eAChB,MAAOmB,GACP,iBAAkB,CAAE,KAAM,YAAa,CACzC,CAAC,CACH,CACF,EAMO,SAASC,GAAkBnB,EAA4C,CAC5E,GAAM,CAAE,GAAAoB,EAAI,QAAAC,EAAS,WAAAzB,EAAY,YAAAC,EAAa,qBAAAC,CAAqB,EAAIE,EACjEsB,EAAU3B,GAAcC,EAAYC,EAAaC,CAAoB,EAE3E,MAAO,CACL,iBAAkByB,EAAkBH,EAAIC,EAASC,EAAQ,gBAAgB,EACzE,MAAOC,EAAkBH,EAAIC,EAASC,EAAQ,KAAK,EACnD,OAAQC,EAAkBH,EAAIC,EAASC,EAAQ,MAAM,EACrD,UAAWC,EAAkBH,EAAIC,EAASC,EAAQ,SAAS,EAC3D,WAAYC,EAAkBH,EAAIC,EAASC,EAAQ,UAAU,EAC7D,UAAWC,EAAkBH,EAAIC,EAASC,EAAQ,SAAS,EAC3D,MAAOC,EAAkBH,EAAIC,EAASC,EAAQ,KAAK,EACnD,cAAeC,EAAkBH,EAAIC,EAASC,EAAQ,aAAa,EACnE,cAAeC,EAAkBH,EAAIC,EAASC,EAAQ,aAAa,EACnE,MAAOC,EAAkBH,EAAIC,EAASC,EAAQ,KAAK,EACnD,QAASC,EAAkBH,EAAIC,EAASC,EAAQ,OAAO,EACvD,iBAAkBC,EAAkBH,EAAIC,EAASC,EAAQ,gBAAgB,EACzE,UAAWC,EAAkBH,EAAIC,EAASC,EAAQ,SAAS,EAC3D,qBAAsBC,EACpBH,EACAC,EACAC,EAAQ,oBACV,EACA,WAAYC,EAAkBH,EAAIC,EAASC,EAAQ,UAAU,EAC7D,sBAAuBC,EACrBH,EACAC,EACAC,EAAQ,qBACV,EACA,cAAeC,EAAkBH,EAAIC,EAASC,EAAQ,aAAa,EACnE,yBAA0BC,EACxBH,EACAC,EACAC,EAAQ,wBACV,EACA,UAAWC,EAAkBH,EAAIC,EAASC,EAAQ,SAAS,EAC3D,gBAAiBC,EAAkBH,EAAIC,EAASC,EAAQ,eAAe,EACvE,aAAcC,EAAkBH,EAAIC,EAASC,EAAQ,YAAY,CACnE,CACF,CA0BO,SAASE,GACdxB,EACiB,CACjB,OAAOmB,GAAkB,CACvB,GAAGnB,EACH,QAASyB,GAAiBzB,EAAO,gBAAgB,CACnD,CAAC,CACH,CAmBO,SAAS0B,GACd1B,EACiB,CACjB,OAAOmB,GAAkB,CACvB,GAAGnB,EACH,QAAS2B,GAAyB,CACpC,CAAC,CACH","names":["EXTRACAO","GAMES","BICHOS","GRUPOS_BICHOS","MESSAGES","ROLES","STATUS_PULE","TIPO_VISUALIZACAO","VISUALIZACAO","PREFIX_NUMBER","PREFIX_ENVIO_OLD","PREFIX_ENVIO","STATUS_DESCARGA","KEYBOARD","STATUS_DEVICE","PREMIOS","COMISSOES_PADRAO","GAMES","getCreatedBySystem","obj","utils_exports","__export","clone","combineDateTime","dateToNumber","delay","dividirArray","formatterBRL","formatterPercentage","formatterPercentageDecimal","generateId","getAllCombinations","getCodigoAuth","getDataInicioFim","getInitials","matchNormalized","normalize","numberToDate","numbersSelectedFormated","parserBRL","parserPercentage","parserPercentageDecimal","pegarHorarioSaoPaulo","removerLetters","showFormatDate","cloneDeep","clone","item","isValid","dateToNumber","date","year","month","day","hour","minute","second","parse","isValid","moment","pegarHorarioSaoPaulo","string","day","month","year","hour","minutes","seconds","milliseconds","numberToDate","number","str","year","month","day","hour","minute","second","dateString","dateNow","pegarHorarioSaoPaulo","date","parse","isValid","combineDateTime","dateA","dateB","dateAParts","numberToDate","dateBParts","year","month","day","hours","minutes","seconds","combinedDate","dateToNumber","setHours","setMinutes","setSeconds","getDataInicioFim","dataAposta","dataInicio","setSeconds","setMinutes","setHours","numberToDate","pegarHorarioSaoPaulo","dataFim","dateToNumber","formatterBRL","value","cloneValue","parserBRL","valueN","generatePermutations","arr","result","i","current","remaining","remainingPermutations","perm","getAllCombinations","num","numArr","permutations","uniqueCombinations","format","showFormatDate","number","formatString","date","numberToDate","numbersSelectedFormated","numbersString","numbers","a","b","result","start","end","i","generateId","prefix","s4","getCodigoAuth","min","max","dividirArray","arrayGrande","tamanho","resultado","i","subarray","delay","ms","resolve","normalize","str","matchNormalized","text","search","normalize","getInitials","nomeCompleto","nome","formatterPercentage","value","parserPercentage","value","newValue","formatterPercentageDecimal","value","parserPercentageDecimal","newValue","removerLetters","value","ExtracaoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","numbers_exports","__export","arredondarParaCima","calculaValoresDosNumeros","calcularValorDeNumero","formatarNumero","generateDescargas","gerarDezenas","getCreatedBySystem","getLimiteSimulado","getNumeroId","getNumerosAcimaDoLimite","getPremioFormato","getPropsEnvioId","getPropsEnvioIdOld","getPropsPrefix","getPropsVP","getSomaEnvio","getSomaProps","getSomaVP","getTiposJogos","sortNumeros","formatarNumero","numero","formato","resultado","indiceNumero","indiceFormato","generateDescarga","numero","id","descargaId","lastEnvioId","DescargaModel","getDescargaIdPeloNumero","numero","getByProperty","valorParaId","arredondarParaCima","generateDescargas","numeros","getByProperty","descargas","numero","descargaId","getDescargaIdPeloNumero","generateDescarga","gerarDezenas","bets","newNumbers","bet","TYPE_GAME","GAMES","number","nums","num","n","formatarNumero","uniqueCombinations","getSomaEnvio","numero","soma","key","value","array","getSomaVP","numero","soma","quantidadeDePulesMaiorQueZero","key","value","somaEnviadoParaAssociacao","getSomaEnvio","getNumeroId","props","dataAposta","jogo","numero","bancaId","premio","descarregado","TYPE_GAME","GAMES","numeroFormatado","formatarNumero","descarregadoFormatado","getTiposJogos","tipos","calcularValorDeNumero","quantidadeDeNumeros","tipoJogo","valorPremio","quantidadeDePremios","TYPE_GAME","GAMES","jogos","getTiposJogos","valorDoNumero","getPremioFormato","premio","PREMIOS","calculaValoresDosNumeros","game","numeros","date","pegarHorarioSaoPaulo","created","dateToNumber","bet","jogos","getTiposJogos","qtd_numeros","jogo","number","prize","premio","TYPE_GAME","GAMES","valorDoNumero","calcularValorDeNumero","premioFormato","getPremioFormato","numeroFormatado","formatarNumero","numberId","getNumeroId","NumberModel","CASAS_DECIMAIS","getNumerosAcimaDoLimite","numeros","valoresJogos","limitesJogos","numero","valorJogo","functionsCore","limiteJogo","v","limiteAtingido","amountArredondado","limiteAtingidoArredondado","diferenca","arredondarParaCima","valor","emCentavos","resto","sortNumeros","numeros","sortedDescargas","a","b","ORDER_GAME_A","GAMES","ORDER_GAME_B","item","getPropsEnvioId","numero","objeto","key","value","array","getPropsEnvioIdOld","numero","objeto","key","value","array","getPropsVP","numero","objeto","key","value","getPropsPrefix","numero","props","PREFIX_ENVIO","PREFIX_ENVIO_OLD","vps","clone","getPropsVP","envio_ids","getPropsEnvioId","envio_ids_old","getPropsEnvioIdOld","getSomaProps","objeto","soma","value","getLimiteJogoPeloTipoJogo","limitsGames","type_game","v","limite_jogos_exports","__export","calcularValorJogoPeloLimite","getLimiteJogoPeloTipoJogo","getValorJogoPeloTipoJogo","calcularValorJogoPeloLimite","limiteJogo","valorJogo","getValorJogoPeloTipoJogo","valuesGames","type_game","v","getLimiteSimulado","tipo_jogo","valores","limites","valorJogo","getValorJogoPeloTipoJogo","limiteSimulado","getLimiteJogoPeloTipoJogo","extracao_exports","__export","extracaoEstaAtivaBoolean","extracaoEstaAtivaTryCatch","getAvailableTimes","pegarExtracoes","format","getDay","games_exports","__export","calculateAmount","calculateAmountGame","fazerJogo","formatPuleId","getBetDateToNumber","getFormattedPuleId","getGamesUnicosList","getGamesUnicosObjeto","invertGame","calculateAmount","betValues","total","item","calculateAmountGame","games","total","bet","calculateAmount","setHours","setMinutes","setSeconds","getBetDateToNumber","date","extracaoDate","dateExtracao","numberToDate","newDateBet","setHours","setMinutes","setSeconds","dateToNumber","formatPuleId","n","getFormattedPuleId","id","parts","invertGame","game","newGame","clone","index","aposta","nums","result","num","n","getAllCombinations","fazerJogo","cart","profile","dateBet","extracao","puleId","game","GameModel","getBetDateToNumber","calculateAmountGame","gameWIthInvertedNumbers","invertGame","numeros","calculaValoresDosNumeros","getGamesUnicosList","GAMES","visu","getGamesUnicosObjeto","acc","item","getAvailableTimes","extracoes","dateBet","showAll","mobile","dateNow","data","getBetDateToNumber","extracoesAtivas","ext","DateBet","numberToDate","validTimes","extracoesFeriado","getDay","format","showFormatDate","extA","extB","format","getDay","pegarExtracoes","extracoes","dataAposta","dateToNumber","pegarHorarioSaoPaulo","dataAgora","retornar","pegar","getHorario","extracao","dataApostaNumerica","getBetDateToNumber","dataAgoraNumerica","dataApostaDate","numberToDate","extracoesAtivas","ext","extracoesDeFeriado","extracoesValidas","getDay","sortExtracoes","dataAgoraDate","horaAgora","format","showFormatDate","a","b","getDay","extracaoEstaAtivaTryCatch","dataAposta","extracao","dataApostaDate","numberToDate","getDay","diaDaSemana","extracaoEstaAtivaBoolean","dataAposta","extracao","extracaoEstaAtivaTryCatch","users_exports","__export","getLimitsRest","getPermission","isAdm","isAdmOrSubAdm","isAssociacao","isCambista","isCambistaTalao","isDigitador","isDigitadorAdm","isDigitadorOrDigitadorAdm","isSuperAdm","IS_ADM","IS_ADM_OR_SUBADM","IS_ASSOCIACAO","IS_SUPER_ADMIN","IS_CAMBISTA_TALAO","IS_CAMBISTA","IS_DIGITADOR_ADM","IS_DIGITADOR","IS_DIGITADOR_AND_ADM","isAdm","user","isAssociacao","isSuperAdm","isAdmOrSubAdm","isCambistaTalao","isCambista","isDigitadorAdm","isDigitador","isDigitadorOrDigitadorAdm","getPermission","getLimitsRest","user","hoje","pre","value","descarga_exports","__export","generateDescarga","generateDescargas","getDescargaIdPeloEnvio","getDescargaIdPeloNumero","getDescargasAcimaDoLimite","getPropsEnvioId","getPropsEnvioIdOldDescarga","getPropsVPDescarga","getTotalGeralDescarga","sortDescargas","sortDescargas","descargas","sortedDescargas","a","b","ORDER_GAME_A","GAMES","ORDER_GAME_B","item","CASAS_DECIMAIS","getDescargasAcimaDoLimite","descargas","valoresJogos","limitesJogos","descarga","valorJogo","functionsCore","limiteJogo","v","limiteAtingido","amountArredondado","limiteAtingidoArredondado","diferenca","getPropsVPDescarga","descarga","objeto","key","value","getPropsEnvioId","descarga","objeto","key","value","array","getPropsEnvioIdOldDescarga","descarga","objeto","key","value","array","getDescargaIdPeloEnvio","numero","envioId","envioKey","PREFIX_ENVIO_OLD","envioValue","somaArredondada","arredondarParaCima","getTotalGeralDescarga","totalBrutoJogos","comissoes","totalGeral","totalBrutoJogosArray","listaComissoes","comissaoRestante","comissao","type_game","totalBrutoJogo","valorJogo","comissaoEncontrada","comissaoPadrao","COMISSOES_PADRAO","functionsCore","numbers_exports","extracao_exports","descarga_exports","games_exports","users_exports","limite_jogos_exports","utils_exports","MessageModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","ResultadoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","RouteModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","UserModel","obj","type","GAMES","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","ValueGameModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","GameModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","getCodigoAuth","STATUS_PULE","NumberModel","obj","ordemPremioExibicao","PREMIOS","ordemJogoExibicao","GAMES","baseModel","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","propsPrefix","getPropsPrefix","PREFIX_ENVIO","PREFIX_ENVIO_OLD","BetModel","obj","PremiacaoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","PDFModel","obj","getCreatedBySystem","BancaModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","AuditLogModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","LimitGameModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","EnvioDescargaModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","STATUS_DESCARGA","DescargaModel","descarga","ordemPremioExibicao","PREMIOS","ordemJogoExibicao","GAMES","baseDescarga","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","propsPrefix","getPropsPrefix","PREFIX_ENVIO","PREFIX_ENVIO_OLD","DeviceModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","PremiacaoAssociacaoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","ComissaoDescargaModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","collections","MessageModel","UserModel","ValueGameModel","LimitGameModel","GameModel","ExtracaoModel","ResultadoModel","RouteModel","EnvioDescargaModel","NumberModel","DescargaModel","PremiacaoModel","PremiacaoAssociacaoModel","PDFModel","BancaModel","AuditLogModel","DeviceModel","ComissaoDescargaModel","MemoryCache","ttl","maxSize","key","item","data","firstKey","createGenericRepo","db","adapter","config","collectionName","model","idSearchStrategy","isolation","cache","authorization","generateId","memoryCache","checkAuthorization","operation","userRole","allowedRoles","getIsolationConstraints","value","buildQuery","options","constraints","field","operator","direction","collection","resolveDocument","id","query","snapshot","getCacheKey","params","isolationKey","cacheKey","cached","docSnap","docRef","result","error","callback","docData","completeData","modelData","docs","d","op","batch","docId","detectFirebaseVersion","firebaseInstance","createV9ModularAdapter","firebaseModular","path","segments","count","fieldValues","createV8Adapter","constraint","createWebAdapter","version","createAutoRepo","createReactNativeAdapter","createConfigs","getBancaId","cacheConfig","authorizationConfigs","withBancaIsolation","config","withoutIsolation","UserModel","BancaModel","ExtracaoModel","ResultadoModel","MessageModel","RouteModel","ValueGameModel","LimitGameModel","GameModel","NumberModel","DescargaModel","PremiacaoModel","PremiacaoAssociacaoModel","PDFModel","AuditLogModel","EnvioDescargaModel","DeviceModel","createRepoFactory","db","adapter","configs","createGenericRepo","createWebRepoFactory","createWebAdapter","createReactNativeRepoFactory","createReactNativeAdapter"]}