I'm working on a project for my comp sci class which deals with image processing. My group and I are going to vertically flip and rotate a picture 90 degrees. The first part of my code is the sample from my teacher that turns the photo gray. I'm able to compile my code, but I get the error:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at Project6b.main(Project6b.java:10)
Press any key to continue...
I'm not even sure if what I've coded so far works, and I can't get this to run. Can anyone help me solve my runtime error?
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import java.awt.*;
public class Project6b
{
public static void main (String args[]) throws Exception
{
// I would use these, if the program is finished.
//grayscale(args[0], args[1]);
//verticalFlip(args[0], args[1]);
// I would comment the first two lines and
//uncomment these for testing purposes.
//grayscale("Vicc.jpg", "Vicc2.jpg");
verticalFlip("Vic.png", "Vic2.png");
}
/*public static void grayscale(String originalImage, String convertedImage) throws Exception
{
BufferedImage bufferImg = ImageIO.read(new File(originalImage));
int r,g,b;
Color color = null;
for( int x = 0; x <bufferImg.getWidth(); x++)
{
for(int y = 0; y<bufferImg.getHeight(); y++)
{
int rgb = bufferImg.getRGB(x,y);
color = new Color(rgb,true);
r = color.getRed();
g = color.getGreen();
b = color.getBlue();
color = new Color((r+g+b)/3, (r+g+b)/3, (r+g+b)/3);
bufferImg.setRGB(x,y, color.getRGB());
}
}
File outputfile = new File(convertedImage);
ImageIO.write(bufferImg, "png", outputfile);
} */
public static void verticalFlip(String originalImage, String convertedImage) throws Exception
{
BufferedImage bufferImg = ImageIO.read(new File(originalImage));
BufferedImage bufferImgOut = new BufferedImage(bufferImg.getWidth(),bufferImg.getHeight(), bufferImg.getType());
for (int x = 0; x < bufferImg.getWidth(); x++)
{
for (int y = 0; y < bufferImg.getHeight(); y++)
{
int px = bufferImg.getRGB(x, y);
int destY = bufferImg.getHeight() - y - 1;
bufferImg.setRGB(x, destY, px);
}
}
File outputfile = new File(convertedImage);
ImageIO.write(bufferImgOut, "png", outputfile);
}
//public static void Rotate(String originalImage, String convertedImage) throws Exception
//{
//}
}
The problem occurs when you don't pass any arguments at start up, like reimeus already mentioned.
If you are using an IDE like Eclipse or Netbeans, there should be some kind of start cfg where you can enter the arguments, which should be passed to the app. In case you are launching your app from the command line, use:
java Project6b Jack.jpg Jack2.jpg
java PROGRAM INPUT-IMAGE OUTPUT-IMAGE
Then you can change your main respectively:
public static void main (String args[]) throws Exception
{
// I would use these, if the program is finished.
grayscale(args[0], args[1]);
verticalFlip(args[0], args[1]);
// I would comment the first two lines and
//uncomment these for testing purposes.
//grayscale("Jack.jpg", "Jack.jpg");
//verticalFlip("Jack.jpg", "Jack.jpg");
}
(If you use the function calls at the bottom, you don't need to pass any arguments. This is good for quick debugging.)
Hope it helps!
Regarding verticalFlip:
public static void verticalFlip(String originalImage, String convertedImage)
throws Exception {
BufferedImage bufferImg = ImageIO.read(new File(originalImage));
// create a new Image, which will be your output img, so that
// you do NOT override some pixels in your source img - you'll need them.
BufferedImage bufferImgOut = new BufferedImage(bufferImg.getWidth(), bufferImg.getHeight(), bufferImg.getType());
for (int x = 0; x < bufferImg.getWidth(); x++) {
for (int y = 0; y < bufferImg.getHeight(); y++) {
int px = bufferImg.getRGB(x, y);
int destY = bufferImg.getHeight() - y - 1;
// your x-coordinate should stay the same, since you only flip vertically.
bufferImgOut.setRGB(x, destY, px);
}
}
File outputfile = new File(convertedImage);
ImageIO.write(bufferImgOut, "png", outputfile);
}
Related
It seems like the for loop in my code is not stopping after it iterated througt the counter. it seems to restart, checked with the print function and the length of the directory list seems to be recognized but then it restarts from 0 and so on. First time coding with java and in general i do not have much experience in coding, logic experience comes from visual coding and little bit of python. if somebody can help it would be great.
here is the code,
to run it you need will need processing (https://processing.org/download) and some images in the input folder. thougth this is an easy problem, thats why i still post it here.
I know its not pretty so pls dont hate on it
int dim = 1024;
PImage img;
String inDir;
import java.util.*;
import java.text.DecimalFormat;
String outDir;
String nameSpace;
String nameSpaceOut;
PGraphics pg;
void setup() {
size(1024, 1024);
inDir = "C:/Users/Fynn/Desktop/processing-3.5.4/Resizematte/data/Input 1/";
outDir = "C:/Users/Fynn/Desktop/processing-3.5.4/Resizematte/data/Output 3/";
nameSpace = "ImageToResize";
pg = createGraphics(dim, dim);
nameSpaceOut = "Resized";
}
void draw () {
background(0);
pg.beginDraw();
File dir = new File(inDir);
String[] filenames = dir.list();
for (int i = 0; i < filenames.length; i++) {
background(255, 255, 255);
String fName = inDir + filenames[i];
img = loadImage(fName);
if (img != null) {
float w = img.width;
float h = img.height;
float m = w;
float f = h;
if (h > w) { //change to < for crop > for matte
m = h;
f = w;
}
float factor = (dim/m);
if(h > w){
img.resize(int(f*factor), int(m*factor));
}
else {
img.resize(int(m*factor), int(f*factor));
}
image(img, width/2-img.width/2, height/2-img.height/2);
String outName1 = outDir + nameSpaceOut + "_" + i +".png";
save(outName1);
}
}
}
i try to format pictures which i want to use as a data set input for a GAN machine learnign algorithm.
I'm working on an assignment where I make a maze from a text file reader. I have made a method which lets me select a text file and convert it to a maze but I'm having trouble extracting the maze from the method. I'm getting a NullPointerException on line 28 which is this: X = Maze[0].length;
I'm stuck on why the method isn't returning my array and also how I can have the method return the StartX and StartY position.
package Innlevering09;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import javafx.application.Application;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
public class MazeGame extends Application {
MazeRoute[][] Maze;
int X;
int Y;
int StartX;
int StartY;
Player Player;
public void start(Stage primaryStage) {
try {
GridPane root = new GridPane();
Player Player = new Player(StartX, StartY);
Maze = FileReader();
X = Maze[0].length;
Y = Maze.length;
root.add(Player.getAppearance(), Player.getXpos(), Player.getYpos());
for(int x = 0; x<X; x++){
for(int y = 0; y<Y; y++){
root.add(Maze[x][y].getAppearance(), x, y);
}
}
Scene scene = new Scene(root, X*10, Y*10);
//scene.setOnKeyPressed(new FileListener(this));
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public MazeRoute[][] FileReader() {
String Text = "";
File File;
int Row;
FileChooser FileChooser = new FileChooser();
FileChooser.setTitle("Open a textfile");
FileChooser.getExtensionFilters().add(new ExtensionFilter("Text Files", "*.txt"));
File = FileChooser.showOpenDialog(null);
try (Scanner FileReader = new Scanner(File)){
X = FileReader.nextInt();
Y = FileReader.nextInt();
Text = FileReader.nextLine();
MazeRoute[][] Maze = new MazeRoute[X][Y];
while (FileReader.hasNext()){
Text = FileReader.nextLine();
for (int i = 0 ; i < X ; i++){
for (Row = 0 ; Row < Y ; Row++) {
char Character = Text.charAt(i);
switch (Character){
case '#':
Maze[i][Row] = new Wall(i, Row);
break;
case ' ':
Maze[i][Row] = new NormalTile(i, Row);
break;
case '-':
Maze[i][Row] = new EndTile(i, Row);
break;
case '*':
Maze[i][Row] = new NormalTile(i, Row);
StartX = i;
StartY = Row;
break;
}Row++;
}
}
}
}catch (FileNotFoundException Error) {
System.out.println("Cannot open file");
Error.printStackTrace();
}
return Maze;
}
public static void main(String[] args) {
launch(args);
}
}
edit:
for the people of the future this is the code where I solved the problem:
public class MazeGame extends Application {
MazeRoute[][] maze;
int X;
int Y;
int startX;
int startY;
Player player = new Player();
public void start(Stage primaryStage){
try{
maze = fileReader();
player.setXpos(startX);
player.setYpos(startY);
GridPane root = new GridPane();
Scene scene = new Scene(root, Color.BLACK);
Player player = new Player();
for(int x = 0; x<X; x++){
for(int y = 0; y<Y; y++){
root.add(maze[x][y].getAppearance(), maze[x][y].getTileXpos(), maze[x][y].getTileYpos());
}
}
root.add(player.getAppearance(), player.getXpos(), player.getYpos());
primaryStage.setTitle("MazeGame");
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public MazeRoute[][] fileReader() throws FileNotFoundException {
String text = "";
File file;
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open a text file with a maze");
fileChooser.getExtensionFilters().add(new ExtensionFilter("Text Files", "*.txt"));
file = fileChooser.showOpenDialog(null);
Scanner fileScanner = new Scanner(file);
X = fileScanner.nextInt();
Y = fileScanner.nextInt();
text = fileScanner.nextLine();
MazeRoute[][] methodMaze = new MazeRoute [X][Y];
while (fileScanner.hasNext()) {
for (int row = 0 ; row < Y ; row++){
text = fileScanner.nextLine();
for (int i = 0 ; i < X ; i++) {
char character = text.charAt(i);
switch (character) {
case '#':
methodMaze[i][row] = new Wall(i, row);
break;
case ' ':
methodMaze[i][row] = new NormalTile(i, row);
break;
case '-':
methodMaze[i][row] = new EndTile(i, row);
break;
case '*':
methodMaze[i][row] = new NormalTile(i, row);
startX = i;
startY = row;
break;
}
}
}
}
return methodMaze;
}
public static void main(String[] args) {
launch(args);
}
}
the changes I made are the following:
I made a new array with the maze blocks inside of the method to avoid the possibility of any scoping issues.
I swapped the row and i in the for loop meaning that the loop now goes through a full line before incrementing down to the next one.
I moved text = fileScanner.nextLine(); to the inside of the for loop so that it would actually scan the next line.
I changed the for loops to start counting from 0 instead of 1 (stupid mistake I know).
The method FileReader (whose name should start with a lower case letter), returns Maze.
However, this is the property on class level since the local variable with the same name, declared within the try-catch, is out of scope.
This class-level property has not been assigned yet and is therefore equal to null.
It's a scope problem. You are not returning the variable declared in the function "FileReader" because it's declared only in the scope of the while loop. The only variable available for the return is the one declared in the scope of the class.
First, as others have pointed out, Java naming conventions are that all variables, methods, and non-static fields must start with a lower case letter. This is especially important when your variables have the same names as existing Java SE classes. Your code will be much easier to read, and you will not only help yourself, you will get help from people on Stack Overflow more quickly.
In your FileReader method, you have this line:
MazeRoute[][] Maze = new MazeRoute[X][Y];
That line declares a new variable named Maze, which has no relationship to the Maze field of your MazeGame class. All subsequent lines of code are populating that new variable, not the Maze field declared in the MazeGame class.
A variable only exists within the brace-enclosed block where it is declared. In this case, that block is your try block, since new Maze variable is declared inside that try block. Once the the end of that try block is reached, the Maze variable does not exist and its value is eligible for garbage collection.
When your FileReader method reaches its return statement, that Maze variable doesn’t exist, so return Maze; actually refers to the Maze field of the MazeGame class. But that field was never set by your method, since your code was setting a locally defined variable which happened to have the same name. In Java, all object fields are null until set otherwise. So the method returns null.
The easiest way to fix your problem is to avoid defining a new Maze variable. Change this:
MazeRoute[][] Maze = new MazeRoute[X][Y];
to this:
Maze = new MazeRoute[X][Y];
I'm trying to imitate a similar code seen here http://www.openprocessing.org/sketch/7050 but I seem to have gotten a little mixed up with the code. I'm trying to get the effect of the letters essentially drawing the posterized image of the picture. But I have getting a NullPointException and assume is has to do with how I'm initializing the string variables but i can't seem to find what I'm doing wrong.
The Error
Exception in thread "Animation Thread" java.lang.NullPointerException
at processing.opengl.PGL.getString(PGL.java:1029)
at processing.opengl.PGraphicsOpenGL.getGLParameters(PGraphicsOpenGL.java:6076)
at processing.opengl.PGraphicsOpenGL.beginDraw(PGraphicsOpenGL.java:1547)
at MLKpractice.letterfit(MLKpractice.java:147)
at MLKpractice.draw(MLKpractice.java:98)
at processing.core.PApplet.handleDraw(PApplet.java:2120)
at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:197)
at processing.core.PApplet.run(PApplet.java:1998)
at java.lang.Thread.run(Thread.java:680)
The program says the error is on line 127
lettersquare.beginDraw();
But I believe the error is somewhere above
PFont font;
String fontpath = "ArialMT-200.vlw";
int fontstart = 300;
int fontend = 8;
float fontsize = fontstart;
float fontsizedecrease = 0.97;
PImage bg;
PImage australia;
PImage austria;
String country1 = "australia.jpg";
String country2 = "austria.jpg";
String letters = "Australia";
char[] chars = new char[52];
int nchars = 0;
int iterations = 500;
int c = 0;
PGraphics letter,lettersquare,drawing;
void setup(){
//initialize the sketch
size(900,600);
//background(255);
//initialize the font
//font = loadFont(fontpath);
///*
for(int i=0;i<letters.length();i++){
boolean found = false;
char lc = letters.charAt(i);
for(int j=0;j<nchars;j++){
if(chars[j]==lc){
found = true;
break;
}
}
if(!found) chars[nchars++] = lc;
}
chars = (char[]) subset(chars,0,nchars);
font = createFont("Arial",200,true,chars);
//*/
textAlign(CENTER,CENTER);
//load the image that will be filled with letters
australia = loadImage(country1);
austria = loadImage(country2);
bg = loadImage("background.jpg");
//posterize the image
australia.filter(THRESHOLD,0.4);
australia.filter(BLUR,3);
australia.filter(THRESHOLD,0.6);
//initialize the drawing buffers
letter = createGraphics((int)fontsize,(int)fontsize,JAVA2D);
lettersquare = createGraphics((int)fontsize,(int)fontsize,P2D);
drawing = createGraphics(width,height,JAVA2D);
drawing.beginDraw();
drawing.background(255);
// THIS STUPID THING NEEDS TO GO HERE!!!!
drawing.image(bg,0,0);
drawing.endDraw();
}
void draw(){
if(floor(fontsize)>fontend&&c<letters.length()-1){
if(!letterfit()){
fontsize *= fontsizedecrease;
}else{
c++;
if(c==11){
fontsize *= 0.75;
}
}
tint(255);
image(drawing,0,0);
if (keyCode == LEFT) {
image(austria,0,0);
}
// if (keyCode == RIGHT) {
// frog1.frogx = frog1.frogx + 1;
// }
if(mousePressed){
tint(255,100);
image(australia,0,0);
}
}else{
tint(255);
image(drawing,0,0);
println(c+" "+letters.length());
/*
save("mlk-"+hour()+""+minute()+""+second()+".tif");
exit();
*/
noLoop();
}
}
boolean letterfit(){
letter.beginDraw();
letter.background(255,0);
letter.fill(0);
letter.textAlign(CENTER,CENTER);
letter.translate(fontsize/2,fontsize/2);
letter.rotate(random(TWO_PI));
letter.scale(fontsize/fontstart);
letter.textFont(font);
letter.smooth();
letter.text(letters.charAt(c),0,0);
letter.endDraw();
lettersquare.beginDraw();
You've most likely been hit by issue 1217, which prevents you from using an OpenGL PGraphics renderer if the main renderer is Java2D.
The link has a workaround, which basically involves changing the main renderer to OpenGL.
A newer version of PGraphics should give you a more detailed exception.
I'm trying to change the color of the points on my 3D Scatter Plot. The points change to black, not the color I want and the point on the key changes to the correct color. Does anyone know why this occurs?
import com.panayotis.gnuplot.JavaPlot;
import com.panayotis.gnuplot.plot.*;
import com.panayotis.gnuplot.style.NamedPlotColor;
import com.panayotis.gnuplot.style.PlotStyle;
import com.panayotis.gnuplot.style.Style;
public class ScatterPlot4D {
public static void main(String[] args) {
int rows = 100;
int D = 4;
double [][] dataSet = new double [rows][D];
for(int x = 0;x < rows; x++){
for(int y = 0;y < D; y++){
dataSet[x][y]=Math.random();
}
}
JavaPlot p = new JavaPlot("C:\\Program Files\\gnuplot\\bin\\pgnuplot.exe");
p.newGraph3D();
PlotStyle myStyle = new PlotStyle();
myStyle.setStyle(Style.POINTS);
myStyle.setLineType(NamedPlotColor.BLUE);
DataSetPlot myPlot = new DataSetPlot(dataSet);
myPlot.setPlotStyle(myStyle);
p.addPlot(myPlot);
p.splot();
}
}
What's weird is this works when graphing a function.
import com.panayotis.gnuplot.GNUPlot;
import com.panayotis.gnuplot.plot.*;
import com.panayotis.gnuplot.style.NamedPlotColor;
import com.panayotis.gnuplot.style.PlotStyle;
import com.panayotis.gnuplot.style.Style;
public class test3D {
public static void main(String[] args) {
GNUPlot p = new GNUPlot("C:\\Program Files\\gnuplot\\bin\\pgnuplot.exe");
p.newGraph3D();
PlotStyle myStyle = new PlotStyle();
myStyle.setStyle(Style.IMPULSES);
myStyle.setLineType(NamedPlotColor.BLUE);
FunctionPlot myPlot = new FunctionPlot("tan(x)");
myPlot.setTitle("3D Plot");
myPlot.setPlotStyle(myStyle);
p.addPlot(myPlot);
p.splot();
}
}
gnuplot is being sent the commands:
gnuplot> set multiplot layout 1,2 rowsfirst downwards
multiplot> _gnuplot_error = 1
multiplot> splot '-' title 'Datafile 1' with points linetype rgb 'blue' ;_gnuplot_error = 0X
input data ('e' ends) > random data is here, not included for brevity
multiplot> if (_gnuplot_error == 1) print '_ERROR_'
multiplot> unset multiplot
well, I think that what you need is to use setPointType instead of setLineType in the scatter graph, as is has no Lines. it has only Points.
As mgilson said in the comments:
use myStyle.setLineType(3);
(#mgilson, if you want credit for the answer, just write it yourself, message me and I'll accept it instead_
So I'm working on an assignment for my game design class to build a pacman clone, it'll be throughout the semester.
Currently I've got a text file that is the pacman maze
see below :
WWWWWWWWWWWWWWWWWWWWWWWWWWWW
W............WW............W
W.WWWW.WWWWW.WW.WWWWW.WWWW.W
W*WWWW.WWWWW.WW.WWWWW.WWWW*W
W.WWWW.WWWWW.WW.WWWWW.WWWW.W
W..........................W
W.WWWW.WW.WWWWWWWW.WW.WWWW.W
W.WWWW.WW.WWWWWWWW.WW.WWWW.W
W......WW....WW....WW......W
WWWWWW.WWWWW.WW.WWWWW.WWWWWW
WWWWWW.WWWWW.WW.WWWWW.WWWWWW
WWWWWW.WW..........WW.WWWWWW
WWWWWW.WW.WWWWWWWW.WW.WWWWWW
WWWWWW.WW.WWWWWWWW.WW.WWWWWW
..........WWWWWWWW..........
WWWWWW.WW.WWWWWWWW.WW.WWWWWW
WWWWWW.WW.WWWWWWWW.WW.WWWWWW
WWWWWW.WW..........WW.WWWWWW
WWWWWW.WW.WWWWWWWW.WW.WWWWWW
WWWWWW.WW.WWWWWWWW.WW.WWWWWW
W............WW............W
W.WWWW.WWWWW.WW.WWWWW.WWWW.W
W*WWWW.WWWWW.WW.WWWWW.WWWW*W
W...WW................WW...W
WWW.WW.WW.WWWWWWWW.WW.WW.WWW
WWW.WW.WW.WWWWWWWW.WW.WW.WWW
W......WW....WW....WW......W
W.WWWWWWWWWW.WW.WWWWWWWWWW.W
W.WWWWWWWWWW.WW.WWWWWWWWWW.W
W..........................W
WWWWWWWWWWWWWWWWWWWWWWWWWWWW
the idea is that this is read in, line by line by a reader from the java io package and then used to populate a 2d array, I think then I can use a loop to specify where to print images using the paint class with the data in the array.
My problem currently is the paint method, it doesnt seem to be working at all but I cant find what's wrong with it at the moment. Can anyone point me in the right direction?
(My codes formatting has been messed up a tad by indentation required here, I'm also new to the java IO package, first time I've seen exception handling!)
Thanks in advance for any help!
//imports
import java.awt.*;
import java.io.*;
import javax.swing.*;
public class Maze extends JFrame
{
//V.Decleration
private static final Dimension WindowSize = new Dimension (600,600);
static char[][] Amaze = new char[28][31];
//default constructor
public Maze()
{
this.setTitle("Pacman");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Dimension screensize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
int x = screensize.width/2 - WindowSize.width/2;
int y = screensize.height/2 - WindowSize.height/2;
setBounds(x, y, WindowSize.width, WindowSize.height);
setVisible(true);
}
public void paint (Graphics g)
{
String line = null;
try
{
BufferedReader reader = new BufferedReader(new FileReader("G:\\Game Design\\Pacman\\src\\Maze.txt"));
for (int i=0; i<=31; i++)
{
do
{
try
{
line=reader.readLine();
for (int y=0; y<=28; y++)
{
Amaze[y][i]=line.charAt(y);
}
}catch (IOException e) { }
}
while (line!= null);
try
{
reader.close();
} catch (IOException e) { }
}
} catch (FileNotFoundException e) {}
}
//main
public static void main (String [] args)
{
Maze maze = new Maze();
for (int i=0;i<=28;i++)
System.out.print(Amaze[i][31]);
}
}
You are creating an array that is too small for the loop. Namely: new char[28][31]; will only allow for a maximum index of 27 and 30. Your for loops are:
for (int i=0; i<=31; i++)
for (int y=0; y<=28; y++)
Use i<31 and y<28, or increase your array to be [29][32]. Either one of these should solve your current problem.
Three suggestions:
It may be less misleading to separate your functions to do just one job at a time. So there should be a function to read the file and then another to paint the results.
Put more System.out.println() statements in your code when you're trying to debug. That's a good way to check whether each part did what you intended. For example, printing the line variable after reading it in would at least let you know whether you were reading the file correctly.
Always print out your exceptions. They will tell you what went wrong and where.
That said, this code will load and print your maze:
import java.io.*;
public class Read2DArray {
private final int WIDTH = 28;
private final int HEIGHT = 31;
private char[][] maze = new char[WIDTH][HEIGHT];
public static void main(String[] args) {
Read2DArray array = new Read2DArray();
array.loadFile("maze.txt");
array.printArray();
}
public void loadFile(String fname) {
try {
BufferedReader reader = new BufferedReader(new FileReader(fname));
String line;
int col = 0, row = 0;
while((line = reader.readLine()) != null && row < HEIGHT) {
for(col = 0; col < line.length() && col < WIDTH; col++) {
maze[col][row] = line.charAt(col);
}
row++;
}
reader.close();
} catch(IOException e) {
e.printStackTrace();
}
}
public void printArray() {
for(int row = 0; row < HEIGHT; row++) {
for(int col = 0; col < WIDTH; col++) {
System.out.print(maze[col][row]);
}
System.out.println();
}
}
}