ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

برای صفحات وب Preload

mohsen_mahyar@yahoo.com

 

برای صفحات وب   Preload

◊ مقدمه ◊

طراحی سنگین در بعضی از صفحات باعث زیاد شدن حجم آن صفحات میشود . حجم زیاد صفحات مخصوصا

برای ما ایرانیان یک مشکل همیشگی و سدی برای طراحان بوده و خواهد بود ! همین موضوع باعث خستگی و

دلسرد شدن کاربر و بازدید کننده از صفحات میش ود و باعث میشود بازدید کنندگان سایت روز به روز کمتر شوند .

اما باید برای این کار چار ه ای اندیشید . معقولانه ترین راه طراحی منطقی و کم حجم در عین حال زیبا و کاربر

پسند است . اما گاهی اوقات نمیتوان به هر دلیلی صفحات را در حجم کم طراحی نمود مخصوصا صفحاتی که

دارای عکسهای زیادی هستند . پس برای مشکل دوم هم باید یک راهی را در نظر گرفت تا بتوان طراحی خوبی

ارائه داد . در این آموزش شما یاد خواهید گرفت که با یک سری دستورات جاوا اسکریپت چگونه برای صفحه

خود Preloader قرار دهی د . اینکار سبب میشود که کاربر کمی آرامتر شده و تحمل آن هم برای دیدن

صفحات بیشتر خواهد شد. این کار را میتوانید در تمام سایتها و یا وبلاگها عملی کنید.

◊ آموزش ◊

برای شروع کار ابتدا کد جاوا اسکریپت زیر را در تگ < head > صفحه مورد نظرخود قرار دهید.

<SCRIPT>

var DHTML = (document.getElementById || document.all || document.layers);

function ap_getObj(name)

{

if (document.getElementById)

{

return document.getElementById(name).style;

}

else if (document.all)

{

return document.all[name].style;

}

else if (document.layers)

{

return document.layers[name];

}

}

function ap_showWaitMessage(div,flag)

{

if (!DHTML) return;

var x = ap_getObj(div);

x.visibility = (flag) ? 'visible':'hidden'

if(! document.getElementById)

if(document.layers)

x.left=280/2;

return true;

}

</SCRIPT>

و سپس کد زیر را بعد از < > قرار دهید: body

<DIV id=waitDiv style="LEFT: 40%; VISIBILITY: hidden; POSITION: absolute; TOP: 50%; TEXT-ALIGN:center">

mohsen_mahyar@yahoo.com

<TABLE cellPadding=6 border=0>

<TBODY>

<TR>

<TD align=middle>

<IMG alt="Please wait" src="loading.gif">

</TD>

</TR>

</TBODY>

</TABLE>

</DIV>

<SCRIPT>

ap_showWaitMessage('waitDiv', 1);

</SCRIPT>

در کدی که بالا ذکر شد شما میتوانید طراحی مورد نظر خود را داخل تگ < DIV > قرار دهید . توجه داشته

باشید تگ < > حتما باید وجود داشته باشد ولی محتوای درون آن (در این کد مثلا < TableDIV > ) میتواند

با توجه به نیاز شما تغییر کند.

سپس کد زیر را دقیقا بالای (قبل از ) </ body > قرار دهی د . (این تگ در یک خط مانده به آخرین خط صفحه

شما قرار دارد)

<SCRIPT>

2

ap_showWaitMessage('waitDiv', 0);

</SCRIPT>

حالا دیگر کدهای نوشته شده توسط شما کار خواهد کرد . کافی است صفحه مورد نظر را درون سایت خود قرار

دهید و سپس آنرا مشاهده نماید .

توجه داشته باشید این بر حسب شدن صفحه شما میباشد. loadpreload

3

mohsen_mahyar@yahoo.com

   + MOHSEN GHASEMI - ٢:٥٩ ‎ب.ظ ; ۱۳۸٩/۳/۳۱

ارائه اطلاع رسانی در پایگاه RSS

mohsen_mahyar@yahoo.com

ارائه  اطلاع رسانی در پایگاه  RSS

اخبار پایگاه خود را در اختیارسایرین ( RSS در این قسمت شما به عنوان مدیر یک پایگاه اطلاع رسانی هستید که می خواهد بخش

قرار دهد . پیش از شروع ،لازم است که ) (News aggregator) دیگر پایگاههای اطلاع رسانی و یا خوانندگان خبر از طریق برنامه گردآور خبر

را که می خواهید تغییرات آن را نمایش (Data base) 2,0 را مطالعه نماید.حال جدولی از پایگاه داده RSS و xml قوانین پایه ای مربوط به

استفاده می کنیم که شامل فیلدهای زیر است : NEWS_ دهید انتخاب نمایید برای مثال ما در اینجا از جدولی به نام

ID

TITLE

LEAD

IMAGE_PATH

DATE

جدول بالا را تولید نماید . RSS برنامه ای خواهیم نوشت تا فایل NET. در بخش بعدی با استفاده از

Feed برای ایجاد Net. • نوشتن برنامه ای با استفاده از

استفاده شود . ) RSS است که از پایگاه داده خود می سازید تا از آن برای ارائه xml یک فایل Feed )

های مورد استفاده NameSpace

نیز احتیاج Encoding خواهیم داشت و چون به کلاس System.Xml احتیاج به xml مشخص است که برای کار با داده های

استفاده کنیم . System.Text مربوط به آن NameSpace داریم باید از

توضیح : نکات تکمیلی در مورد هر کد در برابر آن ارائه شده است .

using System;

using System.Configuration;

using System.Data;

using System.Data.SqlClient;

using System.Text;

using System.Web;

using System.Xml;

لازم داریم Page_load آنچه در

xml 1. ایجاد و یا به روز رسانی فایل

2. اتصال به پایگاه داده برای خواندن اطلاعات مورد نظر

3. بستن تگها و اتمام کار بر روی فایل

xml -1 ایجاد و یا به روز رسانی فایل

XmlTextWriter xmlWriter = new XmlTextWriter(Server.MapPath("rss.xml")

,Encoding.UTF8);

ایجاد کرده و یا اطلاعات آن را به روز نماییم. با استفاده از این شی می xml این امکان را داریم که یک فایل xmlWriter تعریف شئ از نوع

فایل را نیز تعیین کرد. Encoding توان

xmlWriter.WriteStartDocument();

xml نظیر نسخه 1,0 برای تگ xml شروع فایل و افزودن مشخصات لازم برای فایل

xmlWriter.WriteStartElement("rss");

افزودن تگ شروع کننده عنصر <rss> عنوان اولین عنصر در فایل به

xmlWriter.WriteAttributeString("version","2.0");

<rss> افزودن مشخصه "نسخه" برای عنصر

xmlWriter.WriteStartElement("channel");

RSS برای معرفی پایگاه ارائه دهنده <channel> افزودن تگ شروع کننده عنصر

xmlWriter.WriteElementString("title", "MyDomain NewsWriter");

mohsen_mahyar@yahoo.com

 

ydomain.com به عنوان مثال . RSS برای نمایش عنوان پایگاه ارائه دهنده <channel> به عنوان فرزند <title> افزودن عنصر

می باشد . mydomain.com متعلق به سایت feed نمایان گر این مطلب است که این

xmlWriter.WriteElementString("link","http://mydomain.com");

RSS برای نمایش آدرس پایگاه ارائه دهنده <channel> به عنوان فرزند <link> افزودن عنصر

xmlWriter.WriteElementString("description","mycomain.com");

RSS برای نمایش توضیحات پایگاه ارائه دهنده <channel> به عنوان فرزند <description> افزودن عنصر

xmlWriter.WriteElementString("copyright","(c) 2004, Mydomain.com. All

rights reserved.");

RSS برای نمایش حقوق پدید آورندگان پایگاه ارائه دهنده <channel> به عنوان فرزند <copyright> افزودن عنصر

xmlWriter.WriteElementString("ttl","25");

برای اینکه نرم افزار گردآور خبر بداند پس از چه مدت <channel> به عنوان فرزند Time To Live یا <ttl> افزودن عنصر

زمانی باید فایل مورد نظر را برای اطلاعات جدید چک نماید . به عبارت دیگر پس از چه مدت زمانی اطلاعات موجود "قدیمی" به حساب می آیند

بر حسب دقیقه می باشد . <ttl> . و دوباره باید به روز شوند

-2 خواندن از روی پایگاه داده

SqlConnection sqlCn = new

SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);

web.config خواندن رشته حاوی اطلاعات اتصال به پایگاه داده از

string sqlNews = "SELECT TOP 15 ID, LEAD, TITLE, DATE FROM NEWS WHERE

STATUS_ID=2 ORDER BY DATE DESC";

تعریف پرس وجو برای نمایش ردیفهای مورد نظر

sqlCn.Open();

SqlCommand sqlcmdNews = new SqlCommand(sqlNews, sqlCn);

SqlDataReader drNews = sqlcmdNews.ExecuteReader();

برقراری اتصال با پایگاه داده و شروع خواندن اطلاعات

while(drNews.Read())

{

xmlWriter.WriteStartElement("item");

و مطالب آن به ازای هر خبر خوانده شده از پایگاه <item> افزودن تگ شروع کننده عنصر

xmlWriter.WriteElementString("title",drNews.GetString(drNews.GetOrdinal("

TITLE")));

به ازای هر خبر خوانده شده از پایگاه که حاوی عنوان خبر خوانده شده می <item> به عنوان فرزند عنصر <title> افزودن عنصر

باشد.

xmlWriter.WriteElementString("description",drNews.GetString(drNews.GetOrd

inal("LEAD")));

به ازای هر خبر خوانده شده از پایگاه که حاوی خلاصه خبر خوانده <item> به عنوان فرزند عنصر <description> افزودن عنصر

شده می باشد .

xmlWriter.WriteElementString("link","http://mydomain.com/news.aspx?"+drNe

ws.GetInt32(drNews.GetOrdinal("ID")).ToString());

به ازای هر خبر خوانده شده از پایگاه که حاوی آدرس خبر بوده و برای نمایش متن <item> به عنوان فرزند عنصر <link> افزودن عنصر

کامل خبر در مرور گر مورد استفاده قرار می گیرد.

xmlWriter.WriteElementString("pubDate",drNews.GetDateTime(drNews.GetOrdin

mohsen_mahyar@yahoo.com

 

al("DATE")).ToString("R"));

به ازای هر خبر خوانده شده از پایگاه حاوی تاریخ خبر خوانده شده می باشد . <item> به عنوان فرزند عنصر <pubDate> افزودن عنصر

822 نوشته شده باشد. RTC این تاریخ باید به صورت استاندارد

xmlWriter.WriteEndElement();

در پایان هر خبر </item> افزودن تگ پایانی

}

-3 در انتها : بستن تگ ها و پایان کار بروی فایل

xmlWriter.WriteEndElement();

</channel> افزودن تگ پایانی

xmlWriter.WriteEndElement();

</rss> افزودن تگ پایانی

xmlWriter.WriteEndDocument();

بستن تمامی تگ ها و یا مشخصه ها که بسته نشده اند .

xmlWriter.Close();

پایان کار با فایل

نسخه کامل برنامه

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Data.SqlClient;

using System.Drawing;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

using System.Xml;

using System.IO;

using System.Text;

using System.Configuration;

namespace rss

{

/// <summary>

/// Summary description for createXml.

/// </summary>

public class createXml : System.Web.UI.Page

{

private void Page_Load(object sender, System.EventArgs e)

{

XmlTextWriter xmlWriter = new XmlTextWriter(Server.

MapPath("rss.xml")

,Encoding.UTF8);

xmlWriter.WriteStartDocument();

xmlWriter.WriteStartElement("rss");

xmlWriter.WriteAttributeString("version","2.0");

xmlWriter.WriteStartElement("channel");

xmlWriter.WriteElementString("title", "MyDomain News");

xmlWriter.WriteElementString("link","http://MyDomain.com");

xmlWriter.WriteElementString("description","MyDomain");

xmlWriter.WriteElementString("copyright","(c) 2004,

MyDomain.com. All rights reserved.");

xmlWriter.WriteElementString("ttl","25");

SqlConnection sqlCn = new

SqlConnection(ConfigurationSettings.AppSettings

["ConnectionString"]);

sqlCn.Open();

string sqlNews = "SELECT TOP 15 ID, LEAD,

TITLE, IMAGE_PATH,DATE FROM NEWS WHERE

STATUS_ID=2 ORDER BY DATE

DESC";

SqlCommand sqlcmdNews = new SqlCommand(sqlNews, sqlCn);

SqlDataReader drNews = sqlcmdNews.ExecuteReader();

while (drNews.Read())

{

xmlWriter.WriteStartElement("item");

xmlWriter.WriteElementString("title",drNews.GetString

(drNews.GetOrdinal("TITLE")));

xmlWriter.WriteElementString("description",drNews.GetString

(drNews.GetOrdinal("LEAD")));

xmlWriter.WriteElementString("link",

"http://mydomain.com/news.aspx?"

+drNews.GetInt32(drNews.GetOrdinal("ID")).

ToString()+".html");

xmlWriter.WriteElementString("pubDate",

drNews.GetDateTime(drNews.GetOrdinal("DATE"))

.ToString("R"));

xmlWriter.WriteEndElement();

}

drNews.Close();

sqlCn.Close();

xmlWriter.WriteEndElement();

xmlWriter.WriteEndElement();

xmlWriter.WriteEndDocument();

xmlWriter.Close();

}

} mohsen_mahyar@yahoo.com

 

 

پایگاه اطلاع رسانی قرار دارد ، در اختیار (Root) ایجاد شده که در ریشه xml پس از اجرای این برنامه کوتاه می توانید فایل

دیگران قرار دهید .

تولید شده از پایگاه اطلاعاتی Feed تعیین درستی

ایجاد شده ، بیازمایید. به Feed هرگز فراموش نکنید که در انتهای کار، اطلاعات تولیدی خود را از جهت درستی و استاندارد بودن

RSS شما را انجام می دهند . به عنوان مثال از پایگاه xml همین دلیل نرم افزار ها و پایگاههایی وجود دارند که عملیات تعیین درستی فایل

پایگاه خود را وارد کرده و نتیجه نهایی را xml می توانید استفاده کنید. برای استفاده از خدمات این پایگاه ، کافی است که آدرس فایل Validator

می باشد . Feed Validator دریافت کنید. از دیگر پایگاههای ارائه دهنده این سرویس

mohsen_mahyar@yahoo.com

 

   + MOHSEN GHASEMI - ٢:٥۸ ‎ب.ظ ; ۱۳۸٩/۳/۳۱

مباحثی درھای پیرامون پشتی

   + MOHSEN GHASEMI - ٢:٥٦ ‎ب.ظ ; ۱۳۸٩/۳/۳۱

ایکس.ام.ال

mohsen_mahyar@yahoo.com

 

ایکس.ام.ال

برای توصیف داده طراحی شده است و بر آنچه ازنوع داده است (XML: Extensible markup language)". "ایکس.ام.ال

بر ای نمایش داده طراحی شده است و بر چگونگی (HTML: Hypertext Markup Language) ". تمرآز دارد. "اچ.تی.ام.ال

نمایش داده تمرآز دارد.

"ایکس.ام.ال." چیست؟

زبان نشانه گذاری گسترش پذیر است. Extensible markup language "ایکس.ام.ال." مخفف

تعاریف عمده "ایکس.ام.ال." و "اچ.تی.ام.ال."

"ایکس.ام.ال." جانشینی برای "اچ.تی.ام.ال." نیست . "ایکس.ام.ال." برای توصیف داده و "اچ.تی.ام.ال." نمایش داده

طراحی شده است

"ایکس.ام.ال." برای انجام دادن آاری طراحی نشده است

ممکن است درک آن سخت باشد اما "ایکس.ام.ال." آاری انجام نمی دهد . "ایکس.ام.ال." برای ساخت، ذخیره و ارسال

اطلاعات ایجاد شده است. مثال زیر یک سند "ایکس.ام.ال." را نشان می دهد:

<note>

<to>Tove</to>

<from>Jani</from>

<heading>Riminder</heading>

<body>Don’t forgout me this weekend</body>

</note>

دارد ،همچنین یک گیرنده و یک فرستنده اطلاعات دارد اما هنوز (body) و یک بدنه (header) این یادداشت یک سرصفحه

این سند آاری انجام نمی دهد . درواقع اطلاعات ساده پیچیده شده در برچسب های "ایکس.ام.ال." است وفرد باید یک

نرم افزاری برای ارسال، دریافت یا نمایش آن بنویسد.

"ایکس.ام.ال." مستقل و گسترش پذیر است

برچسب ها در "ایکس.ام.ال." از پیش تعریف شده نیست وشما باید برچسب های خود را ابداع آنید .برچسب هایی آه در

نشانه گدذاری اسناد "اچ.تی.ام.ال." استفاده شده اند و ساختار اسناد "اچ.تی.ام.ال." از پیش تعریف شده اند . مثل <

<p>,<h1

در توسعه آینده وب به احتمال خیلی زیادی از "ایکس.ام.ال." برای توصیف داده استفاده خواهد شد ، در حالی آه

"اچ.تی.ام.ال." برای فرمت و نمایش داده ها استفاده خواهد شد.

سرعت توسعه استانداردهای "ایکس.ام.ال." و سرعت انطباق تهیه آنندگان نرم افزارها با این استانداردها تعجب آور

است. نویسنده معتقد است آه "ایکس.ام.ال." برای آینده وب به اندازه "اچ.تی.ام.ال." آه پایه وب بوده است مهم خواهد

بود . "ایکس.ام.ال." مهمترین ابزار برای آاربرد درست داده و انتقال داده خواهد بود.

"ایکس.ام.ال." چگونه استفاده خواهد شد

"ایکس.ام.ال." می تواند داده را از "اچ.تی.ام.ال." جدا آند و در فایل "ایکس.ام.ال." ذخیره نماید . در این شیوه شما می

توانید از "اچ.تی.ام.ال." برای نمایش و تنضیمات صفحه استفاده آنید و مطمئن باشید آه تغییر در داده ای زیربنایی

نیازمند هیچ تغییری در "اچ.تی.ام.ال." شما نیست.

(XML) . مقدمه ای بر ایکس.ام.ال

مقدمهای _________بر ایکس

mohsen_mahyar@yahoo.com

   + MOHSEN GHASEMI - ٢:٥٥ ‎ب.ظ ; ۱۳۸٩/۳/۳۱

ارائه اطلاع رسانی در پایگاه RSS

   + MOHSEN GHASEMI - ٢:٥٤ ‎ب.ظ ; ۱۳۸٩/۳/۳۱

مسیریاب نقش شبکه ها در (Router)

<!-- /* Font Definitions */ @font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:TimesNewRoman; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"TimesNewRoman\,Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-alt:"Times New Roman"; mso-font-charset:178; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:8193 0 0 0 64 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

© 2002 by PersiaPacket.com™

I

 

 (Router) مسیریاب  نقش شبکه ها در

Mohsen_mahyar@yahoo.com

در تصویر زیر دو شبکه مجزا از یکدیگر قرار دارند آه هر آدام از این شبکه ها دارای سه آامپیوتر هستند آه از

مربوط به آن Subnet Mask و IP متصل شده اند. در زیر هر یک از آامپیوتر ها Hub طریق یک رسانه، به

های IP های شبکه سمت راست با محدوده IP درج شده است. همانطور آه در تصویر نمایش داده شده، محدوده

شبکه سمت چپ متفاوت میباشد ولی این محدوده در هر یک از شبکه ها یکسان است. هر یک از این دو شبکه

بصورت مجزا قادرند انتقال اطلاعات بین خود را براحتی انجام دهند ولی در صورتی آه ارتباطی فیزیکی بین این

دو شبکه برقرار شود، این دو شبکه قادر به ارسال و دریافت اطلاعات در هر دو شبکه نیستند و اصطلاحا این دو

های همکلاس و یا همگروه IP دو شبکه ای آه دارای TCP/IP شبکه یکدیگر را نمیبینند (براساس قوانین

نباشند، قادر به دیدن یکدیگر نیستند).

آامپیوتر برروی آارت شبکه تعیین میگردد، با اضافه آردن آارت شبکه دومی (IP) از آنجا آه آدرس منطقی

میتوان قادر به دیدن هر دو شبکه از طریق این آامپیوتر شد. همانطور آه در تصویر مشخص است، آامپیوتری آه

دیگر آه IP ها همکلاس شبکه سمت چپ و IP نیز هست. آه یکی از این IP دارای دو آارت شبکه است، دارای دو

با رنگ قرمز نمایش داده شده است همکلاس شبکه سمت راست میباشد. در نتیجه این آامپیوتر قادر به دیدن هر دو

شبکه میباشد.

برای اینکه بقیه آامپیوتر ها نیز بتوانند آامپیوترهای موجود در شبکه های دیگر را ببینند، یک راه این است آه

تمامی آامپیوتر ها را مانند روش بالا مجهز به آارت شبکه دومی بکنیم آه این روش مقرون به صرفه نیست! راه

برروی Gateway IP همکلاس آامپیوتری را آه دارای دو آارت شبکه است را به عنوان IP بهتر آن است آه

مقصدی غیر همکلاس ارسال IP بقیه آامپیوتر ها قرار دهیم. در نتیحه هر گاه آامپیوتری، بسته اطلاعاتی را برای

آند، این بسته به آامپیوتر دارای دو آارت شبکه ارسال میگردد تا از آن خارج شود. به این روش میتوان شبکه

همکلاس و یا همگروه نیستند (شبکه های ناهمگون) را به یکدیگر متصل آرد. به آامپیوتری IP هایی را آه دارای

مانند اینترنت WAN یا مسیر یاب گفته میشود. در شبکه های Router ، آه دارای دو و یا چند آارت شبکه باشد

نیز از این راه برای ارتباط شبکه ها به یکدیگر استفاده میشود.

© 2002 by PersiaPacket.com™

II

قابل تنظیم است. Dial-up Networking در قسمت Windows در سیستم های مبتنی بر Gateway پارامتر

یکی است. Router با Gateway آامپیوتر IP توضیح آخر آنکه عموما

در تصویر بالا نیز جهت راهبری بهتر شبکه میتوان به جای آامپیوتر دارای دو آارت شبکه، از یک

استفاده آرد. (Router) مسیریاب_

Mohsen_mahyar@yahoo.com

_

   + MOHSEN GHASEMI - ۱٢:۱٧ ‎ق.ظ ; ۱۳۸٩/۳/۳۱

امنیت سرور لینوکس ٣

<!-- /* Font Definitions */ @font-face {font-family:Helvetica; panose-1:2 11 5 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Courier; panose-1:2 7 4 9 2 2 5 2 4 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tms Rmn"; panose-1:2 2 6 3 4 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Helv; panose-1:2 11 6 4 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"New York"; panose-1:2 4 5 3 6 5 6 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:System; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MS Mincho"; panose-1:2 2 6 9 4 2 5 8 3 4; mso-font-alt:"MS 明朝"; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Batang; panose-1:2 3 6 0 0 1 1 1 1 1; mso-font-alt:바탕; mso-font-charset:129; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimSun; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:宋体; mso-font-charset:134; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:PMingLiU; panose-1:2 1 6 1 0 1 1 1 1 1; mso-font-alt:新細明體; mso-font-charset:136; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:"MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-alt:"MS ゴシック"; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Dotum; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:돋움; mso-font-charset:129; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimHei; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:黑体; mso-font-charset:134; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:MingLiU; panose-1:2 1 6 9 0 1 1 1 1 1; mso-font-alt:細明體; mso-font-charset:136; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:Mincho; panose-1:2 2 6 9 4 3 5 8 3 5; mso-font-alt:明朝; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Gulim; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:굴림; mso-font-charset:129; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:Century; panose-1:2 4 6 3 5 7 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Angsana New"; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:"Cordia New"; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:Mangal; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:32768 0 0 0 0 0;} @font-face {font-family:Latha; panose-1:2 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1048576 0 0 0 0 0;} @font-face {font-family:Sylfaen; panose-1:1 10 5 2 5 3 6 3 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:67110535 0 0 0 159 0;} @font-face {font-family:Vrinda; panose-1:1 1 6 0 1 1 1 1 1 1; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:65539 0 0 0 1 0;} @font-face {font-family:Raavi; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131072 0 0 0 0 0;} @font-face {font-family:Shruti; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:262144 0 0 0 0 0;} @font-face {font-family:Sendnya; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Gautami; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:2097152 0 0 0 0 0;} @font-face {font-family:Tunga; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:4194304 0 0 0 0 0;} @font-face {font-family:"Estrangelo Edessa"; panose-1:3 8 6 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:-2147459008 0 128 0 0 0;} @font-face {font-family:"Arial Unicode MS"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Tahoma; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627421319 -2147483648 8 0 66047 0;} @font-face {font-family:Tahoma-Bold; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"TimesNewRoman\,Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Arial\,Italic"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Arial\,Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Adobe Caslon Pro Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Caslon Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Garamond Pro Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Garamond Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Arno Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Caption"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro SmText"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Subhead"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Light Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Caption"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd SmText"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Subhead"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bell Gothic Std Black"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bell Gothic Std Light"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bickham Script Pro Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:script; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:"Bickham Script Pro Semibold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:script; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:"Birch Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Blackoak Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Brush Script Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Chaparral Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Charlemagne Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Cooper Std Black"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eccentric Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Garamond Premr Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Garamond Premr Pro Smbd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Giddyup Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Hobo Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Kozuka Gothic Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Letter Gothic Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Lithos Pro Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Mesquite Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Minion Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro Med"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro SmBd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro Light"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Nueva Std Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"OCR A Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Orator Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Poplar Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Prestige Elite Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rosewood Std Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Stencil Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tekton Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Tekton Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Tekton Pro Ext"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Trajan Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:Marlett; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Lucida Console"; panose-1:2 11 6 9 4 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-2147482993 6144 0 0 31 0;} @font-face {font-family:"Lucida Sans Unicode"; panose-1:2 11 6 2 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-2147476737 14699 0 0 63 0;} @font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"Arial Black"; panose-1:2 11 10 4 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Comic Sans MS"; panose-1:3 15 7 2 3 3 2 2 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Impact; panose-1:2 11 8 6 3 9 2 5 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Georgia; panose-1:2 4 5 2 5 4 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Medium"; panose-1:2 11 6 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Palatino Linotype"; panose-1:2 4 5 2 5 5 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870009 1073741843 0 0 415 0;} @font-face {font-family:"Trebuchet MS"; panose-1:2 11 6 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Webdings; panose-1:5 3 1 2 1 5 9 6 7 3; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MV Boli"; panose-1:2 0 5 0 3 2 0 9 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 0 256 0 0 0;} @font-face {font-family:AngsanaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:BrowalliaUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:"Browallia New"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:CordiaUPC; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:DilleniaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:EucrosiaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:FreesiaUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:IrisUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:JasmineUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:KodchiangUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:LilyUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:Aharoni; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:David; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"David Transparent"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:FrankRuehl; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Levenim MT"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Miriam; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Miriam Transparent"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Miriam Fixed"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Fixed Miriam Transparent"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Narkisim; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Rod; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Rod Transparent"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Traditional Arabic"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:24577 0 0 0 64 0;} @font-face {font-family:"Arabic Transparent"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:Andalus; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:24577 0 0 0 64 0;} @font-face {font-family:"Simplified Arabic"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:"Simplified Arabic Fixed"; panose-1:2 1 0 9 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:Kartika; panose-1:2 2 5 3 3 4 4 6 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:8388611 0 0 0 1 0;} @font-face {font-family:"\@MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:FantasyMatrix; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:FantasyMatrixSmall; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Jokerman Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"University Roman Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Smudger Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"HolidayPi BT"; panose-1:5 12 1 2 1 2 9 2 2 2; mso-font-charset:2; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"OldDreadfulNo7 BT"; panose-1:4 8 8 5 6 1 7 1 8 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"MisterEarl BT"; panose-1:3 8 8 2 2 3 2 2 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Calligraph421 BT"; panose-1:3 6 7 2 5 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Blackletter686 BT"; panose-1:3 4 8 2 2 6 8 4 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Cataneo BT"; panose-1:3 2 8 2 4 5 2 6 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Staccato222 BT"; panose-1:3 9 7 2 3 4 7 2 4 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"ParkAvenue BT"; panose-1:3 2 6 2 5 5 6 8 7 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Square721 BT"; panose-1:2 11 5 4 2 2 2 6 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Broadway BT"; panose-1:4 4 9 5 8 11 2 2 5 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Microsoft Sans Serif"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627421663 -2147483648 8 0 66047 0;} @font-face {font-family:"Scruff LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Odessa LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Highlight LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"One Stroke Script LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Mekanik LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Tiranti Solid LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Pump Demi Bold LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Quixley LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"La Bamba LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Rage Italic LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Ruach LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Westwood LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Smudger LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Milano LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Victorian LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"University Roman LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Academy Engraved LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Orange LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"John Handy LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Jokerman LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Agency FB"; panose-1:2 11 5 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Arial Narrow"; panose-1:2 11 5 6 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arial Rounded MT Bold"; panose-1:2 15 7 4 3 5 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Blackadder ITC"; panose-1:4 2 5 5 5 16 7 2 13 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT"; panose-1:2 7 6 3 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT Black"; panose-1:2 7 10 3 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT Condensed"; panose-1:2 7 6 6 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Book Antiqua"; panose-1:2 4 6 2 5 3 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bookman Old Style"; panose-1:2 5 6 4 5 5 5 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bradley Hand ITC"; panose-1:3 7 4 2 5 3 2 3 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Calisto MT"; panose-1:2 4 6 3 5 5 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Castellar; panose-1:2 10 4 2 6 4 6 1 3 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Century Gothic"; panose-1:2 11 5 2 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Century Schoolbook"; panose-1:2 4 6 4 5 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Copperplate Gothic Bold"; panose-1:2 14 7 5 2 2 6 2 4 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Copperplate Gothic Light"; panose-1:2 14 5 7 2 2 6 2 4 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Curlz MT"; panose-1:4 4 4 4 5 7 2 2 2 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Edwardian Script ITC"; panose-1:3 3 3 2 4 7 7 13 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Elephant; panose-1:2 2 9 4 9 5 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Engravers MT"; panose-1:2 9 7 7 8 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Bold ITC"; panose-1:2 11 9 7 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Demi ITC"; panose-1:2 11 8 5 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Light ITC"; panose-1:2 11 4 2 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Medium ITC"; panose-1:2 11 6 2 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Felix Titling"; panose-1:4 6 5 5 6 2 2 2 10 4; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Forte; panose-1:3 6 9 2 4 5 2 7 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Franklin Gothic Book"; panose-1:2 11 5 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Demi"; panose-1:2 11 7 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Demi Cond"; panose-1:2 11 7 6 3 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Heavy"; panose-1:2 11 9 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Medium Cond"; panose-1:2 11 6 6 3 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"French Script MT"; panose-1:3 2 4 2 4 6 7 4 6 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Garamond; panose-1:2 2 4 4 3 3 1 1 8 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Gigi; panose-1:4 4 5 4 6 16 7 2 13 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Gill Sans MT Ext Condensed Bold"; panose-1:2 11 9 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans MT"; panose-1:2 11 5 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans MT Condensed"; panose-1:2 11 5 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans Ultra Bold"; panose-1:2 11 10 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans Ultra Bold Condensed"; panose-1:2 11 10 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gloucester MT Extra Condensed"; panose-1:2 3 8 8 2 6 1 1 1 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Goudy Old Style"; panose-1:2 2 5 2 5 3 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Goudy Stout"; panose-1:2 2 9 4 7 3 11 2 4 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Haettenschweiler; panose-1:2 11 7 6 4 9 2 6 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Imprint MT Shadow"; panose-1:4 2 6 5 6 3 3 3 2 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"MS Outlook"; panose-1:5 1 1 0 1 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Maiandra GD"; panose-1:2 14 5 2 3 3 8 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Monotype Corsiva"; panose-1:3 1 1 1 1 2 1 1 1 1; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"OCR A Extended"; panose-1:2 1 5 9 2 1 2 1 3 3; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Palace Script MT"; panose-1:3 3 3 2 2 6 7 12 11 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Papyrus; panose-1:3 7 5 2 6 5 2 3 2 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Perpetua; panose-1:2 2 5 2 6 4 1 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Perpetua Titling MT"; panose-1:2 2 5 2 6 5 5 2 8 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Pristina; panose-1:3 6 4 2 4 4 6 8 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rage Italic"; panose-1:3 7 5 2 4 5 7 7 3 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Rockwell; panose-1:2 6 6 3 2 2 5 2 4 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rockwell Condensed"; panose-1:2 6 6 3 5 4 5 2 1 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rockwell Extra Bold"; panose-1:2 6 9 3 4 5 5 2 4 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Script MT Bold"; panose-1:3 4 6 2 4 6 7 8 9 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tw Cen MT"; panose-1:2 11 6 2 2 1 4 2 6 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Tw Cen MT Condensed"; panose-1:2 11 6 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Wingdings 2"; panose-1:5 2 1 2 1 5 7 7 7 7; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Wingdings 3"; panose-1:5 4 1 2 1 8 7 7 7 7; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Bookshelf Symbol 7"; panose-1:5 1 1 1 1 1 1 1 1 1; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Lucida Sans"; panose-1:2 11 6 2 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Lucida Sans Typewriter"; panose-1:2 11 5 9 3 5 4 3 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"MS Reference Sans Serif"; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"MS Reference Specialty"; panose-1:5 0 5 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Tw Cen MT Condensed Extra Bold"; panose-1:2 11 8 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:ZWAdobeF; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:536885895 0 0 0 511 0;} @font-face {font-family:"Euro Sign"; panose-1:2 11 6 3 2 2 1 2 1 1; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 2 0 0 1 0;} @font-face {font-family:"Lucida Bright"; panose-1:2 4 6 3 7 5 5 2 4 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} ins {mso-style-type:export-only; text-decoration:none;} span.msoIns {mso-style-type:export-only; mso-style-name:""; text-decoration:underline; text-underline:single;} span.msoDel {mso-style-type:export-only; mso-style-name:""; text-decoration:line-through; color:aqua;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

امنیت سرور لینوکس ٣

By: bl2k@shabgard.org Shabgard Security Teams

Linux Kernel

کامپایل کرنل و بروز رسانی آن

استفاده از آخرین نسخه کرنل که قلب تپنده لینوکس محسوب می شود باعث افزایش امنیت و جلوگیری از حمله های

نفوذگران خواهد شد که با استفاده از آسیب پذیری های کشف شده در سطح کرنل انجام می پذیرند.

مراجعه و نگارش پایدار کرنل مورد نظر و یا http://www.kernel.org برای دریافت آخرین نسخه های آن به سایت

بسته های بروز رسان نسخه های پیشین را دریافت کنید.

در صورت استفاده از آخرین نگارش کرنل ممکن است برنامه های موجود روی لینوکس به درستی کار نکنند برای رفع

این مشکل باید نسخه ای که ایراد پیدا میکند دوباره برای این نسخه از کرنل با استفاده از سورس برنامه مربوطه دوباره

کامپایل شود یا از بسته های کامپایل شده جدید استفاده شود.

قبل از شروع کار از وجود بسته های نصب شده با استفاده از دستورات زیر اطمنیان حاصل کنید:

iptables ( (فایروال سیستم عامل لینوکس

[root@tango /]# rpm -q iptables

package iptables is not installed

quota ( ( محدودآننده و مونیتورینگ

[root@tango /]# rpm -q quota

package quota is not installed

و برای نصب برنامه های فوق به صورت زیر عمل می کنیم:

ابتدا سی دی رام را بصورت زیر معرفی می کنیم(عمل مانت کردن )

[root@tango /]# mount /dev/cdrom /mnt/cdrom/

had: ATAPI 32X CD-ROM drive, 128kB Cache

mount: block device dev/cdrom is write-protected, mounting read-only

Iptables برای نصب

[root@tango /]# cd /mnt/cdrom/RedHat/RPMS/

[root@tango RPMS]# rpm -Uvh iptables-version.i386.rpm

iptables ##################################################

quota برای نصب

[root@tango /]# cd /mnt/cdrom/RedHat/RPMS/

[root@tango RPMS]# rpm -Uvh quota-version.i386.rpm

quota ##################################################

نحوه تنظیمات این دو برنامه در بخشهای بعدی مفصل توضیح داده خواهد شد.

تهیه نسخه پشتیبان از کرنل موجود بر رو فلاپی

با استفاده از دستور زیر مسیر و نگارش بوت لینوکس بدست می آوریم:

[root@tango /]# cat /etc/lilo.conf

boot=/dev/sda

map=/boot/map

install=/boot/boot.b

timeout=00

default=linux

restricted

password=mypasswd

image=/boot/vmlinuz-2.4.2- نگارش کرنل لینوکس 2

label=linux the image we booted from

initrd=/boot/initrd-2.4.2-2.img

read-only

root=/dev/sda6

-2- امنیت سرور لینوکس ٣

By: bl2k@shabgard.org Shabgard Security Teams

با استفاده از فرمان زیر یه کپی بر روی فلاپی از نسخه قدیمی تهیه می کنیم:

[root@tango /]# mkbootdisk --device /dev/fd0H1440 2.4.2-2

Insert a disk in /dev/fd0. Any information on the disk will be lost.

Press <Enter> to continue or ^C to abort:

در صورتیکه پارتشین بوت فقط خواندنی است با استفاده از خطوط زیر این مشکل را حل نمایید( بعد از انجام کار دوباره

به حالت اول تغییر داده شود)

#vi /etc/fstab

LABEL=/boot /boot ext2 defaults,ro 1 2

To read:

LABEL=/boot /boot ext2 defaults 1 2

گام بعدی

[root@tango /]# mount /boot –oremount

برای صحت از انجام دستورات بالا

[root@tango /]# cat /proc/mounts

/dev/root / ext2 rw 0 0

/proc /proc proc rw 0 0

/dev/sda1 /boot ext2 rw 0 0

/dev/sda10 /cache ext2 rw,nodev 0 0

/dev/sda9 /chroot ext2 rw 0 0

/dev/sda8 /home ext2 rw,nosuid 0 0

/dev/sda13 /tmp ext2 rw,noexec,nosuid 0 0

/dev/sda7 /usr ext2 rw 0 0

/dev/sda11 /var ext2 rw 0 0

/dev/sda12 /var/lib ext2 rw 0 0

none /dev/pts devpts rw 0 0

برای کپی سورس کرنل جدید

[root@tango /]# cp linux-version.tar.gz /usr/src/

برای ورود به شاخه سورس

[root@tango /]# cd /usr/src/

برای پاک کردن نسخه قبلی به ترتیب

[root@tango src]# rm -f linux

[root@tango src]# rm -rf linux-2.4.x/

[root@tango src]# rm -f /boot/vmlinuz-2.4.x

[root@tango src]# rm -f /boot/System.map-2.4.x

[root@tango src]# rm -rf /lib/modules/2.4.x/

در صورتی که کرنل قبلی بصورت بسته نصب شده مراحل زیر را دنبال کنید :

[root@tango src]# rpm -qa | grep kernel

kernel-2.4.2-2

kernel-headers-2.4.2-2

برای حذف بسته کرنل به فورمت زیر عمل می کنیم که با جاگذاری نتیجه بالا در دستور زیر :

[root@tango src]# rpm -e –nodeps kernel-2.4.2-2 kernel-headers-2.4.2-2

برای خارج کردن سورس از حالت فشرده به صورت زیر:

-3- امنیت سرور لینوکس ٣

By: bl2k@shabgard.org Shabgard Security Teams

[root@tango src]# tar xzpf linux-version.tar.gz

و برای حذف سورس به صورت فایل آرشیو

[root@tango src]# rm -f linux-version.tar.gz

برای دست یابی به بیشترین سازگاری کرنل جدید تغییرات زیر رو در فایلهای مربوطه به شکل زیر انجام دهید:

#vi +66 /usr/src/linux/include/linux/sem.h

پارامتر فوق

#define SEMMNI 128 /* <= IPCMNI max # of semaphore identifiers */

به شکل زیر

#define SEMMNI 512 /* <= IPCMNI max # of semaphore identifiers */

#vi +26 /usr/src/linux/kernel/printk.c

پارامتر زیر

#define LOG_BUF_LEN (16384)

به صورت

#define LOG_BUF_LEN (65536)

#vi +19 /usr/src/linux/Makefile

پارامتر فوق

HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer

به شکل زیر

HOSTCFLAGS = -Wall -Wstrict-prototypes -O3 -funroll-loops -fomitframe-

Pointer

و همچنین

#vi +90 /usr/src/linux/Makefile

پارامتر زیر

CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer

-fno-strict-aliasing

به شکل زیر

CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -O3 -funroll-loops -

fomit-frame-pointer -fno-strict-aliasing

توجه :

به شکل زیر عمل میکنیم linux-2.4.5-ow1.tar.gz برای مثال برای نصب یک وصله امنیتی

[root@tango /]# cp linux-2.4.5-ow1.tar.gz /usr/src/

[root@tango /]# cd /usr/src/

[root@tango src]# tar xzpf linux-2.4.5-ow1.tar.gz

[root@tango src]# cd linux-2.4.5-ow1/

[root@tango linux-2.4.5-ow1]# mv linux-2.4.5-ow1.diff /usr/src/

[root@tango linux-2.4.5-ow1]# cd ..

[root@tango src]# patch -p0 < linux-2.4.5-ow1.diff

[root@tango src]# rm -rf linux-2.4.5-ow1

[root@tango src]# rm -f linux-2.4.5-ow1.diff

[root@tango src]# rm -f linux-2.4.5-ow1.tar.gz

-4- امنیت سرور لینوکس ٣

By: bl2k@shabgard.org Shabgard Security Teams

پاک کردن کرنل بطور کامل

مراحل زیر را قبل از وارد شدن به مرحله تنظیم مدولهای کرنل با دستورات زیر انجام می دیهم توجه داشته باشید با این

پاک می شوند Header کار کل کرنل بطور کامل حتی فایلهای

[root@tango src]# cd /usr/include/

[root@tango include]# rm -f asm linux

[root@tango include]# ln -s /usr/src/linux/include/asm-i386 asm

[root@tango include]# ln -s /usr/src/linux/include/linux linux

[root@tango include]# cd /usr/src/linux/

[root@tango linux]# make mrproper

وارد محیط متنی تنظیمات مدولی کرنل خواهیم شد make config در ترمینال با وارد کردن دستور

[root@tango /]# cd /usr/src/linux/ ؟ مطمئن شوید که در این شاخه قرار دارید

[root@tango linux]# make config

rm -f include/asm

( cd include ; ln -sf asm-i386 asm)

/bin/sh scripts/Configure arch/i386/config.in

#

# Using defaults found in arch/i386/defconfig

#

در این قسمت انتخاب های زیر رو می توان با انتخاب کلید های مورد نظر انجام داد

[y] .برای کامپایل کرنل باز شده

[m] برای استفاده از یک مدول

[n] برای عدم انتخاب یک قسمت و یا مدول

برای آامپایل آرنل موجود است آه در ادامه از modularized kernel و monolithic kernel روشهای مختلفی مانند

استفاده خواهد شد. در این روش درایور سخت افزار همراه با کد کرنل به صورت مجتمع monolithic kernel روش

کامپایل خواهد شد.

برای مثال سیستم فوق با مشخصات سخت افزاری زیر را در نظر میگیریم:

1 Pentium-III 667 MHz (i686) processor

1 Motherboard Asus P3V4X Pro 133Mhz EIDE

1 Hard Disk Ultra ATA/66 EIDE

1 Chipset Apollo Pro133A

1 CD-ROM ATAPI IDE

1 Floppy Disk

2 Ethernet Cards 3COM 3c597 PCI 10/100

1 Mouse PS/2

در حالت پررنگ دقت کنید شما هم مراحل زیر رو دنبال می کنید n یا y به جواب هایی که با

rm -f include/asm

( cd include ; ln -sf asm-i386 asm)

/bin/sh scripts/Configure arch/i386/config.in

#

# Using defaults found in arch/i386/defconfig

#

*

* Code maturity level options

*

Prompt for development and/or incomplete code/drivers (CONFIG_EXPERIMENTAL) [N/y/?]

*

* Loadable module support

*

Enable loadable module support (CONFIG_MODULES) [Y/n/?]

Set version information on all module symbols (CONFIG_MODVERSIONS) [Y/n/?] n

Kernel module loader (CONFIG_KMOD) [Y/n/?]

*

* Processor type and features

-5- امنیت سرور لینوکس ٣

By: bl2k@shabgard.org Shabgard Security Teams

*

Processor family (386, 486, 586/K5/5x86/6x86/6x86MX, Pentium-Classic, Pentium-MMX, Pentium-

Pro/Celeron/Pentium-II, Pentium-III, Pentium-4, K6/K6-II/K6-III, Athlon/K7, Crusoe, Winchip-C6, Winchip-2,

Winchip-2A/Winchip-3) [Pentium-III] Pentium-Pro/Celeron/Pentium-II

defined CONFIG_M686

Toshiba Laptop support (CONFIG_TOSHIBA) [N/y/m/?]

/dev/cpu/microcode - Intel IA32 CPU microcode support (CONFIG_MICROCODE) [N/y/m/?]

/dev/cpu/*/msr - Model-specific register support (CONFIG_X86_MSR) [N/y/m/?]

/dev/cpu/*/cpuid - CPU information support (CONFIG_X86_CPUID) [N/y/m/?]

High Memory Support (off, 4GB, 64GB) [off]

defined CONFIG_NOHIGHMEM

Math emulation (CONFIG_MATH_EMULATION) [N/y/?] (NEW)

MTRR (Memory Type Range Register) support (CONFIG_MTRR) [N/y/?]

Symmetric multi-processing support (CONFIG_SMP) [Y/n/?] n

APIC and IO-APIC support on uniprocessors (CONFIG_X86_UP_IOAPIC) [N/y/?] (NEW) y

*

* General setup

*

Networking support (CONFIG_NET) [Y/n/?]

SGI Visual Workstation support (CONFIG_VISWS) [N/y/?]

PCI support (CONFIG_PCI) [Y/n/?]

PCI access mode (BIOS, Direct, Any) [Any]

defined CONFIG_PCI_GOANY

PCI device name database (CONFIG_PCI_NAMES) [Y/n/?] n

EISA support (CONFIG_EISA) [N/y/?]

MCA support (CONFIG_MCA) [N/y/?]

Support for hot-pluggable devices (CONFIG_HOTPLUG) [Y/n/?] n

System V IPC (CONFIG_SYSVIPC) [Y/n/?]

BSD Process Accounting (CONFIG_BSD_PROCESS_ACCT) [N/y/?]

Sysctl support (CONFIG_SYSCTL) [Y/n/?]

Kernel core (/proc/kcore) format (ELF, A.OUT) [ELF]

defined CONFIG_KCORE_ELF

Kernel support for a.out binaries (CONFIG_BINFMT_AOUT) [Y/m/n/?]

Kernel support for ELF binaries (CONFIG_BINFMT_ELF) [Y/m/n/?]

Kernel support for MISC binaries (CONFIG_BINFMT_MISC) [Y/m/n/?]

Power Management support (CONFIG_PM) [Y/n/?] n

*

* Memory Technology Devices (MTD)

*

Memory Technology Device (MTD) support (CONFIG_MTD) [N/y/m/?]

*

* Parallel port support

*

Parallel port support (CONFIG_PARPORT) [N/y/m/?]

*

* Plug and Play configuration

*

Plug and Play support (CONFIG_PNP) [Y/m/n/?] n

*

* Block devices

*

Normal PC floppy disk support (CONFIG_BLK_DEV_FD) [Y/m/n/?]

XT hard disk support (CONFIG_BLK_DEV_XD) [N/y/m/?]

Compaq SMART2 support (CONFIG_BLK_CPQ_DA) [N/y/m/?]

Compaq CISS Array support (CONFIG_BLK_CPQ_CISS_DA) [N/y/m/?]

Mylex DAC960/DAC1100 PCI RAID Controller support (CONFIG_BLK_DEV_DAC960) [N/y/m/?]

Loopback device support (CONFIG_BLK_DEV_LOOP) [N/y/m/?]

Network block device support (CONFIG_BLK_DEV_NBD) [N/y/m/?]

RAM disk support (CONFIG_BLK_DEV_RAM) [N/y/m/?]

*

* Multi-device support (RAID and LVM)

*

-6- امنیت سرور لینوکس ٣

By: bl2k@shabgard.org Shabgard Security Teams

Multiple devices driver support (RAID and LVM) (CONFIG_MD) [N/y/?]

*

* Networking options

*

Packet socket (CONFIG_PACKET) [Y/m/n/?]

Packet socket: mmapped IO (CONFIG_PACKET_MMAP) [N/y/?] y

Kernel/User netlink socket (CONFIG_NETLINK) [N/y/?] y

Routing messages (CONFIG_RTNETLINK) [N/y/?] (NEW) y

Netlink device emulation (CONFIG_NETLINK_DEV) [N/y/m/?] (NEW) y

Network packet filtering (replaces ipchains) (CONFIG_NETFILTER) [N/y/?] y

Network packet filtering debugging (CONFIG_NETFILTER_DEBUG) [N/y/?] (NEW) y

Socket Filtering (CONFIG_FILTER) [N/y/?]

Unix domain sockets (CONFIG_UNIX) [Y/m/n/?]

TCP/IP networking (CONFIG_INET) [Y/n/?]

IP: multicasting (CONFIG_IP_MULTICAST) [Y/n/?] n

IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) [N/y/?] y

IP: policy routing (CONFIG_IP_MULTIPLE_TABLES) [N/y/?] (NEW) y

IP: use netfilter MARK value as routing key (CONFIG_IP_ROUTE_FWMARK) [N/y/?] (NEW) y

IP: fast network address translation (CONFIG_IP_ROUTE_NAT) [N/y/?] (NEW) y

IP: equal cost multipath (CONFIG_IP_ROUTE_MULTIPATH) [N/y/?] (NEW) y

IP: use TOS value as routing key (CONFIG_IP_ROUTE_TOS) [N/y/?] (NEW) y

IP: verbose route monitoring (CONFIG_IP_ROUTE_VERBOSE) [N/y/?] (NEW) y

IP: large routing tables (CONFIG_IP_ROUTE_LARGE_TABLES) [N/y/?] (NEW) y

IP: kernel level autoconfiguration (CONFIG_IP_PNP) [N/y/?]

IP: tunneling (CONFIG_NET_IPIP) [N/y/m/?]

IP: GRE tunnels over IP (CONFIG_NET_IPGRE) [N/y/m/?]

IP: TCP Explicit Congestion Notification support (CONFIG_INET_ECN) [N/y/?]

IP: TCP syncookie support (disabled per default) (CONFIG_SYN_COOKIES) [N/y/?] y

*

* IP: Netfilter Configuration

*

Connection tracking (required for masq/NAT) (CONFIG_IP_NF_CONNTRACK) [N/y/m/?] (NEW) m

FTP protocol support (CONFIG_IP_NF_FTP) [N/m/?] (NEW) m

IP tables support (required for filtering/masq/NAT) (CONFIG_IP_NF_IPTABLES) [N/y/m/?] (NEW) m

limit match support (CONFIG_IP_NF_MATCH_LIMIT) [N/m/?] (NEW) m

MAC address match support (CONFIG_IP_NF_MATCH_MAC) [N/m/?] (NEW) m

netfilter MARK match support (CONFIG_IP_NF_MATCH_MARK) [N/m/?] (NEW) m

Multiple port match support (CONFIG_IP_NF_MATCH_MULTIPORT) [N/m/?] (NEW) m

TOS match support (CONFIG_IP_NF_MATCH_TOS) [N/m/?] (NEW) m

tcpmss match support (CONFIG_IP_NF_MATCH_TCPMSS) [N/m/?] (NEW) m

Connection state match support (CONFIG_IP_NF_MATCH_STATE) [N/m/?] (NEW) m

Packet filtering (CONFIG_IP_NF_FILTER) [N/m/?] (NEW) m

REJECT target support (CONFIG_IP_NF_TARGET_REJECT) [N/m/?] (NEW) m

Full NAT (CONFIG_IP_NF_NAT) [N/m/?] (NEW) m

MASQUERADE target support (CONFIG_IP_NF_TARGET_MASQUERADE) [N/m/?] (NEW) m

REDIRECT target support (CONFIG_IP_NF_TARGET_REDIRECT) [N/m/?] (NEW) m

Packet mangling (CONFIG_IP_NF_MANGLE) [N/m/?] (NEW) m

TOS target support (CONFIG_IP_NF_TARGET_TOS) [N/m/?] (NEW) m

MARK target support (CONFIG_IP_NF_TARGET_MARK) [N/m/?] (NEW) m

LOG target support (CONFIG_IP_NF_TARGET_LOG) [N/m/?] (NEW) m

TCPMSS target support (CONFIG_IP_NF_TARGET_TCPMSS) [N/m/?] (NEW) m

ipchains (2.2-style) support (CONFIG_IP_NF_COMPAT_IPCHAINS) [N/y/m/?] (NEW)

ipfwadm (2.0-style) support (CONFIG_IP_NF_COMPAT_IPFWADM) [N/y/m/?] (NEW)

*

*

*

The IPX protocol (CONFIG_IPX) [N/y/m/?]

Appletalk protocol support (CONFIG_ATALK) [N/y/m/?]

DECnet Support (CONFIG_DECNET) [N/y/m/?]

802.1d Ethernet Bridging (CONFIG_BRIDGE) [N/y/m/?]

*

* QoS and/or fair queuering

-7- امنیت سرور لینوکس ٣

By: bl2k@shabgard.org Shabgard Security Teams

*

QoS and/or fair queuring (EXPERIMENTAL) (CONFIG_NET_SCHED) [N/y/?]

*

* Telephony Support

*

Linux telephony support (CONFIG_PHONE) [N/y/m/?]

*

* ATA/IDE/MFM/RLL support

*

ATA/IDE/MFM/RLL support (CONFIG_IDE) [Y/m/n/?] m

*

* IDE, ATA and ATAPI Block devices

*

Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support (CONFIG_BLK_DEV_IDE) [M/n/?]

*

* Please see Documentation/ide.txt for help/info on IDE drives

*

Use old disk-only driver on primary interface (CONFIG_BLK_DEV_HD_IDE) [N/y/?]

Include IDE/ATA-2 DISK support (CONFIG_BLK_DEV_IDEDISK) [M/n/?]

Use multi-mode by default (CONFIG_IDEDISK_MULTI_MODE) [N/y/?]

Include IDE/ATAPI CDROM support (CONFIG_BLK_DEV_IDECD) [M/n/?]

Include IDE/ATAPI TAPE support (CONFIG_BLK_DEV_IDETAPE) [N/y/m/?]

Include IDE/ATAPI FLOPPY support (CONFIG_BLK_DEV_IDEFLOPPY) [N/y/m/?]

SCSI emulation support (CONFIG_BLK_DEV_IDESCSI) [N/y/m/?]

*

* IDE chipset support/bugfixes

*

CMD640 chipset bugfix/support (CONFIG_BLK_DEV_CMD640) [Y/n/?] n

RZ1000 chipset bugfix/support (CONFIG_BLK_DEV_RZ1000) [Y/n/?] n

Generic PCI IDE chipset support (CONFIG_BLK_DEV_IDEPCI) [Y/n/?]

Sharing PCI IDE interrupts support (CONFIG_IDEPCI_SHARE_IRQ) [Y/n/?]

Generic PCI bus-master DMA support (CONFIG_BLK_DEV_IDEDMA_PCI) [N/y/?] y

Boot off-board chipsets first support (CONFIG_BLK_DEV_OFFBOARD) [N/y/?]

Use PCI DMA by default when available (CONFIG_IDEDMA_PCI_AUTO) [N/y/?] y

AEC62XX chipset support (CONFIG_BLK_DEV_AEC62XX) [N/y/?]

ALI M15x3 chipset support (CONFIG_BLK_DEV_ALI15X3) [N/y/?]

AMD Viper support (CONFIG_BLK_DEV_AMD7409) [N/y/?]

CMD64X chipset support (CONFIG_BLK_DEV_CMD64X) [N/y/?]

CY82C693 chipset support (CONFIG_BLK_DEV_CY82C693) [N/y/?]

Cyrix CS5530 MediaGX chipset support (CONFIG_BLK_DEV_CS5530) [N/y/?]

HPT34X chipset support (CONFIG_BLK_DEV_HPT34X) [N/y/?]

HPT366 chipset support (CONFIG_BLK_DEV_HPT366) [N/y/?]

Intel PIIXn chipsets support (CONFIG_BLK_DEV_PIIX) [N/y/?]

NS87415 chipset support (EXPERIMENTAL) (CONFIG_BLK_DEV_NS87415) [N/y/?]

PROMISE PDC20246/PDC20262/PDC20267 support (CONFIG_BLK_DEV_PDC202XX) [N/y/?]

ServerWorks OSB4 chipset support (CONFIG_BLK_DEV_OSB4) [N/y/?]

SiS5513 chipset support (CONFIG_BLK_DEV_SIS5513) [N/y/?]

SLC90E66 chipset support (CONFIG_BLK_DEV_SLC90E66) [N/y/?]

Tekram TRM290 chipset support (EXPERIMENTAL) (CONFIG_BLK_DEV_TRM290) [N/y/?]

VIA82CXXX chipset support (CONFIG_BLK_DEV_VIA82CXXX) [N/y/?]

Other IDE chipset support (CONFIG_IDE_CHIPSETS) [N/y/?]

IGNORE word93 Validation BITS (CONFIG_IDEDMA_IVB) [N/y/?] (NEW)

*

* SCSI support

*

SCSI support (CONFIG_SCSI) [Y/m/n/?]

*

* SCSI support type (disk, tape, CD-ROM)

*

SCSI disk support (CONFIG_BLK_DEV_SD) [Y/m/n/?]

Maximum number of SCSI disks that can be loaded as modules (CONFIG_SD_EXTRA_DEVS) [40]

SCSI tape support (CONFIG_CHR_DEV_ST) [N/y/m/?]

-8- امنیت سرور لینوکس ٣

By: bl2k@shabgard.org Shabgard Security Teams

SCSI OnStream SC-x0 tape support (CONFIG_CHR_DEV_OSST) [N/y/m/?]

SCSI CD-ROM support (CONFIG_BLK_DEV_SR) [N/y/m/?]

SCSI generic support (CONFIG_CHR_DEV_SG) [N/y/m/?]

*

* Some SCSI devices (e.g. CD jukebox) support multiple LUNs

*

Enable extra checks in new queueing code (CONFIG_SCSI_DEBUG_QUEUES) [Y/n/?] n

Probe all LUNs on each SCSI device (CONFIG_SCSI_MULTI_LUN) [Y/n/?] n

Verbose SCSI error reporting (kernel size +=12K) (CONFIG_SCSI_CONSTANTS) [Y/n/?] n

SCSI logging facility (CONFIG_SCSI_LOGGING) [N/y/?]

*

* SCSI low-level drivers

*

3ware Hardware ATA-RAID support (CONFIG_BLK_DEV_3W_XXXX_RAID) [N/y/m/?]

7000FASST SCSI support (CONFIG_SCSI_7000FASST) [N/y/m/?]

ACARD SCSI support (CONFIG_SCSI_ACARD) [N/y/m/?]

Adaptec AHA152X/2825 support (CONFIG_SCSI_AHA152X) [N/y/m/?]

Adaptec AHA1542 support (CONFIG_SCSI_AHA1542) [N/y/m/?]

Adaptec AHA1740 support (CONFIG_SCSI_AHA1740) [N/y/m/?]

Adaptec AIC7xxx support (CONFIG_SCSI_AIC7XXX) [N/y/m/?] y

Enable Tagged Command Queueing (TCQ) by default (CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT)

[N/y/?] (NEW) y

Maximum number of TCQ commands per device (CONFIG_AIC7XXX_CMDS_PER_DEVICE) [8] (NEW)

Collect statistics to report in /proc (CONFIG_AIC7XXX_PROC_STATS) [N/y/?] (NEW)

Delay in seconds after SCSI bus reset (CONFIG_AIC7XXX_RESET_DELAY) [5] (NEW)

AdvanSys SCSI support (CONFIG_SCSI_ADVANSYS) [N/y/m/?]

Always IN2000 SCSI support (CONFIG_SCSI_IN2000) [N/y/m/?]

AM53/79C974 PCI SCSI support (CONFIG_SCSI_AM53C974) [N/y/m/?]

AMI MegaRAID support (CONFIG_SCSI_MEGARAID) [N/y/m/?]

BusLogic SCSI support (CONFIG_SCSI_BUSLOGIC) [N/y/m/?]

Compaq Fibre Channel 64-bit/66Mhz HBA support (CONFIG_SCSI_CPQFCTS) [N/y/m/?]

DMX3191D SCSI support (CONFIG_SCSI_DMX3191D) [N/y/m/?]

DTC3180/3280 SCSI support (CONFIG_SCSI_DTC3280) [N/y/m/?]

EATA ISA/EISA/PCI (DPT and generic EATA/DMA-compliant boards) support (CONFIG_SCSI_EATA)

[N/y/m/?]

EATA-DMA [Obsolete] (DPT, NEC, AT&T, SNI, AST, Olivetti, Alphatronix) support

(CONFIG_SCSI_EATA_DMA) [N/y/m/?]

EATA-PIO (old DPT PM2001, PM2012A) support (CONFIG_SCSI_EATA_PIO) [N/y/m/?]

Future Domain 16xx SCSI/AHA-2920A support (CONFIG_SCSI_FUTURE_DOMAIN) [N/y/m/?]

GDT SCSI Disk Array Controller support (CONFIG_SCSI_GDTH) [N/y/m/?]

Generic NCR5380/53c400 SCSI support (CONFIG_SCSI_GENERIC_NCR5380) [N/y/m/?]

IBM ServeRAID support (CONFIG_SCSI_IPS) [N/y/m/?]

Initio 9100U(W) support (CONFIG_SCSI_INITIO) [N/y/m/?]

Initio INI-A100U2W support (CONFIG_SCSI_INIA100) [N/y/m/?]

NCR53c406a SCSI support (CONFIG_SCSI_NCR53C406A) [N/y/m/?]

NCR53c7,8xx SCSI support (CONFIG_SCSI_NCR53C7xx) [N/y/m/?]

NCR53C8XX SCSI support (CONFIG_SCSI_NCR53C8XX) [N/y/m/?]

SYM53C8XX SCSI support (CONFIG_SCSI_SYM53C8XX) [Y/m/n/?] n

PAS16 SCSI support (CONFIG_SCSI_PAS16) [N/y/m/?]

PCI2000 support (CONFIG_SCSI_PCI2000) [N/y/m/?]

PCI2220i support (CONFIG_SCSI_PCI2220I) [N/y/m/?]

PSI240i support (CONFIG_SCSI_PSI240I) [N/y/m/?]

Qlogic FAS SCSI support (CONFIG_SCSI_QLOGIC_FAS) [N/y/m/?]

Qlogic ISP SCSI support (CONFIG_SCSI_QLOGIC_ISP) [N/y/m/?]

Qlogic ISP FC SCSI support (CONFIG_SCSI_QLOGIC_FC) [N/y/m/?]

Qlogic QLA 1280 SCSI support (CONFIG_SCSI_QLOGIC_1280) [N/y/m/?]

Seagate ST-02 and Future Domain TMC-8xx SCSI support (CONFIG_SCSI_SEAGATE) [N/y/m/?]

Simple 53c710 SCSI support (Compaq, NCR machines) (CONFIG_SCSI_SIM710) [N/y/m/?]

Symbios 53c416 SCSI support (CONFIG_SCSI_SYM53C416) [N/y/m/?]

Tekram DC390(T) and Am53/79C974 SCSI support (CONFIG_SCSI_DC390T) [N/y/m/?]

Trantor T128/T128F/T228 SCSI support (CONFIG_SCSI_T128) [N/y/m/?]

UltraStor 14F/34F support (CONFIG_SCSI_U14_34F) [N/y/m/?]

-9- امنیت سرور لینوکس ٣

By: bl2k@shabgard.org Shabgard Security Teams

UltraStor SCSI support (CONFIG_SCSI_ULTRASTOR) [N/y/m/?]

*

* I2O device support

*

I2O support (CONFIG_I2O) [N/y/m/?]

*

* Network device support

*

Network device support (CONFIG_NETDEVICES) [Y/n/?]

*

* ARCnet devices

*

ARCnet support (CONFIG_ARCNET) [N/y/m/?]

Dummy net driver support (CONFIG_DUMMY) [M/n/y/?]

Bonding driver support (CONFIG_BONDING) [N/y/m/?]

EQL (serial line load balancing) support (CONFIG_EQUALIZER) [N/y/m/?]

Universal TUN/TAP device driver support (CONFIG_TUN) [N/y/m/?]

General Instruments Surfboard 1000 (CONFIG_NET_SB1000) [N/y/m/?]

*

* Ethernet (10 or 100Mbit)

*

Ethernet (10 or 100Mbit) (CONFIG_NET_ETHERNET) [Y/n/?]

3COM cards (CONFIG_NET_VENDOR_3COM) [N/y/?]

AMD LANCE and PCnet (AT1500 and NE2100) support (CONFIG_LANCE) [N/y/m/?]

Western Digital/SMC cards (CONFIG_NET_VENDOR_SMC) [N/y/?]

Racal-Interlan (Micom) NI cards (CONFIG_NET_VENDOR_RACAL) [N/y/?]

DEPCA, DE10x, DE200, DE201, DE202, DE422 support (CONFIG_DEPCA) [N/y/m/?]

HP 10/100VG PCLAN (ISA, EISA, PCI) support (CONFIG_HP100) [N/y/m/?]

Other ISA cards (CONFIG_NET_ISA) [N/y/?]

EISA, VLB, PCI and on board controllers (CONFIG_NET_PCI) [Y/n/?]

AMD PCnet32 PCI support (CONFIG_PCNET32) [N/y/m/?]

Apricot Xen-II on board Ethernet (CONFIG_APRICOT) [N/y/m/?]

CS89x0 support (CONFIG_CS89x0) [N/y/m/?]

DECchip Tulip (dc21x4x) PCI support (CONFIG_TULIP) [N/y/m/?]

Generic DECchip & DIGITAL EtherWORKS PCI/EISA (CONFIG_DE4X5) [N/y/m/?]

Digi Intl. RightSwitch SE-X support (CONFIG_DGRS) [N/y/m/?]

EtherExpressPro/100 support (CONFIG_EEPRO100) [Y/m/n/?]

National Semiconductor DP83810 series PCI Ethernet support (CONFIG_NATSEMI) [N/y/m/?]

PCI NE2000 and clones support (see help) (CONFIG_NE2K_PCI) [N/y/m/?]

RealTek RTL-8139 PCI Fast Ethernet Adapter support (CONFIG_8139TOO) [N/y/m/?]

SiS 900/7016 PCI Fast Ethernet Adapter support (CONFIG_SIS900) [N/y/m/?]

SMC EtherPower II (CONFIG_EPIC100) [N/y/m/?]

Sundance Alta support (CONFIG_SUNDANCE) [N/y/m/?]

TI ThunderLAN support (CONFIG_TLAN) [N/y/m/?]

VIA Rhine support (CONFIG_VIA_RHINE) [N/y/m/?]

Winbond W89c840 Ethernet support (CONFIG_WINBOND_840) [N/y/m/?]

Sun Happy Meal 10/100baseT PCI support (CONFIG_HAPPYMEAL) [N/y/m/?]

Pocket and portable adapters (CONFIG_NET_POCKET) [N/y/?]

*

* Ethernet (1000 Mbit)

*

Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit support (CONFIG_ACENIC) [N/y/m/?]

Packet Engines Hamachi GNIC-II support (CONFIG_HAMACHI) [N/y/m/?]

SysKonnect SK-98xx support (CONFIG_SK98LIN) [N/y/m/?]

FDDI driver support (CONFIG_FDDI) [N/y/?]

PPP (point-to-point protocol) support (CONFIG_PPP) [N/y/m/?]

SLIP (serial line) support (CONFIG_SLIP) [N/y/m/?]

*

* Wireless LAN (non-hamradio)

*

Wireless LAN (non-hamradio) (CONFIG_NET_RADIO) [N/y/?]

*

-10- امنیت سرور لینوکس ٣

By: bl2k@shabgard.org Shabgard Security Teams

* Token Ring devices

*

Token Ring driver support (CONFIG_TR) [N/y/?]

Fibre Channel driver support (CONFIG_NET_FC) [N/y/?]

*

* Wan interfaces

*

Wan interfaces support (CONFIG_WAN) [N/y/?]

*

* Amateur Radio support

*

Amateur Radio support (CONFIG_HAMRADIO) [N/y/?]

*

* IrDA (infrared) support

*

IrDA subsystem support (CONFIG_IRDA) [N/y/m/?]

*

* ISDN subsystem

*

ISDN support (CONFIG_ISDN) [N/y/m/?]

*

* Old CD-ROM drivers (not SCSI, not IDE)

*

Support non-SCSI/IDE/ATAPI CDROM drives (CONFIG_CD_NO_IDESCSI) [N/y/?]

*

* Input core support

*

Input core support (CONFIG_INPUT) [N/y/m/?]

*

* Character devices

*

Virtual terminal (CONFIG_VT) [Y/n/?]

Support for console on virtual terminal (CONFIG_VT_CONSOLE) [Y/n/?]

Standard/generic (8250/16550 and compatible UARTs) serial support (CONFIG_SERIAL) [Y/m/n/?]

Support for console on serial port (CONFIG_SERIAL_CONSOLE) [N/y/?]

Extended dumb serial driver options (CONFIG_SERIAL_EXTENDED) [N/y/?]

Non-standard serial port support (CONFIG_SERIAL_NONSTANDARD) [N/y/?]

Unix98 PTY support (CONFIG_UNIX98_PTYS) [Y/n/?]

Maximum number of Unix98 PTYs in use (0-2048) (CONFIG_UNIX98_PTY_COUNT) [256] 128

*

* I2C support

*

I2C support (CONFIG_I2C) [N/y/m/?]

*

* Mice

*

Bus Mouse Support (CONFIG_BUSMOUSE) [N/y/m/?]

Mouse Support (not serial and bus mice) (CONFIG_MOUSE) [Y/m/n/?]

PS/2 mouse (aka "auxiliary device") support (CONFIG_PSMOUSE) [Y/n/?]

C&T 82C710 mouse port support (as on TI Travelmate) (CONFIG_82C710_MOUSE) [N/y/m/?]

PC110 digitizer pad support (CONFIG_PC110_PAD) [N/y/m/?]

*

* Joysticks

*

*

* Input core support is needed for joysticks

*

QIC-02 tape support (CONFIG_QIC02_TAPE) [N/y/m/?]

*

* Watchdog Cards

*

Watchdog Timer Support (CONFIG_WATCHDOG) [N/y/?]

-11- امنیت سرور لینوکس ٣

By: bl2k@shabgard.org Shabgard Security Teams

Intel i8x0 Random Number Generator support (CONFIG_INTEL_RNG) [N/y/m/?]

/dev/nvram support (CONFIG_NVRAM) [N/y/m/?]

Enhanced Real Time Clock Support (CONFIG_RTC) [N/y/m/?]

Double Talk PC internal speech card support (CONFIG_DTLK) [N/y/m/?]

Siemens R3964 line discipline (CONFIG_R3964) [N/y/m/?]

Applicom intelligent fieldbus card support (CONFIG_APPLICOM) [N/y/m/?]

*

* Ftape, the floppy tape device driver

*

Ftape (QIC-80/Travan) support (CONFIG_FTAPE) [N/y/m/?]

/dev/agpgart (AGP Support) (CONFIG_AGP) [Y/m/n/?] n

Direct Rendering Manager (XFree86 DRI support) (CONFIG_DRM) [Y/n/?] n

*

* Multimedia devices

*

Video For Linux (CONFIG_VIDEO_DEV) [N/y/m/?]

*

* File systems

*

Quota support (CONFIG_QUOTA) [N/y/?]

Kernel automounter support (CONFIG_AUTOFS_FS) [N/y/m/?]

Kernel automounter version 4 support (also supports v3) (CONFIG_AUTOFS4_FS) [Y/m/n/?] n

DOS FAT fs support (CONFIG_FAT_FS) [N/y/m/?]

Compressed ROM file system support (CONFIG_CRAMFS) [N/y/m/?]

Simple RAM-based file system support (CONFIG_RAMFS) [N/y/m/?]

ISO 9660 CDROM file system support (CONFIG_ISO9660_FS) [Y/m/n/?] m

Microsoft Joliet CDROM extensions (CONFIG_JOLIET) [N/y/?]

Minix fs support (CONFIG_MINIX_FS) [N/y/m/?]

NTFS file system support (read only) (CONFIG_NTFS_FS) [N/y/m/?]

OS/2 HPFS file system support (CONFIG_HPFS_FS) [N/y/m/?]

/proc file system support (CONFIG_PROC_FS) [Y/n/?]

/dev/pts file system for Unix98 PTYs (CONFIG_DEVPTS_FS) [Y/n/?]

ROM file system support (CONFIG_ROMFS_FS) [N/y/m/?]

Second extended fs support (CONFIG_EXT2_FS) [Y/m/n/?]

System V and Coherent file system support (read only) (CONFIG_SYSV_FS) [N/y/m/?]

UDF file system support (read only) (CONFIG_UDF_FS) [N/y/m/?]

UFS file system support (read only) (CONFIG_UFS_FS) [N/y/m/?]

*

* Network File Systems

*

Coda file system support (advanced network fs) (CONFIG_CODA_FS) [N/y/m/?]

NFS file system support (CONFIG_NFS_FS) [Y/m/n/?] n

NFS server support (CONFIG_NFSD) [Y/m/n/?] n

SMB file system support (to mount Windows shares etc.) (CONFIG_SMB_FS) [N/y/m/?]

NCP file system support (to mount NetWare volumes) (CONFIG_NCP_FS) [N/y/m/?]

*

* Partition Types

*

Advanced partition selection (CONFIG_PARTITION_ADVANCED) [N/y/?]

*

* Console drivers

*

VGA text console (CONFIG_VGA_CONSOLE) [Y/n/?]

Video mode selection support (CONFIG_VIDEO_SELECT) [N/y/?]

*

* Sound

*

Sound card support (CONFIG_SOUND) [Y/m/n/?] n

*

(Security options will appear only if you are patched your kernel with the Openwall Project patch).

* Security options

*

-12- امنیت سرور لینوکس ٣

By: bl2k@shabgard.org Shabgard Security Teams

Non-executable user stack area (CONFIG_SECURE_STACK) [Y]

Autodetect and emulate GCC trampolines (CONFIG_SECURE_STACK_SMART) [Y]

Restricted links in /tmp (CONFIG_SECURE_LINK) [Y] n

Restricted FIFOs in /tmp (CONFIG_SECURE_FIFO) [Y]

Restricted /proc (CONFIG_SECURE_PROC) [N] y

Special handling of fd 0, 1, and 2 (CONFIG_SECURE_FD_0_1_2) [Y]

Enforce RLIMIT_NPROC on execve(2) (CONFIG_SECURE_RLIMIT_NPROC) [Y]

Destroy shared memory segments not in use (CONFIG_SECURE_SHM) [N]

*

* USB support

*

Support for USB (CONFIG_USB) [Y/m/n/?] n

*

* Kernel hacking

*

Magic SysRq key (CONFIG_MAGIC_SYSRQ) [N/y/?]

*** End of Linux kernel configuration.

*** Check the top-level Makefile for additional configuration.

*** Next, you must run 'make dep'.

حال می رسیم به کامپایل بعد از مراحل بالا به شکل زیر:

[root@tango linux]# make dep; make clean; make bzImage

حال آرنل به صورت فشرده شده آماده نصب می باشد

توجه:

بعد از اتمام مرحله فوق در روش بعدی باید استفاده از مدولهای موجود برای کرنل را فعال سازیم در صورتی که به

انتخاب

Enable loadable module support (CONFIG_MODULES)

جواب بلی داده اید. Modularized kernel در قسمت

[root@tango linux]# make modules

[root@tango linux]# make modules_install

برای نصب کرنل آماده شده مراحل زیر را دنبال می کنیم:

[root@tango /]# cd /usr/src/linux/

[root@tango linux]# cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.5

گام دوم:

[root@tango /]# cd /usr/src/linux/

[root@tango linux]# cp System.map /boot/System.map-2.4.5

گام سوم:

[root@tango linux]# cd /boot/

[root@tango /boot]# ln -fs vmlinuz-2.4.5 vmlinuz

[root@tango /boot]# ln -fs System.map-2.4.5 System.map

گام پنجم:

[root@tango /]# cd /boot/

[root@tango /boot]# rm –f module-info

[root@tango /boot]# rm –f initrd-2.4.x.img

گام ششم:

[root@tango /]# cd /usr/src/linux/

[root@tango linux]# cp -r include/asm-generic ../linux-2.4.5/include/

[root@tango linux]# cp -r include/asm-i386 ../linux-2.4.5/include/

[root@tango linux]# cp -r include/linux ../linux-2.4.5/include/

[root@tango linux]# cd ../

[root@tango src]# rm -rf /usr/src/linux

[root@tango src]# cd /usr/src/

[root@tango src]# ln -s /usr/src/linux-2.4.5 linux

-13- امنیت سرور لینوکس ٣

By: bl2k@shabgard.org Shabgard Security Teams

رو به شکل زیر تغییر می دهیم lilo و در پایان فایل

[root@tango /]# vi /etc/lilo.conf

boot=/dev/sda

map=/boot/map

install=/boot/boot.b

timeout=00 default=linux

restricted

password=somepasswd

image=/boot/vmlinuz

label=linux read-only

root=/dev/sda6

برای ثبت تغییرات:

[root@tango /]# /sbin/lilo -v

LILO version 21.4-4, copyright © 1992-1998 Wernerr Almesberger ‘lba32’ extentions

copyright © 1999,2000 John Coffman

Reading boot sector from /dev/sda had : ATAPI 32X CD-ROM

drive, 128kB Cache Merging with /boot/boot.b Mapping

message file /boot/message Boot image : /boot/vmlinuz

Added linux * /boot/boot.0800 exists – no backup copy made.

Writing boot sector.

روش دوم در بخشهای بعدی توضیح داده خواهد شد

End Part 3

By : bl2k@shabgard.org

To be continue……

   + MOHSEN GHASEMI - ۱۱:٤٢ ‎ق.ظ ; ۱۳۸٩/۳/۳٠

آموزشBlueJ

<!-- /* Font Definitions */ @font-face {font-family:Helvetica; panose-1:2 11 5 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Courier; panose-1:2 7 4 9 2 2 5 2 4 4; mso-font-alt:"Courier New"; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tms Rmn"; panose-1:2 2 6 3 4 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Helv; panose-1:2 11 6 4 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"New York"; panose-1:2 4 5 3 6 5 6 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:System; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MS Mincho"; panose-1:2 2 6 9 4 2 5 8 3 4; mso-font-alt:"MS 明朝"; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Batang; panose-1:2 3 6 0 0 1 1 1 1 1; mso-font-alt:바탕; mso-font-charset:129; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimSun; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:宋体; mso-font-charset:134; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:PMingLiU; panose-1:2 1 6 1 0 1 1 1 1 1; mso-font-alt:新細明體; mso-font-charset:136; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:"MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-alt:"MS ゴシック"; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Dotum; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:돋움; mso-font-charset:129; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimHei; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:黑体; mso-font-charset:134; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:MingLiU; panose-1:2 1 6 9 0 1 1 1 1 1; mso-font-alt:細明體; mso-font-charset:136; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:Mincho; panose-1:2 2 6 9 4 3 5 8 3 5; mso-font-alt:明朝; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Gulim; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:굴림; mso-font-charset:129; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:Century; panose-1:2 4 6 3 5 7 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Angsana New"; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:"Cordia New"; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:Mangal; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:32768 0 0 0 0 0;} @font-face {font-family:Latha; panose-1:2 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1048576 0 0 0 0 0;} @font-face {font-family:Sylfaen; panose-1:1 10 5 2 5 3 6 3 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:67110535 0 0 0 159 0;} @font-face {font-family:Vrinda; panose-1:1 1 6 0 1 1 1 1 1 1; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:65539 0 0 0 1 0;} @font-face {font-family:Raavi; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131072 0 0 0 0 0;} @font-face {font-family:Shruti; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:262144 0 0 0 0 0;} @font-face {font-family:Sendnya; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Gautami; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:2097152 0 0 0 0 0;} @font-face {font-family:Tunga; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:4194304 0 0 0 0 0;} @font-face {font-family:"Estrangelo Edessa"; panose-1:3 8 6 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:-2147459008 0 128 0 0 0;} @font-face {font-family:"Arial Unicode MS"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Tahoma; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627421319 -2147483648 8 0 66047 0;} @font-face {font-family:TimesNewRoman; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"TimesNewRoman\,Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-alt:"Times New Roman"; mso-font-charset:178; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:"Arial\,Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Arial\,BoldItalic"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Adobe Caslon Pro Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Caslon Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Garamond Pro Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Garamond Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Arno Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Caption"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro SmText"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Subhead"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Light Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Caption"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd SmText"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Subhead"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bell Gothic Std Black"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bell Gothic Std Light"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bickham Script Pro Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:script; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:"Bickham Script Pro Semibold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:script; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:"Birch Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Blackoak Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Brush Script Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Chaparral Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Charlemagne Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Cooper Std Black"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eccentric Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Garamond Premr Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Garamond Premr Pro Smbd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Giddyup Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Hobo Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Kozuka Gothic Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Letter Gothic Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Lithos Pro Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Mesquite Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Minion Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro Med"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro SmBd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro Light"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Nueva Std Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"OCR A Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Orator Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Poplar Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Prestige Elite Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rosewood Std Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Stencil Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tekton Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Tekton Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Tekton Pro Ext"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Trajan Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:Marlett; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Lucida Console"; panose-1:2 11 6 9 4 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-2147482993 6144 0 0 31 0;} @font-face {font-family:"Lucida Sans Unicode"; panose-1:2 11 6 2 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-2147476737 14699 0 0 63 0;} @font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"Arial Black"; panose-1:2 11 10 4 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Comic Sans MS"; panose-1:3 15 7 2 3 3 2 2 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Impact; panose-1:2 11 8 6 3 9 2 5 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Georgia; panose-1:2 4 5 2 5 4 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Medium"; panose-1:2 11 6 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Palatino Linotype"; panose-1:2 4 5 2 5 5 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870009 1073741843 0 0 415 0;} @font-face {font-family:"Trebuchet MS"; panose-1:2 11 6 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Webdings; panose-1:5 3 1 2 1 5 9 6 7 3; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MV Boli"; panose-1:2 0 5 0 3 2 0 9 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 0 256 0 0 0;} @font-face {font-family:AngsanaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:BrowalliaUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:"Browallia New"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:CordiaUPC; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:DilleniaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:EucrosiaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:FreesiaUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:IrisUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:JasmineUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:KodchiangUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:LilyUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:Aharoni; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:David; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"David Transparent"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:FrankRuehl; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Levenim MT"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Miriam; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Miriam Transparent"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Miriam Fixed"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Fixed Miriam Transparent"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Narkisim; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Rod; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Rod Transparent"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Traditional Arabic"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:24577 0 0 0 64 0;} @font-face {font-family:"Arabic Transparent"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:Andalus; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:24577 0 0 0 64 0;} @font-face {font-family:"Simplified Arabic"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:"Simplified Arabic Fixed"; panose-1:2 1 0 9 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:Kartika; panose-1:2 2 5 3 3 4 4 6 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:8388611 0 0 0 1 0;} @font-face {font-family:"\@MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:FantasyMatrix; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:FantasyMatrixSmall; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Jokerman Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"University Roman Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Smudger Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"HolidayPi BT"; panose-1:5 12 1 2 1 2 9 2 2 2; mso-font-charset:2; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"OldDreadfulNo7 BT"; panose-1:4 8 8 5 6 1 7 1 8 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"MisterEarl BT"; panose-1:3 8 8 2 2 3 2 2 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Calligraph421 BT"; panose-1:3 6 7 2 5 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Blackletter686 BT"; panose-1:3 4 8 2 2 6 8 4 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Cataneo BT"; panose-1:3 2 8 2 4 5 2 6 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Staccato222 BT"; panose-1:3 9 7 2 3 4 7 2 4 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"ParkAvenue BT"; panose-1:3 2 6 2 5 5 6 8 7 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Square721 BT"; panose-1:2 11 5 4 2 2 2 6 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Broadway BT"; panose-1:4 4 9 5 8 11 2 2 5 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Microsoft Sans Serif"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627421663 -2147483648 8 0 66047 0;} @font-face {font-family:"Scruff LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Odessa LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Highlight LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"One Stroke Script LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Mekanik LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Tiranti Solid LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Pump Demi Bold LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Quixley LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"La Bamba LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Rage Italic LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Ruach LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Westwood LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Smudger LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Milano LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Victorian LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"University Roman LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Academy Engraved LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Orange LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"John Handy LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Jokerman LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Agency FB"; panose-1:2 11 5 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Arial Narrow"; panose-1:2 11 5 6 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arial Rounded MT Bold"; panose-1:2 15 7 4 3 5 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Blackadder ITC"; panose-1:4 2 5 5 5 16 7 2 13 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT"; panose-1:2 7 6 3 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT Black"; panose-1:2 7 10 3 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT Condensed"; panose-1:2 7 6 6 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Book Antiqua"; panose-1:2 4 6 2 5 3 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bookman Old Style"; panose-1:2 5 6 4 5 5 5 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bradley Hand ITC"; panose-1:3 7 4 2 5 3 2 3 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Calisto MT"; panose-1:2 4 6 3 5 5 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Castellar; panose-1:2 10 4 2 6 4 6 1 3 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Century Gothic"; panose-1:2 11 5 2 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Century Schoolbook"; panose-1:2 4 6 4 5 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Copperplate Gothic Bold"; panose-1:2 14 7 5 2 2 6 2 4 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Copperplate Gothic Light"; panose-1:2 14 5 7 2 2 6 2 4 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Curlz MT"; panose-1:4 4 4 4 5 7 2 2 2 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Edwardian Script ITC"; panose-1:3 3 3 2 4 7 7 13 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Elephant; panose-1:2 2 9 4 9 5 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Engravers MT"; panose-1:2 9 7 7 8 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Bold ITC"; panose-1:2 11 9 7 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Demi ITC"; panose-1:2 11 8 5 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Light ITC"; panose-1:2 11 4 2 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Medium ITC"; panose-1:2 11 6 2 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Felix Titling"; panose-1:4 6 5 5 6 2 2 2 10 4; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Forte; panose-1:3 6 9 2 4 5 2 7 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Franklin Gothic Book"; panose-1:2 11 5 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Demi"; panose-1:2 11 7 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Demi Cond"; panose-1:2 11 7 6 3 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Heavy"; panose-1:2 11 9 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Medium Cond"; panose-1:2 11 6 6 3 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"French Script MT"; panose-1:3 2 4 2 4 6 7 4 6 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Garamond; panose-1:2 2 4 4 3 3 1 1 8 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Gigi; panose-1:4 4 5 4 6 16 7 2 13 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Gill Sans MT Ext Condensed Bold"; panose-1:2 11 9 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans MT"; panose-1:2 11 5 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans MT Condensed"; panose-1:2 11 5 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans Ultra Bold"; panose-1:2 11 10 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans Ultra Bold Condensed"; panose-1:2 11 10 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gloucester MT Extra Condensed"; panose-1:2 3 8 8 2 6 1 1 1 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Goudy Old Style"; panose-1:2 2 5 2 5 3 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Goudy Stout"; panose-1:2 2 9 4 7 3 11 2 4 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Haettenschweiler; panose-1:2 11 7 6 4 9 2 6 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Imprint MT Shadow"; panose-1:4 2 6 5 6 3 3 3 2 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"MS Outlook"; panose-1:5 1 1 0 1 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Maiandra GD"; panose-1:2 14 5 2 3 3 8 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Monotype Corsiva"; panose-1:3 1 1 1 1 2 1 1 1 1; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"OCR A Extended"; panose-1:2 1 5 9 2 1 2 1 3 3; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Palace Script MT"; panose-1:3 3 3 2 2 6 7 12 11 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Papyrus; panose-1:3 7 5 2 6 5 2 3 2 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Perpetua; panose-1:2 2 5 2 6 4 1 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Perpetua Titling MT"; panose-1:2 2 5 2 6 5 5 2 8 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Pristina; panose-1:3 6 4 2 4 4 6 8 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rage Italic"; panose-1:3 7 5 2 4 5 7 7 3 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Rockwell; panose-1:2 6 6 3 2 2 5 2 4 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rockwell Condensed"; panose-1:2 6 6 3 5 4 5 2 1 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rockwell Extra Bold"; panose-1:2 6 9 3 4 5 5 2 4 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Script MT Bold"; panose-1:3 4 6 2 4 6 7 8 9 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tw Cen MT"; panose-1:2 11 6 2 2 1 4 2 6 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Tw Cen MT Condensed"; panose-1:2 11 6 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Wingdings 2"; panose-1:5 2 1 2 1 5 7 7 7 7; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Wingdings 3"; panose-1:5 4 1 2 1 8 7 7 7 7; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Bookshelf Symbol 7"; panose-1:5 1 1 1 1 1 1 1 1 1; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Lucida Sans"; panose-1:2 11 6 2 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Lucida Sans Typewriter"; panose-1:2 11 5 9 3 5 4 3 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"MS Reference Sans Serif"; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"MS Reference Specialty"; panose-1:5 0 5 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Tw Cen MT Condensed Extra Bold"; panose-1:2 11 8 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:ZWAdobeF; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:536885895 0 0 0 511 0;} @font-face {font-family:"Euro Sign"; panose-1:2 11 6 3 2 2 1 2 1 1; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 2 0 0 1 0;} @font-face {font-family:"Lucida Bright"; panose-1:2 4 6 3 7 5 5 2 4 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} ins {mso-style-type:export-only; text-decoration:none;} span.msoIns {mso-style-type:export-only; mso-style-name:""; text-decoration:underline; text-underline:single;} span.msoDel {mso-style-type:export-only; mso-style-name:""; text-decoration:line-through; color:aqua;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

١

BlueJ آموزش

Persian Translator: Mehdi shahdoost

Persian Support by: JEIC SOFT (Jafzar Engineering and Investigation Company)

Michael Kölling

Mærsk Institute

University of Southern Denmark

٢

فهرست مطالب صفحه

فصل ا – مقدمه

۵ ............................................................................................................BlueJ ١ ) درباره -١

٢ ) مطالب پوشش داده شده توسط کتاب و خوانندگان ............................................................................ ۵ -١

٣ ) حق تالیف ، لیسانس و توزیع مجدد .............................................................................................. ۵ -١

۴ ) بازتاب و واکنش شما ................................................................................................................ ۵ -١

فصل ٢ – نصب کردن ۶

١ ) نصب در ویندوز ........................................................................................................ ۶ -٢

٢ ) نصب در مکینتاش ..................................................................................................... ٧ -٢

٣) نصب در لینوکس / یونیکس و سیستم های دیگر............................................................... ٧ -٢

۴ ) مشکلات نصب کردن ................................................................................................ ٧ -٢

فصل ٣ – شروع کردن ( ویرایش کردن- کامپایل کردن – اجرایی کردن ) ٨

٨ ......................................................................................................BlueJ ١) شروع -٣

٢) باز کردن پروژه ..................................................................................................... ٩ -٣

٣) ایجاد اشیا ............................................................................................................. ٩ -٣

۴) اجرایی کردن ....................................................................................................... ١١ -٣

۵) ویرایش کلاس ها ................................................................................................... ١٣ -٣

۶) کامپایل کردن ........................................................................................................ ١۴ -٣

٧) راهنمایی با استفاده از خطاهایی کامپایلر .................................................................... ١۵ -٣

فصل ۴ – انجام کارهای بیشتر ١۶

١) بررسی کردن و بازبینی ......................................................................................... ١۶ -۴

٢) ارسال اشیا به عنوان پارامترها .............................................................................. ١٨ -۴

٣

فصل ۵ – ایجاد یک پروژه جدید ٢٠

١) ایجاد پوشه پروژه .............................................................................................. ٢٠ -۵

٢) ایجاد کلاس ها ................................................................................................... ٢٠ -۵

٣) ایجاد وابسته ها .................................................................................................. ٢٠ -۵

٢١ ..........................................................................(elements) ۴ ) جابجا کردن عناصر -۵

فصل ۶ – استفاده از محیط کدنویسی ٢٢

٢٢ ...........................................................................................code pad ١ ) نمایش -۶

٢) ارزیابی عبارات ساده ......................................................................................... ٢٢ -۶

٣) دریافت اشیا .................................................................................................... ٢٣ -۶

۴) بررسی اشیا ................................................................................................... ٢۴ -۶

۵) اجرایی کردن دستورات ...................................................................................... ٢۴ -۶

۶) دستورات چند خطی و توالی دستورات .................................................................. ٢۴ -۶

٧) کار با متغییرها ............................................................................................... ٢۴ -۶

٨) تاریخچه دستورات .......................................................................................... ٢۵ -۶

فصل ٧ – برطرف کردن خطاها ٢۶

ها ............................................................................. ٢۶ Breakpoint ١) تنظیم کردن -٧

٢) عبور مرحله ای از میان کدها .............................................................................. ٢٨ -٧

٣) بررسی متغییرها .............................................................................................. ٢٨ -٧

۴) توقف کردن و تمام کردن ................................................................................... ٢٩ -٧

فصل ٨ – ایجاد برنامه های کاربردی ٣٠

فصل ٩ - ایجاد اپلت ها ٣٢

١) اجرا کردن اپلت ................................................................................................. ٣٢ -٩

٢) ایجاد کردن اپلت ................................................................................................ ٣٣ -٩

۴

٣) تست کردن اپلت ................................................................................................ ٣٣ -٩

فصل ١٠ - اعمال دیگر ٣۴

٣۴ ............................................................BlueJ در BlueJ ١) باز کردن پکیج های غیر -١٠

٢) اضافه کردن کلاس های موجود به پروژه تان .......................................................... ٣۴ -١٠

٣۴ ......................................................................main ٣) فراخوانی متدهای استاتیک و -١٠

٣۵ ........................................................................(Documentation ) ۴) تولید اسناد -١٠

۵) کار با کتابخانه ها .............................................................................................. ٣۵ -١٠

۶) ایجاد اشیا از کلاس های کتابخانه ای ..................................................................... ٣۵ -١٠

فصل ١١ – فقط خلاصه ها ٣۶

Copyright © M. Kölling

۵

مقدمه

BlueJ ١ ) درباره -١

محیط توسعه جاوا میباشد که به طور ویژه BlueJ . میباشد BlueJ این اموزش مقدمه ای برای استفاده از محیط برنامه نویسی

Deakin برای آموزش جاوا در سطوح مقدماتی طراحی شده است. این نرم افزار توسط تیم طراحی و پیاده ساز در دانشگاه

شهر کانتربری انگلستان ایجاد شده است. (Kent ) شهر ملبورن استرالیا و همچنین دانشگاه کنت

برای بدست آوردن اطلاعات بیشتر به وب سایت این نرم افزار به آدرس زیر مراجعه نمایید :

Http://www.bluej.org

٢) مطالب پوشش داده شده و خوانندگان کتاب -١

این آموزش برای تعلیم دادن جاوا نمی باشد و در اصل محیطی برای اموزش جاوا می باشد.

٣ ) حق تالیف ، لیسانس و توزیع مجدد -١

برای استفاده های شخصی و غیر تجاری بصورت رایگان (as-is) و همچنین این آموزش همانگونه که هستند BlueJ نرم افزار

در اختیار قرار دارد. BlueJ ارائه می شوند. حق تالیف

۴) بازتاب و واکنش شما -١

باعث خوشحالی و تشویق ما BlueJ نظرات ، سوالات ، اصلاحات و انتقادات شما در خصوص نرم افزار و یا اموزش

به آدرس زیر : ( Michael Kolling) خواهد شد. لطفا میل کنید به مایکل کولینگ

mik@mip.sdu.dk

۵) سخن مترجم -١

می باشد.که در سایت رسمی این نرم افزار موجود BlueJ آموزشی که هماکنون در اختیار دارید ترجمه متن انگلیسی آموزش

است. البته این متن ترجمه لغت به لغت آموزش انگلیسی نرم افزار نیست بلکه برداشتی آزاد از آن متن است که کوشش شده

تمام متن اصلی را پوشش دهد. امیدوارم که این اثر که از طرف شرکت تحقیقاتی و مهندسی جی افزار پشتیبانی می شود مقبول

شما برنامه نویسان و توسعه دهندگان ایرانی قرار بگیرد. در صورتی که شما دوستان عزیز کاستی در این اثر دیدید لطفاً

برای برطرف کردن آن در نسخه های بعدی این آموزش آنرا با استفاده از ایمیل زیر به بنده اطلاع دهید.

Persianshadow2003@yahoo.com

۶

فصل دوم - نصب کردن

در سه فرمت توزیع شده است: یکی برای سیستم عامل ویندوز ، یکی برای سیستم عامل مکینتاش و یک نسخه هم BlueJ

برای دیگر سیستم ها . مراحل نصب این نرم افزار کاملا سر راست و مشخص می باشد.

پیش نیازها :

یا نسخه های بالاتر را نصب داشته باشید. ما توصیه می کنیم که از نسخه های J2SE باید 1.4 BlueJ شما برای استفاده از

را ندارید. می توانید از طریق وب سایت شرکت سان آنرا بصورت (JDK) جاوا استفاده کنید. اگر شما جاوا (Beta ) غیر بتا

رایگان دریافت کنید. :

http://java.sun.com/j2se

آخرین نسخه جاوا بصورت پیش فرض نصب میباشد. و شما نیاز به نصب مجدد جاوا توسط MacOS X در سیستم عامل

را دانلود SDK برخورد کردید. شما باید SDK و یا JRE خودتان ندارید. در ضمن اگر در صفحه دانلود شما با دو پیشنهاد

کافی نمی باشد. JRE کنید. و

١ ) نصب برای ویندوز -٢

شماره نسخه xxx که کلمات . bluejsetup-xxx.exe : فایل توزیع شده برای سیستم عامل ویندوز با این نام می باشد

نسخه 2.0.0 بدین صورت BlueJ را مشخص می کند. به عنوان مثال فایل نصب کننده BlueJ

. bluejsetup-200.exe : میباشد

دریافت کنید. با استفاده از این BlueJ شما این فایل رو می توانید از طریق یک دیسک دریافت کرده و یا اینکه از وب سایت

در آن نصب شود مشخص کنید. همچنین این BlueJ . شما می توانید. پوشه ای را که قصد دارید ( installer) نصب کننده

در منوی شروع و دسکتاپ به شما ارائه می دهد. (shortcut) نصب کننده گزینه های برای نصب میانبر

نصب شده پیدا کنید. BlueJ را در پوشه ای که BlueJ.exe بعد از اینکه نصب تمام شد. شما می توانید برنامه

جستجو (JDK) کامپیوتر شما را برای پیدا کردن جاوا BlueJ . را اجرا کنید BlueJ اولین باری که شما برنامه

را روی سیستم شما پیدا کرد. ( JDK و 1.5 JDK می نماید. و اگر چند ورژن مناسب از جاوا ( به عنوان مثال 1.4

پنجره ای را باز می کند که شما می توانید یکی از آن نسخه های جاوا را انتخاب کنید.

را روی سیستم شما پیدا کند. مسیر آنرا از شما سوال خواهد کرد. ( دلیل این امر JDK . نتوانست BlueJ در ضمن اگر

ویندوز پاک شده باشد. Registry روی سیستم شما نصب شده باشد. ولی مقدار مورد نیاز از JDK می تواند این باشد که

را نصب می کند. و شما با استفاده از این برنامه می توانید نسخه vmselect.exe همچنین برنامه BlueJ نصب کننده

از آن استفاده می کند را تغییر دهید. BlueJ جاوایی که

٧

٢) نصب برای مکینتاش -٢

اجرا می شود. MacOS X تنها در BlueJ لطفاً توجه داشته باشید که

ها شماره نسخه نرم افزار را مشخص xxx ، نامیده می شوند blueJ-xxx.zip فایل های توزیع شده برای مکینتاش به شکل

میباشد.شما این فایل را BlueJ-200.zip فایل های توزیع شده اش بصورت ، blueJ می کنند.برای مثال نسخه 2.0.0

به آدرس زیر دانلود نمایید: BlueJ می توانید در یک دیسکت دریافت کرده و یا از وب سایت

http://www.bluej.org

بعد از دانلود فایل بصورت خودکار فایل را از حالت زیپ شده خارج می کند. واگر این کار صورت MacOS سیستم عامل

نگرفت.بر روی فایل دوبار کلیک کنید تا فایل از حالت زیپ خارج شود.

خواهید داشت. این پوشه را به پوشه BlueJ-xxx بعد از این که فایل از حالت فشرده خارج شد.شما پوشه ای با نام

برنامه های کاربردی تان منتقل نمایید( یا هر پوشه ای که تمایل دارید در آن نگه دارید).شما نیازی به نصب ندارید.

٣) نصب کردن برای لینوکس ، یونیکس و سیستم های دیگر -٢

خوانده می شود. که BlueJ-xxx.jar اجرایی می باشد. این فایل Jar فایل های عمومی توزیع شده برای اینکار یک فایل

BlueJ-200.jar با نام BlueJ شماره نسخه نرم افزار میباشد.به عنوان مثال فایل های توزیع شده 2.0.0 xxx در آن

به آدرس زیر دریافت نمایید: BlueJ مشخص می باشد. شما می توانید این فایل را در یک دیسکت و یا از طریق وب سایت

http://www.bluej.org

BlueJ-200.jar برنامه نصب کننده را با اجرای دستور زیر فراخوانی کنید. توجه: ما برای این مثال از فایل توزیع شده

استفاده کرده ایم –شما نیاز دارید تا از نام فایلی که در یافت کرده اید استفاده کنید.

< j2se-path>/bin/java -jar bluej-200.jar

نصب میباشد. پنجره ای باز می شود که به شما اجازه می دهد J2se مسیر پوشه ای میباشد که در آن < j2se-path>

می خواهید از آن استفاده کنید تعیین نمایید. دکمه BlueJ تا محل نصب برنامه و همچنین نسخه جاوای که برای اجرایی

بر روی سیستم شما نصب شده است. BlueJ ، را فشار دهید. بعد از اتمام Install

۴) اشکالات در نصب برنامه -٢

مراجعه کنید : BlueJ سایت FAQ اگر شما با مشکلی برخورد کردید. می توانید به بخش

http://www.bluej.org/help/faq.html

و یا اینکه بخش " پرسش برای کمک " را مطالعه نمایید:

http://www.bluej.org/help/ask-help.html

٨

فصل سوم - شروع کردن – ویرایش کردن – کامپایل کردن – اجرایی کردن

BlueJ ١ ) آغاز به کار با -٣

نصب شده . برای شروع شما باید این برنامه را اجرا کنید. BlueJ در سیستم عامل ویندوز و مکینتاش برنامه با نام

را نصب کرده که شما برای اجرای محیط گرافیکی BlueJ در سیستم های یونیکس برنامه نصب کننده اسکریپتی با نام

را با آرگومان و یا بدون آرگومان BlueJ روی این فایل دو بار کلیک کنید. در ضمن با استفاده از خط فرمان هم می توانید

فراخوانی کنید:

$ BlueJ

و با آرگومان :

$ BlueJ examples/people

باز شود هست. BlueJ منظور از ارگومان هم پروژه ای است که قصد دارید با

( BlueJ ( عکس ١ : پنجره اصلی برنامه

٩

٢ ) باز کردن پروژه -٣

را انتخاب نمایید. Open گزینه Project به طور خلاصه برای باز کردن پروژه از منوی

مانند پکیج های استاندارد جاوا از پوشه های که شامل فایل های پروژه هستند تشکیل شده است . BlueJ پروژه های

پروژه مورد نظر خود را باز کنید. Open و گزینه Project باز شد. با استفاده از منوی BlueJ بعد از اینکه برنامه

examples توزیع شده است که شما این پروژه های نمونه را می توانید در پوشه BlueJ چند پروژه نمونه به همراه

پیدا نمایید.

در پوشه ای example قرار دارد.باز کنید. پوشه example را که در پوشه People برای این بخش اموزش شما پروژه

نصب شده قرار دارد. بعد از اینکه شما پروژه را باز کردید. پنجره شما شبیه عکس ١ می شود. البته بر اساس BlueJ که

سیستم شما اختلافاتی وجود خواهد داشت.

٣) ایجاد اشیا -٣

خلاصه: برای ایجاد یک شی ، سازنده مربوطه را از منوی بازشونده کلاس انتخاب نمایید.

این است که شما می توانید بدون این که کل پروژه را اجرا نمایید. با یک شی از هر کلاس BlueJ یکی از اعمال پایه و ابتدایی در

معمولا با ایجاد یک شی و فراخوانی یکی از BlueJ در ارتباط بوده و متدهای عمومی انرا اجرا نمایید. مرحله اجرا کردن در

متدهای شی انجام می شود. این مورد در طول توسعه یک برنامه می تواند خیلی مفید باشد. شما می توانید کلاس های را که

می نویسید. به طور مجزا آزمایش کنید و نیازی به نوشتن کامل برنامه از ابتدا ندارد.

میباشد. main متد ، static می توانند بدون ایجاد شی از ابتدا اجرا شوند. نمونه ای از این متدهای Static نکته : متدهای

بنابراین ما می توانیم همچین کاری را انجام دهیم.همانگونه که در برنامه های کاربردی جاوا اتفاق می افتد. برای اجرا یک

را اجرا نماییم. main ، static برنامه کاربردی ، تنها کافیست تا متد

ما بعدا به این موضوع بر خواهیم گشت. ابتدا ما قصد داریم تا کارهای جالبی را انجام دهیم که به صورت عادی در جاوا

نمی توان انجام داد.

آیکون های هستند که (Database,person,staff,student ) مربع های که شما در وسط پنجره اصلی برنامه می بینید

بر ( Ctrl-click : کلاس های موجود در این پروژه را نمایش می دهند. شما می توانید با کلیک راست کردن ( در مکینتاش

( روی این آیکون ها منوی از عملیات موجود برای ان کلاس را بدست آورید. ( شکل ٢

١٠

به همراه سازنده های تعریف شده برای کلاس و همچنین دیگر اعمالی که new این اعمال نمایش داده شده شامل دستور

فراهم امده است. BlueJ توسط محیط

شکل ٢ : اعمال مربوط به کلاس ( منوی بازشونده کلاس )

کلیک راست کرده. ( همانند منوی Staff یک شی ایجاد نماییم. بنابراین بر روی آیکون Staff ما قصد داریم تا از کلاس

می باشد. یکی با پارامتر و یکی بدون Staff بازشونده شکل ٢). منوی نمایش داده شده شامل دو سازنده برای ساختن شی

پارامتر. ما در ابتدا سازنده بدون پارامتر را انتخاب می نماییم. پنجره نشان داده شده در شکل ٣ نمایش داده می شود.

١١

شکل ٣ : سازنده شی بدون پارامتر

موافقت می نماییم. (staff این پنجره نام شی زا که قصد دارید ایجاد کنید می پرسد.ما دراین زمان با نام پیش فرض ( 1

ایجاد می شود. Staff را فشار دهید.حالا شی از کلاس Ok این نام برای حالا مناسب می باشد. شما تنها کافیست دکمه

.( قرار می گیرد (شکل ۴ object bench هنگامی که شما شی را ایجاد کردید.شی در قسمت

object bench شکل ۴: شی قرار گرفته در قسمت

پس روش ایجاد شی : از منوی بازشونده کلاس سازنده را انتخاب کرده ، آنرا اجرا کنید. حالا شما یک شی در قسمت

علامت گذاری شده <<abstract>> با نشان Person خواهید داشت. شما باید دقت کنید که کلاس Object bench

نمی توانید یک شی ایجاد کنید abstract هست ) شما باید دقت کنید که شما از یک کلاس abstract ( یعنی کلاس

( همانگونه که در جاوا تعریف شده است )

۴) اجرا کردن -٣

خلاصه : برای ایجاد یک شی ، از منوی بازشونده شی متد مربوطه را انتخاب نمایید.

حالا که شما یک شی ایجاد کردید. شما می توانید عملیات عمومی را روی آن اجرا نمایید. روی آیکون شی کلیک راست کرده

تا منوی بازشونده شی نمایش داده شود(شکل ۵). منوی بازشونده متدهای موجود برای این شی را به همراه دو عملی که توسط

را نمایش می دهد. ما بعدا آنها را توضیح خواهیم داد .ابتدا اجازه (Inspect and Remove) توسعه یافته اند BlueJ محیط

دهید تا بر روی متدها تمرکز نماییم.

١٢

شکل ۵ : منوی شی

را مشاهده می نمایید.که هر کدام تنظیم می کند و بر می گردانند شماره getRoom و setRoom شما در آنجا متدهای

را فراخوانی نمایید. برای این کار از منوی بازشونده شی متد getRoom را. سعی کنید تا متد staff خانه مربوط به

( را انتخاب کنید تا اجرا شود. پنجره ای نمایش داده می شود که نتیجه این فراخوانی را به شما نمایش می دهد. (شکل ۶

این شخص room می باشد. زیرا ما یک نام خاص برای "unknown room" در این مورد ؛ نام برگشت داده شده

در نظر نگرفته ایم.

شکل ۶: نمایش نتیجه تابع

متدهای که از کلاس های دیر ارث برده اند در زیر منو موجود می باشند. در بالای منوی بازشونده شی دو زیر

. Person ارث برده اتد. و یکی برای متدهای که از کلاس Object منو موجود میباشد. یکی برای متدهای است که ازکلاس

را با انتخاب انها از زیر منو فراخوانی نمایید. این کار را انجام دهید. (getName : مانند ) Person شما میتوانید متدهای کلاس

میباشد. "unknown name" اگر توجه کنید خواهید دید که جواب تولید شده نام مشخص می باشد یعنی پاسخ برابر با

دلیل آن هم این است که ما به اشخاص مان نامی نداده ایم .

یک شماره تعیین کنیم. این کار به ما نشان می دهد که چگونه می توانیم (room) حالا به ما اجازه بدهید تا برای یک اتاق

١٣

فقط یک مقدار را بر می گرداند. اما پارامتر getName و getRoom یک فراخوانی با پارامتر داشته باشیم. ( فراخوانی

را با انتخاب آن از منو فراخوانی نمایید. پنجره ای باز می شود که به شما اجازه می دهد setRoom پارامتر پذیر نیست ) تابع

( تا پارامتر را وارد نمایید ( شکل ٧

شکل ٧ : پنجره فراخوانی تابع با پارامتر

در بالای پنجره ای که نمایش داده می شود. رابط متد فراخوانی شده نمایش داده می شود.(شامل کامنت و امضا متد )

در زیر این قسمت محل ورود متن می باشد که شما با استفاده از ان می توانید پارامتر مربوطه را وارد نمایید.

امضا متد که در قسمت بالای پنجره قرار دارد. به ما می گوید که شما یک پارامتر از نوع رشته دارید.

را فشار دهید. Ok یک اتاق جدید از نوع رشته ( شامل کوتیشن ها ) در محل ورود متن وارد نماید و دکمه

این متد مقدار بازگشتی ندارد و در نتیجه پنجره ای به عنوان نتیجه باز نخواهد شد.بلکه برای این که شما تغییرات

را فراخوانی نمایید. getRoom را ببینید باید یکبار دیگر متد

سعی کنید اشیای را ایجاد کنید و متدهای انها را فراخوانی نمایید. سعی کنید که سازنده را با آرگومان هایش فراخوانی

نمایید. همچنین متدهای مربوط به انها را فراخوانی نمایید تا با انجام ایم کارها با این اعمال آشنایی بیشتری پیدا نمایید.

۵) ویرایش کلاس -٣

خلاصه : برای ویرایش کد کلاس ، بر روی آیکون کلاس دو بار کلیک نمایید.

تا اینجا ، ما فقط با رابط اشیا سرو کار داشتیم. اما حالا وقت اونه که نگاهی به بخش داخلی برنامه داشته باشیم.

از توابع کلاس ببینید. Open Editor شما می توانید پیاده سازی یک کلاس را با انتخاب

( یاد آوری: با کلیک راست کردن بر روی آیکون کلاس می توانید توابع و اعمال مربوط به کلاس را مشاهده نماید)

با دوبار کلیک کردن بر روی آیکون کلاس شما به طور میان بر به توابع مشابهی دسترسی خواهید یافت. جزئیات مربوط

به استفاده از ادیتور در این آموزش به شرح داده نشده ولی استفاده از ان بسیار سر راست می باشد. جزئیات ادیتور به طور

را باز نمایید. پیاده سازی مربوط به Staff مشخص بعدا توضیح داده خواهد شد. برای حالا ، پیاده سازی مربوط به کلاس

را پیدا نمایید. این متد شماره اتاق اعضا عضو را بر می گرداند. به ما اجازه دهید تا با اضافه کردن پیشوند getRoom متد

بر می "M. را به جای مقدار " 3.18 "room M. به متد نتیجه نهایی تابع را تغییر دهیم (بنابراین متد مقدار " 3.18 "room"

١۴

گرداند). ما اینکار را با تغییر این خط برنامه انجام خواهیم داد :

Return room;

و تغییر ان به :

Return "room"+room;

بطور کامل ، دستورات جاوا را پشتیبانی می کند.در نتیجه در این جا چیز خاصی برای نحوه پیاده سازی کلاس BlueJ برنامه

نیست. و همه چیز بر اساس قواعد جاوا انجام می پذیرد.

۶) کامپایل کردن -٣

Compile در ویرایش گر را فشار دهید. و برای کامپایل یک پروژه دکمه Compile خلاصه: برای کامپایل یک کلاس، دکمه

واقع در پنجره پروژه را فشار دهید.

بعد از اینکه شما متن را وارد کردید (و قبل از این که کار دیگری انجام دهید) .نمای پروژه تان را بررسی نمایید ( پنجره اصلی)

تغییر کرده است. و آیکون کلاس شامل خطوط راه راهی شده است. Staff شما اگر دقت کنید خواهید دید که آیکون کلاس

این خطوط را ه راه نشان می دهند که کلاس بعد از آخرین تغییرات کامپایل نشده است.

توجه : شاید شما تعجب کنید که چرا برای اولین بار که این پروژه را باز کردید آیکون های کلاس خط دار نبودن .این

بصورت کامپایل شده توزیع شده اند. البته اکثر پروژه people موضوع به این دلیل می باشد که کلاس های پروژه

بصورت کامپایل نشده توزیع می شوند. بنابراین از این به بعد، به آیکون کلاس های پروژه های که باز BlueJ های

می کنید دقت نمایید.

در منوی ابزار واقع در بالای ویرایشگر چندین دکمه قرار دارند که ما از آنها مرتبا استفاده می کنیم. یکی از این دکمه ها

می باشد. این تابع به شما اجازه می دهد تا کلاس تان را مستقیما از درون ویرایشگر کامپایل نمایید. Compile دکمه

در " the class has been compiled" را فشار دهید. اگر شما اشتباهی مرتکب نشده باشید .پیغام Compile حالا دکمه

بخش اطلاعات واقع در انتهای ویرایشگر به نمایش در می آید. اگر شما خطایی انجام دهید که منجر به تولید یک خطای نحوی

شود. خط کدی که خطا در آن اتفاق افتاده مشخص () می شود و همچنین پیغام خطایی در بخش اطلاعات برنامه به نمایش

در می آید. ( در مورد اولی که کامپایل کردید.سعی کنید یک خطای نحوی ایجاد کنید به عنوان مثال یک سیمی کلون را حذف

کنید. حالا آنرا مجددا کامپایل نمایید تا ببینید چه اتفاقی می افتد. ) بعد از این که کلاس را با موفقیت کامپایل نمودید.

ویرایشگر را ببندید.

١۵

توجه : شما نیاز به ذخیره کد کلاس ندارید کدها در زمان های مورد نیاز یه صورت خودکار ذخیره می شوند. ( مانند هنگامی

که ویرایشگر را می بندید و یا قبل از این که کلاس را کامپایل نمایید. شما اگر دوست دارید می توانید کدها را ذخیره کنید

( تابع مورد نیاز در ویرایشگر مربوط به کلاس وجود دارد ) البته شما در حالتی به این کار نیاز دارید که کامپیوتر تان به صورت

می کند. و شما نگرانید که کارتان از بین برود. (crash) مکرر کرش

می باشد. با فشردن این دکمه کل پروژه کامپایل می شود. ( این دکمه Compile منوی ابزار پنجره پروژه نیز شامل دکمه

تشخیص می دهد که کدامیک از کلاس ها نیاز به کامپایل مجدد دارند. و سپس بعد از کامپایل مجدد انها را مرتب می کند ) .این

کار را با ایجاد تغییر در دو یا چند کلاس (بنابراین شما باید دو یا چند کلاس در صفحه ترسیم کلاس ها داشته باشید که

را فشار دهید. اگر در حین کامپایل خطایی در یکی از Compile با خطوط راه راه مشخص شده باشد )امتحان کنید وسپس دکمه

کلاس ها تشخیص داده شود. ویرایشگر باز شده و محل خطا و همچنین پیغام مناسب را نمایش می دهد. شما اگر دقت کنید خواهید

مجددا خالی می شود. هنگامی که در پیاده سازی تغییر ایجاد شود اشیا پاک می شوند. چ (object bench) دید که محل اشیا

٧) راهنمایی بوسیله خطاهای کامپایلر -٣

خلاصه : برای راهنمایی گرفتن درباره پیغام خطایی کامپایلر ، بر روی علامت سوال که بعد از پیغام خطا قرار دارد کلیک کنید.

اغلب اوقات ، دانشجویان مبتدی به سختی متوجه پیغام های خطا می شوند. ما تلاش کردیم تا یک راهنما نیز ایجاد نماییم.

ویرایشگر را مجددا باز کنید و در ان یک خطا ایجاد کرده و کلاس را دوباره کامپایل نمایید .در بخش اطلاعات ویرایشگر باید

پیغام خطا نمایش داده شود. در انتهای سمت راست بخش اطلاعات علامت سوال مشخص می باشد که شما با کلیک کردن بر روی

( آن می توانید اطلاعات بیشتری درباره ان خطا بدست آورید.( عکس شماره ٨

عکس ٨ : خطای کامپایلر و دکمه راهنما

در این مرحله ، متن های راهنما برای تمام پیغام های خطا موجود نمی باشد. مقداری از متن های راهنما هنوز در حال

نوشته شدن می باشند .اما این خاصیت ارزش امتحان کردن را دارد.تعداد زیادی از خطا ها توضیح داده شده اند. موارد

به آن اضافه خواهند شد. BlueJ باقی مانده نیز نگاشته شده و در ویرایش های بعدی

١۶

فصل ۴- انجام اعمالی بیشتر

انجام دهید. بحث خواهیم کرد این موارد BlueJ در این فصل ما بیشتر بر روی کارهای که شما می توانید توسط محیط

پایه ای نیستند ولی به طور فراوان مورد استفاده قرار می گیرند.

١) ناظر -۴

خلاصه: ناظر شی به شما اجازه می دهد تا به رفع خطاهای ساده بپردازید با نشان دادن وضعیت داخلی شی.

برای اشیای که شامل متدهای تعریف Inspect هنگامی که شما متدهای یک شی را اجرا می کنید .شما می بینید که تابع

شده توسط کاربر هستند موجود است(شکل ۵). این تابع به شما اجازه می دهد تا وضعیت متغیرهای ( فیلدها ) شی را بررسی

با سازنده های که پارامتر Staff نمایید .یک شی با چند مقدار تعریفی توسط کاربر ایجاد نمایید ( به عنوان مثال شی

را از منوی شی انتخاب نمایید. پنجره ای نمایش داده می شود که فیلد های شی را Inspect می پذیرند) .سپس تابع

.( با نوع و مقدار شان نمایش می دهد (شکل ٩

شکل ٩: پنجره ناظر

ناظر برای بررسی سریع اعمالی که تغییر می کنند بسیار مفید می باشد( اعمالی که موقعیت اشیا در ان تغییر می نماید)

بنابراین ، ناظر یک ابزار رفع خطا ساده می باشد.

همه فیلد ها از نوع ساده می باشند ( غیر شی یا رشته ها ) . مقدار این انواع می تواند مستقیما نمایش ، Staff در مثال

داده شود. شما می توانید فورا ببینید که کدام سازنده شامل متغیر نهایی می باشد.

در بسیاری از نمونه ای پیچیده ، مقادیر فیلد ها می تواند به اشیا که توسط کاربران تعریف کرده اند مراجعه کند. برای مشاهده

BlueJ را باز کنید.این پروژه همراه توزیع استاندارد people چنین حالتی ما باید از یک پروژه دیگر استفاده کنیم. پروژه 2

نمای پنجره پروژه شبیه شکل ١٠ خواهد شد. people موجود میباشد. بعد از باز کردن پروژه 2

به کلاس های مثال قبلی اضافه شده است. یکی از فیلدهای کلاس Address در مثال دوم شما می توانید ببینید که کلاس

می باشد. Address از نوع تعریف کاربر کلاس Person

١٧

people شکل ١٠ : پنجره پروژه 2

ایجاد کنید و سپس متد Staff کار بعدی که قرار است کا انجام دهیم . ناظر با فیلدهای نوع شی می باشد. یک شی

پیدا نمایید ). person این شی را فراخوانی نمایید ( شما این متد را می توانید در زیر منوی setAddress()

address را ایجاد می کند.و آنرا در فیلد Address شی کلاس Staff آدرس را وارد نمایید. به طور داخلی ، کد

را فراخوانی نماید. شکل شماره ١١ نتیجه را به ما نشان می دهد. Staff ذخیره می نماید. حالا ، ناظر شی

می باشند. شما همچنین می توانید ببینید که مقدار این فیلد با یک address شامل Staff حالا فیلدهای درون شی

پیکان نمایش داده شده که این بدین معنی است که مقدار ان به یک شی دیگر مراجعه می نماید. خب تا اینجا این موضوع

پیچیده می باشد. زیرا مقدار شی های تعریفی توسط کاربر را نمی توان مستقیما در این لیست مشاهده کرد.

مربوط به Inspect را در لیست انتخاب کرده و دکمه Address فیلد ، address برای امتحان کردن مقادیر مربوط به

دو بار کلیک کنید ) پنجره ناظر دیگری باز شده و address پنجره را فشار دهید ( شما همچنین می توانید بر روی فیلد

.( را نمایش می دهد ( شکل ١٢ Address جزئیات شی

١٨

شکل ١١ : ناظر با مراجعه به شی

شکل ١٢ : ناظر شی داخلی

می توانید ، شما می توانید فیلد Inspect میباشد شما به جای فشار دادن دکمه public اگر فیلد انتخاب شده از نوع

مشخص object bench را فشار دهید. با این عمل شی انتخاب شده در Get را انتخاب نمایید و دکمه Address

می شود.شما در انجا می توانید با فراخوانی متدهای شی به آزمایش خود ادامه دهید.

٢) ارسال اشیا به عنوان پارامتر -۴

خلاصه: یک شی را می توان به عنوان پارامتر برای فراخوانی یک متد ارسال کرد .برای اینکار بر روی آیکون شی کلیک کنید.

١٩

اشیا می توانند به عنوان پارامترها به متدهای پروژه های دیگر ارسال شوند. اجازه دهید تا با یک مثال این کار را انجام دهیم

شامل یک سازنده می باشد که پارامتری Database ایجاد نمایید ( شما باید توجه نمایید که کلاس Database یک شی از کلاس

قادر است تا لیستی از اشخاص را در خود نگه دارد. Database را دریافت نمی کند بنابراین ساخت شی سر راست میباشد ) شی

این شی شامل اعمالی برای اضافه کردن اشیا شخص و همچنین نمایش شخص های که تا کنون ذخیره شده اند می باشد.

را در Student و یا Staff یک اغراق کوچک می باشد !!! ) اگر شما در حال حاضر شی Database ( در حقیقت نام

و شی Database ندارید. یکی از این دو شی را ایجاد نمایید. برای ادامه شما نیاز دارید تا شی Object bench

Database را از شی addPerson قرار داشته باشند.حالا متد object bench در یک زمان در Student و یا Staff

از نوع Person مورد انتظار می باشد. ( یاد آوری: کلاس Person فراخوانی نمایید امضا متد به شما می گوید که پارامتر نوع

باشند نیست .اما یکی از person می باشد بنابراین انجا اشیایی که مستقیما از نوع (abstract) انتزاعی

باشد. بنابراین این قانونی است که ما Person می تواند جایگزین مناسبی برای شی Student و یا Staff زیر انواع شی

مورد انتظار می باشد ).برای ارسال شی Person را به عنوان پارامتر ارسال کنیم هر جا که Student و یا Staff اشیا

کلیک کرده و از پنجره باز شده نام کلاس مورد نظر را در فیلدهای object bench به عنوان پارامتر بر روی شی موجود در

را فشار دهید تا فراخوانی مربوطه انجام پذیرد.از آنجایی که این متد مقدار بازگشتی ندارد ما Ok مربوطه وارد می نماییم. دکمه

فراخوانی نمایید تا بررسی کنید که Database را از شی listAll نمی توانیم فورا نتیجه را مشاهده نماییم. شما می توانید متد

اطلاعات شخص را در خروجی استاندارد چاپ می کند شما باید توجه کنید listAll این عمل برای شی انجام شده است.دستور

که صفحه متن () به طور خودکار باز شده و متن را نمایش می دهد.

تمرین نمایید. Database این کار را با وارد کردن اشخاص بیشتری در

٢٠

فصل ۵- ایجاد پروژه جدید

این فصل به شما یک آموزش سریع برای تنظیم یک پروژه جدید می دهد.

١) ایجاد پروژه جدید -۵

را انتخاب نمایید. New…. گزینه Project خلاصه: برای ایجاد یک پروژه از منوی

را انتخاب نمایید. پنجره انتخاب فایل باز شده و به شما اجازه New…. گزینه Project برای ایجاد یک پروژه جدید از منوی

می دهد تا نام و محل ذخیره سازی پروژه جدید را مشخص نمایید.این کار را حالا امتحان نمایید.شما می توانید هر گونه نامی

را فشار دادید. در مسیر مورد نظر پوشه ای همنام با نامی که شما Ok برای پروژه تان انتخاب نمایید.بعد از اینکه شما دکمه

انتخاب کرده اید ایجاد می شود. و پنجره اصلی برنامه بصورت خالی نمایش داده می شود.

٢) ایجاد کلاسها -۵

را فشار می دهیم.و برای کلاس یک نام قرار می دهیم. New Class خلاصه: برای ایجاد یک کلاس ، دکمه

واقع در منوی ابزار یک کلاس جدید ایجاد کنید.شما می توانید New Class شما اکنون می توانید با کلیک کردن بر روی دکمه

سوال کنید برای تهیه کردن یک نام برای کلاس- این نام می تواند یک شناسه معتبر جاوا باشد.

standard ، applet ، abstract ، interface : شما همچنین می توانید ۴نوع کلاس را انتخاب نمایید

این انتخاب مشخص می کند که بدنه اولیه کدهای که برایتان تولید می شود چگونه باشد. شما بعدا می توانید نوع کلاس را با

در بین کدها ) . abstract تغییر در کدهای ان ویرایش کنید (به عنوان مثال ، با اضافه کردن کلمه کلیدی

بعد از این که شما کلاس را ایجاد نمودید.کلاس به وسیله یک آیکون در صفحه نمایش ، نمایش داده می شود. اگر کلاس شما از

این موضوع در آیکون کلاس نمایش داده خواهد شد. ( abstract,applet,interface) نوع استاندارد نیست

هنگامی که ویرایشگر را برای کلاس جدید باز می کنید خواهید دید که کدهای اولیه برای این کلاس ایجاد شده است.

این موضوع ، کار شما برای شروع را آسان تر خواهد کرد. کدهای پیش فرض از لحاظ نحوی صحیح می باشد.شما می توانید

آنرا کامپایل نماید ( اما این کلاس ها کاری انجام نمی دهند ) .سعی کنید چند کلاس ایجاد کنید و آنها را کامپایل نمایید.

٣) ایجاد وابستگی ها -۵

خلاصه: برای ایجاد یک پیکان ، بر روی دکمه پیکان کلیک کرده و آنرا بر روی صفحه ترسیم درگ نماید. و یا فقط در

ویرایشگر کد مربوطه را تایپ نماید.

در صفحه ترسیم کلاس ها ، علامت پیکان روابط ما بین کلاس ها را مشخص می نماید.

"uses" بوسیله پیکانی با سر تو خالی (سر بسته) مشخص می شود. روابط ( Implement ، extend ) روابط ارث بری

با یک پیکان نقطه چین با سر باز مشخص می شود.

شما می توانید روابط را مستقیما در صفحه ترسیم و یا بوسیله نوشتن کد در ویرایشگر مشخص نماید. شما اگر وابستگی ها

را بوسیله گرافیکی ایجاد کنید. کدها بصورت خودکار بروز رسانی می شوند و اگر شما وابستگی ها را بوسیله کدها ایجاد کنید.

بخش گرافیکی به صورت خودکار بروز رسانی می شود.

٢١

برای اضافه کردن یک پیکان بصورت گرافیکی ، بر روی دکمه پیکان مقتضی(پیکان سر بسته برای روابط ارث بری و پیکان

کلیک کرده و آنرا از بین دو کلاس مربوطه درگ می نماییم. (uses نقطه جین برای

به کدهای کلاس تان اضافه implement و یا extend با اضافه کردن یک پیکان مربوط به ارث بری کد توضیحی مربوط به

.( interface می شود. ( این بستگی به مقصد دارد که از نوع کلاس باشد و یا

بلافاصله تغییری در کدها ایجاد نمی کند (مگر اینکه مقصد کلاسی در یک پکیج دیگر باشد، در این uses اضافه کردن پیکان

برای کلاسی که uses تولید می شود. اما ما فعلا آنرا در بین مثال هایمان نداریم ).استفاده از پیکان Import نمونه دستور

بین کلاس ها تعریف شده uses مورد استفاده قرار نگرفته در حین کامپایل اخطاری ایجاد می کند مبنی بر این که شما از ارتباط

ولی کلاس مورد استفاده قرار نگرفته است.

اضافه کردن پیکان ها برای ارتباط در حالت متنی بسیار ساده می باشد: شما کافی است که به صورت معمولی کدها را تایپ

نماید.هنگامی که کلاس را ذخیره کنید.صفحه ترسیم بروز رسانی می شود(یادآوری : با بستن ویرایشگر ، کلاس به صورت

خودکار ذخیره می شود ).

۴) حذف کردن عناصر -۵

را انتخاب نماید. remove خلاصه : برای حذف یک کلاس و یا یک پیکان ، از منوی باز شونده گزینه

را انتخاب نماید. شما همچنین remove گزینه ، Edit برای حذف یک کلاس از صفحه ترسیم ، کلاس را انتخاب نماید و از منوی

را انتخاب نمایید. هر دو مورد توضیح داده شده برای کلاس برای یک پیکان remove می توانید از منوی بازشونده کلاس گزینه

نیز کاربرد دارد.

٢٢

code pad فصل ۶ – استفاده از

شما می توانید با سرعت و به سادگی به آزمایش دستورات و عبارات یک تکه کد جاوا BlueJ محیط Code Pad بااستفاده از

بپردازید. بنابراین ، کد پد می تواند برای بررسی دستورات و قواعد زبان جاوا مورد استفاده قرار بگیرد.

١) نمایش کد پد -۶

را فشار دهید. Show Code Pad گزینه View خلاصه : برای نمایش کد پد از منوی

را فشار دهید. Show Code Pad گزینه View کد پد بصورت پیش رض نمایش داده نمی شود.برای دیدن آن از منوی

( خود می باشد ( شکل ١٣ object bench پنجره اصلی حالا شامل کد پد در گوشه سمت راست و بعد از

شکل ١٣ : پتجره اصلی به همراه کد پد

با استفاده از خطوط عمودی و افقی قابل تغییر می باشد. کد پد حالا می تواند Object Bench اندازه پنجره کد پد و همچنین

هر خط اجرا شده و نتیجه ان نمایش Enter برای ورود دستورات و عبارات مورد استفاده قرار بگیرد. ب افشار دادن دکمه

داده می شود.

٢) اجرای یک عبارت ساده -۶

خلاصه : برای اجرای یک عبارت جاوا ؛ تنها کافیست که انرا در کد پد تایپ نمایید.

کد پد می تواند برای اجرا و امتحان کردن عبارات ساده بکار برود. به عنوان مثال ، عبارات زیر را امتحان نمایید:

٢٣

4 + 45

"hello".length()

Math.max(33, 4)

(int) 33.7

javax.swing.JOptionPane.showInputDialog(null, "Name:")

عبارات می توانند به مقدارهای استاندارد جاوا مراجعه کنند و اشیا می توانند به کلاس های موجود در پروژه مراجعه داشته

باشند.کد پد نتایج را نمایش خواهد داد و اگر عبارت شما اشتباه باشد پیام خطایی نشان خواهد داد.

در student قرار دارند نیز استفاده کنید.برای نمونه : یک شی از کلاس object bench شما می توانید از اشیایی که در

هست. student قرار دهید (بااستفاده از منوی بازشونده کلاس که قبلا توضیح داده شد ) .نام شی 1 Object bench

حالا شما در محیط کد پد تایپ نمایید:

student1.getName()

به طور مشابه ، شما می توانید به تمام متدهای در دسترس کلاس های پروژه تان دسترسی پیدا نمایید.

٣) دریافت اشیا -۶

آیکون کوچک شی را به آن محیط درگ کنید. ، object bench خلاصه : برای انتقال اشبا از کد پد به محیط

نتیجه بعضی از عبارات (دستورات) یک شی می باشد. که شامل مقدارهای ساده ای هستند. در این مثال ، نتیجه

یک نوع شی می باشد. که به وسیله آیکونی که در کنار آن ترسیم شده در خط بعد از <object reference> نمایش داده شده

عبارت مشخص می باشد.

شکل ١۴ : نتیجه یک عبارت در کدپد ، یک شی می باشد

اگر نتیجه یک رشته باشد شما مقدار انرا می توانید ببیند. در ضمن باز هم یک ایکون در کنار ان ترسیم شده است

( زیرا رشته ها نیز شی هستند ) .تعدادی از دستوراتی که شما با استفاده از ان ها می توانید شی ایجاد نمایید:

new Student()

"marmelade".substring(3,8)

new java.util.Random()

"hello" + "world"

درگ کنید تا با استفاده از شی نتیجه شده کار را ادامه دهید. Object Bench شما می توانید آیکون کوچک شی را درون

٢۴

( (شکل ١۵

object bench شکل ١۵ : درگ کردن شی درون

۴ ) بررسی اشیا -۶

خلاصه : برای بررسی نتیجه اشیا در کد پد بر روی آیکون کوچک شی دوبار کلیک نمایید.

اگر شما می خواهید یک شی را که به عنوان نتیجه برگشت داده شده را از طریق کد پد بررسی نماید بدون اینکه شی را در

قرار دهید. می توانید بر روی آیکون شی دوبار کلیک کرده تا ناظر شی باز شود. Object bench

۵) اجرا کردن دستورات -۶

خلاصه : دستوراتی که در درون کد پد تایپ می شوند. اجرا می گردند

شما همچنین می توانید از کد پد برای اجرا کردن دستورات استفاده نمایید ( این موضوع برای دستورات جاوای می باشد که

مقداری را بر نمی گرداند ) .این کار را انجام دهید.به عنوان مثال :

System.out.println("Gurkensalat");

System.out.println(new java.util.Random().nextInt(10));

دستوراتی که اجرا می شوند به درستی اجرا می شوند خواه در انتهای انها سیمی کالون باشد با نه.

۶) دستورات چند خطی و دستورات توالی دار -۶

استفاده نمایید. Enter-shift خلاصه : برای دستورات چند خطی در انتهای هر خط از

در انتهای هر خط ایجاد نمایید. Enter-shift شما می توانید توالی از دستورات و یا دستورات چند خطی را با استفاده از

نشانگر موس به ابتدای خط بعدی منتقل می شود بدون این که خط قبلی اجرا شود .در انتهای خط اخر enter-shift با فشردن

را فشار دهید تا کل خط های با هم اجرا شوند. برای نمونه کد زیر را اجرا نمایید: Enter

for (int i=0; i<5; i++) {

System.out.println("number: " + i);

}

٧) کار با متغییرها -۶

٢۵

خلاصه : متغییرهای محلی را می توان در دستورات یک خطی و یا چند خطی مورد استفاده قرار داد. اسامی اشیا موجود

در فیلدهای شی به کار گرفته می شوند. object bench در

متغییرها (محلی و یا شی ) می توانند به صورت محدود در کد پد مورد استفاده قرار بگیرند. شما می توانید متغییرهای محلی

را در کد پد تعریف نمایید- اما این فقط برای بخشی از دستورات توالی چند خطی مناسب می باشد. برای مثال شما می توانید

بلوک دستورات زیر را وارد نمایید و این دستورات درست کار کنند :

int sum;

sum = 0;

for (int i=0; i<100; i++) {

sum += i;

}

System.out.println("The sum is: " + sum);

یک فیلد شی جدید ایجاد نمایید. object bench شما می توانید با درگ کردن شی از کد پد به

(command history) ٨) تاریخچه دستورات -۶

خلاصه: با استفاده از دکمه های بالا و پایین روی صفحه کلید می توانید به تاریخچه ورودی ها در کد پد دست پیدا کنید.

کد پد سابقه ای از ورودی های قبلی شما را نگه داری می کند. شما با استفاده از دکمه های بالا و پایین روی صفحه کلید

می توانید به خط های ورودی قبلی دست پیدا کنید و می توانید قبل از اجرا مجدد آنها به ویرایش آنها بپردازید.

فصل ٧ – رفع خطا

٢۶

. BlueJ این بخش مقدمه ای است بر مهمترین اعمال مربوط به رفع خطا در

در سال اول آموزش می تواند (Debugger) بسیاری از اساتید علوم کامپیوتر معتقدند که استفاده از نرم افزارهای رفع خطا

جالب و مفید باشد. اما فرصتی برای معرفی چنین چیزی را به دانشجویان ندارند. دانشجویان به سختی در تقلای کار کردن با

ویرایشگر ، کامپایلر و اجرا کننده هستند . و فرصتی برای آشنایی با یک ابزار پیچیده دیگر را ندارند.

بر همین اساس ما مصمم شدیم تا یک دیباگر ساده طراحی کنیم. هدف این بود که دیباگر تهیه شود که شما ظرف

١۵ دقیقه کل خصوصیات آن را شرح دهید.و دانشجویان بتوانند بدون اموزش خاصی از ان استفاده نمایند.

حال ببینید که آیا ما موفق بوده ایم.

در ابتدا امر ، ما اعمال دیباگر های قدیمی را به ٣ وظیفه کاهش دادیم :

breakpoint ١. تنظیم

٢. کامپایل خط به خط کدها

٣. نظارت بر متغییرها ( بررسی متغییرها )

در واقع این ٣ عمل بسیار ساده می باشند. در ادامه ما با آنها کار خواهیم کرد.

انتخاب نمایید. این پروژه شامل کلاس های برای examples را از پوشه debug demo برای شروع کار ، پروژه

آزمایش کردن توابع و اعمال دیباگر می باشند. و نمی توانند کار دیگری انجام دهند.

ها : break point ١) تنظیم -٧

ها در سمت چپ محیط کدنویسی break point در محل مربوط به ، break point خلاصه: برای قرار دادن یک

کلیک کنید.

شما می توانید در اجرای برنامه در این نقطه معین از کد وقفه ایجاد کنید. و برنامه در ان break point با تنظیم یک

قسمت متوقف شود. هنگامی که اجرا برنامه متوقف شد . شما می توانید وضعیت اشیا برنامه خود را بررسی کنید. این

_______کار در اغلب اوقات به شما کمک می کند. تا بتوانید بفهمید که در کدهای شما چه اتفاقی می افتد.

ها می باشد. break point همانگونه که در شکل ١۶ مشخص می باشد. سمت چپ محیط کدنویسی محل مربوط به

نقطه " stop" ایجاد نمایید. علامت کوچک break point شما با کلیک کردن در این محیط می توانید یک

شما را مشخص می نماید. می توانید همین حالا امتحان نمایید. Break point

خود را در جایی از متد که شامل حلقه breakpoint را پیدا نماید. و نقطه loop را باز کنید. متد Demo کلاس

در محیط کدنویسی نمایش داده خواهد شد. " stop" می باشد. قرار دهید. علامت For

٢٧

break point شکل ١۶ : یک نقطه

مشخص کردید. اجرا برنامه در ان قسمت ها متوقف می شود. اجازه break point هنگامی که خطوط برنامه را بوسیله نقاط

آنرا با پارامتر ١٠ فراخوانی نمایید. به زودی Loop ایجاد کنید. و متد Demo بدید این کار رو انجام بدهیم. شی ای از کلاس

اثر کرده. محیط کد نویسی برنامه باز می شود. و خط جاری را نمایش می دهد. همچنین دیباگر برنامه نیز break point نقطه

باز می شود. این وضعیت را می توانید در شکل ١٧ ببینید.

شکل ١٧ : پنجره دیباگر برنامه

شده ، خطی است که قرار است اجرا شود. یعنی برنامه در خط (high Light) خطی از برنامه که در محیط کدنویسی مشخص

قبلی متوقف شده است.

٢٨

٢ ) اجرا خط به خط کدها -٧

را در دیباگر فشار دهید. حال که ما برنامه را متوقف کردیم. Step and Step Into برای اجرا خط بخ خط کدها یتان دکمه

می توانیم اجرا یک مرحله از کدها را مشاهده کنیم. و ببینیم که در حین اجرا چه اتفاقی می افتد. برای انجام این کار ، بصورت

را از پنجره دیباگر فشار دهید. شما باید تغییراتی در خطوط برنامه تان ببینید ( خط واضح شده به خطی که Step تکراری ، دکمه

را فشار دهید. یک خط از برنامه اجرا شده و اجرا برنامه متوقف می Step اجرا شده منتقل می شود ) هر وقت که شما دکمه

( sum شود. توجه کنید که مقدار متغییرهای درون پنجره دیباگر نیز تغییر می کند ( به عنوان مثال مقدار متغییر

بنابراین شما می توانید مرحله به مرحله برنامه تان را اجرا کنید و ببینید که چه اتفاقی می افتد. برای این که به این کار خاتمه

موجود در دیباگر را فشار دهید تا اجرا Continue کلیک کنید. تا پاک شوند و همچنین دکمه breakpoint دهید. بر روی نقاط

را بر روی Breakpoint برنامه بصورت عادی پیگیری شود. اجازه دهید تا این مراحل را با یک متد دیگر امتحان نماییم. نقطه

خط

Places = myCar.seats ();

تنظیم می نماییم. Demo از کلاس carTest() مربوط به متد

٣ ) بررسی متغییرها -٧

خلاصه : بررسی متغییرها بسیار ساده می باشند. متغییرها بصورت خودکار در دیباگر به نمایش در می آیند. هنگامی که شما

می نماید. بسیار مهم می باشد که قادر باشید. از وضعیت اشیا باخبر باشید ( مثلا : متغییرهای (debug) کدهایتان را رفع خطا

محلی و متغییرهای نمونه ) . انجام این کار بسیار ساده و جزئی می باشد. شما نیاز به یک دستور خاص برای بررسی متغییرها

ندارید. متغییرهای استاتیک ، متغییرهای نمونه از شی جاری ، متغییرهای محلی متد جاری همواره به صورت خودکار نمایش داده

شده و همچنین بروز رسانی نیز می شوند. شما می توانید متدها را در فراخوانی متوالی انتخاب کنید. تا متغییرهای دیگر اشیا و

قرار دهید. در سمت carTest() در متد break point متدهای فعال جاری را مشاهده نمایید. به عنوان مثال ، مجددا یک نقطه

را مشاهده خواهید کرد. که در حال حاضر موارد زیر را نمایش ( call sequence) چپ پنجره دیباگر شما فراخوانی متوالی

می دهد:

Car.seats

Demo.carTest

فراخوانی شده است. شما می توانید از این لیست گزینه Demo.carTest بوسیله Car.Seats این اشاره می کند به این که

را برای بررسی کد مربوطه و همچنین مقدار متغییرهای جاری این متد انتخاب نمایید. Demo.carTest

را که بصورت my car می باشد. عبور کنید می توانید مقدار متغییر محلی new Car(…) اگر شما از خطی که شامل ساختار

می باشد مشاهده نمایید. مقدار تمام انواع اشیا ( به جز رشته ها ) از این راه نمایش داده می شود. شما <object refrence>

می توانید با دو بار کلیک کردن بر روی متغییرها انها را بررسی نمایید. انجام این کار شبیه باز کردن پنجره بررسی شی

4 مورد بررسی قرار گرفت. - می باشد . که در بخش 1

٢٩

۴ ) متوقف کردن و خاتمه دادن برنامه -٧

موجود در دیباگر برای ایجاد توقف بطور موقت یا دائم در برنامه بکار می روند. Terminate و Halt خلاصه : گزینه های

گاهی اوقات اجرا برنامه بسیار طول می کشد. و ما متعجب از این که همه چیز درست هست. شاید برنامه شما در یک حلقه

را longloop() نامتنهاهی گرفتار امده و به همین دلیل اجرا برنامه به طول می انجامد. خب ما این مورد را بررسی می کنیم. متد

انتخاب نمایید. حالا ما قصد داریم ببینیم که برنامه به کجا منتقل می شود. پنجره دیباگر را نگاه کنید اگر هنوز بر Demo از کلاس

تعیین کرده باشیم break point را فشار دهید .اجرا برنامه اگر ما نقطه Halt روی صفحه نمایش ظاهر نشده است. حالا دکمه

متوقف می شود. شما حالا می توانید مرحله به مرحله پیش بروید و از متغییرها رو مشاهده کنید که همه مقدار درستی دارند.این

استفاده Halt و Continue عمل فقط نیاز به مقداری زمان برای تکمیل شدن دارد. شما می توانید به دفعات زیاد از دکمه های

کنید تا بتوانید سریعتر پیش بروید.اگر شما قصد ندارید که ادامه دهید (به عنوان مثال جای واقعی حلقه بی نهایت را پیدا کرده اید )

مکررا استفاده Terminate را فشار دهید تا اجرای برنامه متوقف شود. شما نمی توانید ازدکمه terminate می توانید دکمه

نماید.

فصل ٨ - ایجاد یک برنامه کاربردی خود اتکا

٣٠

را انتخاب نمایید. create jar file گزینه project خلاصه : برای ایجاد یک برنامه خود اتکا از منوی

اجرایی ، در سیستم های نظیر ویندوز و مکینتاش با Jar قابل اجرا تولید نماید. فایل های Jar می تواند فایل های BlueJ

با تایپ دستور زیر : Unix و Dos دو بار کلیک کردن بر روی فایل اجرا می شوند. و در سیستم های نظیر

Java –jar <file name>.jar

قرار دارد. انجام می دهیم. پروژه را باز کنید. مطمئن شوید که پروژه examples که در پوشه people ما این کار را برای پروژه

را انتخاب نمایید. create jar file گزینه Project کامپایل شده و بعد از منوی

را انتخاب نمایید ( عکس ١٨ ) .این کلاس باید شامل یک main پنجره ای باز می شود.که به شما اجازه می دهد تا کلاس

باشد. ( public static void main(String[] args) : که امضا آن بدین شکل باشد ) main متد

"create jar file " عکس ١٨ : پنجره

را انتخاب Hello ساده می باشد. زیرا ما تنها یک کلاس داریم. بنابراین از منوی بازشونده main در مثال ما انتخاب کلاس

نمایید.

معمولا شما سورس برنامه را به همراه فایل اجرایی قرار نمی دهید. ولی اگر قصد دارید که برنامه تان شامل سورس برنامه هم

را تیک بزنید. ( به عنوان مثال شما می توانید کل پروژه تان را با استفاده از فرمت include source باشد . می توانید گزینه

در قالب یک فایل بوسیله ایمیل برای دیگران ارسال نمایید ) . jar

را به گونه ای تنظیم کرده اید. که BlueJ اگر شما

را طی کنید ) استفاده کند. در وسط این Tools / performance / libraries برای اینکار مسیر ) user library از

اگر شما از کتابخانه ها استفاده ) . "Include user libraries" : پنجره شما ناحیه ای را با این عنوان مشاهده خواهید کرد

٣١

نکرده اید. این ناحیه نمایش داده نمی شود ) .شما می توانید انتخاب کنید کتابخانه های مختلفی را که پروژه شما از ان ها استفاده

نمایش (file chooser) را فشار دهید تا به مرحله بعد بروید. در این بخش یک پنجره انتخاب کننده فایل Continue . می کند

را فشار دهید. برای این مثال شما تایپ کنید: Create را تایپ کرده و دکمه Jar داده می شود. که شما با استفاده از ان نام فایل

ایجاد می شود. hello.jar را فشار دهید. اگر شما به فایل تان کتابخانه ای را اضافه نکرده باشید. فایل create و دکمه Hello

در آن قرار دارد. همچنین این hello.jar ایجاد شده که فایل hello و اگر برنامه شما شامل کتابخا نه ای باشد. پوشه ای با نام

شما کتابخانه های مورد نیاز خود را در پوشه ای همنام با خودش Jar پوشه شامل تمامی کتابخانه های مورد نیاز می باشد. فایل

بتواند کتابخانه های مورد نیاز را پیدا نماید. Jar را یا این پوشه جابجا کنید. تا فایل Jar می یابد. بنابراین همواره فایل

می توانید آنرا اجرا کنید. Jar می باشد. با دو بار کلیک بر روی فایل (GUI) اگر برنامه شما شامل یک رابط گرافیکی کاربر

و یا پنجره داس می توانید انرا Text Terminal می باشد. شما با استفاده از I/O تنها شامل یک Jar و اگر مانند مثال ما فایل

اجرا کنید. برای اینکار مراحل زیر را طی کنید:

قرار دارد رفته و دستور زیر را تایپ کنید: .jar به محلی که فایل Text Terminal در پنجره داس یا

Java –jar hello.jar

بدین گونه فایل شما اجرا می شود.

فصل ٩ – ایجاد اپلت ها

٣٢

١) اجرا کردن اپلت ها -٩

را انتخاب نمایید. Run Applet گزینه applet خلاصه : برای اجرا کردن اپلت ها از منوی بازشونده

یک Examples و در پوشه BlueJ به شما اجازه می دهد که اپلت ها را مانند اپلیکیشن ها ایجاد و اجرا کنید. به همراه BlueJ

را از پوشه Appletdemo نمونه اپلت وجود دارد. ما در ابتدا قصد داریم تا اپلت را اجرا نماییم . برای اینکار پروژه

انتخاب نمایید. examples

<<applet>> میباشد. این کلاس بوسیله تگ CaseConvertor شما خواهید دید که این پروژه تنها شامل یک کلاس با نام

را از منوی باز شونده کلاس انتخاب نمایید. Run Applet مشخص شده است. بعد از کامپایل پروژه ، گزینه

.( پنجره ای باز می شود که به شما یک سری گزینه ارائه می دهد ( عکس ١٩

Run Applet عکس ١٩ : پنجره

Applet viewer شما در این پنجره می بینید که می توانید انتخاب کنید که اپلت در یک مرورگر نمایش داده شود و یا اینکه در

را فشار دهید. Ok مربوطه تولید شده و اپلت اجرا نشود. تنظیمات پیش فرض را دست نزنید و دکمه webpage ویا اینکه تنها

نمایش داده شده و اپلت شما را نمایش می دهد. Applet viewer بعد از چند ثانبه

بر روی سیستم شما نصب شده و همواره این تضمین وجود دارد که نسخه کامپایلر جاوای j2se بهمراه Applet Viewer

یکسان باشد. در مورد مرورگر وب شما امکان دارد. که مرورگر از نسخه دیگری از جاوا استفاده Applet viewer شما و

کند و این مورد باعث بروز یک سری مشکل شود. البته در حال حاضر اکثر مرورگر ها بخوبی با جاوا کار می کنند.

از مرورگر پیش فرض سیستم عامل استفاده می کند. اما در سیستم های BlueJ ، در سیستم عامل ویندوز و مکینتاش

مشخص شده است. BlueJ مرورگر در تنظیمات ، Unix

٢ ) ایجاد کردن اپلت -٩

٣٣

را از نوع کلاس انتخاب نمایید. Applet کلیک کرده و New Class خلاصه: برای ایجاد اپلت بر روی دکمه

بعد از این که مشاهده کردید چگونه می توان یک اپلت را اجرا کرد. حالا قصد داریم تا خودمان یک اپلت ایجاد نماییم.

ایجاد کنید. انرا کامپایل کنید. و در نهایت اجرا کنید. این کار انجام شد !!! Applet یک کلاس جدید با فرمت

حالا می توانیذ کدهای اپلت را در ادیتور ببینید.و مشاهده کنید که شامل تمامی کدهای مورد نیاز برای اپلت می باشد.

. paint به عنوان مثال متد

٣) آزمایش کردن اپلت -٩

در بسیاری از حالت ها ایجاد شی اپلت بر روی میز کار اشیا بسیار مفید خواهد بود. شما می توانید از منوی بازشونده اپلت

سازنده اپلت را مشاهده نمایید. از میز کار اشیا شما نمی توانید یک اپلت را به طور کامل اجرا کنید. بلکه بعضی از متدهای

آن را می توانید فراخوانی نمایید. این موضوع برای تست کردن یک متد که شما در بین کدهای اپلت نوشته اید می تواند مفید

و یا مرورگر Applet viewer تعین کرده اید. در حالتی که اپلت در break point باشد. اگر شما برای اپلت تان نقاط

وب اجرا می شود. هیچ گونه تاثیری ندارد. زیرا انها از ماشین های مجازی مربوط به خود بهره می برند. و نمی توانند معنای

قرار داده درک کنند. BlueJ را که نرم افزار break point نقاط

ها و همچنین کامپایل مرحله به مرحله در اپلت تان استفاده کنید. شما می توانید Break point اگر شما قصد دارید تا از

که بوسیله مایکل تریکوبوف نوشته شده استفاده نمایید. این کلاس برای شما فریمی را AppletWindow از کلاس

اجرا نماید. به گونه ای که متدهای BlueJ بوجود می اورد. که با استفاده از ان می توانید اپلت ها را مستقیما در درون

سایت Resource عادی مربوط به رفع خطا کار کنند. شما این کلاس و یک نسخه نمونه از ان را می توانید در بخش

بیابید. BlueJ

فصل ١٠ - اعمال دیگر

٣۴

BlueJ در BlueJ ١ ) باز کردن پکیج های غیر -١٠

را انتخاب نمایید. Open Non-BlueJ گزینه Project از منوی BlueJ خلاصه : برای باز کردن پکیج های غیر

مشاهده نمایید. BlueJ ایجاد شده در درون BlueJ به شما اجازه می دهد تا پکیج های را که در خارج از محیط BlueJ

را انتخاب کرده . سیستم از شما مکان و پوشه ای را که Open Non BlueJ گزینه Project برای انجام اینکار از منوی

قصد دارید انرا باز کنید. سوال خواهد کرد.

٢ ) اضافه کردن کلاس های موجود به پروژه تان -١٠

Add Class From file خلاصه : کلاس ها را می توانید از جایی خارج از پروژه ، به پروژه اضافه کنید . برای اینکار از گزینه

بهره خواهیم جست.

قرار دارد. به عنوان مثال استاد شما به شما BlueJ گاهی اوقات شما نیاز دارید تا از کلاسی استفاده کنید که در خارج از محیط

از Add Class Form file کلاس جاوای داده تا از آن در پروژه تان استفاده کنید. شما می توانید به سادگی با انتخاب گزینه

برنامه ، کلاسی را که در خارج از پروژه تان قرار دارد. به پروژه اضافه نمایید. شما با این روش فایل های Edit منوی

ختم شده اند ) را به پروژه تان وارد نمایید. هنگامی که شما کلاس مورد نظر را .java سورس جاوا ( یعنی فایل های که به

به پروژه تان اضافه می کنید. یک نسخه از ان در پوشه پروژه کپی می شود. این _______عمل دقیقا شبیه به این است که شما

یک کلاس ایجاد کرده وتمام کدهای آنرا خودتان تولید نمایید.

روش دیگر برای اضافه کردن یک کلاس به پروژه ، بدین صورت می باشد که شما فایل سورس جاوا را در پوشه پروژه

کلاس مورد نظر را در نمایش BlueJ باز کنید. خواهید دید که BlueJ کپی کنید. هنگامی که دوباره پروژه را بوسیله

ترسیمی نمایش خواهد داد.

: static و main ٣) فراخوانی متدهای -١٠

را می توان از منوی بازشونده کلاس فراخوانی کرد. static خلاصه :متدهای

استاندارد main بوسیله یک متد ( Hello Class ) باز کنید. تنها کلاس این پروژه examples را از پوشه hello پروژه

main تعریف شده است. بر روی کلاس کلیک راست کرده ، منوی کلاس تنها شامل سازنده کلاس نیست . بلکه متد استاتیک

را از این منو فراخوانی نمایید. تمام متدهای استاتیک را می توان شبیه به mian هم نمایش داده می شود. شما می توانید متد

همین مورد فراخوانی نمود.

شامل آرایه ای از رشته ها به عنوان پارامتر می باشد. شما می توانید آرایه ای از رشته ها را بر اساس main متد استاندارد

قواعد جاوا برای این متد ارسال کنید. به عنوان مثال :

{"one", "two", "three"}

در ضمن باید براکت ها را هم به عنوان پارامتر ارسال کنید.

٣۵

توجه: در جاوا استاندارد شما نمی توانید از آرایه های ثابت به عنوان آرگومان برای فراخوانی متدها استفاده کنید. شما از آن ها

ما به شما اجازه می دهیم که شما برای تعامل و فراخوانی متد BlueJ فقط برای دادن مقدار اولیه می توانید استفاده کنید. در

از آرایه های ثابت به عنوان پارامتر استفاده نماید. Main

۴) تولید اسناد -١٠

را انتخاب کنید. Project Documentation گزینه Tools خلاصه : برای تولید سند برای پروژه تان ، از منوی

سند تولید نمایید. برای انجام این کار از منوی javadoc می توانید برای پروژه تان در فرمت استاندارد BlueJ شما بوسیله

را انتخاب نمایید. Project Documentation گزینه Tools

با این کار برنامه برای تمام کلاس های موجود در پروژه تان با استفاده کلاس های سورس شان سند تولید می کند و مرورگر وب

را برای نمایش انها باز می نماید.

شما همچنین می توانید سند را برای یک کلاس تولید کرده و ببینید. برای انجام این کار به محیط کد نویسی کلاس مربوطه بروید.

کلاس مربوطه را خواهید دید. javadoc تغییر دهید. در این حالت شما سند Interface را به Implementation و حالت

۵) کار کردن با کتابخانه ها -١٠

می توانید کلاس های استاندارد جاوا را مشاهده کنید. Help از Java Class Liberies خلاصه : شما با انتخاب گزینه

همانطور که می دانید ؛ هنگامی که شما با جاوا یک برنامه می نویسید. شما به کتابخانه استاندارد جاوا مراجعه می کنید.

را انتخاب Java Class Libraries گزینه Help شما برای دیدن اسناد مربوط به این کتابخانه ها می توانید از منوی

باشید ) Online کنید. ( البته شما باید

هم می توانید این کار را انجام دهید. برای دیدن offline البته اگر اسناد جاوا را به طور محلی نصب کرده اید در حالت

مراجعه نمایید. BlueJ جزئیات این کار به سایت

۶ ) ایجاد اشیا از کلاس های کتابخانه ای -١٠

را انتخاب نمایید. Use Library Class گزینه Tools خلاصه : برای ایجاد اشیا از کلاس های کتابخانه ای از منوی

همچنین توابعی را ارائه می دهد تا شما بتوانید از کلاس های که جز پروژه تان نیست ولی در کتابخانه موجود است BlueJ

ایجاد کنید. این مورد برای ArrayList و یا String اشیای ایجاد کنید. برای مثال شما می توانید اشیایی از کلاس های

تجربه کردن کار کردن اشیا این کلاس ها می تواند خیلی مفید باشد.

می توانید از کتابخانه یک شی ایجاد کنید. پنجره ای باز می شود Tools از منوی Use Library Class شما با انتخاب

باید توجه کنید که نام کامل کلاس باید ) java.lang.String که به شما اجازه می دهد تا نام کامل کلاس را وارد کنید، مانند

شامل پکیج های که کلاس جز آن است باشد )

محل ورود متن () شامل یک منوی بازشونده است که شامل نام آخرین کلاس های است که شما استفاده کرده اید با انتخاب

٣۶

کلاس مربوطه لیست می شود. static تمام سازنده ها و متدهای ، Enter یکی از این کلاس ها و فشار دادن دکمه

را با انتخاب کردن می توان مورد استفاده قرار داد. static هر کدام از این سازنده ها و یا متدهای

فصل ١١ -- خلاصه ها

شروع کردن

را انتخاب کنید. open گزینه Project ١. برای باز کردن پروژه از منوی

انتخاب کنید. Class (popup) را از منوی بازشونده (constructor) ٢. برای ایجا یک شی ، سازنده

انتخاب کنید. (object) ٣. برای اجرایی کردن یک متد ، آنرا از منوی بازشونده شی

۴. برای ویرایش کردن سورس یک کلاس بر روی آیکون کلاس دو بار کلیک کنید.

پنجره compile ادیتور را فشار دهید. و برای کامپایل یک پروژه دکمه compile ۵. برای کامپایل یک کلاس ، دکمه

پروژه را فشار دهید.

۶. اگر در هنگام کامپایل کردن با پیام خطایی مواجه شدید. با فشار دادن علامت سوال ( ؟ ) در محیط کدنویسی اطلاعات

بیشتری در مورد آن خطا بدست اورید.

انجام اعمال بیشتر

٧. ناظر اشیا به شما اجازه می دهد با چک کردن موقعیت درونی اشیا یک سری از رفع خطاهای ساده را انجام دهید.

٨. با کلیک کردن بر روی آیکون اشیا می توان پارامترهای را به متدهای انها ارسال نمود.

ایجاد پروژه جدید

را انتخاب نمایید. New…. گزینه Project ٩. برای ایجاد پروژه جدید از منوی

را فشار دهید. نام مشخصی برای کلاس قرار دهید. New class ١٠ . برای ایجاد کلاس جدید دکمه

کنید. Drag را فشار دهید. و آنرا بر روی صفحه طراحی Arrow دکمه . (Arrow) ١١ . برای ایجاد یک پیکان

یا اینکه می توانید مستقیما در محیط کدنویسی ، کد مربوطه را وارد نمایید.

را انتخاب نمایید. remove ١٢ . برای حذف کلاس و یا یک پیکان ، از منوی بازشونده گزینه

استفاده از محیط کدنویسی

را انتخاب نمایید. Show Code Pad گزینه view ١٣ . برای شروع کار با محیط کدنویسی ، از منوی

١۴ . برای امتحان کردن دستورات جاوا ، آنها را در محیط کدنویسی تایپ نمایید.

١۵ . برای انتقال اشیا از محیط کدنویسی به شاخه اشیا ، آیکون کوچک اشیا را درگ کنید.

٣٧

١۶ .برای دیدن اشیا در محیط کدنویسی ، بر روی آیکون کوچک اشیا دوبار کلیک کنید.

١٧ . دستوراتی که در محیط کدنویسی تایپ می نمایید. اجرایی هستند.

را فشار دهید. enter+shift ١٨ . برای وارد کردن دستورات چند خطی در پایان خط

١٩ . متغییرهای محلی می توانند در دستورات تک خطی یا چند خطی استفاده شوند. نام های اشیا در فیلدهای نمونه اشیا

ذخیره می شوند.

٢٠ . با استفاده از نشانگرهای بالا و پایین صفحه کلید برای دیدن تاریچه ورودی ها استفاده نمایید.

رفع خطا

در سمت چپ محیط کدنویسی کلیک نمایید. breakpoint در منطقه Breakpoint ٢١ . برای ایجاد

در دیباگر برنامه استفاده نمایید. Step into و Step ٢٢ . برای دیدن کامپایل خط به خط برنامه از گزینه های

٢٣ . نظارت کردن بر متغییرها ساده است – تمام انها بصورت اتوماتیک در دیباگر نمایش داده می شوند.

دیباگر انجام دهید. Terminate و Halt ٢۴ . ایجاد توقف یا خاتمه دادن به برنامه را می توانید با گزینه های

ایجاد برنامه های خود اتکا ( خود اجرا )

را انتخاب نمایید. create jar file… گزینه project ٢۵ . برای ایجاد برنامه های خود اجرا از منوی

ایجاد اپلت ها

را انتخاب نمایید. Run Applet ٢۶ . برای اجرا اپلت ها از منوی بازشونده اپلت گزینه

را از انواع کلاس انتخاب نمایید. Applet را فشار داده و گزینه New class ٢٧ . برای ایجاد اپلت ها دکمه

اعمال دیگر

باز کرد. Open Non BlueJ و انتخاب گزینه Project را می توان با استفاده از منوی blueJ ٢٨ . پکیج های غیر

و انتخاب گزینه Edit هستند را می توانید با استفاده از منوی BlueJ ٢٩ . کلاس های که خارج از محیط

انتخاب نمایید. Add Class from file…..

کلاس را می توانید با استفاده از منوی بازشونده کلاس فراخوانی نمایید. static ٣٠ . متدهای

را انتخاب نمایید. Project Documentation گزینه Tools ٣١ . برای تولید سند برای پروژه تان از منوی

را انتخاب نمایید. java standard Libraries گزینه Help ٣٢ . برای دیدن کلاس های استاندارد جاوا از منوی

را انتخاب نمایید. Use Class Library گزینه Tools ٣٣ . برای ایجاد اشیا از کلاس های کتابخانه ای از منوی__

   + MOHSEN GHASEMI - ۱۱:۳٧ ‎ب.ظ ; ۱۳۸٩/۳/٢٩

+ در بخش پرسش و پاسخ شماره 5 سوالی در مورد کار با اسکنر ودرس ششم

   + MOHSEN GHASEMI - ۱۱:۳٥ ‎ب.ظ ; ۱۳۸٩/۳/٢٩

توابع ریاضی و ویژوال بیسیک درس پنجم

   + MOHSEN GHASEMI - ۱۱:۳٤ ‎ب.ظ ; ۱۳۸٩/۳/٢٩

درس چهارم - Direct3D مباحث پیشرفته

<!-- /* Font Definitions */ @font-face {font-family:Helvetica; panose-1:2 11 5 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Courier; panose-1:2 7 4 9 2 2 5 2 4 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tms Rmn"; panose-1:2 2 6 3 4 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Helv; panose-1:2 11 6 4 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"New York"; panose-1:2 4 5 3 6 5 6 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:System; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MS Mincho"; panose-1:2 2 6 9 4 2 5 8 3 4; mso-font-alt:"MS 明朝"; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Batang; panose-1:2 3 6 0 0 1 1 1 1 1; mso-font-alt:바탕; mso-font-charset:129; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimSun; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:宋体; mso-font-charset:134; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:PMingLiU; panose-1:2 1 6 1 0 1 1 1 1 1; mso-font-alt:新細明體; mso-font-charset:136; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:"MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-alt:"MS ゴシック"; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Dotum; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:돋움; mso-font-charset:129; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimHei; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:黑体; mso-font-charset:134; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:MingLiU; panose-1:2 1 6 9 0 1 1 1 1 1; mso-font-alt:細明體; mso-font-charset:136; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:Mincho; panose-1:2 2 6 9 4 3 5 8 3 5; mso-font-alt:明朝; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Gulim; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:굴림; mso-font-charset:129; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:Century; panose-1:2 4 6 3 5 7 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Angsana New"; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:"Cordia New"; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:Mangal; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:32768 0 0 0 0 0;} @font-face {font-family:Latha; panose-1:2 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1048576 0 0 0 0 0;} @font-face {font-family:Sylfaen; panose-1:1 10 5 2 5 3 6 3 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:67110535 0 0 0 159 0;} @font-face {font-family:Vrinda; panose-1:1 1 6 0 1 1 1 1 1 1; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:65539 0 0 0 1 0;} @font-face {font-family:Raavi; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131072 0 0 0 0 0;} @font-face {font-family:Shruti; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:262144 0 0 0 0 0;} @font-face {font-family:Sendnya; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Gautami; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:2097152 0 0 0 0 0;} @font-face {font-family:Tunga; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:4194304 0 0 0 0 0;} @font-face {font-family:"Estrangelo Edessa"; panose-1:3 8 6 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:-2147459008 0 128 0 0 0;} @font-face {font-family:"Arial Unicode MS"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Tahoma; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627421319 -2147483648 8 0 66047 0;} @font-face {font-family:TimesNewRoman; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Adobe Caslon Pro Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Caslon Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Garamond Pro Bold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Adobe Garamond Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Arno Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Caption"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro SmText"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Subhead"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Light Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Caption"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Display"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd SmText"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arno Pro Smbd Subhead"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bell Gothic Std Black"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bell Gothic Std Light"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bickham Script Pro Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:script; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:"Bickham Script Pro Semibold"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:script; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} @font-face {font-family:"Birch Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Blackoak Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Brush Script Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Chaparral Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Charlemagne Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Cooper Std Black"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eccentric Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Garamond Premr Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Garamond Premr Pro Smbd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Giddyup Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Hobo Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Kozuka Gothic Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Gothic Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Gothic Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro B"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro EL"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro H"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro L"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro M"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Kozuka Mincho Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"\@Kozuka Mincho Pro R"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:515 134676480 16 0 131077 0;} @font-face {font-family:"Letter Gothic Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Lithos Pro Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Mesquite Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Minion Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro Med"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Minion Pro SmBd"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Myriad Pro Light"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Nueva Std Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"OCR A Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Orator Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Poplar Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Prestige Elite Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rosewood Std Regular"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Stencil Std"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tekton Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Tekton Pro Cond"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Tekton Pro Ext"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:"Trajan Pro"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:135 0 0 0 155 0;} @font-face {font-family:Marlett; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Lucida Console"; panose-1:2 11 6 9 4 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-2147482993 6144 0 0 31 0;} @font-face {font-family:"Lucida Sans Unicode"; panose-1:2 11 6 2 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-2147476737 14699 0 0 63 0;} @font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"Arial Black"; panose-1:2 11 10 4 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Comic Sans MS"; panose-1:3 15 7 2 3 3 2 2 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Impact; panose-1:2 11 8 6 3 9 2 5 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Georgia; panose-1:2 4 5 2 5 4 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Medium"; panose-1:2 11 6 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Palatino Linotype"; panose-1:2 4 5 2 5 5 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536870009 1073741843 0 0 415 0;} @font-face {font-family:"Trebuchet MS"; panose-1:2 11 6 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Webdings; panose-1:5 3 1 2 1 5 9 6 7 3; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MV Boli"; panose-1:2 0 5 0 3 2 0 9 0 0; mso-font-charset:1; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 0 256 0 0 0;} @font-face {font-family:AngsanaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:BrowalliaUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:"Browallia New"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65537 0;} @font-face {font-family:CordiaUPC; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777219 0 0 0 65536 0;} @font-face {font-family:DilleniaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:EucrosiaUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:FreesiaUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:IrisUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:JasmineUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:KodchiangUPC; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:LilyUPC; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:Aharoni; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:David; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"David Transparent"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:FrankRuehl; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Levenim MT"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Miriam; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Miriam Transparent"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Miriam Fixed"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Fixed Miriam Transparent"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Narkisim; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:Rod; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Rod Transparent"; panose-1:0 0 0 9 0 0 0 0 0 0; mso-font-charset:177; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:6145 0 0 0 32 0;} @font-face {font-family:"Traditional Arabic"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:24577 0 0 0 64 0;} @font-face {font-family:"Arabic Transparent"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:Andalus; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:24577 0 0 0 64 0;} @font-face {font-family:"Simplified Arabic"; panose-1:2 1 0 0 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:"Simplified Arabic Fixed"; panose-1:2 1 0 9 0 0 0 0 0 0; mso-font-charset:178; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:8193 0 0 0 64 0;} @font-face {font-family:Kartika; panose-1:2 2 5 3 3 4 4 6 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:8388611 0 0 0 1 0;} @font-face {font-family:"\@MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:FantasyMatrix; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:FantasyMatrixSmall; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Jokerman Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"University Roman Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Smudger Alts LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"HolidayPi BT"; panose-1:5 12 1 2 1 2 9 2 2 2; mso-font-charset:2; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"OldDreadfulNo7 BT"; panose-1:4 8 8 5 6 1 7 1 8 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"MisterEarl BT"; panose-1:3 8 8 2 2 3 2 2 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Calligraph421 BT"; panose-1:3 6 7 2 5 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Blackletter686 BT"; panose-1:3 4 8 2 2 6 8 4 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Cataneo BT"; panose-1:3 2 8 2 4 5 2 6 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Staccato222 BT"; panose-1:3 9 7 2 3 4 7 2 4 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"ParkAvenue BT"; panose-1:3 2 6 2 5 5 6 8 7 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Square721 BT"; panose-1:2 11 5 4 2 2 2 6 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Broadway BT"; panose-1:4 4 9 5 8 11 2 2 5 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:135 0 0 0 27 0;} @font-face {font-family:"Microsoft Sans Serif"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627421663 -2147483648 8 0 66047 0;} @font-face {font-family:"Scruff LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Odessa LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Highlight LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"One Stroke Script LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Mekanik LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Tiranti Solid LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Pump Demi Bold LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Quixley LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"La Bamba LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Rage Italic LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Ruach LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Westwood LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Smudger LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Milano LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Victorian LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"University Roman LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Academy Engraved LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Orange LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"John Handy LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Jokerman LET"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:131 0 0 0 9 0;} @font-face {font-family:"Agency FB"; panose-1:2 11 5 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Arial Narrow"; panose-1:2 11 5 6 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Arial Rounded MT Bold"; panose-1:2 15 7 4 3 5 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Blackadder ITC"; panose-1:4 2 5 5 5 16 7 2 13 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT"; panose-1:2 7 6 3 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT Black"; panose-1:2 7 10 3 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Bodoni MT Condensed"; panose-1:2 7 6 6 8 6 6 2 2 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Book Antiqua"; panose-1:2 4 6 2 5 3 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bookman Old Style"; panose-1:2 5 6 4 5 5 5 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Bradley Hand ITC"; panose-1:3 7 4 2 5 3 2 3 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Calisto MT"; panose-1:2 4 6 3 5 5 5 3 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Castellar; panose-1:2 10 4 2 6 4 6 1 3 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Century Gothic"; panose-1:2 11 5 2 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Century Schoolbook"; panose-1:2 4 6 4 5 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Copperplate Gothic Bold"; panose-1:2 14 7 5 2 2 6 2 4 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Copperplate Gothic Light"; panose-1:2 14 5 7 2 2 6 2 4 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Curlz MT"; panose-1:4 4 4 4 5 7 2 2 2 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Edwardian Script ITC"; panose-1:3 3 3 2 4 7 7 13 8 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Elephant; panose-1:2 2 9 4 9 5 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Engravers MT"; panose-1:2 9 7 7 8 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Bold ITC"; panose-1:2 11 9 7 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Demi ITC"; panose-1:2 11 8 5 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Light ITC"; panose-1:2 11 4 2 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Eras Medium ITC"; panose-1:2 11 6 2 3 5 4 2 8 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Felix Titling"; panose-1:4 6 5 5 6 2 2 2 10 4; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Forte; panose-1:3 6 9 2 4 5 2 7 2 3; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Franklin Gothic Book"; panose-1:2 11 5 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Demi"; panose-1:2 11 7 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Demi Cond"; panose-1:2 11 7 6 3 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Heavy"; panose-1:2 11 9 3 2 1 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Franklin Gothic Medium Cond"; panose-1:2 11 6 6 3 4 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"French Script MT"; panose-1:3 2 4 2 4 6 7 4 6 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Garamond; panose-1:2 2 4 4 3 3 1 1 8 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:Gigi; panose-1:4 4 5 4 6 16 7 2 13 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Gill Sans MT Ext Condensed Bold"; panose-1:2 11 9 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans MT"; panose-1:2 11 5 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans MT Condensed"; panose-1:2 11 5 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans Ultra Bold"; panose-1:2 11 10 2 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gill Sans Ultra Bold Condensed"; panose-1:2 11 10 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Gloucester MT Extra Condensed"; panose-1:2 3 8 8 2 6 1 1 1 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Goudy Old Style"; panose-1:2 2 5 2 5 3 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Goudy Stout"; panose-1:2 2 9 4 7 3 11 2 4 1; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Haettenschweiler; panose-1:2 11 7 6 4 9 2 6 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"Imprint MT Shadow"; panose-1:4 2 6 5 6 3 3 3 2 2; mso-font-charset:0; mso-generic-font-family:decorative; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"MS Outlook"; panose-1:5 1 1 0 1 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Maiandra GD"; panose-1:2 14 5 2 3 3 8 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Monotype Corsiva"; panose-1:3 1 1 1 1 2 1 1 1 1; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"OCR A Extended"; panose-1:2 1 5 9 2 1 2 1 3 3; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Palace Script MT"; panose-1:3 3 3 2 2 6 7 12 11 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Papyrus; panose-1:3 7 5 2 6 5 2 3 2 5; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Perpetua; panose-1:2 2 5 2 6 4 1 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Perpetua Titling MT"; panose-1:2 2 5 2 6 5 5 2 8 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Pristina; panose-1:3 6 4 2 4 4 6 8 2 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rage Italic"; panose-1:3 7 5 2 4 5 7 7 3 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Rockwell; panose-1:2 6 6 3 2 2 5 2 4 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rockwell Condensed"; panose-1:2 6 6 3 5 4 5 2 1 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Rockwell Extra Bold"; panose-1:2 6 9 3 4 5 5 2 4 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Script MT Bold"; panose-1:3 4 6 2 4 6 7 8 9 4; mso-font-charset:0; mso-generic-font-family:script; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tw Cen MT"; panose-1:2 11 6 2 2 1 4 2 6 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Tw Cen MT Condensed"; panose-1:2 11 6 6 2 1 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:"Wingdings 2"; panose-1:5 2 1 2 1 5 7 7 7 7; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Wingdings 3"; panose-1:5 4 1 2 1 8 7 7 7 7; mso-font-charset:2; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Bookshelf Symbol 7"; panose-1:5 1 1 1 1 1 1 1 1 1; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Lucida Sans"; panose-1:2 11 6 2 3 5 4 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Lucida Sans Typewriter"; panose-1:2 11 5 9 3 5 4 3 2 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"MS Reference Sans Serif"; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"MS Reference Specialty"; panose-1:5 0 5 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"Tw Cen MT Condensed Extra Bold"; panose-1:2 11 8 3 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:7 0 0 0 3 0;} @font-face {font-family:ZWAdobeF; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:536885895 0 0 0 511 0;} @font-face {font-family:"Euro Sign"; panose-1:2 11 6 3 2 2 1 2 1 1; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:3 2 0 0 1 0;} @font-face {font-family:"Lucida Bright"; panose-1:2 4 6 3 7 5 5 2 4 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:7 0 0 0 147 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} ins {mso-style-type:export-only; text-decoration:none;} span.msoIns {mso-style-type:export-only; mso-style-name:""; text-decoration:underline; text-underline:single;} span.msoDel {mso-style-type:export-only; mso-style-name:""; text-decoration:line-through; color:aqua;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

درس چهارم - Direct3D مباحث پیشرفته

Mohsen_mahyar@yahoo.com

١

توابع ریاضی و ویژوال بیسیک

٢۶٣

Direct3D در D Studio Max های 3 object موضوع : استفاده از

بسازیم خودمان Direct3D تا بحال ما هر شیی را که می خواستیم در

بوسیله کد نویسی آنرا توصیف کرده ایم . ممکنست این سوال برایتان

پیش آمده باشد که بازیهای تجاری برای تولید کاراکترهای و اشیا

پیچیده سه بعدی چگونه عمل می کنند ؟

منطقی بنظر نمی رسد که اینگونه مدلهای پیچیده بصورت کد وارد

برنامه شده اند زیرا نیاز به هزاران خط برنامه برای هر فریم خواهد بود

های خود را توسط برنامه های دیگری می object . بجای اینکار ما

می کنیم سپس بافتها و load سازیم و آنها را در برنامه خودمان

های مورد نظر را به آنها اختصاص داده و در پایان آنها را material

رندر می کنیم . مزیت دیگر اینکار اینست که شما می توانید براحتی فایل

خود را تغییر دهید و مدلهایی با جزئیات متفاوت برای برنامه object

خود قرار دهید .

مراحل ساخت چنین برنامه هایی بصورت زیر است :

سه بعدی : object 1 - ساخت

اولین چیزی که بایستی بدانید داشتن دانش پایه ای از چگونگی

مدلسازی سه بعدی است . همچنین نیاز به یک نرم افزار مدلسازی مثل

دارید . D Studio Max3

٢۶۴

دارید تا Convertor نیاز به یک Max بعد از ساخت مدل خود در

هستند تبدیل ".X" که با فرمت Direct3D را به فایلهای Max فایلهای

کنید .

های زیادی برای تبدیل فایلهای نرم افزارهای مدلسازی به Convertor

وجود دارند که برخی از آنها عبارتند از : ".X" فایلهای

PolyTrans3D System Translation - برنامه

Deep Exploration - برنامه 2.0

Quick3D - برنامه

DWin - برنامه 3

DirectX Explorer Plugin -

که عبارتند از : DirectX 8.0 SDK - ابزارهای موجود در

X به فایلهای DS برای تبدیل فایلهای 3 Conv3DS برنامه

به Max و DS برای تبدیل فایلهای 3 DX SDK Exporter Plugin

X فایلهای

را به Deep Exploration ها من برنامه plugin از بین این برنامه ها و

شما پیشنهاد می کنم .

٢۶۵

در آدرس زیر می توانید اطلاعات بیشتری در مورد این برنامه بدست

کنید : Download آورید و همچنین آنرا

Exploration 2.0 Deep

s/n: 0XE2A0000000000

REJ1HYXSR1A77Q10 :Authorization s/n

ساخته شده : Object کردن یک Load - 2

direct3D کردن آن در load ، شی مورد نظر را ساختید X زمانیکه فایل

ساده است . برای اینکار نیاز به یک مش داریم که اطلاعات شی ما را

نگهداری کند :

Dim Mesh As D3DXMesh

به شی ، نیاز به تعریف texture و material همچنین برای اختصاص

متغیرهای زیر داریم :

٢۶۶

Dim MeshMaterial As D3DMATERIAL8

As Direct3DTexture8 Dim MeshTexture

می رویم : InitGeometry حال به سراغ بازنویسی روتین

- تعریف متغیرهای مورد نیاز :

Dim mtrlBuffer as D3DXBuffer

String Dim TextureFile as

Dim n as Long

: X - گرفتن داده های شی از فایل

Set Mesh=D3DX.LoadMeshFromX

"&"\"&app.path

yourfilename",D3DMESH_MANAGED,D3DDevice,Nothi

ng,mtrlBuffer,n

: Ambient شی و تنظیم پارامتر materiasl - استخراج اطلاعات

mtrlBuffer,0,MeshMaterial D3DX.BufferGetMaterial

MeshMaterial.Ambient=MeshMaterial.Diffuse

- استخراج نام بافت بکار رفته برای شی :

TextureFile=D3DX.BufferGetTextureName(mtrlBuffer,0)

x

- ساخت بافت :

Then ""<>If TextureFile

MeshTexture=D3DX.CreateTextureFromFile Set

٢۶٧

&"\"&D3DDevice,app.path

,TextureFile,128,128,D3DX_DEFAULT,0

D3DFMT_UNKNOWN,D3DPOOL_MANAGED,D3DX_F

ILTER_LINEAR,D3DX_FILTER_LINEAR,0,Byval

Byval 0,0

End If

3 - رندر نمودن شی : رندر نمودن شی چندان مشکل نیست اما همچنان

باید ماتریسها و تبدیلاتی را که می خواهید ، خودتان مدیریت کنید .

MeshMaterial D3DDevice.SetMaterial

D3DDevice.SetTexture 0,MeshTexture

Mesh.DrawSubset 0

درس دوم - Direct3D مباحث پیشرفته

Direct3D موضوع : مباحث تکمیلی نورپردازی در

٢۶٨

با مبانی نورپردازی آشنا شدید . در Direct3D در بخش اول آموزش

این درس قصد دارم آن مباحث را کاملتر برایتان مطرح کنم .

نورپردازی یکی از بخشهای مهم طراحی یک بازی و یا یک انیمیشن سه

بعدی است . بمنظور پیاده سازی نورپردازی یک صحنه ابتدا باید با

تئوری آن آشنا شوید .

تخمینی از چگونگی Direct3D تئوری نورپردازی : نورپردازی در

عملکرد نور در دنیای واقعی می باشد . چهار نوع اصلی نور در

قابل استفاده است ( همچنین شما می توانید خودتان انواع Direct3D

جدیدی از نور ایجاد کنید که موضوع ما نیست ) :

توسط یک نقطه در فضای سه بعدی ایجاد می شود : Point Light - 1

و دارای سه پارامتر رنگ ، دامنه و تضعیف می باشد . دامنه یک نور

مسافتی است که نور می تواند طی کند . تضعیف ، مقدار کاهش نور در

اثر افزایش مسافت می باشد . نور نقطه ای در تمام جهات تششع می کند

- شبیه یک لامپ حبابی و یا یک شمع

دارای یک موقعیت و یک جهت است و تنها نور را در : Spot Light - 2

یک جهت خاص می تاباند - شبیه یک چراغ قوه . این نور دارای یک زاویه

مخروطی و یک دامنه است .

دارای موقعیت نیست و برای پیاده سازی : Directional Light - 3

نورهایی که از فاصله بسیار دور می آیند - مثل خورشید - مناسب است

.

های یک vertex این نور تضمین می کند که تمام : Ambient Light - 4

صحنه تاریکتر از یک رنگ خاص نباشند .

عملی کردن نورپردازی : ضمن اینکه اغلب کارت های گرافیک سه بعدی از

نورپردازی پشتیبانی می کنند اما این نکته باید مورد توجه قرار گیرد که

بیشتر می شود Direct3D با افزایش تعداد نور در یک صحنه محاسبات

٢۶٩

و این باعث کند شدن رندر صحنه خواهد شد و بنابراین کارت های

گرافیکی سه بعدی نیز دارای یک ماکزیمم تعداد نور هستند - مثلا 16

همچنین توجه داشته باشید که نورهای مختلف - GeForce نور در 2

سریعترین زمان ambient دارای زمان پردازشی متفاوتی هستند . نور

و کندترین point سپس نور ، directional پردازشی را دارد ، سپس نور

است . Spot Light آنها

همچنین نکته دیگری که باید توجه کنید دامنه نور است . اگر نور ، یک

ها تاثیر می vertex منطقه بزرگی را پوشش دهد بر تعداد زیادی از

گذارد و این باعث افزایش محاسبات می شود .

که در درسهای بعدی در مورد آن صحبت می - Specular نورپردازی

کنم و برای ایجاد اشیا درخشان استفاده می شود - نیز زمان پردازشی

زیادی دارد و بهتر است کمتر از آن استفاده شود .

پارامتر دیگری که باید در نظر بگیرید جزئیات هندسه شما می باشد . هر

چه پیچیدگی صحنه بیشتر باشد ، نورپردازی نیز زمان بیشتری را

مصرف می کند .

سایه زنی نیز یک بخش بسیار پیچیده در مدل سازی نور است و

مستقیما Direct3D محاسبات آن بسیار زمان گیر خواهد بود بنابراین

محاسبات سایه زنی را انجام نمی دهد بلکه رنگ نور را بر مبنای جهت

می کند بنابراین قسمت پشتی یک شی که رو به نور scale هر مثلث

نیست ، هیچ نوری را دریافت نمی کند .

را بر مبنای بک بردار نرمال vertex هر Direct3D : بردار نرمال

دریافت می کند به زاویه بین vertex نورپردازی می کند و نوری که یک

بستگی دارد . بردار نرمال توسط سه vertex نور و بردار نرمال آن

مثلثی ایجاد می شود و این بردار نرمال ساخته شده به face یک vertex

٢٧٠

ها اختصاص می یابد . بردار نرمال در واقع سمت یک مثلث را vertex

مشخص می کند بنابراین اگر نور پشت مثلث باشد ، مثلث هیچ نوری را

دریافت نمیکند . بردار نرمال بایستی دارای طول 1 باشد .

مثلثی : face مراحل تولید بردار نرمال یک

در جهت عقربه های ساعت ساخته شده است . face 1 - مطمئن شوید که

شماره یک بسازید . vertex شماره صفر به vertex 2 - یک بردار از

شماره دو بسازید . vertex شماره صفر به vertex 3 - یک بردار از

این دو بردار را بدست ( cross droduct ) 4 - حاصلضرب برداری

آورید .

5 - نتیجه حاصلضرب را نرمال کنید .

Private Function GenerateTriangleNormals(p0 As

UnlitVertex, p1 As UnlitVertex, p2 As UnlitVertex) As

D3DVECTOR

D3DVECTOR Dim v01 As

Dim v02 As D3DVECTOR

Dim vNorm As D3DVECTOR

v01, MakeVector(p1.X, p1.Y, p1.Z), D3DXVec3Subtract

p0.Z)x ,MakeVector(p0.X, p0.Y

D3DXVec3Subtract v02, MakeVector(p2.X, p2.Y, p2.Z),

p0.Y, p0.Z)x ,MakeVector(p0.X

D3DXVec3Cross vNorm, v01, v02

vNorm ,D3DXVec3Normalize vNorm

GenerateTriangleNormals.X = vNorm.X

vNorm.Y = GenerateTriangleNormals.Y

٢٧١

GenerateTriangleNormals.Z = vNorm.Z

End Function

مشترک باشند ( مثل گوشه دو دیوار ) برای vertex در یک face اگر دو

را با روش فوق بدست face ابتدا نرمال دو vertex تولید نرمال این

آورید سپس دو بردار نرمال را با هم جمع کنید و در پایان بردار

حاصلجمع را نرمال کنید .

برپاسازی نورپردازی : اولین چیزی که قبل از برپاسازی نورپردازی

است . برای اینکار باید vertex بایستی اعمال کنیم تغییر ساختار

حذف و سه پارامتر را برای نگهداری vertex را از ساختار color پارامتر

نرمال اضافه کنیم :

Private Type UnlitVertex

X As Single

Single Y As

Z As Single

nx As Single

ny As Single

nz As Single

Single tu As

tv As Single

End Type

Const Unlit_FVF = (D3DFVF_XYZ Or

D3DFVF_NORMAL Or D3DFVF_TEX1)x

٢٧٢

های شی خود بردار نرمال را محاسبه vertex همچنین باید برای تمام

آن بردار face کنید برای مثال اگر شی شما یک مکعب است برای هر 12

نرمال را بدست آورید . در زیر من کد لازم برای ساخت نرمال یکی از این

ها را نوشته ام : face

x(0 ,Cube2(0) = CreateVertex(-1, -1, 1, 0, 0, 0, 0

Cube2(1) = CreateVertex(1, 1, 1, 0, 0, 0, 1, 1)x

CreateVertex(-1, 1, 1, 0, 0, 0, 0, 1)x = (Cube2(2

Cube2(1), ,(vN = GenerateTriangleNormals(Cube2(0

Cube2(2))x

= Cube2(0).nx = vN.X: Cube2(0).ny = vN.Y: Cube2(0).nz

vN.Z

= Cube2(1).nx = vN.X: Cube2(1).ny = vN.Y: Cube2(1).nz

vN.Z

Cube2(2).nx = vN.X: Cube2(2).ny = vN.Y: Cube2(2).nz =

vN.Z

خود اضافه device به material برای برپا سازی نور ابتدا بایستی یک

کنید :

Dim Mtrl As D3DMATERIAL8, Col As

D3DCOLORVALUE

Col.a = 1: Col.r = 1: Col.g = 1: Col.b = 1

Col = Mtrl.Ambient

Mtrl.diffuse = Col

D3DDevice.SetMaterial Mtrl

خود را تنظیم کنید که نور شما را بشناسد device سپس بایستی طوری

٢٧٣

است - یکبار که این خط را D3DLight یک شی از نوع 8 lights -

بنویسید می توانید از نور استفاده کنید اما اگر خصوصیات نور را

تغییر دهید بایستی دوباره این دستور را فراخوانی کنید :

D3DDevice.SetLight 0, Lights

حال باید نور را روشن کنید :

D3DDevice.LightEnable 0, 1

بگوئید که نورپردازی را برای شما انجام Direct3D و در پایان باید به

دهد :

1 ,D3DDevice.SetRenderState D3DRS_LIGHTING

چگونگی ایجاد یک نور : برای ایجاد هر یک از 4 نوع اصلی نور باید به

روشی خاص عمل کنید :

این نوع نورپردازی بسیار ساده است و تنها : Ambient 1 - نورپردازی

یک ambient ایجاد می شود . رنگ SetRenderState با فراخوانی تابع

است : RRGGBB عدد هگزادسیمال بصورت

,D3DDevice.SetRenderState D3DRS_AMBIENT

H202020&

دارای دو پارامتر رنگ و جهت می باشد : : Directional 2 - نورپردازی

٢٧۴

D3DLIGHT_DIRECTIONAL = Lights.Type

Lights.diffuse.r = 1

1 = Lights.diffuse.g

Lights.diffuse.b = 1

Lights.Direction = MakeVector(0, -1, 0)x

دارای سه پارامتر موقعیت ، رنگ و تضعیف می : Point 3 - نورپردازی

باشد :

Lights.Type = D3DLIGHT_POINT

MakeVector(5, 0, 2)x = Lights.position

Lights.diffuse.b = 1

100 = Lights.Range

Lights.Attenuation1 = 0.05

٢٧۵

این نور دارای دو مخروط است که نقاط خارج : Spot 4 - نورپردازی

مخروط اول روشنتر از نقاط داخل آن هستند . دو زاویه برای مخروط

که برحسب - phi و زاویه خارجی theta وجود دارد - زاویه داخلی

رادیان هستند :

D3DLIGHT_SPOT = Lights.Type

Lights.position = MakeVector(-4, 0, 0)x

100 = Lights.Range

Lights.Direction = MakeVector(1, 0, 0)x

x(180 / Lights.Theta = 30 * (Pi

Lights.Phi = 50 * (Pi / 180)x

1 = Lights.diffuse.g

Lights.Attenuation1 = 0.05

٢٧۶

درس سوم - Direct3D مباحث پیشرفته

برای ذخیره سازی اشکال سه Index Buffer موضوع : استفاده از

بعدی

مقدمه : مکعبی که در درسهای قبلی ساختیم را درنظر بگیرید . با دانشی

که اکنون دارید ، دو راه برای ساخت یک مکعب داریم : 1 - استفاده از 36

های مکعب 2 - ساخت مکعب با استفاده face برای تعریف vertex عدد

X از یک مدلساز و ذخیره آن با فرمت

vertex روش اول غیرکارامد است زیرا شما بایستی از تعداد زیادی

برای یک شکل بسیار ساده استفاده کنید . روش دوم مناسب است اما

زمانیکه بخواهیم رنگها و بافتها را تغییر دهیم دچار مشکل خواهیم شد .

Index روش جدیدی که امروز در مورد آن صحبت می کنم استفاده ار

است . Buffer

است که این اعداد مرجعی integer شامل یکسری عدد Index Buffer

هستند . برای Vertex Buffer های ذخیره شده در یک vertex برای

داریم که یک vertex شامل 8 عدد Vertex Buffer مثال فرض کنید یک

با Index Buffer مکعب را برای ما توصیف می کند . ما می توانیم یک

ها را برای ما مشخص vertex 36 عضو بسازیم بطوریکه ترتیب اتصال

شماره 1 face های 0 و 1و 3 برای مشخص کردن Index کنند . مثلا

می vertex مکعب بکار می روند . بنابراین بجای استفاده از 36 عدد

بسازیم . Index Buffer و یک vertex توانیم مکعب را با 8 عدد

بسیار کارامد است اما چندین محدودیت Index Buffer گرچه استفاده از

در استفاده از آن وجود دارد . مهمترین آنها اینست که تمام اندیسهایی که

می کنند بایستی خصوصیات مشابهی share مشابه را vertex یک

داشته باشند - موقعیت ، رنگ ، بافت و نرمال یکسان - برای مثال نمی

٢٧٧

آن یک رنگ داشته باشد . face توانید مکعبی بسازید که هر

ابتدا به متغیرهای زیر نیاز داریم : : Index Buffer ساخت

Dim VBuffer as Direct3DVertexBuffer8

as Direct3DIndexBuffer8 Dim IBuffer

Dim Vlist(0 to 7) as LITVERTEX

as Integer (Dim Ilist(0 to 35

بصورت زیر بازنویسی می شود: InitGeometry تابع

برای مکعب : vertex -1 تولید هشت

x(0 ,0 ,0 ,HFF0000& ,Vlist(0) = CreateLitVertex(-1, -1, -1

x(0 ,0 ,0 ,&HFF00& ,Vlist(1) = CreateLitVertex(-1, 1, -1

x(0 ,0 ,0 ,&HFF& ,Vlist(2) = CreateLitVertex(1, -1, -1

HFF00FF, 0, 0, 0)x& ,Vlist(3) = CreateLitVertex(1, 1, -1

HFFFF00, 0, 0, 0)x& ,CreateLitVertex(-1, -1, 1 = (Vlist(4

HFFFF, 0, 0, 0)x& ,CreateLitVertex(-1, 1, 1 = (Vlist(5

HFFCC00, 0, 0, 0)x& ,1 ,1- ,Vlist(6) = CreateLitVertex(1

HFFFFFF, 0, 0, 0)x& ,Vlist(7) = CreateLitVertex(1, 1, 1

: CreateVertexBuffer توسط تابع Vertex Buffer 2 - ایجاد

= Set VBuffer

D3DDevice.CreateVertexBuffer(Len(Vlist(0)) * 8, 0,

D3DPOOL_DEFAULT)x ,Lit_FVF

٢٧٨

,D3DVertexBuffer8SetData VBuffer, 0, Len(Vlist(0)) * 8, 0

Vlist(0)x

ها : index 3 - تولید

' front

2 = (Ilist(0) = 0: Ilist(1) = 1: Ilist(2

Ilist(3) = 1: Ilist(4) = 3: Ilist(5) = 2

' Right

Ilist(7) = 3: Ilist(8) = 6 :Ilist(6) = 2

Ilist(9) = 3: Ilist(10) = 7: Ilist(11) = 6

' Back

Ilist(12) = 6: Ilist(13) = 7: Ilist(14) = 4

Ilist(17) = 4 :5 = (Ilist(15) = 7: Ilist(16

' Left

0 = (Ilist(18) = 4: Ilist(19) = 5: Ilist(20

Ilist(21) = 5: Ilist(22) = 1: Ilist(23) = 0

' Top

Ilist(25) = 5: Ilist(26) = 3 :Ilist(24) = 1

3 = (Ilist(27) = 5: Ilist(28) = 7: Ilist(29

' Bottom

Ilist(30) = 2: Ilist(31) = 6: Ilist(32) = 0

Ilist(34) = 4: Ilist(35) = 0 :Ilist(33) = 6

: CreateIndexBuffer توسط تابع Index Buffer 4 - ایجاد

D3DDevice.CreateIndexBuffer(Len(Ilist(0)) * = Set IBuffer

D3DPOOL_DEFAULT)x ,36, 0, D3DFMT_INDEX16

٢٧٩

,D3DIndexBuffer8SetData IBuffer, 0, Len(Ilist(0)) * 36, 0

Ilist(0)x

برای رندر کردن این مکعب دو روش وجود دارد : : Render تابع

در این روش از : DrawIndexedPrimitive 1 - استفاده از تابع

ها استفاده می شود : vertex و آرایه IBUffer و VBuffer

Public Sub Render()x

D3DCLEAR_TARGET Or ,D3DDevice.Clear 0, ByVal 0

0 ,D3DCLEAR_ZBUFFER, 0, 1#

D3DDevice.BeginScene

Len(Vlist(0))x ,D3DDevice.SetStreamSource 0, VBuffer

0 ,D3DDevice.SetIndices IBuffer

D3DDevice.DrawIndexedPrimitive

12 ,D3DPT_TRIANGLELIST, 0, 36, 0

D3DDevice.EndScene

0 D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal

End Sub

در این روش از : DrawIndexedPrimitiveUP 2 - استفاده از تابع

استفاده می شود : index و vertex آرایه های

Public Sub Render()x

D3DCLEAR_TARGET Or ,D3DDevice.Clear 0, ByVal 0

0 ,D3DCLEAR_ZBUFFER, 0, 1#

D3DDevice.BeginScene

D3DDevice.DrawIndexedPrimitiveUP

D3DPT_TRIANGLELIST, 0, 8, 12, Ilist(0),

٢٨٠

Len(Vlist(0))x ,(D3DFMT_INDEX16, Vlist(0

D3DDevice.EndScene

ByVal 0 ,0 ,D3DDevice.Present ByVal 0, ByVal 0

End Sub

نکته : برای دریافت برنامه نمونه و یا اطلاعات بیشتر در مورد توابعی که

در این درس استفاده شد با من تماس بگیرید .

درس چهارم - Direct3D مباحث پیشرفته

Vertex/Mesh Animation : موضوع

صحبت Direct3D در این درس در مورد روشهای ساخت انیمیشن در

خواهیم کرد . انیمیشن در فضای سه بعدی در حالتهای مختلفی می تواند

گرافیکی شما و ابزارهایی که ایجاد کرده engine ایجاد شود که بسته به

اید ، دارد . سه روش اصلی ساخت انیمیشن وجود دارد که عبارتند از :

manual ) سازی دستی / درون یابی خطی Tween -

( tweening/linear interpolation

( vector interpolation ) - درون بابی برداری

٢٨١

( interpolation keyframe ) - درون یابی بر اساس فریم کلیدی

1 – روش اول یکی از ساده ترین راههای ساخت انیمیشن است . این

روش در زمانیکه با مدلهای پیچیده سر و کار دارید مناسب نیست – و یا

کردن است که tween این روش نوعی – vertex مدلهایی با تعداد زیادی

ها استفاده می کند . index buffer از مزیت

درون یابی ، چگونگی تغییرات شیی در طول یک زمان مشخص می باشد

. در درسهای قبلی شما درون یابی رنگ را روی یک شی دیدید که در آن

شدن ( . درون fade ) یک رنگ بطور ملایم به رنگ دیگری تبدیل می شد

به A یابی خطی نیز مشابه آن است . برای درون یابی خطی از موقعیت

از فرمول زیر استفاده می شود : B موقعیت

(B*V)+A*(1-V)

ضریب درون یابی است V مختصاتهای مبدا و مقصد هستند و B و A که

را tween که عددی بین صفر و یک می باشد . این فرمول مختصات نقطه

در هر لحظه مشخص می کند .

همانطور که می بینید بکار بردن این فرمول برای یک شی با تعداد زیادی

را پایین می آورد . fram rate بسیار وقت گیر بوده و vertex

و یک مقدار ضریب درون یابی را می گیرد تا نقطه vertex تابع زیر دو

را محاسبه کند : tween

,Private Function TweenVertices(Source As LITVERTEX

Dest As LITVERTEX, TweenAmount As Single) As

LITVERTEX

Dest.X * TweenAmount) + Source.X * ) = TweenVertices.X

(1# - TweenAmount)x

Dest.Y * TweenAmount) + Source.Y * ) = TweenVertices.Y

(1# - TweenAmount)x

٢٨٢

Dest.Z * TweenAmount) + Source.Z * ) = TweenVertices.Z

(1# - TweenAmount)x

Source.color = TweenVertices.color

End Function

هایی با بردار vertex – استفاده کنید UNLIT های vertex اگر شما از

را از tween نرمال – در اینصورت باید کد فوق را تغییر دهید و باید

نرمال مبدا به نرمال مقصد نیز انجام دهید .

نیز تنظیم شده است . در یک tween vertex همانطور که می بینید رنگ

مناسبتر می توانید رنگها ، مختصات بافت و مقادیر tweening تابع

کنید . tween را نیز specular

محدودیتی که این روش دارد اینست که خطی است و برای مدل کردن

حرکتهای غیر خطی درست کار نمی کند .

استفاده کنیم تا یک مکعب را در یک tween حال می خواهیم از تابع

انیمیشن به یک هرم تبدیل کنیم . ابتدا سه شی را بصورت زیر تعریف

می کنیم :

است’ source cube همان current cube در ابتدای انیمیشن ، شی

HFF0000, & ,CubeVertices(0) = CreateLitVertex(-1, -1, -1

x(0 ,0, 0

,0 ,&HFF00& ,CubeVertices(1) = CreateLitVertex(-1, 1, -1

x(0 ,0

,0 ,0 ,&HFF& ,CubeVertices(2) = CreateLitVertex(1, -1, -1

x(0

HFF00FF, 0, & ,CubeVertices(3) = CreateLitVertex(1, 1, -1

x(0 ,0

٢٨٣

HFFFF00, & ,CubeVertices(4) = CreateLitVertex(-1, -1, 1

x(0 ,0, 0

,HFFFF, 0, 0& ,CubeVertices(5) = CreateLitVertex(-1, 1, 1

x(0

HFFCC00, 0, & ,CubeVertices(6) = CreateLitVertex(1, -1, 1

x(0 ,0

HFFFFFF, 0, & ,CubeVertices(7) = CreateLitVertex(1, 1, 1

0, 0)x

مکعب اولیه

,CubeVerticesSource(0) = CreateLitVertex(-1, -1, -1

HFF0000, 0, 0, 0)x&

,CubeVerticesSource(1) = CreateLitVertex(-1, 1, -1

x(0 ,0 ,0 ,&HFF00&

,CubeVerticesSource(2) = CreateLitVertex(1, -1, -1

x(0 ,0 ,0 ,&HFF&

,CubeVerticesSource(3) = CreateLitVertex(1, 1, -1

HFF00FF, 0, 0, 0)x&

,CubeVerticesSource(4) = CreateLitVertex(-1, -1, 1

HFFFF00, 0, 0, 0)x&

,CubeVerticesSource(5) = CreateLitVertex(-1, 1, 1

HFFFF, 0, 0, 0)x&

,CubeVerticesSource(6) = CreateLitVertex(1, -1, 1

HFFCC00, 0, 0, 0)x&

,CubeVerticesSource(7) = CreateLitVertex(1, 1, 1

HFFFFFF, 0, 0, 0)x&

هرم مقصد

,CreateLitVertex(-1, -1, -1 = (CubeVerticesDest(0

HFF0000, 0, 0, 0)x&

٢٨۴

,CreateLitVertex(-0.1, 1, -0.1 = (CubeVerticesDest(1

x(0 ,0 ,0 ,&HFF00&

,&HFF& ,CreateLitVertex(1, -1, -1 = (CubeVerticesDest(2

x(0 ,0 ,0

,CreateLitVertex(0.1, 1, -0.1 = (CubeVerticesDest(3

HFF00FF, 0, 0, 0)x&

,CreateLitVertex(-1, -1, 1 = (CubeVerticesDest(4

HFFFF00, 0, 0, 0)x&

,CreateLitVertex(-0.1, 1, 0.1 = (CubeVerticesDest(5

HFFFF, 0, 0, 0)x&

,CreateLitVertex(1, -1, 1 = (CubeVerticesDest(6

HFFCC00, 0, 0, 0)x&

,CreateLitVertex(0.1, 1, 0.1 = (CubeVerticesDest(7

HFFFFFF, 0, 0, 0)x&

پیکسلهای twen حال باید در یک حلقه با استفاده از تابع

کنیم : update را CubeVertices

Private Sub UpdateAnimation()x

Integer Dim I As

به روز کردن پارامترهای زمان و جهت'

Then If AnimTweenDir = True

AnimTweenFactor = AnimTweenFactor +

(#1*(1000 / ((((GetTickCount() - LastTimeTweened

LastTimeTweened = GetTickCount

Then #1 =< If AnimTweenFactor

AnimTweenFactor = 1#

AnimTweenDir = False

If End

Else

٢٨۵

AnimTweenFactor = AnimTweenFactor -

(LastTimeTweened) / 1000)*1# - ()(((GetTickCount

LastTimeTweened = GetTickCount

Then #0 => AnimTweenFactor If

AnimTweenFactor = 0#

True = AnimTweenDir

End If

End If

ها ' vertex به روز کردن اطلاعات

7 For I = 0 To

CubeVertices(I) = TweenVertices(CubeVerticesSource(I),

AnimTweenFactor)x ,(CubeVerticesDest(I

Next I

’vertex به روز کردن بافر

D3DVertexBuffer8SetData(VBuffer, 0, If

CubeVertices(0)) = ,Len(CubeVertices(0)) * 8, 0

:D3DERR_INVALIDCALL Then GoTo Error

Sub Exit

:Error

Debug.Print “Error occured whilst updating the

animation…”x

End Sub

زمان پایه انیمیشن توسط عبارت زیر تنظیم می شود :

(GetTickCount() - LastTimeTweened) / 1000) * 1#)))

همانطور که می دانید دو نوع انیمیشن وجود دارد : انیمیشن بر مبنای

شماره frame و انیمیشن بر مبنای زمان . در انیمیشن بر مبنای frame

فریم با یک مقدار ثابت در زمان افزایش می یابد اما اگر اینکار باعث می

شود کیفیت انیمیشن در کامپیوترهای با سرعت متفاوت تغییر کند .

٢٨۶

بنابراین انیمیشن را بر مبنای زمان تولید کرده ایم . انیمیشن های بر

مبنای زمان بجای " 1 فریم در هر سیکل " ، " 30 فریم در هر ثانیه "

هستند .

tweening برای انجام عمل D3DX 2 – روش دوم از توابع کتابخانه

استفاده می کند و بنابراین بهبودی در سرعت انیمیشن نسبت به روش

می توانیم عمل D3DX بالا حاصل می شود . با استفاده از کتابخانه

انجام دهیم . لیست vertex درون یابی خطی را برای تمام اجزا اصلی یک

زیر توابعی را برای اینکار نشان می دهد :

انجام درون یابی برای موقعیت و نرمال : : D3DXVec3Lerp - تابع

D3DXVec3Lerp( VOut as D3DVECTOR, V1 as

as D3DVECTOR, S as Single)x D3DVECTOR, V2

VOut = The result of the interpolation -

The source coordinates = V1 -

V2 = The destination coordinates -

interpolation amount - between, but not limited S = The -

the source and 1 is the to, 0.0 - 1.0 scale; where 0 is

destination

: vertex انجام درون یابی برای رنگهای : D3DXColorLerp - تابع

D3DXColorLerp( COut as D3DCOLORVALUE, C1 as

D3DCOLORVALUE, C2 as D3DCOLORVALUE, S as

Single)x

colour COut = The resulting -

C1 = The source colour -

٢٨٧

C2 = The destination colour -

,interpolant S = The -

on a 0.0 to 1.0 scale

انجام درون یابی برای مختصاتهای دوبعدی : D3DXVec2Lerp - تابع

:

VOut = The result of this interpolation -

coordinates V1 = The source -

V2 = The destination coordinates -

to 1.0 scale 0,0 S = The interpolant on a -

تولید یک مسیر منحنی که از دو نقطه : D3DXVec3Hermite - تابع

کنترل عبور می کند :

D3DXVec3Hermite( VOut as D3DVECTOR, V1 as

T1 as D3DVECTOR, V2 as D3DVECTOR, ,D3DVECTOR

T2 as D3DVECTOR, S as Single)x

Result VOut = The -

V1 = The Source Coordinate -

coordinate, this is the T1 = The Tangent at the Source -

.point direction and speed the line will leave the source

V2 = The Destination Coordinate -

Destination coordinate, this is T2 = The Tangent at the -

destination the direction and speed the line will enter the

.point

S = The Interpolant Value -

٢٨٨

استفاده کنیم باید توصیف D3DX برای اینکه بتوانیم از کتابخانه

اضافی ARGB هایمان را تغییر دهیم و بایستی یکسری مقادیر vertex

اضافه کنیم : vertex را به ساختار

Private Type LITVERTEX

X As Single

Single Y As

Z As Single

color As Long

specular As Long

tu As Single

As Single tv

ColorEx As D3DCOLORVALUE

End Type

را بصورت زیر می نویسیم : tween حال تابع

,Private Function TweenVertices(Source As LITVERTEX

Dest As LITVERTEX, TweenAmount As Single) As

LITVERTEX

D3DVECTOR Dim vResult As

Dim vResult2 As D3DVECTOR2

ها ‘ vertex کردن موقعیت Tween

D3DXVec3Lerp vResult, MakeVector(Source.X, Source.Y,

MakeVector(Dest.X, Dest.Y, Dest.Z), ,(Source.Z

TweenAmount

vResult.X = TweenVertices.X

TweenVertices.Y = vResult.Y

TweenVertices.Z = vResult.Z

’ texture کردن اطلاعات Tween

,D3DXVec2Lerp vResult2, MakeVector2D(Source.tu

Source.tv), MakeVector2D(Dest.tu, Dest.tv),

٢٨٩

TweenAmount

vResult2.X = TweenVertices.tu

TweenVertices.tv = vResult2.Y

کردن اطلاعات رنگ ‘ Tween

D3DXColorLerp TweenVertices.ColorEx,

TweenAmount ,Source.ColorEx, Dest.ColorEx

With TweenVertices.ColorEx

G * 255, .R * 255)x. ,TweenVertices.color = RGB(.B * 255

End With

End Function

نکته ای که باید به آن توجه کنید اینست که در تابع فوق برای اشاره به

. ( MakeVector یک بردار ساخته شده است ( توسط تابع ، vertex

3 – روش سوم پر استفاده ترین روش انیمیشن سازی است . اگر شما

انیمیشن های پیچیده با تعداد زیادی شی در آن داشته باشید و اگر

بخواهید تغییرات اشیا را در هر فریم ذخیره کنید ، به حجم بالایی از

منابع ذخیره سازی نیاز است . بجای آن ما با استفاده از یکسری فریم

کلیدی ، فریمهای میانی را پیش بینی می کنیم .

را در هر فریم vertex برای انجام درون یابی فریم کلیدی ، بایستی مقدار

کلیدی بدانیم و نیز بدانیم هر فریم کلیدی در چه زمانی ظاهر می شود .

بنابراین باید برای هر انیمیشن چند فایل را بعنوان فریم کلیدی ذخیره

کنیم .

می load در این درس ما داده های کلیدی انیمیشن را از یکسری فایل

درون برنامه قرار داده می keyframe کنیم بنابراین تمام ثابتهای زمان

شود ( شما می توانید خودتان یک ماژول بنویسید که انیمیشن های

عمومی تر را نیز مدیریت کند . این ماژول باید قادر باشد که یک فرمت

load های مربوطه را texture کند ، اشیا و import استاندارد فایل را

٢٩٠

نماید و سپس خودش ساخت انیمیشن را بطور اتوماتیک انجام دهد و

را فراخوانی کند ) . پس update و یا render برنامه اصلی فقط روتین

از جمع آوری اطلاعات فریم های کلیدی ، باید در هر زمان محاسبه کنیم

که چه مدتی از شروع انیمیشن گذشته است و بنابراین انیمیشن در چه

موقعیتی قرار دارد . سپس محاسبه می کنیم که فریم کلیدی قبلی و فریم

کلیدی بعدی چیست همچنین حساب می کنیم در چه فاصله زمانی از

ایندو قرار داریم . سرانجام یک درون یابی نرمال را انجام می دهیم تا

Mesh اطلاعات فریم جاری بدست آید و این اطلاعات را درون یک شی

می گذاریم و آنرا رندر می کنیم .

صحبت کردم X کردن اشیا از یک فایل load در درسهای قبلی در مورد

صحبت Mesh از یک شی vertex اما در مورد چگونگی گرفتن اطلاعات

برای اینکار دو تابع دارد : D3DX نشد . کتابخانه

اطلاعات یک شی : D3DXMeshVertexBuffer8GetData - تابع

ذخیره می D3DVERTEX را گرفته و در یک آرایه از D3DXMesh

کند :

D3DXMeshVertexBuffer8GetData( D3DXMeshobj As

Unknown, Offset As Long, Size As Long, Flags As Long,

Data As Any) As Long

D3DXMeshobj As Unknown = A D3DXMESH object -

.from that you want to extract the data

Offset As Long = How far into the vertex buffer we want -

reading, 0 is the beginning to start

will be Size As Long = Size of the vertex buffer, this -

Len(D3DVERTEX) * Mesh.GetNumVertices

of the Flags As Long = A combination -

.CONST_D3DLOCKFLAGS, leave as 0

٢٩١

the array that you Data As Any = The first element in -

want the data to be read into, should be an array of

D3DVERTEX vertices

Return Code As Long = Returns D3D_OK for success, or -

either of D3DERR_INVALIDCALL or E_INVALIDARG

for an error

اطلاعات یک بافر : D3DXMeshVertexBuffer8SetData - تابع

قرار می دهد : D3DXMesh را در یک شی vertex

D3DXMeshVertexBuffer8SetData( D3DXMeshobj As

Unknown, Offset As Long, Size As Long, Flags As Long,

Data As Any) As Long

D3DXMeshobj As Unknown = The D3DXMESH object -

data to be placed that defines where you want the

Offset As Long = How far into the Destination vertex -

buffer you want to place the data

bytes, this will be Size As Long = The Size of the buffer in -

Len(D3DVERTEX) * Mesh.GetNumVertices

Combination of the Flags As Long = A -

CONST_D3DLOCKFLAGS, leave as 0

element in the array of data you Data As Any = The first -

want placed in the mesh's vertex buffer

Return Code As Long = D3D_OK for success or -

for D3DERR_INVALIDCALL or E_INVALIDARG

failure

عملیات انجام انیمیشن فریم کلیدی بصورت زیر است :

D3DXMesh به درون شی X کردن اشیا از فایلهای load -

٢٩٢

از این شی vertex - استخراج اطلاعات

- انجام درون یابی بین فریمهای کلیدی

D3DXMesh های درون یابی در یک شی vertex - قرار دادن اطلاعات

باشد – n فرض می کنیم که انیمیشن ما همیشه از زمان صفر تا زمان

برای GetTickCount برحیب میلی ثانیه – بنابراین می توانیم از

توابع زمانی خود استفاده کنیم . همچنین یک ساختار را برای هر فریم

کلیدی بصورت زیر تعریف می کنیم :

Private Type KeyFrame

Mesh As D3DXMesh ’ شده از یک فایل load شی

MatList() As D3DMATERIAL برای هر شی’ 8 material آرایه

Texture’ TexList() As Direct3DTexture آرایه 8

nMaterials ’ هایی که استفاده می کنیم texture ها و material تعداد

As Long

VertexList() As ’ برای این فریم کلیدی vertex داده های

D3DVERTEX

As Long TimeIndex ’ موقعیت این فریم کلیدی در انیمیشن

End Type

استخراج کرده و X حال باید تابعی بنویسیم که اطلاعات را از یک فایل

درون فریم کلیدی قرار دهد :

Private Function CreateKeyFrameFromFile(Filename As

String, TexturePrefix As String, Time As Long) As

KeyFrame

’ Filename : برای شی سه بعدی X نام فایل

این شی در آن قرار دارد : texture پوشه ای که اطلاعات

’ TexturePrefix

  ٢٩٣

' Time : اندیس زمان برای این فریم کلیدی

Long Dim I As

Dim XBuffer As D3DXBuffer

Dim TextureFile As String

Long Dim hResult As

'خواندن اطلاعات از فایل ورودی به حافظه

CreateKeyFrameFromFile.Mesh = Set

D3DX.LoadMeshFromX(Filename,

D3DDevice, Nothing, XBuffer, ,D3DXMESH_MANAGED

CreateKeyFrameFromFile.nMaterials)x

ها ‘ texture ها و material تولید

ReDim

CreateKeyFrameFromFile.MatList(CreateKeyFrameFro

D3DMATERIAL8 mFile.nMaterials) As

ReDim

CreateKeyFrameFromFile.TexList(CreateKeyFrameFrom

Direct3DTexture8 File.nMaterials) As

For I = 0 To CreateKeyFrameFromFile.nMaterials - 1

,D3DX.BufferGetMaterial XBuffer, I

CreateKeyFrameFromFile.MatList(I)x

= CreateKeyFrameFromFile.MatList(I).Ambient

CreateKeyFrameFromFile.MatList (I).diffuse

D3DX.BufferGetTextureName(XBuffer, I)x = TextureFile

Then "" <> If TextureFile

= (Set CreateKeyFrameFromFile.TexList(I

D3DX.CreateTextureFromFileEx(D3DDevice,

D3DX_DEFAULT, ,TextureFile & TexturePrefix

D3DX_DEFAULT, D3DX_DEFAULT, 0,

,D3DFMT_UNKNOWN, D3DPOOL_MANAGED

,0 ,D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR

ByVal 0, ByVal 0)x

If End

 

٢٩۴

Next I

’vertex استخراج داده های

ReDim

CreateKeyFrameFromFile.VertexList(CreateKeyFrameFr

D3DVERTEX omFile.Mesh.GetNumVertices) As

hResult =

D3DXMeshVertexBuffer8GetData(CreateKeyFrameFrom

((Len(CreateKeyFrameFromFile.VertexList(0 ,0 ,File.Mesh

,reateKeyFrameFromFile.Mesh.GetNumVertices, 0 *

((CreateKeyFrameFromFile.VertexList(0

CreateKeyFrameFromFile.TimeIndex = Time

End Function

خطوط زیر را برای ساخت فریم های کلیدی اضافه Initialize در تابع

می کنیم :

nKeyFrames = 4

2500 = kfAnimLength

AnimLastStartAt = GetTickCount()x

KeyFrame ReDim kfAnim(nKeyFrames - 1) As

& kfAnim(0) = CreateKeyFrameFromFile(App.Path

x(0 ,"\" & App.Path ,"frame0.x\"

& kfAnim(1) = CreateKeyFrameFromFile(App.Path

kfAnimLength * (1 / 3))x ,"\" & frame1.x", App.Path\"

& CreateKeyFrameFromFile(App.Path = (kfAnim(2

kfAnimLength * (2 / 3))x ,"\" & frame2.x", App.Path\"

& kfAnim(3) = CreateKeyFrameFromFile(App.Path

kfAnimLength)x ,"\" & frame3.x", App.Path\"

& CreateKeyFrameFromFile(App.Path = kfCurrent

(0 ,"\" & frame0.x", App.Path\"

 

 

٢٩۵

دقت کنید که از یک اندیس زمان برای ساخت فریم های کلیدی استفاده

شده است .

حال باید کدی برای نمایش دادن انیمیشن بنویسیم . ابتدا باید به روشی

تغییرات فریمها را کنترل کنیم :

For I = 0 To nKeyFrames - 2

kfAnim(I).TimeIndex Then =< If CurrentTimeIndex

PrevFrame = I

NextFrame = I + 1

If End

Next I

دو فریم کلیدی و زمان جاری ، index سپس باید با توجه به زمان

پارامتر درون یابی را محاسبه کنیم :

sTime = kfAnim(PrevFrame).TimeIndex

kfAnim(NextFrame).TimeIndex = eTime

cTime = CurrentTimeIndex

sTime - eTime = eTime

cTime = cTime - sTime

sTime = sTime - sTime

cTime / eTime = InterpolateAmount

سپس باید بر اساس این پارامتر عمل درون یابی را روی داده های

انجام دهیم : vertex

For I = 0 To kfCurrent.Mesh.GetNumVertices

'درون یابی مختصاتها

٢٩۶

,D3DXVec3Lerp vTemp3D

MakeVector(kfAnim(PrevFrame).VertexList(I).X,

_ ,kfAnim(PrevFrame).VertexList(I).Y

,(kfAnim(PrevFrame).VertexList(I).Z

MakeVector(kfAnim(NextFrame).VertexList(I).X,

_ ,kfAnim(NextFrame).VertexList(I).Y

InterpolateAmount ,(kfAnim(NextFrame).VertexList(I).Z

vTemp3D.X = kfCurrent.VertexList(I).X

kfCurrent.VertexList(I).Y = vTemp3D.Y

vTemp3D.Z = kfCurrent.VertexList(I).Z

'درون یابی نرمالها

,D3DXVec3Lerp vTemp3D

,MakeVector(kfAnim(PrevFrame).VertexList(I).nx

_ ,kfAnim(PrevFrame).VertexList(I).ny

,(kfAnim(PrevFrame).VertexList(I).nz

,MakeVector(kfAnim(NextFrame).VertexList(I).nx

_ ,kfAnim(NextFrame).VertexList(I).ny

InterpolateAmount ,(kfAnim(NextFrame).VertexList(I).nz

vTemp3D.X = kfCurrent.VertexList(I).nx

vTemp3D.Y = kfCurrent.VertexList(I).ny

kfCurrent.VertexList(I).nz = vTemp3D.Z

'درون یابی اطلاعات بافت

D3DXVec2Lerp vTemp2D,

,MakeVector2D(kfAnim(PrevFrame).VertexList(I).tu

_ ,(kfAnim(PrevFrame).VertexList(I).tv

                      ٢٩٧

,MakeVector2D(kfAnim(NextFrame).VertexList(I).tu

InterpolateAmount ,(kfAnim(NextFrame).VertexList(I).tv

vTemp2D.X = kfCurrent.VertexList(I).tu

kfCurrent.VertexList(I).tv = vTemp2D.Y

Next I

برگردانیم : Mesh حال باید داده تولید شده را به فرمت

= hResult

D3DXMeshVertexBuffer8SetData(kfCurrent.Mesh, 0,

* ((Len(kfCurrent.VertexList(0

kfCurrent.Mesh.GetNumVertices, 0,

kfCurrent.VertexList(0))x

با استفاده از روش فوق می توانید هر تعداد فریم کلیدی را به انیمیشنتان

برای texture اضافه کنید . اشکالی که روش فوق دارد اینست که اطلاعات

در تمام texture تمام فریمهای کلیدی جداگانه ذخیره شده است در حالیکه

texture pooling فریمها ثابت است . در درسهای بعدی از روشی بنام

ها نگهداری کنیم . texture استفاده می کنیم تا تنها یک کپی از

بخش اول - DirectXAudio آموزش

بخش اول - DirectXAudio آموزش

                                                       

                                                                                                                                    

٢٩٨

موضوع : پخش افکتهای صوتی در برنامه های مالتی مدیا

شما تکنیکهای لازم برای DirectXAudio مقدمه : در سلسله مباحث

اضافه کردن موزیک و افکتهای صوتی سریع و دینامیک را به بازیها و

جایگزینی DirectXAudio . برنامه های مالتی مدیا خواهید آموخت

DirectMusic و DirectSound3D ،DirectSound برای بخشهای

می باشد و دارای امکانات بهتر و سریعتری بوده DirectX موجود در 7

و برنامه نویسی آن نیز ساده تر است .

چگونگی پخش افکتهای صوتی را در DirectXAudio در اولین درس از

برنامه هایتان خواهید آموخت .

: DirectSound کردن Initial

اولین مبحثی است که آنرا توضیح خواهم داد . گرچه DirectSound

می DirectX یک نام عمومی برای امکانات صوتی 8 DirectXAudio

تفاوت وجود دارد . Music و Sound باشد اما بین

DirectSound . با پخش افکتهای صوتی ارتباط دارد DirectSound

سخت افزاری و نرم افزاری device از یکسری Direct3D همانند

استفاده می کند و افکتهای صوتی در یکسری بافر ذخیره می شوند .

اضافه کردن کتابخانه ، DirectSound اولین قدم برای برپاسازی

به پروژه تان می باشد . قدم بعدی تعریف متغیرها و DirectX8

به DirectSound های موردنیاز است . برای استفاده از object

متغیرهای زیر نیاز داریم :

Private DX As DirectX8

DirectSound8 Private DS As

Private DSBuffer As DirectSoundSecondaryBuffer8

                              

                                                                          

٢٩٩

DSEnum As DirectSoundEnum8 Private

Private bLoaded As Boolean

واسط DirectSound شی کنترل کننده مرکزی است . 8 DirectX

های پخش صدا است . interface مراقب برای تمام

واقعی را برای پخش audio داده DirectSoundSecondaryBuffer8

اجازه می دهد که اطلاعاتی را DirectSoundEnum ذخیره می کند . 8

های سخت افزاری/نرم افزاری استخراج کنید و متغیر device در مورد

وضعیت می باشد . flag یک bLoaded

های در دسترس را مشخص کنیم device حال در برنامه باید لیست تمام

device . ( این امر کاملاً امکان پذیر است که یک کامپیوتر بیش از یک

داشته باشد ) : DirectSound برای

Private Sub Form_Load()x

bLoaded = False

As Long Dim I

Set DX = New DirectX8

Set DSEnum = DX.GetDSEnum

DSEnum.GetCount For I = 1 To

MsgBox(DSEnum.GetDescription(I))x

Next I

Sub End

های شناخته شده را انتخاب کردیم . حال device فرض کنیم که یکی از

را واقعا برپا کنیم : device بایستی

If bLoaded Then

Set DSBuffer = Nothing

Nothing = Set DS

Set DX = Nothing

 

٣٠٠                                                                                                          

End If

Dim DSBDesc As DSBUFFERDESC

New DirectX8 = Set DX

= Set DS

DX.DirectSoundCreate(DSEnum.GetGuid(devicenumber)

)x

frmMain.hWnd, DS.SetCooperativeLevel

DSSCL_NORMAL

ای است که شما می خواهید با آن device شماره devicenumber متغیر

فایل صوتی شما را توصیف می کند . DSBDesc . کار کنید

بخش دوم - DirectXAudio آموزش

موضوع : پخش افکتهای صوتی در برنامه های مالتی مدیا

را DirectSound کردن آن : تاکنون ما توانستیم play ساخت بافر و

های component کنیم . همانطور که می دانید در تمام initial

داده ها در یکسری بافر ذخیره می شوند . در مورد DirectX

نیز ما یک بافر با نام DirectSound

می سازیم و داده های صوتی را DirectSoundSecondaryBuffer8

در آن قرار می دهیم . برخی پارامتر ها هستند که باید برای بافر تنظیم

بودن بافر ، 8 بیتی یا 16 بیتی بودن بافر ، mono یا stereo : شوند مثل

44 و غیره ) . اگر این پارامترها را khz ،khz فرکانس صوتی ( 22

از اطلاعات فایل صوتی استفاده می کند . DirectSound مشخص نکنیم

                                         

                                                          

٣٠١

در یک کاربرد ساده ، ما تنها یک بافر صوتی از یک فایل ایجاد می کنیم

اما امکان ایجاد چندین بافر بطور همزمان و نیز پخش چندین صدا بطور

همزمان نیز وجود دارد :

DSBDesc.lFlags = DSBCAPS_CTRLFREQUENCY Or

DSBCAPS_CTRLPAN Or DSBCAPS_CTRLVOLUME

DS.CreateSoundBufferFromFile(App.Path = Set DSBuffer

Sample.wav", DSBDesc)x\" &

SOUND BUFFER CREATED:"x" MsgBox

bytes" & DSBDesc.lBufferBytes & " :MsgBox "Buffer Size

kb)"x" & (Round(DSBDesc.lBufferBytes / 1024, 3 & ")

& ":MsgBox "Buffer Channel Count

DSBDesc.fxFormat.nChannelsIIf(DSBDesc.fxFormat.nCh

Stereo)")x) " ,"(annels = 1, " (Mono

& " :MsgBox "Buffer Bits per channel

bits"x " & DSBDesc.fxFormat.nBitsPerSample

load در بالا یک بافر صوتی ایجاد شده و اطلاعات صدا از فایل به بافر

شده است .

کنیم : play حال بایستی داده صوتی موجود در بافر را

: loop کردن بافر بصورت Play دستور لازم برای

DSBuffer.Play DSBPLAY_LOOPING

: loop کردن بافر بدون Play دستور لازم برای

DSBuffer.Play DSBPLAY_DEFAULT

٣٠٢

کردن بافر : Stop دستورات لازم برای

DSBuffer.Stop

0 DSBuffer.SetCurrentPosition

کردن بافر : Pause دستور لازم برای

DSBuffer.Stop

تنظیم خصوصیات بافر : سه خصوصیت وجود دارد که در مورد بافر

frequency و volume ،pannig تنظیم می شود

بین اعداد زیر است : pannig محدوده مقادیر

10،000- = DSBPAN_LEFT

DSBPAN_CENTER = 0

DSBPAN_RIGHT = 10,000

بافر را تنظیم کرد : pannig می توان SetPan توسط متد

DSBuffer.SetPan yourValue

صدا را تقویت نمی کند بلکه آنرا تضعیف می نماید DirectSound

ای که فایل صوتی volume عبارت است از volume بنابراین ماکزیمم

بین اعداد volume با آن ضبط شده است . بعبارت دیگر محدود مقادیر

زیر است :

DSBVOLUME_MAX = 0

DSBVOLUME_MIN = -10000

بافر را تنظیم کرد : volume می توان SetVolume توسط متد

٣٠٣

DSBuffer.SetVolume yourValue

عبارت است از : DirectSound محدود فرکانسی

DSBFREQUENCY_MIN = 100 (hz)x

hz) = 100khz x) 100000 = DSBFREQUENCY_MAX

می توان فرکانس بافر را تنظیم کرد : SetFrequency توسط متد

DSBuffer.SetFrequency yourValue

بخش سوم - DirectXAudio آموزش

DirectMusic موضوع : پخش موزیک توسط

مقدمه :

با چگونگی پخش افکتهای DirectXAudio در اولین درس از آموزش

ساده engine صوتی آشنا شدید . اکنون این توانایی را دارید که یک

صوتی بنویسید . در این بخش مبانی پخش موزیک را فرا خواهید گرفت .

پس از این درس شما می توانید یک ماژوال برای پخش موزیکهای پس

زمینه و افکتهای صوتی برای برنامه هایتان ایجاد کنید .

: DirectMusic کردن 8 Initil

٣٠۴

را مقداردهی اولیه کنید . DirectMusic قبل از هر کار بایستی ماژول 8

اینکار بصورت زیر انجام می شود :

Option ExplicitImplements DirectXEvent8

oDX As DirectX8 Private

Private oDMPerf As DirectMusicPerformance8

oDMLoader As DirectMusicLoader8 Private

Private oDMSeg As DirectMusicSegment8

Dim dmParams As DMUS_AUDIOPARAMS

Set oDX = New DirectX8

oDMPerf = oDX.DirectMusicPerformanceCreate Set

oDX.DirectMusicLoaderCreate = Set oDMLoader

oDMPerf.InitAudio frmMain.hWnd,

dmParams, Nothing, ,DMUS_AUDIOF_ALL

128 ,DMUS_APATH_DYNAMIC_STEREO

oDMPerf.SetMasterAutoDownload True

load کمک می کند تا موزیک درون بافر DirectMusicLoader شی 8

شود .

مموزیکی را که باید پخش شود ذخیره DirectMusicSegment شی 8

می کند .

کد فوق کافی است یکبار زمانیکه برنامه آغاز می شود ، اجرا گردد .

داریم اما قبل از DirectMusic اکنون ما یک واسط مقدار دهی شده از

کردن terminate کرده و پخش کنیم چگونگی Load اینکه موزیک را

را در زیر می بینید : DirectMusic

If ObjPtr(oDMSeg)Then Set oDMSeg = Nothing

ObjPtr(oDMLoader)Then Set oDMLoader = Nothing If

Then (If Not (oDMPerf Is Nothing

٣٠۵

oDMPerf.CloseDown

Set oDMPerf = Nothing

End If

Then Set oDX = Nothing (If ObjPtr(oDX

پیغامها :

Input , Sound , مثل DirectX های 8 component در برخی از

را برپا کند messaging برنامه شما بایستی یک سیستم Play و Music

زمان وقوع برخی رخدادهای خاص را بشما گزارش دهد . DirectX تا

این مطلب بخصوص زمانیکه یک موزیک را پخش می کنید مفید است

برای مثال می تواند زمان خاتمه یافتن موزیک را به شما اطلاع دهد و

آنگاه شما می توانید قطعه موزیک بعدی را پخش کنید .

انجام می شوند . کد زیر را در تابع callback پیغامها توسط یک سیستم

قرار دهید : DirectMusic کردن 8 initial تان پس از InitDMusic

oDMPerf.AddNotificationType

DMUS_NOTIFY_ON_SEGMENT

hEvent = oDX.CreateEvent(Me)x

oDMPerf.SetNotificationHandle hEvent

می گوید چه نوع پیغامهایی را می خواهید DirectMusic اولین سطر به

به برنامه تان بفرستد . چندین نوع پیغام وجود دارد :

اطلاعات موزیک فعلی ( = DMUS_NOTIFY_ON_SEGMENT

شروع پخش ، پایان پخش و غیره )

موزیک chord اطلاعات تغییر = DMUS_NOTIFY_ON_CHORD

http://sheidaian.persianblog.com

http://iranmehr.bizhat.com توسط گروه ایران مھر sheidaian.persianblog برگرفتھ از سایت

٣٠۶

event زمانیکه یک = DMUS_NOTIFY_ON_COMMAND

فرمانی صدا زده شود .

اطلاعات = DMUS_NOTIFY_ON_MEASUREANDBEAT

مربوط به موزیک فعلی beat/measure

مربوط event که = DMUS_NOTIFY_ON_PERFORMANCE

می باشد . performance به سطح

recomposition که = DMUS_NOTIFY_ON_RECOMPOSE

می باشد . event

آخرین بخش از پیغام دهی ، تابع اصلی آن می باشد . همانطور که در

دیدید یک توصیف بصورت DirectMusic کردن Initial بخش

callback داشتیم . بخش اصلی تابع Implements DirectXEvent8

است که بین select case شامل یک ، DirectXEvent مربوط به 8

پیغامهای مختلف سوئیچ می کند :

As Private Sub DirectXEvent8_DXCallback(ByVal eventid

Long)x

If eventid = hEvent Then

Dim dmMSG As DMUS_NOTIFICATION_PMSG

If Not oDMPerf.GetNotificationPMSG(dmMSG) Then

Else

dmMSG.lNotificationOption Select Case

Case DMUS_NOTIFICATION_SEGABORT

DMUS_NOTIFICATION_SEGALMOSTEND Case

Case DMUS_NOTIFICATION_SEGEND

DMUS_NOTIFICATION_SEGLOOP Case

Case DMUS_NOTIFICATION_SEGSTART

Case Else

End Select

End If

End If

End Sub

٣٠٧

پخش موزیک / متوقف کردن موزیک :

کنید . اینکار توسط کد load برای پخش یک موزیک ابتدا بایستی آنرا

زیر انجام می شود :

x"\" & oDMLoader.SetSearchDirectory App.Path

& Set oDMSeg = oDMLoader.LoadSegment(App.Path

FILENAME)oDMSeg.SetStandardMidiFile

MID ،WAV : تنها چهار نوع فرمت صوتی را می پذیرد DirectMusic

. SEG و RMI ،

استفاده کنید که DirectXShow بایستی از MP برای پخش فایلهای 3

آنرا در درسهای بعدی خواهید دید .

شد می توانید آنرا load اکنون که داده های فایل صوتی درون بافر

پخش کنید :

oDMSeg.SetRepeats 0

oDMSeg, oDMPerf.PlaySegmentEx

DMUS_SEGF_DEFAULT, 0

تنظیم کنید . اگر این مقدار SetRepets تعداد پخش شدن فایل را با متد

صفر باشد ، آهنگ تنها یکبار پخش می شود و اگر 1- باشد بطور ممتد

پخش خواهد شد .

برای متوقف کردن موزیک از کد زیر استفاده کنید :

DMUS_SEGF_DEFAULT ,oDMPerf.StopEx oDMSeg, 0

٣٠٨

استقاده کنید : SetMasterVolume برای تنظیم میزان صدا از متد

oDMPerf.SetMasterVolume yourvalue

رنج صدا بین 20 + دسی بل تا 200 - دسی بل است .

استفاده کنید : SetMasterTempo از متد Tempo برای تنظیم

oDMPerf.SetMasterTempo yourvalue/ 100

برابر 1 می باشد . عدد 2 سرعت را دو برابر می کند و tempo بطور نرمال

عدد 0 موزیک را قطع می کند

بخش چهارم - DirectXAudio آموزش

DirectSound3D موضوع : ایجاد صدای سه بعدی توسط

مقدمه

تاکنون با چگونگی پخش افکتهای صوتی و موسیقی پس زمینه توسط

آشنا شدید . این مطالب برای کاربردهای ساده DirectXAudiuo

مناسبند اما اینکه فقط ما صدای استریو داشته باشیم کافی نیست و در

کاربردهاب حرفه ای بایستی از صداهای کاملا سه بعدی استفاده کنیم .

با استفاده از افکتهای صوتی سه بعدی می توانیم صدا را در تمام جهتها

برای کاربر شبیه سازی کنیم اما با همه مزایای صدای سه بعدی ، دو

اشکال برای آن وجود دارد : اول اینکه پخش صدای سه بعدی پیچیده تر

٣٠٩

از پخش صدای عادی است و تنها کارت های سخت افزاری جدید بطور

کاملا واقعی از آن پشتیبانی می کنند و دوم اینکه صدای سه بعدی با 4

بلندگو یا بیشتر حاصل می شود – کیفیت حالت 2 بلندگو بد نیست اما

در مقایسه با حالت 4 بلندگو ، بسیار کیفیت صدای سه بعدی پایین است

.

DirectSound3D برپاسازی

برپاسازی صدای سه بعدی چندان پیچیده نیست اما هر بافر صوتی که

را به سیستم تان overhead برای یک صدای سه بعدی می سازید ، یک

اضافه می کند . همچنین برخی درایورها هستند که تنها اجازه ایجاد

تعداد محدودی بافر سه بعدی را در یک لحظه می دهند و نیز اغلب

درایورها تعداد بافرهای سه بعدی که می توان در یک لحظه پخش کرد را

محدود می کنند ( معمولاً 8 تا 16 بافر ) .

اولین قدم در استفاده از صدای سه بعدی تعریف متغیرها و اشیا زیر

است :

Dim DSBuffer As DirectSoundSecondaryBuffer8

DSBuffer3D As DirectSound3DBuffer8 Dim

DirectSound3DListener8 Dim DSBListener As

تنها دو شی آخر برای شما جدید هستند . شی

یک ارائه سه بعدی از بافرهای عادی است . DirectSound3dBuffer8

برای نگهداری داده DirectSoundSecondaryBuffer ما همچنان از 8

برای نگهداری DirectSound3Dbuffer صوتی استفاده می کنیم و از 8

پارامترهای سه بعدی و تنظیمات سه بعدی استفاده می کنیم . شی

٣١٠

است و برای تنظیم listener نیز یک DirectSound3Dlistener8

کردن سرعت و جهت صدا و برخی پارامترهای دیگر استفاده می شود .

مرحله دوم ، ساخت بافر صوتی است . این کار در دو بخش انجام می

شود . اول ما یک بافر صوتی نرمال می سازیم و سپس یک واسط بافر

صوتی سه بعدی را از آن بدست می آوریم :

DSBuffer.Stop If Not (DSBuffer Is Nothing) Then

Set DSBuffer = Nothing

DSBDesc.lFlags = DSBCAPS_CTRL3D Or

DSBCAPS_CTRLVOLUME

Set DSBuffer = DS.CreateSoundBufferFromFile(App.Path

blip.wav", DSBDesc)x\" &

Then 1 < If DSBDesc.fxFormat.nChannels

You can only use mono (1 channel) sounds with " MsgBox

DirectSound3D"x

End If

optLow.Value Then DSBDesc.guid3DAlgorithm = If

GUID_DS3DALG_NO_VIRTUALIZATION

optMedium.Value Then DSBDesc.guid3DAlgorithm = If

GUID_DS3DALG_HRTF_LIGHT

optHigh.Value Then DSBDesc.guid3DAlgorithm = If

GUID_DS3DALG_HRTF_FULL

DSBuffer = DS.CreateSoundBufferFromFile(App.Path Set

DSBDesc)x ,"blip.wav\" &

Set DSBuffer3D = DSBuffer.GetDirectSound3DBuffer()x

سه نکته است که باید به آن دقت شود :

بسیار مهم است . شما اگر DSBCAPS_CTRL3D 1 – اضافه کردن

این پارامتر را بکار نبرید ، قادر نخواهید بود که واسط سه بعدی را

بدست آورید .

تک کاناله ) استفاده کنیم ) Mono 2 – ما بایستی تنها از افکتهای صوتی

٣١١

زیرا افکت صوتی استریو در صدای سه بعدی معنا ندارد زیرا صدا از یک

نقطه در فضای سه بعدی می آید .

3 – سطح الگوریتم سه بعدی – که در پارامتر

NO آمده . حالت DSBDesc.guid3Dalgorhthm

استفاده می کند و روی تمام CPU تنها از VIRTULIZATION

HRTF LIGHT سیستم ها کار می کند اما افکتها مینیمم هستند . حالت

و هم سخت افزار کارت صوتی استفاده می کند و کیفیت CPU هم از

FULL HRTF بهتری را نسبت به خالت اول ارائه می دهد . حالت

بهترین حالت است اما در صورتی درست کار می کند که یک سخت افزار

سه بعدی داشته باشید .

است : listener آخرین پارامتری که باید تنظیم کنیم شی

DSBDesc_2.lFlags = DSBCAPS_CTRL3D Or

DSBCAPS_PRIMARYBUFFER

Set DSBPrimary =

x (DS.CreatePrimarySoundBuffer(DSBDesc_2

DSBPrimary.GetDirectSound3Dlistener = Set DSBListener

,#0 ,#1 ,#0 ,DSBListener.SetOrientation 0#, 0#, 1#

DS3D_IMMEDIATE

تا اینجا صدای سه بعدی ما آماده است و می توانیم برخی پخش بافر را

مشابه درسهای قبلی شروع کنید .

پارامترهای اختیاری :

چند پارامتر وجود دارد که می توان آنها را تغییر داد :

٣١٢

عدد 0 بیشترین میزان صدا و عدد 3000 - کمترین میزان : Volume – 1

صدا را دارد :

Sub If DSBuffer Is Nothing Then Exit

DSBuffer.SetVolume scrlVolume.Value

: listener تنظیم محل : Position – 2

,DSBuffer3D.SetPosition Src_X, 0, Src_Y

DS3D_IMMEDIATE

DSBListener.SetPosition Src_X, 0, Src_Y,

DS3D_IMMEDIATE

تنظیم سرعت و جهت منبع صدا : : Velocity – 3

DS3D_IMMEDIATE ,DSBuffer3D.SetVelocity X, Y, Z

DSBListener.SetVelocity X, Y, Z, DS3D_IMMEDIATE

انحراف صدا از مسیری که می پیماید انحراف : Dppler Effect – 4

سرعت حرکت صدا :

CSng(scrlDoppler.Value), DSBListener.SetDopplerFactor

DS3D_IMMEDIATE

چگونگی تضعیف صدا با تغییر فاصله Rolloff Effect : rolloff – 5

است .

CSng(scrlRolloff.Value), DSBListener.SetRolloffFactor

DS3D_IMMEDIATE

٣١٣

ماکزیمم فاصله ای که یک صدا می تواند شنیده شود : : Distance – 6

DS3D_IMMEDIATE ,DSBuffer3D.SetMaxDistance 250

DSBuffer3D.SetMinDistance 0.01, DS3D_IMMEDIATE

مقدمه – DirectX Input آموزش

مقدمه - DirectX Input آموزش

مقدمه

شما می آموزید که DirectX Input در بخش مباحث برنامه نویسی

چگونه اطلاعات ورودی را از کاربر بگیرید . این اطلاعات می تواند از طریق

کیبرد ، ماوس ، جوی استیک یا گیم پد باشد .

بنابراین در پایان این سلسله مباحث قادر خواهید بود که یک بازی

بنویسید و یا یک برنامه مالتی مدیا که بتواند توسط کاربر کنترل شود .

ساده ترین و سریع ترین روش برای گرفتن داده ها از هر DirectInput

نوع ابزار ورودی می باشد .

مباحث این بخش

بخش اول : چگونگی دریافت اطلاعات از کیبرد

٣١۴

بخش دوم : چگونگی دریافت اطلاعات از ماوس

Action Mapping بخش سوم : راهنمای استفاده از

بخش اول - DirectX Input آموزش

گرفتن اطلاعات ورودی از کیبرد - 1

مقدمه

8 همانطور که از نامش مشخص است به شما اجازه می Direct Input

دهد که بتوانید برنامه هایی بنویسید که توسط هر نوع دستگاه ورودی

کنترل شود .

دارای چندین مزیت نسبت به استفاده از کنترلهای Direct Input 8

,Form_KeyUp ورودی خود ویژوال بیسیک دارد – کنترلهایی مثل

و همچنین قابلیت کنترل - Form_KeyDown, Form_MouseMove

GetCursorPos, از قبیل Win بیشتری نسبت به توابع استاندارد 32

دارد . GetKeyState

سریعتر ، کاراتر و قدرتمند تر بوده و برای ساخت Direct Input 8

بازیها طراحی شده بنابراین باعث کندی برنامه ها نخواهد شد .

برای گرفتن ورودی از کیبرد Direct Input چگونگی کار با 8

وجود دارد : روش DirectX دو روش برای استفاده از کیبرد در 8

که هر دو دارای مزایا و معایبی هستند . event-based و روش polling

استفاده می شود event-based بطور کلی در اغلب طراحیها از روش

زیرا کار با آن راحت تر اسن . در این روش هر پیغام فرستاده شده

٣١۵

می شود و برنامه نیازی به هیچگونه log ازطرف دستگاه ورودی

پردازشی بمنظور منتظر ماندن برای یک پیغام از طرف ورودی ندارد ،

کنترل کمی دقیقتر و راحتر polling بنابر این کاراتر است . در روش

است .

event و بر مبنای polling اگر در مورد برنامه نویسی بر مبنای

اطلاعات کافی ندارید می توانید از منابع موجود در سایتهایی چون

استفاده کنید . GameDev و Gamasutra

Polling روش

مراحل این روش عبارتند از :

به نام TextBox یک فرم ایجاد کرده و یک : Declerations 1 – تعریفات

Vertical Scroll و Locked ،Multiline با خصوصیات txtOutput

در آن قرار دهید . کدهای زیر را در بخش کدنویسی این فرم Bar

بنویسید :

True = Private Const UsePollingMethod As Boolean

Private Const UseEventMethod As Boolean = False

باشد . True ‘نکته مهم اینست که تنها یکی از دو ثابت فوق بایستی

Boolean Private bRunning As

استفاده می شود polling ‘این متغیر برای

DirectX8 Private DX As

Private DI As DirectInput8

DirectInput و شی DirectX ‘تعریف شی اصلی

Private DIDevice As DirectInputDevice8

DIKEYBOARDSTATE Private DIState As

این دو شی برای دسترسی به دستگاه ورودی ( کیبرد ) استفاده می

٣١۶

شوند

Private KeyState(0 To 255) As Boolean

آرایه ای برای تشخیص فشرده شدن کلید

Private Const BufferSize As Long = 10

این مقدار event-based ها . در روش event ‘ سایز بافر نگهدارنده

برابر 10 تا 20 است ( بسته به سرعت polling برابر یک و در روش

حلقه بازی )

Private Declare Sub Sleep Lib "kernel32" (ByVal

dwMilliseconds As Long)x

در صورت بالا بودن نرخ polling برای متوقف کردن حلقه Sleep ‘ تابع

ورودی

این بخش سه مرحله دارد : : Initialisation -2 مقدار دهی اولیه

ها ساخته می شوند . Device در مرحله اول اشیا و

انجام می شود . Device در مرحله دوم تنظیمات مربوط به

می گوئیم که می خواهیم شروع به استفاده Device در مرحله سوم به

از آن کنیم .

کدهای زیر را بنویسید : Form_Load در

Me.Show

Dim I As Long

DIPROPLONG Dim DevProp As

Dim DevInfo As DirectInputDeviceInstance8

BufferSize) As Dim pBuffer(0 To

DIDEVICEOBJECTDATA

Then If UsePollingMethod And UseEventMethod

MsgBox "You must select only one of the constants before

٣١٧

running"x

Unload Me

End

End If

txtOutput.Text = "Using If UsePollingMethod Then

vbCrLf & "Polling Method

txtOutput.Text = "Using Event If UseEventMethod Then

vbCrLf & "Based Method

مقداردهی اولیه روش انتخاب شده

Set DX = New DirectX8

Set DI = DX.DirectInputCreate

DI.CreateDevice("GUID_SysKeyboard")x = DIDevice Set

DIDevice.SetCommonDataFormat

DIFORMAT_KEYBOARD

DIDevice.SetCooperativeLevel frmMain.hWnd,

Or ISCL_NONEXCLUSIVE DISCL_BACKGROUND

برپاسازی بافر

DIPH_DEVICE = DevProp.lHow

DevProp.lData = BufferSize

DIPROP_BUFFERSIZE, DevProp DIDevice.SetProperty

به دایرکت ایکس می گوئیم که می خواهیم از دستگاه ورودی استفاده

کنیم

DIDevice.Acquire

استخراج اطلاعاتی در مورد دستگاه ورودی

Set DevInfo = DIDevice.GetDeviceInfo()x

٣١٨

& " :Product Name" & txtOutput.Text = txtOutput.Text

vbCrLf & DevInfo.GetProductName

& " :Device Type" & txtOutput.Text = txtOutput.Text

vbCrLf & DevInfo.GetDevType

& " :GUID" & txtOutput.Text = txtOutput.Text

vbCrLf & DevInfo.GetGuidInstance

در صورتی که بخواهیم به برنامه خاتمه بدهیم کدهای زیر را می

نویسیم

DIDevice.Unacquire

Nothing = Set DIDevice

Set DI = Nothing

Set DX = Nothing

Me Unload

End

3 – گرفتن ورودی از کیبرد : در این بخش فرض کنید بخواهیم یک بازی

شبیه سازی کنیم . در این حلقه هر بار فشرده Do-Loop را در یک حلقه

شدن کلیدهای کیبرد را چک می کنیم :

If Not Err.Number Then bRunning = True

While bRunning Do

دریافت اطلاعات شامل خواندن وضعیت کیبرد ، خواندن اطلاعات بافر و

سپس خطا

DIState DIDevice.GetDeviceStateKeyboard

٣١٩

DIDevice.GetDeviceData pBuffer, DIGDD_DEFAULT

DI_BUFFEROVERFLOW Then = If Err.Number

Msgbox(“BUFFER OVERFLOW (Compensating)...")x

:ENDOFLOOP GoTo

End If

بررسی فشرده شدن کلیدها

For I = 0 To 255

DIState.Key(I) = 128 And (Not KeyState(I) = True) If

Then

& " { DOWN }" & txtOutput.Text = txtOutput.Text

vbCrLf &((KeyNames(CInt(I

txtOutput.SelStart = Len(txtOutput.Text)x

KeyState(I) = True

If End

Next I

بررسی رها شدن کلید

For I = 0 To BufferSize

KeyState(pBuffer(I).lOfs) = True And pBuffer(I).lData If

Then = 0

KeyState(pBuffer(I).lOfs) = False

& " { UP }" & txtOutput.Text = txtOutput.Text

vbCrLf & ((KeyNames(CInt(pBuffer(I).lOfs

txtOutput.SelStart = Len(txtOutput.Text)x

End If

I Next

Sleep (50)x

DoEvents

:ENDOFLOOP

Loop

٣٢٠

وجود دارد که نام کلید فشارداده شده را KeyName در کد فوق یک تابع

بر می گرداند . بخشی از این تابع را در زیر می بینید :

String Function KeyNames(iNum As Integer) As

Dim aKeys(0 To 255) As String

"DIK_ESCAPE" = (aKeys(1

aKeys(2) = "DIK_1 On main keyboard"x

main keyboard"x aKeys(3) = "DIK_2 On

aKeys(4) = "DIK_3 On main keyboard"x

main keyboard"x aKeys(5) = "DIK_4 On

aKeys(6) = "DIK_5 On main keyboard"x

main keyboard"x aKeys(7) = "DIK_6 On

aKeys(8) = "DIK_7 On main keyboard"x

main keyboard"x aKeys(9) = "DIK_8 On

aKeys(10) = "DIK_9 On main keyboard"x

On main keyboard"x aKeys(11) = "DIK_0

aKeys(12) = "DIK_MINUS On main keyboard"x

DIK_EQUALS On main keyboard"x" = (aKeys(13

aKeys(14) = "DIK_BACK BACKSPACE"x

DIK_TAB"x" = (aKeys(15

aKeys(16) = "DIK_Q"x

aKeys(17) = "DIK_W"x

DIK_E"x" = (aKeys(18

aKeys(19) = "DIK_R"x

aKeys(20) = "DIK_T"x

.

.

.

KeyNames = aKeys(iNum)x

٣٢١

End Function

بخش دوم - DirectX Input آموزش

Event-Based موضوع : کنترل کیبرد با روش

مشابه روش Event-Based مقداردهی اولیه و مفاهیم اصلی در روش

است و تنها بایستی ساختار بخش جمع آوری داده و حلقه Polling

بصورت Event-Based پردازشی را تغییر دهیم . مراحل کار با روش

زیر می باشد :

1 - تعاریف و مقداردهی اولیه : در بخش تعاریف دو تعریف جدید

بصورت زیر داریم :

Dim hEvent As Long

DirectXEvent8 Implements

یک پارامتر هندل برای یک می باشد . hEvent

این امر با DirectX ، نکته : زمانی که کلیدی فشرده یا رها می شود

به برنامه DirectXEvent8_DXCallback فراخوانی تابعی به اسم

گویند ) . Back Function Call شما اطلاع می دهد . ( این نوع توابع را

این تابع به برنامه شما می گوید که یک رویداد اتفق افتاده است و

بایستی بافرها را چک کند .

٣٢٢

تنها تغییری که در بخش مقداردهی اولیه نیاز است ، برپاسازی یک

می باشد : event

If UseEventMethod Then

DX.CreateEvent(frmMain)x = hEvent

DIDevice.SetEventNotification hEvent

If End

اضافه کنید : event در انتهای برنامه نیز کد زیر را برای از بین بردن

hEvent Then DX.DestroyEvent 0 <> If hEvent

برای این بخش کدهایی را در داخل تابع : event 2 - استفاده از

می نویسیم : DirectXEvent8_DXCallback

As Private Sub DirectXEvent8_DXCallback(ByVal eventid

Long)x

'متغیرهای موردنیاز

Dim I As Long

As (Dim pBuffer(0 To BufferSize

DIDEVICEOBJECTDATA

If eventid = hEvent Then

Exit Sub If DIDevice Is Nothing Then

داده را از کیبرد می گیریم event 'درصورت رخ دادن

DIDevice.GetDeviceStateKeyboard DIState

DIGDD_DEFAULT ,DIDevice.GetDeviceData pBuffer

'چک کردن تمام کلیدها برای اینکه متوجه شویم چه اتفاقی افتاده است

For I = 0 To 255

٣٢٣

است . key_down event 'عدد 128 نشان دهنده

DIState.Key(I) = 128 Then If

If pBuffer(0).lData = 128 Then

& " { DOWN }" & txtOutput.Text = txtOutput.Text

vbCrLf & ((KeyNames(CInt(I

If End

End If

'کد فوق برای بررسی فشرده شدن یک کلید بود . کد زیر رها شدن کلید

را بررسی می کند

Then (If (pBuffer(0).lData = 0 And pBuffer(0).lOfs = I

& "{ UP }" & txtOutput.Text = txtOutput.Text

vbCrLf & ((KeyNames(CInt(I

End If

txtOutput.SelStart = Len(txtOutput.Text)x

I Next

End If

End Sub

بخش سوم - DirectX Input آموزش

DirectX Input موضوع : کنترل ماوس با

مقدمه :

برای استفاده از ماوس در برنامه های مالتی مدیا و بازیها همانند کی برد

٣٢۴

می توانیم از امکانات دایرکت ایکس استفاده کنیم . روش کنترل ماوس

بسیار ساده بوده و مشابه کنترل کیبرد می DirectX Input توسط

باشد بنابراین درصورتی که دو درس گذشته را نخوانده این پیشنهاد می

کنم ابتدا آنها را مطالعه کنید .

: Device برپاسازی

علاوه بر متغیرهایی که در بخش کنترل کیبرد تعریف شد بایستی

متغیرهای جدید زیر را نیز در ابتدای برنامه تان تعریف کنید :

Private Const mSpeed As Single = 2

BufferSize As Long = 10 Private Const

Private mPosition As Point

مقدار سرعت حرکت کرسر ماوس را مشخص می کند . mSpeed

می باشد . DI سایز بافر BufferSize

موقعیت جاری کرسر ماوس را نشان می دهد . mPosition

در مرحله بعدی بایستی مقداردهی های اولیه لازم را انجام دهید :

DI.CreateDevice("guid_SysMouse")x = Set DIDevice

Call

DIDevice.SetCommonDataFormat(DIFORMAT_MOUSE)

x

DIDevice.SetCooperativeLevel(frmMain.hWnd, Call

DISCL_EXCLUSIVE)x DISCL_FOREGROUND Or

تفاوت عمده کدهای فوق با کدهای مقداردهی اولیه در بخش کی برد

٣٢۵

تغییر کرده است . در اینجا گفته شده که cooperativelevel آنست که

ما می خواهیم از ماوس بصورت انحصاری در برنامه استفاده کنیم . این

مناسب نیست و بهترست از آن window-base حالت برای برنامه های

هستند استفاده کنید . full screan در بازیهایی که بصورت

خواندن ورودی از ماوس :

event-based و هم polling در این بخش می توانید هم از روش

Direct استفاده کنید . نکته مهمی که در اینجا وجود دارد آنست که

فقط حرکت داده شدن ماوس و کلیک شدن یک دکمه را به شما Input

single click و double click اطلاع می دهد و برای تشخیص حالتهای

خودتان بایستی کد بنویسید برای مثال اگر فاصله زمانی بین دو کلیک

بوده است . double click کمتر از 40 میلی ثانیه باشد آنگاه این یک

کد زیر حرکت داده شدن ماوس و کلیک یکی از سه دکمه آنرا اطلاع می

دهد :

Dim DevData(1 To BufferSize) As

DIDEVICEOBJECTDATA

Dim nEvents As Long

Dim I As Long

DIDevice.GetDeviceData(DevData, = nEvents

DIGDD_DEFAULT)x

nEvents For I = 1 To

Select Case DevData(I).lOfs

Case DIMOFS_X

mPosition.x + (DevData(I).lData * mSpeed)x = mPosition.x

mPosition.x = 0 Then 0 > If mPosition.x

= frmMain.ScaleWidth Then mPosition.x < If mPosition.x

frmMain.ScaleWidth

٣٢۶

imgCursor.Top = mPosition.y

mPosition.x = imgCursor.Left

mPosition.x & "] :lablel(1).Caption = "Mouse Coordinates

x"[" & mPosition.y & " ," &

Case DIMOFS_Y

mPosition.y + (DevData(I).lData * mSpeed)x = mPosition.y

mPosition.y = 0 Then 0 > If mPosition.y

= frmMain.ScaleHeight Then mPosition.y < If mPosition.y

frmMain.ScaleHeight

imgCursor.Top = mPosition.y

mPosition.x = imgCursor.Left

mPosition.x & "] :lablel(1).Caption = "Mouse Coordinates

x"[" & mPosition.y & " ," &

DIMOFS_BUTTON0 Case

& " :label(2).Caption = "Button 0 State

IIf(DevData(I).lData = 0, "Up", "Down")x

DIMOFS_BUTTON1 Case

& " :label(3).Caption = "Button 1 State

IIf(DevData(I).lData = 0, "Up", "Down")x

DIMOFS_BUTTON2 Case

& " :label(4).Caption = "Button 2 State

IIf(DevData(I).lData = 0, "Up", "Down")x

DIMOFS_BUTTON3 Case

& " :label(5).Caption = "Button 3 State

IIf(DevData(I).lData = 0, "Up", "Down")x

End Select

Next I

Do بایستی آنرا در یک حلقه ، Polling برای استفاده از کد فوق در روش

٣٢٧

قرار دهید . while-Loop

بایستی آنرا درون ، Event-Based برای استفاده از کد فوق در روش

قرار دهید . DirectXEvent8_DXCallback روتین

ترفندها

تشخیص فشرده شدن کلیدهای کیبرد

یکی از دوستان سوال کرده بودند که چگونه می توان کلیدهای کیبرد را

حتی وقتی فوکوس روی برنامه ما نیست تشخیص داد مانند دیکشنری

ها که Keylogger فعال می شوند و یا CTRL+F ها که مثلاً با 12

کلیدهای فشرده شده را ثبت می کنند .

من دو روش زیر را برای اینکار پیشنهاد می کنم :

GetAsyncKeyState 1 - استفاده از یک تابع کتابخانه ای به اسم

این تابع ، فشرده شدن یا رها شدن یک . user32.dll موجود در کتابخانه

کردن این تابع بصورت زیر declare کلید را تشخیص می دهد . نحوه

است :

Private Declare Function GetAsyncKeyState Lib "user32"

(ByVal vKey As Long) As Integer

آن کد زیر را قرار event قرار داده و در timer حال در برنامه تان یک

دهید :

For i = 1 To 255

results = 0

٣٢٨

results = GetAsyncKeyState(i)

If results <> 0 Then

Msgbox(Chr(i))

End If

Next

برای مشاهده یک برنامه نمونه به این آدرس مراجعه کنید .

قلاب ، یک ابزار در مکانیزم مدیریت پیغام : Hook 2 - استفاده از قلاب یا

سیستم ویندوز است که توسط آن برنامه ها می توانند یک روتین را

برای مدیریت و پردازش پیغامهای خاصی قبل از اینکه آن پیغامها به

برنامه مقصد برسند نصب نمایند . قلابها باعث کندی سیستم می شوند

زیرا حجم پردازشی سیستم روی هر پیغام را افزایش می دهند بنابراین

بایستی زمانیکه واقعا به قلاب نیاز دارید آنرا نصب نموده و هر چه

زودتر آنرا حذف نمایید . سیستم ویندوز از انواع زیادی از قلابها

پشتیبانی می کند که هر کدام امکان دستیابی به پیغامهای خاصی را مهیا

می نمایند برای مثال یک برنامه کاربردی می تواند با استفاده از قلاب

کیبرد برای مدیریت و پردازش پیغامهای مربوط به آن ( مثل فشرده

شدن یک کلید خاص یا رها شدن آن ) استفاده کند .

برای نصب یک قلاب در برنامه از یک تابع کتابخانه ای به اسم

استفاده می شود . این تابع یک قلاب را به SetWindowsHookEx

کردن این تابع declare زنجیره قلابهای سیستم اضافه می کند . نحوه

بصورت زیر است :

Declare Function SetWindowsHookEx Lib "user32" Alias

"SetWindowsHookExA" (ByVal idHook As Long, ByVal

lpfn As Long, ByVal hmod As Long, ByVal dwThreadId

As Long) As Long

٣٢٩

همچنین برای آزاد کردن یک قلاب و حذف آن از زنجیره قلابها از تابع

استفاده می گردد . نحوه UnhookWindowsHookEx کتابخانه ای

کردن این تابع بصورت زیر است : declare

Declare Function UnhookWindowsHookEx Lib "user32"

(ByVal hHook As Long) As Long

برای ایجاد قلاب کیبرد همچنین نیاز به تعریف یک ثابت است که شماره

قلاب کیبرد در آن قرار دارد :

Public Const WH_KEYBOARD = 2

نوشت که به Callback Function حال بایستی یک تابع پس زمینه یا

ازای فشرده شدن کیبرد اجرا شود و آدرس آنرا ( با استفاده از کلمه

بهمراه ثابت فوق به تابع ( Address Of کلیدی

فرستاد . SetWindowsHookEx

برای اطلاعات بیشتر و مشاهده یک نمونه برنامه به این آدرس مراجعه

کنید

استخراج مشخصات سخت افزاری یک سیستم در وی بی

معرفی می شود که بوسیله آن می توانید Ocx در این بخش یک کنترل

مشخصات سخت افزاری سیستم خود را استحراج کنید .

نام دارد می توانید از اینجا دانلود Hardware Info این کنترل را که

نمایید .

دانلود شده مشاهده خواهید کرد که دو فایل zip پس از باز نمودن فایل

در آن وجود دارد . همچنین یگ فایل راهنما نیز بهمراه ocx و یک فایل dll

٣٣٠

آنها وجود دارد که طریقه استفاده از کنترل را نشان می دهد . برای

استفاده از کنترل فوق وارد محیط ویژال بیسیک شده و سپس وارد

کلیک کنید . Browse شوید . در آنجا روی دکمه Components منوی

را در آنجا باز کرده اید شده و فایل zip وارد پوشه ای که فایل

را انتخاب کنید تا این کنترل به لیست کنترلهای نوار HWInfo.ocx

ابزار شما اضافه شود . حال می توانید از کنترل را روی فرم خود قرار

دهید و از امکانات آن استفاده کنید .

این کنترل دارای خصوصیات زیر است :

مشخصات سازنده مادربورد : BaseBoardManufacturer

نوع چیپ ست مادربورد : BaseBoardProduct

سازنده بایوس : BiosVendor

تاریخ انتشار بایوس : BiosReleaseDate

ورژن بایوس : BiosVersion

سایز حافظه رام بایوس : BiosROMSize

نوع سوکت پردازنده : SocketDesignation

نوع پردازنده : ProcessorType

سازنده پردازنده : ProcessorManufactor

پردازنده ID شماره : ProcessorID

شماره سریال پردازنده : ProcessorSerialNumber

با استفاده از این کنترل همچنین می توان اطلاعات هر چهار هارد دیسک

سیستم را استخراج نمود برای مثال اگر بخواهید اطلاعات IDE

شماره یک ) را بدست آورید از خصوصیات زیر ) Primary Hard

استفاده کنید :

شماره مدل هارددیسک : HardDisk1ModelNumber

شماره سریال هارد دیسک ( شماره : HardDisk1SerialNumber

٣٣١

سریال کارخانه )

خصوصیات دیگری نیز در این کنترل وجود دارد که برای اطلاعات

بیشتر به راهنمای آن مراجعه کنید

یک کنترل خوب برای ویژوال بیسیک

استفاده از یک کنترل خوب در ویژوال بیسیکاین کنترل انواع مختلفی از

و ویندوز 3,1 و مکینتاش و نت XP کلید رو به شکل کلیدهای ویندوز

اسکپ و ... را در اختیار مان می گذارد که نمونه هایی از این رو تو عکس