diff --git a/ConEmu64_jwEAbC5dbe.png b/ConEmu64_jwEAbC5dbe.png new file mode 100644 index 0000000..9577335 --- /dev/null +++ b/ConEmu64_jwEAbC5dbe.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:827e98217ce791bb8d7c07328005f55259eaf3fef5d3505f560690ad3146e6af +size 190535 diff --git a/gitUpdate.bat b/gitUpdate.bat new file mode 100644 index 0000000..e8fa445 --- /dev/null +++ b/gitUpdate.bat @@ -0,0 +1,7 @@ +git status . + +@pause + +git add . +git commit -m"update tsc1877," +start git push diff --git a/meta.md b/meta.md new file mode 100644 index 0000000..73312b4 --- /dev/null +++ b/meta.md @@ -0,0 +1,20 @@ +--- +tags: [aws, react, nextjs, javascript] +--- + +# tsc1877 + +## Balance history + +### quotation + +- phase 2 HKD 400 +- phase 3 HKD 400 +- phase 4 HKD 400 +- phase 5 HKD 400 +- login page HKD 200 (variation order) + +### payment history + +HKD 200 deposit paid +HKD 800 phase2 & 3 paid diff --git a/task1/.editorconfig b/task1/.editorconfig new file mode 100644 index 0000000..9fc0ec8 --- /dev/null +++ b/task1/.editorconfig @@ -0,0 +1,18 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false + +[*.yml] +[*.{yml,yaml}] +indent_size = 2 diff --git a/task1/.prettierrc.js b/task1/.prettierrc.js new file mode 100644 index 0000000..36c1742 --- /dev/null +++ b/task1/.prettierrc.js @@ -0,0 +1,17 @@ +module.exports = { + arrowParens: 'avoid', + bracketSpacing: true, + htmlWhitespaceSensitivity: 'css', + insertPragma: false, + bracketSameLine: false, + jsxSingleQuote: true, + printWidth: 120, + proseWrap: 'preserve', + quoteProps: 'as-needed', + requirePragma: false, + semi: false, + singleQuote: true, + tabWidth: 2, + trailingComma: 'none', + useTabs: false +} diff --git a/task1/NOTES.md b/task1/NOTES.md new file mode 100644 index 0000000..2b49d37 --- /dev/null +++ b/task1/NOTES.md @@ -0,0 +1,327 @@ +1. 你想我做? (做完比番你 / $) +2. 你想我做完話你知點做? (花時間 / $$) +3. 你想我經你隻手做? (花花花時間 / $$$) + +有冇咩取向?? + +我唔係想同你打心理戰,但係我想知一知呢樣野先 +10 個識等如全部識晒,咁你會比幾多個識比你自己? + +我諗我會報 HKD 400 / phase + +你用 mac ? +留一個聯絡方式? + +ttps://t.me/louislabs/ + +留一留個 ec2 個登入方法? + +thanks + +Q: 我俾 pem key 同 elastic ip 你? +A: 可以呀,你經果頁 upload 比我 OK ? + +揸定主意,用 nextjs 啦嘛 + + +© 2024, Made with ❤️ by ThemeSelection +會唔會可以再簡單小小?例如唔洗右上嗰啲function? + + +### references +https://themeselection.com/item/materio-free-mui-nextjs-admin-template/ + +--- + +51.21.113.230 + +--- + +## Phase 2 + +### ASSIGNMENT MARKING CHECKLIST V1 + +#### PHASE 2A: SECURE SERVER SETUP (DEADLINE FEB.17, 2024) (SUBTOTAL: 5') + +In this phase, you are required to set up a secure server for later development. Some guidance will be given in the tutorial. + +1. Instantiate a free Virtual Cloud Machine (Amazon EC2 recommended or other free VPS) **\_** / 1' + +- [ ] Details of the Free Usage Tier: http://aws.amazon.com/free +- [ ] You can apply for the education coupon on AWS +- [ ] With a Linux distribution, install only Ngnix, NodeJS and SQLite (or MySQL) + - [ ] To minimize the attack surfaces, always install only what you need + +1. Apply necessary security configurations **\_** / 2' + +- [ ] Apply proper firewall settings to your VM: block all ports except 22, 80 and 443 only +- [ ] Apply proper updates for the server software packages in a regular manner +- [ ] Hide the versions of OS, Ngnix, and NodeJS in HTTP response headers + +1. Configure the VM so that your website is accessible at http://sxx.ierg4210.ie.cuhk.edu.hk **\_** / 2' + +- [ ] Apply for an elastic public IP, and ALWAYS associate it with the instantiated VM +- [ ] Submit your elastic IP through the provided Google Form link1 before 5pm, Feb 17, 2024 +- [ ] TAs will then assign you a domain name and configure the DNS mapping for you +- [ ] Upload all your pages to the server. They should then be accessible through: + - [ ] http://[your-own-public-IP], or + - [ ] http://sxx.ierg4210.ie.cuhk.edu.hk + +#### PHASE 2B: DATA PRESENTATION & MANAGEMENT (DEADLINE FEB. 25, 2024) (SUBTOTAL: 20') + +In this phase, you will implement the core functions of the website mainly with NodeJS and SQL. + +1. SQL: Create a database with the following structures (to be covered in the tutorial) **\_** / 1' + +- [x] A table for `categories` + - [x] Required columns: + -[ ] [x] `cid` (primary key), + -[ ] [x] `name` + - [x] Data: at least 3 `categories` of your choice + +- [x] A table for `products` + - [x] Required columns: + -[ ] [x] `pid (primary key)`, + -[ ] [x] `cid`, + -[ ] [x] `name`, + -[ ] [x] `price`, + -[ ] [x] `description` + - [x] Data: at least 3 products for each category + +1. HTML, NodeJS & SQL: Create an `admin panel` + + - [x] Design several HTML forms to manage(you can `insert`, `update` and `delete` information, `CRUD`) products in DB **\_** / 5' + -[ ] [x] `insert` + -[ ] [x] `update` + -[ ] [x] `delete` + -[ ] [x] Dropdown menu to select `cid` according to its name + -[ ] [x] Input fields for inputting + -[ ] [x] `name`, + -[ ] [x] `price` + -[ ] [x] Textarea for inputting `description` + + + - [x] Design several HTML forms to manage `categories` in DB **\_** / 2' + -[ ] [x] `insert` + -[ ] [x] `update` + -[ ] [x] `delete` + +2. HTML, NodeJS, SQL: Update the ***main page*** created in Phase 1 + + - [x] Populate the `category` list from DB **\_** / 1' + - [x] Based on the `category` selected by the user, populate the corresponding product list from DB **\_** / 3' + -[ ] [x] The `cid=[x]` is reflected as a query string in the URL + -[ ] [x] 你想用邊種? 新做法我可以留番個註解比你 -> 新 + +3. HTML, NodeJS & SQL: Update the `product details` page created in Phase 1 **\_** / 2' + + - [x] Display the details of a product based on its DB record + - [?] Display the inventory of a product based on its DB record + +4. Support of automatic image resizing for product images **\_** / 3' +5. Supporting HTML5 Drag-and-drop file selection in the admin panel **\_** / 2' + - [x] limit to upload jpg file + + - [x] File field for uploading an image (format: jpg/gif/png, size: <=5MB) + - [/] For the file uploaded, store it with its name. **\_** / 1' + -[ ] default to `my_path/image.jpg` + + - [?] When a large image is uploaded, the server will resize it and show a thumbnail image in the panel + - [x] On the main page, display thumbnails. On the product description page, display the larger image + + - [?] Create a dropping area that takes an image + - [?] Display a thumbnail (i.e. smaller width and height) if the dropped file is an image; reject it otherwise + +### !!!CSRF + +--- + +## PHASE 3 + +### AJAX SHOPPING LIST (DEADLINE: MAR 10, 2024) (SUBTOTAL: 13') + +In this phase, you will implement the shopping list, which allows users to shop around your products. This phase is designed to let you practise Javascript programming. + +1. JS: Dynamically update# the `shopping list` + + - [x] When the `addToCart` button of a product is clicked, add it to the shopping list **\_** / 1' + -[ ] [x] Adding the same product twice will display only one row of record + + - Once a product is added, + -[ ] Users are allowed to + -[ ] [x] update its `quantity` and + -[ ] [x] delete it with a number input, or + -[ ] [x] two buttons for increment and decrement + -[ ] [x] Store its + -[ ] [x] `pid` and + -[ ] [x] `quantity` in the browser's `localStorage` **\_** / 2' + -[ ] [x] Get the + -[ ] [x] `name` and + -[ ] [x] `price` from the server (with `pid` as input) **\_** / 3' + -[ ] [x] Calculate and display the `total amount` at the client-side **\_** / 1' + + - [x] Once the page is reloaded, the shopping list is restored **\_** / 2' + -[ ] Page reloads when + -[ ] [x] users browse another category or + -[ ] [x] visit the product detail page + -[ ] [x] Populate and retrieve the stored products from the `localStorage` + + - [?] Supporting infinite scroll when browsing products in the main page **\_** / 3' + +#The whole process of shopping list management must be done without a page load + +--- + + + +- aws setup swap file + - https://repost.aws/knowledge-center/ec2-memory-swap-file + + +--- + +## phase 5 + +### Paypal Sandbox Accounts + +1. Sign up at https://developer.paypal.com/dashboard/ : ______ / 1' + a. Create two sandbox accounts – a merchant account and a buyer account: + i. A merchant account – Email and Password + sb-j4nbw29912003@business.example.com + XIE + + b. Create a sandbox application linked to the merchant account: + i. an application – Client ID + https://developer.paypal.com/dashboard/accounts/edit/4829534511909691981?accountName=sb-j4nbw29912003@business.example.com + helloworld + Client ID + AQT5-eAKNK7IhAhBGlbHBu_9jBx74ZLCfEioKUWQMXMuMmLcnffmpoUz_z-ewOuKZmpSlDk74UtlH58O + Secret key 1 + EMtwOzHACol7Tx8NHOa3eV3TPu2AerZEunJ3MBZfYYcxPeUDy-TNLqqcdL0UDQsrHMpQKeCRPcjKnwNy + +#### Paypal Integration - Front End +Ref: + - https://developer.paypal.com/community/blog/how-to-add-paypal-checkout-payments-to-your-react-app/ + +2. Create a checkout button via PayPal standard checkout APIs: ______ / 1' + a [x] Include the PayPal JavaScript SDK + b [x] Set up a container element for the button + c [x] Render the button by paypal.Buttons().render() +3. [x] When the checkout button is clicked, `createOrder()` is called: ______ / 3' + a [x] every individual product (or any other data) to server. + -[x] `name` + -[x] `quantity` + b [x] It waits for server to generate a JSON string named `orderDetails`. + -[ ] refer backend `6.` + c [x] It submits the order now to PayPal using the actions.order.create() function. +4 [x] After the buyer has completed the payment, `onApprove()` is called: ______ / 2' + a [x] It passes the `orderDetails` to server. + b [x] It clears the shopping cart. +5 [x] If the buyer cancels the payments, `onCancel()` is called: ______ / 1' + a [x] It passes necessary information to server. + + +#### Paypal Integration - Back End + +6. Server follows the following steps to generate the `orderDetails`: ______ / 5' + a. server generates a digest that is the hash from a string composed of at least: + -[x] of each selected product + -[x] `name` + -[x] `quantity` + -[x] The `price` of each selected product gathered from DB, + -[x] The `total price` of all selected products, + -[x] `Currency code`, + -[x] Merchant’s `email address`, and + -[x] A `random salt` + b.[x] server puts the generated digest in the `custom_id` of an order. + c.[x] server generates an `UUID`, and puts it in the `invoice_id` of an order. + d.[x] server generates other necessary fields of an order, including at least: + -[x] `amount` - the `total price` and `currency code` + -[x] `items` - the `name`, `quantity`, `price` of each selected item + +7. Server follows the following steps to insert and update the DB orders table: ______ / 3' + a. When `createOrder()` is called, it inserts a new entry: + -[x] `UUID` - TEXT (Primary Key) + - [x] custom_id + - [x] invoice_id + -[x] `username` - TEXT `customer's username` + -[x] `digest` - TEXT, `custom_id` + -[x] `salt` - TEXT + b. [x] When `onApprove()` is called, it updates the corresponding entry: + -[] `orderDetails` - TEXT + c. [x] When `onCancel()` is called, it deletes the corresponding entry. + +#### Miscellaneous Changes + +8. [x] Display the DB orders table in the admin panel: product list, payment status…etc. ______ / 2' +9. [x] Let members check the most recent five orders in the member portal . ______ / 2' + + +### signal flow + +#### Notes version: +```mermaid +sequenceDiagram + actor Client + + Note left of Client: checkout button is clicked + Note left of Client: `createOrder() is called + + Client->>Server: fetch("/my-server/get-order-details"... + + Note over Server: generate `orderDetails` + Server->>Client: return json `orderDetails` + + Note over Client: purchase_units: [amount, itesm, custom_id, invoice_id] + + Paypal-->>Client: send payment page + Note over Client: Client proceed payment + Client-->>Paypal: client approve payment + + Note over Client: When `onApprove()` is called + Client->>Server: fetch("/my-server/save-order"... + Note over Server: it `update` the corresponding entry + + Note over Client: When `onCancel()` is called + Client->>Server: fetch("/my-server/cancel-order"... + Note over Server: it `deletes` the corresponding entry +``` + + +#### My version: +```mermaid +sequenceDiagram + actor Client + + Note left of Client: checkout button is clicked + Note left of Client: createOrder() is called + + Client->>Server: fetch("/my-server/get-order-details"... + + Note over Server: generate `orderDetails` + Server->>Client: return json `orderDetails` + + Note over Client: purchase_units: [amount, itesm, custom_id, invoice_id] + + Paypal-->>Client: send payment page + Note over Client: Client proceed payment + Client-->>Paypal: client approve payment + + Paypal->>Server: event_type: CHECKOUT.ORDER.APPROVED + Note left of Paypal: with (resources.id + resources.status) + + Note over Client: When `onApprove()` is called + Client->>Server: fetch("/my-server/save-order"... + Note right of Client: with resources.id + + Note over Server: receive 2 id, found match and stastus "approved" + Note over Server: it `update` the corresponding entry + + Note over Client: When `onCancel()` is called + Client->>Server: fetch("/my-server/cancel-order"... + Note over Server: it `deletes` the corresponding entry +``` diff --git a/task1/_credentials/notes.md b/task1/_credentials/notes.md new file mode 100644 index 0000000..b49f017 --- /dev/null +++ b/task1/_credentials/notes.md @@ -0,0 +1 @@ +13.50.75.106 diff --git a/task1/_credentials/shopping.pem b/task1/_credentials/shopping.pem new file mode 100644 index 0000000..da2c3b1 --- /dev/null +++ b/task1/_credentials/shopping.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpgIBAAKCAQEA60pfYaPm/QVZAq2VRMJRP+YmvHseni8TlvB22Cy5c2lY5Npq +Pt432WzmgS2I0SeGUGZbMSf2G6rvrSQP+s9FaQxkqS2JrZI43StO0zu2ogTOD605 +1XZvQSnVljodTLJrLcYmNa7h4Fj2Avr1//Lsm83w8WQlycnz4u772MsiR7L57miX +vSJfaVyDeEEZRb0Ovd3qeFmGfgcPIyZPoCof7BP0uK2gywcHYuOcEn1K7yEl/4ja +mXmJL5WWjchvNfOXFLzcQitDhtd6gGcnO5Zxdyby1r2GtQLMXErN5Imsb+V0iwhh +lYT2WzSiOF6YpZudG/aCplLWutgINsnJek0FUwIDAQABAoIBAQCt4kPFE+zUFoym +dwP2UajcEUmVR2PkQSQ4CzO5JKxVB4jDcErOdUlO7LUYyD7xW0Vey5YfKMovvk7s +ZNdOYrmIHbmScW3rEUHm6WeSofGhoO1sFnfEMoeb37/SCta2ZLDiniqEx95z/yqo +HzGH2s5TgonKy1lF3HLZxgXnPI/z7XzZrhVOq7LCechLToB9isJtJDH0kr/av2f0 +VRdbwfREgQ7OsmehaP4sCPHeRwe4w8v03a7YUYLIRxPrTKiLW/Fw9RUOnTS13bj5 +HirWIHHXAVXFdI1dHwZ0ViUITkk/twZe48WUaHcC9zdWqNoq+Ln5bQN5MuFO0A30 +DBrhIpCpAoGBAP6WTM0pqk7n+IvOpWBmFatWq6Oe9Vdl5ua4AKInDAduDK5T9Vvq ++dWk+IKbvVi5/faO5g2c7MIq4oXDgu1ngawuMsH/HBs08SmRUrDVTuDJrUEh8BGe +h+Qnsx+WV4kBNWiT89QiX7Z/2UMbF73HQ00IOXqZHA9OFR8iwaVcGjrtAoGBAOyY +qESmRSEw+hzmRHvJgXKzR7LxJuOnn9mp6KVVgaf1VZ4FMOroui9yn6W0973ROFL4 +z+ZB2STcZwO7iY+HI5MfS0WfK77x3MQNDICm8rGQBdV2/Y1vbM1IoJMedEOnWTKe +nRK7WkHMuZuaoVtXsDE9Y7BIQLqtb0g4LhkFqPk/AoGBAI2aQ7WJizTASbpZghqQ +LVVTq7wiWgv2neuORKvsVAB98Ye1Iy+xDq0KST88KKEFMoDFEqhXtEh7WetUx6oM +fE+skobcwmFPnSOltPyuaGUXR8qGeeUS7Dq26iaTlLSbe31jbad8RwhXLBzrINVp +08Ew5eeO6dCJea4LwvGavOwxAoGBAI2t2M3LN4hpuMzHg2kRQOg7vYrFaAFZppqE +aaFgM9UtT8jh2OpC1QOGw11KojRT7kOZZX3AHtU4+qM8kWKWjVITolKdv2eHlCj+ +m2cLEjgMQ8IRkEI64E+J10ZiLUM6Gmr6mprWAHV4sAkjLs7xErxZw7GTgteG9iWs +JsarIgWnAoGBALSsZD5Ib4vIKp40AHe/Nu0+ZXzFzqFbxmW5oVDvTE3kp0Nvij5a +GPJAqvqyF0LizCwqEO08gyY13/NpsVJ5J+TMdP6eGIIT5ewGGspslrTeuxAq20Wx +zGn6ytrECrdtYVZkPpKnXWzsx4NooywTNhTKCVjyvOpH+/7GtdPcH9/c +-----END RSA PRIVATE KEY----- \ No newline at end of file diff --git a/task1/_poc/sequelize/helloworld.js b/task1/_poc/sequelize/helloworld.js new file mode 100644 index 0000000..424ed9d --- /dev/null +++ b/task1/_poc/sequelize/helloworld.js @@ -0,0 +1,42 @@ +const { Sequelize } = require('sequelize') + +const sequelize = new Sequelize('app_db', 'db_user', 'db_user_pass', { + host: 'localhost', + port: 6033, + dialect: 'mysql' +}) + +const User = sequelize.define( + 'User', + { + firstName: { + type: Sequelize.STRING, + allowNull: false + }, + lastName: { + type: Sequelize.STRING, + allowNull: false + } + }, + { timestamps: false } +) + +;(async () => { + try { + await sequelize.authenticate() + console.log('Connection has been established successfully.') + + // create table + await sequelize.sync() + + const user = await User.create({ firstName: 'John', lastName: 'Doe' }) + console.log('Created user: ', user) + + const users = await User.findAll() + console.log('Found all users: ', users) + + await sequelize.close() + } catch (error) { + console.error('Unable to connect to the database:', error) + } +})() diff --git a/task1/_poc/sequelize/package.json b/task1/_poc/sequelize/package.json new file mode 100644 index 0000000..e3d6f0a --- /dev/null +++ b/task1/_poc/sequelize/package.json @@ -0,0 +1,17 @@ +{ + "name": "sequelize", + "version": "1.0.0", + "description": "", + "main": "helloworld.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "mysql2": "^3.9.3", + "sequelize": "^6.37.1", + "sqlite3": "^5.1.7" + } +} diff --git a/task1/_poc/sequelize/yarn.lock b/task1/_poc/sequelize/yarn.lock new file mode 100644 index 0000000..f05fe2a --- /dev/null +++ b/task1/_poc/sequelize/yarn.lock @@ -0,0 +1,1043 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@gar/promisify@^1.0.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + +"@npmcli/fs@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" + integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@types/debug@^4.1.8": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/node@*": + version "20.11.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f" + integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw== + dependencies: + undici-types "~5.26.4" + +"@types/validator@^13.7.17": + version "13.11.9" + resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.11.9.tgz#adfe96520b437a0eaa798a475877bf2f75ee402d" + integrity sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.1.3: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +debug@4, debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +denque@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== + +detect-libc@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + +dottie@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.6.tgz#34564ebfc6ec5e5772272d466424ad5b696484d4" + integrity sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +generate-function@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" + integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ== + dependencies: + is-property "^1.0.2" + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +http-cache-semantics@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-lite@^0.6.2, iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflection@^1.13.4: + version "1.13.4" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.4.tgz#65aa696c4e2da6225b148d7a154c449366633a32" + integrity sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-property@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + integrity sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +long@^5.2.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +lru-cache@^8.0.0: + version "8.0.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-8.0.5.tgz#983fe337f3e176667f8e567cfcce7cb064ea214e" + integrity sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA== + +make-fetch-happen@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" + integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^6.0.0" + ssri "^8.0.0" + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.3: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +moment-timezone@^0.5.43: + version "0.5.45" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.45.tgz#cb685acd56bac10e69d93c536366eb65aa6bcf5c" + integrity sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ== + dependencies: + moment "^2.29.4" + +moment@^2.29.4: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mysql2@^3.9.3: + version "3.9.3" + resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-3.9.3.tgz#72a5e0c90d78ec2d8f9846e83727067c0cc8c25e" + integrity sha512-+ZaoF0llESUy7BffccHG+urErHcWPZ/WuzYAA9TEeLaDYyke3/3D+VQDzK9xzRnXpd0eMtRf0WNOeo4Q1Baung== + dependencies: + denque "^2.1.0" + generate-function "^2.3.1" + iconv-lite "^0.6.3" + long "^5.2.1" + lru-cache "^8.0.0" + named-placeholders "^1.1.3" + seq-queue "^0.0.5" + sqlstring "^2.3.2" + +named-placeholders@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.3.tgz#df595799a36654da55dda6152ba7a137ad1d9351" + integrity sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w== + dependencies: + lru-cache "^7.14.1" + +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + +negotiator@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +node-abi@^3.3.0: + version "3.56.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.56.0.tgz#ca807d5ff735ac6bbbd684ae3ff2debc1c2a40a7" + integrity sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q== + dependencies: + semver "^7.3.5" + +node-addon-api@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.0.tgz#71f609369379c08e251c558527a107107b5e0fdb" + integrity sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g== + +node-gyp@8.x: + version "8.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" + integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^9.1.0" + nopt "^5.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +pg-connection-string@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475" + integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== + +prebuild-install@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" + integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +retry-as-promised@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-7.0.4.tgz#9df73adaeea08cb2948b9d34990549dc13d800a2" + integrity sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +safe-buffer@^5.0.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^7.3.5, semver@^7.5.4: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +seq-queue@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e" + integrity sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q== + +sequelize-pool@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/sequelize-pool/-/sequelize-pool-7.1.0.tgz#210b391af4002762f823188fd6ecfc7413020768" + integrity sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg== + +sequelize@^6.37.1: + version "6.37.1" + resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-6.37.1.tgz#9380fe0a3b5ff17638d3fce30c3cf3a2396c2343" + integrity sha512-vIKKzQ9dGp2aBOxQRD1FmUYViuQiKXSJ8yah8TsaBx4U3BokJt+Y2A0qz2C4pj08uX59qpWxRqSLEfRmVOEgQw== + dependencies: + "@types/debug" "^4.1.8" + "@types/validator" "^13.7.17" + debug "^4.3.4" + dottie "^2.0.6" + inflection "^1.13.4" + lodash "^4.17.21" + moment "^2.29.4" + moment-timezone "^0.5.43" + pg-connection-string "^2.6.1" + retry-as-promised "^7.0.4" + semver "^7.5.4" + sequelize-pool "^7.1.0" + toposort-class "^1.0.1" + uuid "^8.3.2" + validator "^13.9.0" + wkx "^0.5.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce" + integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.8.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.1.tgz#22c7d9dd7882649043cba0eafb49ae144e3457af" + integrity sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + +sqlite3@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.7.tgz#59ca1053c1ab38647396586edad019b1551041b7" + integrity sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog== + dependencies: + bindings "^1.5.0" + node-addon-api "^7.0.0" + prebuild-install "^7.1.1" + tar "^6.1.11" + optionalDependencies: + node-gyp "8.x" + +sqlstring@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.3.tgz#2ddc21f03bce2c387ed60680e739922c65751d0c" + integrity sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg== + +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +tar-fs@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +toposort-class@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988" + integrity sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +validator@^13.9.0: + version "13.11.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.11.0.tgz#23ab3fd59290c61248364eabf4067f04955fbb1b" + integrity sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ== + +which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +wkx@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.5.0.tgz#c6c37019acf40e517cc6b94657a25a3d4aa33e8c" + integrity sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg== + dependencies: + "@types/node" "*" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== diff --git a/task1/_ref/2022/IERG4210-22S-Phase4.pdf b/task1/_ref/2022/IERG4210-22S-Phase4.pdf new file mode 100644 index 0000000..331d6f7 Binary files /dev/null and b/task1/_ref/2022/IERG4210-22S-Phase4.pdf differ diff --git a/task1/_ref/2022/IERG4210-22S-Phase5-Updated.pdf b/task1/_ref/2022/IERG4210-22S-Phase5-Updated.pdf new file mode 100644 index 0000000..d41d54c Binary files /dev/null and b/task1/_ref/2022/IERG4210-22S-Phase5-Updated.pdf differ diff --git a/task1/_ref/2022/IERG4210-22S-Phase5.pdf b/task1/_ref/2022/IERG4210-22S-Phase5.pdf new file mode 100644 index 0000000..2ef0bd3 Binary files /dev/null and b/task1/_ref/2022/IERG4210-22S-Phase5.pdf differ diff --git a/task1/_ref/2024/IERG4210-24S-Phase1.pdf b/task1/_ref/2024/IERG4210-24S-Phase1.pdf new file mode 100644 index 0000000..69d4455 Binary files /dev/null and b/task1/_ref/2024/IERG4210-24S-Phase1.pdf differ diff --git a/task1/_ref/2024/IERG4210-24S-Phase2_v2.pdf b/task1/_ref/2024/IERG4210-24S-Phase2_v2.pdf new file mode 100644 index 0000000..01d94ff Binary files /dev/null and b/task1/_ref/2024/IERG4210-24S-Phase2_v2.pdf differ diff --git a/task1/_ref/2024/IERG4210-24S-Phase3.pdf b/task1/_ref/2024/IERG4210-24S-Phase3.pdf new file mode 100644 index 0000000..d6b0cb9 Binary files /dev/null and b/task1/_ref/2024/IERG4210-24S-Phase3.pdf differ diff --git a/task1/_ref/2024/IERG4210-24S-Phase4.pdf b/task1/_ref/2024/IERG4210-24S-Phase4.pdf new file mode 100644 index 0000000..f921101 Binary files /dev/null and b/task1/_ref/2024/IERG4210-24S-Phase4.pdf differ diff --git a/task1/_ref/2024/IERG4210-24S-Phase5.pdf b/task1/_ref/2024/IERG4210-24S-Phase5.pdf new file mode 100644 index 0000000..707fa34 Binary files /dev/null and b/task1/_ref/2024/IERG4210-24S-Phase5.pdf differ diff --git a/task1/_ref/2024/Tutorial 3.pdf b/task1/_ref/2024/Tutorial 3.pdf new file mode 100644 index 0000000..43e01e9 Binary files /dev/null and b/task1/_ref/2024/Tutorial 3.pdf differ diff --git a/task1/_ref/2024/Tutorial 4.pdf b/task1/_ref/2024/Tutorial 4.pdf new file mode 100644 index 0000000..51c4bc2 Binary files /dev/null and b/task1/_ref/2024/Tutorial 4.pdf differ diff --git a/task1/_ref/2024/Tutorial 5.pdf b/task1/_ref/2024/Tutorial 5.pdf new file mode 100644 index 0000000..d1f874c Binary files /dev/null and b/task1/_ref/2024/Tutorial 5.pdf differ diff --git a/task1/_ref/2024/Tutorial 6.pdf b/task1/_ref/2024/Tutorial 6.pdf new file mode 100644 index 0000000..fa2f1ef Binary files /dev/null and b/task1/_ref/2024/Tutorial 6.pdf differ diff --git a/task1/_ref/2024/Tutorial 7.pdf b/task1/_ref/2024/Tutorial 7.pdf new file mode 100644 index 0000000..d7f653f Binary files /dev/null and b/task1/_ref/2024/Tutorial 7.pdf differ diff --git a/task1/_ref/2024/Tutorial 8.pdf b/task1/_ref/2024/Tutorial 8.pdf new file mode 100644 index 0000000..04aa99d Binary files /dev/null and b/task1/_ref/2024/Tutorial 8.pdf differ diff --git a/task1/_ref/2024/Tutorial 9.pdf b/task1/_ref/2024/Tutorial 9.pdf new file mode 100644 index 0000000..7170a00 Binary files /dev/null and b/task1/_ref/2024/Tutorial 9.pdf differ diff --git a/task1/_ref/85fd7f2e-6c8e-4bfc-a9ec-12666cc02e23__2_en.png b/task1/_ref/85fd7f2e-6c8e-4bfc-a9ec-12666cc02e23__2_en.png new file mode 100644 index 0000000..db6fc65 --- /dev/null +++ b/task1/_ref/85fd7f2e-6c8e-4bfc-a9ec-12666cc02e23__2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06afac26b5e77ff04e6af18b9c2a27d05d27e69b891880fa4045502314d58228 +size 18696 diff --git a/task1/_ref/IERG4210 2024 Spring Tutorial 2.pptx b/task1/_ref/IERG4210 2024 Spring Tutorial 2.pptx new file mode 100644 index 0000000..c55aeb2 Binary files /dev/null and b/task1/_ref/IERG4210 2024 Spring Tutorial 2.pptx differ diff --git a/task1/_ref/IERG4210-24S-Phase1/0.png b/task1/_ref/IERG4210-24S-Phase1/0.png new file mode 100644 index 0000000..8f7650f --- /dev/null +++ b/task1/_ref/IERG4210-24S-Phase1/0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72894272254f4173a7b40988892ded1087e7c82ea73009cf5d126291326cac71 +size 48513 diff --git a/task1/_ref/IERG4210-24S-Phase1/1.png b/task1/_ref/IERG4210-24S-Phase1/1.png new file mode 100644 index 0000000..4fb12a0 --- /dev/null +++ b/task1/_ref/IERG4210-24S-Phase1/1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:021370ee5fddfdb4985cfd8ef9a90fd226c6b32205e3cb36ab1a15dfd77995cc +size 260317 diff --git a/task1/_ref/IERG4210-24S-Phase1/2.png b/task1/_ref/IERG4210-24S-Phase1/2.png new file mode 100644 index 0000000..e666db7 --- /dev/null +++ b/task1/_ref/IERG4210-24S-Phase1/2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:821b9528a6a7970641a67a9fadb3d0e171d32e4eeb5d2607a4987ec9338c1c68 +size 232922 diff --git a/task1/_ref/IERG4210-24S-Phase1/3.png b/task1/_ref/IERG4210-24S-Phase1/3.png new file mode 100644 index 0000000..2586c5c --- /dev/null +++ b/task1/_ref/IERG4210-24S-Phase1/3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:085477873b4378247cc4fe963818998b39a9789b5c69bf649be02005830eb220 +size 65415 diff --git a/task1/_ref/chrome_XeuGI0DOuj.png b/task1/_ref/chrome_XeuGI0DOuj.png new file mode 100644 index 0000000..4007a7f --- /dev/null +++ b/task1/_ref/chrome_XeuGI0DOuj.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c3288ceda1b97e3921853bcc907d29b32a078f968737634d897babd179d7354 +size 103074 diff --git a/task1/_ref/old_project/cart.db b/task1/_ref/old_project/cart.db new file mode 100644 index 0000000..cc10ef4 Binary files /dev/null and b/task1/_ref/old_project/cart.db differ diff --git a/task1/_ref/old_project/form.html b/task1/_ref/old_project/form.html new file mode 100644 index 0000000..3a08128 --- /dev/null +++ b/task1/_ref/old_project/form.html @@ -0,0 +1,78 @@ + + + + + IERG4210 Admin Panel + + + +

IERG4210 Admin Panel

+

Add Category

+
+ + + +
+ +

Add Product

+
+ + + + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/task1/_ref/old_project/server.js b/task1/_ref/old_project/server.js new file mode 100644 index 0000000..b2384cc --- /dev/null +++ b/task1/_ref/old_project/server.js @@ -0,0 +1,85 @@ +// Import the 'path' module +const path = require("path"); +const express = require("express"); +const sqlite3 = require("sqlite3").verbose(); + +const app = express(); +const db = new sqlite3.Database("cart.db"); + +// Use middleware to parse the request body +app.use(express.urlencoded({ extended: true })); + +app.get("/", (req, res) => { + res.sendFile(path.join(__dirname, "form.html")); +}); + +app.get("/categories", (req, res) => { + const selectCategoriesQuery = `SELECT * FROM categories`; + db.all(selectCategoriesQuery, (err, rows) => { + if (err) { + console.error(err); + res.status(500).json({ error: "Failed to fetch categories" }); + } else { + res.json(rows); + } + }); +}); + +// Handle POST request to add a new category +app.post("/addCategory", (req, res) => { + const categoryName = req.body.categoryName; + + // Insert the new category into the categories table + const insertCategoryQuery = `INSERT INTO categories (name) VALUES (?)`; + db.run(insertCategoryQuery, [categoryName], (err) => { + if (err) { + console.error(err); + res.status(500).send("Error adding category"); + } else { + res.send(` + + `); + } + }); +}); + +// Handle POST request to add a new product +app.post("/addProduct", (req, res) => { + const productName = req.body.productName; + const category = req.body.category; + const price = req.body.price; + const description = req.body.description; + + let imageUrl = ""; + if (req.file) { + imageUrl = req.file.filename; + } + + // Insert the new product into the products table + const insertProductQuery = `INSERT INTO products (name, catid, price, description) VALUES (?, ?, ?, ?)`; + db.run( + insertProductQuery, + [productName, category, price, description], + (err) => { + if (err) { + console.error(err); + res.status(500).send("Error adding product"); + } else { + res.send(` + + `); + } + } + ); +}); + +// Start the server +app.listen(3000, () => { + console.log("Server started on port 3000"); +}); diff --git a/task1/_ref/paymentsequence_Simple.png b/task1/_ref/paymentsequence_Simple.png new file mode 100644 index 0000000..d9d01f8 --- /dev/null +++ b/task1/_ref/paymentsequence_Simple.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:530a85cd2839bf6cf18da896689dcbc3d5a2536ec466df84eee06c6e2c5e7547 +size 170754 diff --git a/task1/aws/workspace/.env.example b/task1/aws/workspace/.env.example new file mode 100644 index 0000000..c3a6065 --- /dev/null +++ b/task1/aws/workspace/.env.example @@ -0,0 +1,5 @@ +DB_HOST=localhost +DB_PORT=6033 +DB_NAME=app_db +DB_USER=db_user +DB_PASSWORD=db_user_pass diff --git a/task1/aws/workspace/README.md b/task1/aws/workspace/README.md new file mode 100644 index 0000000..3636c96 --- /dev/null +++ b/task1/aws/workspace/README.md @@ -0,0 +1,12 @@ +```batch + +> .\dc_up.bat + +``` + +*nix +```batch + +> .\dc_up.sh + +``` diff --git a/task1/aws/workspace/admin/src/@core/components/card-statistics/card-stats-vertical/index.js b/task1/aws/workspace/admin/src/@core/components/card-statistics/card-stats-vertical/index.js new file mode 100644 index 0000000..7124240 --- /dev/null +++ b/task1/aws/workspace/admin/src/@core/components/card-statistics/card-stats-vertical/index.js @@ -0,0 +1,51 @@ +// ** MUI Imports +import Box from '@mui/material/Box'; +import Card from '@mui/material/Card'; +import Avatar from '@mui/material/Avatar'; +import IconButton from '@mui/material/IconButton'; +import Typography from '@mui/material/Typography'; +import CardContent from '@mui/material/CardContent'; + +// ** Icons Imports +import DotsVertical from 'mdi-material-ui/DotsVertical'; + +const CardStatsVertical = props => { + // ** Props + const { title, subtitle, color, icon, stats, trend, trendNumber } = props; + + return ( + + + + + {icon} + + + + + + {title} + + + {stats} + + + {trendNumber} + + + {subtitle} + + + ); +}; + +export default CardStatsVertical; + +CardStatsVertical.defaultProps = { + color: 'primary', + trend: 'positive', +}; diff --git a/task1/aws/workspace/admin/src/@core/components/react-apexcharts/index.js b/task1/aws/workspace/admin/src/@core/components/react-apexcharts/index.js new file mode 100644 index 0000000..688d115 --- /dev/null +++ b/task1/aws/workspace/admin/src/@core/components/react-apexcharts/index.js @@ -0,0 +1,7 @@ +// ** Next Import +import dynamic from 'next/dynamic'; + +// ! To avoid 'Window is not defined' error +const ReactApexcharts = dynamic(() => import('react-apexcharts'), { ssr: false }); + +export default ReactApexcharts; diff --git a/task1/aws/workspace/admin/src/@core/components/scroll-to-top/index.js b/task1/aws/workspace/admin/src/@core/components/scroll-to-top/index.js new file mode 100644 index 0000000..4235a11 --- /dev/null +++ b/task1/aws/workspace/admin/src/@core/components/scroll-to-top/index.js @@ -0,0 +1,39 @@ +// ** MUI Imports +import Zoom from '@mui/material/Zoom'; +import { styled } from '@mui/material/styles'; +import useScrollTrigger from '@mui/material/useScrollTrigger'; + +const ScrollToTopStyled = styled('div')(({ theme }) => ({ + zIndex: 11, + position: 'fixed', + right: theme.spacing(6), + bottom: theme.spacing(10), +})); + +const ScrollToTop = props => { + // ** Props + const { children, className } = props; + + // ** init trigger + const trigger = useScrollTrigger({ + threshold: 400, + disableHysteresis: true, + }); + + const handleClick = () => { + const anchor = document.querySelector('body'); + if (anchor) { + anchor.scrollIntoView({ behavior: 'smooth' }); + } + }; + + return ( + + + {children} + + + ); +}; + +export default ScrollToTop; diff --git a/task1/aws/workspace/admin/src/@core/context/settingsContext.js b/task1/aws/workspace/admin/src/@core/context/settingsContext.js new file mode 100644 index 0000000..54246e5 --- /dev/null +++ b/task1/aws/workspace/admin/src/@core/context/settingsContext.js @@ -0,0 +1,30 @@ +// ** React Imports +import { createContext, useState } from 'react'; + +// ** ThemeConfig Import +import themeConfig from 'src/configs/themeConfig'; + +const initialSettings = { + themeColor: 'primary', + mode: themeConfig.mode, + contentWidth: themeConfig.contentWidth, +}; + +// ** Create Context +export const SettingsContext = createContext({ + saveSettings: () => null, + settings: initialSettings, +}); + +export const SettingsProvider = ({ children }) => { + // ** State + const [settings, setSettings] = useState({ ...initialSettings }); + + const saveSettings = updatedSettings => { + setSettings(updatedSettings); + }; + + return {children}; +}; + +export const SettingsConsumer = SettingsContext.Consumer; diff --git a/task1/aws/workspace/admin/src/@core/hooks/useSettings.js b/task1/aws/workspace/admin/src/@core/hooks/useSettings.js new file mode 100644 index 0000000..bdf5b87 --- /dev/null +++ b/task1/aws/workspace/admin/src/@core/hooks/useSettings.js @@ -0,0 +1,4 @@ +import { useContext } from 'react'; +import { SettingsContext } from 'src/@core/context/settingsContext'; + +export const useSettings = () => useContext(SettingsContext); diff --git a/task1/aws/workspace/admin/src/@core/layouts/BlankLayout.js b/task1/aws/workspace/admin/src/@core/layouts/BlankLayout.js new file mode 100644 index 0000000..3139cd9 --- /dev/null +++ b/task1/aws/workspace/admin/src/@core/layouts/BlankLayout.js @@ -0,0 +1,37 @@ +// ** MUI Imports +import { styled } from '@mui/material/styles'; +import Box from '@mui/material/Box'; + +// Styled component for Blank Layout component +const BlankLayoutWrapper = styled(Box)(({ theme }) => ({ + height: '100vh', + + // For V1 Blank layout pages + '& .content-center': { + display: 'flex', + minHeight: '100vh', + alignItems: 'center', + justifyContent: 'center', + padding: theme.spacing(5), + }, + + // For V2 Blank layout pages + '& .content-right': { + display: 'flex', + minHeight: '100vh', + overflowX: 'hidden', + position: 'relative', + }, +})); + +const BlankLayout = ({ children }) => { + return ( + + + {children} + + + ); +}; + +export default BlankLayout; diff --git a/task1/aws/workspace/admin/src/@core/layouts/ShopfrontLayout.js b/task1/aws/workspace/admin/src/@core/layouts/ShopfrontLayout.js new file mode 100644 index 0000000..9ac2e9b --- /dev/null +++ b/task1/aws/workspace/admin/src/@core/layouts/ShopfrontLayout.js @@ -0,0 +1,104 @@ +// ** MUI Imports +import { styled } from '@mui/material/styles'; +import Box from '@mui/material/Box'; +import { Badge, Button, IconButton, Stack, Typography } from '@mui/material'; +import { useRouter } from 'next/router'; +import HomeIcon from '@mui/icons-material/Home'; +import { CartConsumer, CartContext, CartProvider } from 'src/contexts/cart'; +import { useContext, useEffect, useState } from 'react'; +import CartIcon from './components/CartIcon'; +import AccountBoxIcon from '@mui/icons-material/AccountBox'; +import CheckSession from 'src/api/checkSession'; +import { AuthContext, AuthProvider } from 'src/contexts/auth'; + +// Styled component for Blank Layout component +const ShopfrontLayoutWrapper = styled(Box)(({ theme }) => ({ + height: '100vh', + + // For V1 Blank layout pages + '& .content-center': { + display: 'flex', + minHeight: '100vh', + alignItems: 'center', + justifyContent: 'center', + padding: theme.spacing(5), + }, + + // For V2 Blank layout pages + '& .content-right': { + display: 'flex', + minHeight: '100vh', + overflowX: 'hidden', + position: 'relative', + }, +})); + +const ShopfrontLayout = ({ children }) => { + const router = useRouter(); + const [data, setData] = useState({}); + const { username, setUsername } = useContext(AuthContext); + + useEffect(() => { + const check = async () => { + try { + let { session } = JSON.parse(localStorage.getItem('session')) || ''; + + let data = await CheckSession({ session }); + if (data['status'] != 'OK') { + return route.replace('/shopfront/login'); + } else { + setData(data); + setUsername(data['username']); + } + } catch (error) {} + }; + + return check(); + }, []); + + return ( + + + + + + + + + Hi, {username || 'Guest'} + + + VTKH Mall + + + + { + router.push('/shopfront/customer/profile'); + }} + > + + + { + router.push('/shopfront'); + }} + > + + + + + + + {children} + + + + + + + + ); +}; + +export default ShopfrontLayout; diff --git a/task1/aws/workspace/admin/src/@core/layouts/VerticalLayout.js b/task1/aws/workspace/admin/src/@core/layouts/VerticalLayout.js new file mode 100644 index 0000000..510418a --- /dev/null +++ b/task1/aws/workspace/admin/src/@core/layouts/VerticalLayout.js @@ -0,0 +1,109 @@ +// ** React Imports +import { useState } from 'react'; + +// ** MUI Imports +import Fab from '@mui/material/Fab'; +import { styled } from '@mui/material/styles'; +import Box from '@mui/material/Box'; + +// ** Icons Imports +import ArrowUp from 'mdi-material-ui/ArrowUp'; + +// ** Theme Config Import +import themeConfig from 'src/configs/themeConfig'; + +// ** Components +import AppBar from './components/vertical/appBar'; +import Navigation from './components/vertical/navigation'; +import Footer from './components/shared-components/footer'; +import ScrollToTop from 'src/@core/components/scroll-to-top'; + +// ** Styled Component +import DatePickerWrapper from 'src/@core/styles/libs/react-datepicker'; + +const VerticalLayoutWrapper = styled('div')({ + height: '100%', + display: 'flex', +}); + +const MainContentWrapper = styled(Box)({ + flexGrow: 1, + minWidth: 0, + display: 'flex', + minHeight: '100vh', + flexDirection: 'column', +}); + +const ContentWrapper = styled('main')(({ theme }) => ({ + flexGrow: 1, + width: '100%', + padding: theme.spacing(6), + transition: 'padding .25s ease-in-out', + [theme.breakpoints.down('sm')]: { + paddingLeft: theme.spacing(4), + paddingRight: theme.spacing(4), + }, +})); + +const VerticalLayout = props => { + // ** Props + const { settings, children, scrollToTop } = props; + + // ** Vars + const { contentWidth } = settings; + const navWidth = themeConfig.navigationSize; + + // ** States + const [navVisible, setNavVisible] = useState(false); + + // ** Toggle Functions + const toggleNavVisibility = () => setNavVisible(!navVisible); + + return ( + <> + + + + + + + {children} + + +