{"version":3,"file":"index.750e9b73.js","sources":["../../vite/modulepreload-polyfill","../../src/App.vue","../../src/functions/common.ts","../../src/components/layout/Header/ThemeChanger.vue","../../src/components/layout/Header/HeaderRight.vue","../../src/components/layout/Header/HeaderRightMobile.vue","../../plugin-vue:export-helper","../../src/components/layout/Header/Header.vue","../../src/functions/firebase_setup.ts","../../src/components/Home/ContactSocial.vue","../../../../../avatar_tiger.png","../../../../../flag_tr.png","../../../../../flag_en.png","../../../../../profile.jpg","../../src/components/Home/AboutMe.vue","../../src/components/Home/Projects.vue","../../src/pages/Home.vue","../../src/static/enums.ts","../../src/store/todo.ts","../../src/functions/firebase_db.ts","../../src/functions/firebase_todo.ts","../../src/functions/firebase_auth.ts","../../src/store/session.ts","../../src/components/layout/AuthorizedContent.vue","../../src/components/ToDo/NewTodo.vue","../../src/components/ToDo/Todo.vue","../../src/components/ToDo/Column.vue","../../src/pages/ToDo.vue","../../src/store/tictactoe.ts","../../src/components/TicTacToe/Tile.vue","../../src/components/TicTacToe/Board.vue","../../src/pages/TicTacToe.vue","../../src/components/Spotify/Sidemenu/Navigation.vue","../../src/components/Spotify/Sidemenu/Playlists.vue","../../src/components/Spotify/MobileMenu.vue","../../src/components/Spotify/Header/Dropmenu.vue","../../src/components/Spotify/Header/Right.vue","../../src/components/Spotify/Content.vue","../../src/functions/firebase_balance.ts","../../src/store/balance.ts","../../src/components/Balance/Year/YearSelection.vue","../../src/components/Balance/Year/MonthBox.vue","../../src/pages/Balance.vue","../../src/components/Balance/TypeIcon.vue","../../src/components/Balance/DeleteModal.vue","../../src/components/Balance/Month/ItemMenu.vue","../../src/components/Balance/Month/ItemRow.vue","../../src/components/Balance/Month/ItemTypeSelection.vue","../../src/components/Balance/ItemModal.vue","../../src/components/Balance/Month/ItemButtons.vue","../../src/pages/BalanceMonth.vue","../../src/router/index.ts","../../src/main.ts"],"sourcesContent":["const p = function polyfill() {\n const relList = document.createElement('link').relList;\n if (relList && relList.supports && relList.supports('modulepreload')) {\n return;\n }\n for (const link of document.querySelectorAll('link[rel=\"modulepreload\"]')) {\n processPreload(link);\n }\n new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type !== 'childList') {\n continue;\n }\n for (const node of mutation.addedNodes) {\n if (node.tagName === 'LINK' && node.rel === 'modulepreload')\n processPreload(node);\n }\n }\n }).observe(document, { childList: true, subtree: true });\n function getFetchOpts(script) {\n const fetchOpts = {};\n if (script.integrity)\n fetchOpts.integrity = script.integrity;\n if (script.referrerpolicy)\n fetchOpts.referrerPolicy = script.referrerpolicy;\n if (script.crossorigin === 'use-credentials')\n fetchOpts.credentials = 'include';\n else if (script.crossorigin === 'anonymous')\n fetchOpts.credentials = 'omit';\n else\n fetchOpts.credentials = 'same-origin';\n return fetchOpts;\n }\n function processPreload(link) {\n if (link.ep)\n // ep marker = processed\n return;\n link.ep = true;\n // prepopulate the load record\n const fetchOpts = getFetchOpts(link);\n fetch(link.href, fetchOpts);\n }\n};__VITE_IS_MODERN__&&p();","\n\n\n","export const scrollIntoView = (id: string) => {\n\tconst el = document.getElementById(id)\n\tel?.scrollIntoView({ behavior: 'smooth' })\n}\n","\n\n\n","\n\n\n","\n\n\n","\nexport default (sfc, props) => {\n const target = sfc.__vccOpts || sfc;\n for (const [key, val] of props) {\n target[key] = val;\n }\n return target;\n}\n","\n\n\n\n\n","import { initializeApp } from 'firebase/app'\nimport { getAuth } from 'firebase/auth'\nimport { getFirestore } from 'firebase/firestore'\n\nconst firebaseApp = initializeApp({\n\tapiKey: 'AIzaSyCNFOnSVhcMYPtrTGs7QCmNM9nf4CM3o-0',\n\tauthDomain: 'portfolio-69af6.firebaseapp.com',\n\tprojectId: 'portfolio-69af6',\n\tstorageBucket: 'portfolio-69af6.appspot.com',\n\tmessagingSenderId: '410344053740',\n\tappId: '1:410344053740:web:244240728283e7c286fec9',\n\tmeasurementId: 'G-D3RZG0VMZ7'\n})\nexport const auth = getAuth(firebaseApp)\nexport const firestore = getFirestore(firebaseApp)\n","\n\n\n","export default \"/avatar_tiger.png\"","export default \"/flag_tr.png\"","export default \"/flag_en.png\"","export default \"/profile.jpg\"","\n\n\n","\n\n\n\n\n","\n\n\n\n\n","/** Possible values for todo items */\nexport enum TodoStatus {\n\tTODO,\n\tIN_PROGRESS,\n\tDONE,\n\tDELETED\n}\n\n/** Possible values for tic-tac-toe tiles */\nexport enum TileValues {\n\tEMPTY,\n\tX,\n\tO\n}\n\nexport enum BalanceType {\n\tELECTRICITY = 'ELECTRICITY',\n\tWATER = 'WATER',\n\tGAS = 'GAS',\n\tINTERNET = 'INTERNET',\n\tPHONE = 'PHONE',\n\tRENT = 'RENT',\n\tCREDIT = 'CREDIT',\n\tMARKET = 'MARKET',\n\tEXPENDITURE = 'EXPENDITURE',\n\tSALARY = 'SALARY',\n\tINCOME = 'INCOME'\n}\n","import type { Todo } from '@/functions/firebase_types'\nimport { TodoStatus } from '@/static/enums'\nimport { defineStore } from 'pinia'\nimport { auth } from '@/functions/firebase_setup'\nimport { Timestamp } from 'firebase/firestore'\n\ninterface State {\n\ttodoList: Todo[]\n\tnewTodo: Todo | null\n}\n\nexport const useTodoStore = defineStore('todo', {\n\tstate: (): State => ({\n\t\ttodoList: [],\n\t\tnewTodo: null\n\t}),\n\tgetters: {\n\t\tgetTodoList: state => state.todoList,\n\t\tgetTodoByStatus: state => (status: TodoStatus) =>\n\t\t\tstate.todoList.filter(f => f.Status === status),\n\t\tgetTodoById: state => (Id: string) =>\n\t\t\tstate.todoList.find(f => f.Id === Id),\n\t\tgetStatusText: () => (status: TodoStatus) => {\n\t\t\tswitch (status) {\n\t\t\t\tcase TodoStatus.TODO:\n\t\t\t\t\treturn 'To-do'\n\t\t\t\tcase TodoStatus.IN_PROGRESS:\n\t\t\t\t\treturn 'In progress'\n\t\t\t\tcase TodoStatus.DONE:\n\t\t\t\t\treturn 'Done'\n\t\t\t\tcase TodoStatus.DELETED:\n\t\t\t\t\treturn 'Deleted'\n\t\t\t\tdefault:\n\t\t\t\t\treturn ''\n\t\t\t}\n\t\t}\n\t},\n\tactions: {\n\t\tupdateTodoList(data: Todo[]) {\n\t\t\tthis.todoList = data\n\t\t},\n\t\tupdateTodo(data: Todo) {\n\t\t\tconst todoToUpdate = this.todoList.find(f => f.Id === data.Id)\n\t\t\tObject.assign(todoToUpdate, data)\n\t\t},\n\t\tupdateTodoStatus(data: Todo) {\n\t\t\tconst todoToUpdate = this.todoList.find(f => f.Id === data.Id)\n\t\t\tObject.assign(todoToUpdate, {\n\t\t\t\t...todoToUpdate,\n\t\t\t\tStatus: data.Status\n\t\t\t})\n\t\t},\n\t\tcreateNewTodo(status: TodoStatus) {\n\t\t\tconst currentTimestamp = Timestamp.fromDate(new Date())\n\t\t\tthis.newTodo = {\n\t\t\t\tUserId: auth.currentUser?.uid,\n\t\t\t\tTitle: '',\n\t\t\t\tDescription: '',\n\t\t\t\tCreateDate: currentTimestamp,\n\t\t\t\tUpdateDate: currentTimestamp,\n\t\t\t\tStatus: status\n\t\t\t}\n\t\t},\n\t\taddTodoToList(todo: Todo) {\n\t\t\tthis.todoList.push(todo)\n\t\t\tthis.newTodo = null\n\t\t},\n\t\tcancelNewTodo() {\n\t\t\tthis.newTodo = null\n\t\t}\n\t}\n})\n","import {\n\tcollection,\n\tDocumentData,\n\tCollectionReference,\n\tDocumentReference\n} from 'firebase/firestore'\nimport { firestore } from './firebase_setup'\nimport { Todo, Balance } from './firebase_types'\n\n/* This is just a helper to add the type to the db responses */\nconst createCollection = (collectionName: string) => {\n\treturn collection(firestore, collectionName) as CollectionReference\n}\n/** Returns sub-collection of a document with associated types */\nexport const createSubCollectionFromDocId = (\n\tcolRef: CollectionReference,\n\tdocId: string,\n\tsubCollectionName: string\n) => {\n\treturn collection(\n\t\tcolRef,\n\t\tdocId,\n\t\tsubCollectionName\n\t) as CollectionReference\n}\n\nexport const todoCol = createCollection('ToDo')\nexport const balanceCol = createCollection('Balance')\n","import type { Todo } from './firebase_types'\nimport {\n\tquery,\n\twhere,\n\tdoc,\n\tgetDoc,\n\tgetDocs,\n\tsetDoc,\n\taddDoc,\n\torderBy,\n\tDocumentReference\n} from 'firebase/firestore'\nimport { auth } from './firebase_setup'\nimport { TodoStatus } from '../static/enums'\nimport { todoCol } from './firebase_db'\n\nexport const getTodos = async (): Promise => {\n\tif (auth?.currentUser?.uid) {\n\t\tconst q = query(\n\t\t\ttodoCol,\n\t\t\twhere('UserId', '==', auth?.currentUser?.uid),\n\t\t\twhere('Status', '!=', TodoStatus.DELETED),\n\t\t\torderBy('Status'),\n\t\t\torderBy('CreateDate')\n\t\t)\n\t\tconst todoSnapshot = await getDocs(q)\n\t\tconst todoList = todoSnapshot.docs.map(doc => {\n\t\t\tconst data = doc.data()\n\t\t\tdata.Id = doc.id\n\t\t\treturn data\n\t\t})\n\t\treturn todoList\n\t}\n}\n\nexport const saveTodo = async (todo: Todo): Promise => {\n\tlet docRef: DocumentReference\n\tif (todo.Id) {\n\t\t// If editing an existing todo, just update the changed fields\n\t\tdocRef = doc(todoCol, todo.Id)\n\t\tawait setDoc(\n\t\t\tdocRef,\n\t\t\t{\n\t\t\t\tDescription: todo.Description,\n\t\t\t\tStatus: todo.Status,\n\t\t\t\tUpdateDate: new Date()\n\t\t\t},\n\t\t\t{ merge: true }\n\t\t)\n\t} else {\n\t\tdocRef = await addDoc(todoCol, todo)\n\t}\n\tconst docSnapshot = await getDoc(docRef)\n\tconst docData = docSnapshot.data()\n\tdocData!.Id = docRef.id\n\treturn docData\n}\n\nexport const deleteTodo = async (todo: Todo) => {\n\tconst todoRef = doc(todoCol, todo.Id)\n\tsetDoc(\n\t\ttodoRef,\n\t\t{ Status: TodoStatus.DELETED, UpdateDate: new Date() },\n\t\t{ merge: true }\n\t)\n}\n","import { auth } from './firebase_setup'\nimport firebase from 'firebase/compat/app'\nimport * as firebaseui from 'firebaseui'\n// import 'firebaseui/dist/firebaseui.css'\n\nexport const uiConfig = {\n\tsignInSuccessUrl: window.location.href,\n\tsignInOptions: [\n\t\t// Leave the lines as is for the providers you want to offer your users.\n\t\tfirebase.auth.GoogleAuthProvider.PROVIDER_ID\n\t\t// firebase.auth.FacebookAuthProvider.PROVIDER_ID,\n\t\t// firebase.auth.TwitterAuthProvider.PROVIDER_ID,\n\t\t// firebase.auth.GithubAuthProvider.PROVIDER_ID,\n\t\t// firebase.auth.EmailAuthProvider.PROVIDER_ID,\n\t\t// firebase.auth.PhoneAuthProvider.PROVIDER_ID,\n\t\t// firebaseui.auth.AnonymousAuthProvider.PROVIDER_ID\n\t]\n\t// tosUrl and privacyPolicyUrl accept either url string or a callback function.\n\t// Terms of service url/callback.\n\t// tosUrl: '/tos',\n\t// Privacy policy url/callback.\n\t// privacyPolicyUrl: function() {\n\t// \twindow.location.assign('/privacypolicy')\n\t// }\n}\nconst firebaseAuthUI = new firebaseui.auth.AuthUI(auth)\nexport const startFirebaseAuthUI = () => {\n\tfirebaseAuthUI.start('#firebaseui-auth-container', uiConfig)\n}\n","import type { User } from 'firebase/auth'\nimport { defineStore } from 'pinia'\nimport { onAuthStateChanged } from 'firebase/auth'\nimport { auth } from '@/functions/firebase_setup'\n\ninterface State {\n\tcurrentUser: User | 'LOADING' | null\n}\n\nexport const useSessionStore = defineStore('session', {\n\tstate: (): State => ({\n\t\tcurrentUser: 'LOADING'\n\t}),\n\tgetters: {\n\t\tgetCurrentUser: state => state.currentUser\n\t},\n\tactions: {\n\t\tsetUser(user: State['currentUser']) {\n\t\t\tthis.currentUser = user\n\t\t}\n\t}\n})\n\nonAuthStateChanged(auth, user => {\n\tconst sessionStore = useSessionStore()\n\tsessionStore.setUser(user)\n})\n","\n\n\n","\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n","import { defineStore } from 'pinia'\nimport { TileValues } from '@/static/enums'\n\ninterface State {\n\tboard: TileValues[][]\n}\n\nconst initialRow = [TileValues.EMPTY, TileValues.EMPTY, TileValues.EMPTY]\nconst doMove = (\n\tboard: TileValues[][],\n\tx: number,\n\ty: number,\n\tvalue: TileValues\n) => {\n\tboard[x][y] = value\n}\nconst hasPlayerWonBoard = (board: TileValues[][], playerTile: TileValues) => {\n\t// Horizontal rows\n\tfor (let i = 0; i < 3; i++) {\n\t\tif (\n\t\t\tboard[0][i] === playerTile &&\n\t\t\tboard[1][i] === playerTile &&\n\t\t\tboard[2][i] === playerTile\n\t\t) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// Vertical rows\n\tfor (let i = 0; i < 3; i++) {\n\t\tif (\n\t\t\tboard[i][0] === playerTile &&\n\t\t\tboard[i][1] === playerTile &&\n\t\t\tboard[i][2] === playerTile\n\t\t) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\tif (\n\t\tboard[0][0] === playerTile &&\n\t\tboard[1][1] === playerTile &&\n\t\tboard[2][2] === playerTile\n\t) {\n\t\treturn true\n\t}\n\tif (\n\t\tboard[0][2] === playerTile &&\n\t\tboard[1][1] === playerTile &&\n\t\tboard[2][0] === playerTile\n\t) {\n\t\treturn true\n\t}\n\n\treturn false\n}\nconst getAiBoardScore = (board: TileValues[][]) => {\n\tlet score = 0\n\t// If AI has won, increase the score because it is desirable\n\tif (hasPlayerWonBoard(board, TileValues.O)) {\n\t\tscore += 100\n\t}\n\t// If player has won, reduce the score because it is undesirable\n\tif (hasPlayerWonBoard(board, TileValues.X)) {\n\t\tscore -= 100\n\t}\n\treturn score\n}\nconst getBoardPossibleMoves = (board: TileValues[][]) => {\n\tlet moves = []\n\tfor (let x = 0; x < 3; x++) {\n\t\tfor (let y = 0; y < 3; y++) {\n\t\t\tif (board[x][y] === TileValues.EMPTY) {\n\t\t\t\tmoves.push({ x, y })\n\t\t\t}\n\t\t}\n\t}\n\treturn moves\n}\nconst cloneBoard = (board: TileValues[][]) => {\n\tlet boardClone: TileValues[][] = []\n\tfor (let x = 0; x < 3; x++) {\n\t\tboardClone.push([])\n\t\tfor (let y = 0; y < 3; y++) {\n\t\t\tboardClone[x][y] = board[x][y]\n\t\t}\n\t}\n\treturn boardClone\n}\n\nexport const useTictactoeStore = defineStore('tictactoe', {\n\tstate: (): State => ({\n\t\tboard: [[...initialRow], [...initialRow], [...initialRow]]\n\t}),\n\tgetters: {\n\t\t/**\n\t\t * @param {TileValues} playerTile - The player to check the win condition for\n\t\t * @returns {boolean} If the specified player has won the game\n\t\t */\n\t\thasWon:\n\t\t\tstate =>\n\t\t\t(playerTile: TileValues): boolean => {\n\t\t\t\treturn hasPlayerWonBoard(state.board, playerTile)\n\t\t\t},\n\t\thasPlayerWon(): boolean {\n\t\t\treturn this.hasWon(TileValues.X)\n\t\t},\n\t\thasAIWon(): boolean {\n\t\t\treturn this.hasWon(TileValues.O)\n\t\t},\n\t\tisGameCompleted(): boolean {\n\t\t\treturn (\n\t\t\t\tthis.hasPlayerWon ||\n\t\t\t\tthis.hasAIWon ||\n\t\t\t\tthis.getPossibleMoves.length === 0\n\t\t\t)\n\t\t},\n\t\tgetPossibleMoves: state => {\n\t\t\treturn getBoardPossibleMoves(state.board)\n\t\t}\n\t},\n\tactions: {\n\t\tdoMove(x: number, y: number, value: TileValues) {\n\t\t\tdoMove(this.board, x, y, value)\n\t\t},\n\t\tplayerMove(x: number, y: number) {\n\t\t\tthis.doMove(x, y, TileValues.X)\n\t\t\tconst bestMove = this.getBestAiMove(this.board, TileValues.O)\n\t\t\tif (bestMove.move) {\n\t\t\t\tthis.doMove(bestMove.move.x, bestMove.move.y, TileValues.O)\n\t\t\t}\n\t\t},\n\t\tgetBestAiMove(\n\t\t\tboard: TileValues[][],\n\t\t\tplayer: TileValues,\n\t\t\tdepth = 0\n\t\t): { score: number; move: { x: number; y: number } | null } {\n\t\t\t// If game is completed, don't calculate next move\n\t\t\tconst possibleMoves = getBoardPossibleMoves(board)\n\t\t\tif (\n\t\t\t\thasPlayerWonBoard(board, TileValues.X) ||\n\t\t\t\thasPlayerWonBoard(board, TileValues.O) ||\n\t\t\t\tpossibleMoves.length === 0\n\t\t\t) {\n\t\t\t\treturn { score: getAiBoardScore(board) + depth, move: null }\n\t\t\t}\n\n\t\t\t// The algorithm wants to maximize AI's score and minimize the player's score\n\t\t\tlet bestScore = player === TileValues.O ? -1000 : 1000\n\t\t\tlet bestMove = null\n\n\t\t\t// If game is not completed, calculate score for each possible next move, recursively\n\t\t\tfor (let i = 0; i < possibleMoves.length; i++) {\n\t\t\t\tlet move = possibleMoves[i]\n\n\t\t\t\tconst boardClone = cloneBoard(board)\n\n\t\t\t\t// Do the next possible move and recursively call this method again\n\t\t\t\tdoMove(boardClone, move.x, move.y, player)\n\t\t\t\tconst nextPlayer =\n\t\t\t\t\tplayer === TileValues.X ? TileValues.O : TileValues.X\n\t\t\t\tconst nextMove = this.getBestAiMove(\n\t\t\t\t\tboardClone,\n\t\t\t\t\tnextPlayer,\n\t\t\t\t\tdepth + 1\n\t\t\t\t)\n\t\t\t\tif (\n\t\t\t\t\t(player === TileValues.O && nextMove.score > bestScore) ||\n\t\t\t\t\t(player === TileValues.X && nextMove.score < bestScore)\n\t\t\t\t) {\n\t\t\t\t\tbestScore = nextMove.score\n\t\t\t\t\tbestMove = move\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { score: bestScore, move: bestMove }\n\t\t},\n\t\tresetBoard() {\n\t\t\tthis.board = [[...initialRow], [...initialRow], [...initialRow]]\n\t\t}\n\t}\n})\n","\n\n\n\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n\n","import { addDoc, DocumentReference } from 'firebase/firestore'\nimport type { Balance, BalanceItem } from './firebase_types'\nimport { query, where, doc, getDoc, getDocs, setDoc } from 'firebase/firestore'\nimport { BalanceType } from '@/static/enums'\nimport { auth } from './firebase_setup'\nimport { balanceCol, createSubCollectionFromDocId } from './firebase_db'\n\nconst createDocId = (userId: string, year: number, month: number) => {\n\treturn `${userId}_${year}-${month}`\n}\n\nexport const getSummariesOfYear = async (\n\tyear: number\n): Promise => {\n\tif (auth?.currentUser?.uid) {\n\t\tconst q = query(\n\t\t\tbalanceCol,\n\t\t\twhere('UserId', '==', auth.currentUser.uid),\n\t\t\twhere('Year', '==', year),\n\t\t\twhere('isDeleted', '==', false)\n\t\t)\n\t\tconst snapshot = await getDocs(q)\n\t\tconst list = snapshot.docs.map(doc => {\n\t\t\tconst data = doc.data()\n\t\t\tdata.Id = doc.id\n\t\t\tdoc.ref\n\t\t\treturn data\n\t\t})\n\t\treturn list\n\t}\n}\n\nexport const getSummaryOfMonth = async (\n\tyear: number,\n\tmonth: number\n): Promise => {\n\tif (auth?.currentUser?.uid) {\n\t\tconst q = query(\n\t\t\tbalanceCol,\n\t\t\twhere('UserId', '==', auth.currentUser.uid),\n\t\t\twhere('Year', '==', year),\n\t\t\twhere('Month', '==', month),\n\t\t\twhere('isDeleted', '==', false)\n\t\t)\n\t\tconst snapshot = await getDocs(q)\n\t\tconst list = snapshot.docs.map(doc => {\n\t\t\tconst data = doc.data()\n\t\t\tdata.Id = doc.id\n\t\t\tdoc.ref\n\t\t\treturn data\n\t\t})\n\t\treturn list\n\t}\n}\n\nexport const getItemsOfMonth = async (\n\tyear: number,\n\tmonth: number\n): Promise => {\n\tif (auth?.currentUser?.uid) {\n\t\tconst itemsRef = createSubCollectionFromDocId(\n\t\t\tbalanceCol,\n\t\t\tcreateDocId(auth.currentUser.uid, year, month),\n\t\t\t'Item'\n\t\t)\n\t\tconst q = query(itemsRef, where('isDeleted', '==', false))\n\t\tconst snapshot = await getDocs(q)\n\t\tconst list = snapshot.docs.map(doc => {\n\t\t\tconst data = doc.data()\n\t\t\tdata.Id = doc.id\n\t\t\treturn data\n\t\t})\n\t\treturn list\n\t}\n}\n\n/** Checks if a document for a given year and month already exists */\nexport const checkIfDocumentExists = async (\n\tyear: number,\n\tmonth: number\n): Promise => {\n\tconst parentDoc = doc(\n\t\tbalanceCol,\n\t\tcreateDocId(auth!.currentUser!.uid, year, month)\n\t)\n\tconst docToCheck = await getDoc(parentDoc)\n\tconst data = docToCheck.data()\n\treturn !!data\n}\n\nexport const isExpenditure = (type: BalanceType) => {\n\tswitch (type) {\n\t\tcase BalanceType.ELECTRICITY:\n\t\tcase BalanceType.WATER:\n\t\tcase BalanceType.GAS:\n\t\tcase BalanceType.INTERNET:\n\t\tcase BalanceType.PHONE:\n\t\tcase BalanceType.RENT:\n\t\tcase BalanceType.CREDIT:\n\t\tcase BalanceType.MARKET:\n\t\tcase BalanceType.EXPENDITURE:\n\t\t\treturn true\n\t\tcase BalanceType.SALARY:\n\t\tcase BalanceType.INCOME:\n\t\t\treturn false\n\n\t\tdefault:\n\t\t\treturn true\n\t}\n}\n\n/** Updates the saved item's parent collection's summary values */\nexport const saveParentItem = async (\n\titem: BalanceItem,\n\tyear: number,\n\tmonth: number,\n\toriginalItem?: BalanceItem\n) => {\n\tconst parentDocRef = doc(\n\t\tbalanceCol,\n\t\tcreateDocId(auth!.currentUser!.uid, year, month)\n\t)\n\tconst parentDocSnapshot = await getDoc(parentDocRef)\n\tconst parentDoc = parentDocSnapshot.data()\n\n\tif (item.isDeleted) {\n\t\t// If deleting the item, decrement TotalExpenditure/TotalIncome accordingly\n\t\tif (isExpenditure(item.Type)) {\n\t\t\tparentDoc!.TotalExpenditure -= item.Amount\n\t\t} else {\n\t\t\tparentDoc!.TotalIncome -= item.Amount\n\t\t}\n\t} else {\n\t\t// If adding/updating the item, increment TotalExpenditure/TotalIncome accordingly\n\t\tlet shift = item.Amount\n\t\tif (originalItem) {\n\t\t\t// If updating an existing item, shift the TotalExpenditure/TotalIncome depending on diff between new and old values\n\t\t\tshift -= originalItem.Amount\n\t\t}\n\t\tif (isExpenditure(item.Type)) {\n\t\t\tparentDoc!.TotalExpenditure += shift\n\t\t} else {\n\t\t\tparentDoc!.TotalIncome += shift\n\t\t}\n\t}\n\tawait setDoc(parentDocRef, parentDoc)\n}\n\n/** Checks if there is an existing document for the given year-month\n * If it exists, adds the balance item into the document's 'Item' collection\n * Otherwise, creates a new 'Item' collection and saves the balance item in it\n * Then updates the summary object depending on BalanceItem's Type\n */\nexport const saveItem = async (\n\titem: BalanceItem,\n\tyear: number,\n\tmonth: number,\n\toriginalItem?: BalanceItem\n): Promise => {\n\tif (!auth?.currentUser?.uid) {\n\t\treturn\n\t}\n\n\tconst parentDocumentExists = await checkIfDocumentExists(year, month)\n\tif (!item.Id && !parentDocumentExists) {\n\t\t// If the parent document doesn't exist yet, we create the parent document with default values\n\t\tconst newDocRef = doc(\n\t\t\tbalanceCol,\n\t\t\tcreateDocId(auth.currentUser.uid, year, month)\n\t\t)\n\t\tconst newDoc: Balance = {\n\t\t\tUserId: auth.currentUser.uid,\n\t\t\tYear: year,\n\t\t\tMonth: month,\n\t\t\tTotalIncome: 0,\n\t\t\tTotalExpenditure: 0,\n\t\t\tisDeleted: false\n\t\t}\n\t\tawait setDoc(newDocRef, newDoc)\n\t}\n\n\t// Save the item\n\tconst itemsRef = createSubCollectionFromDocId(\n\t\tbalanceCol,\n\t\tcreateDocId(auth.currentUser.uid, year, month),\n\t\t'Item'\n\t)\n\n\tlet itemRef: DocumentReference\n\tif (item.Id) {\n\t\titemRef = doc(itemsRef, item.Id)\n\t\tawait setDoc(itemRef, item)\n\t} else {\n\t\titemRef = await addDoc(itemsRef, item)\n\t}\n\n\tsaveParentItem(item, year, month, originalItem)\n\n\tconst docSnapshot = await getDoc(itemRef)\n\tconst docData = docSnapshot.data()\n\tdocData!.Id = itemRef.id\n\treturn docData\n}\n\nexport const deleteItem = async (\n\titem: BalanceItem,\n\tyear: number,\n\tmonth: number\n): Promise => {\n\tif (auth?.currentUser?.uid) {\n\t\tconst itemsRef = createSubCollectionFromDocId(\n\t\t\tbalanceCol,\n\t\t\tcreateDocId(auth.currentUser.uid, year, month),\n\t\t\t'Item'\n\t\t)\n\t\tconst itemRef = doc(itemsRef, item.Id)\n\t\titem.isDeleted = true\n\t\tawait setDoc(itemRef, item)\n\n\t\tsaveParentItem(item, year, month)\n\n\t\tconst docSnapshot = await getDoc(itemRef)\n\t\tconst docData = docSnapshot.data()\n\t\tdocData!.Id = itemRef.id\n\t\tif (docData?.isDeleted) {\n\t\t\treturn docData\n\t\t}\n\t}\n}\n","import type { Balance, BalanceItem } from '@/functions/firebase_types'\nimport { defineStore } from 'pinia'\nimport { Timestamp } from 'firebase/firestore'\nimport { BalanceType } from '@/static/enums'\nimport {\n\tgetSummariesOfYear,\n\tgetItemsOfMonth,\n\tisExpenditure,\n\tsaveItem,\n\tdeleteItem\n} from '@/functions/firebase_balance'\n\ninterface State {\n\tselectedYear: number\n\tselectedMonth: number\n\tsummariesOfYear: Balance[]\n\titemsOfMonth: BalanceItem[]\n\teditedItem?: BalanceItem\n\tisExpenditure: boolean\n}\n\nconst monthNames = [\n\t'January',\n\t'February',\n\t'March',\n\t'April',\n\t'May',\n\t'June',\n\t'July',\n\t'August',\n\t'September',\n\t'October',\n\t'November',\n\t'December'\n]\nexport const useBalanceStore = defineStore('balance', {\n\tstate: (): State => ({\n\t\tselectedYear: new Date().getFullYear(),\n\t\tselectedMonth: new Date().getMonth() + 1,\n\t\tsummariesOfYear: [],\n\t\titemsOfMonth: [],\n\t\teditedItem: undefined,\n\t\tisExpenditure: false\n\t}),\n\tgetters: {\n\t\tgetSortedItems: state => {\n\t\t\treturn state.itemsOfMonth.sort((a, b) => {\n\t\t\t\tif (isExpenditure(a.Type) && !isExpenditure(b.Type)) return 1\n\t\t\t\tif (!isExpenditure(a.Type) && isExpenditure(b.Type)) return -1\n\t\t\t\treturn b.Amount - a.Amount\n\t\t\t})\n\t\t},\n\t\tgetSummary: state => (month: number) => {\n\t\t\treturn state.summariesOfYear.find(\n\t\t\t\tf => f.Year === state.selectedYear && f.Month === month\n\t\t\t)\n\t\t},\n\t\tgetMonthName: () => (month: number) => {\n\t\t\treturn monthNames[month - 1]\n\t\t},\n\t\tgetTypeName: () => (type: BalanceType) => {\n\t\t\tswitch (type) {\n\t\t\t\tcase BalanceType.ELECTRICITY:\n\t\t\t\t\treturn 'Electricity'\n\t\t\t\tcase BalanceType.WATER:\n\t\t\t\t\treturn 'Water'\n\t\t\t\tcase BalanceType.GAS:\n\t\t\t\t\treturn 'Gas'\n\t\t\t\tcase BalanceType.INTERNET:\n\t\t\t\t\treturn 'Internet'\n\t\t\t\tcase BalanceType.PHONE:\n\t\t\t\t\treturn 'Phone'\n\t\t\t\tcase BalanceType.RENT:\n\t\t\t\t\treturn 'Rent'\n\t\t\t\tcase BalanceType.CREDIT:\n\t\t\t\t\treturn 'Credit Card'\n\t\t\t\tcase BalanceType.MARKET:\n\t\t\t\t\treturn 'Market'\n\t\t\t\tcase BalanceType.EXPENDITURE:\n\t\t\t\t\treturn 'Other Expense'\n\t\t\t\tcase BalanceType.SALARY:\n\t\t\t\t\treturn 'Salary'\n\t\t\t\tcase BalanceType.INCOME:\n\t\t\t\t\treturn 'Other Income'\n\t\t\t\tdefault:\n\t\t\t\t\treturn 'Other'\n\t\t\t}\n\t\t}\n\t},\n\tactions: {\n\t\tasync getSummariesOfYear() {\n\t\t\tconst summariesOfYear = await getSummariesOfYear(this.selectedYear)\n\t\t\tthis.summariesOfYear = summariesOfYear ?? []\n\t\t},\n\t\tasync getItemsOfMonth(year: number, month: number) {\n\t\t\tconst itemsOfMonth = await getItemsOfMonth(year, month)\n\t\t\tthis.itemsOfMonth = itemsOfMonth ?? []\n\t\t},\n\t\tcreateNewItem(isExpenditure: boolean) {\n\t\t\tthis.isExpenditure = isExpenditure\n\t\t\tconst currentTimestamp = Timestamp.fromDate(new Date())\n\t\t\tthis.editedItem = {\n\t\t\t\tType: isExpenditure\n\t\t\t\t\t? BalanceType.ELECTRICITY\n\t\t\t\t\t: BalanceType.SALARY,\n\t\t\t\tCustomName: isExpenditure\n\t\t\t\t\t? this.getTypeName(BalanceType.ELECTRICITY)\n\t\t\t\t\t: this.getTypeName(BalanceType.SALARY),\n\t\t\t\tAmount: 0,\n\t\t\t\tNote: '',\n\t\t\t\tOrder: 1,\n\t\t\t\tCreateDate: currentTimestamp,\n\t\t\t\tUpdateDate: currentTimestamp,\n\t\t\t\tisDeleted: false\n\t\t\t}\n\t\t},\n\t\teditItem(item: BalanceItem) {\n\t\t\tthis.isExpenditure = isExpenditure(item.Type)\n\t\t\tthis.editedItem = { ...item }\n\t\t},\n\t\tasync saveItem(year: number, month: number) {\n\t\t\tconst initialId = this?.editedItem?.Id\n\t\t\tconst originalItem = this.itemsOfMonth.find(f => f.Id === initialId)\n\t\t\tconst item = await saveItem(\n\t\t\t\tthis.editedItem!,\n\t\t\t\tyear,\n\t\t\t\tmonth,\n\t\t\t\toriginalItem\n\t\t\t)\n\t\t\tif (item) {\n\t\t\t\tif (initialId) {\n\t\t\t\t\tlet itemIndex = this.itemsOfMonth.findIndex(\n\t\t\t\t\t\tf => f.Id === initialId\n\t\t\t\t\t)\n\t\t\t\t\tthis.itemsOfMonth.splice(itemIndex, 1, item)\n\t\t\t\t} else {\n\t\t\t\t\tthis.itemsOfMonth.push(item)\n\t\t\t\t}\n\t\t\t\tthis.clearEditedItem()\n\t\t\t}\n\t\t},\n\t\tclearEditedItem() {\n\t\t\tthis.editedItem = undefined\n\t\t},\n\t\tasync deleteBalanceItem(\n\t\t\titem: BalanceItem,\n\t\t\tyear: number,\n\t\t\tmonth: number\n\t\t) {\n\t\t\titem.isDeleted = false\n\t\t\tconst deletedItem = await deleteItem(item, year, month)\n\t\t\tif (deletedItem) {\n\t\t\t\tthis.itemsOfMonth = this.itemsOfMonth.filter(\n\t\t\t\t\tf => f.Id !== item.Id\n\t\t\t\t)\n\t\t\t}\n\t\t\tthis.clearEditedItem()\n\t\t}\n\t}\n})\n","\n\n\n","\n\n\n\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n\n\n\n","\n\n\n","\n\n\n","\n\n\n","\n\n\n\n\n","\n\n\n","import type { Router } from 'vue-router'\nimport { createRouter, createWebHistory } from 'vue-router'\nimport MainContent from '../pages/MainContent.vue'\nimport Home from '../pages/Home.vue'\nimport ToDo from '../pages/ToDo.vue'\nimport TicTacToe from '../pages/TicTacToe.vue'\nimport Spotify from '../pages/Spotify.vue'\nimport Balance from '../pages/Balance.vue'\nimport BalanceMonth from '../pages/BalanceMonth.vue'\n\nconst router: Router = createRouter({\n\thistory: createWebHistory(),\n\troutes: [\n\t\t{\n\t\t\tname: 'root',\n\t\t\tpath: '/',\n\t\t\tcomponents: {\n\t\t\t\tmainContent: MainContent\n\t\t\t},\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\tname: 'homepage',\n\t\t\t\t\tpath: '/',\n\t\t\t\t\tcomponents: {\n\t\t\t\t\t\tmain: Home\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'todo',\n\t\t\t\t\tpath: '/todo',\n\t\t\t\t\tcomponents: {\n\t\t\t\t\t\tmain: ToDo\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'tictactoe',\n\t\t\t\t\tpath: '/tictactoe',\n\t\t\t\t\tcomponents: {\n\t\t\t\t\t\tmain: TicTacToe\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'balance',\n\t\t\t\t\tpath: '/balance',\n\t\t\t\t\tcomponents: {\n\t\t\t\t\t\tmain: Balance\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'balance_month',\n\t\t\t\t\tpath: '/balance/:year/:month',\n\t\t\t\t\tcomponents: {\n\t\t\t\t\t\tmain: BalanceMonth\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\tname: 'spotify',\n\t\t\tpath: '/spotify',\n\t\t\tcomponents: {\n\t\t\t\tmainContent: Spotify\n\t\t\t}\n\t\t}\n\t]\n})\n\nexport default router\n","import { createApp } from 'vue'\nimport App from './App.vue'\nimport router from './router/index'\nimport './index.css'\nimport { createPinia } from 'pinia'\n\nconst app = createApp(App)\napp.use(router)\napp.use(createPinia())\napp.mount('#app')\n"],"names":["getFirestore","Timestamp","collection","query","where","orderBy","getDocs","doc","setDoc","addDoc","getDoc","firebaseui.auth","ToDo","TicTacToe","Balance","BalanceMonth","Spotify","App"],"mappings":"ojCAAA,KAAM,IAAI,UAAoB,CAC1B,KAAM,GAAU,SAAS,cAAc,QAAQ,QAC/C,GAAI,GAAW,EAAQ,UAAY,EAAQ,SAAS,iBAChD,OAEJ,SAAW,KAAQ,UAAS,iBAAiB,6BACzC,EAAe,GAEnB,GAAI,kBAAiB,AAAC,GAAc,CAChC,SAAW,KAAY,GACnB,GAAI,EAAS,OAAS,YAGtB,SAAW,KAAQ,GAAS,WACxB,AAAI,EAAK,UAAY,QAAU,EAAK,MAAQ,iBACxC,EAAe,KAG5B,QAAQ,SAAU,CAAE,UAAW,GAAM,QAAS,KACjD,WAAsB,EAAQ,CAC1B,KAAM,GAAY,GAClB,MAAI,GAAO,WACP,GAAU,UAAY,EAAO,WAC7B,EAAO,gBACP,GAAU,eAAiB,EAAO,gBACtC,AAAI,EAAO,cAAgB,kBACvB,EAAU,YAAc,UACvB,AAAI,EAAO,cAAgB,YAC5B,EAAU,YAAc,OAExB,EAAU,YAAc,cACrB,EAEX,WAAwB,EAAM,CAC1B,GAAI,EAAK,GAEL,OACJ,EAAK,GAAK,GAEV,KAAM,GAAY,EAAa,GAC/B,MAAM,EAAK,KAAM,KAEvB,AAAoB,oCCjCR,IAAM,CAGlB,aAAa,QAAU,QACtB,WAAa,gBACb,OAAO,WAAW,gCAAgC,kBAE1C,gBAAgB,UAAU,IAAI,iBAC9B,gBAAgB,UAAU,OAAO,oBAEjC,gBAAgB,UAAU,IAAI,kBAC9B,gBAAgB,UAAU,OAAO,qFCpB/B,GAAiB,AAAC,GAAe,MACvC,GAAK,SAAS,eAAe,cAC/B,eAAe,CAAE,SAAU,gHCoB1B,EAAc,IAAM,MACnB,GAAQ,EAAM,eAAiB,OAAS,OAAS,UAClD,WAAY,icCqBZ,GAAW,AAAC,GAAkB,GAC9B,WAAY,IAGZ,EAAS,KACT,EAAkB,AAAC,GAAe,CACnC,EAAO,aAAa,MAAM,OAAS,OACvB,KAER,KAAK,KAAK,gzBCsBb,GAAS,KAET,EAAW,AAAC,GAAkB,GAC9B,WAAY,IAGZ,EAAa,EAAI,IACjB,EAAa,AAAC,GAAoB,GAC5B,MAAQ,GAEd,EAAqB,AAAC,GAAe,CACtC,EAAO,aAAa,MAAM,OAAS,QACvB,KACJ,OAEJ,KAAK,KAAK,0oCC1FnB,MAAe,CAAC,EAAK,IAAU,CAC7B,KAAM,GAAS,EAAI,WAAa,EAChC,SAAW,CAAC,EAAK,IAAQ,GACvB,EAAO,GAAO,EAEhB,MAAO,wbCiBH,GAAe,EAAI,aAAa,OAChC,EAAW,AAAC,GAAkB,GACtB,MAAQ,eACR,MAAQ,EACjB,IAAU,iBACJ,gBAAgB,UAAU,IAAI,iBAC9B,gBAAgB,UAAU,OAAO,oBAEjC,gBAAgB,UAAU,IAAI,kBAC9B,gBAAgB,UAAU,OAAO,UAItC,EAAc,IAAM,IACV,giBCjChB,KAAM,IAAc,GAAc,CACjC,OAAQ,0CACR,WAAY,kCACZ,UAAW,kBACX,cAAe,8BACf,kBAAmB,eACnB,MAAO,4CACP,cAAe,iBAEH,EAAO,GAAQ,IACf,GAAYA,GAAa,+3LCahC,GAAQ,CACb,CACC,MAAO,WACP,GAAI,qDACJ,UAAW,IAEZ,CACC,MAAO,UACP,GAAI,yCACJ,UAAW,IAEZ,CACC,MAAO,SACP,GAAI,iCACJ,UAAW,+PCzCb,OAAe,uBCAA,kBCAA,g7CCAA,o0CCgET,GAAY,CACjB,MACA,wBACA,SACA,QACA,QACA,gBACA,cACA,KACA,UACA,YACA,UACA,+kBC5CK,GAAW,CAChB,CACC,KAAM,kBACN,MAAO,8BACP,UAAW,6BACX,YACC,4DACD,SAAU,YAEX,CACC,KAAM,uBACN,MAAO,wBACP,UAAW,wBACX,YACC,sEACD,SAAU,YAEX,CACC,KAAM,gBACN,MAAO,2BACP,UAAW,0BACX,YAAa,6CACb,SAAU,SAEX,CACC,KAAM,cACN,MAAO,0BACP,UAAW,+BACX,YAAa,2DACb,SAAU,o4CCxCR,GAAiC,EAAI,IACrC,EAAmC,EAAI,SAErC,GAAe,AAAC,GAEd,AADgB,EAAkB,MAAM,KAAK,GAAK,IAAM,IACtC,EAAO,aAAa,MAAM,OAAS,GACzD,UACA,WAEE,EAAc,IAAM,MACnB,GAAY,SAAS,eAAe,sBAC/B,iBAAiB,SAAU,KACvB,MAAQ,MAAM,KAC5B,SAAS,uBAAuB,gBAEf,MAAM,KAAK,YAExB,EAAe,IAAM,QACjB,GAAI,EAAG,EAAI,EAAe,MAAM,OAAQ,IAAK,MAC/C,GAAK,EAAe,MAAM,GAC5B,EAAY,OACG,MAAM,KAAK,EAAG,MACjB,MAAM,OAAO,EAAG,MAI5B,EAAc,AAAC,GAAyB,IACzC,GAAO,EAAG,wBACV,EAAQ,EAAK,IAAM,SAChB,GAAQ,OAAO,aAGjB,EAAS,KACT,EAAkB,IAAM,IACzB,EAAO,aAAa,MAAM,OAAS,GAAI,MACpC,GAAY,EAAO,aAAa,MAAM,KAAK,MAAM,KAAK,MAC7C,eAIP,IAAM,IACN,IAAM,oBAMJ,IAAM,MACX,GAAY,SAAS,eAAe,sBAC/B,oBAAoB,SAAU,iYCrE9B,EAAL,UAAK,EAAL,mGAAK,cAQA,GAAL,UAAK,EAAL,kDAAK,cAMA,GAAL,UAAK,EAAL,eACQ,sBACN,cACF,iBACK,mBACH,eACD,gBACE,kBACA,uBACK,uBACL,kBACA,WAXE,gBCJC,IAAe,GAAY,OAAQ,CAC/C,MAAO,MACN,SAAU,GACV,QAAS,OAEV,QAAS,CACR,YAAa,GAAS,EAAM,SAC5B,gBAAiB,GAAS,AAAC,GAC1B,EAAM,SAAS,OAAO,GAAK,EAAE,SAAW,GACzC,YAAa,GAAS,AAAC,GACtB,EAAM,SAAS,KAAK,GAAK,EAAE,KAAO,GACnC,cAAe,IAAM,AAAC,GAAuB,QACpC,OACF,GAAW,WACR,YACH,GAAW,kBACR,kBACH,GAAW,WACR,WACH,GAAW,cACR,wBAEA,MAIX,QAAS,CACR,eAAe,EAAc,MACvB,SAAW,GAEjB,WAAW,EAAY,MAChB,GAAe,KAAK,SAAS,KAAK,GAAK,EAAE,KAAO,EAAK,WACpD,OAAO,EAAc,IAE7B,iBAAiB,EAAY,MACtB,GAAe,KAAK,SAAS,KAAK,GAAK,EAAE,KAAO,EAAK,WACpD,OAAO,EAAc,OACxB,GADwB,CAE3B,OAAQ,EAAK,WAGf,cAAc,EAAoB,YAC3B,GAAmBC,GAAU,SAAS,GAAI,YAC3C,QAAU,CACd,OAAQ,KAAK,cAAL,cAAkB,IAC1B,MAAO,GACP,YAAa,GACb,WAAY,EACZ,WAAY,EACZ,OAAQ,IAGV,cAAc,EAAY,MACpB,SAAS,KAAK,QACd,QAAU,MAEhB,eAAgB,MACV,QAAU,SC1DZ,GAAmB,AAAmB,GACpCC,GAAW,GAAW,GAGjB,GAA+B,CAC3C,EACA,EACA,IAEOA,GACN,EACA,EACA,GAIW,GAAU,GAAuB,QACjC,EAAa,GAA0B,WCXvC,GAAW,SAAyC,YAC5D,oBAAM,cAAN,cAAmB,IAAK,MACrB,GAAIC,GACT,GACAC,EAAM,SAAU,KAAM,oBAAM,cAAN,cAAmB,KACzCA,EAAM,SAAU,KAAM,EAAW,SACjCC,GAAQ,UACRA,GAAQ,qBAGQ,AADI,MAAMC,IAAQ,IACL,KAAK,IAAI,GAAO,MACvC,GAAO,EAAI,gBACZ,GAAK,EAAI,GACP,MAMG,GAAW,KAAO,IAA0C,IACpE,GACA,EAAK,MAECC,EAAI,GAAS,EAAK,SACrBC,GACL,EACA,CACC,YAAa,EAAK,YAClB,OAAQ,EAAK,OACb,WAAY,GAAI,OAEjB,CAAE,MAAO,QAGD,KAAMC,IAAO,GAAS,QAG1B,GAAU,AADI,MAAMC,IAAO,IACL,gBACnB,GAAK,EAAO,GACd,GAGK,GAAa,KAAO,IAAe,MACzC,GAAUH,EAAI,GAAS,EAAK,MAEjC,EACA,CAAE,OAAQ,EAAW,QAAS,WAAY,GAAI,OAC9C,CAAE,MAAO,MC1DE,GAAW,CACvB,iBAAkB,OAAO,SAAS,KAClC,cAAe,CAEd,GAAS,KAAK,mBAAmB,cAgB7B,GAAiB,GAAII,IAAgB,OAAO,GACrC,GAAsB,IAAM,IACzB,MAAM,6BAA8B,UClBvC,IAAkB,GAAY,UAAW,CACrD,MAAO,MACN,YAAa,YAEd,QAAS,CACR,eAAgB,GAAS,EAAM,aAEhC,QAAS,CACR,QAAQ,EAA4B,MAC9B,YAAc,MAKtB,GAAmB,EAAM,GAAQ,CACX,KACR,QAAQ,grCCHhB,GAAe,KACf,CAAE,kBAAmB,EAAY,aAKtC,IAAM,EAAe,MACrB,GAAY,CACP,IAAa,QACP,IAAM,UAIV,mBAIE,IAAM,CACX,EAAe,QAAU,UAElB,EAAe,QAAU,aAC9B,8PCZD,GAAQ,GAAS,CAAE,YAAa,KAIhC,EAAK,GAHG,CACb,YAAa,CAAE,cAEe,EAAO,CAAE,WAAY,KAE9C,EAAY,KACZ,CAAE,UAAS,gBAAe,iBAAkB,EAE5C,EAAa,IAAM,MAGnB,EAAO,IAAM,MACZ,GAAO,OACT,GADS,CAEZ,YAAa,EAAM,iBAEX,GAAM,KAAK,AAAC,GAAa,GACnB,qjCCmDV,EAAY,KACZ,CAAE,gBAAe,cAAe,EAiBhC,EAAQ,GAAS,CAAE,YAAa,KAIhC,EAAK,GAHG,CACb,YAAa,CAAE,cAEe,EAAO,CAAE,WAAY,KAE9C,EAAc,EAAS,IAAM,YAC5B,GAAa,KAAM,KAAK,aAAX,cAAuB,eACnC,GAAG,EAAY,WAAa;AAAA,GACjC,EAAY;AAAA,GACZ,EAAY,kBAGT,EAAa,EAAI,EAAM,UACvB,EAAY,AAAC,GAAc,GAC1B,YAAc,EAAK,cACd,MAAQ,IAEd,EAAO,IAAM,MACZ,GAAc,OAAK,EAAM,MAAX,CAAiB,YAAa,EAAM,gBAC7C,MACF,KACE,MAAQ,IAEd,EAAa,IAAM,MAClB,GAAc,OAAK,EAAM,MAAX,CAAiB,OAAQ,EAAW,YAC7C,MACA,EAAM,OAEZ,EAAa,IAAM,GACb,MAAQ,IAGd,EAAc,AAAC,GAAkB,CAClC,GAAM,EAAG,iBACT,aAAa,QAAQ,aAAc,EAAM,KAAK,MAC9C,aAAa,cAAgB,SAG5B,GAAe,AAAC,GAAc,MAC7B,GAA4B,EAAG,OAC/B,EAAS,EAAQ,MAAQ,SAAS,EAAQ,OAAS,EAAW,QAChE,IAAW,EAAM,KAAK,OAAQ,MAC3B,IAAc,OAAK,EAAM,MAAX,CAAiB,aAC1B,OACF,4zDCrHL,EAAY,KACZ,CACL,gBACA,kBACA,cACA,gBACA,cACG,EAYE,EAAW,EAAI,IACf,EAAa,AAAC,GAAkB,CACjC,GAAM,EAAG,iBACT,aAAa,WAAa,UAErB,MAAQ,IAGZ,EAAW,AAAC,GAAkB,YAC7B,GAAK,oBAAI,eAAJ,cAAkB,QAAQ,cAC/B,EAAO,EAAY,MACrB,kBAAM,UAAW,EAAM,OAAQ,MAC5B,IAAc,OAAK,GAAL,CAAW,OAAQ,EAAM,WAClC,OACF,MAED,MAAQ,o+BCvCZ,CAAE,gBAAe,kBAAmB,KAEpC,EAAiB,EAAI,EAAW,MAEhC,EAAc,IAAM,MACd,KAAK,AAAC,GAA6B,GAC9B,quBCzCX,EAAa,CAAC,EAAW,MAAO,EAAW,MAAO,EAAW,OAC7D,GAAS,CACd,EACA,EACA,EACA,IACI,GACE,GAAG,GAAK,GAET,GAAoB,CAAC,EAAuB,IAA2B,QAEnE,GAAI,EAAG,EAAI,EAAG,OAErB,EAAM,GAAG,KAAO,GAChB,EAAM,GAAG,KAAO,GAChB,EAAM,GAAG,KAAO,QAET,UAKA,GAAI,EAAG,EAAI,EAAG,OAErB,EAAM,GAAG,KAAO,GAChB,EAAM,GAAG,KAAO,GAChB,EAAM,GAAG,KAAO,QAET,SAKR,GAAM,GAAG,KAAO,GAChB,EAAM,GAAG,KAAO,GAChB,EAAM,GAAG,KAAO,GAKhB,EAAM,GAAG,KAAO,GAChB,EAAM,GAAG,KAAO,GAChB,EAAM,GAAG,KAAO,GAOZ,GAAkB,AAAC,GAA0B,IAC9C,GAAQ,QAER,IAAkB,EAAO,EAAW,QAC9B,KAGN,GAAkB,EAAO,EAAW,QAC9B,KAEH,GAEF,GAAwB,AAAC,GAA0B,IACpD,GAAQ,UACH,GAAI,EAAG,EAAI,EAAG,WACb,GAAI,EAAG,EAAI,EAAG,IAClB,EAAM,GAAG,KAAO,EAAW,SACxB,KAAK,CAAE,IAAG,YAIZ,IAEF,GAAa,AAAC,GAA0B,IACzC,GAA6B,UACxB,GAAI,EAAG,EAAI,EAAG,IAAK,GAChB,KAAK,WACP,GAAI,EAAG,EAAI,EAAG,MACX,GAAG,GAAK,EAAM,GAAG,SAGvB,IAGK,GAAoB,GAAY,YAAa,CACzD,MAAO,MACN,MAAO,CAAC,CAAC,GAAG,GAAa,CAAC,GAAG,GAAa,CAAC,GAAG,MAE/C,QAAS,CAKR,OACC,GACA,AAAC,GACO,GAAkB,EAAM,MAAO,GAExC,cAAwB,OAChB,MAAK,OAAO,EAAW,IAE/B,UAAoB,OACZ,MAAK,OAAO,EAAW,IAE/B,iBAA2B,OAEzB,MAAK,cACL,KAAK,UACL,KAAK,iBAAiB,SAAW,GAGnC,iBAAkB,GACV,GAAsB,EAAM,QAGrC,QAAS,CACR,OAAO,EAAW,EAAW,EAAmB,IACxC,KAAK,MAAO,EAAG,EAAG,IAE1B,WAAW,EAAW,EAAW,MAC3B,OAAO,EAAG,EAAG,EAAW,QACvB,GAAW,KAAK,cAAc,KAAK,MAAO,EAAW,GACvD,EAAS,WACP,OAAO,EAAS,KAAK,EAAG,EAAS,KAAK,EAAG,EAAW,IAG3D,cACC,EACA,EACA,EAAQ,EACmD,MAErD,GAAgB,GAAsB,MAE3C,GAAkB,EAAO,EAAW,IACpC,GAAkB,EAAO,EAAW,IACpC,EAAc,SAAW,QAElB,CAAE,MAAO,GAAgB,GAAS,EAAO,KAAM,SAInD,GAAY,IAAW,EAAW,EAAI,KAAQ,IAC9C,EAAW,YAGN,GAAI,EAAG,EAAI,EAAc,OAAQ,IAAK,IAC1C,GAAO,EAAc,QAEnB,GAAa,GAAW,MAGvB,EAAY,EAAK,EAAG,EAAK,EAAG,QAC7B,GACL,IAAW,EAAW,EAAI,EAAW,EAAI,EAAW,EAC/C,EAAW,KAAK,cACrB,EACA,EACA,EAAQ,GAGP,KAAW,EAAW,GAAK,EAAS,MAAQ,GAC5C,IAAW,EAAW,GAAK,EAAS,MAAQ,OAEjC,EAAS,QACV,SAIN,CAAE,MAAO,EAAW,KAAM,IAElC,YAAa,MACP,MAAQ,CAAC,CAAC,GAAG,GAAa,CAAC,GAAG,GAAa,CAAC,GAAG;;;;;;8SCpJjD,CAAE,cAAe,KAiBjB,EAAW,IAAM,GACX,EAAM,EAAG,EAAM,8mBC3BrB,GAAQ,KACR,CAAE,QAAO,eAAc,YAAa,EAAY,svBCiBhD,GAAQ,KACR,CAAE,cAAe,EACjB,CAAE,eAAc,WAAU,mBAAoB,EAAY,w3UCrB1D,GAAW,CAChB,CACC,KAAM,GACN,KAAM,QAEP,CACC,KAAM,GACN,KAAM,UAEP,CACC,KAAM,GACN,KAAM,k6DChBF,GAAY,CACjB,aACA,SACA,oCACA,WACA,WACA,YACA,oBACA,2uGCaK,GAAQ,CACb,CACC,KAAM,OACN,KAAM,IAEP,CACC,KAAM,SACN,KAAM,IAEP,CACC,KAAM,eACN,KAAM,IAEP,CACC,KAAM,cACN,KAAM,q5DC/BF,GAAW,CAChB,CACC,KAAM,UACN,WAAY,IAEb,CACC,KAAM,UACN,WAAY,IAEb,CACC,KAAM,UACN,WAAY,IAEb,CACC,KAAM,UACN,WAAY,IAEb,CACC,KAAM,WACN,WAAY,IAEb,CACC,KAAM,SACN,WAAY,gnBCZR,GAAa,EAAI,+wEChBjB,GAAkB,CACvB,CACC,MAAO,kBACP,YAAa,GACb,gBAAiB,CAChB,CACC,MAAO,gBACP,YAAa,SACb,MAAO,2BACP,SAAU,IAEX,CACC,MAAO,cACP,YAAa,SACb,MAAO,0BACP,SAAU,MAIb,CACC,MAAO,uBACP,YAAa,GACb,gBAAiB,CAChB,CACC,MAAO,WACP,YAAa,qDACb,MAAO,wBACP,SAAU,IAEX,CACC,MAAO,aACP,YAAa,aACb,MAAO,yBACP,SAAU,IAEX,CACC,MAAO,sBACP,YAAa,wBACb,MAAO,2BACP,SAAU,IAEX,CACC,MAAO,qBACP,YAAa,eACb,MAAO,4BACP,SAAU,MAIb,CACC,MAAO,oBACP,YAAa,2DACb,gBAAiB,CAChB,CACC,MAAO,cACP,YAAa,8CACb,MAAO,oBACP,SAAU,IAEX,CACC,MAAO,cACP,YAAa,0CACb,MAAO,oBACP,SAAU,IAEX,CACC,MAAO,cACP,YAAa,2CACb,MAAO,oBACP,SAAU,IAEX,CACC,MAAO,cACP,YAAa,gDACb,MAAO,oBACP,SAAU,IAEX,CACC,MAAO,cACP,YAAa,mCACb,MAAO,oBACP,SAAU,MAIb,CACC,MAAO,kBACP,YAAa,kDACb,gBAAiB,CAChB,CACC,MAAO,gBACP,YAAa,iDACb,MAAO,4BACP,SAAU,IAEX,CACC,MAAO,wBACP,YACC,yDACD,MAAO,kCACP,SAAU,IAEX,CACC,MAAO,sBACP,YACC,uDACD,MAAO,iCACP,SAAU,IAEX,CACC,MAAO,iBACP,YAAa,kDACb,MAAO,6BACP,SAAU,kaCzHR,EAAc,CAAC,EAAgB,EAAc,IAC3C,GAAG,KAAU,KAAQ,IAGhB,GAAqB,KACjC,IACoC,UAChC,oBAAM,cAAN,cAAmB,IAAK,MACrB,GAAIR,GACT,EACAC,EAAM,SAAU,KAAM,EAAK,YAAY,KACvCA,EAAM,OAAQ,KAAM,GACpBA,EAAM,YAAa,KAAM,WAGb,AADI,MAAME,IAAQ,IACT,KAAK,IAAI,GAAO,MAC/B,GAAO,EAAI,gBACZ,GAAK,EAAI,KACV,IACG,MA6BG,GAAkB,MAC9B,EACA,IACwC,UACpC,oBAAM,cAAN,cAAmB,IAAK,MACrB,GAAW,GAChB,EACA,EAAY,EAAK,YAAY,IAAK,EAAM,GACxC,QAEK,EAAIH,GAAM,EAAUC,EAAM,YAAa,KAAM,WAEtC,AADI,MAAME,IAAQ,IACT,KAAK,IAAI,GAAO,MAC/B,GAAO,EAAI,gBACZ,GAAK,EAAI,GACP,MAOG,GAAwB,MACpC,EACA,IACsB,MAChB,GAAYC,EACjB,EACA,EAAY,EAAM,YAAa,IAAK,EAAM,UAIpC,CAAC,CADK,AADM,MAAMG,IAAO,IACR,QAIZ,EAAgB,AAAC,GAAsB,QAC3C,OACF,GAAY,gBACZ,GAAY,UACZ,GAAY,QACZ,GAAY,aACZ,GAAY,UACZ,GAAY,SACZ,GAAY,WACZ,GAAY,WACZ,GAAY,kBACT,OACH,GAAY,WACZ,GAAY,aACT,iBAGA,KAKG,GAAiB,MAC7B,EACA,EACA,EACA,IACI,MACE,GAAeH,EACpB,EACA,EAAY,EAAM,YAAa,IAAK,EAAM,IAGrC,EAAY,AADQ,MAAMG,IAAO,IACH,UAEhC,EAAK,UAEJ,EAAc,EAAK,QACX,kBAAoB,EAAK,SAEzB,aAAe,EAAK,WAE1B,IAEF,GAAQ,EAAK,OACb,OAEM,EAAa,QAEnB,EAAc,EAAK,QACX,kBAAoB,IAEpB,aAAe,OAGtBF,GAAO,EAAc,IAQf,GAAW,MACvB,EACA,EACA,EACA,IACsC,UAClC,CAAC,qBAAM,cAAN,cAAmB,iBAIlB,GAAuB,KAAM,IAAsB,EAAM,MAC3D,CAAC,EAAK,IAAM,CAAC,EAAsB,MAEhC,GAAYD,EACjB,EACA,EAAY,EAAK,YAAY,IAAK,EAAM,IAEnC,EAAkB,CACvB,OAAQ,EAAK,YAAY,IACzB,KAAM,EACN,MAAO,EACP,YAAa,EACb,iBAAkB,EAClB,UAAW,SAENC,GAAO,EAAW,QAInB,GAAW,GAChB,EACA,EAAY,EAAK,YAAY,IAAK,EAAM,GACxC,WAGG,GACA,EAAK,MACED,EAAI,EAAU,EAAK,SACvBC,GAAO,EAAS,MAEZ,KAAMC,IAAO,EAAU,MAGnB,EAAM,EAAM,EAAO,QAG5B,GAAU,AADI,MAAMC,IAAO,IACL,gBACnB,GAAK,EAAQ,GACf,GAGK,GAAa,MACzB,EACA,EACA,IACsC,UAClC,oBAAM,cAAN,cAAmB,IAAK,MACrB,GAAW,GAChB,EACA,EAAY,EAAK,YAAY,IAAK,EAAM,GACxC,QAEK,EAAUH,EAAI,EAAU,EAAK,MAC9B,UAAY,QACXC,GAAO,EAAS,MAEP,EAAM,EAAM,QAGrB,GAAU,AADI,MAAME,IAAO,IACL,YACnB,GAAK,EAAQ,GAClB,iBAAS,gBACL,KC5MJ,GAAa,CAClB,UACA,WACA,QACA,QACA,MACA,OACA,OACA,SACA,YACA,UACA,WACA,YAEY,EAAkB,GAAY,UAAW,CACrD,MAAO,MACN,aAAc,GAAI,QAAO,cACzB,cAAe,GAAI,QAAO,WAAa,EACvC,gBAAiB,GACjB,aAAc,GACd,WAAY,OACZ,cAAe,KAEhB,QAAS,CACR,eAAgB,GACR,EAAM,aAAa,KAAK,CAAC,EAAG,IAC9B,EAAc,EAAE,OAAS,CAAC,EAAc,EAAE,MAAc,EACxD,CAAC,EAAc,EAAE,OAAS,EAAc,EAAE,MAAc,GACrD,EAAE,OAAS,EAAE,QAGtB,WAAY,GAAS,AAAC,GACd,EAAM,gBAAgB,KAC5B,GAAK,EAAE,OAAS,EAAM,cAAgB,EAAE,QAAU,GAGpD,aAAc,IAAM,AAAC,GACb,GAAW,EAAQ,GAE3B,YAAa,IAAM,AAAC,GAAsB,QACjC,OACF,GAAY,kBACT,kBACH,GAAY,YACT,YACH,GAAY,UACT,UACH,GAAY,eACT,eACH,GAAY,YACT,YACH,GAAY,WACT,WACH,GAAY,aACT,kBACH,GAAY,aACT,aACH,GAAY,kBACT,oBACH,GAAY,aACT,aACH,GAAY,aACT,6BAEA,WAIX,QAAS,MACF,qBAAqB,MACpB,GAAkB,KAAM,IAAmB,KAAK,mBACjD,gBAAkB,UAAmB,SAErC,iBAAgB,EAAc,EAAe,MAC5C,GAAe,KAAM,IAAgB,EAAM,QAC5C,aAAe,UAAgB,IAErC,cAAc,EAAwB,MAChC,cAAgB,OACf,GAAmBT,GAAU,SAAS,GAAI,YAC3C,WAAa,CACjB,KAAM,EACH,EAAY,YACZ,EAAY,OACf,WAAY,EACT,KAAK,YAAY,EAAY,aAC7B,KAAK,YAAY,EAAY,QAChC,OAAQ,EACR,KAAM,GACN,MAAO,EACP,WAAY,EACZ,WAAY,EACZ,UAAW,KAGb,SAAS,EAAmB,MACtB,cAAgB,EAAc,EAAK,WACnC,WAAa,KAAK,SAElB,UAAS,EAAc,EAAe,YACrC,GAAY,0BAAM,aAAN,cAAkB,GAC9B,EAAe,KAAK,aAAa,KAAK,GAAK,EAAE,KAAO,GACpD,EAAO,KAAM,IAClB,KAAK,WACL,EACA,EACA,MAEG,EAAM,IACL,EAAW,IACV,GAAY,KAAK,aAAa,UACjC,GAAK,EAAE,KAAO,QAEV,aAAa,OAAO,EAAW,EAAG,aAElC,aAAa,KAAK,QAEnB,oBAGP,iBAAkB,MACZ,WAAa,aAEb,mBACL,EACA,EACA,EACC,GACI,UAAY,GAEb,AADgB,KAAM,IAAW,EAAM,EAAM,UAE3C,aAAe,KAAK,aAAa,OACrC,GAAK,EAAE,KAAO,EAAK,UAGhB,uKC/HF,GAAQ,IACR,CAAE,gBAAiB,EAAY,GAC/B,CAAE,sBAAuB,EAEzB,EAAa,AAAC,GAAsB,GAC5B,MAAQ,EAAa,MAAQ,u/BC0BrC,EAAQ,IACR,CAAE,eAAc,cAAe,EAC/B,CAAE,gBAAiB,EAAY,GAC/B,EAAY,EACjB,IAAM,YAAY,EAAa,SAAS,EAAM,SAEzC,EAAiB,EAAS,IAExB,AADa,GAAI,QACL,WAAa,IAAM,EAAM,OAEvC,EAAU,EAAS,IAAM,MACxB,GAAO,EAAW,EAAM,aAC1B,IAG4B,CAC/B,OAAQ,EAAM,YAAa,IAC3B,KAAM,EAAa,MACnB,MAAO,EAAM,MACb,iBAAkB,EAClB,YAAa,EACb,UAAW,MAIP,EAAiB,EAAS,IACxB,EAAQ,MAAM,YAAc,EAAQ,MAAM,ixBCnE5C,GAAQ,IACR,CAAE,sBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;s3BCgBzB,EAAQ,IACR,CAAE,eAAgB,EAAY,GAE9B,EAAU,EAAS,IAAM,QACtB,EAAM,UACR,GAAY,kBACT,mBACH,GAAY,YACT,kBACH,GAAY,UACT,oBACH,GAAY,eACT,kBACH,GAAY,YACT,iBACH,GAAY,WACT,qBACH,GAAY,aACT,kBACH,GAAY,aACT,kBACH,GAAY,kBACT,iBACH,GAAY,aACT,mBACH,GAAY,aACT,+BAEA,iBAGJ,EAAgB,EAAS,IAAM,QAC5B,EAAM,UACR,GAAY,kBACT,QACH,GAAY,YACT,QACH,GAAY,UACT,QACH,GAAY,eACT,QACH,GAAY,YACT,QACH,GAAY,WACT,QACH,GAAY,aACT,QACH,GAAY,aACT,QACH,GAAY,kBACT,QACH,GAAY,aACT,QACH,GAAY,aACT,kBAEA,+5BC9CJ,EAAQ,IACR,CAAE,qBAAsB,EACxB,CAAE,eAAc,iBAAkB,EAAY,GAG9C,EAAa,IAAM,GACnB,UAEA,EAAa,IAAM,GAEvB,KAAK,EAAM,MACX,EAAa,MACb,EAAc,mqBCJV,EAAQ,IACR,CAAE,YAAa,EAEf,EAAO,IAAM,GACT,EAAM,QACV,UAGA,EAAY,EAAI,IAChB,EAAa,IAAM,GACd,MAAQ,KACb,q7BCHA,GAAc,EAAI,mgDCnClB,GAAQ,IACR,CAAE,eAAgB,EAClB,CAAE,gBAAe,cAAe,EAAY,GAC5C,EAAW,EAAS,IAClB,EAAc,MAClB,CACA,EAAY,YACZ,EAAY,MACZ,EAAY,IACZ,EAAY,SACZ,EAAY,MACZ,EAAY,KACZ,EAAY,OACZ,EAAY,OACZ,EAAY,aAEZ,CAAC,EAAY,OAAQ,EAAY,SAE/B,EAAa,AAAC,GAA0B,GACjC,MAAO,KAAO,IACd,MAAO,WAAa,EAAY,krBCavC,GAAQ,IACR,CAAE,kBAAiB,YAAa,EAChC,CAAE,eAAc,gBAAe,cAAe,EAAY,olCCnC1D,GAAQ,IACR,CAAE,iBAAkB,EACpB,CAAE,cAAe,EAAY,GAE7B,EAAU,AAAC,GAA2B,GAC7B,kkBCbT,GAAS,KACT,EAAQ,IACR,CAAE,eAAc,mBAAoB,EACpC,CAAE,eAAc,gBAAe,eAAc,kBAClD,EAAY,GAEP,EAAY,EAAI,IAChB,EAAW,IAAM,MAChB,GAAc,EAAO,aAAa,MAAM,OACxC,EAAa,SAAiB,EAAY,OAC1C,EAAY,SAAiB,EAAY,QAElC,MAAQ,IACP,MAAQ,IACZ,MAAQ,EAAa,KAEf,EAAW,uJCzBtB,GAAiB,GAAa,CACnC,QAAS,KACT,OAAQ,CACP,CACC,KAAM,OACN,KAAM,IACN,WAAY,CACX,YAAa,IAEd,SAAU,CACT,CACC,KAAM,WACN,KAAM,IACN,WAAY,CACX,KAAM,KAGR,CACC,KAAM,OACN,KAAM,QACN,WAAY,CACX,KAAMW,KAGR,CACC,KAAM,YACN,KAAM,aACN,WAAY,CACX,KAAMC,KAGR,CACC,KAAM,UACN,KAAM,WACN,WAAY,CACX,KAAMC,KAGR,CACC,KAAM,gBACN,KAAM,wBACN,WAAY,CACX,KAAMC,OAKV,CACC,KAAM,UACN,KAAM,WACN,WAAY,CACX,YAAaC,QCvDjB,KAAM,IAAM,GAAUC,IACtB,GAAI,IAAI,IACR,GAAI,IAAI,MACR,GAAI,MAAM"}