안드로이드 이미지 처리

안드로이드 bitmap, bitmap inSampleSize


비트 연산자를 이용하여 

inSampleSize 구하기




// 이미지 사이즈 처리

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

bitmap = BitmapFactory.decodeFile(filePath, options);


int pow = 0;

int reqHeight = 1000, reqWidth = 1000;

while (options.outHeight >> pow > reqHeight || options.outWidth >> pow > reqWidth) {

pow += 1;

}

options.inSampleSize = 1 << pow;

options.inJustDecodeBounds = false;

bitmap = BitmapFactory.decodeFile(filePath, options);

// 이미지 사이즈 처리

Posted by [czar]
,

KISA, 국내에 DNS 루트서버 유치
- 인터넷의 서비스 안정성 강화, 해외연결 트래픽 감소 기대

KISA(한국인터넷진흥원, 원장 서종렬)는 제43차 ICANN 회의에 참석하여 스티브 크로커(Steve Crocker) ICANN 이사회 의장과 로드 백스트롬(Rod Backstrom) ICANN CEO와의 면담을 통해 DNS(Domain Name System) 루트(Root) 서버를 국내에 유치했다고 15일 밝혔다.

루트서버는 도메인이름(www.kisa.or.kr)을 IP주소(123.456.789.123)로 연결해 주는 최상위 단계의 DNS 시스템으로, 전세계적으로 A에서 M까지 13개의 원본서버가 있으며, 복제서버를 포함해 2012년 3월 현재 283개가 있다.

올해 도입 예정인 루트서버는 L의 복제서버이며, L루트서버의 원본은 ICANN에서 운영하고 있다. 국내에는 F루트, J루트, M루트 등 3개의 복제서버가 구축되어 있다.
※ F는 KISA, J는 KT, M은 KINX에서 관리 중

KISA는 이번 유치의 후속조치를 위해 앞으로 루트서버의 이용 효율을 높일 수 있는 방안을 국내 네트워크사업자 등과 협의해 나갈 예정이다. 서종렬 KISA 원장은 “국내에 루트서버가 추가됨으로써 인터넷의 안정성이 강화되고, DNS 질의로 인한 해외 트래픽을 줄일 수 있어 국내 네트워크사업자의 국제회선 비용부담이 감소되는 경제적 효과를 가져올 것으로 기대한다”고 밝혔다.

ICANN은 전세계 도메인관리기관, 사업자, 법률전문가 및 정부대표 등이 참여하는 국제 도메인주소기구로, 이번 제43차 ICANN 회의에서는 신규 일반 최상위도메인(gTLD) 도입 및 인터넷 거버넌스, DNS 안정성 강화 등 인터넷주소에 관한 다양한 이슈가 논의되고 있다.
* <참고> ICANN [Internet Corporation for Assigned Names and Numbers] 

□ 개 요
o '98년, 도메인네임 및 IP주소 등 글로벌 인터넷주소자원 관리를 목적으로 미국 상무성 주도로 설립한 비영리 민간법인 (※ 5개 대륙별로 돌아가며 연 3회 정례회의 개최)
o '09년, ICANN은 기존 계약에 따른 미국정부의 독점 관리체제를 탈피하여, 다수의 이해관계자가 참여하는 국제적인 관리체제로 전환

□ 주요 업무
o 도메인이름시스템(DNS, Domain Name System) 루트서버 관리
o 최상위도메인(.kr, .한국, .com, .net 등) 생성 및 관리기관 위임 
o 대륙별인터넷등록기구(RIR, Regional Internet Registry)에 IP주소 및 AS번호 할당 
o DNS 루트서버, 도메인 및 IP주소 관련 정책개발

Posted by [czar]
,

렌지 후드

카테고리 없음 2014. 6. 16. 14:31




Posted by [czar]
,

load data local INFILE 'C:\\Users\\TEST\\Desktop\\zipcode_20130201(0).txt' into table zipcode;

Posted by [czar]
,

led 불량

카테고리 없음 2014. 5. 29. 21:14
Led 불량

Posted by [czar]
,

How to get Random CAPTCHA images dynamically.


Html Page:(captcha.jsp)
<img src="/registerCaptcha" width="72" height="26" alt="captcha" class="captcha-border" />

Struts-config.xml
        <action path="/registerCaptcha" type="com.captcha.RegisterCaptchaAction">
            <forward name="shRegisterCaptcha" path="/jsp/common/captcha.jsp"/>
        </action>
Struts Action Class
package com.captcha;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class RegisterCaptchaAction extends org.apache.struts.action.Action {

    Log log = LogFactory.getLog(RegisterCaptchaAction.class);
  
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        response.setDateHeader("Max-Age", 0);
        response.setContentType("image/jpg");

        BufferedImage bufferedImage = null;
        Graphics2D g = null;

        try {

            Color textColor = Color.decode("#2e2e2e");

            Font textFont = new Font("arial Tahoma Sans-serif", Font.BOLD, 22);
            int charsToPrint = 5;
            int width = request.getParameter("width") != null ? Integer.parseInt(request.getParameter("width")) : 150;
            int height = request.getParameter("height") != null ? Integer.parseInt(request.getParameter("height")) : 35;

            float horizMargin = 12.0f;
            float imageQuality = 1.0f; // max is 1.0 (this is for jpeg)
            double rotationRange = 0.1; // this is radians
            bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

            g = (Graphics2D) bufferedImage.getGraphics();
//Draw an oval
            //g.setColor(Color.decode("#ECEAEA"));
            g.fillRect(0, 0, width, height);


            g.setColor(textColor);
            g.setFont(textFont);

            FontMetrics fontMetrics = g.getFontMetrics();
            int maxAdvance = fontMetrics.getMaxAdvance();
            int fontHeight = fontMetrics.getHeight();

// i removed 1 and l and i because there are confusing to users...
// Z, z, and N also get confusing when rotated
// 0, O, and o are also confusing...
// lowercase G looks a lot like a 9 so i killed it
// this should ideally be done for every language...
// i like controlling the characters though because it helps prevent confusion
            String elegibleChars = "ABCDEFGHJKLMPQRSTUVWXY23456789";
            //String elegibleChars = "AEFHKLPRTX12345678";
            //String elegibleChars = "0123456789";
            char[] chars = elegibleChars.toCharArray();

            float spaceForLetters = -horizMargin * 5 + width;
            float spacePerChar = spaceForLetters / (charsToPrint - 1.5f);

            AffineTransform transform = g.getTransform();

            StringBuffer finalString = new StringBuffer();


            for (int i = 0; i < charsToPrint; i++) {
                double randomValue = Math.random();
                int randomIndex = (int) Math.round(randomValue * (chars.length - 1));
                char characterToShow = chars[randomIndex];
                finalString.append(characterToShow);

// this is a separate canvas used for the character so that
// we can rotate it independently
                int charImageWidth = maxAdvance * 2;
                int charImageHeight = fontHeight * 2;
                int charWidth = fontMetrics.charWidth(characterToShow);
                int charDim = Math.max(maxAdvance, fontHeight);
                int halfCharDim = (int) (charDim / 2);

                BufferedImage charImage = null;
                Graphics2D charGraphics = null;
                try {

                    charImage = new BufferedImage(charDim, charDim, BufferedImage.TYPE_INT_ARGB);
                    charGraphics = charImage.createGraphics();
                    charGraphics.translate(halfCharDim, halfCharDim);
                    double angle = (Math.random() - 0.5) * rotationRange;
                    charGraphics.transform(AffineTransform.getRotateInstance(angle));
                    charGraphics.translate(-halfCharDim, -halfCharDim);
                    charGraphics.setColor(textColor);
                    charGraphics.setFont(textFont);


                    int charX = (int) (0.5 * charDim - 0.5 * charWidth);
                    charGraphics.drawString("" + characterToShow, charX,
                            (int) ((charDim - fontMetrics.getAscent())
                            / 2 + fontMetrics.getAscent()));

                    float x = horizMargin + spacePerChar * (i) - charDim / 4.0f;
                    int y = (int) ((height - charDim) / 2);
//System.out.println("x=" + x + " height=" + height + " charDim=" + charDim + " y=" + y + " advance=" + maxAdvance + " fontHeight=" + fontHeight + " ascent=" + fontMetrics.getAscent());
                    g.drawImage(charImage, (int) x, y, charDim, charDim, null, null);

                } finally {
                    try {
                        charGraphics.dispose();
                    } catch (Exception ex) {
                    }
                    try {
                        charImage.flush();
                    } catch (Exception ex) {
                    }
                }
            }
            log.info("captcha string : " + finalString);
//Write the image as a jpg

            Iterator iter = ImageIO.getImageWritersByFormatName("JPG");
            if (iter.hasNext()) {
                ImageWriter writer = null;
                javax.imageio.stream.ImageOutputStream imageOutputStream = null;
                javax.servlet.ServletOutputStream servletOutputStream = null;
                try {
                    writer = (ImageWriter) iter.next();
                    ImageWriteParam iwp = writer.getDefaultWriteParam();
                    iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
                    iwp.setCompressionQuality(imageQuality);
                    servletOutputStream = response.getOutputStream();
                    imageOutputStream = ImageIO.createImageOutputStream(servletOutputStream);
                    writer.setOutput(imageOutputStream);
                    IIOImage imageIO = new IIOImage(bufferedImage, null, null);
                    writer.write(null, imageIO, iwp);
                } catch (Exception ex) {
                    writer.abort();
                } finally {//modified to prevent too many open files error
                    if (writer != null) {
                        writer.dispose();
                    }
                    try {
                        imageOutputStream.close();
                    } catch (Exception ex) {
                    }
                    try {
                        servletOutputStream.close();
                    } catch (Exception ex) {
                    }


                }
            } else {
                log.error("CaptchaErr No Encoder Found For JSP");
                throw new RuntimeException("no encoder found for jsp");
            }

            //ImageIO.write(bufferedImage, "jpg", response.getOutputStream());

// let's stick the final string in the session
            request.getSession(true).setAttribute("postCouponCaptcha", finalString.toString());


        } catch (Exception ioe) {
            log.error("Captcha Error : " + ioe.getMessage());
            throw new RuntimeException("Unable to build image", ioe);
        } finally {
            try {
                g.dispose();
            } catch (Exception ex) {
            }
            try {
                bufferedImage.flush();
            } catch (Exception ex) {
            }
        }

        return mapping.findForward("shRegisterCaptcha");
    }

}


Posted by [czar]
,

CaptchaServlet

카테고리 없음 2014. 5. 29. 17:55

http://zetcode.com/tutorials/jeetutorials/captcha/






import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;

import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.*;
import javax.servlet.http.*;


public class CaptchaServlet extends HttpServlet {


  protected void processRequest(HttpServletRequest request, 
                                HttpServletResponse response) 
                 throws ServletException, IOException {

    int width = 150;
    int height = 50;

    char data[][] = {
        { 'z', 'e', 't', 'c', 'o', 'd', 'e' },
        { 'l', 'i', 'n', 'u', 'x' },
        { 'f', 'r', 'e', 'e', 'b', 's', 'd' },
        { 'u', 'b', 'u', 'n', 't', 'u' },
        { 'j', 'e', 'e' }
    };


    BufferedImage bufferedImage = new BufferedImage(width, height, 
                  BufferedImage.TYPE_INT_RGB);

    Graphics2D g2d = bufferedImage.createGraphics();

    Font font = new Font("Georgia", Font.BOLD, 18);
    g2d.setFont(font);

    RenderingHints rh = new RenderingHints(
           RenderingHints.KEY_ANTIALIASING,
           RenderingHints.VALUE_ANTIALIAS_ON);

    rh.put(RenderingHints.KEY_RENDERING, 
           RenderingHints.VALUE_RENDER_QUALITY);

    g2d.setRenderingHints(rh);

    GradientPaint gp = new GradientPaint(0, 0, 
    Color.red, 0, height/2, Color.black, true);

    g2d.setPaint(gp);
    g2d.fillRect(0, 0, width, height);

    g2d.setColor(new Color(255, 153, 0));

    Random r = new Random();
    int index = Math.abs(r.nextInt()) % 5;

    String captcha = String.copyValueOf(data[index]);
    request.getSession().setAttribute("captcha", captcha );

    int x = 0; 
    int y = 0;

    for (int i=0; i<data[index].length; i++) {
        x += 10 + (Math.abs(r.nextInt()) % 15);
        y = 20 + Math.abs(r.nextInt()) % 20;
        g2d.drawChars(data[index], i, 1, x, y);
    }

    g2d.dispose();

    response.setContentType("image/png");
    OutputStream os = response.getOutputStream();
    ImageIO.write(bufferedImage, "png", os);
    os.close();
  } 


  protected void doGet(HttpServletRequest request, 
                       HttpServletResponse response)
                           throws ServletException, IOException {
      processRequest(request, response);
  } 


  protected void doPost(HttpServletRequest request, 
                        HttpServletResponse response)
                            throws ServletException, IOException {
      processRequest(request, response);
  }
}


Posted by [czar]
,
http://arturkustra.blogspot.kr/2012/07/how-to-get-captcha-as-image-in-java.html

How to get captcha as image in Java
Google's captcha is very powerfull tool to check if "other side" is human or not. It is very popular and commonly used method, mostly on web pages. But sometimes, we want to make something more secured i.e. when you don't want to delete database tables, or maybe when your app works as thin client and you don't want to let someone to POST without, you know what.. :)
To get started we have to get:
1. Private and public keys to the service - you can register in the link above.
2. Get recaptcha bindings for Java from here.
3. Finally run he code:

ReCaptcha c = ReCaptchaFactory.
    newReCaptcha("[ your publicKey here]", "[your privateKey here]", false);
        String text = c.createRecaptchaHtml(null, null);

        try {
            URL imageURL = new URL(getTextBetween(text, "src=\"", "\"><"));
            BufferedReader in = new BufferedReader(new InputStreamReader(imageURL.openStream()));

            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                int start = inputLine.indexOf("challenge");
                if (start > 0) {
                    int end = inputLine.indexOf("',");
                    String part = inputLine.substring(start + 13, end);

                    String imageUri = "http://www.google.com/recaptcha/api/image?c=" + part;

                    URL url = new URL(imageUri);
                    Image image = ImageIO.read(url);
                    jLabel1.setIcon(new ImageIcon(image));
                    jLabel1.validate();
                }
            }
            in.close();

        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }

Of course you can use regex but this is just an example...
The helper function for finding text is:

private String getTextBetween(String text, String start, String end) {
    int startIdx = text.indexOf(start);
    int endIdx = text.indexOf(end, startIdx);

    return text.substring(startIdx + start.length(), endIdx);
}
And the result presents as follows:


Posted by [czar]
,


imgscalr-lib-4.2.jar



package kr.common.util;


import java.awt.image.BufferedImage;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.IOException;


import javax.imageio.ImageIO;


import org.imgscalr.Scalr;

import org.imgscalr.Scalr.Method;

import org.imgscalr.Scalr.Mode;


public class ThumbnailExample {


public static void main(String[] args) throws IOException {


long startTime = System.currentTimeMillis();

File f = new File("D:\\111.jpg");

BufferedImage img = ImageIO.read(f); // load image


BufferedImage thumbImg = Scalr.resize(img, Method.QUALITY, Mode.AUTOMATIC, 50, 50, Scalr.OP_ANTIALIAS);

//convert bufferedImage to outpurstream 

ByteArrayOutputStream os = new ByteArrayOutputStream();

ImageIO.write(thumbImg, "jpg", os);


//or wrtite to a file


File f2 = new File("D:\\111_thumb.jpg");


ImageIO.write(thumbImg, "jpg", f2);


System.out.println("time is : " + (System.currentTimeMillis() - startTime));


}


}




문제가 있음..




Posted by [czar]
,



mssql 날짜 관련 , 최근한달, 1년달력, 몇째주인지, 전달 마지막날, 이번달 마지막날, 다음달 마지막날


-- 최근 한달

select convert(char(10),dateadd(d,number,'2012-04-24'),120) as regdate

from master..spt_values with(nolock) 

where type = 'P' 

and convert(char(10),dateadd(d,number,'2012-04-24'),120) < DateAdd("m", 1, '2012-04-24')  


-- 달력

select convert(char(10),dateadd(d,number,'2007-01-01'),120) dt

from master..spt_values

where type = 'P' and number <= datediff(d,'2007-01-01','2008-12-31')



-- 몇째주인지

DECLARE @WKDATE AS CHAR(8) 

SET @WKDATE = CONVERT(CHAR(8) , getdate(), 112)

SELECT DATEPART(WK, @WKDATE) - DATEPART(WK, LEFT(@WKDATE, 6) + '01') + 1


----Last Day of Previous Month

SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)) LastDay_PreviousMonth

----Last Day of Current Month

SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)) LastDay_CurrentMonth

----Last Day of Next Month

SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0)) LastDay_NextMonth


--Last Day of Any Month and Year

DECLARE @dtDate DATETIME

SET @dtDate = '8/18/2007'

SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@dtDate)+1,0)) LastDay_AnyMonth



Following queries can be used to get the first/last days of a month.

To get first day of a month use:

– © 2011 – Vishal (http://SqlAndMe.com)

 

– First Day Previous/Current/Next Months

SELECT      DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0),

            'First Day of Previous Month'

UNION ALL

SELECT      DATEADD(DAY, -(DAY(DATEADD(MONTH, 1, GETDATE())) - 1),

            DATEADD(MONTH, -1, GETDATE())),

            'First Day of Previous Month (2)'

UNION ALL

SELECT      DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0),

            'First Day of Current Month'

UNION ALL

SELECT      DATEADD(DAY, -(DAY(GETDATE()) - 1), GETDATE()),

            'First Day of Current Month (2)'

UNION ALL

SELECT      DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0),

            'First Day of Next Month'

UNION ALL

SELECT      DATEADD(DAY, -(DAY(DATEADD(MONTH, 1, GETDATE())) - 1),

            DATEADD(MONTH, 1, GETDATE())),

            'First Day of Next Month (2)'

Result Set:

                       

———————– ——————————-

2011-04-01 00:00:00.000 First Day of Previous Month

2011-04-01 15:47:36.660 First Day of Previous Month (2)

2011-05-01 00:00:00.000 First Day of Current Month

2011-05-01 15:47:36.660 First Day of Current Month (2)

2011-06-01 00:00:00.000 First Day of Next Month

2011-06-01 15:47:36.660 First Day of Next Month (2)

 

(6 row(s) affected)

The above queries can be generalized as below:

DECLARE @DURATION INT = 2

SELECT      DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + @DURATION, 0)

            AS '+2 Months'

 

SET @DURATION = -2

SELECT      DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + @DURATION, 0)

            AS '-2 Months'

Result Set:

+2 Months

———————–

2011-07-01 00:00:00.000

 

(1 row(s) affected)

 

-2 Months

———————–

2011-03-01 00:00:00.000

 

(1 row(s) affected)

And, to get last day of a month use:

– © 2011 – Vishal (http://SqlAndMe.com)

 

– Last Day Previous/Current/Next Months

SELECT      DATEADD(DAY, -(DAY(GETDATE())), GETDATE()),

            'Last Day of Previous Month'

UNION ALL

SELECT      DATEADD(MILLISECOND, -3,

            DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)),

            'Last Day of Previous Month (2)'

UNION ALL

SELECT      DATEADD(DAY, -(DAY(DATEADD(MONTH, 1, GETDATE()))),

            DATEADD(MONTH, 1, GETDATE())),

            'Last Day of Current Month'

UNION ALL

SELECT      DATEADD(MILLISECOND, -3,

            DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0)),

            'Last Day of Current Month (2)'

UNION ALL

SELECT      DATEADD(DAY, -(DAY(DATEADD(MONTH,0,GETDATE()))),

            DATEADD(MONTH, 2, GETDATE())),

            'Last Day of Next Month'

UNION ALL

SELECT      DATEADD(SECOND, -1,

            DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 2, 0)),

            'Last Day of Next Month (2)'

Result Set:

                       

———————– ——————————

2011-04-30 15:54:35.523 Last Day of Previous Month

2011-04-30 23:59:59.997 Last Day of Previous Month (2)

2011-05-31 15:54:35.523 Last Day of Current Month

2011-05-31 23:59:59.997 Last Day of Current Month (2)

2011-06-30 15:54:35.523 Last Day of Next Month

2011-06-30 23:59:59.000 Last Day of Next Month (2)

 

(6 row(s) affected)

The above queries can be generalized as below:

DECLARE @DURATION INT = 2

SELECT   DATEADD(MILLISECOND, -3,

         DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + @DURATION + 1, 0))

         AS '+2 Months'

 

SET @DURATION = -2

SELECT   DATEADD(MILLISECOND, -3,

         DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + @DURATION + 1, 0))

         AS '-2 Months'

Result Set:

+2 Months

———————–

2011-07-31 23:59:59.997

 

(1 row(s) affected)

 

-2 Months

———————–

2011-03-31 23:59:59.997

 

(1 row(s) affected)

Hope This Helps!

Vishal










DECLARE @mydate DATETIME
SELECT @mydate GETDATE()
SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@mydate)),@mydate),101) ,
'Last Day of Previous Month'
UNION
SELECT 
CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@mydate)-1),@mydate),101AS Date_Value,
'First Day of Current Month' AS Date_Type
UNION
SELECT 
CONVERT(VARCHAR(25),@mydate,101AS Date_Value,'Today' AS Date_Type
UNION
SELECT 
CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@mydate))),DATEADD(mm,1,@mydate)),101) ,
'Last Day of Current Month'
UNION
SELECT 
CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@mydate))-1),DATEADD(mm,1,@mydate)),101) ,
'First Day of Next Month'
GO

Posted by [czar]
,