$lang['tuto'] = "ట్యుటోరియల్స్"; ?> CORS పరిమితులు

CORS పరిమితులు ఉన్నప్పటికీ iFrame కంటెంట్‌ని యాక్సెస్ చేయడానికి జావాస్క్రిప్ట్ మరియు j క్వెరీని ఎలా ఉపయోగించాలి

Temp mail SuperHeros
CORS పరిమితులు ఉన్నప్పటికీ iFrame కంటెంట్‌ని యాక్సెస్ చేయడానికి జావాస్క్రిప్ట్ మరియు j క్వెరీని ఎలా ఉపయోగించాలి
CORS పరిమితులు ఉన్నప్పటికీ iFrame కంటెంట్‌ని యాక్సెస్ చేయడానికి జావాస్క్రిప్ట్ మరియు j క్వెరీని ఎలా ఉపయోగించాలి

క్రాస్-డొమైన్ iFrame కంటెంట్‌ని యాక్సెస్ చేయడంలో సవాళ్లు

మీరు ఎప్పుడైనా ఒక పొందుపరిచి ఉంటే iframe మరొక డొమైన్ నుండి కంటెంట్‌ని ప్రదర్శించడానికి మీ వెబ్‌సైట్‌లో, JavaScriptని ఉపయోగించి ఆ కంటెంట్‌తో పరస్పర చర్య చేయడానికి ప్రయత్నిస్తున్నప్పుడు మీరు సమస్యలను ఎదుర్కొని ఉండవచ్చు. ఒకే ఆరిజిన్ పాలసీ (SOP) మరియు క్రాస్-ఆరిజిన్ రిసోర్స్ షేరింగ్ (CORS) అనేవి వేరే డొమైన్ నుండి కంటెంట్‌కి ప్రత్యక్ష ప్రాప్యతను నిరోధించే భద్రతా లక్షణాలు.

ఈ దృష్టాంతంలో, మీ వెబ్‌సైట్, abc.com, లోడ్ అవుతుందని చెప్పండి iframe hello.com నుండి. మీ లక్ష్యం సంగ్రహించడం iframe యొక్క కంటెంట్ జావాస్క్రిప్ట్ ఉపయోగించి. అయితే, ఎందుకంటే CORS విధానం క్రాస్-డొమైన్ వనరులకు ప్రాప్యతను నియంత్రిస్తుంది, ఇది iframe యొక్క కంటెంట్‌ను ప్రోగ్రామాటిక్‌గా మార్చడానికి ప్రయత్నించినప్పుడు ఇబ్బందులకు దారి తీస్తుంది.

ఈ పరిమితులను దాటవేయడం లేదా కనీసం క్యాప్చర్ చేయడం సాధ్యమేనా అనేది ఒక సాధారణ ప్రశ్న దృశ్య స్నాప్‌షాట్ iframe యొక్క. CORS విధానాలు iframe యొక్క DOMని యాక్సెస్ చేయకుండా లేదా మానిప్యులేట్ చేయకుండా మిమ్మల్ని నిరోధించినప్పటికీ, నిర్దిష్ట వినియోగ సందర్భాన్ని బట్టి మీరు అన్వేషించగల సృజనాత్మక పరిష్కారాలు ఉన్నాయి.

ఈ కథనంలో, ఉపయోగించి మీ లక్ష్యాన్ని సాధించడం సాధ్యమేనా అని మేము విశ్లేషిస్తాము j క్వెరీ లేదా జావాస్క్రిప్ట్, మరియు క్రాస్-ఆరిజిన్ పరిమితులతో వ్యవహరించేటప్పుడు కూడా iframe కంటెంట్ యొక్క స్క్రీన్‌షాట్ సాధ్యమేనా.

ఆదేశం ఉపయోగం యొక్క ఉదాహరణ
contentWindow iframe యొక్క విండో ఆబ్జెక్ట్‌ని యాక్సెస్ చేయడానికి ఉపయోగించబడుతుంది. iframe డాక్యుమెంట్‌తో పరస్పర చర్య చేయడానికి ప్రయత్నించడం అవసరం. ఉదాహరణ: iframe.contentWindow.document
html2canvas() ఈ ఆదేశం వెబ్‌పేజీ యొక్క కంటెంట్ నుండి కాన్వాస్ మూలకాన్ని ఉత్పత్తి చేస్తుంది, నిర్దిష్ట DOM మూలకం యొక్క రూపాన్ని సంగ్రహిస్తుంది. iframe కంటెంట్ స్క్రీన్‌షాట్‌లను తీయడానికి ఇది ఉపయోగపడుతుంది. ఉదాహరణ: html2canvas(iframeDocument.body)
catch() In Promise-based handling, catch() captures any errors that occur during asynchronous operations, such as fetching iframe content. It ensures graceful failure. Example: .catch(error =>ప్రామిస్-ఆధారిత హ్యాండ్లింగ్‌లో, iframe కంటెంట్‌ని పొందడం వంటి అసమకాలిక కార్యకలాపాల సమయంలో సంభవించే ఏవైనా లోపాలను క్యాచ్() క్యాప్చర్ చేస్తుంది. ఇది మనోహరమైన వైఫల్యాన్ని నిర్ధారిస్తుంది. ఉదాహరణ: .catch(error => { ... })
axios.get() GET అభ్యర్థన చేయడానికి బ్యాకెండ్ Node.jsలో HTTP అభ్యర్థన పద్ధతి ఉపయోగించబడుతుంది. ఈ సందర్భంలో, ఇది ప్రాక్సీ ద్వారా CORS పరిమితులను దాటవేస్తూ బాహ్య సైట్ యొక్క కంటెంట్‌ను పొందుతుంది. ఉదాహరణ: axios.get('https://hello.com')
res.send() ఈ ఆదేశం Node.js బ్యాకెండ్ నుండి క్లయింట్‌కు ప్రతిస్పందనను తిరిగి పంపుతుంది. ఇది బాహ్య iframe కంటెంట్‌ను తిరిగి ఫ్రంటెండ్‌కు ఫార్వార్డ్ చేస్తుంది. ఉదాహరణ: res.send(response.data)
onload iframe లోడ్ అవుతున్నప్పుడు ఈవెంట్ లిజనర్ ట్రిగ్గర్ చేయబడింది. iframe కంటెంట్‌ని క్యాప్చర్ చేయడానికి ప్రయత్నించడం వంటి చర్యలను ప్రారంభించడానికి ఇది ఉపయోగించబడుతుంది. ఉదాహరణ: iframe.onload = ఫంక్షన్() {...}
document.body.innerHTML iframe పత్రం యొక్క మొత్తం అంతర్గత HTMLని తిరిగి పొందడానికి ప్రయత్నాలు. ఇది క్రాస్-ఆరిజిన్ ఐఫ్‌రేమ్‌లలో CORS లోపాన్ని ప్రేరేపిస్తుంది, అయితే ఇది అదే మూలం పరిస్థితులలో పని చేస్తుంది. ఉదాహరణ: iframe.contentWindow.document.body.innerHTML
app.listen() Starts a Node.js Express server and listens on a specified port. It's essential for running the backend proxy to fetch the iframe content. Example: app.listen(3000, () =>Node.js ఎక్స్‌ప్రెస్ సర్వర్‌ను ప్రారంభిస్తుంది మరియు పేర్కొన్న పోర్ట్‌లో వింటుంది. iframe కంటెంట్‌ని పొందేందుకు బ్యాకెండ్ ప్రాక్సీని అమలు చేయడానికి ఇది చాలా అవసరం. ఉదాహరణ: app.listen(3000, () => {...})

iFrame కంటెంట్‌ని యాక్సెస్ చేయడంలో జావాస్క్రిప్ట్ పాత్రను అర్థం చేసుకోవడం

మునుపటి ఉదాహరణలో అందించిన మొదటి స్క్రిప్ట్ క్రాస్-ఆరిజిన్ యొక్క కంటెంట్‌ను ఎలా యాక్సెస్ చేసే ప్రయత్నాన్ని ప్రదర్శిస్తుంది iframe a లో JavaScript ఫలితాలను ఉపయోగించడం CORS (క్రాస్-ఆరిజిన్ రిసోర్స్ షేరింగ్) లోపం. దీనికి కారణం సేమ్-ఆరిజిన్ పాలసీ (SOP), ఇది ఒక మూలం నుండి వనరులను మరొక మూలం ఎలా యాక్సెస్ చేయవచ్చో నియంత్రించే భద్రతా యంత్రాంగం. ఆదేశం కంటెంట్ విండో iframe యొక్క విండో ఆబ్జెక్ట్‌ను యాక్సెస్ చేయడానికి కీలకమైనది, దాని డాక్యుమెంట్ కంటెంట్‌ను తిరిగి పొందేందుకు ప్రయత్నించడానికి మమ్మల్ని అనుమతిస్తుంది. అయితే, SOP నిబంధనల కారణంగా వేరే డొమైన్ నుండి iframe లోడ్ అయినప్పుడు బ్రౌజర్ ద్వారా ఈ యాక్సెస్ బ్లాక్ చేయబడుతుంది.

రెండవ స్క్రిప్ట్ వేరొక సవాలును పరిష్కరిస్తుంది: iframe కంటెంట్ యొక్క స్క్రీన్‌షాట్‌ను సంగ్రహించడం. ఇది HTML2Canvas లైబ్రరీని ఉపయోగిస్తుంది, ఇది ఒక మూలకం యొక్క కంటెంట్‌ను కాన్వాస్‌గా అందించడానికి ఒక అద్భుతమైన సాధనం. అయితే, iframe కంటెంట్ ఒకే మూలానికి చెందినదైతే మాత్రమే ఈ పరిష్కారం పని చేస్తుంది, ఎందుకంటే క్రాస్-ఆరిజిన్ iframes ఇప్పటికీ CORS పాలసీ లోపాన్ని ప్రేరేపిస్తుంది. ఐఫ్రేమ్ ద్వారా లోడ్ అవ్వడం పూర్తయ్యే వరకు స్క్రిప్ట్ వేచి ఉంది ఆన్‌లోడ్ ఈవెంట్, ఆపై దాని కంటెంట్‌ను కాన్వాస్‌గా క్యాప్చర్ చేయడానికి ప్రయత్నిస్తుంది. iframe కంటెంట్‌ని నేరుగా యాక్సెస్ చేయడం లేదా మార్చడం కాకుండా దృశ్యమానం చేయాల్సిన అవసరం వచ్చినప్పుడు ఈ పద్ధతి సహాయపడుతుంది.

మూడవ స్క్రిప్ట్ CORS సమస్య చుట్టూ పని చేయడానికి Node.js మరియు Expressని ఉపయోగించి బ్యాకెండ్ సొల్యూషన్‌ను పరిచయం చేస్తుంది. ఇది hello.com నుండి iframe కంటెంట్‌ను పొందే ప్రాక్సీ సర్వర్‌ని సెటప్ చేస్తుంది మరియు దానిని క్లయింట్‌కు తిరిగి పంపుతుంది. ఇది బ్యాకెండ్ నుండి సర్వర్-టు-సర్వర్ అభ్యర్థనను చేయడం ద్వారా CORS పరిమితులను దాటవేస్తుంది, ఇక్కడ CORS నియమాలు తరచుగా మరింత సరళంగా ఉంటాయి. ఆదేశం axios.get() hello.comకు HTTP అభ్యర్థనను చేయడానికి ఉపయోగించబడుతుంది మరియు ఫలితం ఉపయోగించి క్లయింట్‌కు ఫార్వార్డ్ చేయబడుతుంది res.send(). మీరు క్రాస్-డొమైన్ iframe కంటెంట్‌ని యాక్సెస్ చేయవలసి వచ్చినప్పుడు ఇది మరింత సురక్షితమైన మరియు ఆచరణాత్మక విధానం.

ఈ స్క్రిప్ట్‌లన్నీ iframe కంటెంట్‌ను సంగ్రహించడానికి లేదా దృశ్యమానం చేయడానికి సాధ్యమయ్యే మార్గాలను అన్వేషించడం లక్ష్యంగా పెట్టుకున్నాయి, కానీ అవి కట్టుబడి ఉండటం యొక్క ప్రాముఖ్యతను కూడా నొక్కిచెబుతున్నాయి. భద్రతా విధానాలు CORS వంటిది. JavaScript మాత్రమే ఈ పరిమితులను సులభంగా దాటలేనప్పటికీ, Node.js ప్రాక్సీతో చూపిన విధంగా ఫ్రంటెండ్ మరియు బ్యాకెండ్ సొల్యూషన్‌లను కలపడం బలమైన ప్రత్యామ్నాయాన్ని అందిస్తుంది. ఇంకా, తో ఎర్రర్ హ్యాండ్లింగ్ వంటి పద్ధతులు క్యాచ్ () ఈ టాస్క్‌ల అమలు సమయంలో తలెత్తే ఏవైనా సమస్యలు సునాయాసంగా నిర్వహించబడుతున్నాయని నిర్ధారించుకోండి, పరిష్కారం యొక్క మొత్తం స్థిరత్వం మరియు వినియోగదారు అనుభవాన్ని మెరుగుపరుస్తుంది.

జావాస్క్రిప్ట్ ఉపయోగించి క్రాస్-డొమైన్ iFrame కంటెంట్‌ను సంగ్రహించడం - CORS పరిగణనలతో అప్రోచ్

ఈ విధానం ఫ్రంట్-ఎండ్ జావాస్క్రిప్ట్‌ని ఉపయోగించి, iframe నుండి కంటెంట్‌ను సంగ్రహించే ప్రయత్నంపై దృష్టి పెడుతుంది. ఇది CORS ప్రారంభించబడినప్పుడు క్రాస్-ఆరిజిన్ కంటెంట్‌ను యాక్సెస్ చేయడంలో సమస్యను ప్రదర్శిస్తుంది.

// JavaScript example attempting to access iframe content
// Warning: This will trigger a CORS-related security error
const iframe = document.getElementById('myIframe');
try {
    const iframeContent = iframe.contentWindow.document.body.innerHTML;
    console.log(iframeContent);
} catch (error) {
    console.error('CORS restriction prevents access:', error);
}
// Outcome: CORS error prevents access to iframe content

HTML2Canvasని ఉపయోగించి iFrame కంటెంట్ యొక్క స్క్రీన్‌షాట్ తీయడం

ఈ పద్ధతి HTML2Canvas లైబ్రరీని ఉపయోగించి iframe కంటెంట్ యొక్క స్క్రీన్‌షాట్‌ను ఎలా క్యాప్చర్ చేయాలో చూపుతుంది, కానీ అదే మూలం ఉన్న iframes కోసం మాత్రమే.

// Import HTML2Canvas and try capturing a screenshot of the iframe content
const iframe = document.getElementById('myIframe');
iframe.onload = () => {
    const iframeDocument = iframe.contentWindow.document;
    html2canvas(iframeDocument.body).then(canvas => {
        document.body.appendChild(canvas);
    }).catch(error => {
        console.error('Unable to capture screenshot:', error);
    });
};

CORS పరిమితులను దాటవేయడానికి ప్రాక్సీతో బ్యాకెండ్ సొల్యూషన్

ఐఫ్రేమ్ కంటెంట్‌ను పొందేందుకు మరియు క్లయింట్ మరియు బాహ్య మూలం మధ్య మధ్యవర్తిగా వ్యవహరించడం ద్వారా CORS పరిమితులను దాటవేయడానికి బ్యాకెండ్ Node.js ప్రాక్సీ సర్వర్ అమలు చేయబడింది.

// Node.js server using Express to create a proxy for bypassing CORS
const express = require('express');
const axios = require('axios');
const app = express();
app.get('/fetch-iframe', async (req, res) => {
    try {
        const response = await axios.get('https://hello.com');
        res.send(response.data);
    } catch (error) {
        res.status(500).send('Error fetching iframe content');
    }
});
app.listen(3000, () => console.log('Server running on port 3000'));

CORS పరిమితులు మరియు ప్రత్యామ్నాయ పరిష్కారాలను అన్వేషించడం

తో పని చేస్తున్నప్పుడు iframes JavaScriptలో, డెవలపర్లు ఎదుర్కొంటున్న అతిపెద్ద సవాళ్లలో ఒకటి క్రాస్-ఆరిజిన్ అభ్యర్థనలను నిర్వహించడం. అనుమతి లేకుండా ఇతర డొమైన్‌లలోని డేటాను యాక్సెస్ చేయకుండా హానికరమైన సైట్‌లను నిరోధించడం ద్వారా వినియోగదారులను రక్షించడానికి CORS విధానం రూపొందించబడింది. మీ వెబ్‌సైట్ abc.com hello.com నుండి iframeని లోడ్ చేసినట్లయితే, JavaScriptతో iframe యొక్క కంటెంట్‌ను యాక్సెస్ చేయడానికి లేదా మార్చడానికి ఏవైనా ప్రత్యక్ష ప్రయత్నాలను బ్రౌజర్ బ్లాక్ చేస్తుంది. అయినప్పటికీ, స్క్రీన్‌షాట్‌లను క్యాప్చర్ చేయడం లేదా కంటెంట్‌ని పొందేందుకు సర్వర్-సైడ్ ప్రాక్సీలను ఉపయోగించడం వంటి సారూప్య లక్ష్యాలను సాధించడానికి ప్రత్యామ్నాయ విధానాలు ఉన్నాయి.

iframe కంటెంట్‌ని నేరుగా యాక్సెస్ చేయడానికి ఒక ముఖ్యమైన ప్రత్యామ్నాయం postMessageని ఉపయోగించడం, ఇది ప్రధాన పేజీ మరియు iframe మధ్య సురక్షితమైన క్రాస్-ఆరిజిన్ కమ్యూనికేషన్‌ను అనుమతించే పద్ధతి. ఉపయోగించి సందేశాలను పంపే iframe లోపల స్క్రిప్ట్‌ను పొందుపరచడం ద్వారా window.postMessage, మీరు నిర్దిష్ట డేటాను తిరిగి పేరెంట్ విండోకు పంపమని iframeని అభ్యర్థించవచ్చు. డొమైన్‌ల మధ్య పరిమిత పరస్పర చర్యను అనుమతించేటప్పుడు ఈ పద్ధతి భద్రతను నిర్వహిస్తుంది. అయితే, దీనికి iframe యొక్క మూలం నుండి సహకారం అవసరం, ఇది మూడవ పక్షం పరిస్థితులలో ఎల్లప్పుడూ సాధ్యం కాకపోవచ్చు.

మరొక ఆసక్తికరమైన విధానం బ్రౌజర్ పొడిగింపులు లేదా సర్వర్ వైపు పరిష్కారాలను ఉపయోగించడం. బ్రౌజర్ పొడిగింపులు, ఉదాహరణకు, క్రాస్-ఆరిజిన్ వనరులకు మరింత సరళమైన ప్రాప్యతను కలిగి ఉంటాయి మరియు కొన్నిసార్లు వినియోగదారు సమ్మతిస్తే CORS పరిమితులను దాటవేయడానికి ఉపయోగించవచ్చు. బ్యాకెండ్‌లో, ఐఫ్రేమ్ కంటెంట్‌ని పొందేందుకు, ప్రాసెస్ చేయడానికి మరియు క్లయింట్‌కు తిరిగి పంపడానికి ప్రాక్సీ వలె సర్వర్-సైడ్ రెండరింగ్ సాధనాలను ఉపయోగించుకోవచ్చు. ఈ పరిష్కారాలు బ్రౌజర్‌లు అమలు చేసే భద్రతా ప్రోటోకాల్‌లను గౌరవిస్తూ CORS పరిమితులను అధిగమించడానికి అవసరమైన సృజనాత్మకతను హైలైట్ చేస్తాయి.

iFrame కంటెంట్ మరియు CORSని యాక్సెస్ చేయడంపై సాధారణ ప్రశ్నలు

  1. నేను క్రాస్-ఆరిజిన్ iframe కంటెంట్‌తో ఎలా పరస్పర చర్య చేయగలను?
  2. మీరు ఉపయోగించవచ్చు window.postMessage మీ పేజీ మరియు iframe మధ్య డేటాను పంపడానికి మరియు స్వీకరించడానికి, అయితే iframe యొక్క మూలం ఈ లక్షణాన్ని అమలు చేసినట్లయితే మాత్రమే.
  3. iframe కంటెంట్‌ని నేరుగా యాక్సెస్ చేయడానికి నేను CORSని దాటవేయవచ్చా?
  4. లేదు, CORS అనేది అనధికార ప్రాప్యతను నిరోధించడానికి రూపొందించబడిన భద్రతా లక్షణం. సురక్షితమైన కమ్యూనికేషన్ కోసం మీరు ప్రాక్సీలు లేదా పోస్ట్‌మెసేజ్ వంటి ప్రత్యామ్నాయాలను ఉపయోగించాలి.
  5. మరొక డొమైన్ నుండి iframe స్క్రీన్‌షాట్ తీయడానికి మార్గం ఉందా?
  6. మీరు వంటి లైబ్రరీలను ఉపయోగించవచ్చు html2canvas, అయితే iframe అదే డొమైన్ నుండి ఉంటే మాత్రమే. క్రాస్-ఆరిజిన్ ఐఫ్‌రేమ్‌లు భద్రతా లోపాలను ప్రేరేపిస్తాయి.
  7. CORS సమస్యలను నిర్వహించడానికి ఉత్తమ మార్గం ఏమిటి?
  8. ఒక వంటి సర్వర్ సైడ్ సొల్యూషన్స్ ఉపయోగించడం ఉత్తమ విధానం Node.js proxy iframe కంటెంట్‌ని పొందేందుకు మరియు దానిని మీ క్లయింట్ వైపు కోడ్‌కి తిరిగి పంపడానికి.
  9. నేను CORSని దాటవేయడానికి బ్రౌజర్ పొడిగింపులను ఉపయోగించవచ్చా?
  10. అవును, బ్రౌజర్ పొడిగింపులు కొన్నిసార్లు క్రాస్-ఆరిజిన్ వనరులను యాక్సెస్ చేయగలవు, కానీ అవి పని చేయడానికి స్పష్టమైన వినియోగదారు సమ్మతి అవసరం.

iFrame కంటెంట్‌ని యాక్సెస్ చేయడంపై తుది ఆలోచనలు

వేరే డొమైన్ నుండి iframe కంటెంట్ లోడ్ చేయబడిన దృశ్యాలలో, CORS మరియు అదే-మూలం విధానం కారణంగా JavaScriptను ఉపయోగించే ప్రత్యక్ష యాక్సెస్ పరిమితం చేయబడింది. అనధికారిక యాక్సెస్ నుండి సున్నితమైన డేటాను రక్షించడానికి ఈ భద్రతా చర్యలు అమలులో ఉన్నాయి.

ఫ్రంటెండ్‌లో ఈ పరిమితులను దాటవేయడం సాధ్యం కానప్పటికీ, సర్వర్-సైడ్ ప్రాక్సీలు లేదా పోస్ట్‌మెసేజ్ ద్వారా కమ్యూనికేషన్ వంటి ప్రత్యామ్నాయ విధానాలు సహాయపడతాయి. సృజనాత్మక పరిష్కారాలను కనుగొనడంలో భద్రతా ప్రోటోకాల్‌లను అర్థం చేసుకోవడం మరియు గౌరవించడం అనేది క్రాస్-ఆరిజిన్ ఐఫ్‌రేమ్‌లతో సమర్థవంతంగా పనిచేయడానికి కీలకం.

iFrame కంటెంట్‌ని యాక్సెస్ చేయడానికి వనరులు మరియు సూచనలు
  1. ఈ కథనం క్రాస్-ఆరిజిన్ రిసోర్స్ షేరింగ్ (CORS) మరియు iframe విధానాలపై మొజిల్లా యొక్క సమగ్ర డాక్యుమెంటేషన్ నుండి సమాచారాన్ని పొందుతుంది. వద్ద మరింత తెలుసుకోండి మొజిల్లా డెవలపర్ నెట్‌వర్క్ (MDN) .
  2. క్రాస్-ఆరిజిన్ కమ్యూనికేషన్ కోసం పోస్ట్‌మెసేజ్ APIని ఉపయోగించడంపై అదనపు అంతర్దృష్టులు W3C ప్రమాణాలపై ఆధారపడి ఉంటాయి. వద్ద వివరాలను అన్వేషించండి W3C వెబ్ మెసేజింగ్ .
  3. CORS పరిమితులను దాటవేయడానికి Node.jsలో ప్రాక్సీ సర్వర్‌ని సెటప్ చేయడానికి మార్గదర్శకాలు అధికారిక Node.js డాక్యుమెంటేషన్ నుండి సూచించబడ్డాయి. వద్ద మరింత చూడండి Node.js డాక్యుమెంటేషన్ .
  4. iframe కంటెంట్ స్క్రీన్‌షాట్‌లను క్యాప్చర్ చేయడానికి HTML2Canvasని అమలు చేయడానికి, ప్రాజెక్ట్ పేజీని సందర్శించండి HTML2కాన్వాస్ .