### Install Dynamic QRIS Package Source: https://github.com/agungjsp/dynamic-qris/blob/main/README.md Installs the '@agungjsp/qris-dinamis' package using npm. This package is required to use the dynamic QRIS generation functionalities. ```bash npm i @agungjsp/qris-dinamis ``` -------------------------------- ### ES Module Imports for Dynamic QRIS Source: https://context7.com/agungjsp/dynamic-qris/llms.txt Demonstrates how to import and use functions from the '@agungjsp/qris-dinamis' library using modern ES Module syntax. It covers default and named imports, including asynchronous operations with async/await for file generation. Ensure the '@agungjsp/qris-dinamis' package is installed. ```javascript // Default import (both functions) import qrisDinamis from '@agungjsp/qris-dinamis'; const dynamicQris = qrisDinamis.makeString(qris, { nominal: '10000' }); await qrisDinamis.makeFile(qris, { nominal: '10000' }); // Named imports (recommended) import { makeString, makeFile } from '@agungjsp/qris-dinamis'; const dynamicString = makeString(qris, { nominal: '5000' }); const imagePath = await makeFile(qris, { nominal: '5000' }); // Async/await pattern for file generation async function generatePaymentQR(amount, customerName) { const qris = '00020101021126570011ID1234567890123456789012340303UMI51440014ID.CO.QRIS.WWW0215ID20232108123456780303UMI520454995802ID5914MERCHANT NAME6007Jakarta61051234662070703A016304ABCD'; try { const qrImage = await makeFile(qris, { nominal: amount.toString(), path: `qr-codes/${customerName}-${Date.now()}.jpg` }); return qrImage; } catch (error) { throw new Error(`QR generation failed: ${error.message}`); } } // Usage const result = await generatePaymentQR(150000, 'customer-123'); console.log(`QR code saved to: ${result}`); ``` -------------------------------- ### Generate QR Code Image from Dynamic QRIS Source: https://github.com/agungjsp/dynamic-qris/blob/main/README.md Generates a QR code image from a dynamic QRIS string using the 'makeFile' function. This example shows basic usage, generating a Base64 encoded string for web, specifying a custom output path, and including fee calculation. ```javascript const qris = '00020101021126570011ID1234567890123456789012340303UMI51440014ID.CO.QRIS.WWW0215ID20232108123456780303UMI520454995802ID5914MERCHANT NAME6007Jakarta61051234662070703A016304ABCD'; // Basic usage - saves to output/ directory const result = await qrisDinamis.makeFile(qris, { nominal: '5000' }); // Base64 output for web applications const base64 = await qrisDinamis.makeFile(qris, { nominal: '5000', base64: true }); // Custom output path const result = await qrisDinamis.makeFile(qris, { nominal: '5000', path: 'custom/path/qris.jpg' }); // With fee calculation const result = await qrisDinamis.makeFile(qris, { nominal: '5000', fee: '500', taxtype: 'r' // 'r' for rupiah, 'p' for percent }); // Browser usage (returns QR code data URL) const qrDataURL = await qrisDinamis.makeFile(qris, { nominal: '5000', base64: true // Required in browser environments }); // Note: Browser version returns a simple QR code without template overlay ``` -------------------------------- ### ES Module Import Syntax Source: https://context7.com/agungjsp/dynamic-qris/llms.txt Demonstrates how to import and use the ES Module versions of the qris-dinamis functions for generating QRIS codes. ```APIDOC ## ES Module Import Syntax Modern ES Module import patterns for tree-shaking and better IDE support. ### Default Import ```javascript import qrisDinamis from '@agungjsp/qris-dinamis'; const dynamicQris = qrisDinamis.makeString(qris, { nominal: '10000' }); await qrisDinamis.makeFile(qris, { nominal: '10000' }); ``` ### Named Imports (Recommended) ```javascript import { makeString, makeFile } from '@agungjsp/qris-dinamis'; const dynamicString = makeString(qris, { nominal: '5000' }); const imagePath = await makeFile(qris, { nominal: '5000' }); ``` ### Async/await Pattern for File Generation ```javascript async function generatePaymentQR(amount, customerName) { const qris = '00020101021126570011ID1234567890123456789012340303UMI51440014ID.CO.QRIS.WWW0215ID20232108123456780303UMI520454995802ID5914MERCHANT NAME6007Jakarta61051234662070703A016304ABCD'; try { const qrImage = await makeFile(qris, { nominal: amount.toString(), path: `qr-codes/${customerName}-${Date.now()}.jpg` }); return qrImage; } catch (error) { throw new Error(`QR generation failed: ${error.message}`); } } // Usage const result = await generatePaymentQR(150000, 'customer-123'); console.log(`QR code saved to: ${result}`); ``` ``` -------------------------------- ### Import Dynamic QRIS Module in JavaScript Source: https://github.com/agungjsp/dynamic-qris/blob/main/README.md Demonstrates how to import the '@agungjsp/qris-dinamis' package in both CommonJS and ES Modules environments. It shows importing the default export and specific functions like 'makeString' and 'makeFile'. ```javascript // CommonJS const qrisDinamis = require('@agungjsp/qris-dinamis'); // ES Modules (both syntaxes supported) import qrisDinamis from '@agungjsp/qris-dinamis'; import { makeString, makeFile } from '@agungjsp/qris-dinamis'; ``` -------------------------------- ### POST /api/qris/download Source: https://context7.com/agungjsp/dynamic-qris/llms.txt Generates a QRIS code and triggers a file download of the QR code image. This endpoint is suitable for scenarios where users need to download the QR code as a file. ```APIDOC ## POST /api/qris/download ### Description Generates a QRIS code and triggers a file download of the QR code image. This endpoint is suitable for scenarios where users need to download the QR code as a file. ### Method POST ### Endpoint `/api/qris/download` ### Parameters #### Request Body - **qris** (string) - Required - The base QRIS string. - **nominal** (string) - Required - The nominal amount for the QRIS code. - **filename** (string) - Optional - The desired filename for the downloaded QR code image. Defaults to 'payment-qr.jpg'. ### Request Example ```json { "qris": "00020101021126570011ID1234567890123456789012340303UMI51440014ID.CO.QRIS.WWW0215ID20232108123456780303UMI520454995802ID5914MERCHANT NAME6007Jakarta61051234662070703A016304ABCD", "nominal": "100000", "filename": "my-qr-code.png" } ``` ### Response #### Success Response (200) - **File Download** - The server will respond with a file download. #### Error Response (500) - **error** (string) - The error message. ### Response Example (Success) *(The server will initiate a file download)* ### Response Example (Error) ```json { "error": "QR generation failed: ..." } ``` ``` -------------------------------- ### Handle Errors During QRIS Generation Source: https://github.com/agungjsp/dynamic-qris/blob/main/README.md Illustrates error handling for both 'makeString' and 'makeFile' functions. It shows how to catch potential errors, such as missing required parameters for 'makeString' or file generation failures for 'makeFile'. ```javascript try { const result = qrisDinamis.makeString(qris, { nominal: '5000' }); } catch (error) { if (error.message.includes('required')) { console.log('Missing required parameter'); } } try { const result = await qrisDinamis.makeFile(qris, { nominal: '5000' }); } catch (error) { console.log('File generation failed:', error.message); } ``` -------------------------------- ### Generate and Process Dynamic QRIS Payments in JavaScript Source: https://context7.com/agungjsp/dynamic-qris/llms.txt This JavaScript class, `PaymentProcessor`, handles the entire dynamic QRIS payment workflow. It utilizes the '@agungjsp/qris-dinamis' library to generate QRIS strings and image files. The class includes methods for creating payments, saving transaction records to a JSON file, and simulating email notifications with QR code images. It requires Node.js and the 'fs' module for file operations. ```javascript const { makeFile, makeString } = require('@agungjsp/qris-dinamis'); const fs = require('fs').promises; class PaymentProcessor { constructor(merchantQris) { this.merchantQris = merchantQris; } async createPayment(orderId, amount, customerEmail) { try { // Calculate fee (2% platform fee) const platformFee = '2'; // Generate dynamic QRIS string const dynamicQris = makeString(this.merchantQris, { nominal: amount.toString(), fee: platformFee, taxtype: 'p' }); // Generate QR code image const qrImagePath = await makeFile(this.merchantQris, { nominal: amount.toString(), fee: platformFee, taxtype: 'p', path: `payments/${orderId}.jpg` }); // Generate base64 for email const qrBase64 = await makeFile(this.merchantQris, { nominal: amount.toString(), fee: platformFee, taxtype: 'p', base64: true }); // Calculate total with fee const totalAmount = parseInt(amount) * 1.02; // Create payment record const payment = { orderId, amount: parseInt(amount), fee: parseInt(amount) * 0.02, totalAmount, qrisString: dynamicQris, qrImagePath, status: 'pending', createdAt: new Date().toISOString(), expiresAt: new Date(Date.now() + 3600000).toISOString() // 1 hour }; // Save payment record await this.savePayment(payment); // Send email with QR code await this.sendPaymentEmail(customerEmail, payment, qrBase64); return payment; } catch (error) { throw new Error(`Payment creation failed: ${error.message}`); } } async savePayment(payment) { const paymentsFile = 'data/payments.json'; let payments = []; try { const data = await fs.readFile(paymentsFile, 'utf8'); payments = JSON.parse(data); } catch (error) { // File doesn't exist, start fresh } payments.push(payment); await fs.writeFile(paymentsFile, JSON.stringify(payments, null, 2)); } async sendPaymentEmail(email, payment, qrBase64) { // Email service integration console.log(`Sending payment email to ${email}`); console.log(`Order ID: ${payment.orderId}`); console.log(`Amount: Rp ${payment.totalAmount.toLocaleString('id-ID')}`); console.log(`QR Image: ${qrBase64.substring(0, 50)}...`); // Integrate with email service (SendGrid, Mailgun, etc.) } } // Usage example const merchantQris = '00020101021126570011ID1234567890123456789012340303UMI51440014ID.CO.QRIS.WWW0215ID20232108123456780303UMI520454995802ID5914MERCHANT NAME6007Jakarta61051234662070703A016304ABCD'; const processor = new PaymentProcessor(merchantQris); async function processOrder() { try { const payment = await processor.createPayment( 'ORD-2026-001', '250000', 'customer@example.com' ); console.log('Payment created successfully:'); console.log(`- Order ID: ${payment.orderId}`); console.log(`- Amount: Rp ${payment.amount.toLocaleString('id-ID')}`); console.log(`- Fee: Rp ${payment.fee.toLocaleString('id-ID')}`); console.log(`- Total: Rp ${payment.totalAmount.toLocaleString('id-ID')}`); console.log(`- QR Image: ${payment.qrImagePath}`); console.log(`- Expires: ${payment.expiresAt}`); } catch (error) { console.error('Order processing failed:', error.message); } } processOrder(); ``` -------------------------------- ### Browser QRIS Generation with HTML and JavaScript Source: https://context7.com/agungjsp/dynamic-qris/llms.txt This snippet provides a full HTML page with embedded JavaScript for client-side QRIS code generation. It includes input fields for static QRIS data, amount, and fee, along with a dropdown for tax type. The 'makeFile' function from the '@agungjsp/qris-dinamis' library is used to generate the QR code as a data URL, which is then displayed as an image and made downloadable. Error handling is included for missing inputs or generation failures. ```html
✅ QRIS generation successful!
Amount: Rp 25,000
Base64 length: ${base64Image.length}
`; } catch (error) { resultDiv.innerHTML = `❌ Error: ${error.message}`; console.error('Error:', error); } }); ``` -------------------------------- ### Generate QR Code Image File from QRIS String (JavaScript) Source: https://context7.com/agungjsp/dynamic-qris/llms.txt This function generates a QR code image from a QRIS string, allowing for dynamic amounts and optional fees. It can output the QR code as a file (saved to a specified path or a default directory) or as a base64 encoded string suitable for embedding in web pages or emails. Customizable templates can also be applied for branding. This function is asynchronous and requires an async context to use. ```javascript const qrisDinamis = require('@agungjsp/qris-dinamis'); const staticQris = '00020101021126570011ID1234567890123456789012340303UMI51440014ID.CO.QRIS.WWW0215ID20232108123456780303UMI520454995802ID5914MERCHANT NAME6007Jakarta61051234662070703A016304ABCD'; // Basic file generation (saves to output/ directory) const filePath = await qrisDinamis.makeFile(staticQris, { nominal: '75000' }); console.log(filePath); // Output: "output/MERCHANT NAME-1735689600000.jpg" // Generate base64 string for embedding in HTML/email const base64Image = await qrisDinamis.makeFile(staticQris, { nominal: '25000', base64: true }); console.log(base64Image.substring(0, 50)); // Output: "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQAB..." // Custom output path with fee calculation const customPath = await qrisDinamis.makeFile(staticQris, { nominal: '100000', fee: '2500', taxtype: 'r', path: 'invoices/payment-qr-001.jpg' }); console.log(customPath); // Output: "invoices/payment-qr-001.jpg" // Custom template for branding const brandedQR = await qrisDinamis.makeFile(staticQris, { nominal: '50000', templatePath: 'custom/branded-template.png', path: 'branded-qr.jpg' }); // Error handling for browser environment try { if (typeof window !== 'undefined') { // Browser: must use base64 option const dataUrl = await qrisDinamis.makeFile(staticQris, { nominal: '10000', base64: true }); document.getElementById('qr-image').src = dataUrl; } } catch (error) { console.error(error.message); // "File writing is not supported in browser environment. Use base64: true option instead." } ``` -------------------------------- ### POST /api/qris/generate Source: https://context7.com/agungjsp/dynamic-qris/llms.txt Generates a QRIS code and returns its base64 representation along with a dynamic string for display. This endpoint is useful for displaying QR codes directly in web or mobile applications. ```APIDOC ## POST /api/qris/generate ### Description Generates a QRIS code and returns its base64 representation along with a dynamic string for display. This endpoint is useful for displaying QR codes directly in web or mobile applications. ### Method POST ### Endpoint `/api/qris/generate` ### Parameters #### Request Body - **qris** (string) - Required - The base QRIS string. - **nominal** (string) - Required - The nominal amount for the QRIS code. - **fee** (string) - Optional - The fee amount. Defaults to '0'. - **taxtype** (string) - Optional - The tax type. Defaults to 'p'. ### Request Example ```json { "qris": "00020101021126570011ID1234567890123456789012340303UMI51440014ID.CO.QRIS.WWW0215ID20232108123456780303UMI520454995802ID5914MERCHANT NAME6007Jakarta61051234662070703A016304ABCD", "nominal": "150000", "fee": "5000", "taxtype": "p" } ``` ### Response #### Success Response (200) - **success** (boolean) - Indicates if the operation was successful. - **data** (object) - Contains the generated QRIS information. - **qrImage** (string) - The base64 encoded QRIS image. - **qrisString** (string) - The dynamic QRIS string. - **amount** (string) - The nominal amount. - **fee** (string) - The fee amount. - **timestamp** (string) - The ISO string timestamp of generation. #### Error Response (400) - **error** (string) - Description of the missing required fields. #### Error Response (500) - **success** (boolean) - Indicates if the operation was successful. - **error** (string) - The error message. ### Response Example (Success) ```json { "success": true, "data": { "qrImage": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACIeYheAAAEBUlEQVR4Xu3UAQkAAAwDINPc/2l+fF7E+wN+wQIECEy0X6CBAgQINCGwIMR/f848m9/e59z31hBAgQIEDg+wMECBAg0KCAwB8fP/QZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$$ } } ``` ### Response Example (Error) ```json { "error": "Missing required fields: qris and nominal" } ``` ``` -------------------------------- ### QRIS Dinamis API Reference Source: https://github.com/agungjsp/dynamic-qris/blob/main/README.md API endpoints for converting static QRIS to dynamic QRIS and generating QR code images. ```APIDOC ## POST /makeString ### Description Converts a static QRIS string to a dynamic QRIS string by embedding a payment amount. ### Method POST ### Endpoint /makeString ### Parameters #### Request Body - **qris** (string) - Required - The static QRIS string. - **nominal** (string) - Required - The payment amount to embed. - **taxtype** (string) - Optional - Tax type: 'r' for rupiah or 'p' for percent. Defaults to 'p'. - **fee** (string) - Optional - The fee amount. Defaults to '0'. ### Request Example ```json { "qris": "00020101021126570011ID1234567890123456789012340303UMI51440014ID.CO.QRIS.WWW0215ID20232108123456780303UMI520454995802ID5914MERCHANT NAME6007Jakarta61051234662070703A016304ABCD", "nominal": "5000", "taxtype": "r", "fee": "500" } ``` ### Response #### Success Response (200) - **dynamicQrisString** (string) - The modified QRIS string with the embedded amount. #### Response Example ```json { "dynamicQrisString": "00020101021126570011ID1234567890123456789012340303UMI51440014ID.CO.QRIS.WWW0215ID20232108123456780303UMI520454995802ID5914MERCHANT NAME6007Jakarta61051234662070703A016304ABCD" } ``` ## POST /makeFile ### Description Generates a QR code image from a dynamic QRIS string. Supports Node.js for file output and browser for Data URL. ### Method POST ### Endpoint /makeFile ### Parameters #### Request Body - **qris** (string) - Required - The static QRIS string. - **nominal** (string) - Required - The payment amount to embed. - **base64** (boolean) - Optional - If true, returns a base64 encoded string (Data URL in browser). Defaults to false. - **path** (string) - Optional - Custom output path for the QR code image (Node.js only). - **templatePath** (string) - Optional - Path to a custom template image. Defaults to 'assets/template.png'. - **taxtype** (string) - Optional - Tax type: 'r' for rupiah or 'p' for percent. Defaults to 'p'. - **fee** (string) - Optional - The fee amount. Defaults to '0'. ### Request Example ```json { "qris": "00020101021126570011ID1234567890123456789012340303UMI51440014ID.CO.QRIS.WWW0215ID20232108123456780303UMI520454995802ID5914MERCHANT NAME6007Jakarta61051234662070703A016304ABCD", "nominal": "5000", "base64": true, "path": "custom/path/qris.jpg", "fee": "500", "taxtype": "r" } ``` ### Response #### Success Response (200) - **qrCodeOutput** (string) - The output of the QR code generation. This can be a file path (Node.js), a base64 encoded string (Node.js), or a Data URL (browser). #### Response Example ```json { "qrCodeOutput": "path/to/your/qris.jpg" } ``` ### Error Handling #### Example ```javascript try { const result = await qrisDinamis.makeFile(qris, { nominal: '5000' }); } catch (error) { console.log('File generation failed:', error.message); } ``` ``` -------------------------------- ### Generate Dynamic QRIS String with Amount Source: https://github.com/agungjsp/dynamic-qris/blob/main/README.md Converts a static QRIS string into a dynamic QRIS string with an embedded payment amount using the 'makeString' function. This is useful for pre-setting transaction values. ```javascript const qris = '00020101021126570011ID1234567890123456789012340303UMI51440014ID.CO.QRIS.WWW0215ID20232108123456780303UMI520454995802ID5914MERCHANT NAME6007Jakarta61051234662070703A016304ABCD'; const result = qrisDinamis.makeString(qris, { nominal: '5000' }); console.log(result); // Returns modified QRIS string with embedded amount ``` -------------------------------- ### Express.js API for Dynamic QRIS Generation Source: https://context7.com/agungjsp/dynamic-qris/llms.txt Implements a RESTful API using Express.js to generate dynamic QRIS codes. It exposes two endpoints: one to generate QRIS as base64 and a string, and another to download the QRIS code as a file. Requires 'express' and '@agungjsp/qris-dinamis' packages. Input validation is performed on the request body. ```javascript const express = require('express'); const { makeFile, makeString } = require('@agungjsp/qris-dinamis'); const app = express(); app.use(express.json()); // Endpoint to generate QR code and return base64 app.post('/api/qris/generate', async (req, res) => { try { const { qris, nominal, fee = '0', taxtype = 'p' } = req.body; // Validate input if (!qris || !nominal) { return res.status(400).json({ error: 'Missing required fields: qris and nominal' }); } // Generate QR code as base64 const qrImage = await makeFile(qris, { nominal: nominal.toString(), fee: fee.toString(), taxtype, base64: true }); // Generate dynamic string for display const dynamicString = makeString(qris, { nominal: nominal.toString(), fee: fee.toString(), taxtype }); res.json({ success: true, data: { qrImage, qrisString: dynamicString, amount: nominal, fee, timestamp: new Date().toISOString() } }); } catch (error) { res.status(500).json({ success: false, error: error.message }); } }); // Download QR code as file app.post('/api/qris/download', async (req, res) => { try { const { qris, nominal, filename = 'payment-qr.jpg' } = req.body; const filePath = await makeFile(qris, { nominal: nominal.toString(), path: `temp/${filename}` }); res.download(filePath, filename, (err) => { if (err) { console.error('Download error:', err); } // Cleanup temp file after download fs.unlinkSync(filePath); }); } catch (error) { res.status(500).json({ error: error.message }); } }); app.listen(3000, () => console.log('QRIS API running on port 3000')); ``` -------------------------------- ### Convert Static QRIS to Dynamic String with Fees (JavaScript) Source: https://context7.com/agungjsp/dynamic-qris/llms.txt This function modifies a static QRIS string to embed a payment amount and optional fees. It supports both percentage-based and fixed rupiah fees, and includes CRC16 validation. The input is a static QRIS string and an options object containing the nominal amount, fee type, and fee value. It returns the modified QRIS string. ```javascript const qrisDinamis = require('@agungjsp/qris-dinamis'); // Basic conversion with amount only const staticQris = '00020101021126570011ID1234567890123456789012340303UMI51440014ID.CO.QRIS.WWW0215ID20232108123456780303UMI520454995802ID5914MERCHANT NAME6007Jakarta61051234662070703A016304ABCD'; const dynamicQris = qrisDinamis.makeString(staticQris, { nominal: '50000' }); console.log(dynamicQris); // Output: Modified QRIS string with embedded amount // With percentage-based fee (5%) const qrisWithPercentFee = qrisDinamis.makeString(staticQris, { nominal: '100000', taxtype: 'p', fee: '5' }); // Total: 100000 + (100000 * 5%) = 105000 // With fixed rupiah fee (2500) const qrisWithFixedFee = qrisDinamis.makeString(staticQris, { nominal: '50000', taxtype: 'r', fee: '2500' }); // Total: 50000 + 2500 = 52500 // Error handling try { const result = qrisDinamis.makeString(staticQris, {}); } catch (error) { console.error(error.message); // "The parameter 'nominal' is required." } ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.